pax_global_header00006660000000000000000000000064117705715530014525gustar00rootroot0000000000000052 comment=04521cbfbdc5eb65781da7d79c20bc1a87409bfc flamerobin_0.9.3~svn+2220.orig/000077500000000000000000000000001177057155300162035ustar00rootroot00000000000000flamerobin_0.9.3~svn+2220.orig/BUILD.txt000066400000000000000000000251301177057155300176040ustar00rootroot00000000000000FlameRobin Build Instructions ----------------------------- Below are build instructions for FlameRobin on all supported build environments. Instructions assume that you have already compiled wxWidgets. There are some tips regarding that at the end of this file. To build FR a recent installation of the Boost libraries is also necessary, at the time of writing version 1.44 is the current one, but 1.43 should work just as well. FR uses the header-only libraries, so building the Boost libraries for the used compiler isn't necessary, adding the directories to the list of includes will be enough. -------------------------- -- Common to all builds -- -------------------------- FR must be built with the same settings for debug/release, Ansi/Unicode etc. as the wxWidgets library. Failing to do so will usually lead to compile or link errors. This does not apply completely to Linux/GCC build, as you can build wx in release mode and FlameRobin in debug mode - in case you just want to debug FR code, and not code of wxWidgets. Before building on Windows, you MUST set a WXDIR environment variable which points to your wxWidgets root directory (unless you use MinGW and configure script to build a Makefile). To do this, go to: Start->Control Panel->System and select the "Advanced" tab. Then, click the "Environment Variables" button and add WXDIR to the user or system env vars. If you are using Windows98, you can set the variable from the command line, using the "set" command. For Windows you must also set a BOOST_ROOT environment variable which points to the Boost root directory, see the previous section for how to do this. For other systems the configure script needs to be amended to search for installed Boost libraries and add the necessary directories to the compiler invocation, but unfortunately this hasn't been done yet. For Debian and Ubuntu at least installing Boost should make the headers available without any more work. But if you have problems building FR on platforms other than Windows, please post to the development list. ----------------------------------------- -- MSW - Visual C++ Build Instructions -- ----------------------------------------- There are two ways to build using Microsoft Visual C++. One is via the dsp/dsw project files, and the other is via the makefile.vc command line makefile. * Using the dsp/dsw projects * Since custom build steps are not set up for the Visual Studio build the update-svn-rev.cmd script is not automatically run during the build, so the src/frsvnrev.h file may be missing or outdated. Please run the update-svn-rev.cmd manually after a checkout of the sources and each svn update. Double click on flamerobin\flamerobin.dsw, select a build configuration by going to the Build menu, selecting "Set build configuration" and then picking a config, then build! * Using the makefiles * To use the makefiles, start up a command line and navigate to the flamerobin directory. There, run the following command: nmake -f makefile.vc Build options can be any of the following: WXDIR= - tells the makefile where to find the root wxWidgets directory FINAL=<0,1> - tells whether to build debug (0) or release (1) build USEDLL=<0,1> - tells whether to link against wx static or dynamic libs UNICODE=<0,1> - tells whether to link against wx ansi or unicode build WXDIR *must* be specified (or set as an environment variable), but the rest default to 0 and are optional. ------------------------------------------------------ -- MSW - Visual C++ 2005 Express Build Instructions -- ------------------------------------------------------ Microsoft Visual C++ Express is a freeware version of MS Visual Studio. There are two ways to build FlameRobin. One is via the dsp/dsw project files, and the other is via the makefile.vc command line makefile. * Using the dsp/dsw/sln projects * Double click on flamerobin\flamerobin_flamerobin.sln, select a build configuration by going to the Build menu, selecting "Set build configuration" and then picking a config, then build! * Using the makefiles * To use the makefiles, start up a command line and navigate to the flamerobin directory. There, run the following command: nmake -f makefile.vc Build options can be any of the following: WXDIR= - tells the makefile where to find the root wxWidgets directory FINAL=<0,1> - tells whether to build debug (0) or release (1) build USEDLL=<0,1> - tells whether to link against wx static or dynamic libs UNICODE=<0,1> - tells whether to link against wx ansi or unicode build WXDIR *must* be specified (or set as an environment variable), but the rest default to 0 and are optional. ----------------------------------------------------------- -- MSW - Building wxWidgets with Visual C++ 2005 Express -- ----------------------------------------------------------- Unpack the archive somewhere, for example c:\wxWin286: * Using the dsp/dsw/sln projects * Double click on build\msw\wx.dsw, convert to new format, select a build configuration by going to the Build menu, selecting "Set build configuration" and then picking a config, then build! Double click on contrib\build\stc\stc.dsw, convert to new format, select a build configuration by going to the Build menu, selecting "Set build configuration" and then picking a config, then build! * Using the makefiles * Open MS-DOS prompt and go into "build\msw" directory: set WXWIN=c:\wxWin286 set WXDIR=c:\wxWin286 nmake -f makefile.vc BUILD=release RUNTIME_LIBS=static cd ..\.. cd contrib\build\stc nmake -f makefile.vc BUILD=release RUNTIME_LIBS=static As you can see, it is important to build STC package too. It is for wxStyledTextControl which is used in many places in FlameRobin. If you wish to build an executable that is small in size (just like the official one), you need to build wx from the command line using modified makefile.vc. Just edit the makefile.vc and change the __OPTIMIZEFLAG setting from /O2 to /O1. ------------------------------------------------- -- MSW - Borland's Free C++ Build Instructions -- ------------------------------------------------- Borland's Free C++ Compiler (in short BCC) is a freeware version of Borland's C++ compiler used in C++ Builder product: http://www.borland.com/bcppbuilder/freecompiler/ I have used version 5.5.1. Borland's command line linker (ilink32) has bugs that sometime make is crash when linking FlameRobin executable. We haven't been able to determine the cause of this. Since version 0.4.0, build was brome, then after 0.4.5 it started to work until 0.7.0. Since 0.7.2 it works again. This build is NOT OFFICIALLY SUPPORTED by our team, although it may work for you. In case you want to give it a shot, here's how: Assuming that you have wxWidgets installed in c:\wxwin286, you should open MS-DOS prompt, cd to flamerobin root directory, and execute: set WXDIR=c:\wxwin286 make -f makefile.bcc STATICRTL=1 FINAL=1 for release build, or set WXDIR=c:\wxwin286 make -f makefile.bcc STATICRTL=1 FINAL=0 for debug build. Explanantion: WXDIR= - tells the makefile where to find the root wx directory FINAL=<0,1> - tells to build debug(0) or release(1) build STATICRTL=<0,1> - tells to link against wx static(1) or dynamic(0) libs ---------------------------------------- -- Unix - Autoconf Build Instructions -- ---------------------------------------- To build on Unix or MinGW, simply open a command line, cd into the flamerobin root directory, and execute the following commands: mkdir debug cd debug ../configure --with-wx-config=/my/path/to/wx-config --enable-debug for a build in debug configuration, and the following commands mkdir release cd release ../configure --with-wx-config=/my/path/to/wx-config --disable-debug for a build in release configuration. You only need to specify wx-config if you do not have a wx-config that can be found on the PATH, or if you want to use a wx-config other than the default one. Running the command make should build the flamerobin executable. If you experience any problems, please check the flamerobin developer mailing list archive, or ask a question there. -------------------------------------------- -- Mac OS X - Autoconf Build Instructions -- -------------------------------------------- To build FlameRobin on Mac OS X 10.5 for compatibility with 10.4, open a command line, cd into the flamerobin root directory, and execute the following commands: mkdir ppcu cd ppcu ../configure --disable-debug --disable-dependency-tracking \ CFLAGS="-mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc" \ LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk -arch ppc \ -Wl,-macosx_version_min -Wl,10.4" \ CXXFLAGS="-mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc" \ --with-wx-config=/my/path/to/wx-config_for_ppc_unicode make cd .. mkdir i386u cd i386u ../configure --disable-debug --disable-dependency-tracking \ CFLAGS="-mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386" \ LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk -arch i386 \ -Wl,-macosx_version_min -Wl,10.4" \ CXXFLAGS="-mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386" \ --with-wx-config=/my/path/to/wx-config_for_i386_unicode make The resulting bundles differ only in the flamerobin executable, the lipo tool can be used to make a Universal Build out of them. --------------------------------------------------------------- -- MSW - Building wxWidgets with Borland's Free C++ Compiler -- --------------------------------------------------------------- Unpack the archive somewhere, for example c:\wxWin286, open MS-DOS prompt and go into "build\msw" directory: set WXWIN=c:\wxWin286 set WXDIR=c:\wxWin286 make -f makefile.bcc BUILD=release RUNTIME_LIBS=static cd ..\.. cd contrib\build\stc make -f makefile.bcc BUILD=release RUNTIME_LIBS=static As you can see, it is important to build STC package too. It is for wxStyledTextControl which is used in many places in FlameRobin. ---------------------------------------------- -- Unix - Building wxWidgets with configure -- ---------------------------------------------- Unpack the sources, enter "build" directory and run "./configure". There are many options you may like to set, run "./configure --help" to find about them. We assume Gtk2 static release build with Unicode support: ./configure --disable-shared --disable-debug --enable-unicode --prefix=/opt/wxwidgets make make install Now, you have to compile STC library. It is needed for wxStyledTextControl which is used in many places in FlameRobin. Enter "contrib/src/stc" directory: make make install Depending on your --prefix setting, you might need to run 'make install' as superuser (root). flamerobin_0.9.3~svn+2220.orig/Bakefiles.bkgen000066400000000000000000000021341177057155300211000ustar00rootroot00000000000000 dmars,dmars_smake,cbx_unix,cbuilderx,msevc4prj flamerobin.bkl autoconf,borland,mingw,msvc,msvc6prj,msvs2008prj -Iformats -o./Makefile.in -o./makefile.bcc -o./makefile.mgw -o./makefile.vc -o./flamerobin.dsw flamerobin_0.9.3~svn+2220.orig/Makefile.in000066400000000000000000001046441177057155300202610ustar00rootroot00000000000000# ========================================================================= # This makefile was generated by # Bakefile 0.2.9 (http://www.bakefile.org) # Do not modify, all changes will be overwritten! # ========================================================================= @MAKE_SET@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ INSTALL = @INSTALL@ LIBEXT = @LIBEXT@ LIBPREFIX = @LIBPREFIX@ EXEEXT = @EXEEXT@ WINDRES = @WINDRES@ SETFILE = @SETFILE@ NM = @NM@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_DIR = @INSTALL_DIR@ ICC_PCH_USE_SWITCH = @ICC_PCH_USE_SWITCH@ BK_DEPS = @BK_DEPS@ BK_MAKE_PCH = @BK_MAKE_PCH@ srcdir = @srcdir@ bindir = @bindir@ datadir = @datadir@ LIBS = @LIBS@ LDFLAGS_GUI = @LDFLAGS_GUI@ AR = @AR@ AROPTIONS = @AROPTIONS@ RANLIB = @RANLIB@ CXX = @CXX@ CXXFLAGS = @CXXFLAGS@ CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ ### Variables: ### DESTDIR = FLAMEROBIN_CXXFLAGS = $(__flamerobin_PCH_INC) -DHAVE_FRCONFIG_H \ $(____flamerobin_WXDEBUG_p) $(____flamerobin_DEBUGFLAG_p) \ $(__IBPPPLATFORMDEFINE_p) -I. -I$(srcdir)/src -I$(srcdir)/src/ibpp \ -I$(srcdir)/res $(CPPFLAGS) $(CXXFLAGS) FLAMEROBIN_OBJECTS = \ flamerobin_addconstrainthandler.o \ flamerobin_Config.o \ flamerobin_DatabaseConfig.o \ flamerobin_ArtProvider.o \ flamerobin_CodeTemplateProcessor.o \ flamerobin_FRError.o \ flamerobin_Observer.o \ flamerobin_ProgressIndicator.o \ flamerobin_StringUtils.o \ flamerobin_Subject.o \ flamerobin_TemplateProcessor.o \ flamerobin_URIProcessor.o \ flamerobin_Visitor.o \ flamerobin_databasehandler.o \ flamerobin_MetadataLoader.o \ flamerobin_frprec.o \ flamerobin_frutils.o \ flamerobin_AboutBox.o \ flamerobin_AdvancedMessageDialog.o \ flamerobin_AdvancedSearchFrame.o \ flamerobin_BackupFrame.o \ flamerobin_BackupRestoreBaseFrame.o \ flamerobin_BaseDialog.o \ flamerobin_BaseFrame.o \ flamerobin_CommandManager.o \ flamerobin_ConfdefTemplateProcessor.o \ flamerobin_ContextMenuMetadataItemVisitor.o \ flamerobin_ControlUtils.o \ flamerobin_DataGrid.o \ flamerobin_DataGridRowBuffer.o \ flamerobin_DataGridRows.o \ flamerobin_DataGridTable.o \ flamerobin_DBHTreeControl.o \ flamerobin_DndTextControls.o \ flamerobin_LogTextControl.o \ flamerobin_PrintableHtmlWindow.o \ flamerobin_TextControl.o \ flamerobin_CreateIndexDialog.o \ flamerobin_DataGeneratorFrame.o \ flamerobin_DatabaseRegistrationDialog.o \ flamerobin_EditBlobDialog.o \ flamerobin_EventWatcherFrame.o \ flamerobin_ExecuteSqlFrame.o \ flamerobin_ExecuteSql.o \ flamerobin_FieldPropertiesDialog.o \ flamerobin_FindDialog.o \ flamerobin_FRLayoutConfig.o \ flamerobin_GUIURIHandlerHelper.o \ flamerobin_HtmlHeaderMetadataItemVisitor.o \ flamerobin_HtmlTemplateProcessor.o \ flamerobin_InsertDialog.o \ flamerobin_MainFrame.o \ flamerobin_MetadataItemPropertiesFrame.o \ flamerobin_MultilineEnterDialog.o \ flamerobin_PreferencesDialog.o \ flamerobin_PreferencesDialogSettings.o \ flamerobin_PrivilegesDialog.o \ flamerobin_ProgressDialog.o \ flamerobin_ReorderFieldsDialog.o \ flamerobin_RestoreFrame.o \ flamerobin_ServerRegistrationDialog.o \ flamerobin_SimpleHtmlFrame.o \ flamerobin_StatementHistoryDialog.o \ flamerobin_StyleGuide.o \ flamerobin_UserDialog.o \ flamerobin_UsernamePasswordDialog.o \ flamerobin_logger.o \ flamerobin_main.o \ flamerobin_MasterPassword.o \ flamerobin_column.o \ flamerobin_constraints.o \ flamerobin_CreateDDLVisitor.o \ flamerobin_database.o \ flamerobin_domain.o \ flamerobin_exception.o \ flamerobin_function.o \ flamerobin_generator.o \ flamerobin_Index.o \ flamerobin_metadataitem.o \ flamerobin_MetadataItemCreateStatementVisitor.o \ flamerobin_MetadataItemDescriptionVisitor.o \ flamerobin_MetadataItemURIHandlerHelper.o \ flamerobin_MetadataItemVisitor.o \ flamerobin_MetadataTemplateCmdHandler.o \ flamerobin_MetadataTemplateManager.o \ flamerobin_parameter.o \ flamerobin_privilege.o \ flamerobin_procedure.o \ flamerobin_relation.o \ flamerobin_role.o \ flamerobin_root.o \ flamerobin_server.o \ flamerobin_table.o \ flamerobin_trigger.o \ flamerobin_User.o \ flamerobin_view.o \ flamerobin_objectdescriptionhandler.o \ flamerobin_Identifier.o \ flamerobin_IncompleteStatement.o \ flamerobin_MultiStatement.o \ flamerobin_SelectStatement.o \ flamerobin_SqlStatement.o \ flamerobin_SqlTokenizer.o \ flamerobin_StatementBuilder.o \ flamerobin_statementHistory.o \ $(__FR_PLATFORMSPECIFICSOURCES_OBJECTS) \ $(__flamerobin___win32rc) FLAMEROBIN_ODEP = $(_____pch_flamerobin_wx_wxprec_h_gch___depname) IBPP_CXXFLAGS = $(__ibpp_PCH_INC) $(__IBPPPLATFORMDEFINE_p) \ -I$(srcdir)/src/ibpp $(CPPFLAGS) $(CXXFLAGS) IBPP_OBJECTS = \ ibpp__dpb.o \ ibpp__ibpp.o \ ibpp__ibs.o \ ibpp__rb.o \ ibpp__spb.o \ ibpp__tpb.o \ ibpp_array.o \ ibpp_blob.o \ ibpp_database.o \ ibpp_date.o \ ibpp_dbkey.o \ ibpp_events.o \ ibpp_exception.o \ ibpp_row.o \ ibpp_service.o \ ibpp_statement.o \ ibpp_time.o \ ibpp_transaction.o \ ibpp_user.o IBPP_ODEP = $(_____pch_ibpp__ibpp_h_gch___depname) ### Conditionally set variables: ### @COND_DEPS_TRACKING_0@CXXC = $(CXX) @COND_DEPS_TRACKING_1@CXXC = $(BK_DEPS) $(CXX) @COND_PLATFORM_MAC_0@__flamerobin___mac_setfilecmd = @true @COND_PLATFORM_MAC_1@__flamerobin___mac_setfilecmd = \ @COND_PLATFORM_MAC_1@ $(SETFILE) -t APPL flamerobin$(EXEEXT) @COND_FINAL_0@____flamerobin_WXDEBUG_p = -D__WXDEBUG__ @COND_FINAL_0@____flamerobin_WXDEBUG_p_2 = --define __WXDEBUG__ @COND_FINAL_0@____flamerobin_DEBUGFLAG_p = -D_DEBUG @COND_FINAL_0@____flamerobin_DEBUGFLAG_p_2 = --define _DEBUG COND_PLATFORM_OS2_1___flamerobin___os2_emxbindcmd = $(NM) flamerobin$(EXEEXT) \ | if grep -q pmwin.763 ; then emxbind -ep flamerobin$(EXEEXT) ; fi @COND_PLATFORM_OS2_1@__flamerobin___os2_emxbindcmd = $(COND_PLATFORM_OS2_1___flamerobin___os2_emxbindcmd) @COND_PLATFORM_MACOSX_1@__FR_PLATFORMSPECIFICSOURCES_OBJECTS \ @COND_PLATFORM_MACOSX_1@ = flamerobin_StyleGuideMAC.o @COND_PLATFORM_UNIX_1@__FR_PLATFORMSPECIFICSOURCES_OBJECTS \ @COND_PLATFORM_UNIX_1@ = flamerobin_StyleGuideGTK.o @COND_PLATFORM_WIN32_1@__FR_PLATFORMSPECIFICSOURCES_OBJECTS \ @COND_PLATFORM_WIN32_1@ = flamerobin_StyleGuideMSW.o @COND_GCC_PCH_1@__flamerobin_PCH_INC = -I./.pch/flamerobin @COND_ICC_PCH_1@__flamerobin_PCH_INC = $(ICC_PCH_USE_SWITCH) \ @COND_ICC_PCH_1@ ./.pch/flamerobin/wx/wxprec.h.gch @COND_USE_PCH_1@_____pch_flamerobin_wx_wxprec_h_gch___depname \ @COND_USE_PCH_1@ = ./.pch/flamerobin/wx/wxprec.h.gch @COND_PLATFORM_MACOSX_1@__IBPPPLATFORMDEFINE_p_2 = --define IBPP_DARWIN @COND_PLATFORM_UNIX_1@__IBPPPLATFORMDEFINE_p_2 = --define IBPP_LINUX @COND_PLATFORM_WIN32_1@__IBPPPLATFORMDEFINE_p_2 = --define IBPP_WINDOWS @COND_PLATFORM_WIN32_1@__flamerobin___win32rc = flamerobin_flamerobin_rc.o @COND_PLATFORM_MACOSX_1@__flamerobin_bundle___depname = flamerobin_bundle @COND_PLATFORM_MACOSX_1@____flamerobin_BUNDLE_TGT_REF_DEP \ @COND_PLATFORM_MACOSX_1@ = FlameRobin.app/Contents/PkgInfo @COND_GCC_PCH_1@__ibpp_PCH_INC = -I./.pch/ibpp @COND_ICC_PCH_1@__ibpp_PCH_INC = $(ICC_PCH_USE_SWITCH) \ @COND_ICC_PCH_1@ ./.pch/ibpp/_ibpp.h.gch @COND_USE_PCH_1@_____pch_ibpp__ibpp_h_gch___depname = \ @COND_USE_PCH_1@ ./.pch/ibpp/_ibpp.h.gch @COND_PLATFORM_MACOSX_1@__IBPPPLATFORMDEFINE_p = -DIBPP_DARWIN @COND_PLATFORM_UNIX_1@__IBPPPLATFORMDEFINE_p = -DIBPP_LINUX @COND_PLATFORM_WIN32_1@__IBPPPLATFORMDEFINE_p = -DIBPP_WINDOWS ### Targets: ### all: svn-rev flamerobin$(EXEEXT) $(__flamerobin_bundle___depname) $(LIBPREFIX)ibpp$(LIBEXT) install: $(INSTALL_DIR) $(DESTDIR)$(bindir) (cd . ; $(INSTALL_PROGRAM) flamerobin$(EXEEXT) $(DESTDIR)$(bindir)) $(INSTALL_DIR) $(DESTDIR)$(datadir)/flamerobin/code-templates (cd $(srcdir)/code-templates ; $(INSTALL_DATA) create_trigger.confdef create_trigger.info create_trigger.template create_change_trigger.confdef create_change_trigger.info create_change_trigger.template create_selectable_execute_block.confdef create_selectable_execute_block.info create_selectable_execute_block.template create_selectable_procedure.confdef create_selectable_procedure.info create_selectable_procedure.template delete.confdef delete.info delete.template extract_full_ddl.info extract_full_ddl.template insert.confdef insert.info insert.template select.confdef select.info select.template template_info.confdef update.confdef update.info update.template $(DESTDIR)$(datadir)/flamerobin/code-templates) $(INSTALL_DIR) $(DESTDIR)$(datadir)/flamerobin/conf-defs (cd $(srcdir)/conf-defs ; $(INSTALL_DATA) fr_settings.confdef db_settings.confdef $(DESTDIR)$(datadir)/flamerobin/conf-defs) $(INSTALL_DIR) $(DESTDIR)$(datadir)/flamerobin/docs (cd $(srcdir)/docs ; $(INSTALL_DATA) fr_license.html fr_manual.html fr_whatsnew.html html.css $(DESTDIR)$(datadir)/flamerobin/docs) $(INSTALL_DIR) $(DESTDIR)@mandir@/man1 (cd $(srcdir)/docs ; $(INSTALL_DATA) flamerobin.1 $(DESTDIR)@mandir@/man1) $(INSTALL_DIR) $(DESTDIR)$(datadir)/flamerobin/html-templates (cd $(srcdir)/html-templates ; $(INSTALL_DATA) ALLloading.html DATABASE.html DATABASEtriggers.html DDL.html DOMAIN.html EXCEPTION.html FUNCTION.html GENERATOR.html PROCEDURE.html PROCEDUREprivileges.html ROLE.html ROLEprivileges.html SERVER.html TABLE.html TABLEconstraints.html TABLEtriggers.html TABLEindices.html TABLEprivileges.html TRIGGER.html VIEW.html VIEWprivileges.html VIEWtriggers.html dependencies.html header.html compute.png drop.png ok.png ok2.png redx.png view.png $(DESTDIR)$(datadir)/flamerobin/html-templates) $(INSTALL_DIR) $(DESTDIR)$(datadir)/applications (cd $(srcdir)/res ; $(INSTALL_DATA) flamerobin.desktop $(DESTDIR)$(datadir)/applications) $(INSTALL_DIR) $(DESTDIR)$(datadir)/pixmaps (cd $(srcdir)/res ; $(INSTALL_DATA) flamerobin.png $(DESTDIR)$(datadir)/pixmaps) $(INSTALL_DIR) $(DESTDIR)$(datadir)/flamerobin/sys-templates (cd $(srcdir)/sys-templates ; $(INSTALL_DATA) browse_data.template execute_procedure.template save_as_csv.confdef save_as_csv.template $(DESTDIR)$(datadir)/flamerobin/sys-templates) uninstall: (cd $(DESTDIR)$(bindir) ; rm -f flamerobin$(EXEEXT)) (cd $(DESTDIR)$(datadir)/flamerobin/code-templates ; rm -f create_trigger.confdef create_trigger.info create_trigger.template create_change_trigger.confdef create_change_trigger.info create_change_trigger.template create_selectable_execute_block.confdef create_selectable_execute_block.info create_selectable_execute_block.template create_selectable_procedure.confdef create_selectable_procedure.info create_selectable_procedure.template delete.confdef delete.info delete.template extract_full_ddl.info extract_full_ddl.template insert.confdef insert.info insert.template select.confdef select.info select.template template_info.confdef update.confdef update.info update.template) (cd $(DESTDIR)$(datadir)/flamerobin/conf-defs ; rm -f fr_settings.confdef db_settings.confdef) (cd $(DESTDIR)$(datadir)/flamerobin/docs ; rm -f fr_license.html fr_manual.html fr_whatsnew.html html.css) (cd $(DESTDIR)@mandir@/man1 ; rm -f flamerobin.1) (cd $(DESTDIR)$(datadir)/flamerobin/html-templates ; rm -f ALLloading.html DATABASE.html DATABASEtriggers.html DDL.html DOMAIN.html EXCEPTION.html FUNCTION.html GENERATOR.html PROCEDURE.html PROCEDUREprivileges.html ROLE.html ROLEprivileges.html SERVER.html TABLE.html TABLEconstraints.html TABLEtriggers.html TABLEindices.html TABLEprivileges.html TRIGGER.html VIEW.html VIEWprivileges.html VIEWtriggers.html dependencies.html header.html compute.png drop.png ok.png ok2.png redx.png view.png) (cd $(DESTDIR)$(datadir)/applications ; rm -f flamerobin.desktop) (cd $(DESTDIR)$(datadir)/pixmaps ; rm -f flamerobin.png) (cd $(DESTDIR)$(datadir)/flamerobin/sys-templates ; rm -f browse_data.template execute_procedure.template save_as_csv.confdef save_as_csv.template) install-strip: install clean: rm -rf ./.deps ./.pch rm -f ./*.o rm -f flamerobin$(EXEEXT) rm -rf FlameRobin.app rm -f $(LIBPREFIX)ibpp$(LIBEXT) distclean: clean rm -f config.cache config.log config.status bk-deps bk-make-pch shared-ld-sh Makefile svn-rev: cd $(srcdir) && ./update-svn-rev.sh flamerobin$(EXEEXT): $(FLAMEROBIN_OBJECTS) $(LIBPREFIX)ibpp$(LIBEXT) $(__flamerobin___win32rc) $(LIBPREFIX)ibpp$(LIBEXT) $(CXX) -o $@ $(FLAMEROBIN_OBJECTS) -L. $(LDFLAGS_GUI) $(LDFLAGS) -libpp $(LIBS) $(__flamerobin___mac_setfilecmd) $(__flamerobin___os2_emxbindcmd) @COND_USE_PCH_1@./.pch/flamerobin/wx/wxprec.h.gch: @COND_USE_PCH_1@ $(BK_MAKE_PCH) ./.pch/flamerobin/wx/wxprec.h.gch wx/wxprec.h $(CXX) $(FLAMEROBIN_CXXFLAGS) FlameRobin.app/Contents/PkgInfo: flamerobin$(EXEEXT) $(srcdir)/res/flamerobin.Info.plist.in $(srcdir)/res/flamerobin.icns mkdir -p FlameRobin.app/Contents mkdir -p FlameRobin.app/Contents/MacOS mkdir -p FlameRobin.app/Contents/Resources mkdir -p FlameRobin.app/Contents/SharedSupport mkdir -p FlameRobin.app/Contents/SharedSupport/code-templates mkdir -p FlameRobin.app/Contents/SharedSupport/conf-defs mkdir -p FlameRobin.app/Contents/SharedSupport/docs mkdir -p FlameRobin.app/Contents/SharedSupport/html-templates echo -n "APPL????" >FlameRobin.app/Contents/PkgInfo ln -f flamerobin$(EXEEXT) FlameRobin.app/Contents/MacOS/flamerobin sed -e "s/VERSION/`cat $(srcdir)/src/frversion.h | \ awk '/FR_VERSION_MAJOR/ {ma = $$3} \ /FR_VERSION_MINOR/ {mi = $$3} \ /FR_VERSION_RLS/ {rls = $$3} \ END {printf "%d.%d.%d", ma, mi, rls}'`/" \ -e "s/YEAR/`date '+%Y'`/" $(srcdir)/res/flamerobin.Info.plist.in > FlameRobin.app/Contents/Info.plist cp -f $(srcdir)/res/flamerobin.icns FlameRobin.app/Contents/Resources cp -R $(srcdir)/code-templates/* FlameRobin.app/Contents/SharedSupport/code-templates cp -R $(srcdir)/conf-defs/* FlameRobin.app/Contents/SharedSupport/conf-defs cp -R $(srcdir)/docs/* FlameRobin.app/Contents/SharedSupport/docs cp -R $(srcdir)/html-templates/* FlameRobin.app/Contents/SharedSupport/html-templates @COND_PLATFORM_MACOSX_1@flamerobin_bundle: $(____flamerobin_BUNDLE_TGT_REF_DEP) $(LIBPREFIX)ibpp$(LIBEXT): $(IBPP_OBJECTS) rm -f $@ $(AR) $(AROPTIONS) $@ $(IBPP_OBJECTS) $(RANLIB) $@ @COND_USE_PCH_1@./.pch/ibpp/_ibpp.h.gch: @COND_USE_PCH_1@ $(BK_MAKE_PCH) ./.pch/ibpp/_ibpp.h.gch _ibpp.h $(CXX) $(IBPP_CXXFLAGS) flamerobin_addconstrainthandler.o: $(srcdir)/src/addconstrainthandler.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/addconstrainthandler.cpp flamerobin_Config.o: $(srcdir)/src/config/Config.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/config/Config.cpp flamerobin_DatabaseConfig.o: $(srcdir)/src/config/DatabaseConfig.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/config/DatabaseConfig.cpp flamerobin_ArtProvider.o: $(srcdir)/src/core/ArtProvider.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/core/ArtProvider.cpp flamerobin_CodeTemplateProcessor.o: $(srcdir)/src/core/CodeTemplateProcessor.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/core/CodeTemplateProcessor.cpp flamerobin_FRError.o: $(srcdir)/src/core/FRError.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/core/FRError.cpp flamerobin_Observer.o: $(srcdir)/src/core/Observer.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/core/Observer.cpp flamerobin_ProgressIndicator.o: $(srcdir)/src/core/ProgressIndicator.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/core/ProgressIndicator.cpp flamerobin_StringUtils.o: $(srcdir)/src/core/StringUtils.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/core/StringUtils.cpp flamerobin_Subject.o: $(srcdir)/src/core/Subject.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/core/Subject.cpp flamerobin_TemplateProcessor.o: $(srcdir)/src/core/TemplateProcessor.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/core/TemplateProcessor.cpp flamerobin_URIProcessor.o: $(srcdir)/src/core/URIProcessor.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/core/URIProcessor.cpp flamerobin_Visitor.o: $(srcdir)/src/core/Visitor.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/core/Visitor.cpp flamerobin_databasehandler.o: $(srcdir)/src/databasehandler.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/databasehandler.cpp flamerobin_MetadataLoader.o: $(srcdir)/src/engine/MetadataLoader.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/engine/MetadataLoader.cpp flamerobin_frprec.o: $(srcdir)/src/frprec.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/frprec.cpp flamerobin_frutils.o: $(srcdir)/src/frutils.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/frutils.cpp flamerobin_AboutBox.o: $(srcdir)/src/gui/AboutBox.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/AboutBox.cpp flamerobin_AdvancedMessageDialog.o: $(srcdir)/src/gui/AdvancedMessageDialog.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/AdvancedMessageDialog.cpp flamerobin_AdvancedSearchFrame.o: $(srcdir)/src/gui/AdvancedSearchFrame.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/AdvancedSearchFrame.cpp flamerobin_BackupFrame.o: $(srcdir)/src/gui/BackupFrame.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/BackupFrame.cpp flamerobin_BackupRestoreBaseFrame.o: $(srcdir)/src/gui/BackupRestoreBaseFrame.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/BackupRestoreBaseFrame.cpp flamerobin_BaseDialog.o: $(srcdir)/src/gui/BaseDialog.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/BaseDialog.cpp flamerobin_BaseFrame.o: $(srcdir)/src/gui/BaseFrame.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/BaseFrame.cpp flamerobin_CommandManager.o: $(srcdir)/src/gui/CommandManager.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/CommandManager.cpp flamerobin_ConfdefTemplateProcessor.o: $(srcdir)/src/gui/ConfdefTemplateProcessor.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/ConfdefTemplateProcessor.cpp flamerobin_ContextMenuMetadataItemVisitor.o: $(srcdir)/src/gui/ContextMenuMetadataItemVisitor.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/ContextMenuMetadataItemVisitor.cpp flamerobin_ControlUtils.o: $(srcdir)/src/gui/controls/ControlUtils.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/controls/ControlUtils.cpp flamerobin_DataGrid.o: $(srcdir)/src/gui/controls/DataGrid.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/controls/DataGrid.cpp flamerobin_DataGridRowBuffer.o: $(srcdir)/src/gui/controls/DataGridRowBuffer.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/controls/DataGridRowBuffer.cpp flamerobin_DataGridRows.o: $(srcdir)/src/gui/controls/DataGridRows.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/controls/DataGridRows.cpp flamerobin_DataGridTable.o: $(srcdir)/src/gui/controls/DataGridTable.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/controls/DataGridTable.cpp flamerobin_DBHTreeControl.o: $(srcdir)/src/gui/controls/DBHTreeControl.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/controls/DBHTreeControl.cpp flamerobin_DndTextControls.o: $(srcdir)/src/gui/controls/DndTextControls.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/controls/DndTextControls.cpp flamerobin_LogTextControl.o: $(srcdir)/src/gui/controls/LogTextControl.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/controls/LogTextControl.cpp flamerobin_PrintableHtmlWindow.o: $(srcdir)/src/gui/controls/PrintableHtmlWindow.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/controls/PrintableHtmlWindow.cpp flamerobin_TextControl.o: $(srcdir)/src/gui/controls/TextControl.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/controls/TextControl.cpp flamerobin_CreateIndexDialog.o: $(srcdir)/src/gui/CreateIndexDialog.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/CreateIndexDialog.cpp flamerobin_DataGeneratorFrame.o: $(srcdir)/src/gui/DataGeneratorFrame.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/DataGeneratorFrame.cpp flamerobin_DatabaseRegistrationDialog.o: $(srcdir)/src/gui/DatabaseRegistrationDialog.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/DatabaseRegistrationDialog.cpp flamerobin_EditBlobDialog.o: $(srcdir)/src/gui/EditBlobDialog.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/EditBlobDialog.cpp flamerobin_EventWatcherFrame.o: $(srcdir)/src/gui/EventWatcherFrame.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/EventWatcherFrame.cpp flamerobin_ExecuteSqlFrame.o: $(srcdir)/src/gui/ExecuteSqlFrame.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/ExecuteSqlFrame.cpp flamerobin_ExecuteSql.o: $(srcdir)/src/gui/ExecuteSql.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/ExecuteSql.cpp flamerobin_FieldPropertiesDialog.o: $(srcdir)/src/gui/FieldPropertiesDialog.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/FieldPropertiesDialog.cpp flamerobin_FindDialog.o: $(srcdir)/src/gui/FindDialog.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/FindDialog.cpp flamerobin_FRLayoutConfig.o: $(srcdir)/src/gui/FRLayoutConfig.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/FRLayoutConfig.cpp flamerobin_GUIURIHandlerHelper.o: $(srcdir)/src/gui/GUIURIHandlerHelper.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/GUIURIHandlerHelper.cpp flamerobin_HtmlHeaderMetadataItemVisitor.o: $(srcdir)/src/gui/HtmlHeaderMetadataItemVisitor.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/HtmlHeaderMetadataItemVisitor.cpp flamerobin_HtmlTemplateProcessor.o: $(srcdir)/src/gui/HtmlTemplateProcessor.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/HtmlTemplateProcessor.cpp flamerobin_InsertDialog.o: $(srcdir)/src/gui/InsertDialog.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/InsertDialog.cpp flamerobin_MainFrame.o: $(srcdir)/src/gui/MainFrame.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/MainFrame.cpp flamerobin_MetadataItemPropertiesFrame.o: $(srcdir)/src/gui/MetadataItemPropertiesFrame.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/MetadataItemPropertiesFrame.cpp flamerobin_MultilineEnterDialog.o: $(srcdir)/src/gui/MultilineEnterDialog.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/MultilineEnterDialog.cpp flamerobin_PreferencesDialog.o: $(srcdir)/src/gui/PreferencesDialog.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/PreferencesDialog.cpp flamerobin_PreferencesDialogSettings.o: $(srcdir)/src/gui/PreferencesDialogSettings.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/PreferencesDialogSettings.cpp flamerobin_PrivilegesDialog.o: $(srcdir)/src/gui/PrivilegesDialog.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/PrivilegesDialog.cpp flamerobin_ProgressDialog.o: $(srcdir)/src/gui/ProgressDialog.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/ProgressDialog.cpp flamerobin_ReorderFieldsDialog.o: $(srcdir)/src/gui/ReorderFieldsDialog.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/ReorderFieldsDialog.cpp flamerobin_RestoreFrame.o: $(srcdir)/src/gui/RestoreFrame.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/RestoreFrame.cpp flamerobin_ServerRegistrationDialog.o: $(srcdir)/src/gui/ServerRegistrationDialog.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/ServerRegistrationDialog.cpp flamerobin_SimpleHtmlFrame.o: $(srcdir)/src/gui/SimpleHtmlFrame.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/SimpleHtmlFrame.cpp flamerobin_StatementHistoryDialog.o: $(srcdir)/src/gui/StatementHistoryDialog.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/StatementHistoryDialog.cpp flamerobin_StyleGuide.o: $(srcdir)/src/gui/StyleGuide.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/StyleGuide.cpp flamerobin_UserDialog.o: $(srcdir)/src/gui/UserDialog.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/UserDialog.cpp flamerobin_UsernamePasswordDialog.o: $(srcdir)/src/gui/UsernamePasswordDialog.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/UsernamePasswordDialog.cpp flamerobin_logger.o: $(srcdir)/src/logger.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/logger.cpp flamerobin_main.o: $(srcdir)/src/main.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/main.cpp flamerobin_MasterPassword.o: $(srcdir)/src/MasterPassword.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/MasterPassword.cpp flamerobin_column.o: $(srcdir)/src/metadata/column.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/column.cpp flamerobin_constraints.o: $(srcdir)/src/metadata/constraints.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/constraints.cpp flamerobin_CreateDDLVisitor.o: $(srcdir)/src/metadata/CreateDDLVisitor.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/CreateDDLVisitor.cpp flamerobin_database.o: $(srcdir)/src/metadata/database.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/database.cpp flamerobin_domain.o: $(srcdir)/src/metadata/domain.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/domain.cpp flamerobin_exception.o: $(srcdir)/src/metadata/exception.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/exception.cpp flamerobin_function.o: $(srcdir)/src/metadata/function.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/function.cpp flamerobin_generator.o: $(srcdir)/src/metadata/generator.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/generator.cpp flamerobin_Index.o: $(srcdir)/src/metadata/Index.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/Index.cpp flamerobin_metadataitem.o: $(srcdir)/src/metadata/metadataitem.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/metadataitem.cpp flamerobin_MetadataItemCreateStatementVisitor.o: $(srcdir)/src/metadata/MetadataItemCreateStatementVisitor.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/MetadataItemCreateStatementVisitor.cpp flamerobin_MetadataItemDescriptionVisitor.o: $(srcdir)/src/metadata/MetadataItemDescriptionVisitor.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/MetadataItemDescriptionVisitor.cpp flamerobin_MetadataItemURIHandlerHelper.o: $(srcdir)/src/metadata/MetadataItemURIHandlerHelper.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/MetadataItemURIHandlerHelper.cpp flamerobin_MetadataItemVisitor.o: $(srcdir)/src/metadata/MetadataItemVisitor.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/MetadataItemVisitor.cpp flamerobin_MetadataTemplateCmdHandler.o: $(srcdir)/src/metadata/MetadataTemplateCmdHandler.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/MetadataTemplateCmdHandler.cpp flamerobin_MetadataTemplateManager.o: $(srcdir)/src/metadata/MetadataTemplateManager.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/MetadataTemplateManager.cpp flamerobin_parameter.o: $(srcdir)/src/metadata/parameter.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/parameter.cpp flamerobin_privilege.o: $(srcdir)/src/metadata/privilege.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/privilege.cpp flamerobin_procedure.o: $(srcdir)/src/metadata/procedure.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/procedure.cpp flamerobin_relation.o: $(srcdir)/src/metadata/relation.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/relation.cpp flamerobin_role.o: $(srcdir)/src/metadata/role.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/role.cpp flamerobin_root.o: $(srcdir)/src/metadata/root.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/root.cpp flamerobin_server.o: $(srcdir)/src/metadata/server.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/server.cpp flamerobin_table.o: $(srcdir)/src/metadata/table.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/table.cpp flamerobin_trigger.o: $(srcdir)/src/metadata/trigger.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/trigger.cpp flamerobin_User.o: $(srcdir)/src/metadata/User.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/User.cpp flamerobin_view.o: $(srcdir)/src/metadata/view.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/metadata/view.cpp flamerobin_objectdescriptionhandler.o: $(srcdir)/src/objectdescriptionhandler.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/objectdescriptionhandler.cpp flamerobin_Identifier.o: $(srcdir)/src/sql/Identifier.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/sql/Identifier.cpp flamerobin_IncompleteStatement.o: $(srcdir)/src/sql/IncompleteStatement.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/sql/IncompleteStatement.cpp flamerobin_MultiStatement.o: $(srcdir)/src/sql/MultiStatement.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/sql/MultiStatement.cpp flamerobin_SelectStatement.o: $(srcdir)/src/sql/SelectStatement.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/sql/SelectStatement.cpp flamerobin_SqlStatement.o: $(srcdir)/src/sql/SqlStatement.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/sql/SqlStatement.cpp flamerobin_SqlTokenizer.o: $(srcdir)/src/sql/SqlTokenizer.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/sql/SqlTokenizer.cpp flamerobin_StatementBuilder.o: $(srcdir)/src/sql/StatementBuilder.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/sql/StatementBuilder.cpp flamerobin_statementHistory.o: $(srcdir)/src/statementHistory.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/statementHistory.cpp flamerobin_StyleGuideGTK.o: $(srcdir)/src/gui/gtk/StyleGuideGTK.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/gtk/StyleGuideGTK.cpp flamerobin_StyleGuideMAC.o: $(srcdir)/src/gui/mac/StyleGuideMAC.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/mac/StyleGuideMAC.cpp flamerobin_StyleGuideMSW.o: $(srcdir)/src/gui/msw/StyleGuideMSW.cpp $(FLAMEROBIN_ODEP) $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/msw/StyleGuideMSW.cpp flamerobin_flamerobin_rc.o: $(srcdir)/res/flamerobin.rc $(FLAMEROBIN_ODEP) $(WINDRES) -i$< -o$@ --define HAVE_FRCONFIG_H $(____flamerobin_WXDEBUG_p_2) $(____flamerobin_DEBUGFLAG_p_2) $(__IBPPPLATFORMDEFINE_p_2) --include-dir . --include-dir $(srcdir)/src --include-dir $(srcdir)/src/ibpp --include-dir $(srcdir)/res @WX_INCLUDES@ ibpp__dpb.o: $(srcdir)/src/ibpp/_dpb.cpp $(IBPP_ODEP) $(CXXC) -c -o $@ $(IBPP_CXXFLAGS) $(srcdir)/src/ibpp/_dpb.cpp ibpp__ibpp.o: $(srcdir)/src/ibpp/_ibpp.cpp $(IBPP_ODEP) $(CXXC) -c -o $@ $(IBPP_CXXFLAGS) $(srcdir)/src/ibpp/_ibpp.cpp ibpp__ibs.o: $(srcdir)/src/ibpp/_ibs.cpp $(IBPP_ODEP) $(CXXC) -c -o $@ $(IBPP_CXXFLAGS) $(srcdir)/src/ibpp/_ibs.cpp ibpp__rb.o: $(srcdir)/src/ibpp/_rb.cpp $(IBPP_ODEP) $(CXXC) -c -o $@ $(IBPP_CXXFLAGS) $(srcdir)/src/ibpp/_rb.cpp ibpp__spb.o: $(srcdir)/src/ibpp/_spb.cpp $(IBPP_ODEP) $(CXXC) -c -o $@ $(IBPP_CXXFLAGS) $(srcdir)/src/ibpp/_spb.cpp ibpp__tpb.o: $(srcdir)/src/ibpp/_tpb.cpp $(IBPP_ODEP) $(CXXC) -c -o $@ $(IBPP_CXXFLAGS) $(srcdir)/src/ibpp/_tpb.cpp ibpp_array.o: $(srcdir)/src/ibpp/array.cpp $(IBPP_ODEP) $(CXXC) -c -o $@ $(IBPP_CXXFLAGS) $(srcdir)/src/ibpp/array.cpp ibpp_blob.o: $(srcdir)/src/ibpp/blob.cpp $(IBPP_ODEP) $(CXXC) -c -o $@ $(IBPP_CXXFLAGS) $(srcdir)/src/ibpp/blob.cpp ibpp_database.o: $(srcdir)/src/ibpp/database.cpp $(IBPP_ODEP) $(CXXC) -c -o $@ $(IBPP_CXXFLAGS) $(srcdir)/src/ibpp/database.cpp ibpp_date.o: $(srcdir)/src/ibpp/date.cpp $(IBPP_ODEP) $(CXXC) -c -o $@ $(IBPP_CXXFLAGS) $(srcdir)/src/ibpp/date.cpp ibpp_dbkey.o: $(srcdir)/src/ibpp/dbkey.cpp $(IBPP_ODEP) $(CXXC) -c -o $@ $(IBPP_CXXFLAGS) $(srcdir)/src/ibpp/dbkey.cpp ibpp_events.o: $(srcdir)/src/ibpp/events.cpp $(IBPP_ODEP) $(CXXC) -c -o $@ $(IBPP_CXXFLAGS) $(srcdir)/src/ibpp/events.cpp ibpp_exception.o: $(srcdir)/src/ibpp/exception.cpp $(IBPP_ODEP) $(CXXC) -c -o $@ $(IBPP_CXXFLAGS) $(srcdir)/src/ibpp/exception.cpp ibpp_row.o: $(srcdir)/src/ibpp/row.cpp $(IBPP_ODEP) $(CXXC) -c -o $@ $(IBPP_CXXFLAGS) $(srcdir)/src/ibpp/row.cpp ibpp_service.o: $(srcdir)/src/ibpp/service.cpp $(IBPP_ODEP) $(CXXC) -c -o $@ $(IBPP_CXXFLAGS) $(srcdir)/src/ibpp/service.cpp ibpp_statement.o: $(srcdir)/src/ibpp/statement.cpp $(IBPP_ODEP) $(CXXC) -c -o $@ $(IBPP_CXXFLAGS) $(srcdir)/src/ibpp/statement.cpp ibpp_time.o: $(srcdir)/src/ibpp/time.cpp $(IBPP_ODEP) $(CXXC) -c -o $@ $(IBPP_CXXFLAGS) $(srcdir)/src/ibpp/time.cpp ibpp_transaction.o: $(srcdir)/src/ibpp/transaction.cpp $(IBPP_ODEP) $(CXXC) -c -o $@ $(IBPP_CXXFLAGS) $(srcdir)/src/ibpp/transaction.cpp ibpp_user.o: $(srcdir)/src/ibpp/user.cpp $(IBPP_ODEP) $(CXXC) -c -o $@ $(IBPP_CXXFLAGS) $(srcdir)/src/ibpp/user.cpp # Include dependency info, if present: @IF_GNU_MAKE@-include ./.deps/*.d .PHONY: all install uninstall clean distclean flamerobin_bundle flamerobin_0.9.3~svn+2220.orig/README.txt000066400000000000000000000012551177057155300177040ustar00rootroot00000000000000FlameRobin --------------------------- FlameRobin is a software package for administration of Firebird DBMS. It is developed by: Milan Babuskov Nando Dessena Michael Hieke Gregory Sapunkov Bart Bakker The following people also made a significant non-coding contributions: Marius Popa Alex Stanciu Barbara Del Vecchio License --------------------------- FlameRobin code is licensed under the Expat license. A copy of the license can be found in the docs folder. Part of code covering IBPP library is licensed under IBPP license. A copy of IBPP license can be found in src/ibpp folder. Some icons are licensed under LGPL license. A copy of LGPL license can be found in res folder. flamerobin_0.9.3~svn+2220.orig/aclocal.m4000066400000000000000000002161621177057155300200530ustar00rootroot00000000000000# generated automatically by aclocal 1.11.1 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. dnl --------------------------------------------------------------------------- dnl Macros for wxWidgets detection. Typically used in configure.in as: dnl dnl AC_ARG_ENABLE(...) dnl AC_ARG_WITH(...) dnl ... dnl AM_OPTIONS_WXCONFIG dnl ... dnl ... dnl AM_PATH_WXCONFIG(2.6.0, wxWin=1) dnl if test "$wxWin" != 1; then dnl AC_MSG_ERROR([ dnl wxWidgets must be installed on your system dnl but wx-config script couldn't be found. dnl dnl Please check that wx-config is in path, the directory dnl where wxWidgets libraries are installed (returned by dnl 'wx-config --libs' command) is in LD_LIBRARY_PATH or dnl equivalent variable and wxWidgets version is 2.3.4 or above. dnl ]) dnl fi dnl CPPFLAGS="$CPPFLAGS $WX_CPPFLAGS" dnl CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS_ONLY" dnl CFLAGS="$CFLAGS $WX_CFLAGS_ONLY" dnl dnl LIBS="$LIBS $WX_LIBS" dnl --------------------------------------------------------------------------- dnl --------------------------------------------------------------------------- dnl AM_OPTIONS_WXCONFIG dnl dnl adds support for --wx-prefix, --wx-exec-prefix, --with-wxdir and dnl --wx-config command line options dnl --------------------------------------------------------------------------- AC_DEFUN([AM_OPTIONS_WXCONFIG], [ AC_ARG_WITH(wxdir, [ --with-wxdir=PATH Use uninstalled version of wxWidgets in PATH], [ wx_config_name="$withval/wx-config" wx_config_args="--inplace"]) AC_ARG_WITH(wx-config, [ --with-wx-config=CONFIG wx-config script to use (optional)], wx_config_name="$withval" ) AC_ARG_WITH(wx-prefix, [ --with-wx-prefix=PREFIX Prefix where wxWidgets is installed (optional)], wx_config_prefix="$withval", wx_config_prefix="") AC_ARG_WITH(wx-exec-prefix, [ --with-wx-exec-prefix=PREFIX Exec prefix where wxWidgets is installed (optional)], wx_config_exec_prefix="$withval", wx_config_exec_prefix="") ]) dnl Helper macro for checking if wx version is at least $1.$2.$3, set's dnl wx_ver_ok=yes if it is: AC_DEFUN([_WX_PRIVATE_CHECK_VERSION], [ wx_ver_ok="" if test "x$WX_VERSION" != x ; then if test $wx_config_major_version -gt $1; then wx_ver_ok=yes else if test $wx_config_major_version -eq $1; then if test $wx_config_minor_version -gt $2; then wx_ver_ok=yes else if test $wx_config_minor_version -eq $2; then if test $wx_config_micro_version -ge $3; then wx_ver_ok=yes fi fi fi fi fi fi ]) dnl --------------------------------------------------------------------------- dnl AM_PATH_WXCONFIG(VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND dnl [, WX-LIBS [, ADDITIONAL-WX-CONFIG-FLAGS]]]]) dnl dnl Test for wxWidgets, and define WX_C*FLAGS, WX_LIBS and WX_LIBS_STATIC dnl (the latter is for static linking against wxWidgets). Set WX_CONFIG_NAME dnl environment variable to override the default name of the wx-config script dnl to use. Set WX_CONFIG_PATH to specify the full path to wx-config - in this dnl case the macro won't even waste time on tests for its existence. dnl dnl Optional WX-LIBS argument contains comma- or space-separated list of dnl wxWidgets libraries to link against (it may include contrib libraries). If dnl it is not specified then WX_LIBS and WX_LIBS_STATIC will contain flags to dnl link with all of the core wxWidgets libraries. dnl dnl Optional ADDITIONAL-WX-CONFIG-FLAGS argument is appended to wx-config dnl invocation command in present. It can be used to fine-tune lookup of dnl best wxWidgets build available. dnl dnl Example use: dnl AM_PATH_WXCONFIG([2.6.0], [wxWin=1], [wxWin=0], [html,core,net] dnl [--unicode --debug]) dnl --------------------------------------------------------------------------- dnl dnl Get the cflags and libraries from the wx-config script dnl AC_DEFUN([AM_PATH_WXCONFIG], [ dnl do we have wx-config name: it can be wx-config or wxd-config or ... if test x${WX_CONFIG_NAME+set} != xset ; then WX_CONFIG_NAME=wx-config fi if test "x$wx_config_name" != x ; then WX_CONFIG_NAME="$wx_config_name" fi dnl deal with optional prefixes if test x$wx_config_exec_prefix != x ; then wx_config_args="$wx_config_args --exec-prefix=$wx_config_exec_prefix" WX_LOOKUP_PATH="$wx_config_exec_prefix/bin" fi if test x$wx_config_prefix != x ; then wx_config_args="$wx_config_args --prefix=$wx_config_prefix" WX_LOOKUP_PATH="$WX_LOOKUP_PATH:$wx_config_prefix/bin" fi if test "$cross_compiling" = "yes"; then wx_config_args="$wx_config_args --host=$host_alias" fi dnl don't search the PATH if WX_CONFIG_NAME is absolute filename if test -x "$WX_CONFIG_NAME" ; then AC_MSG_CHECKING(for wx-config) WX_CONFIG_PATH="$WX_CONFIG_NAME" AC_MSG_RESULT($WX_CONFIG_PATH) else AC_PATH_PROG(WX_CONFIG_PATH, $WX_CONFIG_NAME, no, "$WX_LOOKUP_PATH:$PATH") fi if test "$WX_CONFIG_PATH" != "no" ; then WX_VERSION="" min_wx_version=ifelse([$1], ,2.2.1,$1) if test -z "$5" ; then AC_MSG_CHECKING([for wxWidgets version >= $min_wx_version]) else AC_MSG_CHECKING([for wxWidgets version >= $min_wx_version ($5)]) fi WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args $5 $4" WX_VERSION=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null` wx_config_major_version=`echo $WX_VERSION | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` wx_config_minor_version=`echo $WX_VERSION | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` wx_config_micro_version=`echo $WX_VERSION | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` wx_requested_major_version=`echo $min_wx_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` wx_requested_minor_version=`echo $min_wx_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` wx_requested_micro_version=`echo $min_wx_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` _WX_PRIVATE_CHECK_VERSION([$wx_requested_major_version], [$wx_requested_minor_version], [$wx_requested_micro_version]) if test -n "$wx_ver_ok"; then AC_MSG_RESULT(yes (version $WX_VERSION)) WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs` dnl is this even still appropriate? --static is a real option now dnl and WX_CONFIG_WITH_ARGS is likely to contain it if that is dnl what the user actually wants, making this redundant at best. dnl For now keep it in case anyone actually used it in the past. AC_MSG_CHECKING([for wxWidgets static library]) WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs 2>/dev/null` if test "x$WX_LIBS_STATIC" = "x"; then AC_MSG_RESULT(no) else AC_MSG_RESULT(yes) fi dnl starting with version 2.2.6 wx-config has --cppflags argument wx_has_cppflags="" if test $wx_config_major_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_minor_version -eq 2; then if test $wx_config_micro_version -ge 6; then wx_has_cppflags=yes fi fi fi fi fi dnl starting with version 2.7.0 wx-config has --rescomp option wx_has_rescomp="" if test $wx_config_major_version -gt 2; then wx_has_rescomp=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -ge 7; then wx_has_rescomp=yes fi fi fi if test "x$wx_has_rescomp" = x ; then dnl cannot give any useful info for resource compiler WX_RESCOMP= else WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp` fi if test "x$wx_has_cppflags" = x ; then dnl no choice but to define all flags like CFLAGS WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` WX_CPPFLAGS=$WX_CFLAGS WX_CXXFLAGS=$WX_CFLAGS WX_CFLAGS_ONLY=$WX_CFLAGS WX_CXXFLAGS_ONLY=$WX_CFLAGS else dnl we have CPPFLAGS included in CFLAGS included in CXXFLAGS WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags` WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags` WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed "s@^$WX_CPPFLAGS *@@"` WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"` fi ifelse([$2], , :, [$2]) else if test "x$WX_VERSION" = x; then dnl no wx-config at all AC_MSG_RESULT(no) else AC_MSG_RESULT(no (version $WX_VERSION is not new enough)) fi WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" ifelse([$3], , :, [$3]) fi else WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" ifelse([$3], , :, [$3]) fi AC_SUBST(WX_CPPFLAGS) AC_SUBST(WX_CFLAGS) AC_SUBST(WX_CXXFLAGS) AC_SUBST(WX_CFLAGS_ONLY) AC_SUBST(WX_CXXFLAGS_ONLY) AC_SUBST(WX_LIBS) AC_SUBST(WX_LIBS_STATIC) AC_SUBST(WX_VERSION) AC_SUBST(WX_RESCOMP) ]) dnl --------------------------------------------------------------------------- dnl Get information on the wxrc program for making C++, Python and xrs dnl resource files. dnl dnl AC_ARG_ENABLE(...) dnl AC_ARG_WITH(...) dnl ... dnl AM_OPTIONS_WXCONFIG dnl ... dnl AM_PATH_WXCONFIG(2.6.0, wxWin=1) dnl if test "$wxWin" != 1; then dnl AC_MSG_ERROR([ dnl wxWidgets must be installed on your system dnl but wx-config script couldn't be found. dnl dnl Please check that wx-config is in path, the directory dnl where wxWidgets libraries are installed (returned by dnl 'wx-config --libs' command) is in LD_LIBRARY_PATH or dnl equivalent variable and wxWidgets version is 2.6.0 or above. dnl ]) dnl fi dnl dnl AM_PATH_WXRC([HAVE_WXRC=1], [HAVE_WXRC=0]) dnl if test "x$HAVE_WXRC" != x1; then dnl AC_MSG_ERROR([ dnl The wxrc program was not installed or not found. dnl dnl Please check the wxWidgets installation. dnl ]) dnl fi dnl dnl CPPFLAGS="$CPPFLAGS $WX_CPPFLAGS" dnl CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS_ONLY" dnl CFLAGS="$CFLAGS $WX_CFLAGS_ONLY" dnl dnl LDFLAGS="$LDFLAGS $WX_LIBS" dnl --------------------------------------------------------------------------- dnl --------------------------------------------------------------------------- dnl AM_PATH_WXRC([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl dnl Test for wxWidgets' wxrc program for creating either C++, Python or XRS dnl resources. The variable WXRC will be set and substituted in the configure dnl script and Makefiles. dnl dnl Example use: dnl AM_PATH_WXRC([wxrc=1], [wxrc=0]) dnl --------------------------------------------------------------------------- dnl dnl wxrc program from the wx-config script dnl AC_DEFUN([AM_PATH_WXRC], [ AC_ARG_VAR([WXRC], [Path to wxWidget's wxrc resource compiler]) if test "x$WX_CONFIG_NAME" = x; then AC_MSG_ERROR([The wxrc tests must run after wxWidgets test.]) else AC_MSG_CHECKING([for wxrc]) if test "x$WXRC" = x ; then dnl wx-config --utility is a new addition to wxWidgets: _WX_PRIVATE_CHECK_VERSION(2,5,3) if test -n "$wx_ver_ok"; then WXRC=`$WX_CONFIG_WITH_ARGS --utility=wxrc` fi fi if test "x$WXRC" = x ; then AC_MSG_RESULT([not found]) ifelse([$2], , :, [$2]) else AC_MSG_RESULT([$WXRC]) ifelse([$1], , :, [$1]) fi AC_SUBST(WXRC) fi ]) AC_DEFUN([AC_BAKEFILE_CREATE_FILE_DLLAR_SH], [ dnl ===================== dllar.sh begins here ===================== dnl (Created by merge-scripts.py from dllar.sh dnl file do not edit here!) D='$' cat <dllar.sh #!/bin/sh # # dllar - a tool to build both a .dll and an .a file # from a set of object (.o) files for EMX/OS2. # # Written by Andrew Zabolotny, bit@freya.etu.ru # Ported to Unix like shell by Stefan Neis, Stefan.Neis@t-online.de # # This script will accept a set of files on the command line. # All the public symbols from the .o files will be exported into # a .DEF file, then linker will be run (through gcc) against them to # build a shared library consisting of all given .o files. All libraries # (.a) will be first decompressed into component .o files then act as # described above. You can optionally give a description (-d "description") # which will be put into .DLL. To see the list of accepted options (as well # as command-line format) simply run this program without options. The .DLL # is built to be imported by name (there is no guarantee that new versions # of the library you build will have same ordinals for same symbols). # # dllar is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # dllar 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 dllar; see the file COPYING. If not, write to the Free # Software Foundation, 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # To successfuly run this program you will need: # - Current drive should have LFN support (HPFS, ext2, network, etc) # (Sometimes dllar generates filenames which won't fit 8.3 scheme) # - gcc # (used to build the .dll) # - emxexp # (used to create .def file from .o files) # - emximp # (used to create .a file from .def file) # - GNU text utilites (cat, sort, uniq) # used to process emxexp output # - GNU file utilities (mv, rm) # - GNU sed # - lxlite (optional, see flag below) # (used for general .dll cleanup) # flag_USE_LXLITE=1; # # helper functions # basnam, variant of basename, which does _not_ remove the path, _iff_ # second argument (suffix to remove) is given basnam(){ case ${D}# in 1) echo ${D}1 | sed 's/.*\\///' | sed 's/.*\\\\//' ;; 2) echo ${D}1 | sed 's/'${D}2'${D}//' ;; *) echo "error in basnam ${D}*" exit 8 ;; esac } # Cleanup temporary files and output CleanUp() { cd ${D}curDir for i in ${D}inputFiles ; do case ${D}i in *!) rm -rf \`basnam ${D}i !\` ;; *) ;; esac done # Kill result in case of failure as there is just to many stupid make/nmake # things out there which doesn't do this. if @<:@ ${D}# -eq 0 @:>@; then rm -f ${D}arcFile ${D}arcFile2 ${D}defFile ${D}dllFile fi } # Print usage and exit script with rc=1. PrintHelp() { echo 'Usage: dllar.sh @<:@-o@<:@utput@:>@ output_file@:>@ @<:@-i@<:@mport@:>@ importlib_name@:>@' echo ' @<:@-name-mangler-script script.sh@:>@' echo ' @<:@-d@<:@escription@:>@ "dll descrption"@:>@ @<:@-cc "CC"@:>@ @<:@-f@<:@lags@:>@ "CFLAGS"@:>@' echo ' @<:@-ord@<:@inals@:>@@:>@ -ex@<:@clude@:>@ "symbol(s)"' echo ' @<:@-libf@<:@lags@:>@ "{INIT|TERM}{GLOBAL|INSTANCE}"@:>@ @<:@-nocrt@<:@dll@:>@@:>@ @<:@-nolxl@<:@ite@:>@@:>@' echo ' @<:@*.o@:>@ @<:@*.a@:>@' echo '*> "output_file" should have no extension.' echo ' If it has the .o, .a or .dll extension, it is automatically removed.' echo ' The import library name is derived from this and is set to "name".a,' echo ' unless overridden by -import' echo '*> "importlib_name" should have no extension.' echo ' If it has the .o, or .a extension, it is automatically removed.' echo ' This name is used as the import library name and may be longer and' echo ' more descriptive than the DLL name which has to follow the old ' echo ' 8.3 convention of FAT.' echo '*> "script.sh may be given to override the output_file name by a' echo ' different name. It is mainly useful if the regular make process' echo ' of some package does not take into account OS/2 restriction of' echo ' DLL name lengths. It takes the importlib name as input and is' echo ' supposed to procude a shorter name as output. The script should' echo ' expect to get importlib_name without extension and should produce' echo ' a (max.) 8 letter name without extension.' echo '*> "cc" is used to use another GCC executable. (default: gcc.exe)' echo '*> "flags" should be any set of valid GCC flags. (default: -s -Zcrtdll)' echo ' These flags will be put at the start of GCC command line.' echo '*> -ord@<:@inals@:>@ tells dllar to export entries by ordinals. Be careful.' echo '*> -ex@<:@clude@:>@ defines symbols which will not be exported. You can define' echo ' multiple symbols, for example -ex "myfunc yourfunc _GLOBAL*".' echo ' If the last character of a symbol is "*", all symbols beginning' echo ' with the prefix before "*" will be exclude, (see _GLOBAL* above).' echo '*> -libf@<:@lags@:>@ can be used to add INITGLOBAL/INITINSTANCE and/or' echo ' TERMGLOBAL/TERMINSTANCE flags to the dynamically-linked library.' echo '*> -nocrt@<:@dll@:>@ switch will disable linking the library against emx''s' echo ' C runtime DLLs.' echo '*> -nolxl@<:@ite@:>@ switch will disable running lxlite on the resulting DLL.' echo '*> All other switches (for example -L./ or -lmylib) will be passed' echo ' unchanged to GCC at the end of command line.' echo '*> If you create a DLL from a library and you do not specify -o,' echo ' the basename for DLL and import library will be set to library name,' echo ' the initial library will be renamed to 'name'_s.a (_s for static)' echo ' i.e. "dllar gcc.a" will create gcc.dll and gcc.a, and the initial' echo ' library will be renamed into gcc_s.a.' echo '--------' echo 'Example:' echo ' dllar -o gcc290.dll libgcc.a -d "GNU C runtime library" -ord' echo ' -ex "__main __ctordtor*" -libf "INITINSTANCE TERMINSTANCE"' CleanUp exit 1 } # Execute a command. # If exit code of the commnad <> 0 CleanUp() is called and we'll exit the script. # @Uses Whatever CleanUp() uses. doCommand() { echo "${D}*" eval ${D}* rcCmd=${D}? if @<:@ ${D}rcCmd -ne 0 @:>@; then echo "command failed, exit code="${D}rcCmd CleanUp exit ${D}rcCmd fi } # main routine # setup globals cmdLine=${D}* outFile="" outimpFile="" inputFiles="" renameScript="" description="" CC=gcc.exe CFLAGS="-s -Zcrtdll" EXTRA_CFLAGS="" EXPORT_BY_ORDINALS=0 exclude_symbols="" library_flags="" curDir=\`pwd\` curDirS=curDir case ${D}curDirS in */) ;; *) curDirS=${D}{curDirS}"/" ;; esac # Parse commandline libsToLink=0 omfLinking=0 while @<:@ ${D}1 @:>@; do case ${D}1 in -ord*) EXPORT_BY_ORDINALS=1; ;; -o*) shift outFile=${D}1 ;; -i*) shift outimpFile=${D}1 ;; -name-mangler-script) shift renameScript=${D}1 ;; -d*) shift description=${D}1 ;; -f*) shift CFLAGS=${D}1 ;; -c*) shift CC=${D}1 ;; -h*) PrintHelp ;; -ex*) shift exclude_symbols=${D}{exclude_symbols}${D}1" " ;; -libf*) shift library_flags=${D}{library_flags}${D}1" " ;; -nocrt*) CFLAGS="-s" ;; -nolxl*) flag_USE_LXLITE=0 ;; -* | /*) case ${D}1 in -L* | -l*) libsToLink=1 ;; -Zomf) omfLinking=1 ;; *) ;; esac EXTRA_CFLAGS=${D}{EXTRA_CFLAGS}" "${D}1 ;; *.dll) EXTRA_CFLAGS="${D}{EXTRA_CFLAGS} \`basnam ${D}1 .dll\`" if @<:@ ${D}omfLinking -eq 1 @:>@; then EXTRA_CFLAGS="${D}{EXTRA_CFLAGS}.lib" else EXTRA_CFLAGS="${D}{EXTRA_CFLAGS}.a" fi ;; *) found=0; if @<:@ ${D}libsToLink -ne 0 @:>@; then EXTRA_CFLAGS=${D}{EXTRA_CFLAGS}" "${D}1 else for file in ${D}1 ; do if @<:@ -f ${D}file @:>@; then inputFiles="${D}{inputFiles} ${D}file" found=1 fi done if @<:@ ${D}found -eq 0 @:>@; then echo "ERROR: No file(s) found: "${D}1 exit 8 fi fi ;; esac shift done # iterate cmdline words # if @<:@ -z "${D}inputFiles" @:>@; then echo "dllar: no input files" PrintHelp fi # Now extract all .o files from .a files newInputFiles="" for file in ${D}inputFiles ; do case ${D}file in *.a | *.lib) case ${D}file in *.a) suffix=".a" AR="ar" ;; *.lib) suffix=".lib" AR="emxomfar" EXTRA_CFLAGS="${D}EXTRA_CFLAGS -Zomf" ;; *) ;; esac dirname=\`basnam ${D}file ${D}suffix\`"_%" mkdir ${D}dirname if @<:@ ${D}? -ne 0 @:>@; then echo "Failed to create subdirectory ./${D}dirname" CleanUp exit 8; fi # Append '!' to indicate archive newInputFiles="${D}newInputFiles ${D}{dirname}!" doCommand "cd ${D}dirname; ${D}AR x ../${D}file" cd ${D}curDir found=0; for subfile in ${D}dirname/*.o* ; do if @<:@ -f ${D}subfile @:>@; then found=1 if @<:@ -s ${D}subfile @:>@; then # FIXME: This should be: is file size > 32 byte, _not_ > 0! newInputFiles="${D}newInputFiles ${D}subfile" fi fi done if @<:@ ${D}found -eq 0 @:>@; then echo "WARNING: there are no files in archive \\'${D}file\\'" fi ;; *) newInputFiles="${D}{newInputFiles} ${D}file" ;; esac done inputFiles="${D}newInputFiles" # Output filename(s). do_backup=0; if @<:@ -z ${D}outFile @:>@; then do_backup=1; set outFile ${D}inputFiles; outFile=${D}2 fi # If it is an archive, remove the '!' and the '_%' suffixes case ${D}outFile in *_%!) outFile=\`basnam ${D}outFile _%!\` ;; *) ;; esac case ${D}outFile in *.dll) outFile=\`basnam ${D}outFile .dll\` ;; *.DLL) outFile=\`basnam ${D}outFile .DLL\` ;; *.o) outFile=\`basnam ${D}outFile .o\` ;; *.obj) outFile=\`basnam ${D}outFile .obj\` ;; *.a) outFile=\`basnam ${D}outFile .a\` ;; *.lib) outFile=\`basnam ${D}outFile .lib\` ;; *) ;; esac case ${D}outimpFile in *.a) outimpFile=\`basnam ${D}outimpFile .a\` ;; *.lib) outimpFile=\`basnam ${D}outimpFile .lib\` ;; *) ;; esac if @<:@ -z ${D}outimpFile @:>@; then outimpFile=${D}outFile fi defFile="${D}{outFile}.def" arcFile="${D}{outimpFile}.a" arcFile2="${D}{outimpFile}.lib" #create ${D}dllFile as something matching 8.3 restrictions, if @<:@ -z ${D}renameScript @:>@ ; then dllFile="${D}outFile" else dllFile=\`${D}renameScript ${D}outimpFile\` fi if @<:@ ${D}do_backup -ne 0 @:>@ ; then if @<:@ -f ${D}arcFile @:>@ ; then doCommand "mv ${D}arcFile ${D}{outFile}_s.a" fi if @<:@ -f ${D}arcFile2 @:>@ ; then doCommand "mv ${D}arcFile2 ${D}{outFile}_s.lib" fi fi # Extract public symbols from all the object files. tmpdefFile=${D}{defFile}_% rm -f ${D}tmpdefFile for file in ${D}inputFiles ; do case ${D}file in *!) ;; *) doCommand "emxexp -u ${D}file >> ${D}tmpdefFile" ;; esac done # Create the def file. rm -f ${D}defFile echo "LIBRARY \`basnam ${D}dllFile\` ${D}library_flags" >> ${D}defFile dllFile="${D}{dllFile}.dll" if @<:@ ! -z ${D}description @:>@; then echo "DESCRIPTION \\"${D}{description}\\"" >> ${D}defFile fi echo "EXPORTS" >> ${D}defFile doCommand "cat ${D}tmpdefFile | sort.exe | uniq.exe > ${D}{tmpdefFile}%" grep -v "^ *;" < ${D}{tmpdefFile}% | grep -v "^ *${D}" >${D}tmpdefFile # Checks if the export is ok or not. for word in ${D}exclude_symbols; do grep -v ${D}word < ${D}tmpdefFile >${D}{tmpdefFile}% mv ${D}{tmpdefFile}% ${D}tmpdefFile done if @<:@ ${D}EXPORT_BY_ORDINALS -ne 0 @:>@; then sed "=" < ${D}tmpdefFile | \\ sed ' N : loop s/^\\(@<:@0-9@:>@\\+\\)\\(@<:@^;@:>@*\\)\\(;.*\\)\\?/\\2 @\\1 NONAME/ t loop ' > ${D}{tmpdefFile}% grep -v "^ *${D}" < ${D}{tmpdefFile}% > ${D}tmpdefFile else rm -f ${D}{tmpdefFile}% fi cat ${D}tmpdefFile >> ${D}defFile rm -f ${D}tmpdefFile # Do linking, create implib, and apply lxlite. gccCmdl=""; for file in ${D}inputFiles ; do case ${D}file in *!) ;; *) gccCmdl="${D}gccCmdl ${D}file" ;; esac done doCommand "${D}CC ${D}CFLAGS -Zdll -o ${D}dllFile ${D}defFile ${D}gccCmdl ${D}EXTRA_CFLAGS" touch "${D}{outFile}.dll" doCommand "emximp -o ${D}arcFile ${D}defFile" if @<:@ ${D}flag_USE_LXLITE -ne 0 @:>@; then add_flags=""; if @<:@ ${D}EXPORT_BY_ORDINALS -ne 0 @:>@; then add_flags="-ynd" fi doCommand "lxlite -cs -t: -mrn -mln ${D}add_flags ${D}dllFile" fi doCommand "emxomf -s -l ${D}arcFile" # Successful exit. CleanUp 1 exit 0 EOF dnl ===================== dllar.sh ends here ===================== ]) dnl dnl This file is part of Bakefile (http://www.bakefile.org) dnl dnl Copyright (C) 2003-2007 Vaclav Slavik, David Elliott and others dnl dnl Permission is hereby granted, free of charge, to any person obtaining a dnl copy of this software and associated documentation files (the "Software"), dnl to deal in the Software without restriction, including without limitation dnl the rights to use, copy, modify, merge, publish, distribute, sublicense, dnl and/or sell copies of the Software, and to permit persons to whom the dnl Software is furnished to do so, subject to the following conditions: dnl dnl The above copyright notice and this permission notice shall be included in dnl all copies or substantial portions of the Software. dnl dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR dnl IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, dnl FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL dnl THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER dnl LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING dnl FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER dnl DEALINGS IN THE SOFTWARE. dnl dnl $Id$ dnl dnl Compiler detection macros by David Elliott and Vadim Zeitlin dnl dnl =========================================================================== dnl Macros to detect different C/C++ compilers dnl =========================================================================== dnl Based on autoconf _AC_LANG_COMPILER_GNU dnl _AC_BAKEFILE_LANG_COMPILER(NAME, LANG, SYMBOL, IF-YES, IF-NO) AC_DEFUN([_AC_BAKEFILE_LANG_COMPILER], [ AC_LANG_PUSH($2) AC_CACHE_CHECK( [whether we are using the $1 $2 compiler], [bakefile_cv_[]_AC_LANG_ABBREV[]_compiler_[]$3], [AC_TRY_COMPILE( [], [ #ifndef $3 choke me #endif ], [bakefile_cv_[]_AC_LANG_ABBREV[]_compiler_[]$3=yes], [bakefile_cv_[]_AC_LANG_ABBREV[]_compiler_[]$3=no] ) ] ) if test "x$bakefile_cv_[]_AC_LANG_ABBREV[]_compiler_[]$3" = "xyes"; then :; $4 else :; $5 fi AC_LANG_POP($2) ]) dnl More specific version of the above macro checking whether the compiler dnl version is at least the given one (assumes that we do use this compiler) dnl dnl _AC_BAKEFILE_LANG_COMPILER_LATER_THAN(NAME, LANG, SYMBOL, VER, VERMSG, IF-YES, IF-NO) AC_DEFUN([_AC_BAKEFILE_LANG_COMPILER_LATER_THAN], [ AC_LANG_PUSH($2) AC_CACHE_CHECK( [whether we are using $1 $2 compiler v$5 or later], [bakefile_cv_[]_AC_LANG_ABBREV[]_compiler_[]$3[]_lt_[]$4], [AC_TRY_COMPILE( [], [ #ifndef $3 || $3 < $4 choke me #endif ], [bakefile_cv_[]_AC_LANG_ABBREV[]_compiler_[]$3[]_lt_[]$4=yes], [bakefile_cv_[]_AC_LANG_ABBREV[]_compiler_[]$3[]_lt_[]$4=no] ) ] ) if test "x$bakefile_cv_[]_AC_LANG_ABBREV[]_compiler_[]$3[]_lt_[]$4" = "xyes"; then :; $6 else :; $7 fi AC_LANG_POP($2) ]) dnl CodeWarrior Metrowerks compiler defines __MWERKS__ for both C and C++ AC_DEFUN([AC_BAKEFILE_PROG_MWCC], [ _AC_BAKEFILE_LANG_COMPILER(Metrowerks, C, __MWERKS__, MWCC=yes) ]) AC_DEFUN([AC_BAKEFILE_PROG_MWCXX], [ _AC_BAKEFILE_LANG_COMPILER(Metrowerks, C++, __MWERKS__, MWCXX=yes) ]) dnl IBM xlC compiler defines __xlC__ for both C and C++ AC_DEFUN([AC_BAKEFILE_PROG_XLCC], [ _AC_BAKEFILE_LANG_COMPILER([IBM xlC], C, __xlC__, XLCC=yes) ]) AC_DEFUN([AC_BAKEFILE_PROG_XLCXX], [ _AC_BAKEFILE_LANG_COMPILER([IBM xlC], C++, __xlC__, XLCXX=yes) ]) dnl recent versions of SGI mipsPro compiler define _SGI_COMPILER_VERSION dnl dnl NB: old versions define _COMPILER_VERSION but this could probably be dnl defined by other compilers too so don't test for it to be safe AC_DEFUN([AC_BAKEFILE_PROG_SGICC], [ _AC_BAKEFILE_LANG_COMPILER(SGI, C, _SGI_COMPILER_VERSION, SGICC=yes) ]) AC_DEFUN([AC_BAKEFILE_PROG_SGICXX], [ _AC_BAKEFILE_LANG_COMPILER(SGI, C++, _SGI_COMPILER_VERSION, SGICXX=yes) ]) dnl Sun compiler defines __SUNPRO_C/__SUNPRO_CC AC_DEFUN([AC_BAKEFILE_PROG_SUNCC], [ _AC_BAKEFILE_LANG_COMPILER(Sun, C, __SUNPRO_C, SUNCC=yes) ]) AC_DEFUN([AC_BAKEFILE_PROG_SUNCXX], [ _AC_BAKEFILE_LANG_COMPILER(Sun, C++, __SUNPRO_CC, SUNCXX=yes) ]) dnl Intel icc compiler defines __INTEL_COMPILER for both C and C++ AC_DEFUN([AC_BAKEFILE_PROG_INTELCC], [ _AC_BAKEFILE_LANG_COMPILER(Intel, C, __INTEL_COMPILER, INTELCC=yes) ]) AC_DEFUN([AC_BAKEFILE_PROG_INTELCXX], [ _AC_BAKEFILE_LANG_COMPILER(Intel, C++, __INTEL_COMPILER, INTELCXX=yes) ]) dnl Intel compiler command line options changed in incompatible ways sometimes dnl before v8 (-KPIC was replaced with gcc-compatible -fPIC) and again in v10 dnl (-create-pch deprecated in favour of -pch-create) so we need to test for dnl its exact version too AC_DEFUN([AC_BAKEFILE_PROG_INTELCC_8], [ _AC_BAKEFILE_LANG_COMPILER_LATER_THAN(Intel, C, __INTEL_COMPILER, 800, 8, INTELCC8=yes) ]) AC_DEFUN([AC_BAKEFILE_PROG_INTELCXX_8], [ _AC_BAKEFILE_LANG_COMPILER_LATER_THAN(Intel, C++, __INTEL_COMPILER, 800, 8, INTELCXX8=yes) ]) AC_DEFUN([AC_BAKEFILE_PROG_INTELCC_10], [ _AC_BAKEFILE_LANG_COMPILER_LATER_THAN(Intel, C, __INTEL_COMPILER, 1000, 10, INTELCC10=yes) ]) AC_DEFUN([AC_BAKEFILE_PROG_INTELCXX_10], [ _AC_BAKEFILE_LANG_COMPILER_LATER_THAN(Intel, C++, __INTEL_COMPILER, 1000, 10, INTELCXX10=yes) ]) dnl HP-UX aCC: see http://docs.hp.com/en/6162/preprocess.htm#macropredef AC_DEFUN([AC_BAKEFILE_PROG_HPCC], [ _AC_BAKEFILE_LANG_COMPILER(HP, C, __HP_cc, HPCC=yes) ]) AC_DEFUN([AC_BAKEFILE_PROG_HPCXX], [ _AC_BAKEFILE_LANG_COMPILER(HP, C++, __HP_aCC, HPCXX=yes) ]) dnl Tru64 cc and cxx AC_DEFUN([AC_BAKEFILE_PROG_COMPAQCC], [ _AC_BAKEFILE_LANG_COMPILER(Compaq, C, __DECC, COMPAQCC=yes) ]) AC_DEFUN([AC_BAKEFILE_PROG_COMPAQCXX], [ _AC_BAKEFILE_LANG_COMPILER(Compaq, C++, __DECCXX, COMPAQCXX=yes) ]) dnl =========================================================================== dnl macros to detect specialty compiler options dnl =========================================================================== dnl Figure out if we need to pass -ext o to compiler (MetroWerks) AC_DEFUN([AC_BAKEFILE_METROWERKS_EXTO], [AC_CACHE_CHECK([if the _AC_LANG compiler requires -ext o], bakefile_cv_[]_AC_LANG_ABBREV[]_exto, dnl First create an empty conf test [AC_LANG_CONFTEST([AC_LANG_PROGRAM()]) dnl Now remove .o and .c.o or .cc.o rm -f conftest.$ac_objext conftest.$ac_ext.o dnl Now compile the test AS_IF([AC_TRY_EVAL(ac_compile)], dnl If the test succeeded look for conftest.c.o or conftest.cc.o [for ac_file in `(ls conftest.* 2>/dev/null)`; do case $ac_file in conftest.$ac_ext.o) bakefile_cv_[]_AC_LANG_ABBREV[]_exto="-ext o" ;; *) ;; esac done], [AC_MSG_FAILURE([cannot figure out if compiler needs -ext o: cannot compile]) ]) dnl AS_IF rm -f conftest.$ac_ext.o conftest.$ac_objext conftest.$ac_ext ]) dnl AC_CACHE_CHECK if test "x$bakefile_cv_[]_AC_LANG_ABBREV[]_exto" '!=' "x"; then if test "[]_AC_LANG_ABBREV[]" = "c"; then CFLAGS="$bakefile_cv_[]_AC_LANG_ABBREV[]_exto $CFLAGS" fi if test "[]_AC_LANG_ABBREV[]" = "cxx"; then CXXFLAGS="$bakefile_cv_[]_AC_LANG_ABBREV[]_exto $CXXFLAGS" fi fi ]) dnl AC_DEFUN dnl =========================================================================== dnl Macros to do all of the compiler detections as one macro dnl =========================================================================== dnl check for different proprietary compilers depending on target platform dnl _AC_BAKEFILE_PROG_COMPILER(LANG) AC_DEFUN([_AC_BAKEFILE_PROG_COMPILER], [ AC_REQUIRE([AC_PROG_$1]) dnl Intel compiler can be used under several different OS and even dnl different architectures (x86, amd64 and Itanium) so it's easier to just dnl always test for it AC_BAKEFILE_PROG_INTEL$1 dnl If we use Intel compiler we also need to know its version if test "$INTEL$1" = "yes"; then AC_BAKEFILE_PROG_INTEL$1_8 AC_BAKEFILE_PROG_INTEL$1_10 fi dnl if we're using gcc, we can't be using any of incompatible compilers if test "x$G$1" != "xyes"; then if test "x$1" = "xC"; then AC_BAKEFILE_METROWERKS_EXTO if test "x$bakefile_cv_c_exto" '!=' "x"; then unset ac_cv_prog_cc_g _AC_PROG_CC_G fi fi dnl most of these compilers are only used under well-defined OS so dnl don't waste time checking for them on other ones case `uname -s` in AIX*) AC_BAKEFILE_PROG_XL$1 ;; Darwin) AC_BAKEFILE_PROG_MW$1 if test "$MW$1" != "yes"; then AC_BAKEFILE_PROG_XL$1 fi ;; IRIX*) AC_BAKEFILE_PROG_SGI$1 ;; Linux*) dnl Sun CC is now available under Linux too, test for it unless dnl we already found that we were using a different compiler if test "$INTEL$1" != "yes"; then AC_BAKEFILE_PROG_SUN$1 fi ;; HP-UX*) AC_BAKEFILE_PROG_HP$1 ;; OSF1) AC_BAKEFILE_PROG_COMPAQ$1 ;; SunOS) AC_BAKEFILE_PROG_SUN$1 ;; esac fi ]) AC_DEFUN([AC_BAKEFILE_PROG_CC], [ _AC_BAKEFILE_PROG_COMPILER(CC) ]) AC_DEFUN([AC_BAKEFILE_PROG_CXX], [ _AC_BAKEFILE_PROG_COMPILER(CXX) ]) dnl dnl This file is part of Bakefile (http://www.bakefile.org) dnl dnl Copyright (C) 2003-2007 Vaclav Slavik and others dnl dnl Permission is hereby granted, free of charge, to any person obtaining a dnl copy of this software and associated documentation files (the "Software"), dnl to deal in the Software without restriction, including without limitation dnl the rights to use, copy, modify, merge, publish, distribute, sublicense, dnl and/or sell copies of the Software, and to permit persons to whom the dnl Software is furnished to do so, subject to the following conditions: dnl dnl The above copyright notice and this permission notice shall be included in dnl all copies or substantial portions of the Software. dnl dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR dnl IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, dnl FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL dnl THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER dnl LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING dnl FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER dnl DEALINGS IN THE SOFTWARE. dnl dnl $Id$ dnl dnl Support macros for makefiles generated by BAKEFILE. dnl dnl --------------------------------------------------------------------------- dnl Lots of compiler & linker detection code contained here was taken from dnl wxWidgets configure.in script (see http://www.wxwidgets.org) dnl --------------------------------------------------------------------------- dnl --------------------------------------------------------------------------- dnl AC_BAKEFILE_GNUMAKE dnl dnl Detects GNU make dnl --------------------------------------------------------------------------- AC_DEFUN([AC_BAKEFILE_GNUMAKE], [ dnl does make support "-include" (only GNU make does AFAIK)? AC_CACHE_CHECK([if make is GNU make], bakefile_cv_prog_makeisgnu, [ if ( ${SHELL-sh} -c "${MAKE-make} --version" 2> /dev/null | egrep -s GNU > /dev/null); then bakefile_cv_prog_makeisgnu="yes" else bakefile_cv_prog_makeisgnu="no" fi ]) if test "x$bakefile_cv_prog_makeisgnu" = "xyes"; then IF_GNU_MAKE="" else IF_GNU_MAKE="#" fi AC_SUBST(IF_GNU_MAKE) ]) dnl --------------------------------------------------------------------------- dnl AC_BAKEFILE_PLATFORM dnl dnl Detects platform and sets PLATFORM_XXX variables accordingly dnl --------------------------------------------------------------------------- AC_DEFUN([AC_BAKEFILE_PLATFORM], [ PLATFORM_UNIX=0 PLATFORM_WIN32=0 PLATFORM_MSDOS=0 PLATFORM_MAC=0 PLATFORM_MACOS=0 PLATFORM_MACOSX=0 PLATFORM_OS2=0 PLATFORM_BEOS=0 if test "x$BAKEFILE_FORCE_PLATFORM" = "x"; then case "${BAKEFILE_HOST}" in *-*-mingw32* ) PLATFORM_WIN32=1 ;; *-pc-msdosdjgpp ) PLATFORM_MSDOS=1 ;; *-pc-os2_emx | *-pc-os2-emx ) PLATFORM_OS2=1 ;; *-*-darwin* ) PLATFORM_MAC=1 PLATFORM_MACOSX=1 ;; *-*-beos* ) PLATFORM_BEOS=1 ;; powerpc-apple-macos* ) PLATFORM_MAC=1 PLATFORM_MACOS=1 ;; * ) PLATFORM_UNIX=1 ;; esac else case "$BAKEFILE_FORCE_PLATFORM" in win32 ) PLATFORM_WIN32=1 ;; msdos ) PLATFORM_MSDOS=1 ;; os2 ) PLATFORM_OS2=1 ;; darwin ) PLATFORM_MAC=1 PLATFORM_MACOSX=1 ;; unix ) PLATFORM_UNIX=1 ;; beos ) PLATFORM_BEOS=1 ;; * ) AC_MSG_ERROR([Unknown platform: $BAKEFILE_FORCE_PLATFORM]) ;; esac fi AC_SUBST(PLATFORM_UNIX) AC_SUBST(PLATFORM_WIN32) AC_SUBST(PLATFORM_MSDOS) AC_SUBST(PLATFORM_MAC) AC_SUBST(PLATFORM_MACOS) AC_SUBST(PLATFORM_MACOSX) AC_SUBST(PLATFORM_OS2) AC_SUBST(PLATFORM_BEOS) ]) dnl --------------------------------------------------------------------------- dnl AC_BAKEFILE_PLATFORM_SPECIFICS dnl dnl Sets misc platform-specific settings dnl --------------------------------------------------------------------------- AC_DEFUN([AC_BAKEFILE_PLATFORM_SPECIFICS], [ AC_ARG_ENABLE([omf], AS_HELP_STRING([--enable-omf], [use OMF object format (OS/2)]), [bk_os2_use_omf="$enableval"]) case "${BAKEFILE_HOST}" in *-*-darwin* ) dnl For Unix to MacOS X porting instructions, see: dnl http://fink.sourceforge.net/doc/porting/porting.html if test "x$GCC" = "xyes"; then CFLAGS="$CFLAGS -fno-common" CXXFLAGS="$CXXFLAGS -fno-common" fi if test "x$XLCC" = "xyes"; then CFLAGS="$CFLAGS -qnocommon" CXXFLAGS="$CXXFLAGS -qnocommon" fi ;; *-pc-os2_emx | *-pc-os2-emx ) if test "x$bk_os2_use_omf" = "xyes" ; then AR=emxomfar RANLIB=: LDFLAGS="-Zomf $LDFLAGS" CFLAGS="-Zomf $CFLAGS" CXXFLAGS="-Zomf $CXXFLAGS" OS2_LIBEXT="lib" else OS2_LIBEXT="a" fi ;; i*86-*-beos* ) LDFLAGS="-L/boot/develop/lib/x86 $LDFLAGS" ;; esac ]) dnl --------------------------------------------------------------------------- dnl AC_BAKEFILE_SUFFIXES dnl dnl Detects shared various suffixes for shared libraries, libraries, programs, dnl plugins etc. dnl --------------------------------------------------------------------------- AC_DEFUN([AC_BAKEFILE_SUFFIXES], [ SO_SUFFIX="so" SO_SUFFIX_MODULE="so" EXEEXT="" LIBPREFIX="lib" LIBEXT=".a" DLLPREFIX="lib" DLLPREFIX_MODULE="" DLLIMP_SUFFIX="" dlldir="$libdir" case "${BAKEFILE_HOST}" in dnl PA-RISC HP systems used .sl but IA64 use ELF-64 and so use the dnl standard .so extension ia64-hp-hpux* ) ;; *-hp-hpux* ) SO_SUFFIX="sl" SO_SUFFIX_MODULE="sl" ;; *-*-aix* ) dnl quoting from dnl http://www-1.ibm.com/servers/esdd/articles/gnu.html: dnl Both archive libraries and shared libraries on AIX have an dnl .a extension. This will explain why you can't link with an dnl .so and why it works with the name changed to .a. SO_SUFFIX="a" SO_SUFFIX_MODULE="a" ;; *-*-cygwin* ) SO_SUFFIX="dll" SO_SUFFIX_MODULE="dll" DLLIMP_SUFFIX="dll.a" EXEEXT=".exe" DLLPREFIX="cyg" dlldir="$bindir" ;; *-*-mingw32* ) SO_SUFFIX="dll" SO_SUFFIX_MODULE="dll" DLLIMP_SUFFIX="dll.a" EXEEXT=".exe" DLLPREFIX="" dlldir="$bindir" ;; *-pc-msdosdjgpp ) EXEEXT=".exe" DLLPREFIX="" dlldir="$bindir" ;; *-pc-os2_emx | *-pc-os2-emx ) SO_SUFFIX="dll" SO_SUFFIX_MODULE="dll" DLLIMP_SUFFIX=$OS2_LIBEXT EXEEXT=".exe" DLLPREFIX="" LIBPREFIX="" LIBEXT=".$OS2_LIBEXT" dlldir="$bindir" ;; *-*-darwin* ) SO_SUFFIX="dylib" SO_SUFFIX_MODULE="bundle" ;; esac if test "x$DLLIMP_SUFFIX" = "x" ; then DLLIMP_SUFFIX="$SO_SUFFIX" fi AC_SUBST(SO_SUFFIX) AC_SUBST(SO_SUFFIX_MODULE) AC_SUBST(DLLIMP_SUFFIX) AC_SUBST(EXEEXT) AC_SUBST(LIBPREFIX) AC_SUBST(LIBEXT) AC_SUBST(DLLPREFIX) AC_SUBST(DLLPREFIX_MODULE) AC_SUBST(dlldir) ]) dnl --------------------------------------------------------------------------- dnl AC_BAKEFILE_SHARED_LD dnl dnl Detects command for making shared libraries, substitutes SHARED_LD_CC dnl and SHARED_LD_CXX. dnl --------------------------------------------------------------------------- AC_DEFUN([AC_BAKEFILE_SHARED_LD], [ dnl the extra compiler flags needed for compilation of shared library PIC_FLAG="" if test "x$GCC" = "xyes"; then dnl the switch for gcc is the same under all platforms PIC_FLAG="-fPIC" fi dnl Defaults for GCC and ELF .so shared libs: SHARED_LD_CC="\$(CC) -shared ${PIC_FLAG} -o" SHARED_LD_CXX="\$(CXX) -shared ${PIC_FLAG} -o" WINDOWS_IMPLIB=0 case "${BAKEFILE_HOST}" in *-hp-hpux* ) dnl default settings are good for gcc but not for the native HP-UX if test "x$GCC" != "xyes"; then dnl no idea why it wants it, but it does LDFLAGS="$LDFLAGS -L/usr/lib" SHARED_LD_CC="${CC} -b -o" SHARED_LD_CXX="${CXX} -b -o" PIC_FLAG="+Z" fi ;; *-*-linux* ) dnl newer icc versions use -fPIC just as gcc does and, in fact, the dnl newest (v10+) ones don't even understand -KPIC any longer if test "$INTELCC" = "yes" -a "$INTELCC8" != "yes"; then PIC_FLAG="-KPIC" elif test "x$SUNCXX" = "xyes"; then SHARED_LD_CC="${CC} -G -o" SHARED_LD_CXX="${CXX} -G -o" PIC_FLAG="-KPIC" fi ;; *-*-solaris2* ) if test "x$SUNCXX" = xyes ; then SHARED_LD_CC="${CC} -G -o" SHARED_LD_CXX="${CXX} -G -o" PIC_FLAG="-KPIC" fi ;; *-*-darwin* ) AC_BAKEFILE_CREATE_FILE_SHARED_LD_SH chmod +x shared-ld-sh SHARED_LD_MODULE_CC="`pwd`/shared-ld-sh -bundle -headerpad_max_install_names -o" SHARED_LD_MODULE_CXX="CXX=\"\$(CXX)\" $SHARED_LD_MODULE_CC" dnl Most apps benefit from being fully binded (its faster and static dnl variables initialized at startup work). dnl This can be done either with the exe linker flag -Wl,-bind_at_load dnl or with a double stage link in order to create a single module dnl "-init _wxWindowsDylibInit" not useful with lazy linking solved dnl If using newer dev tools then there is a -single_module flag that dnl we can use to do this for dylibs, otherwise we'll need to use a helper dnl script. Check the version of gcc to see which way we can go: AC_CACHE_CHECK([for gcc 3.1 or later], bakefile_cv_gcc31, [ AC_TRY_COMPILE([], [ #if (__GNUC__ < 3) || \ ((__GNUC__ == 3) && (__GNUC_MINOR__ < 1)) This is old gcc #endif ], [ bakefile_cv_gcc31=yes ], [ bakefile_cv_gcc31=no ] ) ]) if test "$bakefile_cv_gcc31" = "no"; then dnl Use the shared-ld-sh helper script SHARED_LD_CC="`pwd`/shared-ld-sh -dynamiclib -headerpad_max_install_names -o" SHARED_LD_CXX="$SHARED_LD_CC" else dnl Use the -single_module flag and let the linker do it for us SHARED_LD_CC="\${CC} -dynamiclib -single_module -headerpad_max_install_names -o" SHARED_LD_CXX="\${CXX} -dynamiclib -single_module -headerpad_max_install_names -o" fi if test "x$GCC" == "xyes"; then PIC_FLAG="-dynamic -fPIC" fi if test "x$XLCC" = "xyes"; then PIC_FLAG="-dynamic -DPIC" fi ;; *-*-aix* ) if test "x$GCC" = "xyes"; then dnl at least gcc 2.95 warns that -fPIC is ignored when dnl compiling each and every file under AIX which is annoying, dnl so don't use it there (it's useless as AIX runs on dnl position-independent architectures only anyhow) PIC_FLAG="" dnl -bexpfull is needed by AIX linker to export all symbols (by dnl default it doesn't export any and even with -bexpall it dnl doesn't export all C++ support symbols, e.g. vtable dnl pointers) but it's only available starting from 5.1 (with dnl maintenance pack 2, whatever this is), see dnl http://www-128.ibm.com/developerworks/eserver/articles/gnu.html case "${BAKEFILE_HOST}" in *-*-aix5* ) LD_EXPFULL="-Wl,-bexpfull" ;; esac SHARED_LD_CC="\$(CC) -shared $LD_EXPFULL -o" SHARED_LD_CXX="\$(CXX) -shared $LD_EXPFULL -o" else dnl FIXME: makeC++SharedLib is obsolete, what should we do for dnl recent AIX versions? AC_CHECK_PROG(AIX_CXX_LD, makeC++SharedLib, makeC++SharedLib, /usr/lpp/xlC/bin/makeC++SharedLib) SHARED_LD_CC="$AIX_CC_LD -p 0 -o" SHARED_LD_CXX="$AIX_CXX_LD -p 0 -o" fi ;; *-*-beos* ) dnl can't use gcc under BeOS for shared library creation because it dnl complains about missing 'main' SHARED_LD_CC="${LD} -nostart -o" SHARED_LD_CXX="${LD} -nostart -o" ;; *-*-irix* ) dnl default settings are ok for gcc if test "x$GCC" != "xyes"; then PIC_FLAG="-KPIC" fi ;; *-*-cygwin* | *-*-mingw32* ) PIC_FLAG="" SHARED_LD_CC="\$(CC) -shared -o" SHARED_LD_CXX="\$(CXX) -shared -o" WINDOWS_IMPLIB=1 ;; *-pc-os2_emx | *-pc-os2-emx ) SHARED_LD_CC="`pwd`/dllar.sh -libf INITINSTANCE -libf TERMINSTANCE -o" SHARED_LD_CXX="`pwd`/dllar.sh -libf INITINSTANCE -libf TERMINSTANCE -o" PIC_FLAG="" AC_BAKEFILE_CREATE_FILE_DLLAR_SH chmod +x dllar.sh ;; powerpc-apple-macos* | \ *-*-freebsd* | *-*-openbsd* | *-*-netbsd* | *-*-k*bsd*-gnu | \ *-*-mirbsd* | \ *-*-sunos4* | \ *-*-osf* | \ *-*-dgux5* | \ *-*-sysv5* | \ *-pc-msdosdjgpp ) dnl defaults are ok ;; *) AC_MSG_ERROR(unknown system type $BAKEFILE_HOST.) esac if test "x$PIC_FLAG" != "x" ; then PIC_FLAG="$PIC_FLAG -DPIC" fi if test "x$SHARED_LD_MODULE_CC" = "x" ; then SHARED_LD_MODULE_CC="$SHARED_LD_CC" fi if test "x$SHARED_LD_MODULE_CXX" = "x" ; then SHARED_LD_MODULE_CXX="$SHARED_LD_CXX" fi AC_SUBST(SHARED_LD_CC) AC_SUBST(SHARED_LD_CXX) AC_SUBST(SHARED_LD_MODULE_CC) AC_SUBST(SHARED_LD_MODULE_CXX) AC_SUBST(PIC_FLAG) AC_SUBST(WINDOWS_IMPLIB) ]) dnl --------------------------------------------------------------------------- dnl AC_BAKEFILE_SHARED_VERSIONS dnl dnl Detects linker options for attaching versions (sonames) to shared libs. dnl --------------------------------------------------------------------------- AC_DEFUN([AC_BAKEFILE_SHARED_VERSIONS], [ USE_SOVERSION=0 USE_SOVERLINUX=0 USE_SOVERSOLARIS=0 USE_SOVERCYGWIN=0 USE_SOTWOSYMLINKS=0 USE_MACVERSION=0 SONAME_FLAG= case "${BAKEFILE_HOST}" in *-*-linux* | *-*-freebsd* | *-*-openbsd* | *-*-netbsd* | \ *-*-k*bsd*-gnu | *-*-mirbsd* ) if test "x$SUNCXX" = "xyes"; then SONAME_FLAG="-h " else SONAME_FLAG="-Wl,-soname," fi USE_SOVERSION=1 USE_SOVERLINUX=1 USE_SOTWOSYMLINKS=1 ;; *-*-solaris2* ) SONAME_FLAG="-h " USE_SOVERSION=1 USE_SOVERSOLARIS=1 ;; *-*-darwin* ) USE_MACVERSION=1 USE_SOVERSION=1 USE_SOTWOSYMLINKS=1 ;; *-*-cygwin* ) USE_SOVERSION=1 USE_SOVERCYGWIN=1 ;; esac AC_SUBST(USE_SOVERSION) AC_SUBST(USE_SOVERLINUX) AC_SUBST(USE_SOVERSOLARIS) AC_SUBST(USE_SOVERCYGWIN) AC_SUBST(USE_MACVERSION) AC_SUBST(USE_SOTWOSYMLINKS) AC_SUBST(SONAME_FLAG) ]) dnl --------------------------------------------------------------------------- dnl AC_BAKEFILE_DEPS dnl dnl Detects available C/C++ dependency tracking options dnl --------------------------------------------------------------------------- AC_DEFUN([AC_BAKEFILE_DEPS], [ AC_ARG_ENABLE([dependency-tracking], AS_HELP_STRING([--disable-dependency-tracking], [don't use dependency tracking even if the compiler can]), [bk_use_trackdeps="$enableval"]) AC_MSG_CHECKING([for dependency tracking method]) BK_DEPS="" if test "x$bk_use_trackdeps" = "xno" ; then DEPS_TRACKING=0 AC_MSG_RESULT([disabled]) else DEPS_TRACKING=1 if test "x$GCC" = "xyes"; then DEPSMODE=gcc case "${BAKEFILE_HOST}" in *-*-darwin* ) dnl -cpp-precomp (the default) conflicts with -MMD option dnl used by bk-deps (see also http://developer.apple.com/documentation/Darwin/Conceptual/PortingUnix/compiling/chapter_4_section_3.html) DEPSFLAG="-no-cpp-precomp -MMD" ;; * ) DEPSFLAG="-MMD" ;; esac AC_MSG_RESULT([gcc]) elif test "x$MWCC" = "xyes"; then DEPSMODE=mwcc DEPSFLAG="-MM" AC_MSG_RESULT([mwcc]) elif test "x$SUNCC" = "xyes"; then DEPSMODE=unixcc DEPSFLAG="-xM1" AC_MSG_RESULT([Sun cc]) elif test "x$SGICC" = "xyes"; then DEPSMODE=unixcc DEPSFLAG="-M" AC_MSG_RESULT([SGI cc]) elif test "x$HPCC" = "xyes"; then DEPSMODE=unixcc DEPSFLAG="+make" AC_MSG_RESULT([HP cc]) elif test "x$COMPAQCC" = "xyes"; then DEPSMODE=gcc DEPSFLAG="-MD" AC_MSG_RESULT([Compaq cc]) else DEPS_TRACKING=0 AC_MSG_RESULT([none]) fi if test $DEPS_TRACKING = 1 ; then AC_BAKEFILE_CREATE_FILE_BK_DEPS chmod +x bk-deps dnl FIXME: make this $(top_builddir)/bk-deps once autoconf-2.60 dnl is required (and so top_builddir is never empty): BK_DEPS="`pwd`/bk-deps" fi fi AC_SUBST(DEPS_TRACKING) AC_SUBST(BK_DEPS) ]) dnl --------------------------------------------------------------------------- dnl AC_BAKEFILE_CHECK_BASIC_STUFF dnl dnl Checks for presence of basic programs, such as C and C++ compiler, "ranlib" dnl or "install" dnl --------------------------------------------------------------------------- AC_DEFUN([AC_BAKEFILE_CHECK_BASIC_STUFF], [ AC_PROG_RANLIB AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_MAKE_SET AC_SUBST(MAKE_SET) if test "x$SUNCXX" = "xyes"; then dnl Sun C++ compiler requires special way of creating static libs; dnl see here for more details: dnl https://sourceforge.net/tracker/?func=detail&atid=109863&aid=1229751&group_id=9863 AR=$CXX AROPTIONS="-xar -o" AC_SUBST(AR) elif test "x$SGICC" = "xyes"; then dnl Almost the same as above for SGI mipsPro compiler AR=$CXX AROPTIONS="-ar -o" AC_SUBST(AR) else AC_CHECK_TOOL(AR, ar, ar) AROPTIONS=rcu fi AC_SUBST(AROPTIONS) AC_CHECK_TOOL(STRIP, strip, :) AC_CHECK_TOOL(NM, nm, :) dnl This check is necessary because "install -d" doesn't exist on dnl all platforms (e.g. HP/UX), see http://www.bakefile.org/ticket/80 AC_MSG_CHECKING([for command to install directories]) INSTALL_TEST_DIR=acbftest$$ $INSTALL -d $INSTALL_TEST_DIR > /dev/null 2>&1 if test $? = 0 -a -d $INSTALL_TEST_DIR; then rmdir $INSTALL_TEST_DIR dnl we must refer to makefile's $(INSTALL) variable and not dnl current value of shell variable, hence the single quoting: INSTALL_DIR='$(INSTALL) -d' AC_MSG_RESULT([$INSTALL -d]) else INSTALL_DIR="mkdir -p" AC_MSG_RESULT([mkdir -p]) fi AC_SUBST(INSTALL_DIR) LDFLAGS_GUI= case ${BAKEFILE_HOST} in *-*-cygwin* | *-*-mingw32* ) LDFLAGS_GUI="-mwindows" esac AC_SUBST(LDFLAGS_GUI) ]) dnl --------------------------------------------------------------------------- dnl AC_BAKEFILE_RES_COMPILERS dnl dnl Checks for presence of resource compilers for win32 or mac dnl --------------------------------------------------------------------------- AC_DEFUN([AC_BAKEFILE_RES_COMPILERS], [ case ${BAKEFILE_HOST} in *-*-cygwin* | *-*-mingw32* ) dnl Check for win32 resources compiler: AC_CHECK_TOOL(WINDRES, windres) ;; *-*-darwin* | powerpc-apple-macos* ) AC_CHECK_PROG(REZ, Rez, Rez, /Developer/Tools/Rez) AC_CHECK_PROG(SETFILE, SetFile, SetFile, /Developer/Tools/SetFile) ;; esac AC_SUBST(WINDRES) AC_SUBST(REZ) AC_SUBST(SETFILE) ]) dnl --------------------------------------------------------------------------- dnl AC_BAKEFILE_PRECOMP_HEADERS dnl dnl Check for precompiled headers support (GCC >= 3.4) dnl --------------------------------------------------------------------------- AC_DEFUN([AC_BAKEFILE_PRECOMP_HEADERS], [ AC_ARG_ENABLE([precomp-headers], AS_HELP_STRING([--disable-precomp-headers], [don't use precompiled headers even if compiler can]), [bk_use_pch="$enableval"]) GCC_PCH=0 ICC_PCH=0 USE_PCH=0 BK_MAKE_PCH="" case ${BAKEFILE_HOST} in *-*-cygwin* ) dnl PCH support is broken in cygwin gcc because of unportable dnl assumptions about mmap() in gcc code which make PCH generation dnl fail erratically; disable PCH completely until this is fixed bk_use_pch="no" ;; esac if test "x$bk_use_pch" = "x" -o "x$bk_use_pch" = "xyes" ; then if test "x$GCC" = "xyes"; then dnl test if we have gcc-3.4: AC_MSG_CHECKING([if the compiler supports precompiled headers]) AC_TRY_COMPILE([], [ #if !defined(__GNUC__) || !defined(__GNUC_MINOR__) There is no PCH support #endif #if (__GNUC__ < 3) There is no PCH support #endif #if (__GNUC__ == 3) && \ ((!defined(__APPLE_CC__) && (__GNUC_MINOR__ < 4)) || \ ( defined(__APPLE_CC__) && (__GNUC_MINOR__ < 3))) || \ ( defined(__INTEL_COMPILER) ) There is no PCH support #endif ], [ AC_MSG_RESULT([yes]) GCC_PCH=1 ], [ if test "$INTELCXX8" = "yes"; then AC_MSG_RESULT([yes]) ICC_PCH=1 if test "$INTELCXX10" = "yes"; then ICC_PCH_CREATE_SWITCH="-pch-create" ICC_PCH_USE_SWITCH="-pch-use" else ICC_PCH_CREATE_SWITCH="-create-pch" ICC_PCH_USE_SWITCH="-use-pch" fi else AC_MSG_RESULT([no]) fi ]) if test $GCC_PCH = 1 -o $ICC_PCH = 1 ; then USE_PCH=1 AC_BAKEFILE_CREATE_FILE_BK_MAKE_PCH chmod +x bk-make-pch dnl FIXME: make this $(top_builddir)/bk-make-pch once dnl autoconf-2.60 is required (and so top_builddir is dnl never empty): BK_MAKE_PCH="`pwd`/bk-make-pch" fi fi fi AC_SUBST(GCC_PCH) AC_SUBST(ICC_PCH) AC_SUBST(ICC_PCH_CREATE_SWITCH) AC_SUBST(ICC_PCH_USE_SWITCH) AC_SUBST(BK_MAKE_PCH) ]) dnl --------------------------------------------------------------------------- dnl AC_BAKEFILE([autoconf_inc.m4 inclusion]) dnl dnl To be used in configure.in of any project using Bakefile-generated mks dnl dnl Behaviour can be modified by setting following variables: dnl BAKEFILE_CHECK_BASICS set to "no" if you don't want bakefile to dnl to perform check for basic tools like ranlib dnl BAKEFILE_HOST set this to override host detection, defaults dnl to ${host} dnl BAKEFILE_FORCE_PLATFORM set to override platform detection dnl dnl Example usage: dnl dnl AC_BAKEFILE([FOO(autoconf_inc.m4)]) dnl dnl (replace FOO with m4_include above, aclocal would die otherwise) dnl (yes, it's ugly, but thanks to a bug in aclocal, it's the only thing dnl we can do...) dnl --------------------------------------------------------------------------- AC_DEFUN([AC_BAKEFILE], [ AC_PREREQ([2.58]) dnl We need to always run C/C++ compiler tests, but it's also possible dnl for the user to call these macros manually, hence this instead of dnl simply calling these macros. See http://www.bakefile.org/ticket/64 AC_REQUIRE([AC_BAKEFILE_PROG_CC]) AC_REQUIRE([AC_BAKEFILE_PROG_CXX]) if test "x$BAKEFILE_HOST" = "x"; then if test "x${host}" = "x" ; then AC_MSG_ERROR([You must call the autoconf "CANONICAL_HOST" macro in your configure.ac (or .in) file.]) fi BAKEFILE_HOST="${host}" fi if test "x$BAKEFILE_CHECK_BASICS" != "xno"; then AC_BAKEFILE_CHECK_BASIC_STUFF fi AC_BAKEFILE_GNUMAKE AC_BAKEFILE_PLATFORM AC_BAKEFILE_PLATFORM_SPECIFICS AC_BAKEFILE_SUFFIXES AC_BAKEFILE_SHARED_LD AC_BAKEFILE_SHARED_VERSIONS AC_BAKEFILE_DEPS AC_BAKEFILE_RES_COMPILERS dnl OBJCFLAGS is set by Autoconf, but OBJCXXFLAGS is not: AC_SUBST(OBJCXXFLAGS) BAKEFILE_BAKEFILE_M4_VERSION="0.2.9" dnl includes autoconf_inc.m4: $1 if test "$BAKEFILE_AUTOCONF_INC_M4_VERSION" = "" ; then AC_MSG_ERROR([No version found in autoconf_inc.m4 - bakefile macro was changed to take additional argument, perhaps configure.in wasn't updated (see the documentation)?]) fi if test "$BAKEFILE_BAKEFILE_M4_VERSION" != "$BAKEFILE_AUTOCONF_INC_M4_VERSION" ; then AC_MSG_ERROR([Versions of Bakefile used to generate makefiles ($BAKEFILE_AUTOCONF_INC_M4_VERSION) and configure ($BAKEFILE_BAKEFILE_M4_VERSION) do not match.]) fi ]) dnl --------------------------------------------------------------------------- dnl Embedded copies of helper scripts follow: dnl --------------------------------------------------------------------------- AC_DEFUN([AC_BAKEFILE_CREATE_FILE_BK_DEPS], [ dnl ===================== bk-deps begins here ===================== dnl (Created by merge-scripts.py from bk-deps dnl file do not edit here!) D='$' cat <bk-deps #!/bin/sh # This script is part of Bakefile (http://www.bakefile.org) autoconf # script. It is used to track C/C++ files dependencies in portable way. # # Permission is given to use this file in any way. DEPSMODE=${DEPSMODE} DEPSFLAG="${DEPSFLAG}" DEPSDIRBASE=.deps if test ${D}DEPSMODE = gcc ; then ${D}* ${D}{DEPSFLAG} status=${D}? # determine location of created files: while test ${D}# -gt 0; do case "${D}1" in -o ) shift objfile=${D}1 ;; -* ) ;; * ) srcfile=${D}1 ;; esac shift done objfilebase=\`basename ${D}objfile\` builddir=\`dirname ${D}objfile\` depfile=\`basename ${D}srcfile | sed -e 's/\\..*${D}/.d/g'\` depobjname=\`echo ${D}depfile |sed -e 's/\\.d/.o/g'\` depsdir=${D}builddir/${D}DEPSDIRBASE mkdir -p ${D}depsdir # if the compiler failed, we're done: if test ${D}{status} != 0 ; then rm -f ${D}depfile exit ${D}{status} fi # move created file to the location we want it in: if test -f ${D}depfile ; then sed -e "s,${D}depobjname:,${D}objfile:,g" ${D}depfile >${D}{depsdir}/${D}{objfilebase}.d rm -f ${D}depfile else # "g++ -MMD -o fooobj.o foosrc.cpp" produces fooobj.d depfile=\`echo "${D}objfile" | sed -e 's/\\..*${D}/.d/g'\` if test ! -f ${D}depfile ; then # "cxx -MD -o fooobj.o foosrc.cpp" creates fooobj.o.d (Compaq C++) depfile="${D}objfile.d" fi if test -f ${D}depfile ; then sed -e "\\,^${D}objfile,!s,${D}depobjname:,${D}objfile:,g" ${D}depfile >${D}{depsdir}/${D}{objfilebase}.d rm -f ${D}depfile fi fi exit 0 elif test ${D}DEPSMODE = mwcc ; then ${D}* || exit ${D}? # Run mwcc again with -MM and redirect into the dep file we want # NOTE: We can't use shift here because we need ${D}* to be valid prevarg= for arg in ${D}* ; do if test "${D}prevarg" = "-o"; then objfile=${D}arg else case "${D}arg" in -* ) ;; * ) srcfile=${D}arg ;; esac fi prevarg="${D}arg" done objfilebase=\`basename ${D}objfile\` builddir=\`dirname ${D}objfile\` depsdir=${D}builddir/${D}DEPSDIRBASE mkdir -p ${D}depsdir ${D}* ${D}DEPSFLAG >${D}{depsdir}/${D}{objfilebase}.d exit 0 elif test ${D}DEPSMODE = unixcc; then ${D}* || exit ${D}? # Run compiler again with deps flag and redirect into the dep file. # It doesn't work if the '-o FILE' option is used, but without it the # dependency file will contain the wrong name for the object. So it is # removed from the command line, and the dep file is fixed with sed. cmd="" while test ${D}# -gt 0; do case "${D}1" in -o ) shift objfile=${D}1 ;; * ) eval arg${D}#=\\${D}1 cmd="${D}cmd \\${D}arg${D}#" ;; esac shift done objfilebase=\`basename ${D}objfile\` builddir=\`dirname ${D}objfile\` depsdir=${D}builddir/${D}DEPSDIRBASE mkdir -p ${D}depsdir eval "${D}cmd ${D}DEPSFLAG" | sed "s|.*:|${D}objfile:|" >${D}{depsdir}/${D}{objfilebase}.d exit 0 else ${D}* exit ${D}? fi EOF dnl ===================== bk-deps ends here ===================== ]) AC_DEFUN([AC_BAKEFILE_CREATE_FILE_SHARED_LD_SH], [ dnl ===================== shared-ld-sh begins here ===================== dnl (Created by merge-scripts.py from shared-ld-sh dnl file do not edit here!) D='$' cat <shared-ld-sh #!/bin/sh #----------------------------------------------------------------------------- #-- Name: distrib/mac/shared-ld-sh #-- Purpose: Link a mach-o dynamic shared library for Darwin / Mac OS X #-- Author: Gilles Depeyrot #-- Copyright: (c) 2002 Gilles Depeyrot #-- Licence: any use permitted #----------------------------------------------------------------------------- verbose=0 args="" objects="" linking_flag="-dynamiclib" ldargs="-r -keep_private_externs -nostdlib" if test "x${D}CXX" = "x"; then CXX="c++" fi while test ${D}# -gt 0; do case ${D}1 in -v) verbose=1 ;; -o|-compatibility_version|-current_version|-framework|-undefined|-install_name) # collect these options and values args="${D}{args} ${D}1 ${D}2" shift ;; -arch|-isysroot) # collect these options and values ldargs="${D}{ldargs} ${D}1 ${D}2" shift ;; -s|-Wl,*) # collect these load args ldargs="${D}{ldargs} ${D}1" ;; -l*|-L*|-flat_namespace|-headerpad_max_install_names) # collect these options args="${D}{args} ${D}1" ;; -dynamiclib|-bundle) linking_flag="${D}1" ;; -*) echo "shared-ld: unhandled option '${D}1'" exit 1 ;; *.o | *.a | *.dylib) # collect object files objects="${D}{objects} ${D}1" ;; *) echo "shared-ld: unhandled argument '${D}1'" exit 1 ;; esac shift done status=0 # # Link one module containing all the others # if test ${D}{verbose} = 1; then echo "${D}CXX ${D}{ldargs} ${D}{objects} -o master.${D}${D}.o" fi ${D}CXX ${D}{ldargs} ${D}{objects} -o master.${D}${D}.o status=${D}? # # Link the shared library from the single module created, but only if the # previous command didn't fail: # if test ${D}{status} = 0; then if test ${D}{verbose} = 1; then echo "${D}CXX ${D}{linking_flag} master.${D}${D}.o ${D}{args}" fi ${D}CXX ${D}{linking_flag} master.${D}${D}.o ${D}{args} status=${D}? fi # # Remove intermediate module # rm -f master.${D}${D}.o exit ${D}status EOF dnl ===================== shared-ld-sh ends here ===================== ]) AC_DEFUN([AC_BAKEFILE_CREATE_FILE_BK_MAKE_PCH], [ dnl ===================== bk-make-pch begins here ===================== dnl (Created by merge-scripts.py from bk-make-pch dnl file do not edit here!) D='$' cat <bk-make-pch #!/bin/sh # This script is part of Bakefile (http://www.bakefile.org) autoconf # script. It is used to generated precompiled headers. # # Permission is given to use this file in any way. outfile="${D}{1}" header="${D}{2}" shift shift builddir=\`echo ${D}outfile | sed -e 's,/\\.pch/.*${D},,g'\` compiler="" headerfile="" while test ${D}{#} -gt 0; do add_to_cmdline=1 case "${D}{1}" in -I* ) incdir=\`echo ${D}{1} | sed -e 's/-I\\(.*\\)/\\1/g'\` if test "x${D}{headerfile}" = "x" -a -f "${D}{incdir}/${D}{header}" ; then headerfile="${D}{incdir}/${D}{header}" fi ;; -use-pch|-use_pch|-pch-use ) shift add_to_cmdline=0 ;; esac if test ${D}add_to_cmdline = 1 ; then compiler="${D}{compiler} ${D}{1}" fi shift done if test "x${D}{headerfile}" = "x" ; then echo "error: can't find header ${D}{header} in include paths" >&2 else if test -f ${D}{outfile} ; then rm -f ${D}{outfile} else mkdir -p \`dirname ${D}{outfile}\` fi depsfile="${D}{builddir}/.deps/\`echo ${D}{outfile} | tr '/.' '__'\`.d" mkdir -p ${D}{builddir}/.deps if test "x${GCC_PCH}" = "x1" ; then # can do this because gcc is >= 3.4: ${D}{compiler} -o ${D}{outfile} -MMD -MF "${D}{depsfile}" "${D}{headerfile}" elif test "x${ICC_PCH}" = "x1" ; then filename=pch_gen-${D}${D} file=${D}{filename}.c dfile=${D}{filename}.d cat > ${D}file < ${D}depsfile && \\ rm -f ${D}file ${D}dfile ${D}{filename}.o fi exit ${D}{?} fi EOF dnl ===================== bk-make-pch ends here ===================== ]) flamerobin_0.9.3~svn+2220.orig/autoconf_inc.m4000066400000000000000000000077671177057155300211350ustar00rootroot00000000000000dnl ### begin block 00_header[./flamerobin.bkl,flamerobin.bkl,ibpp.bkl] ### dnl dnl This macro was generated by dnl Bakefile 0.2.9 (http://www.bakefile.org) dnl Do not modify, all changes will be overwritten! BAKEFILE_AUTOCONF_INC_M4_VERSION="0.2.9" dnl ### begin block 10_AC_BAKEFILE_PRECOMP_HEADERS[./flamerobin.bkl,flamerobin.bkl,ibpp.bkl] ### AC_BAKEFILE_PRECOMP_HEADERS dnl ### begin block 20_COND_DEPS_TRACKING_0[./flamerobin.bkl,flamerobin.bkl,ibpp.bkl] ### COND_DEPS_TRACKING_0="#" if test "x$DEPS_TRACKING" = "x0" ; then COND_DEPS_TRACKING_0="" fi AC_SUBST(COND_DEPS_TRACKING_0) dnl ### begin block 20_COND_DEPS_TRACKING_1[./flamerobin.bkl,flamerobin.bkl,ibpp.bkl] ### COND_DEPS_TRACKING_1="#" if test "x$DEPS_TRACKING" = "x1" ; then COND_DEPS_TRACKING_1="" fi AC_SUBST(COND_DEPS_TRACKING_1) dnl ### begin block 20_COND_FINAL_0[./flamerobin.bkl,flamerobin.bkl,ibpp.bkl] ### COND_FINAL_0="#" if test "x$FINAL" = "x0" ; then COND_FINAL_0="" fi AC_SUBST(COND_FINAL_0) dnl ### begin block 20_COND_FINAL_1[./flamerobin.bkl,flamerobin.bkl,ibpp.bkl] ### COND_FINAL_1="#" if test "x$FINAL" = "x1" ; then COND_FINAL_1="" fi AC_SUBST(COND_FINAL_1) dnl ### begin block 20_COND_GCC_PCH_1[./flamerobin.bkl,flamerobin.bkl,ibpp.bkl] ### COND_GCC_PCH_1="#" if test "x$GCC_PCH" = "x1" ; then COND_GCC_PCH_1="" fi AC_SUBST(COND_GCC_PCH_1) dnl ### begin block 20_COND_ICC_PCH_1[./flamerobin.bkl,flamerobin.bkl] ### COND_ICC_PCH_1="#" if test "x$ICC_PCH" = "x1" ; then COND_ICC_PCH_1="" fi AC_SUBST(COND_ICC_PCH_1) dnl ### begin block 20_COND_PLATFORM_MACOSX_1[./flamerobin.bkl,flamerobin.bkl,ibpp.bkl] ### COND_PLATFORM_MACOSX_1="#" if test "x$PLATFORM_MACOSX" = "x1" ; then COND_PLATFORM_MACOSX_1="" fi AC_SUBST(COND_PLATFORM_MACOSX_1) dnl ### begin block 20_COND_PLATFORM_MAC_0[flamerobin.bkl] ### COND_PLATFORM_MAC_0="#" if test "x$PLATFORM_MAC" = "x0" ; then COND_PLATFORM_MAC_0="" fi AC_SUBST(COND_PLATFORM_MAC_0) dnl ### begin block 20_COND_PLATFORM_MAC_1[./flamerobin.bkl,flamerobin.bkl,ibpp.bkl] ### COND_PLATFORM_MAC_1="#" if test "x$PLATFORM_MAC" = "x1" ; then COND_PLATFORM_MAC_1="" fi AC_SUBST(COND_PLATFORM_MAC_1) dnl ### begin block 20_COND_PLATFORM_OS2_1[./flamerobin.bkl,flamerobin.bkl,ibpp.bkl] ### COND_PLATFORM_OS2_1="#" if test "x$PLATFORM_OS2" = "x1" ; then COND_PLATFORM_OS2_1="" fi AC_SUBST(COND_PLATFORM_OS2_1) dnl ### begin block 20_COND_PLATFORM_UNIX_1[./flamerobin.bkl,flamerobin.bkl,ibpp.bkl] ### COND_PLATFORM_UNIX_1="#" if test "x$PLATFORM_UNIX" = "x1" ; then COND_PLATFORM_UNIX_1="" fi AC_SUBST(COND_PLATFORM_UNIX_1) dnl ### begin block 20_COND_PLATFORM_WIN32_1[./flamerobin.bkl,flamerobin.bkl,ibpp.bkl] ### COND_PLATFORM_WIN32_1="#" if test "x$PLATFORM_WIN32" = "x1" ; then COND_PLATFORM_WIN32_1="" fi AC_SUBST(COND_PLATFORM_WIN32_1) dnl ### begin block 20_COND_STATICRTL_0[./flamerobin.bkl,flamerobin.bkl,ibpp.bkl] ### COND_STATICRTL_0="#" if test "x$STATICRTL" = "x0" ; then COND_STATICRTL_0="" fi AC_SUBST(COND_STATICRTL_0) dnl ### begin block 20_COND_STATICRTL_1[./flamerobin.bkl,flamerobin.bkl,ibpp.bkl] ### COND_STATICRTL_1="#" if test "x$STATICRTL" = "x1" ; then COND_STATICRTL_1="" fi AC_SUBST(COND_STATICRTL_1) dnl ### begin block 20_COND_UNICODE_1[./flamerobin.bkl,flamerobin.bkl,ibpp.bkl] ### COND_UNICODE_1="#" if test "x$UNICODE" = "x1" ; then COND_UNICODE_1="" fi AC_SUBST(COND_UNICODE_1) dnl ### begin block 20_COND_USEDLL_1[./flamerobin.bkl,flamerobin.bkl,ibpp.bkl] ### COND_USEDLL_1="#" if test "x$USEDLL" = "x1" ; then COND_USEDLL_1="" fi AC_SUBST(COND_USEDLL_1) dnl ### begin block 20_COND_USE_PCH_1[./flamerobin.bkl,flamerobin.bkl] ### COND_USE_PCH_1="#" if test "x$USE_PCH" = "x1" ; then COND_USE_PCH_1="" fi AC_SUBST(COND_USE_PCH_1) flamerobin_0.9.3~svn+2220.orig/bakefile_gen_vs2010.cmd000066400000000000000000000004761177057155300223050ustar00rootroot00000000000000@rem - Bakefile_gen will generate flamerobin.sln and *.vcproj files. @rem - This script also creates a copy of flamerobin.sln under @rem - flamerobin_vs2010.sln. Open flamerobin_vs2010.sln in @rem - Visual Studio 2010 and it will convert and create *.vcxproj. @bakefile_gen @copy flamerobin.sln flamerobin_vs2010.sln flamerobin_0.9.3~svn+2220.orig/code-templates/000077500000000000000000000000001177057155300211115ustar00rootroot00000000000000flamerobin_0.9.3~svn+2220.orig/code-templates/create_change_trigger.confdef000066400000000000000000000014771177057155300267430ustar00rootroot00000000000000 Create change trigger for {%object_name%} Which column changes would you like to log? {%object_path%}/columnNames {%foreach:column:, :{%object_name%}%} {%object_handle%} 1 1 Trigger position (0..32767) {%object_path%}/triggerPosition 99 {%object_handle%} 1 flamerobin_0.9.3~svn+2220.orig/code-templates/create_change_trigger.info000066400000000000000000000002111177057155300262530ustar00rootroot00000000000000[templateInfo] menuCaption=Create change trigger for {%object_name%} menuPosition=40 matchesType=^TABLE$ matchesWhen={%!:{%is_system%}%} flamerobin_0.9.3~svn+2220.orig/code-templates/create_change_trigger.template000066400000000000000000000010701177057155300271370ustar00rootroot00000000000000{%--:Uncomment to edit template info visually.%}{%--:{%edit_info%}{%abort%}%}{%edit_conf%}{%kw:set term !! ; create trigger%} CT_{%object_name%} {%kw:for%} {%object_name%} {%kw:active after update position {%getconf:{%object_path%}/triggerPosition:99%} as begin {%tab%}if%} ({%foreach:column: {%tab%}{%tab%}{%kw:or%} :{%ifcontains:{%getconf:{%object_path%}/columnNames%}:{%object_name%}:{%kw:old%}.{%object_name%} {%kw:is distinct from new%}.{%object_name%}%}%}) {%tab%}{%kw:then {%tab%}begin%} {%tab%}{%tab%}/* do something */ {%tab%}{%kw:end end!! set term%} ; !! flamerobin_0.9.3~svn+2220.orig/code-templates/create_selectable_execute_block.confdef000066400000000000000000000007151177057155300307640ustar00rootroot00000000000000 Create selectable block Selected columns {%object_path%}/columnNames {%foreach:column:, :{%object_name%}%} {%object_handle%} 1 flamerobin_0.9.3~svn+2220.orig/code-templates/create_selectable_execute_block.info000066400000000000000000000001611177057155300303060ustar00rootroot00000000000000[templateInfo] menuCaption=Create selectable EXECUTE BLOCK statement menuPosition=60 matchesType=^TABLE$|^VIEW$ flamerobin_0.9.3~svn+2220.orig/code-templates/create_selectable_execute_block.template000066400000000000000000000013011177057155300311630ustar00rootroot00000000000000{%--:Uncomment to edit template info visually.%}{%--:{%edit_info%}{%abort%}%}{%edit_conf%}{%kw:set term !! ; execute block returns%} ( {%foreach:column:, :{%ifcontains:{%getconf:{%object_path%}/columnNames%}:{%object_name%}: {%tab%}{%object_name%} {%columninfo:datatype%}%}%} ) {%kw:as begin {%tab%}for select%} {%foreach:column:, :{%ifcontains:{%getconf:{%object_path%}/columnNames%}:{%object_name%}: {%tab%}{%tab%}a.{%object_name%}%}%} {%tab%}{%kw:from%} {%object_name%} a {%tab%}{%kw:into%} {%foreach:column:, :{%ifcontains:{%getconf:{%object_path%}/columnNames%}:{%object_name%}: {%tab%}{%tab%}{%object_name%}%}%} {%tab%}{%kw:do {%tab%}begin {%tab%}{%tab%}suspend; {%tab%}end end!! set term%} ; !! flamerobin_0.9.3~svn+2220.orig/code-templates/create_selectable_procedure.confdef000066400000000000000000000007301177057155300301350ustar00rootroot00000000000000 Create selectable stored procedure Selected columns {%object_path%}/columnNames {%foreach:column:, :{%object_name%}%} {%object_handle%} 1 flamerobin_0.9.3~svn+2220.orig/code-templates/create_selectable_procedure.info000066400000000000000000000001511177057155300274610ustar00rootroot00000000000000[templateInfo] menuCaption=Create selectable stored procedure menuPosition=50 matchesType=^TABLE$|^VIEW$ flamerobin_0.9.3~svn+2220.orig/code-templates/create_selectable_procedure.template000066400000000000000000000013361177057155300303470ustar00rootroot00000000000000{%--:Uncomment to edit template info visually.%}{%--:{%edit_info%}{%abort%}%}{%edit_conf%}{%kw:set term !! ; create procedure%} SP_{%object_name%} {%kw:returns%} ( {%foreach:column:, :{%ifcontains:{%getconf:{%object_path%}/columnNames%}:{%object_name%}: {%tab%}{%object_name%} {%columninfo:datatype%}%}%} ) {%kw:as begin {%tab%}for select%} {%foreach:column:, :{%ifcontains:{%getconf:{%object_path%}/columnNames%}:{%object_name%}: {%tab%}{%tab%}a.{%object_name%}%}%} {%tab%}{%kw:from%} {%object_name%} a {%tab%}{%kw:into%} {%foreach:column:, :{%ifcontains:{%getconf:{%object_path%}/columnNames%}:{%object_name%}: {%tab%}{%tab%}{%object_name%}%}%} {%tab%}{%kw:do {%tab%}begin {%tab%}{%tab%}suspend; {%tab%}end end!! set term%} ; !! flamerobin_0.9.3~svn+2220.orig/code-templates/create_trigger.confdef000066400000000000000000000036151177057155300254320ustar00rootroot00000000000000 Create trigger for {%object_name%} &Name (leave empty for auto-name): {%object_path%}/triggerName 1 1 &Firing time: {%object_path%}/triggerFiringTime 0 &Actions: {%object_path%}/triggerActions insert,update,delete 2 1 &Position: {%object_path%}/triggerPosition 0 0 32767 2 flamerobin_0.9.3~svn+2220.orig/code-templates/create_trigger.info000066400000000000000000000002021177057155300247460ustar00rootroot00000000000000[templateInfo] menuCaption=Create trigger for {%object_name%} menuPosition=37 matchesType=^TABLE$ matchesWhen={%!:{%is_system%}%} flamerobin_0.9.3~svn+2220.orig/code-templates/create_trigger.template000066400000000000000000000011651177057155300256370ustar00rootroot00000000000000{%edit_conf%}{%kw:set term ^; create trigger%} {%ifeq:{%getconf:{%object_path%}/triggerName%}::{%object_name%}_{%ifeq:{%getconf:{%object_path%}/triggerFiringTime%}:0:B:A%}{%uppercase:{%forall:{%getconf:{%object_path%}/triggerActions%}::{%substr:%%current_value%%:0:1%}%}%}:{%getconf:{%object_path%}/triggerName%}%} {%kw:for%} {%object_name%} {%kw:active {%ifeq:{%getconf:{%object_path%}/triggerFiringTime%}:0:before:after%} {%forall:{%getconf:{%object_path%}/triggerActions%}: or :%%current_value%%%} position {%getconf:{%object_path%}/triggerPosition%} as begin%} {%tab%}/* enter trigger code here */ {%kw:end^ set term%} ;^ flamerobin_0.9.3~svn+2220.orig/code-templates/delete.confdef000066400000000000000000000010311177057155300236740ustar00rootroot00000000000000 Delete from {%object_name%} where ... Columns to &filter on: {%object_path%}/whereColumnNames {%primary_key:{%constraintinfo:columns:, %}%} {%object_handle%} 1 1 flamerobin_0.9.3~svn+2220.orig/code-templates/delete.info000066400000000000000000000001461177057155300232310ustar00rootroot00000000000000[templateInfo] menuCaption=Delete from {%object_name%} where ... menuPosition=35 matchesType=^TABLE$ flamerobin_0.9.3~svn+2220.orig/code-templates/delete.template000066400000000000000000000004221177057155300241060ustar00rootroot00000000000000{%edit_conf%}{%kw:delete from%} {%object_name%} a {%ifeq:{%countall:{%getconf:{%object_path%}/whereColumnNames%}%}:0:;: {%kw:where%}{%foreach:column: {%kw:and%} :{%ifcontains:{%getconf:{%object_path%}/whereColumnNames%}:{%object_name%}: {%tab%}a.{%object_name%} = '?'%}%}%} flamerobin_0.9.3~svn+2220.orig/code-templates/extract_full_ddl.info000066400000000000000000000002041177057155300253010ustar00rootroot00000000000000[templateInfo] menuCaption=Extract full DDL for {%object_name%} menuPosition=70 matchesType=^TABLE$ matchesWhen={%!:{%is_system%}%} flamerobin_0.9.3~svn+2220.orig/code-templates/extract_full_ddl.template000066400000000000000000000001441177057155300261640ustar00rootroot00000000000000{%object_ddl%} {%foreach:trigger::before:{%object_ddl%}%} {%foreach:trigger::after:{%object_ddl%}%} flamerobin_0.9.3~svn+2220.orig/code-templates/insert.confdef000066400000000000000000000007601177057155300237460ustar00rootroot00000000000000 Insert into {%object_name%} (...) values (...) Columns to &insert into: {%object_path%}/columnNames {%foreach:column:, :{%object_name%}%} {%object_handle%} 1 flamerobin_0.9.3~svn+2220.orig/code-templates/insert.info000066400000000000000000000002161177057155300232710ustar00rootroot00000000000000[templateInfo] menuCaption=Insert into {%object_name%} (...) values (...) menuPosition=20 matchesType=^TABLE$ matchesWhen={%!:{%is_system%}%} flamerobin_0.9.3~svn+2220.orig/code-templates/insert.template000066400000000000000000000005351177057155300241550ustar00rootroot00000000000000{%--:Uncomment to edit template info visually.%}{%--:{%edit_info%}{%abort%}%}{%edit_conf%}{%wrap:{%kw:insert into%} {%object_name%} ({%getconf:{%object_path%}/columnNames%})%} {%kw:values%} ({%foreach:column:, :{%ifcontains:{%getconf:{%object_path%}/columnNames%}:{%object_name%}: {%tab%}'{%object_name%}{%if:{%columninfo:is_nullable%}::*%}'%}%} ); flamerobin_0.9.3~svn+2220.orig/code-templates/select.confdef000066400000000000000000000016271177057155300237240ustar00rootroot00000000000000 Select ... from {%object_name%} where ... Columns to &select: {%object_path%}/columnNames {%foreach:column:, :{%object_name%}%} {%object_handle%} 1 1 Columns to &filter on: {%object_path%}/whereColumnNames {%primary_key:{%constraintinfo:columns:, %}%} {%object_handle%} 1 1 flamerobin_0.9.3~svn+2220.orig/code-templates/select.info000066400000000000000000000001611177057155300232430ustar00rootroot00000000000000[templateInfo] menuCaption=Select ... from {%object_name%} where ... menuPosition=10 matchesType=^TABLE$|^VIEW$ flamerobin_0.9.3~svn+2220.orig/code-templates/select.template000066400000000000000000000006211177057155300241240ustar00rootroot00000000000000{%edit_conf%}{%wrap:{%kw:select%} {%foreach:column:, :{%ifcontains:{%getconf:{%object_path%}/columnNames%}:{%object_name%}:a.{%object_name%}%}%}%} {%kw:from%} {%object_name%} a {%ifeq:{%countall:{%getconf:{%object_path%}/whereColumnNames%}%}:0:;: {%kw:where%}{%foreach:column: {%kw:and%} :{%ifcontains:{%getconf:{%object_path%}/whereColumnNames%}:{%object_name%}: {%tab%}a.{%object_name%} = '?'%}%}%} flamerobin_0.9.3~svn+2220.orig/code-templates/template_info.confdef000066400000000000000000000022631177057155300252700ustar00rootroot00000000000000 Edit template metadata Menu item caption templateInfo/menuCaption 1 Menu item position templateInfo/menuPosition Matches objects by type (regex) templateInfo/matchesType .* 1 Matches objects by name (regex) templateInfo/matchesName .* 1 Matches objects when (true/false) templateInfo/matchesWhen true 1 flamerobin_0.9.3~svn+2220.orig/code-templates/update.confdef000066400000000000000000000016261177057155300237260ustar00rootroot00000000000000 Update {%object_name%} set ... where ... Columns to &update: {%object_path%}/columnNames {%foreach:column:, :{%object_name%}%} {%object_handle%} 1 1 Columns to &filter on: {%object_path%}/whereColumnNames {%primary_key:{%constraintinfo:columns:, %}%} {%object_handle%} 1 1 flamerobin_0.9.3~svn+2220.orig/code-templates/update.info000066400000000000000000000002101177057155300232410ustar00rootroot00000000000000[templateInfo] menuCaption=Update {%object_name%} set ... where ... menuPosition=30 matchesType=^TABLE$ matchesWhen={%!:{%is_system%}%} flamerobin_0.9.3~svn+2220.orig/code-templates/update.template000066400000000000000000000007151177057155300241330ustar00rootroot00000000000000{%edit_conf%}{%kw:update%} {%object_name%} a {%kw:set%} {%foreach:column:, :{%ifcontains:{%getconf:{%object_path%}/columnNames%}:{%object_name%}: {%tab%}a.{%object_name%} = '{%object_name%}{%ifeq:{%columninfo:is_nullable%}:false:*%}'%}%}{%ifeq:{%countall:{%getconf:{%object_path%}/whereColumnNames%}%}:0:;: {%kw:where%}{%foreach:column: {%kw:and%} :{%ifcontains:{%getconf:{%object_path%}/whereColumnNames%}:{%object_name%}: {%tab%}a.{%object_name%} = '?'%}%}%} flamerobin_0.9.3~svn+2220.orig/conf-defs/000077500000000000000000000000001177057155300200475ustar00rootroot00000000000000flamerobin_0.9.3~svn+2220.orig/conf-defs/db_settings.confdef000066400000000000000000000111451177057155300237040ustar00rootroot00000000000000 Main Tree View 2 Show system tables in tree If checked the system tables for this database will be shown in the tree ShowSystemTables 1 Connection 3 Warn when connection charset is different from database charset differentCharsetWarning 1 Logging 1 Exclude this database from global logging If checked only settings on this screen would work. ExcludeFromGlobalLogging 1 Log DML statements Should the logging work for DML statements too.
If unchecked only DDL statements are logged.
LogDML 0
Enable logging to file Logs all successful DDL statements to file LogToFile 0 Log file name: For multiple files place %d mark where you want numbers to be inserted.
If you wish leading zeros use %0xd, where x is a number of digits (ex. %02d)
LogFile
Use multiple files LogToFileType 0 Incremental file numbers start at: IncrementalLogFileStart 0 10000 1 Add header to each statement Should logging add a header showing the context in which statement was run:
FlameRobin version, database, username, timestamp
LoggingAddHeader 1
Add SET TERM when different terminator is used in editor LogSetTerm 0
Enable logging to database Logs all successful DDL statements to database.
This will create a table named FLAMEROBIN$LOG in the databases.
LogToDatabase 0 Use custom select instead of generator If not checked, FLAMEROBIN$GEN generator will be used. LoggingUsesCustomSelect 0 Custom select: The following statement will be used to obtain change ID. LoggingCustomSelect SELECT 1+MAX(ID) FROM FLAMEROBIN$LOG 1 1
flamerobin_0.9.3~svn+2220.orig/conf-defs/fr_settings.confdef000066400000000000000000000573531177057155300237410ustar00rootroot00000000000000 General 3 Center dialogs on their parent window centerDialogOnParent 1 Remember window positions and sizes Newly created windows get previous size and position FrameStorage 1 Metadata properties windows Select how size and position of metadata properties windows should be stored MetadataFrameStorageGranularity 0 Main Tree View 2 Sort server entries alphabetically If unchecked the server entries will be shown in registration order. OrderServersInTree 0 Sort database entries alphabetically If unchecked the database entries will be shown in registration order. OrderDatabasesInTree 0 Show system roles in tree (Firebird 2.5 and later) If checked the system roles will be shown in the tree by default (can be overridden per database) ShowSystemRoles 0 Show system tables in tree If checked the system tables will be shown in the tree by default (can be overridden per database) ShowSystemTables 1 Show columns and parameters in tree If checked the table and view columns and stored procedure parameters will be shown in the tree ShowColumnsInTree 1 Show the column/parameter count for relations/procedures If checked the number of relation columns and the number of stored procedure parameters will be shown in the node text ShowColumnAndParameterCountInTree 0 When table, view or stored procedure is activated OnTreeActivate 0 Allow drag and drop query building This option can cause X11 lockup on Linux if you don't have patched version of wxWidgets allowDragAndDrop 0 SQL Editor 0 Automatically commit DDL statements autoCommitDDL 0 When text is selected in editor OnlyExecuteSelected 0 Treat selected text as a single statement If unchecked the parser will search the selected text for multiple statements TreatAsSingleStatement 0 Clear the messages when executing new statements SQLEditorExecuteClears 0 Display detailed query statistics SQLEditorShowStats 1 Enable call-tips for procedures and functions Shows call-tips for stored procedures and UDFs when bracket is opened SQLEditorCalltips 1 Show long line marker Whether a vertical line showing the edge of text is shown sqlEditorShowEdge 1 Draw long line marker after column [VALUE] sqlEditorEdgeColumn 80 Tab size sqlEditorTabSize 4 Home key positions on first non-whitespace character in line sqlEditorSmartHomeKey 1 Auto-indent new lines to same level as previous line sqlEditorAutoIndent 1 Code Completion SQL Code Completion 0 Enable automatic invocation of completion list AutocompleteEnabled 1 Show completion list after [VALUE] chars AutocompleteChars 1 10 3 Disable while calltip is shown AutoCompleteDisableWhenCalltipShown 1 Allow auto-completion inside quoted text autoCompleteQuoted 1 Manually invoke completion list on AutoCompleteKey 0 Confirm completion with Enter AutoCompleteWithEnter 1 Load columns when required for completion autoCompleteLoadColumns 1 Statement History History of Executed SQL Statements 0 Share SQL statement history History can be shared accross databases, which is useful if they have similar structure statementHistoryGranularity 2 Limit history item size limitHistoryItemSize 0 Don't store buffers bigger than [VALUE] kilobytes statementHistoryItemSize 0 10000 500 Remember unsuccessfully executed buffers historyStoreUnsuccessful 1 Remember statements generated by FlameRobin If unchecked, stores only the statements typed by user historyStoreGenerated 1 Window Title SQL Editor Window Title 0 SQL keywords are shown in window title Keywords like SELECT, INSERT, CREATE, etc. can be abbreviated so more text can fit in the title and taskbar entry sqlEditorWindowKeywords 1 Data Grid 4 Date format: The following letters will be replaced:
d - day of month, 1-31
D - day of month, 01-31
m - month, 1-12
M - month, 01-12
y - year, 00-99
Y - year, 0000-9999
All other characters are copied.
DateFormat D.M.Y 1
Time format: The following letters will be replaced:
h - hour, 0-24
H - hour, 00-24
m - minute, 0-59
M - minute, 00-59
s - second, 0-59
S - second, 00-59
T - millisecond, 000-999
All other characters are copied.
TimeFormat H:M:S.T 1
Timestamp format: The following letters will be replaced:
d - day of month, 1-31
D - day of month, 01-31
n - month, 1-12
N - month, 01-12
y - year, 00-99
Y - year, 0000-9999
h - hour, 0-24
H - hour, 00-24
m - minute, 0-59
M - minute, 00-59
s - second, 0-59
S - second, 00-59
T - millisecond, 000-999
All other characters are copied.
TimestampFormat D.N.Y, H:M:S.T 1 1
Grid header font: DataGridHeaderFont 1 Grid cell font: DataGridFont 1 Re-format float and double precision numbers If unchecked, prints decimal numbers as returned from server ReformatNumbers 0 Number of decimals: NumberPrecision 0 18 2 Maximize data grid after execution of SELECT statement SelectMaximizeGrid 0 Only when result set has more than [VALUE] records MaximizeGridRowsNeeded 0 10000 10 Automatically fetch all records in result set GridFetchAllRecords 0 Show BLOB data in the grid DataGridFetchBlobs 1 Fetch up to [VALUE] kilobytes DataGridFetchBlobAmount 0 16000 1 Show data for binary BLOBs GridShowBinaryBlobs 0
Property Pages 4 Show default column values displayColumnDefault 1 Show column descriptions displayColumnDescription 1 Show source for all triggers displayTriggerSource 1 Open in tabs linksOpenInTabs 1 Sql Statement Generation 5 Use UPPER CASE keywords SQLKeywordsUpperCase 1 Quote names only when needed quoteOnlyWhenNeeded 1 Quote names in mixed case (both upper case and lower case characters) quoteMixedCase 0 Treat quote characters like other characters quoteCharsAreRegular 0 Fields 5 When a column has a user-defined domain ShowDomains 2 When a table column is computed ShowComputed 1 Logging 1 Log DML statements Should the logging work for DML statements too.
If unchecked only DDL statements are logged.
LogDML 0
Enable logging to file Logs all successful DDL statements to file LogToFile 0 Log file name: For multiple files place %d mark where you want numbers to be inserted.
If you wish leading zeros use %0xd, where x is a number of digits (ex. %02d)
LogFile
Use multiple files LogToFileType 0 Incremental file numbers start at: IncrementalLogFileStart 0 10000 1 Add header to each statement Should logging add a header showing the context in which statement was run:
FlameRobin version, database, username, timestamp
LoggingAddHeader 1
Add SET TERM when different terminator is used in editor LogSetTerm 0
flamerobin_0.9.3~svn+2220.orig/config.guess000077500000000000000000001240131177057155300205240ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. timestamp='2004-01-24' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit 0 ;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; arc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; macppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvmeppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; pegasos:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; pmax:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sgi:OpenBSD:*:*) echo mipseb-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sun3:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; wgrisc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} exit 0 ;; alpha:OSF1:*:*) if test $UNAME_RELEASE = "V4.0"; then UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` fi # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit 0 ;; Alpha*:OpenVMS:*:*) echo alpha-hp-vms exit 0 ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit 0;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit 0 ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; *:OS400:*:*) echo powerpc-ibm-os400 exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit 0;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit 0 ;; DRS?6000:UNIX_SV:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7 && exit 0 ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c \ && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && exit 0 echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit 0 ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit 0 ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo rs6000-ibm-aix3.2.5 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit 0 ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then # avoid double evaluation of $set_cc_for_build test -n "$CC_FOR_BUILD" || eval $set_cc_for_build if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit 0 ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; *:UNICOS/mp:*:*) echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*) # Determine whether the default compiler uses glibc. eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #if __GLIBC__ >= 2 LIBC=gnu #else LIBC= #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` # GNU/KFreeBSD systems have a "k" prefix to indicate we are using # FreeBSD's kernel, but not the complete OS. case ${LIBC} in gnu) kernel_only='k' ;; esac echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit 0 ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit 0 ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; x86:Interix*:[34]*) echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' exit 0 ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit 0 ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit 0 ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit 0 ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit 0 ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit 0 ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit 0 ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit 0 ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit 0 ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit 0 ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit 0 ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit 0 ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #ifdef __INTEL_COMPILER LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit 0 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit 0 ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit 0 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit 0 ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit 0 ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit 0 ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit 0 ;; i*86:*:5:[78]*) case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit 0 ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit 0 ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit 0 ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit 0 ;; M68*:*:R3V[567]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4.3${OS_REL} && exit 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit 0 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit 0 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit 0 ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Darwin:*:*) case `uname -p` in *86) UNAME_PROCESSOR=i686 ;; powerpc) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit 0 ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit 0 ;; *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit 0 ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit 0 ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit 0 ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit 0 ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit 0 ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit 0 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit 0 ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit 0 ;; *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit 0 ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: flamerobin_0.9.3~svn+2220.orig/config.sub000077500000000000000000000744351177057155300202030ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. timestamp='2004-01-05' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit 0;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32r | m68000 | m68k | m88k | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | msp430 \ | ns16k | ns32k \ | openrisc | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32r-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | msp430-* \ | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ | xtensa-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; crds | unos) basic_machine=m68k-crds ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; mmix*) basic_machine=mmix-knuth os=-mmixware ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nv1) basic_machine=nv1-cray os=-unicosmp ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; or32 | or32-*) basic_machine=or32-unknown os=-coff ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sh64) basic_machine=sh64-unknown ;; sparc | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -netbsd* | -openbsd* | -kfreebsd* | -freebsd* | -riscix* \ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: flamerobin_0.9.3~svn+2220.orig/configure000077500000000000000000007722111177057155300201240ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.67. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_unique_file="aclocal.m4" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS WX_INCLUDES COND_USE_PCH_1 COND_USEDLL_1 COND_UNICODE_1 COND_STATICRTL_1 COND_STATICRTL_0 COND_PLATFORM_WIN32_1 COND_PLATFORM_UNIX_1 COND_PLATFORM_OS2_1 COND_PLATFORM_MAC_1 COND_PLATFORM_MAC_0 COND_PLATFORM_MACOSX_1 COND_ICC_PCH_1 COND_GCC_PCH_1 COND_FINAL_1 COND_FINAL_0 COND_DEPS_TRACKING_1 COND_DEPS_TRACKING_0 BK_MAKE_PCH ICC_PCH_USE_SWITCH ICC_PCH_CREATE_SWITCH ICC_PCH GCC_PCH OBJCXXFLAGS SETFILE REZ WINDRES BK_DEPS DEPS_TRACKING SONAME_FLAG USE_SOTWOSYMLINKS USE_MACVERSION USE_SOVERCYGWIN USE_SOVERSOLARIS USE_SOVERLINUX USE_SOVERSION WINDOWS_IMPLIB PIC_FLAG SHARED_LD_MODULE_CXX SHARED_LD_MODULE_CC SHARED_LD_CXX SHARED_LD_CC AIX_CXX_LD dlldir DLLPREFIX_MODULE DLLPREFIX LIBEXT LIBPREFIX DLLIMP_SUFFIX SO_SUFFIX_MODULE SO_SUFFIX PLATFORM_BEOS PLATFORM_OS2 PLATFORM_MACOSX PLATFORM_MACOS PLATFORM_MAC PLATFORM_MSDOS PLATFORM_WIN32 PLATFORM_UNIX IF_GNU_MAKE LDFLAGS_GUI INSTALL_DIR NM STRIP AROPTIONS AR MAKE_SET SET_MAKE LN_S INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM RANLIB ac_ct_CC CFLAGS CC EGREP GREP CXXCPP WX_RESCOMP WX_VERSION WX_LIBS_STATIC WX_LIBS WX_CXXFLAGS_ONLY WX_CFLAGS_ONLY WX_CXXFLAGS WX_CFLAGS WX_CPPFLAGS WX_CONFIG_PATH OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_wxdir with_wx_config with_wx_prefix with_wx_exec_prefix enable_debug with_boost_include_path enable_omf enable_dependency_tracking enable_precomp_headers ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CXXCPP CC CFLAGS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-debug Enable debugging information --enable-omf use OMF object format (OS/2) --disable-dependency-tracking don't use dependency tracking even if the compiler can --disable-precomp-headers don't use precompiled headers even if compiler can Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-wxdir=PATH Use uninstalled version of wxWidgets in PATH --with-wx-config=CONFIG wx-config script to use (optional) --with-wx-prefix=PREFIX Prefix where wxWidgets is installed (optional) --with-wx-exec-prefix=PREFIX Exec prefix where wxWidgets is installed (optional) --with-boost-include-path Location of the Boost library headers (optional) Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXXCPP C++ preprocessor CC C compiler command CFLAGS C compiler flags Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.67 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval "test \"\${$3+set}\"" = set; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_cxx_check_header_mongrel # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_cxx_try_run # ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_cxx_check_header_compile # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_compile cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.67. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5 ; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if test "${ac_cv_build+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5 ;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if test "${ac_cv_host+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5 ;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if test "${ac_cv_target+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5 ;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- # Check whether --with-wxdir was given. if test "${with_wxdir+set}" = set; then : withval=$with_wxdir; wx_config_name="$withval/wx-config" wx_config_args="--inplace" fi # Check whether --with-wx-config was given. if test "${with_wx_config+set}" = set; then : withval=$with_wx_config; wx_config_name="$withval" fi # Check whether --with-wx-prefix was given. if test "${with_wx_prefix+set}" = set; then : withval=$with_wx_prefix; wx_config_prefix="$withval" else wx_config_prefix="" fi # Check whether --with-wx-exec-prefix was given. if test "${with_wx_exec_prefix+set}" = set; then : withval=$with_wx_exec_prefix; wx_config_exec_prefix="$withval" else wx_config_exec_prefix="" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5 ; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5 ; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5 ; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if test "${ac_cv_objext+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5 ; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if test "${ac_cv_cxx_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if test "${ac_cv_prog_cxx_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; USE_DEBUG="$enableval" else USE_DEBUG="no" fi if test $USE_DEBUG = yes ; then DEBUG=1 FINAL=0 CFLAGS="$CFLAGS -g" else DEBUG=0 FINAL=1 fi # Check for wxWidgets if test x${WX_CONFIG_NAME+set} != xset ; then WX_CONFIG_NAME=wx-config fi if test "x$wx_config_name" != x ; then WX_CONFIG_NAME="$wx_config_name" fi if test x$wx_config_exec_prefix != x ; then wx_config_args="$wx_config_args --exec-prefix=$wx_config_exec_prefix" WX_LOOKUP_PATH="$wx_config_exec_prefix/bin" fi if test x$wx_config_prefix != x ; then wx_config_args="$wx_config_args --prefix=$wx_config_prefix" WX_LOOKUP_PATH="$WX_LOOKUP_PATH:$wx_config_prefix/bin" fi if test "$cross_compiling" = "yes"; then wx_config_args="$wx_config_args --host=$host_alias" fi if test -x "$WX_CONFIG_NAME" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wx-config" >&5 $as_echo_n "checking for wx-config... " >&6; } WX_CONFIG_PATH="$WX_CONFIG_NAME" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5 $as_echo "$WX_CONFIG_PATH" >&6; } else # Extract the first word of "$WX_CONFIG_NAME", so it can be a program name with args. set dummy $WX_CONFIG_NAME; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_WX_CONFIG_PATH+set}" = set; then : $as_echo_n "(cached) " >&6 else case $WX_CONFIG_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_WX_CONFIG_PATH="$WX_CONFIG_PATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy=""$WX_LOOKUP_PATH:$PATH"" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_WX_CONFIG_PATH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_WX_CONFIG_PATH" && ac_cv_path_WX_CONFIG_PATH="no" ;; esac fi WX_CONFIG_PATH=$ac_cv_path_WX_CONFIG_PATH if test -n "$WX_CONFIG_PATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5 $as_echo "$WX_CONFIG_PATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "$WX_CONFIG_PATH" != "no" ; then WX_VERSION="" min_wx_version=2.8.0 if test -z "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version" >&5 $as_echo_n "checking for wxWidgets version >= $min_wx_version... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version ()" >&5 $as_echo_n "checking for wxWidgets version >= $min_wx_version ()... " >&6; } fi WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args aui,stc,std" WX_VERSION=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null` wx_config_major_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` wx_config_minor_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` wx_config_micro_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` wx_requested_major_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` wx_requested_minor_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` wx_requested_micro_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` wx_ver_ok="" if test "x$WX_VERSION" != x ; then if test $wx_config_major_version -gt $wx_requested_major_version; then wx_ver_ok=yes else if test $wx_config_major_version -eq $wx_requested_major_version; then if test $wx_config_minor_version -gt $wx_requested_minor_version; then wx_ver_ok=yes else if test $wx_config_minor_version -eq $wx_requested_minor_version; then if test $wx_config_micro_version -ge $wx_requested_micro_version; then wx_ver_ok=yes fi fi fi fi fi fi if test -n "$wx_ver_ok"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (version $WX_VERSION)" >&5 $as_echo "yes (version $WX_VERSION)" >&6; } WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets static library" >&5 $as_echo_n "checking for wxWidgets static library... " >&6; } WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs 2>/dev/null` if test "x$WX_LIBS_STATIC" = "x"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi wx_has_cppflags="" if test $wx_config_major_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_minor_version -eq 2; then if test $wx_config_micro_version -ge 6; then wx_has_cppflags=yes fi fi fi fi fi wx_has_rescomp="" if test $wx_config_major_version -gt 2; then wx_has_rescomp=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -ge 7; then wx_has_rescomp=yes fi fi fi if test "x$wx_has_rescomp" = x ; then WX_RESCOMP= else WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp` fi if test "x$wx_has_cppflags" = x ; then WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` WX_CPPFLAGS=$WX_CFLAGS WX_CXXFLAGS=$WX_CFLAGS WX_CFLAGS_ONLY=$WX_CFLAGS WX_CXXFLAGS_ONLY=$WX_CFLAGS else WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags` WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags` WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed "s@^$WX_CPPFLAGS *@@"` WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"` fi : else if test "x$WX_VERSION" = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (version $WX_VERSION is not new enough)" >&5 $as_echo "no (version $WX_VERSION is not new enough)" >&6; } fi WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" as_fn_error $? " wxWidgets must be installed on your system but wx-config script couldn't be found. Please check that wx-config is in path, the directory where wxWidgets libraries are installed (returned by 'wx-config --libs' command) is in LD_LIBRARY_PATH or equivalent variable and wxWidgets version is 2.8.0 or above. " "$LINENO" 5 fi else WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" as_fn_error $? " wxWidgets must be installed on your system but wx-config script couldn't be found. Please check that wx-config is in path, the directory where wxWidgets libraries are installed (returned by 'wx-config --libs' command) is in LD_LIBRARY_PATH or equivalent variable and wxWidgets version is 2.8.0 or above. " "$LINENO" 5 fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # Check for Boost headers # Check whether --with-boost-include-path was given. if test "${with_boost_include_path+set}" = set; then : withval=$with_boost_include_path; BOOSTINCLUDEPATH=$withval fi if test "x$BOOSTINCLUDEPATH" != "x"; then : CPPFLAGS="$CPPFLAGS -I$BOOSTINCLUDEPATH" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if test "${ac_cv_prog_CXXCPP+set}" = set; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5 ; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if test "${ac_cv_path_GREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if test "${ac_cv_path_EGREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_cxx_check_header_mongrel "$LINENO" "boost/shared_ptr.hpp" "ac_cv_header_boost_shared_ptr_hpp" "$ac_includes_default" if test "x$ac_cv_header_boost_shared_ptr_hpp" = x""yes; then : else as_fn_error $? " boost/shared_ptr.hpp not found. Install libboost-dev Boost C++ Libraries development files. In Debian/Ubuntu 'sudo apt-get install libboost-dev' " "$LINENO" 5 fi ac_fn_cxx_check_header_mongrel "$LINENO" "boost/function.hpp" "ac_cv_header_boost_function_hpp" "$ac_includes_default" if test "x$ac_cv_header_boost_function_hpp" = x""yes; then : else as_fn_error $? " boost/function.hpp not found. Install libboost-dev Boost C++ Libraries development files. In Debian/Ubuntu 'sudo apt-get install libboost-dev' " "$LINENO" 5 fi # Link to Firebird client library case "${host}" in *-*-cygwin* | *-*-mingw32* ) ;; *-*-darwin* ) LIBS="$LIBS -framework Firebird" ;; * ) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing isc_attach_database" >&5 $as_echo_n "checking for library containing isc_attach_database... " >&6; } if test "${ac_cv_search_isc_attach_database+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char isc_attach_database (); int main () { return isc_attach_database (); ; return 0; } _ACEOF for ac_lib in '' fbclient fbembed; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_search_isc_attach_database=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_isc_attach_database+set}" = set; then : break fi done if test "${ac_cv_search_isc_attach_database+set}" = set; then : else ac_cv_search_isc_attach_database=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_isc_attach_database" >&5 $as_echo "$ac_cv_search_isc_attach_database" >&6; } ac_res=$ac_cv_search_isc_attach_database if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else as_fn_error $? " Firebird client library not found Install Firebird server development files. In Debian/Ubuntu 'sudo apt-get install firebird2.5-dev' " "$LINENO" 5 fi esac CPPFLAGS="$CPPFLAGS $WX_CXXFLAGS" LDFLAGS="$LDFLAGS $WX_LDFLAGS $WX_LIBS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5 ; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the Intel C compiler" >&5 $as_echo_n "checking whether we are using the Intel C compiler... " >&6; } if test "${bakefile_cv_c_compiler___INTEL_COMPILER+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __INTEL_COMPILER choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : bakefile_cv_c_compiler___INTEL_COMPILER=yes else bakefile_cv_c_compiler___INTEL_COMPILER=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_c_compiler___INTEL_COMPILER" >&5 $as_echo "$bakefile_cv_c_compiler___INTEL_COMPILER" >&6; } if test "x$bakefile_cv_c_compiler___INTEL_COMPILER" = "xyes"; then :; INTELCC=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "$INTELCC" = "yes"; then ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using Intel C compiler v8 or later" >&5 $as_echo_n "checking whether we are using Intel C compiler v8 or later... " >&6; } if test "${bakefile_cv_c_compiler___INTEL_COMPILER_lt_800+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __INTEL_COMPILER || __INTEL_COMPILER < 800 choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : bakefile_cv_c_compiler___INTEL_COMPILER_lt_800=yes else bakefile_cv_c_compiler___INTEL_COMPILER_lt_800=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_c_compiler___INTEL_COMPILER_lt_800" >&5 $as_echo "$bakefile_cv_c_compiler___INTEL_COMPILER_lt_800" >&6; } if test "x$bakefile_cv_c_compiler___INTEL_COMPILER_lt_800" = "xyes"; then :; INTELCC8=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using Intel C compiler v10 or later" >&5 $as_echo_n "checking whether we are using Intel C compiler v10 or later... " >&6; } if test "${bakefile_cv_c_compiler___INTEL_COMPILER_lt_1000+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __INTEL_COMPILER || __INTEL_COMPILER < 1000 choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : bakefile_cv_c_compiler___INTEL_COMPILER_lt_1000=yes else bakefile_cv_c_compiler___INTEL_COMPILER_lt_1000=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_c_compiler___INTEL_COMPILER_lt_1000" >&5 $as_echo "$bakefile_cv_c_compiler___INTEL_COMPILER_lt_1000" >&6; } if test "x$bakefile_cv_c_compiler___INTEL_COMPILER_lt_1000" = "xyes"; then :; INTELCC10=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "x$GCC" != "xyes"; then if test "xCC" = "xC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the C++ compiler requires -ext o" >&5 $as_echo_n "checking if the C++ compiler requires -ext o... " >&6; } if test "${bakefile_cv_cxx_exto+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest.$ac_ext.o if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in `(ls conftest.* 2>/dev/null)`; do case $ac_file in conftest.$ac_ext.o) bakefile_cv_cxx_exto="-ext o" ;; *) ;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot figure out if compiler needs -ext o: cannot compile See \`config.log' for more details" "$LINENO" 5 ; } fi rm -f conftest.$ac_ext.o conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_cxx_exto" >&5 $as_echo "$bakefile_cv_cxx_exto" >&6; } if test "x$bakefile_cv_cxx_exto" '!=' "x"; then if test "cxx" = "c"; then CFLAGS="$bakefile_cv_cxx_exto $CFLAGS" fi if test "cxx" = "cxx"; then CXXFLAGS="$bakefile_cv_cxx_exto $CXXFLAGS" fi fi if test "x$bakefile_cv_c_exto" '!=' "x"; then unset ac_cv_prog_cc_g ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi fi fi case `uname -s` in AIX*) ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the IBM xlC C compiler" >&5 $as_echo_n "checking whether we are using the IBM xlC C compiler... " >&6; } if test "${bakefile_cv_c_compiler___xlC__+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __xlC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : bakefile_cv_c_compiler___xlC__=yes else bakefile_cv_c_compiler___xlC__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_c_compiler___xlC__" >&5 $as_echo "$bakefile_cv_c_compiler___xlC__" >&6; } if test "x$bakefile_cv_c_compiler___xlC__" = "xyes"; then :; XLCC=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ;; Darwin) ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the Metrowerks C compiler" >&5 $as_echo_n "checking whether we are using the Metrowerks C compiler... " >&6; } if test "${bakefile_cv_c_compiler___MWERKS__+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __MWERKS__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : bakefile_cv_c_compiler___MWERKS__=yes else bakefile_cv_c_compiler___MWERKS__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_c_compiler___MWERKS__" >&5 $as_echo "$bakefile_cv_c_compiler___MWERKS__" >&6; } if test "x$bakefile_cv_c_compiler___MWERKS__" = "xyes"; then :; MWCC=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "$MWCC" != "yes"; then ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the IBM xlC C compiler" >&5 $as_echo_n "checking whether we are using the IBM xlC C compiler... " >&6; } if test "${bakefile_cv_c_compiler___xlC__+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __xlC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : bakefile_cv_c_compiler___xlC__=yes else bakefile_cv_c_compiler___xlC__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_c_compiler___xlC__" >&5 $as_echo "$bakefile_cv_c_compiler___xlC__" >&6; } if test "x$bakefile_cv_c_compiler___xlC__" = "xyes"; then :; XLCC=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi ;; IRIX*) ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the SGI C compiler" >&5 $as_echo_n "checking whether we are using the SGI C compiler... " >&6; } if test "${bakefile_cv_c_compiler__SGI_COMPILER_VERSION+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef _SGI_COMPILER_VERSION choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : bakefile_cv_c_compiler__SGI_COMPILER_VERSION=yes else bakefile_cv_c_compiler__SGI_COMPILER_VERSION=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_c_compiler__SGI_COMPILER_VERSION" >&5 $as_echo "$bakefile_cv_c_compiler__SGI_COMPILER_VERSION" >&6; } if test "x$bakefile_cv_c_compiler__SGI_COMPILER_VERSION" = "xyes"; then :; SGICC=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ;; Linux*) if test "$INTELCC" != "yes"; then ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the Sun C compiler" >&5 $as_echo_n "checking whether we are using the Sun C compiler... " >&6; } if test "${bakefile_cv_c_compiler___SUNPRO_C+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __SUNPRO_C choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : bakefile_cv_c_compiler___SUNPRO_C=yes else bakefile_cv_c_compiler___SUNPRO_C=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_c_compiler___SUNPRO_C" >&5 $as_echo "$bakefile_cv_c_compiler___SUNPRO_C" >&6; } if test "x$bakefile_cv_c_compiler___SUNPRO_C" = "xyes"; then :; SUNCC=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi ;; HP-UX*) ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the HP C compiler" >&5 $as_echo_n "checking whether we are using the HP C compiler... " >&6; } if test "${bakefile_cv_c_compiler___HP_cc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __HP_cc choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : bakefile_cv_c_compiler___HP_cc=yes else bakefile_cv_c_compiler___HP_cc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_c_compiler___HP_cc" >&5 $as_echo "$bakefile_cv_c_compiler___HP_cc" >&6; } if test "x$bakefile_cv_c_compiler___HP_cc" = "xyes"; then :; HPCC=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ;; OSF1) ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the Compaq C compiler" >&5 $as_echo_n "checking whether we are using the Compaq C compiler... " >&6; } if test "${bakefile_cv_c_compiler___DECC+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __DECC choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : bakefile_cv_c_compiler___DECC=yes else bakefile_cv_c_compiler___DECC=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_c_compiler___DECC" >&5 $as_echo "$bakefile_cv_c_compiler___DECC" >&6; } if test "x$bakefile_cv_c_compiler___DECC" = "xyes"; then :; COMPAQCC=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ;; SunOS) ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the Sun C compiler" >&5 $as_echo_n "checking whether we are using the Sun C compiler... " >&6; } if test "${bakefile_cv_c_compiler___SUNPRO_C+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __SUNPRO_C choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : bakefile_cv_c_compiler___SUNPRO_C=yes else bakefile_cv_c_compiler___SUNPRO_C=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_c_compiler___SUNPRO_C" >&5 $as_echo "$bakefile_cv_c_compiler___SUNPRO_C" >&6; } if test "x$bakefile_cv_c_compiler___SUNPRO_C" = "xyes"; then :; SUNCC=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ;; esac fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the Intel C++ compiler" >&5 $as_echo_n "checking whether we are using the Intel C++ compiler... " >&6; } if test "${bakefile_cv_cxx_compiler___INTEL_COMPILER+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __INTEL_COMPILER choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : bakefile_cv_cxx_compiler___INTEL_COMPILER=yes else bakefile_cv_cxx_compiler___INTEL_COMPILER=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_cxx_compiler___INTEL_COMPILER" >&5 $as_echo "$bakefile_cv_cxx_compiler___INTEL_COMPILER" >&6; } if test "x$bakefile_cv_cxx_compiler___INTEL_COMPILER" = "xyes"; then :; INTELCXX=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "$INTELCXX" = "yes"; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using Intel C++ compiler v8 or later" >&5 $as_echo_n "checking whether we are using Intel C++ compiler v8 or later... " >&6; } if test "${bakefile_cv_cxx_compiler___INTEL_COMPILER_lt_800+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __INTEL_COMPILER || __INTEL_COMPILER < 800 choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : bakefile_cv_cxx_compiler___INTEL_COMPILER_lt_800=yes else bakefile_cv_cxx_compiler___INTEL_COMPILER_lt_800=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_cxx_compiler___INTEL_COMPILER_lt_800" >&5 $as_echo "$bakefile_cv_cxx_compiler___INTEL_COMPILER_lt_800" >&6; } if test "x$bakefile_cv_cxx_compiler___INTEL_COMPILER_lt_800" = "xyes"; then :; INTELCXX8=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using Intel C++ compiler v10 or later" >&5 $as_echo_n "checking whether we are using Intel C++ compiler v10 or later... " >&6; } if test "${bakefile_cv_cxx_compiler___INTEL_COMPILER_lt_1000+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __INTEL_COMPILER || __INTEL_COMPILER < 1000 choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : bakefile_cv_cxx_compiler___INTEL_COMPILER_lt_1000=yes else bakefile_cv_cxx_compiler___INTEL_COMPILER_lt_1000=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_cxx_compiler___INTEL_COMPILER_lt_1000" >&5 $as_echo "$bakefile_cv_cxx_compiler___INTEL_COMPILER_lt_1000" >&6; } if test "x$bakefile_cv_cxx_compiler___INTEL_COMPILER_lt_1000" = "xyes"; then :; INTELCXX10=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "x$GCXX" != "xyes"; then if test "xCXX" = "xC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the C++ compiler requires -ext o" >&5 $as_echo_n "checking if the C++ compiler requires -ext o... " >&6; } if test "${bakefile_cv_cxx_exto+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest.$ac_ext.o if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in `(ls conftest.* 2>/dev/null)`; do case $ac_file in conftest.$ac_ext.o) bakefile_cv_cxx_exto="-ext o" ;; *) ;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot figure out if compiler needs -ext o: cannot compile See \`config.log' for more details" "$LINENO" 5 ; } fi rm -f conftest.$ac_ext.o conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_cxx_exto" >&5 $as_echo "$bakefile_cv_cxx_exto" >&6; } if test "x$bakefile_cv_cxx_exto" '!=' "x"; then if test "cxx" = "c"; then CFLAGS="$bakefile_cv_cxx_exto $CFLAGS" fi if test "cxx" = "cxx"; then CXXFLAGS="$bakefile_cv_cxx_exto $CXXFLAGS" fi fi if test "x$bakefile_cv_c_exto" '!=' "x"; then unset ac_cv_prog_cc_g ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi fi fi case `uname -s` in AIX*) ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the IBM xlC C++ compiler" >&5 $as_echo_n "checking whether we are using the IBM xlC C++ compiler... " >&6; } if test "${bakefile_cv_cxx_compiler___xlC__+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __xlC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : bakefile_cv_cxx_compiler___xlC__=yes else bakefile_cv_cxx_compiler___xlC__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_cxx_compiler___xlC__" >&5 $as_echo "$bakefile_cv_cxx_compiler___xlC__" >&6; } if test "x$bakefile_cv_cxx_compiler___xlC__" = "xyes"; then :; XLCXX=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ;; Darwin) ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the Metrowerks C++ compiler" >&5 $as_echo_n "checking whether we are using the Metrowerks C++ compiler... " >&6; } if test "${bakefile_cv_cxx_compiler___MWERKS__+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __MWERKS__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : bakefile_cv_cxx_compiler___MWERKS__=yes else bakefile_cv_cxx_compiler___MWERKS__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_cxx_compiler___MWERKS__" >&5 $as_echo "$bakefile_cv_cxx_compiler___MWERKS__" >&6; } if test "x$bakefile_cv_cxx_compiler___MWERKS__" = "xyes"; then :; MWCXX=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "$MWCXX" != "yes"; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the IBM xlC C++ compiler" >&5 $as_echo_n "checking whether we are using the IBM xlC C++ compiler... " >&6; } if test "${bakefile_cv_cxx_compiler___xlC__+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __xlC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : bakefile_cv_cxx_compiler___xlC__=yes else bakefile_cv_cxx_compiler___xlC__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_cxx_compiler___xlC__" >&5 $as_echo "$bakefile_cv_cxx_compiler___xlC__" >&6; } if test "x$bakefile_cv_cxx_compiler___xlC__" = "xyes"; then :; XLCXX=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi ;; IRIX*) ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the SGI C++ compiler" >&5 $as_echo_n "checking whether we are using the SGI C++ compiler... " >&6; } if test "${bakefile_cv_cxx_compiler__SGI_COMPILER_VERSION+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef _SGI_COMPILER_VERSION choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : bakefile_cv_cxx_compiler__SGI_COMPILER_VERSION=yes else bakefile_cv_cxx_compiler__SGI_COMPILER_VERSION=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_cxx_compiler__SGI_COMPILER_VERSION" >&5 $as_echo "$bakefile_cv_cxx_compiler__SGI_COMPILER_VERSION" >&6; } if test "x$bakefile_cv_cxx_compiler__SGI_COMPILER_VERSION" = "xyes"; then :; SGICXX=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ;; Linux*) if test "$INTELCXX" != "yes"; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the Sun C++ compiler" >&5 $as_echo_n "checking whether we are using the Sun C++ compiler... " >&6; } if test "${bakefile_cv_cxx_compiler___SUNPRO_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __SUNPRO_CC choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : bakefile_cv_cxx_compiler___SUNPRO_CC=yes else bakefile_cv_cxx_compiler___SUNPRO_CC=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_cxx_compiler___SUNPRO_CC" >&5 $as_echo "$bakefile_cv_cxx_compiler___SUNPRO_CC" >&6; } if test "x$bakefile_cv_cxx_compiler___SUNPRO_CC" = "xyes"; then :; SUNCXX=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi ;; HP-UX*) ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the HP C++ compiler" >&5 $as_echo_n "checking whether we are using the HP C++ compiler... " >&6; } if test "${bakefile_cv_cxx_compiler___HP_aCC+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __HP_aCC choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : bakefile_cv_cxx_compiler___HP_aCC=yes else bakefile_cv_cxx_compiler___HP_aCC=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_cxx_compiler___HP_aCC" >&5 $as_echo "$bakefile_cv_cxx_compiler___HP_aCC" >&6; } if test "x$bakefile_cv_cxx_compiler___HP_aCC" = "xyes"; then :; HPCXX=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ;; OSF1) ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the Compaq C++ compiler" >&5 $as_echo_n "checking whether we are using the Compaq C++ compiler... " >&6; } if test "${bakefile_cv_cxx_compiler___DECCXX+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __DECCXX choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : bakefile_cv_cxx_compiler___DECCXX=yes else bakefile_cv_cxx_compiler___DECCXX=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_cxx_compiler___DECCXX" >&5 $as_echo "$bakefile_cv_cxx_compiler___DECCXX" >&6; } if test "x$bakefile_cv_cxx_compiler___DECCXX" = "xyes"; then :; COMPAQCXX=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ;; SunOS) ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the Sun C++ compiler" >&5 $as_echo_n "checking whether we are using the Sun C++ compiler... " >&6; } if test "${bakefile_cv_cxx_compiler___SUNPRO_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __SUNPRO_CC choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : bakefile_cv_cxx_compiler___SUNPRO_CC=yes else bakefile_cv_cxx_compiler___SUNPRO_CC=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_cxx_compiler___SUNPRO_CC" >&5 $as_echo "$bakefile_cv_cxx_compiler___SUNPRO_CC" >&6; } if test "x$bakefile_cv_cxx_compiler___SUNPRO_CC" = "xyes"; then :; SUNCXX=yes else :; fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ;; esac fi # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' if test "x$BAKEFILE_HOST" = "x"; then if test "x${host}" = "x" ; then as_fn_error $? "You must call the autoconf \"CANONICAL_HOST\" macro in your configure.ac (or .in) file." "$LINENO" 5 fi BAKEFILE_HOST="${host}" fi if test "x$BAKEFILE_CHECK_BASICS" != "xno"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi if test "x$SUNCXX" = "xyes"; then AR=$CXX AROPTIONS="-xar -o" elif test "x$SGICC" = "xyes"; then AR=$CXX AROPTIONS="-ar -o" else if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_AR+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_AR+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="ar" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi AROPTIONS=rcu fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nm", so it can be a program name with args. set dummy ${ac_tool_prefix}nm; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_NM+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then ac_cv_prog_NM="$NM" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_NM="${ac_tool_prefix}nm" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NM=$ac_cv_prog_NM if test -n "$NM"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NM" >&5 $as_echo "$NM" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NM"; then ac_ct_NM=$NM # Extract the first word of "nm", so it can be a program name with args. set dummy nm; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_NM+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NM"; then ac_cv_prog_ac_ct_NM="$ac_ct_NM" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_NM="nm" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NM=$ac_cv_prog_ac_ct_NM if test -n "$ac_ct_NM"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NM" >&5 $as_echo "$ac_ct_NM" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NM" = x; then NM=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NM=$ac_ct_NM fi else NM="$ac_cv_prog_NM" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for command to install directories" >&5 $as_echo_n "checking for command to install directories... " >&6; } INSTALL_TEST_DIR=acbftest$$ $INSTALL -d $INSTALL_TEST_DIR > /dev/null 2>&1 if test $? = 0 -a -d $INSTALL_TEST_DIR; then rmdir $INSTALL_TEST_DIR INSTALL_DIR='$(INSTALL) -d' { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL -d" >&5 $as_echo "$INSTALL -d" >&6; } else INSTALL_DIR="mkdir -p" { $as_echo "$as_me:${as_lineno-$LINENO}: result: mkdir -p" >&5 $as_echo "mkdir -p" >&6; } fi LDFLAGS_GUI= case ${BAKEFILE_HOST} in *-*-cygwin* | *-*-mingw32* ) LDFLAGS_GUI="-mwindows" esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if make is GNU make" >&5 $as_echo_n "checking if make is GNU make... " >&6; } if test "${bakefile_cv_prog_makeisgnu+set}" = set; then : $as_echo_n "(cached) " >&6 else if ( ${SHELL-sh} -c "${MAKE-make} --version" 2> /dev/null | egrep -s GNU > /dev/null); then bakefile_cv_prog_makeisgnu="yes" else bakefile_cv_prog_makeisgnu="no" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_prog_makeisgnu" >&5 $as_echo "$bakefile_cv_prog_makeisgnu" >&6; } if test "x$bakefile_cv_prog_makeisgnu" = "xyes"; then IF_GNU_MAKE="" else IF_GNU_MAKE="#" fi PLATFORM_UNIX=0 PLATFORM_WIN32=0 PLATFORM_MSDOS=0 PLATFORM_MAC=0 PLATFORM_MACOS=0 PLATFORM_MACOSX=0 PLATFORM_OS2=0 PLATFORM_BEOS=0 if test "x$BAKEFILE_FORCE_PLATFORM" = "x"; then case "${BAKEFILE_HOST}" in *-*-mingw32* ) PLATFORM_WIN32=1 ;; *-pc-msdosdjgpp ) PLATFORM_MSDOS=1 ;; *-pc-os2_emx | *-pc-os2-emx ) PLATFORM_OS2=1 ;; *-*-darwin* ) PLATFORM_MAC=1 PLATFORM_MACOSX=1 ;; *-*-beos* ) PLATFORM_BEOS=1 ;; powerpc-apple-macos* ) PLATFORM_MAC=1 PLATFORM_MACOS=1 ;; * ) PLATFORM_UNIX=1 ;; esac else case "$BAKEFILE_FORCE_PLATFORM" in win32 ) PLATFORM_WIN32=1 ;; msdos ) PLATFORM_MSDOS=1 ;; os2 ) PLATFORM_OS2=1 ;; darwin ) PLATFORM_MAC=1 PLATFORM_MACOSX=1 ;; unix ) PLATFORM_UNIX=1 ;; beos ) PLATFORM_BEOS=1 ;; * ) as_fn_error $? "Unknown platform: $BAKEFILE_FORCE_PLATFORM" "$LINENO" 5 ;; esac fi # Check whether --enable-omf was given. if test "${enable_omf+set}" = set; then : enableval=$enable_omf; bk_os2_use_omf="$enableval" fi case "${BAKEFILE_HOST}" in *-*-darwin* ) if test "x$GCC" = "xyes"; then CFLAGS="$CFLAGS -fno-common" CXXFLAGS="$CXXFLAGS -fno-common" fi if test "x$XLCC" = "xyes"; then CFLAGS="$CFLAGS -qnocommon" CXXFLAGS="$CXXFLAGS -qnocommon" fi ;; *-pc-os2_emx | *-pc-os2-emx ) if test "x$bk_os2_use_omf" = "xyes" ; then AR=emxomfar RANLIB=: LDFLAGS="-Zomf $LDFLAGS" CFLAGS="-Zomf $CFLAGS" CXXFLAGS="-Zomf $CXXFLAGS" OS2_LIBEXT="lib" else OS2_LIBEXT="a" fi ;; i*86-*-beos* ) LDFLAGS="-L/boot/develop/lib/x86 $LDFLAGS" ;; esac SO_SUFFIX="so" SO_SUFFIX_MODULE="so" EXEEXT="" LIBPREFIX="lib" LIBEXT=".a" DLLPREFIX="lib" DLLPREFIX_MODULE="" DLLIMP_SUFFIX="" dlldir="$libdir" case "${BAKEFILE_HOST}" in ia64-hp-hpux* ) ;; *-hp-hpux* ) SO_SUFFIX="sl" SO_SUFFIX_MODULE="sl" ;; *-*-aix* ) SO_SUFFIX="a" SO_SUFFIX_MODULE="a" ;; *-*-cygwin* ) SO_SUFFIX="dll" SO_SUFFIX_MODULE="dll" DLLIMP_SUFFIX="dll.a" EXEEXT=".exe" DLLPREFIX="cyg" dlldir="$bindir" ;; *-*-mingw32* ) SO_SUFFIX="dll" SO_SUFFIX_MODULE="dll" DLLIMP_SUFFIX="dll.a" EXEEXT=".exe" DLLPREFIX="" dlldir="$bindir" ;; *-pc-msdosdjgpp ) EXEEXT=".exe" DLLPREFIX="" dlldir="$bindir" ;; *-pc-os2_emx | *-pc-os2-emx ) SO_SUFFIX="dll" SO_SUFFIX_MODULE="dll" DLLIMP_SUFFIX=$OS2_LIBEXT EXEEXT=".exe" DLLPREFIX="" LIBPREFIX="" LIBEXT=".$OS2_LIBEXT" dlldir="$bindir" ;; *-*-darwin* ) SO_SUFFIX="dylib" SO_SUFFIX_MODULE="bundle" ;; esac if test "x$DLLIMP_SUFFIX" = "x" ; then DLLIMP_SUFFIX="$SO_SUFFIX" fi PIC_FLAG="" if test "x$GCC" = "xyes"; then PIC_FLAG="-fPIC" fi SHARED_LD_CC="\$(CC) -shared ${PIC_FLAG} -o" SHARED_LD_CXX="\$(CXX) -shared ${PIC_FLAG} -o" WINDOWS_IMPLIB=0 case "${BAKEFILE_HOST}" in *-hp-hpux* ) if test "x$GCC" != "xyes"; then LDFLAGS="$LDFLAGS -L/usr/lib" SHARED_LD_CC="${CC} -b -o" SHARED_LD_CXX="${CXX} -b -o" PIC_FLAG="+Z" fi ;; *-*-linux* ) if test "$INTELCC" = "yes" -a "$INTELCC8" != "yes"; then PIC_FLAG="-KPIC" elif test "x$SUNCXX" = "xyes"; then SHARED_LD_CC="${CC} -G -o" SHARED_LD_CXX="${CXX} -G -o" PIC_FLAG="-KPIC" fi ;; *-*-solaris2* ) if test "x$SUNCXX" = xyes ; then SHARED_LD_CC="${CC} -G -o" SHARED_LD_CXX="${CXX} -G -o" PIC_FLAG="-KPIC" fi ;; *-*-darwin* ) D='$' cat <shared-ld-sh #!/bin/sh #----------------------------------------------------------------------------- #-- Name: distrib/mac/shared-ld-sh #-- Purpose: Link a mach-o dynamic shared library for Darwin / Mac OS X #-- Author: Gilles Depeyrot #-- Copyright: (c) 2002 Gilles Depeyrot #-- Licence: any use permitted #----------------------------------------------------------------------------- verbose=0 args="" objects="" linking_flag="-dynamiclib" ldargs="-r -keep_private_externs -nostdlib" if test "x${D}CXX" = "x"; then CXX="c++" fi while test ${D}# -gt 0; do case ${D}1 in -v) verbose=1 ;; -o|-compatibility_version|-current_version|-framework|-undefined|-install_name) # collect these options and values args="${D}{args} ${D}1 ${D}2" shift ;; -arch|-isysroot) # collect these options and values ldargs="${D}{ldargs} ${D}1 ${D}2" shift ;; -s|-Wl,*) # collect these load args ldargs="${D}{ldargs} ${D}1" ;; -l*|-L*|-flat_namespace|-headerpad_max_install_names) # collect these options args="${D}{args} ${D}1" ;; -dynamiclib|-bundle) linking_flag="${D}1" ;; -*) echo "shared-ld: unhandled option '${D}1'" exit 1 ;; *.o | *.a | *.dylib) # collect object files objects="${D}{objects} ${D}1" ;; *) echo "shared-ld: unhandled argument '${D}1'" exit 1 ;; esac shift done status=0 # # Link one module containing all the others # if test ${D}{verbose} = 1; then echo "${D}CXX ${D}{ldargs} ${D}{objects} -o master.${D}${D}.o" fi ${D}CXX ${D}{ldargs} ${D}{objects} -o master.${D}${D}.o status=${D}? # # Link the shared library from the single module created, but only if the # previous command didn't fail: # if test ${D}{status} = 0; then if test ${D}{verbose} = 1; then echo "${D}CXX ${D}{linking_flag} master.${D}${D}.o ${D}{args}" fi ${D}CXX ${D}{linking_flag} master.${D}${D}.o ${D}{args} status=${D}? fi # # Remove intermediate module # rm -f master.${D}${D}.o exit ${D}status EOF chmod +x shared-ld-sh SHARED_LD_MODULE_CC="`pwd`/shared-ld-sh -bundle -headerpad_max_install_names -o" SHARED_LD_MODULE_CXX="CXX=\"\$(CXX)\" $SHARED_LD_MODULE_CC" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc 3.1 or later" >&5 $as_echo_n "checking for gcc 3.1 or later... " >&6; } if test "${bakefile_cv_gcc31+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #if (__GNUC__ < 3) || \ ((__GNUC__ == 3) && (__GNUC_MINOR__ < 1)) This is old gcc #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : bakefile_cv_gcc31=yes else bakefile_cv_gcc31=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bakefile_cv_gcc31" >&5 $as_echo "$bakefile_cv_gcc31" >&6; } if test "$bakefile_cv_gcc31" = "no"; then SHARED_LD_CC="`pwd`/shared-ld-sh -dynamiclib -headerpad_max_install_names -o" SHARED_LD_CXX="$SHARED_LD_CC" else SHARED_LD_CC="\${CC} -dynamiclib -single_module -headerpad_max_install_names -o" SHARED_LD_CXX="\${CXX} -dynamiclib -single_module -headerpad_max_install_names -o" fi if test "x$GCC" == "xyes"; then PIC_FLAG="-dynamic -fPIC" fi if test "x$XLCC" = "xyes"; then PIC_FLAG="-dynamic -DPIC" fi ;; *-*-aix* ) if test "x$GCC" = "xyes"; then PIC_FLAG="" case "${BAKEFILE_HOST}" in *-*-aix5* ) LD_EXPFULL="-Wl,-bexpfull" ;; esac SHARED_LD_CC="\$(CC) -shared $LD_EXPFULL -o" SHARED_LD_CXX="\$(CXX) -shared $LD_EXPFULL -o" else # Extract the first word of "makeC++SharedLib", so it can be a program name with args. set dummy makeC++SharedLib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_AIX_CXX_LD+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AIX_CXX_LD"; then ac_cv_prog_AIX_CXX_LD="$AIX_CXX_LD" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AIX_CXX_LD="makeC++SharedLib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_AIX_CXX_LD" && ac_cv_prog_AIX_CXX_LD="/usr/lpp/xlC/bin/makeC++SharedLib" fi fi AIX_CXX_LD=$ac_cv_prog_AIX_CXX_LD if test -n "$AIX_CXX_LD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AIX_CXX_LD" >&5 $as_echo "$AIX_CXX_LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi SHARED_LD_CC="$AIX_CC_LD -p 0 -o" SHARED_LD_CXX="$AIX_CXX_LD -p 0 -o" fi ;; *-*-beos* ) SHARED_LD_CC="${LD} -nostart -o" SHARED_LD_CXX="${LD} -nostart -o" ;; *-*-irix* ) if test "x$GCC" != "xyes"; then PIC_FLAG="-KPIC" fi ;; *-*-cygwin* | *-*-mingw32* ) PIC_FLAG="" SHARED_LD_CC="\$(CC) -shared -o" SHARED_LD_CXX="\$(CXX) -shared -o" WINDOWS_IMPLIB=1 ;; *-pc-os2_emx | *-pc-os2-emx ) SHARED_LD_CC="`pwd`/dllar.sh -libf INITINSTANCE -libf TERMINSTANCE -o" SHARED_LD_CXX="`pwd`/dllar.sh -libf INITINSTANCE -libf TERMINSTANCE -o" PIC_FLAG="" D='$' cat <dllar.sh #!/bin/sh # # dllar - a tool to build both a .dll and an .a file # from a set of object (.o) files for EMX/OS2. # # Written by Andrew Zabolotny, bit@freya.etu.ru # Ported to Unix like shell by Stefan Neis, Stefan.Neis@t-online.de # # This script will accept a set of files on the command line. # All the public symbols from the .o files will be exported into # a .DEF file, then linker will be run (through gcc) against them to # build a shared library consisting of all given .o files. All libraries # (.a) will be first decompressed into component .o files then act as # described above. You can optionally give a description (-d "description") # which will be put into .DLL. To see the list of accepted options (as well # as command-line format) simply run this program without options. The .DLL # is built to be imported by name (there is no guarantee that new versions # of the library you build will have same ordinals for same symbols). # # dllar is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # dllar 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 dllar; see the file COPYING. If not, write to the Free # Software Foundation, 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # To successfuly run this program you will need: # - Current drive should have LFN support (HPFS, ext2, network, etc) # (Sometimes dllar generates filenames which won't fit 8.3 scheme) # - gcc # (used to build the .dll) # - emxexp # (used to create .def file from .o files) # - emximp # (used to create .a file from .def file) # - GNU text utilites (cat, sort, uniq) # used to process emxexp output # - GNU file utilities (mv, rm) # - GNU sed # - lxlite (optional, see flag below) # (used for general .dll cleanup) # flag_USE_LXLITE=1; # # helper functions # basnam, variant of basename, which does _not_ remove the path, _iff_ # second argument (suffix to remove) is given basnam(){ case ${D}# in 1) echo ${D}1 | sed 's/.*\\///' | sed 's/.*\\\\//' ;; 2) echo ${D}1 | sed 's/'${D}2'${D}//' ;; *) echo "error in basnam ${D}*" exit 8 ;; esac } # Cleanup temporary files and output CleanUp() { cd ${D}curDir for i in ${D}inputFiles ; do case ${D}i in *!) rm -rf \`basnam ${D}i !\` ;; *) ;; esac done # Kill result in case of failure as there is just to many stupid make/nmake # things out there which doesn't do this. if [ ${D}# -eq 0 ]; then rm -f ${D}arcFile ${D}arcFile2 ${D}defFile ${D}dllFile fi } # Print usage and exit script with rc=1. PrintHelp() { echo 'Usage: dllar.sh [-o[utput] output_file] [-i[mport] importlib_name]' echo ' [-name-mangler-script script.sh]' echo ' [-d[escription] "dll descrption"] [-cc "CC"] [-f[lags] "CFLAGS"]' echo ' [-ord[inals]] -ex[clude] "symbol(s)"' echo ' [-libf[lags] "{INIT|TERM}{GLOBAL|INSTANCE}"] [-nocrt[dll]] [-nolxl[ite]]' echo ' [*.o] [*.a]' echo '*> "output_file" should have no extension.' echo ' If it has the .o, .a or .dll extension, it is automatically removed.' echo ' The import library name is derived from this and is set to "name".a,' echo ' unless overridden by -import' echo '*> "importlib_name" should have no extension.' echo ' If it has the .o, or .a extension, it is automatically removed.' echo ' This name is used as the import library name and may be longer and' echo ' more descriptive than the DLL name which has to follow the old ' echo ' 8.3 convention of FAT.' echo '*> "script.sh may be given to override the output_file name by a' echo ' different name. It is mainly useful if the regular make process' echo ' of some package does not take into account OS/2 restriction of' echo ' DLL name lengths. It takes the importlib name as input and is' echo ' supposed to procude a shorter name as output. The script should' echo ' expect to get importlib_name without extension and should produce' echo ' a (max.) 8 letter name without extension.' echo '*> "cc" is used to use another GCC executable. (default: gcc.exe)' echo '*> "flags" should be any set of valid GCC flags. (default: -s -Zcrtdll)' echo ' These flags will be put at the start of GCC command line.' echo '*> -ord[inals] tells dllar to export entries by ordinals. Be careful.' echo '*> -ex[clude] defines symbols which will not be exported. You can define' echo ' multiple symbols, for example -ex "myfunc yourfunc _GLOBAL*".' echo ' If the last character of a symbol is "*", all symbols beginning' echo ' with the prefix before "*" will be exclude, (see _GLOBAL* above).' echo '*> -libf[lags] can be used to add INITGLOBAL/INITINSTANCE and/or' echo ' TERMGLOBAL/TERMINSTANCE flags to the dynamically-linked library.' echo '*> -nocrt[dll] switch will disable linking the library against emx''s' echo ' C runtime DLLs.' echo '*> -nolxl[ite] switch will disable running lxlite on the resulting DLL.' echo '*> All other switches (for example -L./ or -lmylib) will be passed' echo ' unchanged to GCC at the end of command line.' echo '*> If you create a DLL from a library and you do not specify -o,' echo ' the basename for DLL and import library will be set to library name,' echo ' the initial library will be renamed to 'name'_s.a (_s for static)' echo ' i.e. "dllar gcc.a" will create gcc.dll and gcc.a, and the initial' echo ' library will be renamed into gcc_s.a.' echo '--------' echo 'Example:' echo ' dllar -o gcc290.dll libgcc.a -d "GNU C runtime library" -ord' echo ' -ex "__main __ctordtor*" -libf "INITINSTANCE TERMINSTANCE"' CleanUp exit 1 } # Execute a command. # If exit code of the commnad <> 0 CleanUp() is called and we'll exit the script. # @Uses Whatever CleanUp() uses. doCommand() { echo "${D}*" eval ${D}* rcCmd=${D}? if [ ${D}rcCmd -ne 0 ]; then echo "command failed, exit code="${D}rcCmd CleanUp exit ${D}rcCmd fi } # main routine # setup globals cmdLine=${D}* outFile="" outimpFile="" inputFiles="" renameScript="" description="" CC=gcc.exe CFLAGS="-s -Zcrtdll" EXTRA_CFLAGS="" EXPORT_BY_ORDINALS=0 exclude_symbols="" library_flags="" curDir=\`pwd\` curDirS=curDir case ${D}curDirS in */) ;; *) curDirS=${D}{curDirS}"/" ;; esac # Parse commandline libsToLink=0 omfLinking=0 while [ ${D}1 ]; do case ${D}1 in -ord*) EXPORT_BY_ORDINALS=1; ;; -o*) shift outFile=${D}1 ;; -i*) shift outimpFile=${D}1 ;; -name-mangler-script) shift renameScript=${D}1 ;; -d*) shift description=${D}1 ;; -f*) shift CFLAGS=${D}1 ;; -c*) shift CC=${D}1 ;; -h*) PrintHelp ;; -ex*) shift exclude_symbols=${D}{exclude_symbols}${D}1" " ;; -libf*) shift library_flags=${D}{library_flags}${D}1" " ;; -nocrt*) CFLAGS="-s" ;; -nolxl*) flag_USE_LXLITE=0 ;; -* | /*) case ${D}1 in -L* | -l*) libsToLink=1 ;; -Zomf) omfLinking=1 ;; *) ;; esac EXTRA_CFLAGS=${D}{EXTRA_CFLAGS}" "${D}1 ;; *.dll) EXTRA_CFLAGS="${D}{EXTRA_CFLAGS} \`basnam ${D}1 .dll\`" if [ ${D}omfLinking -eq 1 ]; then EXTRA_CFLAGS="${D}{EXTRA_CFLAGS}.lib" else EXTRA_CFLAGS="${D}{EXTRA_CFLAGS}.a" fi ;; *) found=0; if [ ${D}libsToLink -ne 0 ]; then EXTRA_CFLAGS=${D}{EXTRA_CFLAGS}" "${D}1 else for file in ${D}1 ; do if [ -f ${D}file ]; then inputFiles="${D}{inputFiles} ${D}file" found=1 fi done if [ ${D}found -eq 0 ]; then echo "ERROR: No file(s) found: "${D}1 exit 8 fi fi ;; esac shift done # iterate cmdline words # if [ -z "${D}inputFiles" ]; then echo "dllar: no input files" PrintHelp fi # Now extract all .o files from .a files newInputFiles="" for file in ${D}inputFiles ; do case ${D}file in *.a | *.lib) case ${D}file in *.a) suffix=".a" AR="ar" ;; *.lib) suffix=".lib" AR="emxomfar" EXTRA_CFLAGS="${D}EXTRA_CFLAGS -Zomf" ;; *) ;; esac dirname=\`basnam ${D}file ${D}suffix\`"_%" mkdir ${D}dirname if [ ${D}? -ne 0 ]; then echo "Failed to create subdirectory ./${D}dirname" CleanUp exit 8; fi # Append '!' to indicate archive newInputFiles="${D}newInputFiles ${D}{dirname}!" doCommand "cd ${D}dirname; ${D}AR x ../${D}file" cd ${D}curDir found=0; for subfile in ${D}dirname/*.o* ; do if [ -f ${D}subfile ]; then found=1 if [ -s ${D}subfile ]; then # FIXME: This should be: is file size > 32 byte, _not_ > 0! newInputFiles="${D}newInputFiles ${D}subfile" fi fi done if [ ${D}found -eq 0 ]; then echo "WARNING: there are no files in archive \\'${D}file\\'" fi ;; *) newInputFiles="${D}{newInputFiles} ${D}file" ;; esac done inputFiles="${D}newInputFiles" # Output filename(s). do_backup=0; if [ -z ${D}outFile ]; then do_backup=1; set outFile ${D}inputFiles; outFile=${D}2 fi # If it is an archive, remove the '!' and the '_%' suffixes case ${D}outFile in *_%!) outFile=\`basnam ${D}outFile _%!\` ;; *) ;; esac case ${D}outFile in *.dll) outFile=\`basnam ${D}outFile .dll\` ;; *.DLL) outFile=\`basnam ${D}outFile .DLL\` ;; *.o) outFile=\`basnam ${D}outFile .o\` ;; *.obj) outFile=\`basnam ${D}outFile .obj\` ;; *.a) outFile=\`basnam ${D}outFile .a\` ;; *.lib) outFile=\`basnam ${D}outFile .lib\` ;; *) ;; esac case ${D}outimpFile in *.a) outimpFile=\`basnam ${D}outimpFile .a\` ;; *.lib) outimpFile=\`basnam ${D}outimpFile .lib\` ;; *) ;; esac if [ -z ${D}outimpFile ]; then outimpFile=${D}outFile fi defFile="${D}{outFile}.def" arcFile="${D}{outimpFile}.a" arcFile2="${D}{outimpFile}.lib" #create ${D}dllFile as something matching 8.3 restrictions, if [ -z ${D}renameScript ] ; then dllFile="${D}outFile" else dllFile=\`${D}renameScript ${D}outimpFile\` fi if [ ${D}do_backup -ne 0 ] ; then if [ -f ${D}arcFile ] ; then doCommand "mv ${D}arcFile ${D}{outFile}_s.a" fi if [ -f ${D}arcFile2 ] ; then doCommand "mv ${D}arcFile2 ${D}{outFile}_s.lib" fi fi # Extract public symbols from all the object files. tmpdefFile=${D}{defFile}_% rm -f ${D}tmpdefFile for file in ${D}inputFiles ; do case ${D}file in *!) ;; *) doCommand "emxexp -u ${D}file >> ${D}tmpdefFile" ;; esac done # Create the def file. rm -f ${D}defFile echo "LIBRARY \`basnam ${D}dllFile\` ${D}library_flags" >> ${D}defFile dllFile="${D}{dllFile}.dll" if [ ! -z ${D}description ]; then echo "DESCRIPTION \\"${D}{description}\\"" >> ${D}defFile fi echo "EXPORTS" >> ${D}defFile doCommand "cat ${D}tmpdefFile | sort.exe | uniq.exe > ${D}{tmpdefFile}%" grep -v "^ *;" < ${D}{tmpdefFile}% | grep -v "^ *${D}" >${D}tmpdefFile # Checks if the export is ok or not. for word in ${D}exclude_symbols; do grep -v ${D}word < ${D}tmpdefFile >${D}{tmpdefFile}% mv ${D}{tmpdefFile}% ${D}tmpdefFile done if [ ${D}EXPORT_BY_ORDINALS -ne 0 ]; then sed "=" < ${D}tmpdefFile | \\ sed ' N : loop s/^\\([0-9]\\+\\)\\([^;]*\\)\\(;.*\\)\\?/\\2 @\\1 NONAME/ t loop ' > ${D}{tmpdefFile}% grep -v "^ *${D}" < ${D}{tmpdefFile}% > ${D}tmpdefFile else rm -f ${D}{tmpdefFile}% fi cat ${D}tmpdefFile >> ${D}defFile rm -f ${D}tmpdefFile # Do linking, create implib, and apply lxlite. gccCmdl=""; for file in ${D}inputFiles ; do case ${D}file in *!) ;; *) gccCmdl="${D}gccCmdl ${D}file" ;; esac done doCommand "${D}CC ${D}CFLAGS -Zdll -o ${D}dllFile ${D}defFile ${D}gccCmdl ${D}EXTRA_CFLAGS" touch "${D}{outFile}.dll" doCommand "emximp -o ${D}arcFile ${D}defFile" if [ ${D}flag_USE_LXLITE -ne 0 ]; then add_flags=""; if [ ${D}EXPORT_BY_ORDINALS -ne 0 ]; then add_flags="-ynd" fi doCommand "lxlite -cs -t: -mrn -mln ${D}add_flags ${D}dllFile" fi doCommand "emxomf -s -l ${D}arcFile" # Successful exit. CleanUp 1 exit 0 EOF chmod +x dllar.sh ;; powerpc-apple-macos* | \ *-*-freebsd* | *-*-openbsd* | *-*-netbsd* | *-*-k*bsd*-gnu | \ *-*-mirbsd* | \ *-*-sunos4* | \ *-*-osf* | \ *-*-dgux5* | \ *-*-sysv5* | \ *-pc-msdosdjgpp ) ;; *) as_fn_error $? "unknown system type $BAKEFILE_HOST." "$LINENO" 5 esac if test "x$PIC_FLAG" != "x" ; then PIC_FLAG="$PIC_FLAG -DPIC" fi if test "x$SHARED_LD_MODULE_CC" = "x" ; then SHARED_LD_MODULE_CC="$SHARED_LD_CC" fi if test "x$SHARED_LD_MODULE_CXX" = "x" ; then SHARED_LD_MODULE_CXX="$SHARED_LD_CXX" fi USE_SOVERSION=0 USE_SOVERLINUX=0 USE_SOVERSOLARIS=0 USE_SOVERCYGWIN=0 USE_SOTWOSYMLINKS=0 USE_MACVERSION=0 SONAME_FLAG= case "${BAKEFILE_HOST}" in *-*-linux* | *-*-freebsd* | *-*-openbsd* | *-*-netbsd* | \ *-*-k*bsd*-gnu | *-*-mirbsd* ) if test "x$SUNCXX" = "xyes"; then SONAME_FLAG="-h " else SONAME_FLAG="-Wl,-soname," fi USE_SOVERSION=1 USE_SOVERLINUX=1 USE_SOTWOSYMLINKS=1 ;; *-*-solaris2* ) SONAME_FLAG="-h " USE_SOVERSION=1 USE_SOVERSOLARIS=1 ;; *-*-darwin* ) USE_MACVERSION=1 USE_SOVERSION=1 USE_SOTWOSYMLINKS=1 ;; *-*-cygwin* ) USE_SOVERSION=1 USE_SOVERCYGWIN=1 ;; esac # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; bk_use_trackdeps="$enableval" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dependency tracking method" >&5 $as_echo_n "checking for dependency tracking method... " >&6; } BK_DEPS="" if test "x$bk_use_trackdeps" = "xno" ; then DEPS_TRACKING=0 { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 $as_echo "disabled" >&6; } else DEPS_TRACKING=1 if test "x$GCC" = "xyes"; then DEPSMODE=gcc case "${BAKEFILE_HOST}" in *-*-darwin* ) DEPSFLAG="-no-cpp-precomp -MMD" ;; * ) DEPSFLAG="-MMD" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: gcc" >&5 $as_echo "gcc" >&6; } elif test "x$MWCC" = "xyes"; then DEPSMODE=mwcc DEPSFLAG="-MM" { $as_echo "$as_me:${as_lineno-$LINENO}: result: mwcc" >&5 $as_echo "mwcc" >&6; } elif test "x$SUNCC" = "xyes"; then DEPSMODE=unixcc DEPSFLAG="-xM1" { $as_echo "$as_me:${as_lineno-$LINENO}: result: Sun cc" >&5 $as_echo "Sun cc" >&6; } elif test "x$SGICC" = "xyes"; then DEPSMODE=unixcc DEPSFLAG="-M" { $as_echo "$as_me:${as_lineno-$LINENO}: result: SGI cc" >&5 $as_echo "SGI cc" >&6; } elif test "x$HPCC" = "xyes"; then DEPSMODE=unixcc DEPSFLAG="+make" { $as_echo "$as_me:${as_lineno-$LINENO}: result: HP cc" >&5 $as_echo "HP cc" >&6; } elif test "x$COMPAQCC" = "xyes"; then DEPSMODE=gcc DEPSFLAG="-MD" { $as_echo "$as_me:${as_lineno-$LINENO}: result: Compaq cc" >&5 $as_echo "Compaq cc" >&6; } else DEPS_TRACKING=0 { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi if test $DEPS_TRACKING = 1 ; then D='$' cat <bk-deps #!/bin/sh # This script is part of Bakefile (http://www.bakefile.org) autoconf # script. It is used to track C/C++ files dependencies in portable way. # # Permission is given to use this file in any way. DEPSMODE=${DEPSMODE} DEPSFLAG="${DEPSFLAG}" DEPSDIRBASE=.deps if test ${D}DEPSMODE = gcc ; then ${D}* ${D}{DEPSFLAG} status=${D}? # determine location of created files: while test ${D}# -gt 0; do case "${D}1" in -o ) shift objfile=${D}1 ;; -* ) ;; * ) srcfile=${D}1 ;; esac shift done objfilebase=\`basename ${D}objfile\` builddir=\`dirname ${D}objfile\` depfile=\`basename ${D}srcfile | sed -e 's/\\..*${D}/.d/g'\` depobjname=\`echo ${D}depfile |sed -e 's/\\.d/.o/g'\` depsdir=${D}builddir/${D}DEPSDIRBASE mkdir -p ${D}depsdir # if the compiler failed, we're done: if test ${D}{status} != 0 ; then rm -f ${D}depfile exit ${D}{status} fi # move created file to the location we want it in: if test -f ${D}depfile ; then sed -e "s,${D}depobjname:,${D}objfile:,g" ${D}depfile >${D}{depsdir}/${D}{objfilebase}.d rm -f ${D}depfile else # "g++ -MMD -o fooobj.o foosrc.cpp" produces fooobj.d depfile=\`echo "${D}objfile" | sed -e 's/\\..*${D}/.d/g'\` if test ! -f ${D}depfile ; then # "cxx -MD -o fooobj.o foosrc.cpp" creates fooobj.o.d (Compaq C++) depfile="${D}objfile.d" fi if test -f ${D}depfile ; then sed -e "\\,^${D}objfile,!s,${D}depobjname:,${D}objfile:,g" ${D}depfile >${D}{depsdir}/${D}{objfilebase}.d rm -f ${D}depfile fi fi exit 0 elif test ${D}DEPSMODE = mwcc ; then ${D}* || exit ${D}? # Run mwcc again with -MM and redirect into the dep file we want # NOTE: We can't use shift here because we need ${D}* to be valid prevarg= for arg in ${D}* ; do if test "${D}prevarg" = "-o"; then objfile=${D}arg else case "${D}arg" in -* ) ;; * ) srcfile=${D}arg ;; esac fi prevarg="${D}arg" done objfilebase=\`basename ${D}objfile\` builddir=\`dirname ${D}objfile\` depsdir=${D}builddir/${D}DEPSDIRBASE mkdir -p ${D}depsdir ${D}* ${D}DEPSFLAG >${D}{depsdir}/${D}{objfilebase}.d exit 0 elif test ${D}DEPSMODE = unixcc; then ${D}* || exit ${D}? # Run compiler again with deps flag and redirect into the dep file. # It doesn't work if the '-o FILE' option is used, but without it the # dependency file will contain the wrong name for the object. So it is # removed from the command line, and the dep file is fixed with sed. cmd="" while test ${D}# -gt 0; do case "${D}1" in -o ) shift objfile=${D}1 ;; * ) eval arg${D}#=\\${D}1 cmd="${D}cmd \\${D}arg${D}#" ;; esac shift done objfilebase=\`basename ${D}objfile\` builddir=\`dirname ${D}objfile\` depsdir=${D}builddir/${D}DEPSDIRBASE mkdir -p ${D}depsdir eval "${D}cmd ${D}DEPSFLAG" | sed "s|.*:|${D}objfile:|" >${D}{depsdir}/${D}{objfilebase}.d exit 0 else ${D}* exit ${D}? fi EOF chmod +x bk-deps BK_DEPS="`pwd`/bk-deps" fi fi case ${BAKEFILE_HOST} in *-*-cygwin* | *-*-mingw32* ) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_WINDRES+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$WINDRES"; then ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_WINDRES="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi WINDRES=$ac_cv_prog_WINDRES if test -n "$WINDRES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WINDRES" >&5 $as_echo "$WINDRES" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_WINDRES"; then ac_ct_WINDRES=$WINDRES # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_WINDRES+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_WINDRES"; then ac_cv_prog_ac_ct_WINDRES="$ac_ct_WINDRES" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_WINDRES="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_WINDRES=$ac_cv_prog_ac_ct_WINDRES if test -n "$ac_ct_WINDRES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_WINDRES" >&5 $as_echo "$ac_ct_WINDRES" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_WINDRES" = x; then WINDRES="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac WINDRES=$ac_ct_WINDRES fi else WINDRES="$ac_cv_prog_WINDRES" fi ;; *-*-darwin* | powerpc-apple-macos* ) # Extract the first word of "Rez", so it can be a program name with args. set dummy Rez; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_REZ+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$REZ"; then ac_cv_prog_REZ="$REZ" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_REZ="Rez" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_REZ" && ac_cv_prog_REZ="/Developer/Tools/Rez" fi fi REZ=$ac_cv_prog_REZ if test -n "$REZ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $REZ" >&5 $as_echo "$REZ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "SetFile", so it can be a program name with args. set dummy SetFile; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_SETFILE+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$SETFILE"; then ac_cv_prog_SETFILE="$SETFILE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_SETFILE="SetFile" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_SETFILE" && ac_cv_prog_SETFILE="/Developer/Tools/SetFile" fi fi SETFILE=$ac_cv_prog_SETFILE if test -n "$SETFILE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5 $as_echo "$SETFILE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; esac BAKEFILE_BAKEFILE_M4_VERSION="0.2.9" BAKEFILE_AUTOCONF_INC_M4_VERSION="0.2.9" # Check whether --enable-precomp-headers was given. if test "${enable_precomp_headers+set}" = set; then : enableval=$enable_precomp_headers; bk_use_pch="$enableval" fi GCC_PCH=0 ICC_PCH=0 USE_PCH=0 BK_MAKE_PCH="" case ${BAKEFILE_HOST} in *-*-cygwin* ) bk_use_pch="no" ;; esac if test "x$bk_use_pch" = "x" -o "x$bk_use_pch" = "xyes" ; then if test "x$GCC" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler supports precompiled headers" >&5 $as_echo_n "checking if the compiler supports precompiled headers... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #if !defined(__GNUC__) || !defined(__GNUC_MINOR__) There is no PCH support #endif #if (__GNUC__ < 3) There is no PCH support #endif #if (__GNUC__ == 3) && \ ((!defined(__APPLE_CC__) && (__GNUC_MINOR__ < 4)) || \ ( defined(__APPLE_CC__) && (__GNUC_MINOR__ < 3))) || \ ( defined(__INTEL_COMPILER) ) There is no PCH support #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } GCC_PCH=1 else if test "$INTELCXX8" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ICC_PCH=1 if test "$INTELCXX10" = "yes"; then ICC_PCH_CREATE_SWITCH="-pch-create" ICC_PCH_USE_SWITCH="-pch-use" else ICC_PCH_CREATE_SWITCH="-create-pch" ICC_PCH_USE_SWITCH="-use-pch" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $GCC_PCH = 1 -o $ICC_PCH = 1 ; then USE_PCH=1 D='$' cat <bk-make-pch #!/bin/sh # This script is part of Bakefile (http://www.bakefile.org) autoconf # script. It is used to generated precompiled headers. # # Permission is given to use this file in any way. outfile="${D}{1}" header="${D}{2}" shift shift builddir=\`echo ${D}outfile | sed -e 's,/\\.pch/.*${D},,g'\` compiler="" headerfile="" while test ${D}{#} -gt 0; do add_to_cmdline=1 case "${D}{1}" in -I* ) incdir=\`echo ${D}{1} | sed -e 's/-I\\(.*\\)/\\1/g'\` if test "x${D}{headerfile}" = "x" -a -f "${D}{incdir}/${D}{header}" ; then headerfile="${D}{incdir}/${D}{header}" fi ;; -use-pch|-use_pch|-pch-use ) shift add_to_cmdline=0 ;; esac if test ${D}add_to_cmdline = 1 ; then compiler="${D}{compiler} ${D}{1}" fi shift done if test "x${D}{headerfile}" = "x" ; then echo "error: can't find header ${D}{header} in include paths" >&2 else if test -f ${D}{outfile} ; then rm -f ${D}{outfile} else mkdir -p \`dirname ${D}{outfile}\` fi depsfile="${D}{builddir}/.deps/\`echo ${D}{outfile} | tr '/.' '__'\`.d" mkdir -p ${D}{builddir}/.deps if test "x${GCC_PCH}" = "x1" ; then # can do this because gcc is >= 3.4: ${D}{compiler} -o ${D}{outfile} -MMD -MF "${D}{depsfile}" "${D}{headerfile}" elif test "x${ICC_PCH}" = "x1" ; then filename=pch_gen-${D}${D} file=${D}{filename}.c dfile=${D}{filename}.d cat > ${D}file < ${D}depsfile && \\ rm -f ${D}file ${D}dfile ${D}{filename}.o fi exit ${D}{?} fi EOF chmod +x bk-make-pch BK_MAKE_PCH="`pwd`/bk-make-pch" fi fi fi COND_DEPS_TRACKING_0="#" if test "x$DEPS_TRACKING" = "x0" ; then COND_DEPS_TRACKING_0="" fi COND_DEPS_TRACKING_1="#" if test "x$DEPS_TRACKING" = "x1" ; then COND_DEPS_TRACKING_1="" fi COND_FINAL_0="#" if test "x$FINAL" = "x0" ; then COND_FINAL_0="" fi COND_FINAL_1="#" if test "x$FINAL" = "x1" ; then COND_FINAL_1="" fi COND_GCC_PCH_1="#" if test "x$GCC_PCH" = "x1" ; then COND_GCC_PCH_1="" fi COND_ICC_PCH_1="#" if test "x$ICC_PCH" = "x1" ; then COND_ICC_PCH_1="" fi COND_PLATFORM_MACOSX_1="#" if test "x$PLATFORM_MACOSX" = "x1" ; then COND_PLATFORM_MACOSX_1="" fi COND_PLATFORM_MAC_0="#" if test "x$PLATFORM_MAC" = "x0" ; then COND_PLATFORM_MAC_0="" fi COND_PLATFORM_MAC_1="#" if test "x$PLATFORM_MAC" = "x1" ; then COND_PLATFORM_MAC_1="" fi COND_PLATFORM_OS2_1="#" if test "x$PLATFORM_OS2" = "x1" ; then COND_PLATFORM_OS2_1="" fi COND_PLATFORM_UNIX_1="#" if test "x$PLATFORM_UNIX" = "x1" ; then COND_PLATFORM_UNIX_1="" fi COND_PLATFORM_WIN32_1="#" if test "x$PLATFORM_WIN32" = "x1" ; then COND_PLATFORM_WIN32_1="" fi COND_STATICRTL_0="#" if test "x$STATICRTL" = "x0" ; then COND_STATICRTL_0="" fi COND_STATICRTL_1="#" if test "x$STATICRTL" = "x1" ; then COND_STATICRTL_1="" fi COND_UNICODE_1="#" if test "x$UNICODE" = "x1" ; then COND_UNICODE_1="" fi COND_USEDLL_1="#" if test "x$USEDLL" = "x1" ; then COND_USEDLL_1="" fi COND_USE_PCH_1="#" if test "x$USE_PCH" = "x1" ; then COND_USE_PCH_1="" fi if test "$BAKEFILE_AUTOCONF_INC_M4_VERSION" = "" ; then as_fn_error $? "No version found in autoconf_inc.m4 - bakefile macro was changed to take additional argument, perhaps configure.in wasn't updated (see the documentation)?" "$LINENO" 5 fi if test "$BAKEFILE_BAKEFILE_M4_VERSION" != "$BAKEFILE_AUTOCONF_INC_M4_VERSION" ; then as_fn_error $? "Versions of Bakefile used to generate makefiles ($BAKEFILE_AUTOCONF_INC_M4_VERSION) and configure ($BAKEFILE_BAKEFILE_M4_VERSION) do not match." "$LINENO" 5 fi if test $GCC_PCH = 1 ; then CPPFLAGS="$CPPFLAGS -DWX_PRECOMP" fi if test "x$prefix" != "xNONE"; then FR_PREFIX=$prefix else FR_PREFIX=$ac_default_prefix fi cat >>confdefs.h <<_ACEOF #define FR_INSTALL_PREFIX "$FR_PREFIX" _ACEOF WX_INCLUDES="" for opt in $WX_CPPFLAGS do case "$opt" in -I*) WX_INCLUDES="$WX_INCLUDES --include-dir `echo "$opt" | sed 's/^-I//'`" ;; esac done ac_config_headers="$ac_config_headers frconfig.h:frconfig.h.in" ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.67. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.67, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "frconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS frconfig.h:frconfig.h.in" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_t=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_t"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" } >"$tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi flamerobin_0.9.3~svn+2220.orig/configure.in000066400000000000000000000064671177057155300205310ustar00rootroot00000000000000AC_PREREQ(2.53) AC_INIT(aclocal.m4) AC_CANONICAL_SYSTEM AM_OPTIONS_WXCONFIG AC_PROG_CXX AC_ARG_ENABLE(debug, [ --enable-debug Enable debugging information], USE_DEBUG="$enableval", USE_DEBUG="no") if test $USE_DEBUG = yes ; then DEBUG=1 FINAL=0 dnl Bakefile doesn't touch {C,CPP,CXX,LD}FLAGS in autoconf format, we dnl have to do it ourselves. (Incorrectly) assuming GCC here: CFLAGS="$CFLAGS -g" else DEBUG=0 FINAL=1 fi # Check for wxWidgets AM_PATH_WXCONFIG([2.8.0], [], [ AC_MSG_ERROR([ wxWidgets must be installed on your system but wx-config script couldn't be found. Please check that wx-config is in path, the directory where wxWidgets libraries are installed (returned by 'wx-config --libs' command) is in LD_LIBRARY_PATH or equivalent variable and wxWidgets version is 2.8.0 or above. ])], [aui,stc,std]) AC_LANG_PUSH([C++]) # Check for Boost headers AC_ARG_WITH([boost-include-path], [AS_HELP_STRING([--with-boost-include-path], [Location of the Boost library headers (optional)])], [BOOSTINCLUDEPATH=$withval], []) AS_IF([test "x$BOOSTINCLUDEPATH" != "x"], [CPPFLAGS="$CPPFLAGS -I$BOOSTINCLUDEPATH"]) AC_CHECK_HEADER([boost/shared_ptr.hpp], [], [AC_MSG_ERROR([ boost/shared_ptr.hpp not found. Install libboost-dev Boost C++ Libraries development files. In Debian/Ubuntu 'sudo apt-get install libboost-dev' ])], []) AC_CHECK_HEADER([boost/function.hpp], [], [AC_MSG_ERROR([ boost/function.hpp not found. Install libboost-dev Boost C++ Libraries development files. In Debian/Ubuntu 'sudo apt-get install libboost-dev' ])], []) # Link to Firebird client library case "${host}" in *-*-cygwin* | *-*-mingw32* ) dnl Windows builds dynamically link to the Firebird client library ;; *-*-darwin* ) dnl Mac OS X uses the Firebird framework LIBS="$LIBS -framework Firebird" ;; * ) AC_SEARCH_LIBS([isc_attach_database], [fbclient fbembed], [], [AC_MSG_ERROR([ Firebird client library not found Install Firebird server development files. In Debian/Ubuntu 'sudo apt-get install firebird2.5-dev' ])]) esac CPPFLAGS="$CPPFLAGS $WX_CXXFLAGS" LDFLAGS="$LDFLAGS $WX_LDFLAGS $WX_LIBS" AC_BAKEFILE([m4_include(autoconf_inc.m4)]) if test $GCC_PCH = 1 ; then CPPFLAGS="$CPPFLAGS -DWX_PRECOMP" fi dnl ----------------------------------------------------------------------- dnl install prefix dnl ----------------------------------------------------------------------- if test "x$prefix" != "xNONE"; then FR_PREFIX=$prefix else FR_PREFIX=$ac_default_prefix fi AC_DEFINE_UNQUOTED(FR_INSTALL_PREFIX, "$FR_PREFIX") dnl ----------------------------------------------------------------------- dnl wxWidgets include directories to find wx.rc dnl ----------------------------------------------------------------------- WX_INCLUDES="" for opt in $WX_CPPFLAGS do case "$opt" in -I*) WX_INCLUDES="$WX_INCLUDES --include-dir `echo "$opt" | sed 's/^-I//'`" ;; esac done AC_SUBST(WX_INCLUDES) AC_CONFIG_HEADERS([ frconfig.h:frconfig.h.in ]) AC_CONFIG_FILES([ Makefile ]) AC_OUTPUT flamerobin_0.9.3~svn+2220.orig/devdocs/000077500000000000000000000000001177057155300176325ustar00rootroot00000000000000flamerobin_0.9.3~svn+2220.orig/devdocs/Creating_Linux_Packages.txt000066400000000000000000000022611177057155300251050ustar00rootroot00000000000000Linux .tar.bz2 packages are made by building the executable, stripping it and packing the directory with needed files. I usually hand-edit Makefile and change the paths, so that user can simply type: make install after unpacking it. Here are few things to remember (a simple reminder for me): 1. Change ginstall to install in Makefile I build packages on Slackware and it detects ginstall, which isn't available on most newer versions of other distributions. In fact, I think ginstall was from my old Mandrake 9.0. It doesn't matter where it came from, just to remove it. 2. Exclude TIFF library when building FlameRobin doesn't show any tiff images anyway, and many times it conflicts with libtiff versions of other distributions. I guess same could be done for gif and other stuff we don't use, so I'll just build a special version of wxWidgets, just for the purpose of FR release. Some other libs. may also have different versions, but wxWidgets has own version of those, so here's a configure line for wxWidgets: ./configure --disable-debug --disable-shared --enable-unicode \ --with-libjpeg=builtin --with-libtiff=builtin --with-expat=builtin \ --with-libpng=builtin --with-zlib=builtin flamerobin_0.9.3~svn+2220.orig/devdocs/Dev-Cpp_How_to_build.txt000066400000000000000000000052231177057155300243310ustar00rootroot00000000000000Building FlameRobin on Windows with Dev-C++ =========================================== This document is a collection of quick notes about building FlameRobin on Windows with Dev-C++. Dev-C++ is an integrated C++ development environment written in (and resembling, to some extent) Delphi. It uses the Mingw port of GCC as the compiler (and gdb as the debugger). Dev-C++ is free software; you can get it here: http://www.bloodshed.net/dev/ Make sure you get the latest version available. I have used version 4.9.9.0 which is basically a 5.0 beta (yet very stable) version. To build FlameRobin you have to check-out the flamerobin1 module from the projects's CVS tree, and get some tools apart from Dev-C++. You need to check-out and compile branch rel_2_3 of IBPP. IBPP is the database access layer on which FlameRobin is built, and is of course free software as well. You can view the sources here: http://cvs.sourceforge.net/viewcvs.py/ibpp/ibpp2/?only_with_tag=rel_2_3 Note that FlameRobin needs at least this version of IBPP. In case information is needed on how to compile IBPP with Dev-C++, you can contact me (nandod@dedonline.com); I can provide a Dev-C++ project or pre-built IBPP.a. Time for the GUI subsystem. FlameRobin needs at least version 2.4.2 of wxWidgets (http://www.wxwidgets.org) and the additional STC (StyledTextControl) component. All of this is open source. You can even get them pre-packaged for installation into Dev-C++ here: http://michel.weinachter.free.fr/ Please note you're going to need all the three packages (imagelib, wxWindows 2.4.2 and wxWindows 2.4.2-contrib). Refer to the Dev-C++ documentation for instruction on how to install the packages (which is a straightforward process anyway). Once all the pieces are in place, you just need to open flamerobin.dev in Dev-C++ and build it. You don't need to touch any IDE or compiler environment setting, but you might need to modify the project options (which translates to changes to the flamerobin.dev and makefile.win files) in case you don't have ibpp installed in the same path I have used (../../../CppLibs/IBPP/ibpp2/IBPP.a). You can change this in Dev-C++ through the Project Options dialog (pages Parameters/Linker and Directories/Include Directories). The same applies to the Directories/Resource Directories setting, which is hard-coded as "C:\Dev-Cpp\include". I am aware that this setup might not be optimal, but I stopped tweaking it when it started to work :-). I am a newbie with C++ myself and coming from a Delphi background (that's why I have used Dev-C++). Thus, suggestions for streamlining the build process or enhancement to the makefile are welcome. Nando Dessena nandod@dedonline.com flamerobin_0.9.3~svn+2220.orig/devdocs/Files_and_paths.txt000066400000000000000000000133131177057155300234570ustar00rootroot00000000000000FlameRobin: support & config file paths roundup Files needed by FR: - $conf - a config file (config.ini, to be renamed fr_settings.conf) - $db - a database connection definition file (servers.xml, to be renamed fr_databases.conf) - $templ - the html-templates directory - $confdef - the confdefs directory, containing the main config settings definition file (config_options.xml, to be renamed fr_settings.confdef) and possibly other confdef files for scoped (database-level, for example, to be named database_settings.confdef or DATABASE_settings.confdef) configuration (preferences) dialogs - $docfiles - the files docs/fr_manual.html, docs/fr_changes.html and docs/fr_license.html that are displayed from the main menu Locations: - $frhome - FR will find $templ, $confdef and $docfiles (which are immutable and integral part of the FR distribution) in its home path. The home path is returned by config()::getHomePath(), usually the application folder. Note: defining the environment variable FR_HOME will override this path. Note: passing -h on FR's command line will override this path and the environment variable as well. - $fruserhome - FR will find $conf and $db (which are user settings files) in its user home path. This path has to be writable and may be common to all users on the machine or different for each user. The user home path is config()::getUserHomePath(), and it defaults to wxStandardPaths::GetUserLocalDataDir(). Note: defining the environment variable FR_USER_HOME will override this path. Note: passing -uh on FR's command line will override this path and the environment variable as well. Additional note: the specification in the command line parameters -h and -uh, or the value of the environment variables FR_HOME and FR_USER_HOME may be "$app", which translates to wxStandardPaths::GetLocalDataDir(), or "$user", which translates to wxStandardPaths::GetUserLocalDataDir(). Otherwise, it has to be a path (without the trailing path delimiter). FR will only ever write to files in $fruserhome. If FR is configured so that these files are shared by several users, then no precaution is taken to avoid overwriting other users' changes. The installer will use the default settings and not allow customization, for the time being. Use: $conf contains all FR settings that are managed by a singleton instance of Config, which is a wrapper around one or more instances of wxFileConfig, and which also handles a set of hardwired defaults. A call to Config::getValue() will always yield a value, even if the config file is not found or the key doesn't exist (defaults apply). $db is managed internally by the DBH using custom XML-parsing code (as it is now), or possibly wxXmlDocument. The locations of $templ, $confdef and $docfiles are returned by functions in Config. This means that not all services that Config exposes are directly related to the config file(s). Scoping (might come later): Each config setting has a name (ex. NumberPrecision) and a value. The value is retrieved based on scoping rules: getValue("NumberPrecision", n) will search for a value to assign to n in the NumberPrecision config key. getValue("DATABASE_SomeDatabase/TABLE_SomeTable/NumberPrecision", n) will search in the following config keys: - DATABASE_SomeDatabase/TABLE_SomeTable/NumberPrecision - DATABASE_SomeDatabase/NumberPrecision - NumberPrecision getValue("DATABASE_SomeDatabase/TABLE_SomeTable/COLUMN_SomeColumn/NumberPrecision", n) will search in the following config keys: - DATABASE_SomeDatabase/TABLE_SomeTable/COLUMN_SomeColumn/NumberPrecision - DATABASE_SomeDatabase/TABLE_SomeTable/NumberPrecision - DATABASE_SomeDatabase/NumberPrecision - NumberPrecision The caller of getValue will retrieve the prefix by calling the getItemPath() member function of the relevant metadata item. A shortcut member function in MetadataItem will shorten the code; for example, assuming a Database db named "foo", this code: int numPrec = db.getConfigValue("NumberPrecision"); is equivalent to: config().GetValue(DATABASE_SomeDatabase/NumberPrecision", numPrec); Note: wxFileConfig will resolve the scoped setting names by using different [sections] in the pseudo-INI file, but that's not relevant to the users of FR's Config. Config might also split the settings in different files (one for each database) for better efficiency and manageability. The database rename issue: Tables, columns and other metadata objects don't get renamed very frequently, but since we allow to change the name of a database quite easily, if we use it as a path identifier then once you rename it you loose all config stuff about it (and the data stays there forever cluttering the config file. Even worse, if you later define a database with the same name then the old config applies...). I can see several solutions: a) when a database is renamed, do a search & replace over the whole config file. This might be heavy. b) don't use the database name but a "generator" instead. Store its value in the config file and use it to generate unique and invisible IDs for databases. This is light and should work well. c) store the config for each database in a separate file, then just rename the file when the database is renamed. This is going to require some tricky code in Config, and it has the potential to get messy(*) if we later want to define per-table, per-column, etc. config. (*) meaning we won't be treating all objects in the same fashion, but have special regards for Database instead. The preferred solution is c) for efficiency and manageability reasons, perhaps with a shot of b). Possible extensions: We might want to let the installers allow the user to choose whether to share the config files among all users of the machine or not, and generate different command lines as required. flamerobin_0.9.3~svn+2220.orig/devdocs/MSVC.NET_How_to_build.txt000066400000000000000000000037741177057155300243010ustar00rootroot00000000000000Building FlameRobin on Windows with Microsoft Visual C++ .NET ============================================================= Building FlameRobin with Visual C++ .NET (version 7.1) should be easy using the provided project and solution files. To build FlameRobin you have to use the downloaded sources or to check-out the latest source from projects's Subversion tree. Subversion repository is available at: https://svn.sourceforge.net/svnroot/flamerobin/trunk/flamerobin FlameRobin uses and needs the wxWidgets library. You will find wxWidgets at http://www.wxwidgets.org and you can download the source package of version 2.6.0 (any later version should do as well) if you follow the "Download" link in the sidebar. If you download the wxAll* packages (all ports combined into one) please make sure that you unzip them using the -a switch to unzip.exe to convert all files to DOS line endings on-the-fly. Visual Studio will complain if project or solution files have UNIX line endings. Should that happen to you, just close the projects and convert the line endings by opening and saving with a text editor. Open the included solution files $(WX)\build\msw\wx.sln and $(WX)\contrib\build\stc\stc.sln and build the same configuration (Debug/Release, Ansi/Unicode) of both. You have to define environment variable "WXWIN" for the FlameRobin project to find the necessary libraries. Adding them to your user environment works best. Be sure to select the same configuration for FlameRobin that you selected for wxWidgets, otherwise the linker will not find the needed libraries. Note for MSVC 2005 users: when you get a fatal error CVT1100 during linking of flamerobin, you should change the settings of the manifest tool. Go to the input and output section of the manifest tool within the configuration properties of the project's properties, and set Embed Manifest to No. If you have any questions about this, feel free to ask at our flamerobin-devel mailing list at sourceforge.net. Michael Hieke mghie@users.sourceforge.net flamerobin_0.9.3~svn+2220.orig/devdocs/MetadataItem_invalidation.txt000066400000000000000000000207761177057155300255070ustar00rootroot00000000000000Nando wrote: Hello, I would like to rationalize the way metadata items load their state from the database; currently YTable has loadColumns() and checkAndLockColumns(), YProcedure has loadParameters() and checkLoadParameters(), I myself have just added something similar (loadProperties()) to YException, etc. I was thinking of bringing all this under the umbrella of YxMetadataItem, with the following semantics: // invalidates everything the item has read from the database; // this means that next time a property is requested it will be // read anew from the database. // Some classes might support selective invalidation of portions // of data (e.g. "columns", or "indexes"), and that's what // propertySetName is for. By default, invaliate() invalidates // everything and calls notify(). void YxMetadataItem::invalidate(std::string propertySetName = ""); The item would keep one of more internal flags to account for what's invalidated and reload it on request. For a sample of the benefits of the approach, this code excerpt from database.cpp: if (t == ntTable || t == ntView) result = ((YxMetadataItemWithColumns *)object)->loadColumns(); else if (t == ntProcedure) result = ((YProcedure *)object)->checkAndLoadParameters(); else if (t == ntException) ((YException *)object)->loadProperties(true); else object->notify(); (to which I have just contributed the third branch, BTW) would become: object->invalidate(); Comments? Remarks? Better ideas? Milan replied: | I would like to rationalize the way metadata items load their state | from the database; currently YTable has loadColumns() and | checkAndLockColumns(), YProcedure has loadParameters() and | checkLoadParameters(), I myself have just added something similar | (loadProperties()) to YException, etc. | | I was thinking of bringing all this under the umbrella of | YxMetadataItem, with the following semantics: | | // invalidates everything the item has read from the database; [snip] Very good. I have thought that something like this will soon be needed anyway. | // By default, invaliate() invalidates | // everything and calls notify(). We would have to be careful about this so we don't enter the endless loop. I guess we can use the locking mechanism that is already there. | For a sample of the benefits of the approach, this code excerpt from | database.cpp: | | if (t == ntTable || t == ntView) | result = ((YxMetadataItemWithColumns *)object)->loadColumns(); | else if (t == ntProcedure) | result = ((YProcedure *)object)->checkAndLoadParameters(); | else if (t == ntException) | ((YException *)object)->loadProperties(true); | else | object->notify(); | | (to which I have just contributed the third branch, BTW) would become: | | object->invalidate(); Well, not really since for tables/view/procedures you only have to invalidate columns/parameters (exactly what you wrote about: selective invalidation). Anyway, I fully agree what you wrote. We can have a parameter to invalidate() which will specify what is invalidated. Some objects would consider it, others ignore. One more remark: table->invalidate(columns) doesn't have to call notify() since reloading of columns will do that anyway, so a locking mechanism should really be used. Nando replied: M> | For a sample of the benefits of the approach, this code excerpt from M> | database.cpp: M> | M> | if (t == ntTable || t == ntView) M> | result = ((YxMetadataItemWithColumns *)object)->loadColumns(); M> | else if (t == ntProcedure) M> | result = ((YProcedure *)object)->checkAndLoadParameters(); M> | else if (t == ntException) M> | ((YException *)object)->loadProperties(true); M> | else | object->>notify(); M> | M> | (to which I have just contributed the third branch, BTW) would become: M> | | object->>invalidate(); M> Well, not really since for tables/view/procedures you only have to M> invalidate columns/parameters (exactly what you wrote about: selective M> invalidation). aren't columns/parameters all that those objects hold anyway? Huh no, tables have also constraints, for example. This needs a bit more thought... Premise: the code above comes from database.cpp, and it runs when an executed SQL (mostly DDL) statement is parsed by YDatabase to see if any objects need refreshing. The problem is that only the metadata object itself knows ultimately what should be invalidated as a result of executing a SQL statement, so the solution is to let all metadata objects in turn have a peek at the statement and let each of them do whatever is needed to. IOW instead of letting the YDatabase govern everything, we use a cooperative network to achieve the same. This can be implemented at different degrees depending on the level of efficiency (did I say that? ) we want to achieve: a) the YDatabase hands the SQL statement off to each metadata object it holds in turn. Each metadata collection hands it to the items it contains (look, here's another reason for having concrete metadata collections!). This could be wasteful as potentially many items would need to parse the statement again and again. I said "could" because we might well be talking about millisecond-scale delays anyway. b) the YDatabase pre-parses the statement, finds the object kind and name (as it already does), locates the relevant metadata object and hands it the statement. This is slightly less flexible but probably faster. c) Note: in many cases the SQL statement itself comes from a metadata object from the beginning. In other cases the user typed it freely in the SQL window. If we didn't have to support the latter scenario then a simpler variant of option b would be enough and the YDatabase wouldn't even be involved at all. But we do have to support it, right? M> One more remark: table->invalidate(columns) doesn't have to call M> notify() since reloading of columns will do that anyway, so a locking M> mechanism should really be used. In perspective I would even like to make notify() protected, so that each object deals with this stuff on its own. You just call a setXXX() member function and it sees by itself what's to invalidate/lock/notify, etc. Milan replied: | M> Well, not really since for tables/view/procedures you only have to | M> invalidate columns/parameters (exactly what you wrote about: selective | M> invalidation). | | aren't columns/parameters all that those objects hold anyway? Huh | no, tables have also constraints, for example Yep, and tables views might also get some links to triggers too. | a) the YDatabase hands the SQL statement off to each metadata object | it holds in turn. Each metadata collection hands it to the items it | contains (look, here's another reason for having concrete metadata | collections!). This could be wasteful as potentially many items would | need to parse the statement again and again. I said "could" because we | might well be talking about millisecond-scale delays anyway. Not needed IMHO. | b) the YDatabase pre-parses the statement, finds the object kind and | name (as it already does), locates the relevant metadata object and | hands it the statement. This is slightly less flexible but probably | faster. I think this will do. Also, note that DROP statements should be handles by YDatabase, so if it is going to parse the string anyway, we can use it for other things too. | c) Maybe the same as b) but send the parsed pieces too? Although I haven't got the idea how to do that cleanly. | Note: in many cases the SQL statement itself comes from a metadata | object from the beginning. In other cases the user typed it freely in | the SQL window. If we didn't have to support the latter scenario then | a simpler variant of option b would be enough and the YDatabase | wouldn't even be involved at all. But we do have to support it, right? It's a must. User could always type some ALTER (or some other) statement that we don't provide via GUI, and object should refresh. Also, this way we can centralize all DDL processing, and make logging stuff easy. It also let's various program parts just dump SQL into ExecuteSqlFrame and don't "think" about it. | M> One more remark: table->invalidate(columns) doesn't have to call | M> notify() since reloading of columns will do that anyway, so a locking | M> mechanism should really be used. | | In perspective I would even like to make notify() protected, so that | each object deals with this stuff on its own. You just call a setXXX() | member function and it sees by itself what's to | invalidate/lock/notify, etc. Maybe not a bad idea. I can't foresee how will it work in practice though. I guess we will have to test and see. flamerobin_0.9.3~svn+2220.orig/devdocs/license_boilerplate.txt000066400000000000000000000020711177057155300243770ustar00rootroot00000000000000Copyright (c) 2004-2008 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. flamerobin_0.9.3~svn+2220.orig/docs-src/000077500000000000000000000000001177057155300177205ustar00rootroot00000000000000flamerobin_0.9.3~svn+2220.orig/docs-src/fr_license.txt000066400000000000000000000024021177057155300225700ustar00rootroot00000000000000Copyright (c) 2004-2008 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. This is a BSD-style Expat license. You may obtain a copy of the License at: http://www.flamerobin.org/license.html The original Expat license is available from: http://www.jclark.com/xml/copying.txt flamerobin_0.9.3~svn+2220.orig/docs-src/fr_manual.xml000066400000000000000000001757021177057155300224220ustar00rootroot00000000000000
<application>FlameRobin</application> Manual Nando Dessena Milan Babuskov
About this manual We try to keep all the features in FlameRobin usable in an intuitive manner. However, there are things that you still need to know if you want to grasp the full power of the application, and this manual contains details about them. In this document, you will find an overview of the features, a description of all configuration parameters and advanced installation and customization notes.
About the ALPHA test program Lots of people have been using FlameRobin in day-to-day work for a long time now. Yet, we still consider the software in ALPHA state until it reaches feature-completeness, which will come with release 1.0. FlameRobin is very near to that state. Meanwhile, we thank you for evaluating and using this software and encourage you to send comments, bug reports and feature requests back to us so we can make it a better product.
What FlameRobin is FlameRobin is a GUI administration and data manipulation tool for Firebird databases. It is designed to be small, simple and cross-platform, yet offer all the basic features needed to administer Firebird servers and create/maintain databases. FlameRobin is Open Source software and binaries are currently available for Windows, several GNU/Linux and BSD flavours and MacOS X. Ports to other platforms are possible, subject to the availability of maintainers for those platforms.
What FlameRobin is NOT FlameRobin is not a full-featured administration tool with lots of bells and whistles, as there are plenty available for Firebird from several different parties. Our first goal with FlameRobin is to provide people not used to the command line with a GUI tool to get started with Firebird. Our longer-term goal is to develop a richer tool mainly for the Linux platform; while there are several rich and mature GUI tools under Windows, some of them available for free or for a modest price, there isn't any for Linux. Another goal of the project is for a "lite" edition of FlameRobin to be bundled with the Firebird server to serve as a starting kit for new users. This bundle may be distributed by the Firebird Project itself or by some third party.
Who we are The home page of the FlameRobin project is located at http://www.flamerobin.org. The project itself is hosted on SourceForge. Please use our mailing list (flamerobin-devel) to contact the developers. Details and archives available here. You are also encouraged to use our bugs and feature requests trackers to report back to us the results of your alpha testing. If you are a developer interested in joining the FlameRobin project, let us know. We always welcome contributors.
License FlameRobin is released under the Expat License. You can find the complete license text in the file fr_license.html, or here.
What's new? Please refer to fr_whatsnew.html for a detailed history of all the changes since the previous release.
Installation If you want to build FlameRobin from sources, please find instructions on our web site or Subversion repository. In this section we talk about installing the pre-built version of FlameRobin under all currently supported platforms.
General information If you have installed a previous ALPHA version of FlameRobin which is less than 0.4.0, it is recommended that you remove it before installing this version. You won't be able to keep a config.ini file from an earlier version, because the name and file format have changed in version 0.4.0. You might be able to keep your servers.xml file, provided that you rename it to fr_databases.conf and move it to your data folder. FlameRobin will tell you the exact path of this file (which changes with the platform) upon first startup, when it cannot find the file. Here are the files used by FlameRobin to store configuration information: fr_databases.conf is the list of Firebird servers and databases you work with; FlameRobin will create it (and automatically add the "localhost" server) when you run it for the first time; then you can register new servers and databases. fr_settings.conf stores FlameRobin's configuration information, like the position and size of the main program window. You don't need to edit it by hand. The location of these files changes with the platform, and it's usually a directory owned by the current user. FlameRobin needs write access to that folder.
Windows (Win32) To install FlameRobin under Windows you need the Firebird client (gds32.dll for Firebird 1.0, fbclient.dll for Firebird 1.5 and up) installed and available, then just run the automatic installer of FlameRobin which will copy all required files in a directory of your choice and optionally create desktop and start menu shortcuts. If you need to uninstall FlameRobin you can do so from the start menu icon (unless you told the installation program not to create one) or from the Control Panel.
Linux While some Linux distributions might provide installation packages suitable for specific versions of that distribuion, FlameRobin project provides generic compressed archives containing the executable and all needed files. There are two flavors, depending of your preferences. You can use Gtk1 version, which runs faster and has less dependencies. It is suitable for slower computers and should run out-of-the-box on most distributions. Gtk2 version uses Gtk2 toolkit, so it looks nicer on the screen and it also has Unicode support. To install FlameRobin, just unpack the chosen .tar.bz2 archive, cd into that directory and type "make install" as root. This will install FlameRobin and all the needed files to appropriate locations. After that, any user can type "flamerobin" to run the program.
MacOS X Installation on Mac OS X is an absolute no-brainer: just drag the icon from the installation package to the folder you want the application to live in. Unpacking is handled via double clicking the downloaded file.
Getting started / basic features Upon first startup, FlameRobin will show a "Home" tree containing only the local server (localhost), and will invite you to create new servers and databases as required. You'll also see a menu bar at the top of the window, and a search bar and status bar at the bottom. Here is a brief how-to for getting started with FlameRobin.
Adding a server You can add a server by right-clicking on "Home" and choosing "Register server..." (alternatively, use the "Register server..." command from the "Server" menu). You will have to specify a display name and optionally the host name and TCP port number on which the Firebird server listens. Leave the display name empty to have FlameRobin build one automatically from the host name and port values (if you don't have a host name, because yours is a local or embedded Firebird server, you will be required to type in a display name manually). Once you have added a server, you can register databases under its node.
Adding an existing database To access an existing database from FlameRobin you have to register it. Registration will make FlameRobin remember the database connection properties so you don't have to re-enter them every time. Locate the correct server in the tree, right click it and choose "Register existing database...". You will have to enter a display name, type in or locate (or drag and drop) the database path (or alias name), the user name and password. If you don't specify the password, FlameRobin will prompt for it every time you try to connect to the database, which is the most secure option. If you want to specify the password, you can have FlameRobin optionally encrypt it in the configuration file. You can also optionally specify a connection charset and role.
Creating a new database To create a new, empty database, locate the desired server in the tree, right click it and choose "Create new database...". You will then need to input the database file or alias name, the user name and password for the owner of the new database (use SYSDBA as the user name and masterkey if you don't know what to put in these fields), the character set, the role, the page size (the default value of 4096 is just fine) and the SQL dialect (leave it set at 3 if you don't know what a SQL dialect is). The new database will be created and registered (which means it is available in FlameRobin). You can also drop an existing registered database, optionally keeping the FlameRobin registration information. Use the "Drop" menu command to do that.
Connecting to a registered database Just double click on the database name in the tree, or right click it and choose "Connect" or "Connect as...". Choose "Disconnect" to close the connection to the database. This causes the load of essential metadata information. FlameRobin tries to play well with slow network connections by delaying metadata retrieval as much as possible, yet connecting to a database still needs some data transfer beyond the connection itself.
Browsing metadata Upon connection, the sub-tree under the database name is populated with a description of the database structure (metadata). Browse the tree to explore the metadata. You can also use the quick search feature to locate a particular object in the tree. Just type the name of the object you are looking for (use the "*" wildcard character for a partial match) in the search box at the bottom of FlameRobin's main window and the first object in the tree whose name matches your search string will be highlighted. Now you can hit Enter to focus the tree and add the object name (or search string) to the search box's drop-down list. For your convenience, FlameRobin will remember your search strings for further use. Click the arrow buttons next to the search box to move to the next and previous matches. There is also an advanced metadata search feature, which is described later.
Editing objects You can view and/or change the properties of every object you see in the tree by choosing the "Properties..." option from the object's context menu or from the "Object" menu. Please note that currently not all object types are supported in full (domain editing, for example, is very basic ATM), but you'll find some level of support for all of them. The property page is a HTML window with a summary of the object's properties and links which open other pages or specific editors. Some of the options are not yet available, but you can edit almost all aspects of the most common objects (tables, views, stored procedures, and so on). Please have a look at fr_whatsnew.html to see, well, what's new. Although we try to test the features as much as we can, this is ALPHA software and you should only use it to work on backup copies of your databases, or perform backup copies before using FlameRobin on them. Having said that, we have to add that many users (including us) have been using FlameRobin in their everyday Firebird development for several years now without major problems.
Browsing and editing data After connecting to a database, locate a table, view or selectable stored procedure of your interest in the tree and right-click it. Choosing either "Select ... from ..." option will open the SQL editor with the table/view data shown in the grid at the bottom. In the case of selectable stored procedures with parameters, just the select statement appears in the SQL editor, so you should fill the parameter values (if you have any) and click the Execute button to see the data. FlameRobin's data grid fetches data from the server in small chunks, so that you don't have to wait for the fetch to complete if you only look at the first few pages of rows. You can have the grid fetch all data (in background) through the Fetch all records command in the grid's context menu (there is also a configuration option to make complete fetching the default behaviour, something we usually don't recommend). Fetching a very large result set might take some time, so if you change your mind you can use the Stop fetching all records command. Once you have some data in the grid, you can re-sort the data by double clicking on column headers. You can change the data through direct editing in the grid, add new records by means of the Insert button (which opens a specialized dialog box) and delete the currently selected record(s) by clicking the Delete button. Confirm any changes by clicking the Commit button, or cancel them through the Rollback button. Deleted records are still displayed (on a red background color) until you commit, just in case you change your mind. Emptying a cell that displays a string field will set the field's value to ''; if you want to set it to null, then delete all contents and then hit the DEL key once more. You can type the strings "NOW", "DATE", "TODAY", "TOMORROW", "YESTERDAY" in cells of type date or timestamp, and the strings "NOW" and "TIME" in cells of type time. They will be translated by FlameRobin to their respective meanings. FlameRobin handles all interactive edit operations by generating corresponding SQL statements. By default they are all logged in the history, but you can turn logging off for an instance of the SQL editor through the History/Enable logging menu command. You can also to turn logging off globally or for a particular database, through the preferences.
Running SQL statements and scripts Of course you can use the SQL editor window to create and execute arbitrary SQL statements. FlameRobin provides a rather advanced and sophisticated, yet simple to use SQL editor. You can open a SQL editor window by right clicking on a database node and choosing "Run a query". The SQL editor tool offers script execution capabilities (including SET AUTODDL and SET TERM support), load/save buttons, auto-completion and call-tip features, commit/rollback, detailed execution statistics (including but not limited to the query PLAN and the number of records inserted, deleted, updated in each affected table), a data export tool and more. To execute a script (meaning a sequence of more than one SQL statements), just load it (or drag and drop a file, or type it in) and run it. To execute a single statement when more statements are present in the editor, select it before clicking the Run button. You can use the drop-down menus or the context menu in the SQL editor as well as the buttons. Auto-completion can be invoked automatically or manually (see the rich set of configuration options about it), and supports table and column names, procedure and function parameters, and so on. To activate the data export tool, right click on the data grid. The data export tool is currently able to copy the data to the clipboard, generate SQL INSERT or UPDATE statements or export the data to a HTML or CSV file. All options work on the whole grid contents or just the selected parts. You can also multiple-select several different grid "islands" and have the tool export them. This is particularly handy to generate customized INSERT or UPDATE statements. For SELECT statements, you can also drag and drop objects from the tree view to visually build queries (provided the appropriate configuration option is enabled). Dragging and dropping tables will automatically create JOIN conditions (based on existing foreign key definitions) in the statement you are building. FlameRobin will try to let you edit whatever result set your SELECT statement returns, or part of it. Fields that you cannot edit will be displayed in a special background colour in the grid.
Backup and restore You can perform a database backup by right clicking on a database and choosing "Backup database...". Choose "Restore database..." to restore a backup file over the current database (you will have to disconnect first). Choose "Restore backup into new database..." (this time on the server node) to create a new database from a backup file. You can drag and drop files in these windows. It is considered bad practice to restore a backup file over an existing database. The Backup and Restore tools work in background, so you are allowed to continue working with FlameRobin while they proceed. You can work on a database while it is being backed up, but you can't work on a database while you are restoring it.
Advanced features This section illustrates features in FlameRobin that you won't likely use every day, but often enough to make them useful to know.
DDL extraction You can generate DDL (Data Definition Language) creation scripts for any object you have in the database, or even for the whole database. Just open the DDL subpage of an object's property page to see the DDL code that creates the object. Extracting DDL scripts is useful if you want to replicate an object's structure in a different database, or create a slightly different object in the same database. A shortcut command for extracting the entire database metadata is available in the Advanced submenu of the database's context menu.
Alter View functionality Firebird doesn't have an ALTER VIEW DDL command, which means that if you want to modify a view definition you need to DROP and CREATE it back. But dropping an object in Firebird requires dropping all objects that depend on it, and so on recursively. Doing this by hand is very hard, especially if the database structure is complex. A unique feature in FlameRobin, which you activate by righ-clicking a View object and selecting the "Alter..." menu command (or selecting the "Alter..." command from the "Object" menu after selecting a View), will generate a script that drops all the objects that depend on the view (in the correct order), drops and recreates the view, then recreates all the objects (again, in the correct order). The script is pasted into the SQL editor window so you can modify the view definition and recreate everything with a single click.
Creating a selectable stored procedure for a table This feature, that you can use through the Create selectable procedure command in each table's context menu (or the namesake item in the Object menu), will open the SQL Editor on a CREATE PROCEDURE statement; the procedure fetches and returns all records in the table, and has an output parameter for each column. Since this is a pretty common pattern, it is intended to be modified to suit your needs rather than used as-is.
Connected users Select "Show connected users" at the database level (or in the "Database" menu) to see a list of users connected to that database. This only works reliably with the SuperServer variant of Firebird. If you are using Firebird Classic you will see at most one user connection there, which is yours.
Event monitoring FlameRobin allows you to listen for Firebird events interactively. Just select the "Monitor events" command at the database level (or in the "Database" menu) to open the Event Monitor window (you will need to connect to the database first). This window allows you to monitor one or more events, save the received events to a text file and load them back. Events are posted from the database when the POST_EVENT statement is called (and the transaction is committed).
User management Current versions of Firebird use a central server-wide user repository. FlameRobin allows you to add, modify and delete user accounts (but it will not allow you to delete the SYSDBA predefined user) by means of the "Manage users..." option in the Server menu (or the server's context menu item, or the Object menu item with the same caption). It is Firebird's security policy that you need to be SYSDBA to use this feature. The proper way to change the SYSDBA password on LInux is to run the changeDBAPassword.sh script in Firebird's bin directory. Otherwise Firebird's startup and shutdown scripts won't be updated.
Grant and revoke privileges Every object in the database has a list of privileges that identify the users and roles that can work with that object. On an object's property page (in the "Privileges" subpage) you can view the privleges associated with that object, and if you hover the mouse over icons, you can see who granted them in the status bar. Clicking on the "Grant and revoke privileges" link will open a dialog box that will help granting and revoke privileges to that object (which you'll find pre-selected in the dialog box) and/or other objects as well. The dialog box allows you to build a list of grant/revoke SQL statements by clicking on appropriate controls and then on the "Add To List" button. When satisfied, click the "Execute All" button to run all the statements in the SQL editor (which will also log them for future use, as with any SQL statement executed in FlameRobin, if logging is enabled).
Server and client version Select "Retrieve server version" from the "Server" menu (or from a server's context menu) to see a dialog box with the server's version string. A server's version string reveals the exact build number of your Firebird server and the platform it is running on. For example, a version string equal to "WI-V1.5.2.4731 Firebird 1.5" means Firebird 1.5.2, build 4731, on Windows. Currently FlameRobin doesn't show the version string of the Firebird client it is using, for these reasons: Not all versions of Firebird support this feature, and FlameRobin needs to stay compatible with all Firebird versions. At some point in the future FlameRobin will be able to load different client libraries for different databases (at least on platforms that support it). We will probably add the client version display feature then. You can also look at the version string of the Firebird client FlameRobin is using, in the About box (Help/About).
Advanced metadata search This feature, which you can fire through the lens button in FleameRobin's main window, allows you to perform more advanced search operations in your database's metadata (or in more databases at the same time). You can search with wildcards, search on object names and descriptions, in the DDL definition (which includes the source code for triggers and stored procedures), and do other, more specialized, search operations. Just add all criteria you need through the Add buttons, and then click the Start search button. The criteria will be concatenated with an "and" boolean operator, that is all of them must be satisfied for an object to be included in the SEARCH RESULTS pane. This feature is provided on an experimental basis, as we're currently looking for suggestions about how to improve both the user interface and the capabilities. We already have some ideas that will radically change the appearance of this dialog box, but we thought users might want to try it out so they can give us some good tips.
Logging The SQL Editor can log all executed statements to a text file, a set of text files or a database table. This gives you the ability to work visually and produce scripts to easily replicate sequences of operations on other databases. For database logging, in a future release, FlameRobin will also provide a visual interface to the log table, so that you can view a list of modifications to an object. Look here for the options you use to configure this feature globally, and here for database-level logging options.
Test data generator FlameRobin includes a test data generator which you can use to create test databases with dummy data values. You can launch it through the Database/Advanced/Test data generator. In the resulting dialog box you can select the tables for which you want to generate data, how many records you want to generate for each table, and the data generation strategy on a per-colum basis. Among the available strategies you'll find sequential values, random values, values taken from other columns, values loaded from external files, and a customizable NULL ratio. Your settings can be saved to an XML file and reloaded later. When you're ready, hit Generate data and the database will be filled with test data.
Configuration This section documents the options you can set to tune FlameRobin's behaviour to your liking. You can set the options by means of the Preferences dialog, which is invoked through the "Preferences..." command in the "View" menu. The Preferences are organized in categories; here is a description of each category. Please read the tooltip that appears when you move the mouse cursor over each option to know more about it. Since new options are added to FlameRobin daily, this section of the documentation will likely be out-of-date. Please refer to the tooltips for fresh descriptions of all the available options.
General Here you can find options to tune the visual appearance and behaviour of FlameRobin. You can choose whether FlameRobin will remember the size and position of opened windows between sessions or not, whether FlameRobin will ask for quit confirmation or not, and other such things.
Center dialogs on their parent window Set this option to always have dialogs displayed at the center of their parent window. Otherwise dialogs are displayed at a system-defined position.
Remember window positions and sizes If you enable this option, FlameRobin will remember the position and size of each window you open and will open the same window at the same position and with the same time the next time. You can also choose the granularity of this option for property pages and backup/restore dialogs: Choose "Same settings for all objects" to store a single set of values; this means that whenever an Object Properties dialog is opened it will have the position and size of the last Object Properties dialog used. Select "Same settings for all objects of same type" to store a set of values for each object type. This means that a Table Properties dialog will have different settings than a Trigger Properties dialog, but two Table Properties dialog will share the same set of values. The third option, "Separate settings for individual objects", will make it so that every object's property page will have a set of options of its own. This mode is the most flexible, but consumes more disk space and memory.
Main Tree View Here you can tune the appearance and behaviour of FlameRobin's metadata navigation tool, the main tree.
Order server entries alphabetically Set this option to have your servers displayed in alphabetical order, otherwise they are displayed in the order they appear in servers.xml.
Order database entries alphabetically Set this option to have your databases displayed in alphabetical order, otherwise they are displayed in the order they appear in servers.xml.
Show columns and parameters in tree Enable this option to have table/view columns and procedure parameters displayed as tree nodes; otherwise, the tree stops at the table/view or procedure level. In case you choose to have columns and parameters displayed as tree nodes, you can also indicate whether you wish that a double click on a table/view or procedure node opens the relevant property page or expands the subtree.
When table, view or stored procedure is activated Here you choose what should happen when you double click on a table, view or stored procedure node in the tree. Available options include opening the property page, show columns as sub-nodes of the selected node or select from the table, view or stored procedure to see the data.
Show system tables in tree The metadata for a Firebird database is stored in the database itself, in a set of tables whose names start with RDB$, called the system tables. There is usually no point in working with Firebird's system tables directly, as FlameRobin already queries them and translates the information in friendlier form for you: the tree view, object property pages and various dialogs all display information coming from the system tables. FlameRobin also allows to change the database metadata in a safe way (that is, keeping the database structure's integrity), something which is not guaranteed if you try to edit the system tables directly. For the rare cases in which a direct look at the system tables is required, and you know exactly where and how to look, you can enable this option, which will add all system tables for a database to the tree. This will impose a slight performance penalty upon connection. You can override this setting at the database level.
Allow drag and drop query building The SQL editor allows you to drag and drop objects from the tree view to visually build queries (see the relevant section). This feature may occasionally hang FlameRobin on Linux, so we are proving this option to switch it off until the problem is corrected in the wxWidgets library. Plus, you might want to disable the feature, if you don't use it, in order to avoid spurious start-drag operations when working with the mouse on the tree view.
SQL Editor Use these options to customize the behaviour of the SQL Editor, which is used in FlameRobin to execute any kind of system-generated or user-supplied query.
Automatically commit DDL statements Enable this option to have FlameRobin automatically "click" the Commit button on your part each time it detects a DDL (Data Definition Language) statements. DDL statements are those that modify the database structure (as opposed to DML, or Data Manipulation Language statements, which modify the data). Firebird does support transactional DDL, yet it is common practice to auto-commit these statements to avoid unexpected behaviours (for example, adding a column to an existing table and populate it through an UPDATE statement in the same transaction can lead to unexpected results with current versions of Firebird). This option sets a default state that you can change with the script commands SET AUTODDL ON and SET AUTODDL OFF.
When text is selected in editor Leave this option to "Execute the entire buffer" if you don't want to take advantage of FlameRobin's advanced selection handling. If you set it to "Execute only the selection" you will be able to type (or load) entire scripts in the SQL editor and only execute single parts of them by selecting them and clicking the "Execute" button. If you don't select anything, FlameRobin will execute the whole text in the editor.
Treat selected text as a single statement If you only ever select a single statement at a time, then you can save FlameRobin's parser some work by enabling this option. When you disable it, instead, FlameRobin will parse the selected text before executing it, break it into several statements if necessary and send them to Firebird one at a time; this is necessary since Firebird does not support executing more than one statement (i.e. a script) at a time. It can also be used if you have CREATE PROCEDURE or CREATE TRIGGER (or similar) statements with SET TERM. This way, you can select and execute the CREATE statement, and you don't need SET TERM at all.
Clear the messages when executing new statements The SQL Editor has a message pane that shows information about each executed statement. By default this pane is cleared automatically only when you end transaction. Set this option to have FlameRobin clear it before executing a statement.
Display detailed query statistics Enable this option to have the SQL Editor show detailed statistic information for each query, in addition to the query PLAN. This includes number of fetches, marks, reads, writes; number of inserts, updates, deletes; number of indexed vs sequential reads; delta memory; execution time.
Enable call-tips for procedures and functions When this option is enabled, then each time you type an open round bracket after a stored procedure or UDF name in the SQL Editor, a floating tooltip (called a call-tip) will appear reminding you what the input and output parameters of the stored procedure or UDF are.
Show long line marker Activate this option to have the editor display a vertical line that visually marks the place where a line break would occur if lines couldn't be longer than a certain amount of characters. The marker is only a visual indicator, as FlameRobin will not enforce any limit to the length of text lines. You can also customize the column at which the marker will appear.
Tab size Here you can set the number of space characters the SQL Editor will render for each TAB.
Code Completion This page contains options to customize FlameRobin's code completion feature.
Enable automatic invocation of completion list This is the general switch to turn automatic code completion in the SQL Editor on or off. Disable it if you don't like code completion windows that pop up while you write SQL code. If you keep it enabled, then you can set a certain number of characters you'll have to type before code completion kicks in, and choose to disable code completion when a call-tip is displayed (as it would close the call-tip window) or inside quoted text.
Manually invoke completion list on Code completion may also be invoked manually. Here you select how (Ctrl+Space or Tab key).
Confirm completion with Enter Set this option to have the currently selected item in the code completion window copied to the text buffer when you hit Enter. Otherwise you can use the Tab key for that.
Load columns when required for completion FlameRobin only loads column definition data when requested to do so (for example, when you double click a table name in the tree view). Set this option to let FlameRobin load missing column information automatically when needed to show an auto-complete list.
Statement History FlameRobin can remember the statements you execute and allow you to retrieve and re-execute past statements. This page allows you to customize the feature.
Share SQL statement history You can have a single statement history list for all the databases you work with ("Between all databases") or a separate history list for each of them ("Don't share"). Additionally, you can make it so that all databases with the same display name (typically copies of the same database, or databases with the same structures, on different servers) share a history list.
Limit history item size By default, each history list item is allowed to grow without bounds. If you are concerned about the size of your statement history lists, you can set an upper limit in Kilobytes for each statement in the history list. Statements bigger than the specified amount will not be added to the history list. This is useful if you execute entire database-creation scripts often.
Remember unsuccessfully executed buffers By default, only statements that are executed without errors are added to the history list. Set this option to have FlameRobin remember also statements that caused errors.
Remember statements generated by FlameRobin FlameRobin translates as much visual operations as possible to SQL statements. Uncheck this option to prevent this kind of statements from being added to the history lists.
Data Grid When you issue a SQL SELECT statement in the SQL Editor, then the Data Grid comes into play to show the results. Here you customize its appearance and behaviour.
Date format Choose the format you'd like for showing date and timestamp values in the grid.
Time format Choose the format you'd like for showing time and timestamp values in the grid.
Grid header font Choose a character font for the grid header (the column names).
Grid cell font Choose a character font for the grid cells (the data).
Re-format float and double precision numbers If unchecked, decimal numbers are displayed as returned from server; otherwise, they are formatted according to the specified number of decimal digits.
Maximize data grid after execution of SELECT statement Here you can turn off an useful feature that will enlarge the data grid to the maximum available size when a SQL SELECT statement returns more than a specified number of rows.
Automatically fetch all records in result set Makes it so the grid will automatically fetch all records whenever a SELECT statement is executed, instead of doing it in batches.
Show BLOB data in the grid Check this option if you want to see data fetched from BLOB fields in the grid. By default FlameRobin doesn't fetch BLOBs. You can also set a threshold, thus telling FlameRobin to fetch at most a specified amount of data for each BLOB. This allows you to see the first part of every BLOB field automatically without risking to download huge amounts of data for no gain. Check the "Show data for binary BLOBs" if you want the above settings applied to binary BLOBs as well (by default they are applied to text BLOBs only).
Property Pages This section contains customization options for FlameRobin-s property pages.
Show default column values Set this option to display the "Default" column in a table's property page.
Show column descriptions Set this option to display the "Description" column in a table's property page.
Sql Statement generation This page offers options to customize the way FlameRobin generated SQL code, deals with object names in general, and quoted identifiers in particular. If you don't know how quoted identifiers work in Firebird, you should leave the relevant settings to their default values.
Use UPPER CASE keywords Uncheck this option if you prefer FlameRobin to use lowercase keywords in generated SQL code.
Quote names only when needed Uncheck this option to have FlameRobin always quote object names with " in dialect 3 databases. Leave it checked to let FlameRobin detect on its own when it is needed to quote identifiers. The setting "Quote names in mixed case" is only used for names entered by the user (for example, when you add a new field to a table, you type in its name). If "Quote names only when needed" is checked and "Quote names in mixed case" is not, FlameRobin will leave the name entered by the user as it is, even if it is written in mixed case (unless the name is a reserved word or contains non-ASCII characters, in which case it is quoted). Here are two use cases to better explain how these settings interact with each other:Case 1: "Quote names only when needed" = on; "Quote names in mixed case" = off User enters Turns into FIELD1 FIELD1 Field1 Field1 Date "Date"
Case 2: "Quote names only when needed" = on; "Quote names in mixed case" = on User enters Turns into FIELD1 FIELD1 Field1 "Field1" Date "Date"
The rationale behind all this is that if you write a name in mixed case, then you probably want it quoted (since you bothered to mix the case). Some users, however, find this rule awkward and unpredictable, and need a way to disable it.
Treat quote characters like other characters This setting determines what happens if you type the quote character (") as a part of some name. Again, it only affects user-entered names. One option (unchecked) is to ignore it, other is to treat it like any other character (checked). Quotes are special cases, since they need to be escaped (by doubling them). When this setting is off, user can force quoting even when it is not required, by writing the name quoted in the text box.
Fields Here you can customize the appearance of field types in the tree and property windows.
When a column has a user-defined domain In this case you can choose to see after the column name the domain name, the data type, or both.
When a table column is computed For computed columns, you can choose to see after the name the data type or the computation expression, or both.
Logging The SQL Editor can log all executed statements to a text file, a set of text files or a database table. Here you set the relevant options for file-based logging, while logging to a database table is decided on a per-database basis.
Log DML statements When logging is enabled, by default only DDL (CREATE, ALTER, DROP...) statements are logged. Turn this option on to enable logging of DML (SELECT, INSERT, UPDATE, DELETE) statements as well.
Enable logging to file Here you choose whether you want to log statements or not, select the log file name(s), and choose if you want to output for each statement also a comment with the version of FlameRobin, database and user name, and execution date and time. Each statement can go into separate file, and it uses incremental numbers for filenames. You can format your own filenames by using %d as a placeholder for number. If you want numbers with fixed number of digits, like 0003 instead of 3, then use %04d as placeholder, where 4 means four digits, and 0 means that it should be padded with zeros. There are also options to add a comment header to each logged statement, and to add SET TERM statements if required.
Database configuration There is a set of options in FlameRobin that you can set on a per-database basis. You access the database configuration window by right clicking on a database and selecting the "Database preferences..." command, or selecting the same command from the "Database" menu. Like global preferences, database preferences are organized in categories; here is a description of each category. Please read the tooltip that appears when you move the mouse cursor over each option to know more about it.
Main Tree View
Show system tables in tree This is a database-level override of the global option with the same name described here.
Connection This page holds options that apply to database connection and database registration info.
Warn when connection charset is different from database charset In Firebird it is quite an usual situation to have a single character set for an entire database, and use that character set for connecting to the database, otherwise string transliteration won't work correctly. For this reason, FlameRobin will warn you on connection if the two charsets don't match. There are cases, though, in which you might want to connect to a database with a different character set (for example when you use different charsets for different tables or even columns, something Firebird allows), so here you can turn off the warning for that particular database
Logging Please see the section about global logging configuration. The options are the same here, but they apply to the current database only. There is an additional option to turn off logging for a particular database only, while leaving it active for all the other databases. There are also additional options to enable logging to a database table. The table is called FLAMEROBIN$LOG and it is created automatically the first time it's needed. Each record written to this table gets an ID fetched by executing a SELECT statement that you can customize. By default, FlameRobin fetches the values from a generator called FLAMEROBIN$LOG_GEN, which is created on demand as well. You might want to set a custom SELECT statement if you want to use the ID as some kind of metadata version number for your database, in which case you define the logic to follow when generating new IDs. For example, you could write a stored procedure and have FlameRobin call it.
Customizing the FlameRobin environment FlameRobin needs, or creates, some external files. This section documents what these files contain, and where they are found. While FlameRobin is installed with usable default settings, it is possible to fine-tune the installation for special uses or multiple users. For example, you can change the icons, the HTML templates used as property pages for the objects in a database, or where FlameRobin stores and looks for its configuration files. FlameRobin uses the following files and folders: fr_settings.conf; a file containing all settings you see in the Preferences dialog box and other global settings of FlameRobin, like position and size of open windows. FlameRobin needs write access privileges to this file. fr_databases.conf; a file containing all the servers and databases defined in FlameRobin's Home tree. FlameRobin needs write access privileges to this file. the html-templates and conf-defs folders, which contain metadata used to render some of FlameRobin's windows, and the docs folder, containing documentation files that can be opened through FlameRobin's main menu. FlameRobin only needs read access to the files in these folders. Locations: $frhome is FlameRobin's home path. FlameRobin will find html-templates, conf-defs and docs (which are immutable and integral part of the FlameRobin distribution) in its home path. The home path is usually the application folder (on Windows) and an otherwise fixed folder on POSIX platforms. Defining the environment variable FR_HOME will override this path. Passing -h <path> on FlameRobin's command line will override this path and the environment variable as well. $fruserhome is FlameRobin's user home path. FlameRobin will find the conf files in its user home path. This path has to be writable and may be common to all users on the machine or different for each user. The user home path defaults to the user local data directory, which varies with the platform. Defining the environment variable FR_USER_HOME will override this path. Passing -uh <path> on FlameRobin's command line will override this path and the environment variable as well. Additionally, the <path> specification in the command line parameters -h and -uh, or the value of the environment variables FR_HOME and FR_USER_HOME may be "$app", which translates to the common data folder (the application folder on Windows and an otherwise fixed folder on POSIX platforms), or "$user", which translates to the user local data directory. Otherwise, it has to be a path (without the trailing path delimiter). FlameRobin will only ever write to files in $fruserhome. If FlameRobin is configured so that these files are shared by several users (or concurrent instances of FlameRobin), then no precaution is taken to avoid overwriting other users' changes.
Advanced topics This section will document some advanced topics about how FlameRobin works. The topics are not necessarily related, and are grouped here only for convenience.
Encrypted password storage FlameRobin can use strong encryption to safely store your passwords in the configuration file (fr_databases.conf). Here's how it works in detail: all passwords (PW) are encrypted with a master password (MPW) the MPW alone is never saved into any file, it is only known by the user PW + MPW comprise the Cipher (which is stored in the .conf file) whenever a PW needs to be decrypted, the user is prompted for the MPW Cipher + MPW yield the PW
Defense from "known plain-text" attack If an attacker gets hold of FlameRobin's .conf file, and he knows one of the PWs, he would be able to compute the MPW (as Cipher + PW yield the MPW). In order to prevent this, FlameRobin uses the following scheme: the string composed by MPW + username + database connection string is used as a seed for some irreversible random number generator (RNG) like ISAAC the PW is encrypted with the numbers produced by the RNG since numbers are unique for each username + database connection string, and RNG is not reversible, the attacker cannot get MPW, and he also cannot decrypt any other password For more information on ISAAC see: http://en.wikipedia.org/wiki/ISAAC http://www.burtleburtle.net/bob/rand/isaacafa.html
flamerobin_0.9.3~svn+2220.orig/docs/000077500000000000000000000000001177057155300171335ustar00rootroot00000000000000flamerobin_0.9.3~svn+2220.orig/docs/flamerobin.1000066400000000000000000000101761177057155300213400ustar00rootroot00000000000000.\" Copyright (c) 2006 Tamas Tevesz .\" .\" Permission to use, copy, modify, and distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" .\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES .\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR .\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES .\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .Dd April 12, 2006 .Dt FLAMEROBIN 1 .ds volume Firebird Administration Tool .Os "FlameRobin 0.7" .Sh NAME .Nm flamerobin .Nd management and data manipulation tool for the Firebird DBMS .Sh SYNOPSIS .Nm flamerobin .\" with thanks to jmc .Oo Xo Fl h Ar directory \*(Ba .Fl -home Ns = Ns Ar directory Oc Xc .Oo Xo Fl uh Ar directory \*(Ba .Fl -user-home Ns = Ns Ar directory Oc Xc .Sh DESCRIPTION .Nm is a graphical frontend to the Firebird DBMS. It is small and simple, yet offers all the basic features needed to create and manipulate databases, execute queries and perform administrative tasks. .Pp This manual page only documents the run-time options and environment of .Nm . Information about using the GUI may be obtained by selecting the Help -\*(Gt Manual menu item once the application is running. .Pp .Nm uses two directory hierarchies for its normal operation. The .Em data directory contains the templates for property pages, the default configuration and the on-line documentation grouped into three sub-directories as follows: .Bl -tag -width xxxxxxxxxxxxxx -compact .Pp .It Pa conf-defs default configuration .It Pa docs on-line documentation .It Pa html-templates templates for property pages .El .Pp The .Em user home directory contains the per-user configuration, comprising three entries: .Pp .Bl -tag -width xxxxxxxxxxxxxxxxx -compact .It Pa fr_databases.conf this file stores the user's registered databases. .It Pa fr_settings.conf this file stores the user's preferences related to the .Nm GUI. .It Pa history this directory holds the SQL statement history, one item per file. .El .Pp .Nm accepts several options, which are described as follows: .Bl -tag -width Ds -compact .Pp .It Fl h Ar directory .It Fl -home Ns = Ns Ar directory Use .Ar directory as the .Em data directory (but see .Sx ENVIRONMENT below). .Pp .It Fl uh Ar directory .It Fl -user-home Ns = Ns Ar directory Use .Ar directory as the .Em user home directory (but see .Sx ENVIRONMENT and .Sx CAVEATS below). .El .Sh ENVIRONMENT .Bl -tag -width Ds .It Ev FR_HOME Specifies an alternate location for the .Nm .Em data directory . .Pp If both .Fl h (or .Fl -home ) and this environment variable are set, the command line argument takes precedence. .It Ev FR_USER_HOME Specifies an alternate location for the .Nm .Em user home directory . .Pp If both .Fl uh (or .Fl -user-home ) and this environment variable are set, the command line argument takes precedence. .El .Sh FILES .Bl -tag -width Ds .It Pa /usr/share/flamerobin The default .Nm .Em data directory . .It Pa ~/.flamerobin The default .Nm .Em user home directory . .El .Sh AUTHORS .Nm was written by .An The FlameRobin Development Team .Aq Pa http://www.flamerobin.org/ . .Sh CAVEATS .Nm only writes files under the .Em user home directory . If .Nm is configured so that this directory and the files contained therein are shared among several users or concurrent instances of .Nm , no precaution is taken to avoid overwriting settings created by other users or other application instances. .Sh NOTES The specification of the .Em data directory and the .Em user home directory (regardless of whether they occur in the environment or on the command line) may be the literal string .Dq $app which translates to a common data folder determined at compilation time, or .Dq $user which translates to the user local data directory. These options currently have effect only on Windows platform. flamerobin_0.9.3~svn+2220.orig/docs/fr_license.html000066400000000000000000000027571177057155300221450ustar00rootroot00000000000000 License

License


Copyright (c) 2004-2012 The FlameRobin Development Team

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


This is a BSD-style Expat license. You may obtain a copy of the License at:
http://www.flamerobin.org/license.html

The original Expat license is available from:
http://www.jclark.com/xml/copying.txt
flamerobin_0.9.3~svn+2220.orig/docs/fr_manual.html000066400000000000000000002206501177057155300217720ustar00rootroot00000000000000 FlameRobin Manual

FlameRobin Manual

Nando Dessena

Milan Babuskov


About this manual

We try to keep all the features in FlameRobin usable in an intuitive manner. However, there are things that you still need to know if you want to grasp the full power of the application, and this manual contains details about them. In this document, you will find an overview of the features, a description of all configuration parameters and advanced installation and customization notes.

About the ALPHA test program

Lots of people have been using FlameRobin in day-to-day work for a long time now. Yet, we still consider the software in ALPHA state until it reaches feature-completeness, which will come with release 1.0. FlameRobin is very near to that state. Meanwhile, we thank you for evaluating and using this software and encourage you to send comments, bug reports and feature requests back to us so we can make it a better product.

What FlameRobin is

FlameRobin is a GUI administration and data manipulation tool for Firebird databases. It is designed to be small, simple and cross-platform, yet offer all the basic features needed to administer Firebird servers and create/maintain databases. FlameRobin is Open Source software and binaries are currently available for Windows, several GNU/Linux and BSD flavours and MacOS X. Ports to other platforms are possible, subject to the availability of maintainers for those platforms.

What FlameRobin is NOT

FlameRobin is not a full-featured administration tool with lots of bells and whistles, as there are plenty available for Firebird from several different parties. Our first goal with FlameRobin is to provide people not used to the command line with a GUI tool to get started with Firebird. Our longer-term goal is to develop a richer tool mainly for the Linux platform; while there are several rich and mature GUI tools under Windows, some of them available for free or for a modest price, there isn't any for Linux. Another goal of the project is for a "lite" edition of FlameRobin to be bundled with the Firebird server to serve as a starting kit for new users. This bundle may be distributed by the Firebird Project itself or by some third party.

Who we are

The home page of the FlameRobin project is located at http://www.flamerobin.org. The project itself is hosted on SourceForge. Please use our mailing list (flamerobin-devel) to contact the developers. Details and archives available here. You are also encouraged to use our bugs and feature requests trackers to report back to us the results of your alpha testing. If you are a developer interested in joining the FlameRobin project, let us know. We always welcome contributors.

License

FlameRobin is released under the Expat License. You can find the complete license text in the file fr_license.html, or here.

What's new?

Please refer to fr_whatsnew.html for a detailed history of all the changes since the previous release.

Installation

If you want to build FlameRobin from sources, please find instructions on our web site or Subversion repository. In this section we talk about installing the pre-built version of FlameRobin under all currently supported platforms.

General information

If you have installed a previous ALPHA version of FlameRobin which is less than 0.4.0, it is recommended that you remove it before installing this version.

You won't be able to keep a config.ini file from an earlier version, because the name and file format have changed in version 0.4.0.

You might be able to keep your servers.xml file, provided that you rename it to fr_databases.conf and move it to your data folder. FlameRobin will tell you the exact path of this file (which changes with the platform) upon first startup, when it cannot find the file.

Here are the files used by FlameRobin to store configuration information:

  • fr_databases.conf is the list of Firebird servers and databases you work with; FlameRobin will create it (and automatically add the "localhost" server) when you run it for the first time; then you can register new servers and databases.

  • fr_settings.conf stores FlameRobin's configuration information, like the position and size of the main program window. You don't need to edit it by hand.

Note

The location of these files changes with the platform, and it's usually a directory owned by the current user. FlameRobin needs write access to that folder.

Windows (Win32)

To install FlameRobin under Windows you need the Firebird client (gds32.dll for Firebird 1.0, fbclient.dll for Firebird 1.5 and up) installed and available, then just run the automatic installer of FlameRobin which will copy all required files in a directory of your choice and optionally create desktop and start menu shortcuts.

If you need to uninstall FlameRobin you can do so from the start menu icon (unless you told the installation program not to create one) or from the Control Panel.

Linux

While some Linux distributions might provide installation packages suitable for specific versions of that distribuion, FlameRobin project provides generic compressed archives containing the executable and all needed files. There are two flavors, depending of your preferences. You can use Gtk1 version, which runs faster and has less dependencies. It is suitable for slower computers and should run out-of-the-box on most distributions. Gtk2 version uses Gtk2 toolkit, so it looks nicer on the screen and it also has Unicode support.

To install FlameRobin, just unpack the chosen .tar.bz2 archive, cd into that directory and type "make install" as root. This will install FlameRobin and all the needed files to appropriate locations. After that, any user can type "flamerobin" to run the program.

MacOS X

Installation on Mac OS X is an absolute no-brainer: just drag the icon from the installation package to the folder you want the application to live in. Unpacking is handled via double clicking the downloaded file.

Getting started / basic features

Upon first startup, FlameRobin will show a "Home" tree containing only the local server (localhost), and will invite you to create new servers and databases as required. You'll also see a menu bar at the top of the window, and a search bar and status bar at the bottom. Here is a brief how-to for getting started with FlameRobin.

Adding a server

You can add a server by right-clicking on "Home" and choosing "Register server..." (alternatively, use the "Register server..." command from the "Server" menu). You will have to specify a display name and optionally the host name and TCP port number on which the Firebird server listens. Leave the display name empty to have FlameRobin build one automatically from the host name and port values (if you don't have a host name, because yours is a local or embedded Firebird server, you will be required to type in a display name manually). Once you have added a server, you can register databases under its node.

Adding an existing database

To access an existing database from FlameRobin you have to register it. Registration will make FlameRobin remember the database connection properties so you don't have to re-enter them every time. Locate the correct server in the tree, right click it and choose "Register existing database...". You will have to enter a display name, type in or locate (or drag and drop) the database path (or alias name), the user name and password.

Note

If you don't specify the password, FlameRobin will prompt for it every time you try to connect to the database, which is the most secure option. If you want to specify the password, you can have FlameRobin optionally encrypt it in the configuration file.

You can also optionally specify a connection charset and role.

Creating a new database

To create a new, empty database, locate the desired server in the tree, right click it and choose "Create new database...". You will then need to input the database file or alias name, the user name and password for the owner of the new database (use SYSDBA as the user name and masterkey if you don't know what to put in these fields), the character set, the role, the page size (the default value of 4096 is just fine) and the SQL dialect (leave it set at 3 if you don't know what a SQL dialect is). The new database will be created and registered (which means it is available in FlameRobin).

You can also drop an existing registered database, optionally keeping the FlameRobin registration information. Use the "Drop" menu command to do that.

Connecting to a registered database

Just double click on the database name in the tree, or right click it and choose "Connect" or "Connect as...". Choose "Disconnect" to close the connection to the database. This causes the load of essential metadata information. FlameRobin tries to play well with slow network connections by delaying metadata retrieval as much as possible, yet connecting to a database still needs some data transfer beyond the connection itself.

Browsing metadata

Upon connection, the sub-tree under the database name is populated with a description of the database structure (metadata). Browse the tree to explore the metadata. You can also use the quick search feature to locate a particular object in the tree. Just type the name of the object you are looking for (use the "*" wildcard character for a partial match) in the search box at the bottom of FlameRobin's main window and the first object in the tree whose name matches your search string will be highlighted. Now you can hit Enter to focus the tree and add the object name (or search string) to the search box's drop-down list. For your convenience, FlameRobin will remember your search strings for further use. Click the arrow buttons next to the search box to move to the next and previous matches.

There is also an advanced metadata search feature, which is described later.

Editing objects

You can view and/or change the properties of every object you see in the tree by choosing the "Properties..." option from the object's context menu or from the "Object" menu. Please note that currently not all object types are supported in full (domain editing, for example, is very basic ATM), but you'll find some level of support for all of them. The property page is a HTML window with a summary of the object's properties and links which open other pages or specific editors. Some of the options are not yet available, but you can edit almost all aspects of the most common objects (tables, views, stored procedures, and so on). Please have a look at fr_whatsnew.html to see, well, what's new.

Note

Although we try to test the features as much as we can, this is ALPHA software and you should only use it to work on backup copies of your databases, or perform backup copies before using FlameRobin on them. Having said that, we have to add that many users (including us) have been using FlameRobin in their everyday Firebird development for several years now without major problems.

Browsing and editing data

After connecting to a database, locate a table, view or selectable stored procedure of your interest in the tree and right-click it. Choosing either "Select ... from ..." option will open the SQL editor with the table/view data shown in the grid at the bottom. In the case of selectable stored procedures with parameters, just the select statement appears in the SQL editor, so you should fill the parameter values (if you have any) and click the Execute button to see the data.

FlameRobin's data grid fetches data from the server in small chunks, so that you don't have to wait for the fetch to complete if you only look at the first few pages of rows. You can have the grid fetch all data (in background) through the Fetch all records command in the grid's context menu (there is also a configuration option to make complete fetching the default behaviour, something we usually don't recommend). Fetching a very large result set might take some time, so if you change your mind you can use the Stop fetching all records command.

Once you have some data in the grid, you can re-sort the data by double clicking on column headers.

You can change the data through direct editing in the grid, add new records by means of the Insert button (which opens a specialized dialog box) and delete the currently selected record(s) by clicking the Delete button. Confirm any changes by clicking the Commit button, or cancel them through the Rollback button. Deleted records are still displayed (on a red background color) until you commit, just in case you change your mind.

Note

Emptying a cell that displays a string field will set the field's value to ''; if you want to set it to null, then delete all contents and then hit the DEL key once more.

Note

You can type the strings "NOW", "DATE", "TODAY", "TOMORROW", "YESTERDAY" in cells of type date or timestamp, and the strings "NOW" and "TIME" in cells of type time. They will be translated by FlameRobin to their respective meanings.

Note

FlameRobin handles all interactive edit operations by generating corresponding SQL statements. By default they are all logged in the history, but you can turn logging off for an instance of the SQL editor through the History/Enable logging menu command. You can also to turn logging off globally or for a particular database, through the preferences.

Running SQL statements and scripts

Of course you can use the SQL editor window to create and execute arbitrary SQL statements. FlameRobin provides a rather advanced and sophisticated, yet simple to use SQL editor. You can open a SQL editor window by right clicking on a database node and choosing "Run a query". The SQL editor tool offers script execution capabilities (including SET AUTODDL and SET TERM support), load/save buttons, auto-completion and call-tip features, commit/rollback, detailed execution statistics (including but not limited to the query PLAN and the number of records inserted, deleted, updated in each affected table), a data export tool and more.

To execute a script (meaning a sequence of more than one SQL statements), just load it (or drag and drop a file, or type it in) and run it. To execute a single statement when more statements are present in the editor, select it before clicking the Run button.

You can use the drop-down menus or the context menu in the SQL editor as well as the buttons.

Auto-completion can be invoked automatically or manually (see the rich set of configuration options about it), and supports table and column names, procedure and function parameters, and so on.

To activate the data export tool, right click on the data grid. The data export tool is currently able to copy the data to the clipboard, generate SQL INSERT or UPDATE statements or export the data to a HTML or CSV file. All options work on the whole grid contents or just the selected parts. You can also multiple-select several different grid "islands" and have the tool export them. This is particularly handy to generate customized INSERT or UPDATE statements.

For SELECT statements, you can also drag and drop objects from the tree view to visually build queries (provided the appropriate configuration option is enabled). Dragging and dropping tables will automatically create JOIN conditions (based on existing foreign key definitions) in the statement you are building.

FlameRobin will try to let you edit whatever result set your SELECT statement returns, or part of it. Fields that you cannot edit will be displayed in a special background colour in the grid.

Backup and restore

You can perform a database backup by right clicking on a database and choosing "Backup database...". Choose "Restore database..." to restore a backup file over the current database (you will have to disconnect first). Choose "Restore backup into new database..." (this time on the server node) to create a new database from a backup file. You can drag and drop files in these windows.

Note

It is considered bad practice to restore a backup file over an existing database.

The Backup and Restore tools work in background, so you are allowed to continue working with FlameRobin while they proceed. You can work on a database while it is being backed up, but you can't work on a database while you are restoring it.

Advanced features

This section illustrates features in FlameRobin that you won't likely use every day, but often enough to make them useful to know.

DDL extraction

You can generate DDL (Data Definition Language) creation scripts for any object you have in the database, or even for the whole database. Just open the DDL subpage of an object's property page to see the DDL code that creates the object.

Extracting DDL scripts is useful if you want to replicate an object's structure in a different database, or create a slightly different object in the same database.

A shortcut command for extracting the entire database metadata is available in the Advanced submenu of the database's context menu.

Alter View functionality

Firebird doesn't have an ALTER VIEW DDL command, which means that if you want to modify a view definition you need to DROP and CREATE it back. But dropping an object in Firebird requires dropping all objects that depend on it, and so on recursively. Doing this by hand is very hard, especially if the database structure is complex. A unique feature in FlameRobin, which you activate by righ-clicking a View object and selecting the "Alter..." menu command (or selecting the "Alter..." command from the "Object" menu after selecting a View), will generate a script that drops all the objects that depend on the view (in the correct order), drops and recreates the view, then recreates all the objects (again, in the correct order). The script is pasted into the SQL editor window so you can modify the view definition and recreate everything with a single click.

Creating a selectable stored procedure for a table

This feature, that you can use through the Create selectable procedure command in each table's context menu (or the namesake item in the Object menu), will open the SQL Editor on a CREATE PROCEDURE statement; the procedure fetches and returns all records in the table, and has an output parameter for each column. Since this is a pretty common pattern, it is intended to be modified to suit your needs rather than used as-is.

Connected users

Select "Show connected users" at the database level (or in the "Database" menu) to see a list of users connected to that database. This only works reliably with the SuperServer variant of Firebird. If you are using Firebird Classic you will see at most one user connection there, which is yours.

Event monitoring

FlameRobin allows you to listen for Firebird events interactively. Just select the "Monitor events" command at the database level (or in the "Database" menu) to open the Event Monitor window (you will need to connect to the database first). This window allows you to monitor one or more events, save the received events to a text file and load them back. Events are posted from the database when the POST_EVENT statement is called (and the transaction is committed).

User management

Current versions of Firebird use a central server-wide user repository. FlameRobin allows you to add, modify and delete user accounts (but it will not allow you to delete the SYSDBA predefined user) by means of the "Manage users..." option in the Server menu (or the server's context menu item, or the Object menu item with the same caption). It is Firebird's security policy that you need to be SYSDBA to use this feature.

Note

The proper way to change the SYSDBA password on LInux is to run the changeDBAPassword.sh script in Firebird's bin directory. Otherwise Firebird's startup and shutdown scripts won't be updated.

Grant and revoke privileges

Every object in the database has a list of privileges that identify the users and roles that can work with that object. On an object's property page (in the "Privileges" subpage) you can view the privleges associated with that object, and if you hover the mouse over icons, you can see who granted them in the status bar. Clicking on the "Grant and revoke privileges" link will open a dialog box that will help granting and revoke privileges to that object (which you'll find pre-selected in the dialog box) and/or other objects as well. The dialog box allows you to build a list of grant/revoke SQL statements by clicking on appropriate controls and then on the "Add To List" button. When satisfied, click the "Execute All" button to run all the statements in the SQL editor (which will also log them for future use, as with any SQL statement executed in FlameRobin, if logging is enabled).

Server and client version

Select "Retrieve server version" from the "Server" menu (or from a server's context menu) to see a dialog box with the server's version string. A server's version string reveals the exact build number of your Firebird server and the platform it is running on. For example, a version string equal to "WI-V1.5.2.4731 Firebird 1.5" means Firebird 1.5.2, build 4731, on Windows.

Note

Currently FlameRobin doesn't show the version string of the Firebird client it is using, for these reasons:

  • Not all versions of Firebird support this feature, and FlameRobin needs to stay compatible with all Firebird versions.

  • At some point in the future FlameRobin will be able to load different client libraries for different databases (at least on platforms that support it). We will probably add the client version display feature then.

You can also look at the version string of the Firebird client FlameRobin is using, in the About box (Help/About).

Advanced metadata search

This feature, which you can fire through the lens button in FleameRobin's main window, allows you to perform more advanced search operations in your database's metadata (or in more databases at the same time). You can search with wildcards, search on object names and descriptions, in the DDL definition (which includes the source code for triggers and stored procedures), and do other, more specialized, search operations. Just add all criteria you need through the Add buttons, and then click the Start search button. The criteria will be concatenated with an "and" boolean operator, that is all of them must be satisfied for an object to be included in the SEARCH RESULTS pane.

This feature is provided on an experimental basis, as we're currently looking for suggestions about how to improve both the user interface and the capabilities. We already have some ideas that will radically change the appearance of this dialog box, but we thought users might want to try it out so they can give us some good tips.

Logging

The SQL Editor can log all executed statements to a text file, a set of text files or a database table. This gives you the ability to work visually and produce scripts to easily replicate sequences of operations on other databases. For database logging, in a future release, FlameRobin will also provide a visual interface to the log table, so that you can view a list of modifications to an object.

Look here for the options you use to configure this feature globally, and here for database-level logging options.

Test data generator

FlameRobin includes a test data generator which you can use to create test databases with dummy data values. You can launch it through the Database/Advanced/Test data generator. In the resulting dialog box you can select the tables for which you want to generate data, how many records you want to generate for each table, and the data generation strategy on a per-colum basis. Among the available strategies you'll find sequential values, random values, values taken from other columns, values loaded from external files, and a customizable NULL ratio. Your settings can be saved to an XML file and reloaded later. When you're ready, hit Generate data and the database will be filled with test data.

Configuration

This section documents the options you can set to tune FlameRobin's behaviour to your liking. You can set the options by means of the Preferences dialog, which is invoked through the "Preferences..." command in the "View" menu. The Preferences are organized in categories; here is a description of each category. Please read the tooltip that appears when you move the mouse cursor over each option to know more about it.

Note

Since new options are added to FlameRobin daily, this section of the documentation will likely be out-of-date. Please refer to the tooltips for fresh descriptions of all the available options.

General

Here you can find options to tune the visual appearance and behaviour of FlameRobin. You can choose whether FlameRobin will remember the size and position of opened windows between sessions or not, whether FlameRobin will ask for quit confirmation or not, and other such things.

Center dialogs on their parent window

Set this option to always have dialogs displayed at the center of their parent window. Otherwise dialogs are displayed at a system-defined position.

Remember window positions and sizes

If you enable this option, FlameRobin will remember the position and size of each window you open and will open the same window at the same position and with the same time the next time. You can also choose the granularity of this option for property pages and backup/restore dialogs:

  • Choose "Same settings for all objects" to store a single set of values; this means that whenever an Object Properties dialog is opened it will have the position and size of the last Object Properties dialog used.

  • Select "Same settings for all objects of same type" to store a set of values for each object type. This means that a Table Properties dialog will have different settings than a Trigger Properties dialog, but two Table Properties dialog will share the same set of values.

  • The third option, "Separate settings for individual objects", will make it so that every object's property page will have a set of options of its own. This mode is the most flexible, but consumes more disk space and memory.

Main Tree View

Here you can tune the appearance and behaviour of FlameRobin's metadata navigation tool, the main tree.

Order server entries alphabetically

Set this option to have your servers displayed in alphabetical order, otherwise they are displayed in the order they appear in servers.xml.

Order database entries alphabetically

Set this option to have your databases displayed in alphabetical order, otherwise they are displayed in the order they appear in servers.xml.

Show columns and parameters in tree

Enable this option to have table/view columns and procedure parameters displayed as tree nodes; otherwise, the tree stops at the table/view or procedure level. In case you choose to have columns and parameters displayed as tree nodes, you can also indicate whether you wish that a double click on a table/view or procedure node opens the relevant property page or expands the subtree.

When table, view or stored procedure is activated

Here you choose what should happen when you double click on a table, view or stored procedure node in the tree. Available options include opening the property page, show columns as sub-nodes of the selected node or select from the table, view or stored procedure to see the data.

Show system tables in tree

The metadata for a Firebird database is stored in the database itself, in a set of tables whose names start with RDB$, called the system tables. There is usually no point in working with Firebird's system tables directly, as FlameRobin already queries them and translates the information in friendlier form for you: the tree view, object property pages and various dialogs all display information coming from the system tables. FlameRobin also allows to change the database metadata in a safe way (that is, keeping the database structure's integrity), something which is not guaranteed if you try to edit the system tables directly.

For the rare cases in which a direct look at the system tables is required, and you know exactly where and how to look, you can enable this option, which will add all system tables for a database to the tree. This will impose a slight performance penalty upon connection.

You can override this setting at the database level.

Allow drag and drop query building

The SQL editor allows you to drag and drop objects from the tree view to visually build queries (see the relevant section). This feature may occasionally hang FlameRobin on Linux, so we are proving this option to switch it off until the problem is corrected in the wxWidgets library. Plus, you might want to disable the feature, if you don't use it, in order to avoid spurious start-drag operations when working with the mouse on the tree view.

SQL Editor

Use these options to customize the behaviour of the SQL Editor, which is used in FlameRobin to execute any kind of system-generated or user-supplied query.

Automatically commit DDL statements

Enable this option to have FlameRobin automatically "click" the Commit button on your part each time it detects a DDL (Data Definition Language) statements. DDL statements are those that modify the database structure (as opposed to DML, or Data Manipulation Language statements, which modify the data). Firebird does support transactional DDL, yet it is common practice to auto-commit these statements to avoid unexpected behaviours (for example, adding a column to an existing table and populate it through an UPDATE statement in the same transaction can lead to unexpected results with current versions of Firebird). This option sets a default state that you can change with the script commands SET AUTODDL ON and SET AUTODDL OFF.

When text is selected in editor

Leave this option to "Execute the entire buffer" if you don't want to take advantage of FlameRobin's advanced selection handling. If you set it to "Execute only the selection" you will be able to type (or load) entire scripts in the SQL editor and only execute single parts of them by selecting them and clicking the "Execute" button. If you don't select anything, FlameRobin will execute the whole text in the editor.

Treat selected text as a single statement

If you only ever select a single statement at a time, then you can save FlameRobin's parser some work by enabling this option. When you disable it, instead, FlameRobin will parse the selected text before executing it, break it into several statements if necessary and send them to Firebird one at a time; this is necessary since Firebird does not support executing more than one statement (i.e. a script) at a time. It can also be used if you have CREATE PROCEDURE or CREATE TRIGGER (or similar) statements with SET TERM. This way, you can select and execute the CREATE statement, and you don't need SET TERM at all.

Clear the messages when executing new statements

The SQL Editor has a message pane that shows information about each executed statement. By default this pane is cleared automatically only when you end transaction. Set this option to have FlameRobin clear it before executing a statement.

Display detailed query statistics

Enable this option to have the SQL Editor show detailed statistic information for each query, in addition to the query PLAN. This includes number of fetches, marks, reads, writes; number of inserts, updates, deletes; number of indexed vs sequential reads; delta memory; execution time.

Enable call-tips for procedures and functions

When this option is enabled, then each time you type an open round bracket after a stored procedure or UDF name in the SQL Editor, a floating tooltip (called a call-tip) will appear reminding you what the input and output parameters of the stored procedure or UDF are.

Show long line marker

Activate this option to have the editor display a vertical line that visually marks the place where a line break would occur if lines couldn't be longer than a certain amount of characters. The marker is only a visual indicator, as FlameRobin will not enforce any limit to the length of text lines. You can also customize the column at which the marker will appear.

Tab size

Here you can set the number of space characters the SQL Editor will render for each TAB.

Code Completion

This page contains options to customize FlameRobin's code completion feature.

Enable automatic invocation of completion list

This is the general switch to turn automatic code completion in the SQL Editor on or off. Disable it if you don't like code completion windows that pop up while you write SQL code. If you keep it enabled, then you can set a certain number of characters you'll have to type before code completion kicks in, and choose to disable code completion when a call-tip is displayed (as it would close the call-tip window) or inside quoted text.

Manually invoke completion list on

Code completion may also be invoked manually. Here you select how (Ctrl+Space or Tab key).

Confirm completion with Enter

Set this option to have the currently selected item in the code completion window copied to the text buffer when you hit Enter. Otherwise you can use the Tab key for that.

Load columns when required for completion

FlameRobin only loads column definition data when requested to do so (for example, when you double click a table name in the tree view). Set this option to let FlameRobin load missing column information automatically when needed to show an auto-complete list.

Statement History

FlameRobin can remember the statements you execute and allow you to retrieve and re-execute past statements. This page allows you to customize the feature.

Share SQL statement history

You can have a single statement history list for all the databases you work with ("Between all databases") or a separate history list for each of them ("Don't share"). Additionally, you can make it so that all databases with the same display name (typically copies of the same database, or databases with the same structures, on different servers) share a history list.

Limit history item size

By default, each history list item is allowed to grow without bounds. If you are concerned about the size of your statement history lists, you can set an upper limit in Kilobytes for each statement in the history list. Statements bigger than the specified amount will not be added to the history list. This is useful if you execute entire database-creation scripts often.

Remember unsuccessfully executed buffers

By default, only statements that are executed without errors are added to the history list. Set this option to have FlameRobin remember also statements that caused errors.

Remember statements generated by FlameRobin

FlameRobin translates as much visual operations as possible to SQL statements. Uncheck this option to prevent this kind of statements from being added to the history lists.

Data Grid

When you issue a SQL SELECT statement in the SQL Editor, then the Data Grid comes into play to show the results. Here you customize its appearance and behaviour.

Date format

Choose the format you'd like for showing date and timestamp values in the grid.

Time format

Choose the format you'd like for showing time and timestamp values in the grid.

Grid header font

Choose a character font for the grid header (the column names).

Grid cell font

Choose a character font for the grid cells (the data).

Re-format float and double precision numbers

If unchecked, decimal numbers are displayed as returned from server; otherwise, they are formatted according to the specified number of decimal digits.

Maximize data grid after execution of SELECT statement

Here you can turn off an useful feature that will enlarge the data grid to the maximum available size when a SQL SELECT statement returns more than a specified number of rows.

Automatically fetch all records in result set

Makes it so the grid will automatically fetch all records whenever a SELECT statement is executed, instead of doing it in batches.

Show BLOB data in the grid

Check this option if you want to see data fetched from BLOB fields in the grid. By default FlameRobin doesn't fetch BLOBs. You can also set a threshold, thus telling FlameRobin to fetch at most a specified amount of data for each BLOB. This allows you to see the first part of every BLOB field automatically without risking to download huge amounts of data for no gain. Check the "Show data for binary BLOBs" if you want the above settings applied to binary BLOBs as well (by default they are applied to text BLOBs only).

Property Pages

This section contains customization options for FlameRobin-s property pages.

Show default column values

Set this option to display the "Default" column in a table's property page.

Show column descriptions

Set this option to display the "Description" column in a table's property page.

Sql Statement generation

This page offers options to customize the way FlameRobin generated SQL code, deals with object names in general, and quoted identifiers in particular. If you don't know how quoted identifiers work in Firebird, you should leave the relevant settings to their default values.

Use UPPER CASE keywords

Uncheck this option if you prefer FlameRobin to use lowercase keywords in generated SQL code.

Quote names only when needed

Uncheck this option to have FlameRobin always quote object names with " in dialect 3 databases. Leave it checked to let FlameRobin detect on its own when it is needed to quote identifiers. The setting "Quote names in mixed case" is only used for names entered by the user (for example, when you add a new field to a table, you type in its name).

If "Quote names only when needed" is checked and "Quote names in mixed case" is not, FlameRobin will leave the name entered by the user as it is, even if it is written in mixed case (unless the name is a reserved word or contains non-ASCII characters, in which case it is quoted).

Here are two use cases to better explain how these settings interact with each other:

Table 1. Case 1: "Quote names only when needed" = on; "Quote names in mixed case" = off

User entersTurns into
FIELD1FIELD1
Field1Field1
Date"Date"


Table 2. Case 2: "Quote names only when needed" = on; "Quote names in mixed case" = on

User entersTurns into
FIELD1FIELD1
Field1"Field1"
Date"Date"


The rationale behind all this is that if you write a name in mixed case, then you probably want it quoted (since you bothered to mix the case). Some users, however, find this rule awkward and unpredictable, and need a way to disable it.

Treat quote characters like other characters

This setting determines what happens if you type the quote character (") as a part of some name. Again, it only affects user-entered names. One option (unchecked) is to ignore it, other is to treat it like any other character (checked). Quotes are special cases, since they need to be escaped (by doubling them). When this setting is off, user can force quoting even when it is not required, by writing the name quoted in the text box.

Fields

Here you can customize the appearance of field types in the tree and property windows.

When a column has a user-defined domain

In this case you can choose to see after the column name the domain name, the data type, or both.

When a table column is computed

For computed columns, you can choose to see after the name the data type or the computation expression, or both.

Logging

The SQL Editor can log all executed statements to a text file, a set of text files or a database table. Here you set the relevant options for file-based logging, while logging to a database table is decided on a per-database basis.

Log DML statements

When logging is enabled, by default only DDL (CREATE, ALTER, DROP...) statements are logged. Turn this option on to enable logging of DML (SELECT, INSERT, UPDATE, DELETE) statements as well.

Enable logging to file

Here you choose whether you want to log statements or not, select the log file name(s), and choose if you want to output for each statement also a comment with the version of FlameRobin, database and user name, and execution date and time. Each statement can go into separate file, and it uses incremental numbers for filenames. You can format your own filenames by using %d as a placeholder for number. If you want numbers with fixed number of digits, like 0003 instead of 3, then use %04d as placeholder, where 4 means four digits, and 0 means that it should be padded with zeros.

There are also options to add a comment header to each logged statement, and to add SET TERM statements if required.

Database configuration

There is a set of options in FlameRobin that you can set on a per-database basis. You access the database configuration window by right clicking on a database and selecting the "Database preferences..." command, or selecting the same command from the "Database" menu. Like global preferences, database preferences are organized in categories; here is a description of each category. Please read the tooltip that appears when you move the mouse cursor over each option to know more about it.

Main Tree View

Show system tables in tree

This is a database-level override of the global option with the same name described here.

Connection

This page holds options that apply to database connection and database registration info.

Warn when connection charset is different from database charset

In Firebird it is quite an usual situation to have a single character set for an entire database, and use that character set for connecting to the database, otherwise string transliteration won't work correctly. For this reason, FlameRobin will warn you on connection if the two charsets don't match. There are cases, though, in which you might want to connect to a database with a different character set (for example when you use different charsets for different tables or even columns, something Firebird allows), so here you can turn off the warning for that particular database

Logging

Please see the section about global logging configuration. The options are the same here, but they apply to the current database only. There is an additional option to turn off logging for a particular database only, while leaving it active for all the other databases.

There are also additional options to enable logging to a database table. The table is called FLAMEROBIN$LOG and it is created automatically the first time it's needed. Each record written to this table gets an ID fetched by executing a SELECT statement that you can customize. By default, FlameRobin fetches the values from a generator called FLAMEROBIN$LOG_GEN, which is created on demand as well. You might want to set a custom SELECT statement if you want to use the ID as some kind of metadata version number for your database, in which case you define the logic to follow when generating new IDs. For example, you could write a stored procedure and have FlameRobin call it.

Customizing the FlameRobin environment

FlameRobin needs, or creates, some external files. This section documents what these files contain, and where they are found. While FlameRobin is installed with usable default settings, it is possible to fine-tune the installation for special uses or multiple users. For example, you can change the icons, the HTML templates used as property pages for the objects in a database, or where FlameRobin stores and looks for its configuration files.

FlameRobin uses the following files and folders:

  • fr_settings.conf; a file containing all settings you see in the Preferences dialog box and other global settings of FlameRobin, like position and size of open windows. FlameRobin needs write access privileges to this file.

  • fr_databases.conf; a file containing all the servers and databases defined in FlameRobin's Home tree. FlameRobin needs write access privileges to this file.

  • the html-templates and conf-defs folders, which contain metadata used to render some of FlameRobin's windows, and the docs folder, containing documentation files that can be opened through FlameRobin's main menu. FlameRobin only needs read access to the files in these folders.

Locations:

  • $frhome is FlameRobin's home path. FlameRobin will find html-templates, conf-defs and docs (which are immutable and integral part of the FlameRobin distribution) in its home path. The home path is usually the application folder (on Windows) and an otherwise fixed folder on POSIX platforms.

    Note

    Defining the environment variable FR_HOME will override this path.

    Note

    Passing -h <path> on FlameRobin's command line will override this path and the environment variable as well.

  • $fruserhome is FlameRobin's user home path. FlameRobin will find the conf files in its user home path. This path has to be writable and may be common to all users on the machine or different for each user. The user home path defaults to the user local data directory, which varies with the platform.

    Note

    Defining the environment variable FR_USER_HOME will override this path.

    Note

    Passing -uh <path> on FlameRobin's command line will override this path and the environment variable as well.

Additionally, the <path> specification in the command line parameters -h and -uh, or the value of the environment variables FR_HOME and FR_USER_HOME may be "$app", which translates to the common data folder (the application folder on Windows and an otherwise fixed folder on POSIX platforms), or "$user", which translates to the user local data directory. Otherwise, it has to be a path (without the trailing path delimiter).

FlameRobin will only ever write to files in $fruserhome. If FlameRobin is configured so that these files are shared by several users (or concurrent instances of FlameRobin), then no precaution is taken to avoid overwriting other users' changes.

Advanced topics

This section will document some advanced topics about how FlameRobin works. The topics are not necessarily related, and are grouped here only for convenience.

Encrypted password storage

FlameRobin can use strong encryption to safely store your passwords in the configuration file (fr_databases.conf). Here's how it works in detail:

  • all passwords (PW) are encrypted with a master password (MPW)

  • the MPW alone is never saved into any file, it is only known by the user

  • PW + MPW comprise the Cipher (which is stored in the .conf file)

  • whenever a PW needs to be decrypted, the user is prompted for the MPW

  • Cipher + MPW yield the PW

Defense from "known plain-text" attack

If an attacker gets hold of FlameRobin's .conf file, and he knows one of the PWs, he would be able to compute the MPW (as Cipher + PW yield the MPW). In order to prevent this, FlameRobin uses the following scheme:

  • the string composed by MPW + username + database connection string is used as a seed for some irreversible random number generator (RNG) like ISAAC

  • the PW is encrypted with the numbers produced by the RNG

  • since numbers are unique for each username + database connection string, and RNG is not reversible, the attacker cannot get MPW, and he also cannot decrypt any other password

For more information on ISAAC see:

http://en.wikipedia.org/wiki/ISAAC

http://www.burtleburtle.net/bob/rand/isaacafa.html

flamerobin_0.9.3~svn+2220.orig/docs/fr_whatsnew.html000066400000000000000000001055341177057155300223600ustar00rootroot00000000000000 Changes For known issues please see our bug tracker at: http://www.flamerobin.org/bugs.php


Changes in FlameRobin 0.9.4 ALPHA


New features

- New templating system allows you to add you own SQL statement templates to the menu
- BLOB editor


Enhancements and Bug fixes

- Extended dialog with SQL statement history makes it easier to search
- View dependencies are resolved properly for Firebird 2.5
- Fixed statistics for UPDATE OR INSERT statements
- DataGrid: implemented Copy as IN list
- DataGrid: Fixed keyboard navigation
- Added new context menu options
- Fixed error messages when different character set is used in statements
- Warn when closing SQL editor with active transactions
- Ability to refresh list of objects in the main tree
- Fixed bug with quoted identifier when altering column type
- Generate change script is now available for columns as well
- Fixed truncating of Unicode characters with Firebird 1.5





Changes in FlameRobin 0.9.2 ALPHA


New features

- Allowed deleting from system tables (ex. to stop queries via MON$STATEMENTS)
- Added support for trusted authentication
- Databases can now be recreated from existing registration info
- Transaction isolation level can now be selected in SQL editor
- Win64 port


Enhancements and Bug fixes

- Fixed problems with mangled UTF8 identifiers
- Improved autoincrement triggers
- Drop FK only once for self-referencing tables in Rebuild script
- Improved management of passwords in connection dialogs
- Case insensitive DoMaIn keyword detection
- Fixed reported length of char fields in DDL extraction of system tables
- Fixed minor DDL extraction problem with BIGINT and scale
- Search words are now highlighted in advanced metadata search results
- DataGrid: sum of values of selected cells in the grid is shown in status bar
- Data grid cell editor now has a popup menu of a standard edit control
- Data of CHAR type using multibyte character set has correct padding now
- Database file size is now reported correctly for databases over 2GB
- Opening pages in tabs can now be controlled with Shift/Control keys
- Information on database property page is reloaded without reconnecting
- Fixed focus problem with property pages
- Fixed broken descriptions of system table columns in property pages
- Optionally display sources of all triggers on table property page
- Controls are now focused before their popup menus are shown
- Improved usability of menus and commands via keyboard
- SQL Editor: Improved detection of field sizes in resulting dataset
- Fixed statement parsing when SUBSTRING function is present
- Fixed column autocompletion for JOINed tables
- Fixed code completion when tables are listed in SQL89 order
- Fixed crash when opening query window and pressing F5 or F8 at once
- Improved the way views are switched in SQL editor
- Fixed completion under Mac OS X
- Other minor improvements and fixes to SQL editor
- Statement execution time is now displayed with milliseconds precision
- Minimum required version of wxWidgets is now 2.8.





Changes in FlameRobin 0.9.0 ALPHA


New features

- 100% Firebird 2.1 compatible
- Tab-based property pages for database object (like Firefox browser)
- DataGrid: load and save to file options for BLOB data.
- A new, improved dialog for inserting new rows.


Enhancements and Bug fixes

- Firebird 2.1: Support for database triggers
- Firebird 2.1: Support for global temporary tables
- Firebird 2.1: Descriptions can be set for generators
- Firebird 2.1: Support for domains as stored procedure parameter types
- Firebird 2.1: Detect when the equals sign (=) is used instead of DEFAULT
- SQL Editor: Improved autocomplete for table columns
- SQL Editor: Smarter window title, user configurable
- SQL Editor: fixed problems with scrolling of log control
- SQL Editor: removed flicker when executing scripts with COMMITs or AUTODLL ON
- SQL Editor: fixed crashes when COMMIT closes the window
- DataGrid: Copy as Update and Insert for single cell does not require cell to be selected anymore
- DataGrid: Timestamps have display format of their own (not date+time anymore)
- DataGrid: Fixed doubling of quotes entered in edited fields.
- DataGrid: BLOB data is now transliterated to GUI character set
- Procedure nodes in tree indicate when parameter info has been loaded
- DDL extraction for GRANTs fixed
- DDL extraction for BIGINT separated from NUMERIC(18,0)
- DDL extraction for CHAR columns in system tables fixed
- Fixed random crashes when dropping object from its property page
- Implemented missing prompt for dropping of some objects
- GRANT statements moved to end of database DDL script for easier diffs





Changes in FlameRobin 0.8.6 ALPHA


New features

- DataGrid: BLOB data is now (optionally) shown in cells. Read-only for now.
- DataGrid: A basic ORDER BY clause building when column header is double-clicked
- Support for LIST function in Firebird 2.1
- Support for MON tables in Firebird 2.1 (Read-only for now.)


Enhancements and Bug fixes

- DataGrid: FR no longer crashes when transaction has ended (commit/rollback) and grid edit control is active
- DataGrid: Complete string is now shown for editing and copying multiline text
- DataGrid: Copy command now copies a single cell if nothing is selected
- DataGrid: Fixed mixup between BLOB ID and data it contains
- DataGrid: Fixed bug when editing or deleting in grid causes exceptions.
- DataGrid: Successfully deleted rows are deselected, so user can easily see what is done.
- DDL extraction for GRANTs now only quotes names when needed
- DDL extraction for defaults does not use double quotes anymore.
- Database property page now shows minor ODS version when it is not zero
- Hovering over icons in privileges window, now really shows the grantor
- Improved parsing of SELECT statements
- Support for INSERT..RETURNING and EXECUTE STATEMENT that return a single record
- Fixed messagebox flood when Execute Procedure called and it doesn't return anything
- Print preview and SaveToHtmlFile works again for manual and changelog
- Extracting invalid DDL (missing domain data in system tables) does not crash FR anymore
- Silent installation (on Windows) does not show changelog window anymore
- Autogenerated domains (system domains) do not show up in the tree anymore
- Added ALTER DOMAIN action for domains
- Tree now shows NOT NULL for columns that inherit NOT NULL from domain
- Fixed parsing bug when non-reserved keyword is used as identifier
- Fixed autocomplete for selectable procedure alias when procedure call contains parameters (in PSQL)





Changes in FlameRobin 0.8.3 ALPHA


New features

- Even more detailed query execution statistics showing number of inserted, updated and deleted records for each table
- Fully customizable icon theme (you can create you own icon theme for FlameRobin without recompiling anything)


Enhancements and Bug fixes

- Optimizations for work over slow networks
- Configurable default action for tree items now also allow to SELECT FROM table, view or procedure
- Select and Execute for procedures merged into a single action depending on procedure type
- Better handling of exceptions, FlameRobin should not 'just crash' on Linux anymore
- Added Extract DDL for entire database to Advanced menu - opens directly in SQL editor
- SQL Editor: Minor cleanup of menus (both context and main menu)
- SQL Editor: Fixed enabling of Delete and Insert icons
- SQL Editor: Logging can now optionally be disabled for the current editor window
- SQL Editor: Upper or lower case keywords are now a customizable option
- SQL Editor: Database path in status bar is no longer overwritten
- SQL Editor: Faster and more correct parsing of large statements
- SQL Editor: Fixed problem with query plan not being shown for DML statements
- ALTER PROCEDURE now keeps objects' descriptions
- Tree view: System table columns behave like regular table columns
- Tree view: Only show first line for multiline text (computed columns and such)
- Tree view: Show special icon for foreign keys
- Fixes in generator of selectable stored procedures
- Aliases added to generated SELECT queries (makes easier editing afterwards)
- DataGrid: Fixed problems with speed when large dataset it loaded
- DataGrid: handles Shift+Space to select rows, Ctrl+Space to select columns
- DataGrid: deleted rows are not removed, but colored differently until user commits
- DataGrid: date and timestamp columns support "NOW", "DATE", "TODAY", "TOMORROW", "YESTERDAY"
- DataGrid: time columns support "NOW" and "TIME"
- DataGrid: parsing of milliseconds fixed
- DataGrid: all the edits can optionally be logged (as if they were statements typed into editor)
- DataGrid: date, time and timestamp entry now respects user's formatting
- Increased the default size of main FlameRobin window
- Option to remember window positions and sizes in now ON by default
- Find dialog is left as-is on subsequent searches
- Backup file extensions now default to .fbk and .gbk
- Backup and restore fixes regarding password entry
- Warning message when logging fails
- Nicer password dialog
- Fixed problem that a random number was shown when index statistics is NULL
- Fixed a dialog-loop bug that would pop up a lot of message boxes under some conditions
- Fixed crashes when working with objects with long names on Gtk





Changes in FlameRobin 0.8.1 ALPHA


New features

- SQL Editor: added command to Execute statements from cursor position
- SQL Editor: themable toolbar icons (support for entire FR in next version)


Enhancements and Bug fixes

- SQL Editor window now has a standard menu and toolbar
- Editable grid: fields are now set to NULL when DELETE key is pressed in empty box
- Fixed crash when Insert clicked after transaction Commit/Rollback
- Fixed crash when Insert clicked while editing field value
- Fixed problem with Insert being disabled until column info is loaded
- Fixed charset conversion problems with editable grid and insert dialog
- Insert and Delete buttons are now properly enabled and disabled
- Fixed DDL extraction for usernames in privileges
- Windows version can be installed without administrative privileges





Changes in FlameRobin 0.8.0 ALPHA


New features

- DataGrid: ability to edit (UPDATE) existing rows directly in the grid
- DataGrid: ability to add (INSERT) rows in the grid (with BLOB support)
- DataGrid: ability to remove (DELETE) one or multiple rows from the grid
- DataGrid: all features of editable grid work even for joins and complex queries
- DataGrid: data can now be exported as CSV values
- A basic Test Data Generator (please test, we need your feedback to improve it)
- Ability to create a selectable stored procedure for a table


Enhancements and Bug fixes

- DataGrid: Major improvement on memory consumption and speed
- DataGrid: Columns are named after aliases when available
- DataGrid: CHARACTER SET OCTETS columns shown as hexadecimal strings
- DataGrid: Proper display of DB_KEY columns
- DataGrid: New config option: automatically fetch all records (use with care)
- Property pages show database path instead of useless internal link info
- Property pages of system tables are now closed upon disconnecting
- Property pages now show owner for tables, views and procedures
- Fixed DDL extraction for usernames in GRANT statements
- Fixed DDL extraction for expression based indexes
- Fixed DDL extraction for multisegment indexes
- Fixed DDL extraction for external tables
- Fixed DDL extraction for computed columns (char and varchar size)
- Fixed DDL extraction for DEFAULTs
- SQL Editor: Enabled autocompletion for columns of system tables
- SQL Editor: Filename shown in dialog title
- SQL Editor: Files can be opened by drag&drop into editor window
- SQL Editor: Detailed query execution statistics
- SQL Editor: Improved startup speed
- Database size display now supports databases bigger than 2GB
- Database read-only status is now reported correctly
- Enabled drag&drop of files into backup, restore and database dialog
- Generator values can be reloaded now
- Basic 'edit domain' functionality via SQL
- Fixed charset conversion for ISO8859_x character sets
- Fixed charset conversion for UTF8 in ANSI build
- Fixed parsing bug that can hang the program at 100% CPU usage
- Fixed crash when Manage Users option is called from the Server menu
- Fixed crash when charset conversion fails
- Start arguments -u and -uh are now respected for fr_settings.conf as well
- UDFs that views depend on are now shown in Dependencies page
- Various minor bugfixes




Changes in FlameRobin 0.7.6 ALPHA


New features

- Logging changes to database table (so far only logging to textual files was available)
- Finally, FlameRobin is 100% compatible with Firebird 2.0


Enhancements and Bug fixes

- Improved parsing of committed statements
- Fixed bug #1591149 when reserved XML characters were used in database properties
- Fixed bug #1582935 with drag and drop query building
- Setting to clear log when executing is now respected
- Added META tag to exported HTML data: set to UTF-8 encoding
- Fixed invalid columns when fetching data fails
- Autocompletion now works properly with quoted identifiers
- Fixed crash when loading of property page fails
- Fixed crash when automatic DDL commit was active
- Fixed ALTER VIEW script - triggers are now included
- Fixed DDL extraction for UNIQUE INDEX
- Fixed DDL extraction for NUMERIC(x, 0) types
- Fixed problem with selection becoming invisible on Linux/Gtk
- Main tree view now behaves consistently on both double-click and Enter pressed
- Fixed minor UI glitches




Changes in FlameRobin 0.7.5 ALPHA


New features

- System tables now are available in main tree view
- Autocompletion of column/parameter names and old/new aliases in triggers
- Compatibility with Firebird 2.0


Enhancements and Bug fixes

- SQL Editor: Use row:col instead of col:row in statusbar
- SQL Editor: Autocompletion now works for case-sensitive object names
- SQL Editor: Autocompletion now works for names containing $ character
- Data grid: "Fetch all records" and "Cancel fetching all records" commands
- Data grid: "Copy records as Update" command
- SQL script execution now always stops on error
- Confirm dropping of items from main tree
- Fixed bugs related to character set conversions
- Fixed DDL extraction for various object types




Changes in FlameRobin 0.7.2 ALPHA


Enhancements and Bug fixes

- Fixed crash when opening role's property page with Firebird 1.x
- Fixed DDL extraction for unique constraints
- Fixed updating of privileges page for procedures
- Removed dependency on Firebird 2.0 for Gtk2 package




Changes in FlameRobin 0.7.1 ALPHA


Enhancements and Bug fixes

- Firebird client library version is removed from About box
- This version works with Firebird 1.0




Changes in FlameRobin 0.7.0 ALPHA


New features

- User management
- View, grant and revoke privileges on database objects
- Encrypted password storage
- Search SQL statement history and remove chosen entries
- Property page for databases
- License changed from IDPL to MIT/Expat
- Advanced metadata search (experimental - please provide feedback, so we can improve it)


Enhancements and Bug fixes

- Consistent property pages navigation
- UTF-8 charset changed to proper UTF8
- Identify user-named system-generated indices (needed for FB > 1.0)
- Fixed DDL extraction for various objects
- Two-step loading of property pages (more user friendly)
- Option to show objects DDL in SQL editor
- SQL Editor: ignore function keys when Ctrl or Alt are down
- Data grid: right-align nulls for numeric columns
- Data grid: display of milliseconds for time values
- Data grid: improved display of Unicode characters
- Various changes of user preferences are now instantly applied
- GTK: changes of tree control to look like native one
- GTK: Use of standard button IDs adds icons and localized captions
- Statement parser: identifiers of one char are no longer handled as empty
- Property pages now display much faster
- Autogenerated INSERT statements now show default values where available
- Firebird client library version is shown in About box
- various UI fixes and enhancements




Changes in FlameRobin 0.6.0 ALPHA


New features

- DDL extraction for all object types
- Rebuild View option (drop and recreate dependent objects)
- Option to drop database


Enhancements and Bug fixes

- TCP port setting is not longer ignored when creating, backing up and restoring databases
- New dialog for index creation.
- Field properties dialog can now be closed when no changes are made.
- Main tree control now behaves natively on all platforms.
- Progress dialog when connecting has ability to cancel
- Windows: FlameRobin doesn't destroy Clipboard contents when exiting
- Gtk2: Reduced font size for property pages.
- Gtk2: allow user to enter filename in dialogs.
- Other minor UI improvements.
- Faster disconnecting.
- Faster startup of SQL editor, statement history stored in separate files.
- Warn when copying data from the grid and not all rows have been fetched.
- If error happens while executing selection, the executed statement is selected in SQL editor.
- Fixed problem with context menu and large selection in SQL Editor.
- Fixed hiding of SQL editor behind other windows.
- Data grid is now scrolled by rows
- Triggers can be added/dropped from table's "Triggers" page.
- Take character set and collation into account when adding new columns.
- Configurable columns (default value, description) on table's property page.
- All UPDATE statements were treated as DDL. Fixed.
- Fixed bugs in statement parser.
- Preserve character sets when altering procedures.
- Added missing whitespace between AS and procedure source.
- Privileges are restored after ALTER VIEW.
- Property pages are now updated after ALTER INDEX and SET STATISTICS
- Custom charsets are now really used when connecting to database.
- Logging can now log SET TERM statements if desired.
- Logging now detects if target directory doesn't exist.
- Updated documentation about building FlameRobin.




Changes in FlameRobin 0.5.0 ALPHA


New features

- Event monitor: a dialog to register for and monitor posted events
- Support for quoted identifiers (case sensitive, etc.)
- Quick metadata search from the main screen
- Ability to retrive server version


Enhancements and Bug fixes

- Parsing of executed statements rewritten to work properly
- "Alter" menu item for procedures, triggers and views
- Allow user to enter backup filename with GTK2
- Fixed message dialogs which didn't have any buttons on GTK1
- Improved dependency detection (objects referenced in CHECK constraints)
- Support for 64-bit platforms
- SQL editor is no longer created beneath other windows
- Option to change tab size in SQL editor
- Option to show long line marker in SQL editor
- Many minor fixes and improvements for SQL editor
- Fixed problem with visible caret when SQL editor doesn't have focus
- Improved running of large SQL scripts
- Fixed problem with auto-completion on GTK2
- Option to limit size of single item in statement history
- Fixed drag and drop query building with multiple foreign keys
- Fixed disconnect problems on some Linux distributions
- Registered server and databases are saved instantly (for multiple instances of FlameRobin)
- Display name was used instead of hostname for backup and restore
- Fixed backup and restore problems on PPC
- Backup and restore dialogs show file selector with path of current file name
- Backup and restore settings are remembered on database basis
- FlameRobin is buildable with Borland's compiler again
- Improved overall speed in some areas
- Fixed reported character field lengths for multibyte character sets
- Fixed problems with datatypes when there aren't any user-defined domains in database
- Links included in saved .html Property pages
- Changed the way strings are translated in Unicode versions
- Cancel button isn't ignored anymore when adding unique constraints
- Cancel button isn't ignored anymore when reordering fields
- Improved Field editor
- Allow usage of various formats for multiple log files




Changes in FlameRobin 0.4.0 ALPHA


New features

- History of SQL statements, presistent even after closing program
- Activate/deactivate option for triggers
- "Drop multiple columns" option for tables
- Execute option for procedures
- Preferences can be set on database basis (ex. logging)
- Option to restore backup into new database
- Support for SET AUTODDL isql feature and option to automatically commit DDL statements
- Support for RECREATE and CREATE OR ALTER statements
- FreeBSD port


Enhancements and Bug fixes

- Fixed bug when password is supplied upon connecting
- Fixed parsing of committed statements when statement starts with a comment
- Main menu system reorganized
- Configuration files reorganized: user configuration files stored in user's directories
- Option to hide the status bar
- Option to hide databases that are not connected
- Fixed background colors of read-only fields in various dialogs
- Fixed "no database assigned" error for new databases
- Made sure the statement with error is visible in large scripts
- Changed the execute key to F4, as F9 has a special meaning on some platforms
- Long text now wraps on Dependencies page, making to easier to read
- Fixed scrollbar bugs of data grid with Linux port
- Mousewheel now works on Linux
- IBPP library sources added to the project
- Compare database's and connection charset and warn user if they differ
- Bigint datatype added to field properties dialog
- Option to disable autocompletion inside quoted text
- Fixed bug that sql editor dialog can have an empty title
- Improved handling of fatal exceptions




Changes in FlameRobin 0.3.0 ALPHA


New features

- Support for computed columns (shown in tree, removed from insert statements)
- Calltips for UDFs
- Properties page for UDFs
- Option "create new trigger" for tables and views
- Support for table indices - display, add, drop, recompute stats., edit descriptions
- Property page for view's triggers
- Select object's name in SQL editor and get its properties page
- Context menu for properties windows with options to print and save contents
- Implemented "open in new window" context menu option for properties page links
- Added main menu for main application window
- Added "diplay name" to servers and databases
- "Connect as" option for databases: ability to connect as different user/role without need to register new database



Enhancements and Bug fixes

- ALTER TABLE x ALTER COLUMN y updates the tree/properties page
- Improved handling when adding NOT NULL columns
- Fixed bug when SP and triggers contained ampersand (&) in source (FR would hang)
- Size and position of minimized windows is not stored anymore
- Pressing function keys and clicking buttons in SQL editor now does the same
- Prompt to overwrite files when saving in SQL editor
- Faster startup upon connection since domains are loaded on-demand
- Dropping tables and views now properly removes triggers from tree
- Fixed parsing of CREATE,ALTER,DROP trigger statements (tables/views get notified)
- Saving data to html file now uses default .html extension if user does not supply it
- Fixed and improved dependencies detection for database objects
- Fixed logging to file: newlines are added when headers are off
- Registration of Firebird embedded server is now possible from application
- Firebird 1.5 charsets made available, charset box is user editable to support future charsets
- Current tree item's database printed in status bar instead of tooltip
- Improved connecting speed by postponing loading of autogenerated domain info




Changes in FlameRobin 0.2.5 ALPHA


New features

- New Preferences dialog.
- Option to show/hide datatype and/or domain name in tree.
- Ability to keep working after fatal errors.
- Ability to prepare a statement (and show its PLAN) without actually executing it.
- New context menu for the SQL Editor and new "Execute selected" command.
- Ability to set a custom font for the SQL Editor.
- Ability to set a custom font for the data grid header and cells.
- Option to maximize the data grid when a certain number of rows has been fetched.
- SQL Editor: auto-completion can be disabled and invoked manually.
- Calltips for stored procedures in the SQL Editor.
- Basic drag&drop stuff (drag columns/tables from the tree to the SQL Editor).
- SQL Editor: new Option to clear old messages when executing new statements.
- You can set up logging of DDL (and optionally DML) statements to user defined log file(s).
- Configurable double-click action for tables, views and SPs in main tree.
- Option to prompt on exit.
- Option to alphabetically sort server and database entries in tree.
- Option to center dialogs on the screen.
- SQL Editor: new Search & replace tool (with support for regular expressions).
- Ability to add a new column to a table directly from the tree.
- Option to disallow showing table/view columns and stored procedure parameters as tree nodes.
- Option to make it so that a double click on a tree item shows the properties dialog instead of expanding the subtree.
- Added context menu for table columns in tree.


Enhancements and Bug fixes

- Data grid: tabs used as separators instead of spaces when copying data to the clipboard.
- Added server name (beside user@host) to the SQL Editor status bar.
- "Insert into" command now puts VALUES clause on a new line.
- Data grid: fixed display issue for non-null blobs.
- Better automatic name suggestion for constraints (avoids duplicate names).
- Fixed bug that caused FR to consume 100% CPU while doing nothing.
- Databases couldn't be created if Page size was left to the default value.
- SQL Editor: FR did hang when "set term" was issued without terminator.
- SQL Editor: fixed bug when statement consisting solely of comments is executed.
- SQL Editor: comments before SET statements were not handled correctly.
- Data grid: platform-standard line breaks are now used when copying data to the clipboard.
- Undo/redo/cut/copy/paste now work properly in the SQL Editor.
- The Data grid is now much more responsive even with a lot of NULLs in it.
- SQl Editor: added NULL to autocomplete list (solves known NULLIF problem).
- Fixed constant 1-pixel frame growth for Windows 98.
- Made database connections actually respect the charset.
- Maintain separate size for database creation/registration info dialogs.
- ALTER PROCEDURE now correctly reloads procedure parameters.
- Changing column datatype for field editor now works.
- Tree nodes can now be activated with double-click/Enter key on Linux too.
- Enabled clicking inside selection in the SQL Editor.
- Copy/paste of descriptions now works on Linux too.
- Fixed crash when changing field type from one to another user defined domain.
- Fixed known issue: if the connection credentials (username and password) of a registered database were modified, the new credentials were not used until FlameRobin was restarted.




Changes in FlameRobin 0.2.0 ALPHA


New features

- Brand new Backup/Restore dialogs that work in background, let you suppress the output messages and store their settings among invocations. Plus, the output messages can be copied to the clipboard.
- Many dialogs have been redesigned and now feature a cleaner GUI.
- "Show value" and "Show all values" context menu commands implemented for generators.
- Exceptions are now shown in the tree view and have Create/Drop menu commands and a property page.
- Property pages for triggers, table constraints, dependencies (all objects), generators were added. Plus, a special empty property page now appears for not yet supported object types, instead of an error message.
- Ability to view/add/drop table constraints.
- Reconnect menu command for databases will physically disconnect and reconnect a database in one shot.
- "Create new" and "Drop" commands added for external functions.
- New MacOS X port.



Enhancements and Bug fixes

- When new objects are added to the database through a "CREATE" DDL statement, they are inserted in the right place in the tree view, instead of at the end of the lists.
- The tree view shows primary key table fields with a different icon.
- It is now possible to edit triggers.
- User-defined domain names appear together with column datatypes in the property pages.
- Improved startup speed.
- config.ini entry "FrameStorage=1" now works for all frames and dialogs (it only stores size - not position - for dialogs).
- New multi-format program icon that looks OK at all sizes (16x16, 32x32, 48x48 and 128x128).
- In the SQL Window you can press Ctrl + "+" and Ctrl + "-" to increase and decrease the font size. The setting is remembered across sessions of FlameRobin.
- In the Server Registration dialog the controls are now read-only if any database is connected.
- New program icon.
- Assorted bug fixes.




flamerobin_0.9.3~svn+2220.orig/docs/html.css000066400000000000000000000006771177057155300206230ustar00rootroot00000000000000body { background: #FFFFFF; font-family: sans-serif; } h1, h2, h3, h4, h5, h6, h7, h8 { color: #800000; font-family: sans-serif; } span.term { font-weight: bold; } div.sidebar { background: #F0F0F0; border: 1px solid gray; padding: 5px; margin: 20px; } pre.programlisting { background: #F0F0F0; border: 1px solid gray; padding: 2px; font-size: 10pt; white-space: pre; } flamerobin_0.9.3~svn+2220.orig/flamerobin.bkl000066400000000000000000000721011177057155300210140ustar00rootroot00000000000000 WXUSINGDLL u d on off off size s dynamic static _amd64 _amd64 _ia64 _ia64 /MACHINE:AMD64 /MACHINE:AMD64 /MACHINE:IA64 /MACHINE:IA64 $(value) $(COMPILER)$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU) . src res IBPP_DARWIN IBPP_LINUX IBPP_WINDOWS $(SOURCEDIR)/config/Config.h $(SOURCEDIR)/config/DatabaseConfig.h $(SOURCEDIR)/core/ArtProvider.h $(SOURCEDIR)/core/CodeTemplateProcessor.h $(SOURCEDIR)/core/FRError.h $(SOURCEDIR)/core/ObjectWithHandle.h $(SOURCEDIR)/core/Observer.h $(SOURCEDIR)/core/ProcessableObject.h $(SOURCEDIR)/core/ProgressIndicator.h $(SOURCEDIR)/core/StringUtils.h $(SOURCEDIR)/core/Subject.h $(SOURCEDIR)/core/TemplateProcessor.h $(SOURCEDIR)/core/URIProcessor.h $(SOURCEDIR)/core/Visitor.h $(SOURCEDIR)/engine/MetadataLoader.h $(SOURCEDIR)/frutils.h $(SOURCEDIR)/frversion.h $(SOURCEDIR)/gui/AboutBox.h $(SOURCEDIR)/gui/AdvancedMessageDialog.h $(SOURCEDIR)/gui/AdvancedSearchFrame.h $(SOURCEDIR)/gui/BackupFrame.h $(SOURCEDIR)/gui/BackupRestoreBaseFrame.h $(SOURCEDIR)/gui/BaseDialog.h $(SOURCEDIR)/gui/BaseFrame.h $(SOURCEDIR)/gui/CommandIds.h $(SOURCEDIR)/gui/CommandManager.h $(SOURCEDIR)/gui/ConfdefTemplateProcessor.h $(SOURCEDIR)/gui/ContextMenuMetadataItemVisitor.h $(SOURCEDIR)/gui/controls/ControlUtils.h $(SOURCEDIR)/gui/controls/DataGrid.h $(SOURCEDIR)/gui/controls/DataGridRowBuffer.h $(SOURCEDIR)/gui/controls/DataGridRows.h $(SOURCEDIR)/gui/controls/DataGridTable.h $(SOURCEDIR)/gui/controls/DBHTreeControl.h $(SOURCEDIR)/gui/controls/DndTextControls.h $(SOURCEDIR)/gui/controls/LogTextControl.h $(SOURCEDIR)/gui/controls/PrintableHtmlWindow.h $(SOURCEDIR)/gui/controls/TextControl.h $(SOURCEDIR)/gui/CreateIndexDialog.h $(SOURCEDIR)/gui/DataGeneratorFrame.h $(SOURCEDIR)/gui/DatabaseRegistrationDialog.h $(SOURCEDIR)/gui/EditBlobDialog.h $(SOURCEDIR)/gui/EventWatcherFrame.h $(SOURCEDIR)/gui/ExecuteSqlFrame.h $(SOURCEDIR)/gui/ExecuteSql.h $(SOURCEDIR)/gui/FieldPropertiesDialog.h $(SOURCEDIR)/gui/FindDialog.h $(SOURCEDIR)/gui/FRLayoutConfig.h $(SOURCEDIR)/gui/HtmlHeaderMetadataItemVisitor.h $(SOURCEDIR)/gui/HtmlTemplateProcessor.h $(SOURCEDIR)/gui/GUIURIHandlerHelper.h $(SOURCEDIR)/gui/InsertDialog.h $(SOURCEDIR)/gui/MainFrame.h $(SOURCEDIR)/gui/MetadataItemPropertiesFrame.h $(SOURCEDIR)/gui/MultilineEnterDialog.h $(SOURCEDIR)/gui/PreferencesDialog.h $(SOURCEDIR)/gui/PrivilegesDialog.h $(SOURCEDIR)/gui/ProgressDialog.h $(SOURCEDIR)/gui/ReorderFieldsDialog.h $(SOURCEDIR)/gui/RestoreFrame.h $(SOURCEDIR)/gui/ServerRegistrationDialog.h $(SOURCEDIR)/gui/SimpleHtmlFrame.h $(SOURCEDIR)/gui/StatementHistoryDialog.h $(SOURCEDIR)/gui/StyleGuide.h $(SOURCEDIR)/gui/UserDialog.h $(SOURCEDIR)/gui/UsernamePasswordDialog.h $(SOURCEDIR)/Isaac.h $(SOURCEDIR)/logger.h $(SOURCEDIR)/main.h $(SOURCEDIR)/MasterPassword.h $(SOURCEDIR)/metadata/collection.h $(SOURCEDIR)/metadata/column.h $(SOURCEDIR)/metadata/constraints.h $(SOURCEDIR)/metadata/CreateDDLVisitor.h $(SOURCEDIR)/metadata/database.h $(SOURCEDIR)/metadata/domain.h $(SOURCEDIR)/metadata/exception.h $(SOURCEDIR)/metadata/function.h $(SOURCEDIR)/metadata/generator.h $(SOURCEDIR)/metadata/Index.h $(SOURCEDIR)/metadata/MetadataClasses.h $(SOURCEDIR)/metadata/metadataitem.h $(SOURCEDIR)/metadata/MetadataItemCreateStatementVisitor.h $(SOURCEDIR)/metadata/MetadataItemDescriptionVisitor.h $(SOURCEDIR)/metadata/MetadataItemURIHandlerHelper.h $(SOURCEDIR)/metadata/MetadataItemVisitor.h $(SOURCEDIR)/metadata/MetadataTemplateManager.h $(SOURCEDIR)/metadata/parameter.h $(SOURCEDIR)/metadata/privilege.h $(SOURCEDIR)/metadata/procedure.h $(SOURCEDIR)/metadata/relation.h $(SOURCEDIR)/metadata/role.h $(SOURCEDIR)/metadata/root.h $(SOURCEDIR)/metadata/server.h $(SOURCEDIR)/metadata/table.h $(SOURCEDIR)/metadata/trigger.h $(SOURCEDIR)/metadata/view.h $(SOURCEDIR)/metadata/User.h $(SOURCEDIR)/sql/Identifier.h $(SOURCEDIR)/sql/IncompleteStatement.h $(SOURCEDIR)/sql/MultiStatement.h $(SOURCEDIR)/sql/SelectStatement.h $(SOURCEDIR)/sql/SqlStatement.h $(SOURCEDIR)/sql/SqlTokenizer.h $(SOURCEDIR)/sql/StatementBuilder.h $(SOURCEDIR)/statementHistory.h $(SOURCEDIR)/gui/gtk/StyleGuideGTK.cpp $(SOURCEDIR)/gui/mac/StyleGuideMAC.cpp $(SOURCEDIR)/gui/msw/StyleGuideMSW.cpp $(SOURCEDIR)/addconstrainthandler.cpp $(SOURCEDIR)/config/Config.cpp $(SOURCEDIR)/config/DatabaseConfig.cpp $(SOURCEDIR)/core/ArtProvider.cpp $(SOURCEDIR)/core/CodeTemplateProcessor.cpp $(SOURCEDIR)/core/FRError.cpp $(SOURCEDIR)/core/Observer.cpp $(SOURCEDIR)/core/ProgressIndicator.cpp $(SOURCEDIR)/core/StringUtils.cpp $(SOURCEDIR)/core/Subject.cpp $(SOURCEDIR)/core/TemplateProcessor.cpp $(SOURCEDIR)/core/URIProcessor.cpp $(SOURCEDIR)/core/Visitor.cpp $(SOURCEDIR)/databasehandler.cpp $(SOURCEDIR)/engine/MetadataLoader.cpp $(SOURCEDIR)/frprec.cpp $(SOURCEDIR)/frutils.cpp $(SOURCEDIR)/gui/AboutBox.cpp $(SOURCEDIR)/gui/AdvancedMessageDialog.cpp $(SOURCEDIR)/gui/AdvancedSearchFrame.cpp $(SOURCEDIR)/gui/BackupFrame.cpp $(SOURCEDIR)/gui/BackupRestoreBaseFrame.cpp $(SOURCEDIR)/gui/BaseDialog.cpp $(SOURCEDIR)/gui/BaseFrame.cpp $(SOURCEDIR)/gui/CommandManager.cpp $(SOURCEDIR)/gui/ConfdefTemplateProcessor.cpp $(SOURCEDIR)/gui/ContextMenuMetadataItemVisitor.cpp $(SOURCEDIR)/gui/controls/ControlUtils.cpp $(SOURCEDIR)/gui/controls/DataGrid.cpp $(SOURCEDIR)/gui/controls/DataGridRowBuffer.cpp $(SOURCEDIR)/gui/controls/DataGridRows.cpp $(SOURCEDIR)/gui/controls/DataGridTable.cpp $(SOURCEDIR)/gui/controls/DBHTreeControl.cpp $(SOURCEDIR)/gui/controls/DndTextControls.cpp $(SOURCEDIR)/gui/controls/LogTextControl.cpp $(SOURCEDIR)/gui/controls/PrintableHtmlWindow.cpp $(SOURCEDIR)/gui/controls/TextControl.cpp $(SOURCEDIR)/gui/CreateIndexDialog.cpp $(SOURCEDIR)/gui/DataGeneratorFrame.cpp $(SOURCEDIR)/gui/DatabaseRegistrationDialog.cpp $(SOURCEDIR)/gui/EditBlobDialog.cpp $(SOURCEDIR)/gui/EventWatcherFrame.cpp $(SOURCEDIR)/gui/ExecuteSqlFrame.cpp $(SOURCEDIR)/gui/ExecuteSql.cpp $(SOURCEDIR)/gui/FieldPropertiesDialog.cpp $(SOURCEDIR)/gui/FindDialog.cpp $(SOURCEDIR)/gui/FRLayoutConfig.cpp $(SOURCEDIR)/gui/GUIURIHandlerHelper.cpp $(SOURCEDIR)/gui/HtmlHeaderMetadataItemVisitor.cpp $(SOURCEDIR)/gui/HtmlTemplateProcessor.cpp $(SOURCEDIR)/gui/InsertDialog.cpp $(SOURCEDIR)/gui/MainFrame.cpp $(SOURCEDIR)/gui/MetadataItemPropertiesFrame.cpp $(SOURCEDIR)/gui/MultilineEnterDialog.cpp $(SOURCEDIR)/gui/PreferencesDialog.cpp $(SOURCEDIR)/gui/PreferencesDialogSettings.cpp $(SOURCEDIR)/gui/PrivilegesDialog.cpp $(SOURCEDIR)/gui/ProgressDialog.cpp $(SOURCEDIR)/gui/ReorderFieldsDialog.cpp $(SOURCEDIR)/gui/RestoreFrame.cpp $(SOURCEDIR)/gui/ServerRegistrationDialog.cpp $(SOURCEDIR)/gui/SimpleHtmlFrame.cpp $(SOURCEDIR)/gui/StatementHistoryDialog.cpp $(SOURCEDIR)/gui/StyleGuide.cpp $(SOURCEDIR)/gui/UserDialog.cpp $(SOURCEDIR)/gui/UsernamePasswordDialog.cpp $(SOURCEDIR)/logger.cpp $(SOURCEDIR)/main.cpp $(SOURCEDIR)/MasterPassword.cpp $(SOURCEDIR)/metadata/column.cpp $(SOURCEDIR)/metadata/constraints.cpp $(SOURCEDIR)/metadata/CreateDDLVisitor.cpp $(SOURCEDIR)/metadata/database.cpp $(SOURCEDIR)/metadata/domain.cpp $(SOURCEDIR)/metadata/exception.cpp $(SOURCEDIR)/metadata/function.cpp $(SOURCEDIR)/metadata/generator.cpp $(SOURCEDIR)/metadata/Index.cpp $(SOURCEDIR)/metadata/metadataitem.cpp $(SOURCEDIR)/metadata/MetadataItemCreateStatementVisitor.cpp $(SOURCEDIR)/metadata/MetadataItemDescriptionVisitor.cpp $(SOURCEDIR)/metadata/MetadataItemURIHandlerHelper.cpp $(SOURCEDIR)/metadata/MetadataItemVisitor.cpp $(SOURCEDIR)/metadata/MetadataTemplateCmdHandler.cpp $(SOURCEDIR)/metadata/MetadataTemplateManager.cpp $(SOURCEDIR)/metadata/parameter.cpp $(SOURCEDIR)/metadata/privilege.cpp $(SOURCEDIR)/metadata/procedure.cpp $(SOURCEDIR)/metadata/relation.cpp $(SOURCEDIR)/metadata/role.cpp $(SOURCEDIR)/metadata/root.cpp $(SOURCEDIR)/metadata/server.cpp $(SOURCEDIR)/metadata/table.cpp $(SOURCEDIR)/metadata/trigger.cpp $(SOURCEDIR)/metadata/User.cpp $(SOURCEDIR)/metadata/view.cpp $(SOURCEDIR)/objectdescriptionhandler.cpp $(SOURCEDIR)/sql/Identifier.cpp $(SOURCEDIR)/sql/IncompleteStatement.cpp $(SOURCEDIR)/sql/MultiStatement.cpp $(SOURCEDIR)/sql/SelectStatement.cpp $(SOURCEDIR)/sql/SqlStatement.cpp $(SOURCEDIR)/sql/SqlTokenizer.cpp $(SOURCEDIR)/sql/StatementBuilder.cpp $(SOURCEDIR)/statementHistory.cpp $(FR_PLATFORMSPECIFICSOURCES) $(DOLLAR)(srcdir)/conf-defs conf-defs fr_settings.confdef db_settings.confdef $(DOLLAR)(srcdir)/docs docs fr_license.html fr_manual.html fr_whatsnew.html html.css $(DOLLAR)(srcdir)/code-templates code-templates create_trigger.confdef create_trigger.info create_trigger.template create_change_trigger.confdef create_change_trigger.info create_change_trigger.template create_selectable_execute_block.confdef create_selectable_execute_block.info create_selectable_execute_block.template create_selectable_procedure.confdef create_selectable_procedure.info create_selectable_procedure.template delete.confdef delete.info delete.template extract_full_ddl.info extract_full_ddl.template insert.confdef insert.info insert.template select.confdef select.info select.template template_info.confdef update.confdef update.info update.template $(DOLLAR)(srcdir)/html-templates html-templates ALLloading.html DATABASE.html DATABASEtriggers.html DDL.html DOMAIN.html EXCEPTION.html FUNCTION.html GENERATOR.html PROCEDURE.html PROCEDUREprivileges.html ROLE.html ROLEprivileges.html SERVER.html TABLE.html TABLEconstraints.html TABLEtriggers.html TABLEindices.html TABLEprivileges.html TRIGGER.html VIEW.html VIEWprivileges.html VIEWtriggers.html dependencies.html header.html compute.png drop.png ok.png ok2.png redx.png view.png $(DOLLAR)(srcdir)/res res $(DOLLAR)(srcdir)/sys-templates sys-templates browse_data.template execute_procedure.template save_as_csv.confdef save_as_csv.template FlameRobin.app/Contents $(BUNDLE)/PkgInfo $(BUNDLE)/PkgInfo $(DOLLAR)(srcdir)/res/flamerobin.Info.plist.in $(DOLLAR)(srcdir)/res/flamerobin.icns $(id) $(BUNDLE_PLIST_IN) $(BUNDLE_ICONS) mkdir -p $(BUNDLE) mkdir -p $(BUNDLE)/MacOS mkdir -p $(BUNDLE)/Resources mkdir -p $(BUNDLE)/SharedSupport mkdir -p $(BUNDLE)/SharedSupport/code-templates mkdir -p $(BUNDLE)/SharedSupport/conf-defs mkdir -p $(BUNDLE)/SharedSupport/docs mkdir -p $(BUNDLE)/SharedSupport/html-templates echo -n "APPL????" >$(BUNDLE)/PkgInfo ln -f $(ref("__targetdir",id))$(ref("__targetname",id)) $(BUNDLE)/MacOS/$(id) sed -e "s/VERSION/`cat $(srcdir)/src/frversion.h | \ awk '/FR_VERSION_MAJOR/ {ma = $$3} \ /FR_VERSION_MINOR/ {mi = $$3} \ /FR_VERSION_RLS/ {rls = $$3} \ END {printf "%d.%d.%d", ma, mi, rls}'`/" \ -e "s/YEAR/`date '+%Y'`/" $(BUNDLE_PLIST_IN) > $(BUNDLE)/Info.plist cp -f $(BUNDLE_ICONS) $(BUNDLE)/Resources cp -R $(DOLLAR)(srcdir)/code-templates/* $(BUNDLE)/SharedSupport/code-templates cp -R $(DOLLAR)(srcdir)/conf-defs/* $(BUNDLE)/SharedSupport/conf-defs cp -R $(DOLLAR)(srcdir)/docs/* $(BUNDLE)/SharedSupport/docs cp -R $(DOLLAR)(srcdir)/html-templates/* $(BUNDLE)/SharedSupport/html-templates all $(BUNDLE_TGT_REF) rm -rf FlameRobin.app cd $(DOLLAR)(srcdir) && ./update-svn-rev.sh update-svn-rev.cmd $(SVN_REV_SCRIPT) all gui ibpp $(FR_HEADERFILES) $(FR_SOURCEFILES) wx/wxprec.h on $(id) $(SOURCEDIR)/frprec.cpp $(IBPPPLATFORMDEFINE) . $(DOLLAR)(srcdir)/src $(DOLLAR)(srcdir)/src/ibpp $(DOLLAR)(srcdir)/res @WX_INCLUDES@ ./src ./src/ibpp ./res $(RESDIR)/flamerobin.rc ibpp $(id) $(BUILDDIR) flamerobin$(EXEEXT) $(BINDIR) $(CODETEMPLATEDIR) $(CODETEMPLATEFILES) $(DATADIR)/flamerobin/code-templates $(CONFIGOPTIONSDIR) $(CONFIGOPTIONSFILES) $(DATADIR)/flamerobin/conf-defs $(HTMLDOCSDIR) $(HTMLDOCFILES) $(DATADIR)/flamerobin/docs $(HTMLDOCSDIR) flamerobin.1 @mandir@/man1 $(HTMLTEMPLATEDIR) $(HTMLTEMPLATEFILES) $(DATADIR)/flamerobin/html-templates $(RESOURCEDIR) flamerobin.desktop $(DATADIR)/applications $(RESOURCEDIR) flamerobin.png $(DATADIR)/pixmaps $(SYSTEMPLATEDIR) $(SYSTEMPLATEFILES) $(DATADIR)/flamerobin/sys-templates $(SOURCEDIR)/ibpp/_ibpp.h $(SOURCEDIR)/ibpp/ibase.h $(SOURCEDIR)/ibpp/iberror.h $(SOURCEDIR)/ibpp/ibpp.h $(SOURCEDIR)/ibpp/_dpb.cpp $(SOURCEDIR)/ibpp/_ibpp.cpp $(SOURCEDIR)/ibpp/_ibs.cpp $(SOURCEDIR)/ibpp/_rb.cpp $(SOURCEDIR)/ibpp/_spb.cpp $(SOURCEDIR)/ibpp/_tpb.cpp $(SOURCEDIR)/ibpp/array.cpp $(SOURCEDIR)/ibpp/blob.cpp $(SOURCEDIR)/ibpp/database.cpp $(SOURCEDIR)/ibpp/date.cpp $(SOURCEDIR)/ibpp/dbkey.cpp $(SOURCEDIR)/ibpp/events.cpp $(SOURCEDIR)/ibpp/exception.cpp $(SOURCEDIR)/ibpp/row.cpp $(SOURCEDIR)/ibpp/service.cpp $(SOURCEDIR)/ibpp/statement.cpp $(SOURCEDIR)/ibpp/time.cpp $(SOURCEDIR)/ibpp/transaction.cpp $(SOURCEDIR)/ibpp/user.cpp $(IBPP_HEADERFILES) $(IBPP_SOURCEFILES) _ibpp.h on $(id) $(SOURCEDIR)/ibpp/_ibpp.cpp $(IBPPPLATFORMDEFINE) $(DOLLAR)(srcdir)/src/ibpp ./src/ibpp flamerobin_0.9.3~svn+2220.orig/flamerobin.dsw000066400000000000000000000013061177057155300210400ustar00rootroot00000000000000Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "flamerobin"=flamerobin_flamerobin.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name ibpp End Project Dependency Begin Project Dependency Project_Dep_Name ibpp End Project Dependency }}} ############################################################################### Project: "ibpp"=flamerobin_ibpp.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### flamerobin_0.9.3~svn+2220.orig/flamerobin.sln000066400000000000000000000204711177057155300210430ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "flamerobin", "flamerobin_flamerobin.vcproj", "{3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}" ProjectSection(ProjectDependencies) = postProject {F98A5270-7698-516C-9430-13EBB667AEA5} = {F98A5270-7698-516C-9430-13EBB667AEA5} {F98A5270-7698-516C-9430-13EBB667AEA5} = {F98A5270-7698-516C-9430-13EBB667AEA5} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ibpp", "flamerobin_ibpp.vcproj", "{F98A5270-7698-516C-9430-13EBB667AEA5}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug Dynamic|Win32 = Debug Dynamic|Win32 Debug Static|Win32 = Debug Static|Win32 Release Dynamic|Win32 = Release Dynamic|Win32 Release Static|Win32 = Release Static|Win32 Unicode Debug Dynamic|Win32 = Unicode Debug Dynamic|Win32 Unicode Debug Static|Win32 = Unicode Debug Static|Win32 Unicode Release Dynamic|Win32 = Unicode Release Dynamic|Win32 Unicode Release Static|Win32 = Unicode Release Static|Win32 DLL Debug Dynamic|Win32 = DLL Debug Dynamic|Win32 DLL Debug Static|Win32 = DLL Debug Static|Win32 DLL Release Dynamic|Win32 = DLL Release Dynamic|Win32 DLL Release Static|Win32 = DLL Release Static|Win32 DLL Unicode Debug Dynamic|Win32 = DLL Unicode Debug Dynamic|Win32 DLL Unicode Debug Static|Win32 = DLL Unicode Debug Static|Win32 DLL Unicode Release Dynamic|Win32 = DLL Unicode Release Dynamic|Win32 DLL Unicode Release Static|Win32 = DLL Unicode Release Static|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.Debug Dynamic|Win32.ActiveCfg = Debug Dynamic|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.Debug Dynamic|Win32.Build.0 = Debug Dynamic|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.Debug Static|Win32.ActiveCfg = Debug Static|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.Debug Static|Win32.Build.0 = Debug Static|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.Release Dynamic|Win32.ActiveCfg = Release Dynamic|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.Release Dynamic|Win32.Build.0 = Release Dynamic|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.Release Static|Win32.ActiveCfg = Release Static|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.Release Static|Win32.Build.0 = Release Static|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.Unicode Debug Dynamic|Win32.ActiveCfg = Unicode Debug Dynamic|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.Unicode Debug Dynamic|Win32.Build.0 = Unicode Debug Dynamic|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.Unicode Debug Static|Win32.ActiveCfg = Unicode Debug Static|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.Unicode Debug Static|Win32.Build.0 = Unicode Debug Static|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.Unicode Release Dynamic|Win32.ActiveCfg = Unicode Release Dynamic|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.Unicode Release Dynamic|Win32.Build.0 = Unicode Release Dynamic|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.Unicode Release Static|Win32.ActiveCfg = Unicode Release Static|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.Unicode Release Static|Win32.Build.0 = Unicode Release Static|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.DLL Debug Dynamic|Win32.ActiveCfg = DLL Debug Dynamic|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.DLL Debug Dynamic|Win32.Build.0 = DLL Debug Dynamic|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.DLL Debug Static|Win32.ActiveCfg = DLL Debug Static|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.DLL Debug Static|Win32.Build.0 = DLL Debug Static|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.DLL Release Dynamic|Win32.ActiveCfg = DLL Release Dynamic|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.DLL Release Dynamic|Win32.Build.0 = DLL Release Dynamic|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.DLL Release Static|Win32.ActiveCfg = DLL Release Static|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.DLL Release Static|Win32.Build.0 = DLL Release Static|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.DLL Unicode Debug Dynamic|Win32.ActiveCfg = DLL Unicode Debug Dynamic|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.DLL Unicode Debug Dynamic|Win32.Build.0 = DLL Unicode Debug Dynamic|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.DLL Unicode Debug Static|Win32.ActiveCfg = DLL Unicode Debug Static|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.DLL Unicode Debug Static|Win32.Build.0 = DLL Unicode Debug Static|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.DLL Unicode Release Dynamic|Win32.ActiveCfg = DLL Unicode Release Dynamic|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.DLL Unicode Release Dynamic|Win32.Build.0 = DLL Unicode Release Dynamic|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.DLL Unicode Release Static|Win32.ActiveCfg = DLL Unicode Release Static|Win32 {3C914FEE-C6E8-58AA-B046-6E951FCD6BFC}.DLL Unicode Release Static|Win32.Build.0 = DLL Unicode Release Static|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.Debug Dynamic|Win32.ActiveCfg = Debug Dynamic|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.Debug Dynamic|Win32.Build.0 = Debug Dynamic|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.Debug Static|Win32.ActiveCfg = Debug Static|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.Debug Static|Win32.Build.0 = Debug Static|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.Release Dynamic|Win32.ActiveCfg = Release Dynamic|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.Release Dynamic|Win32.Build.0 = Release Dynamic|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.Release Static|Win32.ActiveCfg = Release Static|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.Release Static|Win32.Build.0 = Release Static|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.Unicode Debug Dynamic|Win32.ActiveCfg = Unicode Debug Dynamic|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.Unicode Debug Dynamic|Win32.Build.0 = Unicode Debug Dynamic|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.Unicode Debug Static|Win32.ActiveCfg = Unicode Debug Static|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.Unicode Debug Static|Win32.Build.0 = Unicode Debug Static|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.Unicode Release Dynamic|Win32.ActiveCfg = Unicode Release Dynamic|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.Unicode Release Dynamic|Win32.Build.0 = Unicode Release Dynamic|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.Unicode Release Static|Win32.ActiveCfg = Unicode Release Static|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.Unicode Release Static|Win32.Build.0 = Unicode Release Static|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.DLL Debug Dynamic|Win32.ActiveCfg = DLL Debug Dynamic|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.DLL Debug Dynamic|Win32.Build.0 = DLL Debug Dynamic|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.DLL Debug Static|Win32.ActiveCfg = DLL Debug Static|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.DLL Debug Static|Win32.Build.0 = DLL Debug Static|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.DLL Release Dynamic|Win32.ActiveCfg = DLL Release Dynamic|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.DLL Release Dynamic|Win32.Build.0 = DLL Release Dynamic|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.DLL Release Static|Win32.ActiveCfg = DLL Release Static|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.DLL Release Static|Win32.Build.0 = DLL Release Static|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.DLL Unicode Debug Dynamic|Win32.ActiveCfg = DLL Unicode Debug Dynamic|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.DLL Unicode Debug Dynamic|Win32.Build.0 = DLL Unicode Debug Dynamic|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.DLL Unicode Debug Static|Win32.ActiveCfg = DLL Unicode Debug Static|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.DLL Unicode Debug Static|Win32.Build.0 = DLL Unicode Debug Static|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.DLL Unicode Release Dynamic|Win32.ActiveCfg = DLL Unicode Release Dynamic|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.DLL Unicode Release Dynamic|Win32.Build.0 = DLL Unicode Release Dynamic|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.DLL Unicode Release Static|Win32.ActiveCfg = DLL Unicode Release Static|Win32 {F98A5270-7698-516C-9430-13EBB667AEA5}.DLL Unicode Release Static|Win32.Build.0 = DLL Unicode Release Static|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal flamerobin_0.9.3~svn+2220.orig/flamerobin_flamerobin.dsp000066400000000000000000002407731177057155300232440ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="flamerobin_flamerobin" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=flamerobin - Win32 Debug Dynamic !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "flamerobin_flamerobin.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "flamerobin_flamerobin.mak" CFG="flamerobin - Win32 Debug Dynamic" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "flamerobin - Win32 DLL Unicode Release Static" (based on "Win32 (x86) Application") !MESSAGE "flamerobin - Win32 DLL Unicode Release Dynamic" (based on "Win32 (x86) Application") !MESSAGE "flamerobin - Win32 DLL Unicode Debug Static" (based on "Win32 (x86) Application") !MESSAGE "flamerobin - Win32 DLL Unicode Debug Dynamic" (based on "Win32 (x86) Application") !MESSAGE "flamerobin - Win32 DLL Release Static" (based on "Win32 (x86) Application") !MESSAGE "flamerobin - Win32 DLL Release Dynamic" (based on "Win32 (x86) Application") !MESSAGE "flamerobin - Win32 DLL Debug Static" (based on "Win32 (x86) Application") !MESSAGE "flamerobin - Win32 DLL Debug Dynamic" (based on "Win32 (x86) Application") !MESSAGE "flamerobin - Win32 Unicode Release Static" (based on "Win32 (x86) Application") !MESSAGE "flamerobin - Win32 Unicode Release Dynamic" (based on "Win32 (x86) Application") !MESSAGE "flamerobin - Win32 Unicode Debug Static" (based on "Win32 (x86) Application") !MESSAGE "flamerobin - Win32 Unicode Debug Dynamic" (based on "Win32 (x86) Application") !MESSAGE "flamerobin - Win32 Release Static" (based on "Win32 (x86) Application") !MESSAGE "flamerobin - Win32 Release Dynamic" (based on "Win32 (x86) Application") !MESSAGE "flamerobin - Win32 Debug Static" (based on "Win32 (x86) Application") !MESSAGE "flamerobin - Win32 Debug Dynamic" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "flamerobin - Win32 DLL Unicode Release Static" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "vcus" # PROP BASE Intermediate_Dir "vcus\flamerobin" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "vcus" # PROP Intermediate_Dir "vcus\flamerobin" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MT /Fdvcus\flamerobin.pdb /O1 /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_dll\mswu" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcus\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MT /Fdvcus\flamerobin.pdb /O1 /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_dll\mswu" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcus\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD BASE MTL /nologo /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD MTL /nologo /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=1 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_dll\mswu" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res # ADD RSC /l 0x409 /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=1 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_dll\mswu" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 wxmsw28u_aui.lib wxmsw28u_stc.lib wxmsw28u_html.lib wxmsw28u_adv.lib wxmsw28u_core.lib wxbase28u_xml.lib wxbase28u.lib wxexpat.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcus\ibpp.lib /nologo /machine:i386 /out:"vcus\flamerobin.exe" /pdb:"vcus\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_dll" /subsystem:windows # ADD LINK32 wxmsw28u_aui.lib wxmsw28u_stc.lib wxmsw28u_html.lib wxmsw28u_adv.lib wxmsw28u_core.lib wxbase28u_xml.lib wxbase28u.lib wxexpat.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcus\ibpp.lib /nologo /machine:i386 /out:"vcus\flamerobin.exe" /pdb:"vcus\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_dll" /subsystem:windows !ELSEIF "$(CFG)" == "flamerobin - Win32 DLL Unicode Release Dynamic" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "vcu" # PROP BASE Intermediate_Dir "vcu\flamerobin" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "vcu" # PROP Intermediate_Dir "vcu\flamerobin" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MD /Fdvcu\flamerobin.pdb /O1 /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_dll\mswu" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcu\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MD /Fdvcu\flamerobin.pdb /O1 /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_dll\mswu" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcu\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD BASE MTL /nologo /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD MTL /nologo /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=1 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_dll\mswu" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res # ADD RSC /l 0x409 /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=1 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_dll\mswu" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 wxmsw28u_aui.lib wxmsw28u_stc.lib wxmsw28u_html.lib wxmsw28u_adv.lib wxmsw28u_core.lib wxbase28u_xml.lib wxbase28u.lib wxexpat.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcu\ibpp.lib /nologo /machine:i386 /out:"vcu\flamerobin.exe" /pdb:"vcu\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_dll" /subsystem:windows # ADD LINK32 wxmsw28u_aui.lib wxmsw28u_stc.lib wxmsw28u_html.lib wxmsw28u_adv.lib wxmsw28u_core.lib wxbase28u_xml.lib wxbase28u.lib wxexpat.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcu\ibpp.lib /nologo /machine:i386 /out:"vcu\flamerobin.exe" /pdb:"vcu\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_dll" /subsystem:windows !ELSEIF "$(CFG)" == "flamerobin - Win32 DLL Unicode Debug Static" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "vcusd" # PROP BASE Intermediate_Dir "vcusd\flamerobin" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "vcusd" # PROP Intermediate_Dir "vcusd\flamerobin" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MTd /Zi /Fdvcusd\flamerobin.pdb /Od /Gm /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_dll\mswud" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcusd\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MTd /Zi /Fdvcusd\flamerobin.pdb /Od /Gm /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_dll\mswud" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcusd\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD BASE MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" /d "__WXDEBUG__" /d "_DEBUG" /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=1 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_dll\mswud" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res # ADD RSC /l 0x409 /d "_DEBUG" /d "__WXDEBUG__" /d "_DEBUG" /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=1 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_dll\mswud" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 wxmsw28ud_aui.lib wxmsw28ud_stc.lib wxmsw28ud_html.lib wxmsw28ud_adv.lib wxmsw28ud_core.lib wxbase28ud_xml.lib wxbase28ud.lib wxexpatd.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcusd\ibpp.lib /nologo /machine:i386 /out:"vcusd\flamerobin.exe" /debug /pdb:"vcusd\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_dll" /subsystem:windows # ADD LINK32 wxmsw28ud_aui.lib wxmsw28ud_stc.lib wxmsw28ud_html.lib wxmsw28ud_adv.lib wxmsw28ud_core.lib wxbase28ud_xml.lib wxbase28ud.lib wxexpatd.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcusd\ibpp.lib /nologo /machine:i386 /out:"vcusd\flamerobin.exe" /debug /pdb:"vcusd\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_dll" /subsystem:windows !ELSEIF "$(CFG)" == "flamerobin - Win32 DLL Unicode Debug Dynamic" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "vcud" # PROP BASE Intermediate_Dir "vcud\flamerobin" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "vcud" # PROP Intermediate_Dir "vcud\flamerobin" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MDd /Zi /Fdvcud\flamerobin.pdb /Od /Gm /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_dll\mswud" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcud\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MDd /Zi /Fdvcud\flamerobin.pdb /Od /Gm /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_dll\mswud" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcud\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD BASE MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" /d "__WXDEBUG__" /d "_DEBUG" /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=1 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_dll\mswud" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res # ADD RSC /l 0x409 /d "_DEBUG" /d "__WXDEBUG__" /d "_DEBUG" /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=1 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_dll\mswud" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 wxmsw28ud_aui.lib wxmsw28ud_stc.lib wxmsw28ud_html.lib wxmsw28ud_adv.lib wxmsw28ud_core.lib wxbase28ud_xml.lib wxbase28ud.lib wxexpatd.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcud\ibpp.lib /nologo /machine:i386 /out:"vcud\flamerobin.exe" /debug /pdb:"vcud\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_dll" /subsystem:windows # ADD LINK32 wxmsw28ud_aui.lib wxmsw28ud_stc.lib wxmsw28ud_html.lib wxmsw28ud_adv.lib wxmsw28ud_core.lib wxbase28ud_xml.lib wxbase28ud.lib wxexpatd.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcud\ibpp.lib /nologo /machine:i386 /out:"vcud\flamerobin.exe" /debug /pdb:"vcud\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_dll" /subsystem:windows !ELSEIF "$(CFG)" == "flamerobin - Win32 DLL Release Static" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "vcs" # PROP BASE Intermediate_Dir "vcs\flamerobin" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "vcs" # PROP Intermediate_Dir "vcs\flamerobin" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MT /Fdvcs\flamerobin.pdb /O1 /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_dll\msw" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcs\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MT /Fdvcs\flamerobin.pdb /O1 /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_dll\msw" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcs\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD BASE MTL /nologo /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD MTL /nologo /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=0 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_dll\msw" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res # ADD RSC /l 0x409 /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=0 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_dll\msw" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 wxmsw28_aui.lib wxmsw28_stc.lib wxmsw28_html.lib wxmsw28_adv.lib wxmsw28_core.lib wxbase28_xml.lib wxbase28.lib wxexpat.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcs\ibpp.lib /nologo /machine:i386 /out:"vcs\flamerobin.exe" /pdb:"vcs\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_dll" /subsystem:windows # ADD LINK32 wxmsw28_aui.lib wxmsw28_stc.lib wxmsw28_html.lib wxmsw28_adv.lib wxmsw28_core.lib wxbase28_xml.lib wxbase28.lib wxexpat.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcs\ibpp.lib /nologo /machine:i386 /out:"vcs\flamerobin.exe" /pdb:"vcs\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_dll" /subsystem:windows !ELSEIF "$(CFG)" == "flamerobin - Win32 DLL Release Dynamic" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "vc" # PROP BASE Intermediate_Dir "vc\flamerobin" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "vc" # PROP Intermediate_Dir "vc\flamerobin" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MD /Fdvc\flamerobin.pdb /O1 /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_dll\msw" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vc\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MD /Fdvc\flamerobin.pdb /O1 /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_dll\msw" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vc\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD BASE MTL /nologo /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD MTL /nologo /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=0 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_dll\msw" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res # ADD RSC /l 0x409 /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=0 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_dll\msw" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 wxmsw28_aui.lib wxmsw28_stc.lib wxmsw28_html.lib wxmsw28_adv.lib wxmsw28_core.lib wxbase28_xml.lib wxbase28.lib wxexpat.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vc\ibpp.lib /nologo /machine:i386 /out:"vc\flamerobin.exe" /pdb:"vc\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_dll" /subsystem:windows # ADD LINK32 wxmsw28_aui.lib wxmsw28_stc.lib wxmsw28_html.lib wxmsw28_adv.lib wxmsw28_core.lib wxbase28_xml.lib wxbase28.lib wxexpat.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vc\ibpp.lib /nologo /machine:i386 /out:"vc\flamerobin.exe" /pdb:"vc\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_dll" /subsystem:windows !ELSEIF "$(CFG)" == "flamerobin - Win32 DLL Debug Static" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "vcsd" # PROP BASE Intermediate_Dir "vcsd\flamerobin" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "vcsd" # PROP Intermediate_Dir "vcsd\flamerobin" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MTd /Zi /Fdvcsd\flamerobin.pdb /Od /Gm /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_dll\mswd" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcsd\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MTd /Zi /Fdvcsd\flamerobin.pdb /Od /Gm /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_dll\mswd" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcsd\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD BASE MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" /d "__WXDEBUG__" /d "_DEBUG" /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=0 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_dll\mswd" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res # ADD RSC /l 0x409 /d "_DEBUG" /d "__WXDEBUG__" /d "_DEBUG" /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=0 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_dll\mswd" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 wxmsw28d_aui.lib wxmsw28d_stc.lib wxmsw28d_html.lib wxmsw28d_adv.lib wxmsw28d_core.lib wxbase28d_xml.lib wxbase28d.lib wxexpatd.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcsd\ibpp.lib /nologo /machine:i386 /out:"vcsd\flamerobin.exe" /debug /pdb:"vcsd\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_dll" /subsystem:windows # ADD LINK32 wxmsw28d_aui.lib wxmsw28d_stc.lib wxmsw28d_html.lib wxmsw28d_adv.lib wxmsw28d_core.lib wxbase28d_xml.lib wxbase28d.lib wxexpatd.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcsd\ibpp.lib /nologo /machine:i386 /out:"vcsd\flamerobin.exe" /debug /pdb:"vcsd\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_dll" /subsystem:windows !ELSEIF "$(CFG)" == "flamerobin - Win32 DLL Debug Dynamic" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "vcd" # PROP BASE Intermediate_Dir "vcd\flamerobin" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "vcd" # PROP Intermediate_Dir "vcd\flamerobin" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MDd /Zi /Fdvcd\flamerobin.pdb /Od /Gm /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_dll\mswd" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcd\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MDd /Zi /Fdvcd\flamerobin.pdb /Od /Gm /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_dll\mswd" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcd\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD BASE MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" /d "__WXDEBUG__" /d "_DEBUG" /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=0 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_dll\mswd" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res # ADD RSC /l 0x409 /d "_DEBUG" /d "__WXDEBUG__" /d "_DEBUG" /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=0 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_dll\mswd" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 wxmsw28d_aui.lib wxmsw28d_stc.lib wxmsw28d_html.lib wxmsw28d_adv.lib wxmsw28d_core.lib wxbase28d_xml.lib wxbase28d.lib wxexpatd.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcd\ibpp.lib /nologo /machine:i386 /out:"vcd\flamerobin.exe" /debug /pdb:"vcd\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_dll" /subsystem:windows # ADD LINK32 wxmsw28d_aui.lib wxmsw28d_stc.lib wxmsw28d_html.lib wxmsw28d_adv.lib wxmsw28d_core.lib wxbase28d_xml.lib wxbase28d.lib wxexpatd.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcd\ibpp.lib /nologo /machine:i386 /out:"vcd\flamerobin.exe" /debug /pdb:"vcd\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_dll" /subsystem:windows !ELSEIF "$(CFG)" == "flamerobin - Win32 Unicode Release Static" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "vcus" # PROP BASE Intermediate_Dir "vcus\flamerobin" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "vcus" # PROP Intermediate_Dir "vcus\flamerobin" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MT /Fdvcus\flamerobin.pdb /O1 /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_lib\mswu" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcus\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MT /Fdvcus\flamerobin.pdb /O1 /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_lib\mswu" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcus\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD BASE MTL /nologo /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD MTL /nologo /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=1 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_lib\mswu" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res # ADD RSC /l 0x409 /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=1 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_lib\mswu" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 wxmsw28u_aui.lib wxmsw28u_stc.lib wxmsw28u_html.lib wxmsw28u_adv.lib wxmsw28u_core.lib wxbase28u_xml.lib wxbase28u.lib wxexpat.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcus\ibpp.lib /nologo /machine:i386 /out:"vcus\flamerobin.exe" /pdb:"vcus\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_lib" /subsystem:windows # ADD LINK32 wxmsw28u_aui.lib wxmsw28u_stc.lib wxmsw28u_html.lib wxmsw28u_adv.lib wxmsw28u_core.lib wxbase28u_xml.lib wxbase28u.lib wxexpat.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcus\ibpp.lib /nologo /machine:i386 /out:"vcus\flamerobin.exe" /pdb:"vcus\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_lib" /subsystem:windows !ELSEIF "$(CFG)" == "flamerobin - Win32 Unicode Release Dynamic" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "vcu" # PROP BASE Intermediate_Dir "vcu\flamerobin" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "vcu" # PROP Intermediate_Dir "vcu\flamerobin" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MD /Fdvcu\flamerobin.pdb /O1 /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_lib\mswu" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcu\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MD /Fdvcu\flamerobin.pdb /O1 /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_lib\mswu" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcu\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD BASE MTL /nologo /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD MTL /nologo /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=1 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_lib\mswu" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res # ADD RSC /l 0x409 /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=1 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_lib\mswu" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 wxmsw28u_aui.lib wxmsw28u_stc.lib wxmsw28u_html.lib wxmsw28u_adv.lib wxmsw28u_core.lib wxbase28u_xml.lib wxbase28u.lib wxexpat.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcu\ibpp.lib /nologo /machine:i386 /out:"vcu\flamerobin.exe" /pdb:"vcu\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_lib" /subsystem:windows # ADD LINK32 wxmsw28u_aui.lib wxmsw28u_stc.lib wxmsw28u_html.lib wxmsw28u_adv.lib wxmsw28u_core.lib wxbase28u_xml.lib wxbase28u.lib wxexpat.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcu\ibpp.lib /nologo /machine:i386 /out:"vcu\flamerobin.exe" /pdb:"vcu\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_lib" /subsystem:windows !ELSEIF "$(CFG)" == "flamerobin - Win32 Unicode Debug Static" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "vcusd" # PROP BASE Intermediate_Dir "vcusd\flamerobin" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "vcusd" # PROP Intermediate_Dir "vcusd\flamerobin" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MTd /Zi /Fdvcusd\flamerobin.pdb /Od /Gm /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_lib\mswud" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcusd\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MTd /Zi /Fdvcusd\flamerobin.pdb /Od /Gm /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_lib\mswud" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcusd\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD BASE MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" /d "__WXDEBUG__" /d "_DEBUG" /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=1 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_lib\mswud" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res # ADD RSC /l 0x409 /d "_DEBUG" /d "__WXDEBUG__" /d "_DEBUG" /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=1 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_lib\mswud" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 wxmsw28ud_aui.lib wxmsw28ud_stc.lib wxmsw28ud_html.lib wxmsw28ud_adv.lib wxmsw28ud_core.lib wxbase28ud_xml.lib wxbase28ud.lib wxexpatd.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcusd\ibpp.lib /nologo /machine:i386 /out:"vcusd\flamerobin.exe" /debug /pdb:"vcusd\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_lib" /subsystem:windows # ADD LINK32 wxmsw28ud_aui.lib wxmsw28ud_stc.lib wxmsw28ud_html.lib wxmsw28ud_adv.lib wxmsw28ud_core.lib wxbase28ud_xml.lib wxbase28ud.lib wxexpatd.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcusd\ibpp.lib /nologo /machine:i386 /out:"vcusd\flamerobin.exe" /debug /pdb:"vcusd\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_lib" /subsystem:windows !ELSEIF "$(CFG)" == "flamerobin - Win32 Unicode Debug Dynamic" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "vcud" # PROP BASE Intermediate_Dir "vcud\flamerobin" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "vcud" # PROP Intermediate_Dir "vcud\flamerobin" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MDd /Zi /Fdvcud\flamerobin.pdb /Od /Gm /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_lib\mswud" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcud\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MDd /Zi /Fdvcud\flamerobin.pdb /Od /Gm /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_lib\mswud" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcud\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD BASE MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=1 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" /d "__WXDEBUG__" /d "_DEBUG" /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=1 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_lib\mswud" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res # ADD RSC /l 0x409 /d "_DEBUG" /d "__WXDEBUG__" /d "_DEBUG" /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=1 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_lib\mswud" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 wxmsw28ud_aui.lib wxmsw28ud_stc.lib wxmsw28ud_html.lib wxmsw28ud_adv.lib wxmsw28ud_core.lib wxbase28ud_xml.lib wxbase28ud.lib wxexpatd.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcud\ibpp.lib /nologo /machine:i386 /out:"vcud\flamerobin.exe" /debug /pdb:"vcud\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_lib" /subsystem:windows # ADD LINK32 wxmsw28ud_aui.lib wxmsw28ud_stc.lib wxmsw28ud_html.lib wxmsw28ud_adv.lib wxmsw28ud_core.lib wxbase28ud_xml.lib wxbase28ud.lib wxexpatd.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcud\ibpp.lib /nologo /machine:i386 /out:"vcud\flamerobin.exe" /debug /pdb:"vcud\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_lib" /subsystem:windows !ELSEIF "$(CFG)" == "flamerobin - Win32 Release Static" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "vcs" # PROP BASE Intermediate_Dir "vcs\flamerobin" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "vcs" # PROP Intermediate_Dir "vcs\flamerobin" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MT /Fdvcs\flamerobin.pdb /O1 /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_lib\msw" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcs\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MT /Fdvcs\flamerobin.pdb /O1 /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_lib\msw" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcs\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD BASE MTL /nologo /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD MTL /nologo /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=0 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_lib\msw" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res # ADD RSC /l 0x409 /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=0 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_lib\msw" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 wxmsw28_aui.lib wxmsw28_stc.lib wxmsw28_html.lib wxmsw28_adv.lib wxmsw28_core.lib wxbase28_xml.lib wxbase28.lib wxexpat.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcs\ibpp.lib /nologo /machine:i386 /out:"vcs\flamerobin.exe" /pdb:"vcs\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_lib" /subsystem:windows # ADD LINK32 wxmsw28_aui.lib wxmsw28_stc.lib wxmsw28_html.lib wxmsw28_adv.lib wxmsw28_core.lib wxbase28_xml.lib wxbase28.lib wxexpat.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcs\ibpp.lib /nologo /machine:i386 /out:"vcs\flamerobin.exe" /pdb:"vcs\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_lib" /subsystem:windows !ELSEIF "$(CFG)" == "flamerobin - Win32 Release Dynamic" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "vc" # PROP BASE Intermediate_Dir "vc\flamerobin" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "vc" # PROP Intermediate_Dir "vc\flamerobin" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MD /Fdvc\flamerobin.pdb /O1 /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_lib\msw" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vc\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MD /Fdvc\flamerobin.pdb /O1 /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_lib\msw" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vc\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD BASE MTL /nologo /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD MTL /nologo /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=0 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_lib\msw" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res # ADD RSC /l 0x409 /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=0 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_lib\msw" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 wxmsw28_aui.lib wxmsw28_stc.lib wxmsw28_html.lib wxmsw28_adv.lib wxmsw28_core.lib wxbase28_xml.lib wxbase28.lib wxexpat.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vc\ibpp.lib /nologo /machine:i386 /out:"vc\flamerobin.exe" /pdb:"vc\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_lib" /subsystem:windows # ADD LINK32 wxmsw28_aui.lib wxmsw28_stc.lib wxmsw28_html.lib wxmsw28_adv.lib wxmsw28_core.lib wxbase28_xml.lib wxbase28.lib wxexpat.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vc\ibpp.lib /nologo /machine:i386 /out:"vc\flamerobin.exe" /pdb:"vc\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_lib" /subsystem:windows !ELSEIF "$(CFG)" == "flamerobin - Win32 Debug Static" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "vcsd" # PROP BASE Intermediate_Dir "vcsd\flamerobin" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "vcsd" # PROP Intermediate_Dir "vcsd\flamerobin" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MTd /Zi /Fdvcsd\flamerobin.pdb /Od /Gm /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_lib\mswd" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcsd\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MTd /Zi /Fdvcsd\flamerobin.pdb /Od /Gm /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_lib\mswd" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcsd\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD BASE MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" /d "__WXDEBUG__" /d "_DEBUG" /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=0 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_lib\mswd" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res # ADD RSC /l 0x409 /d "_DEBUG" /d "__WXDEBUG__" /d "_DEBUG" /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=0 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_lib\mswd" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 wxmsw28d_aui.lib wxmsw28d_stc.lib wxmsw28d_html.lib wxmsw28d_adv.lib wxmsw28d_core.lib wxbase28d_xml.lib wxbase28d.lib wxexpatd.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcsd\ibpp.lib /nologo /machine:i386 /out:"vcsd\flamerobin.exe" /debug /pdb:"vcsd\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_lib" /subsystem:windows # ADD LINK32 wxmsw28d_aui.lib wxmsw28d_stc.lib wxmsw28d_html.lib wxmsw28d_adv.lib wxmsw28d_core.lib wxbase28d_xml.lib wxbase28d.lib wxexpatd.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcsd\ibpp.lib /nologo /machine:i386 /out:"vcsd\flamerobin.exe" /debug /pdb:"vcsd\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_lib" /subsystem:windows !ELSEIF "$(CFG)" == "flamerobin - Win32 Debug Dynamic" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "vcd" # PROP BASE Intermediate_Dir "vcd\flamerobin" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "vcd" # PROP Intermediate_Dir "vcd\flamerobin" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MDd /Zi /Fdvcd\flamerobin.pdb /Od /Gm /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_lib\mswd" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcd\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MDd /Zi /Fdvcd\flamerobin.pdb /Od /Gm /GR /EHsc /W4 /I "$(WXDIR)\lib\vc_lib\mswd" /I "$(WXDIR)\contrib\include" /I "$(WXDIR)\include" /I "$(BOOST_ROOT)" /Yu"wx/wxprec.h" /Fp"vcd\flamerobin.pch" /I "." /I ".\src" /I ".\src\ibpp" /I ".\res" /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /c # ADD BASE MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXDEBUG__" /D "_DEBUG" /D "_WINDOWS" /D "__WINDOWS__" /D WINVER=0x400 /D "WIN32" /D "__WIN32__" /D "__WIN95__" /D "STRICT" /D "__WXMSW__" /D wxUSE_GUI=1 /D wxUSE_REGEX=1 /D wxUSE_UNICODE=0 /D "WIN32_LEAN_AND_MEAN" /D "_WINDOWS" /D "IBPP_WINDOWS" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" /d "__WXDEBUG__" /d "_DEBUG" /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=0 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_lib\mswd" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res # ADD RSC /l 0x409 /d "_DEBUG" /d "__WXDEBUG__" /d "_DEBUG" /d "_WINDOWS" /d "__WINDOWS__" /d WINVER=0x400 /d "WIN32" /d "__WIN32__" /d "__WIN95__" /d "STRICT" /d "__WXMSW__" /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=0 /d "WIN32_LEAN_AND_MEAN" /i "$(WXDIR)\lib\vc_lib\mswd" /i "$(WXDIR)\contrib\include" /i "$(WXDIR)\include" /i "$(BOOST_ROOT)" /d "_WINDOWS" /d "IBPP_WINDOWS" /i "." /i ".\src" /i ".\src\ibpp" /i .\res BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 wxmsw28d_aui.lib wxmsw28d_stc.lib wxmsw28d_html.lib wxmsw28d_adv.lib wxmsw28d_core.lib wxbase28d_xml.lib wxbase28d.lib wxexpatd.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcd\ibpp.lib /nologo /machine:i386 /out:"vcd\flamerobin.exe" /debug /pdb:"vcd\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_lib" /subsystem:windows # ADD LINK32 wxmsw28d_aui.lib wxmsw28d_stc.lib wxmsw28d_html.lib wxmsw28d_adv.lib wxmsw28d_core.lib wxbase28d_xml.lib wxbase28d.lib wxexpatd.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vcd\ibpp.lib /nologo /machine:i386 /out:"vcd\flamerobin.exe" /debug /pdb:"vcd\flamerobin.pdb" /nologo /subsystem:windows /libpath:"$(WXDIR)\lib\vc_lib" /subsystem:windows !ENDIF # Begin Target # Name "flamerobin - Win32 DLL Unicode Release Static" # Name "flamerobin - Win32 DLL Unicode Release Dynamic" # Name "flamerobin - Win32 DLL Unicode Debug Static" # Name "flamerobin - Win32 DLL Unicode Debug Dynamic" # Name "flamerobin - Win32 DLL Release Static" # Name "flamerobin - Win32 DLL Release Dynamic" # Name "flamerobin - Win32 DLL Debug Static" # Name "flamerobin - Win32 DLL Debug Dynamic" # Name "flamerobin - Win32 Unicode Release Static" # Name "flamerobin - Win32 Unicode Release Dynamic" # Name "flamerobin - Win32 Unicode Debug Static" # Name "flamerobin - Win32 Unicode Debug Dynamic" # Name "flamerobin - Win32 Release Static" # Name "flamerobin - Win32 Release Dynamic" # Name "flamerobin - Win32 Debug Static" # Name "flamerobin - Win32 Debug Dynamic" # Begin Group "Source Files" # PROP Default_Filter "" # Begin Source File SOURCE=.\src\gui\AboutBox.cpp # End Source File # Begin Source File SOURCE=.\src\gui\AdvancedMessageDialog.cpp # End Source File # Begin Source File SOURCE=.\src\gui\AdvancedSearchFrame.cpp # End Source File # Begin Source File SOURCE=.\src\core\ArtProvider.cpp # End Source File # Begin Source File SOURCE=.\src\gui\BackupFrame.cpp # End Source File # Begin Source File SOURCE=.\src\gui\BackupRestoreBaseFrame.cpp # End Source File # Begin Source File SOURCE=.\src\gui\BaseDialog.cpp # End Source File # Begin Source File SOURCE=.\src\gui\BaseFrame.cpp # End Source File # Begin Source File SOURCE=.\src\core\CodeTemplateProcessor.cpp # End Source File # Begin Source File SOURCE=.\src\gui\CommandManager.cpp # End Source File # Begin Source File SOURCE=.\src\gui\ConfdefTemplateProcessor.cpp # End Source File # Begin Source File SOURCE=.\src\config\Config.cpp # End Source File # Begin Source File SOURCE=.\src\gui\ContextMenuMetadataItemVisitor.cpp # End Source File # Begin Source File SOURCE=.\src\gui\controls\ControlUtils.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\CreateDDLVisitor.cpp # End Source File # Begin Source File SOURCE=.\src\gui\CreateIndexDialog.cpp # End Source File # Begin Source File SOURCE=.\src\gui\controls\DBHTreeControl.cpp # End Source File # Begin Source File SOURCE=.\src\gui\DataGeneratorFrame.cpp # End Source File # Begin Source File SOURCE=.\src\gui\controls\DataGrid.cpp # End Source File # Begin Source File SOURCE=.\src\gui\controls\DataGridRowBuffer.cpp # End Source File # Begin Source File SOURCE=.\src\gui\controls\DataGridRows.cpp # End Source File # Begin Source File SOURCE=.\src\gui\controls\DataGridTable.cpp # End Source File # Begin Source File SOURCE=.\src\config\DatabaseConfig.cpp # End Source File # Begin Source File SOURCE=.\src\gui\DatabaseRegistrationDialog.cpp # End Source File # Begin Source File SOURCE=.\src\gui\controls\DndTextControls.cpp # End Source File # Begin Source File SOURCE=.\src\gui\EditBlobDialog.cpp # End Source File # Begin Source File SOURCE=.\src\gui\EventWatcherFrame.cpp # End Source File # Begin Source File SOURCE=.\src\gui\ExecuteSql.cpp # End Source File # Begin Source File SOURCE=.\src\gui\ExecuteSqlFrame.cpp # End Source File # Begin Source File SOURCE=.\src\core\FRError.cpp # End Source File # Begin Source File SOURCE=.\src\gui\FRLayoutConfig.cpp # End Source File # Begin Source File SOURCE=.\src\gui\FieldPropertiesDialog.cpp # End Source File # Begin Source File SOURCE=.\src\gui\FindDialog.cpp # End Source File # Begin Source File SOURCE=.\src\gui\GUIURIHandlerHelper.cpp # End Source File # Begin Source File SOURCE=.\src\gui\HtmlHeaderMetadataItemVisitor.cpp # End Source File # Begin Source File SOURCE=.\src\gui\HtmlTemplateProcessor.cpp # End Source File # Begin Source File SOURCE=.\src\sql\Identifier.cpp # End Source File # Begin Source File SOURCE=.\src\sql\IncompleteStatement.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\Index.cpp # End Source File # Begin Source File SOURCE=.\src\gui\InsertDialog.cpp # End Source File # Begin Source File SOURCE=.\src\gui\controls\LogTextControl.cpp # End Source File # Begin Source File SOURCE=.\src\gui\MainFrame.cpp # End Source File # Begin Source File SOURCE=.\src\MasterPassword.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\MetadataItemCreateStatementVisitor.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\MetadataItemDescriptionVisitor.cpp # End Source File # Begin Source File SOURCE=.\src\gui\MetadataItemPropertiesFrame.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\MetadataItemURIHandlerHelper.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\MetadataItemVisitor.cpp # End Source File # Begin Source File SOURCE=.\src\engine\MetadataLoader.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\MetadataTemplateCmdHandler.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\MetadataTemplateManager.cpp # End Source File # Begin Source File SOURCE=.\src\sql\MultiStatement.cpp # End Source File # Begin Source File SOURCE=.\src\gui\MultilineEnterDialog.cpp # End Source File # Begin Source File SOURCE=.\src\core\Observer.cpp # End Source File # Begin Source File SOURCE=.\src\gui\PreferencesDialog.cpp # End Source File # Begin Source File SOURCE=.\src\gui\PreferencesDialogSettings.cpp # End Source File # Begin Source File SOURCE=.\src\gui\controls\PrintableHtmlWindow.cpp # End Source File # Begin Source File SOURCE=.\src\gui\PrivilegesDialog.cpp # End Source File # Begin Source File SOURCE=.\src\gui\ProgressDialog.cpp # End Source File # Begin Source File SOURCE=.\src\core\ProgressIndicator.cpp # End Source File # Begin Source File SOURCE=.\src\gui\ReorderFieldsDialog.cpp # End Source File # Begin Source File SOURCE=.\src\gui\RestoreFrame.cpp # End Source File # Begin Source File SOURCE=.\src\sql\SelectStatement.cpp # End Source File # Begin Source File SOURCE=.\src\gui\ServerRegistrationDialog.cpp # End Source File # Begin Source File SOURCE=.\src\gui\SimpleHtmlFrame.cpp # End Source File # Begin Source File SOURCE=.\src\sql\SqlStatement.cpp # End Source File # Begin Source File SOURCE=.\src\sql\SqlTokenizer.cpp # End Source File # Begin Source File SOURCE=.\src\sql\StatementBuilder.cpp # End Source File # Begin Source File SOURCE=.\src\gui\StatementHistoryDialog.cpp # End Source File # Begin Source File SOURCE=.\src\core\StringUtils.cpp # End Source File # Begin Source File SOURCE=.\src\gui\StyleGuide.cpp # End Source File # Begin Source File SOURCE=.\src\gui\msw\StyleGuideMSW.cpp # End Source File # Begin Source File SOURCE=.\src\core\Subject.cpp # End Source File # Begin Source File SOURCE=.\src\core\TemplateProcessor.cpp # End Source File # Begin Source File SOURCE=.\src\gui\controls\TextControl.cpp # End Source File # Begin Source File SOURCE=.\src\core\URIProcessor.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\User.cpp # End Source File # Begin Source File SOURCE=.\src\gui\UserDialog.cpp # End Source File # Begin Source File SOURCE=.\src\gui\UsernamePasswordDialog.cpp # End Source File # Begin Source File SOURCE=.\src\core\Visitor.cpp # End Source File # Begin Source File SOURCE=.\src\addconstrainthandler.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\column.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\constraints.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\database.cpp # End Source File # Begin Source File SOURCE=.\src\databasehandler.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\domain.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\exception.cpp # End Source File # Begin Source File SOURCE=.\res\flamerobin.rc # End Source File # Begin Source File SOURCE=.\src\frprec.cpp # ADD BASE CPP /Yc"wx/wxprec.h" # ADD CPP /Yc"wx/wxprec.h" # End Source File # Begin Source File SOURCE=.\src\frutils.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\function.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\generator.cpp # End Source File # Begin Source File SOURCE=.\src\logger.cpp # End Source File # Begin Source File SOURCE=.\src\main.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\metadataitem.cpp # End Source File # Begin Source File SOURCE=.\src\objectdescriptionhandler.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\parameter.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\privilege.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\procedure.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\relation.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\role.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\root.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\server.cpp # End Source File # Begin Source File SOURCE=.\src\statementHistory.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\table.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\trigger.cpp # End Source File # Begin Source File SOURCE=.\src\metadata\view.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "" # Begin Source File SOURCE=.\src\gui\AboutBox.h # End Source File # Begin Source File SOURCE=.\src\gui\AdvancedMessageDialog.h # End Source File # Begin Source File SOURCE=.\src\gui\AdvancedSearchFrame.h # End Source File # Begin Source File SOURCE=.\src\core\ArtProvider.h # End Source File # Begin Source File SOURCE=.\src\gui\BackupFrame.h # End Source File # Begin Source File SOURCE=.\src\gui\BackupRestoreBaseFrame.h # End Source File # Begin Source File SOURCE=.\src\gui\BaseDialog.h # End Source File # Begin Source File SOURCE=.\src\gui\BaseFrame.h # End Source File # Begin Source File SOURCE=.\src\core\CodeTemplateProcessor.h # End Source File # Begin Source File SOURCE=.\src\gui\CommandIds.h # End Source File # Begin Source File SOURCE=.\src\gui\CommandManager.h # End Source File # Begin Source File SOURCE=.\src\gui\ConfdefTemplateProcessor.h # End Source File # Begin Source File SOURCE=.\src\config\Config.h # End Source File # Begin Source File SOURCE=.\src\gui\ContextMenuMetadataItemVisitor.h # End Source File # Begin Source File SOURCE=.\src\gui\controls\ControlUtils.h # End Source File # Begin Source File SOURCE=.\src\metadata\CreateDDLVisitor.h # End Source File # Begin Source File SOURCE=.\src\gui\CreateIndexDialog.h # End Source File # Begin Source File SOURCE=.\src\gui\controls\DBHTreeControl.h # End Source File # Begin Source File SOURCE=.\src\gui\DataGeneratorFrame.h # End Source File # Begin Source File SOURCE=.\src\gui\controls\DataGrid.h # End Source File # Begin Source File SOURCE=.\src\gui\controls\DataGridRowBuffer.h # End Source File # Begin Source File SOURCE=.\src\gui\controls\DataGridRows.h # End Source File # Begin Source File SOURCE=.\src\gui\controls\DataGridTable.h # End Source File # Begin Source File SOURCE=.\src\config\DatabaseConfig.h # End Source File # Begin Source File SOURCE=.\src\gui\DatabaseRegistrationDialog.h # End Source File # Begin Source File SOURCE=.\src\gui\controls\DndTextControls.h # End Source File # Begin Source File SOURCE=.\src\gui\EditBlobDialog.h # End Source File # Begin Source File SOURCE=.\src\gui\EventWatcherFrame.h # End Source File # Begin Source File SOURCE=.\src\gui\ExecuteSql.h # End Source File # Begin Source File SOURCE=.\src\gui\ExecuteSqlFrame.h # End Source File # Begin Source File SOURCE=.\src\core\FRError.h # End Source File # Begin Source File SOURCE=.\src\gui\FRLayoutConfig.h # End Source File # Begin Source File SOURCE=.\src\gui\FieldPropertiesDialog.h # End Source File # Begin Source File SOURCE=.\src\gui\FindDialog.h # End Source File # Begin Source File SOURCE=.\src\gui\GUIURIHandlerHelper.h # End Source File # Begin Source File SOURCE=.\src\gui\HtmlHeaderMetadataItemVisitor.h # End Source File # Begin Source File SOURCE=.\src\gui\HtmlTemplateProcessor.h # End Source File # Begin Source File SOURCE=.\src\sql\Identifier.h # End Source File # Begin Source File SOURCE=.\src\sql\IncompleteStatement.h # End Source File # Begin Source File SOURCE=.\src\metadata\Index.h # End Source File # Begin Source File SOURCE=.\src\gui\InsertDialog.h # End Source File # Begin Source File SOURCE=.\src\Isaac.h # End Source File # Begin Source File SOURCE=.\src\gui\controls\LogTextControl.h # End Source File # Begin Source File SOURCE=.\src\gui\MainFrame.h # End Source File # Begin Source File SOURCE=.\src\MasterPassword.h # End Source File # Begin Source File SOURCE=.\src\metadata\MetadataClasses.h # End Source File # Begin Source File SOURCE=.\src\metadata\MetadataItemCreateStatementVisitor.h # End Source File # Begin Source File SOURCE=.\src\metadata\MetadataItemDescriptionVisitor.h # End Source File # Begin Source File SOURCE=.\src\gui\MetadataItemPropertiesFrame.h # End Source File # Begin Source File SOURCE=.\src\metadata\MetadataItemURIHandlerHelper.h # End Source File # Begin Source File SOURCE=.\src\metadata\MetadataItemVisitor.h # End Source File # Begin Source File SOURCE=.\src\engine\MetadataLoader.h # End Source File # Begin Source File SOURCE=.\src\metadata\MetadataTemplateManager.h # End Source File # Begin Source File SOURCE=.\src\sql\MultiStatement.h # End Source File # Begin Source File SOURCE=.\src\gui\MultilineEnterDialog.h # End Source File # Begin Source File SOURCE=.\src\core\ObjectWithHandle.h # End Source File # Begin Source File SOURCE=.\src\core\Observer.h # End Source File # Begin Source File SOURCE=.\src\gui\PreferencesDialog.h # End Source File # Begin Source File SOURCE=.\src\gui\controls\PrintableHtmlWindow.h # End Source File # Begin Source File SOURCE=.\src\gui\PrivilegesDialog.h # End Source File # Begin Source File SOURCE=.\src\core\ProcessableObject.h # End Source File # Begin Source File SOURCE=.\src\gui\ProgressDialog.h # End Source File # Begin Source File SOURCE=.\src\core\ProgressIndicator.h # End Source File # Begin Source File SOURCE=.\src\gui\ReorderFieldsDialog.h # End Source File # Begin Source File SOURCE=.\src\gui\RestoreFrame.h # End Source File # Begin Source File SOURCE=.\src\sql\SelectStatement.h # End Source File # Begin Source File SOURCE=.\src\gui\ServerRegistrationDialog.h # End Source File # Begin Source File SOURCE=.\src\gui\SimpleHtmlFrame.h # End Source File # Begin Source File SOURCE=.\src\sql\SqlStatement.h # End Source File # Begin Source File SOURCE=.\src\sql\SqlTokenizer.h # End Source File # Begin Source File SOURCE=.\src\sql\StatementBuilder.h # End Source File # Begin Source File SOURCE=.\src\gui\StatementHistoryDialog.h # End Source File # Begin Source File SOURCE=.\src\core\StringUtils.h # End Source File # Begin Source File SOURCE=.\src\gui\StyleGuide.h # End Source File # Begin Source File SOURCE=.\src\core\Subject.h # End Source File # Begin Source File SOURCE=.\src\core\TemplateProcessor.h # End Source File # Begin Source File SOURCE=.\src\gui\controls\TextControl.h # End Source File # Begin Source File SOURCE=.\src\core\URIProcessor.h # End Source File # Begin Source File SOURCE=.\src\metadata\User.h # End Source File # Begin Source File SOURCE=.\src\gui\UserDialog.h # End Source File # Begin Source File SOURCE=.\src\gui\UsernamePasswordDialog.h # End Source File # Begin Source File SOURCE=.\src\core\Visitor.h # End Source File # Begin Source File SOURCE=.\src\metadata\collection.h # End Source File # Begin Source File SOURCE=.\src\metadata\column.h # End Source File # Begin Source File SOURCE=.\src\metadata\constraints.h # End Source File # Begin Source File SOURCE=.\src\metadata\database.h # End Source File # Begin Source File SOURCE=.\src\metadata\domain.h # End Source File # Begin Source File SOURCE=.\src\metadata\exception.h # End Source File # Begin Source File SOURCE=.\src\frutils.h # End Source File # Begin Source File SOURCE=.\src\frversion.h # End Source File # Begin Source File SOURCE=.\src\metadata\function.h # End Source File # Begin Source File SOURCE=.\src\metadata\generator.h # End Source File # Begin Source File SOURCE=.\src\logger.h # End Source File # Begin Source File SOURCE=.\src\main.h # End Source File # Begin Source File SOURCE=.\src\metadata\metadataitem.h # End Source File # Begin Source File SOURCE=.\src\metadata\parameter.h # End Source File # Begin Source File SOURCE=.\src\metadata\privilege.h # End Source File # Begin Source File SOURCE=.\src\metadata\procedure.h # End Source File # Begin Source File SOURCE=.\src\metadata\relation.h # End Source File # Begin Source File SOURCE=.\src\metadata\role.h # End Source File # Begin Source File SOURCE=.\src\metadata\root.h # End Source File # Begin Source File SOURCE=.\src\metadata\server.h # End Source File # Begin Source File SOURCE=.\src\statementHistory.h # End Source File # Begin Source File SOURCE=.\src\metadata\table.h # End Source File # Begin Source File SOURCE=.\src\metadata\trigger.h # End Source File # Begin Source File SOURCE=.\src\metadata\view.h # End Source File # End Group # End Target # End Project flamerobin_0.9.3~svn+2220.orig/flamerobin_flamerobin.vcproj000066400000000000000000002153221177057155300237510ustar00rootroot00000000000000 flamerobin_0.9.3~svn+2220.orig/flamerobin_ibpp.dsp000066400000000000000000000443571177057155300220600ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="flamerobin_ibpp" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Static Library" 0x0104 CFG=ibpp - Win32 Debug Dynamic !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "flamerobin_ibpp.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "flamerobin_ibpp.mak" CFG="ibpp - Win32 Debug Dynamic" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "ibpp - Win32 DLL Unicode Release Static" (based on "Win32 (x86) Static Library") !MESSAGE "ibpp - Win32 DLL Unicode Release Dynamic" (based on "Win32 (x86) Static Library") !MESSAGE "ibpp - Win32 DLL Unicode Debug Static" (based on "Win32 (x86) Static Library") !MESSAGE "ibpp - Win32 DLL Unicode Debug Dynamic" (based on "Win32 (x86) Static Library") !MESSAGE "ibpp - Win32 DLL Release Static" (based on "Win32 (x86) Static Library") !MESSAGE "ibpp - Win32 DLL Release Dynamic" (based on "Win32 (x86) Static Library") !MESSAGE "ibpp - Win32 DLL Debug Static" (based on "Win32 (x86) Static Library") !MESSAGE "ibpp - Win32 DLL Debug Dynamic" (based on "Win32 (x86) Static Library") !MESSAGE "ibpp - Win32 Unicode Release Static" (based on "Win32 (x86) Static Library") !MESSAGE "ibpp - Win32 Unicode Release Dynamic" (based on "Win32 (x86) Static Library") !MESSAGE "ibpp - Win32 Unicode Debug Static" (based on "Win32 (x86) Static Library") !MESSAGE "ibpp - Win32 Unicode Debug Dynamic" (based on "Win32 (x86) Static Library") !MESSAGE "ibpp - Win32 Release Static" (based on "Win32 (x86) Static Library") !MESSAGE "ibpp - Win32 Release Dynamic" (based on "Win32 (x86) Static Library") !MESSAGE "ibpp - Win32 Debug Static" (based on "Win32 (x86) Static Library") !MESSAGE "ibpp - Win32 Debug Dynamic" (based on "Win32 (x86) Static Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "ibpp - Win32 DLL Unicode Release Static" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "vcus" # PROP BASE Intermediate_Dir "vcus\ibpp" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "vcus" # PROP Intermediate_Dir "vcus\ibpp" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MT /Fdvcus\ibpp.pdb /O1 /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcus\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MT /Fdvcus\ibpp.pdb /O1 /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcus\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "IBPP_WINDOWS" /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"vcus\ibpp.lib" # ADD LIB32 /nologo /out:"vcus\ibpp.lib" !ELSEIF "$(CFG)" == "ibpp - Win32 DLL Unicode Release Dynamic" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "vcu" # PROP BASE Intermediate_Dir "vcu\ibpp" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "vcu" # PROP Intermediate_Dir "vcu\ibpp" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MD /Fdvcu\ibpp.pdb /O1 /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcu\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MD /Fdvcu\ibpp.pdb /O1 /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcu\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "IBPP_WINDOWS" /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"vcu\ibpp.lib" # ADD LIB32 /nologo /out:"vcu\ibpp.lib" !ELSEIF "$(CFG)" == "ibpp - Win32 DLL Unicode Debug Static" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "vcusd" # PROP BASE Intermediate_Dir "vcusd\ibpp" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "vcusd" # PROP Intermediate_Dir "vcusd\ibpp" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MTd /Zi /Fdvcusd\ibpp.pdb /Od /Gm /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcusd\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "_DEBUG" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MTd /Zi /Fdvcusd\ibpp.pdb /Od /Gm /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcusd\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "_DEBUG" /D "IBPP_WINDOWS" /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"vcusd\ibpp.lib" # ADD LIB32 /nologo /out:"vcusd\ibpp.lib" !ELSEIF "$(CFG)" == "ibpp - Win32 DLL Unicode Debug Dynamic" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "vcud" # PROP BASE Intermediate_Dir "vcud\ibpp" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "vcud" # PROP Intermediate_Dir "vcud\ibpp" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MDd /Zi /Fdvcud\ibpp.pdb /Od /Gm /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcud\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "_DEBUG" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MDd /Zi /Fdvcud\ibpp.pdb /Od /Gm /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcud\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "_DEBUG" /D "IBPP_WINDOWS" /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"vcud\ibpp.lib" # ADD LIB32 /nologo /out:"vcud\ibpp.lib" !ELSEIF "$(CFG)" == "ibpp - Win32 DLL Release Static" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "vcs" # PROP BASE Intermediate_Dir "vcs\ibpp" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "vcs" # PROP Intermediate_Dir "vcs\ibpp" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MT /Fdvcs\ibpp.pdb /O1 /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcs\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MT /Fdvcs\ibpp.pdb /O1 /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcs\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "IBPP_WINDOWS" /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"vcs\ibpp.lib" # ADD LIB32 /nologo /out:"vcs\ibpp.lib" !ELSEIF "$(CFG)" == "ibpp - Win32 DLL Release Dynamic" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "vc" # PROP BASE Intermediate_Dir "vc\ibpp" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "vc" # PROP Intermediate_Dir "vc\ibpp" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MD /Fdvc\ibpp.pdb /O1 /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vc\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MD /Fdvc\ibpp.pdb /O1 /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vc\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "IBPP_WINDOWS" /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"vc\ibpp.lib" # ADD LIB32 /nologo /out:"vc\ibpp.lib" !ELSEIF "$(CFG)" == "ibpp - Win32 DLL Debug Static" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "vcsd" # PROP BASE Intermediate_Dir "vcsd\ibpp" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "vcsd" # PROP Intermediate_Dir "vcsd\ibpp" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MTd /Zi /Fdvcsd\ibpp.pdb /Od /Gm /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcsd\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "_DEBUG" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MTd /Zi /Fdvcsd\ibpp.pdb /Od /Gm /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcsd\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "_DEBUG" /D "IBPP_WINDOWS" /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"vcsd\ibpp.lib" # ADD LIB32 /nologo /out:"vcsd\ibpp.lib" !ELSEIF "$(CFG)" == "ibpp - Win32 DLL Debug Dynamic" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "vcd" # PROP BASE Intermediate_Dir "vcd\ibpp" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "vcd" # PROP Intermediate_Dir "vcd\ibpp" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MDd /Zi /Fdvcd\ibpp.pdb /Od /Gm /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcd\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "_DEBUG" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MDd /Zi /Fdvcd\ibpp.pdb /Od /Gm /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcd\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "_DEBUG" /D "IBPP_WINDOWS" /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"vcd\ibpp.lib" # ADD LIB32 /nologo /out:"vcd\ibpp.lib" !ELSEIF "$(CFG)" == "ibpp - Win32 Unicode Release Static" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "vcus" # PROP BASE Intermediate_Dir "vcus\ibpp" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "vcus" # PROP Intermediate_Dir "vcus\ibpp" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MT /Fdvcus\ibpp.pdb /O1 /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcus\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MT /Fdvcus\ibpp.pdb /O1 /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcus\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "IBPP_WINDOWS" /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"vcus\ibpp.lib" # ADD LIB32 /nologo /out:"vcus\ibpp.lib" !ELSEIF "$(CFG)" == "ibpp - Win32 Unicode Release Dynamic" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "vcu" # PROP BASE Intermediate_Dir "vcu\ibpp" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "vcu" # PROP Intermediate_Dir "vcu\ibpp" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MD /Fdvcu\ibpp.pdb /O1 /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcu\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MD /Fdvcu\ibpp.pdb /O1 /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcu\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "IBPP_WINDOWS" /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"vcu\ibpp.lib" # ADD LIB32 /nologo /out:"vcu\ibpp.lib" !ELSEIF "$(CFG)" == "ibpp - Win32 Unicode Debug Static" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "vcusd" # PROP BASE Intermediate_Dir "vcusd\ibpp" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "vcusd" # PROP Intermediate_Dir "vcusd\ibpp" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MTd /Zi /Fdvcusd\ibpp.pdb /Od /Gm /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcusd\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "_DEBUG" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MTd /Zi /Fdvcusd\ibpp.pdb /Od /Gm /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcusd\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "_DEBUG" /D "IBPP_WINDOWS" /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"vcusd\ibpp.lib" # ADD LIB32 /nologo /out:"vcusd\ibpp.lib" !ELSEIF "$(CFG)" == "ibpp - Win32 Unicode Debug Dynamic" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "vcud" # PROP BASE Intermediate_Dir "vcud\ibpp" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "vcud" # PROP Intermediate_Dir "vcud\ibpp" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MDd /Zi /Fdvcud\ibpp.pdb /Od /Gm /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcud\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "_DEBUG" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MDd /Zi /Fdvcud\ibpp.pdb /Od /Gm /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcud\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "_DEBUG" /D "IBPP_WINDOWS" /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"vcud\ibpp.lib" # ADD LIB32 /nologo /out:"vcud\ibpp.lib" !ELSEIF "$(CFG)" == "ibpp - Win32 Release Static" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "vcs" # PROP BASE Intermediate_Dir "vcs\ibpp" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "vcs" # PROP Intermediate_Dir "vcs\ibpp" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MT /Fdvcs\ibpp.pdb /O1 /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcs\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MT /Fdvcs\ibpp.pdb /O1 /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcs\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "IBPP_WINDOWS" /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"vcs\ibpp.lib" # ADD LIB32 /nologo /out:"vcs\ibpp.lib" !ELSEIF "$(CFG)" == "ibpp - Win32 Release Dynamic" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "vc" # PROP BASE Intermediate_Dir "vc\ibpp" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "vc" # PROP Intermediate_Dir "vc\ibpp" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MD /Fdvc\ibpp.pdb /O1 /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vc\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MD /Fdvc\ibpp.pdb /O1 /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vc\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "IBPP_WINDOWS" /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"vc\ibpp.lib" # ADD LIB32 /nologo /out:"vc\ibpp.lib" !ELSEIF "$(CFG)" == "ibpp - Win32 Debug Static" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "vcsd" # PROP BASE Intermediate_Dir "vcsd\ibpp" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "vcsd" # PROP Intermediate_Dir "vcsd\ibpp" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MTd /Zi /Fdvcsd\ibpp.pdb /Od /Gm /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcsd\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "_DEBUG" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MTd /Zi /Fdvcsd\ibpp.pdb /Od /Gm /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcsd\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "_DEBUG" /D "IBPP_WINDOWS" /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"vcsd\ibpp.lib" # ADD LIB32 /nologo /out:"vcsd\ibpp.lib" !ELSEIF "$(CFG)" == "ibpp - Win32 Debug Dynamic" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "vcd" # PROP BASE Intermediate_Dir "vcd\ibpp" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "vcd" # PROP Intermediate_Dir "vcd\ibpp" # PROP Target_Dir "" # ADD BASE CPP /nologo /FD /MDd /Zi /Fdvcd\ibpp.pdb /Od /Gm /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcd\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "_DEBUG" /D "IBPP_WINDOWS" /c # ADD CPP /nologo /FD /MDd /Zi /Fdvcd\ibpp.pdb /Od /Gm /GR /EHsc /W4 /Yu"_ibpp.h" /Fp"vcd\ibpp.pch" /I ".\src\ibpp" /D "WIN32" /D "_LIB" /D "_DEBUG" /D "IBPP_WINDOWS" /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo /out:"vcd\ibpp.lib" # ADD LIB32 /nologo /out:"vcd\ibpp.lib" !ENDIF # Begin Target # Name "ibpp - Win32 DLL Unicode Release Static" # Name "ibpp - Win32 DLL Unicode Release Dynamic" # Name "ibpp - Win32 DLL Unicode Debug Static" # Name "ibpp - Win32 DLL Unicode Debug Dynamic" # Name "ibpp - Win32 DLL Release Static" # Name "ibpp - Win32 DLL Release Dynamic" # Name "ibpp - Win32 DLL Debug Static" # Name "ibpp - Win32 DLL Debug Dynamic" # Name "ibpp - Win32 Unicode Release Static" # Name "ibpp - Win32 Unicode Release Dynamic" # Name "ibpp - Win32 Unicode Debug Static" # Name "ibpp - Win32 Unicode Debug Dynamic" # Name "ibpp - Win32 Release Static" # Name "ibpp - Win32 Release Dynamic" # Name "ibpp - Win32 Debug Static" # Name "ibpp - Win32 Debug Dynamic" # Begin Group "Source Files" # PROP Default_Filter "" # Begin Source File SOURCE=.\src\ibpp\_dpb.cpp # End Source File # Begin Source File SOURCE=.\src\ibpp\_ibpp.cpp # ADD BASE CPP /Yc"_ibpp.h" # ADD CPP /Yc"_ibpp.h" # End Source File # Begin Source File SOURCE=.\src\ibpp\_ibs.cpp # End Source File # Begin Source File SOURCE=.\src\ibpp\_rb.cpp # End Source File # Begin Source File SOURCE=.\src\ibpp\_spb.cpp # End Source File # Begin Source File SOURCE=.\src\ibpp\_tpb.cpp # End Source File # Begin Source File SOURCE=.\src\ibpp\array.cpp # End Source File # Begin Source File SOURCE=.\src\ibpp\blob.cpp # End Source File # Begin Source File SOURCE=.\src\ibpp\database.cpp # End Source File # Begin Source File SOURCE=.\src\ibpp\date.cpp # End Source File # Begin Source File SOURCE=.\src\ibpp\dbkey.cpp # End Source File # Begin Source File SOURCE=.\src\ibpp\events.cpp # End Source File # Begin Source File SOURCE=.\src\ibpp\exception.cpp # End Source File # Begin Source File SOURCE=.\src\ibpp\row.cpp # End Source File # Begin Source File SOURCE=.\src\ibpp\service.cpp # End Source File # Begin Source File SOURCE=.\src\ibpp\statement.cpp # End Source File # Begin Source File SOURCE=.\src\ibpp\time.cpp # End Source File # Begin Source File SOURCE=.\src\ibpp\transaction.cpp # End Source File # Begin Source File SOURCE=.\src\ibpp\user.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "" # Begin Source File SOURCE=.\src\ibpp\_ibpp.h # End Source File # Begin Source File SOURCE=.\src\ibpp\ibase.h # End Source File # Begin Source File SOURCE=.\src\ibpp\iberror.h # End Source File # Begin Source File SOURCE=.\src\ibpp\ibpp.h # End Source File # End Group # End Target # End Project flamerobin_0.9.3~svn+2220.orig/flamerobin_ibpp.vcproj000066400000000000000000001025471177057155300225710ustar00rootroot00000000000000 flamerobin_0.9.3~svn+2220.orig/frconfig.h.in000066400000000000000000000003121177057155300205520ustar00rootroot00000000000000#ifndef FR_FRCONFIG_H #define FR_FRCONFIG_H /* this is used to set the correct install prefix for autoconf-based builds for UNIX versions of FR */ #undef FR_INSTALL_PREFIX #endif // FR_FRCONFIG_H flamerobin_0.9.3~svn+2220.orig/html-templates/000077500000000000000000000000001177057155300211435ustar00rootroot00000000000000flamerobin_0.9.3~svn+2220.orig/html-templates/ALLloading.html000066400000000000000000000003071177057155300237770ustar00rootroot00000000000000 Loading... Please wait while the data is being loaded... flamerobin_0.9.3~svn+2220.orig/html-templates/DATABASE.html000066400000000000000000000106101177057155300231730ustar00rootroot00000000000000 DB {%header:Summary%}

{%object_name%}
{%dbinfo:connection_string%}

Database info
ODS Version{%dbinfo:ods_version%}
Page Size{%dbinfo:page_size%}
Pages{%dbinfo:pages%}
Size on Disk{%dbinfo:size%}
SQL Dialect{%dbinfo:sql_dialect%}
Default Character Set{%dbinfo:default_charset%}
 
Settings
Page Buffers {%dbinfo:page_buffers%}
Sweep Interval {%dbinfo:sweep_interval%}
Forced Writes
Reserve Space
Read-Only
 
Transaction info
Oldest transaction{%dbinfo:oldest_transaction%}
Oldest active transaction{%dbinfo:oldest_active_transaction%}
Oldest snapshot{%dbinfo:oldest_snapshot%}
Next transaction{%dbinfo:next_transaction%}
  {%forall:{%dbinfo:connected_users%}:: %}
Connected users
%%current_value%%
flamerobin_0.9.3~svn+2220.orig/html-templates/DATABASEtriggers.html000066400000000000000000000047011177057155300247460ustar00rootroot00000000000000 Triggers {%header:Triggers%}

Triggers on database: {%object_name%}

{%foreach:trigger::: %}
Name Active Position Type
{%object_name%} {%triggerinfo:position%} {%triggerinfo:type%}


Icon Click to...
Drop trigger
Alter trigger
Deactivate trigger
Activate trigger


Activate all triggers | Deactivate all triggers flamerobin_0.9.3~svn+2220.orig/html-templates/DDL.html000066400000000000000000000011131177057155300224300ustar00rootroot00000000000000 DDL {%header:DDL%}

{%object_name%} [open in SQL editor]
{%object_ddl%}

flamerobin_0.9.3~svn+2220.orig/html-templates/DOMAIN.html000066400000000000000000000011111177057155300227720ustar00rootroot00000000000000 Domain {%header:Summary%}

{%object_name%}
{%object_description%} [edit]

Domain info
{%object_ddl%}
flamerobin_0.9.3~svn+2220.orig/html-templates/EXCEPTION.html000066400000000000000000000015431177057155300233720ustar00rootroot00000000000000 Exception {%header:Summary%}

{%object_name%}
{%object_description%} [edit]

Number Message [edit]
{%exceptioninfo:number%}
{%exceptioninfo:message%}
flamerobin_0.9.3~svn+2220.orig/html-templates/FUNCTION.html000066400000000000000000000016751177057155300232670ustar00rootroot00000000000000 UDF {%header:Summary%}

{%object_name%}
{%object_description%} [edit]

Library Name Entry Point
{%functioninfo:library%} {%functioninfo:entry_point%}
Source
{%functioninfo:definition%}
flamerobin_0.9.3~svn+2220.orig/html-templates/GENERATOR.html000066400000000000000000000012241177057155300233560ustar00rootroot00000000000000 Generator {%header:Summary%}

{%object_name%}
{%object_description%} [edit]

Value {%generatorinfo:value%}
flamerobin_0.9.3~svn+2220.orig/html-templates/PROCEDURE.html000066400000000000000000000044451177057155300233700ustar00rootroot00000000000000 Procedure {%header:Summary%}

{%object_name%}
Owner: {%owner_name%}
{%object_description%} [edit]

{%foreach:parameter::input: %}
Input parameter Type Description
{%object_name%} {%columninfo:datatype%} {%object_description%} [edit]


{%foreach:parameter::output: %}
Output parameter Type Description
{%object_name%} {%columninfo:datatype%} {%object_description%} [edit]


Source [edit]
{%procedureinfo:source%}
flamerobin_0.9.3~svn+2220.orig/html-templates/PROCEDUREprivileges.html000066400000000000000000000034351177057155300254600ustar00rootroot00000000000000 Privileges {%header:Privileges%}

Privileges on {%object_name%}

{%foreach:privilege:: %}
Grantee EXECUTE
{%privilegeinfo:grantee_name%} {%foreach:privilegeitem:
:EXECUTE: {%privilegeiteminfo:columns%}%} {%ifeq:{%privilegeitemcount:EXECUTE%}:0:%}


Grant and revoke privileges

Icons
privilege not granted
privilege granted
privilege granted with grant option
Hover over icons to see the grantor
flamerobin_0.9.3~svn+2220.orig/html-templates/ROLE.html000066400000000000000000000011321177057155300225670ustar00rootroot00000000000000 Role {%header:Summary%}

{%object_name%}
Owner: {%owner_name%}
{%object_description%} [edit]

Role info
{%object_ddl%}
flamerobin_0.9.3~svn+2220.orig/html-templates/ROLEprivileges.html000066400000000000000000000034441177057155300246710ustar00rootroot00000000000000 Privileges {%header:Privileges%}

Privileges on {%object_name%}

{%foreach:privilege:: %}
Grantee MEMBERSHIP
{%privilegeinfo:grantee_name%} {%foreach:privilegeitem:
:MEMBER OF: {%privilegeiteminfo:columns%}%} {%ifeq:{%privilegeitemcount:MEMBER OF%}:0:%}


Grant and revoke privileges

Icons
privilege not granted
privilege granted
privilege granted with admin option
Hover over icons to see the grantor
flamerobin_0.9.3~svn+2220.orig/html-templates/SERVER.html000066400000000000000000000030241177057155300230360ustar00rootroot00000000000000 User Management {%object_name%}

{%foreach:user:: %}
Username First name Middle name Last name Unix user ID Unix group ID
{%ifeq:{%is_system%}:false:%} {%userinfo:username%} {%userinfo:first_name%} {%userinfo:middle_name%} {%userinfo:last_name%} {%userinfo:unix_user%} {%userinfo:unix_group%}


Add user
flamerobin_0.9.3~svn+2220.orig/html-templates/TABLE.html000066400000000000000000000064431177057155300226670ustar00rootroot00000000000000 Table {%header:Summary%}

{%object_name%}
Owner: {%owner_name%}
{%object_description%} {%ifeq:{%is_system%}:false:[edit]%}

{%ifeq:{%is_system%}:false: %} {%ifeq:{%getglobalconf:DisplayColumnDefault%}:1: %} {%ifeq:{%getglobalconf:DisplayColumnDescription%}:1: %} {%foreach:column:: {%ifeq:{%is_system%}:false: %} {%ifeq:{%getglobalconf:DisplayColumnDefault%}:1: %} {%ifeq:{%getglobalconf:DisplayColumnDescription%}:1: %} %}
Field Type Not NullDefaultDescription
{%object_name%} {%columninfo:datatype%}
{%ifeq:{%columninfo:is_nullable%}:false:%}
{%columninfo:default_expression%}{%object_description%} {%ifeq:{%is_system%}:false:[edit]%}


{%ifeq:{%is_system%}:false: Add field | Reorder fields | Drop fields | Generate rebuild script %}

Icon click to...
Drop column
View column properties
Generate rebuild script for that column
flamerobin_0.9.3~svn+2220.orig/html-templates/TABLEconstraints.html000066400000000000000000000106611177057155300251540ustar00rootroot00000000000000 Constraints {%header:Constraints%}

{%object_name%}

{%ifeq:{%is_system%}:false: %} {%primary_key: {%ifeq:{%parent:{%is_system%}%}:false: %} %}
 Primary key On field(s)
{%object_name%} {%constraintinfo:columns%}

{%ifeq:{%is_system%}:false: Add primary key %}

{%ifeq:{%is_system%}:false: %} {%foreach:foreign_key:: {%ifeq:{%parent:{%is_system%}%}:false: %} %}
 Foreign key On field(s) References On update On delete
{%object_name%} {%constraintinfo:columns%} {%fkinfo:ref_table%} {%fkinfo:ref_columns%} {%fkinfo:update_action%} {%fkinfo:delete_action%}

{%ifeq:{%is_system%}:false: Add foreign key %}

{%ifeq:{%is_system%}:false: %} {%foreach:unique_constraint:: {%ifeq:{%parent:{%is_system%}%}:false: %} %}
Unique constraint On field(s)
{%object_name%} {%constraintinfo:columns%}

{%ifeq:{%is_system%}:false: Add unique %}

{%ifeq:{%is_system%}:false: %} {%foreach:check_constraint:: {%ifeq:{%parent:{%is_system%}%}:false: %} %}
Check constraint Source
{%object_name%} {%checkconstraintinfo:source%}

{%ifeq:{%is_system%}:false: Add check %}
flamerobin_0.9.3~svn+2220.orig/html-templates/TABLEindices.html000066400000000000000000000064501177057155300242240ustar00rootroot00000000000000 Indices {%header:Indices%}

Indices for table {%object_name%}


{%ifeq:{%is_system%}:false: %} {%foreach:index:: {%ifeq:{%parent:{%is_system%}%}:false: %} %}
Index name Type Active Unique Fields/Expression Statistics Description
{%object_name%} {%indexinfo:type%} {%ifeq:{%parent:{%is_system%}%}:false: %} {%ifeq:{%parent:{%is_system%}%}:false: %} {%indexinfo:fields%} {%indexinfo:stats%} {%object_description%} {%parent:{%ifeq:{%is_system%}:false:[edit]%}%}


{%ifeq:{%is_system%}:false: Create new index | Recompute statistics for all indices

Icon click to...
Drop index
Recompute statistics for index
Make index inactive
Make index active
%} flamerobin_0.9.3~svn+2220.orig/html-templates/TABLEprivileges.html000066400000000000000000000072211177057155300247540ustar00rootroot00000000000000 Privileges {%header:Privileges%}

Privileges on {%object_name%}

{%foreach:privilege:: %}
Grantee Select Insert Update Delete Reference
{%privilegeinfo:grantee_name%} {%foreach:privilegeitem:
:SELECT: {%privilegeiteminfo:columns%}%} {%ifeq:{%privilegeitemcount:SELECT%}:0:%}
{%foreach:privilegeitem:
:INSERT: {%privilegeiteminfo:columns%}%} {%ifeq:{%privilegeitemcount:INSERT%}:0:%}
{%foreach:privilegeitem:
:UPDATE: {%privilegeiteminfo:columns%}%} {%ifeq:{%privilegeitemcount:UPDATE%}:0:%}
{%foreach:privilegeitem:
:DELETE: {%privilegeiteminfo:columns%}%} {%ifeq:{%privilegeitemcount:DELETE%}:0:%}
{%foreach:privilegeitem:
:REFERENCES: {%privilegeiteminfo:columns%}%} {%ifeq:{%privilegeitemcount:REFERENCES%}:0:%}


{%ifeq:{%is_system%}:false: Grant and revoke privileges%}

Icons
privilege not granted
privilege granted
privilege granted with grant option
Hover over icons to see the grantor
flamerobin_0.9.3~svn+2220.orig/html-templates/TABLEtriggers.html000066400000000000000000000125461177057155300244370ustar00rootroot00000000000000 Triggers {%header:Triggers%}

Triggers on table {%object_name%}

Before triggers


{%foreach:trigger::before: %}
Name Active Position Type
{%object_name%} {%triggerinfo:position%} {%triggerinfo:type%}

After triggers


{%foreach:trigger::after: %}
Name Active Position Type
{%object_name%} {%triggerinfo:position%} {%triggerinfo:type%}


Icon click to...
Drop trigger
Alter trigger
Deactivate trigger
Activate trigger


{%ifeq:{%is_system%}:false: Create new trigger | Activate all triggers | Deactivate all triggers %} {%ifeq:{%getglobalconf:displayTriggerSource%}:1: {%foreach:trigger::before:

{%object_name%} [edit] {%triggerinfo:type%}
{%triggerinfo:source%}
%} {%foreach:trigger::after:

{%object_name%} [edit] {%triggerinfo:type%}
{%triggerinfo:source%}
%} %} flamerobin_0.9.3~svn+2220.orig/html-templates/TRIGGER.html000066400000000000000000000043051177057155300231360ustar00rootroot00000000000000 Trigger {%header:Summary%}

{%object_name%}
{%object_description%} [edit]

Active Position Type
{%triggerinfo:position%} {%triggerinfo:type%}


Source [edit]
{%triggerinfo:source%}


Icon Click to...
Drop trigger
Make trigger inactive
Make trigger active
flamerobin_0.9.3~svn+2220.orig/html-templates/VIEW.html000066400000000000000000000027251177057155300226110ustar00rootroot00000000000000 View {%header:Summary%}

{%object_name%}
Owner: {%owner_name%}
{%object_description%} [edit]

{%foreach:column:: %}
Field Type Description
{%object_name%} {%columninfo:datatype%} {%object_description%} [edit]


Source [alter]
{%viewinfo:source%}
flamerobin_0.9.3~svn+2220.orig/html-templates/VIEWprivileges.html000066400000000000000000000071151177057155300247010ustar00rootroot00000000000000 Privileges {%header:Privileges%}

Privileges on {%object_name%}

{%foreach:privilege:: %}
Grantee Select Insert Update Delete Reference
{%privilegeinfo:grantee_name%} {%foreach:privilegeitem:
:SELECT: {%privilegeiteminfo:columns%}%} {%ifeq:{%privilegeitemcount:SELECT%}:0:%}
{%foreach:privilegeitem:
:INSERT: {%privilegeiteminfo:columns%}%} {%ifeq:{%privilegeitemcount:INSERT%}:0:%}
{%foreach:privilegeitem:
:UPDATE: {%privilegeiteminfo:columns%}%} {%ifeq:{%privilegeitemcount:UPDATE%}:0:%}
{%foreach:privilegeitem:
:DELETE: {%privilegeiteminfo:columns%}%} {%ifeq:{%privilegeitemcount:DELETE%}:0:%}
{%foreach:privilegeitem:
:REFERENCES: {%privilegeiteminfo:columns%}%} {%ifeq:{%privilegeitemcount:REFERENCES%}:0:%}


Grant and revoke privileges

Icons
privilege not granted
privilege granted
privilege granted with grant option
Hover over icons to see the grantor
flamerobin_0.9.3~svn+2220.orig/html-templates/VIEWtriggers.html000066400000000000000000000122071177057155300243540ustar00rootroot00000000000000 Triggers {%header:Triggers%}

Triggers on view {%object_name%}

Before triggers


{%foreach:trigger::before: %}
Name Active Position Type
{%object_name%} {%triggerinfo:position%} {%triggerinfo:type%}

After triggers


{%foreach:trigger::after: %}
Name Active Position Type
{%object_name%} {%triggerinfo:position%} {%triggerinfo:type%}


Icon Click to...
Drop trigger
Alter trigger
Deactivate trigger
Activate trigger


Create new trigger | Activate all triggers | Deactivate all triggers {%ifeq:{%getglobalconf:displayTriggerSource%}:1: {%foreach:trigger::before:

{%object_name%} [edit]
{%triggerinfo:source%}
%} {%foreach:trigger::after:

{%object_name%} [edit]
{%triggerinfo:source%}
%} %} flamerobin_0.9.3~svn+2220.orig/html-templates/compute.png000066400000000000000000000005571177057155300233340ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÕ #€UDùüIDATxœS± Â0¼ˆØ -"~H¿ÆQ¿Àúµ››]¿EPüA1N.‚¯ˆƒmLÚHzË%$ïîB{ %:‰„ ¯³téBºÙI›I[ßЃ¬ú~ÏÈ<ó õ$-gìóÙÌ[ªÄNn¥˜Ÿ9d#]GHבq•Š2ARƒUÜoS@ß$Å3Œ$H]Ô¹\Û`„ƒ á SkÂ!Ps¿LÕ !ôO¢*œÂQfåÿzš‹™âzšàzš¸HÂQVsŽ·î' åVe›û º CÿUŽû#žïg]¼òé8çÆþWÏ&u.¡•éãî½ô¹O-IEND®B`‚flamerobin_0.9.3~svn+2220.orig/html-templates/dependencies.html000066400000000000000000000026161177057155300244640ustar00rootroot00000000000000 Dependencies {%header:Dependencies%}

{%foreach:depends_on:: %}
{%object_name%} depends on... Fields
{%object_type%} {%object_name%} {%dependencyinfo:fields%}


{%foreach:dependent:: %}
Objects that depend on {%object_name%} Fields
{%object_type%} {%object_name%} {%dependencyinfo:fields%}

flamerobin_0.9.3~svn+2220.orig/html-templates/drop.png000066400000000000000000000014121177057155300226130ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“¿IDATxÚm“OOSY†ŸÛ{ïáRúÇ;P¨EÁl€Ç`bÔ¡Æ7ºPÇd’1î4nܘÌc\Íz¾WJB&3$# Q'Ñ` 4±b)­TiKio‹ÜÛÛãÆVÞÍï$ç÷>É{ò…-B˜ÀqÃ0þÄ0 ,Ë"ŸÏ377‡" ¼·m;É÷B$ ïܾ) ¹7²¸¾"ó¹%ùâùCùóÅ3²~/„8[÷)_ÌC^¯wêï±?‘<|Âôtœäb†` ™ ç‡Ù½»Uõàñx¸|å7„lÛNzzzz¦žNÝ'éfÿþ^¢C'ØÓÙɦ‰hÒy;ŸÂ¶ÚÚLAümÛ @,#ÔÚÏßN ‡£¿ï0…B–üÚ ÙlÓÜ…ÅbXl¾]«FîŽpýê¼-4i­È€Bk(¾ªÍÆF‰b©ÈÄãÇ<ñ’r¹Ò¨õé÷û¢³³q–WV ‡›q6-ŠÅ<–KŒ299A2™fa!Í»w)²ÙµÛÀ„R'uwwÊP(DG¨½]]††S­¡*›¬þŸ'•þÀBb USÐ5•Tú£òM„–ƒ7®1:zé×ÓXV]×X\|OµZE×5ú¨TJ Ö¶´··þ~*úCC§qìO\ºt_‹Ž”.ÃÃ'q]‡~Ö××(—7Èå ·çø#<(HþIEND®B`‚flamerobin_0.9.3~svn+2220.orig/html-templates/header.html000066400000000000000000000011341177057155300232600ustar00rootroot00000000000000Summary | Constraints | Triggers | Indices | Privileges | Dependencies | DDL flamerobin_0.9.3~svn+2220.orig/html-templates/ok.png000066400000000000000000000004731177057155300222660ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ðIDATxÚc`q@á?“¥ùÄõ§ÿûV€ÂÀD‚æ'®?e¸úð-Ç7¯ð:M—Ísw\úß4s=L3²¢ÿ×¾þíák˜¤*;ƒ.Ív0p/¼{ûšáøõç kö]````¸ÅÀÀ`ÄÀÀp æì§ï2Ô¥2000Ø300B7@©¦(‹ŸíÃÇ_L0CŽ]{ø]³²fFdo¬Ùy”áã^”@ÒlÂÀÀp=ðcAéØÎµ ¯Ÿ?!Z3º þoÜšáùgF†gî14å„áÕL(¥‘•Úè[†}tüàБIEND®B`‚flamerobin_0.9.3~svn+2220.orig/html-templates/ok2.png000066400000000000000000000007111177057155300223430ustar00rootroot00000000000000‰PNG  IHDR_bKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÕ:vè1VIDATxœí“¿KBa…Ÿk[b4XSKS[K..u¡†¦Àˆ– ¥¥¦ )’¤ÀÉ¡¥!„t¾A?DE LÈÛ’ t»ÔEKüÞ–”›–SC^8Ãááø>øWòyó6?Ñ3,£²Š F&+‰Ð~ €ã°‡Œnpq“'¸±Œ‘ÉR½×y}ë:ÅkóCöf»‡ñV³b8"ǽfnº(¥Š%¥Š%€X%]¬’Þ Kò®,;Úw°I;¨5¹VµHë&V­†™ÎRÐbœ]¦ð¯-´f>Oø¶·¦€d§É£ªªŠvUàÑ©¨ª*-&ÅpD Z¬Õº­™·H±ÏÖÎSÔÅÅÊì8)-†«Þø¶5ó·€}6\WúÝÌø–Èç¸Nçaí $~Ãl(¬ÎyÈÅOPÌÊÏ‹WX'ÙŸOûõôþž>Õ^ÅÚ*õ6ãIEND®B`‚flamerobin_0.9.3~svn+2220.orig/html-templates/redx.png000066400000000000000000000007551177057155300226220ustar00rootroot00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÕ  "晦÷zIDATxœå‘½K[aʦIn¼ï%‰Ÿ8­¢¢ClAD ⤻ƒƒt’ŽuÓAD]éØÿC¡t‘¨W ŠŠ&¡š/1Ñ÷Þûv“$ZwñÙÎyÎs8<ÞݨJÂS jL¡¢ƒ‚ír½'ŸÏ{t]Wc!]f5+g)ŠÒ~ºÓJ :Ì ?¿M±>ò…á!„h5«™¤Ñ¯Ä-Kà-éÉ?[hÊåGw îÎ)–f¨__{ùÛe#•ãVºe©Ë@´.¤ÖúÚé¿ø"µøšØÙޱ¿æ¢h?Ók•ÄaúމM‹Õ“®”äŽöiT ê•Ò— lÛöø‡…Éqö®oø`L¯ÆJG=­aóõ†ú?©ÆdïC½X–Åb§(åË-<&²L|&¶g1œàêþÍtåý üáº|¤Ùü?AOg“"‘åÎ žºyÚ !T»à8™Éy&ÿì™oxþC"ŠîÏœ×IEND®B`‚flamerobin_0.9.3~svn+2220.orig/html-templates/view.png000066400000000000000000000010161177057155300226210ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA± üabKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ+PüÁ‹IDATxÚ“±Šê@†ÿ\ocã<‹…oa·eÚÛÈ>„¾ƒé—+j#¤¶ˆ¨…B„›ZHa2‘h° 3ÿ-–„Í&ÂfÎÿñŸ3g€Ïõ€?ˆ>^,cCkÍËåÂõz]@Þ^²,kŒÍfÃ<Ï9›ÍjN¬/(¥í­V+ì÷{\¯W„aÏóJí¯&ã8B@ÇqÐëõ „@šÞA%·˜L&ÃA@)…0 1N1 ðññËåòuï÷;ðp8ðù|ÒC¥ð|>óv»q»Ý}ü. $ÈÏ{)%²,C«ÕÂãñ@SN P$ŒF#¸® ’èt:X,‡ÐZƒ$Œ1Í%h­™$ £(âx<.‡Ç¶íòìû>=Ï«”PH))¥dÇŒã˜QÑ÷ýÊ4Îçó Àú@’$Ç#úýÚ×ç€$,ËÂ÷»n· ×uk¯8ˆã¸Òåâ\ì§Ó J)ض]jËWØívÈóü¥Úí6Ò4€ß¼ÿð;ñ§þ_P[V¦Ýi¢IEND®B`‚flamerobin_0.9.3~svn+2220.orig/install-sh000077500000000000000000000127201177057155300202110ustar00rootroot00000000000000#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 flamerobin_0.9.3~svn+2220.orig/install/000077500000000000000000000000001177057155300176515ustar00rootroot00000000000000flamerobin_0.9.3~svn+2220.orig/install/slackware/000077500000000000000000000000001177057155300216255ustar00rootroot00000000000000flamerobin_0.9.3~svn+2220.orig/install/slackware/description-pak000066400000000000000000000003601177057155300246430ustar00rootroot00000000000000Flamerobin is a GUI administration tool for Firebird DBMS Its goals are to be: - lightweight - cross-platform (Linux, Windows, MacOSX, FreeBSD, Solaris) - dependent only on other open source software Homepage: http://www.flamerobin.org/ flamerobin_0.9.3~svn+2220.orig/install/win32/000077500000000000000000000000001177057155300206135ustar00rootroot00000000000000flamerobin_0.9.3~svn+2220.orig/install/win32/FlameRobinSetup.iss000066400000000000000000000141561177057155300244010ustar00rootroot00000000000000;Copyright (c) 2004-2012 The FlameRobin Development Team ; ;Permission is hereby granted, free of charge, to any person obtaining ;a copy of this software and associated documentation files (the ;"Software"), to deal in the Software without restriction, including ;without limitation the rights to use, copy, modify, merge, publish, ;distribute, sublicense, and/or sell copies of the Software, and to ;permit persons to whom the Software is furnished to do so, subject to ;the following conditions: ; ;The above copyright notice and this permission notice shall be included ;in all copies or substantial portions of the Software. ; ;THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ;EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ;MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ;IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ;CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ;TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ;SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ; ; $Id$ ;#define DEBUG ;#define X64VERSION #include "..\..\src\frversion.h" #define FR_VERSION_STRING Str(FR_VERSION_MAJOR) + "." + Str(FR_VERSION_MINOR) + "." + Str(FR_VERSION_RLS) #if defined(FR_VERSION_SVN) && (FR_VERSION_RLS % 2 == 1) #define FR_VERSION_STRING FR_VERSION_STRING + "." + Str(FR_VERSION_SVN) #endif [Setup] #ifdef X64VERSION AppName=FlameRobin (x64) AppVerName=FlameRobin {#FR_VERSION_STRING} (x64) #else AppName=FlameRobin AppVerName=FlameRobin {#FR_VERSION_STRING} #endif AppPublisher=The FlameRobin Project AppPublisherURL=http://www.flamerobin.org AppSupportURL=http://www.flamerobin.org AppUpdatesURL=http://www.flamerobin.org #ifdef X64VERSION DefaultDirName={pf}\FlameRobin (x64) DefaultGroupName=FlameRobin (x64) #else DefaultDirName={pf}\FlameRobin DefaultGroupName=FlameRobin #endif AllowNoIcons=true LicenseFile=..\..\docs-src\fr_license.txt #ifdef X64VERSION InfoBeforeFile=info_before_win64.rtf #endif InfoAfterFile= #ifdef DEBUG Compression=lzma/ultra #ifdef X64VERSION OutputBaseFilename=flamerobin-{#FR_VERSION_STRING}-setup-x64-debug #else OutputBaseFilename=flamerobin-{#FR_VERSION_STRING}-setup-debug #endif #else Compression=lzma #ifdef X64VERSION OutputBaseFilename=flamerobin-{#FR_VERSION_STRING}-setup-x64 #else OutputBaseFilename=flamerobin-{#FR_VERSION_STRING}-setup #endif #endif SolidCompression=true OutputDir=.\output InternalCompressLevel=ultra ShowLanguageDialog=yes PrivilegesRequired=none #ifdef X64VERSION ArchitecturesAllowed=x64 ; "ArchitecturesInstallIn64BitMode=x64" requests that the install be ; done in "64-bit mode" on x64, meaning it should use the native ; 64-bit Program Files directory and the 64-bit view of the registry. ; On all other architectures it will install in "32-bit mode". ArchitecturesInstallIn64BitMode=x64 #endif [Tasks] Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons} Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons} [Files] #ifdef DEBUG #ifdef X64VERSION Source: ..\..\vcud_amd64\flamerobin.exe; DestDir: {app}; Flags: ignoreversion; Check: Is64BitInstallMode Source: ..\..\vcud_amd64\flamerobin.exe.manifest; DestDir: {app}; Flags: ignoreversion; Check: Is64BitInstallMode #else Source: ..\..\vcd\flamerobin.exe; DestDir: {app}; Flags: ignoreversion; MinVersion: 4.0.950,0; Check: not Is64BitInstallMode Source: ..\..\vcud\flamerobin.exe; DestDir: {app}; Flags: ignoreversion; MinVersion: 0,4.0.1381; Check: not Is64BitInstallMode #endif #else #ifdef X64VERSION Source: ..\..\vcu_amd64\flamerobin.exe; DestDir: {app}; Flags: ignoreversion; Check: Is64BitInstallMode Source: ..\..\vcu_amd64\flamerobin.exe.manifest; DestDir: {app}; Flags: ignoreversion; Check: Is64BitInstallMode #else Source: ..\..\vc\flamerobin.exe; DestDir: {app}; Flags: ignoreversion; MinVersion: 4.0.950,0; Check: not Is64BitInstallMode Source: ..\..\vcu\flamerobin.exe; DestDir: {app}; Flags: ignoreversion; MinVersion: 0,4.0.1381; Check: not Is64BitInstallMode #endif #endif Source: ..\..\docs\*.*; Excludes: flamerobin.1; DestDir: {app}\docs; Flags: ignoreversion Source: ..\..\conf-defs\*.*; DestDir: {app}\conf-defs; Flags: ignoreversion Source: ..\..\code-templates\*.*; DestDir: {app}\code-templates; Flags: ignoreversion Source: ..\..\html-templates\*.*; DestDir: {app}\html-templates; Flags: ignoreversion Source: ..\..\sys-templates\*.*; DestDir: {app}\sys-templates; Flags: ignoreversion #ifndef X64VERSION Source: ..\..\res\system32\msvcr71.dll; DestDir: {app}; MinVersion: 0,5.0.2195 Source: ..\..\res\system32\msvcr71.dll; DestDir: {sys}; Flags: sharedfile uninsneveruninstall; OnlyBelowVersion: 0,5.0.2195 Source: ..\..\res\system32\msvcp71.dll; DestDir: {app}; MinVersion: 0,5.0.2195 Source: ..\..\res\system32\msvcp71.dll; DestDir: {sys}; Flags: sharedfile uninsneveruninstall; OnlyBelowVersion: 0,5.0.2195 #endif [INI] Filename: {app}\flamerobin.url; Section: InternetShortcut; Key: URL; String: http://www.flamerobin.org [Icons] Name: {group}\FlameRobin; Filename: {app}\flamerobin.exe; WorkingDir: {app} Name: {group}\License; Filename: {app}\docs\fr_license.html Name: {group}\Manual; Filename: {app}\docs\fr_manual.html Name: {group}\What's new; Filename: {app}\docs\fr_whatsnew.html Name: {group}\{cm:ProgramOnTheWeb,FlameRobin}; Filename: {app}\flamerobin.url Name: {group}\{cm:UninstallProgram,FlameRobin}; Filename: {uninstallexe} Name: {userdesktop}\FlameRobin; Filename: {app}\flamerobin.exe; Tasks: desktopicon; WorkingDir: {app}; IconIndex: 0 Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\FlameRobin; Filename: {app}\flamerobin.exe; Tasks: quicklaunchicon; WorkingDir: {app}; IconIndex: 0 [Run] Filename: {app}\flamerobin.exe; Description: {cm:LaunchProgram,FlameRobin}; Flags: nowait postinstall skipifsilent Filename: {app}\docs\fr_whatsnew.html; Description: Show Release Notes; StatusMsg: Showing Release notes; Flags: nowait shellexec postinstall skipifsilent [UninstallDelete] Type: files; Name: {app}\flamerobin.url [_ISTool] UseAbsolutePaths=false #expr SaveToFile(AddBackslash(SourcePath) + "FlameRobinSetup_Preprocessed.iss") flamerobin_0.9.3~svn+2220.orig/install/win32/info_before_win64.rtf000066400000000000000000000013551177057155300246400ustar00rootroot00000000000000{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fcharset0 Arial;}} {\*\generator Msftedit 5.41.21.2500;}\viewkind4\uc1\pard\b\f0\fs20 Please take care when mixing installing / copying of 32 and 64 bit versions of FlameRobin!\par \b0\par The installations use different IDs and will both appear in the "Add / Remove Programs" applet, it's therefore best to install them into different directories. When copying files from the ZIP packages please make sure that the 64 bit version is always copied together with the manifest file, while the manifest file has to be removed when the 32 bit version is used. Keeping the manifest file of the 64 bit version in the same directory as the 32 bit executable makes running it impossible.\par } flamerobin_0.9.3~svn+2220.orig/install/win32/readme_win64.txt000066400000000000000000000011111177057155300236320ustar00rootroot00000000000000Please take care when mixing installing / copying of 32 and 64 bit versions of FlameRobin. The installations use different IDs and will both appear in the "Add / Remove Programs" applet, it's therefore best to install them into different directories. When copying files from the ZIP packages please make sure that the 64 bit version is always copied together with the manifest file, while the manifest file has to be removed when the 32 bit version is used. Keeping the manifest file of the 64 bit version in the same directory as the 32 bit executable makes running it impossible. flamerobin_0.9.3~svn+2220.orig/makefile.bcc000066400000000000000000001021331177057155300204310ustar00rootroot00000000000000# ========================================================================= # This makefile was generated by # Bakefile 0.2.9 (http://www.bakefile.org) # Do not modify, all changes will be overwritten! # ========================================================================= .autodepend !ifndef BCCDIR !ifndef MAKEDIR !error Your Borland compiler does not define MAKEDIR. Please define the BCCDIR variable, e.g. BCCDIR=d:\bc4 !endif BCCDIR = $(MAKEDIR)\.. !endif # ------------------------------------------------------------------------- # These are configurable options: # ------------------------------------------------------------------------- # C++ compiler !ifndef CXX CXX = bcc32 !endif # Standard flags for C++ !ifndef CXXFLAGS CXXFLAGS = !endif # Standard preprocessor flags (common for CC and CXX) !ifndef CPPFLAGS CPPFLAGS = -a8 -g0 !endif # Standard linker flags !ifndef LDFLAGS LDFLAGS = !endif # [0,1] !ifndef USEDLL USEDLL = 0 !endif # [0,1] !ifndef UNICODE UNICODE = 0 !endif # [0,1] !ifndef FINAL FINAL = 0 !endif # [0,1] !ifndef STATICRTL STATICRTL = 0 !endif # ------------------------------------------------------------------------- # Do not modify the rest of this file! # ------------------------------------------------------------------------- ### Variables: ### FLAMEROBIN_CXXFLAGS = $(__RTL_TYPE) -I$(BCCDIR)\include -tWM $(__DEBUGINFO) \ $(__OPTIMIZE) $(____flamerobin_WXDEBUG_p) $(____flamerobin_DEBUGFLAG_p) \ -D_WINDOWS -D__WINDOWS__ -DWINVER=0x400 -DWIN32 -D__WIN32__ -D__WIN95__ \ -DSTRICT -D__WXMSW__ -DwxUSE_GUI=1 -DwxUSE_REGEX=1 \ -DwxUSE_UNICODE=$(UNICODE) -DWIN32_LEAN_AND_MEAN \ -I$(____flamerobin_WX_LIB_DIR_FILENAMES)\msw$(U_OPT)$(D_OPT) \ -I$(WXDIR)\contrib\include -I$(WXDIR)\include -I$(BOOST_ROOT) \ -DIBPP_WINDOWS -I. -I.\src -I.\src\ibpp -I.\res -Hu \ -H=bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin.csm $(CPPFLAGS) $(CXXFLAGS) FLAMEROBIN_OBJECTS = \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_addconstrainthandler.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Config.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DatabaseConfig.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ArtProvider.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_CodeTemplateProcessor.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_FRError.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Observer.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ProgressIndicator.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_StringUtils.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Subject.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_TemplateProcessor.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_URIProcessor.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Visitor.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_databasehandler.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataLoader.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_frprec.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_frutils.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_AboutBox.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_AdvancedMessageDialog.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_AdvancedSearchFrame.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_BackupFrame.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_BackupRestoreBaseFrame.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_BaseDialog.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_BaseFrame.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_CommandManager.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ConfdefTemplateProcessor.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ContextMenuMetadataItemVisitor.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ControlUtils.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DataGrid.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DataGridRowBuffer.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DataGridRows.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DataGridTable.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DBHTreeControl.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DndTextControls.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_LogTextControl.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_PrintableHtmlWindow.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_TextControl.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_CreateIndexDialog.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DataGeneratorFrame.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DatabaseRegistrationDialog.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_EditBlobDialog.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_EventWatcherFrame.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ExecuteSqlFrame.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ExecuteSql.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_FieldPropertiesDialog.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_FindDialog.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_FRLayoutConfig.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_GUIURIHandlerHelper.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_HtmlHeaderMetadataItemVisitor.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_HtmlTemplateProcessor.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_InsertDialog.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MainFrame.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataItemPropertiesFrame.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MultilineEnterDialog.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_PreferencesDialog.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_PreferencesDialogSettings.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_PrivilegesDialog.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ProgressDialog.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ReorderFieldsDialog.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_RestoreFrame.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ServerRegistrationDialog.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_SimpleHtmlFrame.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_StatementHistoryDialog.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_StyleGuide.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_UserDialog.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_UsernamePasswordDialog.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_logger.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_main.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MasterPassword.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_column.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_constraints.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_CreateDDLVisitor.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_database.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_domain.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_exception.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_function.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_generator.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Index.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_metadataitem.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataItemCreateStatementVisitor.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataItemDescriptionVisitor.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataItemURIHandlerHelper.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataItemVisitor.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataTemplateCmdHandler.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataTemplateManager.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_parameter.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_privilege.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_procedure.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_relation.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_role.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_root.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_server.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_table.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_trigger.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_User.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_view.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_objectdescriptionhandler.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Identifier.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_IncompleteStatement.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MultiStatement.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_SelectStatement.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_SqlStatement.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_SqlTokenizer.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_StatementBuilder.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_statementHistory.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_StyleGuideMSW.obj IBPP_CXXFLAGS = $(__RTL_TYPE) -I$(BCCDIR)\include -tWM $(__DEBUGINFO) \ $(__OPTIMIZE) -DIBPP_WINDOWS -I.\src\ibpp -Hu \ -H=bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp.csm $(CPPFLAGS) $(CXXFLAGS) IBPP_OBJECTS = \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__dpb.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__ibpp.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__ibs.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__rb.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__spb.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__tpb.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_array.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_blob.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_database.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_date.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_dbkey.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_events.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_exception.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_row.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_service.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_statement.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_time.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_transaction.obj \ bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_user.obj ### Conditionally set variables: ### !if "$(STATICRTL)" == "1" R_OPT = s !endif !if "$(STATICRTL)" == "0" __RTL_TYPE_1 = i !endif !if "$(STATICRTL)" == "1" __RTL_TYPE_1 = !endif !if "$(FINAL)" == "0" ____flamerobin_WXDEBUG_p = -D__WXDEBUG__ !endif !if "$(FINAL)" == "0" ____flamerobin_WXDEBUG_p_1 = -d__WXDEBUG__ !endif !if "$(FINAL)" == "0" ____flamerobin_DEBUGFLAG_p = -D_DEBUG !endif !if "$(FINAL)" == "0" ____flamerobin_DEBUGFLAG_p_1 = -d_DEBUG !endif !if "$(USEDLL)" == "0" ______flamerobin_WX_LIB_DIR_FILENAMES_2_p = -L$(WXDIR)\lib\bcc_lib !endif !if "$(USEDLL)" == "1" ______flamerobin_WX_LIB_DIR_FILENAMES_2_p = -L$(WXDIR)\lib\bcc_dll !endif !if "$(STATICRTL)" == "0" __RTL_TYPE = -tWR !endif !if "$(STATICRTL)" == "1" __RTL_TYPE = !endif !if "$(FINAL)" == "0" __DEBUGINFO = -v !endif !if "$(FINAL)" == "1" __DEBUGINFO = -v- !endif !if "$(FINAL)" == "0" __OPTIMIZE = -Od !endif !if "$(FINAL)" == "1" __OPTIMIZE = -O1 !endif !if "$(USEDLL)" == "0" ____flamerobin_WX_LIB_DIR_FILENAMES = $(WXDIR)\lib\bcc_lib !endif !if "$(USEDLL)" == "1" ____flamerobin_WX_LIB_DIR_FILENAMES = $(WXDIR)\lib\bcc_dll !endif !if "$(UNICODE)" == "1" U_OPT = u !endif !if "$(FINAL)" == "0" D_OPT = d !endif all: bcc$(U_OPT)$(R_OPT)$(D_OPT) bcc$(U_OPT)$(R_OPT)$(D_OPT): -if not exist bcc$(U_OPT)$(R_OPT)$(D_OPT) mkdir bcc$(U_OPT)$(R_OPT)$(D_OPT) ### Targets: ### all: svn-rev bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin.exe bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp.lib clean: -if exist bcc$(U_OPT)$(R_OPT)$(D_OPT)\*.obj del bcc$(U_OPT)$(R_OPT)$(D_OPT)\*.obj -if exist bcc$(U_OPT)$(R_OPT)$(D_OPT)\*.res del bcc$(U_OPT)$(R_OPT)$(D_OPT)\*.res -if exist bcc$(U_OPT)$(R_OPT)$(D_OPT)\*.csm del bcc$(U_OPT)$(R_OPT)$(D_OPT)\*.csm -if exist bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin.exe del bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin.exe -if exist bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin.tds del bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin.tds -if exist bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin.ilc del bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin.ilc -if exist bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin.ild del bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin.ild -if exist bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin.ilf del bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin.ilf -if exist bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin.ils del bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin.ils -if exist bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp.lib del bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp.lib svn-rev: update-svn-rev.cmd bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin.exe: bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_frprec.obj $(FLAMEROBIN_OBJECTS) bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp.lib bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_flamerobin.res bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp.lib ilink32 -Tpe -q -L$(BCCDIR)\lib -L$(BCCDIR)\lib\psdk $(__DEBUGINFO) $(______flamerobin_WX_LIB_DIR_FILENAMES_2_p) -aa $(LDFLAGS) @&&| c0w32.obj $(FLAMEROBIN_OBJECTS),$@,, wxmsw28$(U_OPT)$(D_OPT)_aui.lib wxmsw28$(U_OPT)$(D_OPT)_stc.lib wxmsw28$(U_OPT)$(D_OPT)_html.lib wxmsw28$(U_OPT)$(D_OPT)_adv.lib wxmsw28$(U_OPT)$(D_OPT)_core.lib wxbase28$(U_OPT)$(D_OPT)_xml.lib wxbase28$(U_OPT)$(D_OPT).lib wxexpat$(D_OPT).lib wxtiff$(D_OPT).lib wxjpeg$(D_OPT).lib wxpng$(D_OPT).lib wxzlib$(D_OPT).lib wxregex$(U_OPT)$(D_OPT).lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp.lib import32.lib cw32mt$(__RTL_TYPE_1).lib,, bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_flamerobin.res | bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp.lib: bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__ibpp.obj $(IBPP_OBJECTS) if exist $@ del $@ tlib /a /p4096 $@ @&&| $(IBPP_OBJECTS) | bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_addconstrainthandler.obj: .\src\addconstrainthandler.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\addconstrainthandler.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Config.obj: .\src\config\Config.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\config\Config.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DatabaseConfig.obj: .\src\config\DatabaseConfig.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\config\DatabaseConfig.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ArtProvider.obj: .\src\core\ArtProvider.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\core\ArtProvider.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_CodeTemplateProcessor.obj: .\src\core\CodeTemplateProcessor.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\core\CodeTemplateProcessor.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_FRError.obj: .\src\core\FRError.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\core\FRError.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Observer.obj: .\src\core\Observer.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\core\Observer.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ProgressIndicator.obj: .\src\core\ProgressIndicator.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\core\ProgressIndicator.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_StringUtils.obj: .\src\core\StringUtils.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\core\StringUtils.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Subject.obj: .\src\core\Subject.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\core\Subject.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_TemplateProcessor.obj: .\src\core\TemplateProcessor.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\core\TemplateProcessor.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_URIProcessor.obj: .\src\core\URIProcessor.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\core\URIProcessor.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Visitor.obj: .\src\core\Visitor.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\core\Visitor.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_databasehandler.obj: .\src\databasehandler.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\databasehandler.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataLoader.obj: .\src\engine\MetadataLoader.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\engine\MetadataLoader.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_frprec.obj: .\src\frprec.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) -H .\src\frprec.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_frutils.obj: .\src\frutils.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\frutils.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_AboutBox.obj: .\src\gui\AboutBox.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\AboutBox.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_AdvancedMessageDialog.obj: .\src\gui\AdvancedMessageDialog.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\AdvancedMessageDialog.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_AdvancedSearchFrame.obj: .\src\gui\AdvancedSearchFrame.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\AdvancedSearchFrame.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_BackupFrame.obj: .\src\gui\BackupFrame.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\BackupFrame.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_BackupRestoreBaseFrame.obj: .\src\gui\BackupRestoreBaseFrame.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\BackupRestoreBaseFrame.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_BaseDialog.obj: .\src\gui\BaseDialog.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\BaseDialog.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_BaseFrame.obj: .\src\gui\BaseFrame.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\BaseFrame.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_CommandManager.obj: .\src\gui\CommandManager.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\CommandManager.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ConfdefTemplateProcessor.obj: .\src\gui\ConfdefTemplateProcessor.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\ConfdefTemplateProcessor.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ContextMenuMetadataItemVisitor.obj: .\src\gui\ContextMenuMetadataItemVisitor.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\ContextMenuMetadataItemVisitor.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ControlUtils.obj: .\src\gui\controls\ControlUtils.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\controls\ControlUtils.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DataGrid.obj: .\src\gui\controls\DataGrid.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\controls\DataGrid.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DataGridRowBuffer.obj: .\src\gui\controls\DataGridRowBuffer.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\controls\DataGridRowBuffer.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DataGridRows.obj: .\src\gui\controls\DataGridRows.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\controls\DataGridRows.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DataGridTable.obj: .\src\gui\controls\DataGridTable.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\controls\DataGridTable.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DBHTreeControl.obj: .\src\gui\controls\DBHTreeControl.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\controls\DBHTreeControl.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DndTextControls.obj: .\src\gui\controls\DndTextControls.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\controls\DndTextControls.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_LogTextControl.obj: .\src\gui\controls\LogTextControl.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\controls\LogTextControl.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_PrintableHtmlWindow.obj: .\src\gui\controls\PrintableHtmlWindow.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\controls\PrintableHtmlWindow.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_TextControl.obj: .\src\gui\controls\TextControl.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\controls\TextControl.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_CreateIndexDialog.obj: .\src\gui\CreateIndexDialog.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\CreateIndexDialog.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DataGeneratorFrame.obj: .\src\gui\DataGeneratorFrame.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\DataGeneratorFrame.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DatabaseRegistrationDialog.obj: .\src\gui\DatabaseRegistrationDialog.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\DatabaseRegistrationDialog.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_EditBlobDialog.obj: .\src\gui\EditBlobDialog.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\EditBlobDialog.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_EventWatcherFrame.obj: .\src\gui\EventWatcherFrame.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\EventWatcherFrame.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ExecuteSqlFrame.obj: .\src\gui\ExecuteSqlFrame.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\ExecuteSqlFrame.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ExecuteSql.obj: .\src\gui\ExecuteSql.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\ExecuteSql.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_FieldPropertiesDialog.obj: .\src\gui\FieldPropertiesDialog.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\FieldPropertiesDialog.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_FindDialog.obj: .\src\gui\FindDialog.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\FindDialog.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_FRLayoutConfig.obj: .\src\gui\FRLayoutConfig.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\FRLayoutConfig.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_GUIURIHandlerHelper.obj: .\src\gui\GUIURIHandlerHelper.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\GUIURIHandlerHelper.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_HtmlHeaderMetadataItemVisitor.obj: .\src\gui\HtmlHeaderMetadataItemVisitor.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\HtmlHeaderMetadataItemVisitor.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_HtmlTemplateProcessor.obj: .\src\gui\HtmlTemplateProcessor.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\HtmlTemplateProcessor.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_InsertDialog.obj: .\src\gui\InsertDialog.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\InsertDialog.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MainFrame.obj: .\src\gui\MainFrame.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\MainFrame.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataItemPropertiesFrame.obj: .\src\gui\MetadataItemPropertiesFrame.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\MetadataItemPropertiesFrame.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MultilineEnterDialog.obj: .\src\gui\MultilineEnterDialog.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\MultilineEnterDialog.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_PreferencesDialog.obj: .\src\gui\PreferencesDialog.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\PreferencesDialog.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_PreferencesDialogSettings.obj: .\src\gui\PreferencesDialogSettings.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\PreferencesDialogSettings.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_PrivilegesDialog.obj: .\src\gui\PrivilegesDialog.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\PrivilegesDialog.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ProgressDialog.obj: .\src\gui\ProgressDialog.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\ProgressDialog.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ReorderFieldsDialog.obj: .\src\gui\ReorderFieldsDialog.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\ReorderFieldsDialog.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_RestoreFrame.obj: .\src\gui\RestoreFrame.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\RestoreFrame.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ServerRegistrationDialog.obj: .\src\gui\ServerRegistrationDialog.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\ServerRegistrationDialog.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_SimpleHtmlFrame.obj: .\src\gui\SimpleHtmlFrame.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\SimpleHtmlFrame.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_StatementHistoryDialog.obj: .\src\gui\StatementHistoryDialog.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\StatementHistoryDialog.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_StyleGuide.obj: .\src\gui\StyleGuide.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\StyleGuide.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_UserDialog.obj: .\src\gui\UserDialog.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\UserDialog.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_UsernamePasswordDialog.obj: .\src\gui\UsernamePasswordDialog.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\UsernamePasswordDialog.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_logger.obj: .\src\logger.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\logger.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_main.obj: .\src\main.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\main.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MasterPassword.obj: .\src\MasterPassword.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\MasterPassword.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_column.obj: .\src\metadata\column.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\column.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_constraints.obj: .\src\metadata\constraints.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\constraints.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_CreateDDLVisitor.obj: .\src\metadata\CreateDDLVisitor.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\CreateDDLVisitor.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_database.obj: .\src\metadata\database.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\database.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_domain.obj: .\src\metadata\domain.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\domain.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_exception.obj: .\src\metadata\exception.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\exception.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_function.obj: .\src\metadata\function.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\function.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_generator.obj: .\src\metadata\generator.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\generator.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Index.obj: .\src\metadata\Index.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\Index.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_metadataitem.obj: .\src\metadata\metadataitem.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\metadataitem.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataItemCreateStatementVisitor.obj: .\src\metadata\MetadataItemCreateStatementVisitor.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\MetadataItemCreateStatementVisitor.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataItemDescriptionVisitor.obj: .\src\metadata\MetadataItemDescriptionVisitor.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\MetadataItemDescriptionVisitor.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataItemURIHandlerHelper.obj: .\src\metadata\MetadataItemURIHandlerHelper.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\MetadataItemURIHandlerHelper.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataItemVisitor.obj: .\src\metadata\MetadataItemVisitor.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\MetadataItemVisitor.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataTemplateCmdHandler.obj: .\src\metadata\MetadataTemplateCmdHandler.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\MetadataTemplateCmdHandler.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataTemplateManager.obj: .\src\metadata\MetadataTemplateManager.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\MetadataTemplateManager.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_parameter.obj: .\src\metadata\parameter.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\parameter.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_privilege.obj: .\src\metadata\privilege.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\privilege.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_procedure.obj: .\src\metadata\procedure.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\procedure.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_relation.obj: .\src\metadata\relation.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\relation.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_role.obj: .\src\metadata\role.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\role.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_root.obj: .\src\metadata\root.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\root.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_server.obj: .\src\metadata\server.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\server.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_table.obj: .\src\metadata\table.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\table.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_trigger.obj: .\src\metadata\trigger.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\trigger.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_User.obj: .\src\metadata\User.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\User.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_view.obj: .\src\metadata\view.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\view.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_objectdescriptionhandler.obj: .\src\objectdescriptionhandler.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\objectdescriptionhandler.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Identifier.obj: .\src\sql\Identifier.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\sql\Identifier.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_IncompleteStatement.obj: .\src\sql\IncompleteStatement.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\sql\IncompleteStatement.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MultiStatement.obj: .\src\sql\MultiStatement.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\sql\MultiStatement.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_SelectStatement.obj: .\src\sql\SelectStatement.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\sql\SelectStatement.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_SqlStatement.obj: .\src\sql\SqlStatement.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\sql\SqlStatement.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_SqlTokenizer.obj: .\src\sql\SqlTokenizer.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\sql\SqlTokenizer.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_StatementBuilder.obj: .\src\sql\StatementBuilder.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\sql\StatementBuilder.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_statementHistory.obj: .\src\statementHistory.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\statementHistory.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_StyleGuideMSW.obj: .\src\gui\msw\StyleGuideMSW.cpp $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\msw\StyleGuideMSW.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_flamerobin.res: .\res\flamerobin.rc brcc32 -32 -r -fo$@ -i$(BCCDIR)\include $(____flamerobin_WXDEBUG_p_1) $(____flamerobin_DEBUGFLAG_p_1) -d_WINDOWS -d__WINDOWS__ -dWINVER=0x400 -dWIN32 -d__WIN32__ -d__WIN95__ -dSTRICT -d__WXMSW__ -dwxUSE_GUI=1 -dwxUSE_REGEX=1 -dwxUSE_UNICODE=$(UNICODE) -dWIN32_LEAN_AND_MEAN -i$(____flamerobin_WX_LIB_DIR_FILENAMES)\msw$(U_OPT)$(D_OPT) -i$(WXDIR)\contrib\include -i$(WXDIR)\include -i$(BOOST_ROOT) -dIBPP_WINDOWS -i. -i.\src -i.\src\ibpp -i.\res .\res\flamerobin.rc bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__dpb.obj: .\src\ibpp\_dpb.cpp $(CXX) -q -c -P -o$@ $(IBPP_CXXFLAGS) .\src\ibpp\_dpb.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__ibpp.obj: .\src\ibpp\_ibpp.cpp $(CXX) -q -c -P -o$@ $(IBPP_CXXFLAGS) -H .\src\ibpp\_ibpp.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__ibs.obj: .\src\ibpp\_ibs.cpp $(CXX) -q -c -P -o$@ $(IBPP_CXXFLAGS) .\src\ibpp\_ibs.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__rb.obj: .\src\ibpp\_rb.cpp $(CXX) -q -c -P -o$@ $(IBPP_CXXFLAGS) .\src\ibpp\_rb.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__spb.obj: .\src\ibpp\_spb.cpp $(CXX) -q -c -P -o$@ $(IBPP_CXXFLAGS) .\src\ibpp\_spb.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__tpb.obj: .\src\ibpp\_tpb.cpp $(CXX) -q -c -P -o$@ $(IBPP_CXXFLAGS) .\src\ibpp\_tpb.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_array.obj: .\src\ibpp\array.cpp $(CXX) -q -c -P -o$@ $(IBPP_CXXFLAGS) .\src\ibpp\array.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_blob.obj: .\src\ibpp\blob.cpp $(CXX) -q -c -P -o$@ $(IBPP_CXXFLAGS) .\src\ibpp\blob.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_database.obj: .\src\ibpp\database.cpp $(CXX) -q -c -P -o$@ $(IBPP_CXXFLAGS) .\src\ibpp\database.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_date.obj: .\src\ibpp\date.cpp $(CXX) -q -c -P -o$@ $(IBPP_CXXFLAGS) .\src\ibpp\date.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_dbkey.obj: .\src\ibpp\dbkey.cpp $(CXX) -q -c -P -o$@ $(IBPP_CXXFLAGS) .\src\ibpp\dbkey.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_events.obj: .\src\ibpp\events.cpp $(CXX) -q -c -P -o$@ $(IBPP_CXXFLAGS) .\src\ibpp\events.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_exception.obj: .\src\ibpp\exception.cpp $(CXX) -q -c -P -o$@ $(IBPP_CXXFLAGS) .\src\ibpp\exception.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_row.obj: .\src\ibpp\row.cpp $(CXX) -q -c -P -o$@ $(IBPP_CXXFLAGS) .\src\ibpp\row.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_service.obj: .\src\ibpp\service.cpp $(CXX) -q -c -P -o$@ $(IBPP_CXXFLAGS) .\src\ibpp\service.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_statement.obj: .\src\ibpp\statement.cpp $(CXX) -q -c -P -o$@ $(IBPP_CXXFLAGS) .\src\ibpp\statement.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_time.obj: .\src\ibpp\time.cpp $(CXX) -q -c -P -o$@ $(IBPP_CXXFLAGS) .\src\ibpp\time.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_transaction.obj: .\src\ibpp\transaction.cpp $(CXX) -q -c -P -o$@ $(IBPP_CXXFLAGS) .\src\ibpp\transaction.cpp bcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_user.obj: .\src\ibpp\user.cpp $(CXX) -q -c -P -o$@ $(IBPP_CXXFLAGS) .\src\ibpp\user.cpp flamerobin_0.9.3~svn+2220.orig/makefile.mgw000066400000000000000000000717701177057155300205100ustar00rootroot00000000000000# ========================================================================= # This makefile was generated by # Bakefile 0.2.9 (http://www.bakefile.org) # Do not modify, all changes will be overwritten! # ========================================================================= # ------------------------------------------------------------------------- # These are configurable options: # ------------------------------------------------------------------------- # C++ compiler CXX = g++ # Standard flags for C++ CXXFLAGS ?= # Standard preprocessor flags (common for CC and CXX) CPPFLAGS ?= # Standard linker flags LDFLAGS ?= # [0,1] USEDLL ?= 0 # [0,1] UNICODE ?= 0 # [0,1] FINAL ?= 0 # [0,1] STATICRTL ?= 0 # ------------------------------------------------------------------------- # Do not modify the rest of this file! # ------------------------------------------------------------------------- ### Variables: ### CPPDEPS = -MT$@ -MF$@.d -MD -MP FLAMEROBIN_CXXFLAGS = -mthreads $(__DEBUGINFO) $(__OPTIMIZE) -W -Wall \ $(____flamerobin_WXDEBUG_p) $(____flamerobin_DEBUGFLAG_p) -DHAVE_W32API_H \ -D_WINDOWS -D__WINDOWS__ -DWINVER=0x400 -DWIN32 -D__WIN32__ -D__WIN95__ \ -DSTRICT -D__WXMSW__ -DwxUSE_GUI=1 -DwxUSE_REGEX=1 \ -DwxUSE_UNICODE=$(UNICODE) -DWIN32_LEAN_AND_MEAN \ -I$(____flamerobin_WX_LIB_DIR_FILENAMES)\msw$(U_OPT)$(D_OPT) \ -I$(WXDIR)\contrib\include -I$(WXDIR)\include -I$(BOOST_ROOT) \ -DIBPP_WINDOWS -I. -I.\src -I.\src\ibpp -I.\res $(CPPFLAGS) $(CXXFLAGS) FLAMEROBIN_OBJECTS = \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_addconstrainthandler.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Config.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DatabaseConfig.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ArtProvider.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_CodeTemplateProcessor.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_FRError.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Observer.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ProgressIndicator.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_StringUtils.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Subject.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_TemplateProcessor.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_URIProcessor.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Visitor.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_databasehandler.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataLoader.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_frprec.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_frutils.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_AboutBox.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_AdvancedMessageDialog.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_AdvancedSearchFrame.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_BackupFrame.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_BackupRestoreBaseFrame.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_BaseDialog.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_BaseFrame.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_CommandManager.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ConfdefTemplateProcessor.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ContextMenuMetadataItemVisitor.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ControlUtils.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DataGrid.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DataGridRowBuffer.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DataGridRows.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DataGridTable.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DBHTreeControl.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DndTextControls.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_LogTextControl.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_PrintableHtmlWindow.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_TextControl.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_CreateIndexDialog.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DataGeneratorFrame.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DatabaseRegistrationDialog.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_EditBlobDialog.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_EventWatcherFrame.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ExecuteSqlFrame.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ExecuteSql.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_FieldPropertiesDialog.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_FindDialog.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_FRLayoutConfig.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_GUIURIHandlerHelper.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_HtmlHeaderMetadataItemVisitor.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_HtmlTemplateProcessor.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_InsertDialog.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MainFrame.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataItemPropertiesFrame.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MultilineEnterDialog.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_PreferencesDialog.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_PreferencesDialogSettings.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_PrivilegesDialog.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ProgressDialog.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ReorderFieldsDialog.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_RestoreFrame.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ServerRegistrationDialog.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_SimpleHtmlFrame.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_StatementHistoryDialog.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_StyleGuide.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_UserDialog.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_UsernamePasswordDialog.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_logger.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_main.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MasterPassword.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_column.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_constraints.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_CreateDDLVisitor.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_database.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_domain.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_exception.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_function.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_generator.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Index.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_metadataitem.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataItemCreateStatementVisitor.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataItemDescriptionVisitor.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataItemURIHandlerHelper.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataItemVisitor.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataTemplateCmdHandler.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataTemplateManager.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_parameter.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_privilege.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_procedure.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_relation.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_role.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_root.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_server.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_table.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_trigger.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_User.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_view.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_objectdescriptionhandler.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Identifier.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_IncompleteStatement.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MultiStatement.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_SelectStatement.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_SqlStatement.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_SqlTokenizer.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_StatementBuilder.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_statementHistory.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_StyleGuideMSW.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_flamerobin_rc.o IBPP_CXXFLAGS = -mthreads $(__DEBUGINFO) $(__OPTIMIZE) -W -Wall -DIBPP_WINDOWS \ -I.\src\ibpp $(CPPFLAGS) $(CXXFLAGS) IBPP_OBJECTS = \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__dpb.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__ibpp.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__ibs.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__rb.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__spb.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__tpb.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_array.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_blob.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_database.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_date.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_dbkey.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_events.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_exception.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_row.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_service.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_statement.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_time.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_transaction.o \ gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_user.o ### Conditionally set variables: ### ifeq ($(STATICRTL),1) R_OPT = s endif ifeq ($(FINAL),0) ____flamerobin_WXDEBUG_p = -D__WXDEBUG__ endif ifeq ($(FINAL),0) ____flamerobin_WXDEBUG_p_1 = --define __WXDEBUG__ endif ifeq ($(FINAL),0) ____flamerobin_DEBUGFLAG_p = -D_DEBUG endif ifeq ($(FINAL),0) ____flamerobin_DEBUGFLAG_p_1 = --define _DEBUG endif ifeq ($(USEDLL),0) __flamerobin_WX_LIB_DIR = $(WXDIR)/lib/gcc_lib endif ifeq ($(USEDLL),1) __flamerobin_WX_LIB_DIR = $(WXDIR)/lib/gcc_dll endif ifeq ($(USEDLL),0) ____flamerobin_WX_LIB_DIR_FILENAMES = $(WXDIR)\lib\gcc_lib endif ifeq ($(USEDLL),1) ____flamerobin_WX_LIB_DIR_FILENAMES = $(WXDIR)\lib\gcc_dll endif ifeq ($(USEDLL),0) ______flamerobin_WX_LIB_DIR_FILENAMES_1_p = -L$(WXDIR)\lib\gcc_lib endif ifeq ($(USEDLL),1) ______flamerobin_WX_LIB_DIR_FILENAMES_1_p = -L$(WXDIR)\lib\gcc_dll endif ifeq ($(UNICODE),1) U_OPT = u endif ifeq ($(FINAL),0) D_OPT = d endif ifeq ($(FINAL),0) __DEBUGINFO = -g endif ifeq ($(FINAL),1) __DEBUGINFO = endif ifeq ($(FINAL),0) __OPTIMIZE = -O0 endif ifeq ($(FINAL),1) __OPTIMIZE = -Os endif all: gcc$(U_OPT)$(R_OPT)$(D_OPT) gcc$(U_OPT)$(R_OPT)$(D_OPT): -if not exist gcc$(U_OPT)$(R_OPT)$(D_OPT) mkdir gcc$(U_OPT)$(R_OPT)$(D_OPT) ### Targets: ### all: svn-rev gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin.exe gcc$(U_OPT)$(R_OPT)$(D_OPT)\libibpp.a clean: -if exist gcc$(U_OPT)$(R_OPT)$(D_OPT)\*.o del gcc$(U_OPT)$(R_OPT)$(D_OPT)\*.o -if exist gcc$(U_OPT)$(R_OPT)$(D_OPT)\*.d del gcc$(U_OPT)$(R_OPT)$(D_OPT)\*.d -if exist gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin.exe del gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin.exe -if exist gcc$(U_OPT)$(R_OPT)$(D_OPT)\libibpp.a del gcc$(U_OPT)$(R_OPT)$(D_OPT)\libibpp.a svn-rev: update-svn-rev.cmd gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin.exe: $(FLAMEROBIN_OBJECTS) gcc$(U_OPT)$(R_OPT)$(D_OPT)\libibpp.a gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_flamerobin_rc.o gcc$(U_OPT)$(R_OPT)$(D_OPT)\libibpp.a $(CXX) -o $@ $(FLAMEROBIN_OBJECTS) -mthreads $(__DEBUGINFO) $(______flamerobin_WX_LIB_DIR_FILENAMES_1_p) -Wl,--subsystem,windows -mwindows $(LDFLAGS) -lwxmsw28$(U_OPT)$(D_OPT)_aui -lwxmsw28$(U_OPT)$(D_OPT)_stc -lwxmsw28$(U_OPT)$(D_OPT)_html -lwxmsw28$(U_OPT)$(D_OPT)_adv -lwxmsw28$(U_OPT)$(D_OPT)_core -lwxbase28$(U_OPT)$(D_OPT)_xml -lwxbase28$(U_OPT)$(D_OPT) -lwxexpat$(D_OPT) -lwxtiff$(D_OPT) -lwxjpeg$(D_OPT) -lwxpng$(D_OPT) -lwxzlib$(D_OPT) -lwxregex$(U_OPT)$(D_OPT) -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lcomctl32 -lrpcrt4 -lwsock32 gcc$(U_OPT)$(R_OPT)$(D_OPT)\libibpp.a gcc$(U_OPT)$(R_OPT)$(D_OPT)\libibpp.a: $(IBPP_OBJECTS) if exist $@ del $@ ar rcu $@ $(IBPP_OBJECTS) ranlib $@ gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_addconstrainthandler.o: ./src/addconstrainthandler.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Config.o: ./src/config/Config.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DatabaseConfig.o: ./src/config/DatabaseConfig.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ArtProvider.o: ./src/core/ArtProvider.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_CodeTemplateProcessor.o: ./src/core/CodeTemplateProcessor.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_FRError.o: ./src/core/FRError.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Observer.o: ./src/core/Observer.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ProgressIndicator.o: ./src/core/ProgressIndicator.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_StringUtils.o: ./src/core/StringUtils.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Subject.o: ./src/core/Subject.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_TemplateProcessor.o: ./src/core/TemplateProcessor.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_URIProcessor.o: ./src/core/URIProcessor.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Visitor.o: ./src/core/Visitor.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_databasehandler.o: ./src/databasehandler.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataLoader.o: ./src/engine/MetadataLoader.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_frprec.o: ./src/frprec.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_frutils.o: ./src/frutils.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_AboutBox.o: ./src/gui/AboutBox.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_AdvancedMessageDialog.o: ./src/gui/AdvancedMessageDialog.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_AdvancedSearchFrame.o: ./src/gui/AdvancedSearchFrame.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_BackupFrame.o: ./src/gui/BackupFrame.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_BackupRestoreBaseFrame.o: ./src/gui/BackupRestoreBaseFrame.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_BaseDialog.o: ./src/gui/BaseDialog.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_BaseFrame.o: ./src/gui/BaseFrame.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_CommandManager.o: ./src/gui/CommandManager.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ConfdefTemplateProcessor.o: ./src/gui/ConfdefTemplateProcessor.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ContextMenuMetadataItemVisitor.o: ./src/gui/ContextMenuMetadataItemVisitor.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ControlUtils.o: ./src/gui/controls/ControlUtils.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DataGrid.o: ./src/gui/controls/DataGrid.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DataGridRowBuffer.o: ./src/gui/controls/DataGridRowBuffer.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DataGridRows.o: ./src/gui/controls/DataGridRows.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DataGridTable.o: ./src/gui/controls/DataGridTable.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DBHTreeControl.o: ./src/gui/controls/DBHTreeControl.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DndTextControls.o: ./src/gui/controls/DndTextControls.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_LogTextControl.o: ./src/gui/controls/LogTextControl.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_PrintableHtmlWindow.o: ./src/gui/controls/PrintableHtmlWindow.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_TextControl.o: ./src/gui/controls/TextControl.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_CreateIndexDialog.o: ./src/gui/CreateIndexDialog.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DataGeneratorFrame.o: ./src/gui/DataGeneratorFrame.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_DatabaseRegistrationDialog.o: ./src/gui/DatabaseRegistrationDialog.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_EditBlobDialog.o: ./src/gui/EditBlobDialog.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_EventWatcherFrame.o: ./src/gui/EventWatcherFrame.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ExecuteSqlFrame.o: ./src/gui/ExecuteSqlFrame.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ExecuteSql.o: ./src/gui/ExecuteSql.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_FieldPropertiesDialog.o: ./src/gui/FieldPropertiesDialog.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_FindDialog.o: ./src/gui/FindDialog.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_FRLayoutConfig.o: ./src/gui/FRLayoutConfig.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_GUIURIHandlerHelper.o: ./src/gui/GUIURIHandlerHelper.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_HtmlHeaderMetadataItemVisitor.o: ./src/gui/HtmlHeaderMetadataItemVisitor.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_HtmlTemplateProcessor.o: ./src/gui/HtmlTemplateProcessor.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_InsertDialog.o: ./src/gui/InsertDialog.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MainFrame.o: ./src/gui/MainFrame.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataItemPropertiesFrame.o: ./src/gui/MetadataItemPropertiesFrame.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MultilineEnterDialog.o: ./src/gui/MultilineEnterDialog.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_PreferencesDialog.o: ./src/gui/PreferencesDialog.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_PreferencesDialogSettings.o: ./src/gui/PreferencesDialogSettings.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_PrivilegesDialog.o: ./src/gui/PrivilegesDialog.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ProgressDialog.o: ./src/gui/ProgressDialog.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ReorderFieldsDialog.o: ./src/gui/ReorderFieldsDialog.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_RestoreFrame.o: ./src/gui/RestoreFrame.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_ServerRegistrationDialog.o: ./src/gui/ServerRegistrationDialog.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_SimpleHtmlFrame.o: ./src/gui/SimpleHtmlFrame.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_StatementHistoryDialog.o: ./src/gui/StatementHistoryDialog.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_StyleGuide.o: ./src/gui/StyleGuide.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_UserDialog.o: ./src/gui/UserDialog.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_UsernamePasswordDialog.o: ./src/gui/UsernamePasswordDialog.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_logger.o: ./src/logger.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_main.o: ./src/main.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MasterPassword.o: ./src/MasterPassword.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_column.o: ./src/metadata/column.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_constraints.o: ./src/metadata/constraints.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_CreateDDLVisitor.o: ./src/metadata/CreateDDLVisitor.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_database.o: ./src/metadata/database.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_domain.o: ./src/metadata/domain.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_exception.o: ./src/metadata/exception.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_function.o: ./src/metadata/function.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_generator.o: ./src/metadata/generator.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Index.o: ./src/metadata/Index.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_metadataitem.o: ./src/metadata/metadataitem.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataItemCreateStatementVisitor.o: ./src/metadata/MetadataItemCreateStatementVisitor.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataItemDescriptionVisitor.o: ./src/metadata/MetadataItemDescriptionVisitor.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataItemURIHandlerHelper.o: ./src/metadata/MetadataItemURIHandlerHelper.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataItemVisitor.o: ./src/metadata/MetadataItemVisitor.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataTemplateCmdHandler.o: ./src/metadata/MetadataTemplateCmdHandler.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MetadataTemplateManager.o: ./src/metadata/MetadataTemplateManager.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_parameter.o: ./src/metadata/parameter.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_privilege.o: ./src/metadata/privilege.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_procedure.o: ./src/metadata/procedure.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_relation.o: ./src/metadata/relation.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_role.o: ./src/metadata/role.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_root.o: ./src/metadata/root.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_server.o: ./src/metadata/server.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_table.o: ./src/metadata/table.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_trigger.o: ./src/metadata/trigger.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_User.o: ./src/metadata/User.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_view.o: ./src/metadata/view.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_objectdescriptionhandler.o: ./src/objectdescriptionhandler.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_Identifier.o: ./src/sql/Identifier.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_IncompleteStatement.o: ./src/sql/IncompleteStatement.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_MultiStatement.o: ./src/sql/MultiStatement.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_SelectStatement.o: ./src/sql/SelectStatement.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_SqlStatement.o: ./src/sql/SqlStatement.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_SqlTokenizer.o: ./src/sql/SqlTokenizer.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_StatementBuilder.o: ./src/sql/StatementBuilder.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_statementHistory.o: ./src/statementHistory.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_StyleGuideMSW.o: ./src/gui/msw/StyleGuideMSW.cpp $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\flamerobin_flamerobin_rc.o: ./res/flamerobin.rc windres --use-temp-file -i$< -o$@ $(____flamerobin_WXDEBUG_p_1) $(____flamerobin_DEBUGFLAG_p_1) --define HAVE_W32API_H --define _WINDOWS --define __WINDOWS__ --define WINVER=0x400 --define WIN32 --define __WIN32__ --define __WIN95__ --define STRICT --define __WXMSW__ --define wxUSE_GUI=1 --define wxUSE_REGEX=1 --define wxUSE_UNICODE=$(UNICODE) --define WIN32_LEAN_AND_MEAN --include-dir $(__flamerobin_WX_LIB_DIR)/msw$(U_OPT)$(D_OPT) --include-dir $(WXDIR)/contrib/include --include-dir $(WXDIR)/include --include-dir $(BOOST_ROOT) --define IBPP_WINDOWS --include-dir . --include-dir ./src --include-dir ./src/ibpp --include-dir ./res gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__dpb.o: ./src/ibpp/_dpb.cpp $(CXX) -c -o $@ $(IBPP_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__ibpp.o: ./src/ibpp/_ibpp.cpp $(CXX) -c -o $@ $(IBPP_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__ibs.o: ./src/ibpp/_ibs.cpp $(CXX) -c -o $@ $(IBPP_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__rb.o: ./src/ibpp/_rb.cpp $(CXX) -c -o $@ $(IBPP_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__spb.o: ./src/ibpp/_spb.cpp $(CXX) -c -o $@ $(IBPP_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp__tpb.o: ./src/ibpp/_tpb.cpp $(CXX) -c -o $@ $(IBPP_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_array.o: ./src/ibpp/array.cpp $(CXX) -c -o $@ $(IBPP_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_blob.o: ./src/ibpp/blob.cpp $(CXX) -c -o $@ $(IBPP_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_database.o: ./src/ibpp/database.cpp $(CXX) -c -o $@ $(IBPP_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_date.o: ./src/ibpp/date.cpp $(CXX) -c -o $@ $(IBPP_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_dbkey.o: ./src/ibpp/dbkey.cpp $(CXX) -c -o $@ $(IBPP_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_events.o: ./src/ibpp/events.cpp $(CXX) -c -o $@ $(IBPP_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_exception.o: ./src/ibpp/exception.cpp $(CXX) -c -o $@ $(IBPP_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_row.o: ./src/ibpp/row.cpp $(CXX) -c -o $@ $(IBPP_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_service.o: ./src/ibpp/service.cpp $(CXX) -c -o $@ $(IBPP_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_statement.o: ./src/ibpp/statement.cpp $(CXX) -c -o $@ $(IBPP_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_time.o: ./src/ibpp/time.cpp $(CXX) -c -o $@ $(IBPP_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_transaction.o: ./src/ibpp/transaction.cpp $(CXX) -c -o $@ $(IBPP_CXXFLAGS) $(CPPDEPS) $< gcc$(U_OPT)$(R_OPT)$(D_OPT)\ibpp_user.o: ./src/ibpp/user.cpp $(CXX) -c -o $@ $(IBPP_CXXFLAGS) $(CPPDEPS) $< .PHONY: all clean SHELL := $(COMSPEC) # Dependencies tracking: -include gcc$(U_OPT)$(R_OPT)$(D_OPT)/*.d flamerobin_0.9.3~svn+2220.orig/makefile.vc000066400000000000000000001176061177057155300203250ustar00rootroot00000000000000# ========================================================================= # This makefile was generated by # Bakefile 0.2.9 (http://www.bakefile.org) # Do not modify, all changes will be overwritten! # ========================================================================= # ------------------------------------------------------------------------- # These are configurable options: # ------------------------------------------------------------------------- # C++ compiler CXX = cl # Standard flags for C++ CXXFLAGS = # Standard preprocessor flags (common for CC and CXX) CPPFLAGS = # Standard linker flags LDFLAGS = # [0,1] # 1 - DLL USEDLL = 0 # [0,1] # 1 - Unicode UNICODE = 0 # [0,1] # 0 - Debug # 1 - Release FINAL = 0 # [0,1] # 0 - Dynamic # 1 - Static STATICRTL = 0 # The target processor architecture must be specified when it is not X86. # This does not affect the compiler output, so you still need to make sure # your environment is set up appropriately with the correct compiler in the # PATH. Rather it affects some options passed to some of the common build # utilities such as the resource compiler and the linker. # # Accepted values: AMD64, IA64. TARGET_CPU = $(CPU) # ------------------------------------------------------------------------- # Do not modify the rest of this file! # ------------------------------------------------------------------------- ### Variables: ### FLAMEROBIN_CXXFLAGS = /M$(__RTL_TYPE)$(__DEBUGINFO_0) /DWIN32 $(__DEBUGINFO) \ $(____DEBUGINFO) \ /Fdvc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin.pdb \ $(__OPTIMIZE) /W4 $(____flamerobin_WXDEBUG_p) $(____flamerobin_DEBUGFLAG_p) \ /D_WINDOWS /D__WINDOWS__ /DWINVER=0x400 /DWIN32 /D__WIN32__ /D__WIN95__ \ /DSTRICT /D__WXMSW__ /DwxUSE_GUI=1 /DwxUSE_REGEX=1 \ /DwxUSE_UNICODE=$(UNICODE) /DWIN32_LEAN_AND_MEAN \ /I$(____flamerobin_WX_LIB_DIR_FILENAMES)\msw$(U_OPT)$(D_OPT) \ /I$(WXDIR)\contrib\include /I$(WXDIR)\include /I$(BOOST_ROOT) /D_WINDOWS \ /DIBPP_WINDOWS /I. /I.\src /I.\src\ibpp /I.\res /GR /EHsc /Yu"wx/wxprec.h" \ /Fp"vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin.pch" \ $(CPPFLAGS) $(CXXFLAGS) FLAMEROBIN_OBJECTS = \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_addconstrainthandler.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_Config.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_DatabaseConfig.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ArtProvider.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_CodeTemplateProcessor.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_FRError.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_Observer.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ProgressIndicator.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_StringUtils.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_Subject.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_TemplateProcessor.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_URIProcessor.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_Visitor.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_databasehandler.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MetadataLoader.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_frprec.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_frutils.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_AboutBox.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_AdvancedMessageDialog.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_AdvancedSearchFrame.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_BackupFrame.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_BackupRestoreBaseFrame.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_BaseDialog.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_BaseFrame.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_CommandManager.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ConfdefTemplateProcessor.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ContextMenuMetadataItemVisitor.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ControlUtils.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_DataGrid.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_DataGridRowBuffer.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_DataGridRows.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_DataGridTable.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_DBHTreeControl.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_DndTextControls.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_LogTextControl.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_PrintableHtmlWindow.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_TextControl.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_CreateIndexDialog.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_DataGeneratorFrame.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_DatabaseRegistrationDialog.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_EditBlobDialog.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_EventWatcherFrame.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ExecuteSqlFrame.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ExecuteSql.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_FieldPropertiesDialog.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_FindDialog.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_FRLayoutConfig.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_GUIURIHandlerHelper.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_HtmlHeaderMetadataItemVisitor.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_HtmlTemplateProcessor.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_InsertDialog.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MainFrame.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MetadataItemPropertiesFrame.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MultilineEnterDialog.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_PreferencesDialog.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_PreferencesDialogSettings.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_PrivilegesDialog.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ProgressDialog.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ReorderFieldsDialog.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_RestoreFrame.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ServerRegistrationDialog.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_SimpleHtmlFrame.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_StatementHistoryDialog.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_StyleGuide.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_UserDialog.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_UsernamePasswordDialog.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_logger.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_main.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MasterPassword.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_column.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_constraints.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_CreateDDLVisitor.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_database.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_domain.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_exception.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_function.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_generator.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_Index.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_metadataitem.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MetadataItemCreateStatementVisitor.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MetadataItemDescriptionVisitor.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MetadataItemURIHandlerHelper.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MetadataItemVisitor.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MetadataTemplateCmdHandler.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MetadataTemplateManager.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_parameter.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_privilege.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_procedure.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_relation.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_role.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_root.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_server.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_table.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_trigger.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_User.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_view.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_objectdescriptionhandler.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_Identifier.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_IncompleteStatement.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MultiStatement.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_SelectStatement.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_SqlStatement.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_SqlTokenizer.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_StatementBuilder.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_statementHistory.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_StyleGuideMSW.obj FLAMEROBIN_RESOURCES = \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_flamerobin.res IBPP_CXXFLAGS = /M$(__RTL_TYPE)$(__DEBUGINFO_0) /DWIN32 $(__DEBUGINFO) \ $(____DEBUGINFO) /Fdvc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp.pdb \ $(__OPTIMIZE) /W4 /DIBPP_WINDOWS /I.\src\ibpp /GR /EHsc /Yu"_ibpp.h" \ /Fp"vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp.pch" $(CPPFLAGS) \ $(CXXFLAGS) IBPP_OBJECTS = \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp__dpb.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp__ibpp.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp__ibs.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp__rb.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp__spb.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp__tpb.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_array.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_blob.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_database.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_date.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_dbkey.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_events.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_exception.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_row.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_service.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_statement.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_time.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_transaction.obj \ vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_user.obj ### Conditionally set variables: ### !if "$(STATICRTL)" == "1" R_OPT = s !endif !if "$(TARGET_CPU)" == "AMD64" LINK_TARGET_CPU = /MACHINE:AMD64 !endif !if "$(TARGET_CPU)" == "IA64" LINK_TARGET_CPU = /MACHINE:IA64 !endif !if "$(TARGET_CPU)" == "amd64" LINK_TARGET_CPU = /MACHINE:AMD64 !endif !if "$(TARGET_CPU)" == "ia64" LINK_TARGET_CPU = /MACHINE:IA64 !endif !if "$(FINAL)" == "0" __DEBUGINFO_5 = /DEBUG !endif !if "$(FINAL)" == "1" __DEBUGINFO_5 = !endif !if "$(FINAL)" == "0" ____DEBUGINFO_6_p_1 = /d _DEBUG !endif !if "$(FINAL)" == "1" ____DEBUGINFO_6_p_1 = !endif !if "$(FINAL)" == "0" __DEBUGINFO_8 = !endif !if "$(FINAL)" == "1" __DEBUGINFO_8 = /opt:ref /opt:icf !endif !if "$(FINAL)" == "0" __DEBUGINFO_9 = $(__DEBUGINFO_8) !endif !if "$(FINAL)" == "1" __DEBUGINFO_9 = !endif !if "$(FINAL)" == "0" ____flamerobin_WXDEBUG_p = /D__WXDEBUG__ !endif !if "$(FINAL)" == "0" ____flamerobin_WXDEBUG_p_1 = /d __WXDEBUG__ !endif !if "$(FINAL)" == "0" ____flamerobin_DEBUGFLAG_p = /D_DEBUG !endif !if "$(FINAL)" == "0" ____flamerobin_DEBUGFLAG_p_1 = /d _DEBUG !endif !if "$(USEDLL)" == "0" ____flamerobin_WX_LIB_DIR_FILENAMES = $(WXDIR)\lib\vc$(DIR_SUFFIX_CPU)_lib !endif !if "$(USEDLL)" == "1" ____flamerobin_WX_LIB_DIR_FILENAMES = $(WXDIR)\lib\vc$(DIR_SUFFIX_CPU)_dll !endif !if "$(USEDLL)" == "0" ____flamerobin_WX_LIB_DIR_FILENAMES_1 = $(WXDIR)\lib\vc$(DIR_SUFFIX_CPU)_lib !endif !if "$(USEDLL)" == "1" ____flamerobin_WX_LIB_DIR_FILENAMES_1 = $(WXDIR)\lib\vc$(DIR_SUFFIX_CPU)_dll !endif !if "$(USEDLL)" == "0" ______flamerobin_WX_LIB_DIR_FILENAMES_2_p = \ /LIBPATH:$(WXDIR)\lib\vc$(DIR_SUFFIX_CPU)_lib !endif !if "$(USEDLL)" == "1" ______flamerobin_WX_LIB_DIR_FILENAMES_2_p = \ /LIBPATH:$(WXDIR)\lib\vc$(DIR_SUFFIX_CPU)_dll !endif !if "$(STATICRTL)" == "0" __RTL_TYPE = D !endif !if "$(STATICRTL)" == "1" __RTL_TYPE = T !endif !if "$(FINAL)" == "0" __DEBUGINFO = /Zi !endif !if "$(FINAL)" == "1" __DEBUGINFO = !endif !if "$(FINAL)" == "0" ____DEBUGINFO = /D_DEBUG !endif !if "$(FINAL)" == "1" ____DEBUGINFO = !endif !if "$(FINAL)" == "0" __DEBUGINFO_0 = d !endif !if "$(FINAL)" == "1" __DEBUGINFO_0 = !endif !if "$(FINAL)" == "0" __OPTIMIZE = /Od !endif !if "$(FINAL)" == "1" __OPTIMIZE = /O1 !endif !if "$(UNICODE)" == "1" U_OPT = u !endif !if "$(FINAL)" == "0" D_OPT = d !endif !if "$(TARGET_CPU)" == "AMD64" DIR_SUFFIX_CPU = _amd64 !endif !if "$(TARGET_CPU)" == "IA64" DIR_SUFFIX_CPU = _ia64 !endif !if "$(TARGET_CPU)" == "amd64" DIR_SUFFIX_CPU = _amd64 !endif !if "$(TARGET_CPU)" == "ia64" DIR_SUFFIX_CPU = _ia64 !endif all: vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU) vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU): -if not exist vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU) mkdir vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU) ### Targets: ### all: svn-rev vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin.exe vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp.lib clean: -if exist vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\*.obj del vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\*.obj -if exist vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\*.res del vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\*.res -if exist vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\*.pch del vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\*.pch -if exist vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin.exe del vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin.exe -if exist vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin.ilk del vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin.ilk -if exist vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin.pdb del vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin.pdb -if exist vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp.lib del vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp.lib svn-rev: update-svn-rev.cmd vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin.exe: vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_frprec.obj $(FLAMEROBIN_OBJECTS) vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp.lib vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_flamerobin.res vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp.lib link /NOLOGO /OUT:$@ $(__DEBUGINFO_5) /pdb:"vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin.pdb" $(__DEBUGINFO_9) /nologo /subsystem:windows $(LINK_TARGET_CPU) $(______flamerobin_WX_LIB_DIR_FILENAMES_2_p) /SUBSYSTEM:WINDOWS $(LDFLAGS) @<< $(FLAMEROBIN_OBJECTS) $(FLAMEROBIN_RESOURCES) wxmsw28$(U_OPT)$(D_OPT)_aui.lib wxmsw28$(U_OPT)$(D_OPT)_stc.lib wxmsw28$(U_OPT)$(D_OPT)_html.lib wxmsw28$(U_OPT)$(D_OPT)_adv.lib wxmsw28$(U_OPT)$(D_OPT)_core.lib wxbase28$(U_OPT)$(D_OPT)_xml.lib wxbase28$(U_OPT)$(D_OPT).lib wxexpat$(D_OPT).lib wxtiff$(D_OPT).lib wxjpeg$(D_OPT).lib wxpng$(D_OPT).lib wxzlib$(D_OPT).lib wxregex$(U_OPT)$(D_OPT).lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comctl32.lib rpcrt4.lib wsock32.lib vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp.lib << vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp.lib: vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp__ibpp.obj $(IBPP_OBJECTS) if exist $@ del $@ link /LIB /NOLOGO /OUT:$@ @<< $(IBPP_OBJECTS) << vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_addconstrainthandler.obj: .\src\addconstrainthandler.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\addconstrainthandler.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_Config.obj: .\src\config\Config.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\config\Config.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_DatabaseConfig.obj: .\src\config\DatabaseConfig.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\config\DatabaseConfig.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ArtProvider.obj: .\src\core\ArtProvider.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\core\ArtProvider.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_CodeTemplateProcessor.obj: .\src\core\CodeTemplateProcessor.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\core\CodeTemplateProcessor.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_FRError.obj: .\src\core\FRError.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\core\FRError.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_Observer.obj: .\src\core\Observer.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\core\Observer.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ProgressIndicator.obj: .\src\core\ProgressIndicator.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\core\ProgressIndicator.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_StringUtils.obj: .\src\core\StringUtils.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\core\StringUtils.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_Subject.obj: .\src\core\Subject.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\core\Subject.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_TemplateProcessor.obj: .\src\core\TemplateProcessor.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\core\TemplateProcessor.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_URIProcessor.obj: .\src\core\URIProcessor.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\core\URIProcessor.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_Visitor.obj: .\src\core\Visitor.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\core\Visitor.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_databasehandler.obj: .\src\databasehandler.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\databasehandler.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MetadataLoader.obj: .\src\engine\MetadataLoader.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\engine\MetadataLoader.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_frprec.obj: .\src\frprec.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) /Ycwx/wxprec.h .\src\frprec.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_frutils.obj: .\src\frutils.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\frutils.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_AboutBox.obj: .\src\gui\AboutBox.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\AboutBox.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_AdvancedMessageDialog.obj: .\src\gui\AdvancedMessageDialog.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\AdvancedMessageDialog.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_AdvancedSearchFrame.obj: .\src\gui\AdvancedSearchFrame.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\AdvancedSearchFrame.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_BackupFrame.obj: .\src\gui\BackupFrame.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\BackupFrame.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_BackupRestoreBaseFrame.obj: .\src\gui\BackupRestoreBaseFrame.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\BackupRestoreBaseFrame.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_BaseDialog.obj: .\src\gui\BaseDialog.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\BaseDialog.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_BaseFrame.obj: .\src\gui\BaseFrame.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\BaseFrame.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_CommandManager.obj: .\src\gui\CommandManager.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\CommandManager.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ConfdefTemplateProcessor.obj: .\src\gui\ConfdefTemplateProcessor.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\ConfdefTemplateProcessor.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ContextMenuMetadataItemVisitor.obj: .\src\gui\ContextMenuMetadataItemVisitor.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\ContextMenuMetadataItemVisitor.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ControlUtils.obj: .\src\gui\controls\ControlUtils.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\controls\ControlUtils.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_DataGrid.obj: .\src\gui\controls\DataGrid.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\controls\DataGrid.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_DataGridRowBuffer.obj: .\src\gui\controls\DataGridRowBuffer.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\controls\DataGridRowBuffer.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_DataGridRows.obj: .\src\gui\controls\DataGridRows.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\controls\DataGridRows.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_DataGridTable.obj: .\src\gui\controls\DataGridTable.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\controls\DataGridTable.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_DBHTreeControl.obj: .\src\gui\controls\DBHTreeControl.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\controls\DBHTreeControl.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_DndTextControls.obj: .\src\gui\controls\DndTextControls.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\controls\DndTextControls.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_LogTextControl.obj: .\src\gui\controls\LogTextControl.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\controls\LogTextControl.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_PrintableHtmlWindow.obj: .\src\gui\controls\PrintableHtmlWindow.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\controls\PrintableHtmlWindow.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_TextControl.obj: .\src\gui\controls\TextControl.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\controls\TextControl.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_CreateIndexDialog.obj: .\src\gui\CreateIndexDialog.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\CreateIndexDialog.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_DataGeneratorFrame.obj: .\src\gui\DataGeneratorFrame.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\DataGeneratorFrame.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_DatabaseRegistrationDialog.obj: .\src\gui\DatabaseRegistrationDialog.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\DatabaseRegistrationDialog.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_EditBlobDialog.obj: .\src\gui\EditBlobDialog.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\EditBlobDialog.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_EventWatcherFrame.obj: .\src\gui\EventWatcherFrame.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\EventWatcherFrame.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ExecuteSqlFrame.obj: .\src\gui\ExecuteSqlFrame.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\ExecuteSqlFrame.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ExecuteSql.obj: .\src\gui\ExecuteSql.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\ExecuteSql.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_FieldPropertiesDialog.obj: .\src\gui\FieldPropertiesDialog.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\FieldPropertiesDialog.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_FindDialog.obj: .\src\gui\FindDialog.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\FindDialog.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_FRLayoutConfig.obj: .\src\gui\FRLayoutConfig.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\FRLayoutConfig.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_GUIURIHandlerHelper.obj: .\src\gui\GUIURIHandlerHelper.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\GUIURIHandlerHelper.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_HtmlHeaderMetadataItemVisitor.obj: .\src\gui\HtmlHeaderMetadataItemVisitor.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\HtmlHeaderMetadataItemVisitor.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_HtmlTemplateProcessor.obj: .\src\gui\HtmlTemplateProcessor.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\HtmlTemplateProcessor.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_InsertDialog.obj: .\src\gui\InsertDialog.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\InsertDialog.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MainFrame.obj: .\src\gui\MainFrame.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\MainFrame.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MetadataItemPropertiesFrame.obj: .\src\gui\MetadataItemPropertiesFrame.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\MetadataItemPropertiesFrame.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MultilineEnterDialog.obj: .\src\gui\MultilineEnterDialog.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\MultilineEnterDialog.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_PreferencesDialog.obj: .\src\gui\PreferencesDialog.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\PreferencesDialog.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_PreferencesDialogSettings.obj: .\src\gui\PreferencesDialogSettings.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\PreferencesDialogSettings.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_PrivilegesDialog.obj: .\src\gui\PrivilegesDialog.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\PrivilegesDialog.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ProgressDialog.obj: .\src\gui\ProgressDialog.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\ProgressDialog.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ReorderFieldsDialog.obj: .\src\gui\ReorderFieldsDialog.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\ReorderFieldsDialog.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_RestoreFrame.obj: .\src\gui\RestoreFrame.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\RestoreFrame.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ServerRegistrationDialog.obj: .\src\gui\ServerRegistrationDialog.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\ServerRegistrationDialog.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_SimpleHtmlFrame.obj: .\src\gui\SimpleHtmlFrame.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\SimpleHtmlFrame.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_StatementHistoryDialog.obj: .\src\gui\StatementHistoryDialog.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\StatementHistoryDialog.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_StyleGuide.obj: .\src\gui\StyleGuide.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\StyleGuide.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_UserDialog.obj: .\src\gui\UserDialog.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\UserDialog.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_UsernamePasswordDialog.obj: .\src\gui\UsernamePasswordDialog.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\UsernamePasswordDialog.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_logger.obj: .\src\logger.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\logger.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_main.obj: .\src\main.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\main.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MasterPassword.obj: .\src\MasterPassword.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\MasterPassword.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_column.obj: .\src\metadata\column.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\column.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_constraints.obj: .\src\metadata\constraints.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\constraints.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_CreateDDLVisitor.obj: .\src\metadata\CreateDDLVisitor.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\CreateDDLVisitor.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_database.obj: .\src\metadata\database.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\database.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_domain.obj: .\src\metadata\domain.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\domain.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_exception.obj: .\src\metadata\exception.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\exception.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_function.obj: .\src\metadata\function.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\function.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_generator.obj: .\src\metadata\generator.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\generator.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_Index.obj: .\src\metadata\Index.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\Index.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_metadataitem.obj: .\src\metadata\metadataitem.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\metadataitem.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MetadataItemCreateStatementVisitor.obj: .\src\metadata\MetadataItemCreateStatementVisitor.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\MetadataItemCreateStatementVisitor.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MetadataItemDescriptionVisitor.obj: .\src\metadata\MetadataItemDescriptionVisitor.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\MetadataItemDescriptionVisitor.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MetadataItemURIHandlerHelper.obj: .\src\metadata\MetadataItemURIHandlerHelper.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\MetadataItemURIHandlerHelper.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MetadataItemVisitor.obj: .\src\metadata\MetadataItemVisitor.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\MetadataItemVisitor.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MetadataTemplateCmdHandler.obj: .\src\metadata\MetadataTemplateCmdHandler.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\MetadataTemplateCmdHandler.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MetadataTemplateManager.obj: .\src\metadata\MetadataTemplateManager.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\MetadataTemplateManager.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_parameter.obj: .\src\metadata\parameter.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\parameter.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_privilege.obj: .\src\metadata\privilege.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\privilege.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_procedure.obj: .\src\metadata\procedure.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\procedure.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_relation.obj: .\src\metadata\relation.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\relation.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_role.obj: .\src\metadata\role.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\role.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_root.obj: .\src\metadata\root.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\root.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_server.obj: .\src\metadata\server.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\server.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_table.obj: .\src\metadata\table.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\table.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_trigger.obj: .\src\metadata\trigger.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\trigger.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_User.obj: .\src\metadata\User.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\User.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_view.obj: .\src\metadata\view.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\metadata\view.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_objectdescriptionhandler.obj: .\src\objectdescriptionhandler.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\objectdescriptionhandler.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_Identifier.obj: .\src\sql\Identifier.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\sql\Identifier.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_IncompleteStatement.obj: .\src\sql\IncompleteStatement.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\sql\IncompleteStatement.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_MultiStatement.obj: .\src\sql\MultiStatement.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\sql\MultiStatement.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_SelectStatement.obj: .\src\sql\SelectStatement.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\sql\SelectStatement.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_SqlStatement.obj: .\src\sql\SqlStatement.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\sql\SqlStatement.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_SqlTokenizer.obj: .\src\sql\SqlTokenizer.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\sql\SqlTokenizer.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_StatementBuilder.obj: .\src\sql\StatementBuilder.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\sql\StatementBuilder.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_statementHistory.obj: .\src\statementHistory.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\statementHistory.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_StyleGuideMSW.obj: .\src\gui\msw\StyleGuideMSW.cpp $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\msw\StyleGuideMSW.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_flamerobin.res: .\res\flamerobin.rc rc /fo$@ /d WIN32 $(____DEBUGINFO_6_p_1) $(____flamerobin_WXDEBUG_p_1) $(____flamerobin_DEBUGFLAG_p_1) /d _WINDOWS /d __WINDOWS__ /d WINVER=0x400 /d WIN32 /d __WIN32__ /d __WIN95__ /d STRICT /d __WXMSW__ /d wxUSE_GUI=1 /d wxUSE_REGEX=1 /d wxUSE_UNICODE=$(UNICODE) /d WIN32_LEAN_AND_MEAN /i $(____flamerobin_WX_LIB_DIR_FILENAMES_1)\msw$(U_OPT)$(D_OPT) /i $(WXDIR)\contrib\include /i $(WXDIR)\include /i $(BOOST_ROOT) /d _WINDOWS /d IBPP_WINDOWS /i . /i .\src /i .\src\ibpp /i .\res .\res\flamerobin.rc vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp__dpb.obj: .\src\ibpp\_dpb.cpp $(CXX) /c /nologo /TP /Fo$@ $(IBPP_CXXFLAGS) .\src\ibpp\_dpb.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp__ibpp.obj: .\src\ibpp\_ibpp.cpp $(CXX) /c /nologo /TP /Fo$@ $(IBPP_CXXFLAGS) /Yc_ibpp.h .\src\ibpp\_ibpp.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp__ibs.obj: .\src\ibpp\_ibs.cpp $(CXX) /c /nologo /TP /Fo$@ $(IBPP_CXXFLAGS) .\src\ibpp\_ibs.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp__rb.obj: .\src\ibpp\_rb.cpp $(CXX) /c /nologo /TP /Fo$@ $(IBPP_CXXFLAGS) .\src\ibpp\_rb.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp__spb.obj: .\src\ibpp\_spb.cpp $(CXX) /c /nologo /TP /Fo$@ $(IBPP_CXXFLAGS) .\src\ibpp\_spb.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp__tpb.obj: .\src\ibpp\_tpb.cpp $(CXX) /c /nologo /TP /Fo$@ $(IBPP_CXXFLAGS) .\src\ibpp\_tpb.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_array.obj: .\src\ibpp\array.cpp $(CXX) /c /nologo /TP /Fo$@ $(IBPP_CXXFLAGS) .\src\ibpp\array.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_blob.obj: .\src\ibpp\blob.cpp $(CXX) /c /nologo /TP /Fo$@ $(IBPP_CXXFLAGS) .\src\ibpp\blob.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_database.obj: .\src\ibpp\database.cpp $(CXX) /c /nologo /TP /Fo$@ $(IBPP_CXXFLAGS) .\src\ibpp\database.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_date.obj: .\src\ibpp\date.cpp $(CXX) /c /nologo /TP /Fo$@ $(IBPP_CXXFLAGS) .\src\ibpp\date.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_dbkey.obj: .\src\ibpp\dbkey.cpp $(CXX) /c /nologo /TP /Fo$@ $(IBPP_CXXFLAGS) .\src\ibpp\dbkey.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_events.obj: .\src\ibpp\events.cpp $(CXX) /c /nologo /TP /Fo$@ $(IBPP_CXXFLAGS) .\src\ibpp\events.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_exception.obj: .\src\ibpp\exception.cpp $(CXX) /c /nologo /TP /Fo$@ $(IBPP_CXXFLAGS) .\src\ibpp\exception.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_row.obj: .\src\ibpp\row.cpp $(CXX) /c /nologo /TP /Fo$@ $(IBPP_CXXFLAGS) .\src\ibpp\row.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_service.obj: .\src\ibpp\service.cpp $(CXX) /c /nologo /TP /Fo$@ $(IBPP_CXXFLAGS) .\src\ibpp\service.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_statement.obj: .\src\ibpp\statement.cpp $(CXX) /c /nologo /TP /Fo$@ $(IBPP_CXXFLAGS) .\src\ibpp\statement.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_time.obj: .\src\ibpp\time.cpp $(CXX) /c /nologo /TP /Fo$@ $(IBPP_CXXFLAGS) .\src\ibpp\time.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_transaction.obj: .\src\ibpp\transaction.cpp $(CXX) /c /nologo /TP /Fo$@ $(IBPP_CXXFLAGS) .\src\ibpp\transaction.cpp vc$(U_OPT)$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\ibpp_user.obj: .\src\ibpp\user.cpp $(CXX) /c /nologo /TP /Fo$@ $(IBPP_CXXFLAGS) .\src\ibpp\user.cpp flamerobin_0.9.3~svn+2220.orig/res/000077500000000000000000000000001177057155300167745ustar00rootroot00000000000000flamerobin_0.9.3~svn+2220.orig/res/COPYING000066400000000000000000000015661177057155300200370ustar00rootroot00000000000000Some of the images in this directory are taken from Ximian project, and others from KDE's Crystal Project (everaldo.com) which released them under LGPL licence. See file LGPL for licence itself. Images covered with LGPL are: backup.xpm column.xpm column32.xpm database.xpm database32.xpm (same file as backup.xpm) domain.xpm domain32.xpm down.xpm function.xpm function32.xpm generator.xpm generator32.xpm generators.xpm history.xpm left.xpm object.xpm procedure.xpm procedure32.xpm procedures.xpm right.xpm root.xpm save.xpm saveas.xpm search.xpm server.xpm server32.xpm table.xpm table32.xpm tables.xpm trigger.xpm trigger32.xpm up.xpm view.xpm view32.xpm Crystal Project's: history24.xpm toggle16.xpm toggle24.xpm toggle32.xpm role16.png exception16.png <- slightly modified to remove "shining" All other images, are licenced under Expat license as the rest of FlameRobin project. flamerobin_0.9.3~svn+2220.orig/res/LGPL000066400000000000000000000612461177057155300174660ustar00rootroot00000000000000 GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! flamerobin_0.9.3~svn+2220.orig/res/backup32.xpm000066400000000000000000000121761177057155300211430ustar00rootroot00000000000000/* XPM */ static const char * backup32_xpm[] = { "32 32 188 2", " c None", ". c #141414", "+ c #3B3B3B", "@ c #404040", "# c #545454", "$ c #555555", "% c #F6F6F6", "& c #FFFFFF", "* c #FAFAFA", "= c #D6D6D6", "- c #878787", "; c #242424", "> c #FEFEFE", ", c #E6E6E6", "' c #F0F0F0", ") c #A0A0A0", "! c #000000", "~ c #F8F8F8", "{ c #D8D8D8", "] c #F5F5F5", "^ c #979797", "/ c #252525", "( c #FDFDFD", "_ c #F7F7F7", ": c #C9C9C9", "< c #E0E0E0", "[ c #888888", "} c #212121", "| c #F2F2F2", "1 c #BEBEBE", "2 c #767676", "3 c #5F5F5F", "4 c #0A0A0A", "5 c #010101", "6 c #090909", "7 c #6E6E6E", "8 c #B4B4B4", "9 c #E7E7E7", "0 c #BFBFBF", "a c #E1E1E1", "b c #C8C8C8", "c c #C2C2C2", "d c #8E8E8E", "e c #B1B1B1", "f c #2B2B2B", "g c #4E4E4E", "h c #757575", "i c #8C8C8C", "j c #959595", "k c #929292", "l c #8F8F8F", "m c #8A8A8A", "n c #7F7F7F", "o c #626262", "p c #434343", "q c #272727", "r c #9B9B9B", "s c #A7A7A7", "t c #666666", "u c #5D5D5D", "v c #565656", "w c #5A5A5A", "x c #848484", "y c #858585", "z c #787878", "A c #9D9D9D", "B c #999999", "C c #949494", "D c #909090", "E c #8D8D8D", "F c #898989", "G c #818181", "H c #7D7D7D", "I c #5C5C5C", "J c #686868", "K c #D2D2D2", "L c #C7C7C6", "M c #A6A6A6", "N c #9A9A9A", "O c #6C6C6C", "P c #BBBBBB", "Q c #A4A4A4", "R c #9F9F9F", "S c #8B8B8B", "T c #838383", "U c #808080", "V c #7C7C7C", "W c #676767", "X c #AFAFAF", "Y c #AEAEAE", "Z c #585858", "` c #717171", " . c #A2A2A2", ".. c #7E7E7E", "+. c #7A7A7A", "@. c #777777", "#. c #737373", "$. c #F9F9F9", "%. c #040404", "&. c #A3A3A3", "*. c #707070", "=. c #6A6A6A", "-. c #030303", ";. c #C4C4C4", ">. c #F8F8F7", ",. c #020202", "'. c #FEFEFD", "). c #F5F5F4", "!. c #050505", "~. c #6F6F6F", "{. c #C3C3C3", "]. c #F4F4F3", "^. c #1A1A1A", "/. c #9E9E9E", "(. c #464646", "_. c #FCFCFC", ":. c #F2F2F1", "<. c #060606", "[. c #727272", "}. c #989898", "|. c #7B7B7B", "1. c #484848", "2. c #C3C3C2", "3. c #F1F1F0", "4. c #ABABAB", "5. c #BABABA", "6. c #353535", "7. c #222222", "8. c #EFEFEF", "9. c #0D0D0D", "0. c #797979", "a. c #5B5B5B", "b. c #696969", "c. c #525252", "d. c #454545", "e. c #FBFBFB", "f. c #EEEEED", "g. c #4F4F4F", "h. c #C2C2C1", "i. c #EDEDEB", "j. c #131313", "k. c #F7F7F6", "l. c #EBEBEA", "m. c #202020", "n. c #111111", "o. c #575756", "p. c #C1C1C0", "q. c #F6F6F5", "r. c #EAEAE8", "s. c #CDCDCB", "t. c #2E2E2D", "u. c #474747", "v. c #1C1C1C", "w. c #B7B7B5", "x. c #C0C0C0", "y. c #E6E6E4", "z. c #AAAAA8", "A. c #474746", "B. c #161616", "C. c #2F2F2F", "D. c #282828", "E. c #E3E3E1", "F. c #C0C0BF", "G. c #E4E4E2", "H. c #C1C1BF", "I. c #666665", "J. c #595959", "K. c #6B6B6B", "L. c #535353", "M. c #4A4A49", "N. c #ABABAA", "O. c #E1E1DF", "P. c #F3F3F3", "Q. c #DADAD9", "R. c #B3B3B1", "S. c #787877", "T. c #151515", "U. c #0F0F0F", "V. c #6A6A69", "W. c #A9A9A8", "X. c #D0D0CE", "Y. c #F3F3F2", "Z. c #E9E9E9", "`. c #B6B6B5", " + c #323232", ".+ c #C5C5C4", "++ c #C1C1C1", "@+ c #979796", ". + @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # $ ", "+ % & & & & & & & & & & & & & & & & & * = - ; ", "@ & & & & & & & & & & & > > > > > > > * , ' ) ! ", "@ & & & & & & & & & > > > > > > > > > ~ { & ] ^ / ", "@ & & & & & & & > > > > > > > > > ( ( _ : ( ( < [ } ", "@ & & & & & & | 1 2 3 4 5 5 6 $ 7 8 9 % 0 a = b c d ", "@ & & & & ( e f g h i j k l m n o p q r s t u v w x ! ", "@ & & & ( y ! z ) A B C D E F y G H I ! J K L M N O ! ", "@ & * * P ! C Q R r ^ k l S - T U V z W ! X * * * Y ! ", "@ & * * Z ` s .A B C D E F y G ..+.@.#.g 3 * * * c ! ", "@ > $.$.%.&.Q R r ^ k l S - T U V z h *.=.-.$.$.$.;.! ", "@ > >.>.,.M .A B C D E F y G ..+.@.#.7 O 5 >.>.>.;.! ", "@ '.% % ,.Q R r ^ k l S - T U V z h *.O h ! % % % ;.! ", "@ ( ).).!.R .B C D E F y G ..+.@.#.7 ~.W ! ).).).{.! ", "@ ( ].].^.V /.&.k l S - T U V z h *.@.O (.! ].].].{.! ", "@ _.:.:.<.[.U C e }.[ y G ..|.V G - t 1.} ! :.:.:.2.! ", "@ _.3.3.<.k *.7 U 4.c 0 P 5.5.Y J $ 6.7.$ ! 3.3.3.2.! ", "@ _.8.8.9.H C 0.a.a.b.[.h #.O o ! ! c.3 d.! 8.8.8.c ! ", "@ e.f.f.! #.U D /.V # @ ! ! ! g.J z o 1.} ! f.f.f.h.! ", "@ * i.i.! D *.7 U 4.c 0 P 5.5.Y J $ 6.7.# j.i.i.i.h.! ", "@ k.l.l.z m.C 0.a.a.b.[.h #.O o ! ! c.3 n.o.l.l.l.p.! ", "@ q.r.r.s.t.u.D /.V # @ ! ! ! g.J z o q v.w.r.r.r.x.! ", "@ ].y.y.y.z.A.B...4.c 0 P 5.5.Y J # C.D.j E.y.y.y.F.! ", "@ ].G.G.G.G.H.I.! . J.` h #.K.L.! !.M.N.O.G.G.G.G.F.! ", "@ P.E.E.E.E.E.Q.R.S.(.T.! ! U.C.V.W.X.E.E.E.E.E.E.F.! ", "@ Y.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.F.! ", "+ Z.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.`.! ", " +.+++++p.p.p.p.p.p.p.p.x.x.x.x.x.x.x.x.x.x.x.x.`.@+! ", " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ", " ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/column.xpm000066400000000000000000000024541177057155300210240ustar00rootroot00000000000000/* XPM */ static const char * column_xpm[] = { "16 16 63 1", " c None", ". c #000000", "+ c #7791AE", "@ c #9AB7D3", "# c #9BB8D4", "$ c #9BB8D5", "% c #9CB9D5", "& c #9DBAD6", "* c #738CA9", "= c #8DA9C7", "- c #8EAAC7", "; c #8EABC7", "> c #8FACC8", ", c #3F4C59", "' c #404D59", ") c #92AFCC", "! c #93AFCC", "~ c #94B0CC", "{ c #95B1CE", "] c #96B2CF", "^ c #97B3D0", "/ c #8EA9C6", "( c #0D1013", "_ c #91ACC9", ": c #97B4D0", "< c #90ACC9", "[ c #687C91", "} c #6A7E93", "| c #98B4D0", "1 c #91AECB", "2 c #333D47", "3 c #404C59", "4 c #353F49", "5 c #99B5D2", "6 c #8AA5C1", "7 c #050608", "8 c #101317", "9 c #92ADC9", "0 c #20262C", "a c #8FAAC6", "b c #9AB6D2", "c c #5C6E80", "d c #4A5866", "e c #687C90", "f c #5F7183", "g c #272E36", "h c #293038", "i c #839CB6", "j c #010101", "k c #8AA3BC", "l c #505F6E", "m c #434F5C", "n c #3F4A56", "o c #536373", "p c #1A1F24", "q c #7B92A9", "r c #7B93A9", "s c #1B2126", "t c #9EBAD7", "u c #9EBBD7", "v c #9FBCD8", "w c #7690AE", "x c #7992AF", " ............. ", " +@@####$$%%&&* ", ".@=-;>,.')!~{]^.", ".@-;>/(.(_~{]^:.", ".#;><[...}{]^:|.", ".#><12.3.4]^:|5.", ".#<1678907a:|5b.", ".#11c.d{e.f|5b@.", ".$1)g.....h5b@#.", ".$)ij.....jk@#$.", ".%!l.m^:|n.o#$&.", ".&{p.q|5br.s&tu.", ".&]^:|5b@#$&tuv.", ".w^:|5b@#$&tuvx ", " ............ ", " "}; flamerobin_0.9.3~svn+2220.orig/res/column32.xpm000066400000000000000000000072751177057155300211770ustar00rootroot00000000000000/* XPM */ static const char * column32_xpm[] = { "32 32 96 2", " c None", ". c #000000", "+ c #E2E2E2", "@ c #F2F2F2", "# c #F3F3F3", "$ c #F4F4F4", "% c #F5F5F5", "& c #F6F6F6", "* c #F7F7F7", "= c #DBDBDB", "- c #F0F0F0", "; c #E0E0E0", "> c #E1E1E1", ", c #E3E3E3", "' c #E4E4E4", ") c #E5E5E5", "! c #E6E6E6", "~ c #BCC3CA", "{ c #DDDFE1", "] c #E8E8E8", "^ c #E9E9E9", "/ c #EAEAEA", "( c #EBEBEB", "_ c #ECECEC", ": c #EDEDED", "< c #EEEEEE", "[ c #EFEFEF", "} c #BAC1C9", "| c #314E6C", "1 c #8E9CAB", "2 c #F1F1F1", "3 c #E7E7E7", "4 c #738598", "5 c #46607A", "6 c #E9E9EA", "7 c #DBDDDF", "8 c #36526F", "9 c #B6BEC7", "0 c #9AA6B3", "a c #6B7F94", "b c #526A82", "c c #49637D", "d c #33506E", "e c #DDDFE2", "f c #C2C8CF", "g c #B5BEC7", "h c #375370", "i c #94A2B0", "j c #7A8B9E", "k c #415B77", "l c #6C8095", "m c #E3E4E5", "n c #395572", "o c #7C8EA0", "p c #ABB5C0", "q c #BEC6CE", "r c #F8F8F8", "s c #A2AEB9", "t c #BCC4CC", "u c #E5E7E9", "v c #35516F", "w c #718498", "x c #F9F9F9", "y c #586F87", "z c #3A5672", "A c #DBDFE2", "B c #DFE2E5", "C c #60768D", "D c #34516E", "E c #E5E7EA", "F c #FAFAFA", "G c #CBD1D6", "H c #9BA8B6", "I c #FBFBFB", "J c #FCFCFC", "K c #8192A3", "L c #395571", "M c #324F6D", "N c #4D6680", "O c #FDFDFD", "P c #E8E9EA", "Q c #3C5874", "R c #8091A3", "S c #C6CED5", "T c #FEFEFE", "U c #ABB6C1", "V c #8C9CAC", "W c #CAD1D8", "X c #778A9D", "Y c #FFFFFF", "Z c #5F758C", "` c #D0D6DB", " . c #4B647E", ".. c #EDF0F2", "+. c #C9C9C9", "@. c #BDBDBD", " ", " ", " ", " ", " . . . . . . . . . . . . . . . . . . . . ", " . + @ @ @ @ # # # $ $ $ % % % & & * * $ = . ", " . - ; ; > + , ' ) ! ~ { ] ^ / ( _ : < [ : . ", " . @ > > + , ' ) ! } | 1 / / ( _ : < [ - 2 . ", " . @ + , , ' ) ! 3 4 | 5 6 _ _ : < [ - 2 @ . ", " . # , ' ) ) ! 3 7 8 | | 9 : : < [ - 2 @ # . ", " . # ' ) ! 3 3 ] 0 | | | a < [ [ - 2 @ # $ . ", " . # ) ! 3 ] ^ ^ b | c | d e - 2 2 @ # $ % . ", " . $ ! 3 ] ^ / f | | g h | i 2 @ # # $ % & . ", " . $ 3 ] ^ / ( j | k _ l | c 2 # $ % % & * . ", " . % ] ^ / ( m n | o [ p | | q $ % & * * r . ", " . % ^ / ( _ s | | t - u v | w % & * r r x . ", " . % / ( _ : y | z A B B C | D E * r x F F . ", " . & ( _ : G | | | | | | | | | H r x F I J . ", " . * : : < K | | L L L L L M | N r F I J O . ", " . * < [ P Q | c # $ % & * R | | S I J O T . ", " . r - 2 U | | V % & * r x W | | X O T Y Y . ", " . r 2 @ Z | | ` & * r x F F .| 8 ..Y Y Y . ", " . @ @ # $ % & & * r x F I J O T Y Y Y Y _ . ", " . +.: r % & * r r x F I J O T Y Y Y Y < @.. ", " . . . . . . . . . . . . . . . . . . . . ", " ", " ", " ", " ", " ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/database.xpm000066400000000000000000000007071177057155300212720ustar00rootroot00000000000000/* XPM */ static const char * database_xpm[] = { "16 16 5 1", " c None", ". c #000686", "+ c #FFFFFF", "@ c #F7F3F7", "# c #889CC1", "............ ", ".+++++++++++. ", ".++++++++++++. ", ".++++.....@+++. ", ".+++.#####.+++. ", ".++.####+##.++. ", ".++.###+++#.++. ", ".++.####+##.++. ", ".++.#######.++. ", ".++.#######.++. ", ".+++.#####.+++. ", ".++++.....++++. ", ".+++++++++++++. ", ".+++++++++++++. ", " ............. ", " "}; flamerobin_0.9.3~svn+2220.orig/res/database32.xpm000066400000000000000000000122001177057155300214260ustar00rootroot00000000000000/* XPM */ static const char * database32_xpm[] = { "32 32 188 2", " c None", ". c #141414", "+ c #3B3B3B", "@ c #404040", "# c #545454", "$ c #555555", "% c #F6F6F6", "& c #FFFFFF", "* c #FAFAFA", "= c #D6D6D6", "- c #878787", "; c #242424", "> c #FEFEFE", ", c #E6E6E6", "' c #F0F0F0", ") c #A0A0A0", "! c #000000", "~ c #F8F8F8", "{ c #D8D8D8", "] c #F5F5F5", "^ c #979797", "/ c #252525", "( c #FDFDFD", "_ c #F7F7F7", ": c #C9C9C9", "< c #E0E0E0", "[ c #888888", "} c #212121", "| c #F2F2F2", "1 c #BEBEBE", "2 c #767676", "3 c #5F5F5F", "4 c #0A0A0A", "5 c #010101", "6 c #090909", "7 c #6E6E6E", "8 c #B4B4B4", "9 c #E7E7E7", "0 c #BFBFBF", "a c #E1E1E1", "b c #C8C8C8", "c c #C2C2C2", "d c #8E8E8E", "e c #B1B1B1", "f c #2B2B2B", "g c #4E4E4E", "h c #757575", "i c #8C8C8C", "j c #959595", "k c #929292", "l c #8F8F8F", "m c #8A8A8A", "n c #7F7F7F", "o c #626262", "p c #434343", "q c #272727", "r c #9B9B9B", "s c #A7A7A7", "t c #666666", "u c #5D5D5D", "v c #565656", "w c #5A5A5A", "x c #848484", "y c #858585", "z c #787878", "A c #9D9D9D", "B c #999999", "C c #949494", "D c #909090", "E c #8D8D8D", "F c #898989", "G c #818181", "H c #7D7D7D", "I c #5C5C5C", "J c #686868", "K c #D2D2D2", "L c #C7C7C6", "M c #A6A6A6", "N c #9A9A9A", "O c #6C6C6C", "P c #BBBBBB", "Q c #A4A4A4", "R c #9F9F9F", "S c #8B8B8B", "T c #838383", "U c #808080", "V c #7C7C7C", "W c #676767", "X c #AFAFAF", "Y c #AEAEAE", "Z c #585858", "` c #717171", " . c #A2A2A2", ".. c #7E7E7E", "+. c #7A7A7A", "@. c #777777", "#. c #737373", "$. c #F9F9F9", "%. c #040404", "&. c #A3A3A3", "*. c #707070", "=. c #6A6A6A", "-. c #030303", ";. c #C4C4C4", ">. c #F8F8F7", ",. c #020202", "'. c #FEFEFD", "). c #F5F5F4", "!. c #050505", "~. c #6F6F6F", "{. c #C3C3C3", "]. c #F4F4F3", "^. c #1A1A1A", "/. c #9E9E9E", "(. c #464646", "_. c #FCFCFC", ":. c #F2F2F1", "<. c #060606", "[. c #727272", "}. c #989898", "|. c #7B7B7B", "1. c #484848", "2. c #C3C3C2", "3. c #F1F1F0", "4. c #ABABAB", "5. c #BABABA", "6. c #353535", "7. c #222222", "8. c #EFEFEF", "9. c #0D0D0D", "0. c #797979", "a. c #5B5B5B", "b. c #696969", "c. c #525252", "d. c #454545", "e. c #FBFBFB", "f. c #EEEEED", "g. c #4F4F4F", "h. c #C2C2C1", "i. c #EDEDEB", "j. c #131313", "k. c #F7F7F6", "l. c #EBEBEA", "m. c #202020", "n. c #111111", "o. c #575756", "p. c #C1C1C0", "q. c #F6F6F5", "r. c #EAEAE8", "s. c #CDCDCB", "t. c #2E2E2D", "u. c #474747", "v. c #1C1C1C", "w. c #B7B7B5", "x. c #C0C0C0", "y. c #E6E6E4", "z. c #AAAAA8", "A. c #474746", "B. c #161616", "C. c #2F2F2F", "D. c #282828", "E. c #E3E3E1", "F. c #C0C0BF", "G. c #E4E4E2", "H. c #C1C1BF", "I. c #666665", "J. c #595959", "K. c #6B6B6B", "L. c #535353", "M. c #4A4A49", "N. c #ABABAA", "O. c #E1E1DF", "P. c #F3F3F3", "Q. c #DADAD9", "R. c #B3B3B1", "S. c #787877", "T. c #151515", "U. c #0F0F0F", "V. c #6A6A69", "W. c #A9A9A8", "X. c #D0D0CE", "Y. c #F3F3F2", "Z. c #E9E9E9", "`. c #B6B6B5", " + c #323232", ".+ c #C5C5C4", "++ c #C1C1C1", "@+ c #979796", ". + @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # $ ", "+ % & & & & & & & & & & & & & & & & & * = - ; ", "@ & & & & & & & & & & & > > > > > > > * , ' ) ! ", "@ & & & & & & & & & > > > > > > > > > ~ { & ] ^ / ", "@ & & & & & & & > > > > > > > > > ( ( _ : ( ( < [ } ", "@ & & & & & & | 1 2 3 4 5 5 6 $ 7 8 9 % 0 a = b c d ", "@ & & & & ( e f g h i j k l m n o p q r s t u v w x ! ", "@ & & & ( y ! z ) A B C D E F y G H I ! J K L M N O ! ", "@ & * * P ! C Q R r ^ k l S - T U V z W ! X * * * Y ! ", "@ & * * Z ` s .A B C D E F y G ..+.@.#.g 3 * * * c ! ", "@ > $.$.%.&.Q R r ^ k l S - T U V z h *.=.-.$.$.$.;.! ", "@ > >.>.,.M .A B C D E F y G ..+.@.#.7 O 5 >.>.>.;.! ", "@ '.% % ,.Q R r ^ k l S - T U V z h *.O h ! % % % ;.! ", "@ ( ).).!.R .B C D E F y G ..+.@.#.7 ~.W ! ).).).{.! ", "@ ( ].].^.V /.&.k l S - T U V z h *.@.O (.! ].].].{.! ", "@ _.:.:.<.[.U C e }.[ y G ..|.V G - t 1.} ! :.:.:.2.! ", "@ _.3.3.<.k *.7 U 4.c 0 P 5.5.Y J $ 6.7.$ ! 3.3.3.2.! ", "@ _.8.8.9.H C 0.a.a.b.[.h #.O o ! ! c.3 d.! 8.8.8.c ! ", "@ e.f.f.! #.U D /.V # @ ! ! ! g.J z o 1.} ! f.f.f.h.! ", "@ * i.i.! D *.7 U 4.c 0 P 5.5.Y J $ 6.7.# j.i.i.i.h.! ", "@ k.l.l.z m.C 0.a.a.b.[.h #.O o ! ! c.3 n.o.l.l.l.p.! ", "@ q.r.r.s.t.u.D /.V # @ ! ! ! g.J z o q v.w.r.r.r.x.! ", "@ ].y.y.y.z.A.B...4.c 0 P 5.5.Y J # C.D.j E.y.y.y.F.! ", "@ ].G.G.G.G.H.I.! . J.` h #.K.L.! !.M.N.O.G.G.G.G.F.! ", "@ P.E.E.E.E.E.Q.R.S.(.T.! ! U.C.V.W.X.E.E.E.E.E.E.F.! ", "@ Y.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.F.! ", "+ Z.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.`.! ", " +.+++++p.p.p.p.p.p.p.p.x.x.x.x.x.x.x.x.x.x.x.x.`.@+! ", " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ", " ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/delete16.xpm000066400000000000000000000023751177057155300211420ustar00rootroot00000000000000/* XPM */ static const char * delete16_xpm[] = { "16 16 56 1", " c None", ". c #000000", "+ c #A2AEBC", "@ c #6D8196", "# c #8B8B8B", "$ c #727F8C", "% c #7D8EA1", "& c #314E6C", "* c #5C5C5C", "= c #21364B", "- c #D6D6D6", "; c #BFBFBF", "> c #CECECE", ", c #D2D2D2", "' c #D5D5D5", ") c #D8D8D8", "! c #DCDCDC", "~ c #DFDFDF", "{ c #E2E2E2", "] c #E9E9E9", "^ c #ECECEC", "/ c #A8A8A8", "( c #D1D1D1", "_ c #D4D4D4", ": c #DBDBDB", "< c #DEDEDE", "[ c #E5E5E5", "} c #EFEFEF", "| c #AAAAAA", "1 c #979797", "2 c #5F5F5F", "3 c #404040", "4 c #DADADA", "5 c #FF0000", "6 c #ADADAD", "7 c #D9D9D9", "8 c #CF0000", "9 c #AFAFAF", "0 c #FCFCFC", "a c #B3B3B3", "b c #E1E1E1", "c c #E4E4E4", "d c #F2F2F2", "e c #E8E8E8", "f c #EBEBEB", "g c #EEEEEE", "h c #F5F5F5", "i c #FFFFFF", "j c #B1B1B1", "k c #868686", "l c #9F9F9F", "m c #A2A2A2", "n c #A4A4A4", "o c #A6A6A6", "p c #A9A9A9", "q c #ABABAB", "................", ".+@#@@@@@@@#@@$.", ".%&*&&&&&&&*&&=.", ".-;*>,')!~{*]^/.", ".-;*(_):<{[*^}|.", ".1****2..**..23.", ".-;*-4.55..55.6.", ".-;*7!.558855.9.", ".1*****.8558.*3.", ".-;*<{[.8558.0a.", ".-;*bc.558855.a.", ".1****.55..55.3.", ".-;*<{2..}d..2a.", ".-;*bcefgdh*0ia.", ".jk3lmnopq63aaa.", "................"}; flamerobin_0.9.3~svn+2220.orig/res/delete24.xpm000066400000000000000000000030451177057155300211340ustar00rootroot00000000000000/* XPM */ static const char * delete24_xpm[] = { "24 24 56 1", " c None", ". c #000000", "+ c #A2AEBC", "@ c #6D8196", "# c #8B8B8B", "$ c #727F8C", "% c #7D8EA1", "& c #314E6C", "* c #5C5C5C", "= c #21364B", "- c #D6D6D6", "; c #BFBFBF", "> c #CECECE", ", c #D2D2D2", "' c #D5D5D5", ") c #D8D8D8", "! c #DCDCDC", "~ c #DFDFDF", "{ c #E2E2E2", "] c #E9E9E9", "^ c #ECECEC", "/ c #A8A8A8", "( c #D1D1D1", "_ c #D4D4D4", ": c #DBDBDB", "< c #DEDEDE", "[ c #E5E5E5", "} c #EFEFEF", "| c #AAAAAA", "1 c #979797", "2 c #5F5F5F", "3 c #404040", "4 c #DADADA", "5 c #FF0000", "6 c #ADADAD", "7 c #D9D9D9", "8 c #CF0000", "9 c #AFAFAF", "0 c #FCFCFC", "a c #B3B3B3", "b c #E1E1E1", "c c #E4E4E4", "d c #F2F2F2", "e c #E8E8E8", "f c #EBEBEB", "g c #EEEEEE", "h c #F5F5F5", "i c #FFFFFF", "j c #B1B1B1", "k c #868686", "l c #9F9F9F", "m c #A2A2A2", "n c #A4A4A4", "o c #A6A6A6", "p c #A9A9A9", "q c #ABABAB", " ", " ", " ", " ", " ................ ", " .+@#@@@@@@@#@@$. ", " .%&*&&&&&&&*&&=. ", " .-;*>,')!~{*]^/. ", " .-;*(_):<{[*^}|. ", " .1****2..**..23. ", " .-;*-4.55..55.6. ", " .-;*7!.558855.9. ", " .1*****.8558.*3. ", " .-;*<{[.8558.0a. ", " .-;*bc.558855.a. ", " .1****.55..55.3. ", " .-;*<{2..}d..2a. ", " .-;*bcefgdh*0ia. ", " .jk3lmnopq63aaa. ", " ................ ", " ", " ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/domain.xpm000066400000000000000000000024351177057155300207750ustar00rootroot00000000000000/* XPM */ static const char * domain_xpm[] = { "16 16 62 1", " c None", ". c #000000", "+ c #E66253", "@ c #F17062", "# c #EF6C5C", "$ c #DF5642", "% c #E66455", "& c #F57A70", "* c #F88179", "= c #F06D5D", "- c #DD503B", "; c #F27163", "> c #FF9090", ", c #F27162", "' c #EA604A", ") c #F06D5E", "! c #E95E47", "~ c #E25B49", "{ c #EC644F", "] c #D94A34", "^ c #4E9D44", "/ c #3B8E3B", "( c #020602", "_ c #DE5441", ": c #EB614B", "< c #E95F48", "[ c #DA4B35", "} c #4FC04F", "| c #51CA51", "1 c #3F9A3F", "2 c #163516", "3 c #020502", "4 c #232329", "5 c #4D637A", "6 c #5A7591", "7 c #616175", "8 c #4AB14A", "9 c #58E058", "0 c #4BB34B", "a c #459D45", "b c #040405", "c c #728EA9", "d c #7F9AB5", "e c #5A7692", "f c #59586D", "g c #48AB48", "h c #49AD49", "i c #030405", "j c #9DB7D1", "k c #617D99", "l c #435F7C", "m c #4A923F", "n c #469F46", "o c #488E3C", "p c #1B242C", "q c #3E5B77", "r c #49903E", "s c #4E4E5F", "t c #486481", "u c #4D4D61", "v c #59596E", "w c #4E4D61", " ", " .... ", " .+@#$. ", " .%&*&=-. ", " .;*>*,'. ", " .)&*&=!. ", " ..~=,={]. ", " .^/(_:<[... ", " .^}|123.4567. ", " .8|9|0abcdcef. ", " .g}|}haidjdkl. ", " .mh0hnopcdceq. ", " .raao.seketu. ", " .... .vlqw. ", " .... ", " "}; flamerobin_0.9.3~svn+2220.orig/res/domain32.xpm000066400000000000000000000150761177057155300211470ustar00rootroot00000000000000/* XPM */ static const char * domain32_xpm[] = { "32 32 280 2", " c None", ". c #000000", "+ c #4D211C", "@ c #73312A", "# c #76352D", "$ c #793831", "% c #783730", "& c #78362E", "* c #743128", "= c #702B21", "- c #4A1D16", "; c #E66253", "> c #EC695B", ", c #F17062", "' c #F06E5F", ") c #EF6C5C", "! c #E7614F", "~ c #DF5642", "{ c #73322B", "] c #B05046", "^ c #EE6E62", "/ c #F17368", "( c #F5796E", "_ c #F3766A", ": c #F27366", "< c #ED6A5B", "[ c #E86250", "} c #AB4537", "| c #6F281E", "1 c #4A1B14", "2 c #E66455", "3 c #EE6F63", "4 c #F57A70", "5 c #F77E75", "6 c #F88179", "7 c #F37467", "8 c #F06D5D", "9 c #E75F4C", "0 c #DD503B", "a c #76352E", "b c #EC6B5C", "c c #F17468", "d c #F9837D", "e c #FC8985", "f c #F4766A", "g c #F16F60", "h c #EA6451", "i c #E45843", "j c #722C21", "k c #793932", "l c #F27163", "m c #FF9090", "n c #F27162", "o c #EE6956", "p c #EA604A", "q c #753025", "r c #793830", "s c #F16F61", "t c #F4766B", "u c #ED6754", "v c #EA5F49", "w c #753024", "x c #78372F", "y c #F06D5E", "z c #ED6652", "A c #E95E47", "B c #752F24", "C c #75322A", "D c #E96454", "E c #EE6C5D", "F c #F06E5E", "G c #E85E4A", "H c #E1543E", "I c #712A1F", "J c #712E25", "K c #E25B49", "L c #E96453", "M c #EC644F", "N c #E35742", "O c #D94A34", "P c #6D251A", "Q c #1A3417", "R c #274F22", "S c #224B20", "T c #1E471E", "U c #483C22", "V c #723126", "W c #AD493A", "X c #EB6553", "Y c #EF6957", "Z c #EE6855", "` c #ED6653", " . c #E85F4A", ".. c #E35842", "+. c #A83E2E", "@. c #36130D", "#. c #4E9D44", "$. c #459640", "%. c #3B8E3B", "&. c #1F4A1F", "*. c #020602", "=. c #702D22", "-. c #DE5441", ";. c #E55B46", ">. c #EB614B", ",. c #E95F48", "'. c #E2553F", "). c #DA4B35", "!. c #6D261B", "~. c #3B7F36", "{. c #4FAF4A", "]. c #4AAD48", "^. c #46AC46", "/. c #337E33", "(. c #215021", "_. c #4D4A26", ":. c #7A452C", "<. c #783C29", "[. c #773327", "}. c #763125", "|. c #7A332A", "1. c #7F372F", "2. c #533436", "3. c #27323D", "4. c #2A3643", "5. c #2D3B49", "6. c #2F3642", "7. c #31313B", "8. c #202027", "9. c #4FC04F", "0. c #50C550", "a. c #51CA51", "b. c #48B248", "c. c #3F9A3F", "d. c #2B682B", "e. c #163516", "f. c #0C1D0C", "g. c #020502", "h. c #010301", "i. c #121215", "j. c #232329", "k. c #384352", "l. c #4D637A", "m. c #546C86", "n. c #5A7591", "o. c #5E6B83", "p. c #616175", "q. c #265424", "r. c #4CA747", "s. c #4EB64C", "t. c #52CD52", "u. c #55D555", "v. c #4EC44E", "w. c #3C933C", "x. c #317431", "y. c #2A632A", "z. c #245124", "A. c #132A13", "B. c #020203", "C. c #262D36", "D. c #4B5969", "E. c #586C80", "F. c #667F98", "G. c #66809A", "H. c #66829D", "I. c #627790", "J. c #5E6C84", "K. c #454C5D", "L. c #2D2C37", "M. c #1E1D24", "N. c #255925", "O. c #4AB14A", "P. c #4EBE4E", "Q. c #58E058", "R. c #4EBF4E", "S. c #4BB34B", "T. c #48A848", "U. c #459D45", "V. c #255125", "W. c #040405", "X. c #3B4957", "Y. c #728EA9", "Z. c #7994AF", "`. c #7F9AB5", " + c #66829E", ".+ c #5A7692", "++ c #5A6780", "@+ c #59586D", "#+ c #255725", "$+ c #49AE49", "%+ c #4DBA4D", "&+ c #4DBB4D", "*+ c #4AB04A", "=+ c #48A748", "-+ c #245125", ";+ c #3E4C5A", ">+ c #839EB9", ",+ c #8EA9C3", "'+ c #6B87A2", ")+ c #5E7A96", "!+ c #566B85", "~+ c #4E5C75", "{+ c #272E3A", "]+ c #245624", "^+ c #48AB48", "/+ c #4CB64C", "(+ c #4CB74C", "_+ c #49AD49", ":+ c #47A547", "<+ c #030405", "[+ c #414F5D", "}+ c #9DB7D1", "|+ c #708CA7", "1+ c #617D99", "2+ c #526E8B", "3+ c #435F7C", "4+ c #22303E", "5+ c #254F22", "6+ c #499F44", "7+ c #4BAB48", "8+ c #4AAE4A", "9+ c #48A648", "0+ c #479E44", "a+ c #479641", "b+ c #2B552D", "c+ c #0F1419", "d+ c #445464", "e+ c #4F6B88", "f+ c #415D7A", "g+ c #202F3D", "h+ c #254920", "i+ c #4A923F", "j+ c #4AA044", "k+ c #469F46", "l+ c #479741", "m+ c #488E3C", "n+ c #325934", "o+ c #1B242C", "p+ c #47596B", "q+ c #4C6985", "r+ c #3E5B77", "s+ c #1F2E3C", "t+ c #193115", "u+ c #377432", "v+ c #49A346", "w+ c #366F30", "x+ c #24471E", "y+ c #2C4032", "z+ c #353946", "A+ c #4D5E72", "B+ c #5C7894", "C+ c #516D8A", "D+ c #4B617B", "E+ c #46546C", "F+ c #232A36", "G+ c #25481F", "H+ c #49903E", "I+ c #479742", "J+ c #272730", "K+ c #4E4E5F", "L+ c #546279", "M+ c #486481", "N+ c #4B5971", "O+ c #4D4D61", "P+ c #272731", "Q+ c #183015", "R+ c #244B21", "S+ c #234F23", "T+ c #234B20", "U+ c #182F14", "V+ c #1A1A20", "W+ c #404758", "X+ c #5A6880", "Y+ c #4C617B", "Z+ c #394051", "`+ c #2D2D37", " @ c #59596E", ".@ c #4E4D61", "+@ c #1E1E25", "@@ c #272E3B", " ", " ", " . . . . . . . ", " . . . . . . . . . ", " . + @ # $ % & * = - . ", " . . @ ; > , ' ) ! ~ = . . ", " . + { ] ^ / ( _ : < [ } | 1 . ", " . . { 2 3 4 5 6 5 4 7 8 9 0 | . . ", " . . a b c 5 d e d 5 f g h i j . . ", " . . k l ( 6 e m e 6 ( n o p q . . ", " . . r s t 5 d e d 5 f g u v w . . ", " . . x y 7 4 5 6 5 4 7 8 z A B . . ", " . . . C D E 7 f ( f 7 F o G H I . . ", " . . . . J K L 8 g n g 8 o M N O P . . ", " . Q R S T U V W ! X Y Z ` ...+.P @.. . . ", " . . R #.$.%.&.*.=.-.;.>.p ,.'.).!.. . . . . . ", " . Q R ~.{.].^./.(._.:.<.[.}.w |.1.2.3.4.5.6.7.8.. ", " . . R #.{.9.0.a.b.c.d.e.f.g.h.. i.j.k.l.m.n.o.p.7.. . ", " . . q.r.s.0.t.u.v.b.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.. ", " . . N.O.P.a.u.Q.u.a.R.S.T.U.V.W.X.Y.Z.`.Z.Y. +.+++@+L.. . ", " . . #+$+%+0.t.u.t.0.&+*+=+U.-+W.;+Z.>+,+>+Z.'+)+!+~+{+. . ", " . . ]+^+/+9.0.a.0.9.(+_+:+U.-+<+[+`.,+}+,+`.|+1+2+3+4+. . ", " . . 5+6+7+(+&+R.&+(+8+9+0+a+b+c+d+Z.>+,+>+Z.'+)+e+f+g+. . ", " . . h+i+j+_+*+S.*+_+9+k+l+m+n+o+p+Y.Z.`.Z.Y. +.+q+r+s+. . ", " . t+h+u+6+v+T.=+:+0+l+w+x+y+z+A+ +'+|+'+ +B+C+D+E+F+. . ", " . . G+H+I+U.U.U.a+m+x+. J+K+L+.+)+1+)+.+C+M+N+O+P+. . ", " . Q+G+R+S+S+S+T+x+U+. V+J+W+X+!+2+e+q+Y+N+Z+P+V+. ", " . . . . . . . . . . . `+ @~+3+f+r+E+.@P+. . ", " . . . . . . . . +@`+@@4+g+s+F+P+V+. ", " . . . . . . . . . ", " . . . . . . . ", " "}; flamerobin_0.9.3~svn+2220.orig/res/down.xpm000066400000000000000000000013601177057155300204710ustar00rootroot00000000000000/* XPM */ static const char * down_xpm[] = { "16 16 25 1", " c None", ". c #000000", "+ c #B5C9DC", "@ c #9BB6D0", "# c #91B0CC", "$ c #49749C", "% c #456F96", "& c #AFC5DA", "* c #A0BAD3", "= c #9EB8D1", "- c #3F6588", "; c #375978", "> c #B2C7DB", ", c #9CB7D1", "' c #9AB5CF", ") c #B6CADD", "! c #5B88B2", "~ c #A4BDD5", "{ c #2A435B", "] c #5080AD", "^ c #97B3CE", "/ c #080D11", "( c #5F8BB4", "_ c #95B2CE", ": c #4C79A3", " ", " ", " ....... ", " .+@#$%. ", " .&*=-;. ", " .>,'-;. ", " .),'-;. ", " .)@@-;. ", " ....)',-;.... ", " .!=~*,---{. ", " .],,,--{. ", " .]^*-{. ", " /(_{. ", " .:. ", " . ", " "}; flamerobin_0.9.3~svn+2220.orig/res/exception16_png.cpp000066400000000000000000000077351177057155300225250ustar00rootroot00000000000000static const unsigned char exception16_png[] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0xf3, 0xff, 0x61, 0x00, 0x00, 0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0, 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd7, 0x0b, 0x0d, 0x14, 0x1b, 0x2a, 0x2f, 0xf7, 0x66, 0x1b, 0x00, 0x00, 0x02, 0x20, 0x49, 0x44, 0x41, 0x54, 0x38, 0xcb, 0x75, 0x93, 0x4f, 0x6b, 0x13, 0x41, 0x18, 0xc6, 0x7f, 0x33, 0xbb, 0x9b, 0x4d, 0x96, 0x4d, 0x52, 0xab, 0x6d, 0x89, 0x89, 0xda, 0xb4, 0x69, 0xd9, 0x54, 0x9a, 0x4a, 0xb4, 0x49, 0xff, 0x1f, 0x8a, 0xa8, 0x07, 0xa1, 0x22, 0x0a, 0x85, 0x20, 0x15, 0x7a, 0x52, 0xf0, 0x22, 0x14, 0x04, 0x8f, 0xea, 0xb1, 0x96, 0xea, 0x67, 0x10, 0x41, 0x0f, 0x7e, 0x03, 0x2b, 0x1e, 0xc4, 0x1e, 0xf5, 0x24, 0x5a, 0xaa, 0x16, 0x11, 0x0a, 0x6d, 0xb0, 0xb6, 0x94, 0xfd, 0x93, 0xed, 0x7a, 0x69, 0x62, 0x9b, 0x26, 0x03, 0xbf, 0xc3, 0x3b, 0x33, 0xef, 0x33, 0xcf, 0xcc, 0xfb, 0x8e, 0x98, 0xcb, 0xd2, 0x74, 0xf4, 0x0f, 0x77, 0x5d, 0xf8, 0x53, 0xde, 0xda, 0x79, 0xfd, 0x76, 0xf3, 0x4b, 0xb3, 0x3d, 0xb2, 0x79, 0x3a, 0xe6, 0xf0, 0xe0, 0x99, 0xa5, 0xc1, 0x81, 0xe4, 0x1b, 0x40, 0x34, 0x17, 0x90, 0xfb, 0x32, 0x75, 0x64, 0x7a, 0xa3, 0x0f, 0x33, 0x56, 0xca, 0x2c, 0x8c, 0xf5, 0x5a, 0xc5, 0x1e, 0x6d, 0xf6, 0x58, 0x18, 0x1a, 0xd1, 0xcc, 0x41, 0x72, 0xe4, 0xe2, 0xf9, 0x07, 0xf6, 0xea, 0x32, 0xee, 0xda, 0x67, 0x4a, 0x53, 0x3d, 0xf3, 0x80, 0xd1, 0xd0, 0x81, 0xa2, 0x40, 0x3d, 0xbd, 0x7d, 0x27, 0x9e, 0x64, 0x8c, 0xdf, 0xb5, 0x4d, 0x56, 0xb2, 0x12, 0x3b, 0xdb, 0x19, 0xba, 0xbf, 0xe5, 0x41, 0x3d, 0x8d, 0x1c, 0x64, 0x8b, 0x13, 0x03, 0x33, 0x00, 0x5e, 0xfe, 0x1e, 0xf4, 0x97, 0x00, 0xb8, 0x75, 0xbd, 0xf3, 0x11, 0xd0, 0x7a, 0xc4, 0x81, 0xeb, 0x40, 0x15, 0x45, 0x15, 0x64, 0x07, 0x12, 0x0b, 0xc9, 0x0e, 0x1d, 0x00, 0xc3, 0x2a, 0xa1, 0xf5, 0xcd, 0xa2, 0xed, 0x96, 0xb1, 0x32, 0x21, 0xae, 0xe4, 0x42, 0x8f, 0xdd, 0x00, 0x0e, 0x52, 0xef, 0x60, 0x62, 0x74, 0x24, 0x7b, 0xd9, 0xd8, 0x5e, 0xd9, 0x0f, 0xf7, 0x08, 0x02, 0x81, 0x67, 0xb4, 0xe2, 0x6c, 0xb9, 0x94, 0xc6, 0x22, 0x77, 0x80, 0x74, 0xd3, 0x32, 0xe6, 0xf2, 0xc9, 0xc5, 0xb6, 0x96, 0x03, 0x8b, 0x42, 0x47, 0xec, 0x55, 0x6a, 0xf1, 0xa9, 0x94, 0xc7, 0xb5, 0x9c, 0xba, 0x90, 0x30, 0xa1, 0x4a, 0x4d, 0xc0, 0x8c, 0x29, 0x37, 0x46, 0x8b, 0x9d, 0xe7, 0x54, 0xaf, 0x5c, 0x4b, 0x10, 0x78, 0x48, 0x45, 0xff, 0xaf, 0xe8, 0x38, 0xcc, 0x4c, 0x9a, 0x53, 0x40, 0xa1, 0x3a, 0xa5, 0x56, 0x0f, 0x1b, 0x2e, 0x24, 0x16, 0xdb, 0xe3, 0x3e, 0x6c, 0xac, 0xe3, 0xeb, 0x51, 0x00, 0xec, 0x17, 0x43, 0x87, 0xee, 0x67, 0x47, 0xbb, 0x89, 0x47, 0x61, 0xd2, 0xda, 0x79, 0xbe, 0xbc, 0x52, 0x29, 0xae, 0x6f, 0x83, 0x34, 0x34, 0x48, 0x74, 0x68, 0x77, 0x87, 0x72, 0xf1, 0x93, 0xfe, 0xf6, 0x66, 0x2d, 0x19, 0x40, 0x2b, 0x7d, 0x44, 0x9b, 0x5e, 0x3a, 0x24, 0x12, 0x76, 0x7f, 0x31, 0x3d, 0x1e, 0x29, 0x00, 0x57, 0xab, 0x6f, 0x60, 0x0e, 0x76, 0xc9, 0xf9, 0xb0, 0xea, 0x1d, 0xa9, 0xa7, 0xf2, 0xfd, 0x15, 0xca, 0xea, 0xcb, 0xc3, 0x2e, 0x42, 0x29, 0x8e, 0xb7, 0xf9, 0x5c, 0xea, 0x93, 0xcf, 0x00, 0xa9, 0x76, 0xa7, 0xb4, 0xb9, 0x7c, 0xbb, 0x13, 0x6a, 0xd4, 0x65, 0xf6, 0x87, 0xa7, 0x0d, 0xdb, 0xd4, 0xd6, 0x53, 0xdc, 0x1c, 0xff, 0x99, 0x7e, 0xb7, 0xc6, 0x6d, 0xf5, 0xaf, 0x88, 0xb8, 0xef, 0x7f, 0x04, 0x1b, 0x62, 0xe5, 0x9b, 0xaf, 0x47, 0x34, 0x29, 0xc3, 0xba, 0x44, 0x8f, 0x08, 0x11, 0x0e, 0x07, 0x81, 0xa2, 0x83, 0x10, 0xbe, 0xef, 0xba, 0x04, 0xb6, 0x8d, 0xef, 0xec, 0x0a, 0x13, 0x47, 0x57, 0x3c, 0x57, 0x6a, 0x31, 0x5d, 0x89, 0xb7, 0x18, 0x71, 0x61, 0x99, 0xc4, 0x43, 0x92, 0xd3, 0x7e, 0x85, 0x0a, 0x10, 0x04, 0x80, 0x08, 0x10, 0x12, 0x84, 0xd8, 0xff, 0x85, 0x01, 0x04, 0x7b, 0x20, 0x7d, 0x08, 0xd2, 0x26, 0x11, 0x43, 0x43, 0x45, 0x20, 0x3e, 0x95, 0xf9, 0xfa, 0x0f, 0x21, 0x82, 0xa5, 0x17, 0x4c, 0xa1, 0x54, 0x34, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, }; flamerobin_0.9.3~svn+2220.orig/res/execute16.xpm000066400000000000000000000020221177057155300213270ustar00rootroot00000000000000/* XPM */ static const char * execute16_xpm[] = { "16 16 44 1", " c None", ". c #000000", "+ c #DB8EEC", "@ c #551C61", "# c #B300BD", "$ c #4D005E", "% c #B400BE", "& c #C713D2", "* c #B500C0", "= c #FBF3FB", "- c #E182E6", "; c #C630CD", "> c #FBF7FC", ", c #FEFCFE", "' c #F4D1F4", ") c #DE77E3", "! c #B500BF", "~ c #FCF8FC", "{ c #FFFFFF", "] c #F6DBF8", "^ c #D56ADA", "/ c #BA11C4", "( c #FFFEFF", "_ c #FEFAFD", ": c #EAB2ED", "< c #C232CA", "[ c #FBF4FC", "} c #ECC3EF", "| c #FDFAFD", "1 c #F5DFF6", "2 c #CE5CD4", "3 c #BA19C3", "4 c #FDF9FD", "5 c #F5E0F6", "6 c #D57ADB", "7 c #B914C2", "8 c #FBF5FB", "9 c #DDA1E4", "0 c #C241CC", "a c #B100BD", "b c #E4A7E8", "c c #B62AC5", "d c #B60CC0", "e c #B200BD", "................", ".+++++++++++++@.", ".+############$.", ".+#%&*########$.", ".+##=-;%######$.", ".+##>,')!#####$.", ".+##~{{~]^/###$.", ".+##~{{{(_:<##$.", ".+##~{{{{{[}##$.", ".+##~{{{|123##$.", ".+##~{4567####$.", ".+##8~90a#####$.", ".+##bc########$.", ".+##de########$.", ".@$$$$$$$$$$$$$.", "................"}; flamerobin_0.9.3~svn+2220.orig/res/execute24.xpm000066400000000000000000000025621177057155300213370ustar00rootroot00000000000000/* XPM */ static const char * execute24_xpm[] = { "24 24 44 1", " c None", ". c #000000", "+ c #E25BFF", "@ c #C040DB", "# c #B300BD", "$ c #775979", "% c #B500BF", "& c #D92BE5", "* c #BE00C9", "= c #FFFFFF", "- c #F6DAF5", "; c #C300CE", "> c #B800C2", ", c #FAF5FB", "' c #FAF3FB", ") c #FCF7FC", "! c #F8D7F6", "~ c #FAF0FA", "{ c #FDF6FD", "] c #EC90F0", "^ c #F9EFF9", "/ c #FBF4FC", "( c #E177E6", "_ c #FCF6FC", ": c #FBECF9", "< c #D34EDC", "[ c #FCF9FD", "} c #F8E0F6", "| c #FAEFFA", "1 c #E9B9EB", "2 c #B613C1", "3 c #F7E7F8", "4 c #ECC2EE", "5 c #BE2AC7", "6 c #CC58D2", "7 c #F9EEFA", "8 c #F9EBF9", "9 c #E5AEE9", "0 c #AC00BB", "a c #FAF2FB", "b c #E7B8EA", "c c #A100B8", "d c #EABEEC", "e c #C535CC", " ", " ...................... ", " .+++++++++++++++++++@. ", " .+##################$. ", " .+###%##############$. ", " .+##%&*#############$. ", " .+###=-;>###########$. ", " .+###,')!*##########$. ", " .+###,==~{]>########$. ", " .+###,====^/(#######$. ", " .+###,======_:<#####$. ", " .+###,========[}####$. ", " .+###,===========###$. ", " .+###,========|12###$. ", " .+###,======345#####$. ", " .+###,====336#######$. ", " .+###,==7890########$. ", " .+###'a,bc##########$. ", " .+###=dc############$. ", " .+###e0#############$. ", " .+##################$. ", " .@$$$$$$$$$$$$$$$$$$$. ", " ...................... ", " "}; flamerobin_0.9.3~svn+2220.orig/res/fk16_png.cpp000066400000000000000000000074621177057155300211240ustar00rootroot00000000000000static const unsigned char fk16_png[] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0xf3, 0xff, 0x61, 0x00, 0x00, 0x00, 0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64, 0x88, 0x00, 0x00, 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, 0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, 0x00, 0x02, 0x0a, 0x49, 0x44, 0x41, 0x54, 0x38, 0x8d, 0xa5, 0x92, 0xdf, 0x4b, 0x53, 0x61, 0x18, 0xc7, 0xbf, 0xcf, 0x39, 0xe7, 0x3d, 0xbf, 0xb6, 0xb9, 0x4d, 0x9d, 0xb5, 0x74, 0x5a, 0xea, 0xb2, 0x02, 0x21, 0x2a, 0x88, 0xd5, 0xb0, 0x66, 0x62, 0x17, 0x79, 0x99, 0x46, 0x04, 0x41, 0xdd, 0x14, 0xd1, 0x55, 0xf5, 0x2f, 0xd4, 0x5f, 0xe1, 0x55, 0x17, 0xfd, 0x50, 0xa8, 0x8b, 0x90, 0xc1, 0x0c, 0x06, 0x31, 0x1d, 0x83, 0x4a, 0x63, 0xde, 0xac, 0x20, 0xbb, 0x4b, 0xca, 0x75, 0x72, 0x73, 0x6e, 0xe7, 0xec, 0xec, 0xbc, 0x5d, 0x59, 0xc3, 0xb6, 0x35, 0xe8, 0x0b, 0x2f, 0xbc, 0xcf, 0x03, 0xef, 0x87, 0xcf, 0xf3, 0xf0, 0x12, 0xe7, 0x1c, 0xff, 0x13, 0xa9, 0xbe, 0x20, 0x02, 0x4d, 0x44, 0xb3, 0x57, 0x6d, 0xe6, 0x8c, 0x73, 0x10, 0x63, 0xa6, 0x33, 0xb7, 0xb8, 0x74, 0x7c, 0xa1, 0x15, 0x80, 0x76, 0x0d, 0xa2, 0xd1, 0x9c, 0x87, 0x49, 0x66, 0xa6, 0xdc, 0x4d, 0x7d, 0xc5, 0xa0, 0xe0, 0x11, 0x1c, 0xa0, 0x63, 0xa3, 0xb6, 0xa5, 0x18, 0xfc, 0x1d, 0xe7, 0xde, 0x4b, 0xc9, 0xe4, 0xc1, 0x4a, 0x23, 0x80, 0xb0, 0x7b, 0x61, 0x72, 0x65, 0xde, 0x08, 0x0b, 0x61, 0x5b, 0x83, 0xc7, 0xcf, 0x09, 0xc1, 0x23, 0x0a, 0x02, 0x93, 0x6e, 0xaf, 0x3a, 0x2c, 0x9f, 0x61, 0x28, 0xdc, 0x6a, 0x66, 0x20, 0x00, 0x40, 0x2c, 0xb6, 0xea, 0x73, 0x24, 0x3a, 0x21, 0x10, 0xa4, 0x8e, 0x32, 0x41, 0xff, 0x68, 0x23, 0xa4, 0x32, 0x0c, 0x07, 0x14, 0x1c, 0x3d, 0xe7, 0x51, 0x05, 0x91, 0x1e, 0x10, 0x81, 0x9a, 0x02, 0x04, 0x93, 0x0e, 0x9b, 0x2e, 0x90, 0x1e, 0x94, 0xc0, 0xb6, 0x39, 0x54, 0xaf, 0x88, 0xa1, 0x90, 0x82, 0xc1, 0x6e, 0x05, 0xc7, 0x0e, 0x69, 0x90, 0x55, 0x41, 0x8b, 0x44, 0xd2, 0x6a, 0xd3, 0x25, 0x3a, 0x8a, 0xfd, 0x59, 0x2d, 0x31, 0xd2, 0x7a, 0x18, 0x06, 0xae, 0xbb, 0xd0, 0xdf, 0xc5, 0xd0, 0xe7, 0x93, 0x11, 0x70, 0x4b, 0x90, 0x89, 0x40, 0x35, 0x14, 0x97, 0x97, 0x23, 0xe5, 0xa6, 0x06, 0xc9, 0xe4, 0xc9, 0x4d, 0xc1, 0xa6, 0xac, 0xb4, 0xe1, 0x70, 0x5d, 0x11, 0xe0, 0x51, 0x44, 0x74, 0xea, 0x22, 0x7a, 0x7d, 0x0c, 0xfb, 0x15, 0x09, 0x04, 0xce, 0x63, 0xb1, 0x2f, 0x0d, 0x0d, 0x7e, 0x2f, 0x51, 0xb2, 0xec, 0x6b, 0x95, 0xf4, 0xce, 0xdb, 0xf5, 0x97, 0x5b, 0x46, 0x7e, 0xdd, 0x44, 0x2e, 0x53, 0x42, 0xfc, 0x69, 0x7e, 0xc7, 0xa5, 0x10, 0x2e, 0xdf, 0xe8, 0x39, 0xe0, 0xd5, 0xb6, 0xe3, 0x33, 0x33, 0xf3, 0xe2, 0x5e, 0x00, 0xed, 0xfd, 0x48, 0xe3, 0x63, 0x1f, 0x2e, 0x6a, 0xba, 0x78, 0x1b, 0x55, 0xac, 0x5a, 0x55, 0xe7, 0xdb, 0xbe, 0x5e, 0xf6, 0xf0, 0xee, 0xa3, 0x7e, 0xff, 0xab, 0x67, 0x9b, 0xa5, 0xf7, 0xc9, 0xc2, 0x42, 0x3c, 0x31, 0x7a, 0xa5, 0x25, 0xa0, 0x3e, 0x17, 0xce, 0xae, 0x0c, 0xb8, 0xfd, 0x6c, 0xed, 0xd4, 0x94, 0xcf, 0xed, 0x0f, 0x2b, 0x48, 0xbf, 0xf8, 0x51, 0xf8, 0x9e, 0xb3, 0x66, 0x13, 0xaf, 0x47, 0xef, 0xff, 0x35, 0x42, 0xa3, 0x28, 0x35, 0xcb, 0xb0, 0x4d, 0x3c, 0x5e, 0x7a, 0xfe, 0x73, 0xf6, 0xcd, 0x93, 0xbc, 0xa1, 0x47, 0xb4, 0x0e, 0xea, 0x14, 0x6e, 0x4e, 0x9c, 0x5f, 0xb9, 0xd7, 0x96, 0xc1, 0x1f, 0x93, 0xb5, 0x21, 0x16, 0x40, 0x86, 0x9f, 0x96, 0xbb, 0x8c, 0xaa, 0x03, 0xcf, 0xa2, 0x69, 0x9a, 0x5c, 0x0d, 0xa4, 0x52, 0x23, 0x45, 0xe9, 0x9f, 0xaf, 0x01, 0x48, 0x12, 0x2c, 0xab, 0xe0, 0x7c, 0x42, 0xa2, 0xfc, 0xd5, 0xed, 0x60, 0x90, 0x38, 0xbf, 0x93, 0x4a, 0x8d, 0x14, 0x01, 0x00, 0x9c, 0xf3, 0xb6, 0xcf, 0xf4, 0xf4, 0x9c, 0x38, 0x39, 0x96, 0x0d, 0xd5, 0xf7, 0xda, 0x1a, 0xa1, 0x55, 0x7e, 0x01, 0x45, 0x09, 0xe1, 0xcd, 0xa1, 0x89, 0x6a, 0xef, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, }; flamerobin_0.9.3~svn+2220.orig/res/flamerobin.Info.plist.in000066400000000000000000000022361177057155300234710ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable flamerobin CFBundleGetInfoString FlameRobin version VERSION, Copyright 2004-YEAR FlameRobin Team CFBundleIconFile flamerobin.icns CFBundleIdentifier org.flamerobin CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString VERSION, Copyright 2004-YEAR FlameRobin Team CFBundleName FlameRobin CFBundlePackageType APPL CFBundleShortVersionString VERSION CFBundleSignature ???? CFBundleVersion VERSION CSResourcesFileMapped LSRequiresCarbon NSHumanReadableCopyright Copyright 2004-YEAR FlameRobin Team flamerobin_0.9.3~svn+2220.orig/res/flamerobin.desktop000066400000000000000000000003621177057155300225060ustar00rootroot00000000000000[Desktop Entry] Name=FlameRobin GenericName=Database administration tool Comment=Administration Tool for Firebird DBMS Exec=flamerobin Icon=/usr/share/pixmaps/flamerobin.png Type=Application Terminal=false Categories=Development;Database;GTK flamerobin_0.9.3~svn+2220.orig/res/flamerobin.icns000066400000000000000000001525111177057155300217750ustar00rootroot00000000000000icnsÕIics#Hàø?üþþÿÿÿÿÿÿÿÿÿÿÿÿþþ?üøààø?üþþÿÿÿÿÿÿÿÿÿÿÿÿþþ?üøàis32Âʸ¹¹¸Ê… Å»ÇÒÖ×Óɻł ¼ÂÖÞÃc8TÃØÄ¼€&ÅÂÙãëÃ<ÇÛÄÅ»ÖãõíÃ>ï@3GÍ»ÊÇÞêííÃ>€<‡áÊʸÒãî€í Ã>>=ðæÖ¸¹Öæðí ÃÇ=òéÛº¹×æðƒíïõóéÛº¸Óäïííïùðííïñç׸ÊÉßë€í'þþîíîíãËÊ»ØåõíôÿÿõíõçܼÅÄÛåìôÿÿôíçÞÅÅ€ ¼ÄÙáèññéãÜż‚ Å»ÊÖÛÛ×˼Ņʸºº¸Ê‚‚ÜÐÑÑÐÜ… ÙÒÜãææäÝÒÙ‚ ÓØæëÎh;XÎçÙÓ€&ÙØèîlÎ=ÑéÙÙÒæîµÎ#õ@3FÛÒÜÜëòEÎ#€>‰íÞÜÐãîõ€ Î##>öðæÐÑæïè ÎΉ>÷ñéÑÑæðÛƒDSµ÷òéÑÐäîõ7¯DSöðæÐÜÝìóEåå)SôîÞÜÒçïµlòòzµñéÓÙÙéïDlòòl)ÖëÚÙ€ ÓÙèß…””kÓéÚÓ‚ ÙÒÞæééæÞÓÙ…ÜÐÑÑÐÜ‚‚åÜÝÝÜå… ãÞæíïïíçÞã‚ ÞãîòÔk=[ÔïãÞ€&ããðórÔ>ÕñäãÞîó¹$Ô$ø@4HãÞåæòöL$Ô$€>ŒóçåÜíôø€$ Ô$$?ùõîÜÝïõë$ ÔÔŒ?úöðÝÝïõÞƒ$DZ¹úöðÝÜíôø$$ $$ZùõïÜåçò÷L$$"$YøóèåÞïô¹$$¹õñÞããñõK1Ûòä〠ÞäðæŒMMrÙñäÞ‚ ãÞçîððïèÞã…åÜÝÝÜå‚s8mkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿICN#ðþÿÿ€ÿÿÀÿÿàÿÿðÿÿø?ÿÿü?ÿÿüÿÿþÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿþ?ÿÿü?ÿÿüÿÿøÿÿðÿÿàÿÿÀÿÿ€þððþÿÿ€ÿÿÀÿÿàÿÿðÿÿø?ÿÿü?ÿÿüÿÿþÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿþ?ÿÿü?ÿÿüÿÿøÿÿðÿÿàÿÿÀÿÿ€þðil32 <‰ÝÑЀÏÍÙ’ÛÑÏ€ÌÎÎÊÊÇÈÈÒÞÑÍÍÏÕÖ×Ö×ÖÖÓÍÇÄÄÓŠÕÎÍÑÖ×ÙÛÜÚÚ×ÕÎÄÁň ÑÌÏÖØÛÝà⸀q›àÞÛØÔɾ¾† ÑÌÑÖÚÝáäéëtâÞÚÕ̽¼„ ÓËÑ×ÛßãçëííwƒäàÛÖ˺½‚ ÜÌÎÖÛàåèìííîy 0 ®æáÜÕÆ¸›ÍÊÕÚßåéì€íî‹ ÿ¿“l°ÚÓ½²€ÖÉÐØÝãèì‚íÙpP¨#/ÇØÉ¯›ËÉÖÛáçìï‚íò^„‡#ªãÜÒ´¥ÈÎ×Ýäéîïƒíê0ƒyÉëæßÖ¾¥ÑÆÓÙàæìðïƒíîép‚‰ñíèâÚÈ¥…ÇÆÔÚâèíò†íóë€ÈóîéãÜͧ”ÆÆÕÜãéîóˆíòÛ/÷ôïêäÝͦÅÉÖÜäêïò‰íîæËøôðëæÞͨÄÈÖÜäêïò‹íøøõðëæÞ̧‹ÃÃÕÜãéîó‹íðøôïëåÝÉŸˆÁÂÓÛâèíò‚íïòï„íõóïêäÚĘ„¦½ÐÙàçìñîíðþÿ÷ƒíñòíèâÖ»o¼ÈÖÞåêîï‚íøÿÿ÷‚íððëæßΫ…»¿ÓÛâçìï‚íû€ÿïíïíéäÚØ}¦¹ÊÖÞäé‚íòÿ÷íîêæÞЯ…_€µºÐÙàæêíùÿûíëçá׿“x¦°ÀÒÚáæé€íùÿù€íëçâÙÆ¡}_‚ ¯¬ÂÑÛáåèìíóÿ òííêæáÙɪ€w„¤¨¿ÏØßãæêíòùøòíìèäÞ×Ũ‚n†¡´ÉÔÚßâäçééèæâßÙϾž~lˆœ™¥¹ÈÐ×ÛÝÞÞÝÚÕÌÀªŽvrŠuŽ“Ÿ¬»ÂÄÆÅľ³¢Ž{mI o„‡‹’•”ˆ~ulI’ItrqpnlI‰‰éáà€ßÞæ’ çáßÝÞÞßßÝÜÚÚÛâéáÞÞáåææççæåäßÚØØâŠäßÞâæçèéêéèçåáÙÖÙˆáÝàæçéêìíÁwwv£ìëéçåÝÔÔ† àÝâæéêíî†_y¤íëèæàÔÓ„ âÝâçèëîðlRzƒ–ïìéæßÑÔ‚ èÝàæèìïñlS| 0 µðíéåÛбÞÝæéëïò¾€8Œ ÿ¿–m¹éäÒÉ€äÛáçêîñôEÀpP¬,ÒçÛÆ±ÝÜåéíðóÍ‚p_„НîêâÉ»Ûàçêîòõ|ƒ¶0ƒ|ÍóïëæÒºäÙäèìðóöSƒ*¨p‚Œ÷ôñíéÙº“ÚÚåéíñô÷†c¶€Ë÷õòîêÝ»§ÙÚåêîòõøˆU´0 úøõóïëݺ¢ØÜæêïòõ܉*™ÍûøöóïëÜ»ŸØÛæêïòõÏ‹ÒûùöóðëÛº×Øåêîòõø‹TúøöóïêÙ³šÖ×äéíñô÷‚7R7„ÐøõòîçÔª•´ÓâèìðôöEDåò”ƒ˜÷ôñíäË }ÓÜæëïòõn‚¢òò”‚Šöóðëܼ—ÒÕäéíñô²‚½€ò7—ôòîæÒª´ÑÞæëïòô7€Rò”ÌòðêÞÀ—o€ÍÑáçìðò£€¯ò½€7óðìäÏ¥‡ ´ÇÔáèíðòR¯ò¯€½ðíåÕ²o‚ ÅÃÕáèìïäD_ò R¡ðìåØº‘…„¹¾ÒßçëîâyR¯¢R7­îêäÔ¹“|† ±¶ÇÙâèëíÔŸ€…¬íëåÝͯŽzˆ­­¹ÊØàåé€ëêæãÚÏ»Ÿ†Š…¡¦±¿ËÑÔÕÔÒÍòŸ‹{W }•™¡¤¦¥ ™Ž„zW’Wƒ~|zW‰‰ï€è€çì’ íèçæççèèææãääéïèæçëîïîîíéäââéŠêççìïïððñ€ðîêãàãˆèæêïððñòóÆzzy§òòñïîçß߆ èæëîðñóôŒf{¨óòðîéßÞ„ éåëïðòôõs$Y|ƒ™ôòñîéÝß‚ îæéîðòôös$$Y} 0 ¸õóñîåܼææïðòôöÀ$?Ž ÿ¿™p¾ðíÞÔ€ëäëðñôöøL$ÂpP¯ -ØïåÒ¼åæîðóõ÷Ñ‚$u_„Œ ³óñëÕÆäéïñôöøƒ$¸0ƒ}Ð÷õòîÛÅîãíðòõ÷ùZƒ$2«p‚ùøöóðãÅšääîðóöøù†$h¸€ÍúøöôñæÆ±ãäîñóöøúˆ$[¶0 üúù÷ôñåĬâæïñôöù߉$2œÎüûù÷õòåŨâåïñô÷ùÒ‹$Ôüûù÷õòäçáãîñôöøú‹$Züûù÷ôñá¼£áâîðóöøú‚$  „$ÔúøöôîÜ´ž»Þìðòõ÷ùL$ƒ$ùøöóëÓ©„Þçïòô÷øt‚$‚$ù÷õñåÅ Þáíñóõ÷¶‚$ € $œøöôíÚ³•»Üèîòôöø?€$$Ð÷õðæÉ w€ÙÜêïòõ÷¨€$ €$>÷õòë×­ »ÓßêðóõöY$$ €$Âõóìݺ•w‚ ÏÎßéðóôéK$ $$§õòìßšŒ„ÄÉÛçîòóç$ $>³ôðëÜÀ›ƒ† »ÀÑâêïòóÚ¦€Œ³óñìåÕ·–ˆ··ÃÓáèìðñòòñíêã×ħ…Šª°»ÇÔÙÛÝÜÙÕ˺§“‚^ „ž¡§«¬®®©¢–Œ^’^‹ˆ‡†ƒ^‰l8mkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿich#H?üÿÿ€ÿÿðÿÿø?ÿÿþÿÿÿÿÿÿÿÿ€ÿÿÿÿÀÿÿÿÿàÿÿÿÿðÿÿÿÿøÿÿÿÿøÿÿÿÿü?ÿÿÿÿü?ÿÿÿÿüÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿþÿÿÿÿþ?ÿÿÿÿü?ÿÿÿÿüÿÿÿÿøÿÿÿÿøÿÿÿÿðÿÿÿÿðÿÿÿÿàÿÿÿÿÀÿÿÿÿ€ÿÿÿ?ÿÿþÿÿøÿÿàÿÿ€ø?üÿÿ€ÿÿðÿÿø?ÿÿþÿÿÿÿÿÿÿÿ€ÿÿÿÿÀÿÿÿÿàÿÿÿÿðÿÿÿÿøÿÿÿÿøÿÿÿÿü?ÿÿÿÿü?ÿÿÿÿüÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿþÿÿÿÿþ?ÿÿÿÿü?ÿÿÿÿüÿÿÿÿøÿÿÿÿøÿÿÿÿðÿÿÿÿðÿÿÿÿàÿÿÿÿÀÿÿÿÿ€ÿÿÿ?ÿÿþÿÿøÿÿàÿÿ€øih32¹ÅÌÌËÊÊ€ÉÈÈÞÇÍËËÉÈÇ€ÆÅ€ÆÅ™ËÍËÊÈÉÌÏÐÓÔÔÓÐÎÊǂú” ËÍËÉÉÎÓÕÖÖƒ× ÖÖÔÓÌÅÁÁÂÁ’ÍÌÊÉÏÕÖ×€ÙÚ‚ÛÚÙØ×ÖÔÏÄ€ÀºŽÅÍËÈÍÕÖØÙÚÜÜÞÞßßàßßÞÝÜÛÙ×ÕÓÌÀ¿¿¼ŒÅÌÊÊÑÕ×ÙÛÜÞàáãä«€rqªâáßÝÛÚ×ÕÑĽ½»ŠÅÌÉÉÓÖØÚÜÞáãäçéçƒ rÖâàÝÛÙÕÒǼ¼ºˆÁËÉËÕ×ÙÛÝàãåçëíìÍ… ºäâßÜÙÖÒÈ»»¸‡ ËÉÉÔÖÙÜÞâäæèì€í³‡ æãàÝÚ×ÒÆº¹´… ËÉÇÓ×ÙÝßâåçêí﵇ ½æäáÝÚÕÑÁ¹¸¬ƒ ÃÊÆÏÕÙÜßãåèëìíïô„pp,êçåáÝÙÕλ·µƒ ÊÇÊÕ×ÛÞâåèëƒíî÷‚@ÿÿ@“ HœÕÜØÓɶ³­ ÅÈÆÒÖÚÝáåèë…í÷^‚ ïï -à##/ŒÛÖм²¯ ÈÆËÕØÜàäçêíï„íô¼‰ ßV#;ÖÞÙÓɱ®€ »ÇÄÒ×ÚÞâæéìïî„íïú?ˆ´|0ÃåàÜÖͶ¬©ÇÆÈÔØÛàäèëîñ†íõÞ‡¶–ÇêæãÞØÐ¿¬§ÆÄÍÕÙÝâæêíïñ‡íøÏ†·ñîëèåàÛÓǬ¦µÅÃÑÖÛßäçëîñðˆíøï`…·óïíéæâÝÔɲ¦¼ÄÄÓØÛàåèìïòï‰íóý߀‚çôñîêçãÞÖ˵¥ŸÂÃÇÔØÜáæéíðóî‹íôüïp€.÷ôòîëèäß×̺¤ÃÂÈÔÙÝâæêíñôŽíóý¾œ÷õòïìèåàÙͼ¤ÃÁÈÕÙÞãçëîñôíî÷ì^ú÷õóïíéåáÙÎÀ¢›ÂÁËÔÚÞãçëîñô‘íöûúøöóðíéåáÙξ¡™ÁÀÊÔÙÞãçëîñô’íöúøöóðíéåáØÍ½Ÿ—Á¿ÇÔÙÞãæêîñô’íîù÷õóïìéåàØËº”À¿ÇÓÙÝâæêíñô“íò÷õòïìèåàØÈ³š‘»¾ÂÒØÜáåéíðóî’íî÷ôòîëèäÞÕÅ®—޵½¾ÑÖÛàåèìïòï„íóÿÿùð‡íôôñîêçãÝÑÁ§”Œ¯¼¼ÍÕÚßäçëîñð…íø€ÿô†íòóïíéæâÚͼž¼»ÆÓØÝâæéíïñ…íòÿó…íòñîëèäßÖȳ•Œ¹»¾ÑÖÛàäèëîð…íòÿþî„íñïíêæãÜÐÁ§ˆ¯º¹ËÓÙÝâæéìïî„íö‚ÿö„í ïîëèäßØÊ¸˜‹~€ ¹¹ÀÐÖÛàäçêíîƒíïþ‚ÿý„í îìéæâÛЧ… ²··ÉÒ×Ýáåèë„íø„ÿïƒí ìéæãÞÕÉ·–ˆ~‚ µµ¹ÎÓÙÞâåèëƒíû„ÿò‚í ìêçäßØÍ½¡‹‚ƒ «²²¾ÎÔÚßâåèêìíû„ÿðí ìéçäàÚÐÁ«Žƒ{„ ©¯°ÂÎÔÚßâåçéì€íøƒÿýí ìéæäàÚÑñ“…}†«¬¯ÂÍÔÚÝáäæèìííîüÿþò€í ìçåãßÚÐó–…}i‡¨©­ÀËÓØÜàãåæêííîøüýùð€í êæäáÝ×Ïò˜…}q‰¥¦©¼ÇÏÖÚÝàãäæêìƒí êæäâßÚÓʾ¯“…|q‹¡¢¥²ÃËÑ×ÚÝßáâã䀿åãâßÞÚÕÍĸ¦ƒ{q  §¸ÁÈÏÓØÙÜÝÞ€ß ÝÜÚÖÑÌĺ¯šˆ€ym ”™›¨´¾ÃÈÌÏÐ€Ò ÑÐÍÊľ·­œŒƒ|wd’ ••—š ©²¸»½€¾ ½»¸³®¤—‹„~yo–’”•™œ¡¢¤¤ ž™“Œˆƒ~yqš‡Š‹‹€Œ ‹‹‰ˆ…‚{yjŸ s|€~}{xoÕ€ÝÜÜ‚ÛÕžØÞÝÜÛÛÚÚ‡Ù™ ÛÞÝÜÛÜÞáâä€åâáÝÛ××€ØÍ” ÜÞÝÛÜàäææçæ‚ç€æäßÙÖ’ÞÝÜÜà€æèèƒéèéèçææåâÙ€ÕÎŽ ÕÞÜÛßææçèééêëëìëëê€éçååàÖÔÔÒŒÕÝÜÜãæçèéêëìíîî³w ²ííëêéèçåãÙÔÔÑŠÕÝÛÛäæçéêëíîﺆñƒ wßíìêéçæäÛÓÓЈÑÝÛÞåæèéêìîïãl_Ô… ÃïíìêèæäÜÒÒχÝÛÛäæèéëíïðäDˆ¸‡ –ðîìêèæäÛÑÑË… ÝÛÚäæèéìíïñòD€|¹‡ Äðîíêèæã×Ðпƒ ÔÜÚáæçéëíðñózSø„pp.òðïíêèåáÒÏ̓ ÜÚÞåçèëíðñó¾‚8ú‚@ÿÿ@˜£F ßêçäÝÎÊ ÖÛÙäæéêíïñóôRƒß^‚ ïï .æ,’éæâÒÉÅ ÛÙÞæçéìîñóô¿„Œ½‰ æT9àëèäÜÈÅ€ ÍÚØäçéëíðòôõn„8ï?ˆ¸},ÊïìéæßÌÿÚÙÜæçéìïñóõö*…߇¹˜ÌòðîëçàÓÂ½ÚØßæèêíðòôöÀ‡ªÏ†º÷õóñïìéâÙ¼ÇÙ×ãæèëîñóõöŠˆªï`…ºøöôòðíêãÚÆ¼ÎØÙåçéìïñóö÷a‰cã߀‚êøöõóðîëåÛʺ´Õ×ÛåèêíïòôöøE‹qÔïp€/úø÷õóñîìæÜ͹²ØÖÜåèêíðòôöøŽcã¿úù÷öóñïìçÝι±×ÖÜæèëîðóõ÷ø*©í_üúùøöôòïìçÝѸ¯×ÖÞåèëîðóõ÷ø‘©ýüúùøöôòïíçÝ϶­ÖÕÝåèëîðóõ÷ø’©üúùøöôòïíæÜÏ´ªÖÕÛåçêíðóõ÷ø’*îúùøöôòïìåÚ˲§ÕÔÛäçêíðòôöø“~úù÷öóñïì娯¯¤ÐÔØäçêíïòôöøE’*úø÷õóñîëãÕÀª¡ÈÔÕãæéìïñóõ÷a„_òò¯D‡Ðøöõóðîêàк§žÂÓÒàåèëîñóõöŠ…¢€òl†Á÷öôòðíçÜ̱¢ÓÒÚåçêíðòôöÀ…Rò_…Á÷õóñïëä×Ä©žÐÒÔâæéìïñóõö*„Ròå)„Àöôòðîéßй£™ÂÑÑßäèêíðòôõn„‡‚ò‡„ ¿õóñïëäØÇªŽ€ ÑÐÖãæéìîðòô¿ƒ7å‚òׄ õóòðíèßѹ¢— ÈÏÏÝãçêíïñóôR‚¢„ò7‚ `óòðîëãØÇ©™‚ ÍÍÐßãçëíïñóË‚½„òR‚ ½òðîëåÛÌ´“ƒ ¿ÉÉÓßäèëíïñóz½„òD _òðîìæÞм¡”‹„ ¾ÅÇÖàäèëíïñòR€¢ƒò× DäðîëæßÒÁ¥–†ÁÃÆÕÞãèêíïðäQ)ÊòåR€ DãïîëæßÒĨ—v‡¾¿ÃÓÜáæéìîïð†)¢ÊׯD€ kâîìéäÝѪ—‰º¼¿ÏØàäçêìíïÕy7‚)kÇîíëæâÙξ¥–Œ€‹¶·ºÆÕÛáäçêìííî်ÔîíëêæãÜÓÈ· ”‹²²µ¼ÊÒØÝâåæéêëììëêéæäßÚÓɾ«š‰{¨­¯²»ÆÏÓ×ÚÝßààáßÞÜÙÓÎÆ½®ž”Œ‡q’¨©ª®´¼ÄÉËÌÎÎÍÌÊÇþ´©•ˆ~–££¥§©¬¯´´µµ²¯ª¥ž™”މš™œ€ž ›™—“‹ˆyŸ ‚Œ‘Ž‹ˆ~ÝææåäÞžáææååää€ã€â‚ã™ äæååäåçêìí€îëêèåáá€âÖ”äæåäåéìïî„ïîïîíéäá’ çæååéïîîïðñðð€ñðïîíìä€àØŽÞæåäè€ïðð€ñ„òññ€ðîíêáßßÜŒÝæåæìîïððñòòóóô·z ·óóòññðïîìäßßÛŠÝæååíïððñòóóôÀŒöƒ zåóòññïîíæÞÞÛˆÚæäçîîðññòóôès$fØ… ÇôóòñðîíçÝÝÛ‡æäåîîðñòóôõéK$$Žº‡ ™õôòñðïìæÝÝÕ… ååäíîðñòóôö÷L€$»‡ ÈõôóñðîìâÜÜɃ Üåãêïðñòóõö÷€$Zú„pp.öõôóñðîëÞÛÙƒ åäçîïðòóõö÷Â$?ü ‚@ÿÿ@š¦H¤åñðíèÙÖÌ ßäãíîðñóôö÷øYƒ$á_‚ ïï /ê -–ñïëÝÕÑ äãçîðñòôõ÷øÃ„$‘¾‰ éV ;æòðíæÓЀ Öãâíîðòóõöøùt„$?ï?ˆ»-Îôòñîç×ÎÊäãåîðñòôö÷øù1…$’߇»šÏ÷õóòïéÞÍÈãâéîðñóõöøùć$­Ï†¼ùø÷öôòñëãÍÆÏâáìïðòôõ÷øùˆ$­ï`…¼úùøöõóñëäÑÆØâãîïñòôö÷ùúg‰$hä߀‚ìúùø÷õóòíäÔÅ¿ßáåíðñóõöøùúL‹$vÖïp€/üúùø÷öôòíå×ļâáæîïñóõ÷øùúŽ$h俞üûúù÷öôòïåØÄ»ááçîðòóõ÷øùú$2­î_ýüûúùøöõóïæÚ¹áàèîðòôõ÷øùú‘$¬ýýüüúùøöõóïæÙÀ·áàçîðòôõ÷øùú’$¬ýüüúùøöõóîåØ¿´ààæîðñóõ÷øùú’$2ïüûúùøöõóíãÔ¼±àßåîïñóõ÷øùú“$ƒüûúù÷öôòíàϹ­ÛßãíïñóõöøùúL’$2üúùø÷öôñêÝÊ´ªÒßàíîñòôö÷øúg„$ ‡$Óúùø÷õóñèÙñ§ËÞÞêîðòôõ÷øù…$€†$ÅúùøöõóîäÕ»¬˜ÞÞæíðñóõöøùÄ…$…$Åùø÷öôñëÞͳ§ÛÝàìïñòôö÷øù1„$"„$Äùø÷õóïçÙ­¢ÌÝÝéíðñóõö÷øt„$‚„$ Äø÷öôñìáÏ´¦–€ ÜÜâìïñòôõ÷øÃƒ$ ‚„$ ø÷öõóîçÙ«  ÒÛÛèìïñóôö÷øY‚$„ ‚$ f÷öõôñêàβ¢–‚ ÙÙÜéìïòóõö÷Ђ$ „‚$ ÂöõôñìäÔ½§›ƒ ÉÔÕßèíðòóõö÷€$ „$ föõôòíæÙĪ“„ ÊÑÓáèìðòóôõöY€$ƒ$ KéõôñíçÚɯŸ•†ÌÎÑàæëðñóôõéY$$"€$ KèõóñíçÚ̲ •}‡ÉÊÎÝåêîðòóôõ$$" €$ rèôòðëåÙʳ •ˆ‰ÅÆÊÙâçìïñòóôÚ>‚$1rÍôóñíèàÖÆ¯Ÿ”‡‹ÀÁÅÐÝäèìïðòóóôç€ÀÚóóññíêäÚп©œ“† ¼¼ÀÇÔÛáæéíîðñò ñïíëçãÚÑÆ´£™‘‚ ²·¹¼ÆÏ×Ûßãåç€è çæäàÛÖÎŶ§”Žw’²³´¸¾ÆÍÑÓÔÖÖÕÔÒÏÌÆ½²¦ž—…–­­®±³¶¸½€¾ »¸´¯§¢œ–‘‡š¢¥¦‚§¦¤¢ ›˜”Ÿ Š”š˜˜–•”…h8mk ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿit32dÑÿ³¢¢±‡µ±ž¢ç›±‹µ‡´¯™Ý›±··„µƒ´Ž³¯™Ö¨€·‚µ€´³–²¢Ñ¹··‚µ´´³³²‚±†°„±†²Ì¨€·€µ´´³³€²±±°Œ¯„°†±¢Ç¯··µ´³³²²±±°°¯°µ¸¸¿¿Á…ÂÁ¿¿¸·´°‚¯‚°ƒ±§Ã¯··€µ ´´³²²±°°¯²¸¼Á€ĀƅǀÆÄÁº·±­¯†°§¿¢··€µ ´³³²±°°¯·ºÁ€ÄƃLJȃÇÆÆÄÂÁºµ­­¯„°ž¼€·µµ´³²²±°°²ºÂÄÄÆ€Ç€ÈÉÉʃËÊ€ÉÈÈ€ÇÆÄº±­­¯ƒ°¹¯··µµ´³²²±°°·¿ÄÄÆ€ÇÈÉÉÊËˀ͉΀ÍËËÊÊÉÈÈÇÇÄÄ¿´¯­­…¯¤¶··€µ ´³²±°°¸ÂÄÆ€ÇÈÉÊËËÍ€ÎÏÏ‹ÐÏÏ€ÎÍÍËÊÉÈÈÇÇÄĸ¯­­…¯³¨··µµ´³²±°°¸ÂÄÆÇÇÈÉÊËÍÍÎÏÏÐЀтÓÔ‚Ó€ÑÐÐÏÏÎÍÍËÊÉÈÇÇÄÄÁ¸¯€­ƒ¯¢°³·€µ³²±°°·ÂÄÆÇÇÈÉËÍÍÎÏÐÐÑÑÓÓÔÔ‚ÕƒÖƒÕÔ€ÓÑÐÐÏÎÍÍËÊÉÇÇÄÄÁ´¬­¯¨®··µµ´³²±°²¿ÄÆÇÇÈÊËÍÎÏÏÐÑÓÓÔ€ÕÖ‰×Ö€ÕÔÓÓÑÐÐÏÎÍËÊÉÇÇÄﱬ…­¬··µµ´²±°¯¸ÄÄÇÇÈÊËÍÎÏÐÑÓÓÔÕÕÖÖ€×ØØŒÚØ€×ÖÖÕÕÔÓÓÑÐÏÎÍËÊÉÇÇÄ·¬¬„­© ¢·µµ´³²±°²¿ÄÆÈÈÉËÍÎÏÐÑÓÔÕÕÖÖ×רÚÚ€Û‚Ü݂܀ÛÚÚØØ×ÖÖÕÕÔÓÑÐÏÎÍËÊÈÇÇÄ¿±¬¬‚­¬›¦!¨·µµ´³²±°·ÂÄÇÇÉÊÍÎÏÐÑÓÔÕÕÖרØÚÛÛÜ܀݂Þཀœ½€Þ€ÝÜÜÛÛÚÚØ×ÖÖÕÔÓÑÐÏÎÍËÉÈÇÄÁµ…¬Ÿ¤ ¨·µµ´³²°¯ºÄÆÈÈÊËÍÎÐÑÓÔÕÖÖרÚÛÛÜÝÝ€Þàe+„+PÏÝÞÝÝÜÛÛÚØ×ÖÖÕÔÓÑÐÏÎËÊÈÇĺ…¬ž¢ ¨·µµ´²±°°¿ÄÇÇÈÊÍÎÏÐÓÔÕÖÖרÚÛÜÝÝÞÞ€à€áಌ9àÞÞÝÝÜÛÚØØ×ÖÕÔÓÑÏÎÍËÉÇÇÄ¿¯„¬ž ¢€µ´²±°±¿ÄÇÇÉËÍÎÐÑÓÕÕÖרÚÛÜÝÞÞ€àááæéâããgŽeÏàÞÞÝÜÛÚØ×ÖÖÕÔÑÐÏÎËÉÈÇÄ¿¯‚¬««™Ÿ€µ´²±°²ÂÄÇÈÉËÎÏÐÓÔÕÖרÚÛÜÝÞ€àááâæ€éääéPo€àÞÝÜÛÚØ×ÖÕÔÓÑÏÎÍÊÈÇÄÁ°¬€«ž€µ´²±°²ÂÄÇÈÊÍÎÏÑÓÔÕÖ×ÚÛÜÝÞ€àááâãéêæçç-’²€àÞÝÜÛÚØÖÖÕÓÑÐÎÍÊÈÇÄÁ°€¬€«¨œ€µ´²±°²ÂÄÇÈÊÍÎÐÑÔÕÖרÚÛÝÞààááâããç‚éìçèè+“ááààÞÝÜÚØ×ÖÕÔÑÐÎÍÊÉÇÄÁ°€«¬¨¨§š!±µµ´²±°±ÂÄÇÈÊÍÎÐÑÔÕÖ×ÚÛÜÝÞààáâããäèƒéì€é+•PãááàÞÝÜÛÚØÖÕÔÓÐÏÍËÉÇÄÁ¯«¨§ ˜ ¨µµ´³±°°¿ÄÇÈÊÍÎÐÓÔÕÖØÚÛÜÞààááâãäè…éì€ê–GãâáààÞÝÜÚØ×ÕÔÓÐÏÍËÉÇÄ¿¬€«¨§£–—µµ´³²°¯¿ÄÇÈÊÍÎÐÓÔÕÖØÚÜÝÞààáâãääè†éììíí—GââááàÞÝÜÛØ×ÖÕÓÐÏÍÊÈÇÄ¿€«¨§£ –µµ´³²°¯ºÄÇÈÊÍÎÐÓÔÕרÚÜÝÞàááãääæç‡éìííì-˜PäãâáààÞÜÛÚ×ÖÕÓÐÏÍÊÈÇĺ««¨§¤ ž” ªµµ³²±°´ÄÇÇÉÍÎÐÓÔÕרÛÜÝààáâãäæççè‡éìïïð-™äãâáààÞÜÛÚ×ÖÕÓÐÎÍÊÈÇ´«¨¨¤ ž–“µµ´²±°²ÂÆÇÉËÎÐÑÔÕרÛÜÞààáâã俀çˆéì€ð-™ÆääãááàÞÜÛÚ×ÖÕÓÐÎÍÊÇÇÁ°¨¨¤¢ž›’µµ´³²°¯¿ÄÇÈËÎÏÑÔÕÖØÛÜÞààáâääççèŠéê€òGš+çääãááàÞÜÛÚ×ÕÔÑÐÎËÉÇÄ¿«¨§£Ÿ›˜¢µ´³²±¯¸ÄÇÈÊÍÏÑÔÕÖØÚÜÞààáãääççèè‹éòòõeŽ ŽÿÿÖ9„çæäãááàÞÜÛØ×ÕÔÑÏÎËÈÇÄ´¨¨¤ ›˜Šµ´´²±°²ÄÆÇÊÍÎÐÓÕÖØÚÜÝààáãäæççééí‹éôõõœŽŽÿèƒèçæŸPœààÞÜÛØÖÕÔÑÏÍÊÈÇ­¨¤ ›˜–Žªµ´³²°¯¿ÄÇÉËÎÐÓÕÖ×ÚÜÝààáãäæççéóõôÖŽƒÿo„†èçã+eÆÞÜÚØÖÕÓÐÎÍÉÇ娧¢ž˜–޵´³²±¯´ÄÇÈÊÍÏÑÔÕ×ÚÛÝÞàáâäæççééêêŒéï€õƒÿo„éèçG†ÝÚ×ÖÔÑÐÎËÈDZ¨£Ÿ›–’Œª´´²±°°ÂÆÇÉÍÎÐÓÕÖØÛÜÞàáâääçç€éïéïõùùG­‚ÿ-…²ééÆƒe½×ÕÔÑÏÍÊÈÄ¿¨¤ ›–’Š‹´´³²°¯¸ÄÇÈËÎÐÓÕÖ×ÚÜÞàáâãäççééêìêŽé€ùœ è€ÿކGêéè9„½ÖÕÓÐÎËÉdz§¢›–’Ѝ´³²±°°ÂÆÇÊÍÏÑÔÕ×ÚÛÝààáãäççééêìïéô€ù  [o ‡êêéeƒ­Ú×ÖÔÑÏÍÊÈÄ¿¨£ž˜’…‰´´³²°¯¸ÄÇÈËÎÐÓÕÖØÛÝÞàáãäæçèéêìíêéï€ùoœ²ì韃ŽÛÛØ×ÕÓÑÎÍÉÇÁ²¤ ™’‰´³²±°°ÂÆÇÊÍÏÑÔÖ×ÚÜÞàáâäæçèéêììð‘éûùùè ›†ìêÛ‚àÞÜÚØÖÔÑÏÎÊÈļ§ ›–Šˆ´³³²°¯´ÄÇÈËÎÐÓÕÖØÛÝààáãäççéêê€í‘éð€ùo›[êìê€[âáàÝÜÚ×ÕÔÑÎÍÉÆÁ­£›–‘Ї‡´³²±°¯¿ÆÇÉÍÏÑÔÖ×ÚÜÞàáãäæçééêííî“éûùùèš+ííèG[äãáàÞÜÛØÖÕÑÏÍÊÈÁ¸¤ž™‘Ї†£³²²°¯±ÄÇÈËÎÐÓÕÖØÛÝàáâãäçèéêìíîô“éðùÿÿ­šïíìG9ææäâáàÞÜÚ×ÕÓÐÎËÉÄÀª ™’……³³²±°¯ºÄÇÉÍÏÑÔÕ×ÚÜÞàáãäæçéêêííïì”éóÿÿùošïîîo9ÛççäãáàÞÜÛØÖÔÑÏÍÊÄÁ³ ›’…ƒ…³²²±°¯ÂÆÇÊÍÏÓÕÖØÛÝàáâãæçèéêìíîð•éíÿP™ðïíœÛéèçæäâáàÝÛÚÖÕÓÐÎËÈý£›–އ‚„™³²±°¯µÂÇÈËÎÐÓÕ×ÚÜÞàáãäæçéêìíîïï–éí€ÿùP˜ððîîìêéèçäãáàÞÜÚ×ÕÔÑÎËÉÃÀ¨ž–‡‚wƒ¯²²±°¯ºÄÇÉÍÏÑÔÖØÛÝÞàáãäçèéêííïðì—éõÿG—òðïííêéèçæäâáàÝÛØÖÕÓÏÍÊÄÀ±Ÿ™‡‚}ƒ€²°¯¯ÁÆÇÊÍÐÓÕÖØÛÝàáâäæçéêêíîððê˜éõÿŽ ” òððîíìêéççäãáàÞÜÚ×ÕÓÐÎËÇÄ· ™‘‡‚ƒ³²±°¯±ÄÇÈËÎÐÓÕ×ÚÜÞàáãäçèéêìíîðòšéõÿÖ-“ -òòðïííêéèçäãáàÞÜÚ×ÖÔÑÎËÈĽ¤›’Š‚}‚™²²±°¯·ÄÇÉÍÏÑÔÖØÛÝÞàâãæçèéêííïðï›éï‚ÿŸ‘!9ôòððîíìêéçæäâáàÝÛØÖÕÑÏÍÉÄ¿¯›’Š‚}s¯²±°°¯ºÄÇÉÍÏÑÕÖØÛÝàáâäæçéêìíîðòïœéïû‚ÿŸ-!eõòòðïíìêéèçäãáàÞÜÚ×ÕÓÐÎÊÆÀ±›–Š‚}w²²±°¯­ÁÆÈÊÎÐÓÕ×ÚÜÞàáãäçèéêííïðòìžéôƒÿÖ[ Œ!­õòòðïííêéèçäãáàÞÜÚ×ÕÓÐÎËÇÁµž–ƒ|w²±±°¯¯ÂÇÈËÎÐÓÕ×ÚÜÞàáãäçèéêííïðòêŸéîúƒÿèo Š!èôôòððîíìêéçæäâáÞÝÛ×ÖÔÑÎËÈÁ» –Žƒ|v²±°°¯´ÂÇÈËÎÑÔÖ×ÛÝÞáâäæçéêìíîðòò¢éïïƒÿè[ˆ"9õõôòòðïíìêéçæäâáàÝÛØÖÕÑÏÍÈĽ¤™Ž…|v²±°¯¯·ÄÇÉÍÏÑÔÖØÛÝàáâäæçéêìíïðòò¤éíõû‚ÿÖ-††€õòòðïííêéèçäãáàÝÛÚÖÕÓÏÍÉĽ§˜…|v€ž±±°¯­¸ÄÇÉÍÏÑÕÖÚÛÝàáãäçèéêííïðòï§éðûÿù ƒ è€õAôòððîíêéèçäãáàÞÜÚ×ÕÓÐÎÊÄÀª˜…|tnž±°°¯­¼ÆÇÊÍÐÓÕÖÚÜÞàáãäçèéêíîððòï©éðû€ÿùÖ ‚Gù€õ"ôòòðîíêêéçæãáàÞÜÚ×ÕÓÐÎÊÆÀ±™…|sn¯€°¯­¼ÄÇÊÎÐÓÕ×ÚÜÞàáãäçèêêíîðòòï«éôÿèGÖù€õ!ôòòðîíìêéçæäâàÞÜÚ×ÕÓÐÎËÆÀ³™…yrn€°¯¯­ÁÄÈÊÎÐÓÕ×ÚÜÞàáãæçéêìíîðòòð¬é ïûÿÿùÿoGùùõ òòðïíìêéçæäâáàÝÛ×ÖÔÑÎËÄÁ³™…yqm€°¯¯­ÂÇÈËÎÐÓÕ×ÚÜÞàâäæçéêìíîðòðð®é ïÿÿùùŽ èùùõ òòðïíìêéçæäâáàÝÛØÖÔÑÎËÄÁ·™…yql€°¯­­ÂÇÈËÎÐÓÖ×ÚÜàáâäæçéêìíïðòòð¯éïÿ€ùè€ùõ òòðïíìêéèæäâáàÝÛØÖÔÑÏÍÄÁ·™ƒxpk€°¯­­ÂÇÈËÎÐÔÖ×ÚÝàáâäæçéêìíïðòòí°éï…ù€õ@ôòðïííêéèçäâáàÝÛØÖÔÑÏÍÇÁ·™‚wnj°°¯¯­¬ÂÇÈËÎÐÔÖ×ÚÝàáâäæçéêìíïðòòê±éï„ù€õ@ôòðïííêéèçäâáàÝÛØÖÕÑÏÍÇÁ·™‚vmi°°¯¯­¬ÂÇÈËÎÐÔÖ×ÚÝàáâäæçéêìíïðòòê²éïƒù€õ@ôòðïííêéèçäâáàÝÛØÖÕÑÏÍÇÀ·˜Ž‚vmi°°¯¯­¬ÂÇÈËÎÐÔÖ×ÚÝàáâäæçéêìíïðòòê³éõ‚ù€õ!ôòðïííêéèçäâáàÝÛØÖÔÑÏÍÇÀ·˜Ž€vlg°€¯­¬ÂÇÈËÎÐÔÖ×ÚÜàáâäæçéêìíïðòòí´éóù€õ ôòðïíìêéèçäâáàÝÛØÖÔÑÏÍÇÀ·™€tlg¯­¬ÂÇÈËÎÐÓÕ×ÚÜÞáâäæçéêìíïðòòð´éí€ùõ òòðïíìêéçæäâáàÝÛØÖÔÑÏËÄÀ·–Šsje€¯­­¬¿ÇÈÊÎÐÓÕ×ÚÜÞàâäæçéêìíîðòððµéðùùõ@òòðïíìêéçæäâáàÝÛ×ÖÔÑÎËÆÀ¯–Š}qic¨°¯­­¬¼ÄÈÊÎÐÓÕ×ÚÜÞàáãæçéêêíîðòòì¶éúù€õAôòòðîíìêéçæäâáÞÜÚ×ÖÔÐÎÊĽ¯–‡|pgc›¯¯­­¬¼ÄÇÊÍÐÓÕ×ÚÜÞàáãäçèéêíîððòï¶éïù€õ#ôòòðîíìêéçæãâàÞÜÚ×ÕÓÐÎÉĽª’…ymec›¯€­¬·ÄÇÊÍÏÓÕÖÚÛÝàáãäçèéêííïðòï·é#ûôõõôòððîíêéèçäãáàÞÜÚ×ÕÓÐÎÉÄ»¨‘…vlca€­¬´ÄÇÉÍÏÑÕÖØÛÝàáâäççéêìíïðòï·éõòòðïííêéèçäãáàÞÛÚÖÕÓÏÍÉù¢‚tjc€­¬¬²ÂÇÉËÏÑÔÖØÛÝàáâäæçéêìíîðòò·é"êõõôòòðïíìêéççäâáàÝÛØÖÕÑÏÍÇÁ·žrg`€­¬¬¯ÂÇÈËÎÐÔÕ×ÚÜÞàâãæçèéêíîððò¸é!ûõôòòðîíìêéçæäâáàÝÛØÖÔÑÏÍÆÀ³–Š}pe_­­¬¿ÄÈÊÎÐÓÕ×ÚÜÞàáãäçèéêííïðòê‘éïþ€ÿþöòêšéô€òðïííêéèçæãáàÞÜÚ×ÕÔÐÎÊÆ½¯’…ymc^¨‚¬ºÄÇÊÍÏÓÕÖØÛÝàáâäççéêìíîðòì’éòƒÿþôê˜é!ðôòòðïííêéèçäãáàÞÜÚ×ÕÓÐÎÉÄ»¨‘ƒvja^–‚¬´ÄÇÉÍÏÑÔÖØÛÝÞàâäæçéêêíîððï“éö„ÿýí—é!ïòòððîíìêéçæäâáàÝÛØÖÕÓÏÍÈù¢Ž€sg_`‚‚¬°ÂÇÈËÎÐÔÕ×ÚÜÞàáãäçèéêííïðï“éì†ÿò–é êòòðïííêéèçæãâàÞÝÛØÖÔÑÏÍÆÀ·™Š}ne^ƒƒ¬¿ÄÈÊÎÐÓÕÖÚÛÝàáâäæçéêìíîðð”éö†ÿò–éòòðîíìêéèçäãáàÞÜÚ×ÕÓÐÎÉĽ¯’…xla]ƒª‚¬ºÄÇÉÍÏÑÔÖØÛÝÞàâãæçèéêííïðê“éï‡ÿò•éòðïííêêéçæäâáàÝÛØÖÕÓÐÍÈù¨‚ti_]ƒ–¬«²ÂÇÉËÎÑÔÕ×ÚÜÞàáãäççéêìíîðì”éˆÿï”éððîíìêéèçäãáàÞÜÚ×ÖÔÑÏÍÆÀ·›Š}pe]^„ƒ«ÁÄÈÊÎÐÓÕÖØÛÝàáâäæçèéêííîó”éˆÿþì“éðïííêêéçæäâáàÞÜÚ×ÕÓÐÎÉĽ¯’…xla\…ƒ«ºÄÇÉÍÏÑÔÖ×ÚÜÞàáãäççéêìííï”é‰ÿú“éðîíìêéèçäãáàÞÝÛØÖÕÑÏÍÈù¨Ž€sg_Z…ž‚«°ÂÇÈËÎÐÓÕ×ÚÛÝàáâäæçèéêìíîì“éŠÿò’éîííêééçæäâáàÞÜÚ×ÕÔÑÎÊÆ½·˜Š}nc]\†€¨€«¿ÄÇÊÍÏÑÔÖØÚÜÞàáãäæçéêêííï’éïŠÿþêéêííêêéççäãáàÞÝÛØÖÕÓÐÎÈûª‘…vjaZ‡§€¨««´ÂÇÉËÎÐÓÕ×ÚÛÝàáâãäçèéêìíí’éô‹ÿòéííìêéèçæäâáàÞÜÚ×ÕÔÑÏËÆÀ·žŠqg^Yˆ¤§€¨¬ÁÄÈÊÍÏÑÔÖ×ÚÜÞàáâäæçèéêìíìéêþ‹ÿýéïêêééçæäãáàÞÝÛØÖÕÓÐÎÉû¯•…xlaZ‰£¤¤€¨´ÄÇÉËÎÐÓÕÖØÛÝÞàáãäæçééêìðéöÿïéêêéççäãâáàÝÛÚ×ÕÔÑÏËÆÀ·¢rg^Y‰–¢£¤§¨«¿ÄÈÊÍÏÑÔÖ×ÚÜÝàáâãäççéêêììŽéòŽÿôéêêéèçæäâáàÞÜÚØÖÕÓÐÎÈû¯•…ymc\\Š  £¤§¨´ÂÇÉËÎÐÓÕÖØÚÜÞàáâäæçèéêéïéêþŽÿýŽéèêéèçæäãáàÞÝÛØÖÕÓÑÎËÆÀ·¢rg^Y‹–ž £¤¨«¿ÃÇÊÍÏÑÔÕ×ÚÛÝÞàáãäæçèé€êŒéôÿêéïèèçæäãáààÝÜÚ×ÖÔÑÏÍÈû¯’…xlc\ZŒ›ž £¤¨±ÁÄÈËÎÐÑÔÖ×ÚÜÝààáãäæçèéêéýÿïŽéèçæäãâáàÞÜÚØÖÕÓÐÎÊĽ·›Šqg^Y’››Ÿ£¤¨¸ÃÇÉÍÎÐÓÕÖØÚÜÞàááãäæçèéêèŠéì‘ÿïŒéçèçæäãâáàÞÜÛØÖÕÓÑÏËÈÁ¹¨ƒwkaZZŽ˜™›Ÿ£¤«¿ÄÈÊÍÏÑÓÕÖØÛÜÞàááãäæçèéèŠéï‘ÿïŒéèçæäãâáàÞÝÛÚ×ÕÔÑÏÍÈû³™‡|ne]YŠ–˜›Ÿ£§±ÁÄÈËÎÏÑÔÕרÛÜÞàááãäæççéç‰éï‘ÿï‹éççæäãâáàÞÝÛÚ×ÖÔÓÐÎÊÄÀ·¢€si_Y\––˜› £§ºÁÄÉËÎÐÑÔÕ×ÚÛÜÞàááãäæççèêˆéï‘ÿïŠéêçæäãâáàÞÝÛÚ×ÖÕÓÐÎËÈÀ·«…xlc\X’’–™› £¨ÀÂÄÊÍÎÐÓÕÖ×ÚÛÜÞàááãääççèˆéì‘ÿêŠéãçäãâáàÞÝÛÚ×ÖÕÓÐÏËÈû¯–‡|pe^Y“’–™› £­ÀÃÇÊÍÎÐÓÕÖ×ÚÛÜÞààáâãäææ‰éýÿýŠéçääãááàÞÝÛÚ×ÖÕÓÑÏËÈý³›Šsi_ZY”‘’™› ¤³ÀÃÇÊÍÏÐÓÕÖ×ÚÛÜÞààáâãääçç‡éôÿò‰éèäãâáààÞÝÛÚ×ÖÕÔÑÏÍÈĽ·¢Ž‚vlc\X–Ž’–› ¤·ÀÄÇÊÍÏÐÓÕÖרÛÜÝÞàááããäæç†éêþÿý‰éèäãâáààÞÜÛÚ×ÖÕÔÑÏÎÉÄÀ·¨…xmc]Y— …’–› ¤·ÀÄÈËÍÏÐÓÕÖרÚÜÝÞààáâãääç†éòÿïˆéèãâááàÞÝÜÛÚ×ÖÕÓÑÏÎÉÄÀ·«’…|pg^YZ˜ ‡ŠŽ‘–› ¤ºÀÄÈËÍÏÐÓÔÕÖØÚÛÜÞààááâãäç†éö‹ÿòˆéèâááààÞÝÜÚØ×ÖÕÓÑÏÎÉÄÀ¹¯’‡}qg_ZXš ‡Š‘–›Ÿ§¸ÀÄÈËÍÏÐÓÔÕÖ×ÚÛÜÝÞààááâãã†éôˆÿþïˆéçàáààÞÝÜÛÚØÖÕÔÓÑÏËÉÄÀ¹¯–‡siaZWœ!…‡Š–›ž§¸ÀÄÈÊÍÎÐÑÔÕÖרÚÛÜÝÞààááâáç…éíú…ÿöêˆéãáààÞÞÝÛÚØ×ÖÕÔÓÐÏËÈÄÀ¹¯–Šsja\Xž……Š’˜ž¤¸ÀÄÇÊÍÎÏÑÓÔÕÖ×ÚÚÜÝÞÞàà€áã†éìòôúöôòêˆéæáààÞÞÝÜÛÚØÖÖÕÓÑÐÎËÈÄÀ·¯–‡tjc]XŸ|‚…‡Ž’™›£´ÀÄÆÉËÎÏÐÑÔÕÖרÚÛÜÝÝÞ€àáàç•é!æáààÞÞÝÜÛÚØ×ÖÕÔÓÑÏÎËÈý·«’‡skc]YZ |€‚…Š‘–›¢³¼ÁÆÈËÍÎÐÑÓÔÕÖרÚÛÛÜÝÞÞ€àáãçé"çáàÞÞÝÜÜÛÚØ×ÖÕÕÓÑÐÏËÉÈÁ»·¨‘‡}sjc]YY¢!y€…Š–™ž±½ÁÄÄÉÍÎÏÐÑÓÕÕÖרÚÚÛÜÜÝÞÞàãæêˆé%èçãàÞÞÝÝÜÛÚÚØ×ÖÕÕÔÓÑÏÎËÈÄÀ¹³¢…|ria]YY¤"w}‚…’™›§¹ÀÁÆÈËÍÎÏÑÓÔÕÕÖ×רÚÚÛÜÜÝÝÞ€àƒãáÝÞÞ€Ý ÜÜÛÛÚØØ×ÖÕÕÔÓÑÐÎËÊÈý·¯›ƒyqia\XY¦vy|…Š–›¢³½ÁÄÄÉËÍÎÏÑÓÓÔÕÖÖ×רÚڀۀ܇ÝÜ!ÛÛÚÚØØ×ÖÖÕÕÔÓÑÐÏÎËÈÄÀ»·¨–Š€wng_ZXZ©wy}€…‘–›ª¹½ÁÄÇÉÍÎÎÏÐÑÓÔÕÕÖÖ×רØÚ‡ÛÚØØ××ÖÖÕÕÔÓÑÑÐÏÎËÈÄÁ½·¯ž…}tle^ZW¬vvy‚‡’˜¢±»ÀÃÄÇÉÍÍÎÏÐÑÓÓÔ€Õ€Ö×…Ø×€Ö€ÕÔÓÓÑÐÏÎÎËÈÆÃÀ¹³¨–Š‚yqjc]YW®rsvy…Š–™£·»ÀÃÄÇÉËÍÎÏÏÐÑÑÓÓÔ‚ÕˆÖÕÔÔÓÓÑÐÐÏÎÍÊÈÆÃÀ»·«™…vmg`\YW°nqsv|…Š‘–›§·»ÀÃÄÇÉÉÍÍÎÎÏÐÐÑÑ€Ó‚Ô€ÕÔ€ÓÑÑÐÐÏÏÎÍËÉÈÄÃÀ¹·¯ž‡€xqjc^ZWY³nprv|€…Š‘–›¨³»½ÀÃÄÇÉÉËÍÎ΀πЇÑÐÏÏÎÎÍËÉÈÆÃÀ½¹³«ž‘‡‚|slg`]YW¶kmnqv|…Š’˜¢¯·»ÀÁÃÄÇÇÉÊËÍÍÎ…ÏÎÍÍËÊÈÈÄÃÁ½»·³¨™‡‚|tmgc^ZWX¹jkmqtyƒ‡‘–ž§³·»½ÀÃÄÄÆÇÈÉÉÊÊ˃̀ÊÉÈÈÆÄÃÁÀ½»·³«¢–…€|tnic^ZXW¼ggilnrv|€…ŠŽ‘–ž¨¯··»½½ÀÁÃÀĂƀÄÃÃÁÀÀ»»·³³«¢–ŽŠ…ysmic_\YWZ¿eegilpsx}€…‡’˜¢¨¯±€·€»ƒ½€»¹¹··³¯«¢›•‡…€|vqlgc^\YWXÀcgilpsw|‚…Š‘’˜ž¢¨¨«„¯««¨¨ž™–‘Š…‚|vqmiea^ZYWXÇa`aceilnqvx|€ƒ…‡ŠŠŽ…ŽŠŠ‡…ƒ‚|wtqmiec_]YXWYÌ^_`acgilmqsvwy|}€ƒ€€}|yvtrpmjgea_]ZYWWÑ^]]^_acegijlmnp€qr€qnnmljgeca_]\YYWWYÖ_]\]]^_`a€c†e€ca`_^]ZYY€WZÝ^ƒZ\\ƒ]\\€Z€YX€WZç]\YX„WZZÿ³ÿ³¹¹È‡Îȸ¹ç³É‹Î‡ÍƲݳÉÏτΔÍưֽ€Ï‚΃͗˻рς΀̓ËʈË̽€Ï€Î€ÍË‚ÊɅʃ˻ÇÄÏÏÎÍÍ€ËÊÉÊÎÑÑÖÖØ…ÚØÖÖÑÐÍʃɇÊÀÃÄÏπ΀ÍËË€ÊÉÍÑÕØÚÛÛÜ€Û…Ü„ÛØÔÐËȂɅÊÀ¿¹ÏÏ€ÎÍÍ€Ë ÊÊÉÏÔØÛÛÜۀ܃ÝÞ„ÝÜÜ€ÛÚØÔÎÈȂɃʵ¼€ÏÎÎÍÍËËÊÊÉÍÔÚÛÜÛÜ܀݄ރà„Þ€Ý ÜÜÛÛÚÚÔËÈȃɀÊɹÄÏÏÎÎÍÍËË€ÊÐÖÛÜÛÜ€ÝÞà‰á‚àÞ ÝÝÜÛÛÚÖÏÉÈÈ…É¿¶ÏÏ€ÎÍËË€ÊÑÚÛÛ܀݀Þàà€á€â‰ã€â€á€à€Þ ÝÝÜÛÛÚÑÉÈȅɳ½ÏÏÎÎÍÍË€ÊÑÚÛÛÜÝÝ€Þààáââ„ã‡ä„ãââá€à ÞÞÝÝÜÛÛØÑɀȃɹ°ÉπΠÍËËÊÉÐÚÛÛÜÝ€Þààáââãƒä‡æƒäãââáàà€ÞÝÜÜÛØÏ‚ÈÉîÏÏÎÎÍÍËÊÊÍÖÛÛÜÝÞÞààáââ€ã䂿‰ç‚æä€ã ââáààÞÞÝÜÛÛÕˆȬÏÏÎÎÍËËÊÉÑÛÜÜÝÞÞààáâ€ã€ä€æ€çè€ç€æ€ä€ã âáààÞÞÝÜÛÚІȩ¹ÏÎÎÍÍËÊÊÍÖÛÛÜÝÞÞàáâ€ãä䀿ççè…éêê…é‚èç€æää€ã âáààÞÝÝÜÛÖ˅ȳ¦½ÏÎÎÍÍËÊÉÐÚÜÜÝÞÞàáâ€ãääææçèé„êìÈ€¥È‚êéèçææ€ä ããâáàÞÞÝÜÛØÎ…È¹¤½ÏÎÎÍËËÊÉÔÛÛÜÝÞààáâããääææç€è€éêìh,„,R—Ú€ê€é€èçææää€ãâáàÞÞÝÜÚԅȸ¢½ÏÎÎÍËËÊÊÖÛÜÝÞÞàáâããääææçèè€é€êììí캌9ƒì€ê€é€èçæääããâáàÞÞÝÜÛÖɃÈǸ ¹€ÎÍËËÊËÖÜÜÝÞÞàáããääææçèèéé€êììííÜt€îvŽhÚì€êééèèçææääããâáàÞÝÜÛÖÉȀDzŸ€ÎÍËÊÊÍÚÜÜÝÞàáâããääæçèèééêêììít3ïïòR píììêêééèèçææäããâáàÞÝÜÛØÊÇȂǞ€ÎÍËÊÊÍÚÜÜÝÞàáâããäææçèééêêììí¿3€A€ð.’ºíììêêééèèææääãâáàÞÞÝÛØÊƒÇÜ€ÎÍËËÊÍÚÛÜÝÞàáâãääæçèèééêìì€íîî„‚w€ð,“ƒííììêêéèèçæääããáàÞÞÝÛØÊÇÃÃÀšÈÎÎÍËËÊËÚÛÜÝÞàáããääæçèééêêì€íîîïYƒw€ò,•RîííìêêééèèææäããâàÞÞÝÛØÉÇÃÀº˜!½ÎÎÍËËÊÊÖÜÜÝÞàáããäææèèééêììííîîïá3„w€ó–Hî€íìêêéèèçæäããâàÞÞÝÛÖÈ€ÇÃÀ½¯—ÎÎÍÍËÊÉÖÜÜÝÞàáããäææèèéêêì€íîïïá3…w€ô—HîîííìêêéèèçæäããâàÞÞÜÛÖ€ÇÃÀ½º–ÎÎÍÍËÊÉÔÛÜÝÞàáããäæçèèéêêìííî€ïð3†w€ô.˜RïîííììêééèçæäããâàÞÝÜÛÔÇÇÃÀ¿º¸” ÂÎÎÍËÊÉÏÛÜÝÞàáããäæçèèéêììííîïïððY‡wõõö.™—ïî€íìêééèçæäããáàÞÝÜÚÏÇÃÿº¸¬“ÎÎÍËËÊÍÚÛÝÞàáâãäæçèèéêì€íîïïðð„ˆ\€ö.™ÎïïîííìêééèçæäããáàÞÝÜØÊÃÿ»¸µ’ÎÎÍËËÊÉÖÛÜÞÞáâãäææèèéêìííîïï€ð‰A€öHš,ðïïîííìêééèçæäããáàÞÝÛÖÇÃÀ½¹µ±¹ÎÍÍËÊÉÑÛÜÝÞàâãääæèèéêìííîïï€ðá'‰3ööùhŽ ÿÿ×9„—ðïïîííìêééèçæäãâáÞÞÜÛÏÃÿºµ±¡ÎÍÍËÊÊÍÛÛÝÞàáããäæèèéêìííîïïððòòj‹øùùŸŽÿéƒððï¢RŸíìêéèèæääãâàÞÝÜÚÈÿºµ±¬ŽÂÎÍËËÊÉÖÛÜÞàáããäæçèéêìííîïïððòòÂŒÈùø×Žƒÿp„Šððî,hÎêéèèæäããáàÞÝÛÔÃÀ»¸±¬¤ÎÍÍËÊÉÏÛÜÝÞàâãäæçèéêêìíîïïððòòóAŒ‰€ùƒÿp„òððƒHŠêèçæäãâáÞÞÜÚÊý¹³¬«ŒÂÍÍËËÊÊÚÛÝÞàáãääæèééêìííïïðð€òµ]ùûûH±‚ÿ.…ºòò΃hÈçæäãâàÞÝÜÖÿºµ¯«¡‹€ÍËÊÉÑÛÜÞÞáâãäæçèéêìííîïððòòóôA€ûŸ!é€ÿ†Hóòð9„ÈæäããáàÞÜÚÍÀ»µ¯«¥Š½ÍÍË€ÊÚÛÝÞàâãäæçèéêìííîïððòòóôµ©€û  \p!‡óóòh„±èçæäãâàÞÝÛÖý¸±«¥š‰ÍÍËËÊÉÑÛÜÞàáããäæèééêìíîïïððòóôôA]€ûpœºôò¢ƒééèçääãáàÞÝØË¿º²«¥£‰ÍÍË€ÊÚÛÝÞàâãäæçèéêìííïïððòóóôÑíûûé ›Šôó₃ìêéèèæäãâáÞÝÛÕÀºµ¬¥¡ˆÍÍËËÊÉÏÛÜÞàáããäæèéêìííîïððòóóôôj‘{€ûp›\€ó€\ííìêéèçæäãáàÞÛ×Ƚµ¯¨¡ž‡ÍÍËÊÊÉÖÛÝÞàâãäæçèéêìíîïïðòòó€ô‘íûûéš,ôôðH\ïîííêéèèæäãâàÞÝØÑ¿¸°¨¡ž†½ÍËËÊÉËÛÜÝÞáããäæèéêìííîïððòó€ô©“{ûÿÿ±šõôôH9€ïííìêéèçæäãáàÞÛÖº²«£š’…Í€ËÊÉÔÛÝÞàâãäæçèéêìíîïððòóóôôõ\”Èÿÿûpšõôôp9âððïîííêéèèæäãâàÞÜ×˺µ«£š˜…ÍËËÊÉÉÚÛÝÞàâãäæèéêìííîïððòó€ôö”5ÿR™öõô¥âòððïïííìêéèæäããáÞÝÚÓ½µ¬¤ž—„°€ËÊÉÎÚÜÞàáãäæçèéêìíîïððòóóôôõµ–j€ÿûR˜öö€ôóòððïîíìêéèçæäãáàÞÚÖø¯¥ž—‹ƒÆËËÊÊÉÔÛÝÞàâãäæèèéêííîïððòóôôõöw—šÿH—ööõôôóòððïïííìêéèæäãâàÞÜÖʹ°¥ž—ƒ€ËÊÉÉØÛÝÞàâãäæèéêìííïïðòóóôôööA˜šÿ ” €ö€ôóòððïîíìêéèçäããáÞÜØÐº²¨ž—’ƒËËÊÊÉËÛÜÝÞáãäæçèéêìíîïððòó€ôööššÿ×.“.€öõôôóòððïîííêéèçæäãáàÝØÓ¿³«¡—‚°ËËÊÊÉÐÛÜÞàâãäæèèéêííîïððòóôôõöµ›‰‚ÿ¢‘9ø€öôôóóòðïïííìêéèæäãâàÞÚÖĵ«¡—†ÆËËÊÉÉÔÛÝÞàâãäæèéêìííïððòó€ôöö‰œOí‚ÿ¢.hù€öõôôóòððïîíìêéèçäããáÞÛÖȵ¬¡—‹ËËÊÊÉÈØÛÝÞáããäçèéêìíîïððòóôôõöö\'©ƒÿ×\ Œ±ù€öõôôóòððïîíìêéèçæäãáÞÜ×θ¯£˜‹ËËÊÊÉÉÚÜÝÞáãäæçèéêííîïððòóôôõööAŸC܃ÿép Šéøø€öôôóóòðïïííêéèçæäãáàÝ×к¯¤˜‰ËÊÊÉÉÍÚÜÞàáãäæçèéêííïïðòóóôô€ö¢]µƒÿé\ˆ9ùùø€öõôôóòððïîíìêéèæäãâàÝÚÓ¿°¤š‰ËÊÊÉÉÐÛÝÞàâãäæèéêìíîïððòóôôõ€ö¤5ší‚ÿ×.†Š€ù€öõôôóòððïîíìêéèæäãâàÝÚÓÀ±¥š‰€µ€ÊÉÈÑÛÝÞàâãäæèéêìíîïððòóôôõööµ¦{íÿûƒ ƒ é€ùø€öôôóòððïîíìêéèçäããáÞÛÖ±¥š‡€µ€ÊÉÈÕÛÝÞàâãäæèéêìíîïððòóôô€öµ¨{í€ÿû×!‚Hû€ùø€ö9ôôóóòðïîííêéèçæäãáÞÛÖȲ¥š†€ÄÊÊÉÉÈÕÛÝÞáããäçèéêìíîïððóóôô€ö‰ª'©ÿéH×û€ùø€ö€ôóòðïïííêéèçæäãáàÛÖɲ¥š„€€ÊÉÉÈØÛÝÞáãäæçèéêííîïðòóóôô€ö{¬ OíÿÿûÿpHûûù€öõôôóòððïííìêèçæäãáàÜ×˲¥šƒ€ÊÉÉÈÚÜÝÞáãäæçèéêííïïðòó€ô€ö{­ µÿÿûû éûûù€ö9õôôóòððïîíìêéèæäãáàÜ×Ͳ¥šƒ~ÊÊÉÉÈÈÚÜÝàáãäæçèéìííïïðòóôôõ€ö{¯‰ÿ€ûé€ûù€ö9õôôóòððïîíìêéèæäãâàÜ×Ͳ¥˜Œ‚|ÊÊÉÉÈÈÚÜÞàáãäæçèêìííïððòóôôõ€öj°]…û€ù<øööõôôóòððïîíìêéèæäãâàÜ×Ͳ¥—‹€{ÊÊÉÉÈÈÚÜÞàáãäæçèêìííïððòóôôõ€öA±]„û€ù!øööõôôóòððïîíìêéèæäãâàÜ×Ͳ¥—‰yÊ€ÉÈÈÚÜÞàáãäæçèêìííïððòóôôõ€öA²]ƒû€ù øööõôôóòððïîíìêéèæäãâàÜÖͱ¤—‰yÉÈÈÚÜÞàáãäæçèêìííïððòóôôõ€öA³š‚û€ù øööõôôóòððïîíìêéèæäãâàÜÖͱ¤•‰~wÉÈÈÚÜÝàáãäæçèéìííïððòóôôõ€öj´Èû€ù øööõôôóòððïîíìêéèæäãâàÜÖ˰£•‡~wÉÈÈÚÜÝÞáãäæçèéêííïïðòóôôõ€ö{´5€ûù€öõôôóòððïîíìêéèæäãâàÜÖ˯¡’†{u€É€ÈÖÜÝÞáãäæçèéêííïïðòó€ô€ö{µ{ûûù€ö õôôóòððïííìêèçæäãáàÛÖÆ¬¡ƒysÃÉÉ€ÈÕÛÝÞáããæçèéêííîïðòóóôô€öwµÜû€ùø€ö€ôóòðïïííêéèçæäãáÞÚÓĬž‚ws³ÉÉ€ÈÕÛÝÞàããäçèéêìíîïððòóôô€ö‰¶]û€ùø€öôôóóòðïîííêéèçæäãáÝØÓ«šus³ÉÈÐÛÝÞàâãäæèéêìíîïððòóôôõööµ¶íøùùø€öôôóòððïîíìêéèçäããáÝØÐ½¨š‰~sq€‚ÈÏÛÝÞàâãäæèéêìíîïððòóôôõööµ·š€ù€öõôôóòððïîíìêéèæäãâàÝØÏ»¥—‡{s‚ÈÍÚÜÞàâãäæèèêìííïïðòó€ô€ö·Aùùø€öõôôóòððïîíìêéèæäãâàÜ×͵£’„wp‚ÈÉÚÜÝàáãäæçèéêííîïððòóôô€ö¸íùø€ö€ôóòðïïííìêèèæäãâàÛÖʯ¡‚uoƒÈÖÛÝÞáããäçèéêìíîïððòóôôõööA‘Cà€ïà™\š©öõôôóòððïîííêéèçæäãáÞÛÓÆ«šsnÂÈÔÛÝÞàâãäæèéêìíîïððòó€ôöö\’\ƒïàx˜{ø€öõôôóòððïîíìêéèçäããáÝØÐ½¨˜‰{qn¯‚ÈÏÛÝÞàâãäæèèéêííïïðòóóôôöö‰“™„ïÍ3—Oö€ôóòðïïííìêéèæäãâàÜØÏ¹¤•†wop‚‚ÈÊÚÜÞàáãäæçèéêìíîïððòóôôõöµ“'†ï\–A€öõôôóòððïîííêéèèæäãâàÛÖ˲¡€unƒÈÇÇÖÛÝÞáããäæèéêìíîïððòóóôôöö”™†ï\•€ö€ôóòððïîíìêéèçæäãáÝØÓÄ«šŒ~qlƒÂ‚ÇÔÛÝÞàâãäæèèéêííîïððòóôôõöA“C‡ï\•ööõôôóóòðïïííìêéèæäãâàÜØÏ½¥—‡yolƒ¬‚ÇÍÚÜÞàáãäæçèéêìíîïððòó€ôöw”ˆïC”öö€ôóòððïîííêéèçæäãâàÛÖͳ¡‚uln„ƒÇØÜÝÞáâãäæèéêìííïïððòó€ôÈ”ˆïà'“öõôôóóòðïïîíìêéèçäããáÝØÓÆ«šŒ~qk…ƒÇÔÛÝÞàâãäæçèéêìíîïððòóóôôõ“‰ï±“ö€ôóòððïîííêééèæäãâàÜØÏ½¤•†woj…¸‚ÇÊÚÜÞÞáããäçèéêìííïïððòó€ô\“Šï\‘3€ôóòòðïïîíìêéèçæäãáÞÛÓ˱¡€slk†€Ã€ÇÖÛÝÞàâãäæèèéêìíîïððòóóôôµ’CŠïàAôôóóòððïîííêêéèæäãâáÜØÐ¨š‰{qj‡À€ÃÇÇÍÚÜÞàáãääçèéêìííîïððòóóôô'‘x‹ï\jôôóòððïïííìêéèçæäãâÞÛÖ͵¡’ƒvnhˆ¿À€ÃÇØÜÝÞàâãäæçèéêìíîïïððòóôôwà‹ï͉óóòòððïîíìêéèèæäãâáÝØÐÆ«šŒ~qj‰½¿¿€ÃÏÛÜÞàáããäæèéêêííîïððòòóôÑ™ïCÂóóòððïîííìêéèçæäãâÞÛÖ͹£’„wnh‰¯»½¿ÀÃÇÖÜÝÞàâãäæçèéêìííîïððòóóô\Ž\ŽïxŽóóòððïïííìêéèèæäãâáÜØÐÆ«šskkŠºº½¿ÀÃÍÚÜÞàáããäæèèéêìííïïððòóòµàŽïÍŽYóòððïïîíìêééèæääãáÞÛÖ͹£’„wnh‹¯¸º½¿ÃÇÖÚÝÞàâãäæçèéêêìíîïïððòóóAŒxïµ€ðïïîííìêéèçæäãâàÜØÐÄ«šŒ~skjŒµ¸º½¿ÃÊ×ÛÞÞáâãäæçèéêìííîïïððòóÂŒÍïCŒ'ò€ðïîííìêéèèæäããáÞÚÓ˳¡’ƒwnh«µµ¹½¿ÃÑÚÝÞàáããäæèèéêìííîïïððòóYŠ'‘ïCŒ’€ðïîííìêéèèæääãâÞÜ×Ͻ¥˜‹|qjjޱ²µ¹½¿ÇÖÛÝÞàâãääæèèéêìííîïïððòá‰C‘ïC‹'€ðïîííìêééèçæäãâàÜØÐȰž€ulh¡¯±µ¹½ÀËØÛÞÞáâãäæçèééêìííîïïððò„‰C‘ïC‹’ðïïîííìêêéèçæäããáÞÚÖ˹£•†yohk¬¯±µº½ÀÔØÜÞàáããäæçèééêìííîïï€ðAˆC‘ïCŠAðïïîííìêêéèçæäããáÞÜÖÏÁ¥šŒ~skg’«¬°µº½ÃÖÚÜÞàáããäæçèééêìííîïïððá‡'‘ï‰ÍðïîííìêêéèçæäããâÞÜØÐĬž‚unh“£«¬°µº½ÈÖÚÜÞàáããäæçèééêìííîîïïðˆÍïÍŠ’ïïîííìêêéèçæääãâÞÜØÓɳ¡’†yojh”¥¨«°µº¿ÍÖÚÜÞàâããäæçèééêì€íîïïð’‡xï\‰Yïî€íìêééèçæääãâàÜÚÓ˹¤—‰~skg–¤¥«¯µº¿ÐÖÚÝÞàâããäæçèèéêêìííîîïï’†àï͉YïîííììêééèçæääãâáÝÚÖͽ¥šŒslh—𣥫¯µº¿ÐÖÛÝÞàâããäæçèèéêêì€íîïï’†\ïCˆYî€íìêêéèèçæääãâáÝÚÖÍÁ«š‚vnhj˜ž¡¤¨¯µº¿ÔÖÛÝÞàâããäææèèééêìì€íîï’†™‹ï\ˆYîííììêêéèèçæäããâáÝÚÖÏÄ«žƒwojgšž¡£¨¬³¹ÀÑÖÛÝÞàâããääæçèèéêêìíî­…xˆïàCˆ„ìííìêêééèèææäããâÞÝÚÖÏĬž’†yqjeœšž¡¥¬³¸ÀÑÖÛÝÞàáããääæçèèééêêìíÜL…3±…3¿ííìêêééèèçæääããâÞÜÚÖÏĬ¡’†{qkgžšš¡¥«±¸¿ÑÖÚÜÞàáâããäææçèèééêêìì€í '…'\x±™x\‡tííì€êééèèææääããáÞÜÚÖÍĬž’‡{slgŸ—šž¤«°µ½ÍÖØÛÝàáâããääæç€èééêêìì€í’'“tÜììêê€éèèçæääããâáÞÜÚÓÍÁ«ž’†|slhj •—𡍝µ»ËÕ×ÛÝÞàáâããäææç€èéé€êììíí L3’Üì€ê€éèèçææääããâÞÝÜ×Ð˽¨ž†{slhh¢’•𡥬²¸ÈÓ×ÚÜÝàáâããääææç€è€é€êì tA†3Y’Íì€ê€é€èçææääããâáÞÜÚÖÏȹ¥š„yqlhh¤‹’—𣫰µÀÏÖ×ÛÝààáâããääææçç€èé‚ê€ìÍ‚­Üƒê€éèçææääããâáÞÞÜØÓÍij£˜ƒyqkgh¦‰’𡥬³»ÊÓ×ÚÜÝààáâãã€äææççè‚é‡êƒéèçææ€äããââáÞÜÚÖÐ˽¬¡•‹€wojgj©‹•𣍝µÂÏÓ×ÚÜÝàááâ€ã€äææçç„è…é„èçç€æää€ãââáÞÜÚ×ÓÍĵ¥š‡~unje¬‰‰’—ž¥«±¹ÈÐÖØÚÜÝààáâã€äæç…èçæä€ãâááÞÜÛØÖÏɽ¬¡—ƒ{slhe®„†‰’𡥬²½ÍÐÖØÚÜÝààáââã‚䋿‚äãââáàÞÜÛØÖÐËÁ²£š’‰wpkhe°€ƒ†‰’𡍬³ÀËÐÖØÚÜÝÝààááâƒã‹äƒãââáàÞÝÜÚØÖÏËĵ¥ž•Œƒ{snjeh³€‚„‰•𡍬³½ÊÐÓÖØÚÜÝÝààáá€âã€âááàÞÝÜÛØÖÓÏÉÁµ¨ž—†~vplhe¶|€ƒ‰’𡥫±»ÆÍÐÖרÚÜÜÝÞ€àá…âáààÞÞÜÜÚØ×ÓÐÍȽ²¥ž—‡wsnjeg¹{|ƒ‡’˜ž£¨¬µÀÉÍÐÓÖ€ØÛÜÜÝÝÞÞ„à€ÞÝÜÜÛÚÚ×ÖÓÐÍÈÁ¹¬£š•‡€ysnjge¼wwy~€„‰•𡤍¬¸½ÆËÏÐÓÓÖ×€ØÚÚ‚ÛÚØ×ÖÖÐÐÍÉÈÁ¹¬¤¡š’†ysokhej¿uuwy~‚†Œ•šž£¥«±¹½ÄÈËÍ̀ЃӀÐÏÏÍËÈÄÁ¹³«£žš•‰ƒ~wsnkhegÀsvy~‚†‹’—š¡£¥¨«±µ¹½½Á„ÄÁÁ½½µ²¬¨£¡š—’‰ƒyuqnjhegÇqpqsuy~€ƒ‰Œ’•˜šž¡¡£¤…¥¤£¡¡žš˜—’‹‡ƒyusolhgehÌnopqsvy~ƒ†‰‹€’ƒ•€’‰‡„‚{wuqoljheeÑnllnoqsuwy{~€‚€ƒ„€ƒ€€~{wusqolkhheehÖolkllnopq€s†u€sqponljhh€ejÝnƒjkkƒlkk€j€hg€ejçlkhg„ejjÿ³ÿ³ÄÄÔ‡ÚÔÃÄçÀÕ•ÚÓ¿ÝÀÕÛÛŠÚŽØÓ¼ÖÉ€Û…ÚšØÈÑ€Û„Ú„Ø×ˆØÌɀۂڂ؜׃ØÈÇÐÛÛ‚ÚØƒ×ÚÞÞããæ…çæããÞÝÚ×ÖÖ‹×ÎÃÐÛÛ‚Ú€Ø×ÚÞâæ„ç…è„çæáÝØ€Öˆ×οÄÛÛÚØ€×Ûáæç†èé†èçæáÚÖ†×Á¼€Û€Ú€Ø€×Úáç‚è„éƒê„é‚èçáØÖ…×¹ÐÛÛ€Ú€Ø×רÝã€çèéê‰ì‚êé€è€çãÜ×Öƒ×ͶÛÛÚØØ××ØÞ€çè€éêêƒìŠí‚ì€ê€é€è€çÞׂւ׳ÉÛÛ€ÚØØ××ØÞ€ç€è€éêê€ì„í‡î„í€ì€êéé€èççæÞ׆ÖİÕÛ€Ú€Ø××Ý€çèè€éêê€ìí“îí€ìêê€éèèççæÜ†ÖÑ®ÛÛ€Ú ØØ××Úãççèèééêê€ì€í†î‰ï†î€í€ì êêééèèççâØ†Ö¬ÛÛ€ÚØØ××Þççèèééêêìì€í„î“ï„î€í ììêêééèèçç݆֩ÄÛ€ÚØØ××Úã€çèééêìì€í‚îƒïðƒï‚î€íììêêé€èçãØ…ÖÀ¦ÉÛ€Ú ØØ××Ýççèèééêìì€í‚îï‚ð„òÏ€ªÏò‚ð‚ï‚î ííììêééèèçæÚ…ÖÆ¤ÉÛ€ÚØØ××á€çèéêêì€íîïð„òj,„,Sšàòòðïî€í ììêééèççáÕƒÖÕâÉÛ€ÚØØ××ãçèèééêììííî€ïðòóò¿Œ:†ò€ð€ïî ííììêééèèçãÖÕ€Ö€ÕàÄÚ ØØ×Øãçèèééêìííî€ï€ðòóóã|"€ôŽjà€ò€ð€ïî ííìêêéèèçãׄտŸÚ Ø××Úççèèéêììíí€î€ï€ð€òó|"9ôôöS qó€ò€ð€ï€î ííììêéèèçæØ„ÕžÚ Ø××Úççèèéêììíí€îïï€ð€òóÄ9€F€õ.’¿ó€ò€ðïïî ííìêééèçæØƒÕÑœÚ ØØ×Úççèèéêìíí€î€ïðð€ò€óôô‹‚~€õ,“†óó€òðð€ï€î ííìêééèçæØÕÑÑÎšÔ€Ú ØØ×Øççèèéêìíí€îïï€ðòò€ó€ô`ƒ~€ö,•Sôóó€òððïï€î ííìêééèçæ×ÕÑÎÇ˜É€Ú ØØ××ãçèèéêìíí€îïïðð€òóó€ôæ9„~€ö–Iô€óòòððïï€î ííìêééèçãÖ€ÕÑÎÊ»—€Ú ØØ××ãçèèéêìíí€îïïððòò€ó€ôæ9…~€ø—Iôôóóòòðð€ï îîííìêééèçã€ÕÑÎÊÇ–€Ú ØØ××áçèèéêìíí€îïïððòòóó€ôõõ9†~€ø.˜Sôôóó€òððïïîîííìêéèèçáÕÕÑÎÍÇÔÏÚÚØØ××Üçèèéêìíí€îïïð€òóó€ôõõ`‡~øùù.™šôô€óòòððïïîîííìêéèèçÜÕÑÑÍÇù“€Ú ØØ×Úççèéêìíí€îïïðòò€óôô€õ‹ˆa€ù.™Ó€ôóóòòððïïîîííìêéèèæØÑÑÍÈÃÂ’€Ú ØØ××ãçèééììí€îïïðòòóó€ô€õljF€ùIš,õ€ôóóòòððïïîîííìêéèçãÕÑÎÊÆÂ½ÄÚÚØØ××Þçèèéêìí€îïïðòòóó€ô€õæ.‰9ùùûjŽ ÿÿ×:„šõ€ôóóòòððï€îíììééèçÜÑÑÍǽ¬€ÚØ××Úççèéêìííîîïïðòòóó€ôõõööp‹€û Žÿꃀõ¤S óòòðïï€î íìêéèèçÖÑÍǽ¹ŽÏÚÚØØ××ãçèéêìííîîïïððòóó€ôõõööÇŒÊûû׎ƒÿq„Œõõô,jÓòðïïîîííìêéèçáÑÎÈý¹±ÚÚØØ××Üçèèéêìíîîïïððòòó€ôõõ€öFŒ€ûƒÿq„öõõ†IŒòïïîîííìééèçØÑÊÆÀ¹·Œ ÏÚÚØØ××ççèéêìí€î ïððòòóóôôõõ€öºbûýýI²‚ÿ.…¿ööÓƒjÏ€î íìêéèçãÑÍÇ»·¬‹ÚÚØØ××Þçèééìííîîïïðòòóóôôõõ€öøF"€ý !ê€ÿ†Iööõ:„ÏîîííìêéèçØÎÈ»·²ŠÉÚØØ€×ççèéêìíîîïïððòóóôôõõ€öøº¬€ý  ]q!‡€öj„²ïïîîíìêéèçãÑÊý·²¥‰ÚÚØØ××Þçèéêìííîîïððòòóôô€õööøøFb€ýqœ¿øö¤ƒððï€î íìêéèæØÍÇ¿·²­‰ÚØØ€×ççèéêìíîîïïðòòóóôôõõ€öøÔ"íýýê ›Œøö炆òòðïïîîíììéèçâÎǹ²¬ˆÚ€Ø××Üçèéêìííîîïððòóóôôõõ€öøøp‘€€ýq›]€ö€]óóòòðïïîîíìêéçâÖÊ»´¬©‡ÚØØ××Öãçèéêìíîîïïðòòóôôõõ€ö€ø"‘"íýýêš,øøõI]ôôóóòðïïîîíìêéèæÞÍü´¬©†Ê€Ø×רçèèéìííîîïððòóóôôõõöö€ø¬“€ýÿÿ²šùøøI:ôõôóóòòðï€î íìêéçáÏÇ¿·­¥ž…Ø×Öáçèéêìíîîïïðòòóôôõõ€ö€øa”Êÿÿýqšùøøq:çõõôôóóòðïïîîíìêéçâØÇ·­¥¡…€Ø××Öççèéêìíîîïððòóóôôõõöö€øù"”;ÿS™ùøøªçö€õôóóòòðïîîííìéèäÞʹ±©¢„¼€Ø××Úçèéêìíîîïïðòòóôôõõ€öøøùº–p€ÿýS˜ùù€øööõõôôóòòðïïîîíìêéäáÑû²©¢•ƒÓØØ××Öáçèéêìíîîïïðòóóôôõõöö€øù~—ŸÿI—ùù€øöö€õôóóòððïîîíìêéçáׯ¼²©¢šƒ€Ø××Öæçèéêìíîîïððòóóôõõ€öøøùùF˜Ÿÿ ” €ù€øööõõôôóòòðïîîííìéèãÝÇ¿´©¢žƒØØ€×Øçèèéìíîîïïðòòóôôõõöö€øùùšŸÿ×.“.€ù€øööõõôôóóòðïïîîíìêèãÞÍÀ·¬¢š‚¼ØØ××ÖÝçèéêìíîîïïðòóóôôõõööøøùùº›‚ÿ¤‘:û€ùøø€öõõôóóòððïîîíìêéäãз¬¢šÓØØ××Öáçèéêìíîîïððòóóôõõöö€øùùœUí‚ÿ¤.jû€ù€øööõõôôóòòðïîîííìéçáÔ¹¬¢š•ØØ€×Öæçèéìííîîïðòòóôôõõöö€øùùa.¬ƒÿ×] Œ²ûùøøööõõôôóòòðïïîîíìéèâÚû­¡™•ØØ×çèèéìíîîïïðòóóôôõõööøø€ùFŸH݃ÿêq Šêûû€ùøø€öõõôóóòðïïîîíìêèâÝÇ»±¡™’Ø€×ÖÚçèéêìíîîïïðòóóôõõ€öøø€ù¢bºƒÿê]ˆ:€û€ù€øööõõôôóòððïîîíìêèäÞͼ±¥™’Ø€×ÖÝçèéêìíîîïððòóôôõõöö€ø€ù¤;Ÿí‚ÿ×.†Œ€ûùøøööõõôôóòòðïîîíìêèäÞν²¥™’€Á×ÖÞçèéêìíîîïðòòóôôõõööøø€ùº¦"€íÿý† ƒ êû€ùøøööõõôôóòòðïîîííìéçáϽ²¥™ŠÁ×Öâçèéêìíîîïðòòóôôõõööøø€ùº¨"€í€ÿý×!‚Iýû€ùøø€öõôôóóòðïïîîíìéçáÔ¿²¥™ŠÐ€×ÖÖâçèéìííîïïðòòóôôõõööøø€ùª.¬ÿêI×ýû€ù€øööõõôóóòðïïîîíìêçáÕ¿²¥—ŽŠ×ÖÖæçèéìíîîïïðòóóôõõ€öøø€ù€¬ UíÿÿýÿqIýýû€ù€øööõõôóóòðïïîîíìêçâØ¿²¥—Œ‡×ÖÖçèèéìíîîïïðòóóôõõöö€ø€ù€­ "ºÿÿýý êýýû€ù€øööõõôôóòððïîîíìêçâØ¿²¥—Œ†×ÖÖçèèêìíîîïïðòóóôõõöö€ø€ù€¯ÿ€ýê€ýûùøøööõõôôóòððïîîíìêçâØ¿²¡–‹„×ÖÖçèéêìíîîïïðòóóôõõöö€ø€ùp°b…ýû€ùøøööõõôôóòððïîîíìêèâØ¿²¢•Šƒ€×€Öçèéêìíîîïïðòóóôõõöö€ø€ùF±b„ýû€ùøøööõõôôóòòðïîîíìêèâØ¿²¢’‡ƒ€×€Öçèéêìíîîïïðòóóôõõöö€ø€ùF²bƒýû€ùøøööõõôôóòòðïîîíìêèáØ½±¢’‡‚€×€Öçèéêìíîîïïðòóóôõõöö€ø€ùF³Ÿ‚ýû€ùøøööõõôôóòòðïîîíìêèáØ½±Ÿ’†€€×€Öçèèêìíîîïïðòóóôõõöö€ø€ùp´Êýû€ùøøööõõôôóòððïîîíìêèáÖ¼­Ÿ†€××Öçèèéìíîîïïðòóóôõõöö€ø€ù€´;€ýûùøøööõõôôóòððïîîíìêçáÖ»¬žƒ~××Öãèèéìíîîïïðòóóôõõöö€ø€ù€µ€ýýû€ù€øööõõôóóòðïïîîíìêçáÓ¹¬šŒ‚|Ñ×Öâçèéìííîïïðòóóôôõ€öøø€ù~µ"Ýýû€ù€øööõõôóóòðïïîîíìéäÞй©™‹€|À‚Öâçèéêííîîïðòòóôôõõööøø€ù¶býû€ùøø€öõõôóóòðïïîîíìèãÞÏ·¥—‡~|À‚ÖÝçèéêìíîîïðòòóôôõõööøø€ùº¶"íû€ùøøööõõôôóòòðïïîííìèãÝÉ´¥’†|y€‚ÖÜçèéêìíîîïððòóôôõõöö€øùùº·Ÿ€ûùøøööõõôôóòòðïîîíìêèâÛȲ¢ƒ|‚ÖÚçèéêìíîîïïðòóóôõõöö€ø€ù·F€û€ù€øööõõôôóòòðïîîíìêèâØÁ­žŽ€xƒÖçèèêìíîîïïðòóóôôõõööøø€ù¸íûû€ù€øööõõôóóòðïïîîíìêçá×»¬š‹~v‚ÖÕãçèéìííîîïðòòóôôõõöö€øùùF‘€ š¬‚ùøøööõõôôóóòðïïîîíìéçÞÓ·¥—‡|uÑÖÕáçèéêìíîîïðòòóôôõõöö€øùùa’ ƒ ˜€û€ù€øööõõôôóòòðïîîííìèãÝÉ´¡’ƒyu»€ÖÕÕÜçèéêìíîîïïðòóóôõõ€öøøùù“„—Uù€øööõõôóóòððïîîíìêçâÛıŸ€vx‚ÖÖ€ÕØçèéêìíîîïïðòòóôôõõöö€øùº“† –FùøøööõõôôóóòðïïîîíìêçáÖ¿¬šŠ~uƒƒÕãçèéìííîîïðòòóôôõõ€öøøùù”† •"€ù€øööõõôôóòòðïïîîíìèãÞз¥–†ytƒÏ‚Õáçèéêìíîîïïðòóóôôõõöö€øùF“‡ •€ùøø€öõõôóóòððïîîíìêçâÛɲ¢‚vtƒ¹‚ÕÚçèéêìíîîïïðòòóôôõõöö€øù~”ˆ”ùù€øööõõôôóóòðïïîîíìêçáØÀ¬š‹~tu„ƒÕæçèéìííîîïððòóóô€õöö€øÊ”ˆ“ù€ø€öõõôôóòòðïîîííìèãÞÓ·¥–†ys…ƒÕáçèéêìíîîïïðòòóôôõõ€öøøù"“‰“ù€øööõõôôóóòððïîîíìêçâÛɱŸ€vq…ÂÕØçèééìííîîïðòòóóôôõõöö€øa“Š ‘9€ø€öõõôôóòòðïïîîíìéçÞÖ½¬šŠ|ts†€Ñ€Õãçèéêìíîîïïðòòóôôõõ€öøøº’ŠFøø€öõõôôóóòððïîîííìçâÝÏ´¥’ƒyq‡Î€ÑÕÕÚçèéêìí€î ïððòóóôôõõ€öøø.‘ ‹ pøøöö€õôóóòòðïïîîíìéçáØÁ¬žŒuoˆÍ΀ÑÕæçèéêìíîîïïðòòóôô€õööøø~‹öõõôôóòòðïïîîííìèâÝÓ·¥–†yq‰ÊÍÍ€ÑÜçèéêìííîîïððòóóôôõõ€öøÔÇ€öõõôôóóòòðïïîîíìéçáØÄ­žŽ€uo‰»ÈÊÍÎÑÕãçèéêìíîîïïðòòóóôôõõ€öøaŽ Ž Ž"€öõõôôóóòòðïïîîííìçâÝÓ·¥—‡|ssŠÇÇÊÍÎÑÚçèéêìííîîïïðòòóóôôõõ€öºŽŽ`öö€õôôóòòððï€î íìéçáØÄ­žŽ€uo‹ »ÃÇÊÍÑÕãäèéêìí€îïððòòóôô€õ€öFŒ ºõôôóóòððïïîîíìêçâÝз¥–†|sqŒÂÃÇÊÍÑØâçééììíîîïïðòòóóôô€õööÇŒŒ.ö€õôôóóòòðïïîîííìéäÞÖÀ¬žŒ€uo·ÂÂÆÊÍÑÞäèéêìííîîïïðòòóóôô€õöö`Š‘Œ˜€õôôóóòòðïï€î íìéçâÛɲ¡•„yqqŽ ½¿ÂÆÊÍÕãçèéêìí€îïïðòòóóôô€õöæ"‰‘‹.€õôôóóòòððï€î íìêçâÝÓ¼©™Š~to¬»½ÂÆÊÎØæçééììí€îïððòòóóôô€õö‹‰‘‹˜õõôôóóòòððïïîîííìéäáÖÄ­Ÿ‚vos¹»½ÂÇÊÎáæçéêìííîîïïððòòóó€ô€õFˆ‘ŠFõõôôóóòòððïïîîííìéçáÛͲ¥–†|sn’·¹¼ÂÇÊÑáççéêìííîîïïððòòóó€ôõõæ"‡‘‰"ÔõôôóóòòððïïîîííìéçâÝй©™‹~uo“­·¹¼ÂÇÊÖáäèéêìííîîïïððòòóó€ôõõLjŠ˜€ôóóòòððïï€îíìéçâÞÕÀ¬ž‚vqo”²´·¼ÂÇÍØáäèéêìííîîïïððòò€ó€ôõ˜‡ ‰`ôô€óòòððïï€îíìêçäÞÖı¢’†|sn–±²·»ÂÇÍÝáäèéêìííîî€ïð€òóó€ôõ˜†‰`ôôóó€òððïï€îíììèäáØÉ²¥–‡|to—¥­²·»ÂÇÍÝáçèéêìíí€îïïððòò€ó€ô˜† ˆ`ô€óòòðð€ï€îíììèäáØÍ·¥™‹uoq˜©¬±´»ÂÇÍááçèéêìíí€îïïðð€ò€óôô˜†‹ ˆ`ôóó€òððïï€îííììèäáÛз©šŒ€vqn𩬭´¹ÀÆÎÞáçèéêìíí€î€ïððòòóô´"… ˆˆ‹òóó€òððïï€îííìéèäáÛй©žƒyqmœ¥©¬²¹ÀÃÎÞáçèéêìíí€î€ïðð€òóãS……‡9Äóó€òðð€ï€îííìéçäáÛй¬žƒysnž¥¥¬²·½ÃÍÞáäèéêììíí€î€ïððò€ó§.…  ‡"|óó€ò€ðïïîííìéçäáØÐ¹©žƒ|tnŸ™¢¥©±·¼ÂÊÚáãçèêììííî€ïððò€ó˜.“"|ãò€ð€ï€îííììéçäÞØÍ·©ž„|toq ™Ÿ¢¥¬´»ÂÈØââçèéêì€í€îï€ðòóó§S9˜ã€òð€ïîííìéèçâÝÖÉ´©šƒ|too¢—žŸ¥¬²¹¿ÃÔÞâäçèêììííîïðƒò§|F"†9`˜Ô€òðïîííììéçäáÛÓIJ¥™Žƒytoo¤•šž¢¥­·¼ÂÎÛáâçèêêììíí‚îï‚ð„òÔ‚´ã‚òðï‚î€íìééçâÞØÐÀ­¡—Œ‚ysno¦’—™ž¥¬²¹ÀÈ×Þâäçèêêììííƒî‚ï…ðò†ð‚ï‚î€íììéçäáÝÖɹ¬Ÿ•Š€vqnq©•—šŸ¥­´»ÂÏÛÞâäèèê€ì€íƒî…ï…ð…ïƒîíììéçäâÞØÐÁ²¥š†~uqm¬’’—ž¢©²·½ÄÔÝáâäèèêêììí…îŒï…î€í€ìéççâáÛÕɹ¬¢—Œƒ|tom®Ž’—ž¥¬²¹¿ÊØÝáâäèèêê€ìí•îí€ìêéççâáÝÖÍ¿­¥ž’‡€xsom°ŠŒ’™ž¥¬´¹ÀÎÖÝáâä€èêê€ìƒí‹îƒí€ìêéèçäâáÛÖÐÁ²©Ÿ–Œƒ|uqmo³Ћޒ™Ÿ¥¬´¹ÀÉ×ÝÞáâä€èêê‚ìí‚ìêéèççâáÞÛÕÍÁ´©¢™†xtom¶„‡ŠŒ’™ž¥¬²·½ÈÓØÝáââä€èé€êìêêééççäââÞÝØÓÉ¿²©¢™‡€|uqmn¹ƒ„‡Œ—ž¡©­´¹ÁÎÕØÝÞáâããçèçèèéé„ê€éè€çääâáÞÝØÓÍĹ­¥Ÿ™Š‚|uqnm¼€€ƒ†ŠŽ’™Ÿ¥¬±´¹ÃÉÓÖÛÝÞÞá€âãää‚çäââááÝÝØÕÓÍű¬¥ž—‡‚|vsomq¿~~€ƒ†‹–šŸ¥©­²·½ÄÉÐÔÖØØ€ÝƒÞ€ÝÛÛØÖÓÐÍÄÀ·­©¥Ÿ™’Œ†€|usomnÀ|ƒ†‹•™ž¢¥¬­²´·½ÁÄÉÉÍ„ÐÍÍÉÉÁ¿¹´­¬¥¢ž™’Œ‡ƒ~yuqomnÇyxy|~‚†ŠŒ’–™žŸ¡¥©¬¬­±…²±­¬¬©¥¡¢ž™•Œ‡ƒ~|vtonmoÌuvxy|ƒ†‡Œ’•—™š€žƒŸ€žš™—’Ž‹‡ƒ€~yvtqommÑuttuvy|~€‚ƒ†‡Š‹€ŒŽ€ŒŠŠ‡†ƒ€~|yvtsoommoÖvtsttuvxy€|†~€|yxvutqoo€mqÝuƒqssƒtss€q€on€mqçtson„mqqÿ³t8mk@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿflamerobin_0.9.3~svn+2220.orig/res/flamerobin.png000066400000000000000000000036131177057155300216230ustar00rootroot00000000000000‰PNG  IHDR szzôbKGDÿÿÿ ½§“ pHYs  šœtIMEÖ 3oT§uIDATXí—ŒTWÇ?÷Þ÷Þ¼™]fȲ¸]~TC[©¨iÐÖš¦”˜ÚŠ6Öª(iLS„615¤Ph(mÚØð+ESPcØTkbûRXš4¨`-”P”¡ì»ìîìί÷Þ½×?Þ›†]~ê}¹3ï½ÜsÎ÷œwîùž+¸ñÎтՑF9 è(B)‡Ÿý”¸^]×,ð·yk…ÀZ‹µ ¥lˆ[k1Æ’5_þüñ°ÿH¯µB „Äs<ÇÁqH¤­‹%Œ4µ0¢hc±Öpÿ·Š°ÿH¯EJÒ©¾ç¢¤DIñlHÛ$ Ö¢%2†J-¤T­bŒÁhÃWæß&®@Ï‘^‹¸ŽK{ÚÇu$Ž”8R a­Æÿú'ÃÃÃtÝt·ÏûÊu1Æ% ÂÈP,W¨Ö´Ö<ø…O‹«è9|Â"$¾Ÿ¢ÍOá)…«Nâ½*Pðº#øÑ²ÇrÙl–ï>ú}žzz5mÙ,‘6„ÚjÍX¥ÆX¹ŒŽ4_ýâÜ›r¢ç±ñv?EÊQ¤‰ç(\Gâ½½ï;‹q>:ÎÈ…¡àÅb‘?ßÎ÷ÝMÿÉ^"›rS2)¦d2)yó¯ØË@\×=wž#q‰«$îÁƒ¨§WAµ†ˆBü”7iî|\(°ä‘‡¨•Çñ‰çHRJ1%"ã§¢5è û÷Z´§}<¥ðTbXIœr ¹r5h/îëç–9s&ïëëcãÆç)äólß²‰CÞåݽ{ÀD¸J‘kËຯ½}ÀNŒ€düTâ±ÀQ2ùîù›Ý08ØXj><Ê=óç“N§[ìØ±“}ûö°{ׯùDWëV®`ÕKq$xŽ"7¥ ¥œÖìK²Þ÷Ü$ÛãŒWRà ¯½ÞêjÐö—½<ñä“-¯7nÜ@OOCƒƒ()™9{6k_x ×Q8RÐîûø¾Ï/þøg{Q)7ÞçuÃ2ùçà!ìÐ… á®mÝÎú.gáÂ…—-2Cçϱc×nfÍžï G¶½-ƒH6 0Ö’r†ayq±ùÛß'Un‹EÂÇ–òÖ«;X·î'är¹ k:::èîînèŠAH2¾tT `ß‘¼âò*Ä%ì±.ë¡)œ¤úõo±ªc:§aóæ-ttt$u!ÇgæÍC ¸DgÊsq——ù[+£(D ‰¤¹@Ô'{ªÿŠ\aK%*/o!\ø KÇ«>xˆ{ï]À÷–,Ásݦ®ÆŒ£à8Š q¤r"!Ñ,Ž‚¤Ö_]V«ÔvþŠÌž½¼µs•ÎiR+êWÃNü¬£iíUëèºøÝä D-%§Ô©ÖƒÖRGƬY-ùÁbãÛööënXL_?ÁæmÔUÚú•ôÖ‚ FH©ÚŒ½hmr¼èêšH¡S5Î]DÎ\Dø‡7±AЪ/¡íHkJåQ"ï¿ãamÌZÆZtÂë1¿ƒ¸íÖIOÒ¶î c #BDD3DF", ", c #BDD3DE", "' c #BDD4DF", ") c #BCD3DE", "! c #C0D4DE", "~ c #C6DBE5", "{ c #CCDFE9", "] c #D0E3EC", "^ c #D2E3ED", "/ c #D3E4ED", "( c #D1E3EC", "_ c #C5DAE5", ": c #BBD2DE", "< c #BAD1DC", "[ c #C9DDE7", "} c #D4E5EE", "| c #D7E7EF", "1 c #D9E8F0", "2 c #DBE9F1", "3 c #DBEAF1", "4 c #DAE8F0", "5 c #D8E7EF", "6 c #D5E5EE", "7 c #C8DCE7", "8 c #BBD2DD", "9 c #B9CFDB", "0 c #BFD4DE", "a c #C4D9E4", "b c #D0E2EC", "c c #D5E6EE", "d c #DDEAF1", "e c #DFECF2", "f c #E1EDF3", "g c #DCE6EC", "h c #AEB6BA", "i c #9DA5A9", "j c #B4BDC1", "k c #DCE7ED", "l c #C2D8E3", "m c #BAD1DD", "n c #B7CEDA", "o c #BFD3DD", "p c #BFD4DF", "q c #C7DCE6", "r c #D2E4ED", "s c #D8E7F0", "t c #E1ECF3", "u c #E4EEF4", "v c #E7CED4", "w c #EA949A", "x c #92989B", "y c #000000", "z c #0E0E0E", "A c #666A6C", "B c #D6DFE5", "C c #C6DBE6", "D c #B9D1DC", "E c #B6CDD9", "F c #DFEBF2", "G c #E3EEF4", "H c #E6F0F5", "I c #EAAAAF", "J c #ED242B", "K c #EE6D74", "L c #828688", "M c #1E2020", "N c #C6CED3", "O c #D3E5ED", "P c #B7CFDB", "Q c #B0C7D2", "R c #E4EFF4", "S c #E8F1F6", "T c #EBBABF", "U c #ED1F26", "V c #ED1C24", "W c #EF696F", "X c #8A8D8E", "Y c #202121", "Z c #DCE4E8", "` c #E5EFF4", " . c #E0ECF2", ".. c #C1D7E2", "+. c #B1C8D3", "@. c #BED3DE", "#. c #BFD5E0", "$. c #E9F2F6", "%. c #ECE7EB", "&. c #ED3038", "*. c #EF4D54", "=. c #ADAFB0", "-. c #E4E4E4", ";. c #838384", ">. c #707375", ",. c #B0B5B8", "'. c #A4A9AD", "). c #DAE6EC", "!. c #A6BCC6", "~. c #ECF4F8", "{. c #EE898E", "]. c #ED222A", "^. c #EAE0E1", "/. c #090909", "(. c #7D7D7E", "_. c #414141", ":. c #131414", "<. c #C6CCCF", "[. c #231F20", "}. c #515052", "|. c #DCE9F0", "1. c #D6E6EF", "2. c #C5DAE4", "3. c #A9BFCA", "4. c #BED4DE", "5. c #BED5E0", "6. c #E7F0F5", "7. c #EBF3F7", "8. c #F0F2F5", "9. c #EE2F36", "0. c #F59A9E", "a. c #737474", "b. c #C9CED1", "c. c #3E3C3D", "d. c #CED5DA", "e. c #D1E2EC", "f. c #B1C7D2", "g. c #9BAFB9", "h. c #EEF5F8", "i. c #F0BCC0", "j. c #EE2A32", "k. c #F4DBDD", "l. c #424242", "m. c #B6B9BB", "n. c #D7DDE0", "o. c #EAF2F6", "p. c #9CAFBA", "q. c #F0F6F9", "r. c #F08489", "s. c #EF3C43", "t. c #F6DADB", "u. c #7F7F80", "v. c #0F0F0F", "w. c #C8CBCD", "x. c #ECF3F7", "y. c #C7DAE4", "z. c #9EB3BD", "A. c #EDF4F8", "B. c #F2F7F9", "C. c #EF5C62", "D. c #EE272F", "E. c #F69195", "F. c #F2E2E3", "G. c #8E8E8F", "H. c #121212", "I. c #0E0E0F", "J. c #F1F5F7", "K. c #F2F7FA", "L. c #E2EDF3", "M. c #CEE0E9", "N. c #A2B7C2", "O. c #8B9CA5", "P. c #BAD0DA", "Q. c #BED4E0", "R. c #E3EEF3", "S. c #F3F7FA", "T. c #EE3F47", "U. c #ED242C", "V. c #F48287", "W. c #E5DCDD", "X. c #3F3F40", "Y. c #676869", "Z. c #F7FAFC", "`. c #F3F8FA", " + c #D1E2EB", ".+ c #A6BBC5", "++ c #8597A0", "@+ c #EFF5F9", "#+ c #EE333B", "$+ c #EF3D44", "%+ c #F3D7D9", "&+ c #EAEBEC", "*+ c #F4F8FA", "=+ c #EAF2F7", "-+ c #DCEAF1", ";+ c #A7BBC6", ">+ c #82939C", ",+ c #EE3037", "'+ c #EF383F", ")+ c #F9EEEF", "!+ c #F8FAFC", "~+ c #A6B9C4", "{+ c #7F9098", "]+ c #B8CEDA", "^+ c #EE3C43", "/+ c #F37C80", "(+ c #D0E1EA", "_+ c #A0B3BD", ":+ c #7A8A92", "<+ c #BAD2DD", "[+ c #EF535A", "}+ c #EE2C21", "|+ c #F1511B", "1+ c #EE2B22", "2+ c #EE2830", "3+ c #F6F4F6", "4+ c #CCDEE7", "5+ c #95A9B2", "6+ c #76858D", "7+ c #CBDFE9", "8+ c #F0787E", "9+ c #ED2123", "0+ c #FCD006", "a+ c #FEEB01", "b+ c #F57815", "c+ c #F3D1D4", "d+ c #C2D5DE", "e+ c #8A9BA4", "f+ c #B9D0DC", "g+ c #F0ADB2", "h+ c #F68B11", "i+ c #FFF200", "j+ c #F47316", "k+ c #F1C0C4", "l+ c #D4E5ED", "m+ c #B2C5CF", "n+ c #7C8D95", "o+ c #B5CCD8", "p+ c #EFEAED", "q+ c #ED252C", "r+ c #F89F0E", "s+ c #FEE902", "t+ c #EF2E21", "u+ c #EFD3D7", "v+ c #DAE9F0", "w+ c #CDDEE8", "x+ c #9AADB7", "y+ c #73828A", "z+ c #B2C9D5", "A+ c #EE7177", "B+ c #F0431E", "C+ c #FFED01", "D+ c #F57615", "E+ c #ED2C34", "F+ c #EDF1F5", "G+ c #B9CCD6", "H+ c #83949C", "I+ c #B5CCD7", "J+ c #CFE2EB", "K+ c #ECDADF", "L+ c #F78E11", "M+ c #F79510", "N+ c #EC8187", "O+ c #CADCE5", "P+ c #98ABB5", "Q+ c #738289", "R+ c #A8BDC8", "S+ c #BCD1DC", "T+ c #D2E3EC", "U+ c #EC9EA4", "V+ c #F68413", "W+ c #F68113", "X+ c #ED383F", "Y+ c #E9E6EA", "Z+ c #AABDC7", "`+ c #7C8C94", " @ c #9CB0BA", ".@ c #A6BBC6", "+@ c #EA8F95", "@@ c #ED1D25", "#@ c #EF2F21", "$@ c #FDDA04", "%@ c #FCD205", "&@ c #EC363D", "*@ c #E7D2D8", "=@ c #B3C7D1", "-@ c #84959D", ";@ c #6E7C84", ">@ c #95A9B3", ",@ c #BED3DD", "'@ c #E7BBC1", ")@ c #EC4E55", "!@ c #EE2922", "~@ c #F46917", "{@ c #F36717", "]@ c #EE2622", "^@ c #ED272F", "/@ c #EA787F", "(@ c #E5E1E7", "_@ c #B3C7D0", ":@ c #8798A1", "<@ c #707E86", "[@ c #8FA1AB", "}@ c #B5CAD4", "|@ c #CCDFE8", "1@ c #E4D9DF", "2@ c #E6B5BC", "3@ c #E6ACB3", "4@ c #E5C0C6", "5@ c #E2E7ED", "6@ c #C9DBE5", "7@ c #A9BCC6", "8@ c #6F7E85", "9@ c #A4B8C2", "0@ c #BED1DB", "a@ c #D4E4ED", "b@ c #B7CAD4", "c@ c #96A9B2", "d@ c #7A8991", "e@ c #6D7B83", "f@ c #81919A", "g@ c #8C9FA8", "h@ c #9FB3BD", "i@ c #C2D5DF", "j@ c #CBDDE6", "k@ c #CFE0E9", "l@ c #D0E1EB", "m@ c #BFD2DC", "n@ c #AEC1CB", "o@ c #96A8B2", "p@ c #707F87", "q@ c #788890", "r@ c #7E8E97", "s@ c #889AA3", "t@ c #91A4AD", "u@ c #99ABB5", "v@ c #9CAEB8", "w@ c #9BAEB8", "x@ c #97A9B3", "y@ c #8D9FA8", "z@ c #77868E", "A@ c #718087", "B@ c #717F87", "C@ c #707F86", "D@ c #6D7C83", " . + . @ # $ ", " % @ & * = - - ; > , ' ) ", " ! & = ~ { ] ^ / / ^ ( { _ * : < ", " ! @ @ [ ( } | 1 2 3 3 2 4 5 6 ( 7 ' 8 9 ", " 0 & a b c 1 d e f g h i j k e d 1 c b l m n ", " o p q r s d t u v w x y y y z A B f d s / C D E ", " 0 p q / 1 F G H I J K L y y y y y M N G F 4 O C P Q ", " & a r 1 e R S T U V W X y y y y y y Y Z ` .4 / ..+. ", " @.#.b s F R $.%.&.V V *.=.y y y y -.;.y >.,.'.).s b E !. ", " * [ c d G S ~.{.V V V ].^./.y y y (._.y :.<.[.}.|.1.2.3. ", " 4.5.( 1 t 6.7.8.9.V V V V 0.a.y y y y y y y b.c.d.f 4 e.f.g. ", " * _ } d u $.h.i.V V V V V j.k.l.y y y y y y m.n.o.R d 6 # p. ", " ) { | e H 7.q.r.V V V V V V s.t.u.v.y y y y w.q.x.H .s y.z. ", "* ) ] 1 f S A.B.C.V V V V V V V D.E.F.G.H.y I.J.K.A.S L.4 M.N.O.", "P.Q.^ 2 R.$.h.S.T.V V V V V V V V V U.V.W.X.Y.Z.`.h.$.R.2 +.+++", ") ; / 3 G $.@+`.#+V V V V V V V V V V V $+%+&+Z.*+@+=+R -+( ;+>+", ": ; / 3 G $.@+`.,+V V V V V V V V V V V V '+)+!+*+@+=+R -+( ~+{+", "]+' ^ 2 R.$.h.S.^+V V V V V V V V V V V V V /+Z.`.h.$.R.2 (+_+:+", "m <+b 4 L.S A.B.[+V V V V }+|+1+V V V V V V 2+3+K.A.S L.4 4+5+6+", " D 7+5 e H x.q.8+V V V V 9+0+a+b+V V V V V V c+q.x.H .s d+e+ ", " f+a 6 d u $.h.g+V V V V V h+i+i+j+V V V V V k+h.=+R d l+m+n+ ", " o+<+( 4 f 6.x.p+q+V V V V r+i+i+s+t+V V V V u+x.6.f v+w+x+y+ ", " z+~ c d G S A.A+V V V B+C+i+i+i+D+V V V E+F+$.u d 6 G+H+ ", " 3.I+J+s F ` $.K+U.V V L+i+i+i+i+M+V V V N+$.` e 1 O+P+Q+ ", " R+S+T+4 .` S U+V V V+i+i+i+i+W+V V X+Y+` .4 (+Z+`+ ", " @.@p / 4 F u 6.+@@@#@$@i+i+%@1+V &@*@u e 4 +=@-@;@ ", " >@N.,@T+s d f R '@)@!@~@{@]@^@/@(@f d 1 (+_@:@<@ ", " [@g.}@|@6 4 d .L.1@2@3@4@5@ .d v+6 6@7@H+8@ ", " :@[@9@0@M.l+5 4 2 -+-+2 4 5 a@4+b@c@d@e@ ", " f@g@h@=@i@j@k@ +l@M.O+m@n@o@{+p@ ", " q@r@s@t@u@v@w@x@y@>+z@<@ ", " p@A@B@C@8@D@ "}; flamerobin_0.9.3~svn+2220.orig/res/folder.xpm000066400000000000000000000021521177057155300207750ustar00rootroot00000000000000/* XPM */ static const char * folder_xpm[] = { "16 16 50 1", " c None", ". c #000000", "+ c #E4E5DE", "@ c #D3D5CA", "# c #A5A797", "$ c #F3F4F0", "% c #ABAE99", "& c #BDC0AD", "* c #BCBEAA", "= c #B1B49F", "- c #6E715C", "; c #E6E7DD", "> c #F5F6F3", ", c #E4E5DB", "' c #E2E4D9", ") c #E1E3D8", "! c #DFE1D6", "~ c #C4C6B6", "{ c #F7F7F6", "] c #D3D6C5", "^ c #D3D6C4", "/ c #D2D4C2", "( c #D0D2C0", "_ c #CED1BD", ": c #CCCEBA", "< c #CACDB9", "[ c #C8CBB6", "} c #C6C9B3", "| c #C4C8B1", "1 c #93967C", "2 c #F0F0EB", "3 c #F0F1EC", "4 c #C3C6AF", "5 c #C1C4AD", "6 c #909478", "7 c #EFF0EB", "8 c #BFC2AB", "9 c #BDC1A8", "0 c #8E9175", "a c #EDEEE8", "b c #BBBEA5", "c c #BABDA3", "d c #8B8F72", "e c #ECEEE7", "f c #B7BAA0", "g c #E8E8E0", "h c #C6C9BA", "i c #8E9276", "j c #8C9073", "k c #646751", " ", " ", " .... ", " .+@@#. ", " .$%&*=-....... ", " .;>;;;,;''))!~.", " .{]^/(_:<<[}|1.", " .2]^/(_:<<[}|1.", " .3/(_:<[}}|456.", " .7_:<[}|445890.", " .a<[}|45889bcd.", " .e}|4589bbcffd.", " .g4589bcfffffd.", " .h6i0jdddddddk.", " ............. ", " "}; flamerobin_0.9.3~svn+2220.orig/res/foldero.xpm000066400000000000000000000024751177057155300211640ustar00rootroot00000000000000/* XPM */ static const char * foldero_xpm[] = { "16 16 64 1", " c None", ". c #000000", "+ c #E4E5DF", "@ c #D5D6CB", "# c #D6D7CA", "$ c #A3A39D", "% c #F5F6F0", "& c #8D907B", "* c #92957E", "= c #90937D", "- c #979B84", "; c #6D705F", "> c #EAECDB", ", c #8A8C7D", "' c #8E917B", ") c #91947F", "! c #8B8E7A", "~ c #999B87", "{ c #919480", "] c #989B86", "^ c #B1B4A2", "/ c #A2A394", "( c #F7F7F7", "_ c #878A75", ": c #666858", "< c #4B4D3F", "[ c #4D4F40", "} c #404135", "| c #424337", "1 c #434437", "2 c #404236", "3 c #3C3D32", "4 c #48493C", "5 c #1A1A16", "6 c #C6C6BE", "7 c #848672", "8 c #25261F", "9 c #F1F2E9", "0 c #DDE0C7", "a c #D6DABB", "b c #CDD2AC", "c c #C7CCA7", "d c #989C80", "e c #C6C7BE", "f c #5F6152", "g c #888980", "h c #A7AB8C", "i c #878A70", "j c #9FA19A", "k c #EFF0E5", "l c #9EA284", "m c #80817B", "n c #96968D", "o c #E3E5D1", "p c #83866D", "q c #97998D", "r c #EDEFE2", "s c #A2A688", "t c #767671", "u c #E7E9DA", "v c #D1D3BD", "w c #BBBF9D", "x c #989B80", "y c #6E715C", " ", " ", " .... ", " .+@#$. ", " .%&*=-;..... ", " .>,')!~{]{^/. ", " .(_:<[}||12345 ", " .67890abbbbbcd.", " .efg0bbbbbbbhi.", " .j8kabbbbbbbl. ", " .mnobbbbbbbbp. ", " .qrbbbbbbbbs. ", " .tuvwwwwwwxy. ", " ........... ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/fricon.ico000066400000000000000000000303561177057155300207570ustar00rootroot0000000000000000¨6  ¨Þh†-(0`€Š‚s”Œ|š‘€˜˜–Ž~•}”‹{ˆx…~o¢™‡¥œŠ¦‹§‹§žŒ§žŒ§žŒ§‹¦‹¤›‰¢™ˆ —…›“‚˜”‹{ˆyyj­£­£®¥’±§”³©•¶¬™¸¯œ½´¡¾´¢¾µ¤¾µ¤»² ¸¯ž´ª™¯¥“§žŒ¢™ˆœ”ƒ–Ž~‘‰y‡q²¨•³©•´ª—¸®š¾´ Æ¼©ÍIJÑɸÓË»Ô̽ÖξÖξÕ;Ô̽ÒÊ»ÏǸÌóƾ®½´¤²©—¦‹ž•„—~ˆy…~o²¨”·­™¹¯›¼²Æ»¨ÏÆ´×ϾÛÓÃß×ÈãÚÌåÝÏçßÐèàÒèàÒèáÒçßÑæÞÐäÜÍàÙÊÛÓÄÖÎ¾ÎÆ·Å½­¶®œ§žŒ”ƒ”Œ|އwwqd¼²¼²Àµ Ç¼§ÔʸÛÒÁáØÈæÝÏéâÓíåØîæÙðéÜñêÝòëÞòìßòìßòëßñêÝïéÜíæÚëäÖçßÑãÚÌÚÓÄÑɺƾ¯´«š£šˆ™€‘‰y‚{mÀ¶¡Á·¢Åº¥ÐƲÝÕÃäÛËèáÑìä×ïçÚðêÝòìßóíáóíâôîãçáäÀºæÀºæÀºæÚÔåóîãóíâñëßñêÞíæÚêãÕäÜÍÚÓÄÐȸ¿·¦© œ”ƒ“‹{†qꥯ¼¦Ê¿©ÙϼâØÇçàÏìäÖïçÚñêÝòìàóíãôïäÚÕæyê>7ì$í$í$í$í$í1)írkêÍÇæôîäóíâñëßíæÚèâÓàÙÊÖξƾ¯¯¥“Ÿ–…”Œ|‡€qɾ¨Ê¿©ÎíÝÓÀåÜËêáÓîæØðéÜòìàóîãôïåõðæ†ê$í$í")î¢øÊü×ý ¯ùDð$í$í$írkêèâæôîäòìáðéÝëä×åÝÏÙÑÃʲ³ª˜ —…•}ˆqÌÁ«ÎÃ¬ÑÆ¯àÕÂæÞÍëãÔðèÚñêÝóíáôïäõðæéäèYQì$í$í")îÊüòÿòÿòÿòÿåþRò$í$í$íKDìèãçõïåóîãñëßíæÚçßÐÚÒÃÌij²¨– —…•}}viʾ©ÑůÓǰáÖÂèàÎìäÔðèÚòëßóíâôïåõñçöòéYRì$í$í$í¢øòÿòÿòÿòÿòÿòÿ×ý$í$í$í$íKDìéäéõðæôîäñëàíæÚçßÑÚÒÃÉÁ±¯¥“Ÿ–…•}É¿«ÔɲÕɲßÓ¾èßÎíäÔðèÚòëßóíâõïåöñè÷óê€zì$í$í$í$í ½ûòÿòÿòÿòÿòÿòÿòÿDð$í$í$í$íf_ìöòéõðçôîäòìàíæÚæÞÐÙÐÁļ«ª¡Ž”ƒ“‹{Ù͵Ù͵ÜйéßÎìãÓïçÙòëÞóíâõïåöñè÷óëÐËí$í$í$í$í$í ½ûòÿòÿòÿòÿòÿòÿòÿRò$í$í$í$í$í½ìöòêõðçôîäñëßìåØäÛÍÔ̽½´¡§‹›“‚ÒȲÛÏ·ÛÏ·èÝÉìãÒïç×ñêÝóíáôïåöñè÷óëøôíYRí$í$í$í$í$í¢øòÿòÿòÿòÿòÿòÿòÿ 7ï$í$í$í$í$íf`í÷óìöòéõðæôîãñëÞêãÕàØÉÎÇ·²©–¢™ˆ–~ÜѹÜйâÖÀìãÐïæÖñéÛòìàôîäõðç÷òêøôíÿî$í$í$í$í$í$í 7ïåþòÿòÿòÿòÿòÿ×ý$í$í$í$í$í$í$íøõî÷óìöòéõðæóíâîèÛçßÐÙѹ§«¢ —…̯ÝѺÝѹéßËíäÓðèÙñêÝóíâõðæöòé÷ôìøõïtnî$í$í$í$í$í$í$í‡öòÿòÿòÿòÿòÿ‡ö$í$í$í$í$í$í$íÄ¿ïøõî÷óëöñèôïäñëßìäØáØÊÏǸ´ª˜¦‹–Ž~ÛйÝÒ»àÔ¾ìâÑïæÖñéÛòìàôïäöñè÷óëøõîùöð1*í$í$í$í$í$í$í$íRòòÿòÿòÿòÿåþ")î$í$í$í$í$í$í$íÄÀñùöïøôí÷òêõðæóîãïéÜçßÐÙÐÁ¹§­£¢™ˆÞÓ¼ÞÒ»æÚÆíåÓðçØñêÝóíâõðæöòéøôíùöïÄÀñ$í$í$í$í$í$í$í$íRòòÿòÿòÿòÿ_ó$í$í$í$í$í$í$í$íÅÁòù÷ñøõî÷óëöñèôïäñëßëäÖÞ×ÈÍij³©•§žŒË¯ÞÓ¼ÞÒ¼êàÍîåÕðèÚòëßôîäõñç÷óëøõîùöñŠð$í$í$í$í$í$í$í$í¢øòÿòÿòÿlô$í$í$í$í$í$í$í$í$íÅÁòú÷óùöïøôíöòéõðæóíâîçÚäÜÍÕ̼»±ž¬¢˜ÒȵßÔ½àÕ¾íãÑîæÖñéÛòìàôïåöñè÷óìøõïú÷ògaï$í$í$í$í$í$í$í_óòÿòÿ ¯ùDð$í$í$í$í$í$í$í$í$í$íÓÐôúøôùöñøõî÷óêõðçóîãñêÝèàÑÙÐÁú§±§”§žŒÛлßÔ¾ãØÂíäÒïçØñêÜóíáõïåöòéøôíùöðúøóLEî$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í2*îüú÷úøôù÷òøõî÷óëöñèôîäñëÞêãÕÝÕÅÊÀ®´ª—ª¡ŽàÕÀßÔ¿åÛÇîäÓïçÙñêÝóíâõðæ÷òêøôíùöñúøô$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$íƒ~òüú÷ûùõú÷òùöï÷óìöñèôïåòìàíåØàØÈÏÆ³¹¯š­¤‘àÖÁàÕ¿æÛÇîåÔðçÙñêÞóíãõðæ÷óêøõîù÷ñúøô$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í2*îïîùüú÷ûùõúøóùöïøôìöòéõïåóìàíåØãÚËÔ˺¼²±§”áÖÁàÕÀçÝÊîåÔðèÙòëÞôîãõðç÷óëøõîù÷ñúøô$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í¬©öýüúüúøüùöúøóùöðøôíöòéõïåóíáîæØåÜÍØÏ½¿´Ÿ´ª—á×ÂàÖÁèÞËîåÔðèÚòëÞôîãõðç÷óëøõîù÷ñúøô$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í¬©öýýûýüúüúøüùöúøóùöðøôíöòéõïåóíáïçÙæÝÎÙϾÀ¶¡·­™á×ÃáÖÁçÜÈîæÕðèÙòëÞóîãõðç÷óëøõîù÷ñúøô$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í2*î­©÷îíì__^ýüúüú÷ûùõúøóùöïøôíöòéõïåóìáïçÙæÝÎÚÑÀ¸¢¹¯›âØÃáÖÂæÜÈîåÔïèÙñêÝóíâõðæ÷òêøôíùöñúøô$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$í$íhcóäãý¿¿¾žœüú÷ûùõú÷òùöï÷óìöñèôïåòìàïçÙåÝÍØÎ¼Ä¹¤»±ßÕÂá×ÃåÛÇíåÔðèØñêÜóíáõïæöòéøôíùöðúøóLEî$í$í$í$í$í$í$í$í$í$í$í$í$í$ívqôÖÔüïïïppp//.üú÷úøôù÷òøõî÷óëöñèôîäòìßíæ×åÜÌ×ͺŤ¼²ØÎ¼âØÄãÙÄîåÓïçØñéÛòìàôïåöñè÷óìùöïú÷ògaï$í$í$í$í$í$í$í$í$í$í$í$íhcóäãýßß߀€€ìêçúøôùöñøõî÷óêõðçóîãòëÞíåÖäÛËÔʵź¥¿´ŸÏǵâÙÅá×ÃìãÑïæÖðèÛòëßôîäõñç÷óëøõîùöñŠð$í$í$í$í$í$í$í$í$í$í$í­ªøïïï```¼º·úøóùöïøôíöòéõðæóíâñêÝëãÔäÚÉÑÆ²Æ¼¦ãÚÆâØÄéßÍîæÕðèÙñêÝóíâõðæöòêøôíùöïÄÀñ$í$í$í$í$í$í$í$í$í$í­ªøÏÏϼº·ù÷ñøõî÷óëöñèôïåòìàñéÛëâÓãÙÇͬƼ¦äÚÇãÙÆåÜÈîæÔðçØñéÛòìàôïäöñè÷óëøõîùöñ1*í$í$í$í$í$í$í$í$í’õßßÞ»¹¶š˜–ÏÌÇ÷òêõðæóîãòëÞïçØéàÐÞӿͬȽ§ÖÍ»ãÚÇâØÄíäÒîç×ðéÚòëÞóíâõðæöòéøôìùõïtnî$í$í$í$í$í$í$í?8ïïïú???»¸´}|-,0ÎÊÃôïåòìàñéÜîæÖçßÍ×̶Îìʿ©äÛÈãÙÆçÞËîæÕðçØñéÜòìàôîäõñç÷óêøôíÿï$í$í$í$í$í$í$푌ô¾½¼éæßVTV #;9;æàÖòëÞðèÙíäÓæÜÉÓȱÐÅ®ßÖÅäÛÈãÙÆíäÒîæÖðéÚñêÝóíáôïåöñè÷óëøôíYRí$í$í$í$í$í$íáß÷_^^ ïïïïïï /.-êæà # #-,/–’ŒñéÛïæÖëâÐÝÒ¼ÕɲÑůåÜÊäÚÇçÞÊîåÕïç×ðèÛòëÞóíâõðåöñè÷óëþí$í$í$í$í$í?8îüú÷ @@@ÿÿÿÿÿÿ@@@š˜“¦£ HFH¤ œåßÕñêÜðçØíäÓèÝÉÙζÖʳÌ­ÜÔÃåÜÊãÚÆêáÏïæÕðçÙñéÜòëßóíãõðåöñè÷óë€zì$í$í$í$íZSïúøôpppppp..,öòêõðçôïåóíáñêÝðèÙîåÕëáÎÞÒ»ÛÏ·Ù͵åÝËåÛÉäÚÇíäÓîæ×ðèÙñéÝòìßóíâôïåöñç÷òêLDí$í$í$í|ﻹµÈĽõðæôîäóíáñêÝðèÚîæÕìãÑâ×ÁÜйÜиɿ¬æÝËäÛÉåÛÉîäÔîæÖðèÙñéÜòëÞóíâôïäõðæéäèKDì$í$íŽˆíº¸³™–õðæôîãòìàñêÝðèÚïæ×ìäÒæÛÆÝѺÝѹÕË´ÚÑÁæÝËäÛÉçÞËîåÕîæ×ðèÙñéÛñêÝòìàóîãôïåèãçslë$íf_ìØÔÍÇúôïäóíâòìßñêÜðèÙîæÖíäÒçÜÈÝÒ»ÝÒ»ÛϸÝÕÅæÝÌåÛÉåÛÉíäÓïæÖðçØðéÚñêÜòëÞóíáóîãôïäÀºçŒ†éöñçzwråßÖóíâòìàñêÝñéÛïçÙîæÕíäÒæÛÇÞÓ¼ÞÓ¼ÛкÝÕÅæÝÌåÜÊæÜÊìãÑîæÕïç×ðèÙðéÛñêÜòëÞòìàóíáóîãôîä·³«zwrzwrzwrzwq·²ªóíâóíáòëßñêÝñéÛðèÚïç×îåÕìãÑäÙÄßÔ½ßÔ½ÛÑ»ÞÕÅæÞÍåÜËäÛÈèßÍïæÕïæÖïçØðèÙðéÚñéÜñêÜñëÞòëÞòìßòìßòìàòìßòëßòëÞñêÝñéÜðéÛðéÙðç×îåÕíåÓêàÌáÖÀßÔ¿ßÔ¿ÜÒ¼çÞÍæÝÌåÜÊåÜÉéàÏïæÕîæÖîæ×ïèÙðèÙñéÙðéÚðéÛñéÛñéÛñéÛðèÛðéÚðèÙðçØïæ×îæÖíåÔìâÏäÙÄàÕÀàÕÀàÕÀØÎºäÜËæÞÍåÝËäÛÉåÜÉéàÎìäÓïæÕîæÖïçÖïæ×ïç×ïç×ïç×ïç×ïç×îæÖïæÖîæÔíäÓéßÌäÙÅáÖÁáÖÁáÖÂáÖÁäÛËæÞÍåÝËåÜÊäÛÈåÜÉçÞÌêáÏìâÐíäÓîåÔîåÔîåÓëâÐêáÎèÝÊåÛÇá×Ãá×ÃâØÃâØÃâØÃÖͺáØÇæÞÍæÝËåÜËåÛÉäÛÈäÚÇãÚÆãÙÆãÙÆâÙÅâÙÅâÙÅãÙÅãÙÆãÙÆãÙÆãÙÅÝÕÅæÝÌæÝÌåÝËåÜÊåÜÊåÛÉäÛÉäÛÉäÛÈäÛÈÞÕÃÿÿàÿÿÿÿÿÿüÿÿðÿÿÀÿÿ€ÿÿþ?üøðààÀÀ€€€€€€ÀÀààðøøü?þÿÿÿÀÿÿàÿÿøÿÿþÿÿÿÀÿÿ( @ €^WIÿ‹ƒtÿˆrÿ‡qÿ†~pÿƒ|nÿzlÿ^WIÿ„}oÿž•„ÿ¡™‡ÿ§‹ÿ«¡ÿ¬¤’ÿ®¦•ÿ®¥”ÿ© ÿ¢™ˆÿ–Ž~ÿŒ„uÿzlÿ^WIÿ…uÿª¡Žÿ°¦“ÿ»±ŸÿÇ¿¬ÿÔË»ÿÙÑÂÿÛÔÄÿÝÕÆÿÜÔÅÿÙÒÄÿÕ;ÿËóÿº²¢ÿ§ŸŽÿ“‹{ÿ‚{mÿ^WIÿ·­œÿ·­™ÿù¥ÿÓʹÿáØÈÿèàÐÿìå×ÿðéÛÿñëÝÿòëÞÿòëÞÿñêÝÿíæÚÿêãÕÿãÚÌÿ×ÏÀÿÄ»ªÿ§ŸŽÿ†vÿ…rÿ»±ÿÀ¶¡ÿÑÇ´ÿâÙÉÿêâÔÿïèÚÿòëßÿóíâÿÚÔäÿ¦ŸçÿŒ…éÿŒ…éÿŒ…èÿ³¬æÿóíâÿñëßÿìåÙÿåÝÏÿÕ;ÿ·¯žÿ–Ž~ÿzlÿŤÿɾ¨ÿÛÒ¿ÿçßÏÿîçØÿòëßÿóîãÿçâæÿyêÿ$íÿRòÿ ¯ùÿ¢øÿRòÿ$íÿ>7ìÿ³­èÿôîäÿðêÞÿëä×ÿÜÔÅÿÀ¹¨ÿ›“‚ÿƒ|nÿÏůÿÎìÿßÕÂÿéáÑÿðèÛÿóìáÿôïåÿéäèÿKDìÿ$íÿ_óÿòÿÿòÿÿòÿÿòÿÿRòÿ$íÿ$íÿ§¡êÿõðæÿòìáÿìåÙÿߨÉÿºªÿš‘€ÿŒ…wÿ»´¦ÿÓǰÿßÔÀÿêáÒÿðèÚÿóíáÿõðæÿöòéÿYRíÿ$íÿ$íÿ ¯ùÿòÿÿòÿÿòÿÿòÿÿ ¯ùÿ$íÿ$íÿ$íÿ½ëÿõðçÿóíâÿìåÙÿÝÕÆÿº²¡ÿ•}ÿwo_ÿÙ͵ÿÜѺÿêáÐÿïçÙÿòìàÿõðæÿ÷òêÿ¨£íÿ$íÿ$íÿ$íÿ ¯ùÿòÿÿòÿÿòÿÿòÿÿ ½ûÿ$íÿ$íÿ$íÿ>7íÿ÷óëÿõðçÿòìáÿëä×ÿ×Ï¿ÿ­¥“ÿ‡xÿ»´¦ÿÜѹÿèÞÊÿîæÖÿòëÞÿôïäÿöòéÿøôíÿ?7íÿ$íÿ$íÿ$íÿRòÿòÿÿòÿÿòÿÿòÿÿ”÷ÿ$íÿ$íÿ$íÿ$íÿÐÌîÿ÷òêÿõðæÿðêÞÿæÞÐÿÉÀ¯ÿ —…ÿwo_ÿÞÒ»ÿáÕ¿ÿíäÓÿñéÛÿóíâÿõñçÿ÷ôìÿ¶²ïÿ$íÿ$íÿ$íÿ$íÿ$íÿ ½ûÿòÿÿòÿÿòÿÿ 7ïÿ$íÿ$íÿ$íÿ$íÿœ—ïÿøôíÿöòéÿôîäÿíæÚÿÚÒÃÿ³ª˜ÿ•}ÿÞÓ¼ÿçÜÈÿïæÖÿòëÞÿôïåÿ÷òêÿøõîÿtnïÿ$íÿ$íÿ$íÿ$íÿ$íÿ¢øÿòÿÿòÿÿ”÷ÿ$íÿ$íÿ$íÿ$íÿ$íÿŠðÿùöðÿ÷óëÿõðæÿñëßÿåÜÎÿż«ÿ —…ÿ»´¦ÿÞÓ½ÿìâÐÿðèÙÿòìàÿõðçÿ÷ôìÿùöñÿLEîÿ$íÿ$íÿ$íÿ$íÿDðÿåþÿòÿÿ”÷ÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ˜ñÿù÷òÿøôíÿöñèÿóíâÿëäÖÿÓË»ÿ© ÿ„}oÿáÖÁÿâ×ÂÿîäÓÿðéÛÿóíâÿöñèÿøôíÿú÷òÿ$íÿ$íÿ$íÿ$íÿ$íÿ 7ïÿRòÿ 7ïÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿÔÐõÿúøóÿøõïÿöòêÿôîäÿîçÚÿÜÔÄÿ´ª˜ÿž•„ÿá×ÃÿãØÃÿîåÕÿñêÜÿôîãÿöòéÿøõîÿúøóÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿZTðÿüúøÿûøôÿùöïÿ÷óëÿôïåÿñêÝÿáÙÉÿ¼³Ÿÿ£šˆÿâØÄÿåÛÈÿïæÖÿñêÜÿôïäÿ÷òêÿùõïÿÒÏòÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿÔÒøÿüûøÿûùõÿùöðÿ÷óëÿõðæÿòëÞÿäÛÌÿú§ÿ§‹ÿâØÅÿæÜÉÿïæÖÿñêÜÿôïäÿöòêÿùõïÿßÜòÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ2*îÿœ™æÿÎÍËÿüûøÿûøôÿùöðÿ÷óëÿõïæÿòëÞÿåÜÍÿÅ»¨ÿ¨ŸÿãÙÆÿäÚÆÿîåÕÿñêÜÿóîãÿöòéÿøõîÿúøóÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ[Uòÿ¶´Ûÿ00/ÿ ÿüú÷ÿúøôÿùõïÿ÷óêÿôïäÿñëÝÿåÝÍÿĺ¦ÿ¬¢ÿäÚÇÿäÚÆÿîåÔÿðéÚÿóíâÿöñèÿøôíÿù÷òÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿhcóÿ¸¶ëÿ€€€ÿÿÿÿÍËÈÿú÷óÿøõîÿöòéÿôîãÿñêÜÿæÝÍÿÆ»§ÿ±§”ÿîäÑÿãÙÆÿíäÓÿðèÙÿòìàÿõðæÿ÷óìÿùöðÿZSïÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ2*îÿ«¨éÿpppÿÿÿÿÿÿŒ‰ÿù÷ñÿøôíÿöñèÿóíâÿðéÚÿãÙÈÿź¥ÿš“…ÿäÛÈÿéàÎÿïç×ÿñêÝÿôîäÿöòéÿøõîÿ|ïÿ$íÿ$íÿ$íÿ$íÿ$íÿ$íÿ¸¶êÿ000ÿÿÿÿÿÿÿ}|yÿÐÍÉÿ÷óëÿõïæÿòëßÿîæÖÿÛÒ¾ÿź¥ÿåÝËÿæÜÉÿîåÖÿðéÛÿóíáÿõðçÿ÷óìÿÑÍïÿ$íÿ$íÿ$íÿ$íÿ$íÿupòÿ__^ÿÿÿÿÿÿÿÿŒŠ‡ÿ #ÿ³¯ªÿóîãÿñêÜÿëâÒÿÕÉ´ÿÆ»¥ÿëäÖÿäÛÉÿëáÐÿðçØÿñêÝÿôîãÿöñèÿøôìÿLEíÿ$íÿ$íÿ$íÿ$íÿÂÀÙÿÿÿÿÿpppÿPPPÿÿÿ¯¬¨ÿ #ÿ-,/ÿØÒÇÿïçØÿåÛÉÿÒÆ¯ÿ¼±›ÿæÞÍÿæÝÊÿïæÕÿðéÚÿòëßÿôïåÿöòéÿþìÿ$íÿ$íÿ$íÿ?8îÿŽŒ‹ÿÿÿÿÿÿÿÿÿ¿¿¿ÿÿÿ™–“ÿpmlÿ¾¹°ÿðéÚÿíäÓÿÞÒ½ÿÔɲÿîèÜÿæÝÌÿéàÎÿîæÖÿðèÛÿòìàÿôïåÿöñèÿslìÿ$íÿ$íÿYSîÿ}|yÿÿÿÿÿ000ÿ ÿÿ¸µ®ÿõðæÿóíáÿñéÜÿîåÕÿåÛÆÿÜиÿ¼±›ÿéâÓÿåÝËÿëâÑÿïç×ÿðèÛÿòëßÿôîãÿõðçÿslëÿ$íÿYRíÿ|zwÿÿÿÿÿÿÿ™–ÿôïäÿòìàÿñéÛÿîæÖÿéßËÿÝѺÿßÔ½ÿèàÑÿæÝÌÿëâÑÿîæÖÿðéÚÿñêÝÿóíáÿôîäÿŒ†éÿf_ëÿ{ytÿÿÿÿÿÿ¨¤ÿóíâÿòëÞÿðèÚÿîæÕÿéàÌÿßÔ½ÿÞÓ¼ÿèáÑÿæÝÌÿêàÏÿïæÖÿðçØÿðéÛÿñêÝÿòìàÿóíâÿÆÁ¸ÿzwqÿzwqÿyvqÿ§£›ÿòìàÿòëÞÿñéÛÿïçØÿîåÔÿçÝÉÿßÔ¾ÿßÔ¾ÿêäÕÿçßÎÿçÞÍÿìâÑÿïæÖÿïç×ÿðèÙÿðéÛÿñêÜÿñêÜÿñêÜÿñêÜÿðéÚÿðèÚÿðç×ÿîåÕÿêáÎÿãÙÄÿàÖÁÿãÙÅÿïéÞÿèáÑÿæÞÍÿçÞÍÿëáÏÿîåÕÿïæÖÿïæ×ÿïçÖÿïç×ÿîæÖÿîåÖÿíäÓÿéßÍÿäÚÇÿâØÄÿâØÄÿéâÓÿíçÛÿèáÑÿçßÏÿæÝÌÿçÞÌÿçÞÌÿèßÎÿèßÎÿæÝÊÿæÜÊÿãÚÇÿäÚÈÿäÛÈÿéâÒÿïéÝÿèáÑÿèàÐÿèßÏÿçßÏÿçßÏÿçÞÍÿìæÙÿÿðÿÿ€ÿþü?øðàÀÀ€€€€€€ÀÀàðøü?þÿ€ÿÿðÿ( @åÜÊÜиÝѺÝѺÜиåÜÊãÙÅÞÒ»çÞÊîæÖðéÛðéÛïæ×èÞËÞÓ¼ãÙÅÞÓ¼äÙÄðèÙæßጅèM”ñM”ñrkéÙÓãñéÜäÚÅÞÓ¼ãÙÅãÙÄñéÛõïåKDìlôòÿòÿlô1)íÛÖçòëÞäÚÅãÙÅÞÒ»ïçØôïå¹µõ$ílôòÿòÿzõ$í¹µõõñçñéÜÞÓ¼åÜÊçÝÉòìß÷óëLEí$í$íåþåþ")î$íYSîøôíóîãèÞËåÜÊÜиíäÓôîäøõï$í$í 7ï ¯ùDð$í$íZSïùöñõðçïæ×ÜиÝѹïæ×õðæÞÛð$í$í$í$í$í$íZSï¹µõú÷óöòéðéÛÝѺÝѹïæÖõïæëèð$í$í$í$íÔÎÃÔÎÃŒ‰‡?>=ú÷òöñéðéÛÝѺÜиíãÒôîãøõî$í$í$íÔÎÃ$#>$#>?>=ùöðõðæîæÖÜиåÜÊæÜÇòëÞöòêLEí$íÔÎÃ$#>>><Œ‰‡óíáçÞÊåÜÊÞÒ»îæÖóîã¹µõ$íÔÎÃ$#>øõï@@@433HFGãÛÍÞÒ»ãÙÅãØÂðèÙóîãrlëÔÎÃ>=<ÕÑÇñéÛäÙÄãÙÅÞÓ¼ãØÂîæÖòëÞÔÎÃkhc=;8[XTÔÎÃïçØãÙÄÞÓ¼ãÙÅÞÒ»æÜÇíãÒïæÖïæ×íäÓçÝÉÞÒ»ãÙÅåÜÊÜиÝѹÝѹÜиåÜÊøàÀ€€€€Ààøflamerobin_0.9.3~svn+2220.orig/res/fricon128.png000066400000000000000000000156771177057155300212350ustar00rootroot00000000000000‰PNG  IHDR€€ôà‘ù pHYs  šœgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFPLTEzŠ’í$ÿòÝêñæðõåïôÖæïàìòäîôëó÷éòöâíóÕåîÙèððöù×çïÜéñîõøíôøÛéñØèðòUxz|Þëòßìòø¨ ôøú;<=¼ÓÞµÍÙÚèðÿÿÿáíó¾ÔßÎàéèñöZ[\v…ÁÖàóøúÓäíÊÝæÂÔÝKKL«³·—šœ»ÒÞ–©³ÉÝèôo‚ƒöùüãîóºÑÝðDcef€‘šž²½p~†ÜêñçðõÌàëÑãììó÷ÏáëÐãìÀÕàúüýÔåî°ÄÎÎáëÒäíÂ×á¥¹Ä»ÎØlzûâãåðõ¹Ñݨ¾ÉÔäí½ÓÞ¬ÃÍ»ÒÝrˆïöùo}…š¯¹öŠÚéñŽ ©¾Õàêò÷òÁÅ# «­®‘¤­~—º½¾ÅÛæÝÞÞ¸ÐÜèºÀóÙÛ¸ËÕ¡µÀñöùÐâì²ÉÕ°ÆÑáìòŠœ¥Þëñìíîê†ýÕÎßèyˆ±ºò÷ù˜¬¶ÆØã“¦°ÑäíãîôjxÒãì¿Õß󌑮ÅÐÈÚäãíóèÉ΃”œ½ÔßìlsîSY„•žËÞ熘 çñöˆ™¢¢¬Íßç´ÊÖ|Œ”êó÷¼ÒÞí*1ªÁÌò÷úò™µÈÒÎâë¹ÑÜ¿ÑÚ뢧¢¸Âö¶¹êòöŸ¨÷úüð|‚¹ÐÜ‹¦ky€x‡s‚Ѝ¼ÇÄ×áq€‡m|ƒ¥»Æû½ ËßêØçð¿ÔßÂØã§½Èìæêë•›{‹“÷©­­ÄϪ¿ÊïõøèÕÛí7?Øçïî)"íDK‰›¤ÃÙä±ÈÓ…— ˜{‹”¤¸ÂþåÏÖÚÀ×â”§¯Ÿ³¾¼Óßtƒ‹ÇÜçòpuï7 ÂÕßüððòbhíÌЂ“›¬ÁË}•ïotðFMÍàéè®´·Ì×½ÑÛ¿ÒÜ‘¢«ñU[ï‰{Œ”½Óßnopxˆ¾ÅÉžŸ ×àåë_f½ÒÜ¿ÓÞÈÑ×Ñâëæâè>?? /00.,-õÑÓ”—­°² ¦©Öæîy‰‘»ÏÚ áçë]æžÓtRNS@æØfIDATxÚb``@d#7·êpð Ø\sˆ ´ó­: p†ƒ¿¤›@$[îé‰bo:ø»’4ˆ4Ój;ÄâJ¸@ †ñhÜvˆÕíA@  NP{;Ü D @¤yj9Øâ)ú¨`ʘKÚÁ€È` ¢7Äó`ÛA–ë˪eS»ÈS`C„ˆp~‡Xô|;ÐvÏ”õ »–:99ÙÛÛ×rœ@îp·[Ÿ¢n†ìˆ›„Ì B÷ÏO‰I±[´¹ÆÃC\ÁÄòððºèw;»”v¨@Ž˜BÀ€""ô!ÖŸÝd²èo Ý®¼¼¼ìHÈ9Ä£èww;ÃSú7€@.^+ˆ€÷A¡¿dýA;wˆí Ë6 ìEÀÎp…»á Ø 7à³ €ðg=°÷áÖƒlz\@@T”O^>**J€”¼ f=Äv å…’’¨@RB¢ä°àN°Ûäïß„+ó#yÿƒ=0ðÁÖƒmZÎÁ‘¯¨È-¦¦-`†¢b>Ð’`7ÀœJ †íP'øïÄj@áH~û±ô¾‡&ÂúB ÏóA×r‚Û{]]Ý÷@F-È!`GÝ °=ìsÜ׫ûCÁlvNû7*Éê§€¼ ý ëžÛÞb ²Äe.0AÀ%‹_¯k9Žºâp(¸jÖ8ͲK™ qÀì`,–.ûA¯¡;(öAÞ‡Y±Í•••í%*ÐùÎ  €QQv8@ÑrÂìÙK°¸ €°Ä¿:ÄþvCPðc_”/ ø`ë¡¶,žÚ«¢RÆ„.‰¿ºÁäp(á·+( õgÁ’´4Ì6@a"°ýÀäŒ~{W¨÷¡Öƒýn[<•q?7·°&øaìÇÆs‚ $4A áì’ÙK€Hð €ðÚ ~`ì½d}ë~FFÆÎÉ\\Ÿ˜°¯/áNBß  jœ@.;£D ¬ö·íwÛ¿êý õ@ÛUT¶2‚À.¬`ºô˜>@N(€.ð¹hý99ô&@¡¡Ðø‡Ú/ ¶â}?õÜŒ ãp“… Ð œµà@Fƒ¨()º¯×O…ÀÄ&T-€ò(ýCÂ_ü Ø{¿W…{Ë~F¨„„„.àr“ªŠ-«$ .0ô;àÐZ+=€å¬>ªý0ïs#ìg|ÆÏÛLª½½ @0åÉEÈš5À¼qj6ûSÜáöBìgeZË·Ÿñ ?Ø'Ü`²à0%£æ`^H9 · ¥4 dtTýM9,<`öçóÔƒèý\\ŒTL×Àç¦_Üh€¹œíN¥ÉÉà…d)@¡88:ó?0ýƒí‡,×V„ýŒ·54ð;àÒInnpZDrSÎú³@äOC² €PíUÀ¸&˜ÿAñ±¿—››‹Ëá:’ýŒÒÒÒªøÀ$Ã…äPnt%DP"Ø1m3ÂV€B.‚A °þ%PþÆ?È~°ý[ö ;`¿´ô"q K¿RPHÕEט @yX&â)PLÛ· €À\º;: ØþZ°ýÀè^̈L-JÀpÐ~…¢Ïή؟  t/ *‘À ÑÎ ìD* ¤‹`Ù/Lÿû¯£ÚÏøm‘I*†ÀÀÊÓsàR‘‰ÿ*~’X@’0Rä&æoö²‚Ù @HŠ€S°°– ü× ±_¨Í3-Zt¿.;p}U½Z`BV ÀH°{&whÇN¯y0{Îà&(#  òÕÿÀb7Í~Æ‹‹\\0Ra2ØðÜñRXød<|NÀH˜eŠƒµó`© €`È\ç€ àç°ÿÃЀqª‹‹ F"øR´ÿ¢<vЉ‡:á=8\=rì&æpj1@Á*pˆ'ˆýÀÈ8è‚ÃÙà¹ñï‚°8ÄþÉàH»¡Ü¡àÍóÎ@l xl„$J‚ê_VPùã´Ÿ¿Ó0fÂ^† ÿ„8à•"0/[ t¸^)·)`Þ™rˆÍsJÀ"˜öï ËÀ´ŸqêU—¢Ãø &ôl?°µÊ  Âç'6Mó:M³§BBüü‹±8€±‘p<Ú%ôhÿs`ÅTË.AàØmvhÚÚ¬ˆJ°Õ„!† ,€P?öTF\AðqÌÏï  ´X"úAŠ#p*X07x%ÌF‡”€Ð,áÎà=Ÿ‘{(($ãuÀ×éüaªtÄrÛ‚ŠdŽB›(PFp׺Låý »ŒÀã/!)î°ÀdHTÜÆîÆo "azv¶±Î..x€3¬îMÓ€8 ² € P6B I   1‡ |Шà×ý,ÁAP«È. íï6šæeUY ² €@h%(ôÕíÀI0 %vñgOcÄà‚ÏÙÙaÀâ 8'CW»ZrÁkÏTVZ@ ô4`+ …œ@)°Bã N0n…žv40ø…`A`ªª“@q ´c%ÐÑ@Ë„”@I0d=(öÂc”€) [C£“‘€ ^á*~Hƒ€\° (ÇAN馦€¬ÊjP* BÁò"`)@š‘‘ Rq´Î>IÃ’ Áå1»«}isîÎyà PÇÀ&`CÐ$ÈÏ?]#¯g€kÀŸX pì"€ùÀCÙÐ{ÈGœÚe§À’<@I3ð;€ñÚUˆ°„‚ø"p 'Cph:j=˜æt08 cÀl½£½&¨*DŠP”¾MÀŒ{æC"©ÏÑÓB2ÈÓáqÉQ DЭ¼¶üôB ä€v ôí’"L×îd$ûBœPdŒê„"Ô8àlɇ&‚µV§ö10ÈAÀp— z˜ y`(¤‰ã NxŽœ-2Å×dî^D"°WnÎ]ier@A Lƒ°R”z¡I ‚X‹Åí´€”#ô€íFÔ8€†¼õÊÍ7Ÿ; €n’ÀAXäP¬eCŽ8FbÁÔF°\¾CãápÑ"P€â#ë#z,äY ÎÊ!ä4,…HpÌ .©f™ªË"HŒƒÐ’” AÙ è€#– ÄÀà- LfçÝÀ™Q ‹Ai‚¹[Ž(—Ω„AR!Ü®ŽZXÚeÉ@ ²À1[ïÊ…ðL€HƒŒ¤P±à꨺€°)‚Š"h6ÖÈ ´e ˜Pr!$€‹! RÀ8˜!\\^.Âp4@pì€$€9`оÈ ºÔƒÕDL@²@¥3°¹´æ€éà²É¼`œ.¸q‹ €5@ÍA¤‚ä€Å¤;ÜdH6€åC$ä€P}Àr@Œœèd¤À¨…–Dô=Æ@@L¡¾`.Àí­+›­€ØÆ@ SháÆí¸ s@b_Ò€:@â{¨x(Oà&3²Â0Ò€–öÊòÄ ˆh?ÄðlHi.€Ô h¹9 ¸ÎÒÒ^ÑdÒr€;ÀÌÌß0© ¢¨@êºá.ˆµþzED·mSc ¹) œ—„ò°’p´E*-ý„\LõÅ(ŠY!­B`] ÜìíU¹ðÆ5€b`Øq°2Bo*£ä:˜à·HTuA}ióýyK.Wc @SZ›Ü¡Ý"ò«cÌÞ« –êXT×—VÍÌ2èKR;Ç@À xNíJ›´Ü1§BòÀ¸£A kLX•w¦ºg’@Aàïc—ãá i•›"*ƒlâ[DX@'r“ ½ ¼YÞßõg@Á- ÙÚ-%òÀx- 3¤pÔz·6"úÆòP€;4§f莣Y޵(;ÁÌÌ|BÊh^Ì—FļAÊŽÍAiPm5@ žTLq‡wÎk‰ W¿Àˆ NDâsB£ Jß Þ$§ÁÓ}“Î@@¬O*žBé#õMqäC)ˆ ˜KÌñ´Ž¤á½S”îñ‡ «Ü¬ü ¦€uAöÏ> ­ŽP:§ 8À‘ .3ÀîTˆÀR ž´"¢-—ƒ €@<«¹– %A/l|BCƒàqÁTXD홋!ïyI笖xœx  PÀ»Ç¸ÆĘ »¨1°3¥À¶P„¼@ö§Kv¤1*X2ÄU À,†C‰RÀ†@1pe'(Zƒ¢ €À( ÖÏÆÁä!pd#쀗q8 ½Èy” 1² €ä ج¦tó:@€h1ŠpX² €À(ìP>„”E d)FÂmÂÀž ögƒ²"ÀƒdÀRH{30¨YƒC € HNNèCwèXµ$êHe¡DŠlR'$ I‚Ø?L¨º¬ 'ƒ@AÐD° œÁÉP4 ˆ±Z`$ìÁæ€Hf‚A°°‘ZP“à͈þ¶²Õ>`«ŠrANXJ†H© 6]€-ì;ê€l]$!PL— Bõªþ%AhÊͺà|Ê ˜À5“Á&xË!ÜYñ:4 ã´ðpÕİ (Z›wi†HAP ›2 »«2B‘˜¡¸†F<X†C“ @ÁPSÈÐT 5…åÌI3ôÀŽP ŒâcÇ €‚¡µÁ@ƒà.tÖª2m5˜6ŒdÆù Îb¿›)¬¸P ‡%€‚£i`<ëv–{a‘àsúÄi  '‚=@ÿO'øÔ)°9®½˜ €àhÞ´i;€.8x²v 0t਋ñ8`.Âþ|p~èVC§Ü:·„@›@.HÕÊÀHÍæ#¹`ËTÜ…vìÛߢÈ™7FÀœ•• -—[# €(bíf  &¶¯w‡.(„ÌÞ‚]À%¼•TÌÅ?È~SÐphi»•'ÙêƒÈ„„¼€.h:41eý,PN€LŸB]°€‹Ë¡“4t¢Øž&ø å™yœ—!l ”dàµè9-»YÐËäHÀšPrÁÔÝ\¨ö0€:„ËQR @!£rˆ Ì´îæ ¸À´„(vòuü¹µ˜ ]À±œ'4?æ`¬Av@¡ 3Yó€.Èm»@Ù UD\sñ–(µQtM Ø~pæ@7«ê>ô TdufÞZ  6i);Á\ZÈŽ` ÌÅS–`Ø_Fš2®WÖº2˜Žª¡å€BEå0¸ÛB\Pˆ¼”j.îº9 v­‡,¤‚†?ØþÌy okaÔ" €ÐPe„UÈ)0 /&:a.®Ú9:záëé ébÿ*ïy•ÑmÀvZ† ʳ¼vî˜xîPBȇÐ éS±%ƒÈþßÊŠ}øb:`úÛïUÙ䨹5uhf,TFœñÚ v|A(j!Nøøf‘ù:˜ýRH9p+ÈzPê/'ç?°ý 1©s˜  €°¤ƒˆ3ó6çÔRÎAZRÉÁÓ ŽÖ{ðÚe£ÈuR‘È]ä©Å`ë *Aå0þAþfi?@a¢…Õ•VÀìxÈY«Ô±´¨À´˜ÏÓR ^Öé7wŽ®XñG6ïy`Þ-Ÿúp·˜þ€á ˜0 @aA « "€I1oãùnG`B¯*¶.*†®«½÷K#|îG°ç¡+ZAÞFÿ‡î*í™Y•ÑG€þ÷Á’ZÚŸŒ¯€àÍÝʳêÁ몡+{iâ6¶{ňÂyÇÜÝ ÛAž‡Xõ>0úç¸1XØuìvû+:Ý_mPŒ†‰«´€à I  •ÝP7€Wƒœ±;>ÖrrÖÖš‚×vƒ5ƒ­ßÀ¨ ,~¯xï,?½´m0ýaµ €°£¾¥ ûA°3ï8 Nˆ­¯.D¬m755­ YÞ]Ý.¶â}`ð{E$°åìñ@8ait¢A90%Ü_tB0  Ü!n/î:òÁëû%¡ëûåù Öw½óŒAtOÒòÕ8ó?@ᄾ¥ýÕ•À éö JkÈ 5öòÐý … MÝâÛá À´Þq‚Öª‡@ïW/m%?œönÔuèpb> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 3 0 obj << /Type /Page /MediaBox [ 8 -15.04688 603.27539 807 ] /Parent 2 0 R /Rotate 0 /PieceInfo << /Illustrator 25 0 R >> /ArtBox [ 237.25 307.19824 372.83496 483.37207 ] /Thumb 39 0 R /TrimBox [ 8 -15.04688 603.27539 807 ] /Contents 41 0 R /Resources << /ExtGState << /R1 19 1 R >> >> >> endobj 5 0 obj << /CreationDate (D:20040905120833) /Creator (Adobe Illustrator 9.0) /Producer (Adobe PDF library 4.800) /Title (flamerobin1.ai) /ModDate (D:20040909160802) >> endobj 19 1 obj << /SA false /OP false /op false /HT /Default >> endobj 25 0 obj << /Private 26 0 R /LastModified (D:20040909160802) >> endobj 26 0 obj << /CreatorVersion 9 /ContainerVersion 9 /RoundtripVersion 9 /AIMetaData 27 0 R /AIPrivateData1 28 0 R /AIPrivateData2 29 0 R /AIPrivateData3 31 0 R /AIPrivateData4 33 0 R /AIPrivateData5 35 0 R /NumBlock 5 >> endobj 27 0 obj << /Length 1525 >> stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 9.0 %%AI8_CreatorVersion: 9.0 %%For: (AB A AB) (none) %%Title: (C:\\Documents and Settings\\Barbara\\Documenti\\barbara\\progetti\\flamerobin\\nuovi\\flamerobin1.ai) %%CreationDate: 9/9/2004 4:08 PM %%BoundingBox: 237 307 373 484 %%HiResBoundingBox: 237.25 307.1982 372.835 483.3721 %%DocumentProcessColors: Magenta Yellow Black %%DocumentSuppliedResources: procset Adobe_level2_AI5 1.2 0 %%+ procset AGM_Gradient 1.0 0 %%+ procset Adobe_ColorImage_AI6 1.3 0 %%+ procset Adobe_Illustrator_AI5 1.3 0 %%+ procset Adobe_pattern_AI5 1.0 0 %%+ procset Adobe_cshow 2.0 8 %%+ procset Adobe_shading_AI8 1.0 0 %AI5_FileFormat 5.0 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%CMYKProcessColor: 1 1 1 1 ([Registration]) %%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) %%+ Options: 1 16 0 1 0 1 0 0 0 0 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 2 3 4 %%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 () %AI3_TemplateBox: 306.5 395.5 306.5 395.5 %AI3_TileBox: 16 55 608 799 %AI3_DocumentPreview: None %AI5_ArtSize: 595.2756 822.0472 %AI5_RulerUnits: 1 %AI9_ColorModel: 2 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: 3 619 1.5 1012 699 26 0 1 10 79 0 0 1 1 1 %AI5_OpenViewLayers: 7 %%PageOrigin:16 55 %%AI3_PaperRect:-8 784 604 -8 %%AI3_Margin:8 -36 -9 8 %AI7_GridSettings: 28.3465 5 28.3465 5 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 0 %%EndComments endstream endobj 28 0 obj << /Length 4785 >> stream %%BoundingBox: 237 307 373 484 %%HiResBoundingBox: 237.25 307.1982 372.835 483.3721 %AI7_Thumbnail: 100 128 8 %%BeginData: 4410 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FDFCFFFDFCFFFD2BFFFD07F8FD57FFFD12F8FD4FFFFD15F8FD4DFF %FD17F8FD05FFFCFCFD44FFFD19F8FD06FFFCFCFD41FFFD1BF8FD06FFFD04 %FCFD3EFFFD1DF8FD05FFFD06FCFD3AFFFD1FF8FD05FFFD07FCFD38FFFD20 %F8FD05FFFD08FCFD36FFFD21F8FD05FFFD09FCFD34FFFD22F8FD05FFFD0B %FCFD31FFFD23F8FD05FFFD0CFCFD2FFFFD24F8FD05FFFD0CFCFD2EFFFD25 %F8FD05FFFD0DFCFD2CFFFD26F8FD05FFFD0EFCFD2AFFFD27F8FD05FFFD0F %FCFD29FFFD26F8FD06FFFD10FCFD27FFFD0AF8FD05FFFD18F8FD06FFFD10 %FCFD20FFF8FD05FFFD0AF8FD07FFFD17F8FD05FFFD12FCFD1CFFFD04F8FD %05FFFD09F8FD09FFFD16F8FD05FFFD13FCFD19FFFD06F8FD04FFFD0AF8FD %09FFFD16F8FD05FFFD13FCFD16FFFD08F8FD05FFFD0AF8FD09FFFD16F8FD %05FFFD14FCFD13FFFD0AF8FD04FFFD0BF8FD09FFFD15F8FD06FFFD15FCFD %0FFFFD0CF8FD05FFFD0BF8FD09FFFD15F8FD05FFFD16FCFD0FFFFD0CF8FD %05FFFD0CF8FD07FFFD16F8FD05FFFD17FCFD0EFFFD0CF8FD04FFFD0EF8FD %05FFFD16F8FD06FFFD17FCFD0FFFFD0BF8FD04FFFD29F8FD06FFFD18FCFD %0FFFFD09F8FD05FFFD28F8FD06FFFD19FCFD10FFFD08F8FD05FFFD28F8FD %06FFFD19FCFD11FFFD07F8FD04FFFD28F8FD06FFFD1BFCFD11FFFD06F8FD %04FFFD28F8FD06FFFD1BFCFD12FFFD05F8FD04FFFD27F8FD06FFFD1DFCFD %11FFFD05F8FD04FFFD26F8FD07FFFD1DFCFD12FFF8F8F8FD05FFFD26F8FD %06FFFD1EFCFD13FFF8F8FD05FFFD25F8FD07FFFD1FFCFD13FFF8FD05FFFD %24F8FD07FFFD20FCFD19FFFD23F8FD07FFFD21FCFD19FFFD22F8FD07FFFD %22FCFD19FFFD20F8FD08FFFD24FCFD18FFFD1FF8FD09FFFD24FCFD18FFFD %1DF8FD09FFFD26FCFD18FFFD1CF8FD09FFFD27FCFD18FFFD19F8FD0BFFFD %29FCFD18FFFD16F8FD0CFFFD2AFCFD18FFFD14F8FD0CFFFD2CFCFD18FFFD %12F8FD0DFFFD2DFCFD18FFFD10F8FD0DFFFD2FFCFD19FFFD0DF8FD0CFFFD %33FCFD18FFFD0CF8FD0BFFFD35FCFD19FFFD09F8FD0BFFFD37FCFD19FFFD %08F8FD0AFFFD39FCFD19FFFD06F8FD0AFFFD3BFCFD1AFFFD04F8FD09FFFD %3DFCFD1BFFF8F8FD09FFFD3EFCFD1BFFF8FD08FFFD40FCFD23FFFD41FCFD %22FFFD42FCFD21FFFD43FCFD20FFFD44FCFD1FFFFD45FCFD1EFFFD46FCFD %1DFFFD47FCFD1CFFFD48FCFD1CFFFD48FCFD1BFFFD49FCFD1AFFFD4AFCFD %1AFFFD4AFCFD19FFFD4BFCFD19FFFD4BFCFD18FFFD4CFCFD18FFFD4CFCFD %17FFFD4DFCFD17FFFD4CFCFD18FFFD28FCFD09FEFD1BFCFD18FFFD26FCFD %0BFEFD1BFCFD17FFFD25FCFD0CFEFD1CFCFD17FFFD23FCFD0DFEFD1DFCFD %17FFFD22FCFD0DFEFD1EFCFD17FFFD21FCFD0EFEFD1DFCFD18FFFD20FCFD %0EFEFD1EFCFD18FFFD1FFCFD0FFEFD1EFCFD18FFFD1EFCFD10FEFD1EFCFD %18FFFD1DFCFD11FEFD1DFCFD19FFFD1DFCFD10FEFD1EFCFD19FFFD1CFCFD %11FEFD1EFCFD19FFFD1BFCFD13FEFD1CFCFD1AFFFD1BFCFD13FEFD1CFCFD %1AFFFD1AFCFD14FEFD1CFCFD1AFFFD1AFCFD14FEFD1BFCFD1BFFFD19FCFD %16FEFD1AFCFD1CFFFD18FCFD16FEFD1AFCFD1CFFFD18FCFD17FEFD18FCFD %1DFFFD17FCFD19FEFD17FCFD1EFFFD16FCFD1AFEFD15FCFD1FFFFD16FCFD %1AFEFD15FCFD1FFFFD16FCFD1AFEFD14FCFD21FFFD15FCFD1BFEFD13FCFD %21FFFD15FCFD1BFEFD12FCFD23FFFD14FCFD1BFEFD11FCFD24FFFD14FCFD %1BFEFD11FCFD25FFFD13FCFD1BFEFD10FCFD27FFFD12FCFD1BFEFD0FFCFD %28FFFD12FCFD1BFEFD0FFCFD29FFFD11FCFD1BFEFD0EFCFD2BFFFD10FCFD %1BFEFD0DFCFD2DFFFD10FCFD19FEFD0DFCFD2EFFFD10FCFD19FEFD0CFCFD %30FFFD10FCFD17FEFD0CFCFD32FFFD0FFCFD16FEFD0CFCFD35FFFD0EFCFD %15FEFD0BFCFD37FFFD0EFCFD13FEFD0BFCFD39FFFD0FFCFD0FFEFD0BFCFD %3DFFFD0EFCFD0DFEFD0BFCFD3FFFFD10FCFD06FEFD0DFCFD43FFFD1FFCFD %48FFFD1AFCFD4DFFFD14FCFD54FFFD0BFCFDFCFFFDFCFFFD27FFFF %%EndData endstream endobj 29 0 obj << /Filter [ /FlateDecode ] /Length 30 0 R >> stream H‰ä—mo¹Çß Ðw`_°ÑZ·|&… ÀrR£ubع+qal¬=ŸPY2$9éõÓwf¸«]Y’í\ü¦¸(’Iî,Éÿ3oþt~y’NŸë9JØpðæM¶¬«õb9fÔÌNg³‡Õz‰MGÇÌ”žºëfàOõr5]ÌÇmW‰÷¥¥, Çìh¾˜×ÇØñqºžÕЕ¯®òÅÍÃ]=_¯X5Ÿ°Ëz½žÎoWWW¡Z~®–U7`zuõ¹m»_.nqäÕÕ/³ê®^.>OçWWó‡Å—­&>ª¦Ç›•ÀÔòj Ïõ?øD’(¦Æ‰cçg8",æxrXügÌ„´L&ð±’)§°ÿoÓ‹zõxÐHh7âÞ ,FNj¸AŽà7ǻڹŸ/7õj•-f‹åjÌΪ[h¬ØÏõl¶øÊ¬ºùwøûºžÔxàâa ÷¬÷fU¯ã‹¸žÕ_ꙸNO5ã#Áh¯ÿÜywvýnYM¦àú“~òAS9½ƒ‰€ãäþq½—Þ<ðÀÀûj½®—ófЧެ~…õ èvûºW¿V¸½àÃm|€¿ër:«!˜îª5Ó£Ø(ã ~\Á ÆŒ~S»½¦Eµq4ŽóÈÎ~þ{ÿŒoìèÓE};¥B|üë8†´‰Þ/ëû*v€¿xÏîV^ÿR=ÌÖñ±¬…á{ÌâÊ>ÜcËŠî2,¯ø‰Ö<ÞmZ;áø¯¶û C´1Ÿs~žã3D`¦4t‹æ¾ó´#š$nâÇúî~¢ ˆ–‰A@{ÿw¿Û¡ðh,Gkx’cÖû¦³ ôúË´þ:fïAëÍÛK—ëËéá-ið&¬6Ì eE3àâaV/œO׸[ÔæãþŸ-&õ ”Ö9*g½ÔÞâèÿfÄÇj \@áÌÖ„"—´}ïîþQýV/{ùp_Ï?.~¢ Kf¸‡¨ƒèM¸`Æ{&â{ã ,´{k;¼ïl}Z|çz–ÓÛé|L»£I^ŸW÷õò¢¾YO`ל‚ÝSìĵÝg0m¸Å±i؉'q`(¿[N']$ 7’Êh¦{¿hñ#×ûøöÓ¬v „9o„PÌ'ÙâŽxKԃ؟ƒ0f‹[üót~3{˜Ô-x^Â÷ìÅÐ3O8D¥gn;©gîÛˬgîy„°gFï#¾„nÏéÀK~¸o‹®A?çËé_ýpðú¸daÞÒn.œ£t€ü…ýó×éºfÐ\Íd{› a2|ÞeYe^fe(ÓÒ—®´¥)u©JYŠ’—IQE‘YŠ´ð…+la ]¨B¢àE’—y‘çy–‡<Í}[’ÛÜä:W¹ÌEÎó$+³"˳, YšùÌe63™ÎT&3‘ñ, e(B²B|pÁtPAx€ KË´Hó4KCš¦>u©MMªS•ÊT¤óÛt“€î¤Ÿß’|Š}´‡ôioÒ>oRѰ!½Ý~/ç㻤ïq¾¡¼ÙPþIÆ#ß)¡-÷3þ…|Dwð¸‡îØþ"®ƒÇÇlÿN¦ÿ_pœ7EÄÛ~´˜öj³Ù6ÿ¹r›OÇ|;fä–JOxGT€j*B± •TŠb1Š–PIZRYŠ…)–¦Xœ*P±D…"ÌR™Š…*œÞP¬b¹Š+–¬œ©¤ÂKW,^±|Å6–°XÄb‹…l,e±˜År– Z(qJZ–µXØÆÒ‹ÛXÞbKÜXär Õ’…n,uc±KåîpД¼±è¥²·)| XL ÜÃpï-€ â‹ö Ó6'§°/i#s˜>Lc8×Þáe<ÈôAþp’2· 9S Y Qä‘lóPN¹44ù(Ò©ËIF‘¨ZJõsÓŽU}Z¯ ?m‰Õg–ÜϬ­ü4òª£UÌJkRi¢*Ù)#&yb‘i$‰< ‘&'²¤ÄÈ Ìýéž7±ŸÄ°ï®.껣¼M bSŽ˜–ÄÄ%¦51åÁTHGØ—R’áª0sîdÕJ©Q+Ÿžt¶DhjD%óX.Q,ÛRédÒ‰¤“„IÄo$¢H Q¸ÛÒHI}a(ž-p°‘,J’E¾+ „îK‚¶°/ß @pø6‚ ŽrÈèîÄ€RP;R@!„]!@Y&¨>Ù¡'éê-D ìhxœïÙÛ‡vþQýðï?…[–ŃÚí ý|oèüaßRÿü5r^q–Œ”¾¼I|io83#Á`ÂŒæo»Þ\Û]a…ÏK ?†´tš5‚­î;~rybÑ8Ó ³'¶¯ï »¿IOõu1Ÿ¼[V“i=_7-¡¾ÎÛ¶1;º¨¦óÏ‹¯ÇÃÁæ'x4,LhÇÞR¡âHõš”ŽOHÛ9i:%5[Ò±¢C7ÊÍI³Q¯¶Q*¨6Þh”ôÙ^¶Q¥ŒŠ$=æ}£CÝh7ÇR£=8†üFyQw¼9†òâ\sü¨žÒÚc'ªÌnŽ˜#j¬§°N_ñ˜[Êê몧ª¾¦@=»šz:î&{´É0ï´ôŒ’^¤#·’¢Ž¢†F°;‚ba'ýNk<š×³^²üúíëx|%O<ºï7ð¸Ó²ÍÓÿQ_=ŽÛH¾ððe€äÒDQƒ½ˆ’Ì9ØSƒº °Û‡döÿï«b-Y´d·$ÑÒ7§lKUß{…v ¬rê7äU¨è/4lhÜ\¨¸¾Âu÷‚•Ê(±Ì¨Ú¹* O¢Ö²j® ÔBÅöŠº ¹¹øqãÈh„x dR–ƈ1@rZ ÇA(¤£/aø°²€V x9@ Ï8µ€uµæ pg½øsÀ G`1€ %0i€K l¶À§C8ñê°L$Œ·AÔr-ÐÛÁ(ö@ò4ÌB T ÛÝ-î€r¤@{@W—ˆSз€ p0ÚBXÄ[RÀ**XF ëh`!¬¤‡¥ °–Éì;%ìÆÀv,ì§… 9DAcÑÚT ÃÂg„uYXX +s°4kÑà᳄åXŸ…¶°BKô°ÆMhKD[ó´0Ñfê`ªøŒ°×­•KØ®ýZØpË“ØóìÐîÝŠ»ÍrГÆG ƒ>ãÂ= ›àñ|ý%þ«¬ç!‹]c{ ªÛºÄó5l?¨UÅ-û¸I¨xï¿Ù²3wNÜ+©Ø}T Ùæ¹ú›W¬IlTOÕ߯¢>ßG¶¯Üîu<<²}åv¯ãá‘í+·{l_¹ÝëxxdûÊí^ÇÃ#ÛWá2¨†Ï9üÉãȈ£¡,ðÏ*nú¥2¤¯+¹ì£© ‹í•\öÑT†ôu%—}4•×rÙGSÒו\¶ŸÊRêZ»õ^"ØO4ûYj/Ïõg¡bŸ‘ßÑp]¨w4í(­e¨xma+vtåÂêUí(cl‚è[Mÿ¹ñ呈u©»Ãáf°?"TÌÿåÃ*®¯p›rx6wªÞ*îœØÕ*þ?²<äŠ?m͹tOYî>°€êpê`BJØ÷²ò×,=#‹ÁðfiìY ùk–Æž‘ÅfiìY ùk–ÆËbxæ-w¦cÿâJÓ.ÆÿWzµ(Úî„?v]…ˆVõ©8•'‹ÿüåxøôeïœÿƒß¡mììLé=ÓÍKm“J…£wÃ{ÖünÖè‘fQië˜Tª¬å#5¿'•¶ŽÅJñ;Ëç廩GªÅÚ:&•Ê’ïeStG…6NQwùÔ¶_¦÷ןÿúúííý»¼âß~ûö®¯ýtúá—ïooÿ9ù¯¿Ÿ>þñxXþ?Ê™“å~ 68ņàC\èBšGx ¹³½ÝË °ag{»—ì;ÛÛ½¼v¶·{yÅgg{ÛâEdÀÙ÷ïY¹nY¸°‹Þ±rݲp÷¬\·,\ÇÃ=+×- †ðŽ•ë–… ñ.»rqd ´` qË1‘¸)˜N|pL*ŠcjÃâ)3ÞKL÷Šå³ $ò¿Æ½À8›tîâåˆ.y1Sí~(ýïý·ïŒ£øÕ™ˆ13rööÂM!‡ ±Cà‰è ¯G!ˆ ıE@QD0"HŠ>:Z׬·ëÂŒ>1×ü~%¿åãœY&P'Kšø–³Ôßá#õ¼èÒ¢x•¤e°Æ—hðe:|©;›w#î!¾É Œ¸‡t·÷q!àC70âB Eo`ÄuBh+˦³ÞFÎû€Kê“|Ò £¸•§¤ Bߨôª’LRdUhÇFÔ&uI.©Oò¢!iLÂMAE¦FS„®:¨óe’j‘Mj¢Æ©×U]’õI>iH“&ž/À¼¨Î7êü¡ôª“,IŸ/£PÕgä³2b^¢âx¡Ür EFÀ[(Wª²2Õk¡"¹ÞZMVmFÝR¨sõù¬†³PQ³ÊÞÀó•æ·à¡¢æ¥ Ç{¤y‡Tßü 2>vW16 „j—Ç<¶‚»¦Œl»‚%{ƒ=VŒÖqƒZgÄfAG{쀓MÙ¦tS¾1ᎇD9å\$²Niy§Ä‹ÌSê1÷d;Å\ û"ý"ÿ”€‘LAá`$ada¤aäa$"3>:ß^##™¼ÃFBFF¶¯’Ú‡I9q8P6@—rVh™›‘œ5ç‰*ò“ 8uŒÌѳHÏÉ„xÚqRi˜ªÄUäM¦«I™{>Ɉ}jDVTK/E©…ÇõDG–v½ #†ôD^Ô³œ¨µ¢FÄÑk‘ilÐEIá 1UA§o//B/¡Ÿ{îé¨NÔŠ‘ÕIF¤E¢**Œ4@+FÓWÖ·÷zõINԉВ2A4CQ6©™$M)ÂÌP˜b>ÄÞcÒtþ@óËÍÔÍ„¡áLÂ?gù¾âdo9Õw’çNòS|%ù½áÜ3ûÀi=pR¯$£#ŸÃý[ÉçžsùÄ™¼”4n9‡wœÁ½¤ïÀ¹»’Ìm%m;ÎÙHÙ˜§‰vL×õ,W;ÎÓgé )ZtÃéÙIn¦ÌØ–A#I¹åŒÜsF8Цu 1Æ¿:©ÇC¦†1l6T‚b†‰f¶À¨ëè–{´çˆÑ °0 ¥Y' ßùGzœx½+з÷ro¸ï;ÌBÏM:`jh‚æªäY3˜?šÇ󉊘VÇ ä1`tM¼`QÁ0+,ó£e¦8n<σIh˜xI$ó§Ü„ûH W0³^Z^9T­u.v]TÌy±Éxö\ŸŸù½Í$ƒ¹rYb®‹ìŠËWÜŽr9g.Šët´T.Q-5f“ØR¹üv©+q/^ÙzÔÊ^š?¹éW¼Ï €ÓœŠ—¢<•øaè‡-N[tè—ãáÓ—­3þªáü¡*ÚŽOØxÀ¶/h§zVhç`¬œÕünü¦®4í©sö¥)»Y½Ý£±b…?6¶vtÆVô£¿âÁÚ½ÔB³¢·œ–ï –òû¶x{~çÚžLõ‚peæßzëUòè¡Oýgûezýù÷¯¯ßÞÞ¿Ë+þí·oïúÚO§þýþþõ¿o¯§ß䥇õkxæä_ù S8vÈ‚­Dd È)k8Öhƒ±Æb ÅG‰Ã@]ŒÃ†cÖ cp Á[x ¿1úÆàc/â[i ½1òÆÀã®OA7Æ\“"n ¸>…ÛFƒíñ@Á–cmŒ´½ÄÙfM ²cG‰°Nâ«Ñ•b+‡Ö1Öãk «5ÕRBj ¨§Lc(51Žr9„ö?[ž8ñaÜEà#ÌÜÃÔ̽…Ñ[¾ñ—Ø„‚Àˆ@àáv¡EP° Á¡äÕqâ5·”W¸Ž×3Ë«VÅÞëè–ü‹ýTIÅmèß%T|bµ‹Š{ös£PñI•®Tì×Ê:»$îp“[ôªø´+Èþ€–Ýn!·¡~Ci·CE¡aCã†äBÅõ®ëJ¦ÒX ÁËŒª ™«ªI¨Xge7Ô\l Û+ê6äæÒy¿u¹¼u±„o]®–™Å2³V^]*‡¥+åj¡Ì­“‹eþ¿^&±J¦Er¹FΗÈó 9_ ñeÄú(Ë£¬ŽiqÔµQ—Ƹ2êÂ×Åÿ³_;ŽãVÝð?xÓ@²PEQY (2ÈzÕ,tc0‹ô"“ÿGŸd—dË’m©» ƒèå‚M?Ñ"yïyÒ,J£È¥QŒ—&±Äzh[9!Qöt!»ÐȾ©e¥}îY/ž¾Ö-é¡ôØ?Þ%…ß‹=61–0œRe3õî%g]ÖµGßó¸”!‰ŠÏ~g)ÓWF<«¡¢{Uß.÷Õ¯h²$­vÕÇ«x^_h%âïAÎEÞ/5Þ_‘%YPÐÔ%²¡##ZÒ¢!5jÒ£"EJÒ¤ åK厔iI›&°oÈK²H“IªMºŽœjÉ«†ÜªÉ¯Š+I´‚†1q@:’®%ñ’¯&+’°$ -‚‘œ ä¥'7ùiÉQCžjrU‘œ ®%ué2I`KY“Ì `‰$u ±=ÉÍÉpK–2]“í à‰d} ó=Ùï` [BÆ™ …bh!‡‚¨!‰ ¢(!‹¢bŽ€V„7Üáá‡XxÄÀ%šÇ­À´¯„²…^(¦†f*¨¦„nŠRxâ ‡€˜#,da"iI‡f °“‡¡,ea*îÕEAS‘Ë¥xàÊ« w©r_=\Q?**><öCV|—îòº‡‚dÖ½eý;öAbHÁ¾(_ånøúy¿ÊÝÇÃ=ò~•»áë;äý*w÷ÈûUï÷:w_Îð-­1ß:³®Óò±û7QÑϨ]Q¸/*öÿu+Š+JgQ1Íkõ°Ý¹8€çK¯h†Z†ü}”èöeÓ-ü|­§É±kè^ç?yù¢âí•ÓåÜîyíû§Ð œæ[fö»W¹ûl³,*®ŒXÕUVÌæÇ&Qq-žÔLÅÅ[—dܲÖp¢ÌX瓪dR™t*€î:(º¦QµGÉŒz¨=:(º¦QµGŽz¨=:(º¦Qµ­ƒbÍkÙ™•¬ºú©)ʼ­ÞŽÿ/ù]¥jwâCç4/0³9©Sqªø£TøóñðéóÚ¸ö¹Cm«Ñ˜¢±ùE•M?Ðë­jª&ß—»¹oUNÆÙIÍÕ±CM]U2ÎÈX ™BáúqfRsul_³"ç’ŸõùùèÉc\6TÊÅùÌ*w5dRhaT®ÓŸü?«ÏñÛ—üç×/¿ýößáöëo¿;¿÷·Ó_þõíÛ¯ÿþúåôÛðÖ©(ÿz<̾Íô©ý"{goBàºTüh„°­â÷%„?gÅ—Øæu.úÅïSqÔK²ª™ï¬ÐKCJµ¤U—»ÜBIŠ;’h.ÙæÈ8OÖ2/‰MQƒ%yHà’”–|tä¤'/¹IÐÄ- ò´$W+òÕâ׎´õ¤n };28™™ÌÒ¹"¥kÒ6"µ=éHñŽ,O "“áf%)_Uà©ïHÿha0*Hà^ž²ævc˜…jKEH£®š ŒdèVÀò0HÅÐ|9¨¤MZ%@*`XÜ FC2Lòx€j€ø&_ ´ãa úÝà Dòàà"~6„d˜.ÓÈÅá¦|Xp QUj’g1 ­ÞâaA^þªò䡱|›üµ|pZ€×:¨-úÔ²ˆP\ËiˆŽ‡ì |WAy¶åA|YÜ4¹Í¨vpa„Q`#ÀŠĨáÆ,Ь OÚüX‚üÔ<õ “ÈeB¨!ŠRH"-’ÅÏ ›íxà¯, 4›åDÈ’ vR¸;_Q”zE%*²ŽþêAå 3¨dÕ¹‹šAþ,*úØ^FêF_i¬¤®Äáý©ôŒÊ;2·¢âí»ÕkZpŠû^Ñ»ÅÔ+®Ü§ÈŽ1v‹‹_ˆE½ùE5ò‹³cDùéÇÀ)ìàÙ1Ξo<£wzp ?uÁ7tö œbâùÀŠoÜw#Îqí­xG'ÝNºõÜ£÷˜úG+þqë gÉ–Ç)¼¸ÈÙGÚ7‘Í;õ‘9'™x =Þ›d]; ;Ê›§4OÁUðžÞW朥÷}ñ–Þ]*ñ–Þ]Æþ28 ÞÓ^¹ÌÈgn¼fê6½ßˆãˆd)ñž³ëœ}çì<·îóæ@cêF€QqìG#W¤'*'2W§Â{ª‘ìŒê»rs¢âí»ÍkêûÙi{êE{âÆmÒôíµþêªã]·µÇÒ³-–ΖwXÏ—YWF¬ªšŠŠÕ¾¢¢ÝW3ëm¢âÚ÷œ¨èÎH8bG“Њ,ô€¡yv¿ã„YΤáìjζâäG!àÿp¸ŠÅk î£ñ#…G‘ØGÀÅ<¾æð9‹ï|P㊠—ŒMÀA=~êpW‹×|Wã OŽXRÀh=Îípqž(žnðw×+œ?b^;ö$ƒ#%,™aHM’(R%bsÓöć#,IdH%M>)²*'V‡·„DC@Õd[EÊ•ä]Q+ò/bžû÷d£#ú,yi`nMŠ*ò4b±ðÄ•#s™#ùkHbM"+Ð$bÆ(ñä¶#B-mÈtMº+r>bÙ¸ñÄžƒ,D`` #(Ј9bîXò„£#Š-da  m(€*èò¨ƒK,0`  ±( Œå"Žx¤ ?[vfO>½ÃL|-ÿå6i¹Išiއ«iÚ›£·Ö¨!N8o-3à¦G›xÁšò4n€™ÐƒÌ€1å€0=¾ø]hzhrzh)Xúf§ )= èMìÐØôMM‘$¢>2x0G/°Ñ MK!pa*j /IF‡$È *'@Ð ýD®’°/%Þ­Dy#±$ž“D°–€­$.À= Ý[ë[3²uKZ7šfEþMTô3jWýÝŠâŠ.] o:¡ßQ+ºsqÏ—^Qy­óÚ> 3þ1I3¸®öqQqyDxVT¼ÿi÷Ѝ8ÿÉËo¯ô˜F ê~ÛŠ«[õ9íTQ¿‰Šz_m¬8ƒ¾/Àò軟äîó»ÿ¢×NÛÓº©ø “lö˜±VµW[¼•г-æ#:Ÿá[çÞ¦^ÑdQÑì«Wñ’¿;4Mã–‰j‡¦iÜ2{4Mã–‰j‡¦iÜ2{4Mã–‰jSÓtÉà—þžÿ?8òGåÛûW|ò¸Éá©¿JÒK9¼”åKtú"QÞiV¤aéu<œÿ›H/¨¼+“EE3«jAö®0*ÖwäÔŒuÉbÃy·œ{Çù÷ø@À"?XáŸ0ø…Å7âq’€£D~´Âa4Ncp‹ó8È—¬1~ÔáKÉ(zÉ€Md¸?kþЊ»]TÜùú'\ÿ‹ÄEQ¸a•¼e}R§âT)^öóñðéóò¨ö©Sæ”6öj„žZÖWjtUå!µÉ/ –y& ã̸ÜúØ¡¦jœŒsrw,øÔ'e?ÎNj®ŽjÖVnŠ·þõ*Ù±7‚÷êúè¹i!)ÉðE«áðÙ ƒ9L ÿ?™IRï±6‡®©ÒHï1#c)ߨÜ7ßžùá½vŠxkuKouëc|÷>yÖvàÎõñ_çÏïÿ÷¯ßÿñó?ö›íÇo¿ÿôßýõÛ_þùóç¯üøþí7ûÕ·!üòúÒü5Þ2~Û¾“;R¤.L¬ 3kÃÂê åacØY" 6(m¶=¡×H  Áø¤fDVĺ!…cféXXŸL5̤ž r©M%Þ¦"3ñ©èLÆÛLV‰ÎƒÉó@AщÈ<›Ç¡ó¨¦8 Ÿç€:„Ç¡(H×Õ©\]øŒ²îWð9!x—À5LÔ¿…ª§zwRãzS¶@-›LÃVê–êÕE‚2aCGªR¢©mTÓv·7m)̨¹QØaü ¤Š#…%5OÊû®œ™+dËë øRãœ1ÖdÞܶzž3w÷üy}¡ÜÖR)ê¯Ù¤|F)§„UÂ+0 ;ϼŜ¿™ª6ªRªnÊiQQU_MkUyU‡U“ùRªµj7öŠJ®ª®ÖKµ_@<þ nÁIžæ#ê)ê/ô0`aAœY'ÅIJYK£\êf½”GyžúŸz!}^ª.¹²X.,—3 æÄ’™X4#Ëf`áY:sfº´:¶º7ŽT½\}]=~e-]XMgÖSAòMÁN-ú:EîˆÙ£¯^ØÅ¹c7WìèŒmMØÚ€ÃðŠ;}b·wìø *€< ZÚáhˈ¯×£ñ^ЇJ±aø (6AA"6âkˇëÖ K}@*60d[&ð&b˜#¥_»åZð­À³Œ*-`à.F {Ä‘õK7_àì°Ç\`u»…#޳Ÿ;°ÿÄìØ‡{UÇŽ$ìJÀGÝ=±S6kuìÚ„­‹ Ïˆ1ô©‹öòÀ†nØÔë3q{#‹M¦’¡Y¹’‹ÙȸÞxvúɃÐ#ˆÑ_´ìÄqïP··§ñá,è~> ÎâÓ“xcØÖÛ$ò¾2…Û pòy oÌàkÀgÔ |æü³‹çÍÏ»ïÛßW€-'Î¥RרiÁ] \\TuÁ•Áµá0mØM6KÔ®w•pp¥¸kÅ8ø…œÝP Ó àh(‡jGÑ»‚Ll ¼´íkÚ áÅýs­•caÁœØ3cZðOš[]êÃ[­šQø&-M„`ILSCB§ÃŸÇIjcª‹Úþ/}Oóã 1XUüð“×·þÙ"8NÍ"ˆ_ã CU)*½Äh ‚J‚Š‚È‚ ƒJƒŠÃHB L"NÚ÷ná}¥¹Ï&*Ü*y#¢q1"Œ .á** ‘-kdØÈ2‘‘‘•‰‘·Èû@NмˆÀ¨Ìï¬2°lÆ Ù¤&1nì ’CÑ)Ò/Ò£â#ò£$™# Cˆë/bt1ª&I#ÜbÂäæ-ÐTaÆbŒEˆÑfr¥áÅcKÌq¥Š*Y¨Ž,N.J.G‰bä"äâc¢S ŽÇ,1.Ž]×õÔˆ/Œ]’¶ØÍÝ‚Œ·IÿB³:‘»qS3d{Ì>(+ˆÙž:hkÔ^(iµ¯µ« ­Q{å÷Ô¨-)¿£€×a»±RÅJó:V ™W²\Ê0×÷‘·×3/h^Ѽ¤!pƒ{¸½ª=–5¯k¹¯¹·5pOVÚ¬¶a?êÀÝ3pVß¼ÀÍ9l{‰ÓÇ"ŒÌËRäPå =³Õ9-t¹Ò±Ôi­+ÅNª”»)3¥æHaˆó£°ã^ÀêúU—¯L©a|ŠW©]¥t•ʵT ÀüËtþ¡š©Z¥hùÔgn)Y^±F6£ã}Úg®V>åºVÙ„9ß¡ªS“U©íi®ƒÍ´(§Lóâ4{›¤ÌQ¤Ng¸q~PuÌõ²élI‘s›!ÁB‹ 1ñ@`¼öëèàùòŽÈQÅ']DÌDعÎã:qŽg‡u =²ZñTÄvƇŠmˆ®ÒNÙëê˜,¸Ò•¦´®þK Ƚ÷1~ O ŸFü ðÄò_éK˜ÚÀßøK7‹O\¾„õ#à‰í¿lïã9 Ê*"!!Œ!{áƱßÀ¯bBL+1ëÃ[5¸õÐüfš»À46HëÂØ·Bç'nþ³á-4³[øß VÑÝPÚ¡ôà 'qæ &6EíŠ#kDoQ:ãÉÞ­9JwD{|}aƒÔ¹ú#›$º¤/,ãÃÈàÐ10Œ +ÛÇĶØ.zv‰“ÍaeC˜ØócB½ípH’9A¤;I]’ƒ$`­µ•õ|­×Ä7Jâû5±Q¡ÿk•Èb]oŒú?8Xí_8DO4ÿ³e÷¢wáÛ|ƽÞô®ì\Ù·äÄŸœ«í[®ežõäXèŽõäWw·ªªö©ìR kq)÷¨âPô§ìMêLêKêJgö G%~ÖΖÎÚ ‡Ož8.GeY~ cFȈÐ1¦Œ9cÉX36ÞqdàPðÄSs¸#dùPå3‚!f$2špÝ1g,†5cËØ3ŽŒÓ€ùZ+¹*C.U>”_!ƒÕÊç{.Ö¶&ö¨œxâñ€Öuµpu @â®þ Ccáxb¸b©‰©ùg»`Í#å^L¿·¼¥gÕTû¼ÖW¹m¾aÞ[·¼CÖ^mS|;BÞgÿ’¹Žoj ?3›ûªÃ(_SÕlÅ ¼Ýª'XÃ¥3ÀÐtµåŠC”¦+>ámWÝÂ/=££˜ \í=âÚ}0_8ˆxˆ¸ˆúˆ8ÉIÒtæ'â(#5š¯ˆ³x3R‡ÆZåj Ûˆß¨ãˆçˆëˆï¨óˆ÷ˆûˆÿœBÀGæŽûλ ˜.Øz¸v¸–¸º¸Þ¨þ˜"a*®Q®Zªe®l®uþR½\M/óÂUU•uÝu%veV¥vív5w}WÅw@O²/ê¯ÕË|$Kˆ{9ù‘û“;VIöØ ß4É„¡nÀÇë°Î'|‡“¯pôãI F)|ðp"ìH+ÁŒ&Ð' ) øBmï&µ÷rÚSJÓŒf>e4pú¿70}ë'P2bFŒ«G~¼°/6gÃ-ب ´­‚+åsÑu{/¼–èÊ–ºì9OÝVóÏPÑòŽ mÇ©p»X¯G_{FË x¢W‘÷Ðrà•[»wû©öåêžÑ:’Ž&µ²/wv7P6;„¡ËÛ6´‚Ý[&6®ÅÞ`¥µCÜêhr늞q2esmsus}£Â½¾d•sS¥s­sµS½sÅSÍsÕ£îYCÅ^™ö©ú©þ¹VmÕtP•PµPÕPõ°j®ðQê¢)£j£ª£vØÒbU#GÚW/ô¡RžÌ;3d°”Ya¢nªræ‰Aõ“ z1uÔÑYde2=™TUUty“ê:æÌ]oòl ±ŸÉ Á¸¤p ×zâ++]OC¡Ê_»a3¬Äb˜ “!mðÄ` ¼(¹8xLu¡ó×êµÀ%ðy%§³a2$C4„ŒÑàÅ¢žèbäÚe4eýæ×š±f(i$;¤ˆÁ0fxlʦ’Âó‘ Šx{Fù@õµT˜+`i˜Iøo•ï&ûÈT?[žß™ä/¦øÁò{bn×̾3­_Lêƒetäs¸ÿdù|c.?™É{Kã‘9|fß,}_Ì݃eîhi{aÎFÊÆ>LØš®C•«æéYú²í :1=/–›%3_4¤åÿÒ^n;’ÛF¾`ÞA7 Ø@,")QFnúh8qc #Ábào&ö´ƒÝYÉÓç¯"‹I}ظ9èiRUbUýõ*b")ÌÈ+fä Óñj£¡:†’éßC<”i'SÀm‘l{”! 3¬hnÄ©bä¡u´åk„穹G #(í rÒóÎ{LYÁ_ä½-¼º‡Ç5G‚A|8Ž›Õx„[é³Aîøx§·DzE„÷÷¹°â Ý k(ƒöÈ+͹f”=ò+"[G 5Œ>;>*h©‚a­p¬kÊÈ·æÄ$iØñ!‘Š?qö‘\{SÄRýYª‘Òæµl\u±âR-6 5»l u¾¨÷n ʶÄe›°V¬GÆ3m‰sʶƊs:ªÛQÕm»Hbu[â·i;‚ÃXq2rÊÕ“¶øþ¬¸é žÓBpúF5ºQ­Ñøçð[)šñýíÍ«·G'¬?ÐÝ#d:5xžáÂ7´$[¬rfbX BfqMñÛQ›Ló\Ûk_¬wvjX±ÃÅÞّ渎þ)(W˜hÇÖŠE/™ß*ÊÏhoèÉÖ5¦kU¦|ëSÓh¥5¢çÕêk÷vw¸ÿêýÝýãÃá9ެÞ=dìËæ³‡»§‡ûæ]jüç·7K£xŽkÖ÷ìßëÑX%4Þ$4ö ]Dã`<$06ŒU„€m,øŒÅ±°,6‹C‰žBñ¡˜ØÌ˜h!á0 Fâ‡w‡Kî†  1xÅLŒ18ApÀ€3þ~úà›±È{{ÃØky5!/¯àîŠjƒ.A®cÈ%ÀÕ ¸·¶µX1"í§£¬]DY}ewÊ~ ÈVK¯Q¶ÆØeˆ­v3EXÁW€ç`k|]F×®lEŠ >Kl]BÖ\]Õ©X1CêP#œN±´ÒDÎÏ„ z^ ž ØIЉ ¨±ótCNgÆMdiÎ%ÜœÂæ5š 3db_Õ23b–€)x ¸ŒhÁ2ae„Jħ@e@JÊ€“ “ ’#w !MÄÇ!¢ãš±Ð'dìþT4/@Å ¨ UWC¢_n¯‡ÃV¨x1žÂ@¬x!ž…¾ ØMÐîϼ/Ê÷i¶£º¼0ß§ÙŽüa¾O³ýöæ¥ù>ÍvÖÕåû4ÛQñ^˜ï’í`:lYÊùS*…ß¡÷×(ý ßÃßǵþï_«÷'"ä8‹×Åg9NFÁ‰8Hl7Ô™=»ðúX=P•*H]8=R:ìJFB:62.ŸS939ö23yæq¡qaq!qáp¡paðHàDßðw páo¡oao!oán¡îÈÜoGÚ¾½I´X»/X[H[8›);6²AÕí‘[dÉ3"s†ùˆ<²È§y¥ô9¶E®­‘s#r¦# ²Ñ +µVt #È%ôCîâå‘Ç0Õ·+ÅþV•´Ÿvä§»"W;²rã5N„Ÿpã5.„xuâÄ…:íˆ Ï8ð¨ûà§‘@ä„ÿœ¬ôÒ°âEóÎB]jXñ¢y% žnGAñSá15¬xѼ³È™—J'^ÚçÏnÖ¶³¶™µuݰ"ý_ÍÚ8k~Ö†Yë©ÀÓwÑܬمff­“†å·žµ‡Î·e7û mgm³ÐÖ³¶šµ‘¸Q¼Ä¯´ã\ßr¾o8ç)ëWœù”ûžó?ˆ8©€³ácX :V¹6eÇú°e •X³RVŒ¬¤«é†cí°¬T:.š‚™ð˜·tÇmËš²a]!eY±ºŒ¬0¤1ë )cµ±a±®cÕ¡†Y}ö¬@¤A[Ö¡ k©ÑЉ4ɧÂÒ³:‘>YÖ(K‡ÅŠÅneÝÚ²vmâ!gÅ%hä2äãq+É—$ËeÉDEš¤b‰*êBü/#®°²´¶Þ.zAÅø²çÐÙ2ÄÆÈ@W3„3ž‘† †°Æ1ÚØà¾-o9m‘Ä̹B]ªüQ/”ïº¯Šµ”k)Ø6îŒÎ{†)„óRXÃ\Ë‚ˆ’ˆRHEQÈFÊb(Œ¡4Rq åq_9ç ^¢íÕöÎŽø7ºŽþ)Ðv£§ØNS¿¿½yõöüÌõZoïÓ =ôBãËnh)¶Xìä´°Ž–¢Çžgš!Ísm¯}±ÚÙ©aEÏ×qAµF‡ëvl-¥XëĤø†ˆ#\ìÔày–÷uéZðŽ)ßñôDZm æ|µúÚ½Ýî¿zwÿøpxŽ#ë‡wû²ùìÿz|~øS³þõî§_>¿½©û0æÝ³OCÛq}Zs­ñ\;×RyŪ½åŒ\]rt@ÎÕ‡‡'(óøÑá*âDj]xp¸”8‘Z.'NèЇ†O!NÖ¡ Ž EÊÇ|›gøô‡{£r~Nç¦á3¡Œ‘·ßþvøîýãáùñðî‹/Ê/¯ÜÞ|û¾fµïÞý«ÿ}|ÿмƜüe·éPáËùøE6~¼%;5§†j~üo°û/øýoŒþÞØæoÍ›ªæžçýøš®ç¥žR—ý†ºiù¢ËS¾©ïåî—}¥Àõ¬›ÝhyßþŒÑqƒqº\ó;n³JžÃVp×¢ë|Oêa­ä§ñ¯ŸxtݨÈ-n²²O£^ï± DSnzYŽñæÛª—/6FÍ6-Þ5±†»âe¹+û?dž©¥ |ÓÉ.T;ÄFÈ]ÙÀÚæ!aºªmÎéUXãK)eg¯µø"B&9&OË»²Éìnw±Ä¢,Ç»\s7wO¿}üù×»wTr‹CÂ`ðwm¥žÂ¬Ãõ’×K?uø¥åG¨¦ÕÔ=ñ4(ˆÎ$#IT‡âùËbY¥uŸªÕòЧfS~¦‡µvôtž¡s„òá ûl1žÖý¸¦íÛÁ›nÚMÏÉwOÓÞÓËhÅO;çø@ã†øH †Ð]ڶصí qÛŽN@]ë½6ÒƒëœÁñqHã X¶ÅëÔÓúÁ¤ÚE#CkAÓ4 Ç+3ëwºU#2E´-¿9zü´‡÷Æù1Ý@cH/£Duë:åfݾUàd0Ží :xRãeñzÓ¾5­q}|ˆŒ ­r}ßà zÊ\ÖÇ’1ÛZ…3škœ9f]l'vñXzë™úçÆi×aóTÚÞ06¶GF|‰¾ÑÞ¦>âcÃ…b@8À>‰éË|èˆÂ™"­—úå3Ó`´ Ψì”~õji0¾~çZ휙÷Ë”AÙe,â5޽³~á(gÂZÓμ_DŒAÓõ­­›õ«¸Kƒ!4ñ'5?ë–±-ƒ’D¢jÖ/S( Æ$Ã"8•¹Y¿LR‹i,~Ž9.]¢" B!"Q6:’ ôzKÿÔ`£2ZäT2jHìÑò¤Ø5ßáá>uKûd, )±]èWZ"ƒq·ðT7 À¦ýjËiðÿ€þƒc endstream endobj 30 0 obj 14784 endobj 31 0 obj << /Filter [ /FlateDecode ] /Length 32 0 R >> stream H‰¬Y”ÇñiþC¿XZ¤Ðîû O áÁÆÇ ‘e¡Íî¯Ù¬õ Ä¿w]}Í ,K°ÓU_ÝU]UƒS.èâ ^§PÂXtL±ªËͽ¯^5¤wÚ›œ”¯ÚfSá¤MHÂÔ‘Ugãˆ(Çp ƒpSça\Ö&¦¤BÔ¾ÔtGt©ˆu t0Á«`´51Ä€ãÌ$ÈduN%!Qr¥ÃQ‡bbgb$¸–<Y]rDÐ[€Ù«ÇH«69:„ŸÎ0g«ŠžEg0¥úÐá”t²`7©ìH§«•1êRÃ1 ©!£ŽÆ¡OÆ@.Apµ‰|C†¢m@ äßÇc8èhèéHú2ÚP]· ÏÚ•÷Žô:FSTLÚ§äŽ`Wu±­”:ê+'ö ñ õèc!ÒŠu*:Œ‹ÇpÔPŽÂÔ‘V{’!d9${g(„{´ çuÍEµ,¾2 ´\R"–+⛯^ý¸yÇóoü«'»«çûýõÝN®_ßìõP=¾}û~§Î÷û‹Ë7÷7÷VXEMfcÂ!d”ÿäPf”ƒÿ/? Ψoáü+`ß« ¾S?ýlÔѽ|AÞˆœmBfk›ä²âIœ‰ûž´A¶á–±oX?M·ÇfM9þí€Až…+‚¹ñÐ`¬Ó5' {Ñ5¹ ˜41¥.ë@Æ–b•ð8/âø@dM•|Ë×dâeK›ëÙÿ¢«äyT>hÛü ˆª‚òÐ퀤"‘“·(B /nл&Œ‰öر"…Z¦‹ML*š%Vïbåì’µäR2ôc}n~yƒ&¥æ€pAC‰4(àö€Gã7’œÊ=®ÏZ ¥ËwÒÜy[lR³C0’)¼>ê.šÎL+š ƒ ×°uvÍÛ ÐC«k M‚¾& ó°àJƈÙzå •EECÌ(š,Tü5Š‹„(èQ` ’×9©¬X®•Pb‘pNöNþA^+:51ªæt+Ån¨Û¡7& ™z\3†ô46X"SYVcsE$:™ÏM~H¼Û69aKFi¶˜¤BùŠYÒº•Û †­%xêüÕ$º—{ùØ®B¬Þ3†ïqã¨û.0 =lª3Ö!µêQª¬²r˜&¾ÉÖÉ»âa>›);™ú©§‰°¸±Ö³ƒ0a¤`ÃÈxEµŒ,übõà @ö:ÂîGž¸pîÇ&’–'ÒÇ(±Nx[› Ü*‹Õç³ïÞ)÷Ñ4×À¡|ØÆV ©²|b;èÌü%ê‰Cº@¿ÙŒ€æì¸·1e°‰WªëãïlKãm]ú!u‹(ÞMM’Ž‘€rßΠ…¥’‹Ä†L{Ƙ‹J€Ö7|8Ëš;»€²2u·*jõÌë -Âý°½k‚fª°wË?«ñóx… õ&˜û™§E ÖeN@ì$:nˆŒ)­4‘<Êi"x#äÐ@º0:³c¢‹¿:©bâ[ÌœÛâÁö<ÏvE «£Ÿ\îW­Rðº”Û™œŸî¢0âÉ·ÒÅ*5°d ±ç܉4?U˜¨”X¼ÝÈÏš_ÖK´." *Åc‚ »Yj|*~Þ]ac¾I*»F0´4&laÈ CfÓÈ(»0ÚC±ì¯?¼Yìè©›maÎb `ÓÃGµ^ß3·<í‚¶3ØyØXZòP€;‘âzTH¼ã½²§uøI^”k¿@©w¿ u=-eû ¨8G°K˜ qä€;m3Òµï–CØù›Ð¾7ÿâÅgUc¨Õ(©ªçj á áRÌõ¸°úzX‘u®¬Æ&ÉSQ6Åòye=”ü‰¢„6ºT%ÃReø&uYןFeúÜ™ð8ª !©·Æàš¬©u´údõÂ0Ùö¹Â½Ü-¹‚®†]H"æè;”ÏKªågN?É2ý<¢öÆigÉv-šÁÊ}(üSËU>Ú­ÖÕÊ´nnÖÅÊÈ^5­Uù`«ã–­JÖ{gÇlªÅV4ÞÙÈ/èõù°Õ¯Þõ¦<®mÉR3Ï7š†ŸÄì6h#´N¹Sã#®ú.ɦJ •,l+°"–'˜ÏNÔ$xÅŸ³‰Š‘¡xAØ iSm”Édõ˜$Äï’³¶tg9 H8Õä özKHÀšÇÍäPa§›+l"°à0ÒÄ’š#©¨Sά˜¯Ïïöÿ¸¹Üß¼Ý]Ü}P±’Î<è°±úûêkÜv¯ÕÙ£Gç——ï¶/Þî/ö¾úRþÿ`Lm¤Ý÷¡ºÔ‘+kDÑ\‰ Ÿ-¡¡%‚1„7ÍZôºÚFêÀ:ާÃ`LÓãO¢-%ªáxFÚZÕI/.ÿÒÐÑVœ$|¹ã|KäNÇÉ2úhÍÕ¹jÑYF&##cÇ?‚Ã1Z tÉV J#à½ÊNÖç_£7UÝW/ÿá2ù ¹‚úu …ФêlªD+g]]„0›èvd|oåÌÈh#ÝÐòíåÒ£×mƒá½ùgS Éb +)-“i-¾^PÀ­‹¢(Û½ffáÆ úïûò¢sÓ™1£0àñÐ:E=$_F _!›±L*o­”H8ªí‹dÖ ZÂ?{3cε»±ŸŸ Ï‚­L2ÂkZ¬u—‹ý¯üxÖg@Io¸k ^D×Ó•j(c‡TКëhQ¢¢ú±+‹Ž§îØ ¿×ÛѯQ·¢1]ï&!ùêãÝ«¸üÔ'’¨3é'ÅVÍU!U 7®Ö»é^BX/© h"¯‚?pý°F¤…dr¢§2& Ø1¥4³k5{ÁxÚÁcßl-ƒî–|­«2iOÖgfý´zöùú©µæúIBàõ¹s2~4Àçz]É£ô•µòÉlå•ñßW}±Ô‹2yiüdí”Bb-[ ޾ý?ëËW¯ÁŸAž¤Æ¬äœ ÊãóT[ùÎIó GbrÒg@¢4õ#ÜCµÜÒßÊ{¬–]¸¬y5YTjJØBéËeH¼O%ú6ìt •¼M¦…e*žáp¹ûq”u“e´&8šíΠœæV¬ŒJn´º\Fm”A")çEÊÆø±¥ýé>kÚ_\þ*JÏDô*ú×ÏtU¼_ªlS%\+^¤àÝ:ö)çZ‡Ê—4À¥`8«Š)ƒþç úËÝ뻟|ýóöçŸ=½ûæÃÇýí7ß~ÿýûOw¯ÔúÍû¿þýéhÿâWïXü·%Æ/%¾¾{õñ.h—?oþ#Æ_à_ÿ€í‡¥,¿\þø§°¼Ãš7¿UgšŽ•ä/ÒP‹0ÝN¦ ië‡&ûðéNüøµ/â +›”Û¾´s³ŒkJVAÑm:ðꇷór$…µd­Û¯îƒ]p^ÚÊ´ënéÞ‰Ùg®¾|ñåòæ÷w¯>ëåÿ¸—c”Ïœ³$YI’¿c@i{Óm35O–݇¦Ý‡×o(kKO.á2RÏÎet8ê–³YÃúEídµNblhñäŽØšjÜv³B€œ£¤ºjBuc`mÝ܃ùh»²EîhÍ)¹J«>FéÜÚõສª¬ˆÏJõ+@ÅUÏö®‚m,ݬkj2ˆ Ôy3¶¯Z•±¨š©-(èò†ÌÈa5æL.[ïeÓ,‰*Y½d6'z©ç(«;ŽkzGAz°o€Dñ8cƒ&•]â!bg4-§|6©¢å–eê³àéKiU”2lqÍ’,!Üq{þµ©!ʱÇ}Á"²º¨4_œKI#Õb^ް!H¡Ñ¶ƒk_ym_jkÜR-uAàÛgÈüN2õð?Ò‰…­3³èÝdõÚº¹A+ýêw¢öÞB=R+‹“;j¥Å¤Ü&labm×n#߆­´%Æ#œ±•6ÖZ<`+í¦õ¶r‹5¨…m‚W\ëñ¯44ëó»")D!Oìv¼_NGv¡üô®x)BØå:Ã+u½Ùż˜B;¢‹¶ž8Ô ]xFû‘]ÉaáÀ.‚À’©gvÅN™ìJÄX#³cÆ,ýÿÌ®ˆŠœÛ^¡.Öå’Ä3»Ã>³‹°!îeb—Â(w;vi=rC—€‡ÈÍ3º°CKå#º0Fêýˆ®ìÊ£ììÐ%}Ã|D—Öée#6B՘ȅ½Y…ÙÈõ–¯äâŒ<‘ Osæ~$Fî­Ñ…±wŠºÄ¨šÆþ†.¦³Î¦øvèbÊ )Oè’Ãy`c£«;xq*î'xÅ“¨;xåɳú°ƒqHmÄp/ì9¦z„FØ~„ÛöPò¯¼NKt„W| Ô—KÏôûL/©`¢·ª·£—·37|aÔæxÆ—“é²¾²8¶vÄÆ­Ýïð…â$žðíkáÜøÅ-"µ _˜³™ _<(yßV|±† ͪ‡·F|ÄwÊ…ùˆ/Œhm}—!˜Rè'|á~J'Ù€`–:êÞ_ì€I…ø2V97|ñF™FõßáË2õzÂÙ"4ðEš¤ë_±Ó& _ 3ñ…±Ô'|aG*G|…»y¹„ñŒï°_à‹‘µ…8á‹ÈxåÛáÛ¶37|aÌi4í¾°Sâ#½°%b:Ò+»®]O/âµííèŹ£xîèmXy…oCϱR·â‹Û`Þ;r¯æ _xUÐ øÂØz©G|úAºg‡/ŽìÔùˆoCÜXiØáÛfÁ+ŽP:‰†Å\½¦¬äâø~¡waα•#¸òÚ9¥¸8’¨¸"[B:+ÏCtµn¯:·xîùÄ-\ t ƒÂ‰[·÷¹£éë§§oß¿ûq3)à‘€ººn}+zA˜n'$ºÎJ·íà “}øtÜù çË<Š·AÆ!âì ¹Ã«ÚgÉô—Õ_ÆË›3xæÆ£{æf\ù˜„J.~adŠlÒS óÃØàd¿ û˜!ø>{½ö*I1G’KLqq™¤ÖOöuãd³Þ˜ÈtiŠîp Ýönü ¬!Ã$Ë­,Ñj¹§-ZÓÙk´ä‹< .kM ^)á/eCÉɈçó[ɹ6áÍ2Y2E†aÈ>©`%ÿ1Q&„mÛáh¿ÆUŠõœHq¼šn«e±¹ J:Fk¬7Óº]nV F8UŸ­¿#0œËa—½iÝelœGÇÒ­JôÚ£}×Ì^Pc]ãu6¯ûr¶ÖMý˜×Tm†ÊQ}¸»ÂàҾ⥓™±ds›"¹Rë³ØîñRá°&#¸/^û@=$Ø>º\ÇŠ]Ö?œk€ï&—Õs!îUK¶†8ÅâÝ+eªcßÔÙßÓµá…}Ðî¢Dá¿ìW]‹×}Ì胉}¿?’'ÉÉC’ 2‚„" G–´ewƒÿ½Ï©ª{»§gV‰Åâ‡ìΔnß®S§NIwqäHNÈLïšÜ“T8"mƒïˆ’t5dü\æ‹}á‹Þà£vê:ð®kçvs Ù:ÚÂJ-E †U,ÆÁMö8W„ÜËêØÎ~œ5rÉu-n°”°!,TŸ—}5Ïà¯è˜ÒDB‚^}wGPs\†ª›CDkšøG¤ÅgmõÄ ¦Æ,I!ìG£ï­³ŠÅ«œ‡:£3c,AåSWþØØ6yZMÇ]ê £ -õí÷“ÄìMó¤ÞZ.ôÖÆ£N,³ßt8üÜ5ƒAîiÙÁ%©ŸGéôyziñŸ«˜4¸ Þ¤A+Ö,e3OÍš¬f·Üeß\suP%.P&¬1N{•8kCÀîŠÔ7áÕ>K>꣕J|A Ë­†Pdž=VÕñjì5›1;Í<ì³è¦Hý¯Ä…×¥ Æ ™†Á§‡3ÇŒ(Ý(r\z#“g…ùh‰­c‡A,©uuÏ¥,n_‰°>õvy9ìܲ4XÆzád‘Q6 ;Œe#‹Ê€=xÝY`,2ŒÁr ólA´R«Œ†0VíñDöCÛáÊm-h(>ª°[ËDôi=œ» ¬XàŠ3k ]3Tz˜‡Á ]Ö—È_$ÍT°:i"w¦<ÓÌ¥E0:BoÆÚãe øû( dCêÅ+è våæIë¡·cÛ˵Ûá›d<Ô$@Ç8 P; ÑS†tȽFíA÷3¸]ê)£x¡®!µõ3gI³_8¥T0ö‚Ùlg)íEí"ÑÑJ¡†Ïjë¹®GUfnŠº^ cÞ¿?ñCMvhÙÙŽr[êU³“˜¾4µÕZ1¡+‰f¦vM@Aeç¤ÃÞ΢¥ ßÐÃÕ‚B_FYZÐ^ûô–:2[Ù éé‡ÐX4ù˜¦¦I:î "Â+FBš‰%ÏKºPœŒJ.{cçÌž>ØP¬Kwšˆ†à\SöðivbáNä¬kuÙ2aJdBž †ŸÑtˆú$¸ 4WW—ƒ¼/q²ÕnÁyŸ¢bÁS½X"°ú…•©—+%š g ›YÝ•žtãÕT4FrÙ/´>ÔºfS•6l’µ§MSÜÙuUƒ=¤ª‡‰*m©·Óôì)-»aØ@¨i“÷éDÉɰ>VïXÛY¼º GÁ[–¶ˆÕX!×´….`K¥uKERápO)îS±¡g(a:˜d´“3æM™aìÁ›‘]r;´’w>ÝÖ ¨,„€áàh$“æd‚Ð&µEçúW0QAWãpRìtæYI¹‹y— Êת%;D¸UªSFL¦²æÀD S1<ı«EAì„olMd0P‚á·ì%µtÖD  ó4•‘Üʆ÷0oMW{1szÎggsÉ%룞Fßë\Ý®H]';|‹u„¼ê„E—‹"å–¢ ÿ)â„ì(ûðÕä ì¥tÓ~Á«"AÁl;"›»8üfÇ+¹gNý’ì°1.Œ›â0tjP1 õ0kY¥( GU(fð£öäŠD‰Ò&‡ÑÕ ¢€J9iFz²›ù\lg>£½kéYK§dÃè£t®Ì‹qµÇ¢kÕòÊ@‘,';( 0GG½Ñ E ŒÀíÒL.Ή¨/jÕ( wÂrj”¬g½6ÒгÎï`RQŒ|¤!ï2f2ˆ¢¨Qü¶³ÔZEâ×íÆä¥ö@Kˆy >˜²”)QzÓÃ(¢‘?õé…é#Õ¿Q`(4´w«êD;kãL¼€Nl†û Ôk¬$Õ^˜‚T”©¸ÚØIXÑ΢Æfk\jæÙ^ZÓ4_¥øà>IØTyÝã0¤L¸©é¼˜Í‡^>sh Þw »é•ž)šwF5"Vj ¶WßÇ6@îo* `LÑ5b—›‡±·-kž+‚Ç,éZ)Ê¥á²ÑK3¥8•†‡?ÞÛà³u=¢K~sƒí-µ 7Êz­/Ò4(SòJ½'F´ê¼- ÏLñØÍßEÌ‚@æpEhE%2L™¦64MV²’tž­:\IÓFÿk(Tk«Ã|QË/s”Ƭ¢NŒ.–y3 VEp³ÑÞEv„ÏØÖ¬‘‘›Nm±ÑÙd‚¾™@Õ[ïåÞ´ÀXV‘`ý¡‡2^«õÈ+ÑÈY†iæ¾Ög|o•Äm8FÈ‹¾IütÃ5‰›ƒ¯HãÁV}ŽlÛYj\Ùn‰é>:¹õ—m³Ì(gÓøë’ˆçÍ’P~ÿÉîJrñâ{ k)#r¾–Êcýs#¨³<Øå95]°Žwøz<‹êx$÷öÑ…ÇËì³?>Èuod¼q¤@ –Ï|nˆ>øqôKÇ;Òqüe©à<ï›ÖIGG+Ü»‹hºxó½¢ìÙ¡/-Ï¿Ý}ü\Q’WQòse‰Tz yùF©¾B¸jï4·±q“!= ·êÏ»Ýs¤ÐӃ¹*‘ awذt;ÊLhN”?”¶÷º;pU Ë«APx¶·uÑ¸Ê yå”Ć$¨dϺ éó5q¸w](§‚Àžo˜ŒzešRºÀAÊÎDZD‹ ³wácWAêb±Žÿw¹{=)ÜþµÞ±®‹guº¤èa¸hÁ–äļ¹ÇXÔØÙ–‚*L ®y/À–]”[±=rYÓ œ“n#Ê<³³¼)öpoÑÖÝ!;-,ÄJ%øõP£j¤lf“«¾]4ŸáH]Ȩ°é"l.à¬ä{Ì{ñšÿãé O£ägÔ³Ú¹ÑÝ–{âQN›.yžô¸š¬Ž;ƽȣ7‡sŽfZq|¬mïï—ÌüòŸxúbÓ¹©Åp)}ŒW@ 7þÖ‡?±^í:{ÝF°7àwPBàeÉ%k¹T›'0&V™÷Ïì…äòœï p!iÌg¹—™Ù/˜—˜¤ÕF…8·j7Tjk:†hóÐÃ, ½5¤cÝh –¡ÏÅç–lõ.î}Ø$¬ß#‚‘Í5<3- ›Ò 8ÓXãžJKÀË¬ß ËÕ¨`"Zb¿ p%÷I8³ºÙ§—TxàºZ~oyülZÖxfcEì_ÒÌ\_Ýò~ó 1k.Mn6ØøpnÓ²ÜÒÐhÞEýÓ‰÷©ÕWÜ¿%|xß§L|™¶9þTŒ¯ ÷©ÊŸÚáËÖùÔfûñ‹æýØégâc®¿,̧¾ëýã3›üu¸¡”¯á!îw›ÜXà7‰þøtF>ýß9µZtåøõ€ Û4°©Ù>Dо1ÛÀ÷ÖrÝI0¡„uéXSo@ãdöE6~‘¾—Nïë¿Â×=¯þßÿö¯ßËßþx/¤C£ôÅ^‡eQÛûÏe‹.¼VuYƨLSéÜKv0³Ž#¦˜êÖî,Y´E² CY;4MôxmÖŒèUíÐ4D³{톣?÷ïĪ]2/nkˆÕ=¨Gÿ³k¸6“}®ƒ4;ÃÆ¶‚÷îÞÌ yÀýÚVÍâi\t•]àÎŒJ¾KÒf&»ÌD/PK±oIgoáÖYÖ+Jn/°%šç†Îy^+O?Œ¯ùáRzÄààŸ«®w˜È©c\j,+Ö˜nI¬ï΋¢íg±"Ž”ï† àÕ½¾Z`!Ê Bs1\˜ àmU_‡‰Úx &vOÎ9¾!b±gÿùÄ ¢šeÔÑ<оfåÔž9v©/–·–ÕcÛz@OùjãížNCkE¢ºÀ–Eì$îìäÆ,¬ø ¶ÈÔÍL;–€y“iwÎ:BaMc#™*¹ñÚløŠbÕÇ#^<'ÍÇ»6vç À;_çÊÙã b*·ñ¨×Q¹PÙzüøÂšþ¥¾öï¿ÿ&ÞV1…´m{ß{¿³,w%É5xe<§½²œê¼’(ëß“µ^i»ð•·séI°Þͬ…´I¬ÔÚ6y” ÍI[¯´¯µÜY{À>—ò-ßoÏKXdà5í,ÑtûÔ0d¥¤r“ˆ˜‚9Ç‹p qÜx<ƒ i5Ïâ±^¤ðø¶§ùàRÄPm~/Þ=ðáh`£öy³ùÈ&oOêGvñ8|*yåéÉŽf¾ðHÕN¯õµ ( Få!–ë¸üÌÂ¥Á¾ ßÒ.ßêË i‡¥ªÜn{°Ó/¼l¼ƒ^ZyXœ ~(àÇ<ɵîÅÍ’Úˆ®ýŒºëL8|†â8=€¥-™<3xÙÅ _ž`›Ëw/w F~YSwƒ»\ïáãŽ#6ãÏ=ž§úpçí}pñ©>—ép½ÿè×ÂiZ£ìË}å×È`ˆø†ýq®%jgAÁ½n” ÞSîWzl½ÑUˆÔªýX7 •ã¼üex\¹¼%䙯ÞaB…k{5šàsdz†i¥½YÿF06ûûdèµÞ${†4†Vø9p‚—Öæë°+ဩÒkèåÅ}$~>»àæ’<ã"øH3&Ø?×ò¸øLÀZs~’ß;Sʵ³¤¨„w ‘oÜÉZó઻iÝ×ÀHÿLÐÎÆô8×¾fƒ´U%‚Q˜ð¯±˜ÞÄŠ %måRµ€E ðVK¹’¼m·®j¤³Fp'޹<£7ªEµµ]åR@œ†íâø.{qc±gü¢íøv9ú5âyù¡XÃct"[¹]–v—ËÚ¶c7x¼[ÄSl¤uír„‚Õñ¶ÜmM·?×w¾| ÒËö ØMÁéÛJÐ =гGÙî3ëÛs¶*ÆLè½£5HëØHÔð$HŽÓ´ÎÍbZᡵ¨ÃC*g^vV}‡€ÕBÖ¢Ôv^]›ˆP³›9|„·$ãkªÓHÙ2‡ÄؽíU¿ÅÎÊ.e·ÂêñÔGtqÔÕÙ~®e_nPI×ÀÔÉ bÈ^féšÜŒÒ±xÀ®w’J¹¬8»<¥QãÍɽ¸G¼#¥a@³W"éØÁ¶˜ò#3±K&~½ôù*£:ŽV®ßVfÉÅb­0“åÂð7ˆ» s©û~¶Ì @"s´¨®… ]Þ›oK³´elêPꇥ½ôU8»Ln“wï÷ŠÌú¬&Úbž®a²h¥#ÈüZƒÎÝwT]%ü‚²… 8„[OÍí{›U´¢º/‰3ÏÕµ…˜X™µ+ÑÚv Sð3j«g¥=í‚BFz&K¬)(x‚hޱ\7Z¤=­g¡"­¯:Oc:GädÃP:†a8ôa;PAòY%`vö7`¼µæ¨Ò³µZ¥LÊÈÎÙ}ÁmÔCJ[!(X{÷mV½¹Ð¿l qíç†æ›+êú:\ÛôJR!«Á_%²tƒ´f¬p ÆÕ‚ð²Jjª³¶4¨P*8Z[«B‘~ëÍðYÛ*Eª ’Hß] hÙi¥Xõ,àÅú\bdÍCÝåé¡~û¡' ‘±©ªÙÓ½°­§šëFòn‚©+Ù…aˆ?æÅ+eb‡<\¸³&Wœ^&'0´Êªðm©cüJg¯Ú:ü(Š‚@[¤cœ˜¢ppÇÕð­—tpCó(WÝsï—§tpÛ]y¤ƒe†Ñ<—t˜R~*7piÉ|)7é³Ô/å`¼¹; Déà†q—t°P´ï<[:ÿ^΢t°ð¶±Þ‘ç—rH¾¼÷.å>ÿýÇ/7OOwÇÝI¡—w>G~zu<Þ<ÜÝ.FíNÔr±;yÞÑjÑe€©åúþÓðןÀþYÜòÓòÛïj¹…3×oi”†ïi$<4„ãÅ:Í È@—Ìk\Lì×Váƒ?ƒ//ÙÞ¼£å‰=Q¢„ï'>~€ ¥mrÔ\6¯ÝßàÝwßï¾zÞèå»rÍ9M?.swX̲ám¯ÓÊ•6Œ / ÆX„aQû:V‘#&‰²Ø¬0ÅÈÚ(Óªy7ƒ•"³¾@…­SÙèeçòê°Í$¼¡U¦,³ÆØî¶õ}rHi< 0éÌ>„ò –8Vàê}|ùs6³ÃÖ:f—Öá2í÷ +å¦ lzÁMßgXoиvN®Ë+Loµ¼‚IIwð ¥ËO‡Ai»àÉ,,y‚px'±`ÏS4r‡l)À˜hÂ)ó³´òï+†i_›`2ÒÌÉ&S\ÁÕ¤Ck*iOK\w²ÃxÖP„õ­l–•Ða.w®ƒ2SU{xF¥W°ˆV€Ì÷3wüAú…µžÝèúø”0ˆ\Ð]Š9Æp†)Íó» ­bÚÕß V5ŸšQ÷5rµ5z@澋YM3.ãL’†£KxqqiàvuØh°eÄ~uµ;Á ' ü¨ÂËyõ§O‡h±€ðkø¬¸ŽIÆsƹª_í‰;K¹…Jº-@ b¡FAÖ [€œ‹1N‡ì ½Yx “ù[!Ô‡'-óU;K%ð2·tr6·ð[Í‚7&ÈD*\áô1‹š—>©À3åø¾Á©(–ËÕ ¡ôùjÞÅLÐjÄt ¹G8¤–÷™¿æyŠ@{µ4ŸÀ/osr Äí,\¸l³ÅjPAÖ¾ìƒ&¬5í÷:ѳ&–]°Ä·ßÆà¡³rí÷Â)d>Œ¦ÚCޝ0¼îÀË@$è(= 5U/IÒ0¬@0HâÙØ€AÅU M*¯`ï  aò7ŠŠèµ¢  N8CKǬÚY•Ä]OIkieœX°uOì±þÀG¡U±PË.þ| >t jlãaèA‚h8= (/Ø@㮜ÝxÙV ]qqp¹=BãXŽ{¹Y¤™ÙU)¶ªHÈ'Rx[µ]/–i#WÖJ\Ë$w_Ë-2J͇áOš·K'£!Aã¶zx±±ÖÆ«XoÊ{Úte{Ø\40=J#Æb›0´b&𴞺î¡Äa½Ÿ?¿Å›ïwŸ÷üSâÎ7>f•ox_±©§1(ÏþÞ.}(æü2Y£rŒëûlñêÜûÝ0H±9Ãr·0± %.é«Éêj»‚fíò+ÅWVFùè/ÎÈk¼œSYô>Ôh)ò‡™Þlmªg;û ûŸOœ_¨W‹²)ó« ›KÝW5×QÙUQ Å YST§Ê,5}w_›/.]íòrz¶\ÿº;ÙúóÍÅéÝ÷ÇÛËÇç¿ÿøåæééîñ¸;)ôòîÃÇãÈO¯ŽÇ›‡»ÛÅè3¬ì‹ÝÉóÿS‹./ –ëOø?Â_ûgqËOËo¿«åÎ\¿mÅ]b £`®÷ìWáßâbb¿¶ è¸{óîë‹Ç§ï>ž>þu¼yü´ünöî4à¨S8[¾þßÓãÇã‡åôòòâpx~xû×Ó ž=[þƒ'¿Áÿám~~½±—8•¡só…p³*²Kø~â£÷P&¸ð‡¿tÍ„. ¼ûîû/ ÑŸm‚üù@ãA8Ô­%Á{QÛp4Ë}ûÅ!“»Å©ñè¼XP1‚Ù’ö@¨,o Éc·8å"òQ j/Ë…wžö±‚˜4ð¥oëêfЍ`|?mtèƒ&q‹[ISTc×Z–!oÖ­ÒDÝa-]Uªf­ÔÃl·— Ï$: jÛA¡Šcɉ.°înÞ¹¼:lsäèTÁÐXÓÝ·>‹üî0®šÆ°I¹8Bd[?i¶0æ9Å+eÕ¬ Ö ¾ul˜ÃaçƒX0ºìšÁ?»ò Àzẩ 0fK bûuF‚kH° ÍŸŠÆˆÿÊ žÒB#°æ’öy> é}ˆÌæPK5YÚ©@UØÜeW¸f¡ǺÆðrÚÁñú ,|?sÐC€l¤/Ť½›^˜µDK2WšCÄÍÄYÉ2ÌÍê zJ½j¡qI¨Î,®Z®¢a˜q‚Õøð¢9XÚ8ðj:–P@ßË!.C;Ô²]öþK6ù+jô´¨`¼L%+í8$?O±àëÒJ…G˜†Ç%&ó&™TkX°‹^£÷mliÉð‚«#/bø¸9u p;cÅgF³AGë69H dÑ6ÑY#…RÖ0Sª(5¨e ¼|÷^¸µ>wœ,ëPwDÊ0,f›<»ÖxìUæå3ÃKs 2u!Á:¸ B=´5·a¼¼æ0d¥9•à%{PzTƒÑ“W¬ñ°«ÚŠRieo*X¥@¸g™jƒ&˜¸½v:bò¾ù >ÌQÄž™]÷˜ã;Œ/Üó"¢øÆò.ór SÙ‚ë“Ïò«1ÚÜÚV¬wÛ‰O“¿Ùñþà•Ï ¡˜ùfÚÛj¡?¬"‡ j‰æ2&ˆ¡y2@ÈìÔ|hÜ #³<¾@>fçFMÞ2<È’¢ƒ2ÓápîµlV9½‚Á+×,‡˜eç§+w5Ñ" .vÑh©Ë}o¶nªWlZž¡'áÌ:Ç ª‹6´ðzØ-¸Vs=­X­ P羪[p@O‡ã¹VYüÊüî4pªû§­Õºj²_º›¿¶¼ÄVY±6·1L4¹€AAÎ8É*Š)â)YÖu*ʈýüù-Þ|øbùìþŸ†Qz˜ÝÕ’B'¼¯ØÔÓÞ<ûWx‹&‘÷"ÝV:î*,[¼:÷Å¢%jCsË´1IPàÑd rËÂc”|n«¬*Þmcjÿ_n­aGè;œ—€]Zeï—öÉVûÐV¥Å&ÔPŠ1²“ºpeB¾}ÿ³3sv÷\䘈ƒ-ÿ´gvvw.ÿ)qdu×3Þ¼yäà8Δª X æÛ-ŸÕÚ);×'ö±§>[½Ì¯MSßjaóÕ'æjÍEut6³/ø[9´„3"Ã#$¯òýÇ<Ú×uyòtyõ÷Í_>ûcyý‡»·Ï?|üï¿þöæþþ݇;|Aôù»oßßÍüÉ×wwonß½]œ{ŠëZž]|ññBÿ˜Å¶H0Ë«é—ÂOÿûa Ë_–üÓ,o±æÕ‹^:õÍO«)ͧ¬¯Îø6eƒî°á_Ï£u0OÊÇeõÄ\âåÊÀ¯7¥ÚÙPöîœðÁÎ744<jFsc„OÒP3<·5^¨’px}#MáÌ p k¢Žq=4<² 9óËWLQý’j ˜sýp›*Ûæ fÁ9©¹3ÕIÖŽTçÀ·’øq•ò¤þúÙઠOÛ:Õ§çÜÂ>ɶaØ9áód3\ÚŸ§®Ÿ1ˆj‰o.ÎÓãÊ(ÿ3eT¿ýC^?Úø,¨öö?­ª†=&U…~âbÝ«ªÎgõ4øtÂ?OUõï´Ü*O•;|/”kMÕò2À±MXËÁZÃ\àCiW ÁqÁså$·œ61)±#kåøJ?wÑ ø;Å6ç<—úÒ[[o Hÿ´Ó¡ƒ€;“7kñà!oúÒ§&6qíxdµ¸±gŠ >å]#-4.Õ¼YÜ;[ïÏ€Ç~×Ì ‰¹\v‹SŒ0Á¡ Òå<‹ÚmõWT |%Ù´S4WùCAbš…ÒàÁ¤©&®¬¬º»+5leKµž4» Íë6ª®²NžÅb‡³²,—Éĸ‘¡HƒU,®‚µÃYÜv>ašu]Ý(fäg#\ïQFa1H´nVít_òd“ÄR¢ÏCþöÉa‚ãK¬)(øzƒûC›#¡³Îð’Ó`THw{¹¢(Ȳߌ[ì£Ù€ÍOjµ|€Åº„y8,ë¨3L’t°Ä-ºÏœC –‚usRbGI•IµËŸ%Uç³tâ®~€FŤ·x€÷ri^|Äg¹ÔΓ>Áµ?áƒ2jßuo·|’KÙê€zÆg¹TÎÐÔûÏ´Bã­+ͪóþ,Gòá—ÒP¡k¨ÏÒNí*p¾óXÐêZuZOÕ.ÀÖê6w¸Eüá4ܱõ¢÷³>ÜŠ7 ßØÿòõWÏ>ÜÿþýÍýûïïÞ|øqù-®éõ“ßࡳÉ5=]¾zyÿáýÝ·Ë“çÏŸÝÜ|¼}ñýýZütù5-ýýÅ÷Õt\u(|wÿÑ€*­k£@PÕYE¥a× ÊFjµ$Q£cQ‡³„À¤êÀx‘òž|‘RiŽ%%TBá*éJe †;&š\Ä=°Ò¡‚•ýÚ[¢ZH–a’í¡f*·ª&d{z:IRµÅˆæjU¼En‚í]2yÛÊî+n¯èô¹à¬wÅî85Pi|ª¦t´/¹ÀíUßP✽0õÙøS_˜*NªTxÐÞ‡Â3D6ê7 •mÐÁqYcœ¦8ð¤[ú 7§ûí2¬óÇ;>‹[ÛtwpÒ‡F÷å…‚ä8œÎbo£‡|õ‡)r˜Lg™w”¦Gù|Žg»î}\mž`“»§yÔÇì6Sz›Ñ?ŸÕnbEd4}ֻŠ `ÅíäÅï=j´*ÝÇ,/(õHsdMý?_|áà"^0y¿üpqèÀí$tï—0¥"jЦ<ÂC̉Kž• Á†µW ,œðë-'…èWQQI\žc~ñk>’Nö!>ïJ©Z©:åÓ¶È,ué„Ïûö{<ã´¯‰v½ÌýÛèµ·b‚z° åÍÂç)«GˆþúÑߪÕýVÝ ´°Õà›UdB°Î.‡.¬ÎÁm,¥åÐB¹ Œ÷Ì“±úà©4WÀKõIüCU) }ñz¡ËÞîÈ.6×ËsT  ßúžPJYÖ×R:ߨ¹–¢¹D9iuч UÜ…Ì<˜ÔÂÐU]«+½M•aAÏ»Z ̆×--]¬T†à{Ï Z9X,¾µ<Peå§ |a€Ù9)"Þåu\°«ª±ð4ÕEÍ&]ì³Âzå¡®¡â/ ^P¼‘óÃ#²4+ç¶<·'èØ@VÍ{»º£‡â\šáj´ª…À3:óâk;:`¬¥íç úM9Rj1/òˆîR& bQ6«þ‡¨o1]&Ä ö=ñÜz8.:k]N—ì2U—Z 9X)%r\ _õðȱI=Œ ”Âkt¨•„€ã¹…`j‚D©ÕJF³F@µX££˜vÄmI²Ù¡PIhÍ“l¦Rúç³_Ï¡\bÀ‘ÛÎê¬H¸e·“á²]hCž0-&z@o÷FO Löš’Þ¯%J›$-önÑ®zÅ%8¼²O½àºæa[ëZZ…ùb”!lêk½•Ú î¼œ '-&/Žød!Êè™ÆK±”×#˜ôÚjˆÂ¬ÕúëMÕ˜ µAo=iªUŸ"X“ó:äºeÈô×F˜/È<8K€Œ­³H€èx;‚^5‡«Qk}/ÏD÷ju1„… Á/‡¨kÔ =‹mTä`A‡¾#Å×âò»L‹ÙHöZ[¸Œ+ta94¬[b.ˆx=þMí:‰¸«Úw’kBPºVàrÒšCÒèž>×hi{í{ŦåÐæÚ¯>²wi¢ÕÄΫ¦Ga•F¡~†%D©¹òž´SkRÄ›gn¸¢Â€õI»xÓo\ LJ7<=@fg;¯¹Ù1Ü´©\å6°PGª^!¦È¢Þicmu°hK«Åõ™¹«u®˜a2\ðSN+oáNÿ×"!S××ni²<CìÕXùtWI®m' \Q$†q¦wÿ뉫àüD™<=Y_pSMr9¯Ñ› òx~®DSôLƼÅPv—À­šêonáÃ"ñ °Á‡¿+h=þï¯ã-‡¶F4ºŠ$â«)H4²ã°EŸ€HXÂ ÖÆF0äÒ|ŽˆxÞqlÞÒ wS—3mü»Ã®ªy’ÝÄჺ•¨A‡+õà2ᦉ(eŸð£|ñ”cG²»„Yœ°“ï÷Ͷ!AkœcZŽ·]‚íV¥ s‰Ð\¸ëV¾+0¸žûÝy5ea²‘ Ë€ŽMÝú4ð|–¼tEgô¤.:úÔ;uÊ€åéJ…”X€±‹£}ŽJJöcÐGp­"±(qšƒ›áÁô)Àñî4§gpx-t¼¢#èc§w~s3ÇÚÒ×¾jÚµ2…KAÁ÷’¥»ß>Ã:¬Å©é*w—p:rK}s›þ‹ä \âÈзâäQò8&’áUÆK»Ü)îú‡`æ(¾}ò0« ‚qÛLlSø}½6DâÝA¡÷Ë YÕcR„‰w¯ÊöË}1X•íçŸ×ݾOx~«G⬑FÓ1­˜3`­;FCðôí&Uëøý@\Çá¦Öâ°k)§tQÚüÐ^¡Úº•¿o#>Ïæ+Òã (eµ‰î–ªkãàæ»Zyœõ÷41±ÂüŒíêXOB¸Ÿ ^Ü߀¤Å­ßÙ ŠOµd‹õþ†ÕËÒ¬¢ãw |¾ ƒ›•ƒàcŸ ƒ‰]±ü’"°á°•éJ “—M½Pw`þ“sq§À /µ‹¡ c×›;y Ð:g1lîCqš T6ò¡(Îcl#nÁ¹P1r«+Ø’®žÜù›¬ÍFq£íeVÁ¾.È/Æ«L÷âˆñ†}u¯Ì x¿¡ó ´6hÛB¿ &¸Ï›ï ÎëÎf¼Õ^O-ìIÛh ÕbûÐv¤(hPáM´½ïgkÀËÆûÏ2yXÒ)WàÏdëÕ+ƒŒ¼ÒH€$9käl¯Í ¥hŒæ¸Ûy±Ì©*V#qÔf ´˜A|/Þì}/è6þ(è|/ÔF¬\`*ÂA€cpÁ®©EèNg¸YÈD$á{‡2f‚Œõù^ºƒ_&LGèÔɉÛbW/ÍçÀÜÊ^zË.@ÿÄG‹ý–ªâþÏ¢yÎç¢êÁ°ÕäVPúÂh®ÇE×;}Ú•¢ ¢¤ÄÖÐÝøéfYR6tsk¢eL¬gÙjŠS>uYЋ@{€á÷¾ZmîÊV†©‰`ÉÛ¼ì*»5×mLJ–+«"þæ3` zZʲ̪ÎSŸ\Œ n ª& ŸáçJºŸërDL'7Ìå›@G½-f¦ûÆáóè¿Ð=‚MÚ­âúdMúïãbZfv[„u&YI¨¶² ¢Pao>™§1óÙ4d˜<’rA²–ÇA¿‘kf÷n¡ShÕ[Ì«ð^¯F§ÉàͰ^F\Wçá‰.…ñpÔ²[IÁ*¡3k‚¾¥(êÆ¹V?ÆE¸YÁ…Žf=;’Á^ßU瘶‡ìâH6^+p¡UÉB¡ŽæAœ>¯žœývM®æŠ ŧT,“cÖBÉ!ƒ•Ÿ©+ô’!q8ЊÚÚ"NR/H©Â›,—TžÝAm‰–`ìÒcÔÁ1k^À?53&Љ#¼'Š®­TÓL±+· F2«,”ç¸Ñ›Á0#p”œÜËwAÜÊíÉ·W†ˆ?VS+%Á·CÇèTpÄQh–Gö™aav‡†³½ úžèqB䨡¦û½±zäMc;a^z­ÕXí¶†Ü ¹n…:Ðþ?Æ%(©ÕÊØ ˆ»Ú$O õ£$8 ³©1äã~Œ÷ø‹y-l&¡Oš»3ñ!j”«0">„»é›m#¯bÕâ(ðr£c“¯‹ÃËda~Éb¤@‰¡ÖýÉЩ:ÖZu6Ž3k›>ä^²¬‹†Jí­Û8|kKŸ9B õAë•3ˆaƒÔIº(W@ÃN<Ö‰ á&Gîèöëâf:3D£¸¥‘ÆJäÙ†ÌàŠ*l°ãH Yó_}ˆ`'Їr¡eRèÎÅÆ•ÕU°Ù©°qn‚1ÙnJ} 7laÔ¶5®õô±^#è}ÀÅh„ž+Ì**ϓƠe£Þ´"ÕYÈø«Ã´=ìjª€c».â’äø~§<,h’E°ý#ÀÊ?^! endstream endobj 32 0 obj 18883 endobj 33 0 obj << /Filter [ /FlateDecode ] /Length 34 0 R >> stream H‰lWI²d7Ü;Âwøp…@hímߢï'"‘ÊïúgSùcb«ÿ¸úøÌmúó÷Ÿüµ\çLJßøûçWá£wI\´ŸÍç1ž»ìKf‚ë‹wâö9ýÑ6“xë}|Yö¢1>Kp­åüÖjó7階Y×QÌããk—mE¢6ùh¸CHw=xîë0ð®ÄW+Ç´ÒÑõ¿ØÔ-ïçb‹ŸÒ¾Œ¶Ó}”¯»|¿6-}íÇ0[eH"—aÑx^†¹-^S ýc2‹Á[1ŒžqìŸ1F>¬#S#±ÙE]‰·¬‘uÏS íãÝ… ŽdmˆÊã2èt£kMÓ߆Ç/>BZ‚“ùB©M¹ | ñ>6ó+.7Ú{7y¸_ûã(¥±¢†Ë ¨jVeV Ø‹ Ïîø%Ï·±a„dobkOlÏaEìŸÝ‡UõYñ¾•2ǘ?e+´m{8A÷JÇéÍK¬V%è¶q³ÅDm¸y8ÖÇÆ}:Š`­æv¯Þ>ú$nmƒ˜;K°ub¨}ÖpÙ_’!îÑŽõ±eÌ~c ‹ÁÃåUÂÛAë~ãð’¡ŸÝ|ÕÜØú…o×j»¬nŸfc'‰œ2&ƒÙÆ}³!,Î^Ý2òúq¾ÆÂPêǬñq{K/àåòÜ­¾ÖÐ œ&2FxÄVý&˜ÆJ[ŒOá&-Aá¤DxLå14Û^/Îé%‚ˆ”c«‹¬çÎô}3'—aF;ÇtŽö棰­,¨6Ö|sLwi·Üá…v–ûm“dêb¡u¶€|¼Õ&Räê#œ• É\àÌVN*Áþ1» _ 1çÜÛ›XQS_û5b‡Ö¸ŒÙ Ÿ’w¬}Ÿ :#¯¹*/#÷&l·;ÁÉFF.ûKfçl#o²êc}×&q6\眖ËW cHm-<‡o›˜Swx)š ŒÊ}•:ÀÑʵpáï"˜Êg,‘NÓ[èãvˆ=qËaú]Ç ð»¦aË6„À˜ÿO’OkÍhyVß{òììMkÙo3fû\Åðho‘Èœöd\YP“½§¸Ù®Äï•ÿ­ú2?š±tN¶Èë7À—Í” ÀV”ÃuKspV³a#æ˜~|q×|†=õNLõ)/À=ÇY;ÿ`x²µiÜf†aÝÙaHpTå ¹³ °ÌQQ@­?ÞšF¬å9_z–±>½Àm_Äì+Ô·dÆ·£1 “Ò"ÜE(Æ÷ÞõÁdŒ¯-DdŒ|…Ý*CN=•ÀR-k— À±µK§±Î,€ÃŠÊŽ~u¿q*øN9„k˳«äkWÜðbJ6alL®&˜3°¶M U›ÆLÊÊæ"fŒ#^Q\ ^õ´v&28ÝOÙÀ«³—\î¬\ üñóû:PÁµÐÆ»DCÌ]VS%«É=`,}%ÜÑsÇoáŒg¼ŽSð…Mà/¼lçeñ/K"°Ìc¼+’KΨç¦Äœ1¡…Îr„W!¯OŸ¿RŒÛÆ(Rþ^æ©Äu†Æ 8µY-ˆ{‚„ñŒA“r`­)…å?àYªø”¸|½€1\è…\íñªÔ^°]¹¬­çŠŠè?°EgÑÛ.½v-ìÇ>«#BÃ…=v%ò¬¿}*|8cc °¶É4t4òµeP/¬¾4!=¥WÌ»žëo¬š¢ñ´–À#xFÿý9ŽQâ õYØô¡!¼¤ÐªÚ–kÐkqÈ”R7[÷z×,¦ŠÖÐòUò(ITÇïb¨+7æíJìJ¸ nÍF팫3cÖjEæÞ5Àyе»ñ±£‰ÙO9RÂ]©¤:ã½mì%Uæ9šƒ5çuägír‚†É™qB]EÚY»&õ9=;5jÚ*ëÒNð©!W`EÚ´ê\G/uüy1ZÕ4 mqbT¾Fém蛦GMÁ‹ÝWÕó cÈ ó#ƒÖY`_­9Q¼Ñ(9¨6âi#’FœS¡Í+°0qmx÷ä¿ }÷¾_¬`/e;ChîóAŒÍWK—q !ïƒjg>ò` p7>ºÝ ŸWàŠ«­í¯AÇ ¡pý©µSÙĪ3öYž‡á_ ½/>Ý$õ5§­óȉ'HÍ×ó÷÷¯J3„Õ‰kƒUZ‡@ÈÆÀŸvDñmžsP¤0Õ¦%h!Ñ NÓªÇRGðZb :|_ñ›ê7r Ìã´]\ó"£ØmoÍñ%ðÖª48½#6_&»ˆ%h ®HÝ».VÕþìížΤ×|Æ}f¹ïï5/º(áÕ”syÄDÁ®¼øž4o*äÁcò!ÛZÍ-‰»ö(à5éqR™WäÏÏþ:ç—̲<Ì¿ïÉÙnJÍë°£Ü 7¢¬‚Ë«ß'J,™±›Ž±"wO½rHPˆFZöy»åàtAúµ•žZ)•¬õ0R•òJMb|7¾ødéWá5d‚dߣ3ö‹UÉïl.‰µgtyîœ÷ÃsWØæû"†ðª—ì`3ÚÊò"ÑÊvÄ#Ø”/á‚¥1¨¶&AO¦Ø>¢Åzï'=ڀĪf´-µe9´ÿ .qá5®¯ÑiüBs¾q†T‹/}o14U­z¶øàL­¡¸Dv•Ïñ'Áåe©"×µ¯6ô¥>Rˆjʰg ‚ÈCÜ‹üý¼kÚ®Tƒ·ŠØ†x$C‰Kµö(;õw«dz´AÉ"SpÝ¥¥èË ¬Y¬¿ ¯+v¯}á©ðN>SÆäô“¼=ÎßÈIIÞü–†d¤¸œÆ˜ t cËE”ÞŽ+`€›h°šìÃå(ÀZ¬ŸÔØü}L•eÄË}‹“!1R!¦âÎ/»oGzH@I°ûsa—W=;GÏrÌ£á"Ü-w@‰iy@—d5uuï—ÑÔ^Æ6o%=lŸ°íö´Fµ×$œ16˜Y±m÷Ü¡ z¯™ÕCI¹B©„ìô«è#W|œP%빜ø¶j(Œ›]Å¥ò~΋a´Ýjj(ÍÜNâ­–̽ #|jûšŸo3@)G:¥ Äµ{ªÄp´Å@a2½zø«ÓŽˆÉ`k¤qKñ ¢¾†qkàµ4Ôf…ØBÜW(@ÌqæÙsOÛÌJ<†ë'°UÖ/>8R®p’µD*\Йõ'1Ûçÿ1dlð±ÁfÁN–ò†^`Eá÷v¥ð3 ²·[ÊC0œÛ”Ý’ËõX6fþkbìÁÚ™wß»ÖÚõ¡æntñ] †°5àCjd`½Wc…šà[–K캀H"^­Õp3»…-©åˆ¯HBí ¯–äF–v‚¹ƒOð"ÿŸµg©[¼ˆÙéþÛ“K%Ù݇Êb’L›רÖÅÓv¦À -‡Á-T|È ïÊZݪá áÖ+/„„“bÂñEƒY\~¸°;fK‚j!¢â:ÔT˲ۣ• m*£Þ¦¦¶…à&xÚ{òÍ,ÿï?lÓ2X›ÏòõŒîgèHvî/}ªòÂySë¤R&ÀÁ¹akÐb¼J€ß-7#;'Ó²d$èŠã÷ÃáJþú¯ xcGíx}`=µZÔK¦[«Ñ±Ö¹–fáz"¡„iq{„iÑBYÁ/À‘[®XGVÓÁº¼ûv\OtÝ(°œGZ¨ˆ§.ü€ÏB¼Ÿ}ª8ž­õ¿Øyð±A#{MþR­ÝŸb¸ë†³Ë<s9ŽúÎ@ìfÓý~·7ñI†c:êY Ÿ=Ô²)C$Ž1…U®Yʼ؃­8yµßŽà݃`4´Ç•Äæì¤¹â ›¯Ú‡ v‚Ë@ö$Ùá/oÛmiØ”øÍïÂýK¸^|Ƭ ] ì8üÚ*Œ¬> Ž”²¸±†¤Üÿ̱¥‹ €¥(€\¤U[®D†é™Ý ÙncÈvXH¤AÓì>/C©œˆ¿ õ{"9V…¡¡Mú<%ØÇVë¦Éÿ^WVKÏkEø°£ê´½†ãÙ0¿»ô‰iMT-LÙ'!®q‘Û1k–oƒß²ó&iƒ‡!p†ñ•  6…yӨؘ*SÝf¸ˆD›îgJ ºd*Þ`¹§ÔÃJ>8Í K¿ ¼\Áo'jK¤³Ö‹‚©s+A#ÍiÄJ_ÞT«‡Ûa¯óËí£ zZ¼”ég—ÔÑG( ²ÎÞ)Y3áìu…—i®Òšq¹ü^»u£Ð Щ^ÀðæO€Õ\5+reDÛ^ãêIp­ËÙð1ea­MòýÅk|)1¥gÕe|3ô4R·ËIi<3ÖÁZ|ðâeÊ;pÜt»sx3ÛÑ]X½äNpµÆÜï+pÈE¦b•QxÚsé2¶Î‡[‘Ÿ·Ø¯3Ýl-•ûÉT„jáDÎŬ&st­è¾ |fÓ-[¯{ÑDItºcá¼ð73·WFÒ$‘§.1¬”(êÎ#d—t ØêÌyªM”ø(NnÎ<[Rcî>¿~ºÿ–ƒÙÀCïoKœ»7QƒìÞ±•àsÉk.’Úa$÷Í:_Ň)À–Õ¦gÅùÖ]×-¼òÇñÓ­SÛöV:ãäÿ­ïßìÞ“=QY,€i“æ)¼o]Ѐ¥úçá†ã§¿ØQ`f)M2j®i_7Ôzæ;ðR}F,&rN«®fά 1${­ôgá‡÷-Z›Çµ»·oÖŠQA³†˜9<Ã~(«èìuP!HcÐÕÖ÷õý^,·–\F˜Í¦¡’s•WМ u†²ÃãLd#SN §©"0ËPfÚ{¾rP†GVÁA>Ò ¬›V«uâŸr¨É˜M +Ú–zÔîÜ_?¾¢†ô¡Ä ¸Æº…(l‹£ž’Îß’„™j¼1$_b¿e ÔÔÕ¤^Q4Ìæ5OÊ¢‘+4zûúɳ0ܰñl“gàvÖ 8$êál³'¾W£œÆr`f>С&†àËõž-+—mÄ …·}+LƒMpÁÍÚDº|Xƒ]­mänfWSfƬô:ÿ2p–MòŠÚÛD`íjãÔ”‡½5ÚâOÍèsê–öLþìé“ðD­6÷ËÛôô^€‹,­åu×mme0½:;Ûmr¯±ú¤˜ÛÇ–ÓJ/:ÚRaÕ‰²?®—lÛÙÂÚ`^Þ÷‰[ÁG§T.y’²3ƒa&P´úø–NLÛo›¾×t…+É%ÚQ{C5Pëº œåÇãfìµLÞλf6ë¥ší«— é,[mãîƒù[{ùKxÝ¡ìP]#5&’lEQ¼åñV£iêÙÏ×¾OÎ6¼zv·Òx¼Ô¥µèÓŒdÈ0Æ:Ž"CmH…ì»ä4¥SŸ *å¢öp«I8ôü%Š3S‹ °òyF]΢gXQã¦|äÆVAyÀ» ´ø¾[ⳎsÛÆÇõ}š´Û8Ï ì#ܪë/œÕÊ“Y|˜xb&c•þ{ùP™œìÆk\y@­®².üþ!‚; òÐúÐt±_îàô1KlU‚…;+>K½ÐAðW̕Ά+­A“´2èœHxd ¯¤Iâ’%ˆô•€œ¼v8öž)ß…º[ÆPÂ>÷ËÜx§0:»Žpž¥ @L–]Á8*ì‘ÅIü€¤ëÌ‚{4 í¤f™àBíÊuÀA¬‚§Î hÔl(jÆ0}ŠZ«ÎâAk½ ñŠ.†íª×Äã ·3r¹TQJ Ì6#7²Šm ©D™)XczÔ;,nQ,à2Ø$JÐÙ=jèN|ÐÐEOÄ(Bfk‘G/]DwÄÇâõ@jÄ×ÅZ×PÚž;·ÑÂñÜDŠÌ£r”¤é$'ƒX• "Ì{5˜¹wì]ÕGT~R¿ ¤r Ì‘¥ÅG„A7èÚ(¦K3Öo×f@óEd-†S5 ´½÷àzúV}Ž3ãÇHLÑe4Êg‡0Eîr kÎ èk­^ˆ³Í¹VT+É 2Auyd•vè,:S†ÂéMw^¡/‡·Ðû%§2”)K;PrVÀ;g2À“ðÓh? :%©ù¥ ¿Tä÷¾QÄÐd„i1R|U7dšØûf^Ð Y‡«©×ˆTlšŒy´Rض±0)ñ5“o„û$ÌCÓ!v 2kòàb'z¤aUWP$^$MïÙ NMñƃ!uG±á† ‡(R²§¯¾?Ð\‰«>6èN\¡&¡m¥ö¤úŒÖ …Eî Vé›ÊJ{Ëör®Z++ÊÝ º%4É HUêXŸrÐ~˜ë„OÌØ¥ •—ˆŽª%(ÔDŠš 9Û$%‡æ¡X+¾³c._Šü²–ÚòU)ЋúÄÞ섳c Ј1+ðBç7M<' :®ø«uW–C®çœ2D=ÿA3ç”Ñ¥8gxiÔ@µËëE×eÔ­;sÅí-3_^öåÉÓåÕß./6¿zþ§öúwo_Üúß¿ÿúæááÝýÝåÅ@_¼ûñýÝòòîîÍÇwo—èž’Ö|~yñé’þ¹Å/nü{õ ýð->ýØÏKZþ²üãŸny‹5¯¾g9¾,lMå–øÛÍüVнhŒ¸9ÙsçÝw—_½þúùýÃ7ïoÞÿt÷æþ—å÷¸Ïë'•ÀÞÂÓåëîßßý¸]~G+ÿ@èpÖ‘Ho ‰ Ô#]ïÏ—¨Sš^~–w$NÇÓ€Ø×ãæ€!ÕÑ/ÚþÿዹŒÄƒ^¡ƒÄo9 +·òµ†bPj-Úlý#ãàNpTC'mËx%>lé¼FPêèÃIÎá+;_,4_8ýÓ:û?+÷I@¸Aˆ#« ö‰[PcîÇî¾9cõ±R¯&Ÿ{ü²¥0} ÄÉY{7|î.Ä~s‚«ÏÎÜå±DðŽºp®ù·^F(²ŒY±RßlCúŸ=á³£uT…aùöòÜɼ€è=ÚÏ.çðŽ.ò ¯±®ì?»Ï½Ù—¨œ<+‡ë&üƺI«vQzºr©¯«eA˜çu#9ý®âÙ'$°ƒ3÷øù†\øŽ>AÒ³áïO,ׄ#Ÿõ‘ÇHuÊ"¼¯Š7¼àÐ ™¤a"½Pc‡öH# >5Ó”PI¢ÒÈ0`H!ß V2Œ!72‰ ;Ä''éš ãÉYVD¿ƒÄ‘™cn)êÌ„Ìo’Fg¡Xxìb¼ãLVç%]%Ò§¸ñ—Ï@›Ý-& A™+YNaèÁ `FÍÕ³ UÊÕ1°Þ6F¬€c̓!ÚÚ hÞNÌ·+puß‚®ªÊÏž”´×`!Oâ¨Ü¹xñ V ë Ì8?ûíY554ð$$© yD‡0Ï“#°6.Áé…\ŒyÌ„×ZÉaálÆ JÇ`rh­—e“â[A{D›øô‰ª‰qDR«÷Á›Ù#åTmÑýÇ(2+ì-£R㧤2á]*i8" ¾ $8¡Â¼Ã ±ÂQ–¿ŽŠÄ²D s"ƒ‰‡€ÈöÖõ2n>8‹BPd-‚ì#Ç…¾ƒ*+Œï§%žô‚%ˆ¹††¾ ˜Æ®‘Jd/0ŽŽeÔ§J—Gíàÿî\R‡ÁµÜ˜ð U±lÃyI·ïbvK¡}öòòbÇËFÉJÈÙ^%® Ùà¦wAFç³\Xr7BÎFÈH}!dÈS#äh„ì7„\Œ“2n§„\äõ”‹¾V1BVªùiî<„jž„Üœ3JkJx3Ž*@ÛÝ8C(.oYaº¾q¯WB>í(š)õ6ÎÿS`ÕÔÁ3JÈ+м˜ïFÈtÍÙm¹!Ç«ƒˆ¯@ ë D)!O4 „…³r2BFÈuEÈÈE!d¤ªr3B“-ʼnMV„løô‰ªF ùL³„`f@”ÓäÍj„|ˆ"³ÂÞÂ1*5n޹Sø€ãŠxׄ<ñ6 9!—IÈÙ9o¹(!§IÈÍyð²Âø~Zâ€NK<Ïö…§„ýœâÏy@,qþðê‹6†ÞH[tpIu|Ø ÄHLÛ2 ž¥c©„2éWfÅáVˆ·j„6Cñ¬ÃFvÏ” ÍÖ^£ß°3¤uÝöãpN"txX ÂðÒÂ3°_†A§½2œÿëÓh†7{Vǘ¬³~RÔïøCW¬ÑHŠë.ýË{ïUX‘ˆUÙÐ]ˆt–sa6iªV—[Å€®¾Åö{Dµ¯úaîfªrÀ.Ú.¥J—¶ä´Ã}:6{ÿaø‹¤Ç¡>œ…“¶rÜÎÊU\5ëÏ?Î>úd®R›×ùQ£HÒ]^Æ«í Ÿ–cx«ú’}ÃV¥‡7(Ç´*à^lLߥöå¼B5— zö„¢xÛâUqæŠÕÝnïw=ürûŒFT®LžUÅÓ"¥jo °6:ç²’Å+¾_™xIÆÁ{vZ½A_,ôîdynÚÊø6>Cˆà u9‹ÐÊ9{Ço¦€§5v[(˜S¹XGv† ðpÙ% 4“çü°P‹µ¦ú¤]à¯[躧=÷”îë¾FqÅWvÁBƒ©4Šè²q¨âFï]B^¡H ’PnZÑtíÆk5î‚Õdó`+Ósf:ɱ<«ã RXœÜ(ÖG?${Y•ß_âŽà‘€+15;%÷hC=¤ÜK˜%ØssÇlˆ(&­¿ÆŠïK¡ZžM<ä1àA«%¿í[š`UÚAëô–æ$¬8±šä6Ú¯}€u-o¢6‹;'&ÃÞ[^LñYwÇ®žWÝFi!erãáAoWÉîÀ#„àO”n¢Ê[’ŒkŘc)´ªÂÕµê*ráïVbÕ_T”©z z^\T[\€£/jÃý@Îê¡ïék-£–©Fp¢™`wxˆ±×>Ž…Þº\øã缬喷¾7°¹áC®mVೇ±ªèDªZÖÈàjùNÏëÓµ-œª®'øHp”-RŒÌ‘0ki^¶H×p±å%ƒ³ÉÉ5¨yŸê½U |9¶fC°Ë%oPòm!è.õF×¶h'Xœ¶‹·õGWx%¶¬­[#¼<„]é[‡†¢ÿÃÝËVÇwpÍ~â;–»°5»¾#uŸU)“–Ë@“õqYíûÂÞZ¾Æð{¢Kb×A1·W]Ÿ*®ú‘`7‰>—ÛN¹s³–'> ášÜ¹ÜmÈ5öJ$¬jãô0mp¡Ï¸mu÷wõüçkñxðx¦¾¨ÌŽðæjä©]ÍÊòU+OÛq4á«¶+u¯°ë#Í'i0%F'8¸úñwö-ò ,C"ëï1§tXή™P‚$½~s3‹¥ Љåä§|-îâ\ÖªíL4Ë”a2T‡²O¡~V\à¥Ëó{l)1¿Ã*X ~Îg+^‹ëÉžÝ@ˆÔÚ¨«±nÎäܘbä?³¹‚ÆXJ}?j&9(©®ƒ“G‹hûžBh‹ŠËõû2€¥:öåFAdí ì¼å¡6°˜MÆ•0Wï>Fs0ÌgļDÐem3]¹3J';iCº¤âÖk¶¼c,ëly÷™`\9L©a õ'²ÁÀEg€[άIŒ2ÊÑO×^Ÿ «~)ÖVïþ£ð„pFAŸÛ+'åÓ«s\ËåçÖ¿l­Mg™š(«ê’¦©L°»&DŠK—&ºí–X1—μ7Ó¾l{SPµh4<¡ lšçËcW*SŽáµx,¸Ý=] t»¿N58/w€Q Eü1[+‘¶û|Ëò ª9»Ë˜LþÒ×ð…Fñdc·#&1Æ\¦í \( ª½(ftštè¦ùýJüëŽõØñ` r0…Ⴢ+aK1½ }L‚}xo@wÕcaðaã>ÏpÝ㛩^YÛÁœë38õ‚³yP9L«yÖ÷ä(8*›q(ñ #ñp—éÁ•8¼™ëë}k:|‰G¾œW¬"„•ì#Ü~4¹ø;ÄÙ±üîÖâmõûó4¹¹ÝÙ‡Îþ¸#sŠ|8öúìW”…¤Á—.!ãÖµ³ŽBÃRœÌešLAÏ@ós]†X‚ÚŒs£ÿõdQ ý!wšñ_SލcÖ]ÈÀÅQ½*€'£ °¹´ÇuwŽÅëj€#«XfŽŽ•8Çõ›ÕÆñóLâ—*Qz“Ï,—Ò®$ý|ý Ê7âÕGY[tŒfõ7ðý¥Â•O ¬ï&Tpò)J¢ý¾/7PÏF4ÓÄv†¡«æ£z—-Èõ²^„‡m¢ª61°åçÞïY*¿A3Q9 ¥¸Á~¦à÷(^Ùí!χí)o+ûà;•å0zW3Çåf^ë:‚µ¶Õ ßo ØV¨×é$3\t~H„'è°N<׿“ç;ôÏ+ÿQ_¯Ý’0#‹;ü\è|<œ­[Ì1j½ÇظÎ/Iñl&ö–í/·Êž®Ê$KsÏB9h.(I9ß‹ÜðOÀæƒÂ^VÙK ™M±¸?ÏÃ:ú6Kè×\óî…±¡¿Ýn…½²ó-cß:ÕÙæúLk³g2Ì{«k¹ÎÿüÃΗ®–‰¤fj«B»L†)WÃSŒWÅ—?Bâ²¥FÚôçZ62\ÙÁÙ˜Âcx{e¯Ð'é²>0PzaÏ|åUS oJê.J°ŠÇP뤢SœD‚'_Ýo«½²6j±ç:wí˜óñA6G+ŒþðjY´:Â…©cVñ÷Àĵb~ü9löºÇNÙ_©h‚ëÊ×}}Ï«YÅ+S ˆÓèV(I<_%}ÿ¬V~ŽýÖwˆ˜D ûuîP¯Ëû S Üêà\´0Û§ëlû¬˜&WÓÙº ÇU¨þpäÇEÂ(ËC[Sô)NŦЂáõÞ¹Žåp0ÛÖ뎓®fÊ—{4»‹Ù8>œÃÏ jµ|€Ç‡Üò×(4=¼nf¾ÞVbLØîV?xÞ©Íü‘†ÝMRz+˜¶îõÜ„…ÆF×âIÏ…jøçQô#j1¹$@•îU/ Ü(øþï'ð÷ó³}?÷å² R³˜`C¹ÄÎJê¾övD£ÒðôTføë­ÞÄè ¶é ]-‡{5Q¸ Ç”­Žþ:·tiPðêNDv› ®3¡5Ò…ýº®êÏ™é@³m&Kuª9lO_nà™? ž©×½q vc°hiÄû0qûò³eŠcF±(Íû¯OYuò(U»‚}6‚-mÊØUé¿Ü€hÓ®šœÞ¶D³=u·@ñæw…ÈE÷Á*B1“ßêî*ÅÁ9oð  UáÐ<ÞM3Oð‘Ũ)Œ¥jò#HÒæ¾½éhš>¯ŠØÌÕ7½&Šm*º–kh“\€ËLqÍhàN&Ǩ±½‚Ò뙹bÁqVpám½OŸÃÓøB¯jõ˜¶Ú½9ë…žLk}ÍÁëTŸÑ‚¾ãT÷NÅKñ$GI¡K†c…y_íÿ„WI¶$7¼JŸÀO#HëÚÖ-þÒîûo "@Ê¡í×›êø$b&èGõEMÍbR1ìæl„ X¥<”fð‘œJp=0¿¡ØáìM/W&n  iW5…v '?¾¿E樨B6éŠO2$¢¢rîŽgOýrJ°*¿š=G2 +Àµv`Éd]LGðÒZvá¼FÀV£¢’Ñ@—]QÙ¸¸à•¦—Äâcû¹W'Â=±¢Ú|§5‡qybËV`ÜK {àX¬QAiËýPœJoZØ ÜS€FF]mh¨ë€U¸/@Êb#¦LÎÐZso;ùÄ®¡Qdš­é$Ow2ª`,cý¬ 0 j98ª<3]:sÙ0•unȯž;y|°èE[/ùV(^Þ“¶•ãTÙ50\S ì’¶#Ÿ T$qíH¨¾÷#ß®¬¦æš ­¢R°óaÚgnÛi´ãáý‚»–†E¥íÖ²ëøòÞÈã°#±Á‹ä&— œn3Z)Ù©ûP°#t˜ª*`.Ã;w» ìã(‹u÷îyŽ"$Ùw%U‚µ2ˆúQ™ÆJÕ†š|82®XñÂO@©Ì¼è“ûfÍ.ìçùÁ)`O<^t]›áE¶«Çq€Rè[õ8ØIæZ·‡—eßg¥-Ë69JäÏY‹ŸaXUî•:ËÑ‹mž¡ µ 4ŠgrŸjW‚ðÚÑ42>ÇZú¬2ò!š¦:A¼eÔ•ÏBb¬Ug¬ ñ"Ye=¯vfqñý-¥S´I!U>4|\Ã|xˆÖ\¡Õ™ìÃå[úeÿþŽ„…ÿ÷<åVæî=©m}55?¡wêàûþÞ?{HɲõnSÞ´-I^’yFÍ^Ðm¥‡œÅºíR$zã5·ú:g·Ä„°Õv«È ¨¿vσ½ÝÇÜvå´.”¬Z}uúóþKa#‰§Og°*£ØŸŠ=÷¹¯÷#K¥ìsP`Ô¢&ïá œæÊC޶f‹j˜vÜUågµ«€Í'‘ÅJw½f[Ç*lg]­Â-eJq ‚×ÍJR°A\€ÍÀê„U­Q=¾½µ²—¤àlëCð2É•´R¡D+Ö°ìß½åBo.|¨5 $U)›1ÁSNMýñ¯»¤Ïà‰¡­a1N-/iÐ ó#‚eq¥j'’ ²kèH”RBf¦ì$× wÒ(Â=¯T]³r÷ÛÖM‚Úðˆs!ÚŠÉîÇCñÖA)§*+Gâ¦>NO–É×j¸ô1ÌåÜ¥”8r„ùVîÀÛ (f«“+@âŠ+¥é7×@=ãš x×Ú §“gvϲÃ*ZjôÑü©,'΢->FدIÙ[2EF²3kíÈ3û¶ñ6U0ɵÕ0†¸oæ'8ûx› …%æt³xu–™ï£uîù®.$‚¹3§8¡._R B)c,E\öc ¥¥··Jñ¿ ~³á¢f?»¢ñ‚»ü=—mHš3®cøT¼×X4sER° ò_æá‹Kú8M÷¹0°Ÿ‘úeÇL¾jGqfsæ° ŒŒ×h† SMüL· ­ù(fÕð <ä©Yi²“â<œC_þ\¶fjHD×]uWà‡Ï3º>Ô4–iÝj<ìĈ¸û~T_ª0ÙrlŠ*hï V{{z <¼ö"¼@‡Ä8ÈÚR ŽC‘T.ùèÄófûm(`cî·Œ (“SMH¶ŠG\vGJE¸§{JÅËI};w‹Ú×—DñCEhçP½7³ o’¼NJ–?ÅZöAƒ[©ã&ú‰.*Ãq'ÒÚ¢Ëm}ÍÄì»QfgJ}n Ø‚ç=ׄ’aÐNÝm¨• ¬›ãg9½]åì¯Ñã{nÁ !»¦©,[iª‚‰ëJ¢E V%m3 P9w-F ±ÄÁëçP"ÁÙéÈ-?±ÞÅ趨åË‘›×nXp™ã˜j/é€Á@Ÿ¸ºŠ O?ÔX¨žê×þVñ¼ÃJ.+ùñPÝÌŽÖ–ò/ÆdšQ»ßÞ@yw¦ô[³ÆR¢` JÀ’'„I89Àuõ(ÜZ³÷ãR«;ƒ “Gi ¬±íMe®±yµµ»YÖõ«~F¿×Ôß4ø ³¹ÎÝm@!(ˆ¬Û> ƒñZ­3d{Ÿp¬…8ºõÕþC§¯)Æ^*ÝC¦„*‚>*;>ú¯«¬$h;qËæQ¸g^BQ¸ ΂7ç…ºë «éÚÈëAÛ,GÃS>Dm¶A¯5"ªò#hOíÓuWöJÆ0{<ˆi¤š¥‘Ý:‹¾‚ØÖ“—Ó{LÆs¸UÕ®Äè=_[ Žr`O—K¥ƒÛì.[§Âv¹L¨Îú#Æ©6Õ·,EŸêȲ7õä”Ò@Ÿ Îö¦à¥_m­*Èæ ‚Fì=ºáij.(:˜âå„“9Ó”«’ëëpݯ&‡3Íg”œOzKÀ=G:î¯T¬4Äe˜,HŠÔŽÃ0é®ùøç²Ýü ­1=U~ Ç…â@‰œ€¸àRîäàŠËV`¢C±î§»]®@÷J Ó.Ž…ÇB³‹j]—åH_=»ç‚¯º ¼ˬüÊÓº^~R›PR¼½xØ^¢ºm•Üûê) °öyX÷ ØS‚s/ÛêUö[ÉÆæ¹áÿ+ž®xG&EXæÌvÉ)˜'¼¯mÓìê´‡ôRp`±*ËÅA»úܲø^:¼¾å ç êúáF$n‡ l ŠË_ƒ:ŠJoÁ?Á^kÙ¦y¿î‹ô’SÊØÌ§W ·\ÿó¼/‘¥”iWÏÎÙ5÷‹Å½TòMÏËÁW‡1ÃÕO+‚¿—ùŠÐRZ¥*`ÉãcY]’t&BóhÀmWW¥ôsb±>mÔ+Vƒ¤^àÔØEã}’\¤Y¤1Ü0Xwˆ{|è:3a 3Uw*cp½hà"k×ç¦L>¦7Û¶ðrš§m ðNååEŸ?êxs°LOÆ-?>“’tEYÕ@2£÷JHb˜mjÒÀ˜V’ƒ‹Wýv½Ž­¶[‚EÖ­×t’üÏjøªz(°óIA’v*ÝÀ.bkV)ŽïnZו¸”&ô(kÛ°U—Âr}:.ÛߪF WS_äŽ7Ûª Ç´¨>c÷yi[ñnLxQ²Äg¸Œy|l [']Ÿax•å0ÚÑáÒ`f–¨þú¬/Éi¹5ô’]3—é Y‹qzºP¹íï÷c+­”•¤Ê‚^2Ùò᚟²o‘¾ñóœYW3‹x±#;4Öj—¢¸êêgÀj}Ô Ù(ü3|©B¿0oðÎâµo¾|Ѱ2 p’rµøüöÁ¶p« -&ÏX1q/U ûÇ5H’ Üäœ0¸¤‚=:V*îÀ"PÉè׳åA[¤1\«ñä« áåD„#u»SëÙ“¹:XK<—9ÆBLo¶yY©![;ñ5¾?;ò„ÅÙ×ñ—$5ƒK¦±‡6"xÍé_ÂË%g²†Â[é´À< ãžÖ.zýûŸæ·ª¢(J”þšò5Æã«™kJÊó³O~µSŽîõÛ{ÃÏòýìƒ-÷‹{y˜ŽE¥ù’HhÏ~<>‰1‘çM_~qd}ñÜœ*lé*‚X¾üáäÚ+Þ¤¨ÇË„â–â—Ãcv_SýÍÀ—¿‹§º^L×u–µ€.¢ì Ià?aàŽÍľ¦«!>-ÖÉm!c–úâvYmXˆ\Ivñyî÷ï{Õyðk;Æß—¬˜úAHµÀ-¨¨­cuúpF+UzЦ¿Ããd«ûZPÙi±x¥BqÕˆÂ{Þ± ‰vERŒkàÆjÇ÷F…« Î&%Kså‚›¹³â²³þž½x¼3Úc•§Íìºòäï3úz‹ïgV€­4¹>æ"ݬ "F)Þ_B&¯[ÕÛöªî)6\ã%KÙg­«>ò(í¦mÚbï:ð ŸàÐìÛ¼Û«iŒ`“gé𠻨¥½ÀØYv]§³ó0 š¬1ÈÖHËY…Ã{ÝoQk&DÕï˜×ÁÚÕš.ÚPú Öù 5ªop>a©× »& ~¾z·¦¿×ÒèÁLrå~JîNª[ËQÆQ}¸1™ý²zkfà {Î3zñ•ûµÐ„-±«š ‘@^ý™i†64Ëk°Å»aéUƒ5eõxVq™qíê½´|Ýy[¸£¼oçüàжn4»¼Å]§¤öåÓºðÎ¹Ž·…ôI®†­Å6ÉŸ¹†Ö©ñ~‹ŸÞ)Z.þn¤ö+[# 8—©Û®u |õŒ‡Ö~À¥j?àÉ ³ÜÆ›b-j-ª^2Ñá¥\'iA/e½,¿‚ÏœäòùÃ2ó!•Ø$Î.b‡Kì(8iAµÕë°Ãî©üa%IyL½»c>œ=ýj½“¡Œ½’“HJžß¢+®É€+C€Ÿ·|ïM_8´FAûM…Ó­òéÑÂk\Ïý°A‡§¸TäHï(Ùm߸Ç9åγ(‚LXÌ-NŽÒÖ<ºè7™GK_c¨4F#htþ¾Õ>Ïï§/#xÓ1Ü€í|ñû©,ÖWëkñk„#+æÖ¢MÙéF§Òóà&‘yk;”pu鯷Ȳ/båõãoÞZºù+x]pò2DãH¹é)ÈÂ7()d¼qx.áf°¦€ü´Ã1p"¿ ¼;Lá&mÃëcÛ3µ\þâYŸåºqrÙ`ç)F ºþ¬ÝRÆ´ÃfR¤-ˆÀQ?´ Þ†Á¤kµ†(u · ¤ÁdéÅË;§ÝvunÈš‡¯fŸ÷^b†³vòÞäÍ‹¡åâ 0wlGÝÛYö¹á£Â¿6Ä·šÿ+BMn`&âÿ†kÑç&z‘<‘Œ…õò ‹dÙÔBéi®BsÅ-×Q‡u(ßÓÉ(±^€s»‡Á”EŸN2;ÎïKfâλØÃ2¬ô¸gNZßÒîÜ j‚ýT;[x©—e™‘¦ø÷z³RÂøZ=߬®ôÖ![ÊŸmk¸v:mkך-*/iïÜRàð<'ô”ÝÑrâaiºÛç³±ïñ›~¯Y­MÐj9{lôé8ã‹1cÒï,ÜñRñ˜ÊDëY¦úpj!ì‰Lmyóò–é‚ÄyæIé­;¶Ê8ŒÅªà¡Ï"†g¯®Üá®'¯™j•2—øZl‹`T·¾ŠU¢……Xg«o¼VZЪùX˜³ºwÁù{ÌA×®a¡¬a¼Aø.ªáv÷9`‡Se€Knõ×ç ­‡K¿üŸBgÄë¢ÁY½ý|ámŒ‰˜)ý¸Ùyý‡ý×q"‡%Ö@¤˜Zùþ|á¶™öÉRü'à(LgÕ£ã²Æa.“ky§¿5€ú8øÂ«¾{>f{šõ®[ìB±ª3ºŒn m”…¶ÕŠðµùÖLÊâ,oÁ¸ª~9÷' œfUóô5-°6öå4R&\þ?œv¾~ç.OŸÝ€T÷—[y¯VM¨¡¿a Õ:còzÁ—#VlµBX«FŠØ¸-„ z¦Töë;f:àì3æi¸6J|íZFË=c®eÔΫÇâràGbo—ÑÜå¾Û{¶Épø~OÉ•†Ñ’r>1+~=3ÑìgÙ:íüt}ãEøÐ³P¤‹‡Åaêáò[FvJ‰.l7”½E uÏ!.’÷»S%8kæõdœ~‡Ò™åÂ4ÇE#‹ÆRHõú½-oÔ—o)ÞÕÄ$YëAjBäp ý¢í^ÂsÈïšpùàL{¼g:2:/.]ߊ6²ª°bDö~‰±¦çj°<2)q8ÖÖé©O¿vš¬´ýûvMž);8KK¹e[wJ^ ‹Ã2{<[É+ŒaaG§Êrö ƒ³ós(ˆ€\3 žöc¡2Ûã®Ï}ÀzeN¯íºó#ì(…ÓÉGƒéÎ< …>êydêê ‡§ÄgZºüêh_`=£XR|q š×æZch;Y{ð<’õ­ ¿Œk Lç“Yºþ“AX"gßJ{ÖsúõÕÆ—œ‡o8ÓÜëŸO^18BMŽ»vÞö8‡kãZ°ô!„â%ePv¯_©æ¼&—žŠf‘xXæ ¨mébóažµ‡ÅÕRÃsÕ½}) Ûp‘J/’·YÀÑ{¸FÙ¸’æ¸fsÍ-°xì^ÀO çr«öþîðÔý9ëz;lèTår™B·í.`Ÿt¡·TkQªÍE (è\ÿ>ÞóKnÙïJv¥ðÏ'ï3ÕëÑS„à¿øU Ÿö¿ežúR3ÚáOðb:ÜaÖÕFñ©è©RJî!HÌ‚+Tð" 6>·$Æ“õƒó`‚Ç8x¦(ü Môy‰˜µ¹†šPñòzິ¸PܬcÆ:Xjqxõ\ðäßOÓuj.¡€ ²ûRW™…Ž{ð~Å'”Néà ‹ŽùaaÉû?aaôÆÃ“ãáC‹GB³ÓÚ¯“ç\²`Ùu+Õ“1õÁj0•|rx ð+B_"ƒ:¯ë=8ýƒ.,5b´ÔÞâÚèËt$Ƭ¾0â¬5$‡«ÎÖ¹anùra[xsm;ÝQÂë/ÕIÃ厩á= àã¬B:’¥Ô –YÂ\öC祖ìþ-,ža ­–”w1o(àêŠÖ\` ¬Öj#lÃGáv¡Ã#r[bñôaŒüaa9v,ܱy}iið¨o{ #;€Uʸ®õÚ×jçkøÔ|Á«ÖYßá2¼}j%n•{XcêÍè›c¿ôB45]k BQj? +nÄ ^¼‚gFÜE©™ð- LšxCRö:fˆªpþÁkoŸ‡MYÒ¬Mù“Î|YÈ~Õë°õÀƳ&Y©ú›žÕÌÎúB«ØRÆÜwC—H~~ØëM$‡šÔÜ!— »±‰^Z÷m\¥n˨¸äI …>÷feÆÿe»ÚÑ4‰QØUöóù…mâMûïýÓ•À®ªÎfÔü*lƒfô€ïÏX9e«ˆŸ¥”Ý#n·å~Îrð’ÏIêÜ÷9—»zðÖmf€eÚF°À"\Í‚®»ØÏ¿°6¯×ã•:A¹Kuáez ŒÚ<8ñHzevˆi#qèÎ1µ‚{ŽZ±çÿ0DèL«^*3¦B.r=EÈc/øÕÊc)|Ïwklð0ø_±¹N&ÐeºBïåÏÀšô\ø*ìè¹ h¸ôrá{ãÝxóB¹›qÿÕäaJhQ{xp”U7ŸÛ0|gýÏlÃAWù£ÙÃÈÜÌum;§sÉÄ«úCÛ“`ຽ‰ÂvÞxæÜlöÏÕß9ëÞu¢Ð<³]ÍF›$Ÿ&UúÙfbÆàUKLX_¸¬Dï5aíS¼lÍj´•ÞèÂÚÑr= ¾Ô.›ã¢RÛ̯Cd´Ùàï—ÆïsOåˆUË‹ÄÂYxöíTýp",…´–4sVâ{ìiݽssÉ£?“›AHª²h&n÷:qv\‹é!ÀYtbÆ¿îL̓ÎÊ`¥Ë[ Ð„îñ—ßú¶C‹W˹ßÁ?ñš¹øöXcÿX8XÍ»’$œûõÅÒܹ—Ô®:©sŽ 7°õ9¯ôž•¦·ïxâËXäQË9Þ§îÙñ¬):£kûÐ:fÞC0¼`«<÷3)j\œüyÏZyÍIY.}­J¯Ûð]p"õ2t§:7ó1t,F2 Yý‹u½ÁÏ—§h×+ž…EõGüî–ï#¼m±/¯µU£îšQ¸Z/9:]ÔJîyD÷®o…/xÖlÅLÓý9u+]ü¹9A3k⬟B,´ãj Zò•rà~%RónÇ5¶“ˆâý¹«~=‚Ó`1à}†O“Pœm}C3—ÿÞýl•ã>¦Zßn°K¿¶R¼3Ï‹7Ïñ uÊ4„ ÿ|ÇBp~^ Y[öûMtdWýá÷ÑÖÒ~?Û›’67 ‚å¬V“®ÊÛ³ßò}lqœ %"4}Ü^œ6Ç€ÝÛÄÂü c{sðxRmõ:ƒmkÇ8,¬q^ÅÁˆm¯<›ð\VɈîï´Á˜+Û…ê‡ùâ™=‡"úÍ!ç\¯“ýÁÀWÛÁÃK¡•a—;q¹“§kœb¢®š\9ü8>zwl,·ËÉÀ^> stream H‰¼WÛŽUÇ}éüÃy±RrÜÕUÝ]<ÉC,G 'DQd| Æ[ü}V]zïsf˜;–…3‹ÞÕuYUµúê·Ciœ5>jëãÔ¨ŽããÃÕ·‡øâ>â¸J=¾9\γöÀ…Ô>¸ óйãÒæGNo(7ê;|ãÎÍ›~:(þ§ÔÁË›~R’–8>H¬öšµ¾À¶Î•z|´}^ŠÜOsÈ::ÚüXËH¹ŸYÐ2×Þë ç¥÷ÄwØ'K€C„X[`ÇØ ÷Fi¸S‘ݰÈLG¤âD€D¬7À×d£o.7„RkàM[žm›cª&Ȝ痶_{»Z;‰RbÄË(·™áêD™^lXùF‚RMNÔ” 1ñQ6Ò3iðf`ÌEåÉ7BÑû< uQD¹Ï9X¹®¸¦$¯ç(c·Ðt¤»Ú™Wy\"Éó… °WõÃz*½É[Ó©ïœDÙ¨­ÃµÉnY§Jžu+|Në¢Yí4ÔÞvJ •ŒzÎ’Di 2òwIv=±œsru!×¾:£>÷÷’陞ÝBZ®së-^¥ŸÂËÂÞñžÈÍÂM øu9Ü4oë:Û-M -2eÊYí·ÆšuUn"{0ÇÛGGÑ£}dêù?U÷‘¹ÏàÔϦàóÛ¸;çJ¹Y®LgøãÛx+SÏðK;~ׇy¼wÿøìo‡«‹?yð'ýê×_?|ûþ¿ÿþËówï¾y{}¸rôá7ß½¼¾Äï}y}ýüÍ7_ÇýÃU9>8\½?”#‹ÿyöÁÀÏðÓ€ýx”ãçÇü³¿Æ™gOÜ;•à‹6íø©KFYÁ£éÓláoàqñ\kc·s~fç÷×N“x :¥Ú?s MʉPžã+óü‰ýeèøçÃ!B$åT¶ØV¤†æªA¤¬÷[2?ð©Ur6v>Iñ±­ Ö¡B?øa|:™ªûèçs4Îõu„búª§.%Ε˜gúôˆÃ =Þ¼ÇG <<ëfxZe?|+‚ׇ«ðá-‹µàŒnû­X¦^Ňƒ_}*"D%²ÐâClbTû¾‹ÿfãáÕ*!Ñ4¢¶Š&“¹—¼Ws¤qÌ(ÃæZ¡M¶ÀñÀt"±R¸®‘×l‹ŠÏ6â¦9Íg1ÛĹ?±¯iY€g[«€5>^ü˜žúnǸTY«-¥° Œ™7Ì |æîЬÌ—¡ÆRß>ÅRl xÀmÕ¦(¾oµÍØT­`À´£«ã{¤´OŸ`À‘{Oò4$¶=VVŽç¶i õb1·•ÎQÖa¥¼¨õpbpÒOûÊïuW™†îš# r¡Á–rÈi¶¾&, ltd4wTǦH ÓtçRCV ›F%v±'WZÐY¼÷š…ÇHhé( 2izÍæÕ˜oÁø„³ß w´%`±©«W´R‘Øò“,ˆ¥OÊ0úíÖ‹¹LïÑ,š0Q,X„ï«Òo--AO5@ ’-|Ô¶x¤ ªË+ºÖt«>ÿ›ÍÜ’ «º<°e+ý³0lž8ëѕӈh]þpýIÀÙ^Ý3këd!®`÷€'>òô»ÐóŠÑ¸¯€q)‘Ñì˜^”#¼TŠï{§@í©>5Ø*=é¬f8ž¶ ×üv`–sbmú8b˜*ºZ8d¼y€‰Wqe¶b!oÅ:¢ÏdÒµý6•Ù>ÕeYµ®n3A«Â…>J€–ì9D‘qd ›ž.~Zéâ%wNyo`â*†²ƒ´T,ð®ó[nK·Pã2±idqÍdÑÕ³‚É9ÀòˆÀÅÛ#³I¼J@ h¥¸lkR6]gŸµÖ6Ësu‰=õòðŒWŠ7ÄÌ…ƒNÃsÞL`»æá²f0>k¶1P8;"§5е@¢&“Ø*›>íl©Í¹½ ÿšÛÍnkÃÖ–¨@!Q@©ñúÄnmíO t,—3˜3*ûÜ啸amï9]s€#e¼.Â+ŠÛá§æ ƒÅ”® ¤iâòÌDK9 µÒD&ñR -ǹõšI./²÷š_p”͆Z9Í cñà™Ñ®à£ã»‹pj¤”q+èŸV|ý"Ç„ü¤uø‹£(NÜÈ%4¬¾‡à—8Lç9å©Ïœ¼£lêIi+6hoÛÐ@6!U#–|{zøÙÒZwiýÅ5ò4û™Ø¡n»½l3±óþ.\—¤¾°šjÚ”2݉>qű£ ŽkåÛW¿YW”ᤸuuâcD3¿¾qÿþôðÉWŸ>xûî/_¼{ùýõó·Ž¿Cn¿ºgG°jêýã§Oß½}yýÝñÞÇ^¼xÿæÉ÷ïžÛÙûÇߨÉßÛ_qfIÊ¥ðÍQkƒÁ`0¯ëñ³Ã]Ÿ\àPh½Ã8ˆïgÇKå3û¯ƒSÿÿËmþlzÙSd7 (fƌ鉡N¼ÃoÀÐt+ófå.|7sí.~±?Ë^…i[æ¡°!Ÿíôfá¹; ÇóǺ³ €±¾’Ý ˆæIø°6h1ñßòpmÛ÷=n¾í"èÐüÜç£å€ëuÇóIb`Ÿ5A‰ø‘`áÛ»Hm‚Üê?Ô[U5ý&.‹¡ÀY(»‰BîÎ â„ÎTñÚ{´>wá¸Äh-t åì7Pã€1w¡ž.ϲÆëh˜@_.܈à—N‘½¤]x¬‘ xwÜ—T€L3ÝÆC¬%XzÉd°iåGËÂîyíÒó0–F] -³—.üò,€òZ„$(ÿ#äºÅh(Á¶¢¡½´ÙÅÖR©m.ÑPy^ï!·±r`­>m5ꜫóf¨ç;l‡ËjÊYûr?Ÿ‘#^MÀ¯—á”>À‡¬s_4×ú”š›÷Ž\ÙXïQqQ<¾~Qìe›Ëx¸–ºw u¦€]„'XV¦#dEÊ Md!½ÕUpÀ‘"†H¯yY>@Š@åQ[`—eorÆ©Š’!@Ÿ·ÈïÕð`v]Kje®R™2‡Ô+­…ƒ·ŽºN0œF=˜“ÆÀI’`­®Û-1öŠØ,ìPÙöÞiNTlº¶m,ÎŒiß7fؼH]²bH¬ÊÊÁ%‘~Y¢šàб†‚Ò® ð~Å8ΣÈ'c ²G£öÚÑãßã¬à­Û×ì—ÙÀ@ûeß᥈Å/ÙwЛ›#,{Iÿú·Úª’épx]uº,„lLð’M(=À‡RŒÕ ýÑ[¯Æ2¯è •NRæ¶[hÄM‚õŠûª!¸¨aqó˜•p!Uå†}eÀ}‹æ«¶Þ¥e/_»Ç'ôJ#´æ MžÊ5IŠ®¶‰j ÷Z©ÜzžumäsyÆ -°IpLÛ\'9'SÒš !NxÐa™g:°ÚØÌsÐbšØ /Úxí°ÀEÛ–ç†.±”£Øšl½€5µ¤F&Т-j̽  V¦GÈ ‹^ãrZ(ŒÇŽ—ÚsÑmX{[rEÆ p襨œ;Ág'û:bȽ‚©¬{ 6Eñȳ¤–Ô8³#$ª’jÀø ÷ÐöWñ™«¶,o_ ˜¨íÎM!Æ$`Ì®h-Ö2Ô¢0 ùÒâxn>Ê÷‘Ï•¢í¢‘l–ä­ò5n}ˆ vºÉYÍ«æb|¤Dv£–jÑÓDIÍÕ¦r6ÁY«Frí›[,`lÂ]éöQÍxŒ‰ã‚A:Tr-‰ÚÑ4ÚNÕA5V³²(¸l0 ÅW“<LÌìU,ÏICÈ)&1Æ»Tã«€µê2’à xvnò,`TåŸéÆt5Ozx1ñÂ,‚b§g¥‹:íÚ^!ŸSU+»ÙaÐK΋lH±(Øä›(óÔ=@?uÊ5ZGzY'nóÅ`ÈÚjmê1OU—†š¤!0×~.kùY«·:¶åã Ùém‘÷ €Þ×pÿ8Ë&c~±Ûҳ츘-p횆pWMd‘ˆË ÂÏXâdákœéé í´s¶k»×é#ì wob³ ü¢×x¶Å|[™26Qª½öãÖp¼>¥ÒB··\ó"Øsi{¯÷^-<^8;Uö75¾_’{‹÷¡J'ÏÐSŒGå [¬­*±£Df±ôˆQîÝᲠϸ„ÞÀëœG¶IÀ’xnÜe,¢ÔCP»FpȵÆp@B†;yD«ç>A{àÔ"wdö‹.3™¶ßRNø5s{@ ö|EfxJB¢Ô{ÈÐ …µ¦ã( ¤q„Àh Ö¥ÄóÁq3‘%ðéÎòýª%Ý„W`cbÄÔWL¸¤%i8™Ïn/}ŽãûÂ[#<•ªßãBšfáµÍ²\ˮϒÊm–8Á3lU³˜“O™4ýÄ)&Ч•UÁb–J+«EÍ—@7£²#Ëümèº':-îzFty<†ÚPôÕÈß ¨Ð¨ ­·û¬!B€ ?ƒ z£¸µ]þ9¤ß%ó½™FšøÞ¹ÄÍÄc9ž3ÍÁþì½m]ªÐ´yÖ½p‚¾¢ÊûD}×^˜«¼~î“ùÂ%·^N•O[[}d?&ªRBªH`&¹îl†PxQˆKÑ;¤x—ä*=.zÞe. Òãk ±&Ȧ±]–õ•°PZ3¢p8ÝI|BfNÚ%è÷MªýJh-@ÈÈ$ 5Z­µ2 §˜ÉFEVñVÒ5¾+¯”½ž%ËÖ3^4²,Ú$Õ& õР›Œ 52G=|ÆÚx)Ü{BÊÊaflX2숭œz}¶QnNtŠA×*bìTÑ“dú ®·$qÐÖ4¥Å6f¸@J‹E°µvù<¡ÁKr¢~ȃenMßòL½Cà¡JçAù¨ë„1¸°z^ ¤Asªßß·Ýïó¡ó÷»7­ýàåT'Çé}&ÁC{{­!rK1‘Cl`›â¡o-¼ðËi+ûÚ)=‰@^Å$~õbѶ$„*Œ½oÕh†â¡¡ªî¹tal’xȪû+\±‚Ñ÷Kfq4N¡†t‰W§Ül]¶Kºä‡ƒuK¨aÉ![«ƒ-y/ ±VŽ2ôÐ;©êÄ+z•´ý%I8{û³{£*GEZmmç1Ê©±Å · ƒí±–K,Ëlržtõùg%5g®”´û@{ýóàé»Ç·wß^œÞ]\o7·Ÿ—ß=þ®¼ûýöìäöÓǯ6wwç·[|AèÉùû‹í?üi»Ý\Ÿ- ^?:xb–ãƒ'ŸÌbÓþ½ýLàŸðÛ¯Àþ³„åûåïÿ0ËlÞ¾‚]/+ÑðòŒüe¤Ds­ Ü>ÛñwÛ»ßÐÙ/ñã9Gô¯µKèd_S¼w6=ëDèIû)*E½ãÿ"yÑQ+Ï*¶aí‚­œt:‰\̠ʳq¸ÐŒVG)(*³‡4”†×{i>VI'S ½ù°¹9?¹<ßžáj?|÷­ÔÐ៴ùñóÍùºÒLã}d9¾¥+ ×„að8¦‹ ­ãd©‚zÇÜÁ{ª²r¸ÄjÌ£$ÕÀä 8.E¤ü0†¨„8,k·ÔäŽN„eÐp›2ÿyƒ‚Cx2žRnïóЮj°ÒX˜ý}Ô¥Œìv–°«] <ñ*‰ã0 Eƒfš¿b„LHç.ò~9Y6•܇‚øœ@ @¸¸åÁ°r‹øL2q @  ‡:YNI Ÿ÷Ø%Ž–Ú4×ÄAú6 kü«ý˜ij¶þ% uÕó<»ñ Lôy;s¡:·6nJñk·(!tæ ™•þp‹|)ŒU J =àÉxd6¼Þ#a‡:§ê0©gêà Z.UŒP4š«]8cl±ÐË^éKÖM;AzOà Î™º6n]ÔÛµ× ä„¹cG31.+¯‰t+þ‚‚‚†;ÛŽ¼&¯»ì0‡åƹ€*˜™ó]zèæØ©x‚ºÈN{J*…3/•õe¦‘u¤€»¶€®Œ©¹UMn'Pbèä)nYJ®Ü‚£]Ç  ÄОGj“Û{<0};ÃA׃Dôî‰eû¸m$W»x”;¶¡­zøÍe«üá·2?'OaÓˆˆ¬®wÿ/' u·PÛ¬â&4irÝ9^@9~Ä:„&·÷²l¤ÿŸGºª*Ìví«±w/ÉþqÕqµxcŽ %Ð1q­Œûâ œÓÀ‰o”³([ÚSÐý©ú˜MoL™ÀÎrñ»Ù»aHN@[ôžPŌ᯺ÕÀA.NlsrYæW²“øÛ£›^K¹›ì•™{¤Ú ¦Húç0(ÂæÛ²—øo¨0ö‘Ðw?\o_áòïpÿÏž Þÿü—ƒ'?ÜÌËÀ«ËOøùò—_ÏOï° Ÿ]ÿr.«À÷›íæýùíòòöìüöèK\ø¯ßl.//Þßnn>\œŠé××—/–´ÜÜ-¸ÜÜ-/1=ZùaûÀúâå¿7—}À¦NMgçìkÿîwî"LÙ×òúúÓöìÑÚ'Ñh²júæ´]W³b_jû«×«¶y]l÷Y«Ýo7?.'—›³ÿ²_mÍi#Yø=Uùýˆ«Æ¢»uOž‚íìf3;vÙIíÖL̓@P,K”$ìµýžÓ- 6¶8Ø}9}¾sýZT–)YµÅÿô"ŠO9äwáý«”¬†µÄI6!W™—¬“x5zY|Œr{]xIŒBQª¥í<Š´°M?…‰$¾[½jÑ^'/Ås¿­–øy67Su…’UY$° ¬—v5Jâ0$"ª®S²ê«±Øëò,]¥aˆ‡r’Õ¼úÎǺþïöQÙJœŠYrì‹ã0HûGDËÓJÅbÒwP@ê±%boø‹‘þ÷(òn þmHh=ÀElISå7è:°‹¾ìL8`b—‚“?SV+˜C‰|ã–õ Ÿ ÈÁE¹þÜ4\T˜¿.ÔƒRßÀ[jϤöÐor×S í8d»Ýç%aÉø Õƒßík¨7ZÛÊ?ò×±oÆ©Ѷvóò’k÷‡¸+œ0&í+_ý¹ ¹ †Båc9R Ã+7lƬíU «xpLê:¹Ö’ZQ®â¢xÀPwI³j,[Ì0%ÝeÔb9|qƽm,eÍžWë¥Qësp šaSˆrŒcÿ$otá&¡ÜãPP×xÞ˜JO•¢œð &¦ôLmW§†¾-Q—¼@Ù^.;þëT¾9yaH­;~NdÔùP lw@CÅ—gó%èð[ýã%Á ÄQ ¼(ù×4+'X¹íå±x:¾»†?çlêt8ÚR§Bá6Œ"^;9{Î󳉃èáß•ÿOÂÝv–¬¢B¨^AÖò"AÊ>Bû¤x™ªKÀ|©¾M‹œ¾›4*(á²Fú\!Õá¤V¬KU >¹¬ŠµUf%K)Õp·¯Æœ;ÊT;%·«AS´xÖuÐ K_6¹ Œ]Œ3ÓÆNÌt›#!²ðI¯ÇuÉ5¶›£Wô…þ×rÕ?sVy¦•g½òÌ•E\]µ¹) dŠâh&Êr•]h[®[‹N^Ÿ–qq§’ýU,¼ÆüÑÉy;³-…Ë@g›¶eضi9–^€j%KÖAªÞñj3+`*˜5ϲàn ësÒUsXWÙ=°Å÷ïú_£ø.’¿ÈÄ: ü`t¤”$¿Á‚O£,¸åŠþI|3ÅVÿ9‘‘~PU<ˆˆZ¢†T9È×ü¶zÜF×lxi0ZØ“Ä×bý&.„çI¾åœ#޼ä^‚P39¨ÜâØªÿ{ÿþ%ÿ‚§Ÿ0víüß䯿)ñßÃÜ%ÎÁ·òÄò‘¼GzQGxÔG"#a²¼|%Ž“8ògAÖaqó3M¾|&å‘-KfÂs#ã¹!„ ù”¡ëÔöê-‡’¿X>Ÿ“)Zìé¶e˶-Ï—–Up¤÷=g·":÷ý ,>ðÓàË-~f–@CRA0Ѭê¾:{s× †˜}½¢ÄeöeÄ9–ã¸.rrK3 Ý‚+%¥ŽA*ñBc5ìm ðí„À^ûÒ¾4 ݦ»ša.ò ¼Û¥3»õ,íг°çìb4ÃÃÕ¤Qo¾ƒàáÁKâýé¾-Õ"E .ãÙxw ÅvæË{ù„æS€®ˆL‹Â½rgÿ[…«ºIú—ƒHJƒå F‹!?ƒû¥*Â-½É&TŽ8æšæÊäÑ-L'Í5¹üÅ™E¾6å,_“ì™´¤“γ o뿨³õΜý"BÚEƒÒ¨Î l-Ì•æa:ÜèÈõîä!4œ{À%´÷S/ˆt:Ï6Ó’2æ`ÄYÔ™^cJZ…‹'-då6‘æì¬ôÌöÊÍ~U˜§—Ú·²¶„$Aš…÷ûS9Ze1ão\'10NþôÆÍ$&_°†Ä°‚²$¨m$Ò´à-jئq8ËD9Srïvd‹c‰?͇­r8ðÇ"}Õ§;b»W•Hr'OÞ½¥7þ¿DI>ñÒŒ\Mÿ Y¬%®eØ•û¤ÍMyÉ„ÁV—¶ÚpÊÏ.­±º¼~N„ §ÀŸâ$«Ùêls¥]”Ñ\nán“Å4щ*ŸÜ¨Þª ìÐÊ [µ’å+drµ’›¼:¸J¦¾j¥®Vº\3mVÊõÓ,×•ë®Æ Wgrá®QÏXe†5î©«ƒuÕq°¦: ÖUÇÁÛ-vˆÍì¬ÇÔÕå,'ÞmÉEèeâàzeIÊ©Æë´œSXƒSžKËw€ÌhFÖæ…cȬfdúëFæ4#3^32ÖŒËì×Î9êÆ´k0DK÷¾GTdŸ@öe„pºFm¦ƒˆc›k†m1çyKQŸƒ1  ÚbpO¡s§I<-ï]Ël®2ÙLæ$4r9»à“8y*—#·Y ÒÒÿöê ÃH¡2‹%Ãp–¨‘9±ñ’keÍ.×ÅSoTˆRvšzÚ¹ÊÃã²ët&…[¤æ# …[äU{ÁH>{Qæ¥7Áèà¸ÈÓ#g5qŸ.³Ï)¥yc%ƒICY="Çp­ nùe˜7mÂ4ƒÚn§•µýë0•.(¨e[øÍMË!Ç.ÐN—Œ9¯,,º¬ð¯„?‘‚ˆîŽ+ýúËH‹8{kÓomº»Š|v#/ôÉÙ½¥˜sfâíGw¡"3ÝÐ\ׅ߆n¯«Ûo ú¥áÑ`¹²1ë–å.„ƒ©ó·pxe™èRêZ(‹qW3mH5y·¾<€V}áeIgÁˆ\Ãauг—íöɇ‚\¢$r'‘HÒ#iŠÊ¦Þ´æSPì"œƒ‰BÅÞ’”þ· Wµjh ýKáß1¤féšüm‰b(”'^ÆÓ XxÌÒ ùáWÇÛ°°y}Cþ3È ¦¡FñâB5×¢ò‹é6Ì|mJeª]ëáʧ7ýœ^ÂôÒ3)™… = Œ™-·lè8È…-R•ƒè‚hLz§A: ½{õsƒªý*Ý——“5þ2ÞüµGþ*óL~­÷œý«zn£;LÛ,å7¶7^±–WÌ’)<^Ì|E¶N*ZêÒy¾®Ýôìä6-¼q¸Ü5Ö'÷*×½–×U¥<Îî0Tgé¶ §º+ ŒÁL{ÌVo/ŽÄ®QC—B£h”Ú†%Z‚¦€y“tq‘él^ÿšÑ£Û¤­BM¥Y0"òøkÔÄqáDk…[‹`Õ(ÎgYDeÔ;EåŽÛÜ'–…46ŠM4ƒæ3ž`<­h^8±¶m©zèEÃJƒe3£ñ3/,ê~ÞÔ0ˆ"‘ª¾ÆŠao˜Æá,åL)à<¼Jºú‚ Ùå\W¯FI0†÷Çí'YKFWeŠ€ô&›l\•r{ âï¿Ý ﺎ¤¾¦Ô*yã›Ä‰ÊãräV$YQ;J[‚ƒ",_(õãÞ¬Ÿ³&¿=XÆÅûn9¾Œæ‹¸-Ç•‡Ë¿ôsÓ€w—‹ˆ:G¨,EO±½ã3ÿê4™g…987$M¤«Wi2ÊÀ%ׇ‡}â¹qXa©Íh\@ûï.°ŸY@xOŽù3§ë®G“ÞÍöÿ=‹Š°K†<ˆñŠôЖg6<¾Ç6l:fÓÙ¼i›M{ó¦4›ru³,´E#Ïù3ê6ÞÒwÃm¹ºú20Wï± Ò[|µ@]~ Ló¦I îÈ“ºú*5jäI’'ky°ot{™…aÂNžy}å`¾ª[ uxW;؆¯hWíž~–d|U½)yGAQ‰ã•—!d½óŽ0c:å¶8Ұ‚zþL¹V£bc–VÇ ª¹1O£"!E*[©’¤ iõÜR›ñu$×a퓞“Õº—4)¹âj¹êël¼Øu·X÷w&E{N'¨ßÜë_QŠ4¬ à7f-•uVìÚ ¾çÏœŽmv߸ ÞØ ›5¸ÒxÅÀ Ü(‹¶F6±Zc¿¢5±Ú‹ÒŽ¢5Âá½èì¨V#ì~Xv´©²µtãæ·aÓdÒ¤߯ëÛ]G®ïö\×ݦ—¯«)mOë²RW·ÍÏç ¸–²ò^›Ý§Ì`ÙÞì Þ)x#OGËË" c62vv¶SXÜ‘rçeL÷ß! Ám¹áé<Ì‚xÊNo²zØî–I»ïRÁˆÓù7Á8'qZÌîÔ¯ñAߨJ÷ðF@Àxyó»Iè14—Á-»_¤Æ'å„E¹»Dô9J!Á<]~ˆƒë;jÑÅß‹)Gƒ¶£iú–¶•é69O~yµ¨:"³W÷DC´.½ž*úú5ÈÒƒ:·Ì+ý<ÈgaN´ARù<šÐb´ÌÐ×±Ñr:EÿH„vN‹h‡ÇirÐæÅA45 !ôtz]ʼœd@Ç7æwú¡0Gþ]Ïb| òÌIè(4ß„_ Å” ëýËa1™'A^°ËY0Eby6~©O¢i©÷i‚‘à CJFóA[VÇÒH»{Ç÷®Fñ›/³t¹8K>¤¤Ç4C© ˜1Ó}#®+Z¹d% ¨ÃèSM´‚hq°[$æ„äuRÊΖùŒ½ÁpÒȯÕVs nZòÜå¼élþ-á'A ŸgÁboo¿a¿9h ï]޽œÃl:±¿Õ¶ÎÑž³-Nªä{žN–sL£Ïƒ"ýê¨&ÐhDËÞˆ·wåh­4;:`B†²qdS6Iã4C…@&˜ÙíÐkjiï £µ¬°ZÚÒÛŽ•vB»:ìwt[q@v˜È’|da2¹Á‰Ñ”åÑ×ZgGx¬D.‚ü˜Góel†¸ £8PaP¡^/‹Å… Å%Ì¢¯‰2•§ñ²Ã$té³¥kq›ÍË•ò=¬lüPÚ²}-˜rmKÛLqSEµ@"] cœ€%I¦f¦E%— ´ÒŽÅ•–¬á³]¿•[-nέ÷IÅš¹£/ ã'›ÚZlQ££”Ä ©=(ãz–ÐŽk.©ÏV>© ˜’Êâ¾ë2£¦´•Û¥3¥’Š Íæ÷Pj• û ˇô¥%9]@(Ë•J°˜Àñä rã—,M¤<:ÅåÂQàókƒ) °½Ö`J`ì òDµ"}@p=[v0‘£*ÔŽ¡(\ª¤(®I)CÔÜiø† yÚòlŸhp½çƒ [ûtäšýNv:¡ŽØfÖìó‰{k_“ËóMðuh0›ƒÛH¨Âµ‡ÓmaIIfò`b[Š DÏr}_u`®cIGÊŽ¨–Rhøjš†¥B7’´´´#µÖblôjaµî¨Õ‚ïÃÝ•·áêX‚ÃÜ”aާœ2\‘m.¥‚«,­¹g"TÙPG¹PÖó(оIMnI×.óJx–íøˆÇ†úyس|øTH/ÛC£«ÈÄ=¹)˜Px¤ƒmyˆ–rË÷ey¢o98ÄÄ‹xFzHiß3GsŸ¶8eã›[Hh_Æ3ˆ\ùÕÕÒ÷á]&¨Íñƒ(ž­*ŠöL’M‘Á MH hr³ï¸8J¹P‡R€KËâð®#)ÇW }²Ý[û‡v¶­;5{08žàõ¸H‹n£Q§žàãl¥b“eU¡%Y›»(˜Zp¼"ó’X†ž¢úêPÅ–€_MÙq%JêЉ§L”Ùм*z“6.LT¾KÊ*1Â;žaÔ–,6«7™lˆš—Q¬¥4õ@ÂjR›LŽ£ Û®ïøF]“ÃMwîŒøagÌ5ï é¦÷FÁuø& Ð>Àh×y€A)H2m¸Àu™y‘f!Ëgég¢SÃ`zû«³8Æ\™À]áv„Îd%Á®Ã‚…_ÂI Í1P‰€y·ÁN¨=›ã8 Û‹r»åÜ—çW/3œJ“Á-‚&tÁÛ1µrûAhb^¿xòË|Ùåè endstream endobj 36 0 obj 10885 endobj 38 0 obj /DeviceRGB endobj 39 0 obj << /Filter [ /ASCII85Decode /FlateDecode ] /Length 40 0 R /Height 128 /Width 100 /BitsPerComponent 8 /ColorSpace 38 0 R >> stream 8;Z]_d>Ggq$q/MAs.@Rh"A2ge`3L]68=>C.$;I=KgZ)+&.A[+C)20,hU7oe@kc%Kb ,C5j0VUF,^muq(./kTWSUCW]ddXtP>0mBQNf=+aGYoolGX#aLZ:pX1;\>#Z*ffh.(O1W9>/Bg])1#Fr2m%s @9b`Y>+m"PQ"oF'F[)[=SYfGO'6^V6i0p:b]T/W7n;1ja$PO.UD*eh:%@6R8)E`3# b/._\E-\WeT$%B$>Kq!C]CKu>N)hkCZC9tA&*:hXX*H>-</?k(=l$_Mmo6O&J$H)bPj#6Z TI?pS?3WJJ>a)@:\Q&YV!iu-p;]Lm!0dTo%H*2H]TW;'p.Ih/<=3@i6TG2=p8'0NN +'0th!36W36`:j&L.X1$D5#CZi+lAuK'ug\$GKm_/,49fXPg-ZZ%DFE`DXPcTF -nG'RZ6D;\Oqk;T[+n-o"r2.7HLeZ^O_uJuWC9KdpUj#t9V?>a>+HF&kOMZ;"[a,9mp"^1A#.WVQnW&QEeA;. endstream endobj 40 0 obj 819 endobj 41 0 obj << /Filter [ /ASCII85Decode /FlateDecode ] /Length 42 0 R >> stream 8;V.^9lCt2%/gA$+*;<091u(Z&"r-[8M@\[CsWC""?F!;,b;quMM]fVs*c%I1Ub\: (^>^jUe![5C3B?ZH.hlf_l*M'o)6h&e^aMis(<;mL:t2*af2l+e]4"n5;(k9`<@P0 ;g#Qfhn%"3DYQc aENseSTjc8mW&6smOrqs0"[`.\du$[iW#gf\b5C9FfUQdmN-iL/c2d<&*'m6j+)d? *hJp9FceJ9E4aC(Wc L;dCn\'E!j4!n6nXh5tRXO^,?["YEo]-BL,Jb9)<"Zp2M7qFTKJH3)hGT'&#Nd89o$k5bbE9\Q,XGP' M%G5FLuh$X"A]ou1V^8M@US@3q9/lA-^fBb;aUZs9o/SqK44&o0l5T9;(AghKP?a0 (`6,NjnfR.$anIPZ"#VcApS,9qooJm2_-Ao#)12)q0=dnHH?X.4Is 7%BXjDE8q>3X].7`E64b[c9g!U^<$QdObaaN^]MOQGS\ArSF*QJ)@/4_so,.!B2025+QO\.Co.)c;o[FDW,SiFcfmSF0"%d'$#.SD[^68_##!g1M9 @Z/Ee[fJjl'#LG;lrD4FF^>6S2D(^:E"e+/&?0'Ido!7&nl8:QdAEEW4Xd18X_MR, IC1;<;GX^.^aQm1#agr>[fs$UXe8an4c1:&L6O)BU))<&0rc-+(tu=LeWc1d128PG HDVBMN>Pf->K#D:50[J]kmH9+C_-=1):J^-_;duA2/J_mfHZVsrKmY2D_%=qgQ/JS Aeo(oNjsSm7&[6025:Q!3iWf6+,^5LV8Xl`Cdlg1#+o*>0_LWYPhEL'd26X4E(EP0 _-sLG[S!"h\,TD*[Pdm[_aX=g!;dXQB)~> endstream endobj 42 0 obj 1090 endobj xref 0 43 0000000004 65535 f 0000000016 00000 n 0000000069 00000 n 0000000133 00000 n 0000000006 00001 f 0000000443 00000 n 0000000007 00001 f 0000000008 00001 f 0000000009 00001 f 0000000010 00001 f 0000000011 00001 f 0000000012 00001 f 0000000013 00001 f 0000000014 00001 f 0000000015 00001 f 0000000016 00001 f 0000000017 00001 f 0000000018 00001 f 0000000020 00001 f 0000000620 00001 n 0000000021 00001 f 0000000022 00001 f 0000000023 00001 f 0000000024 00001 f 0000000037 00001 f 0000000691 00000 n 0000000765 00000 n 0000001003 00000 n 0000002582 00000 n 0000007421 00000 n 0000022287 00000 n 0000022310 00000 n 0000041275 00000 n 0000041298 00000 n 0000060964 00000 n 0000060987 00000 n 0000071954 00000 n 0000000000 00001 f 0000071977 00000 n 0000072005 00000 n 0000072984 00000 n 0000073005 00000 n 0000074192 00000 n trailer << /Size 43 /Info 5 0 R /Root 1 0 R >> startxref 74214 %%EOF flamerobin_0.9.3~svn+2220.orig/res/frlogo_right.eps000066400000000000000000012213261177057155300222010ustar00rootroot00000000000000ÅÐÓÆ ÌYìYêÈÿÿ%!PS-Adobe-3.1 EPSF-3.0 %ADO_DSC_Encoding: Windows Roman %%Title: flamerobin1.eps %%Creator: Adobe Illustrator(R) 12 %%AI8_CreatorVersion: 12.0.0 %AI9_PrintingDataBegin %%For: Stefano Pennuto %%CreationDate: 7/6/2006 %%BoundingBox: 0 0 136 177 %%HiResBoundingBox: 0 0 135.5865 176.1739 %%CropBox: 0 0 135.5865 176.1739 %%LanguageLevel: 2 %%DocumentData: Clean7Bit %%Pages: 1 %%DocumentNeededResources: %%DocumentSuppliedResources: procset Adobe_AGM_Image 1.0 0 %%+ procset Adobe_CoolType_Utility_T42 1.0 0 %%+ procset Adobe_CoolType_Utility_MAKEOCF 1.19 0 %%+ procset Adobe_CoolType_Core 2.23 0 %%+ procset Adobe_AGM_Core 2.0 0 %%+ procset Adobe_AGM_Utils 1.0 0 %%DocumentFonts: %%DocumentNeededFonts: %%DocumentNeededFeatures: %%DocumentSuppliedFeatures: %%DocumentProcessColors: Magenta Yellow Black %%DocumentCustomColors: %%CMYKCustomColor: %%RGBCustomColor: %ADO_BuildNumber: Adobe Illustrator(R) 12.0.0 x201 R agm 4.3861 ct 5.530 %ADO_ContainsXMP: MainFirst %AI7_Thumbnail: 100 128 8 %%BeginData: 18511 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FDFCFFFDFCFFFD26FFA8A87D7D527D527D527D7DA8A8FD54FFA852 %2727F827F827F827F827F827F827277D7DFD4CFFCAFD04FFA8F827F821F8 %27F821F827F821F827F821F827F8527DFD47FFC999CFFD04FF5327F827F8 %27F827F827F827F827F827F827F827F827277DA8FD42FFC9BB8CB0CFFD04 %FF52F827F827F827F827F827F827F827F827F827F827F827F82752FD40FF %99B08CB093FD05FF2727F827F827F827F827F827F827F827F827F827F827 %F827F827F87DFD3CFFC98C8D8CB08CBBFD04FFA827F821F827F821F827F8 %21F827F821F827F821F827F821F827F821F828A8FD39FFC28CB08CB08CB0 %99FD05FFF827F827F827F827F827F827F827F827F827F827F827F827F827 %F827F8277DFD36FFCAB58CB08CB08CB08CC2FD04FFA827F827F827F827F8 %27F827F827F827F827F827F827F827F827F827F827F82752FD34FFCAB58C %B08CB08CB08CB0BCFD04FFA8F827F827F827F827F827F827F827F827F827 %F827F827F827F827F827F827F82727FD32FFC98D8CB08C8D8CB08C8D8CC2 %FD04FFA821F827F821F827F821F827F821F827F821F827F821F827F821F8 %27F821F827F82127FD30FFCAB08CB58CB08CB08CB08CB0BCFD04FFA8F827 %F827F827F827F827F827F827F827F827F827F827F827F827F827F827F827 %F82727FD2EFFCAB08CB08CB08CB08CB08CB08CC2FD04FFA827F827F827F8 %27F827F827F827F827F827F827F827F827F827F827F827F827F827F82727 %FD2CFFCFB58CB08CB08CB08CB08CB08CB09AFD04FFA8F827F827F827F827 %F827F827F827F827F827F827F827F827F827F827F827F827F827F82752FD %2BFFBB8C8D8CB08C8D8CB08C8D8CB08CBCFD04FFA827F821F827F821F827 %F821F827F821F827F821F827F821F827F821F827F821F827F821F8277DFD %29FFC28CB08CB08CB08CB08CB08CB08CB099FD05FF2727F827F827F827F8 %27F827F827F827F827F827F827F827F827F827F827F827F827F827F827A8 %FD27FFC98CB08CB08CB08CB08CB08CB08CB08CBBFD04FFA827F827F827F8 %27F827F827F827F827F827F827F827F827F827F827F827F827F827F827F8 %27F827A8FD26FF8DB08CB08CB08CB08CB08CB08CB08CB093FD05FF2727F8 %27F827F827F827F827F827F827F827F827F827F827F87D84A87D27F827F8 %27F827F827F87DFD25FF93B08C8D8CB08C8D8CB08C8D8CB08C8D8CB0CAFD %04FF52F827F821F827F821F827F821F827F821F827F821F827F8A8FD04FF %A827F821F827F821F827F8A8FD04FFA8FD1EFFC3B08CB08CB08CB08CB08C %B08CB08CB08CB08CCAFD04FF7D27F827F827F827F827F827F827F827F827 %F827F827F8A8FD06FFA827F827F827F827002752FD05FF527DA8FD1AFFCA %B58CB08CB08CB08CB08CB08CB08CB08CB08CB0C2FD04FFA8F827F827F827 %F827F827F827F827F827F827F827F827FD08FF2727F827F827F827F827A8 %FD04FF7DF82727A8A8FD17FFC28CB08CB08CB08CB08CB08CB08CB08CB08C %B08CC2FD05FF27F827F827F827F827F827F827F827F827F827F82727FD08 %FF7DF827F827F827F827F87DFD04FFA827F827F82753A8FD14FFCA8CB08C %8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D92FD05FF2721F827F821F827F8 %21F827F821F827F821F827F827A8FD07FF2727F821F827F821F827F8A9FD %04FF5227F821F827F8527DFD12FF99B08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB5CAFD04FF7DF827F827F827F827F827F827F827F827F827F8 %27F8A8FD06FFA827F827F827F827F827F8277DFD04FFA8F827F827F827F8 %27277DA8FD0EFFCAB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %C9FD04FFA827F827F827F827F827F827F827F827F827F827F82721A8FD04 %FFA827F827F827F827F827F827F852FD04FFA827F827F827F827F827F827 %7DFD0DFFC28CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB099FD05 %FF5227F827F827F827F827F827F827F827F827F827F827F87D84A87D27F8 %27F827F827F827F827F827F8AFFD04FF5227F827F827F827F8277DFD0DFF %CA8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8DA8FD04FFA8 %F821F827F821F827F821F827F821F827F821F827F821F827F821F827F821 %F827F821F827F821F8277DFD04FF7DF827F821F827F82152FD0EFFC2B08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CC9FD05FF27F827F8 %27F827F827F827F827F827F827F827F827F827F827F827F827F827F827F8 %27F827F827F852FD04FFA827F827F827F82752FD0EFFCAB58CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB093FD05FF7D27F827F827F827 %F827F827F827F827F827F827F827F827F827F827F827F827F827F827F827 %F82727FD05FFF827F827F82752FD0FFFC98CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB0C9FD05FF2727F827F827F827F827F827F8 %27F827F827F827F827F827F827F827F827F827F827F827F827F827A8FD04 %FF52F827F82727FD10FF93B08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D %8CB08C8D8CB08CBBFD05FFA8F821F827F821F827F821F827F821F827F821 %F827F821F827F821F827F821F827F821F827F821F8A8FD04FF5221F82727 %FD10FFCAB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CCAFD05FF52F827F827F827F827F827F827F827F827F827F827F827F8 %27F827F827F827F827F827F827F8277DFD04FF7DF82727FD11FFC28CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB093FD05FFA8 %27F827F827F827F827F827F827F827F827F827F827F827F827F827F827F8 %27F827F827F827F87DFD04FF7D27F8A8FD11FF93B08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB0C3FD05FFA827F827F827F8 %27F827F827F827F827F827F827F827F827F827F827F827F827F827F827F8 %2752FD04FF7DF8A8FD11FFA8B08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C %8D8CB08C8D8CB08C8D8CB08C8DA8FD05FF7D21F827F821F827F821F827F8 %21F827F821F827F821F827F821F827F821F827F821F827F852FD04FF7D7D %FD12FFC98CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CBCFD06FF7D27F827F827F827F827F827F827F827F827F827F8 %27F827F827F827F827F827F827F82752FD18FF99B08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CC3FD06FF7D27F827 %F827F827F827F827F827F827F827F827F827F827F827F827F827F827F827 %F852FD17FFCFB58CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CCAFD06FF7D27F827F827F827F827F827F827F827 %F827F827F827F827F827F827F827F827F82752FD17FFCA8C8D8CB08C8D8C %B08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CCAFD %06FFA827F821F827F821F827F821F827F821F827F821F827F821F827F821 %F827F821F87DFD17FFC2B08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CCAFD07FF7DF827F827F827F827F8 %27F827F827F827F827F827F827F827F827F827F8277DFD17FFBB8CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CCAFD07FFA82727F827F827F827F827F827F827F827F827F827F827 %F827F827F827F87DFD17FF8CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CC9FD08FF7D52F827F827 %F827F827F827F827F827F827F827F827F827F827F8277DFD16FFC98D8CB0 %8C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D %8CB08C8D8CB08CC2FD09FFA82721F827F821F827F821F827F821F827F821 %F827F821F827F8A8FD16FFC98CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CBCCAFD09FFA87D %2727F827F827F827F827F827F827F827F827F827F828FD17FF9AB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB0A0FD0BFF7D27F827F827F827F827F827F827F827F8 %27F82752FD17FFBC8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB093CAFD0BFFA82727 %F827F827F827F827F827F827F827F8A8FD17FF92B08C8D8CB08C8D8CB08C %8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8C %B08C8D8CB08CBBA1FD0BFF7D27F821F827F821F827F821F827F821A8FD16 %FFCFB58CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB093C9CFFD09FFA97DF8 %270027F827F827F827F82752FD17FFCA8CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB099CAFD09FFA82727F827F827F827F827F87DFD17FFC9 %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CBCC9FD09FF52 %27F827F827F827F827AFFD17FFC38C8D8CB08C8D8CB08C8D8CB08C8D8CB0 %8C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D %8CB08C8D8CB08C8D8CB099CAFD08FF7D27F827F827F82152FD18FFC2B08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CC2CFFD07 %FFA852F827F827F8FD19FFC28CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB5C2FD07FFA852F827F87DFD19FF99B08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB099FD08 %FF53F827A8FD19FFBB8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8C %B08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C %8D8CB08C8D8CB08C8D8CB08CC9FD07FF5252FD1AFF99B08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CC2FD22FF %B58CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CBBCFFD20FF93B08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CBBFD1FFFCABB8C8D8CB08C8D %8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB0 %8C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D %8CB5CAFD1EFF93B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB58CBBFD1EFFBB8CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CBB %FD1DFF93B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CC2FD1CFFB58CB08C8D8CB08C8D8CB08C %8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8C %B08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C %C3FD1BFF93B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CFD1BFFBB8CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB093FD1AFFBBB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0C3FD19FFC28C8D8CB0 %8C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D %8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB0 %8C8D8CB08C8D8CB08CB5CAFD18FFC2B08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CC9 %FD18FFC38CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB092FD18FFC3B08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB0C3FD17FFCA8CB08C8D8CB08C8D8CB08C8D8CB08C8D8C %B08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C %8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08CBBFD %17FFCAB58CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CFD18FF8CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB0A0FD17FFBB8CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CBA9EC6C0C6C0C092B08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CC2FD %17FF998D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB0 %9EFEC6FEC6FEC6FEC6C08CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D %8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB092FD17FFC38CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB58CB0C0FEFEFEC6FEFEFEC6 %FEC0B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB0CAFD16FFC3B08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB0C6FEC6FEC6FEC6FEC6FEC6BA8CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %C9FD17FF8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CBBC6FEFEFEC6FEFEFEC6FEFEC08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0C2FD16FFCFB58C8D8CB0 %8C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08CC6C6FEC6FE %C6FEC6FEC6FEC6C08CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB0 %8C8D8CB08C8D8CB08C8D8CC2FD17FFBCB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB098FEFEFEC6FEFEFEC6FEFEFEC6C68C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B0BCFD17FFC98CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB0C6FEC6FEC6FEC6FEC6FEC6FEC6C68CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CBCFD17FFCAB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CC6C6FEFE %FEC6FEFEFEC6FEFEFEC6C68CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB099FD18FF92B08C8D8CB08C8D8CB08C8D8CB08C %8D8CB08C8D8CB08C8D8CB08C8D8CB09EFEC6FEC6FEC6FEC6FEC6FEC6FEC6 %C08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C %BBFD18FFC28CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CC0C6FEFEFEC6FEFEFEC6FEFEFEC6FEFEBB8CB58CB08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB099FD18FFA1B08CB08CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB098FEC6FEC6FEC6 %FEC6FEC6FEC6FEC6FEC6B08CB08CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB08CB08CBCFD19FF92B08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CC0FEFEC6FEFEFEC6FEFEFEC6FEFEFEC6FEC0B0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0BCFD19FF %BC8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D9E %FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FE928D8CB08C8D8CB08C8D8CB08C %8D8CB08C8D8CB08C8D8CB08C8D8CC2FD19FFC9B08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CFEFEFEC6FEFEFEC6FEFEFEC6FE %FEFEC6FEFEC08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB0C3FD1AFF92B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CBAC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6B58CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CCAFD1AFFC38CB08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0C0FEC6FEFEFEC6FEFEFE %C6FEFEFEC6FEFEFEC6FEC0B08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB5CAFD1AFFCA8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB0 %8C8D8CB08C8D92FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6C68C8D %8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB093FD1CFF99B08CB0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CFEFEFEC6FEFEFEC6FE %FEFEC6FEFEFEC6FEFEFEC6FEFEBB8CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CC3FD1CFFCA8CB08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CC6C6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC0B0 %8CB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0C9FD1DFFBB8CB08C %B08CB08CB08CB08CB08CB08CB08CB08CB08CC0FEFEC6FEFEFEC6FEFEFEC6 %FEFEFEC6FEFEFEC6FEFEFEC6FE8CB08CB08CB08CB08CB08CB08CB08CB08C %B08CB08CB093FD1EFFC38D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C %8DC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6B58C8D8C %B08C8D8CB08C8D8CB08C8D8CB08C8D8CB08CC2FD1FFF99B08CB08CB08CB0 %8CB08CB08CB08CB08CB08CB098FEFEFEC6FEFEFEC6FEFEFEC6FEFEFEC6FE %FEFEC6FEFEFEC6FEBAB08CB08CB08CB08CB08CB08CB08CB08CB08CB08CB0 %CAFD1FFFCA8CB08CB08CB08CB08CB08CB08CB08CB08CB08CC0C6FEC6FEC6 %FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6C08CB08CB08CB08CB08C %B08CB08CB08CB08CB08CB093FD21FFC28CB08CB08CB08CB08CB08CB08CB0 %8CB08CB0C6FEC6FEFEFEC6FEFEFEC6FEFEFEC6FEFEFEC6FEFEFEC6FEFEFE %C0B08CB08CB08CB08CB08CB08CB08CB08CB08CB08CCAFD21FFCA8D8CB08C %8D8CB08C8D8CB08C8D8CB08C8D8CFEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6 %FEC6FEC6FEC6FEC6FEC6C08CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C %BBFD23FFC3B08CB08CB08CB08CB08CB08CB08CB08CBBFEFEC6FEFEFEC6FE %FEFEC6FEFEFEC6FEFEFEC6FEFEFEC6FEFEFEC0B08CB08CB08CB08CB08CB0 %8CB08CB08CB08CB0C9FD24FF93B08CB08CB08CB08CB08CB08CB08CB092FE %C6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6C08CB08CB0 %8CB08CB08CB08CB08CB08CB08CB099FD26FF8CB08CB08CB08CB08CB08CB0 %8CB08CB5C6FEFEFEC6FEFEFEC6FEFEFEC6FEFEFEC6FEFEFEC6FEFEFEC6FE %C0B08CB08CB08CB08CB08CB08CB08CB08CB08CFD27FFC98CB08C8D8CB08C %8D8CB08C8D8CB08CC6C6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6 %FEC6FEC6BA8C8D8CB08C8D8CB08C8D8CB08C8D8CB08CC3FD28FFC38CB08C %B08CB08CB08CB08CB08CB0C0FEFEFEC6FEFEFEC6FEFEFEC6FEFEFEC6FEFE %FEC6FEFEFEC6FE92B08CB08CB08CB08CB08CB08CB08CB58CBCFD2AFFBC8C %B08CB08CB08CB08CB08CB08CC0C6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6 %FEC6FEC6FEC6FE9EB08CB08CB08CB08CB08CB08CB08CB08CB5CFFD2BFFBB %8CB08CB08CB08CB08CB08CB092FEC6FEFEFEC6FEFEFEC6FEFEFEC6FEFEFE %C6FEFEFEC6FEFEBB8CB08CB08CB08CB08CB08CB08CB08CB0CAFD2CFFCAB5 %8C8D8CB08C8D8CB08C8D8CB09EFEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FE %C6FEC6FEC6C68C8D8CB08C8D8CB08C8D8CB08C8D8CB0C9FD2FFFBB8CB08C %B08CB08CB08CB08CB5C6FEFEFEC6FEFEFEC6FEFEFEC6FEFEFEC6FEFEFEC6 %FE92B08CB08CB08CB08CB08CB08CB08CB0C9FD30FFCABB8CB08CB08CB08C %B08CB08CBAC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FEC6FE98B08CB08C %B08CB08CB08CB08CB08CB0C9FD33FFBC8CB08CB08CB08CB08CB08CBAC6FE %FEFEC6FEFEFEC6FEFEFEC6FEFEFEC6FEBAB08CB08CB08CB08CB08CB08CB0 %8CB5CAFD35FFC28CB08C8D8CB08C8D8CB08CBAC6FEC6FEC6FEC6FEC6FEC6 %FEC6FEC6C692B08C8D8CB08C8D8CB08C8D8CB08CBBCAFD37FFCF93B08CB5 %8CB08CB08CB08CB5C0FEC6FEFEFEC6FEFEFEC6FEFEC692B08CB08CB08CB0 %8CB08CB08CB08CC3FD3BFF9AB08CB08CB08CB08CB08CB092C0C6FEC6FEC6 %FEC6C69EBB8CB08CB08CB08CB08CB08CB08CB093CFFD3DFFCABC8CB08CB0 %8CB08CB08CB08CB092BBBABA98BB8CB08CB08CB08CB08CB08CB08CB08CBB %C9FD41FFCA99B08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8CB08C8D8C %B08C8D8CB093C9FD45FFCAC393B08CB08CB08CB08CB08CB08CB08CB08CB0 %8CB08CB08CB08CC2C9FD4AFFC9C393B58CB08CB08CB08CB08CB08CB08CB0 %8CB093C2C3FD51FFCAC3C3BCBC93BB93BB93BCBBC2C2CACAFD5AFFCAFDFC %FFFDC8FFFF %%EndData %%EndComments %%BeginDefaults %%ViewingOrientation: 1 0 0 1 %%EndDefaults %%BeginProlog %%BeginResource: procset Adobe_AGM_Utils 1.0 0 %%Version: 1.0 0 %%Copyright: Copyright (C) 2000-2003 Adobe Systems, Inc. All Rights Reserved. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Utils 70 dict dup begin put /bdf { bind def } bind def /nd{ null def }bdf /xdf { exch def }bdf /ldf { load def }bdf /ddf { put }bdf /xddf { 3 -1 roll put }bdf /xpt { exch put }bdf /ndf { exch dup where{ pop pop pop }{ xdf }ifelse }def /cdndf { exch dup currentdict exch known{ pop pop }{ exch def }ifelse }def /ps_level /languagelevel where{ pop systemdict /languagelevel get exec }{ 1 }ifelse def /level2 ps_level 2 ge def /level3 ps_level 3 ge def /ps_version {version cvr} stopped { -1 }if def /set_gvm { currentglobal exch setglobal }bdf /reset_gvm { setglobal }bdf /makereadonlyarray { /packedarray where{ pop packedarray }{ array astore readonly }ifelse }bdf /map_reserved_ink_name { dup type /stringtype eq{ dup /Red eq{ pop (_Red_) }{ dup /Green eq{ pop (_Green_) }{ dup /Blue eq{ pop (_Blue_) }{ dup () cvn eq{ pop (Process) }if }ifelse }ifelse }ifelse }if }bdf /AGMUTIL_GSTATE 22 dict def /get_gstate { AGMUTIL_GSTATE begin /AGMUTIL_GSTATE_clr_spc currentcolorspace def /AGMUTIL_GSTATE_clr_indx 0 def /AGMUTIL_GSTATE_clr_comps 12 array def mark currentcolor counttomark {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def} repeat pop /AGMUTIL_GSTATE_fnt rootfont def /AGMUTIL_GSTATE_lw currentlinewidth def /AGMUTIL_GSTATE_lc currentlinecap def /AGMUTIL_GSTATE_lj currentlinejoin def /AGMUTIL_GSTATE_ml currentmiterlimit def currentdash /AGMUTIL_GSTATE_do xdf /AGMUTIL_GSTATE_da xdf /AGMUTIL_GSTATE_sa currentstrokeadjust def /AGMUTIL_GSTATE_clr_rnd currentcolorrendering def /AGMUTIL_GSTATE_op currentoverprint def /AGMUTIL_GSTATE_bg currentblackgeneration cvlit def /AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def currentcolortransfer cvlit /AGMUTIL_GSTATE_gy_xfer xdf cvlit /AGMUTIL_GSTATE_b_xfer xdf cvlit /AGMUTIL_GSTATE_g_xfer xdf cvlit /AGMUTIL_GSTATE_r_xfer xdf /AGMUTIL_GSTATE_ht currenthalftone def /AGMUTIL_GSTATE_flt currentflat def end }def /set_gstate { AGMUTIL_GSTATE begin AGMUTIL_GSTATE_clr_spc setcolorspace AGMUTIL_GSTATE_clr_indx {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def} repeat setcolor AGMUTIL_GSTATE_fnt setfont AGMUTIL_GSTATE_lw setlinewidth AGMUTIL_GSTATE_lc setlinecap AGMUTIL_GSTATE_lj setlinejoin AGMUTIL_GSTATE_ml setmiterlimit AGMUTIL_GSTATE_da AGMUTIL_GSTATE_do setdash AGMUTIL_GSTATE_sa setstrokeadjust AGMUTIL_GSTATE_clr_rnd setcolorrendering AGMUTIL_GSTATE_op setoverprint AGMUTIL_GSTATE_bg cvx setblackgeneration AGMUTIL_GSTATE_ucr cvx setundercolorremoval AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer AGMUTIL_GSTATE_ht /HalftoneType get dup 9 eq exch 100 eq or { currenthalftone /HalftoneType get AGMUTIL_GSTATE_ht /HalftoneType get ne { mark AGMUTIL_GSTATE_ht {sethalftone} stopped cleartomark } if }{ AGMUTIL_GSTATE_ht sethalftone } ifelse AGMUTIL_GSTATE_flt setflat end }def /get_gstate_and_matrix { AGMUTIL_GSTATE begin /AGMUTIL_GSTATE_ctm matrix currentmatrix def end get_gstate }def /set_gstate_and_matrix { set_gstate AGMUTIL_GSTATE begin AGMUTIL_GSTATE_ctm setmatrix end }def /AGMUTIL_str256 256 string def /AGMUTIL_src256 256 string def /AGMUTIL_dst64 64 string def /AGMUTIL_srcLen nd /AGMUTIL_ndx nd /thold_halftone { level3 {sethalftone currenthalftone} { dup /HalftoneType get 3 eq { sethalftone currenthalftone } { begin Width Height mul { Thresholds read {pop} if } repeat end currenthalftone } ifelse }ifelse } def /rdcmntline { currentfile AGMUTIL_str256 readline pop (%) anchorsearch {pop} if } bdf /filter_cmyk { dup type /filetype ne{ exch () /SubFileDecode filter } { exch pop } ifelse [ exch { AGMUTIL_src256 readstring pop dup length /AGMUTIL_srcLen exch def /AGMUTIL_ndx 0 def AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{ 1 index exch get AGMUTIL_dst64 AGMUTIL_ndx 3 -1 roll put /AGMUTIL_ndx AGMUTIL_ndx 1 add def }for pop AGMUTIL_dst64 0 AGMUTIL_ndx getinterval } bind /exec cvx ] cvx } bdf /filter_indexed_devn { cvi Names length mul names_index add Lookup exch get } bdf /filter_devn { 4 dict begin /srcStr xdf /dstStr xdf dup type /filetype ne{ 0 () /SubFileDecode filter }if [ exch [ /devicen_colorspace_dict /AGMCORE_gget cvx /begin cvx currentdict /srcStr get /readstring cvx /pop cvx /dup cvx /length cvx 0 /gt cvx [ Adobe_AGM_Utils /AGMUTIL_ndx 0 /ddf cvx names_index Names length currentdict /srcStr get length 1 sub { 1 /index cvx /exch cvx /get cvx currentdict /dstStr get /AGMUTIL_ndx /load cvx 3 -1 /roll cvx /put cvx Adobe_AGM_Utils /AGMUTIL_ndx /AGMUTIL_ndx /load cvx 1 /add cvx /ddf cvx } for currentdict /dstStr get 0 /AGMUTIL_ndx /load cvx /getinterval cvx ] cvx /if cvx /end cvx ] cvx bind /exec cvx ] cvx end } bdf /AGMUTIL_imagefile nd /read_image_file { AGMUTIL_imagefile 0 setfileposition 10 dict begin /imageDict xdf /imbufLen Width BitsPerComponent mul 7 add 8 idiv def /imbufIdx 0 def /origDataSource imageDict /DataSource get def /origMultipleDataSources imageDict /MultipleDataSources get def /origDecode imageDict /Decode get def /dstDataStr imageDict /Width get colorSpaceElemCnt mul string def imageDict /MultipleDataSources known {MultipleDataSources}{false} ifelse { /imbufCnt imageDict /DataSource get length def /imbufs imbufCnt array def 0 1 imbufCnt 1 sub { /imbufIdx xdf imbufs imbufIdx imbufLen string put imageDict /DataSource get imbufIdx [ AGMUTIL_imagefile imbufs imbufIdx get /readstring cvx /pop cvx ] cvx put } for DeviceN_PS2 { imageDict begin /DataSource [ DataSource /devn_sep_datasource cvx ] cvx def /MultipleDataSources false def /Decode [0 1] def end } if }{ /imbuf imbufLen string def Indexed_DeviceN level3 not and DeviceN_NoneName or { /srcDataStrs [ imageDict begin currentdict /MultipleDataSources known {MultipleDataSources {DataSource length}{1}ifelse}{1} ifelse { Width Decode length 2 div mul cvi string } repeat end ] def imageDict begin /DataSource [AGMUTIL_imagefile Decode BitsPerComponent false 1 /filter_indexed_devn load dstDataStr srcDataStrs devn_alt_datasource /exec cvx] cvx def /Decode [0 1] def end }{ imageDict /DataSource [1 string dup 0 AGMUTIL_imagefile Decode length 2 idiv string/readstring cvx /pop cvx names_index /get cvx /put cvx] cvx put imageDict /Decode [0 1] put } ifelse } ifelse imageDict exch load exec imageDict /DataSource origDataSource put imageDict /MultipleDataSources origMultipleDataSources put imageDict /Decode origDecode put end } bdf /write_image_file { begin { (AGMUTIL_imagefile) (w+) file } stopped{ false }{ Adobe_AGM_Utils/AGMUTIL_imagefile xddf 2 dict begin /imbufLen Width BitsPerComponent mul 7 add 8 idiv def MultipleDataSources {DataSource 0 get}{DataSource}ifelse type /filetype eq { /imbuf imbufLen string def }if 1 1 Height MultipleDataSources not{Decode length 2 idiv mul}if{ pop MultipleDataSources { 0 1 DataSource length 1 sub { DataSource type dup /arraytype eq { pop DataSource exch get exec }{ /filetype eq { DataSource exch get imbuf readstring pop }{ DataSource exch get } ifelse } ifelse AGMUTIL_imagefile exch writestring } for }{ DataSource type dup /arraytype eq { pop DataSource exec }{ /filetype eq { DataSource imbuf readstring pop }{ DataSource } ifelse } ifelse AGMUTIL_imagefile exch writestring } ifelse }for end true }ifelse end } bdf /close_image_file { AGMUTIL_imagefile closefile (AGMUTIL_imagefile) deletefile }def statusdict /product known userdict /AGMP_current_show known not and{ /pstr statusdict /product get def pstr (HP LaserJet 2200) eq pstr (HP LaserJet 4000 Series) eq or pstr (HP LaserJet 4050 Series ) eq or pstr (HP LaserJet 8000 Series) eq or pstr (HP LaserJet 8100 Series) eq or pstr (HP LaserJet 8150 Series) eq or pstr (HP LaserJet 5000 Series) eq or pstr (HP LaserJet 5100 Series) eq or pstr (HP Color LaserJet 4500) eq or pstr (HP Color LaserJet 4600) eq or pstr (HP LaserJet 5Si) eq or pstr (HP LaserJet 1200 Series) eq or pstr (HP LaserJet 1300 Series) eq or pstr (HP LaserJet 4100 Series) eq or { userdict /AGMP_current_show /show load put userdict /show { currentcolorspace 0 get /Pattern eq {false charpath f} {AGMP_current_show} ifelse } put }if currentdict /pstr undef } if /consumeimagedata { begin currentdict /MultipleDataSources known not {/MultipleDataSources false def} if MultipleDataSources { DataSource 0 get type dup /filetype eq { 1 dict begin /flushbuffer Width cvi string def 1 1 Height cvi { pop 0 1 DataSource length 1 sub { DataSource exch get flushbuffer readstring pop pop }for }for end }if dup /arraytype eq exch /packedarraytype eq or DataSource 0 get xcheck and { Width Height mul cvi { 0 1 DataSource length 1 sub {dup DataSource exch get exec length exch 0 ne {pop}if}for dup 0 eq {pop exit}if sub dup 0 le {exit}if }loop pop }if } { /DataSource load type dup /filetype eq { 1 dict begin /flushbuffer Width Decode length 2 idiv mul cvi string def 1 1 Height { pop DataSource flushbuffer readstring pop pop} for end }if dup /arraytype eq exch /packedarraytype eq or /DataSource load xcheck and { Height Width BitsPerComponent mul 8 BitsPerComponent sub add 8 idiv Decode length 2 idiv mul mul { DataSource length dup 0 eq {pop exit}if sub dup 0 le {exit}if }loop pop }if }ifelse end }bdf /addprocs { 2{/exec load}repeat 3 1 roll [ 5 1 roll ] bind cvx }def /modify_halftone_xfer { currenthalftone dup length dict copy begin currentdict 2 index known{ 1 index load dup length dict copy begin currentdict/TransferFunction known{ /TransferFunction load }{ currenttransfer }ifelse addprocs /TransferFunction xdf currentdict end def currentdict end sethalftone }{ currentdict/TransferFunction known{ /TransferFunction load }{ currenttransfer }ifelse addprocs /TransferFunction xdf currentdict end sethalftone pop }ifelse }def /clonearray { dup xcheck exch dup length array exch Adobe_AGM_Core/AGMCORE_tmp -1 ddf { Adobe_AGM_Core/AGMCORE_tmp 2 copy get 1 add ddf dup type /dicttype eq { Adobe_AGM_Core/AGMCORE_tmp get exch clonedict Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf } if dup type /arraytype eq { Adobe_AGM_Core/AGMCORE_tmp get exch clonearray Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf } if exch dup Adobe_AGM_Core/AGMCORE_tmp get 4 -1 roll put }forall exch {cvx} if }bdf /clonedict { dup length dict begin { dup type /dicttype eq { clonedict } if dup type /arraytype eq { clonearray } if def }forall currentdict end }bdf /DeviceN_PS2 { /currentcolorspace AGMCORE_gget 0 get /DeviceN eq level3 not and } bdf /Indexed_DeviceN { /indexed_colorspace_dict AGMCORE_gget dup null ne { dup /CSDBase known { /CSDBase get /CSD get_res /Names known }{ pop false }ifelse }{ pop false } ifelse } bdf /DeviceN_NoneName { /Names where { pop false Names { (None) eq or } forall }{ false }ifelse } bdf /DeviceN_PS2_inRip_seps { /AGMCORE_in_rip_sep where { pop dup type dup /arraytype eq exch /packedarraytype eq or { dup 0 get /DeviceN eq level3 not and AGMCORE_in_rip_sep and { /currentcolorspace exch AGMCORE_gput false } { true }ifelse } { true } ifelse } { true } ifelse } bdf /base_colorspace_type { dup type /arraytype eq {0 get} if } bdf /currentdistillerparams where { pop currentdistillerparams /CoreDistVersion get 5000 lt}{true}ifelse { /pdfmark_5 {cleartomark} bind def }{ /pdfmark_5 {pdfmark} bind def }ifelse /ReadBypdfmark_5 { 2 dict begin /makerString exch def string /tmpString exch def { currentfile tmpString readline pop makerString anchorsearch { pop pop cleartomark exit }{ 3 copy /PUT pdfmark_5 pop 2 copy (\n) /PUT pdfmark_5 } ifelse }loop end } bdf /doc_setup{ Adobe_AGM_Utils begin }bdf /doc_trailer{ currentdict Adobe_AGM_Utils eq{ end }if }bdf systemdict /setpacking known { setpacking } if %%EndResource %%BeginResource: procset Adobe_AGM_Core 2.0 0 %%Version: 2.0 0 %%Copyright: Copyright (C) 1997-2005 Adobe Systems, Inc. All Rights Reserved. %% Note: This procset assumes Adobe_AGM_Utils is opened on the stack below it, for %% definitions of some fundamental procedures. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Core 201 dict dup begin put /Adobe_AGM_Core_Id /Adobe_AGM_Core_2.0_0 def /AGMCORE_str256 256 string def /AGMCORE_save nd /AGMCORE_graphicsave nd /AGMCORE_c 0 def /AGMCORE_m 0 def /AGMCORE_y 0 def /AGMCORE_k 0 def /AGMCORE_cmykbuf 4 array def /AGMCORE_screen [currentscreen] cvx def /AGMCORE_tmp 0 def /AGMCORE_&setgray nd /AGMCORE_&setcolor nd /AGMCORE_&setcolorspace nd /AGMCORE_&setcmykcolor nd /AGMCORE_cyan_plate nd /AGMCORE_magenta_plate nd /AGMCORE_yellow_plate nd /AGMCORE_black_plate nd /AGMCORE_plate_ndx nd /AGMCORE_get_ink_data nd /AGMCORE_is_cmyk_sep nd /AGMCORE_host_sep nd /AGMCORE_avoid_L2_sep_space nd /AGMCORE_distilling nd /AGMCORE_composite_job nd /AGMCORE_producing_seps nd /AGMCORE_ps_level -1 def /AGMCORE_ps_version -1 def /AGMCORE_environ_ok nd /AGMCORE_CSD_cache 0 dict def /AGMCORE_currentoverprint false def /AGMCORE_deltaX nd /AGMCORE_deltaY nd /AGMCORE_name nd /AGMCORE_sep_special nd /AGMCORE_err_strings 4 dict def /AGMCORE_cur_err nd /AGMCORE_current_spot_alias false def /AGMCORE_inverting false def /AGMCORE_feature_dictCount nd /AGMCORE_feature_opCount nd /AGMCORE_feature_ctm nd /AGMCORE_ConvertToProcess false def /AGMCORE_Default_CTM matrix def /AGMCORE_Default_PageSize nd /AGMCORE_currentbg nd /AGMCORE_currentucr nd /AGMCORE_in_pattern false def /AGMCORE_currentpagedevice nd /knockout_unitsq nd currentglobal true setglobal [/CSA /Gradient /Procedure] { /Generic /Category findresource dup length dict copy /Category defineresource pop } forall setglobal /AGMCORE_key_known { where{ /Adobe_AGM_Core_Id known }{ false }ifelse }ndf /flushinput { save 2 dict begin /CompareBuffer 3 -1 roll def /readbuffer 256 string def mark { currentfile readbuffer {readline} stopped {cleartomark mark} { not {pop exit} if CompareBuffer eq {exit} if }ifelse }loop cleartomark end restore }bdf /getspotfunction { AGMCORE_screen exch pop exch pop dup type /dicttype eq{ dup /HalftoneType get 1 eq{ /SpotFunction get }{ dup /HalftoneType get 2 eq{ /GraySpotFunction get }{ pop { abs exch abs 2 copy add 1 gt{ 1 sub dup mul exch 1 sub dup mul add 1 sub }{ dup mul exch dup mul add 1 exch sub }ifelse }bind }ifelse }ifelse }if } def /clp_npth { clip newpath } def /eoclp_npth { eoclip newpath } def /npth_clp { newpath clip } def /graphic_setup { /AGMCORE_graphicsave save def concat 0 setgray 0 setlinecap 0 setlinejoin 1 setlinewidth [] 0 setdash 10 setmiterlimit newpath false setoverprint false setstrokeadjust //Adobe_AGM_Core/spot_alias get exec /Adobe_AGM_Image where { pop Adobe_AGM_Image/spot_alias 2 copy known{ get exec }{ pop pop }ifelse } if 100 dict begin /dictstackcount countdictstack def /showpage {} def mark } def /graphic_cleanup { cleartomark dictstackcount 1 countdictstack 1 sub {end}for end AGMCORE_graphicsave restore } def /compose_error_msg { grestoreall initgraphics /Helvetica findfont 10 scalefont setfont /AGMCORE_deltaY 100 def /AGMCORE_deltaX 310 def clippath pathbbox newpath pop pop 36 add exch 36 add exch moveto 0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto 0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath 0 AGMCORE_&setgray gsave 1 AGMCORE_&setgray fill grestore 1 setlinewidth gsave stroke grestore currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto /AGMCORE_deltaY 12 def /AGMCORE_tmp 0 def AGMCORE_err_strings exch get { dup 32 eq { pop AGMCORE_str256 0 AGMCORE_tmp getinterval stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt { currentpoint AGMCORE_deltaY sub exch pop clippath pathbbox pop pop pop 44 add exch moveto } if AGMCORE_str256 0 AGMCORE_tmp getinterval show ( ) show 0 1 AGMCORE_str256 length 1 sub { AGMCORE_str256 exch 0 put }for /AGMCORE_tmp 0 def } { AGMCORE_str256 exch AGMCORE_tmp xpt /AGMCORE_tmp AGMCORE_tmp 1 add def } ifelse } forall } bdf /doc_setup{ Adobe_AGM_Core begin /AGMCORE_ps_version xdf /AGMCORE_ps_level xdf errordict /AGM_handleerror known not{ errordict /AGM_handleerror errordict /handleerror get put errordict /handleerror { Adobe_AGM_Core begin $error /newerror get AGMCORE_cur_err null ne and{ $error /newerror false put AGMCORE_cur_err compose_error_msg }if $error /newerror true put end errordict /AGM_handleerror get exec } bind put }if /AGMCORE_environ_ok ps_level AGMCORE_ps_level ge ps_version AGMCORE_ps_version ge and AGMCORE_ps_level -1 eq or def AGMCORE_environ_ok not {/AGMCORE_cur_err /AGMCORE_bad_environ def} if /AGMCORE_&setgray systemdict/setgray get def level2{ /AGMCORE_&setcolor systemdict/setcolor get def /AGMCORE_&setcolorspace systemdict/setcolorspace get def }if /AGMCORE_currentbg currentblackgeneration def /AGMCORE_currentucr currentundercolorremoval def /AGMCORE_distilling /product where{ pop systemdict/setdistillerparams known product (Adobe PostScript Parser) ne and }{ false }ifelse def /AGMCORE_GSTATE AGMCORE_key_known not{ /AGMCORE_GSTATE 21 dict def /AGMCORE_tmpmatrix matrix def /AGMCORE_gstack 32 array def /AGMCORE_gstackptr 0 def /AGMCORE_gstacksaveptr 0 def /AGMCORE_gstackframekeys 10 def /AGMCORE_&gsave /gsave ldf /AGMCORE_&grestore /grestore ldf /AGMCORE_&grestoreall /grestoreall ldf /AGMCORE_&save /save ldf /AGMCORE_&setoverprint /setoverprint ldf /AGMCORE_gdictcopy { begin { def } forall end }def /AGMCORE_gput { AGMCORE_gstack AGMCORE_gstackptr get 3 1 roll put }def /AGMCORE_gget { AGMCORE_gstack AGMCORE_gstackptr get exch get }def /gsave { AGMCORE_&gsave AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add dup 32 ge {limitcheck} if /AGMCORE_gstackptr exch store AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def /grestore { AGMCORE_&grestore AGMCORE_gstackptr 1 sub dup AGMCORE_gstacksaveptr lt {1 add} if dup AGMCORE_gstack exch get dup /AGMCORE_currentoverprint known {/AGMCORE_currentoverprint get setoverprint}{pop}ifelse /AGMCORE_gstackptr exch store }def /grestoreall { AGMCORE_&grestoreall /AGMCORE_gstackptr AGMCORE_gstacksaveptr store }def /save { AGMCORE_&save AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add dup 32 ge {limitcheck} if /AGMCORE_gstackptr exch store /AGMCORE_gstacksaveptr AGMCORE_gstackptr store AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def /setoverprint{ dup /AGMCORE_currentoverprint exch AGMCORE_gput AGMCORE_&setoverprint }def 0 1 AGMCORE_gstack length 1 sub { AGMCORE_gstack exch AGMCORE_gstackframekeys dict put } for }if level3 /AGMCORE_&sysshfill AGMCORE_key_known not and { /AGMCORE_&sysshfill systemdict/shfill get def /AGMCORE_&sysmakepattern systemdict/makepattern get def /AGMCORE_&usrmakepattern /makepattern load def }if /currentcmykcolor [0 0 0 0] AGMCORE_gput /currentstrokeadjust false AGMCORE_gput /currentcolorspace [/DeviceGray] AGMCORE_gput /sep_tint 0 AGMCORE_gput /devicen_tints [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] AGMCORE_gput /sep_colorspace_dict null AGMCORE_gput /devicen_colorspace_dict null AGMCORE_gput /indexed_colorspace_dict null AGMCORE_gput /currentcolor_intent () AGMCORE_gput /customcolor_tint 1 AGMCORE_gput << /MaxPatternItem currentsystemparams /MaxPatternCache get >> setuserparams end }def /page_setup { /setcmykcolor where{ pop Adobe_AGM_Core/AGMCORE_&setcmykcolor /setcmykcolor load put }if Adobe_AGM_Core begin /setcmykcolor { 4 copy AGMCORE_cmykbuf astore /currentcmykcolor exch AGMCORE_gput 1 sub 4 1 roll 3 { 3 index add neg dup 0 lt { pop 0 } if 3 1 roll } repeat setrgbcolor pop }ndf /currentcmykcolor { /currentcmykcolor AGMCORE_gget aload pop }ndf /setoverprint { pop }ndf /currentoverprint { false }ndf /AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def /AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def /AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def /AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def /AGMCORE_plate_ndx AGMCORE_cyan_plate{ 0 }{ AGMCORE_magenta_plate{ 1 }{ AGMCORE_yellow_plate{ 2 }{ AGMCORE_black_plate{ 3 }{ 4 }ifelse }ifelse }ifelse }ifelse def /AGMCORE_have_reported_unsupported_color_space false def /AGMCORE_report_unsupported_color_space { AGMCORE_have_reported_unsupported_color_space false eq { (Warning: Job contains content that cannot be separated with on-host methods. This content appears on the black plate, and knocks out all other plates.) == Adobe_AGM_Core /AGMCORE_have_reported_unsupported_color_space true ddf } if }def /AGMCORE_composite_job AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def /AGMCORE_in_rip_sep /AGMCORE_in_rip_sep where{ pop AGMCORE_in_rip_sep }{ AGMCORE_distilling { false }{ userdict/Adobe_AGM_OnHost_Seps known{ false }{ level2{ currentpagedevice/Separations 2 copy known{ get }{ pop pop false }ifelse }{ false }ifelse }ifelse }ifelse }ifelse def /AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def /AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def /AGM_preserve_spots /AGM_preserve_spots where{ pop AGM_preserve_spots }{ AGMCORE_distilling AGMCORE_producing_seps or }ifelse def /AGM_is_distiller_preserving_spotimages { currentdistillerparams/PreserveOverprintSettings known { currentdistillerparams/PreserveOverprintSettings get { currentdistillerparams/ColorConversionStrategy known { currentdistillerparams/ColorConversionStrategy get /sRGB ne }{ true }ifelse }{ false }ifelse }{ false }ifelse }def /convert_spot_to_process where {pop}{ /convert_spot_to_process { //Adobe_AGM_Core begin dup map_alias { /Name get exch pop } if dup dup (None) eq exch (All) eq or { pop false }{ AGMCORE_host_sep { gsave 1 0 0 0 setcmykcolor currentgray 1 exch sub 0 1 0 0 setcmykcolor currentgray 1 exch sub 0 0 1 0 setcmykcolor currentgray 1 exch sub 0 0 0 1 setcmykcolor currentgray 1 exch sub add add add 0 eq { pop false }{ false setoverprint current_spot_alias false set_spot_alias 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor set_spot_alias currentgray 1 ne }ifelse grestore }{ AGMCORE_distilling { pop AGM_is_distiller_preserving_spotimages not }{ //Adobe_AGM_Core/AGMCORE_name xddf false //Adobe_AGM_Core/AGMCORE_in_pattern known {//Adobe_AGM_Core/AGMCORE_in_pattern get}{false} ifelse not AGMCORE_currentpagedevice/OverrideSeparations known and { AGMCORE_currentpagedevice/OverrideSeparations get { /HqnSpots /ProcSet resourcestatus { pop pop pop true }if }if }if { AGMCORE_name /HqnSpots /ProcSet findresource /TestSpot get exec not }{ gsave [/Separation AGMCORE_name /DeviceGray {}]AGMCORE_&setcolorspace false AGMCORE_currentpagedevice/SeparationColorNames 2 copy known { get { AGMCORE_name eq or}forall not }{ pop pop pop true }ifelse grestore }ifelse }ifelse }ifelse }ifelse end }def }ifelse /convert_to_process where {pop}{ /convert_to_process { dup length 0 eq { pop false }{ AGMCORE_host_sep { dup true exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch dup (Black) eq 3 -1 roll or {pop} {convert_spot_to_process and}ifelse } forall { true exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch (Black) eq or and }forall not }{pop false}ifelse }{ false exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch dup (Black) eq 3 -1 roll or {pop} {convert_spot_to_process or}ifelse } forall }ifelse }ifelse }def }ifelse /AGMCORE_avoid_L2_sep_space version cvr 2012 lt level2 and AGMCORE_producing_seps not and def /AGMCORE_is_cmyk_sep AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or def /AGM_avoid_0_cmyk where{ pop AGM_avoid_0_cmyk }{ AGM_preserve_spots userdict/Adobe_AGM_OnHost_Seps known userdict/Adobe_AGM_InRip_Seps known or not and }ifelse { /setcmykcolor[ { 4 copy add add add 0 eq currentoverprint and{ pop 0.0005 }if }/exec cvx /AGMCORE_&setcmykcolor load dup type/operatortype ne{ /exec cvx }if ]cvx def }if /AGMCORE_IsSeparationAProcessColor { dup (Cyan) eq exch dup (Magenta) eq exch dup (Yellow) eq exch (Black) eq or or or }def AGMCORE_host_sep{ /setcolortransfer { AGMCORE_cyan_plate{ pop pop pop }{ AGMCORE_magenta_plate{ 4 3 roll pop pop pop }{ AGMCORE_yellow_plate{ 4 2 roll pop pop pop }{ 4 1 roll pop pop pop }ifelse }ifelse }ifelse settransfer } def /AGMCORE_get_ink_data AGMCORE_cyan_plate{ {pop pop pop} }{ AGMCORE_magenta_plate{ {4 3 roll pop pop pop} }{ AGMCORE_yellow_plate{ {4 2 roll pop pop pop} }{ {4 1 roll pop pop pop} }ifelse }ifelse }ifelse def /AGMCORE_RemoveProcessColorNames { 1 dict begin /filtername { dup /Cyan eq 1 index (Cyan) eq or {pop (_cyan_)}if dup /Magenta eq 1 index (Magenta) eq or {pop (_magenta_)}if dup /Yellow eq 1 index (Yellow) eq or {pop (_yellow_)}if dup /Black eq 1 index (Black) eq or {pop (_black_)}if }def dup type /arraytype eq {[exch {filtername}forall]} {filtername}ifelse end }def level3 { /AGMCORE_IsCurrentColor { dup AGMCORE_IsSeparationAProcessColor { AGMCORE_plate_ndx 0 eq {dup (Cyan) eq exch /Cyan eq or}if AGMCORE_plate_ndx 1 eq {dup (Magenta) eq exch /Magenta eq or}if AGMCORE_plate_ndx 2 eq {dup (Yellow) eq exch /Yellow eq or}if AGMCORE_plate_ndx 3 eq {dup (Black) eq exch /Black eq or}if AGMCORE_plate_ndx 4 eq {pop false}if }{ gsave false setoverprint current_spot_alias false set_spot_alias 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor set_spot_alias currentgray 1 ne grestore }ifelse }def /AGMCORE_filter_functiondatasource { 5 dict begin /data_in xdf data_in type /stringtype eq { /ncomp xdf /comp xdf /string_out data_in length ncomp idiv string def 0 ncomp data_in length 1 sub { string_out exch dup ncomp idiv exch data_in exch ncomp getinterval comp get 255 exch sub put }for string_out }{ string /string_in xdf /string_out 1 string def /component xdf [ data_in string_in /readstring cvx [component /get cvx 255 /exch cvx /sub cvx string_out /exch cvx 0 /exch cvx /put cvx string_out]cvx [/pop cvx ()]cvx /ifelse cvx ]cvx /ReusableStreamDecode filter }ifelse end }def /AGMCORE_separateShadingFunction { 2 dict begin /paint? xdf /channel xdf dup type /dicttype eq { begin FunctionType 0 eq { /DataSource channel Range length 2 idiv DataSource AGMCORE_filter_functiondatasource def currentdict /Decode known {/Decode Decode channel 2 mul 2 getinterval def}if paint? not {/Decode [1 1]def}if }if FunctionType 2 eq { paint? { /C0 [C0 channel get 1 exch sub] def /C1 [C1 channel get 1 exch sub] def }{ /C0 [1] def /C1 [1] def }ifelse }if FunctionType 3 eq { /Functions [Functions {channel paint? AGMCORE_separateShadingFunction} forall] def }if currentdict /Range known {/Range [0 1] def}if currentdict end}{ channel get 0 paint? AGMCORE_separateShadingFunction }ifelse end }def /AGMCORE_separateShading { 3 -1 roll begin currentdict /Function known { currentdict /Background known {[1 index{Background 3 index get 1 exch sub}{1}ifelse]/Background xdf}if Function 3 1 roll AGMCORE_separateShadingFunction /Function xdf /ColorSpace [/DeviceGray] def }{ ColorSpace dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [/DeviceN [/_cyan_ /_magenta_ /_yellow_ /_black_] /DeviceCMYK {}] def }{ ColorSpace dup 1 get AGMCORE_RemoveProcessColorNames 1 exch put }ifelse ColorSpace 0 get /Separation eq { { [1 /exch cvx /sub cvx]cvx }{ [/pop cvx 1]cvx }ifelse ColorSpace 3 3 -1 roll put pop }{ { [exch ColorSpace 1 get length 1 sub exch sub /index cvx 1 /exch cvx /sub cvx ColorSpace 1 get length 1 add 1 /roll cvx ColorSpace 1 get length{/pop cvx} repeat]cvx }{ pop [ColorSpace 1 get length {/pop cvx} repeat cvx 1]cvx }ifelse ColorSpace 3 3 -1 roll bind put }ifelse ColorSpace 2 /DeviceGray put }ifelse end }def /AGMCORE_separateShadingDict { dup /ColorSpace get dup type /arraytype ne {[exch]}if dup 0 get /DeviceCMYK eq { exch begin currentdict AGMCORE_cyan_plate {0 true}if AGMCORE_magenta_plate {1 true}if AGMCORE_yellow_plate {2 true}if AGMCORE_black_plate {3 true}if AGMCORE_plate_ndx 4 eq {0 false}if dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading currentdict end exch }if dup 0 get /Separation eq { exch begin ColorSpace 1 get dup /None ne exch /All ne and { ColorSpace 1 get AGMCORE_IsCurrentColor AGMCORE_plate_ndx 4 lt and ColorSpace 1 get AGMCORE_IsSeparationAProcessColor not and { ColorSpace 2 get dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [ /Separation ColorSpace 1 get /DeviceGray [ ColorSpace 3 get /exec cvx 4 AGMCORE_plate_ndx sub -1 /roll cvx 4 1 /roll cvx 3 [/pop cvx]cvx /repeat cvx 1 /exch cvx /sub cvx ]cvx ]def }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { currentdict 0 false AGMCORE_separateShading }if }ifelse }{ currentdict ColorSpace 1 get AGMCORE_IsCurrentColor 0 exch dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading }ifelse }if currentdict end exch }if dup 0 get /DeviceN eq { exch begin ColorSpace 1 get convert_to_process { ColorSpace 2 get dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [ /DeviceN ColorSpace 1 get /DeviceGray [ ColorSpace 3 get /exec cvx 4 AGMCORE_plate_ndx sub -1 /roll cvx 4 1 /roll cvx 3 [/pop cvx]cvx /repeat cvx 1 /exch cvx /sub cvx ]cvx ]def }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { currentdict 0 false AGMCORE_separateShading /ColorSpace [/DeviceGray] def }if }ifelse }{ currentdict false -1 ColorSpace 1 get { AGMCORE_IsCurrentColor { 1 add exch pop true exch exit }if 1 add }forall exch dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading }ifelse currentdict end exch }if dup 0 get dup /DeviceCMYK eq exch dup /Separation eq exch /DeviceN eq or or not { exch begin ColorSpace dup type /arraytype eq {0 get}if /DeviceGray ne { AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { ColorSpace 0 get /CIEBasedA eq { /ColorSpace [/Separation /_ciebaseda_ /DeviceGray {}] def }if ColorSpace 0 get dup /CIEBasedABC eq exch dup /CIEBasedDEF eq exch /DeviceRGB eq or or { /ColorSpace [/DeviceN [/_red_ /_green_ /_blue_] /DeviceRGB {}] def }if ColorSpace 0 get /CIEBasedDEFG eq { /ColorSpace [/DeviceN [/_cyan_ /_magenta_ /_yellow_ /_black_] /DeviceCMYK {}] def }if currentdict 0 false AGMCORE_separateShading }if }if currentdict end exch }if pop dup /AGMCORE_ignoreshade known { begin /ColorSpace [/Separation (None) /DeviceGray {}] def currentdict end }if }def /shfill { AGMCORE_separateShadingDict dup /AGMCORE_ignoreshade known {pop} {AGMCORE_&sysshfill}ifelse }def /makepattern { exch dup /PatternType get 2 eq { clonedict begin /Shading Shading AGMCORE_separateShadingDict def Shading /AGMCORE_ignoreshade known currentdict end exch {pop <>}if exch AGMCORE_&sysmakepattern }{ exch AGMCORE_&usrmakepattern }ifelse }def }if }if AGMCORE_in_rip_sep{ /setcustomcolor { exch aload pop dup 7 1 roll inRip_spot_has_ink not { 4 {4 index mul 4 1 roll} repeat /DeviceCMYK setcolorspace 6 -2 roll pop pop }{ //Adobe_AGM_Core begin /AGMCORE_k xdf /AGMCORE_y xdf /AGMCORE_m xdf /AGMCORE_c xdf end [/Separation 4 -1 roll /DeviceCMYK {dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul} ] setcolorspace }ifelse setcolor }ndf /setseparationgray { [/Separation (All) /DeviceGray {}] setcolorspace_opt 1 exch sub setcolor }ndf }{ /setseparationgray { AGMCORE_&setgray }ndf }ifelse /findcmykcustomcolor { 5 makereadonlyarray }ndf /setcustomcolor { exch aload pop pop 4 {4 index mul 4 1 roll} repeat setcmykcolor pop }ndf /has_color /colorimage where{ AGMCORE_producing_seps{ pop true }{ systemdict eq }ifelse }{ false }ifelse def /map_index { 1 index mul exch getinterval {255 div} forall } bdf /map_indexed_devn { Lookup Names length 3 -1 roll cvi map_index } bdf /n_color_components { base_colorspace_type dup /DeviceGray eq{ pop 1 }{ /DeviceCMYK eq{ 4 }{ 3 }ifelse }ifelse }bdf level2{ /mo /moveto ldf /li /lineto ldf /cv /curveto ldf /knockout_unitsq { 1 setgray 0 0 1 1 rectfill }def level2 /setcolorspace AGMCORE_key_known not and{ /AGMCORE_&&&setcolorspace /setcolorspace ldf /AGMCORE_ReplaceMappedColor { dup type dup /arraytype eq exch /packedarraytype eq or { /AGMCORE_SpotAliasAry2 where { begin dup 0 get dup /Separation eq { pop dup length array copy dup dup 1 get current_spot_alias { dup map_alias { false set_spot_alias dup 1 exch setsepcolorspace true set_spot_alias begin /sep_colorspace_dict currentdict AGMCORE_gput pop pop pop [ /Separation Name CSA map_csa MappedCSA /sep_colorspace_proc load ] dup Name end }if }if map_reserved_ink_name 1 xpt }{ /DeviceN eq { dup length array copy dup dup 1 get [ exch { current_spot_alias{ dup map_alias{ /Name get exch pop }if }if map_reserved_ink_name } forall ] 1 xpt }if }ifelse end } if }if }def /setcolorspace { dup type dup /arraytype eq exch /packedarraytype eq or { dup 0 get /Indexed eq { AGMCORE_distilling { /PhotoshopDuotoneList where { pop false }{ true }ifelse }{ true }ifelse { aload pop 3 -1 roll AGMCORE_ReplaceMappedColor 3 1 roll 4 array astore }if }{ AGMCORE_ReplaceMappedColor }ifelse }if DeviceN_PS2_inRip_seps {AGMCORE_&&&setcolorspace} if }def }if }{ /adj { currentstrokeadjust{ transform 0.25 sub round 0.25 add exch 0.25 sub round 0.25 add exch itransform }if }def /mo{ adj moveto }def /li{ adj lineto }def /cv{ 6 2 roll adj 6 2 roll adj 6 2 roll adj curveto }def /knockout_unitsq { 1 setgray 8 8 1 [8 0 0 8 0 0] {} image }def /currentstrokeadjust{ /currentstrokeadjust AGMCORE_gget }def /setstrokeadjust{ /currentstrokeadjust exch AGMCORE_gput }def /setcolorspace { /currentcolorspace exch AGMCORE_gput } def /currentcolorspace { /currentcolorspace AGMCORE_gget } def /setcolor_devicecolor { base_colorspace_type dup /DeviceGray eq{ pop setgray }{ /DeviceCMYK eq{ setcmykcolor }{ setrgbcolor }ifelse }ifelse }def /setcolor { currentcolorspace 0 get dup /DeviceGray ne{ dup /DeviceCMYK ne{ dup /DeviceRGB ne{ dup /Separation eq{ pop currentcolorspace 3 get exec currentcolorspace 2 get }{ dup /Indexed eq{ pop currentcolorspace 3 get dup type /stringtype eq{ currentcolorspace 1 get n_color_components 3 -1 roll map_index }{ exec }ifelse currentcolorspace 1 get }{ /AGMCORE_cur_err /AGMCORE_invalid_color_space def AGMCORE_invalid_color_space }ifelse }ifelse }if }if }if setcolor_devicecolor } def }ifelse /sop /setoverprint ldf /lw /setlinewidth ldf /lc /setlinecap ldf /lj /setlinejoin ldf /ml /setmiterlimit ldf /dsh /setdash ldf /sadj /setstrokeadjust ldf /gry /setgray ldf /rgb /setrgbcolor ldf /cmyk /setcmykcolor ldf /sep /setsepcolor ldf /devn /setdevicencolor ldf /idx /setindexedcolor ldf /colr /setcolor ldf /csacrd /set_csa_crd ldf /sepcs /setsepcolorspace ldf /devncs /setdevicencolorspace ldf /idxcs /setindexedcolorspace ldf /cp /closepath ldf /clp /clp_npth ldf /eclp /eoclp_npth ldf /f /fill ldf /ef /eofill ldf /@ /stroke ldf /nclp /npth_clp ldf /gset /graphic_setup ldf /gcln /graphic_cleanup ldf /AGMCORE_def_ht currenthalftone def /clonedict Adobe_AGM_Utils begin /clonedict load end def /clonearray Adobe_AGM_Utils begin /clonearray load end def currentdict{ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and { bind }if def }forall /getrampcolor { /indx exch def 0 1 NumComp 1 sub { dup Samples exch get dup type /stringtype eq {indx get} if exch Scaling exch get aload pop 3 1 roll mul add } for ColorSpaceFamily /Separation eq {sep} { ColorSpaceFamily /DeviceN eq {devn} {setcolor}ifelse }ifelse } bdf /sssetbackground {aload pop setcolor} bdf /RadialShade { 40 dict begin /ColorSpaceFamily xdf /background xdf /ext1 xdf /ext0 xdf /BBox xdf /r2 xdf /c2y xdf /c2x xdf /r1 xdf /c1y xdf /c1x xdf /rampdict xdf /setinkoverprint where {pop /setinkoverprint{pop}def}if gsave BBox length 0 gt { newpath BBox 0 get BBox 1 get moveto BBox 2 get BBox 0 get sub 0 rlineto 0 BBox 3 get BBox 1 get sub rlineto BBox 2 get BBox 0 get sub neg 0 rlineto closepath clip newpath } if c1x c2x eq { c1y c2y lt {/theta 90 def}{/theta 270 def} ifelse } { /slope c2y c1y sub c2x c1x sub div def /theta slope 1 atan def c2x c1x lt c2y c1y ge and { /theta theta 180 sub def} if c2x c1x lt c2y c1y lt and { /theta theta 180 add def} if } ifelse gsave clippath c1x c1y translate theta rotate -90 rotate { pathbbox } stopped { 0 0 0 0 } if /yMax xdf /xMax xdf /yMin xdf /xMin xdf grestore xMax xMin eq yMax yMin eq or { grestore end } { /max { 2 copy gt { pop } {exch pop} ifelse } bdf /min { 2 copy lt { pop } {exch pop} ifelse } bdf rampdict begin 40 dict begin background length 0 gt { background sssetbackground gsave clippath fill grestore } if gsave c1x c1y translate theta rotate -90 rotate /c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def /c1y 0 def /c1x 0 def /c2x 0 def ext0 { 0 getrampcolor c2y r2 add r1 sub 0.0001 lt { c1x c1y r1 360 0 arcn pathbbox /aymax exch def /axmax exch def /aymin exch def /axmin exch def /bxMin xMin axmin min def /byMin yMin aymin min def /bxMax xMax axmax max def /byMax yMax aymax max def bxMin byMin moveto bxMax byMin lineto bxMax byMax lineto bxMin byMax lineto bxMin byMin lineto eofill } { c2y r1 add r2 le { c1x c1y r1 0 360 arc fill } { c2x c2y r2 0 360 arc fill r1 r2 eq { /p1x r1 neg def /p1y c1y def /p2x r1 def /p2y c1y def p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto fill } { /AA r2 r1 sub c2y div def AA -1 eq { /theta 89.99 def} { /theta AA 1 AA dup mul sub sqrt div 1 atan def} ifelse /SS1 90 theta add dup sin exch cos div def /p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def /p1y p1x SS1 div neg def /SS2 90 theta sub dup sin exch cos div def /p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def /p2y p2x SS2 div neg def r1 r2 gt { /L1maxX p1x yMin p1y sub SS1 div add def /L2maxX p2x yMin p2y sub SS2 div add def } { /L1maxX 0 def /L2maxX 0 def } ifelse p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto L1maxX L1maxX p1x sub SS1 mul p1y add lineto fill } ifelse } ifelse } ifelse } if c1x c2x sub dup mul c1y c2y sub dup mul add 0.5 exp 0 dtransform dup mul exch dup mul add 0.5 exp 72 div 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 1 index 1 index lt { exch } if pop /hires xdf hires mul /numpix xdf /numsteps NumSamples def /rampIndxInc 1 def /subsampling false def numpix 0 ne { NumSamples numpix div 0.5 gt { /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def /rampIndxInc NumSamples 1 sub numsteps div def /subsampling true def } if } if /xInc c2x c1x sub numsteps div def /yInc c2y c1y sub numsteps div def /rInc r2 r1 sub numsteps div def /cx c1x def /cy c1y def /radius r1 def newpath xInc 0 eq yInc 0 eq rInc 0 eq and and { 0 getrampcolor cx cy radius 0 360 arc stroke NumSamples 1 sub getrampcolor cx cy radius 72 hires div add 0 360 arc 0 setlinewidth stroke } { 0 numsteps { dup subsampling { round cvi } if getrampcolor cx cy radius 0 360 arc /cx cx xInc add def /cy cy yInc add def /radius radius rInc add def cx cy radius 360 0 arcn eofill rampIndxInc add } repeat pop } ifelse ext1 { c2y r2 add r1 lt { c2x c2y r2 0 360 arc fill } { c2y r1 add r2 sub 0.0001 le { c2x c2y r2 360 0 arcn pathbbox /aymax exch def /axmax exch def /aymin exch def /axmin exch def /bxMin xMin axmin min def /byMin yMin aymin min def /bxMax xMax axmax max def /byMax yMax aymax max def bxMin byMin moveto bxMax byMin lineto bxMax byMax lineto bxMin byMax lineto bxMin byMin lineto eofill } { c2x c2y r2 0 360 arc fill r1 r2 eq { /p1x r2 neg def /p1y c2y def /p2x r2 def /p2y c2y def p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto fill } { /AA r2 r1 sub c2y div def AA -1 eq { /theta 89.99 def} { /theta AA 1 AA dup mul sub sqrt div 1 atan def} ifelse /SS1 90 theta add dup sin exch cos div def /p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def /p1y c2y p1x SS1 div sub def /SS2 90 theta sub dup sin exch cos div def /p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def /p2y c2y p2x SS2 div sub def r1 r2 lt { /L1maxX p1x yMax p1y sub SS1 div add def /L2maxX p2x yMax p2y sub SS2 div add def } { /L1maxX 0 def /L2maxX 0 def }ifelse p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto L1maxX L1maxX p1x sub SS1 mul p1y add lineto fill } ifelse } ifelse } ifelse } if grestore grestore end end end } ifelse } bdf /GenStrips { 40 dict begin /ColorSpaceFamily xdf /background xdf /ext1 xdf /ext0 xdf /BBox xdf /y2 xdf /x2 xdf /y1 xdf /x1 xdf /rampdict xdf /setinkoverprint where {pop /setinkoverprint{pop}def}if gsave BBox length 0 gt { newpath BBox 0 get BBox 1 get moveto BBox 2 get BBox 0 get sub 0 rlineto 0 BBox 3 get BBox 1 get sub rlineto BBox 2 get BBox 0 get sub neg 0 rlineto closepath clip newpath } if x1 x2 eq { y1 y2 lt {/theta 90 def}{/theta 270 def} ifelse } { /slope y2 y1 sub x2 x1 sub div def /theta slope 1 atan def x2 x1 lt y2 y1 ge and { /theta theta 180 sub def} if x2 x1 lt y2 y1 lt and { /theta theta 180 add def} if } ifelse gsave clippath x1 y1 translate theta rotate { pathbbox } stopped { 0 0 0 0 } if /yMax exch def /xMax exch def /yMin exch def /xMin exch def grestore xMax xMin eq yMax yMin eq or { grestore end } { rampdict begin 20 dict begin background length 0 gt { background sssetbackground gsave clippath fill grestore } if gsave x1 y1 translate theta rotate /xStart 0 def /xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def /ySpan yMax yMin sub def /numsteps NumSamples def /rampIndxInc 1 def /subsampling false def xStart 0 transform xEnd 0 transform 3 -1 roll sub dup mul 3 1 roll sub dup mul add 0.5 exp 72 div 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 1 index 1 index lt { exch } if pop mul /numpix xdf numpix 0 ne { NumSamples numpix div 0.5 gt { /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def /rampIndxInc NumSamples 1 sub numsteps div def /subsampling true def } if } if ext0 { 0 getrampcolor xMin xStart lt { xMin yMin xMin neg ySpan rectfill } if } if /xInc xEnd xStart sub numsteps div def /x xStart def 0 numsteps { dup subsampling { round cvi } if getrampcolor x yMin xInc ySpan rectfill /x x xInc add def rampIndxInc add } repeat pop ext1 { xMax xEnd gt { xEnd yMin xMax xEnd sub ySpan rectfill } if } if grestore grestore end end end } ifelse } bdf }def /page_trailer { end }def /doc_trailer{ }def /capture_currentpagedevice { //Adobe_AGM_Core/AGMCORE_currentpagedevice currentpagedevice ddf } def systemdict /findcolorrendering known{ /findcolorrendering systemdict /findcolorrendering get def }if systemdict /setcolorrendering known{ /setcolorrendering systemdict /setcolorrendering get def }if /test_cmyk_color_plate { gsave setcmykcolor currentgray 1 ne grestore }def /inRip_spot_has_ink { dup //Adobe_AGM_Core/AGMCORE_name xddf convert_spot_to_process not }def /map255_to_range { 1 index sub 3 -1 roll 255 div mul add }def /set_csa_crd { /sep_colorspace_dict null AGMCORE_gput begin CSA get_csa_by_name setcolorspace_opt set_crd end } def /map_csa { currentdict/MappedCSA known{MappedCSA null ne}{false}ifelse {pop}{get_csa_by_name /MappedCSA xdf}ifelse } def /setsepcolor { /sep_colorspace_dict AGMCORE_gget begin dup /sep_tint exch AGMCORE_gput TintProc end } def /setdevicencolor { /devicen_colorspace_dict AGMCORE_gget begin Names length copy Names length 1 sub -1 0 { /devicen_tints AGMCORE_gget 3 1 roll xpt } for TintProc end } def /sep_colorspace_proc { /AGMCORE_tmp exch store /sep_colorspace_dict AGMCORE_gget begin currentdict/Components known{ Components aload pop TintMethod/Lab eq{ 2 {AGMCORE_tmp mul NComponents 1 roll} repeat LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll }{ TintMethod/Subtractive eq{ NComponents{ AGMCORE_tmp mul NComponents 1 roll }repeat }{ NComponents{ 1 sub AGMCORE_tmp mul 1 add NComponents 1 roll } repeat }ifelse }ifelse }{ ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get aload pop }ifelse end } def /sep_colorspace_gray_proc { /AGMCORE_tmp exch store /sep_colorspace_dict AGMCORE_gget begin GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get end } def /sep_proc_name { dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or level2 not and has_color not and{ pop [/DeviceGray] /sep_colorspace_gray_proc }{ /sep_colorspace_proc }ifelse } def /setsepcolorspace { current_spot_alias{ dup begin Name map_alias{ exch pop }if end }if dup /sep_colorspace_dict exch AGMCORE_gput begin CSA map_csa /AGMCORE_sep_special Name dup () eq exch (All) eq or store AGMCORE_avoid_L2_sep_space{ [/Indexed MappedCSA sep_proc_name 255 exch { 255 div } /exec cvx 3 -1 roll [ 4 1 roll load /exec cvx ] cvx ] setcolorspace_opt /TintProc { 255 mul round cvi setcolor }bdf }{ MappedCSA 0 get /DeviceCMYK eq currentdict/Components known and AGMCORE_sep_special not and{ /TintProc [ Components aload pop Name findcmykcustomcolor /exch cvx /setcustomcolor cvx ] cvx bdf }{ AGMCORE_host_sep Name (All) eq and{ /TintProc { 1 exch sub setseparationgray }bdf }{ AGMCORE_in_rip_sep MappedCSA 0 get /DeviceCMYK eq and AGMCORE_host_sep or Name () eq and{ /TintProc [ MappedCSA sep_proc_name exch 0 get /DeviceCMYK eq{ cvx /setcmykcolor cvx }{ cvx /setgray cvx }ifelse ] cvx bdf }{ AGMCORE_producing_seps MappedCSA 0 get dup /DeviceCMYK eq exch /DeviceGray eq or and AGMCORE_sep_special not and{ /TintProc [ /dup cvx MappedCSA sep_proc_name cvx exch 0 get /DeviceGray eq{ 1 /exch cvx /sub cvx 0 0 0 4 -1 /roll cvx }if /Name cvx /findcmykcustomcolor cvx /exch cvx AGMCORE_host_sep{ AGMCORE_is_cmyk_sep /Name cvx /AGMCORE_IsSeparationAProcessColor load /exec cvx /not cvx /and cvx }{ Name inRip_spot_has_ink not }ifelse [ /pop cvx 1 ] cvx /if cvx /setcustomcolor cvx ] cvx bdf }{ /TintProc {setcolor} bdf [/Separation Name MappedCSA sep_proc_name load ] setcolorspace_opt }ifelse }ifelse }ifelse }ifelse }ifelse set_crd setsepcolor end } def /additive_blend { 3 dict begin /numarrays xdf /numcolors xdf 0 1 numcolors 1 sub { /c1 xdf 1 0 1 numarrays 1 sub { 1 exch add /index cvx c1 /get cvx /mul cvx }for numarrays 1 add 1 /roll cvx }for numarrays [/pop cvx] cvx /repeat cvx end }def /subtractive_blend { 3 dict begin /numarrays xdf /numcolors xdf 0 1 numcolors 1 sub { /c1 xdf 1 1 0 1 numarrays 1 sub { 1 3 3 -1 roll add /index cvx c1 /get cvx /sub cvx /mul cvx }for /sub cvx numarrays 1 add 1 /roll cvx }for numarrays [/pop cvx] cvx /repeat cvx end }def /exec_tint_transform { /TintProc [ /TintTransform cvx /setcolor cvx ] cvx bdf MappedCSA setcolorspace_opt } bdf /devn_makecustomcolor { 2 dict begin /names_index xdf /Names xdf 1 1 1 1 Names names_index get findcmykcustomcolor /devicen_tints AGMCORE_gget names_index get setcustomcolor Names length {pop} repeat end } bdf /setdevicencolorspace { dup /AliasedColorants known {false}{true}ifelse current_spot_alias and { 7 dict begin /names_index 0 def dup /names_len exch /Names get length def /new_names names_len array def /new_LookupTables names_len array def /alias_cnt 0 def dup /Names get { dup map_alias { exch pop dup /ColorLookup known { dup begin new_LookupTables names_index ColorLookup put end }{ dup /Components known { dup begin new_LookupTables names_index Components put end }{ dup begin new_LookupTables names_index [null null null null] put end } ifelse } ifelse new_names names_index 3 -1 roll /Name get put /alias_cnt alias_cnt 1 add def }{ /name xdf new_names names_index name put dup /LookupTables known { dup begin new_LookupTables names_index LookupTables names_index get put end }{ dup begin new_LookupTables names_index [null null null null] put end } ifelse } ifelse /names_index names_index 1 add def } forall alias_cnt 0 gt { /AliasedColorants true def /lut_entry_len new_LookupTables 0 get dup length 256 ge {0 get length}{length}ifelse def 0 1 names_len 1 sub { /names_index xdf new_LookupTables names_index get dup length 256 ge {0 get length}{length}ifelse lut_entry_len ne { /AliasedColorants false def exit } { new_LookupTables names_index get 0 get null eq { dup /Names get names_index get /name xdf name (Cyan) eq name (Magenta) eq name (Yellow) eq name (Black) eq or or or not { /AliasedColorants false def exit } if } if } ifelse } for lut_entry_len 1 eq { /AliasedColorants false def } if AliasedColorants { dup begin /Names new_names def /LookupTables new_LookupTables def /AliasedColorants true def /NComponents lut_entry_len def /TintMethod NComponents 4 eq {/Subtractive}{/Additive}ifelse def /MappedCSA TintMethod /Additive eq {/DeviceRGB}{/DeviceCMYK}ifelse def currentdict /TTTablesIdx known not { /TTTablesIdx -1 def } if end } if }if end } if dup /devicen_colorspace_dict exch AGMCORE_gput begin currentdict /AliasedColorants known { AliasedColorants }{ false } ifelse dup not { CSA map_csa } if /TintTransform load type /nulltype eq or { /TintTransform [ 0 1 Names length 1 sub { /TTTablesIdx TTTablesIdx 1 add def dup LookupTables exch get dup 0 get null eq { 1 index Names exch get dup (Cyan) eq { pop exch LookupTables length exch sub /index cvx 0 0 0 } { dup (Magenta) eq { pop exch LookupTables length exch sub /index cvx 0 /exch cvx 0 0 } { (Yellow) eq { exch LookupTables length exch sub /index cvx 0 0 3 -1 /roll cvx 0 } { exch LookupTables length exch sub /index cvx 0 0 0 4 -1 /roll cvx } ifelse } ifelse } ifelse 5 -1 /roll cvx /astore cvx } { dup length 1 sub LookupTables length 4 -1 roll sub 1 add /index cvx /mul cvx /round cvx /cvi cvx /get cvx } ifelse Names length TTTablesIdx add 1 add 1 /roll cvx } for Names length [/pop cvx] cvx /repeat cvx NComponents Names length TintMethod /Subtractive eq { subtractive_blend } { additive_blend } ifelse ] cvx bdf } if AGMCORE_host_sep { Names convert_to_process { exec_tint_transform } { currentdict /AliasedColorants known { AliasedColorants not }{ false } ifelse 5 dict begin /AvoidAliasedColorants xdf /painted? false def /names_index 0 def /names_len Names length def AvoidAliasedColorants { /currentspotalias current_spot_alias def false set_spot_alias } if Names { AGMCORE_is_cmyk_sep { dup (Cyan) eq AGMCORE_cyan_plate and exch dup (Magenta) eq AGMCORE_magenta_plate and exch dup (Yellow) eq AGMCORE_yellow_plate and exch (Black) eq AGMCORE_black_plate and or or or { /devicen_colorspace_dict AGMCORE_gget /TintProc [ Names names_index /devn_makecustomcolor cvx ] cvx ddf /painted? true def } if painted? {exit} if }{ 0 0 0 0 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq { /devicen_colorspace_dict AGMCORE_gget /TintProc [ Names names_index /devn_makecustomcolor cvx ] cvx ddf /painted? true def exit } if } ifelse /names_index names_index 1 add def } forall AvoidAliasedColorants { currentspotalias set_spot_alias } if painted? { /devicen_colorspace_dict AGMCORE_gget /names_index names_index put }{ /devicen_colorspace_dict AGMCORE_gget /TintProc [ names_len [/pop cvx] cvx /repeat cvx 1 /setseparationgray cvx 0 0 0 0 /setcmykcolor cvx ] cvx ddf } ifelse end } ifelse } { AGMCORE_in_rip_sep { Names convert_to_process not }{ level3 } ifelse { [/DeviceN Names MappedCSA /TintTransform load] setcolorspace_opt /TintProc level3 not AGMCORE_in_rip_sep and { [ Names /length cvx [/pop cvx] cvx /repeat cvx ] cvx bdf }{ {setcolor} bdf } ifelse }{ exec_tint_transform } ifelse } ifelse set_crd /AliasedColorants false def end } def /setindexedcolorspace { dup /indexed_colorspace_dict exch AGMCORE_gput begin currentdict /CSDBase known { CSDBase /CSD get_res begin currentdict /Names known { currentdict devncs }{ 1 currentdict sepcs } ifelse AGMCORE_host_sep{ 4 dict begin /compCnt /Names where {pop Names length}{1}ifelse def /NewLookup HiVal 1 add string def 0 1 HiVal { /tableIndex xdf Lookup dup type /stringtype eq { compCnt tableIndex map_index }{ exec } ifelse /Names where { pop setdevicencolor }{ setsepcolor } ifelse currentgray tableIndex exch HiVal mul cvi NewLookup 3 1 roll put } for [/Indexed currentcolorspace HiVal NewLookup] setcolorspace_opt end }{ level3 { currentdict /Names known { [/Indexed [/DeviceN Names MappedCSA /TintTransform load] HiVal Lookup] setcolorspace_opt }{ [/Indexed [/Separation Name MappedCSA sep_proc_name load] HiVal Lookup] setcolorspace_opt } ifelse }{ [/Indexed MappedCSA HiVal [ currentdict /Names known { Lookup dup type /stringtype eq {/exch cvx CSDBase /CSD get_res /Names get length dup /mul cvx exch /getinterval cvx {255 div} /forall cvx} {/exec cvx}ifelse /TintTransform load /exec cvx }{ Lookup dup type /stringtype eq {/exch cvx /get cvx 255 /div cvx} {/exec cvx}ifelse CSDBase /CSD get_res /MappedCSA get sep_proc_name exch pop /load cvx /exec cvx } ifelse ]cvx ]setcolorspace_opt }ifelse } ifelse end set_crd } { CSA map_csa AGMCORE_host_sep level2 not and{ 0 0 0 0 setcmykcolor }{ [/Indexed MappedCSA level2 not has_color not and{ dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or{ pop [/DeviceGray] }if HiVal GrayLookup }{ HiVal currentdict/RangeArray known{ { /indexed_colorspace_dict AGMCORE_gget begin Lookup exch dup HiVal gt{ pop HiVal }if NComponents mul NComponents getinterval {} forall NComponents 1 sub -1 0{ RangeArray exch 2 mul 2 getinterval aload pop map255_to_range NComponents 1 roll }for end } bind }{ Lookup }ifelse }ifelse ] setcolorspace_opt set_crd }ifelse }ifelse end }def /setindexedcolor { AGMCORE_host_sep { /indexed_colorspace_dict AGMCORE_gget dup /CSDBase known { begin CSDBase /CSD get_res begin currentdict /Names known{ map_indexed_devn devn } { Lookup 1 3 -1 roll map_index sep }ifelse end end }{ /Lookup get 4 3 -1 roll map_index setcmykcolor } ifelse }{ level3 not AGMCORE_in_rip_sep and /indexed_colorspace_dict AGMCORE_gget /CSDBase known and { /indexed_colorspace_dict AGMCORE_gget /CSDBase get /CSD get_res begin map_indexed_devn devn end } { setcolor } ifelse }ifelse } def /ignoreimagedata { currentoverprint not{ gsave dup clonedict begin 1 setgray /Decode [0 1] def /DataSource def /MultipleDataSources false def /BitsPerComponent 8 def currentdict end systemdict /image get exec grestore }if consumeimagedata }def /add_res { dup /CSD eq { pop //Adobe_AGM_Core begin /AGMCORE_CSD_cache load 3 1 roll put end }{ defineresource pop } ifelse }def /del_res { { aload pop exch dup /CSD eq { pop { //Adobe_AGM_Core/AGMCORE_CSD_cache get exch undef }forall }{ exch { 1 index undefineresource }forall pop } ifelse } forall }def /get_res { dup /CSD eq { pop dup type dup /nametype eq exch /stringtype eq or { AGMCORE_CSD_cache exch get } if }{ findresource } ifelse }def /get_csa_by_name { dup type dup /nametype eq exch /stringtype eq or{ /CSA get_res } if }def /pattern_buf_init { /count get 0 0 put } def /pattern_buf_next { dup /count get dup 0 get dup 3 1 roll 1 add 0 xpt get } def /cachepattern_compress { 5 dict begin currentfile exch 0 exch /SubFileDecode filter /ReadFilter exch def /patarray 20 dict def /string_size 16000 def /readbuffer string_size string def currentglobal true setglobal patarray 1 array dup 0 1 put /count xpt setglobal /LZWFilter { exch dup length 0 eq { pop }{ patarray dup length 1 sub 3 -1 roll put } ifelse {string_size}{0}ifelse string } /LZWEncode filter def { ReadFilter readbuffer readstring exch LZWFilter exch writestring not {exit} if } loop LZWFilter closefile patarray end }def /cachepattern { 2 dict begin currentfile exch 0 exch /SubFileDecode filter /ReadFilter exch def /patarray 20 dict def currentglobal true setglobal patarray 1 array dup 0 1 put /count xpt setglobal { ReadFilter 16000 string readstring exch patarray dup length 1 sub 3 -1 roll put not {exit} if } loop patarray dup dup length 1 sub () put end }def /wrap_paintproc { statusdict /currentfilenameextend known{ clonedict begin /OldPaintProc /PaintProc load def /PaintProc { mark exch dup /OldPaintProc get stopped {closefile restore end} if cleartomark } def end } {pop} ifelse } def /make_pattern { exch clonedict exch dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform exch 3 index /XStep get 1 index exch 2 copy div cvi mul sub sub exch 3 index /YStep get 1 index exch 2 copy div cvi mul sub sub matrix translate exch matrix concatmatrix 1 index begin BBox 0 get XStep div cvi XStep mul /xshift exch neg def BBox 1 get YStep div cvi YStep mul /yshift exch neg def BBox 0 get xshift add BBox 1 get yshift add BBox 2 get xshift add BBox 3 get yshift add 4 array astore /BBox exch def [ xshift yshift /translate load null /exec load ] dup 3 /PaintProc load put cvx /PaintProc exch def end 1 index dup /ID get exch /Pattern add_res gsave 0 setgray makepattern grestore }def /set_pattern { dup /PatternType get 1 eq{ dup /PaintType get 1 eq{ currentoverprint sop [/DeviceGray] setcolorspace 0 setgray }if }if setpattern }def /setcolorspace_opt { dup currentcolorspace eq{ pop }{ setcolorspace }ifelse }def /updatecolorrendering { currentcolorrendering/RenderingIntent known{ currentcolorrendering/RenderingIntent get }{null}ifelse Intent ne { Intent /ColorRendering {findresource} stopped { pop pop systemdict /findcolorrendering known { Intent findcolorrendering pop /ColorRendering findresource true } {false} ifelse } {true} ifelse { dup begin currentdict /TransformPQR known { currentdict /TransformPQR get aload pop 3 {{} eq 3 1 roll} repeat or or } {true} ifelse currentdict /MatrixPQR known { currentdict /MatrixPQR get aload pop 1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq and and and and and and and and } {true} ifelse end or { clonedict begin /TransformPQR [ {4 -1 roll 3 get dup 3 1 roll sub 5 -1 roll 3 get 3 -1 roll sub div 3 -1 roll 3 get 3 -1 roll 3 get dup 4 1 roll sub mul add} bind {4 -1 roll 4 get dup 3 1 roll sub 5 -1 roll 4 get 3 -1 roll sub div 3 -1 roll 4 get 3 -1 roll 4 get dup 4 1 roll sub mul add} bind {4 -1 roll 5 get dup 3 1 roll sub 5 -1 roll 5 get 3 -1 roll sub div 3 -1 roll 5 get 3 -1 roll 5 get dup 4 1 roll sub mul add} bind ] def /MatrixPQR [ 0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ] def /RangePQR [-0.3227950745 2.3229645538 -1.5003771057 3.5003465881 -0.1369979095 2.136967392] def currentdict end } if setcolorrendering_opt } if }if } def /set_crd { AGMCORE_host_sep not level2 and{ currentdict /ColorRendering known{ ColorRendering /ColorRendering {findresource} stopped not {setcolorrendering_opt} if }{ currentdict/Intent known{ updatecolorrendering }if }ifelse currentcolorspace dup type /arraytype eq {0 get}if /DeviceRGB eq { currentdict/UCR known {/UCR}{/AGMCORE_currentucr}ifelse load setundercolorremoval currentdict/BG known {/BG}{/AGMCORE_currentbg}ifelse load setblackgeneration }if }if }def /setcolorrendering_opt { dup currentcolorrendering eq{ pop }{ clonedict begin /Intent Intent def currentdict end setcolorrendering }ifelse }def /cpaint_gcomp { convert_to_process //Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf //Adobe_AGM_Core/AGMCORE_ConvertToProcess get not { (%end_cpaint_gcomp) flushinput }if }def /cpaint_gsep { //Adobe_AGM_Core/AGMCORE_ConvertToProcess get { (%end_cpaint_gsep) flushinput }if }def /cpaint_gend { newpath }def /set_spot_alias_ary { dup inherit_aliases //Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf }def /set_spot_normalization_ary { dup inherit_aliases dup length /AGMCORE_SpotAliasAry where{pop AGMCORE_SpotAliasAry length add} if array //Adobe_AGM_Core/AGMCORE_SpotAliasAry2 xddf /AGMCORE_SpotAliasAry where{ pop AGMCORE_SpotAliasAry2 0 AGMCORE_SpotAliasAry putinterval AGMCORE_SpotAliasAry length }{0} ifelse AGMCORE_SpotAliasAry2 3 1 roll exch putinterval true set_spot_alias }def /inherit_aliases { {dup /Name get map_alias {/CSD put}{pop} ifelse} forall }def /set_spot_alias { /AGMCORE_SpotAliasAry2 where{ /AGMCORE_current_spot_alias 3 -1 roll put }{ pop }ifelse }def /current_spot_alias { /AGMCORE_SpotAliasAry2 where{ /AGMCORE_current_spot_alias get }{ false }ifelse }def /map_alias { /AGMCORE_SpotAliasAry2 where{ begin /AGMCORE_name xdf false AGMCORE_SpotAliasAry2{ dup/Name get AGMCORE_name eq{ /CSD get /CSD get_res exch pop true exit }{ pop }ifelse }forall end }{ pop false }ifelse }bdf /spot_alias { true set_spot_alias /AGMCORE_&setcustomcolor AGMCORE_key_known not { //Adobe_AGM_Core/AGMCORE_&setcustomcolor /setcustomcolor load put } if /customcolor_tint 1 AGMCORE_gput //Adobe_AGM_Core begin /setcustomcolor { currentdict/TintProc known currentdict/CSA known and 3 1 roll //Adobe_AGM_Core begin dup /customcolor_tint exch AGMCORE_gput 1 index aload pop pop 1 eq exch 1 eq and exch 1 eq and exch 1 eq and not current_spot_alias and{1 index 4 get map_alias}{false}ifelse { false set_spot_alias 4 -1 roll{ exch pop /sep_tint AGMCORE_gget exch }if mark 3 1 roll setsepcolorspace counttomark 0 ne{ setsepcolor }if pop pop true set_spot_alias }{ AGMCORE_&setcustomcolor pop }ifelse end }bdf end }def /begin_feature { Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put {Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if }def /end_feature { 2 dict begin /spd /setpagedevice load def /setpagedevice { get_gstate spd set_gstate } def stopped{$error/newerror false put}if end count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse {Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if }def /set_negative { //Adobe_AGM_Core begin /AGMCORE_inverting exch def level2{ currentpagedevice/NegativePrint known{ currentpagedevice/NegativePrint get //Adobe_AGM_Core/AGMCORE_inverting get ne{ true begin_feature true{ << /NegativePrint //Adobe_AGM_Core/AGMCORE_inverting get >> setpagedevice }end_feature }if /AGMCORE_inverting false def }if }if AGMCORE_inverting{ [{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer gsave newpath clippath 1 /setseparationgray where{pop setseparationgray}{setgray}ifelse /AGMIRS_&fill where {pop AGMIRS_&fill}{fill} ifelse grestore }if end }def /lw_save_restore_override { /md where { pop md begin initializepage /initializepage{}def /pmSVsetup{} def /endp{}def /pse{}def /psb{}def /orig_showpage where {pop} {/orig_showpage /showpage load def} ifelse /showpage {orig_showpage gR} def end }if }def /pscript_showpage_override { /NTPSOct95 where { begin showpage save /showpage /restore load def /restore {exch pop}def end }if }def /driver_media_override { /md where { pop md /initializepage known { md /initializepage {} put } if md /rC known { md /rC {4{pop}repeat} put } if }if /mysetup where { /mysetup [1 0 0 1 0 0] put }if Adobe_AGM_Core /AGMCORE_Default_CTM matrix currentmatrix put level2 {Adobe_AGM_Core /AGMCORE_Default_PageSize currentpagedevice/PageSize get put}if }def /driver_check_media_override { /PrepsDict where {pop} { Adobe_AGM_Core /AGMCORE_Default_CTM get matrix currentmatrix ne Adobe_AGM_Core /AGMCORE_Default_PageSize get type /arraytype eq { Adobe_AGM_Core /AGMCORE_Default_PageSize get 0 get currentpagedevice/PageSize get 0 get eq and Adobe_AGM_Core /AGMCORE_Default_PageSize get 1 get currentpagedevice/PageSize get 1 get eq and }if { Adobe_AGM_Core /AGMCORE_Default_CTM get setmatrix }if }ifelse }def AGMCORE_err_strings begin /AGMCORE_bad_environ (Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. ) def /AGMCORE_color_space_onhost_seps (This job contains colors that will not separate with on-host methods. ) def /AGMCORE_invalid_color_space (This job contains an invalid color space. ) def end /set_def_ht { AGMCORE_def_ht sethalftone } def end systemdict /setpacking known { setpacking } if %%EndResource %%BeginResource: procset Adobe_CoolType_Core 2.25 0 %%Copyright: Copyright 1997-2005 Adobe Systems Incorporated. All Rights Reserved. %%Version: 2.25 0 10 dict begin /Adobe_CoolType_Passthru currentdict def /Adobe_CoolType_Core_Defined userdict /Adobe_CoolType_Core known def Adobe_CoolType_Core_Defined { /Adobe_CoolType_Core userdict /Adobe_CoolType_Core get def } if userdict /Adobe_CoolType_Core 60 dict dup begin put /Adobe_CoolType_Version 2.25 def /Level2? systemdict /languagelevel known dup { pop systemdict /languagelevel get 2 ge } if def Level2? not { /currentglobal false def /setglobal /pop load def /gcheck { pop false } bind def /currentpacking false def /setpacking /pop load def /SharedFontDirectory 0 dict def } if currentpacking true setpacking currentglobal false setglobal userdict /Adobe_CoolType_Data 2 copy known not { 2 copy 10 dict put } if get begin /@opStackCountByLevel 32 dict def /@opStackLevel 0 def /@dictStackCountByLevel 32 dict def /@dictStackLevel 0 def end setglobal /@_SaveStackLevels { Adobe_CoolType_Data begin /@vmState currentglobal def false setglobal @opStackCountByLevel @opStackLevel 2 copy known not { 2 copy 3 dict dup /args 7 index 5 add array put put get } { get dup /args get dup length 3 index lt { dup length 5 add array exch 1 index exch 0 exch putinterval 1 index exch /args exch put } { pop } ifelse } ifelse begin count 1 sub 1 index lt { pop count } if dup /argCount exch def dup 0 gt { args exch 0 exch getinterval astore pop } { pop } ifelse count /restCount exch def end /@opStackLevel @opStackLevel 1 add def countdictstack 1 sub @dictStackCountByLevel exch @dictStackLevel exch put /@dictStackLevel @dictStackLevel 1 add def @vmState setglobal end } bind def /@_RestoreStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def @opStackCountByLevel @opStackLevel get begin count restCount sub dup 0 gt { { pop } repeat } { pop } ifelse args 0 argCount getinterval {} forall end /@dictStackLevel @dictStackLevel 1 sub def @dictStackCountByLevel @dictStackLevel get end countdictstack exch sub dup 0 gt { { end } repeat } { pop } ifelse } bind def /@_PopStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def /@dictStackLevel @dictStackLevel 1 sub def end } bind def /@Raise { exch cvx exch errordict exch get exec stop } bind def /@ReRaise { cvx $error /errorname get errordict exch get exec stop } bind def /@Stopped { 0 @#Stopped } bind def /@#Stopped { @_SaveStackLevels stopped { @_RestoreStackLevels true } { @_PopStackLevels false } ifelse } bind def /@Arg { Adobe_CoolType_Data begin @opStackCountByLevel @opStackLevel 1 sub get begin args exch argCount 1 sub exch sub get end end } bind def currentglobal true setglobal /CTHasResourceForAllBug Level2? { 1 dict dup /@shouldNotDisappearDictValue true def Adobe_CoolType_Data exch /@shouldNotDisappearDict exch put begin count @_SaveStackLevels { (*) { pop stop } 128 string /Category resourceforall } stopped pop @_RestoreStackLevels currentdict Adobe_CoolType_Data /@shouldNotDisappearDict get ne dup { /@shouldNotDisappearDictValue known { { end currentdict 1 index eq { pop exit } if } loop } if } if end } { false } ifelse def true setglobal /CTHasResourceStatusBug Level2? { mark { /steveamerige /Category resourcestatus } stopped { cleartomark true } { cleartomark currentglobal not } ifelse } { false } ifelse def setglobal /CTResourceStatus { mark 3 1 roll /Category findresource begin ({ResourceStatus} stopped) 0 () /SubFileDecode filter cvx exec { cleartomark false } { { 3 2 roll pop true } { cleartomark false } ifelse } ifelse end } bind def /CTWorkAroundBugs { Level2? { /cid_PreLoad /ProcSet resourcestatus { pop pop currentglobal mark { (*) { dup /CMap CTHasResourceStatusBug { CTResourceStatus } { resourcestatus } ifelse { pop dup 0 eq exch 1 eq or { dup /CMap findresource gcheck setglobal /CMap undefineresource } { pop CTHasResourceForAllBug { exit } { stop } ifelse } ifelse } { pop } ifelse } 128 string /CMap resourceforall } stopped { cleartomark } stopped pop setglobal } if } if } bind def /doc_setup { Adobe_CoolType_Core begin CTWorkAroundBugs /mov /moveto load def /nfnt /newencodedfont load def /mfnt /makefont load def /sfnt /setfont load def /ufnt /undefinefont load def /chp /charpath load def /awsh /awidthshow load def /wsh /widthshow load def /ash /ashow load def /sh /show load def end currentglobal false setglobal userdict /Adobe_CoolType_Data 2 copy known not { 2 copy 10 dict put } if get begin /AddWidths? false def /CC 0 def /charcode 2 string def /@opStackCountByLevel 32 dict def /@opStackLevel 0 def /@dictStackCountByLevel 32 dict def /@dictStackLevel 0 def /InVMFontsByCMap 10 dict def /InVMDeepCopiedFonts 10 dict def end setglobal } bind def /doc_trailer { currentdict Adobe_CoolType_Core eq { end } if } bind def /page_setup { Adobe_CoolType_Core begin } bind def /page_trailer { end } bind def /unload { systemdict /languagelevel known { systemdict/languagelevel get 2 ge { userdict/Adobe_CoolType_Core 2 copy known { undef } { pop pop } ifelse } if } if } bind def /ndf { 1 index where { pop pop pop } { dup xcheck { bind } if def } ifelse } def /findfont systemdict begin userdict begin /globaldict where { /globaldict get begin } if dup where pop exch get /globaldict where { pop end } if end end Adobe_CoolType_Core_Defined { /systemfindfont exch def } { /findfont 1 index def /systemfindfont exch def } ifelse /undefinefont { pop } ndf /copyfont { currentglobal 3 1 roll 1 index gcheck setglobal dup null eq { 0 } { dup length } ifelse 2 index length add 1 add dict begin exch { 1 index /FID eq { pop pop } { def } ifelse } forall dup null eq { pop } { { def } forall } ifelse currentdict end exch setglobal } bind def /copyarray { currentglobal exch dup gcheck setglobal dup length array copy exch setglobal } bind def /newencodedfont { currentglobal { SharedFontDirectory 3 index known { SharedFontDirectory 3 index get /FontReferenced known } { false } ifelse } { FontDirectory 3 index known { FontDirectory 3 index get /FontReferenced known } { SharedFontDirectory 3 index known { SharedFontDirectory 3 index get /FontReferenced known } { false } ifelse } ifelse } ifelse dup { 3 index findfont /FontReferenced get 2 index dup type /nametype eq {findfont} if ne { pop false } if } if { pop 1 index findfont /Encoding get exch 0 1 255 { 2 copy get 3 index 3 1 roll put } for pop pop pop } { dup type /nametype eq { findfont } if dup dup maxlength 2 add dict begin exch { 1 index /FID ne {def} {pop pop} ifelse } forall /FontReferenced exch def /Encoding exch dup length array copy def /FontName 1 index dup type /stringtype eq { cvn } if def dup currentdict end definefont def } ifelse } bind def /SetSubstituteStrategy { $SubstituteFont begin dup type /dicttype ne { 0 dict } if currentdict /$Strategies known { exch $Strategies exch 2 copy known { get 2 copy maxlength exch maxlength add dict begin { def } forall { def } forall currentdict dup /$Init known { dup /$Init get exec } if end /$Strategy exch def } { pop pop pop } ifelse } { pop pop } ifelse end } bind def /scff { $SubstituteFont begin dup type /stringtype eq { dup length exch } { null } ifelse /$sname exch def /$slen exch def /$inVMIndex $sname null eq { 1 index $str cvs dup length $slen sub $slen getinterval cvn } { $sname } ifelse def end { findfont } @Stopped { dup length 8 add string exch 1 index 0 (BadFont:) putinterval 1 index exch 8 exch dup length string cvs putinterval cvn { findfont } @Stopped { pop /Courier findfont } if } if $SubstituteFont begin /$sname null def /$slen 0 def /$inVMIndex null def end } bind def /isWidthsOnlyFont { dup /WidthsOnly known { pop pop true } { dup /FDepVector known { /FDepVector get { isWidthsOnlyFont dup { exit } if } forall } { dup /FDArray known { /FDArray get { isWidthsOnlyFont dup { exit } if } forall } { pop } ifelse } ifelse } ifelse } bind def /?str1 256 string def /?set { $SubstituteFont begin /$substituteFound false def /$fontname 4 index def /$doSmartSub false def end 3 index currentglobal false setglobal exch /CompatibleFonts /ProcSet resourcestatus { pop pop /CompatibleFonts /ProcSet findresource begin dup /CompatibleFont currentexception 1 index /CompatibleFont true setexception 1 index /Font resourcestatus { pop pop 3 2 roll setglobal end exch dup findfont /CompatibleFonts /ProcSet findresource begin 3 1 roll exch /CompatibleFont exch setexception end } { 3 2 roll setglobal 1 index exch /CompatibleFont exch setexception end findfont $SubstituteFont /$substituteFound true put } ifelse } { exch setglobal findfont } ifelse $SubstituteFont begin $substituteFound { false (%%[Using embedded font ) print 5 index ?str1 cvs print ( to avoid the font substitution problem noted earlier.]%%\n) print } { dup /FontName known { dup /FontName get $fontname eq 1 index /DistillerFauxFont known not and /currentdistillerparams where { pop false 2 index isWidthsOnlyFont not and } if } { false } ifelse } ifelse exch pop /$doSmartSub true def end { exch pop exch pop exch 2 dict dup /Found 3 index put exch findfont exch } { exch exec exch dup findfont dup /FontType get 3 eq { exch ?str1 cvs dup length 1 sub -1 0 { exch dup 2 index get 42 eq { exch 0 exch getinterval cvn 4 1 roll 3 2 roll pop exit } {exch pop} ifelse }for } { exch pop } ifelse 2 dict dup /Downloaded 6 5 roll put } ifelse dup /FontName 4 index put copyfont definefont pop } bind def /?str2 256 string def /?add { 1 index type /integertype eq { exch true 4 2 } { false 3 1 } ifelse roll 1 index findfont dup /Widths known { Adobe_CoolType_Data /AddWidths? true put gsave dup 1000 scalefont setfont } if /Downloaded known { exec exch { exch ?str2 cvs exch findfont /Downloaded get 1 dict begin /Downloaded 1 index def ?str1 cvs length ?str1 1 index 1 add 3 index putinterval exch length 1 add 1 index add ?str1 2 index (*) putinterval ?str1 0 2 index getinterval cvn findfont ?str1 3 index (+) putinterval 2 dict dup /FontName ?str1 0 6 index getinterval cvn put dup /Downloaded Downloaded put end copyfont dup /FontName get exch definefont pop pop pop } { pop } ifelse } { pop exch { findfont dup /Found get dup length exch ?str1 cvs pop ?str1 1 index (+) putinterval ?str1 1 index 1 add 4 index ?str2 cvs putinterval ?str1 exch 0 exch 5 4 roll ?str2 cvs length 1 add add getinterval cvn 1 dict exch 1 index exch /FontName exch put copyfont dup /FontName get exch definefont pop } { pop } ifelse } ifelse Adobe_CoolType_Data /AddWidths? get { grestore Adobe_CoolType_Data /AddWidths? false put } if } bind def /?sh { currentfont /Downloaded known { exch } if pop } bind def /?chp { currentfont /Downloaded known { pop } { false chp } ifelse } bind def /?mv { currentfont /Downloaded known { moveto pop pop } { pop pop moveto } ifelse } bind def setpacking userdict /$SubstituteFont 25 dict put 1 dict begin /SubstituteFont dup $error exch 2 copy known { get } { pop pop { pop /Courier } bind } ifelse def /currentdistillerparams where dup { pop pop currentdistillerparams /CannotEmbedFontPolicy 2 copy known { get /Error eq } { pop pop false } ifelse } if not { countdictstack array dictstack 0 get begin userdict begin $SubstituteFont begin /$str 128 string def /$fontpat 128 string def /$slen 0 def /$sname null def /$match false def /$fontname null def /$substituteFound false def /$inVMIndex null def /$doSmartSub true def /$depth 0 def /$fontname null def /$italicangle 26.5 def /$dstack null def /$Strategies 10 dict dup begin /$Type3Underprint { currentglobal exch false setglobal 11 dict begin /UseFont exch $WMode 0 ne { dup length dict copy dup /WMode $WMode put /UseFont exch definefont } if def /FontName $fontname dup type /stringtype eq { cvn } if def /FontType 3 def /FontMatrix [ .001 0 0 .001 0 0 ] def /Encoding 256 array dup 0 1 255 { /.notdef put dup } for pop def /FontBBox [ 0 0 0 0 ] def /CCInfo 7 dict dup begin /cc null def /x 0 def /y 0 def end def /BuildChar { exch begin CCInfo begin 1 string dup 0 3 index put exch pop /cc exch def UseFont 1000 scalefont setfont cc stringwidth /y exch def /x exch def x y setcharwidth $SubstituteFont /$Strategy get /$Underprint get exec 0 0 moveto cc show x y moveto end end } bind def currentdict end exch setglobal } bind def /$GetaTint 2 dict dup begin /$BuildFont { dup /WMode known { dup /WMode get } { 0 } ifelse /$WMode exch def $fontname exch dup /FontName known { dup /FontName get dup type /stringtype eq { cvn } if } { /unnamedfont } ifelse exch Adobe_CoolType_Data /InVMDeepCopiedFonts get 1 index /FontName get known { pop Adobe_CoolType_Data /InVMDeepCopiedFonts get 1 index get null copyfont } { $deepcopyfont } ifelse exch 1 index exch /FontBasedOn exch put dup /FontName $fontname dup type /stringtype eq { cvn } if put definefont Adobe_CoolType_Data /InVMDeepCopiedFonts get begin dup /FontBasedOn get 1 index def end } bind def /$Underprint { gsave x abs y abs gt { /y 1000 def } { /x -1000 def 500 120 translate } ifelse Level2? { [ /Separation (All) /DeviceCMYK { 0 0 0 1 pop } ] setcolorspace } { 0 setgray } ifelse 10 setlinewidth x .8 mul [ 7 3 ] { y mul 8 div 120 sub x 10 div exch moveto 0 y 4 div neg rlineto dup 0 rlineto 0 y 4 div rlineto closepath gsave Level2? { .2 setcolor } { .8 setgray } ifelse fill grestore stroke } forall pop grestore } bind def end def /$Oblique 1 dict dup begin /$BuildFont { currentglobal exch dup gcheck setglobal null copyfont begin /FontBasedOn currentdict /FontName known { FontName dup type /stringtype eq { cvn } if } { /unnamedfont } ifelse def /FontName $fontname dup type /stringtype eq { cvn } if def /currentdistillerparams where { pop } { /FontInfo currentdict /FontInfo known { FontInfo null copyfont } { 2 dict } ifelse dup begin /ItalicAngle $italicangle def /FontMatrix FontMatrix [ 1 0 ItalicAngle dup sin exch cos div 1 0 0 ] matrix concatmatrix readonly end 4 2 roll def def } ifelse FontName currentdict end definefont exch setglobal } bind def end def /$None 1 dict dup begin /$BuildFont {} bind def end def end def /$Oblique SetSubstituteStrategy /$findfontByEnum { dup type /stringtype eq { cvn } if dup /$fontname exch def $sname null eq { $str cvs dup length $slen sub $slen getinterval } { pop $sname } ifelse $fontpat dup 0 (fonts/*) putinterval exch 7 exch putinterval /$match false def $SubstituteFont /$dstack countdictstack array dictstack put mark { $fontpat 0 $slen 7 add getinterval { /$match exch def exit } $str filenameforall } stopped { cleardictstack currentdict true $SubstituteFont /$dstack get { exch { 1 index eq { pop false } { true } ifelse } { begin false } ifelse } forall pop } if cleartomark /$slen 0 def $match false ne { $match (fonts/) anchorsearch pop pop cvn } { /Courier } ifelse } bind def /$ROS 1 dict dup begin /Adobe 4 dict dup begin /Japan1 [ /Ryumin-Light /HeiseiMin-W3 /GothicBBB-Medium /HeiseiKakuGo-W5 /HeiseiMaruGo-W4 /Jun101-Light ] def /Korea1 [ /HYSMyeongJo-Medium /HYGoThic-Medium ] def /GB1 [ /STSong-Light /STHeiti-Regular ] def /CNS1 [ /MKai-Medium /MHei-Medium ] def end def end def /$cmapname null def /$deepcopyfont { dup /FontType get 0 eq { 1 dict dup /FontName /copied put copyfont begin /FDepVector FDepVector copyarray 0 1 2 index length 1 sub { 2 copy get $deepcopyfont dup /FontName /copied put /copied exch definefont 3 copy put pop pop } for def currentdict end } { $Strategies /$Type3Underprint get exec } ifelse } bind def /$buildfontname { dup /CIDFont findresource /CIDSystemInfo get begin Registry length Ordering length Supplement 8 string cvs 3 copy length 2 add add add string dup 5 1 roll dup 0 Registry putinterval dup 4 index (-) putinterval dup 4 index 1 add Ordering putinterval 4 2 roll add 1 add 2 copy (-) putinterval end 1 add 2 copy 0 exch getinterval $cmapname $fontpat cvs exch anchorsearch { pop pop 3 2 roll putinterval cvn /$cmapname exch def } { pop pop pop pop pop } ifelse length $str 1 index (-) putinterval 1 add $str 1 index $cmapname $fontpat cvs putinterval $cmapname length add $str exch 0 exch getinterval cvn } bind def /$findfontByROS { /$fontname exch def $ROS Registry 2 copy known { get Ordering 2 copy known { get } { pop pop [] } ifelse } { pop pop [] } ifelse false exch { dup /CIDFont resourcestatus { pop pop save 1 index /CIDFont findresource dup /WidthsOnly known { dup /WidthsOnly get } { false } ifelse exch pop exch restore { pop } { exch pop true exit } ifelse } { pop } ifelse } forall { $str cvs $buildfontname } { false (*) { save exch dup /CIDFont findresource dup /WidthsOnly known { dup /WidthsOnly get not } { true } ifelse exch /CIDSystemInfo get dup /Registry get Registry eq exch /Ordering get Ordering eq and and { exch restore exch pop true exit } { pop restore } ifelse } $str /CIDFont resourceforall { $buildfontname } { $fontname $findfontByEnum } ifelse } ifelse } bind def end end currentdict /$error known currentdict /languagelevel known and dup { pop $error /SubstituteFont known } if dup { $error } { Adobe_CoolType_Core } ifelse begin { /SubstituteFont /CMap /Category resourcestatus { pop pop { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and { $sname null eq { dup $str cvs dup length $slen sub $slen getinterval cvn } { $sname } ifelse Adobe_CoolType_Data /InVMFontsByCMap get 1 index 2 copy known { get false exch { pop currentglobal { GlobalFontDirectory 1 index known { exch pop true exit } { pop } ifelse } { FontDirectory 1 index known { exch pop true exit } { GlobalFontDirectory 1 index known { exch pop true exit } { pop } ifelse } ifelse } ifelse } forall } { pop pop false } ifelse { exch pop exch pop } { dup /CMap resourcestatus { pop pop dup /$cmapname exch def /CMap findresource /CIDSystemInfo get { def } forall $findfontByROS } { 128 string cvs dup (-) search { 3 1 roll search { 3 1 roll pop { dup cvi } stopped { pop pop pop pop pop $findfontByEnum } { 4 2 roll pop pop exch length exch 2 index length 2 index sub exch 1 sub -1 0 { $str cvs dup length 4 index 0 4 index 4 3 roll add getinterval exch 1 index exch 3 index exch putinterval dup /CMap resourcestatus { pop pop 4 1 roll pop pop pop dup /$cmapname exch def /CMap findresource /CIDSystemInfo get { def } forall $findfontByROS true exit } { pop } ifelse } for dup type /booleantype eq { pop } { pop pop pop $findfontByEnum } ifelse } ifelse } { pop pop pop $findfontByEnum } ifelse } { pop pop $findfontByEnum } ifelse } ifelse } ifelse } { //SubstituteFont exec } ifelse /$slen 0 def end } } { { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and { $findfontByEnum } { //SubstituteFont exec } ifelse end } } ifelse bind readonly def Adobe_CoolType_Core /scfindfont /systemfindfont load put } { /scfindfont { $SubstituteFont begin dup systemfindfont dup /FontName known { dup /FontName get dup 3 index ne } { /noname true } ifelse dup { /$origfontnamefound 2 index def /$origfontname 4 index def /$substituteFound true def } if exch pop { $slen 0 gt $sname null ne 3 index length $slen gt or and { pop dup $findfontByEnum findfont dup maxlength 1 add dict begin { 1 index /FID eq { pop pop } { def } ifelse } forall currentdict end definefont dup /FontName known { dup /FontName get } { null } ifelse $origfontnamefound ne { $origfontname $str cvs print ( substitution revised, using ) print dup /FontName known { dup /FontName get } { (unspecified font) } ifelse $str cvs print (.\n) print } if } { exch pop } ifelse } { exch pop } ifelse end } bind def } ifelse end end Adobe_CoolType_Core_Defined not { Adobe_CoolType_Core /findfont { $SubstituteFont begin $depth 0 eq { /$fontname 1 index dup type /stringtype ne { $str cvs } if def /$substituteFound false def } if /$depth $depth 1 add def end scfindfont $SubstituteFont begin /$depth $depth 1 sub def $substituteFound $depth 0 eq and { $inVMIndex null ne { dup $inVMIndex $AddInVMFont } if $doSmartSub { currentdict /$Strategy known { $Strategy /$BuildFont get exec } if } if } if end } bind put } if } if end /$AddInVMFont { exch /FontName 2 copy known { get 1 dict dup begin exch 1 index gcheck def end exch Adobe_CoolType_Data /InVMFontsByCMap get exch $DictAdd } { pop pop pop } ifelse } bind def /$DictAdd { 2 copy known not { 2 copy 4 index length dict put } if Level2? not { 2 copy get dup maxlength exch length 4 index length add lt 2 copy get dup length 4 index length add exch maxlength 1 index lt { 2 mul dict begin 2 copy get { forall } def 2 copy currentdict put end } { pop } ifelse } if get begin { def } forall end } bind def end end %%EndResource %%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.21 0 %%Copyright: Copyright 1987-2005 Adobe Systems Incorporated. %%Version: 1.21 0 systemdict /languagelevel known dup { currentglobal false setglobal } { false } ifelse exch userdict /Adobe_CoolType_Utility 2 copy known { 2 copy get dup maxlength 27 add dict copy } { 27 dict } ifelse put Adobe_CoolType_Utility begin /@eexecStartData def /@recognizeCIDFont null def /ct_Level2? exch def /ct_Clone? 1183615869 internaldict dup /CCRun known not exch /eCCRun known not ct_Level2? and or def ct_Level2? { globaldict begin currentglobal true setglobal } if /ct_AddStdCIDMap ct_Level2? { { mark Adobe_CoolType_Utility /@recognizeCIDFont currentdict put { ((Hex) 57 StartData 0615 1e27 2c39 1c60 d8a8 cc31 fe2b f6e0 7aa3 e541 e21c 60d8 a8c9 c3d0 6d9e 1c60 d8a8 c9c2 02d7 9a1c 60d8 a849 1c60 d8a8 cc36 74f4 1144 b13b 77) 0 () /SubFileDecode filter cvx exec } stopped { cleartomark Adobe_CoolType_Utility /@recognizeCIDFont get countdictstack dup array dictstack exch 1 sub -1 0 { 2 copy get 3 index eq { 1 index length exch sub 1 sub { end } repeat exit } { pop } ifelse } for pop pop Adobe_CoolType_Utility /@eexecStartData get eexec } { cleartomark } ifelse } } { { Adobe_CoolType_Utility /@eexecStartData get eexec } } ifelse bind def userdict /cid_extensions known dup { cid_extensions /cid_UpdateDB known and } if { cid_extensions begin /cid_GetCIDSystemInfo { 1 index type /stringtype eq { exch cvn exch } if cid_extensions begin dup load 2 index known { 2 copy cid_GetStatusInfo dup null ne { 1 index load 3 index get dup null eq { pop pop cid_UpdateDB } { exch 1 index /Created get eq { exch pop exch pop } { pop cid_UpdateDB } ifelse } ifelse } { pop cid_UpdateDB } ifelse } { cid_UpdateDB } ifelse end } bind def end } if ct_Level2? { end setglobal } if /ct_UseNativeCapability? systemdict /composefont known def /ct_MakeOCF 35 dict def /ct_Vars 25 dict def /ct_GlyphDirProcs 6 dict def /ct_BuildCharDict 15 dict dup begin /charcode 2 string def /dst_string 1500 string def /nullstring () def /usewidths? true def end def ct_Level2? { setglobal } { pop } ifelse ct_GlyphDirProcs begin /GetGlyphDirectory { systemdict /languagelevel known { pop /CIDFont findresource /GlyphDirectory get } { 1 index /CIDFont findresource /GlyphDirectory get dup type /dicttype eq { dup dup maxlength exch length sub 2 index lt { dup length 2 index add dict copy 2 index /CIDFont findresource/GlyphDirectory 2 index put } if } if exch pop exch pop } ifelse + } def /+ { systemdict /languagelevel known { currentglobal false setglobal 3 dict begin /vm exch def } { 1 dict begin } ifelse /$ exch def systemdict /languagelevel known { vm setglobal /gvm currentglobal def $ gcheck setglobal } if ? { $ begin } if } def /? { $ type /dicttype eq } def /| { userdict /Adobe_CoolType_Data known { Adobe_CoolType_Data /AddWidths? known { currentdict Adobe_CoolType_Data begin begin AddWidths? { Adobe_CoolType_Data /CC 3 index put ? { def } { $ 3 1 roll put } ifelse CC charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore currentfont /Widths get exch CC exch put } { ? { def } { $ 3 1 roll put } ifelse } ifelse end end } { ? { def } { $ 3 1 roll put } ifelse } ifelse } { ? { def } { $ 3 1 roll put } ifelse } ifelse } def /! { ? { end } if systemdict /languagelevel known { gvm setglobal } if end } def /: { string currentfile exch readstring pop } executeonly def end ct_MakeOCF begin /ct_cHexEncoding [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF] def /ct_CID_STR_SIZE 8000 def /ct_mkocfStr100 100 string def /ct_defaultFontMtx [.001 0 0 .001 0 0] def /ct_1000Mtx [1000 0 0 1000 0 0] def /ct_raise {exch cvx exch errordict exch get exec stop} bind def /ct_reraise { cvx $error /errorname get (Error: ) print dup ( ) cvs print errordict exch get exec stop } bind def /ct_cvnsi { 1 index add 1 sub 1 exch 0 4 1 roll { 2 index exch get exch 8 bitshift add } for exch pop } bind def /ct_GetInterval { Adobe_CoolType_Utility /ct_BuildCharDict get begin /dst_index 0 def dup dst_string length gt { dup string /dst_string exch def } if 1 index ct_CID_STR_SIZE idiv /arrayIndex exch def 2 index arrayIndex get 2 index arrayIndex ct_CID_STR_SIZE mul sub { dup 3 index add 2 index length le { 2 index getinterval dst_string dst_index 2 index putinterval length dst_index add /dst_index exch def exit } { 1 index length 1 index sub dup 4 1 roll getinterval dst_string dst_index 2 index putinterval pop dup dst_index add /dst_index exch def sub /arrayIndex arrayIndex 1 add def 2 index dup length arrayIndex gt { arrayIndex get } { pop exit } ifelse 0 } ifelse } loop pop pop pop dst_string 0 dst_index getinterval end } bind def ct_Level2? { /ct_resourcestatus currentglobal mark true setglobal { /unknowninstancename /Category resourcestatus } stopped { cleartomark setglobal true } { cleartomark currentglobal not exch setglobal } ifelse { { mark 3 1 roll /Category findresource begin ct_Vars /vm currentglobal put ({ResourceStatus} stopped) 0 () /SubFileDecode filter cvx exec { cleartomark false } { { 3 2 roll pop true } { cleartomark false } ifelse } ifelse ct_Vars /vm get setglobal end } } { { resourcestatus } } ifelse bind def /CIDFont /Category ct_resourcestatus { pop pop } { currentglobal true setglobal /Generic /Category findresource dup length dict copy dup /InstanceType /dicttype put /CIDFont exch /Category defineresource pop setglobal } ifelse ct_UseNativeCapability? { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Identity) def /Supplement 0 def end def /CMapName /Identity-H def /CMapVersion 1.000 def /CMapType 1 def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } if } { /ct_Category 2 dict begin /CIDFont 10 dict def /ProcSet 2 dict def currentdict end def /defineresource { ct_Category 1 index 2 copy known { get dup dup maxlength exch length eq { dup length 10 add dict copy ct_Category 2 index 2 index put } if 3 index 3 index put pop exch pop } { pop pop /defineresource /undefined ct_raise } ifelse } bind def /findresource { ct_Category 1 index 2 copy known { get 2 index 2 copy known { get 3 1 roll pop pop} { pop pop /findresource /undefinedresource ct_raise } ifelse } { pop pop /findresource /undefined ct_raise } ifelse } bind def /resourcestatus { ct_Category 1 index 2 copy known { get 2 index known exch pop exch pop { 0 -1 true } { false } ifelse } { pop pop /findresource /undefined ct_raise } ifelse } bind def /ct_resourcestatus /resourcestatus load def } ifelse /ct_CIDInit 2 dict begin /ct_cidfont_stream_init { { dup (Binary) eq { pop null currentfile ct_Level2? { { cid_BYTE_COUNT () /SubFileDecode filter } stopped { pop pop pop } if } if /readstring load exit } if dup (Hex) eq { pop currentfile ct_Level2? { { null exch /ASCIIHexDecode filter /readstring } stopped { pop exch pop (>) exch /readhexstring } if } { (>) exch /readhexstring } ifelse load exit } if /StartData /typecheck ct_raise } loop cid_BYTE_COUNT ct_CID_STR_SIZE le { 2 copy cid_BYTE_COUNT string exch exec pop 1 array dup 3 -1 roll 0 exch put } { cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi dup array exch 2 sub 0 exch 1 exch { 2 copy 5 index ct_CID_STR_SIZE string 6 index exec pop put pop } for 2 index cid_BYTE_COUNT ct_CID_STR_SIZE mod string 3 index exec pop 1 index exch 1 index length 1 sub exch put } ifelse cid_CIDFONT exch /GlyphData exch put 2 index null eq { pop pop pop } { pop /readstring load 1 string exch { 3 copy exec pop dup length 0 eq { pop pop pop pop pop true exit } if 4 index eq { pop pop pop pop false exit } if } loop pop } ifelse } bind def /StartData { mark { currentdict dup /FDArray get 0 get /FontMatrix get 0 get 0.001 eq { dup /CDevProc known not { /CDevProc 1183615869 internaldict /stdCDevProc 2 copy known { get } { pop pop { pop pop pop pop pop 0 -1000 7 index 2 div 880 } } ifelse def } if } { /CDevProc { pop pop pop pop pop 0 1 cid_temp /cid_CIDFONT get /FDArray get 0 get /FontMatrix get 0 get div 7 index 2 div 1 index 0.88 mul } def } ifelse /cid_temp 15 dict def cid_temp begin /cid_CIDFONT exch def 3 copy pop dup /cid_BYTE_COUNT exch def 0 gt { ct_cidfont_stream_init FDArray { /Private get dup /SubrMapOffset known { begin /Subrs SubrCount array def Subrs SubrMapOffset SubrCount SDBytes ct_Level2? { currentdict dup /SubrMapOffset undef dup /SubrCount undef /SDBytes undef } if end /cid_SD_BYTES exch def /cid_SUBR_COUNT exch def /cid_SUBR_MAP_OFFSET exch def /cid_SUBRS exch def cid_SUBR_COUNT 0 gt { GlyphData cid_SUBR_MAP_OFFSET cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi 0 1 cid_SUBR_COUNT 1 sub { exch 1 index 1 add cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add GlyphData exch cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi cid_SUBRS 4 2 roll GlyphData exch 4 index 1 index sub ct_GetInterval dup length string copy put } for pop } if } { pop } ifelse } forall } if cleartomark pop pop end CIDFontName currentdict /CIDFont defineresource pop end end } stopped { cleartomark /StartData ct_reraise } if } bind def currentdict end def /ct_saveCIDInit { /CIDInit /ProcSet ct_resourcestatus { true } { /CIDInitC /ProcSet ct_resourcestatus } ifelse { pop pop /CIDInit /ProcSet findresource ct_UseNativeCapability? { pop null } { /CIDInit ct_CIDInit /ProcSet defineresource pop } ifelse } { /CIDInit ct_CIDInit /ProcSet defineresource pop null } ifelse ct_Vars exch /ct_oldCIDInit exch put } bind def /ct_restoreCIDInit { ct_Vars /ct_oldCIDInit get dup null ne { /CIDInit exch /ProcSet defineresource pop } { pop } ifelse } bind def /ct_BuildCharSetUp { 1 index begin CIDFont begin Adobe_CoolType_Utility /ct_BuildCharDict get begin /ct_dfCharCode exch def /ct_dfDict exch def CIDFirstByte ct_dfCharCode add dup CIDCount ge { pop 0 } if /cid exch def { GlyphDirectory cid 2 copy known { get } { pop pop nullstring } ifelse dup length FDBytes sub 0 gt { dup FDBytes 0 ne { 0 FDBytes ct_cvnsi } { pop 0 } ifelse /fdIndex exch def dup length FDBytes sub FDBytes exch getinterval /charstring exch def exit } { pop cid 0 eq { /charstring nullstring def exit } if /cid 0 def } ifelse } loop } def /ct_SetCacheDevice { 0 0 moveto dup stringwidth 3 -1 roll true charpath pathbbox 0 -1000 7 index 2 div 880 setcachedevice2 0 0 moveto } def /ct_CloneSetCacheProc { 1 eq { stringwidth pop -2 div -880 0 -1000 setcharwidth moveto } { usewidths? { currentfont /Widths get cid 2 copy known { get exch pop aload pop } { pop pop stringwidth } ifelse } { stringwidth } ifelse setcharwidth 0 0 moveto } ifelse } def /ct_Type3ShowCharString { ct_FDDict fdIndex 2 copy known { get } { currentglobal 3 1 roll 1 index gcheck setglobal ct_Type1FontTemplate dup maxlength dict copy begin FDArray fdIndex get dup /FontMatrix 2 copy known { get } { pop pop ct_defaultFontMtx } ifelse /FontMatrix exch dup length array copy def /Private get /Private exch def /Widths rootfont /Widths get def /CharStrings 1 dict dup /.notdef dup length string copy put def currentdict end /ct_Type1Font exch definefont dup 5 1 roll put setglobal } ifelse dup /CharStrings get 1 index /Encoding get ct_dfCharCode get charstring put rootfont /WMode 2 copy known { get } { pop pop 0 } ifelse exch 1000 scalefont setfont ct_str1 0 ct_dfCharCode put ct_str1 exch ct_dfSetCacheProc ct_SyntheticBold { currentpoint ct_str1 show newpath moveto ct_str1 true charpath ct_StrokeWidth setlinewidth stroke } { ct_str1 show } ifelse } def /ct_Type4ShowCharString { ct_dfDict ct_dfCharCode charstring FDArray fdIndex get dup /FontMatrix get dup ct_defaultFontMtx ct_matrixeq not { ct_1000Mtx matrix concatmatrix concat } { pop } ifelse /Private get Adobe_CoolType_Utility /ct_Level2? get not { ct_dfDict /Private 3 -1 roll { put } 1183615869 internaldict /superexec get exec } if 1183615869 internaldict Adobe_CoolType_Utility /ct_Level2? get { 1 index } { 3 index /Private get mark 6 1 roll } ifelse dup /RunInt known { /RunInt get } { pop /CCRun } ifelse get exec Adobe_CoolType_Utility /ct_Level2? get not { cleartomark } if } bind def /ct_BuildCharIncremental { { Adobe_CoolType_Utility /ct_MakeOCF get begin ct_BuildCharSetUp ct_ShowCharString } stopped { stop } if end end end end } bind def /BaseFontNameStr (BF00) def /ct_Type1FontTemplate 14 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] def /FontBBox [-250 -250 1250 1250] def /Encoding ct_cHexEncoding def /PaintType 0 def currentdict end def /BaseFontTemplate 11 dict begin /FontMatrix [0.001 0 0 0.001 0 0] def /FontBBox [-250 -250 1250 1250] def /Encoding ct_cHexEncoding def /BuildChar /ct_BuildCharIncremental load def ct_Clone? { /FontType 3 def /ct_ShowCharString /ct_Type3ShowCharString load def /ct_dfSetCacheProc /ct_CloneSetCacheProc load def /ct_SyntheticBold false def /ct_StrokeWidth 1 def } { /FontType 4 def /Private 1 dict dup /lenIV 4 put def /CharStrings 1 dict dup /.notdef put def /PaintType 0 def /ct_ShowCharString /ct_Type4ShowCharString load def } ifelse /ct_str1 1 string def currentdict end def /BaseFontDictSize BaseFontTemplate length 5 add def /ct_matrixeq { true 0 1 5 { dup 4 index exch get exch 3 index exch get eq and dup not { exit } if } for exch pop exch pop } bind def /ct_makeocf { 15 dict begin exch /WMode exch def exch /FontName exch def /FontType 0 def /FMapType 2 def dup /FontMatrix known { dup /FontMatrix get /FontMatrix exch def } { /FontMatrix matrix def } ifelse /bfCount 1 index /CIDCount get 256 idiv 1 add dup 256 gt { pop 256} if def /Encoding 256 array 0 1 bfCount 1 sub { 2 copy dup put pop } for bfCount 1 255 { 2 copy bfCount put pop } for def /FDepVector bfCount dup 256 lt { 1 add } if array def BaseFontTemplate BaseFontDictSize dict copy begin /CIDFont exch def CIDFont /FontBBox known { CIDFont /FontBBox get /FontBBox exch def } if CIDFont /CDevProc known { CIDFont /CDevProc get /CDevProc exch def } if currentdict end BaseFontNameStr 3 (0) putinterval 0 1 bfCount dup 256 eq { 1 sub } if { FDepVector exch 2 index BaseFontDictSize dict copy begin dup /CIDFirstByte exch 256 mul def FontType 3 eq { /ct_FDDict 2 dict def } if currentdict end 1 index 16 BaseFontNameStr 2 2 getinterval cvrs pop BaseFontNameStr exch definefont put } for ct_Clone? { /Widths 1 index /CIDFont get /GlyphDirectory get length dict def } if FontName currentdict end definefont ct_Clone? { gsave dup 1000 scalefont setfont ct_BuildCharDict begin /usewidths? false def currentfont /Widths get begin exch /CIDFont get /GlyphDirectory get { pop dup charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore def } forall end /usewidths? true def end grestore } { exch pop } ifelse } bind def /ct_ComposeFont { ct_UseNativeCapability? { 2 index /CMap ct_resourcestatus { pop pop exch pop } { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CMapName 3 index def /CMapVersion 1.000 def /CMapType 1 def exch /WMode exch def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-) search { pop pop (-) search { dup length string copy exch pop exch pop } { pop (Identity)} ifelse } { pop (Identity) } ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } ifelse composefont } { 3 2 roll pop 0 get /CIDFont findresource ct_makeocf } ifelse } bind def /ct_MakeIdentity { ct_UseNativeCapability? { 1 index /CMap ct_resourcestatus { pop pop } { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CMapName 2 index def /CMapVersion 1.000 def /CMapType 1 def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-) search { pop pop (-) search { dup length string copy exch pop exch pop } { pop (Identity) } ifelse } { pop (Identity) } ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } ifelse composefont } { exch pop 0 get /CIDFont findresource ct_makeocf } ifelse } bind def currentdict readonly pop end end %%EndResource %%BeginResource: procset Adobe_CoolType_Utility_T42 1.0 0 %%Copyright: Copyright 1987-2004 Adobe Systems Incorporated. %%Version: 1.0 0 userdict /ct_T42Dict 15 dict put ct_T42Dict begin /Is2015? { version cvi 2015 ge } bind def /AllocGlyphStorage { Is2015? { pop } { {string} forall } ifelse } bind def /Type42DictBegin { 25 dict begin /FontName exch def /CharStrings 256 dict begin /.notdef 0 def currentdict end def /Encoding exch def /PaintType 0 def /FontType 42 def /FontMatrix [1 0 0 1 0 0] def 4 array astore cvx /FontBBox exch def /sfnts } bind def /Type42DictEnd { currentdict dup /FontName get exch definefont end ct_T42Dict exch dup /FontName get exch put } bind def /RD {string currentfile exch readstring pop} executeonly def /PrepFor2015 { Is2015? { /GlyphDirectory 16 dict def sfnts 0 get dup 2 index (glyx) putinterval 2 index (locx) putinterval pop pop } { pop pop } ifelse } bind def /AddT42Char { Is2015? { /GlyphDirectory get begin def end pop pop } { /sfnts get 4 index get 3 index 2 index putinterval pop pop pop pop } ifelse } bind def /T0AddT42Mtx2 { /CIDFont findresource /Metrics2 get begin def end }bind def end %%EndResource Adobe_CoolType_Core begin /$Oblique SetSubstituteStrategy end %%BeginResource: procset Adobe_AGM_Image 1.0 0 %%Version: 1.0 0 %%Copyright: Copyright (C) 2000-2003 Adobe Systems, Inc. All Rights Reserved. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Image 75 dict dup begin put /Adobe_AGM_Image_Id /Adobe_AGM_Image_1.0_0 def /nd{ null def }bind def /AGMIMG_&image nd /AGMIMG_&colorimage nd /AGMIMG_&imagemask nd /AGMIMG_mbuf () def /AGMIMG_ybuf () def /AGMIMG_kbuf () def /AGMIMG_c 0 def /AGMIMG_m 0 def /AGMIMG_y 0 def /AGMIMG_k 0 def /AGMIMG_tmp nd /AGMIMG_imagestring0 nd /AGMIMG_imagestring1 nd /AGMIMG_imagestring2 nd /AGMIMG_imagestring3 nd /AGMIMG_imagestring4 nd /AGMIMG_imagestring5 nd /AGMIMG_cnt nd /AGMIMG_fsave nd /AGMIMG_colorAry nd /AGMIMG_override nd /AGMIMG_name nd /AGMIMG_maskSource nd /AGMIMG_flushfilters nd /invert_image_samples nd /knockout_image_samples nd /img nd /sepimg nd /devnimg nd /idximg nd /doc_setup { Adobe_AGM_Core begin Adobe_AGM_Image begin /AGMIMG_&image systemdict/image get def /AGMIMG_&imagemask systemdict/imagemask get def /colorimage where{ pop /AGMIMG_&colorimage /colorimage ldf }if end end }def /page_setup { Adobe_AGM_Image begin /AGMIMG_ccimage_exists {/customcolorimage where { pop /Adobe_AGM_OnHost_Seps where { pop false }{ /Adobe_AGM_InRip_Seps where { pop false }{ true }ifelse }ifelse }{ false }ifelse }bdf level2{ /invert_image_samples { Adobe_AGM_Image/AGMIMG_tmp Decode length ddf /Decode [ Decode 1 get Decode 0 get] def }def /knockout_image_samples { Operator/imagemask ne{ /Decode [1 1] def }if }def }{ /invert_image_samples { {1 exch sub} currenttransfer addprocs settransfer }def /knockout_image_samples { { pop 1 } currenttransfer addprocs settransfer }def }ifelse /img /imageormask ldf /sepimg /sep_imageormask ldf /devnimg /devn_imageormask ldf /idximg /indexed_imageormask ldf /_ctype 7 def currentdict{ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and{ bind }if def }forall }def /page_trailer { end }def /doc_trailer { }def /AGMIMG_flushfilters { dup type /arraytype ne {1 array astore}if aload length { dup type /filetype eq { dup status 1 index currentfile ne and {dup flushfile closefile} {pop} ifelse }{pop}ifelse } repeat }def /imageormask_sys { begin save mark level2{ currentdict Operator /imagemask eq{ AGMIMG_&imagemask }{ use_mask { level3 {process_mask_L3 AGMIMG_&image}{masked_image_simulation}ifelse }{ AGMIMG_&image }ifelse }ifelse }{ Width Height Operator /imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and ImageMatrix /DataSource load AGMIMG_&imagemask }{ BitsPerComponent ImageMatrix /DataSource load AGMIMG_&image }ifelse }ifelse currentdict /_Filters known {_Filters AGMIMG_flushfilters} if cleartomark restore end }def /overprint_plate { currentoverprint { 0 get dup type /nametype eq { dup /DeviceGray eq{ pop AGMCORE_black_plate not }{ /DeviceCMYK eq{ AGMCORE_is_cmyk_sep not }if }ifelse }{ false exch { AGMOHS_sepink eq or } forall not } ifelse }{ pop false }ifelse }def /process_mask_L3 { dup begin /ImageType 1 def end 4 dict begin /DataDict exch def /ImageType 3 def /InterleaveType 3 def /MaskDict 9 dict begin /ImageType 1 def /Width DataDict dup /MaskWidth known {/MaskWidth}{/Width} ifelse get def /Height DataDict dup /MaskHeight known {/MaskHeight}{/Height} ifelse get def /ImageMatrix [Width 0 0 Height neg 0 Height] def /NComponents 1 def /BitsPerComponent 1 def /Decode [0 1] def /DataSource AGMIMG_maskSource def currentdict end def currentdict end }def /use_mask { dup type /dicttype eq { dup /Mask known { dup /Mask get { level3 {true} { dup /MaskWidth known {dup /MaskWidth get 1 index /Width get eq}{true}ifelse exch dup /MaskHeight known {dup /MaskHeight get 1 index /Height get eq}{true}ifelse 3 -1 roll and } ifelse } {false} ifelse } {false} ifelse } {false} ifelse }def /make_line_source { begin MultipleDataSources { [ Decode length 2 div cvi {Width string} repeat ] }{ Width Decode length 2 div mul cvi string }ifelse end }def /datasource_to_str { exch dup type dup /filetype eq { pop exch readstring }{ /arraytype eq { exec exch copy }{ pop }ifelse }ifelse pop }def /masked_image_simulation { 3 dict begin dup make_line_source /line_source xdf /mask_source AGMIMG_maskSource /LZWDecode filter def dup /Width get 8 div ceiling cvi string /mask_str xdf begin gsave 0 1 translate 1 -1 Height div scale 1 1 Height { pop gsave MultipleDataSources { 0 1 DataSource length 1 sub { dup DataSource exch get exch line_source exch get datasource_to_str } for }{ DataSource line_source datasource_to_str } ifelse << /PatternType 1 /PaintProc [ /pop cvx << /ImageType 1 /Width Width /Height 1 /ImageMatrix Width 1.0 sub 1 matrix scale 0.5 0 matrix translate matrix concatmatrix /MultipleDataSources MultipleDataSources /DataSource line_source /BitsPerComponent BitsPerComponent /Decode Decode >> /image cvx ] cvx /BBox [0 0 Width 1] /XStep Width /YStep 1 /PaintType 1 /TilingType 2 >> matrix makepattern set_pattern << /ImageType 1 /Width Width /Height 1 /ImageMatrix Width 1 matrix scale /MultipleDataSources false /DataSource mask_source mask_str readstring pop /BitsPerComponent 1 /Decode [0 1] >> imagemask grestore 0 1 translate } for grestore end end }def /imageormask { begin SkipImageProc { currentdict consumeimagedata } { save mark level2 AGMCORE_host_sep not and{ currentdict Operator /imagemask eq DeviceN_PS2 not and { imagemask }{ AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get /DeviceGray eq and{ [/Separation /Black /DeviceGray {}] setcolorspace /Decode [ Decode 1 get Decode 0 get ] def }if use_mask { level3 {process_mask_L3 image}{masked_image_simulation}ifelse }{ DeviceN_NoneName DeviceN_PS2 Indexed_DeviceN level3 not and or or AGMCORE_in_rip_sep and { Names convert_to_process not { 2 dict begin /imageDict xdf /names_index 0 def gsave imageDict write_image_file { Names { dup (None) ne { [/Separation 3 -1 roll /DeviceGray {1 exch sub}] setcolorspace Operator imageDict read_image_file names_index 0 eq {true setoverprint} if /names_index names_index 1 add def }{ pop } ifelse } forall close_image_file } if grestore end }{ Operator /imagemask eq { imagemask }{ image } ifelse } ifelse }{ Operator /imagemask eq { imagemask }{ image } ifelse } ifelse }ifelse }ifelse }{ Width Height Operator /imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and ImageMatrix /DataSource load /Adobe_AGM_OnHost_Seps where { pop imagemask }{ currentgray 1 ne{ currentdict imageormask_sys }{ currentoverprint not{ 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentdict ignoreimagedata }ifelse }ifelse }ifelse }{ BitsPerComponent ImageMatrix MultipleDataSources{ 0 1 NComponents 1 sub{ DataSource exch get }for }{ /DataSource load }ifelse Operator /colorimage eq{ AGMCORE_host_sep{ MultipleDataSources level2 or NComponents 4 eq and{ AGMCORE_is_cmyk_sep{ MultipleDataSources{ /DataSource [ DataSource 0 get /exec cvx DataSource 1 get /exec cvx DataSource 2 get /exec cvx DataSource 3 get /exec cvx /AGMCORE_get_ink_data cvx ] cvx def }{ /DataSource Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul /DataSource load filter_cmyk 0 () /SubFileDecode filter def }ifelse /Decode [ Decode 0 get Decode 1 get ] def /MultipleDataSources false def /NComponents 1 def /Operator /image def invert_image_samples 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentoverprint not Operator/imagemask eq and{ 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentdict ignoreimagedata }ifelse }ifelse }{ MultipleDataSources NComponents AGMIMG_&colorimage }ifelse }{ true NComponents colorimage }ifelse }{ Operator /image eq{ AGMCORE_host_sep{ /DoImage true def HostSepColorImage{ invert_image_samples }{ AGMCORE_black_plate not Operator/imagemask ne and{ /DoImage false def currentdict ignoreimagedata }if }ifelse 1 AGMCORE_&setgray DoImage {currentdict imageormask_sys} if }{ use_mask { level3 {process_mask_L3 image}{masked_image_simulation}ifelse }{ image }ifelse }ifelse }{ Operator/knockout eq{ pop pop pop pop pop currentcolorspace overprint_plate not{ knockout_unitsq }if }if }ifelse }ifelse }ifelse }ifelse cleartomark restore }ifelse currentdict /_Filters known {_Filters AGMIMG_flushfilters} if end }def /sep_imageormask { /sep_colorspace_dict AGMCORE_gget begin CSA map_csa begin SkipImageProc { currentdict consumeimagedata } { save mark AGMCORE_avoid_L2_sep_space{ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def }if AGMIMG_ccimage_exists MappedCSA 0 get /DeviceCMYK eq and currentdict/Components known and Name () ne and Name (All) ne and Operator /image eq and AGMCORE_producing_seps not and level2 not and { Width Height BitsPerComponent ImageMatrix [ /DataSource load /exec cvx { 0 1 2 index length 1 sub{ 1 index exch 2 copy get 255 xor put }for } /exec cvx ] cvx bind MappedCSA 0 get /DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub }ifelse Name findcmykcustomcolor customcolorimage }{ AGMCORE_producing_seps not{ level2{ AGMCORE_avoid_L2_sep_space not currentcolorspace 0 get /Separation ne and{ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt /sep_tint AGMCORE_gget setcolor }if currentdict imageormask }{ currentdict Operator /imagemask eq{ imageormask }{ sep_imageormask_lev1 }ifelse }ifelse }{ AGMCORE_host_sep{ Operator/knockout eq{ currentdict/ImageMatrix get concat knockout_unitsq }{ currentgray 1 ne{ AGMCORE_is_cmyk_sep Name (All) ne and{ level2{ Name AGMCORE_IsSeparationAProcessColor { Operator /imagemask eq{ /sep_tint AGMCORE_gget 1 exch sub AGMCORE_&setcolor }{ invert_image_samples }ifelse }{ [ /Separation Name [/DeviceGray] { sep_colorspace_proc AGMCORE_get_ink_data 1 exch sub } bind ] AGMCORE_&setcolorspace /sep_tint AGMCORE_gget AGMCORE_&setcolor }ifelse currentdict imageormask_sys }{ currentdict Operator /imagemask eq{ imageormask_sys }{ sep_image_lev1_sep }ifelse }ifelse }{ Operator/imagemask ne{ invert_image_samples }if currentdict imageormask_sys }ifelse }{ currentoverprint not Name (All) eq or Operator/imagemask eq and{ currentdict imageormask_sys }{ currentoverprint not { gsave knockout_unitsq grestore }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ currentcolorspace 0 get /Separation ne{ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt /sep_tint AGMCORE_gget setcolor }if currentoverprint MappedCSA 0 get /DeviceCMYK eq and Name AGMCORE_IsSeparationAProcessColor not and Name inRip_spot_has_ink not and Name (All) ne and { imageormask_l2_overprint }{ currentdict imageormask }ifelse }ifelse }ifelse }ifelse cleartomark restore }ifelse currentdict /_Filters known {_Filters AGMIMG_flushfilters} if end end }def /decode_image_sample { 4 1 roll exch dup 5 1 roll sub 2 4 -1 roll exp 1 sub div mul add } bdf /colorSpaceElemCnt { mark currentcolor counttomark dup 2 add 1 roll cleartomark } bdf /devn_sep_datasource { 1 dict begin /dataSource xdf [ 0 1 dataSource length 1 sub { dup currentdict /dataSource get /exch cvx /get cvx /exec cvx /exch cvx names_index /ne cvx [ /pop cvx ] cvx /if cvx } for ] cvx bind end } bdf /devn_alt_datasource { 11 dict begin /convProc xdf /origcolorSpaceElemCnt xdf /origMultipleDataSources xdf /origBitsPerComponent xdf /origDecode xdf /origDataSource xdf /dsCnt origMultipleDataSources {origDataSource length}{1}ifelse def /DataSource origMultipleDataSources { [ BitsPerComponent 8 idiv origDecode length 2 idiv mul string 0 1 origDecode length 2 idiv 1 sub { dup 7 mul 1 add index exch dup BitsPerComponent 8 idiv mul exch origDataSource exch get 0 () /SubFileDecode filter BitsPerComponent 8 idiv string /readstring cvx /pop cvx /putinterval cvx }for ]bind cvx }{origDataSource}ifelse 0 () /SubFileDecode filter def [ origcolorSpaceElemCnt string 0 2 origDecode length 2 sub { dup origDecode exch get dup 3 -1 roll 1 add origDecode exch get exch sub 2 BitsPerComponent exp 1 sub div 1 BitsPerComponent 8 idiv {DataSource /read cvx /not cvx{0}/if cvx /mul cvx}repeat /mul cvx /add cvx }for /convProc load /exec cvx origcolorSpaceElemCnt 1 sub -1 0 { /dup cvx 2 /add cvx /index cvx 3 1 /roll cvx /exch cvx 255 /mul cvx /cvi cvx /put cvx }for ]bind cvx 0 () /SubFileDecode filter end } bdf /devn_imageormask { /devicen_colorspace_dict AGMCORE_gget begin CSA map_csa 2 dict begin dup /srcDataStrs [ 3 -1 roll begin currentdict /MultipleDataSources known {MultipleDataSources {DataSource length}{1}ifelse}{1} ifelse { Width Decode length 2 div mul cvi { dup 65535 gt {1 add 2 div cvi}{exit}ifelse } loop string } repeat end ] def /dstDataStr srcDataStrs 0 get length string def begin SkipImageProc { currentdict consumeimagedata } { save mark AGMCORE_producing_seps not { level3 not { Operator /imagemask ne { /DataSource [ [ DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse colorSpaceElemCnt /devicen_colorspace_dict AGMCORE_gget /TintTransform get devn_alt_datasource 1 /string cvx /readstring cvx /pop cvx] cvx colorSpaceElemCnt 1 sub{dup}repeat] def /MultipleDataSources true def /Decode colorSpaceElemCnt [ exch {0 1} repeat ] def } if }if currentdict imageormask }{ AGMCORE_host_sep{ Names convert_to_process { CSA get_csa_by_name 0 get /DeviceCMYK eq { /DataSource Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse 4 /devicen_colorspace_dict AGMCORE_gget /TintTransform get devn_alt_datasource filter_cmyk 0 () /SubFileDecode filter def /MultipleDataSources false def /Decode [1 0] def /DeviceGray setcolorspace currentdict imageormask_sys }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate { /DataSource DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse CSA get_csa_by_name 0 get /DeviceRGB eq{3}{1}ifelse /devicen_colorspace_dict AGMCORE_gget /TintTransform get devn_alt_datasource /MultipleDataSources false def /Decode colorSpaceElemCnt [ exch {0 1} repeat ] def currentdict imageormask_sys } { gsave knockout_unitsq grestore currentdict consumeimagedata } ifelse } ifelse } { /devicen_colorspace_dict AGMCORE_gget /names_index known { Operator/imagemask ne{ MultipleDataSources { /DataSource [ DataSource devn_sep_datasource /exec cvx ] cvx def /MultipleDataSources false def }{ /DataSource /DataSource load dstDataStr srcDataStrs 0 get filter_devn def } ifelse invert_image_samples } if currentdict imageormask_sys }{ currentoverprint not Operator/imagemask eq and{ currentdict imageormask_sys }{ currentoverprint not { gsave knockout_unitsq grestore }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ currentdict imageormask }ifelse }ifelse cleartomark restore }ifelse currentdict /_Filters known {_Filters AGMIMG_flushfilters} if end end end }def /imageormask_l2_overprint { currentdict currentcmykcolor add add add 0 eq{ currentdict consumeimagedata }{ level3{ currentcmykcolor /AGMIMG_k xdf /AGMIMG_y xdf /AGMIMG_m xdf /AGMIMG_c xdf Operator/imagemask eq{ [/DeviceN [ AGMIMG_c 0 ne {/Cyan} if AGMIMG_m 0 ne {/Magenta} if AGMIMG_y 0 ne {/Yellow} if AGMIMG_k 0 ne {/Black} if ] /DeviceCMYK {}] setcolorspace AGMIMG_c 0 ne {AGMIMG_c} if AGMIMG_m 0 ne {AGMIMG_m} if AGMIMG_y 0 ne {AGMIMG_y} if AGMIMG_k 0 ne {AGMIMG_k} if setcolor }{ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def [/Indexed [ /DeviceN [ AGMIMG_c 0 ne {/Cyan} if AGMIMG_m 0 ne {/Magenta} if AGMIMG_y 0 ne {/Yellow} if AGMIMG_k 0 ne {/Black} if ] /DeviceCMYK { AGMIMG_k 0 eq {0} if AGMIMG_y 0 eq {0 exch} if AGMIMG_m 0 eq {0 3 1 roll} if AGMIMG_c 0 eq {0 4 1 roll} if } ] 255 { 255 div mark exch dup dup dup AGMIMG_k 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 1 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_y 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 2 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_m 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 3 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_c 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec pop pop pop counttomark 1 roll }{ pop }ifelse counttomark 1 add -1 roll pop } ] setcolorspace }ifelse imageormask_sys }{ write_image_file{ currentcmykcolor 0 ne{ [/Separation /Black /DeviceGray {}] setcolorspace gsave /Black [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 1 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Yellow /DeviceGray {}] setcolorspace gsave /Yellow [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 2 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Magenta /DeviceGray {}] setcolorspace gsave /Magenta [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 3 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Cyan /DeviceGray {}] setcolorspace gsave /Cyan [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore } if close_image_file }{ imageormask }ifelse }ifelse }ifelse } def /indexed_imageormask { begin save mark currentdict AGMCORE_host_sep{ Operator/knockout eq{ /indexed_colorspace_dict AGMCORE_gget dup /CSA known { /CSA get get_csa_by_name }{ /Names get } ifelse overprint_plate not{ knockout_unitsq }if }{ Indexed_DeviceN { /devicen_colorspace_dict AGMCORE_gget /names_index known { indexed_image_lev2_sep }{ currentoverprint not{ knockout_unitsq }if currentdict consumeimagedata } ifelse }{ AGMCORE_is_cmyk_sep{ Operator /imagemask eq{ imageormask_sys }{ level2{ indexed_image_lev2_sep }{ indexed_image_lev1_sep }ifelse }ifelse }{ currentoverprint not{ knockout_unitsq }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ level2{ Indexed_DeviceN { /indexed_colorspace_dict AGMCORE_gget begin }{ /indexed_colorspace_dict AGMCORE_gget begin CSA get_csa_by_name 0 get /DeviceCMYK eq ps_level 3 ge and ps_version 3015.007 lt and { [/Indexed [/DeviceN [/Cyan /Magenta /Yellow /Black] /DeviceCMYK {}] HiVal Lookup] setcolorspace } if end } ifelse imageormask Indexed_DeviceN { end } if }{ Operator /imagemask eq{ imageormask }{ indexed_imageormask_lev1 }ifelse }ifelse }ifelse cleartomark restore currentdict /_Filters known {_Filters AGMIMG_flushfilters} if end }def /indexed_image_lev2_sep { /indexed_colorspace_dict AGMCORE_gget begin begin Indexed_DeviceN not { currentcolorspace dup 1 /DeviceGray put dup 3 currentcolorspace 2 get 1 add string 0 1 2 3 AGMCORE_get_ink_data 4 currentcolorspace 3 get length 1 sub { dup 4 idiv exch currentcolorspace 3 get exch get 255 exch sub 2 index 3 1 roll put }for put setcolorspace } if currentdict Operator /imagemask eq{ AGMIMG_&imagemask }{ use_mask { level3 {process_mask_L3 AGMIMG_&image}{masked_image_simulation}ifelse }{ AGMIMG_&image }ifelse }ifelse end end }def /OPIimage { dup type /dicttype ne{ 10 dict begin /DataSource xdf /ImageMatrix xdf /BitsPerComponent xdf /Height xdf /Width xdf /ImageType 1 def /Decode [0 1 def] currentdict end }if dup begin /NComponents 1 cdndf /MultipleDataSources false cdndf /SkipImageProc {false} cdndf /HostSepColorImage false cdndf /Decode [ 0 currentcolorspace 0 get /Indexed eq{ 2 BitsPerComponent exp 1 sub }{ 1 }ifelse ] cdndf /Operator /image cdndf end /sep_colorspace_dict AGMCORE_gget null eq{ imageormask }{ gsave dup begin invert_image_samples end sep_imageormask grestore }ifelse }def /cachemask_level2 { 3 dict begin /LZWEncode filter /WriteFilter xdf /readBuffer 256 string def /ReadFilter currentfile 0 (%EndMask) /SubFileDecode filter /ASCII85Decode filter /RunLengthDecode filter def { ReadFilter readBuffer readstring exch WriteFilter exch writestring not {exit} if }loop WriteFilter closefile end }def /cachemask_level3 { currentfile << /Filter [ /SubFileDecode /ASCII85Decode /RunLengthDecode ] /DecodeParms [ << /EODCount 0 /EODString (%EndMask) >> null null ] /Intent 1 >> /ReusableStreamDecode filter }def /spot_alias { /mapto_sep_imageormask { dup type /dicttype ne{ 12 dict begin /ImageType 1 def /DataSource xdf /ImageMatrix xdf /BitsPerComponent xdf /Height xdf /Width xdf /MultipleDataSources false def }{ begin }ifelse /Decode [/customcolor_tint AGMCORE_gget 0] def /Operator /image def /HostSepColorImage false def /SkipImageProc {false} def currentdict end sep_imageormask }bdf /customcolorimage { Adobe_AGM_Image/AGMIMG_colorAry xddf /customcolor_tint AGMCORE_gget << /Name AGMIMG_colorAry 4 get /CSA [ /DeviceCMYK ] /TintMethod /Subtractive /TintProc null /MappedCSA null /NComponents 4 /Components [ AGMIMG_colorAry aload pop pop ] >> setsepcolorspace mapto_sep_imageormask }ndf Adobe_AGM_Image/AGMIMG_&customcolorimage /customcolorimage load put /customcolorimage { Adobe_AGM_Image/AGMIMG_override false put current_spot_alias{dup 4 get map_alias}{false}ifelse { false set_spot_alias /customcolor_tint AGMCORE_gget exch setsepcolorspace pop mapto_sep_imageormask true set_spot_alias }{ AGMIMG_&customcolorimage }ifelse }bdf }def /snap_to_device { 6 dict begin matrix currentmatrix dup 0 get 0 eq 1 index 3 get 0 eq and 1 index 1 get 0 eq 2 index 2 get 0 eq and or exch pop { 1 1 dtransform 0 gt exch 0 gt /AGMIMG_xSign? exch def /AGMIMG_ySign? exch def 0 0 transform AGMIMG_ySign? {floor 0.1 sub}{ceiling 0.1 add} ifelse exch AGMIMG_xSign? {floor 0.1 sub}{ceiling 0.1 add} ifelse exch itransform /AGMIMG_llY exch def /AGMIMG_llX exch def 1 1 transform AGMIMG_ySign? {ceiling 0.1 add}{floor 0.1 sub} ifelse exch AGMIMG_xSign? {ceiling 0.1 add}{floor 0.1 sub} ifelse exch itransform /AGMIMG_urY exch def /AGMIMG_urX exch def [AGMIMG_urX AGMIMG_llX sub 0 0 AGMIMG_urY AGMIMG_llY sub AGMIMG_llX AGMIMG_llY] concat }{ }ifelse end } def level2 not{ /colorbuf { 0 1 2 index length 1 sub{ dup 2 index exch get 255 exch sub 2 index 3 1 roll put }for }def /tint_image_to_color { begin Width Height BitsPerComponent ImageMatrix /DataSource load end Adobe_AGM_Image begin /AGMIMG_mbuf 0 string def /AGMIMG_ybuf 0 string def /AGMIMG_kbuf 0 string def { colorbuf dup length AGMIMG_mbuf length ne { dup length dup dup /AGMIMG_mbuf exch string def /AGMIMG_ybuf exch string def /AGMIMG_kbuf exch string def } if dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop } addprocs {AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf} true 4 colorimage end } def /sep_imageormask_lev1 { begin MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{ { 255 mul round cvi GrayLookup exch get } currenttransfer addprocs settransfer currentdict imageormask }{ /sep_colorspace_dict AGMCORE_gget/Components known{ MappedCSA 0 get /DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub }ifelse Adobe_AGM_Image/AGMIMG_k xddf Adobe_AGM_Image/AGMIMG_y xddf Adobe_AGM_Image/AGMIMG_m xddf Adobe_AGM_Image/AGMIMG_c xddf AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{ {AGMIMG_k mul 1 exch sub} currenttransfer addprocs settransfer currentdict imageormask }{ currentcolortransfer {AGMIMG_k mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_y mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_m mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_c mul 1 exch sub} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }ifelse }{ MappedCSA 0 get /DeviceGray eq { {255 mul round cvi ColorLookup exch get 0 get} currenttransfer addprocs settransfer currentdict imageormask }{ MappedCSA 0 get /DeviceCMYK eq { currentcolortransfer {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }{ currentcolortransfer {pop 1} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 2 get} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 1 get} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 0 get} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }ifelse }ifelse }ifelse }ifelse end }def /sep_image_lev1_sep { begin /sep_colorspace_dict AGMCORE_gget/Components known{ Components aload pop Adobe_AGM_Image/AGMIMG_k xddf Adobe_AGM_Image/AGMIMG_y xddf Adobe_AGM_Image/AGMIMG_m xddf Adobe_AGM_Image/AGMIMG_c xddf {AGMIMG_c mul 1 exch sub} {AGMIMG_m mul 1 exch sub} {AGMIMG_y mul 1 exch sub} {AGMIMG_k mul 1 exch sub} }{ {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} }ifelse AGMCORE_get_ink_data currenttransfer addprocs settransfer currentdict imageormask_sys end }def /indexed_imageormask_lev1 { /indexed_colorspace_dict AGMCORE_gget begin begin currentdict MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{ {HiVal mul round cvi GrayLookup exch get HiVal div} currenttransfer addprocs settransfer imageormask }{ MappedCSA 0 get /DeviceGray eq { {HiVal mul round cvi Lookup exch get HiVal div} currenttransfer addprocs settransfer imageormask }{ MappedCSA 0 get /DeviceCMYK eq { currentcolortransfer {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll setcolortransfer tint_image_to_color }{ currentcolortransfer {pop 1} exch addprocs 4 1 roll {3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div} exch addprocs 4 1 roll {3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div} exch addprocs 4 1 roll {3 mul HiVal mul round cvi Lookup exch get HiVal div} exch addprocs 4 1 roll setcolortransfer tint_image_to_color }ifelse }ifelse }ifelse end end }def /indexed_image_lev1_sep { /indexed_colorspace_dict AGMCORE_gget begin begin {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} AGMCORE_get_ink_data currenttransfer addprocs settransfer currentdict imageormask_sys end end }def }if end systemdict /setpacking known { setpacking } if %%EndResource currentdict Adobe_AGM_Utils eq {end} if %%EndProlog %%BeginSetup Adobe_AGM_Utils begin 2 2010 Adobe_AGM_Core/doc_setup get exec Adobe_CoolType_Core/doc_setup get exec Adobe_AGM_Image/doc_setup get exec currentdict Adobe_AGM_Utils eq {end} if %%EndSetup %%Page: (Page 1) 1 %%EndPageComments %%BeginPageSetup /currentdistillerparams where {pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse { userdict /AI11_PDFMark5 /cleartomark load put userdict /AI11_ReadMetadata_PDFMark5 {flushfile cleartomark } bind put} { userdict /AI11_PDFMark5 /pdfmark load put userdict /AI11_ReadMetadata_PDFMark5 {/PUT pdfmark} bind put } ifelse [/NamespacePush AI11_PDFMark5 [/_objdef {ai_metadata_stream_123} /type /stream /OBJ AI11_PDFMark5 [{ai_metadata_stream_123} currentfile 0 (% &&end XMP packet marker&&) /SubFileDecode filter AI11_ReadMetadata_PDFMark5 application/postscript flamerobin1.ai Adobe Illustrator CS2 2006-07-06T19:36:47+02:00 2006-07-06T19:36:47+02:00 2006-07-06T19:36:47+02:00 200 256 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADIAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq6orTv4Yqoahf W2n2Fzf3TcLa0ieed/BI1LsfuGKvmnV/+cy5yzLo/llVUfZmvLksTt3jjRaf8GcNJpjNx/zl7+Zk jkxWOkwpU0UQTsadqlpzjS0ti/5y7/M9Gq1npMg/la3nA/4WdTjS0yPS/wDnMvUVdRqvlmGVD9p7 W5aMj5LIklf+CxpaejeWP+cofys1pkhu7mfRbhzQLfx0jr/xliMiAe78caQ9T07U9N1O0S8026hv bSUVjuLeRZY2Hs6EqcConFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVK7u7WztpLq7mSC2hUv LNIwVFUdSWOwwSkALLPHjlOQjEXI9Hhvn7/nI5I2lsPJ8QkYVVtWnX4QelYYj19mf/gcwMurJ2j8 3uuyvY4mp6k/5g/Sf0D5ph/zjnfavrB8w63q15NfXUslvAs07lyoQSOyrU/CPjGwFMOj3kSeezj+ 2GLHh8LFjiIxAkdvgP0Mn/P3VTpn5Q+ZZ1NGmt1tAB1P1qVIG/4WQ5nh4p8GZJLsVdirsVdiqc+W POfmnytefXPL+pz6dMSC/pN8D06epG1Y3HsynFX0l+WX/OWGnX7xaZ54hXT7lqImrwAm3diafvo9 2i/1hVf9UYKQ+hLa5t7q3juLaVJ7eZQ8U0bB0dW3DKy1BB9sCqmKuxV2KuxV2KuxV2KuxV2KuxV2 KuxVK/MvmXR/LekTarq04gtYdvF3c/ZSNf2mbsP4ZXkyCAsuVotFk1OQY8YuR/FnyfKn5kfmrrvn S8aN2NposbVttOQ7bdHlI+2/4Dtmry5TM2X1jsbsLFoo2PVlPOX6u4MIyp3r6T/5xiVf8Iao1ByO oEE96CGOn682Gi5F8z9tj/hMP6n6SiP+cpXdfygvgpoHurVWHiPVB/WMzg8Y+J8KXYq7FXYq7FXY q7FXpn5Rfnn5j8gXaWshfUfLcj1udNZt46/akt2P2G78fst3p1AV9peWPNGheaNFg1nRLpbuwuB8 Ei1BVh9pHU7qy9wcCE1xV2KuxV2KuxV2KuxV2KuxV2KoLWtZ03RdKudU1KYQWVqheaQ+HYAd2Y7A DqcjOYiLLfptNPPkGOAuUnyH+Y35h6r501pru4LQ6fCSun2NarEh7mnV2/aP0dM0+TIZmy+w9j9k Y9Fi4RvM/VLv/YxLIO3dir6U/wCcYiP8IaoO/wCkDt/zwjzYaLkXzP22/wAZh/U/3xV/+cpY3b8o L9lFQl1as58B6oX9ZGZweMfE+FLsVdirsVdirsVdirsVeg/k1+beqfl75gEtWn0G9ZV1WxG9VGwl jr0kSv8AshsexAV90aXqmn6rp1tqWnTrc2N3Gs1vPGaq6MKgjAhFYq7FXYq7FXYq7FXYq7FXYq+W /wA8/wAy28ya0dG02UnQ9NcqWU/DcXC7NJ7qv2U+k981OozcZ25D8W+qezHYv5bF4sx+9mP9KO73 nr8nluUPVuxV2KvoP/nFy9DWHmCy/ailt5h7iRXU/d6eZui5n4fpfO/bjH68U+8SHyr9bMf+cgdN Oo/k/wCZIQKtFBHcggVI+rTJM3/Coc2AeEfB2SS7FXYq7FXYqmXl3y5rfmPV7fR9FtHvdRuSRFAl BsBUszMQqqBuSTQYq9lH/OH/AOYP1H1jqmmC74lvqvOalf5fU9Klae1K/fgtbeOeZfLOueWdZn0f W7R7PULY0kiehBB3DKwqrK3ZgaYVSvFX0T/zin+ab2WonyJqkv8AoV6Wl0Z2P93cfakh36LLuy/5 X+tgKl9VYENK6tXiQeJo1DWh8MVbxV2KuxV2KuxV2KvM/wA9/PreW/K/6OspOGrawGiiZescAoJZ PmQeK/OvbMTV5aHCOv3PT+y3ZX5nPxyH7vHv7z0H6T+18q5rX1h2KuxV2KvXP+catVFt52u7BjRd Qs34DxkhZXH/AAnPMnSyqfv/ALf0PH+2eDi0sZ/zJ/Ydvvp9F+YNJi1jQdS0ianpajazWklenGeM xnp/rZtHzB+b91bT2tzLa3CGO4gdopo26q6Hiyn5EZJKnirsVdirsVfS/wDzhnp2ntJ5n1EhW1GI WtuhNOSQyeo7U9naMV/1cBUvpzAh82f85l6dp31Ly1qVFXUTJcW4YD4ngCq9CfBH6f6xwhQ+X8KV Wzu7myu4Ly1kaG6tpFmgmQ0ZJI2DKwPiCK4q/Qn8t/OMHnHyTpXmCOgku4QLqMfsXEfwTL8g6mnt TIoeI/8AOTC+aPJnmbTfPHlfUbjTDqa/VNS9BiI3uIFrE0sZqj8oqr8QP2MIVKfJf/OX+r23C383 6Wl/ENjfWFIp6eLQufTc/JkGNJp7z5M/Nz8vvOARNF1eJrxx/wAc+c+jcg+Aiehb5pUYEMwxV2Ku xVqSRI42kkYIiAs7MaAAbkk4CaSASaD4y/MnzfL5r8332qkn6ry9CwQ/s28ZIT/gt3PuTmmyT4pW +1djdnjSaaOP+LnL+sef6vgxfIO0dirsVdiqe+Rtf/w/5v0nWCaR2lwpn/4xP8Ev/JNmyUZcJB7n A7U0n5jTTx9ZR29/Mfa+2FZWUMpDKwqrDcEHN2C+IEU+Hf8AnI/ye3lz80NQkjTjY6zTUrYgUXlM T6y16VEysaeBGFQ8vwq7FXYq7FWZflX+Z2r/AJe+ZP0tZRC6tp09G/sXYqs0Va7MAeLqRVWofuJw K+kl/wCcuvy0Nj6xs9TFzxr9U9GInl0pz9XjT3/2saQ+cfzY/NLV/wAw/MQ1K7jFrY2ymLTbBTyE UZNSWag5O5HxNTwHQYpYThV2Kvpv/nDnzWSuueVJn+zx1KzQnxpDP/zKwFS9U/5yA8tLr/5Ua5CF 5XFhENRtjSpDWp9R6DxMXNfpwIfCGSS2rMrBlJDA1BGxBGKvs/8A5xv0P8yLXy1+kvNmrXUtjeIP 0Vo93+8kji6iZ5JAZV5D7Edacd/CgKHseBXYq85/PnzW2heRZ7aB+N7q7fU4qGhEbCszf8B8P+yz E1c6jXe9J7LaDx9WJH6cfq+PT7d/g+T81r627FXYq7FXYq7FX1v+SPm5fMXka1SV+V/pQFldAmrE Rj905rv8UdN/EHNnpMlxrqPwHyH2m7P/AC+rkQPRk9Q+PMfP7KST/nJL8uX82+RmvrGLnrOgl7q2 AHxSQEf6REPcqoYe6075lh558TYUuxV2KuxV2KuxV2KuxV2KvSv+cdNafSvze0MhqRXzS2Uw8RNE wQf8jAhwKX3He2kN5Zz2k45Q3MbxSr4q6lWH3HAh+bN/Zy2V9cWU1PWtZXhkp05RsVP4jJJe9/8A OOX5EnWpoPOXme3/ANw8TB9JsJACLp1J/eyKf91KR8I/bP8Akj4gVfWIFNh0wIdirsVfLv8AzkX5 jbUvPA0tGrb6NCsQA6etMBJIfuKL9GarUzuZ8n1P2P0fh6XxDzyG/gNh+n5vK8x3rHYq7FXYq7FX Yqzn8oPPh8oea45bhiNJv6W+ojsqk/BL/wA82NflXLcWTglbofaHsr85pyI/3kN4/pHx++n14jo6 K6MGRgCrA1BB3BBGbgG3x8gg0Xxx/wA5G/kzL5V1mTzNosBPlvUpC0yICRaXDmrIabLE5NUPY/D4 VIV4phV2KuxV2KuxV2KuxV2Kp95Aujaee/Ll0CQYNTs5Nuvw3CHvir9Fcih8seTvyFm81fmx5n1b XYGh8qWGs3ojjJ4teOLh2WNSP91gEc2/2I3rxKX1LFFFDEkMKLHFGoSONAFVVUUCqBsABgQuxV2K qdzcRW1vLcTNxihRpJG8FQVJ+4YJSAFllCBlIRHMvhvW9Um1bWb7VJ/72+uJLhwTWhlctT6K0zSX e5fdtLgGHFHGOUYgfJA4G92KuxV2KuxV2KuxV9A/kH+aqSQw+UNalCyxgJo9y5ADKOluxPcf7r8R t2Fc3S569J+D557V9hEE6nENj9Y/336/m9r1TS9O1XTrjTdSt0urG6QxXFvKOSOjdQRmweDfHH50 /wDOPmseS5ptY0NJNQ8qsSzOPjmtP8mcAbp4SfQ1NqlLx3CrsVdirsVdirsVdiqb+TkZ/N2hogLM 2oWoVR1JMy0GKv0cyKHBQBQCg3O3idzirsVdirsVYZ+cer/ov8ttbmU0knhFolNifrLCJqf7Ficx 9VKoHzd37O6fxdbjHceL/S7vjzNU+yOxV2KuxV2KuxV2KuxVtWZWDKSrKaqw2II7jFBFvof8o/z0 gvI4NB81zCK9FI7TVJDRJuwSY/sv/lHZu+/XNwamtpfP9f63zrt/2XMCc2nFx6x7vd5eXT3cu2sq upVgGVhQg7gg5sHhnhv5m/8AOLXlvzBJLqflaVND1R6s9oVJspW/1V+KEnxSo/ycNq+ZvOf5Z+dv Jtw0Wv6XLbw8uMd6o9S2k8OEy1Sp/lPxeIwpYxirsVdirsVdirMfyd0w6n+aXle1pUDUYJ2Hitu3 rsP+BjwK/QLAh2KuxV2KuxV45/zk5qRh8p6Zp6tQ3d76jDuVgjao+XKRcwdbLkPx+N3s/YrDeonP +bD7z+x82ZgPpjsVdirsVdirsVdirsVdirsVel/l3+ePmHyssdhfg6roqUVIXak0K/8AFUhr8I/k bbwpl+LPKHmHmO1/ZjDqrnD93l7+h94/T976I8o/mH5S81whtHvle4ArJZS/u7hPGsZ6geK1Hvmw x54z5c3zntDsjUaQ/vI7d43j8/1sgnggnheGeNZYZAVkjcBlYHqCDsRlzrXkfnv/AJxj/L3zIJLj S4z5e1JqkS2ag27NTbnbEhKf8YyuG1fNH5ifkn578jO82o2n1vSQfg1a0rJBQnb1Ng0R/wBcUr0J xSwLCrsVdir3D/nEjy41/wDmHc6yyAwaLZuVfwnuv3SAfOP1cBUvsPAh2KuxV2KuxV88f85RXnPW NCs6/wBzbzTU/wCMzqv/ADKzW6yXrA8n0b2Hx1jyS75AfIfteIZiPcuxV2KuxV2KuxV2KuxV2Kux V2Kr4pZYZVlhdo5UIZJEJVlI6EEbg4sZRBFHcPSPKf5+eeNDKQ3so1qyWgMV2T6wA/lnHxV/1+WX w1E49bDzWv8AZTS57MB4cv6PL/S/qp7j5K/OTyZ5qZLaKc2GpvsLG6ojMf8Ait/sP8ga+2ZuPVRl sdi8L2l7O6nS+ojjh/Oj+kcx9zOJI45Y2jkUPG4KujAFWUihBB6g5kuheC/mv/zi3o2spNqvksR6 Xqu7vphPG0mPcJ/vlj2p8HsvXDavlXWdE1bRNSn0zVrSSyv7ZuM1vMvFlPb5g9QRscKUFir7X/5x i8lv5d/LeG/uU4X2vv8AXpKj4hBTjbr0G3D4x/rYCh65gV2KuxV2KuxV8v8A/OSc/qfmFClf7nT4 Y/vklf8A43zV6qVz9z6n7GxrRk98z9wDynMZ6x2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvUPy+/ PjzH5daOy1cvq+jig4yNW5iX/iuRj8QH8r/QRl+LUShtzDyva3sth1Nyx/u8n+xPvH6R9r6R8tea dD8y6Ymo6PdLc27bOBs8bUrwkQ7qw982WPLGYsPmut0OXTT4Mo4T9/uY7+aX5S+WvzC0k2+oJ9W1 SBT9Q1WNR6sTdQrfzxk/aQ/RQ75Y4j5b8q/kF5om/NWDyhrtqY7O2Iu9QvI+XoyWSN9qKSi/3p+B e4J3GxwpfbMMMUMSQxII4o1CRoooFVRQADwAwIXYq7FXYq7FXYq+U/8AnISR2/Mu7VjUJb26r7D0 w36zmo1H95L8dA+s+yIrQx/rS+95rlL0zsVdirsVdirsVdirsVdirsVdirsVdirsVdiqdeU/N+u+ VdVTUtHuDFKKCaI7xSpWpSRf2h+I7UOSjIxNjm4Ov7PxavHwZBY6d48w+sPy7/MXR/OukfWrWkF/ AAL+wY1eJj3HTkjfst/HNphzCY83yXtjsfJosnDLeB+mXf8At7wyygrWm/SuXuodirsVdirsVdir sVfKP/OQX/kzb3/jBbf8mhmn1H95L8dA+s+yX+Ix98vveb5U9M7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FU18s+ZdW8t6zb6vpUxiuoDuP2JEJ+KOQftK3cfxyUZEGw4mt0WPU4jjyC4n7PMeb7 C8jec9M83+X4NXsTxLfBdWxNWhmUDkjffUHuM22HKJxt8b7T7OyaPMcc/ge8d6f5a692KuxV2Kux V2Kvln/nIyH0/wAxmfiB6tnA9R3pySp/4HNTqR+8P46PqvsfK9F7py/Q8vyh6p2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxVnn5Pef5PKPmmM3EhGj6gVg1BCfhUE/BN84yd/8muW4cnBK+nV0 HtD2SNXpzwj95DeP6vj99ProEEAg1B3BGbh8fdirsVdirsVdir5t/wCcnbPh5u0u7Ap69gIz03MU zn59JBms1n1/D9b6X7E5L084907+YH6njeYr2jsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVfWf5F+bG1/yJbRTvzvdJP1KcnqUQAwsfnHQV8Qc2ekyXGu58i9qNB+X1ZI+nJ6h+n7XoeZTz rsVdirsVdirw3/nKPT+Wn6BqIH9zLPbsf+Mqo6/8mjmBrRuPi937D5anlh3iJ+Vj9L57zBfRHYq7 FXYq7FXYqn3lPydqXme6ktdPntopol5lLiQoSvQlVVXYgd6DNd2j2nj0kRKYkQe4f2OBru0IaaIl MSIPcGYv+QfmIRkpqNo0lNlPqgV+YU/qzRj2vwXvCdfD9bpx7UYb3hKvgx/Wfyq87aWjSvY/W4VF WktG9Wn+wFJP+FzZaX2h0mY1xcJ/pbfby+12Gn7c02U1xcJ/pbfs+1iTKyMUcFWU0ZTsQR1BGbsG 9w7YG1uKXYq7FXYq7FXYq7FXYq9d/wCca9cNn5yutKY0i1S2PEeMtuea/wDCGTMnSyqdd7x/tnpe PTRydYS+yW330+mc2j5g7FXYq7FXYq85/wCcgNKN/wDlreSqvJ9Pmhu1HfZvSY/QkpOYusFwvuP7 HpPZPP4euiP54Mf0/eHyfmsfW3Yq7FXYq7FXYqiNP1C8069hvrOVobq3YPFIvUEfwPQjvlebDDLA wmLjLm15cUckTGQuJfT/AJO8yweY/L9tqkQCSOOFzEP2Jl2dfl3HtnknaWhlpc0sZ6cvMdHzHtDR nT5jjPw9ydZgOGxfzf8Al55f8zRM1xF9X1Cn7u+hAElR05jo4+f0EZt+ze2c+lPpPFD+aeXw7nZ6 DtbNpjsbh/NPL9jwLzX5Q1jyzqH1TUI6xvU29ym8cqjup8R3B3GekdndpYtXDigd+o6h73Q6/HqY cUD7x1CR5nuc7FXYq7FXYq7FXYqyn8rtQOn/AJh+X7itAb2KFj4LOfRb8JMnjNSHvdV25h8TR5Y/ 0Cflv+h9m5unxV2KuxV2KuxVLvMekJrOgajpT0431tLBU9jIhUN9BNcryx4okOTo9QcOaGQfwyB+ T4dlikhleKRSkkbFHU9QymhGaYF90jIEWORWYsnYq7FXYq7FXYq9a/ILVXW91TSWYlJI0uo07Aow jc/TzX7s4z2w0/phl8+H9I+4vJ+1OD0wyefD+kfcXs+cI8a7FUs8w+XtM1/TJNO1GPnC+6ONnjcd HQ9mGZej1mTTZBkxmiPt8i5Ok1c8ExOB3+981+bfK2oeWtYl067HJR8dtOBRZYifhYfqI7HPVOzu 0IarEMkfiO4vpGg1sNTjE4/EdxSXM9zXYq7FXYq7FXYqmfld2TzLpLqaMt7blT4ESriXF1wvBP8A qS+59x5vXwp2KuxV2KuxV2KvkH86PL36E/MTVIkThb3rC+t/dbj4np8peYzT5ocMyH2L2b1fj6KB POPpPw/ZTB8qd67FXYq7FXYq7FXpX5D28j+arycA+nFZMrH/ACnlj4j/AIU5yvtdMDTxj1M/uBeb 9p5gYIjqZfoL3fPO3hXYq7FWLfmJ5Oi8zaBJCigajbVlsZD/ADgboT/K42+dD2zcdi9pnSZgT9Et pfr+DtOye0DpsoJ+g7S/X8HzS6OjsjqVdSVZWFCCNiCDnqoIIscn0kEEWFuFLsVdirsVdiqb+T4D cebdEgHWa/tYxT/KmUYRGzTh9oS4dPkPdCX3F9v5vHwx2KuxV2KuxV2KvGf+clvK7XmgWXmGBKy6 bJ6N0R/vicjix/1ZAB/sswdZDlL4Pa+xmu4M0sJ5TFj3j9n3Pm/MB9KdirsVdirsVdir3z8k/Lcm m+XZNTnXjPqrK6A9RBHURn/ZFmb5Uzzn2p1wy5xjjyx/7o8/0D5vBe0esGTMIDlD7zzei5y7zzsV dirsVfPv5zeWl0rzP9fgXja6qDNQdBMppKPpqG+ZOelezGuObT8Evqx7fDp+r4Pf+z2s8XBwH6ob fDp+pgGdI792KuxV2KuxVnP5KaW2ofmXoyhapbO91IfAQxsyn/g+IyzDG5gef3buh9pc/h6HJ/S9 PzP6n17m5fHnYq7FXYq7FXYqgtb0i01nR7zSrxeVtewvBL4gOKch7r1HvkMkBKJBb9NqJYckckfq ibfE2v6LeaHrV7pF4vG5spWhfagPE7MPZhRh7ZpiCNi+4aTUxz4o5I/TIWl+ByHYq7FXYqzL8r/J i+ZderdKTpliBLdj+ck/BFX/ACiN/YHNH2/2odLh9P8AeT2Hl3n4fe6btrtH8ti9P1y2H6S+jURE RURQqKAqqooABsAAM8uJJNl86JvcrsCuxV2KuxVgf50aSt75LlugtZdPljnUjrxY+m4+VHr9GdF7 Majw9WI9Jgj9P6He+zufg1Ij0mCP0vnrPTH0F2KuxV2KuxV7x/zjD5dYzav5ikX4VVbG2bxLESzf dRPvzM0cLkT3PA+22s2hhH9Y/cP0vfs2L587FXYq7FXYq7FXYq8L/wCckPIjTQw+b7GOrwBbfVFU b+nWkUv+xJ4N/sfDNfq8VHiHxe89ju1OEnTTPPePv6j9PzfPuYT6G7FXYq7FX0L+S2mJaeSornjS W/mkmcnrRWMSj5fBUfPPM/ajOZ6sx6QAH6f0vn3tFmM9SY9IgD9P6WeZzronYq7FXYq7FUm85W5u PKWswheTNZXHBfFhGxX8Rmd2ZPh1OM/04/e5nZ8+HUYz/Tj975Xz2B9SdirsVdiq+GGaeaOCFGkm lYJHGoqzMxoFAHUk4sZSEQSdgH2j+XvlWPyt5R0/RxQzxR87tx+1PJ8Uh+hjQewzb4MfBGur4p2t rjqtTLL0J29w5Miy51rsVdirsVdirsVdiqje2VrfWc9ldxrNa3MbRTxMKqyOOLKfmDglEEUWeLJK EhKJqUTYfHn5meQrzyZ5klsGDPp89ZdNuT+3CT9kn+dPst9/QjNPkxmEqL7L2L2rHW4BP+MbSHcf 1HoxLK3buxV2Kvpb8rJ0m8g6QydFjdCD1qkrqf1Z5V2/Ax1uS+8faA+a9txMdXO+/wDQGV5pnVux V2KuxV2KpL50ufq3lHWZuXFlspwjeDNGVX/hjmf2ZDi1OMf04/e5nZ0OLUYx/SH3vljPX31J2Kux V2KvZf8AnHn8vm1LVj5qv4/9A05uNgrDaS5/nHtEP+Gp4HMrS4uKVnkPveL9ru1vDx/l4H1z+ryj 3fH7ve+kc2b5o7FXYq7FXYq7FXYq7FXYqxzz55I0vzjoMul3oCSj47O7Aq0MtKBh0qOzDuMpzYRM ebsuyu08mjzDJHl1HeHyB5l8t6v5c1ifSdVhMN1Adv5XQ/ZkQ/tK3Y/xzVSiQaL7FotZj1OMZMZu J+zyPmleRct2Kva/yI8wpLp95oUr/vrdzc2ymm8T0Dgf6r7/AOyzgva3RkZI5gNpbH3jl8x9zxft PpCJxyjkdj7/AOz7nq2cc8q7FXYq7FXYq81/PDzFHZ+X49Gjb/SdRcNIoO4giIYk/wCs4A+/Oq9l NEZ5zlP0w+8/s/Q9J7N6QzzHIfph95/Y8Iz0R7p2KuxVlv5cfl5qnnTW1tIA0WnQkNqF9TaNP5Vr sXb9kfT0yzHjMzQdP2z2vj0WLiO8z9Me/wDZ3vr7SNJsNI0y20zT4hBZ2iCOGJewHj4kncnuc28I CIoPj2ozzzTM5m5SNlF5JpdirsVdirsVdirsVdirsVdirFPzC/LrRfOulC1vB6F7BU2V+gBeJj1B /mRv2l/jlGbCJjzdt2R2xl0WTijvE/VHof2+b5R83+S9f8p6m1hq9uYzuYLhamGZR+1G9BX5dR3G aucDE0X1rs/tLDq8fHjPvHUe9Isi56P0PWr/AEXVbfU7F+FxbtyFfssOjIw7qw2OY+r0sM+M45/T L8W4+p00M2MwnyL6U8o+cdI8z6ctzZSBZ0AFzaMf3kTe47r4MNs8q7R7My6SfDMbdD0P47nzfX9n 5NNPhkNuh6FPs1zguxV2KpJ5r836P5Z083V/JWRgfq9qpHqSsOyjw8T0GbDs/s3Lqp8MBt1PQObo dBk1M+GA956B82eY/MF/5g1efU75v3spoqD7KIPsovsM9T0OjhpsQxw5D7T3vo+j0kNPjEI8h9qW ZluU7FWZ/l3+V+vedL4egpttJjal1qTr8C06rGNub+w6d8sx4jM0HS9r9t4dFDf1ZDyj+vuD6t8r +VtF8s6TFpekQCG3j3duryPShkkb9pjT+m2bXHiEBQfJddrsuqyHJkNn7vIJtljiOxV2KuxV2Kux V2KuxV2KuxV2KuxVLtf8u6L5g02TTdXtUu7STqjjdT2ZGHxKw8QchPGJii5Ok1mXTzE8cuGQ/G/e +ffPf/OO2uaa8l55YY6pY7t9TcgXUY8B0WX6KH2zXZdLKPLcfa+h9l+1+LIBHP6J9/8ACf1fd5vI bm1ubSd7e6heC4jNJIZVKOp8GVqEZjPYQnGY4omweoVdO1PUNNu0vLC4e2uY/syxnifl7j2OVZ8E MsTGYEonvY5sMMkeGYuL0fRfz41m3jWPVrGK+pQGeJvQkp3JFHQn5Bc5bVeyOKRvFIw8juP0H73n NR7MY5G8cjHyO/4+1Pv+V+6HT/jmXVfDlH/XNb/oQzfz4/a4P+hbL/Pj9qRa1+fGsXCNHpNjFYg1 Anlb1pAPFRREB+YbNlpfZHFE3lkZ+Q2H6T9znab2YxxN5JGXkNvx9jzfUdT1DUrt7y/uHubmT7Us h5H5ew9hnU4MEMURGAEYjuejw4YY48MBUULlrajdI0XVtYvUstLtJb26f7MUKljTxNOg9zthAvZo 1Gpx4Y8WSQjHze3eQ/8AnG9g8d95wlHEUZdJt2rX2mmX9Sf8FmXi0hO8tnh+1fbHnDTD/PP6B+v5 PdLGxs7C0is7KBLa1gUJDBEoVFUdgBmwjEAUHg8uWWSRlIkyPUq+FrdirsVdirsVdirsVdirsVdi rsVdirsVdirsVSjX/KPlnzDD6WtabBegCivItJF/1ZFo6/QcrnhjLmHM0naGfTm8UzH7vlyeaa5/ zjN5Wuiz6RqFzprnpHIFuYh8gTG/3ucxZaIdC9PpfbTUR2yRjP8A2J/SPsYZqH/OMnnCJibHUbG6 jHT1DLC5/wBjwkX/AIbKjpJ+TusPtrpj9cJx+R/SPuSmT/nHr8y0ai2ttIP5luEp/wANxOV/l8n8 37v1uWPa7QnrL/Sl0X/OPP5lO1GtraIfzPcIR/wvLEafJ/N+79ay9rtCOsj/AJqd6b/zjF5olIOo 6rZWqH/fIlnb7mWEfjlg0c/Jwc3ttgH0QnL30P1s40H/AJxv8kWDLJqc1zq0gpVHb0YTT/Jjo/8A w+XR0Q6m/sdFqvbHVZNoCOMfM/bt9j0vSND0fRrUWmlWUNjbj/dcCKgJHdqDc+5zKhjjHkHmdRqc maXFkkZHzKNybQ7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FX//Z uuid:016CBBFF150DDB11B3F9871DB01003DE uuid:026CBBFF150DDB11B3F9871DB01003DE % &&end XMP packet marker&& [{ai_metadata_stream_123} <> /PUT AI11_PDFMark5 [/Document 1 dict begin /Metadata {ai_metadata_stream_123} def currentdict end /BDC AI11_PDFMark5 %AI12_RMC_Transparency: Balance=75 RasterRes=300 GradRes=150 Text=0 Stroke=1 Clip=1 OP=0 Adobe_AGM_Utils begin Adobe_AGM_Core/page_setup get exec Adobe_AGM_Core/capture_currentpagedevice get exec Adobe_CoolType_Core/page_setup get exec Adobe_AGM_Image/page_setup get exec %%EndPageSetup Adobe_AGM_Core/AGMCORE_save save ddf 1 -1 scale 0 -176.174 translate [1 0 0 1 0 0 ] concat % page clip gsave newpath gsave % PSGState 0 0 mo 0 176.174 li 135.586 176.174 li 135.586 0 li cp clp [1 0 0 1 0 0 ] concat 13.8364 56.332 mo 13.8364 85.3271 37.3413 108.832 66.3364 108.832 cv 95.3315 108.832 118.836 85.3271 118.836 56.332 cv 118.836 27.3369 95.3315 3.83203 66.3364 3.83203 cv 37.3413 3.83203 13.8364 27.3369 13.8364 56.332 cv cp false sop /0 [/DeviceCMYK] /CSA add_res 0 0 0 1 cmyk f 7 lw 0 lc 0 lj 4 ml [] 0 dsh true sadj 13.8364 56.332 mo 13.8364 85.3271 37.3413 108.832 66.3364 108.832 cv 95.3315 108.832 118.836 85.3271 118.836 56.332 cv 118.836 27.3369 95.3315 3.83203 66.3364 3.83203 cv 37.3413 3.83203 13.8364 27.3369 13.8364 56.332 cv cp 0 0 0 0 cmyk @ 52.478 5.21533 mo 50.397 10.3721 49.7388 16.1284 49.7388 21.9971 cv 49.7388 43.2886 58.8364 61.4351 80.6313 69.6489 cv 103.756 79.1191 118.836 96.125 118.836 120.163 cv 118.836 149.157 95.3315 172.663 66.3364 172.663 cv 66.0522 172.663 65.7729 172.646 65.4897 172.642 cv 65.4858 172.663 li -13.0132 172.372 -16.5132 23.8721 52.478 5.21533 cv cp 0 1 1 0 cmyk f 52.478 5.21533 mo 50.397 10.3721 49.7388 16.1284 49.7388 21.9971 cv 49.7388 43.2886 58.8364 61.4351 80.6313 69.6489 cv 103.756 79.1191 118.836 96.125 118.836 120.163 cv 118.836 149.157 95.3315 172.663 66.3364 172.663 cv 66.0522 172.663 65.7729 172.646 65.4897 172.642 cv 65.4858 172.663 li -13.0132 172.372 -16.5132 23.8721 52.478 5.21533 cv cp 0 0 0 0 cmyk @ 85.2407 36.478 mo 85.2407 39.6079 87.7778 42.145 90.9077 42.145 cv 94.0366 42.145 96.5737 39.6079 96.5737 36.478 cv 96.5737 33.3486 94.0366 30.8115 90.9077 30.8115 cv 87.7778 30.8115 85.2407 33.3486 85.2407 36.478 cv cp f 46.728 108.688 mo 48.2612 109.821 49.4878 111.384 50.5415 113.098 cv 54.3667 119.315 53.9233 126.891 50.0796 132.561 cv 44.7612 138.337 43.6802 147.153 47.9976 154.173 cv 53.2046 162.639 64.2866 165.28 72.7495 160.073 cv 72.8325 160.022 72.9111 159.967 72.9932 159.914 cv 72.998 159.921 li 95.8687 145.735 70.2168 101.745 46.728 108.688 cv cp 0 0 1 0 cmyk f 122.029 55.2666 mo 121.908 48.8252 120.707 42.6426 118.578 36.9038 cv 118.068 35.5293 117.5 34.1826 116.888 32.8613 cv 116.885 32.8491 li 135.586 40.2056 li 122.04 55.3135 li 122.029 55.2666 li cp 0 0 0 1 cmyk f %ADOBeginClientInjection: EndPageContent "AI11EPS" userdict /annotatepage 2 copy known {get exec}{pop pop} ifelse %ADOEndClientInjection: EndPageContent "AI11EPS" % page clip grestore grestore % PSGState Adobe_AGM_Core/AGMCORE_save get restore %%PageTrailer [/EMC AI11_PDFMark5 [/NamespacePop AI11_PDFMark5 [ [/CSA [/0 ]] ] del_res Adobe_AGM_Image/page_trailer get exec Adobe_CoolType_Core/page_trailer get exec Adobe_AGM_Core/page_trailer get exec currentdict Adobe_AGM_Utils eq {end} if %%Trailer Adobe_AGM_Image/doc_trailer get exec Adobe_CoolType_Core/doc_trailer get exec Adobe_AGM_Core/doc_trailer get exec %%EOF %AI9_PrintingDataEnd userdict /AI9_read_buffer 256 string put userdict begin /ai9_skip_data { mark { currentfile AI9_read_buffer { readline } stopped { } { not { exit } if (%AI9_PrivateDataEnd) eq { exit } if } ifelse } loop cleartomark } def end userdict /ai9_skip_data get exec %AI9_PrivateDataBegin %!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Illustrator(R) 9.0 %%AI8_CreatorVersion: 12.0.0 %%For: (Stefano Pennuto) (Universit\740 di Pisa) %%Title: (flamerobin1.eps) %%CreationDate: 7/6/2006 7:37 PM %AI9_DataStream %Gb"-6q2ZN;FWgTD!WEW&MZLq8p1?^'>l"j2@iCt(qjY@r+)cZ%k0p]b:%X(YQ8^-<]5]"O3;<^P\/Q6d_&I;W]`.Kic25goIJiU2c)4A7 %&,./0Ieqa[(U&8m^fR"THZO]:iD5s!rN"P"BUaMMjh(!LhnJmjT).Eh8%A/'S+!#*:N&F8[blK-m@3"g^\QoZHi'<"ci(l=fZeq* %s0p_E++NgMJ,K*,S%$`Zr-at2Sbf"qr;7QD"o8PPc7QO&q>L8Y:S0kcqY]J",8d5L[Uji6+.Y*Wgf:)8GY7$?Zi.!c8A@*WPCEs-;/=D[QT8Kn,d^^h+`tZOdTOm5/HlP;BYhn3shLN6QC_ %B)!*^TQAS)HHgG@!s4(S4kQ!BsG%JHiM^3goe8umPCE8\doY,FUqGFUt[CXl-?K5X`IcL"374d8[m;#dGaAPouYuDheLA#?hdPj %V3*EHq+pZ2IuP\&Y!;^iDYK_god>7.aIhcor^r#3Vc97ZjD2Bh5LlD([G167qNJ\Pp=idUeXub^GK6?A:];9TQdC"_6i>6qbFeG@ %s29,gj*pWUgB5a$I((f-gU']F2Vraas2S>s*cCq4J+q%RD7&hpQN,]q[iB9U>dWnWG+dUNYNCr1G5cXK-U&,[Nc6d`rdd0#:*6.< %+8q71^`eaS]@lT"IQ)4IKO*H+lP_-J %kL@b&MJ_giCAho4lQTHqs %1Z'4FC%'2#(]H'@hSflS:Fo5276EfYhc'R<.A8_FiD(O-%XrU]+:2.R=aKpnIF%H4+0ab;8+>cLD)cn:]LGF52=oS@1EW%%X?V2( %Fft9,k&r">aBR*[d4n<#l@i#p[qS7][5)u3$k%Jr[tFe\:LmYM8]QQ_S@S4cWd#U8H:Jq4:P4#A/^;7nf"oq%%8u*QjF2$=)!1r= %6m:8,39/)$Bgc1$%f#\HNS=B8jPnSsHTS$7`[OI%Dp%^)Kb"hmD52"6p/Z1t>SQ0pOa+Z;T&S@LMg.`:,8O:NIN5idB.d]+KYPto %)If,C.:VBCC"kkV4Cp'9bJtt@#@B^lMK'I"pGI?Is)fM%DHFAc36J+!epX1B7#rRnDKn\"]!(#T=/D@;oCQ@uk99)Sp5;cD:jR>= %<,P]b?KbWaN)R2KKs]=$Q&n.\7H2Wc/nWnF_nP\C=pr7Z]0\!.rSQe0/mO=T*Cl;KjGCD%n$nR?ED$,3-PfHW!ZLRe\DV=Jk4bo3 %c(epcfs"J;_j<'pH2J\4QC71U0/$l#Th)fn;n!,#6,R1Y*bU4#C#"rnD3]H4$>EQI6c4I`XJQW=$[5j:_V6U03;d-=9,'&LE:^W' %eHuAE!FH"ES(j3!i9]`:\*4m>4Xs_KQ8+M(_8UJt#L1RUep,A/CX:?S(B=-9DU1Yd3R[8^1QOm\Bhca\PYJZ:I+P$u1r+?@%DIYH %df)I@'$hPF);hkm07!EiU-\aWRT*BFBO+/C8Wo(UqB%G7ZY>BAEpcBn>t;rt`];=/I*:^b\*:`K7O=9Y^oL18RDR/d*SQE)`4BjW %68cR+]0?G]pudUNP^<:4p6dnSRH^+jr=kNcUNn=XoZM.>]Ui`nt,7gk)QTjs&?RQ,f^p71HG=PaRB+6;kmk>-!KbbGi4fQ;A:HILg-.HJ#t %XlH$/I;--(NJ^==d\*cuFT^'%_S.FQQWAlm_4@s$It(QJs#i)qfT(rq/[lATO#(of2.BddGD'`eBe"EkJ66+Ro*D=kN=g/?&>j<2 %K^p2mlOLDTP0*$`<;(YUr!p2f*S,>`+)1"`Y]L+*;=)T$2Wt(P$EYQ-1qHK.S$;bhHQs@%hohhO[48s&p@OQlanko%jcfC*?la,Y %"5?(bjnC9m4b2+W7DS722L.O*](>-OnF">+;Nok_!f3pc\,4@b])FoGYt,qnVdT3H;CSt+SMl)tR+-inEZ(bO_4Q1j@mpQ0pL?>a %K%gSh)\q_[Om>d@7.(;ho0=BE?i_ms+e6Z1`eqspU7/M?AtL%mdmN?$$T1J;9p;97qDt3'[jhk8Pd+O'?-WL-7[V+HGf&0E]45[-PL@`#cA=2:[;a<&W^D3a\u0roj^Tn']^iGtCU8?\e1E:T()Q,-D>J&Q4X[&mImhuuY^PKpUu\CG %,FrH8^)rYb]`'1Jk>uRdJbq3f>P"NBgF^oLh'+_ir7sHabdudMD4(S[L\46'0b+^0:3;.Kq#/*,-JdgrQ)X*LBDXra-\@a8e`3s7 %C]CS6*tA33L32M@HVo=>=mP1cDbj*#i8[16bh1$2!Pn+h\$KI!SN^JE9*fgr]AnBJL:DXCLB[5:N9O8=I^/lI(63f#G$hW::12m% %EP.68lt(F^h0=je=-;[Is-HY'&g;1oSoZ6P?DDm'Fj#tm]%cZ;[&Oh>Iusq`d=dd%H\)/k2"*,BXW3c)Fb0$1f'P'q;T/OJ7,'MCgo:*ORC[H>&s;L]4%JCcQBr/`k3'nb/=F/$,hVXo_&\C/9G+lF %JPHb,PU.c.kp5!X92S0UmQ@l@F1I=(bpDG^6(?^(%'"q!WNk`km^TfmAEi8NP<'j,Tk&fIYiW*`,A^h=7&O;G1AUA!3dC5GP,m[] %V7#KKM[Oek&WJqX=-(udN[oVplfqLVVcKC4j5DtM^&\%Ek"c<#pe8elS]je)oJ;21G[+F`IJuWY,\1b=-ETAL1)h%OC8k=Fp*jECO%%p5QK]$GmL\6U&&38FlKr#PVsJaFC;frX8Yo+$Y5Lo%hXLJ,A4#Z_((iZ-?@R56$)<]79GO %Rnl9)qug6;Gl+(*PAS&4o',OspMU(]i86HM]RBhFh:pPrIrk5Hm<:cXdIj\-^3U6@f_k/^>+4j %Ht:#QSUJJRepdFd#Q4,8Vr)EArSbZmCs_(QH2eqDb\a.8)`7?do>e$;])DF"mAJ9[OUm,2V]VelDI-2TDeV-01H]RTlMgeMmlnJ^ %me:X,00c_cj(iB*/NaLsNebKtV%RMbQCFI%MQ^C9)D)Jm]^.Rq^LboEF5l_tiEu)lEK._]qu.OZo%.7*I`C6CY2JI8LNhX(q"4A^ %H&1h02tsM)qr-S9s.D)oL/%UBmAnQOc[!F_2r?sJ)uapME^,'R`t.oO?@V=-ZN:.FmpT[3SMc7RIeVS-pMW:0_b#,H^Xl':cf]Ck %\:=2A9cYX1,RX53rL6TTcD*r)YMR%j\=l.22pU1(T>,c$V$-B)2OK$[1]20AY.&NM`J`ajh71_tIG7/*?iFm5'.U-[GFO*\4Y69g %h>V;9[fu:ah8R!FkO6DPGA$Bgh/I_N]t:tk %h;@X<\$u/k4b%VoDo8]l*C4qS\)qkd+80pUg\i2'j;.N,g..5hr-mEG,;l->*HlY=>@a3G7c[k/`Eh-lh7.Mf]/.NP[tjA,p(mGf %DS+`eD;*!Hf_Y!FF^)I8gE@[0?,"S\]ZVEtjHO-ag#k*%CpV5N3i"hO)U^6T;bf$d'N7OdNQEK99H)n6hSn6ZO1Vo]3MmX'Ld$jH %72nr@_BI]g>7d9I@2j5X+bgPU(kW2SQiLXg#CkoTrSI#@en:V&oYGl=HKVChIM`UUh0;$La5+6Go9dNWL=)(BkXIY&EGu/,kAF.c %E*ElB@#Q_Li4L#"F4M3ffRplDTRGI`h:c[",!T1J8*d7a`X_-=m`_fdS"86$Cm'W%(iMn(N&AVj(^F0g!>]4]\-A=d!FBSmTafBE %5aAt\!?,hSju9o5KH@O/VT0bY`r_.5R=KLR[&%1BQ;m5*2LiNn]A'n!'T#m&qsGJdM#2*KGCP'o#i0r_5$`f^Je&5S %JfYRJr6huY]lqFKk])+C\ioqB0Bhq7?\c#sHtDVO7)4n;+VB?T8>IdL3CAD\M5ZD%fGkJ^9*>a>#/4X%mc:sE %CX3fYX'N9EjiZ[WbnZ]uFI00Io]V-nc7cYIg#En@BHDOQIR0#rrjm!.MW5h,kS4l9\9Oj8$R>i<0eZkfUXsD^JfaUZrC,?*g''XB %riN^`+MH.^,>%Y%MaYObIf7ma;/mRD<"r.L$)]2?U0sE\,Xm9K`DI==;&!S-[&*RJJeeB/-@T8FI+fl]&)ns7qm]8cDabAr'hTPU %V-g%i5f`&P^7k-bj[5a47qk*6G7nR"b;B2lqECV@d,P1M?_Qk"d<4Ym9%tFZe,N@nE?e)ohm[W&7pts^V-0(5=]SRKRcSCPaM1cOu>p0%iQ]ehQ+B]T-E12P:eGOd %\j_3QHH*6R#-mpPXg&VA:Yck_fR@4<^d]5UEc>7X:`#5%iQl(8K/e1pn0#Rh;=lEN@J!]?p]>YFrRC9Lh#jO(L3'N57tGUE^1lA;AK^c3O_8ec^o/HN\7r[2*%i(E&f^ %i!(^pS=!#)2r5jq$0)IgFkcH6B%;P\%f[:ip1hHXNe_Bi5rU;0kA*L1A>YT!l]n63j[Cu]P]7U!h[Cu\]\q9mg[Cu\]\q9mg %h,CP)Y$c`rpC[bL=0THJqZtPc@XmK&F9AjZ#o@1TkT_bF0jO0^K]VOo(pA!HO&tU\V8r6'$[S=/H@#G^A;b?/A\7R`lh%Wl78N=" %&%,$Qf:jknKPbtq140*g1^fX5Ek0^.KdRV0k*J;Q/Qnd)/IHf/[RdOTUr4lc0=;,eWUN/.,*7fn,\..Uj;(;/!L-%U,fTkanN_+= %OIck+BEt?s(.cjS(qfs)msnMc+BfA5]c9R825a$&:1`p*Y(a.?=8@AcO*J&lV+QY[-l*iq3%tN17`$kpZhZND0^]ZDH"4TXkT'$T\A,oY=JRseU %3WcOI"KZ,A/7f?njXqW?h_Doa*3^Folj'SSB0=6=(t1(0p&Quu!t5RW#cu2O$]DgC19e,+YdRb$n,irg#%Mk-om'qr&QiHGQFI%J %GRI'&[?qDZ[LS\&#::@?R:]j,0LfHR[t*`K&=!^/>t84u5[L3Z]4t.=i'=ef$/7T$7j:%T%\nMuN>jCdjk!YRj8.j#7j5`6(@-5[ %Mk-(!dgj.#CX%QXeAZ\.2='cLq`*nn*\Y4i(d!?XH9BU7dS"nV3IT5e$H[JC^&Glq,a0c6WiKHUGs1Hh5">EQd_25:H]7[+UjG7S %p)*148b[Q1lnR5GP4&#@fjhCm-/In_Zc?`d6XCnc^umKN#nn\(U$9DO$$MVrr]sF"87*lffgDSk:i'4oZA2%`+FUB5AIk'KSj-GC %b8r-uJb6>oQ^sGbMUXNHeu'dFdh9o>=mD56=++"\&D/U?]+`eFrIQ*d\(_SJh2/22A`@W4;V4aTY?&AF".!F@:L"9d9h=oe9`M]` %b@\,XO^TM)R='5q7LFZNE<>G]4lUmI^[=dN-;&d#bEUHU@L.I*6Ve"`kLfU;IA%HpF'CE_N'SC>XQlNJ-C:cO\9R7U44q4)D %daPkX-DBbi=>T3`H;@7)H7$kI2As,uN]#jgpml!/1n34;Fq]#"RIk#`Wc#>T8_;@P %5mf>$bfmJW,pUQq=_-D/3=(ld9G\)6LaCM:[/bQe!$-\sZ!=85\Qmm0mGuuflaC%P.F9<[W`G1h`Wk$\eLt",;(c4Y^_]Q%JV"g9 %9'+39D9K=;f=kM!jgpW`f!fnRX%HYFWX_Y9`c=orkFutYHo&pF=_#9AZ1N0f^qk&Q_>1nN$c)r[A8lu?_&8pKd,RIF^l^I>ji!E2 %'a8nGSs47>-)BnbJMn5eYM*6/fuL[N[q2J;\a`L>U@(8&EIi;&m]\7LI96-hS^@/*lk(VPT(dhGIkJ7V$#,@QMTq$pY2F(<:;FLB %\H28R*mK.6]O$Va+S)gu=X:Qk.+k"sPC[2TJA$"1\Y0R#/nK+BTc,Mni#Eu+$@bnV-*$sm%c_"K!NY3Wp %^s"=K;'O9sB=V1c--dl@+N%$#cAY47$Q-2rQ@AKN%WN[YpS:CXZt]HFOoD^Ti05bOJiF2#h'LLCIP#+Y/PO:'e[V/@;JQrSg2$-? %>&oWtgh@C+27G!+(LFIbIm5URCS&>RP/=&pLUWfWpZAZ7Pfg9Yrs,#au+@>\?k>.2M\"WDG5 %p8tTs/N$*m]40k_.lZMaZUqaV.$SU04$tG<"nO6f/-:%VUi!QKCM`9 %lnioWo7nUIXsDf%EC10TRX?Kn73r79'Cdp.8/(P2NsV/F5GQ^jc99VR,>HY9<',AG@1i)sJuHWb[Tr]MeH*'b\[bUZ7C!Uqrn5BeQ6^fQ;Z.j-0bh+g!37\SA/9#;Yb1&Y %RH'UfFh8&bAq5b4D)9B/gUVH=DP&'[%8]*nd7gZ!]d:.qjn>"/C9&Ln%H%lRCPp*.Z.W*W9sr`Sjec4*eTN1g)q^?j_,2-]=`K<> %LFkN]PgbJPKWl2Lc<`>IeZqc%#-LEVF+[-afi`;bH12mf(,Yc.c[r,L#ROZE#jR;6>T=Hb'G=@jZ-1"93r<*1 %bl`YPaE0Wb.+H@5S7]k1b5i7ZLE!^%K'GlGEP2GDJNm9/*+KB&%=GehF;eBHlg]_-gooSl"I%,O_+IYo&\ZN,Nu?\sMa%E=?fLb' %2^8Sp9rI0]QM1Se9$`J_Z5ZeVqcE7CI'`X>JC(>PK0?&"5,C\3V+!$0prHjF$\Gf.fAlUgLK"D5LK./R %^&Ct'Gf;]qfB_aXlZ$Z!H-2%nb):\jMg`a+4j?-mc]lg,Zge4)W*?1X31&)?3+U0Tqdg&CXLffit25@m#CANp,Ac$Wip8=/K+"!hT %9Q"M*[J+OiPM;RM-SsQT[d.YqS3_U1Y']("5CLEG2"k?fgepZGJgUft>ua3.)IM6+RY:1?*ku%giNKT.n'e`:eDh(jirapY:K`(X %Umk,\4u7]SeF'XabR:^RA,iMDTV[b,C'CV\TP7eP%+&LJ(<9!dLLLur]9"\FE4K)+p6l+SJt&GJ!t+aMrf$23Caigt;&f.S8+,\o %1<_;gl:^V"foF^27'gA3SaE*1U:QqZ=cV3BdL'#AI1T`&EFj7\b6Ynbi-We %*0Mj]aTG\\%$dP@-$_e?)5a<_cHlK[7ud/,OC]r]RYB[E%*)8i`[,UCCMCeT`+p@'N_kUU>-VTYSkoff'N5rj)kGC)Mq1YY=Gj!j %""6TO/B64P4J`o6Z(Wlk*RuS3@u];X.#0(tmZ(,(5)m!FU88Q-9#I1H%n^"4Pebes&%4FC.>ZC`0*qbR7?ii!.NK\nmHM\)-0](L %k]emu6CHjIMF,n[8l7'4aW4(VWWKP?053.^b$lX,7VU$oBfMe_Q^5>kKq[O[H7ICjR2N-kWK!)E,;0ib-)JT"Np`^+Z8ACAPle?m %kdDW7LRK45)3.F4g$Wn:2,5cu<'YejT3f0XIdtQ0`oSK+l1NueJGE&,j_Pp+(/Kc6n1"@H$BSk65j4nTkNMJ'dj))T;Rg(B,!`rY-.I(Y[o1,'c;Ieioq] %5,HgoV:Ii,et-Tq^6W4*;(@dl`FO%)o9OOs#t?K?*]YB!7b>rf:O %*&[(&7I6CGGtf/\/47`(Q6+b%[%q: %:,r;?K0Q4[PMU!$Rn\4H8RjfT6WI=]8K/#B)C^.e:7`k!>Pu'A8W+s6'(*8IE946`FFF.i7*3bbj:;E4\m8U9>BdE%%J]Pm=c$oo %*(lF)GhqC32N:uVCDRKlH_*.Re9i\kq*umWmt>Qs0$[7-gd+R)h[/CU3kQu^qR8kpR1,VA7gc)s^DEd,R\P)RT>[&bp;ife\/jM(oroJ!Sa@R^m1DGInN->V*O\.u6ZqTpSb>UFHCR`WP`?`Ydi:WWAmW!g %nY69mTY]f[(s[+"TSW]R:lPmMR2IW$!+"jk.]*Eci:Dm:#?Qr7]5H]hrg((O'dFO(Ya3n#>`:AVlUEM$"EhG`Vf;13o?5uTPX+\\ %s6n,K%k;S]L'f=L!,Sa2NtA08&LGt:T>eB+S^RK5ld]m!l\pqr:^4G8M*jMq6]*W4SZ<#\3*W*O?Y5A+sq(2LG+[.9DT+0,[Y\>TZ7G`mS.B;`h= %6/AM+p"UZ:$rKb])9^\[7SY_LgYU&?,qQ]IbGcbL(qq@]XChgh;hUT\KSXl[k6R?:K]jCee"%i8T-mT6'Pbb%-(GsrV044s?;;4: %@`.@90rYI)*f[O:gTuS`l/,Fjba+ELg@L#q-O_^adPHWF,j?aF\XYE35A+YYdL^5:&R\R_=Z^D4HJ21YCM;Ip2+5ARM3&>l+Z^(K %;)+l.Qq:IaRon5gU"9#(@8Y*`4d..''B*X/mHUBM:.VL=G)a'#;TsrI\&.jD'JitC0gA<(/P6n^lY1p^qCt^2=r(`ucU_4W)0K(^ %Rjr3;1MF@1e?O6XA!9.^QnhO=CC4fVXA]_>EPYZcaccN%8\/@IK-`1 %Ws;>cCu=>ha;d3_*M!k(uH$cIopIJg6&r\Q9f!e]Gk0[#^3AY<)Q4 %P`sKFPq.(H^Zkm%DSYNEXR8@--PNDN3!SKEK@6s__.-uu@OBe(3FAi7X:%$g94-l&XtIbqSfalA<`\;ZR+*pd:nbp`#ZS@C$eK:d %g=H^Y//99CYJggL?_(M[(C2IfqDfX/,1#$br-@c %p:e,$MB`s_"),:2WqMFLS('/E%V^&RWsdW%C(FXHZ%%V*n84KiKp0NfhLT*"rf!F+DVmMcmQb2k@]9Celd]gZS>r-X;m;5f\ %kA%8k.&-fT?86U:EJ?HreRCIW5"Pha6fC$])LX12J?Pf.KlRc\=O2=2jK/1;fBGESdi$-&Z^4JL?!`U)WP#i_hOAs![+E`j/6kh\ %jt:6!cZRV]m<,-.Mr$SJWm?T&?a^`om0r1><@psDN@g[K=,A^dcH!s'=<3LR"fY8E^dNj>[FS<>j>@iil'MaW!++8f2'%H;.'Y!tJDWk[Ld^VZE]@5[BH %_0uHk7m4p$Y\*L!jc_gXQG8%n+&TjfWI@^,`%J*!eCiIMCL5QT!gh?_W^_&j7&$c5NS+_!b`ttHDak:hRSM1C/aprE'TR`QkD\:XHNR`BCZ"tjZc@Aqd\.N_QleNRt3CHSoCG)1-$`F,[?eWDFQRFl1G3ia&>O8#fVU-fXW$U\n3d5P1[h'6(9&`[+(S?tr=eRq`A1k(%1XW$[(1'PQeG %[YB?J)Q:Z,C*';XJncL.7KP:XOGA`f"W**&j.[r;<^bWQ:6`F[OR9tgM41&pZ-,IM0>d.T,-6[*+F)08fNrr2(1#JUeVgOLHI.PO %9-W\R\@Nf](*SsK&)9Q@mD[PR=P=.Y]c[[G9J3@;4c>mB'g,Q&JZo5/bUbd9$A;]2AdO35?%F]5B9lpbf+eSdH"IA;EsjZ%NL(7d %PhmLu %!%c@&6Lc.P"!HQ-eJncC[QA;a7\e3f-EroHGlHIR%eledC_g&4H_-9K:bOobp0!LWr(%NXbslb %/B_h#qf@/V99lp2o=(@P;fDTs-+WQmGQZ\Wkuj0kQQSG7hSCO!)YX0(o+Tul4uKqG(<4=hkUn/"`T'N^FH,22:=>hO`(lV4,,[oje2WteZIm+P!#)?:"uW!F7L[eFJElm4hYl`S00X]ZEjN?J9>TG0(>M%Zmp6Fl-?Bf=]P:&:1Qq2.]c5GJ6c-N< %l$Pk_`@>5_[BaRZfV?ZLWH3)2!.<'!HY0c-":csp=CH?Ik=OP(fI#b>[[EW_O.!P*g]+7=CW>jT(Vm:fhj4FQ_0[oGq]BOZmcIV0 %p`FF!Tum=AJ,f66S%m_EmU*[,!uh'KcS498(RFjJ/b,V'2/4e]Si]pliBiA7Us(V%,?uF4_U^bHEB%%ZKWTB_g2OdE$$>A>V;W&D %PN^@2.`:n+ZmG1toFHWCjk-q(n[f$u5\5KDk+=lNs6AY!pRg?Ws4rSL/W.#eH2d0&^SAP(rnCMX5(A%QnNC:[p-69=I'`V`[/#Br %hgX?_fMMLj-i&L,r5&OnZo<`as8Fg(rh&]W^B=+(RrS%Xc2[US_rdHO#lies_S=^:hNa/OlV%.XqJSPqPF)6]o^P(/moMga3&Mar %GGLZ(V`MD_N6^3H^\JNOB,pP01^s4?_FL4"dZ8AfnqM\e3;W#"FT5\g(n %N3^_LIAG`S6'j=PL+GU'UU2QsVEUF\024\j3V6&7Wi[WnVJgUqDWjSq=1-nd,:IK)2iZX$B[VZbckU3Ym-18N_D=81Ku@i_X# %q=ag+o)([Ji5:j*Bm.alcdpk[):4NaU]SRUH?I_hde"3c39ZRf#)'fFF$g)c^@?C9Z]F'W(dX*iH76"F'*en\C#ER]oqn?O %GN4(4LF=_1$pK=R]Ks>-hLC2!"(JuCU.qGOs/J$n>(d)*1=neDT$CAt]p9M[?.9T`*)![g5i]Ji#C@\30W@ %k76qfOAQ[?JEE/0+'[N$TPa`;;us7=p:9!G"XoiK3WUhWcT\h-<+3(lFe**)lUSip;$fQ^7>,P\U`7;:6D^]=MN"b_U/rN_T/_E0ch,pGJln#10sBKd)k\AF#W7caQio;'#lcR517R\3[g)V59TBEcCa9l>9#+X68WEkdH!1`g`gNb#ss[o %AgN5ckAF?8TPU/28Nj0*luTf='Ng15E"d'1o?SG";4s!Q=_4EFnkk7%c[[(NE[UeobsuQ"e2cqX_GE!=Z$m2A-5[RYP<]:T[)E2* %_BmuJe'HB$@&DeV5ToEG`HN4)UofiAn>[qZbUX5M+uA4/@PJS[kFY$m1kRog!!daT`%bdAj7K+)2`;D6Y!<5T(N:f66mDgrqeS'M %Xhp\E#l#,:^Hk>t2uO0[k`d&9&;5Xs?oNE?,QO8$oWnc7-cf!cBPs>oSmfe$(sM>f"@NO0bVm9Wa>.J)X$#s=d>pUt$C.QSjV#]* %rkkAbDml9&Mqt]9$lkK9NbE*g-TkLee;iCN%mXW2b4'&9N4b*f5P/D2P>3%8Z61$'BO.]1rVRNo"=?P&j+,4$*eH1\jVOB^"E`:V %!X[+GTleAcJ@Yf@(Pf29Yuu_& %PWEs3Nb+UHRa3+jN/h"**WjGT]Ql[?WnRP"0#nO[b^,n/.PEHIJboJ'gQWXum56h7-[oUgH"ub_`nJ.5U/OUOonc(;*V"l.'a!.@ %,ATW9[P1Q<=!29Hgr)W++QeB-0fSb8qB-do<'k27/^HT9jiL%G?1J5+.=*%fA9;j12qA.1B\8!RLUY@j,sh?!3>_g%!K@KVBs@Ck/d=?bhG[eZ`1(qkfj->!gidi_d %dXWEFDO6D.5*_0W@1gKAHQ@[6F&rTRSh:IoW,d5&q0DV)q(,3D@;GuO+KRSdRQu&YAKlQH7K"@+&lOr3P0.W5]4@L.N57e=dbKs" %Ouma84X89n@\[I%VYdr5G/SAELQ%8hN9G*U$(>F'SUui4]4IEpq=Ij6BX"YmO)cKEjqN.S;$RZCV6T(2PMTPsAF_\\a[l3`17&K!.G"A!s>Zk3Ib %KgRZT'D!1F9Y&!H9ZN718#@1Zp.6pG9FGu]=iSt2TkAtg1=l7qfgMO\^epu[QA$b1;cKK%/Ub&.Q`0n`Xt:CO9-!36Iidoj>]mg&iN4;P235m:Q[EAaJHA+:!X8Tl@\3ErN4P?O5]26Hc5!k %JnV)-c(H@sb^)Z$-Ub)_l.R^$/(=t$6%DRG#'+YAj;Zh/I5;Z=@6/-`ZY:=o-mX;-h>O&+@h:#!!g %]9Xg[KDt:Qk==X83"rWE.;MbS54gV]+atGYg0^]L1tS#D %S(_5EO6a\O=7:#`P?q=8Ebnm!CcJ`h)"NV-S!G'*HIG\-kFhb&FKB`,M1*R'A&F(E?jjo%j@[:HA\d.c.LQ:./;Y7@!'SDGLhoXN %YRr.jJQ=o=eAUFSar#au%87^l?lN%nM11a<'q&3TR"hprS\W`Zh`OIo.j\)EOrMqqi(bWf<%$W+o@6olrqPd7gM]8m$lZ=<:ZV:] %%\4[RE7?j3WO%qko?BH?Fb1Cj'3/_1_Ng[q3'jN:IdWlS5JObt++E+S]l,SQ#R7-`RNHcVjWBrMY4N3RBcbarlStuqEfd78T`g!A %s3OQl6Ds3q]2$C?PMt0giJ7lu=&4PJ&`d,8JP4-*:/Bi)uM %C5HEL*,\[uGn,>#8br2`POe$@^V,-gqYnCqhs83;&:-%a50!n(%JK:OIt^3+*/e]LYS_`OCI@#]p"B %p>b>j\$&$2rUBg:a$4KkL9R:0$to1brH.Yg;+>g1]?O,p]C"q9?f(bH_rk+Rp8=Cp_j:4Ln %*[48f#tZgF0T2V%r0tu]"_XT)/W>^&eDbR%0%BkK$6e3O=t*^-+QtW.jLeWCNRudQ4;+3;9VBVcI*H6jQ4RR=PudE-\!W(lb(bLq_^1+`H,Ai3d;-ebH84:uZ7L"2! %BqH_K`80>gR"n(Q&VbZ)\PgJPVl>H)!GjbNcoI^%3!L7N*J<3e@D3%&0l"[P]4"#0lB,YNcT,f&l4j>f4Y+e`a+m13]9(_""j5K1pp&&:L$>mo(FId*A&.sY %ZX=)0RY2Og18-s#'^DgU46lqcP^arm1 %R`khLC)m@lOCVq8_%&rU0#/]q@pH/:H5k1_)u4JeBjl`MT:@[+'MdkTI+-3-4]*PI2SteAq,e_.G+5o;NY\Gm7!S'94H:.1qqa;e %>9A.?'\O*9kg4.c5[YY)JKqnd^0i9A-Q^-Teh[mjJ4)3B_jP[+aY3o8KY@HPb+$A:hTI/^6eE1IS'4c\bnW%KTXTj`mh@tVNq2\& %d.-Z>r0pI;_Kmf:m*bZjY5mNR"25p>bgCh5;OLHO7h*;8A3c98"<4[U+uFY-JfWNAY-9dgr/d8;5P(I`85]YoBf;GL>`bAZ2r9[Y#@*jP!adE>L-u\?Z6q3X@(>%6Q?!1m@?Z5[aE^l/6gY.Pn[?XIk(2eO %;h2SVb1uB#aqV[HkXMkmOi<')W:3-YVh?-GB%SA/GSr'Ua&Z7X4[tRr*Zel_?I(eiCjH,&(ALd %%'6N-MO>e1VKfo:SdBOk+%GY6Ne4-qaK20KaXtW!QnkHj$-3p"(?@j=X97@+9> %SuaaQ6-Za'"O`]BQDr$Z*\UHgPXMCc8J'#],>$$3@#EDt_>?^"6uX\6&="lAJKQoNEJ[JOIXtlZ!`)]k,UgmSOeCdjJA2UUo=+aO %L59%L@N8SrjI:&7).@g"NnR1KSY]$bcNK5b('8YP@Kd^Woe?$#YrA)eo+%Oe?Rr-h6`M6`#4K_gJ2-C9J`=l_A)8c^MGWCP[=5+E %30:;#gXi`iN1GW!2ED7-bN"1!,mB34^mlmHJrr*CCI%Q+UN3r.#qGA)j>W"g)K]X!L)] %N5j+U@\J3p\-\5L%T+9KfbGV3nWT$]Jkj/gk0Bfh.HR*1X-$d@Xscc1_l?NaQt*3kZ(d\1qI %;[[nS5tUcDF5m>#\T)I0Z*d\;J_W?>KDad9*%tjZ]T2+c?tcJn`7SJ37F-uKEC9iV/1\0&LmFRL'EM=A1UuUuM.+Q$!/F+H4D%0\ %k$FeoaI(@5Bgm&@9n,E':.u3g"\b3b0*A\C?=&1.45TZ8ODEd7Oh#%tAH^R@,kWZJLn[W_>*;3t>;M!Fk= %.Hdsn0fJgBUbbI],mK)/)S5*NBc]:IVm$ui,Z-UQm332Q*@.HO3$B^K-mp1TMR+C-Fs4^AXcXZLWJE_^60="NiuN%G)*"faV/Xg= %)mm,g/pP35R1Zc=`[$O44/NI"gnr+NR%tmZg4RJa\1GSA#_q#X4G5u:eH-)l?9uh_g99>)O=qi%9sGI9LoBbOgA:ZmMRLSucu_1b %>EA;MjS`c]()pK+(`L%UDBm0m%WMNPdT].F(pIcO'lf@'`F@K$Ll35^'95,l7Fm*7CrKXm">hjXcki*U@MQPM0/C!kpXkB:``T=Z %%JJp'XHqIJDm73Y:sg)-);b0LqBC@^4naIOM&GOunp1^C)Z1"hZ-$0*\]8%3.u4WTp;/(CgoFB?76"Lf)XPE\M_m4!p3KCqomVY/ %-t#$$HLsY51OcZdMGrkAp]C/`6RUQ,L:rsIaX"(+hGBeHOZ,8li67$q^qdnPHK57&$0:nrO;E8'8pM?9%CCqo8)@&VRYn]W$RV>\ %m\6J/J@=bgP?X.YB@qa4*k.rC8`!1Vjma0bBTeDk%fM::r06EZg[GWt,Mp$_grXO?r%)M)N+u2p`=5aP^)l4On%"GT]^'9'sI:u(- %BUD.^&JttDOXORh^t@;8e0Aoh%F]5,(ld:$OgRL5>\Ich?o1<-1dg1\0\>P#(mZuapJ,0H--OmSJKpK!#dHm-GUYMQj#GLUt"NcIrTiB!/Qs6X:C4#!5+V>b;QSW1,4aI"o1F1='ii\QDMB:.,=U_\qSDr;I%\WZ5Jk'a"P`>j38eIU5=-Y;&fEo/W`d %(pG4Hp1"D=nm't8$;J>P!fal1[:"'<,fWeCNb[WNLkNqE\HFQ2C1:Sgd1'cS)IbE> %CGmBB&$C("5$:X:Z&.G?4$:Unh2=3_1l)lehW>AYQ,D$JA5gErg<\UGO-p`2^o^32e\ciH)\W5&B5k+IUoUm(-0;@5qb;_rupUd2uV,1g8JkC634NU(Q5VQ6X0X7Sh.;nKuBgJR3mFWl2U96s1Uk]ej %!'*j^$*#H2T/jRV9I:&iaD)q"+M=WU1.3cVh@^#D_@(+@K#VKBl5QFd;03bj?c?/7/Wq$p*X$:$.r)JUoM.^3:Ff?_]f'T5qgQ-P %V)ri2iE_)]Dt\h[E'/n/4CEW-7<7aa`1Cf]Y>GkiE/FrY"2O"PSRJ0sVFZ*k,-jAQ';NU\2GTW=KTf&>,mt>F9=lF` %^:7`Z'/E,JQP6ktS)ZJ/)CGEa_4,o10DfHKNu<2g-I1.hVso7cPur%NE2X;8[V=FAF"g!4:?iDoomn*+PV+BSgjj:i$]r#JV6OI4 %T,Tf"O<6Db#'uBXJF@JfFHj(DcB1*3^-*aO6iok8T>PG;A&Hj;BR%G9_3IEtfV7/\RI%]RC&jNQh3;$g9b[s1l%pWV#J^0>]LP`;hlO%*cH7"D'Q2qstA@f][.k^fueNM6M4Y5LSfO^&n]7Ca:-?bVHit>5K#-Nf(YAhYl)@Ti`.qJK# %.YoC&0hA*^U2\HO9Ge%eB4)hcO%Wsslq-2ZBZt)F&k^rcUPQD5QBo'cf\/'G8t6=k.lF&e_*IQ;f;4eQ:;]I>qmUh$XJ*EoLI!7f %YndFY3&h-i-t\HgE4UX,KAo %3R4Ff$SHoClYUYjk0ZSl@$jRWQ,C+n/CL4LK;LVbmY'YLE'!K.:s4G\;'9P,R?1bU2G8k&F^l!/+n/!>S@JJO3EeufkJeq/'`[V] %Yc604-/&XB8-^FX%UJ*\Cd*-/T(,"qi4C^B2+*Bk8)*LJM-]>:A8`.3&!<^kVSVJ:)(%`]WEg98@,W>rA<8?U`0at1pZ*^\4;IjK %Kn(t5!FmQW1k>++*q80moM$9\H#M1VBZf6OT0QCs$=jjR@DA*$47#Me@/1/9Y=>8AtTuP873GPZPkf$/LPC&enB\hMGIrU6V9Jeeo4XoY]C9;6UG5s!N;Bo)A@6n %9?4RB?ou[=JZ3VJF0K=[iJqKKb7pcc+rTIPZ(BYgm7%8rA=gR&$-_W*>)?J2Km'`gEZUhcPa])-K3> %43Ybe'+&X*3B"#J0_3XK9;3N&W=-+@EZ/sfL85&s5hN38@mJaU-)s;<]s*[bbCrSMd4cM4(ih30bcU.:E^J1r`F&7Q-mbXI'sL7aB6_iPn7E\mkjj %8IL*RPC8V0e8`Rkr;_3)k^"^f#.6k``0Xm@CmmlVa50n!5%M='e0930>L2RALV/P;f:\``8K<-I7@Q-4gJIZ'MQhXMq8SIacE>n.:$.3#bmnt*"T_+O[MA@&Vc0O&$d0#M %2Ulp;OCpVkPiUK"Im;o>kU*STWa3.tH3@`'K.i&oogU1?.WcnPiP<-XD)_e79P>J%ZDqi0qgEEm*:EfDV2Q?2nSaE`CB$8jL#'$E,\($o7S %q+VY%^\/U]jXdDPLhrKl6?*9G?e$-X>k4q9OZ%`^jttB?XafNQGF8#MmC,-f,@?9*@$'mTG?*Bd(YbTrLW1euCnV2i/F?cgR%kNV %?k63(n)qC`^fq7h=:uS9KH$0R5\%K08i!.4rR"W8XNG"uf7(-8>*"S?rGFC@R+m6#f?9Gq^7;mfb8%CS_K@BC>c'g9k"9-]E2C\$ %5U^r_Ul%2jUY#qjqHWg+*:_[H/nlPl7F40@b94#Zq5Aej!0OA``F>F@Q?kt>+.PjPi!u<8"Rn(E%3S)2*7]1 %a#H=O&1tcK#-p$!!`N-'F2i%O\R<^K)fj;P-E.ZXAanM.r26B.o,8(i(Q$QC\g:.E6o25$@Uc2\H[Z"Y6C$ %7$]ZIVZM*Tqae8)/:[G,3U=T@V,jS:VIg-SOGkP.UIqYQRof_eV_B+.'FSo/C"X&4lR`;V%(VfHDsppc$58B7%bVm#=iR9 %(/)J?3mG$sWja`?Bo?7WN=6%P?:+ED%L5pgZUE_4=2Q3hSFEB6YVQ4'iW4%rfQ5`d"KY.F'YM9H4]sn.VMaoD`K%Zd,<67J1C_EX28V[@q4IM@1_YI"F$RLNOYrYEH %ZrNS3-SiA)JUH?\s5SpRt12DdDhBg"Hk(+.S:>GUcO`B57B5X>7UJY1dXgps"[%kX'\GMfb!7D/7jmh8fD7K %q(QG/09i]`VMZ$5d84coD;eI:8+b!)APHbV]GpW-,nLG;\24r$o+E_FTg %L_-W>Z\W@S8@a>gMs.mb0c$[6F`!FFEPCN2A[6>`8VFM;i"RT>m=)dfM\Ph&e2;I"ocZ.m;UYCY=TMAG:!Mg\(bM!%dC'=!6Y1&: %*CX3mGHUDOZFf>VoT:AjQ8\,[%BfZRL03D_8X`t,9jAOMR"dl,,WtUe-1Pj_GEUm$pgdFbhBoJ?)1X&KmBY+SSo1?C3[[r;lm3Tk %.Fhle)=n#7XFZXl"t3%kGXQ*MPK)QnN1<7E3S1kJ3fZFe*\+fJ&X/c7*$cGFaBjl#+Nm?PUplcuf>9\/8M]38V->V0f-+pT63W[# %OMIrp0htn1Op7e;mQ)IB7Hks)ei%IO\nq$k/;MPp5cQ;3H6=:3_)7k6TFF8`E[@'L*J4?!.lpY>U]Mc[(nHltU=3$%=^2Ck7ZJan %@kbaE)NPkI(dlDY18V(N!bEsh'#1=6O?"bQ=c8LNl@=PnV$D]%XCY9FDR>jtA=/&1(jJt.Ye5\:g9u"W(\5]M9O-baT1R4[=Xs@2 %*3LSH&SQd2g\NJ/sD\i0>]g81_e;;a+*E3t'&8iS4kJ4:,m]@=gLF,pH$ZY$IXHkIISUETuoHC4h?ae*J06cH"X/TRj6"/#[XE\LPC#`b3>"n[q;?:h.& %'j)G!8k;GqWBo`KjVNkeD.CI\XaR[5l/6@dK>oE!iuPLkCAVHTfZukl02knuD'l`L$10bjY3aRi=ljkPi`;^[_L=pG]e@q(rq9!m %m-E.9@6Xm;pZp=;?#0upC8R#s&dLXj3m@)43__APR-uCk'C4.*^i&Eu\5$>YCRr%iEMbWfV@H,>nT`=.iHkmWWDhCK];\F?5f]]4 %lI8PeZ9e"pUAEH3Mut$,hJfgg0kl[6iAEFnPO5FePYc+H1.'9#7X?aAgW)-bN7#_(6;#WD?q:27Gbp[m$9.#PR,)t+emY'-bPX@D`dcl+%+)341Oj"$L6T'a3*Z:=[>K`7P)?# %i,"F^Z-gqu7bU*8bIA[`,WPjtD`i!KGUN$'^d^G$i)Q)[DFH[k;HG@4"MKU\3F-ePU,DhB8q'?(EmJ@'DT#:tm,0@G@a8jl8R/)l %%"%!,b$MGDp^g[`#<2Oi9$A;0[iHm,9&c*)lR"C!L)DhRI7I\CjHlqZ6MY]_!Cuq+[cc@+!\%ff*CgKR`nZ4.r=GpM[<>\[9/<'1FIhR[gB7bdQM5>\fV@[D8(I[d_-p,F*ZsHRg"o2S5C!%Gs(c\K=OUa2L/E7Sf3o>d'D"g+?/iLis<0XO4r> %9dX/6;U^F(12=6WZ"Y+lV=+,N` %5#2X[*B7G3S1s/li%_c!BL2&`U437,V6css%(CIn9htCM8LWb^i#tk7\4EE^JWb^-0uursTc*K9$J^\BhS\RF'\%XlaC,[8;a6\j,Y`3:KefQ& %$diI[5:'L-S/JGTHtpJF>:PUC;-7K#V(s*h9k$6tK)6t8,0GHSZ)T[c;cG$+ZZ5^(^C_Il;qaVpN+7\Ja%Vb]Cg,!VAaT$<^bd]AH$jYRF^>=;?VJ246,\QBren#]r?a-^7:S*FNE2T(,2l))!Ch.[hUc+XEhfnl-Wm,M,SF3/j-sUQt0P %/V*7oM91WkO(FuqPsEb76Sf+=4d!-Q,m%B!'5]T(_g+DE$V:J58!Y2Y+09uC+_T53%mJ0?;V(UNMVo<.!(E1*Em,NE%q>F7FNEEL %[TS!NHM@rnK9u0m!iL=e9HqI[R0PkkK;LSb[krn%CMcXSYe5?G#!@rP$N@S6;98ma9.Jt#_>p?`QkcPN=L/]F/).;M7WD,N'=;ug %()@OF.Zk;Y %Jhn_ZfWc!@Ri#+IA/<$F=PL+mKTW2g@3IU:?+iS%E%+2A:_nYH+F01l$c*]*!N'EO4L[]E=@g@S+IjG'Yn2Re3-NJ3&1I?lKnUX% %89e:X6DEU*[4Hu.D!Y:19GD*^fdR;cET!(XL4r$sD&SVXmP,*+dH\8Q*=G/X/d+mN8ApSpT6_7S4gJNR@3Hbq2%km^DqSocrFTn% %(<+F.`^0mPTGos.1)QkP%1=%IEAhni"Q2<*R=N.@@STPU.LQ9Q0$L2(+Yf&#Ypp-t0QK=4VQ^U7dclDu(4rkXj[iVkJj?Hs=]bq1 %$e)70"Q>NQ>$2+4AQ)VFJdG:LC(.O%,j$<>20:7-I/INu6?!u.e*2mH+C+191b=<&0ZboFt=o%4isO\Kg^n.Bj!u#6eN/*$].ilXCEB8,$qt6D:Y/t1G83$O$d%ZK?7;Yg=tC"L_S]8hQ002 %ZuG9mj\#P+bJ@Cud4al]NXI8Z#)2oER6Q$%/A98^<8hIa&J61%AtrK<6L$jWpN.)Yr;;C;Rpe'd4qu&BdBeV3_l99]TIQJT8eANT %Zm)7qfm!sRXCq)nXYg^P^c;U6TkXTDXX+Zc:2(]*o=X=r!bDe:LC*m-%bHjDc/UA,5jcT=5j>hn8CP)>MULm.IU95%gO6'N0rQdd %((i)-pML=^7?'YL8;^Za;Yet>a;S=d'Y-:?b@o?a'k:n*D$A'!8e2U1r>`!'!]Q1@FhO9L#uGrN02`a5;k`$mkNDN\]]kYMX;rXA %]NZrSiNcu"oOCYPi^V'RY^VH9#d:u:VQh$aRVl>;`InEir=iR7]mX/='^aQ,*Rqeoe%!,4e*Ut#?E_RWR8VtolJufe["lhf+fj*p %O0Z8$XFUls'7_MJa&:AGBRX%;D%!G4YQ2G1_@*BQO"6]o*F$..g)"HAf2lk$S^#LHQ$Ku+'p?:b?dRqgmBER'SseMGZtQ: %2JE[Og`g=/^tUP()$h-.4L2Ha"T:R?#rD%(G1S*P'? %]QY#3]&DrQ'l'StF"eNC6[gm)2[6C>XMA:Fp0@9uDs[7X5?';t]NbSCFbnK#Q3G]eSD"g\Le,Hm.&Gf^+O+C6_iReY^[a@NM\BtB %=:f=-gscuj3\Z6n16aEj[n)W5DeCn^CM8Rn[,61Vm4G$+nUm9sR>gkf(h5qL)Z;f+A>D2u_6 %J<':kl(PuA$g4o1B2)$mg=J)`c3I3SohkMDL""$Dk7T-8_Mr+QSSF\Uk'K8I&S$ZMBQgWCjLH_D?&Q9!"o`NL+8N8Om_h,hDE+9T %AJ3kP,!4/3=S<]?E]ID=ZdVfhhDg- %\0/0>_$)E=M^lB(5)1SQH:#`?_3;dgMV_C[F/+[k[dg6"*Y%,=?7Q%NoU927;*bPR*\>pimi1#%3_IjQRKTrZMu9X(_k>[^38i1u %HDlL+>@;HtNEHd7dDf_//18jS6+'"8Tu4Z+B57_bD^8_F8YlV"!d!B)#"srIQ#aXVZ'ntFgfk*adC&5+?^p:<*[G\T%R>>`p/7qJaF<$_A'jt^enZYXEGkSWmP4p#Nt*QW_94)4P)e\[.PS,u1@h']`Ui4na%U]`P7rcCJ %fA;1N[Q0A''^PmM=hqJQ`d):VfcPdSLLWj7= %1n:=1>a-g.'gQgjDYSESGW23O4goo75;-+756F97Vr^gi!dRt37O/HPXbR)C[76819+'sG3'-83H+ns?cFZtKUH!d*b^"Y %F7Vb*0g@5)[>V$[+fb?HV(`H!M*MCWB,<_B^kuQ%X;H-"M@ipk(e\hk`t0n-0c&]lF2,EB>bI%(g(%R<:5#"Ue.+f?cs1]9,O0fN %S^IO%*f&1r5nkA1Y<>i$F`rD/lQB2%:nDa)$pZ\'"?i';eZ)LFeqo:m<$7KRpSKg#pe\e*.gV/$9'0/)#b@\>]'mF3&f"NN+E?n7 %`l5<9'!+[b$qTRX:@02!b'L9WZ%LE&T10'Oj:kSp:@00PA$LY_m+\K/GnM'in(ZJ\EpOa?1+Jp+KEuO/$#(;ZUPGgX@fbRnpnB$t,t'V*ipAD;\=j/.N`d^,!\s=* %22;/^*"0o1*#_sHXg^mk'$-CZ9BF+t`rZ'((9hrss'SeQPKNQfp]0/h27kRJcrE?S?0Jl3u.bs5j`,#b-j(+@DkL6N0 %L_d*=7-c:Xq37s"Hjl2Y-eAG`UL.L<;7IfMdr"%7;-o&-`!VUO&nt#_=fdIrYqAA?OJq+E3E04='q5GkXk,(fpAV(V^04Kf=/Qc& %-Dr\kJqB!9*IQ8T,eO.8,Tg$-PI&l^Uf,<8dKi^UI13,N;0\I18VX65CX$;i(6)OuG;kL=g8O>'c>QRjY0lk1I$:3ANh.iGASI%t %`9K&k3\U]*EiN=OV[)*0>c_uRkFPDH)C2'qmV/Tj&1Y^e6cYjt"6MOo^freD=/UR.jSh]+'/;WpO>+bO''<$dgVI$R]pd?:&+M*/>c\9+3O4^hWbIkiYF;'P4E# %8SYfG$>YDNC+=*_?GHQd-:XKIi3`i]k?osKWOUADgK;cT`.C7uTFjK.@bh';1JQ!&$Fc2dLo,I&7bCU'+8$2*hbrBJ'@,<,$&*B*)=Lg %)b1AJjDdb114$06.OqE5MAf4qmF=f)R>.+l2pC=t_p%m(_b=/ebUgTr.'>KVQe6NQZ@/XWf2VX->I!WJ^b;q\e5F&pI:ijm#'[cF %;RrRVA^[$887-FI-]0EtU*[h$_MffHI7RfEm< %IoSOCS`ErP[Z*B)nu6J^s,HK\$GiT\e?c0.D^LA.aFW_Ad.=d@g4O.^^,o;eKi90R"5>M_!c2?^3q9cfE"FJJ[@n/36B+]n:'//$ %n,Lfq1rbB:q8fHDO$E&GbYfWi?N8(QNX/\N+_d[JR#;u*0ND13-;nV^=*)3\??p(2uTF>R& %F6(8OgP>;U*q2)Ka"*T9YsC!9"sC^5Ao6$pf"E8N3@YXqPY0IP_23PmFU0kqWA\X(Un#/P(_RQcPcZk?b%YI.)lH\X\2L.`kk#bZG"o`NP%k23T65s@"FcC-QD%;3Xt9(.?OS5*_>8.mA1J@"#R1E7Z)d1je!;I`=AmIQ)t)Jm>&QXh]:;VjXqMGd!,j8jces/'dl3 %?:2/A=-0QLjNJEOERJ)`ZWi"T;V&M\1ISA-+e>PH9=_uIe>i"EUhU+A!l%R]W])D5W--i?Fg)JjMVM)JX5p,Y[\Tl).iC]^c=9Z> %YbVn%0D3gLPu7_o.A[AHDF/G,+Aq@9p7TB,"FdOn3H_SMs/E<9asa2V^@E2S9VL/]Msgj`+kI,.jLbf5&8ncKX7:'W"tM5uhQqK$+7Yo9*iM/m%9I8*"&Pln.P\L?SfHb7?;K%7J,'#/eD&QhDQV>b$nkMUaC)U$%5ZG!:?)D#/kGYpQf,P"eYeq?^`*;ireAGsX>pf?2hcI-<&DSaZi]\"WO)kufisafLH(Mb#G#[2iI,2)<1*Gh %AZP@;VkimAPi*QDYSXQ!1CFI!BZ_Vn:1nSS.RuCE=mNglP?&W9JM06`St4=pA*lZD4?.YCq.rE-4i2>jfS\'!%6B_!q;E %-(u=1NaY\Ol0On>?>YBD9M%dDQ5_-J$;\ne--3sg=XC$]@KOR4#+gf^_,G?TW(=VQC@2+o"Ad1c&._MPO1f]&^jh-r5I(qjW0n+Z^a+@99^,^T&>dK=M&[UfoCe%=PR;?&c<@_%s0XhN/#BSbo %kn@\KY/7A%""]I'I/Uq*Xpq@WL#Tq:UWYE%X^U0&>8L._%K@5'bMos6gOi-n7ijT3U=PXKN?djG]r+2AJVq(<>*9)u,Q_V)a'#f1<%j0JM!N;Hlj]K^YVNpW+(( %=5e\u+ZJ'oc+[G7UCFgV]0Qof%f][_j8N^%;6:M;!iLI1IoMq^O#X/gBjn76(c_dtjR/\N@50]B$a),!40>UVg>G*9q(siOZCgf9 %lr=t6IdfFQa)VIH+D"pm3-+N?^o*D&E1lJaGV!ASVa)8DC1LtZ%MJ#E>oI"alqqdo.dpOl5^11Y_`DJMB:_-^.UqZK)^Zgfe4EBn=$3;FU%0d*'=)?3=aN+VtpZ9RSb"7E9rDcHD %Bq)1kE:9J$2Gdup%TU-7Z'Vi-mK7+8m9D;25M=0*U0:OeE/LsbL(KrPk!kj'k*G=$i&JhY@Gq3l=O+70i+It6;VR;su@&[r$-f\"FX^p3F7D9oPerjIu+R4%k'IWNZ\^&$o.\Ma]P)`#CZ8QB?^W$l/?C_*U5Y+=#sA&*J(s3^35)f7d%W %cM-D$;e'GC3Od5705n->_k:Hi'$JT[e3:.nGU53&=h%o!i68:EF?PNYAHt\1Ls;Fkgjr*e8[k!;Ju+rRp;Wag3/#V*1/Uc`N!Ui$Lf,\8VjG:/U-X'Ft0,C0,6CD*">%kouY:tIIF%:eahC2u,SdWMbV?BBc!-^i`:a.P`]0UEZ %&c,pjEXRLPs!hTTF80\5k?'P:/AS%PABh67%brjls3+kE*S&b6`9@H)k/fYng.WX6^fTCV9(b:bPI9m6afnUG;8]gNeYmJ#qc/M9 %o4g@l`uYd)L`S3XUo>u!\T&A$ktX8'h,4dbe\Sk+%sUN(^0ti)1G)\+1qIm!9e+9EEW:d8[3T#BH<3LhI2'cfi45NelYutS@bWUCl<5mR'<`.;SBu29,Xgh,@5QP4>X#/edJ4r)LC_huq-sPF]Ca[mLI.^2_KRr?0ZHYgEb2*uK %T#n$G%(SMt6YtC9#K327cBN-6GiLg_fZpFZZrpt]HV!N3@U)f02*^T9?nTD:e[')kMRRhN^1-(mDue:O9WOe:(8bLfQQ7S;YN:_c,kWn %lq+U*p-dO!$8c8aeb>&&U'0CM0m&V%TuZVc&%TY'OaAdF1HUHp$DkW39MVPo`f^)k-Ze(Xk? %X'lYgoXoj>jh>EW\9'$["CJ^-=qP[UP%CjIVet5(OV]aH2TND"!gL8uYX/o&=Y2DDZiOFk\ %W0>qW2i#/Id&ha!NrlNc&N<;hp+lp&2n-1GCK*1TC`g2_M#_Mm:Lj:a`aaRf:_P-C.S>QZ>Gam %[>o\3r$3rE.Q1`X"%#eTBfLsWghL/S`,P&/R*::?#VtJdD!7>#$[jYB:CZ1,c*&;m5NB?0SO?2_,9!'QSD?0jjAdm`BW!X0m89.n %2m$n='rf$MNQ?-Z6S!=jY7G>6YA#Lo6_$im)M$Ab[_QRuI`h#Ya;^M4gEBqBcGUtm-]1n_@p78:%u!%V-hn@@\a`j?!g^1*%^?.[ %>&Y,L[VBNFb3rjc40,@rbAVd*nSZ"2@[/-C_d!s,@)j5^;.Z0+XX7fS#+'I7Oci2tSd!e&m;!I5+Qj;0%)OOT"MQa)c(G7ofHX%e %%1jd/Cg>1MBgVP"kY08j6eYrZ[%8)hMdm<@/'=XroGBog!@IDG`!k)b\?7EZSJ@S*E"EHt9VCHqIM$2%A+]I.O9e')jE%BggH^`@ %)%-^+KDn_M0KP".-T17qG7$k!"@&.a&j8$s62t>_f]&$-qDpd:AI%6G(sm3cerm1CK7^3$(^Ci);a]/XXFnC2B0t6S^`c)Z7ZD8CH[u+>HX2iJ"^! %_0][_'d-a:?)3LkG0QF]Q#(#J9Xo#BJcjS>ELK[q+2+UN6hOI=2Vg/XroAotOogrABfOPS(%QfO\;'b>KN"U<'?4+\E"%:>U,(*V %)CFeR/QuT"h0^'g/'`L^XE9tWFF*^eGPK4D:H*hDhE.gpD: %l]+G*TGHsK^@CeYG*pBWZ#AbeTCh]D&CtCR'st<+Ub!TjMQT6[3<>KU')dR.r%'B#fc.Dk\g#Cpgg3E_M4E?17,@\[RaKV\Q:]jY %ZsXtbGe9T3;RpYimG_-MgpDO#]M8%D\i)W'%be0_@sdrQW#J'-](8`!i[pSUMq"`\Yq,6k?'KYi"^eaEg$h_o8egf3Gn[_)ls1V4 %XAg?J?1/dt0!-!U0TjCC4J`X?]3]2[V6pG.B/+Nlll-mV"G4_=?P06ajI^;:0FN_V7ds&MSuI1ARrFiSj4iAZ3-`+%VeaV=DSgNI %nSIL`g:+Adgb.g551A$bG1T5qsB?=K4r?:fM-VWGDL%Qc*$5@K.*]DHA$.5cprF' %s'K^G_m^[MBGa3/K^;gMH!A/OPO7=VD`_HF_5;VqT>-/5j#&YEWi9L%mnHCB83U;Gdb?@#.aj6QL(ns#`lU-gApO/pEq$Zp6aWmm7]Uk:*3i)=uPn'i_7fQpE"`ZOH"1_$'.a< %V/^!I>Oj6YQO8jVpg+Xu?p\/1VRBW>BG5%@c9mR-T%4M3dNR?\ef'EOl>c3&IN-=3buI'8p)"B^;0=X;( %@NJER\_pKqRbpJ7-O_S\'=`e8X*c(!CeN]ocr2-nk4giY(l!\]*-.Dq`TZ&mFEJBe';5F#]1PZYK%H(FIL)(Q;N0f1*ZD[`mSkl. %p;XAmVkY.u\Do'8r1L3$nn8fO%?G\c4!TkYSHl^QFC:R=9hFS0Yd#j/*?FG0f,Pa#eChSCS8OcS!)9rD:.J]-SJd5Gt'&@tk&A+mmP;Qbt\5[56#OrV4 %(J/$VS\uPn'/A1BI>bl0tbqk?Gqg!-+4@oO:Q!JZUXnfA)3a[ft>;QGIE2TFd'uJt/mlmr#pk %.%Cc2'XaoG"5Q&-G$p?Kg6Qf4'ASsLQqt]bKu"BLO&jc;`cuF\a,tE9KTRZj_)8U8Yuh9+"2$,MALMJ%k@M5S*0@o %_BUqC/4Qat(eMo,T@AHR*l=T.1nRbL5.N:Ep.UBT_C_?1l+sV]4/^dol'h,"eTlZB!5#6o)n2$#=Ua?=]D'C.?0be]]>>N6mp-!i&.12)K@+8.HF1WLb2hMuNR2;5mgYW0k-TWg@O=[[qQ %-nVi6.X++obKfli7P/O-GoA*uAW)`JW5e-JD_kVI9,lo$;tD"r4A/W$VucNda!/TJ*gXV\TbC2u,!;P_j#b$L,/.R:T\%mV4u=_[ %?@>8Y,?tHJ1fTiJp(WId"p@(joV'Q^#qI$eD&pf)]cE0\&=BY+b_odcg+eHW#KoT,EmjHGG@?]8gc-,0\l1Lnd1XbqKq6W[i##V] %Do7Lj_G;A8G@4%?DptH3p25.C::2^&k]f5t[A*p2QcTg+#"PL@YVjd''=r4Z-8d4K!"<_1'"r)IN=Hm9#m/XJ1*]k$^e8/pJi2C>::_L9N1=:0.#_OGf=Y)\Ik/p;;o0\31H#H`/ %09#m]="uXd_!b5X'MhY2#W%8CSlU15hl_0Ylf% %cu>=aTJb9gAjR>BRr.)M6D\1cLA63Tr+Em6*-t!dHsAGEA&5Xp+ed2K#KV,7"Ft;O0;Mn-*tpi',8-V8Tj)[Sj?nH(5:jC\1mh\0]jSdh)P/_X!`5OK')Cd$?!5"qp"MC;he@hXnf:mKNulgeBt\URi=_=DO_R8RTF:UWkD8 %&b&?TKOVSgfW9D[Ju7t,e-Fg/XLkpgK4GMj;>[EG6nuc"=g+R"rR!liY&fnN\pniR*]?Yg'<;m %;D'Am;O62b*$cq_JfnGWLnJ.Y/!YD`=R'=QurLT^j%FUCD%ICe/+-scNP8.eRJ[;n>hK4Jb$fc'BQ_bf;74:$17cE)IEc4Uo=s]1U"(.bc.MR[3!3g:^ %.0qphO,%U\(W%#Ho+6!f'=VB1'Ai2V,e]E>3,U9O5n$kekRL6#hU3Mk89;u %]-S2^$u@d&d&J[]J)/;9/FX6qS2;:Y>=7ILcStOugTME),(q<=a!"l'RtT)VCZH:JI5s/TTQR^Q75]0Y0kGjh\?t#5E[*s^4--+J %]9h*o9qI@$*Ao"ICC^5[CPlF4j3]LJ9;+]XZ,lVP3,)gRXiLb#4PN@4ID++tmMR(]Z]1gp0e<0A?N'he+"m*n7@sSW;S)=O0@qG_ %f=!/dI0R?_8s&62.dL+Yb4cP+3s3&G6=tYK#/ScW,?Y8%4R!p\XU`:j7>L?"`7=ql;X2?N,/:R@7D9?U %?Y*$Q*Npciq,ATNH4WYF2kZ"l!-9dl7sC*3aEA$TSlLftS\fI*XP52\K;Z](@EA2I7FgXm()!Bm*\:`gCH]mH'q>uc[d)XZ"cR]E %(9)$mp\7t$#ScA:GcQTIoKSk3g.$%9R#U+.@Qc>S4Dd3e6qFY(gAn!i#%k.8$<-u4/Z;T*N.%N;eY'+W^n&CofZj+_kc@XZem(T'F5)&r8i=>q.QD;ro^;JRt0XEan7$&SFE@Icu5`(Ym]:EA/CQXp$mPe6^sV+_o'abD]=d %k<'p).?>]*r*V*L(iS.83$_7$bj"V,nu8tp@N+[$ADrN7&iGQ6/.?HYA8mZe6nSZ29HT#2I!A!(8sk-M;ojHt4kKcF9>Z)s`L/aJ %7[6RChKE9810mfdAk;!.j8S%8mq=?S*u3SS(u^LHnK?8%0-mNk`rH!R&aCP-1F0^RZK'SsJ(!bks-68\f %_AQRhf(6*__L3WBW<`67aPj>ZmH46F\W]"4'B@]PT(<183";p-WPAg\k_M?2ldiF?(D]2^>-+tAc)6]V0W]JOb%8qk;Q^9:CrPmR %"HGo/\cA%P]E3fq#BM1`:c)uV_E??Rh#I+6,4#;YC+eL2`uP&]*=Hi&^6Cb-GbYS-/O'j>P"5>V37jOs-n+j%)3gQ->UH2t"]rPH %dQUan:2;iQ:d\4O(pm`lhkpI=*Qr9+"dj<=JIuStF>Q2FZOj(+o4m2+*'#@>fZ&2A!kdq%Y)EU#aH]o_qC\`J/0sPn"S^Kl55YdQ %@*a3n(*@r63>,&M`Aq5f5aXs'<5T9_d-?&laL586#$B:*_qH$UFXsTa"PV*471HI?G5?+;E=B&=!S_t$&"]GTb%Il#!u:l)=kE7a %hOe8P;noi``J!kcd_ZRTUkb`^-pY3>!"l%$Zc!AZ+>EL"[$iAi%r=(+No\!]KL-s+8';(]p4+#&^P*mrZN+>ogdaG&7VRu*ppHKgFcCi,&\25]o+F>Q>hU4]cK65K7G]cCArY8., %`GV@+O^9D=bMo#0j%p[Tk0C/mfA/K+7rkFVh++HA1WbZ=WpW-i#I\i)cIV[XKV#M%"8IY&.`Kl^k6.q#`0=b+,Qh,W!Xl._td0]TCFt1bD+l1S7OJFMc:`S?1p@$O.%52qU]WV[\HIm!Q7e`>O)33]q:/g)+?/$D6rf0UmNJmnC?PqW:+b&Md^m %:!bR+4&\qED>,->*:Qp<1DO.CYKC1*J)*0Kaj%<"0dq0n[t>LsOsl*eS!j.9HQ/@)JJXT;U^'_@`K'AI@) %o!8@Lf5,jNJTj9`pk<0L!WMS$<&l*=f3@ppX1mX"IF\3UWPO=8U>JRS[`l&"BS6g3Zgm$*L_GtYsoVfuOIn?DKaTWV%sQcMZ2 %"NXJtZf+(2jj#a,VhiM"+s*JPJRT!^W9_i:"f&\VIb>V^!]GU/a5L)/i>B(5&IM/[>)gs+W8JH@p=^<]n %$BUl'^N^b8eo[AdrYto5Z*ocpKJ'YVFb4US;Y&IZQSlng4hsl0#nm=Q#=-%_FU!J\crc\_3n^J\oiA %kP9G"/I@qXTna'#`7>/-BpM0B%cCA7d8r`-=!FV\.?_gMdRMU,B$RX(a58O/CIN;?dRj%BNHfP$.b"^E9*%FrKdc0)mLaEG?ltue %s1i*!]SLIfAN)Dc\VP.q*u71R#>r=[aQ3[$'0L(s*n$Q^;!0RncIem'e%#R#-uR8O3g&*>/lbKsboj>X:5T6S+a\gB"AXi+$\UhW %Om0Gqc5q#VJ`pmApE:8O->pmh'!sH"lW^-\tS=^FSja9plejre4*2NG:m;n"8e]O/F;%.,.1EPgc%'Zg`%$@?js^C6oTY %Uc%`%_HJ29k[n<9Rq?`BhMTS%Dje9s*)8k<;!\Ze%cWTQJ5E %4niV7NUrQNOMSre<4`Z`DckGhou&(JLG3J)<)hhdl9jLJo&:#-8CVFrh$pA#Ul=Y'O-Sq*jk-4*)3#laRAnMHEG='ZZDN>PA+Jb` %=d3'lGeT8-800T%A\RRak?64k)u?ElmL1DmD&12E[SiL]T*QMO@7<(eNdJMh?kOVf1R7Wsq]>tFK3CjQRU[pjmi?]pEs&B>!F@5s+N-$W1,-/;EdB!$cclu`1oDR>RM`#Ka#*P@.) %,2J)i9$$&IaRL[q#qB^qHEIpMm[n`5FJ^Z\gK5R+Q)n?C64:_'?pC]CLT/;YTLuFW?#,JPTt(Ilh)7TaK_5l"qb)?P$"S/i`LR'G %(M[D])nBsGV&T[FWdtUOZbD9.#o4/M^OLJp:L*'4WU@pN!+2L*SeAPue]$iL%B\TJD,OYR7$@fO"Y(2me=Cq(65.sV#leR.om-5o %Z6Y`&U>`%&0uZc*%jo`,)B@)5rHC)AIaTakpV3h2o']eE/6s%Mqjkq!3NFBqE6\CS&:Za-T8_Yi-3%hYMhQScm^%<,HFD_2KV)R3 %D&mfm&M/-'e?)[1jOGqNrpu3&k9oQi8U8"GT^X"0KSq..249d[aU*DbEquaD3B2t(_:o2%o-`U&?*>'2a"0>!?hA`Yg%kCb6Mgj7 %o-FAGF[7fK)tGDSR,KI(+i:E)T$[>MDaIQkEo63'r?e6Pj&ATlACe_U8tm[n3rS?#_0g2^A8tH?j#6kJe8+Ipe!CWPTKQV2kRkT$ %I,4W?bM@[EiDYe$agFP!E?ni7``$oO2CO!9O#e'T+.U%%F_Dl["7#CWg"00:jk%tIdpq.%Z(])@ZA=0-?p.RDs3,OO.L,!VFQ]4l %)RZ67]KN5u0E:tCKkeF8+<5Ht'15_f]lBZ8R@jaYs%e$aI]LO#3\t1D(PDlLeb]c_BQUG="tF]j;`1@M3DpY@a#pU7KO2"@$cK!-hdlJ:-](jV?0@kXF8Nn.HE:SZYi,%9IP,\/@YUaFhs*hlSDbH@Or(=kDWIO,u>>'bs?o`O!R4_W[$3&mP/nm815ra/o\jd;6 %E\ekIhf:61lab9SA@rjI[1%NU`WPF8qm3(:n+cM9(Cijo,*MS:#W$L'(SRX"g*5f_Vc(+bpiUYI:@GN<2I.GmWM.@1-#!'8Yf\6W %r.pQiIss7hO*#^6^+>JkXV`!skDQ;)7SGNB8;8nU4XE.\]l(bM2r`,B\0Yt0&iRa!>e(I0dmgui,Au:mKd";liltgL2W>1LC#_[A %/N-#`pFIBte\5k<1F6q8FkoYW:55(II6_oRFm[u8qIq1O>UFu*DWXE9;p*/&h;Y;>rLG"^=+]O%f5cuEin.Ua*5]qR\;N%8DT(eH %&Pm;_p!Xl/^'Ha.Mbo3VHm9,pUt#30>^[jbgkZn.ikg\"//tiRlYId]8ks3@P8eLuNL9$:o?:YgVEF]#T+3d=>J_/r81@Mb9.3V> %rdJf2^*sd-b-cuY;ZG+sZ#hF$2r_Db\EcU(neiBdj$p]#7bkNdpX;UEE?fA+&Pm;_]$Fe`cp(ldiUEQoU)jQ.U`9/"*5]F2,OW8X %ZZ`>7]%BTfN2%#p`(&Ol&Jo?'S-LK;NLsQP>&;-l^R;j-m`Eq;m,-p=/@NnRc)\4b^(>FpM<;Aug^qkR4m@:&;8:s`(aWRiIVr7q %RGLO9V##D$Q1iu)C2dg(jb9;V+c8$>93,5!]4WUZ^W,i2s(%'ROG!8d].jQ=Vl`cQ>E2.'VjNFf&u8S3N3DUac9CSTjgJgVI? %;\WHePp3&,BD&!7&Z0J3^Bllq#6De8SllA#G.43Li'['1I^s7m&'KVd7BmQFML^rRQKcR(3M=NdKrr4K\ofBoHmHXS4#*2F]j/`g %=e9IC&T\R;]XDnPp@fNSpuG-PlTneHM/.$f1^\64ZF?Rh-.dX&3hd;X`$LN)Eq, %XEK_Mqu0k2kC^!p2jZV%:T2l^i-f7SCr*kge\8a:J*B*Q320E_0cX;h75O9ufU;Z6`E;duKCG"O0Os:I_7Hf$1FP/`63D%+fjWN)"KsQ#TI@p$FgKScKmfOm'`T.W,I0-p-]/Lk\K' %ZHS@UCI#3bhNR]-1qXtj%tlhlZ3ch@gfE(rWI8M#WHu)tp):$k()'c00ifW_`^Z%:E^u@dKZEHiDuO5E`OD@'+fFGMBJ:on_)=hm %+(r]#itiAs03?CTZBsWdZM.2R)$sN)F=:P\Kg1$IjO[2_X38%P`2eSi=i$Vrn %;XoBNi;-]6USN"o\sm*5*3AONIbI6B!qONF0\naWY,^E+\;a@;=-34.5nQinmb(FIo)]eJ).$NWL#S*Ip(tSo0=Nb<:p<-#\-ZK: %Y2n+M:5F$WS=GW>2<:>MZq5lB+GSWUA8(nbZ0W@_`RYf*`+HM,flMbR/2SnkphjtN#Toa+a\4<+41#rf]/bakJ9GKbnLf[a`O8a. %#>:N?>YBB534up9XnQ[tCQb3%9m31%1/XI,[*fafb`7#hI=5?-h:.8&&_Y1PRsNiBnUUi@hquC6KSp^MVoI]&ZF9t(STKN;Fr:b- %bu(>^Zr9DHSK&1gq'aVubJ=daf6'2=C.>=UAK3`fRQl1\Q+YRM#(3S!.ImQJg#YGOhhud=I3!`+CJ=@28/kJ`2dN?sNS4.Q9+o2]R(B^G#-c4V%p(c#3quYDHi6rRt]LC>\hu[NV&,6amg- %orK"F*m'Jmlt2,/DD9Zh-?)>tCgT(l9e`:GV'cTF"6@kDmlN?f"C?`jMIWDeC>o_$&4p)j(%9pW)bG1;-TJa'dZdd/-3Nrd!08/CPOU>"%I$F= %e[+*jKjslP5&K^T.H[ruc_[rT`!lIcAJU+<[H@K(+_[mZ7WH0cD%Y:!<\B",<;%?%.+GT,i2MegYVTm.(#^aghE<`,Ce:/^R(#\r %ojoW<>)RRgG3)Hi,ZIC$S"kc[[M\2@>>gFtXTCEpjkgT0/&CFL`-L4+_QM0Q,_6+`WMTNmdE-&+2ljNUUoBcO=)YFo9u;7C %>:s!VV2c#VK/KKN5dR&k-A:N^0&J=_,$`r=)KJiBNd%LkKb)f&)[ftXX,1tci*2;$dS=G6a=Wo6Sp*u1&VkPUrX+CX&r;V&4d2@u %,PdqB,FM_?s2b&nm5esu@!+^N`_$Ok')d<4-+S]8_Win5L&L2V.=e'MM#-(;h:0t>*?E(O?MTpoCrZJm@]HbRO81`%?3Ue2BU%_ljNHM+9-f^X2>q$RArFt=#)UG*IS*/W;?NBZLjY2/"1 %E46jdK2'1G9U)]f+KFLV#ir$sdu7`D'*Q\QqpK/K9oD$!I&DV8h3`h*R*s?"4Cb5BfiT5@o<``-K)5YY@9Knm=[*:G[bBh4qQ`;& %VrrKT8K6`*dP=E3DS&dBRiGumj8j\Vb'PfMN:!dEaG?Ed/l>B[7F]OmRH23Z;H$Sk3?cGdC]5'8US"jW'cp8E

%Z=R!T\I^Z,&+o.,%h7He87Y.&@GVR*FWUNNSnUfDk2M.MET$&:%S_pT)$hT"cVJ@eH.s.=1mV[(WM%cH %UY#jqCe6+oAH0gsmLYL`NSL/C`Z?4:3^j5b93LV)[s_'7CHgX_\Uq]o/Q$mOh\&CZS$?W`ba##7qdEii2CH*Ji,$a(9BXA %.t9S=iZ9"'\s?KV9++;EAtE-P:H&[)Ie@>N_sejm)+>K*K0\^IZgbL2S^T*m@>WiTU1Qdm]?k3ncGGKrN27gLAK1+bEd-X@*^SK= %5SlEtHY$#s@V#\&A7\"EfP)T7aanN]GQKY+e:9rO7jrbn)X"?VaFr>M16F@b#OqhrJP(eDcWC)OFHJL>jlqCKsNWuo@i.OWFY7h;kQ]%:IPC&<2jSlL&T<5^r7\b2N)*?nWFW@]dR %3HMUJl9Og\SiuKG:PCuZLG7)?_X@U3T\l^"Kjcj@,RnP[821E,:K\D^IdqE.W%aI6iPtk-!H2h$^)f@PS-/dC/GnRQn`45\sY'.Gpb1\p,!T3D>T^Qg3JCF'q2Q*fiUNTR/KO"*" %MQa[%[H!i-RAOt=QCm28>9CG %UJH3Dm_].f8eJ%C36Q&*j@OZ5^+pj*FORagVilp#B*O5f#QqMuEW4Hc]))a:W/=[@gT-;lG9tT,+iK[Ff5ctibYdWk\,>(T9q6m^ %mNri5h9qQ*1MPXno&AUcFQf8S2TM-3?2=,7>agA't.N:%#Qe#K)cb-,3C\n%_4g3U#uZ-7M]J>Y(S %5dT$2^)5\Vr5@(s!74N3o&i!+SR.RLr7'QrcDDPXW]DLaPD&4D>bCr!1<"hKZ&6$CubQ&+<.`b('Zf%>P#4T\2bX`,lK %.egI_X*!fiNF#jNm%hJLF)^_eD0.ZHo3ZL7r%\fY_[X0#_8?q4DT4UPLllV\#EthJ:3g__[[cf3!YrN[]`".gZ@(lGIEa2ljlt0Pk]E8qgT`EQZbcCY^23;pA8*)V2o\?%DsO>"48R4ZFT09ah@dYNBX. %#)e;0g;Bs<'9Q]COR&0G,9k?/jRJFd9"om5?/"(#r;;4l9=Fsk',KZ%HBmcGF+(MWFEu3PMff^4C)Z3]:?Q(j_Ug==__]T4J-m-I,;.H^ajPHXqLCD&$`3TNKdY=(;&<2gA/S-&AJVo32q#M0C8ChKa-Fc1s-AVTP%EK[-^-k,>gQc0NgMSC"pjaIe/Q%.i>h4^66!X,;Gk-CW('nge>3d.j %>]1=&R>=.5fEW#bbA#NgX>aKcI'=Q[rgN5YZ3hbLgC.lZ_?R)h)E(%s3]=WR\_2=ETNn$;>^=EfBhGHJilI/Q=L75\F*6RgFFCP(.pqmcSDNJ0Ym[,'\urbddGW'2:s'?.hqm3! %G\,=mQW\mg>blr58U"P-S&m_Db(%t6a %S4l_p5]C-p]iF.gSjm_NE:LADh7-LW-mg]e[b%%!*KSuA:a30 %O5#L<]^/iZeq(?n*Oss'f!fpN,.8X4G_<6eGT@SRoPpjUZ\(Wq0P[\7irhrrY3:%t<)t$"I+iec]Qg=9a"tE/-.LpV'!t%m8!XMI %=U?ga@o>7\/trQJ;2"junrBmG8BmHoN9PZR=DR8F,l,s*\$ZWR-dA4na2$E#4q"?OgH:#hgdB\7GKVom_jdR"[$Y87W+@XN.YWI: %S9oPlnq]+uN73F?G7TLYi3b.4b(PmKc`@,;aIT_.)LE\*(>J+8L[P_7XVfNtT)h=0 %P"OP1f#jt,Vfcu>[.P%_6B>Ssh3PC0d1E8fm_-pEY+K#MD''29^l;CP/>7b[\gD?Y)cN=Yd1&D))4$4*H06mj"gF<4A^u?bWQ4:]7Bu( %0&DF=>6OY"jIU#>,6kY&e>(C;L(8+`>ZDUiD82:so+V'CaqHik6m?gWl_GMeQQE!TG*F^OT4<"'kjWUD+YVf&54q=9pi*KeAI8U+ %`A`_pfh$YXUg>o2Q)'eIe%;:[?7JSdD_([W<+Lq[6!NMn'2'Et#\PVgTnadLZ\e.E+<':G,#:!aKX6Es64,3WV6M-Pp5:PF9-Z4N %,j4eNj %+[Is0Quu2gg<:^.%A$$=Eeb]nE8V*lD"'=nls3_Gt*Sb:^$ %arNp^(H+>M?7b,094Xs3a;m-&R-H%kN9^pFr(HC$F'@)br_gYR,Yn0$*VH_#JjmEM$96b&K6V8RRM3\L`:.6Dk %,,_-:RNE[0RB;L=a]Yt-$aen+fFX@\8IbN&a,?A4rJbK,6=^j:C&k03)9^lDLM(KMbW9l)/G@QZ1p7>-KYc)gYbY"4;=b"S:/6=K6THT63/Wj__:,Gm.%=Y%/9t0U1C`pR#i<[u %$RZog%3c<3")Wl=2-<'eV8$o\e0=YDU`Lu:S9@p`XfQ.f,7[7Ah%h2TqL1>7f5-E*?dCc?81km@Hr^QiiEUmAKD^;fS\o2o)H(+K %IaAaV#XOD,/2-*+$:%]O)#k;DF,.jbQls>B`l`S@FP/NVF\RHbAkM1%fZa/2m$e%eDtHc;A^p&M?oC`oD6=!u>(Wua]d[S,L5_C^ %-q=h\J.X2Bip?tbCieaJ1KKaMaIP_&6B:c=96!;UJd*Ip,4t>2!eWT$njPao]8C8[kF9PplH@lj5qeT[Pp<\aY"<1" %2j7c0-H(olAS%7)PnQ*irRcmQ.M=aLG2?brNpWlc/@4-APSl/6G@p)q/L\E@7fHYD3d0Kl3S3l:eq01\bQRY\,\It],29*LO]EZb %'XhTClmi7cZ@7hm=^`=Ni]R6&SHUC73\73I[@LPDRWik7ZRPFFgb4B\kHGUqh,RhYNU?l1K\n$!kqiVoORj[j:NP^hGLDkkG4O'U %?Ql,Zn`"U]'45j;mruZG&bB+j?Ar[&V:M!8B/Wf\R4a% %7;KR]c:Bh[*e/6lO7P>6)N^&K,R!7F6BGF89Z2/S!'-_$6HWd/>'<`0.J@S>bWGokVp7F%c@r7Rr$!SmCE$9/WJ6a#;W?C6l0[(\VE-A"l0!9R)/PRk8pbiLEQW2pISUEWMU'Bp""5I9cVP@MnJ^WMMQVO!G@*#'FZjZ/Me\4i#"t9jamGBH(SiIS,q%PJ %HQhQ&/\/E(FV=N)Et$7;m%S&g*7MI;74e0"h7T?/m$pXf_Kk:K-n.!?4<*#+5.mM8O,>j` %Mqg1W>=rN1:'Fm?G,B;lgt%6dnP8LC4NV323o&n5HnA7/!BU)dPVs.4D>b_sq^$S*JUN[[@GG&ll(Y[_BIs),aq %jHiZG!YXoDGJ3J(SM%S(mKEAZa1,)jm64hb6AURY#/a&E"CS]3O9qHsB&OLLngeMD=>DHB>RQ8B$`k?HI?[%2eJZfKc@RW]NVi;aOn<-a#W>"`o#BCsh@Q(-p3)i/$1E0O>a]Z?n">EW%?C3k8g: %2O'?XabJU!FNU`i4*TAUsWLN$S]ZfA\A?-iE76FV>(2hOea)rYt$qAX_N %PO2u#\->_@;HMK+bu]4,NTCJJSFXpgAFUr&p@.TGk-dE)?bVA4rAU)#JFe"$S&X'AHNk#A-M4*5.4aOH`%4`4NL37>0o>?_;M/,S %ZSH'\8bI;"hKfK`/IZt&1H#B1Jl19.*\N.OWfSg^*JbUJ[jcdYLV=-tsdF+O\uad$RJg!Z!i;skY?#=?)b[!W808&QB#n>@cHb8^+oC2NaM>faK2ok^mWKG7IG0VZOj:P$E*=EXUJ$>0K8RV\0-3C %SG[_ae*gZ_Rb&[o6_5G(kfTOuM)&@qDpLsWZ'7$st,o>Aqad-R([:AVtTKB-4^BD47=[:>3$^)*X&&YoI[u)o*(2G%-k.2X`0(%CP8T\o#)^T\KW1f$gEsGNYMJ` %LsONt$-%Lr:OS5=@8CVc_n:LV9O*77_6uer$/On?Ku^W>XG:oGXSMdPYIQXS2=egF<+_lDSa=N=H6`"-i#G0<>V8F^98/:USg=UB %af4.KLk(u)NJJ`l4H\cmqUdF7a1Zl";a&sK'@h0dDS+Leg;VA?/QK0_M.F"`0ebiWfO.oLr)QpNFBKJ;no@53G>Z&Y?t %4e#Z]S/U*bW+2BP`-c)e[#-I]jqKH>Qki/4'N)u/GeI]!%;Kk>m^f(>VqtQ0CF-+,N@;(Yp:&2RS1oQ7;5*8n:;huGF8/X#-Ul12 %'q34VdX^'b"b['!>q%h]8LKl=(a;C..YWn!lt0X'6ff>pA82,1_+?5Ul;C!+K[5Uc^sK0gcMR)t`%GmWi,`,bqf7]h1d8Zl-.1Hl %J/[tr8>huDFO*Ctc=-4pb7(/U0\6$74aE)jB6/m5d]MK_KCbu[>W+dP4V4GOO)X+W399k1I2(JV&s7io?4K,2J/k@ZQD;0(OT=O0 %R>2AEdE_j8,fj&:?^gJ2S/,+i]."DR73 %CZ&^5d5-4QL#FQ`'IR!QaC=EMae]4"=T-^/_%l;IF1X8SYf#6Y)L6(p\E#U__J@:E3#7Nq?hG\-d#$,#4Gh$"7C^a`9lW[BU'MF, %KY%@a%Bc+$OAbDN1T6h6E'*.33)tSb&'N\4QG^cca"VgCC@Fc]aPEL^?HH'I.K8!m]*.>m.cp+^LIgKDdd3 %@4FZEH@f`ip@B:@39<8C%1SG8)2%+GM/_B^VHIFVKHk;87;Q_SfeBM/p&jCof2aRU*(#GWN6/(#U,e@k,I47H6Ps1O2%'.i&o7+G %'1X+u7JE["PBn&#@6[h8P)M%]Nd@1o=cFtJlo4*=g@dCb33fueBQ1:RKMMNTdts;k85Y%%D[D833RIPPYLMS:qb"UMEo2g#[NeCV %^ODn5_M^*1r/!9h+ZCQrm5n%bA\%3/)02%TlW&UeV!N3_V-qQ^*4=rdaj"p'r&u[UHrc/U^X!!>KNtRuE.0oPlWW/=r&i;#>U==> %rH7],H`H3`T--MI&[M&o`g9"+rQu(h+?`-lqXLk00'BJA$WS=uqgP@Z"^+V>c@&nR %86+9g4HUn@.TS!3k>,#r0lQg0P[Z#d(05[./Pckm&YY]/q,=3^dpon4Y]ilbNpE*Mp-^+s.Q+*N/Ad:M_[sD68G5YtjsNstMW\'4 %ecK+8jYKon*]&(/7HJ'r#ID*2it<"sOTLjer]#SK@u/eeM++*C0(Ol_'R<.;"dlsG5eRr5$'CEsW?L>Ks*13LO&bU72_65@B6(:> %auZVm)jh3_CuIBI,';tV-ncpE<8)5KY+]+K3fq@_ViuiH/eOkBB$P=iWKGFd]NfNkf>Ysl"fe$/bk(Lp/t#\>W<0ek'cJ"'R,=mJ=.@4@1Eh@PGticMjJeael,0nK2=O#$:`G-r:I.G4MpW9G@F!'/TYr3migLG?iOl>6 %,;_7*>bKTkdTAWGhQ^O`1_\:FOWn/8`+?.!7p];,;d,@H3!F.oM@/<.#*kf. %nt]]9,fHaiL)PYeR^`2e7Q?57bl)#<<%IMN$S<4$n[OH-+DKW(+BVK^:mNY>;-hkc;FP/5FI@0n6t+\nOEZ'!Pi\^NI%2S/YHQ#] %@Af7)po1oD4#?)V6ph%ge^E*4EjBjrdo9dub/mX,:3H&1oebi#LC9LdY.)-L0[dfDWo9f+OEWGob[_9Z,buR%Ku6:2+s^go-um^3 %.pJu#abZ%3fNYnPoc>(4qD9McFJ0dZZL&D5]k30.o19$%-P0[OOcb"&4%l"Jh$[F=>q?3=ObQJS:Ql%BG7!].PF`b*;ag&6PN?:F %j:8:cSJ,GNgKsfoo#*otT4$iDp&g6@\4'>Q@@]isQRg%4*i7kp$ad:;;Jp<-*bk-t1+8F9;Ji@D9JR/mb;)bEKScmVo,`j=B99!P %5XmR5p;U!K[AA5sI4#O7*kGeA-5HAX_D1L]NL=a\b[<(u(`Cme_,K!,1kqh9b*K9cFbLeB5#KSRb_KMu-E51ZM0Y5!2(OCfRo9<5uc=MDF-kYY*W`.`P>21nF[bLceFP %h&\qT_$KK91+ID'\t!?bARnpFRT3dB4OI.eE6P(FAe&JhYb3bQ&3'0`*LgdN:G\TBWP\>-ZY-(.ufeRXX %mW`Q&9TQG5WCZ+]f5`N;[n^KjI.-1W&6NptAJD"MGgTfP2m9Qo#)))PE)JIbHQIt*]UX[3a'p!RltpdTPHTllqP>ImrE@%5oZ8n%^-X7%G4r()q;3%7msd& %6&;*ZDYj49*dR<1$uTA^D/48Oj_7r^dD\*C\I1Jdk)BW-nh<_T3@e4KkU@\L'@Fo,.ZUaF=63]4AUhhbj*lObLg`R(Eib&Him?7h %"iME45IV!=e/D=iPW\0P&8Fnl&KRr!5J9b:@X"s?GIL5&=MtqS6<%M'k,6V<%3Yij2)Q/n+&$3dTb;hW9l%)E0 %XNH'TS2@EXRY4'QaJg'N]B"-Q(uRl::!"(2J+RT/8W3E3Sfu/M4Bt**3R*7+Bi'u*_V4Z7,X>OsC^X`]3=Ag#1/.%*7.>mVN"+U1 %))=5O[pe'!pWrmI;H.DQX@OJ0"_i`'_1Q/><;sT8m=\a+Ls#Hp&gi0KIE=b@]!afKmk$k(!=7!Iqo*-8k<`*EXtgk_#`SZBPf70n %Kn?(4ec6&!^%AFh!oplj_kP;q[\W@"lCLQJU+5ZIX10dDKX$V/S=54XToQa6l3cg"Iuk;-N#IL_2b6C*W2bhF!eW&N,4(]l"c9tH %rHB_1b%PJSSra>RO8.D0#\BHZpl*B4JEU2Oh`+i^&d'jTi%\8!O,Od=$96J((L5CUNSqEDc&Ng;= %p,6:9EAc:d'>-=]4PRD">VtqLk"^6K_jn&S?\KNrep0PY7;5H!$p`'d$'=l+k`ctS(82U'R[W0r,@oumQ5kKG.MH?M0s@g#EcHIF_se2a2nGJ? %d^g$c;P>1)Y:mABYu5:B[uYrU>om/akV_JGl!Gq5T&^8pn[0Eb`..aE&,*UWI<,'Hrqk6\s+_]r_u/DApZ@C[hgPIRYC??GrVIE" %hRN4L(Vb@njt-P[IspqNqQNKs7sFXh%rT9s7%o4iG9VsT>FgC+i%?M %;@**9KtN3bc\.)#o9=XMo1$=aPN*a??#j2RUqh5;s#]W^rD(_Fa):KaC%J[P1&8j3rZE:Mai@5B.X'\IlOOO)?1(V!Sr0Xfl%$VTS4emD`'aPmDhNNP9fn^RR3Sa3ILLJN3Rk?.sdf\*/!=01OR3\%WTA&T?eD:eD<];L=>EOU59#h(JeP^^-igD1>H)aaoaU %Hd\i-L!:A!(:&8s5>O5S8%8bs@Db$F/0,:'QQ>E"M#Og!$BDtAT$`(Rf8(T6DW]7RlK=UEKL&soJ8\ED#X %!i:SlAKV!R"ZGs6;&4+LEh=g<0jfP0dRtO^9c?s(uIuO7>@Y7 %KB(uII*_q7.?o*c=#l9Qnm81jGPK+<[gcGZ80DY43kKW6HZA,/Alb9'q0&kYRBf1^KO&N&)`CoU2(D0H\AjO]!)0Q[=s0XHBM7rV %=:i@X?VI-t&Q(;KPl6&g/(]ZT%kBAH654idA?/YpTP).BgL3#s=MCUCVPD*6ctQYW;QS:S/Z;`=+"n^HJ\Q;AV'>dZ$WA8!Q"2bk %194N-hFN@@L;F7YRab@N/=F$m04?&!Yno/$)tT#1XR10Op=D:?`mPd'5QN@G71)o+hjkK-U6ATd[@#fAi&6m^gK3D)N2j?<+kJW9 %>YRG2M,JR`TQ&b?#/dtTEa\J]Tdn\7AgDNIVf!PU?MC%XO2:_t;R!V,J.p^e;DEAt#3V9`',EnMn]&1qKF2#-@H:G4ATd5B=[lAr %hSF+\7j5#75(Qfbnni^k2Rt*5:oJ\0@X[rbds/OifpC-_a/6Q)i)"r*=-e:Z[90$:ZaC@5$Jh)"`oPEX\ZIJcV;l8Sd %oX_@#ae<9=7J+He?D`EW8DdJINA(-\F[2m7R&sL7?+UE-OW6B;Ba"^NZZPbW1D(#\iR&XSuiYrm!qlU]*)2)luj.W>q3Sr>l %L8FFd[6+%8lIBSspW;oi0KElU(K_e_lj9 %rbj5okZhimYA&6dnL=G4%5ras.aY7OU:Q(3oNbSbm!aRm(U(K6emiGpmUF'_[d&>@LD\f&%.<$'k136)@CESi7YituFEt-QPH#Ns %ckCH^;kLG6aSqT2KDkR?2$9mn(WDUSZH[,2o_#Otiu)R\EU2:1QUD&RXC#7T@$)OPr#bq4B0Uk>rbl.-^45tPc1?.o\bhF3qiUHB %m^%:]pY!mM^O,e=QZk[jr:;!p5(]K5flG=N_FH/9h-YLJRm2,hLbV`sc75iX,GC %$,%MVg/"mO'irmU\CU&^s!j4ZMIAqc;i6Ia(4ZtI%J;`kpu+Q@@:Nd56d&F!;"M[gq3)1u!0,ekUueOFoekfZRLHs!5I3n8K4"rM %GXueh*"Tr&X%#'Zn(tQrrZ7Ig%\,:6"S7nEB\*`G[P;`,;)lF!>j-kqDiDLP%o99EYp,2c[f$]:4(UmdLI%_C6Oob/.5[3+f.O*V %>NVlgVH(e"`tGkq6Y5jE*%#7XQ+_e;2GmjOe[_f/nO2$_Ko7+%oLY3m(7%XU9IOWe4`>mK"H-CO<@9NbPL"t1!>'/c>qa"k'\5hr %/7s1XL$rCm*!R8rAaieL\W#OE2lAME@7S`dc;AkL4,?%EZT_#&7&d!sg9p;01)MV'CN]R'@DhIo^-?gW4upTM$,#6D9.]`bK0g.; %C'OZnF,\g("*sOEe2JrO)9\Y[*d4"9qH[PoE+.9-E;6qu1]RIeL+$F\A*D!,A^KLK8h+E[MI[69cD6$'?AmS48;P#Xt)l)'1.e0LNb^rMHT2ObmfoT[PZ"'m?4EeV(R>GYRBd,'V8sZib*T2,QTgY"?`bfS!8'<;Co/LK8Pp5B9;Ie!"#pkLEC:)rN&^acVOqQo0iG4\Hf2C7K3BC?E"DHVXIcVNRbW@>RURH7 %kWE(4^U+[UpWLPJO]SS#+ELq3:]Q($#]e1^^5;:gjcK&*(&?%Y!<:a+9(X&O[Rs>5_W(];rq_YEjC&3Ks8!qS?fWf6GeIUa7rY-_7')r0s+dN"GI%/1j)Tk/r(>\JcApR)ZC8g4XK3$Qn?G\el*MU8BJB/7)tWRHpNn>> %PE>&ONX3bAoZX(e_C/#+Jh1'S=Vk7sKRE;0`P.SHJ/P@[7>n9eU<.!X7q-m3ffUCW"CGc@5W\YRlN2T2,T %"h%FpcjE/JV,@QApH;Y %=M4Aspf&=rB<6?([LR-r(CTd9M]m(+mLtY&gM1#UD->:Q1E]u@_XYI^Q#?>h7$]ZTge.:iQ;G:*1!U7Bf$Xd[,f"G(-*;rmFH=eQ %-]l`JL79!;-MYA$bpcKHRTA/;(PC%\m*%,0pr2H,RfGkGJTf6`*hOXME2E2SWB!,qYu;iaN>?qjH,gX"Z.s0`Khe-]j3iT %',Kk'feY9@LrRM\OcJN0ec_F$,55KHnAKm!BjWK:^phCTiS2a2c:?15A_W\H5L>$%h7YhQVe6&%X(2Rk[TKUVg6s]H,_adYJmnu< %2#>OL3Buj=>j=F9lN:G&n^_TlhlF`ciK\Jhbl/K>YLhj[ebdio(X3uE2MepYXiUR4];M#fd/2;u_\FW`J@^XiPT^/hX?YnW8rWuo %Zk?_UBYGM+1p7HoNa %g=\N5LOCfeT[`]A@X?G&fk:H[Jd"=Wa!<=b%\q_$De]/geOiFRnkSIV$)cH6;4p(3Q#fRcXu<5kb(,7L`-1Z7^&f:G1WjKK?!tma %3rSmE=41f,[jC.b[>H-V3A^&,g?jck_B?CQPbeh0eFOMqT-"=<9O;< %Zbp7+oN%0)ViVes"((]`DNVM0YESR)\n<:`OP9aVI>aETcL76B4Ag0'V1[6&2#p73rZ5d,7?d;]+KBJ8q_X4m_#aYT9XX %]>/:u^a;H/@lN[?C4L:VKn)4oS.Zj!o^YcK<4\J6an13>a@Rpjg5KRkNk2?E`[U$9cUpjmNmqm\)$n$iEi-[FU%L2?)]AtQ([Qrs %.LXRiZ^3g4lf!r[iOVr7TpRX^-V<:XgK0>WlAJ4mSSJ/X0D!L3g%1E@WgdAM'$F-/8HAm$@,bJ*GpmbiRO:9)2jValT8""n]d7if %(RVJh8kj?][+2hM>s3Ql%2?ZFhC"53qt%cT*^AdLI=08HMXOgLHfM:^n=G`K$Z)GG%k['$nBb5O7\'_lLSRErVTaC^O5SIWu#]g3*u-Y %ro%dD3W8.`T5=++Ie2ZZo:enS&rp8Zm`4eW4iitT"N9'H\$;'.V43\3on?YF8RC=PWan-P]WohO5[rJ!M_O"GS,1NWeqKnAC.!e@ %phL4^VP>]l8e-r8kFrIuH6:euV=?>%:jY>9p9'S?)(F]d?ft.lWW[3K\Y$RLPY6j,]4D=+\\Tg;mW4SfhaPCRo4f.99=::82Rq%$ %kT(dZ)"Po9m@dSPO;tZD*Iu'i^of:AQU->NlP\W>'ubR"2g:[pSNHtu/H47fnqdM<3EY'4Xa<.D"ZFos=G32$NKp"Pcg['Mg-t4R %i1rZ1M,t4qJjQnbkgB\A$$D7XZ=plZ/_"+Q"6Q^,?cnqDfpq2!JBbWL2K!#9ZUHF4+>`WoM[RZHpH6NlbFgS1@8'lkeIFFeN>$]] %:qI"8$U/>LcD:CKX]nWH7Md2C2^=2'Z>kh>;0t;2R'bms,O!d']_cj".a>hF/-rF4jVtD\nfB]BH,1u3B)Z9o%m2pg*a**hEP*,NTpqEt*8ORS#2^EE&?3P'0R5Ne_8`jdS[f;nO %CQ\e]1=6m2Qc%;.Emk>nD&THd:IE4fL"BgK//>500q_J_GX7L3AA[B1EISS(XG)@@B@[ZP)LT@"gRK1N*l4=hj=O[?N'c]m6>s[E]*79^\Qh!roqVVm/Q=NYE+24j;7jZ`T-j5m/QSlDh%;oNW/tUr6=h?^3Fkr %PBUBHGk]tnrr2>l)biQ-HR:f)+64]^prPJ@?etRp\S72'VF,fOo+@m- %PUD]bNa"a3nq3RJrVFbT^J2?)q!>.2$lM;)q4k[2PN&2TQ`QhE*UDgVBP0B/>Q1T#@P@EAF`R$XgXhF,_<0\Nc[L(C %-fi$"l2SmJ\thO^pk$QDg%17V@GDmt^h2p4]6ne4)#Ec8qlb8?>.U3SJc&e:IPJ9Yme*jUFSXg<4oDP>m-2Qc2gahpICJp*mj'!" %G1aq9m(4^A5Q8:\J%sOD5PA0!bJ]P2_.<.3if9p.qWn^ll#tu*s*"=4S_f;Hr;JMI<0(E(?M:E&MSj59/eYH1mYoD2D=<)]t+`7:9RH[j!o-GqU_u'j)+=i7r,h(ENL.O:m_3Kod<#=X^Y*KjX^/ROQ*/3c.0UM?O!iq %+E-f;E5PCn8?8TdSLr%@rpKQoIfB=*LX#V3++3dCDr1KZ)uYu107WWSa-U.hQfk])3k?eYaNo>5q#9A60A,9jqmWcDPQUsS?bR/b %oKV&9rpn=)2)4VK[OHHjs6KC)NgmrHYCFaA5(ER^bK&(MhS&m\M\#idkT=.0jIJ4F4faqC(u3m?5C;qqp>$P*gQ91XL-EVhD]^de %2ID::(]SOM2g7La_;1.f1;aCSDs6lmL5@=3"d]qsf#YZ(H9l %rGn[Fqk)Pqa$9UUh3Yka4@*.W9JrHG'7KNNoAcUYqpBollG_Y/oA\"j^A-]3GQI)Zs+=oN2./Ics4.9V"r&PYmeNKs;Y]'Tm,u-F %0:-pL_s%*Zjbl(dn)c!kPl2'5n %qsg/jqu9tbIP#uQ^Jks"Vu5^2s6\^8Mj+'7jd?'=qj?&P5C<;#07S+L?-Kg9k&SVYJ,AZYbI`7Lp\_)dc[YcUjn&4"5CNP%b@;a? %^,d1I^m*VlIPh!V0AjP@(03l=qs7rKSf_b;X-`iumk#oC^3G._HrYiRqUOp+^\SsoUHabZUl8$[IYDp6au7h/r^g3hs7*(L^YDr9 %q=c_2^6A0V:OJ__^Pl`%^U%MB#FX1nKHjFD5h\Q`Vo6Km1Aq+'_gd5-i%$gQ,UW/mcbK>,Mm*,%cGK&?)buPfVq$6//B]EUh[OKT %Qb/=J$%J!o3XZ\ipFM[ %l0Rnh%AeG:qiFlA_3K6^9MC,sj3I:p*'(5JmJEEDgH5)c^O,M1mV`WJmHqO[fDDuS`E1)N?ei>@q26'XSj0o2?ap"-]6HO-AoJU# %HVEQ2P3ec/pl4[b1G-IkX(D!j-_84[$ENS=]VVskC0@[8nf29,rSjmPhUb[":UBOU/q;p(KhG?"D;oL)PJ=ZrqB\d5LNIL*-h %0#DP@a,lu>0YZk7csPXDr-*(.qjX8irg2W.r2:`j@OM>P6VVdN7M1l9<]$%?e*dfY?l%n^^3f`'muUBf^!N[anR04)>sJMM?CMcX9#1J-5$cen]TB'Id\G&P-CrceodIeioI#PdTSeN:DmmJ5dNTDjQA-N=#?S+k7D %HMpp,kF]1qi_T>urqgNNIVdniri7ETj\I]d<(MT7'cio(X7/L %=T!HuDP,_#-N5M6oOD&-s7#gCm\b!\s4&1cX$,s#D=2oJqSg)0YJ.OD]AL9J?+gNgX=!NZRsV=*;lO7R27NFS2sPnjeIqYuMa[pm %eH2\=<")kE9<[7?NW.hW@eirNlVFF7m$f9PkH]Re/9+RXiHt7Rr-PdWIes!@]9dHn^O3]ks4b0:hmdMKr]S'r&,HpS!EqpdhH/cj %j/+iofk6qJlN9QfBXM)L[8mncXV9m$^DTqD8?Es!e92jZ&N%a157WIdiG^c(S]11\?=/*CcGAG9Hk>F+$)JA %"iKNe^AL^l/QQ"Ca9kpc4gq'GNguVrX3/#*!1.3/JhE1"3DEG@,afFuH'`N8%85fi%k\7Pp7Be2PPLh`TL]%/j;U+dW@GTIcSU7q %o;fYp:k.Xrc0';?)R`Z':6..KhS_'*[i9QD&Q:Q2^ZgI,iY?q[7A8XK*UAZ*m3`0@0JZE/5;"fZ5Z,r3p,2O[O/i/L!1*7KgcqO5SgaB`5F#G4,Lg%qCaJUEZ;Un)^"+8)4Q^ %\pDd!auf9bG?L;HW>:*:I/$+IX.CQpFI3mbC7@-gC?Ebeh1`PK-0$+.M:"m^JaDNQ[nOE8U%(J4'gV*g.p6@JZ_.J %cYk`WIiuca>?:+%l$p\hQO3T!4)aldReI8/07+,NHabuan6";uNB5D4TlAJ\0+oBc3tl3cT(]kZlaGpF]*-=_4=Tn:YC$onETIQl %o\."M77=:K/pqrY=0R(FTUS&DZ=Q7]=*`4tG3Q$eH=PFU:JpH7H4!]P;A`ms^:m5VqsAa6dgsKjL'at3b.0O'o)eF-hX>+H]r[)&-1D/Je#t&u %=&#:"3/s0&mJV&C=&_b([la1/GZ;?DZS0&_;X=5FZEN]3=12)5B+KA9lmpcab0;8^_qE`5)g#_A_nXt(GQa$+`GhF?;WCkMq@3Fe %OA$r8"F<_Qc0/$%%562iaUcCCC1W; %iiu1;M9tfs+ECV;+nbVijln@d696]j2:aLLPZfuu1XHc#ZucW&22SIo:a=8L,"sY'dlM5r>FR2si5fT@fh&[/"e%=-bRN_cDIB1,.+l7tIhRmKd"S)<4Ot8_CU-fms#Si:&MXu'\1qM%hn#;TVK>HA?,kJ1\2Ktq+C/kT6I$_(#L?oCFSiZ!pmT(% %TCl6+1fWttR:R";CrqHc^FOT$^26"UiTISNO6dS*?Ml1S4Xg$+nY(uYePU_,=o4`WXQNa&R=+&[XF'YceoT<_XF"Jpeia*Yn*K&A'_$H8RCJfiXQ-WV7m?FGYS])Ge %P%1VPCT:st[)fMSbI3M$Y<[`Ne3"+s"V=Jp"\",UT]KSleB3$D:-qMn)iE"l('ld>]]S_P,*2CLm4aC?DQV)EX1Gf@=C*kb,G)ot %_g6e/o&C8%VRF7B1=:c'dPSKQTKoaA6+;iSE#pBHe[1\/30l?K)DGXI=1Q*f,K%.:cWE %@6rB+"pi3VX_bsl.,nMhh%.+GQm3^[F84n?O[8V>RRL9q=Fc;R'/jK-tdl1RH[@uN$!TKciABS/"0*kDrZknmlnB[DZt:g>\`n4aSK9fD@2R`j4;SXsb` %9sM3N[eEKY%'spm4J%Q&\4nT$9Yurf\gC6R7L#iWj[6("&fFa@-l%cp,bir>NUG;/9RE4#fY,n0ZJ];q.pB[40320N.P.aFCq8'Y %=]K%6Nge/\BVbgs1eo"8[NJcC`=P39^KVLW::8"2'C?op%_g;=3dH4`:HW>6mM)%0-1/d["'T8o#165F=;7SQVPu[9C_1'KjZ8C0 %o,-PiT6!/4I=j`CJB7<#H4!MEd_Ir>#%[f@*9Xs%6O0>H%"0G`V9TSEUgnu]coadOC\i0<-BTig?WkRZdRu98h*0<,//"qMNBtgA %0nV):e9MG7XJrlg6$*5:4G@2X7mMQ9EtDTa$IQUdc-@HV;?X<&5uFo6.r[qq=P;G-!)uEb>)lUHKCU;!)&"$bZJn3ch?J'^E9p:Y+;bPLoTl=`m;om@_klk%[l>bQ',H %RsiiFG-^h(b&X:sL868Q:_j^F.nal+6< %'UnD([Wa`?;bB3L(EmZhR'=em,VPHdl`b1[jB'2dD?3MrZ5W&6Wf=/llT58N8IsHpS@m(`@T<%,/>VC3.;U&3J+7EB#!3oE@+AXTK!6o./(2/Ls!%ZSnK4!J\Z?33GKCs'f\^NC2b0- %7!N7ff)nLYNMXh)C/!l2aC@'EP5>U@@'b^`(;Mq"*iFm&cn`=+3s$69;_KqMUYPLo]-U2i:-HA,[f\6h6!mPr4X[JSdB]N+4A^*8 %CN.utDu5YqecpX4*aKiS]OdAXI5fKm`_=>$oNL0,8\h!cPt93E#T-PEG9*j+gjb^oSjCSiUob9Ce%.)%.%@>2!S&8[N"%^.lo/Se %kI"O>EJG5Gb@=>dNhQlJV\CFGHGrF_&R&M[3V;udgmqof%9.s3"8CC;?eP>g`X029ElaT&'mN:?p!5bQqfX[GWs0`mQ2&oWmJt/@ %#B`$$9F1rB'.HEaA)VF<)D&%rD(UtpaD`FBln?n?;&H?c&p?jQ2@-J).1;s3B[aEUVE.=rFZN/>0-Q0(1!HG9Wh]'<(@B,3B%79] %8L(r=**e\N0_K*CHa1W<\7BcIZECH><8DM>Mim9634[Ms?asRV5C9ZTZM/nr+3*:<6J9UoG'5[$S?DR3Fu'`bdiI4N/dr@Mt(Z3e,\ia%mK'8'\iKl&$j,6DLaUV)_',,h'8Y\S'Oi"=*QrD`99oj[MgS$V7e"$FBr4?ni"^ao%M7,J %V0XiO2J1c'@b6I9I@=<9Y6P(F$JT`H5@A4VV1Bap)n!e@CA93*'+.3s&R0H"<3R^'WNN.G55`$H=b[D_R8fZm$cIE:blO4fE=#7i %%PC;O/[.fT"ZC`7R,D83lIHO;/[n\hUK(gZL^F4(?KqB %;MGMYj%QtMJouW$b77b]EF%%).CS2;/B,LZb>K=Pof/9"4*;GIreMLNf*kJ!TV`JQXCYL[i1bN"__/c3h\G[t842e';&RE]D+Co0 %Dr9tQ0F"(Zb)E2pIpqjn@unl-C?'1lNp_1+@L0?%!FsN7-ZZW$cl?P>GAO4D`se)#!f*0S$cL=)bQcA'r@jquHlE\]h8`Ma9Han? %TOE56cN$i;*`H(Z1fu-fM,'U4#VuXM)sGYa!UE1OlT-R/faSe)#$<@;Ut"=9>1`d5nNG7m?>71R14+!dD*_U*0&%!.neAaO%n-bf %1(`kB).)?+iY7l4U19#FX5N4Y<%BW.:RHa%6j@h!ki6*7XBFI).m?9+g1tZ&,Ce1B~> %AI9_PrivateDataEnd II*HÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿ}ÿRÿ}ÿRÿ}ÿRÿ}ÿRÿ}ÿRÿ}ÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿ}ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ'ÿ}ÿRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ'ÿRÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ'ÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½ÿ°ÿŒÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ'ÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿŒÿ°ÿŒÿ°ÿ“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ'ÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÿ¼ÿŒÿ°ÿŒÿ°ÿŒÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšÿÿŒÿ°ÿŒÿÿŒÿ°ÿšÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿšÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ'ÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿšÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿšÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿšÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿšÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿRÿ}ÿRÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿøÿøÿøÿ'ÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿRÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿøÿøÿøÿøÿøÿøÿRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿøÿøÿøÿøÿøÿRÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ'ÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“ÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿRÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ'ÿ}ÿRÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“ÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿRÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿøÿøÿøÿøÿøÿøÿøÿRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿøÿøÿøÿøÿøÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿøÿøÿøÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ¨ÿÿÿÿÿÿÿÿÿÿÿ}ÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿRÿÿÿÿÿÿÿÿÿÿÿ¨ÿøÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿ¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ”ÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¼ÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿ}ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ“ÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÃÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ¶ÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿ'ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÃÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿ“ÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿ¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿøÿøÿøÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿøÿøÿøÿøÿøÿøÿøÿøÿRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿøÿøÿøÿøÿøÿøÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿ¶ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿøÿøÿøÿøÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ÿ'ÿøÿøÿRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿøÿ}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿ˜ÿºÿ˜ÿ´ÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ»ÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿÆÿºÿ»ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÆÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿ˜ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÇÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿÁÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿ’ÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ´ÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿÀÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÀÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÀÿ´ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿµÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿºÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿ´ÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ´ÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿ»ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿµÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÁÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿ»ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿ˜ÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿµÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿÀÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÀÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿ’ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿÁÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ˜ÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿ´ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÁÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿÀÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿ’ÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿ“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ’ÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿÆÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿºÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿ´ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿºÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿžÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ’ÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿµÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ’ÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿ˜ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÇÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿºÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿµÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿ“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿºÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ˜ÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿÀÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ”ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿ´ÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿºÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿºÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ”ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÀÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿ“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿºÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿºÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿºÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿºÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿžÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿžÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿ¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿµÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿ»ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÆÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿÆÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ’ÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿ’ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿ˜ÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿ’ÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÀÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÀÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¼ÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿžÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÀÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿÀÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÀÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿ˜ÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿ’ÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ´ÿÆÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿþÿþÿþÿÆÿÇÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ¶ÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ´ÿžÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿÆÿþÿ˜ÿ´ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿÁÿºÿþÿÆÿþÿþÿþÿÆÿÇÿºÿµÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿ“ÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿ“ÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿ¼ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¼ÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿšÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿ½ÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿ”ÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿšÿ¶ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿŒÿÿŒÿ°ÿšÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿ½ÿÃÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ°ÿŒÿ¼ÿ½ÿÃÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ333333333333333333333333333333333333333333333333333333333333333333333333ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ""""DDDDUUUUwwwwˆˆˆˆªªªª»»»»ÝÝÝÝîîîîÿÿÿÿÿÿÿÿ333333333333ffffffffffff™™™™™™™™™™™™ÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿ333333333333ffffffffffff™™™™™™™™™™™™ÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿ333333333333ffffffffffff™™™™™™™™™™™™ÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿ333333333333ffffffffffff™™™™™™™™™™™™ÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿ333333333333ffffffffffff™™™™™™™™™™™™ÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿ333333333333ffffffffffff™™™™™™™™™™™™ÌÌÌÌÌÌÌÌÌÌÌÌÿÿÿÿÿÿÿÿ""""DDDDUUUUwwwwˆˆˆˆªªªª»»»»ÝÝÝÝîîîîÿÿÿÿÿÿÿÿ33ff™™ÌÌ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌÿÿ33ff™™ÌÌ""""DDDDUUUUwwwwˆˆˆˆªªªª»»»»ÝÝÝÝîîîîÿÿÿÿÿÿÿÿ8BIMÐPathþm--m--{km--ö×m--rBm--rBm--rBg‡‡rBg‡‡ö×g‡‡{kg‡‡g‡‡g‡‡‹KK‹KK{k‹KKö׋KKrB‹KKrB‹KKrBorBoö×o{kooo*rB”´µrB”´µr¦9 Áû¶x³øÄÃÃÄÏçÇv‰ ËÃi¦SÏ —Ò+œ#u˜Ô{&SãÖ–—(ߨØÌ-ŸÛ›/rÞ1’á^320,çi*3X9ëKK4°^ïÎè7fÿXù:“†<LŽB !ø,—CAö–—F ò3hIÜînM`çëKKQUçÝ Quôè{ãVv燈W.çKÌXÁåòTZe>奦[ÐXåcL]Pìåçÿ^¼奦eÞäf¡kGÑàÔìq‰fÞw:Û¦)}M}Ó.‚ä…Ö–—‰^ÂÚœ ŽÜeÞê蕱æááâ˜h5ã›{›å€ž_u奦¡3zæ0À¤:{å”§ 奦¨,žåáa©À+ç:Ù«cÌ燈¬žDçÀþ®€çÀþ¯º”燈³hžæÛdµÍ‡å¥¦¹Úe奦ÆÉÀ奦ÓÁ¿Û¸‡ÞåÒÒÓê‰ÈUÄóU ·fgùh¥¥¦úhœ¡EˆûÒÅœíKý{˜xyý{˜xyý{^ý{^ú>ÜV«%øÈN¬Bõ' G‡‡ñØÅ?f¡îß7ùEé”ù0ðñäÿ)§rÞJ#$YØ9ÚÒ퉅PÌ¡¿¥õÆÞ¼ðñÆ?™ŠÃÚI”‡ôÀ÷a¿Â Û¾1- --»H éî¸lº ¬¨µƒž ii¯ãòøÙ©Òè8ü¤(ÃÙJÚÿÿ ŒCÀzk·t'™ÿþð÷n¤ákž ”Þi‹‰ááe÷Rááb¾‘áá`#ù†û]IÃÃÃWŸZ8üQŽPøÙKî¥ iiIˆ ¬¨F*2 éîCA --A°& Û@{=a>êN>chI”;2ªŠ:“†ðñ-áz"ĉ"À6ÝI0ðñ D? ?/ÒNtwrB`rB`ý{ðñý{ðñý–æðñþRðñþ¾ðñþ¾ðñþ¾g‡‡þ¾g‡‡þRg‡‡ý–æg‡‡ý{g‡‡ý{g‡‡8BIM ·Path þˆ± ¼@ ¼RI† $Âflamerobin_0.9.3~svn+2220.orig/res/function.xpm000066400000000000000000000016501177057155300213510ustar00rootroot00000000000000/* XPM */ static const char * function_xpm[] = { "16 16 37 1", " c None", ". c #000686", "+ c #A5AEBD", "@ c #6B8294", "# c #425163", "$ c #737D8C", "% c #7B8EA5", "& c #314D6B", "* c #183042", "= c #21344A", "- c #889CC1", "; c #6B696B", "> c #CECBCE", ", c #CECFCE", "' c #D6D3D6", ") c #D6D7D6", "! c #DEDBDE", "~ c #E7E3E7", "{ c #E7E7E7", "] c #EFEBEF", "^ c #EFEFEF", "/ c #ADAAAD", "( c #DEDFDE", "_ c #6B6D6B", ": c #949294", "< c #000000", "[ c #F7F3F7", "} c #ADAEAD", "| c #F7F7F7", "1 c #737173", "2 c #BDBEBD", "3 c #FFFBFF", "4 c #B5B2B5", "5 c #FFFFFF", "6 c #525552", "7 c #A5A2A5", "8 c #A5A6A5", " ", "................", ".+@@#@@@@@@@@@$.", ".%&&*&&&&&&&&&=.", ".---;>,')!~{]^/.", ".---;,')!(~{]^/.", ".---_'):<~{]^[}.", ".---_')<(~]^[|}.", ".---_)!<<{<<}|}.", ".---1!(<{]<2<34.", ".---1!(<{]<|<54.", ".---1(~{]^[|354.", ".---6788//}}444.", "................", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/function32.xpm000066400000000000000000000126001177057155300215130ustar00rootroot00000000000000/* XPM */ static const char * function32_xpm[] = { "32 32 204 2", " c None", ". c #000686", "+ c #293094", "@ c #535AA2", "# c #444F97", "$ c #36448D", "% c #2B3881", "& c #212C75", "* c #38438B", "= c #3A4289", "- c #1D2488", "; c #A5AEBD", "> c #8898A9", ", c #6B8294", "' c #576A7C", ") c #425163", "! c #6F8090", "~ c #737D8C", "{ c #48529C", "] c #909EB1", "^ c #6F8398", "/ c #4E6880", "( c #3E5469", "_ c #2D4153", ": c #4C6075", "< c #4A596B", "[ c #252F79", "} c #3E4A96", "| c #7B8EA5", "1 c #566E88", "2 c #314D6B", "3 c #253F57", "4 c #183042", "5 c #29415B", "6 c #21344A", "7 c #111D68", "8 c #414E9D", "9 c #8295B3", "0 c #6F85A5", "a c #5D7596", "b c #4F6176", "c c #424D57", "d c #616C7A", "e c #808C9D", "f c #808D9D", "g c #808E9D", "h c #828F9F", "i c #8490A1", "j c #8491A1", "k c #8492A1", "l c #8693A3", "m c #8894A5", "n c #8A96A7", "o c #8C98A9", "p c #8C99A9", "q c #8C9AA9", "r c #8E9BAB", "s c #909CAD", "t c #909DAD", "u c #909EAD", "v c #7C8794", "w c #676F7C", "x c #343B81", "y c #4451A4", "z c #889CC1", "A c #7A8396", "B c #6B696B", "C c #9D9A9D", "D c #CECBCE", "E c #CECDCE", "F c #CECFCE", "G c #D2D1D2", "H c #D6D3D6", "I c #D6D5D6", "J c #D6D7D6", "K c #DAD9DA", "L c #DEDBDE", "M c #E3DFE3", "N c #E7E3E7", "O c #E7E5E7", "P c #E7E7E7", "Q c #EBE9EB", "R c #EFEBEF", "S c #EFEDEF", "T c #EFEFEF", "U c #ADAAAD", "V c #57589A", "W c #9D9B9D", "X c #D0CFD0", "Y c #D4D3D4", "Z c #D8D7D8", "` c #DCDBDC", " . c #DEDDDE", ".. c #E3E0E3", "+. c #9D9C9D", "@. c #DEDFDE", "#. c #E3E1E3", "$. c #7A8496", "%. c #6B6B6B", "&. c #9F9E9F", "*. c #C6C5C6", "=. c #B5B5B5", "-. c #929192", ";. c #6F6E6F", ">. c #A9A7A9", ",. c #E5E3E5", "'. c #E9E7E9", "). c #EDEBED", "!. c #F1EFF1", "~. c #F3F1F3", "{. c #ADACAD", "]. c #57599A", "^. c #7A8596", "/. c #6B6D6B", "(. c #A1A0A1", "_. c #949294", ":. c #4A494A", "<. c #000000", "[. c #747274", "}. c #F7F3F7", "|. c #ADAEAD", "1. c #575A9A", "2. c #909090", "3. c #5D5C5D", "4. c #6F706F", "5. c #ABA9AB", "6. c #E9E6E9", "7. c #F5F3F5", "8. c #F7F5F7", "9. c #D2D2D2", "0. c #6B6C6B", "a. c #EBE7EB", "b. c #F7F7F7", "c. c #D2D3D2", "d. c #A1A1A1", "e. c #6D6D6D", "f. c #383838", "g. c #ABAAAB", "h. c #AFADAF", "i. c #787678", "j. c #787778", "k. c #787878", "l. c #A5A4A5", "m. c #E5E4E5", "n. c #A1A2A1", "o. c #747474", "p. c #575757", "q. c #7C8698", "r. c #6F6F6F", "s. c #3A3A3A", "t. c #AFAEAF", "u. c #767576", "v. c #2F302F", "w. c #5F5F5F", "x. c #5B5B5B", "y. c #A9A8A9", "z. c #FBF9FB", "A. c #B1B0B1", "B. c #595B9C", "C. c #7E879A", "D. c #737173", "E. c #A9A6A9", "F. c #BDBEBD", "G. c #807E80", "H. c #FFFBFF", "I. c #DAD7DA", "J. c #B5B2B5", "K. c #5B5C9E", "L. c #DADBDA", "M. c #807F80", "N. c #FFFDFF", "O. c #DAD8DA", "P. c #7C7C7C", "Q. c #808080", "R. c #FFFFFF", "S. c #E0DFE0", "T. c #B5B3B5", "U. c #7C7A7C", "V. c #B9B8B9", "W. c #BBBABB", "X. c #BFBEBF", "Y. c #758092", "Z. c #636363", "`. c #929292", " + c #C2C1C2", ".+ c #C4C3C4", "++ c #C6C6C6", "@+ c #C6C7C6", "#+ c #CAC9CA", "$+ c #CECCCE", "%+ c #C8C5C8", "&+ c #6D798A", "*+ c #525552", "=+ c #A5A2A5", "-+ c #A5A6A5", ";+ c #222C95", ">+ c #373F88", ",+ c #292E6C", "'+ c #3E4181", ")+ c #535496", "!+ c #535596", "~+ c #535696", "{+ c #555798", "]+ c #2D3192", " ", " ", ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", ". . + @ # $ $ $ % & % $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ * = - . ", ". . @ ; > , , , ' ) ' , , , , , , , , , , , , , , , , , ! ~ = . ", ". . { ] ^ / / / ( _ ( / / / / / / / / / / / / / / / / / : < [ . ", ". . } | 1 2 2 2 3 4 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 5 6 7 . ", ". . 8 9 0 a a a b c d e f g h i j k l m n o p q r s t u v w x . ", ". . y z z z z z A B C D E F G H I J K L M N O P Q R S T E U V . ", ". . y z z z z z A B W E X G Y I Z K ` ...N O P Q R S T E U V . ", ". . y z z z z z A B +.F G H I J K L .@.#.N O P Q R S T E U V . ", ". . y z z z z z $.%.&.G Y I *.=.-.;.>.#.,.O '.Q ).S !.~.X {.].. ", ". . y z z z z z ^./.(.H I J =._.:.<.[.N O P Q R S T ~.}.G |.1.. ", ". . y z z z z z ^./.(.H I J 2.:.3.4.5.N 6.Q ).S !.~.7.8.9.|.1.. ", ". . y z z z z z ^./.(.H I J 0.<.4.@.#.N a.R S T ~.}.8.b.c.|.1.. ", ". . y z z z z z ^./.d.I Z K e.<.f.4.g.O h.i.j.k.l.G m.b.c.|.1.. ", ". . y z z z z z ^./.n.J K L ;.<.<.<.o.P o.<.<.<.p.|.c.b.c.|.1.. ", ". . y z z z z z q.r.l.K ` .r.<.s.o.t.Q u.<.v.w.x.p.y.z.I A.B.. ", ". . y z z z z z C.D.E.L .@.4.<.o.P Q R i.<.w.F.w.<.G.H.I.J.K.. ", ". . y z z z z z C.D.E.L .@.4.<.o.P Q R i.<.e.L.e.<.M.N.O.J.K.. ", ". . y z z z z z C.D.E.L .@.4.<.o.P Q R i.<.P.b.P.<.Q.R.K J.K.. ", ". . y z z z z z C.D.>. .S.#.g.o.t.Q ).S T.U.V.b.W.G.X.R.K J.K.. ", ". . y z z z z z C.D.y.@.#.N O P Q R S T ~.}.8.b.z.H.N.R.K J.K.. ", ". . y z z z z z Y.Z.`. +.+*.++@+#+D $+E X G 9.c.I I.O.K %+J.K.. ", ". . y z z z z z &+*+P.=+l.-+-+-+y.U U U {.|.|.|.A.J.J.J.J.J.K.. ", ". . ;+y y y y y >+,+'+)+!+~+~+~+{+V V V ].1.1.1.B.K.K.K.K.K.]+. ", ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", " ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/generator.xpm000066400000000000000000000011371177057155300215120ustar00rootroot00000000000000/* XPM */ static const char * generator_xpm[] = { "16 16 15 1", " c None", ". c #000686", "+ c #FFFFFF", "@ c #889CC1", "# c #F7F3F7", "$ c #E7E3E7", "% c #EFEFEF", "& c #6B83B1", "* c #DEDBDE", "= c #EFEBEF", "- c #E7E7E7", "; c #C6C3C6", "> c #BDBEBD", ", c #BDBABD", "' c #A5A2A5", " ......... ", " .++++++++@. ", " .+######+@+. ", " .+######+.... ", " .+######$+@@. ", " .+#%%&*&@%%+. ", " .+%%%.%.$%%+. ", " .+%%.....%=+. ", " .+%%&++&===+. ", " .+=.....===+. ", " .+=*.=.==--+. ", " .+=@&+&----+. ", " .+---+-----+. ", " .+++++++++++. ", " .;>>>>>,,,,'. ", " ........... "}; flamerobin_0.9.3~svn+2220.orig/res/generator32.xpm000066400000000000000000000120011177057155300216470ustar00rootroot00000000000000/* XPM */ static const char * generator32_xpm[] = { "32 32 180 2", " c None", ". c #000000", "+ c #D3D3D3", "@ c #F6F6F6", "# c #FFFFFF", "$ c #F9F9F9", "% c #DADADA", "& c #585858", "* c #C7C7C7", "= c #D1D1D1", "- c #D6D6D6", "; c #FEFEFE", "> c #FDFDFD", ", c #C0C0C0", "' c #E1E1E1", ") c #F0F0F0", "! c #9B9B9B", "~ c #FCFCFB", "{ c #FBFBFB", "] c #AFAFAE", "^ c #E9E9E9", "/ c #DFDFDF", "( c #8F8F8F", "_ c #F4F4F3", ": c #656565", "< c #E2E2E1", "[ c #7A7A7A", "} c #FAFAF9", "| c #F9F9F8", "1 c #A4A4A3", "2 c #F4F4F4", "3 c #CFCFCF", "4 c #A2A2A2", "5 c #BBBBBA", "6 c #9B9B9A", "7 c #A2A2A1", "8 c #B6B6B5", "9 c #F8F8F7", "0 c #F8F7F6", "a c #9E9E9E", "b c #1E1E1E", "c c #0D0D0D", "d c #1C1C1B", "e c #0B0B0B", "f c #1E1E1D", "g c #1E1D1D", "h c #F6F6F4", "i c #F4F3F2", "j c #DEDDDC", "k c #D3D2D0", "l c #B7B7B5", "m c #9F9E9D", "n c #706F6F", "o c #65625A", "p c #626262", "q c #F5F5F3", "r c #626161", "s c #F5F4F3", "t c #F2F2F0", "u c #E4E4E2", "v c #DAD9D7", "w c #D8D8D6", "x c #CDCCCA", "y c #AFAEAC", "z c #88847B", "A c #F7F6F5", "B c #F2F1F0", "C c #626261", "D c #F3F3F1", "E c #EFEFED", "F c #EEEDEB", "G c #EDECEA", "H c #E9E8E6", "I c #D5D4D3", "J c #C4C3C2", "K c #8F8A81", "L c #F6F5F4", "M c #1D1D1D", "N c #1B1B1B", "O c #0E0E0E", "P c #181818", "Q c #10100F", "R c #F1F1EF", "S c #605F5E", "T c #717170", "U c #E5E4E2", "V c #E4E3E0", "W c #D2D1CE", "X c #8D887E", "Y c #F3F2F1", "Z c #ADADAB", "` c #9E9E9D", " . c #949392", ".. c #B6B5B4", "+. c #F1F0EE", "@. c #F0EFED", "#. c #B3B2B0", "$. c #939291", "%. c #979795", "&. c #A7A7A5", "*. c #E2E1DE", "=. c #E1DFDC", "-. c #979288", ";. c #737372", ">. c #D6D6D4", ",. c #646362", "'. c #1D1D1C", "). c #0D0D0C", "!. c #1A1A1A", "~. c #0A0A0A", "{. c #A49E93", "]. c #F0F0EE", "^. c #EFEEEC", "/. c #5E5E5D", "(. c #E7E6E3", "_. c #5C5C5A", ":. c #E3E2DF", "<. c #E2E0DD", "[. c #E1E0DC", "}. c #E0DFDB", "|. c #A19C90", "1. c #EDEDEB", "2. c #ECEBE9", "3. c #EBEAE8", "4. c #E9E8E5", "5. c #5D5C5B", "6. c #E3E2DE", "7. c #DFDEDA", "8. c #DEDDD9", "9. c #DDDCD8", "0. c #A19B90", "a. c #E8E7E5", "b. c #E8E7E4", "c. c #1A1A19", "d. c #171716", "e. c #0F0F0E", "f. c #1B1B1A", "g. c #DCDBD7", "h. c #E6E5E2", "i. c #E5E4E1", "j. c #E6E4E1", "k. c #E5E4E0", "l. c #A5A4A1", "m. c #979693", "n. c #8B8A88", "o. c #AAA9A6", "p. c #DBD9D5", "q. c #D9D7D3", "r. c #9F998D", "s. c #E4E2DF", "t. c #E4E3DF", "u. c #E2E1DD", "v. c #6D6D6B", "w. c #CAC9C5", "x. c #5D5D5B", "y. c #D7D6D3", "z. c #DDDBD7", "A. c #DCDAD6", "B. c #D8D6D2", "C. c #9E988D", "D. c #EDEDED", "E. c #E1E0DD", "F. c #E0DEDA", "G. c #D8D6D1", "H. c #D7D5D1", "I. c #9D978B", "J. c #E1DFDB", "K. c #DEDCD8", "L. c #D7D6D1", "M. c #D5D3CE", "N. c #9B958A", "O. c #999891", "P. c #A39E92", "Q. c #A39D92", "R. c #A39D91", "S. c #A29C90", "T. c #A19B8F", "U. c #9D978C", "V. c #9B968A", "W. c #676359", " ", " ", " ", " ", " ", " . . . . . . . . . . . . . ", " . + @ # # # # # # # # $ % & . ", " . @ # # # # # # # # # # * = - . ", " . # # # # # # # ; # ; > , ' ) ! . ", " . # # # # # ; > ~ > ~ { ] ^ # / ( . ", " . # # # ; > _ : < [ } | 1 ) # 2 3 4 . ", " . # ; > ~ { 5 6 7 8 9 0 a . . . . . . . ", " . # ~ { } b c d e f g h i j k l m n o . ", " . # } | 9 0 p q r h s i t u v w x y z . ", " . # 9 0 A h r B C i D t E F G H I J K . ", " . # L q M N O P Q M R H S I T U V W X . ", " . # i Y t Z ` ...+.@.#.$.%.&.V *.=.-.. ", " . # i Y t ;.>.,.H +.'.).!.~.N N *.=.{.. ", " . # ].E E ^.F G G G G /.(._.:.<.[.}.|.. ", " . # 1.G 2.2.2.3.4.3.4.5.:._.6.7.8.9.0.. ", " . # 3.H H a.b.b.(.d c.c d.e.f.8.9.g.0.. ", " . # (.h.h.h.i.j.k.j.l.m.n.o.8.g.p.q.r.. ", " . $ V :.6.s.t.u.6.u.v.w.x.y.z.A.q.B.C.. ", " . D.E.=.[.}.u.}.[.}.[.7.F.z.A.q.G.H.I.. ", " . = J.F.7.8.}.8.F.8.F.K.K.A.A.B.L.M.N.. ", " . O.P.{.Q.R.Q.|.S.|.S.T.0.r.r.U.U.V.W.. ", " . . . . . . . . . . . . . . . . . . ", " ", " ", " ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/generators.xpm000066400000000000000000000011021177057155300216650ustar00rootroot00000000000000/* XPM */ static const char * generators_xpm[] = { "16 16 13 1", " c None", ". c #000686", "+ c #FFFFFF", "@ c #889CC1", "# c #F7F3F7", "$ c #E7E3E7", "% c #EFEFEF", "& c #EFEBEF", "* c #E7E7E7", "= c #C6C3C6", "- c #BDBEBD", "; c #BDBABD", "> c #A5A2A5", " ......... ", " .++++++++@. ", " .+######+@+. ", " .+######+.... ", " .+###.#.$+@@. ", " .+#......%%+. ", " .+%%.%.%%%%+. ", " .+......%%&+. ", " .+%.%.&.&.&+. ", " .+&&&......+. ", " .+&&&&.&.**+. ", " .+&*......*+. ", " .+***.*.***+. ", " .+++++++++++. ", " .=-----;;;;>. ", " ........... "}; flamerobin_0.9.3~svn+2220.orig/res/history.xpm000066400000000000000000000051751177057155300212330ustar00rootroot00000000000000/* XPM */ static const char * history_xpm[] = { "16 16 128 2", " c None", ". c #434343", "+ c #555555", "@ c #575757", "# c #535353", "$ c #3C3C3C", "% c #484848", "& c #949494", "* c #B9B9B9", "= c #C6C6C6", "- c #BEBEBE", "; c #959595", "> c #545454", ", c #181818", "' c #BABABA", ") c #DDDDDD", "! c #EAEAEA", "~ c #F4F4F4", "{ c #E6E6E6", "] c #CFCFCF", "^ c #606060", "/ c #1C1C1C", "( c #212121", "_ c #ADADAD", ": c #F5F5F5", "< c #FBFBFB", "[ c #FCFCFC", "} c #FAFAFA", "| c #EBEBEB", "1 c #393939", "2 c #5B5B5B", "3 c #C5C5C5", "4 c #D9D9D9", "5 c #BBC2C8", "6 c #DFE2E5", "7 c #FDFDFD", "8 c #C6CDD4", "9 c #E5E7E9", "0 c #E2E2E2", "a c #929292", "b c #070707", "c c #838383", "d c #DADBDC", "e c #93A1B0", "f c #566E86", "g c #C1C8CF", "h c #EDEDED", "i c #6D8196", "j c #667B90", "k c #D1D4D6", "l c #C0C0C0", "m c #060606", "n c #090909", "o c #858585", "p c #7B8C9D", "q c #415B77", "r c #395572", "s c #657A90", "t c #708397", "u c #687C90", "v c #46607A", "w c #314E6C", "x c #6C7F92", "y c #A1A5AA", "z c #040404", "A c #1A1A1A", "B c #696969", "C c #D9DADA", "D c #B8BFC6", "E c #6F8195", "F c #BFC6CE", "G c #ECECEC", "H c #DFDFDF", "I c #5C7289", "J c #8C9AA8", "K c #CBCCCE", "L c #878787", "M c #404040", "N c #525252", "O c #A3A3A3", "P c #D6D6D5", "Q c #D1D1D1", "R c #CACACA", "S c #C9C9C9", "T c #C1C1C0", "U c #2C2C2C", "V c #505050", "W c #B3B3B3", "X c #ACACAC", "Y c #CCCCCC", "Z c #B6B6B6", "` c #B5B5B5", " . c #4E4E4E", ".. c #080808", "+. c #E3E3E3", "@. c #8B8A8A", "#. c #383838", "$. c #747474", "%. c #9E9E9D", "&. c #A4A4A3", "*. c #737373", "=. c #313131", "-. c #000000", ";. c #545353", ">. c #EFEEEE", ",. c #DCDBDB", "'. c #AEAEAE", "). c #616060", "!. c #414141", "~. c #343434", "{. c #363636", "]. c #0F0F0E", "^. c #121212", "/. c #0E0E0E", "(. c #EFEFEF", "_. c #E0E0E0", ":. c #D3D3D3", "<. c #D2D2D2", "[. c #272727", "}. c #EEEEEE", "|. c #E5E5E5", "1. c #E4E4E4", "2. c #171717", "3. c #494949", "4. c #7F7F7F", "5. c #7E7E7E", "6. c #7D7D7D", "7. c #717171", " . + @ # $ ", " % & * = - ; > , ", " > ' ) ! ~ ~ { ] ^ / ", " ( _ ) : < [ } : | - 1 ", " 2 3 4 5 6 7 [ 8 9 0 a ", "b c d e f g h < i j k l m ", "n o p q r s t u v w x y z ", "A B C D E F G H I J K L ", "M N O P Q R S 3 T R _ U ", "V W 1 X R Y R 3 Z ` ... ", "> +.@.#.$.%._ &.*.=.-.-. ", ";.>.,.'.).!.~.{.]. ^./.-. ", "> (.{ { _.:.<.' -. % [.-. ", "> }.{ |.|.1.+.S -. 2.3./. ", "=.4.5.5.6.6.6.7. -. ", " "}; flamerobin_0.9.3~svn+2220.orig/res/history24.xpm000066400000000000000000000056571177057155300214060ustar00rootroot00000000000000/* XPM */ static const char * history24_xpm[] = { "24 24 105 2", " c None", ". c #191919", "+ c #252525", "@ c #2C2C2C", "# c #343434", "$ c #3A3A3A", "% c #444444", "& c #2D2D2D", "* c #0E0E0E", "= c #3C3C3C", "- c #212121", "; c #693510", "> c #3E3E3E", ", c #D1D1D1", "' c #FDFDFD", ") c #FAFAFB", "! c #FBFBFB", "~ c #F2F2F2", "{ c #DDDDDD", "] c #A1A2A2", "^ c #8F9091", "/ c #404040", "( c #FFFFFF", "_ c #FFFFFE", ": c #F6F7F7", "< c #B8B9B9", "[ c #E7E8E9", "} c #EFF0F0", "| c #424242", "1 c #FEFEFE", "2 c #FAFAFA", "3 c #F9F9F9", "4 c #F7F7F7", "5 c #F3F4F4", "6 c #EFF0F1", "7 c #EAEBEB", "8 c #8C8C8E", "9 c #8B8C8D", "0 c #FFFFFC", "a c #D2D2D2", "b c #CECFCF", "c c #CDCDCD", "d c #B5B5B5", "e c #E5E6E7", "f c #EDEDEE", "g c #F2F3F3", "h c #EBEBEB", "i c #8F8F90", "j c #8D8D8F", "k c #5F5F5F", "l c #FFFDFE", "m c #D4D4D4", "n c #D0D0D0", "o c #CECECE", "p c #B5B6B6", "q c #DDDEE0", "r c #E9E9EA", "s c #9B9B9B", "t c #F5F6F6", "u c #FEFDFF", "v c #D0D1D1", "w c #EBECEC", "x c #DCDDDD", "y c #E9E9E9", "z c #7D7D7D", "A c #FCFEFF", "B c #F8F8F8", "C c #F6F6F6", "D c #F1F2F2", "E c #EEEFEF", "F c #919192", "G c #8E8F90", "H c #FAFCFF", "I c #D5D5D5", "J c #D3D3D3", "K c #D1D2D2", "L c #CFD0D0", "M c #ECEDED", "N c #B5B5B6", "O c #DBDCDD", "P c #E8E9E9", "Q c #FDFFFF", "R c #F5F5F5", "S c #F0F1F1", "T c #919293", "U c #464646", "V c #F7F8F8", "W c #BABABA", "X c #E2E3E4", "Y c #ECECEE", "Z c #474747", "` c #858687", " . c #828384", ".. c #131313", "+. c #000000", "@. c #0B0B0B", "#. c #1E1E1E", "$. c #4B4B4B", "%. c #535353", "&. c #0D0D0D", "*. c #383838", "=. c #595959", "-. c #4A4A4A", ";. c #3D3D3D", ">. c #1D1D1D", " ", " ", " ", " ", " ", " . + @ # $ % & * * & % = # @ @ + - ; ", " > , ' ' ' ) ! ~ { ] ] { ~ ! ) ' ' ' ' ^ , / ", " > , ( _ _ _ _ : < [ } < : _ _ _ _ _ ( ^ , | ", " > , 1 2 3 4 5 6 7 8 9 7 6 5 4 3 2 2 1 ^ , | ", " > , 0 a , b c 7 d e f d 7 c b , a a 0 ^ , | ", " > , _ 2 3 : g } h i j h } g : 3 2 2 _ ^ , k ", " > , l m a n o 7 p q r p 7 o n a m m l ^ % s k ", " > , ( ! 3 t 5 6 h ^ j h 6 5 t 3 ! ! ( ^ % s k ", " > , u m a v b w d x y d w b v a m m u ^ , % z ", " > , A B C 5 D E h F G h E D 5 C B B A ^ , % ", " > , H I J K L M N O P N M L K J I I H ^ , % ", " > , Q 4 R g S M h T ^ h M S g R 4 4 Q ^ , U ", " > , ( _ _ _ _ V W X Y W V _ _ _ _ _ ( ^ , Z ", " / , C C C C 4 R o ` .o R 4 C C C C C ^ , | ", " ..+.@.#.& > $.%.@ &.&.&.*.=.-.;.@ @ >.* +. ", " ", " ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/insert16.xpm000066400000000000000000000024551177057155300212030ustar00rootroot00000000000000/* XPM */ static const char * insert16_xpm[] = { "16 16 59 1", " c None", ". c #000000", "+ c #A2AEBC", "@ c #6D8196", "# c #8B8B8B", "$ c #727F8C", "% c #7D8EA1", "& c #314E6C", "* c #5C5C5C", "= c #21364B", "- c #D6D6D6", "; c #BFBFBF", "> c #CECECE", ", c #D2D2D2", "' c #D5D5D5", ") c #D8D8D8", "! c #DCDCDC", "~ c #DFDFDF", "{ c #E2E2E2", "] c #E9E9E9", "^ c #ECECEC", "/ c #A8A8A8", "( c #D1D1D1", "_ c #D4D4D4", ": c #DBDBDB", "< c #DEDEDE", "[ c #E5E5E5", "} c #EFEFEF", "| c #AAAAAA", "1 c #979797", "2 c #404040", "3 c #DADADA", "4 c #DDDDDD", "5 c #E0E0E0", "6 c #8A8A8A", "7 c #F1F1F1", "8 c #F4F4F4", "9 c #ADADAD", "0 c #D9D9D9", "a c #E3E3E3", "b c #00FF18", "c c #F7F7F7", "d c #AFAFAF", "e c #B3B3B3", "f c #E1E1E1", "g c #E4E4E4", "h c #E8E8E8", "i c #F9F9F9", "j c #FCFCFC", "k c #EBEBEB", "l c #FFFFFF", "m c #B1B1B1", "n c #868686", "o c #9F9F9F", "p c #A2A2A2", "q c #A4A4A4", "r c #A6A6A6", "s c #A9A9A9", "t c #ABABAB", "................", ".+@#@@@@@@@#@@$.", ".%&*&&&&&&&*&&=.", ".-;*>,')!~{*]^/.", ".-;*(_):<{[*^}|.", ".1************2.", ".-;*-3456..6789.", ".-;*0!5a.bb.8cd.", ".1****6..bb..62.", ".-;*<{.bbbbbb.e.", ".-;*fg.bbbbbb.e.", ".1****6..bb..62.", ".-;*<{[h.bb.ije.", ".-;*fghk6..6jle.", ".mn2opqrst92eee.", "................"}; flamerobin_0.9.3~svn+2220.orig/res/insert24.xpm000066400000000000000000000031221177057155300211720ustar00rootroot00000000000000/* XPM */ static const char * insert24_xpm[] = { "24 24 59 1", " c None", ". c #000000", "+ c #A2AEBC", "@ c #6D8196", "# c #8B8B8B", "$ c #727F8C", "% c #7D8EA1", "& c #314E6C", "* c #5C5C5C", "= c #21364B", "- c #D6D6D6", "; c #BFBFBF", "> c #CECECE", ", c #D2D2D2", "' c #D5D5D5", ") c #D8D8D8", "! c #DCDCDC", "~ c #DFDFDF", "{ c #E2E2E2", "] c #E9E9E9", "^ c #ECECEC", "/ c #A8A8A8", "( c #D1D1D1", "_ c #D4D4D4", ": c #DBDBDB", "< c #DEDEDE", "[ c #E5E5E5", "} c #EFEFEF", "| c #AAAAAA", "1 c #979797", "2 c #404040", "3 c #DADADA", "4 c #DDDDDD", "5 c #E0E0E0", "6 c #8A8A8A", "7 c #F1F1F1", "8 c #F4F4F4", "9 c #ADADAD", "0 c #D9D9D9", "a c #E3E3E3", "b c #00FF18", "c c #F7F7F7", "d c #AFAFAF", "e c #B3B3B3", "f c #E1E1E1", "g c #E4E4E4", "h c #E8E8E8", "i c #F9F9F9", "j c #FCFCFC", "k c #EBEBEB", "l c #FFFFFF", "m c #B1B1B1", "n c #868686", "o c #9F9F9F", "p c #A2A2A2", "q c #A4A4A4", "r c #A6A6A6", "s c #A9A9A9", "t c #ABABAB", " ", " ", " ", " ", " ................ ", " .+@#@@@@@@@#@@$. ", " .%&*&&&&&&&*&&=. ", " .-;*>,')!~{*]^/. ", " .-;*(_):<{[*^}|. ", " .1************2. ", " .-;*-3456..6789. ", " .-;*0!5a.bb.8cd. ", " .1****6..bb..62. ", " .-;*<{.bbbbbb.e. ", " .-;*fg.bbbbbb.e. ", " .1****6..bb..62. ", " .-;*<{[h.bb.ije. ", " .-;*fghk6..6jle. ", " .mn2opqrst92eee. ", " ................ ", " ", " ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/key.xpm000066400000000000000000000017021177057155300203120ustar00rootroot00000000000000/* XPM */ static const char * key_xpm[] = { "16 16 39 1", " c None", ". c #534E02", "+ c #BEB900", "@ c #999500", "# c #605D01", "$ c #787400", "% c #EBE400", "& c #E6E000", "* c #8A8600", "= c #433E04", "- c #FFF800", "; c #494105", "> c #706B01", ", c #342E04", "' c #4F4C01", ") c #FCF600", "! c #6F6902", "~ c #595600", "{ c #F8F100", "] c #F9F200", "^ c #FCF500", "/ c #B7B200", "( c #767200", "_ c #938F00", ": c #F4ED00", "< c #D6D000", "[ c #343003", "} c #403E00", "| c #EFE800", "1 c #646101", "2 c #4C4902", "3 c #797600", "4 c #908C00", "5 c #595601", "6 c #2B2A00", "7 c #C8C300", "8 c #5B5800", "9 c #D7D100", "0 c #858100", " ", " ", " .+@# ", " $%%&&* ", " =% %-&; ", " >%,')--! ", " ~{]^--^! ", " /-----%( ", " _%:%%-<[ ", " }<&|1 ", " 23<-4 ", " 56<-7 ", " 8<90 ", " ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/left.xpm000066400000000000000000000013771177057155300204640ustar00rootroot00000000000000/* XPM */ static const char * left_xpm[] = { "16 16 26 1", " c None", ". c #000000", "+ c #AFF0AF", "@ c #8FE08D", "# c #92E190", "$ c #95E493", "% c #97E495", "& c #98E798", "* c #97E697", "= c #5DB65B", "- c #87DC85", "; c #90E18E", "> c #8ADD88", ", c #87DA85", "' c #85DA83", ") c #4E8A4D", "! c #1C351C", "~ c #B1F0B1", "{ c #8BDE89", "] c #89DC87", "^ c #508E4F", "/ c #2C4F2C", "( c #477346", "_ c #385F38", ": c #2B4E2B", "< c #2F522F", " ", " . ", " .. ", " .+. ", " .+@....... ", " .+#$%&%*@=. ", " .+-;@>,,>'). ", " !~>{]]->>>>^. ", " ./((((((((_. ", " ./((:::::<. ", " ./(....... ", " ./. ", " .. ", " . ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/load.xpm000066400000000000000000000112101177057155300204340ustar00rootroot00000000000000/* XPM */ static const char * load_xpm[] = { "16 16 257 2", " c None", ". c #000000", "+ c #000040", "@ c #000080", "# c #0000FF", "$ c #002000", "% c #002040", "& c #002080", "* c #0020FF", "= c #004000", "- c #004040", "; c #004080", "> c #0040FF", ", c #006000", "' c #006040", ") c #006080", "! c #0060FF", "~ c #008000", "{ c #008040", "] c #008080", "^ c #0080FF", "/ c #00A000", "( c #00A040", "_ c #00A080", ": c #00A0FF", "< c #00C000", "[ c #00C040", "} c #00C080", "| c #00C0FF", "1 c #00FF00", "2 c #00FF40", "3 c #00FF80", "4 c #00FFFF", "5 c #200000", "6 c #200040", "7 c #200080", "8 c #2000FF", "9 c #202000", "0 c #202040", "a c #202080", "b c #2020FF", "c c #204000", "d c #204040", "e c #204080", "f c #2040FF", "g c #206000", "h c #206040", "i c #206080", "j c #2060FF", "k c #208000", "l c #208040", "m c #208080", "n c #2080FF", "o c #20A000", "p c #20A040", "q c #20A080", "r c #20A0FF", "s c #20C000", "t c #20C040", "u c #20C080", "v c #20C0FF", "w c #20FF00", "x c #20FF40", "y c #20FF80", "z c #20FFFF", "A c #400000", "B c #400040", "C c #400080", "D c #4000FF", "E c #402000", "F c #402040", "G c #402080", "H c #4020FF", "I c #404000", "J c #404040", "K c #404080", "L c #4040FF", "M c #406000", "N c #406040", "O c #406080", "P c #4060FF", "Q c #408000", "R c #408040", "S c #408080", "T c #4080FF", "U c #40A000", "V c #40A040", "W c #40A080", "X c #40A0FF", "Y c #40C000", "Z c #40C040", "` c #40C080", " . c #40C0FF", ".. c #40FF00", "+. c #40FF40", "@. c #40FF80", "#. c #40FFFF", "$. c #600000", "%. c #600040", "&. c #600080", "*. c #6000FF", "=. c #602000", "-. c #602040", ";. c #602080", ">. c #6020FF", ",. c #604000", "'. c #604040", "). c #604080", "!. c #6040FF", "~. c #606000", "{. c #606040", "]. c #606080", "^. c #6060FF", "/. c #608000", "(. c #608040", "_. c #608080", ":. c #6080FF", "<. c #60A000", "[. c #60A040", "}. c #60A080", "|. c #60A0FF", "1. c #60C000", "2. c #60C040", "3. c #60C080", "4. c #60C0FF", "5. c #60FF00", "6. c #60FF40", "7. c #60FF80", "8. c #60FFFF", "9. c #800000", "0. c #800040", "a. c #800080", "b. c #8000FF", "c. c #802000", "d. c #802040", "e. c #802080", "f. c #8020FF", "g. c #804000", "h. c #804040", "i. c #804080", "j. c #8040FF", "k. c #806000", "l. c #806040", "m. c #806080", "n. c #8060FF", "o. c #808000", "p. c #808040", "q. c #808080", "r. c #8080FF", "s. c #80A000", "t. c #80A040", "u. c #80A080", "v. c #80A0FF", "w. c #80C000", "x. c #80C040", "y. c #80C080", "z. c #80C0FF", "A. c #80FF00", "B. c #80FF40", "C. c #80FF80", "D. c #80FFFF", "E. c #A00000", "F. c #A00040", "G. c #A00080", "H. c #A000FF", "I. c #A02000", "J. c #A02040", "K. c #A02080", "L. c #A020FF", "M. c #A04000", "N. c #A04040", "O. c #A04080", "P. c #A040FF", "Q. c #A06000", "R. c #A06040", "S. c #A06080", "T. c #A060FF", "U. c #A08000", "V. c #A08040", "W. c #A08080", "X. c #A080FF", "Y. c #A0A000", "Z. c #A0A040", "`. c #A0A080", " + c #A0A0FF", ".+ c #A0C000", "++ c #A0C040", "@+ c #A0C080", "#+ c #A0C0FF", "$+ c #A0FF00", "%+ c #A0FF40", "&+ c #A0FF80", "*+ c #A0FFFF", "=+ c #C00000", "-+ c #C00040", ";+ c #C00080", ">+ c #C000FF", ",+ c #C02000", "'+ c #C02040", ")+ c #C02080", "!+ c #C020FF", "~+ c #C04000", "{+ c #C04040", "]+ c #C04080", "^+ c #C040FF", "/+ c #C06000", "(+ c #C06040", "_+ c #C06080", ":+ c #C060FF", "<+ c #C08000", "[+ c #C08040", "}+ c #C08080", "|+ c #C080FF", "1+ c #C0A000", "2+ c #C0A040", "3+ c #C0A080", "4+ c #C0A0FF", "5+ c #C0C000", "6+ c #C0C040", "7+ c #C0C080", "8+ c #C0C0FF", "9+ c #C0FF00", "0+ c #C0FF40", "a+ c #C0FF80", "b+ c #C0FFFF", "c+ c #FF0000", "d+ c #FF0040", "e+ c #FF0080", "f+ c #FF00FF", "g+ c #FF2000", "h+ c #FF2040", "i+ c #FF2080", "j+ c #FF20FF", "k+ c #FF4000", "l+ c #FF4040", "m+ c #FF4080", "n+ c #FF40FF", "o+ c #FF6000", "p+ c #FF6040", "q+ c #FF6080", "r+ c #FF60FF", "s+ c #FF8000", "t+ c #FF8040", "u+ c #FF8080", "v+ c #FF80FF", "w+ c #FFA000", "x+ c #FFA040", "y+ c #FFA080", "z+ c #FFA0FF", "A+ c #FFC000", "B+ c #FFC040", "C+ c #FFC080", "D+ c #FFC0FF", "E+ c #FFFF00", "F+ c #FFFF40", "G+ c #FFFF80", "H+ c None", "H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+", "H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+", "H+H+H+Y.Y.Y.Y.Y.H+H+H+H+H+H+H+H+", "H+H+Y.H+H+H+H+H+Y.H+H+H+H+H+H+H+", "H+Y.H+G+G+G+G+G+H+Y.Y.Y.Y.Y.Y.H+", "H+Y.H+G+G+G+G+G+G+G+H+H+H+H+7+. ", "H+Y.H+G+G+G+G+G+G+G+G+G+G+G+7+. ", "Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.7+G+7+. ", "Y.H+G+G+G+G+G+G+C+G+C+7+. 7+7+. ", "Y.H+G+G+G+G+C+G+G+C+G+7+. 7+7+. ", "H+Y.H+G+G+G+G+G+C+G+C+C+Y.. Y.. ", "H+Y.H+G+G+C+G+C+G+C+C+C+7+. Y.. ", "H+H+Y.H+C+G+C+G+C+C+C+C+7+Y.. . ", "H+H+Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.. . ", "H+H+H+. . . . . . . . . . . . . ", "H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+"}; flamerobin_0.9.3~svn+2220.orig/res/new.xpm000066400000000000000000000112071177057155300203140ustar00rootroot00000000000000/* XPM */ static const char * new_xpm[] = { "16 16 257 2", " c None", ". c #000000", "+ c #000040", "@ c #000080", "# c #0000FF", "$ c #002000", "% c #002040", "& c #002080", "* c #0020FF", "= c #004000", "- c #004040", "; c #004080", "> c #0040FF", ", c #006000", "' c #006040", ") c #006080", "! c #0060FF", "~ c #008000", "{ c #008040", "] c #008080", "^ c #0080FF", "/ c #00A000", "( c #00A040", "_ c #00A080", ": c #00A0FF", "< c #00C000", "[ c #00C040", "} c #00C080", "| c #00C0FF", "1 c #00FF00", "2 c #00FF40", "3 c #00FF80", "4 c #00FFFF", "5 c #200000", "6 c #200040", "7 c #200080", "8 c #2000FF", "9 c #202000", "0 c #202040", "a c #202080", "b c #2020FF", "c c #204000", "d c #204040", "e c #204080", "f c #2040FF", "g c #206000", "h c #206040", "i c #206080", "j c #2060FF", "k c #208000", "l c #208040", "m c #208080", "n c #2080FF", "o c #20A000", "p c #20A040", "q c #20A080", "r c #20A0FF", "s c #20C000", "t c #20C040", "u c #20C080", "v c #20C0FF", "w c #20FF00", "x c #20FF40", "y c #20FF80", "z c #20FFFF", "A c #400000", "B c #400040", "C c #400080", "D c #4000FF", "E c #402000", "F c #402040", "G c #402080", "H c #4020FF", "I c #404000", "J c #404040", "K c #404080", "L c #4040FF", "M c #406000", "N c #406040", "O c #406080", "P c #4060FF", "Q c #408000", "R c #408040", "S c #408080", "T c #4080FF", "U c #40A000", "V c #40A040", "W c #40A080", "X c #40A0FF", "Y c #40C000", "Z c #40C040", "` c #40C080", " . c #40C0FF", ".. c #40FF00", "+. c #40FF40", "@. c #40FF80", "#. c #40FFFF", "$. c #600000", "%. c #600040", "&. c #600080", "*. c #6000FF", "=. c #602000", "-. c #602040", ";. c #602080", ">. c #6020FF", ",. c #604000", "'. c #604040", "). c #604080", "!. c #6040FF", "~. c #606000", "{. c #606040", "]. c #606080", "^. c #6060FF", "/. c #608000", "(. c #608040", "_. c #608080", ":. c #6080FF", "<. c #60A000", "[. c #60A040", "}. c #60A080", "|. c #60A0FF", "1. c #60C000", "2. c #60C040", "3. c #60C080", "4. c #60C0FF", "5. c #60FF00", "6. c #60FF40", "7. c #60FF80", "8. c #60FFFF", "9. c #800000", "0. c #800040", "a. c #800080", "b. c #8000FF", "c. c #802000", "d. c #802040", "e. c #802080", "f. c #8020FF", "g. c #804000", "h. c #804040", "i. c #804080", "j. c #8040FF", "k. c #806000", "l. c #806040", "m. c #806080", "n. c #8060FF", "o. c #808000", "p. c #808040", "q. c #808080", "r. c #8080FF", "s. c #80A000", "t. c #80A040", "u. c #80A080", "v. c #80A0FF", "w. c #80C000", "x. c #80C040", "y. c #80C080", "z. c #80C0FF", "A. c #80FF00", "B. c #80FF40", "C. c #80FF80", "D. c #80FFFF", "E. c #A00000", "F. c #A00040", "G. c #A00080", "H. c #A000FF", "I. c #A02000", "J. c #A02040", "K. c #A02080", "L. c #A020FF", "M. c #A04000", "N. c #A04040", "O. c #A04080", "P. c #A040FF", "Q. c #A06000", "R. c #A06040", "S. c #A06080", "T. c #A060FF", "U. c #A08000", "V. c #A08040", "W. c #A08080", "X. c #A080FF", "Y. c #A0A000", "Z. c #A0A040", "`. c #A0A080", " + c #A0A0FF", ".+ c #A0C000", "++ c #A0C040", "@+ c #A0C080", "#+ c #A0C0FF", "$+ c #A0FF00", "%+ c #A0FF40", "&+ c #A0FF80", "*+ c #A0FFFF", "=+ c #C00000", "-+ c #C00040", ";+ c #C00080", ">+ c #C000FF", ",+ c #C02000", "'+ c #C02040", ")+ c #C02080", "!+ c #C020FF", "~+ c #C04000", "{+ c #C04040", "]+ c #C04080", "^+ c #C040FF", "/+ c #C06000", "(+ c #C06040", "_+ c #C06080", ":+ c #C060FF", "<+ c #C08000", "[+ c #C08040", "}+ c #C08080", "|+ c #C080FF", "1+ c #C0A000", "2+ c #C0A040", "3+ c #C0A080", "4+ c #C0A0FF", "5+ c #C0C000", "6+ c #C0C040", "7+ c #C0C080", "8+ c None", "9+ c #C0FF00", "0+ c #C0FF40", "a+ c #C0FF80", "b+ c #C0FFFF", "c+ c #FF0000", "d+ c #FF0040", "e+ c #FF0080", "f+ c #FF00FF", "g+ c #FF2000", "h+ c #FF2040", "i+ c #FF2080", "j+ c #FF20FF", "k+ c #FF4000", "l+ c #FF4040", "m+ c #FF4080", "n+ c #FF40FF", "o+ c #FF6000", "p+ c #FF6040", "q+ c #FF6080", "r+ c #FF60FF", "s+ c #FF8000", "t+ c #FF8040", "u+ c #FF8080", "v+ c #FF80FF", "w+ c #FFA000", "x+ c #FFA040", "y+ c #FFA080", "z+ c #FFA0FF", "A+ c #FFC000", "B+ c #FFC040", "C+ c #FFC080", "D+ c #FFC0FF", "E+ c #FFFF00", "F+ c #FFFF40", "G+ c #FFFF80", "H+ c #FFFFFF", "8+8+. {.{.{.{.{.{.{.. 8+8+8+8+8+", "8+8+. H+H+H+H+H+H+H+{.9 8+8+8+8+", "8+8+. H+H+H+H+H+H+H+{.H+9 8+8+8+", "8+8+. H+H+H+H+H+H+H+{.{.{.9 8+8+", "8+8+. H+H+H+H+H+H+H+H+H+H+{.{.8+", "8+8+. H+H+H+H+H+H+H+H+H+H+{.{.8+", "8+8+. H+H+H+H+H+H+H+H+H+H+{.{.8+", "8+8+. H+H+H+H+H+H+H+H+H+H+{.{.8+", "8+8+. H+H+H+H+H+H+H+H+H+H+{.{.8+", "8+8+. H+H+H+H+H+H+H+H+H+H+{.{.8+", "8+8+. H+H+H+H+H+H+H+H+H+H+{.{.8+", "8+8+. H+H+H+H+H+H+H+H+H+H+{.{.8+", "8+8+. {.{.{.{.{.{.{.{.{.{.{.{.8+", "8+8+8+. . . . . . . . . . . . 8+", "8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+", "8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+"}; flamerobin_0.9.3~svn+2220.orig/res/object.xpm000066400000000000000000000015711177057155300207740ustar00rootroot00000000000000/* XPM */ static const char * object_xpm[] = { "16 16 34 1", " c None", ". c #000686", "+ c #FFFFFF", "@ c #889CC1", "# c #F7F3F7", "$ c #FFFBFF", "% c #FFFBF7", "& c #F7F7F7", "* c #EFEFE7", "= c #DEDBCE", "- c #F7F3EF", "; c #E7E7CE", "> c #E7E3CE", ", c #D6D7AD", "' c #C6C794", ") c #A5A28C", "! c #949273", "~ c #DEDBBD", "{ c #C6C3AD", "] c #E7E3C6", "^ c #D6D7B5", "/ c #D6D3A5", "( c #BDBA9C", "_ c #ADAE84", ": c #84866B", "< c #9C9E7B", "[ c #CECF9C", "} c #BDBA8C", "| c #E7E7D6", "1 c #B5B68C", "2 c #C6C3C6", "3 c #BDBEBD", "4 c #BDBABD", "5 c #A5A2A5", " ......... ", " .++++++++@. ", " .+##+++++@+ ", " .+##+++++....", " .+##++++++@@.", " .......+++++.", " ...$%%&*...+++.", ".=-.&;>,'.)!.++.", ".*~{%]^/,(^_.++.", ".:<.-/[[}.!<.++.", " ...|111_...+++.", " .......+++++.", " .+++++++++++.", " .+++++++++++.", " .23333344445.", " ........... "}; flamerobin_0.9.3~svn+2220.orig/res/ok.xpm000066400000000000000000000011671177057155300201400ustar00rootroot00000000000000/* XPM */ static const char * ok_xpm[] = { "16 16 16 1", " c None", ". c #000000", "+ c #C8D7E5", "@ c #8EA8C0", "# c #9DB8D2", "$ c #7E94AA", "% c #8299AF", "& c #D6E1EB", "* c #C4CED6", "= c #ACBED0", "- c #404040", "; c #ACB9C5", "> c #727272", ", c #889FB6", "' c #B1BFCB", ") c #98B2CC", " ", " ", " ", " .. ", " .+@. ", " .+#$. ", " .. .+#%. ", " .&&. .+#%. ", " .*#=. .+#%. ", " -=#=.&#%. ", " .;####%. ", " >,##%. ", " .')$. ", " ... ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/ok24.xpm000066400000000000000000000061721177057155300203070ustar00rootroot00000000000000/* XPM */ static const char * ok24_xpm[] = { "24 24 118 2", " c None", ". c #1B7A14", "+ c #2E8228", "@ c #C8DEC6", "# c #387F32", "$ c #2C8325", "% c #BFD6BC", "& c #5BCE4F", "* c #B4D2B1", "= c #085401", "- c #2A8123", "; c #BDD7BB", "> c #8DBB87", ", c #0B4707", "' c #2A8222", ") c #BDDABA", "! c #59CC4D", "~ c #449B3A", "{ c #164715", "] c #0C7C04", "^ c #288320", "/ c #BCDFB8", "( c #53CA47", "_ c #1F8E14", ": c #184B16", "< c #030C02", "[ c #16890C", "} c #CBE8C8", "| c #319429", "1 c #497846", "2 c #298921", "3 c #BCE4B7", "4 c #56CC4A", "5 c #229116", "6 c #053D01", "7 c #010A00", "8 c #000000", "9 c #338E2B", "0 c #BFE2BA", "a c #E5F3E4", "b c #208919", "c c #184B13", "d c #2D8E25", "e c #BEE8BA", "f c #5ACD4E", "g c #29981D", "h c #043E01", "i c #398633", "j c #ABD8A5", "k c #E3F4E1", "l c #228E18", "m c #21531C", "n c #2F9328", "o c #C1EBBC", "p c #2E9C24", "q c #044201", "r c #010B00", "s c #44883F", "t c #5BBC51", "u c #E1F5DF", "v c #1F8117", "w c #568352", "x c #4A9D44", "y c #C1EEBC", "z c #36A92B", "A c #044B01", "B c #011000", "C c #488643", "D c #36B428", "E c #DFF5DD", "F c #469942", "G c #C8F3C4", "H c #5ACE4E", "I c #3DB633", "J c #075203", "K c #021500", "L c #10410B", "M c #24741D", "N c #36BF27", "O c #CCF6C7", "P c #5BD04E", "Q c #46CA3C", "R c #0B5C07", "S c #041A01", "T c #064000", "U c #15770D", "V c #47D039", "W c #5CD14F", "X c #4BD941", "Y c #10660B", "Z c #071C04", "` c #064B00", " . c #15790F", ".. c #56DC4A", "+. c #5BCE4E", "@. c #4EDD44", "#. c #126E0F", "$. c #0A1F07", "%. c #0B5603", "&. c #187C13", "*. c #62E756", "=. c #57DF4D", "-. c #187014", ";. c #0D220A", ">. c #13600C", ",. c #1C8416", "'. c #7AEE70", "). c #68E15F", "!. c #22721F", "~. c #122510", "{. c #1C6A15", "]. c #258821", "^. c #68D162", "/. c #237320", "(. c #182517", "_. c #27771F", ":. c #186A15", "<. c #172E14", " ", " ", " ", " . ", " + @ # ", " $ % & * = ", " - ; & & & > , ", " ' ) & & & ! ~ { ", " ] ^ / & & & ( _ : < ", " [ } | 1 2 3 & & & 4 5 6 7 8 ", " 9 0 & a b c d e & & & f g h 7 8 ", " i j & & & k l m n o & & & & p q r 8 ", " s t & & & & u v w x y & & & & z A B 8 ", " C D & & & & E F G & & & H I J K 8 ", " L M N & & & & O & & & P Q R S 8 ", " T U V & & & & & & W X Y Z 8 ", " ` ...+.& & & & @.#.$.8 ", " %.&.*.& & & =.-.;.8 ", " >.,.'.& ).!.~.8 ", " {.].^./.(.8 ", " _.:.<.8 ", " ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/pk16_png.cpp000066400000000000000000000063701177057155300211330ustar00rootroot00000000000000static const unsigned char pk16_png[] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0xf3, 0xff, 0x61, 0x00, 0x00, 0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0, 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd7, 0x0a, 0x1e, 0x16, 0x01, 0x2d, 0x7d, 0xf6, 0x0c, 0xcc, 0x00, 0x00, 0x01, 0xaf, 0x49, 0x44, 0x41, 0x54, 0x38, 0xcb, 0xad, 0x93, 0x4d, 0x48, 0x54, 0x61, 0x14, 0x86, 0x9f, 0xf3, 0x7d, 0xf7, 0xce, 0xe8, 0xdc, 0xe1, 0x46, 0x39, 0x91, 0x46, 0xa3, 0x43, 0x36, 0xfe, 0x84, 0x10, 0xad, 0x06, 0xdc, 0x68, 0x11, 0xd4, 0x22, 0x88, 0xda, 0xf6, 0xb3, 0x6d, 0xd1, 0x6e, 0x28, 0x5c, 0x14, 0x18, 0x18, 0x82, 0x32, 0xe0, 0x22, 0x84, 0xda, 0xb9, 0x68, 0xd9, 0xa6, 0x16, 0xd1, 0x42, 0x30, 0x5c, 0x05, 0xad, 0xd2, 0x51, 0x91, 0x9a, 0x62, 0xa6, 0x8c, 0x22, 0x30, 0xab, 0x51, 0x9b, 0x31, 0xef, 0x69, 0x31, 0x11, 0x8a, 0x5d, 0x8b, 0xec, 0x59, 0x1e, 0x38, 0x0f, 0x2f, 0xe7, 0xe5, 0xc0, 0x0e, 0x11, 0x55, 0xfd, 0xf7, 0x65, 0x11, 0x9c, 0x4d, 0x93, 0xa1, 0xd6, 0x5d, 0x54, 0xaa, 0xdd, 0x08, 0x0d, 0x48, 0xf0, 0x8c, 0x1b, 0x0b, 0xf3, 0x7f, 0x9f, 0x60, 0xa8, 0xf9, 0x8c, 0xba, 0xe6, 0x0e, 0x6d, 0xbe, 0x27, 0x9e, 0x8d, 0xea, 0x8b, 0xe5, 0x25, 0x2d, 0xaf, 0x8f, 0x9b, 0x6c, 0xe1, 0xfc, 0x76, 0x09, 0x6a, 0x82, 0x5b, 0xcd, 0xad, 0xea, 0xbb, 0x4f, 0xe5, 0x50, 0x3c, 0xa1, 0x38, 0x48, 0xf7, 0x61, 0x90, 0x38, 0x3a, 0x31, 0xf3, 0x45, 0xe6, 0x8b, 0x57, 0xe8, 0x2b, 0xde, 0x0b, 0x13, 0x18, 0x80, 0xa0, 0xce, 0xdc, 0x94, 0x63, 0x7b, 0x13, 0x9a, 0xff, 0x0c, 0x53, 0x8b, 0x10, 0x34, 0x82, 0x6d, 0x41, 0x7a, 0x4f, 0xfb, 0xea, 0xd4, 0x0f, 0x82, 0x48, 0x58, 0x0a, 0xe7, 0xa7, 0x29, 0xcd, 0x1e, 0x0f, 0x39, 0x9a, 0x02, 0xf1, 0xc1, 0xec, 0x07, 0xdb, 0x08, 0x8e, 0x07, 0x4e, 0xd4, 0x85, 0xf0, 0x4b, 0x3b, 0x00, 0x0a, 0xcf, 0x65, 0x51, 0x32, 0x64, 0x8e, 0x80, 0x4d, 0x82, 0x69, 0x02, 0xdb, 0x04, 0xb2, 0x1b, 0xaa, 0x81, 0xd4, 0x12, 0xfc, 0x5e, 0x62, 0x00, 0x4c, 0xb9, 0x3a, 0xa2, 0x93, 0xa5, 0x0f, 0xac, 0x19, 0xa0, 0x0e, 0xc4, 0xab, 0x2d, 0xdb, 0x24, 0x92, 0xb9, 0x10, 0xd3, 0x5c, 0xd7, 0x63, 0x6e, 0xa7, 0xa3, 0xdb, 0xb7, 0x30, 0x9c, 0x3a, 0xa7, 0x36, 0x92, 0xa3, 0xe5, 0xa0, 0x4f, 0x6c, 0x5f, 0x84, 0xc2, 0xdc, 0x0a, 0x6a, 0xad, 0x5c, 0x1a, 0x4d, 0x50, 0x18, 0xaf, 0xe8, 0x93, 0xb1, 0x59, 0x29, 0xaf, 0x1e, 0xa7, 0xff, 0xf5, 0xd2, 0xd6, 0x16, 0x36, 0x32, 0x90, 0xec, 0x21, 0xc0, 0xc3, 0x67, 0x82, 0x55, 0x37, 0xcb, 0x89, 0x8b, 0x03, 0xa4, 0x3b, 0x84, 0xf7, 0xd3, 0xeb, 0xfa, 0xe8, 0x7e, 0x51, 0xbe, 0x2d, 0xf7, 0x72, 0x7d, 0xe1, 0x4d, 0xb8, 0x60, 0x23, 0xb9, 0xce, 0xcb, 0x6a, 0x24, 0x8b, 0xaa, 0x2b, 0x67, 0x4f, 0xa5, 0xd0, 0x4f, 0xa2, 0x0f, 0x26, 0xdf, 0xc9, 0xd7, 0xef, 0x27, 0xe9, 0x2f, 0xe5, 0x7f, 0xd5, 0x18, 0xca, 0xd5, 0xb9, 0xbb, 0x92, 0x9d, 0x6d, 0x97, 0xca, 0xca, 0x08, 0x2f, 0xa7, 0x85, 0xb5, 0x8f, 0x70, 0xa0, 0x3e, 0x4e, 0x8c, 0x9e, 0x4d, 0x2d, 0xfc, 0x91, 0x88, 0xcc, 0x68, 0xfe, 0xd5, 0x43, 0xa6, 0x82, 0x98, 0x8a, 0xbe, 0x95, 0x6b, 0xa5, 0xd1, 0xff, 0xf6, 0x4c, 0x66, 0xa7, 0xef, 0xfc, 0x03, 0xda, 0x82, 0x99, 0x9d, 0x15, 0x68, 0xe3, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; flamerobin_0.9.3~svn+2220.orig/res/pkfk16_png.cpp000066400000000000000000000107351177057155300214540ustar00rootroot00000000000000static const unsigned char pkfk16_png[] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0xf3, 0xff, 0x61, 0x00, 0x00, 0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0, 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd6, 0x05, 0x10, 0x14, 0x28, 0x3b, 0x67, 0x33, 0xc1, 0x5f, 0x00, 0x00, 0x02, 0x8a, 0x49, 0x44, 0x41, 0x54, 0x38, 0xcb, 0x85, 0x93, 0x5d, 0x48, 0x53, 0x61, 0x18, 0xc7, 0xff, 0xcf, 0x7b, 0x76, 0x36, 0xe7, 0xe6, 0x36, 0x73, 0xae, 0xcd, 0x35, 0x42, 0x13, 0x83, 0x42, 0xd4, 0xb4, 0x48, 0x45, 0x13, 0x4b, 0x17, 0x44, 0xf4, 0x6d, 0x12, 0x74, 0xd3, 0x4d, 0x57, 0x5e, 0x18, 0x49, 0x85, 0x15, 0x12, 0x05, 0x91, 0x17, 0x5d, 0xd5, 0x85, 0x04, 0x41, 0x75, 0x93, 0x65, 0x5d, 0x74, 0x93, 0x05, 0xd1, 0x97, 0x1a, 0x32, 0xc3, 0xe5, 0x17, 0x88, 0xa4, 0xe6, 0xb6, 0x36, 0x57, 0x94, 0x6e, 0xee, 0xeb, 0xec, 0x9c, 0xb7, 0x8b, 0x10, 0x3a, 0x31, 0xf1, 0x7f, 0xf5, 0xde, 0x3c, 0x3f, 0x7e, 0x3c, 0xff, 0xe7, 0x25, 0xfc, 0x97, 0xd0, 0xd5, 0x8a, 0xd3, 0x66, 0x63, 0xf4, 0xbc, 0x96, 0x27, 0xad, 0x60, 0xb4, 0x40, 0x49, 0xb9, 0x9b, 0x2e, 0xfb, 0xfa, 0xb0, 0x46, 0x68, 0xf5, 0xd1, 0x54, 0xfb, 0xb9, 0xa0, 0xbd, 0xea, 0xae, 0xa7, 0x6e, 0xfb, 0xb0, 0xdd, 0xd8, 0x94, 0x43, 0x30, 0xe9, 0x81, 0x25, 0x11, 0xca, 0x7b, 0xff, 0x12, 0xc2, 0xcb, 0xcf, 0x84, 0x8e, 0xb9, 0x33, 0x99, 0x00, 0x0c, 0x00, 0x0e, 0x56, 0x7a, 0xb2, 0xb7, 0x58, 0x67, 0x3c, 0xd5, 0x25, 0x1e, 0x87, 0xc1, 0x24, 0x11, 0xef, 0xf5, 0x03, 0xf3, 0x5a, 0x20, 0xaf, 0x18, 0xec, 0xe8, 0x7e, 0x33, 0xe5, 0xe7, 0x1f, 0xe6, 0xd7, 0x1c, 0x75, 0x6b, 0x02, 0x22, 0x39, 0xe2, 0x8d, 0xda, 0xd2, 0x01, 0x9b, 0x65, 0xa7, 0x06, 0x08, 0xa6, 0x80, 0x22, 0x3b, 0xf8, 0x77, 0x19, 0x60, 0x2e, 0x40, 0xd8, 0x0c, 0xaa, 0x71, 0xe7, 0x72, 0x83, 0xa5, 0x2d, 0x13, 0x40, 0x03, 0x00, 0x44, 0x38, 0xe2, 0xda, 0xf0, 0x4b, 0x40, 0xb6, 0x08, 0x72, 0x97, 0x02, 0x3e, 0x09, 0x28, 0xaf, 0x01, 0x84, 0x02, 0x80, 0xcc, 0x80, 0xc9, 0x04, 0x40, 0x70, 0xae, 0x69, 0xc0, 0x18, 0x94, 0x19, 0x56, 0x09, 0xc9, 0x4f, 0x80, 0xc3, 0x01, 0xec, 0xae, 0x01, 0x0c, 0x4e, 0x80, 0xd9, 0x00, 0x61, 0x13, 0xf0, 0x53, 0x02, 0x12, 0x89, 0x95, 0x35, 0x01, 0x04, 0xfe, 0x7a, 0x24, 0xde, 0x20, 0xc7, 0xc7, 0x92, 0x40, 0x54, 0x02, 0x48, 0x0b, 0x20, 0x0b, 0x20, 0x03, 0xa0, 0x18, 0x81, 0xc2, 0x03, 0x40, 0x9e, 0xab, 0x8a, 0xdf, 0x2c, 0x39, 0x97, 0xb1, 0x85, 0x7d, 0x95, 0x1e, 0xb3, 0x68, 0xd5, 0x8e, 0xb7, 0xb6, 0x2e, 0x3a, 0x5b, 0x96, 0x3b, 0x49, 0x2c, 0x76, 0x41, 0xb0, 0x17, 0x42, 0xfa, 0x91, 0xe4, 0x9a, 0xa1, 0x3e, 0xa2, 0xfa, 0xb3, 0x2b, 0xa8, 0x3e, 0x64, 0xe0, 0x4f, 0x2e, 0x2c, 0xf1, 0xe0, 0xd7, 0x47, 0xac, 0x63, 0xba, 0x8d, 0x08, 0x5c, 0x55, 0x63, 0x73, 0xbd, 0xb7, 0x50, 0xab, 0x67, 0x4f, 0x95, 0x58, 0x7c, 0xc7, 0xbd, 0x5b, 0x61, 0x8c, 0xbe, 0xf0, 0x26, 0x7d, 0x3e, 0x65, 0xc0, 0x5d, 0xf0, 0xf8, 0xb8, 0xcb, 0x18, 0x09, 0x50, 0x7b, 0x4f, 0x16, 0xe8, 0x37, 0x78, 0xff, 0x83, 0x08, 0xa6, 0x27, 0xdf, 0x51, 0x5c, 0x7f, 0x8c, 0xba, 0x26, 0x52, 0xa4, 0x16, 0xe2, 0xe4, 0xde, 0x33, 0x16, 0xbc, 0x74, 0x7b, 0xb3, 0xed, 0xf9, 0xfd, 0xc5, 0xf0, 0xd4, 0x48, 0xac, 0xf1, 0xd5, 0x60, 0xd9, 0xb8, 0xd2, 0xe5, 0xe4, 0x10, 0xb5, 0x11, 0xd8, 0x1d, 0x32, 0x9d, 0x68, 0xb2, 0x60, 0x78, 0x30, 0xce, 0x3d, 0xd3, 0x93, 0x04, 0x61, 0x2f, 0xfb, 0x77, 0xbc, 0xb9, 0xe1, 0xcb, 0x07, 0x5b, 0x91, 0x68, 0x8c, 0x0a, 0x1c, 0x5c, 0x47, 0x4c, 0x61, 0xdc, 0x02, 0x00, 0xb4, 0xcd, 0xaf, 0x61, 0x9d, 0xb3, 0x26, 0x84, 0x02, 0x71, 0x44, 0xbe, 0x01, 0xe5, 0x66, 0x3d, 0x74, 0x54, 0x0a, 0x49, 0x3a, 0xa5, 0x51, 0x2d, 0x24, 0x8d, 0xeb, 0xa1, 0xd9, 0x54, 0xaf, 0x77, 0x2a, 0x06, 0x49, 0x80, 0xc8, 0x65, 0xfc, 0x05, 0xb4, 0x40, 0x06, 0x00, 0xc8, 0x69, 0x2d, 0x7f, 0xf8, 0x26, 0x84, 0x44, 0x7a, 0x23, 0x74, 0x6c, 0x08, 0x5b, 0x17, 0x7a, 0x54, 0x06, 0xfd, 0x1f, 0xcb, 0x5e, 0x72, 0x0e, 0xef, 0xcc, 0x7c, 0x02, 0x51, 0x28, 0x3a, 0x30, 0x6e, 0x56, 0x55, 0x76, 0xc5, 0x67, 0x65, 0x17, 0xe7, 0xed, 0x04, 0xd1, 0x41, 0x06, 0x9d, 0x9b, 0x5a, 0x20, 0xab, 0x0c, 0x1a, 0xeb, 0xbd, 0xdd, 0x8a, 0x8e, 0x76, 0x85, 0x8d, 0x1c, 0x3c, 0xa4, 0xe8, 0x08, 0x94, 0x9b, 0xf1, 0x03, 0x75, 0xcd, 0x05, 0x55, 0x77, 0xb0, 0x1a, 0x25, 0xa5, 0xdc, 0xe1, 0x09, 0x25, 0x10, 0x98, 0x88, 0xa5, 0x17, 0x53, 0x32, 0x14, 0x91, 0xec, 0x58, 0x27, 0x2a, 0xc0, 0xdb, 0x4f, 0x15, 0x73, 0x90, 0x70, 0x32, 0x77, 0x54, 0xd6, 0xe4, 0x8c, 0xa6, 0x13, 0x9c, 0x10, 0x58, 0x0f, 0xf0, 0x07, 0x2b, 0xe6, 0xf3, 0x0d, 0xfa, 0xd0, 0x0e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, }; flamerobin_0.9.3~svn+2220.orig/res/plan16.xpm000066400000000000000000000022071177057155300206240ustar00rootroot00000000000000/* XPM */ static const char * plan16_xpm[] = { "16 16 52 1", " c None", ". c #000000", "+ c #E66FFF", "@ c #591C61", "# c #B400BD", "$ c #4D005E", "% c #B500BE", "& c #C813D2", "* c #B600C0", "= c #FBF3FC", "- c #E282E6", "; c #C730CD", "> c #FBF7FC", ", c #DD8BE1", "' c #D566D9", ") c #DE77E3", "! c #B600BF", "~ c #E3A3E6", "{ c #C539CC", "] c #D36AD8", "^ c #F7DBF8", "/ c #D66ADB", "( c #BB11C4", "_ c #F3DCF5", ": c #F7E3F8", "< c #FFFEFF", "[ c #FEFAFE", "} c #EAB2ED", "| c #C332CA", "1 c #FCF8FC", "2 c #CD55D3", "3 c #BC1CC4", "4 c #EEC6F0", "5 c #FFFFFF", "6 c #FBF4FC", "7 c #EDC3EF", "8 c #FDFAFD", "9 c #F5DFF6", "0 c #CE5CD4", "a c #BB19C3", "b c #CC53D2", "c c #F5E0F6", "d c #D67ADB", "e c #BA14C2", "f c #FBF5FB", "g c #EBBFEE", "h c #D06CD7", "i c #C441CC", "j c #B300BD", "k c #E5A7E8", "l c #BA2AC5", "m c #B70CC0", "................", ".+++++++++++++@.", ".+############$.", ".+#%&*########$.", ".+##=-;%######$.", ".+##>,')!#####$.", ".+##~{{]^/(###$.", ".+##_:{#<[}|##$.", ".+##12345567##$.", ".+##1445890a##$.", ".+##12bcde####$.", ".+##fghij#####$.", ".+##kl########$.", ".+##mj########$.", ".@$$$$$$$$$$$$$.", "................"}; flamerobin_0.9.3~svn+2220.orig/res/plan24.xpm000066400000000000000000000025211177057155300206220ustar00rootroot00000000000000/* XPM */ static const char * plan24_xpm[] = { "24 24 42 1", " c None", ". c #000000", "+ c #EB5BFF", "@ c #C940DB", "# c #B400BD", "$ c #775979", "% c #B600BF", "& c #DB2BE5", "* c #BF00C9", "= c #FFFFFF", "- c #F6DAF6", "; c #C400CE", "> c #B900C2", ", c #FAF5FB", "' c #FBF3FB", ") c #FCF7FC", "! c #F8D7F7", "~ c #FDF6FD", "{ c #EC90F0", "] c #F9EFF9", "^ c #FCF4FC", "/ c #E177E6", "( c #FCF6FC", "_ c #FBECFA", ": c #D54EDC", "< c #FCF9FD", "[ c #F8E0F7", "} c #FAEFFA", "| c #E9B9EB", "1 c #B713C1", "2 c #F7E7F8", "3 c #ECC2EE", "4 c #BF2AC7", "5 c #CD58D2", "6 c #F9EBF9", "7 c #E5AEE9", "8 c #AF00BB", "9 c #FAF2FB", "0 c #E8B8EA", "a c #A800B8", "b c #EABEEC", "c c #C635CC", " ", " ...................... ", " .+++++++++++++++++++@. ", " .+##################$. ", " .+###%##############$. ", " .+##%&*#############$. ", " .+###=-;>###########$. ", " .+###,')!*##########$. ", " .+###,=##~{>########$. ", " .+###,####]^/#######$. ", " .+###,#==##=(_:#####$. ", " .+###,==###===<[####$. ", " .+###,=###=======###$. ", " .+###,=##=====}|1###$. ", " .+###,======234#####$. ", " .+###,=##=225#######$. ", " .+###,=##678########$. ", " .+###'9,0a##########$. ", " .+###=ba############$. ", " .+###c8#############$. ", " .+##################$. ", " .@$$$$$$$$$$$$$$$$$$$. ", " ...................... ", " "}; flamerobin_0.9.3~svn+2220.orig/res/procedure.xpm000066400000000000000000000010621177057155300215110ustar00rootroot00000000000000/* XPM */ static const char * procedure_xpm[] = { "16 16 12 1", " c None", ". c #000686", "+ c #FFFFFF", "@ c #889CC1", "# c #F7F3F7", "$ c #4E0D00", "% c #BB3E25", "& c #6F1200", "* c #C6C3C6", "= c #BDBEBD", "- c #BDBABD", "; c #A5A2A5", " ......... ", " .++++++++@. ", " .+######+@+. ", " .+######+.... ", " .++++$$$++@@. ", " .++$$$%$$$++. ", " .++$%%%%%$++. ", " .+$$%%&%%$$+. ", " .+$%%%$%%%$+. ", " .+$$%%%%%$$+. ", " .++$%%%%%$++. ", " .++$$$%$$$++. ", " .++++$$$++++. ", " .+++++++++++. ", " .*=====----;. ", " ........... "}; flamerobin_0.9.3~svn+2220.orig/res/procedure32.xpm000066400000000000000000000143011177057155300216560ustar00rootroot00000000000000/* XPM */ static const char * procedure32_xpm[] = { "32 32 256 2", " c None", ". c #141414", "+ c #3B3B3B", "@ c #404040", "# c #545454", "$ c #555555", "% c #F6F6F6", "& c #FFFFFF", "* c #FAFAFA", "= c #D6D6D6", "- c #878787", "; c #242424", "> c #FEFEFE", ", c #E6E6E6", "' c #F0F0F0", ") c #A0A0A0", "! c #000000", "~ c #DADADA", "{ c #A9A9A9", "] c #B1B1B1", "^ c #B9B9B9", "/ c #F2F2F2", "( c #FBFBFB", "_ c #F8F8F8", ": c #D8D8D8", "< c #F5F5F5", "[ c #979797", "} c #252525", "| c #CFCECA", "1 c #ACACAC", "2 c #FDFDFD", "3 c #F7F7F7", "4 c #C9C9C9", "5 c #E0E0E0", "6 c #888888", "7 c #212121", "8 c #E1E1E0", "9 c #97958F", "0 c #898781", "a c #8E8C85", "b c #838078", "c c #909090", "d c #DDDDDD", "e c #F5F5F4", "f c #FCFCFC", "g c #BFBFBF", "h c #E1E1E1", "i c #C8C8C8", "j c #C2C2C2", "k c #8E8E8E", "l c #7B7973", "m c #67655F", "n c #403F3B", "o c #686661", "p c #7C7A72", "q c #CCCCCC", "r c #EEEEEE", "s c #FCFCFB", "t c #F6F6F5", "u c #666666", "v c #5D5D5D", "w c #565656", "x c #5A5A5A", "y c #848484", "z c #DDDCDB", "A c #9A9992", "B c #53524E", "C c #171614", "D c #767573", "E c #9B9993", "F c #52504A", "G c #BBBBBB", "H c #E5E5E4", "I c #C7C7C6", "J c #A6A6A6", "K c #9A9A9A", "L c #6C6C6C", "M c #7B7A75", "N c #86847D", "O c #9A9996", "P c #B7B6B3", "Q c #7D7B75", "R c #B2B2B2", "S c #DEDEDE", "T c #AEAEAE", "U c #E4E4E4", "V c #8B8984", "W c #6B6964", "X c #78756C", "Y c #5F5D56", "Z c #54534D", "` c #696969", " . c #F4F4F4", ".. c #F9F9F9", "+. c #EFEFEF", "@. c #42413C", "#. c #8D8D8D", "$. c #C5C5C5", "%. c #010101", "&. c #C4C4C4", "*. c #F8F8F7", "=. c #E2E2E1", "-. c #C1C1C0", ";. c #858584", ">. c #070707", ",. c #080808", "'. c #9D9D9C", "). c #050505", "!. c #E4E3E1", "~. c #040404", "{. c #999999", "]. c #0A0A0A", "^. c #0B0B0B", "/. c #C4C4C3", "(. c #EEEEED", "_. c #FEFEFD", ":. c #CFCFCF", "<. c #BABABA", "[. c #AFAFAF", "}. c #E2E2E2", "|. c #B3B3B1", "1. c #484641", "2. c #9F9D96", "3. c #888781", "4. c #2A2A2A", "5. c #090909", "6. c #D5D5D5", "7. c #ECECEC", "8. c #C3C3C3", "9. c #F4F4F3", "0. c #F2F2F1", "a. c #EBEBEA", "b. c #DFDFDE", "c. c #D9D9D8", "d. c #B0AFAD", "e. c #A8A7A1", "f. c #908E86", "g. c #97958E", "h. c #807D74", "i. c #BEBEBD", "j. c #E0E0DF", "k. c #C1C1C1", "l. c #F3F3F2", "m. c #EDEDEC", "n. c #AEAEAD", "o. c #595854", "p. c #605E57", "q. c #898883", "r. c #76746B", "s. c #7D7D7C", "t. c #B8B8B7", "u. c #F1F1F0", "v. c #EFEFEE", "w. c #F0F0EF", "x. c #43423F", "y. c #282724", "z. c #363430", "A. c #6D6B63", "B. c #111111", "C. c #0E0E0E", "D. c #D5D5D4", "E. c #BCBCBB", "F. c #CECECD", "G. c #9F9F9F", "H. c #A8A8A7", "I. c #ADADAD", "J. c #B6B5AF", "K. c #21201E", "L. c #0A0908", "M. c #181816", "N. c #E6E6E4", "O. c #65635C", "P. c #0D0D0D", "Q. c #BDBDBD", "R. c #B4B4B3", "S. c #161614", "T. c #8C8B89", "U. c #DFDEDC", "V. c #0C0C0C", "W. c #EAEAE9", "X. c #7B7B7A", "Y. c #7F7F7F", "Z. c #B0AFA9", "`. c #D5D4D1", " + c #93918B", ".+ c #757575", "++ c #A2A2A1", "@+ c #BBBBBA", "#+ c #B3B3B2", "$+ c #EDEDEB", "%+ c #D6D5D2", "&+ c #ABA9A3", "*+ c #5D5C55", "=+ c #B2B2B0", "-+ c #D0D0CE", ";+ c #F7F7F6", ">+ c #232322", ",+ c #494943", "'+ c #202020", ")+ c #B0B0B0", "!+ c #BDBDBC", "~+ c #EAEAE8", "{+ c #7A7974", "]+ c #7F7F7E", "^+ c #787877", "/+ c #101010", "(+ c #0F0F0F", "_+ c #747473", ":+ c #878786", "<+ c #B5B5B4", "[+ c #D6D6D4", "}+ c #BEBEBE", "|+ c #D2D2D0", "1+ c #616160", "2+ c #A0A09F", "3+ c #B1B1B0", "4+ c #AFAFAE", "5+ c #ADADAB", "6+ c #AEAEAC", "7+ c #B2B2B1", "8+ c #C7C7C5", "9+ c #DCDCDB", "0+ c #BFBFBE", "a+ c #E4E4E2", "b+ c #DBDBD9", "c+ c #848483", "d+ c #B6B6B4", "e+ c #CCCCCA", "f+ c #CFCFCD", "g+ c #C9C9C7", "h+ c #D1D1CF", "i+ c #E2E2E0", "j+ c #C0C0BF", "k+ c #F3F3F3", "l+ c #E3E3E1", "m+ c #E0E0DE", "n+ c #B1B1AF", "o+ c #90908E", "p+ c #9B9B9A", "q+ c #ADADAC", "r+ c #DFDFDD", "s+ c #DADAD9", "t+ c #E1E1DF", "u+ c #CDCDCB", "v+ c #AAAAA8", "w+ c #A1A1A0", "x+ c #A9A9A7", "y+ c #D8D8D6", "z+ c #DEDEDC", "A+ c #E9E9E9", "B+ c #DDDDDB", "C+ c #B6B6B5", "D+ c #323232", "E+ c #C5C5C4", "F+ c #C0C0C0", "G+ c #979796", ". + @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # $ ", "+ % & & & & & & & & & & & & & & & & & * = - ; ", "@ & & & & & & & & & & & > > > > > > > * , ' ) ! ", "@ & & & & & & ~ { ! ! ! ] ^ / ( > > > _ : & < [ } ", "@ & & & & & > ! ! ! | ! ! ! 1 ' ( 2 2 3 4 2 2 5 6 7 ", "@ & & & & & ( ! 8 9 0 a b ! c d e ( f % g h = i j k ", "@ & & & & > ! ! l m n o p ! ! q r * s t { u v w x y ! ", "@ & & & & 2 ! z A B C D E F ! G H 3 * 3 ' = I J K L ! ", "@ & * * * 3 ! ! M N O P Q ! ! R S % * * * * * * * T ! ", "@ & * * * _ U ! V W X Y Z ! ` ^ h .3 _ ..* * * * j ! ", "@ > ......_ +.! ! ! @.! ! ! #.$.%.%.%.U ' % 3 _ ..&.! ", "@ > *.*.*.*.e =.-.! ! ! ;.>.,.'.).!.~.{.].^./.(.t &.! ", "@ _.% % % % < r 5 :.<.[.,.}.|.,.1.2.1.,.3.4.5.6.7.8.! ", "@ 2 e e e e e 9.0.a.b.c.].d.e.2.2.2.f.g.h.1.,.i.j.k.! ", "@ 2 9.9.9.9.9.9.9.l.0.m.n.5.2.2.o.p.q.h.r.>.s.t.d g ! ", "@ f 0.0.0.0.u.v.v.v.w.%.%.1.2.p.x.y.z.2.A.1.B.C.D.E.! ", "@ f u.u.F.G.! ! ! H.I.%.=.J.2.o.K.L.M.N.h.O.p.P.Q.R.! ", "@ f +.r ! ! ! | ! ! ! %.~.1.2.q.z.S.T.U.O.1.V.P.] T ! ", "@ ( (.W.! 8 9 0 a b ! X.Y.>.Z.h.J.N.`. +O.>..+++@+#+! ", "@ * $+! ! l m n o p ! ! ,.%+&+2.h.h.r.r.*+1.>.=+-+@+! ", "@ ;+a.! z A B C D E F ! >.>+o.).1.r.1.>.,+'+>.)+D.!+! ", "@ t ~+! ! {+N O P Q ! ! ]+,.,.^+/+@.(+_+>.>.:+<+[+}+! ", "@ 9.N.|+! V W X Y Z ! 1+2+3+4+5+(+V.^.'.5+6+7+8+9+0+! ", "@ 9.a+b+! ! ! @.! ! ! c+d+e+-+f+g+#+H.#+g+f+h+b+i+j+! ", "@ k+l+m+f+n+! ! ! o+p+q+g+b+m+r+s+|+e+|+s+r+t+i+l+j+! ", "@ l.t+m+c.u+!+v+w+x+E.e+y+r+t+t+m+r+z+r+m+t+t+t+t+j+! ", "+ A+t+t+m+z+y+u+g+u+y+B+m+t+t+t+t+t+t+t+t+t+t+t+t+C+! ", "D+E+k.k.-.-.-.-.-.-.-.-.F+F+F+F+F+F+F+F+F+F+F+F+C+G+! ", " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ", " ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/procedures.xpm000066400000000000000000000007301177057155300216750ustar00rootroot00000000000000/* XPM */ static const char * procedures_xpm[] = { "16 16 6 1", " c None", ". c #424C00", "+ c #D6DCB0", "@ c #4E0D00", "# c #BB3E25", "$ c #6F1200", " .... ", " .++++. ", ".++++++..... ", ".+++++++++++. ", ".+++.......... ", ".+++.+++++++++. ", ".++.++++++++++. ", ".++.++++++@@@. ", ".+.+++++@@@#@@@ ", ".+.+++++@#####@ ", ".++++++@@##$##@@", " ......@###@###@", " @@#####@@", " @#####@ ", " @@@#@@@ ", " @@@ "}; flamerobin_0.9.3~svn+2220.orig/res/redx.xpm000066400000000000000000000042721177057155300204710ustar00rootroot00000000000000/* XPM */ static const char * redx_xpm[] = { "16 16 100 2", " c None", ". c #C96468", "+ c #DF5F60", "@ c #DD676A", "# c #CB6468", "$ c #8E373B", "% c #EA4952", "& c #EC4C54", "* c #D53E41", "= c #D2393D", "- c #EB4A53", "; c #EE4C56", "> c #9E3E43", ", c #9F5860", "' c #E6434D", ") c #EA3B45", "! c #EC4750", "~ c #D1292B", "{ c #C7272A", "] c #EC454E", "^ c #EC3C46", "/ c #ED4650", "( c #A44654", "_ c #150D11", ": c #A73035", "< c #E93A43", "[ c #EB3941", "} c #D94649", "| c #D33B3F", "1 c #E93841", "2 c #EA3740", "3 c #BC262B", "4 c #160609", "5 c #230708", "6 c #B72125", "7 c #EF4D57", "8 c #EF4952", "9 c #BF1418", "0 c #2D0506", "a c #000000", "b c #300203", "c c #C01C21", "d c #E83741", "e c #E6353E", "f c #BE1316", "g c #310304", "h c #070000", "i c #731416", "j c #D33136", "k c #CC2125", "l c #740C0E", "m c #0A0000", "n c #B31517", "o c #E5353E", "p c #E4363E", "q c #B41618", "r c #310302", "s c #B51013", "t c #E4333C", "u c #E4343C", "v c #B61112", "w c #BE1213", "x c #E6333B", "y c #EC3740", "z c #E52C30", "A c #E6373B", "B c #C01415", "C c #D43B41", "D c #E5323A", "E c #E51E20", "F c #8C0A0A", "G c #810C0A", "H c #E52123", "I c #E5333B", "J c #D5373A", "K c #AF1716", "L c #E23038", "M c #E61F21", "N c #7A0606", "O c #1F0000", "P c #880404", "Q c #E52527", "R c #EC3942", "S c #E43139", "T c #960D0C", "U c #B00B0B", "V c #E63037", "W c #E72F32", "X c #990808", "Y c #200000", "Z c #9B0808", "` c #E62325", " . c #E63139", ".. c #B20D0E", "+. c #230000", "@. c #C03F3F", "#. c #8E2829", "$. c #9C1413", "%. c #AE3333", "&. c #290000", " ", " . + @ # ", " $ % & * = - ; > ", " , ' ) ) ! ~ { ] ) ^ / ( ", " _ : < ) ) [ } | 1 ) ) 2 3 4 ", " 5 6 ) ) ) 7 8 ) ) ) 9 0 a ", " b c d ) ) ) ) e f g h ", " i j ) ) ) ) k l m ", " n o ) ) ) ) p q r ", " s t ) ) ) ) ) ) u v ", " w x ) ) y z A y ) ) x B ", " C D ) ) ) E F G H ) ) ) I J ", " K L ) y M N O P Q R ) S T ", " U V W X Y Z ` ...+. ", " @.#.+. $.%.&. ", " "}; flamerobin_0.9.3~svn+2220.orig/res/redx24.xpm000066400000000000000000000071141177057155300206350ustar00rootroot00000000000000/* XPM */ static const char * redx24_xpm[] = { "24 24 147 2", " c None", ". c #DE848C", "+ c #E56D6E", "@ c #D64341", "# c #DC838D", "$ c #5E0000", "% c #F4878A", "& c #AF0000", "* c #A50000", "= c #FCACB3", "- c #670000", "; c #240000", "> c #E87980", ", c #EA3B45", "' c #B10000", ") c #AD0000", "! c #F07E84", "~ c #FB8790", "{ c #330403", "] c #1C0B11", "^ c #D85F67", "/ c #F57378", "( c #B10100", "_ c #A60000", ": c #F1666D", "< c #F06A75", "[ c #13090D", "} c #79475B", "| c #F35156", "1 c #AC0200", "2 c #9B0000", "3 c #EE4E55", "4 c #F23E48", "5 c #FF5F70", "6 c #7E4F62", "7 c #1F141A", "8 c #CC4248", "9 c #EE3334", "0 c #B72F2E", "a c #AD2425", "b c #E72D31", "c c #ED2F34", "d c #1E080D", "e c #260910", "f c #000000", "g c #DF3136", "h c #FF8E95", "i c #FF7980", "j c #EC1819", "k c #130506", "l c #020000", "m c #2C0607", "n c #DA1D20", "o c #E00709", "p c #3B0607", "q c #030000", "r c #180000", "s c #430506", "t c #D2191C", "u c #CC0A0B", "v c #520708", "w c #170000", "x c #230000", "y c #680407", "z c #D51A1D", "A c #C90405", "B c #6F0507", "C c #220000", "D c #350000", "E c #C9494E", "F c #CC2628", "G c #C31315", "H c #C23035", "I c #3B0000", "J c #870403", "K c #D22224", "L c #D12325", "M c #890504", "N c #930608", "O c #D0191C", "P c #D01A1C", "Q c #930807", "R c #990708", "S c #D51A1E", "T c #D61A1C", "U c #9A0808", "V c #9C0505", "W c #D71718", "X c #FC3438", "Y c #FF4A4E", "Z c #D71819", "` c #9F0707", " . c #AB0B0A", ".. c #D21212", "+. c #FA1414", "@. c #A91A1A", "#. c #A61C1B", "$. c #FC1A18", "%. c #D41517", "&. c #AB0B0B", "*. c #D16C71", "=. c #FF1C1B", "-. c #A20B0B", ";. c #580000", ">. c #400200", ",. c #A00707", "'. c #FF2322", "). c #EC3E42", "!. c #D0555B", "~. c #B32A2E", "{. c #C81916", "]. c #FF1D1C", "^. c #A50D0D", "/. c #6B0000", "(. c #680000", "_. c #A10909", ":. c #FF2726", "<. c #CA120F", "[. c #981717", "}. c #780000", "|. c #C70B0A", "1. c #FF191A", "2. c #A50C0C", "3. c #710000", "4. c #A10809", "5. c #FF2827", "6. c #CD0F0E", "7. c #790000", "8. c #830000", "9. c #D70906", "0. c #FF4042", "a. c #A80B09", "b. c #730000", "c. c #7B0000", "d. c #A30808", "e. c #D9100D", "f. c #910000", "g. c #F37776", "h. c #B04B4D", "i. c #7A0000", "j. c #800000", "k. c #A91D1C", "l. c #F76767", "m. c #891011", "n. c #A3201E", "o. c #9F1713", "p. c #921819", " ", " . + @ # ", " $ % % & * = % - ", " ; > , , % ' ) ! , , ~ { ", " ] ^ , , , , / ( _ : , , , , < [ ", " } % , , , , , , | 1 2 3 , , , , 4 , 5 6 ", " 7 8 , , , , , , 9 0 a b , , , , , , c d e ", " f f g , , , , , , h i , , , , , , j k f f ", " l m n , , , , , , , , , , , , o p q f ", " r s t , , , , , , , , , , u v w f ", " x y z , , , , , , , , A B C f ", " D E F , , , , , , G H I f ", " J K , , , , , , , , L M f ", " N O , , , , , , , , , , P Q ", " R S , , , , , , , , , , , , T U ", " V W , , , , , , X Y , , , , , , Z ` ", " ..., , , , , , +.@.#.$., , , , , , %.&. ", " *., , , , , , , =.-.;.>.,.'., , , , , , ).!. ", " ~.{., , , , , ].^./.f (._.:., , , , , <.[. ", " }.|., , , 1.2.3.f }.4.5., , , 6.7.f ", " 8.9., 0.a.b.f c.d.'., e.8.f ", " f.g.h.i.f j.k.l.f.f ", " m.n.f o.p.f ", " "}; flamerobin_0.9.3~svn+2220.orig/res/right.xpm000066400000000000000000000014001177057155300206320ustar00rootroot00000000000000/* XPM */ static const char * right_xpm[] = { "16 16 26 1", " c None", ". c #000000", "+ c #AFF0AF", "@ c #8FE08D", "# c #5DB65B", "$ c #97E697", "% c #97E495", "& c #98E798", "* c #95E493", "= c #92E190", "- c #4E8A4D", "; c #85DA83", "> c #8ADD88", ", c #87DA85", "' c #90E18E", ") c #87DC85", "! c #508E4F", "~ c #89DC87", "{ c #8BDE89", "] c #B1F0B1", "^ c #1C351C", "/ c #385F38", "( c #477346", "_ c #2C4F2C", ": c #2F522F", "< c #2B4E2B", " ", " . ", " .. ", " .+. ", " .......@+. ", " .#@$%&%*=+. ", " .-;>,,>@')+. ", " .!>>>>)~~{>]^ ", " ./((((((((_. ", " .:<<<<<((_. ", " .......(_. ", " ._. ", " .. ", " . ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/role16_png.cpp000066400000000000000000000123121177057155300214530ustar00rootroot00000000000000static const unsigned char role16_png[] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0xf3, 0xff, 0x61, 0x00, 0x00, 0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0, 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd7, 0x0b, 0x0d, 0x14, 0x1f, 0x2f, 0x3b, 0xf1, 0x57, 0x90, 0x00, 0x00, 0x02, 0xf0, 0x49, 0x44, 0x41, 0x54, 0x38, 0xcb, 0x95, 0x93, 0x4b, 0x6c, 0x13, 0x57, 0x18, 0x85, 0xcf, 0x9d, 0xb9, 0x73, 0xed, 0x19, 0x3b, 0x24, 0x72, 0xec, 0x3c, 0x1c, 0x14, 0x68, 0x84, 0xc1, 0x6c, 0x2c, 0x21, 0x70, 0xe2, 0x20, 0x95, 0xe2, 0x50, 0x29, 0x6c, 0x0a, 0x52, 0x85, 0xd8, 0x75, 0x59, 0xd8, 0x20, 0xc4, 0x43, 0x02, 0x75, 0x55, 0x89, 0x22, 0xb1, 0x41, 0x3c, 0xc4, 0x0a, 0x70, 0x40, 0x62, 0xc1, 0x26, 0x60, 0x8a, 0x8a, 0xaa, 0x10, 0xa4, 0x4a, 0xb4, 0x8d, 0x14, 0xa4, 0x12, 0x91, 0x34, 0x40, 0x92, 0x12, 0xe2, 0xbc, 0x3c, 0xe3, 0x07, 0xc6, 0xf8, 0xd1, 0x19, 0xdb, 0x73, 0x7d, 0xd9, 0x34, 0x28, 0x6a, 0x60, 0xc1, 0x59, 0x9d, 0xc5, 0xaf, 0x4f, 0xbf, 0xfe, 0x73, 0x7e, 0x22, 0x84, 0xc0, 0x6a, 0x5d, 0xbf, 0x7a, 0x4d, 0x02, 0xc0, 0xbe, 0x3f, 0x7c, 0xc8, 0xc2, 0x27, 0x14, 0x8b, 0xdd, 0xec, 0x59, 0xbf, 0xde, 0x1f, 0x7b, 0xfa, 0xf4, 0xaf, 0x1b, 0x64, 0x05, 0x70, 0xe9, 0xc2, 0xc5, 0x88, 0x24, 0x91, 0xf3, 0xa6, 0x69, 0x85, 0x38, 0xe7, 0x94, 0xca, 0x72, 0x99, 0x48, 0x64, 0x3e, 0x95, 0x4a, 0x4d, 0xbd, 0xc9, 0xe5, 0x7e, 0x1b, 0x1b, 0x1b, 0x1b, 0x4d, 0xcc, 0x25, 0xc2, 0x81, 0x40, 0x60, 0xdf, 0xb7, 0x07, 0x0f, 0x7e, 0xf5, 0xc5, 0xc6, 0x0d, 0xef, 0xee, 0x0c, 0x0e, 0x9e, 0x20, 0x42, 0x08, 0x9c, 0x3d, 0x73, 0xe6, 0x56, 0x26, 0x9d, 0xf9, 0x2e, 0x93, 0x49, 0xa3, 0xc6, 0x39, 0x38, 0xe7, 0xa8, 0xd7, 0x39, 0x2c, 0xab, 0x02, 0x4a, 0x29, 0x42, 0xa1, 0x10, 0x54, 0x55, 0x13, 0x8f, 0xff, 0xfc, 0x03, 0xd9, 0x54, 0xca, 0xf6, 0xb7, 0xb7, 0xff, 0xf8, 0xeb, 0xd0, 0xd0, 0x39, 0x00, 0x20, 0x3f, 0x9c, 0x3a, 0xbd, 0x3f, 0xa9, 0x27, 0x7f, 0xd6, 0x97, 0x75, 0x54, 0x05, 0x47, 0xb1, 0x58, 0x80, 0x65, 0x99, 0xd0, 0x34, 0x37, 0x76, 0xf6, 0xf6, 0x82, 0x48, 0x12, 0x66, 0x66, 0x66, 0x30, 0x3e, 0xfe, 0x0c, 0x84, 0x10, 0xb4, 0x35, 0xfb, 0x20, 0x00, 0xf8, 0xfd, 0xfe, 0x7a, 0xc5, 0xb2, 0xee, 0xd3, 0x52, 0xa9, 0x74, 0x39, 0xb9, 0x94, 0x44, 0x2a, 0x9b, 0x86, 0x6e, 0x18, 0xf0, 0xb6, 0x78, 0x11, 0xdd, 0xdd, 0x87, 0x5a, 0xb5, 0x8a, 0xe1, 0x47, 0xc3, 0x58, 0x5c, 0x58, 0x04, 0x08, 0xc0, 0x1c, 0x0e, 0x34, 0xad, 0x6b, 0x84, 0xcd, 0x39, 0x18, 0x63, 0x98, 0x9d, 0x9d, 0xad, 0x65, 0xb2, 0xd9, 0xe7, 0x74, 0xe2, 0xef, 0x89, 0x3a, 0x53, 0x18, 0xb6, 0x6c, 0xde, 0x82, 0xbb, 0xf1, 0x38, 0x46, 0x47, 0x47, 0x71, 0xfc, 0xd8, 0x31, 0xd8, 0xb6, 0x0d, 0x59, 0x96, 0xa1, 0x39, 0x9d, 0x70, 0x69, 0x2e, 0xb4, 0xb6, 0xb4, 0xc0, 0xa1, 0xaa, 0x30, 0x52, 0x86, 0x91, 0xce, 0xa4, 0x4f, 0x2e, 0xeb, 0xfa, 0x6d, 0x00, 0x20, 0x1b, 0x3b, 0x37, 0x04, 0x1a, 0xdc, 0xee, 0x27, 0xbe, 0xb6, 0x96, 0xa6, 0x75, 0x6e, 0x37, 0x79, 0xf9, 0x62, 0x0a, 0x0e, 0xc6, 0x20, 0x50, 0x87, 0xcb, 0xd5, 0x00, 0xaf, 0xcf, 0x07, 0x9f, 0xd7, 0x0b, 0x42, 0x29, 0x3c, 0xcd, 0xcd, 0x78, 0x38, 0x3c, 0x74, 0x74, 0xe2, 0xd9, 0xf8, 0x95, 0x95, 0x44, 0xe8, 0xdc, 0x7c, 0xe2, 0x1f, 0x00, 0x9e, 0x58, 0x2c, 0xd6, 0x31, 0x30, 0x30, 0x30, 0xbf, 0xbd, 0x3b, 0x2c, 0x47, 0xf7, 0xf4, 0xa1, 0xbd, 0xb5, 0x0d, 0x9a, 0x5b, 0x83, 0x04, 0x09, 0x2e, 0x77, 0x03, 0xb2, 0xd9, 0x2c, 0xe2, 0xf7, 0xee, 0x41, 0x4f, 0xea, 0x9b, 0x56, 0x47, 0x4a, 0x57, 0x4c, 0x28, 0x14, 0x7a, 0x3b, 0x33, 0x3d, 0x4d, 0x9e, 0x4f, 0x4e, 0xc2, 0xd0, 0x93, 0xe8, 0xee, 0x8e, 0xa0, 0xa3, 0xb3, 0x13, 0x75, 0xce, 0xf1, 0xfa, 0xd5, 0x2c, 0x1e, 0x3c, 0xf8, 0x05, 0xba, 0x9e, 0x84, 0x55, 0xa9, 0x74, 0x7c, 0x14, 0xd0, 0xd3, 0xd3, 0xd3, 0xe5, 0xf1, 0x78, 0x24, 0x55, 0xd3, 0x60, 0xfe, 0x6b, 0xc2, 0x30, 0x0c, 0x68, 0x0d, 0x8d, 0xc8, 0xe7, 0x72, 0x58, 0x48, 0x24, 0xc0, 0x14, 0x86, 0xc6, 0xa6, 0x26, 0xc8, 0xa5, 0x52, 0xd7, 0x6a, 0x80, 0xb4, 0x62, 0x5a, 0xdb, 0x5a, 0xfb, 0x85, 0x10, 0xa8, 0x55, 0xab, 0xa0, 0x94, 0xc2, 0xc1, 0x18, 0x28, 0xa5, 0x60, 0x8c, 0xc1, 0xa1, 0x3a, 0x20, 0x88, 0x40, 0xb9, 0x5c, 0x86, 0xa6, 0x69, 0x81, 0x8f, 0x02, 0x08, 0x21, 0x47, 0x8a, 0xc5, 0x22, 0x28, 0xa5, 0x10, 0x42, 0x40, 0x00, 0xc0, 0x7f, 0x2d, 0x17, 0x42, 0x40, 0x22, 0x04, 0x9c, 0x73, 0xe4, 0xf3, 0x79, 0x77, 0x30, 0x18, 0xfc, 0x66, 0x0d, 0x60, 0x6b, 0x70, 0x6b, 0xd9, 0xb6, 0x6d, 0x50, 0x4a, 0xe1, 0x74, 0x3a, 0xa1, 0x50, 0x19, 0x92, 0x2c, 0x41, 0x92, 0x29, 0x14, 0x85, 0xc1, 0xe5, 0x72, 0xc1, 0xb6, 0x6d, 0x30, 0x45, 0x11, 0xe1, 0x70, 0x58, 0x5b, 0x73, 0x83, 0xfe, 0xbd, 0xfd, 0x07, 0x22, 0x91, 0xc8, 0xcd, 0x78, 0xfc, 0xee, 0x8e, 0xa5, 0xc5, 0x45, 0x2a, 0x49, 0x32, 0xcc, 0x9a, 0x40, 0xb1, 0x50, 0xc0, 0xf2, 0xc2, 0x1c, 0x72, 0xb9, 0x9c, 0x88, 0x46, 0xa3, 0x85, 0xbe, 0x3d, 0x7d, 0x3f, 0x15, 0x0a, 0x85, 0xfb, 0x1f, 0x36, 0xff, 0xff, 0x37, 0x8e, 0x8c, 0x8c, 0x84, 0x2c, 0xcb, 0xfa, 0xda, 0x34, 0xcd, 0x6d, 0x00, 0xf1, 0x08, 0x88, 0x0a, 0x53, 0x94, 0x79, 0x55, 0x55, 0x1f, 0x83, 0xe0, 0xf7, 0x5d, 0x5f, 0xee, 0xca, 0xad, 0x9e, 0x5f, 0x03, 0xf8, 0x5c, 0xbd, 0x07, 0x89, 0xb7, 0x3e, 0x95, 0x8b, 0xcd, 0x72, 0xeb, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, }; flamerobin_0.9.3~svn+2220.orig/res/root.xpm000066400000000000000000000007411177057155300205070ustar00rootroot00000000000000/* XPM */ static const char * root_xpm[] = { "16 16 7 1", " c None", ". c #891700", "+ c #000686", "@ c #DC3F16", "# c #889CC1", "$ c #FFFFFF", "% c #2B5198", " ", " ... ++ ", " .@.+##+ ", " .@+#$$#+ ", " .+#$$$$#+ ", " +#$$$$$$#+ ", " +#$$$$$$$$#+ ", " +++$$$$$%%%+++ ", " +$...$%$%+ ", " +$.@.$%%%+ ", " +$.@.$$$$+ ", " +$.@.$$$$+ ", " +$.@.$$$$+ ", " ++++++++++++ ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/save.xpm000066400000000000000000000031261177057155300204620ustar00rootroot00000000000000/* XPM */ static const char * save_xpm[] = { "16 16 83 1", " c None", ". c #000000", "+ c #F7F8FA", "@ c #CBDDEB", "# c #C88A80", "$ c #D18F84", "% c #D19084", "& c #D39186", "* c #BFD5E8", "= c #DBE7F1", "- c #8DA9BE", "; c #B7877E", "> c #C77568", ", c #C77467", "' c #C77466", ") c #C87668", "! c #CD867A", "~ c #54697C", "{ c #CFE0ED", "] c #D7D7D7", "^ c #FEFEFE", "/ c #F9F9F9", "( c #84A0B5", "_ c #4F6475", ": c #D6D6D6", "< c #F1F1F1", "[ c #819AAE", "} c #496072", "| c #FCFCFC", "1 c #F4F4F4", "2 c #EBEBEB", "3 c #D4D4D4", "4 c #C5C5C5", "5 c #EEEEEE", "6 c #F2F2F2", "7 c #AEBFCD", "8 c #CAD6DF", "9 c #C7CFDA", "0 c #BFCBD6", "a c #A1B6C4", "b c #89A6BC", "c c #7F9AAE", "d c #7E99AD", "e c #7D97AC", "f c #8CA8BD", "g c #A8B1BD", "h c #CECECE", "i c #9C9D9D", "j c #2F4656", "k c #80868C", "l c #183042", "m c #33495A", "n c #B9B9B9", "o c #132D3C", "p c #586D80", "q c #97A5B0", "r c #86A4B9", "s c #CDCDCD", "t c #2E4353", "u c #5A7082", "v c #BFBFBF", "w c #112835", "x c #9DA9B0", "y c #6B7882", "z c #839EB2", "A c #E6E6E6", "B c #213648", "C c #5F7989", "D c #C2C2C2", "E c #B2B2B2", "F c #112C3A", "G c #9FA9B0", "H c #59636D", "I c #A1A1A1", "J c #C0C0C0", "K c #909090", "L c #868686", "M c #6E6E6E", "N c #7A7A7A", "O c #2D3949", "P c #3E4F5C", "Q c #80878F", "R c #1A3140", " .............. ", ".+@#$$$$$$%$&**.", ".=-;>,,,,',)!-~.", ".{-]^^^^^^^^/(_.", ".{-]]]]]]]]:<[}.", ".{-]^^^^|122<[}.", ".{-]]]]34444<[}.", ".{-5^^6222225[}.", ".{-789000000a[}.", ".{--bc[[[[de[[}.", ".{-fg44h2]ijk[}.", ".{-(44lm:4nopq}.", ".{r[4stu44vwux}.", ".yz[sABC4DEFuG}.", " .H_IJKKLMNOPQR.", " ............. "}; flamerobin_0.9.3~svn+2220.orig/res/saveas.xpm000066400000000000000000000045541177057155300210140ustar00rootroot00000000000000/* XPM */ static const char * saveas_xpm[] = { "16 16 111 2", " c None", ". c #000000", "+ c #F7F8FA", "@ c #CBDDEB", "# c #C88A80", "$ c #D18F84", "% c #CF8D82", "& c #A49626", "* c #634A1E", "= c #A8BBCC", "- c #BFD5E8", "; c #DBE7F1", "> c #8DA9BE", ", c #B7877E", "' c #C77568", ") c #C77467", "! c #C57366", "~ c #FCEB3D", "{ c #F7B544", "] c #61522E", "^ c #72899A", "/ c #54697C", "( c #CFE0ED", "_ c #D7D7D7", ": c #FEFEFE", "< c #FCFCFC", "[ c #F9DF39", "} c #F7B545", "| c #6C5F34", "1 c #B4B4B4", "2 c #84A0B5", "3 c #4F6475", "4 c #D6D6D6", "5 c #F8D837", "6 c #EFB44D", "7 c #584D2B", "8 c #8F8F8F", "9 c #F1F1F1", "0 c #819AAE", "a c #496072", "b c #FDFDFD", "c c #F6D236", "d c #EDA43E", "e c #584E2B", "f c #AAAAAA", "g c #D3D3D3", "h c #485F71", "i c #D5D5D5", "j c #D7AE74", "k c #61562F", "l c #737373", "m c #C5C5C5", "n c #B0B0B0", "o c #7F98AC", "p c #EDEDED", "q c #4F4115", "r c #8D8D8D", "s c #EBEBEB", "t c #ECECEC", "u c #ACBDCB", "v c #6F767D", "w c #9AA3AC", "x c #BFCBD6", "y c #BDC9D4", "z c #A1B6C4", "A c #8BA7BC", "B c #809CB0", "C c #6C8394", "D c #7D97AB", "E c #7D97AC", "F c #A4ACB8", "G c #B9B9B9", "H c #C7C7C7", "I c #E1E1E1", "J c #D4D4D4", "K c #9C9D9D", "L c #2F4656", "M c #80868C", "N c #183042", "O c #33495A", "P c #132D3C", "Q c #586D80", "R c #97A5B0", "S c #86A4B9", "T c #CDCDCD", "U c #2E4353", "V c #5A7082", "W c #BFBFBF", "X c #112835", "Y c #9DA9B0", "Z c #6B7882", "` c #829DB1", " . c #CBCBCB", ".. c #E5E5E5", "+. c #213648", "@. c #5F7989", "#. c #C2C2C2", "$. c #B2B2B2", "%. c #112C3A", "&. c #9FA9B0", "*. c #59636D", "=. c #A1A1A1", "-. c #C0C0C0", ";. c #909090", ">. c #868686", ",. c #6E6E6E", "'. c #7A7A7A", "). c #2D3949", "!. c #3E4F5C", "~. c #80878F", "{. c #1A3140", " . . . . . . . . . . . . . . ", ". + @ # $ $ $ $ % . & * . = - . ", ". ; > , ' ) ) ! . ~ { ] . ^ / . ", ". ( > _ : : < . [ } | . 1 2 3 . ", ". ( > _ _ 4 . 5 6 7 . 8 9 0 a . ", ". ( > _ b . c d e . f g 9 0 h . ", ". ( > _ i . j k . l m n 9 o a . ", ". ( > p . q . . r g s s t 0 a . ", ". ( > u . . v w x x x y z 0 a . ", ". ( > A B C 0 0 0 0 D E 0 0 a . ", ". ( > A F G G H I J K L M 0 a . ", ". ( > 2 m m N O i m G P Q R a . ", ". ( S 0 m T U V m m W X V Y a . ", ". Z ` o ...+.@.m #.$.%.V &.a . ", ". . *.3 =.-.;.;.>.,.'.).!.~.{.. ", " . . . . . . . . . . . . . . "}; flamerobin_0.9.3~svn+2220.orig/res/search.xpm000066400000000000000000000025671177057155300210010ustar00rootroot00000000000000/* XPM */ static const char * search_xpm[] = { "16 16 68 1", " c None", ". c #000000", "+ c #262626", "@ c #C5C5C5", "# c #EEEEEE", "$ c #EDEDED", "% c #ABABAB", "& c #464646", "* c #878787", "= c #F1F1F1", "- c #FEFEFE", "; c #FDFDFD", "> c #FCFCFC", ", c #EAEAEA", "' c #707070", ") c #2E2E2E", "! c #A0A0A0", "~ c #A9A9A9", "{ c #E5E5E5", "] c #FBFBFB", "^ c #E8E8E8", "/ c #AFAFAF", "( c #F4F4F4", "_ c #E9E9E9", ": c #E1E1E1", "< c #FAFAFA", "[ c #A4A4A4", "} c #F9F9F9", "| c #A8A8A8", "1 c #E2E2E2", "2 c #F8F8F8", "3 c #D0D0D0", "4 c #C7C7C7", "5 c #BDBDBD", "6 c #A7A7A7", "7 c #E4E4E4", "8 c #F7F7F7", "9 c #F3F3F3", "0 c #D4D4D4", "a c #C0C0C0", "b c #AEAEAE", "c c #A6A6A6", "d c #BABABA", "e c #444444", "f c #F5F5F5", "g c #F6F6F6", "h c #E7E7E7", "i c #858585", "j c #828282", "k c #E3E3E3", "l c #979797", "m c #6D6D6D", "n c #D6D6D6", "o c #2D2D2D", "p c #E0E0E0", "q c #DEDEDE", "r c #949494", "s c #7C7C7C", "t c #050505", "u c #040404", "v c #202020", "w c #BBBBBB", "x c #686868", "y c #343434", "z c #C2C2C2", "A c #797979", "B c #3A3A3A", "C c #1F1F1F", " .... ", " .+@#$%&. ", " .*=--;>,'. ", " )!~~~{;]^& ", "./;;(_~:><[. ", "._}},>:|1<{. ", ".^2}13456<7. ", ".|8290abc}d. ", ".e{fgffhch& ", ".ijk((9{lm. ", ".noe!pqr).... ", ".;{s)tu. vv.. ", ".;7kkkw. .xy.. ", ".zwwww!. .AB..", " ...... .xC.", " .. "}; flamerobin_0.9.3~svn+2220.orig/res/server.xpm000066400000000000000000000006661177057155300210400ustar00rootroot00000000000000/* XPM */ static const char * server_xpm[] = { "16 16 4 1", " c None", ". c #000686", "+ c #889CC1", "@ c #FFFFFF", " ...... ", " .++@@@@. ", " ........ ", " .++@@@@. ", " ........ ", " ...++++. ", " .++@@@@. ", " .++@@@@. ", " .++@@@@. ", " .++@@@@. ", " .++@@@@. ", " .++@@@@. ", " ...... ", " ...... ", " .++++++. ", " ........ "}; flamerobin_0.9.3~svn+2220.orig/res/server32.xpm000066400000000000000000000046511177057155300212030ustar00rootroot00000000000000/* XPM */ static const char * server32_xpm[] = { "32 32 84 1", " c None", ". c #000000", "+ c #E4E4E4", "@ c #FDFDFD", "# c #FCFCFC", "$ c #FAFAFA", "% c #F9F9F9", "& c #F8F8F8", "* c #F7F7F7", "= c #C6C6C6", "- c #E3E3E3", "; c #F6F6F6", "> c #AEAEAE", ", c #E7E7E7", "' c #E8E8E8", ") c #E6E6E6", "! c #E5E5E5", "~ c #CDCDCD", "{ c #F3F3F3", "] c #E9E9E9", "^ c #CACACA", "/ c #DADADA", "( c #D9D9D9", "_ c #D8D8D8", ": c #D6D6D6", "< c #D5D5D5", "[ c #D4D4D4", "} c #D3D3D3", "| c #D2D2D2", "1 c #C1C1C1", "2 c #D1D1D1", "3 c #D0D0D0", "4 c #EAEAEA", "5 c #CCCCCC", "6 c #CBCBCB", "7 c #C9C9C9", "8 c #C8C8C8", "9 c #C7C7C7", "0 c #C5C5C5", "a c #C4C4C4", "b c #C3C3C3", "c c #BEBEBE", "d c #DDDDDD", "e c #EBEBEB", "f c #E2E2E2", "g c #DCDCDC", "h c #DBDBDB", "i c #D7D7D7", "j c #E1E1E1", "k c #CECECE", "l c #E0E0E0", "m c #CFCFCF", "n c #BDBDBD", "o c #DFDFDF", "p c #A5A5A5", "q c #8A8A8A", "r c #ABABAB", "s c #B6B6B6", "t c #888888", "u c #B2B2B2", "v c #7E7E7E", "w c #BBBBBB", "x c #BABABA", "y c #B8B8B8", "z c #B7B7B7", "A c #BFBFBF", "B c #AAAAAA", "C c #7C7C7C", "D c #DEDEDE", "E c #C2C2C2", "F c #AFAFAF", "G c #ADADAD", "H c #A3A3A3", "I c #A7A7A7", "J c #BCBCBC", "K c #B4B4B4", "L c #B3B3B3", "M c #ACACAC", "N c #A9A9A9", "O c #A6A6A6", "P c #A4A4A4", "Q c #B5B5B5", "R c #9C9C9C", "S c #6D6D6D", " ", " ", " ........... ", " .+@@#$$%&**=. ", " .-@@##$$%%**;>. ", " .,'''',,)))!,~. ", " .,{]]',,)))!)^. ", " .,]/(_:<[}||}1. ", " .-]_:<[}||23|1. ", " .456^789=0ab8c. ", " .de)))!!++-f)6. ", " .-egh//(_i::_1. ", " .j!|23k~56^7~c. ", " .l+2mk~56^785n. ", " .gl3m6~~56^731. ", " .]')!j/dh//(oa. ", " .,pqr<):<[}|3s. ", " .)tuv:_wxyzsAz. ", " .!BC}D'!+-ff)E. ", " .+Dlh_i:[}||(c. ", " .f//Fbp1GbHgin. ", " .j(hIjAoajn/:J. ", " .li:>hs/wgKi}x. ", " .D:iF:B[}y. ", " .d}|G~M:sDshKi/O. ", " .z>>PPFQHLRHrS. ", " ............. ", " ", " ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/sqlicon.xpm000066400000000000000000000023721177057155300211760ustar00rootroot00000000000000/* XPM */ static const char * sqlicon32_xpm[] = { "32 32 4 1", " c None", ". c #007800", "+ c #FFF8FF", "@ c #FFF800", "................................", "................................", "................................", "....+++++.....++++....+.........", "...+.....+...+....+...+.........", "...+.....+..+......+..+.........", "...+........+......+..+.........", "....+++.....+......+..+.........", ".......++...+......+..+.........", ".........+..+......+..+.........", "...+.....+..+...++.+..+.........", "...+.....+...+....+...+.........", "....+++++.....++++.+..++++++....", "................................", "................................", "................................", "................................", "............@..@................", "............@.....@.............", "............@.....@.............", "..@@@....@@.@..@.@@@...@@@...@.@", ".@...@..@..@@..@..@...@...@..@@.", ".@...@..@...@..@..@...@...@..@..", ".@@@@@..@...@..@..@...@...@..@..", ".@......@...@..@..@...@...@..@..", ".@...@..@...@..@..@...@...@..@..", "..@@@....@@@@..@..@@...@@@...@..", "................................", "................................", "................................", "................................", "................................"}; flamerobin_0.9.3~svn+2220.orig/res/systemtable.xpm000066400000000000000000000010641177057155300220570ustar00rootroot00000000000000/* XPM */ static const char * systemtable_xpm[] = { "16 16 12 1", " c None", ". c #FF0000", "+ c #FFFFFF", "@ c #DEDFDE", "# c #E7E3E7", "$ c #E7E7E7", "% c #EFEBEF", "& c #EFEFEF", "* c #889CC1", "= c #F7F3F7", "- c #F7F7F7", "; c #FFFBFF", " ", " ", " ........... ", " ........... ", " .+@#$$%%%&. ", " .+***%***&. ", " .+$$%%&&&=. ", " .+***&***=. ", " .+%%&&===-. ", " .+***&***-. ", " .+%&&===-;. ", " .+***=***;. ", " .+&==-;;;+. ", " ........... ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/systemtable32.xpm000066400000000000000000000072221177057155300222260ustar00rootroot00000000000000/* XPM */ static const char * systemtable32_xpm[] = { "32 32 93 2", " c None", ". c #141414", "+ c #3B3B3B", "@ c #404040", "# c #545454", "$ c #555555", "% c #F6F6F6", "& c #FFFFFF", "* c #FAFAFA", "= c #D6D6D6", "- c #878787", "; c #242424", "> c #FEFEFE", ", c #E6E6E6", "' c #F0F0F0", ") c #A0A0A0", "! c #000000", "~ c #B5B5B5", "{ c #BABABA", "] c #BCBCBC", "^ c #BBBBBB", "/ c #B6B6B6", "( c #D8D8D8", "_ c #F5F5F5", ": c #979797", "< c #252525", "[ c #FF0000", "} c #BFBFBF", "| c #C2C2C2", "1 c #C9C9C9", "2 c #FDFDFD", "3 c #E0E0E0", "4 c #888888", "5 c #212121", "6 c #B9B9B9", "7 c #E1E1E1", "8 c #C8C8C8", "9 c #8E8E8E", "0 c #BABAB9", "a c #B5B5B4", "b c #A9A9A9", "c c #666666", "d c #5D5D5D", "e c #565656", "f c #5A5A5A", "g c #848484", "h c #FCFCFC", "i c #FCFCFB", "j c #B8B8B8", "k c #F7F7F7", "l c #C7C7C6", "m c #A6A6A6", "n c #9A9A9A", "o c #6C6C6C", "p c #AEAEAE", "q c #F9F9F9", "r c #B7B7B7", "s c #C4C4C4", "t c #F8F8F7", "u c #FEFEFD", "v c #F5F5F4", "w c #C3C3C3", "x c #F4F4F3", "y c #F2F2F1", "z c #C3C3C2", "A c #F1F1F0", "B c #EFEFEF", "C c #FBFBFB", "D c #EEEEED", "E c #C2C2C1", "F c #EDEDEB", "G c #F7F7F6", "H c #EBEBEA", "I c #C1C1C0", "J c #F6F6F5", "K c #EAEAE8", "L c #C0C0C0", "M c #E6E6E4", "N c #A9A9A8", "O c #C0C0BF", "P c #E4E4E2", "Q c #A8A8A6", "R c #F3F3F3", "S c #E3E3E1", "T c #A7A7A5", "U c #F3F3F2", "V c #E1E1DF", "W c #E9E9E9", "X c #B6B6B5", "Y c #323232", "Z c #C5C5C4", "` c #C1C1C1", " . c #979796", ". + @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # $ ", "+ % & & & & & & & & & & & & & & & & & * = - ; ", "@ & & & & & & & & & & & > > > > > > > * , ' ) ! ", "@ & & ~ { { { ] ] ] ^ ^ ^ ^ ^ ^ ^ ^ ^ / ( & _ : < ", "@ & & ] [ [ [ } [ [ [ [ | [ [ [ [ [ { [ 1 2 2 3 4 5 ", "@ & & ] [ [ [ { [ [ [ [ | [ [ [ [ [ 6 [ [ 7 = 8 | 9 ", "@ & & ] } { { ] ^ ^ ^ ^ { { 0 6 6 6 6 a b c d e f g ! ", "@ & & ] [ [ [ ^ > > 2 2 6 h h h i * j k ' = l m n o ! ", "@ & * j [ [ [ j * * * * j * * * * * j * * * * j * p ! ", "@ & * j / / / j j j j j j j j j j j j j j ] j j * | ! ", "@ > q r [ [ [ ^ > > 2 2 6 h h h i * j q q q q r q s ! ", "@ > t / [ [ [ j * * * * j * * * * * j * * * * j t s ! ", "@ u % ~ / / / j j j j j j j j j j j j j j ] j j % s ! ", "@ 2 v ] [ [ [ } > > 2 2 6 h h h i * j q q q q r v w ! ", "@ 2 x ] [ [ [ { * * * * j * * * * * j * * * * j x w ! ", "@ h y ] } { { ] j j j j j j j j j j j j j ] j j y z ! ", "@ h A ] [ [ [ } > > 2 2 6 h h h i * j q q q q r A z ! ", "@ h B ] [ [ [ { * * * * j * * * * * j * * * * j B | ! ", "@ C D ] } { { ] j j j j j j j j j j j j j ] j j D E ! ", "@ * F ] [ [ [ } > > 2 2 6 h h h i * j q q q q r F E ! ", "@ G H ] [ [ [ { * * * * j * * * * * j * * * * j H I ! ", "@ J K ] } { { ] j j j j j j j j j j j j j ] j j K L ! ", "@ x M N [ [ [ ^ > > 2 2 6 h h h i * j q q q q r M O ! ", "@ x P Q [ [ [ j * * * * j * * * * * j * * * * j P O ! ", "@ R S T / / / j j j j j j j j j j j j j j ] j j S O ! ", "@ U V V V V V V V V V V V V V V V V V V V V V V V O ! ", "+ W V V V V V V V V V V V V V V V V V V V V V V V X ! ", "Y Z ` ` I I I I I I I I L L L L L L L L L L L L X .! ", " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ", " ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/systemtables.xpm000066400000000000000000000010651177057155300222430ustar00rootroot00000000000000/* XPM */ static const char * systemtables_xpm[] = { "16 16 12 1", " c None", ". c #FF0000", "+ c #FFFFFF", "@ c #DEDFDE", "# c #E7E3E7", "$ c #E7E7E7", "% c #EFEBEF", "& c #EFEFEF", "* c #889CC1", "= c #F7F3F7", "- c #F7F7F7", "; c #FFFBFF", "........... ", "........... ", ".+@#$$%%%&. ", ".+***%***&. ", ".+$$%%&&&=......", ".+***&***=......", ".+%%&&===-.%%%&.", ".+***&***-.***&.", ".+%&&===-;.&&&=.", ".+***=***;.***=.", ".+&==-;;;+.===-.", "...........***-.", " .+%&&===-;.", " .+***=***;.", " .+&==-;;;+.", " ..........."}; flamerobin_0.9.3~svn+2220.orig/res/table.xpm000066400000000000000000000010561177057155300206130ustar00rootroot00000000000000/* XPM */ static const char * table_xpm[] = { "16 16 12 1", " c None", ". c #000686", "+ c #FFFFFF", "@ c #DEDFDE", "# c #E7E3E7", "$ c #E7E7E7", "% c #EFEBEF", "& c #EFEFEF", "* c #889CC1", "= c #F7F3F7", "- c #F7F7F7", "; c #FFFBFF", " ", " ", " ........... ", " ........... ", " .+@#$$%%%&. ", " .+***%***&. ", " .+$$%%&&&=. ", " .+***&***=. ", " .+%%&&===-. ", " .+***&***-. ", " .+%&&===-;. ", " .+***=***;. ", " .+&==-;;;+. ", " ........... ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/table32.xpm000066400000000000000000000072141177057155300207620ustar00rootroot00000000000000/* XPM */ static const char * table32_xpm[] = { "32 32 93 2", " c None", ". c #141414", "+ c #3B3B3B", "@ c #404040", "# c #545454", "$ c #555555", "% c #F6F6F6", "& c #FFFFFF", "* c #FAFAFA", "= c #D6D6D6", "- c #878787", "; c #242424", "> c #FEFEFE", ", c #E6E6E6", "' c #F0F0F0", ") c #A0A0A0", "! c #000000", "~ c #B5B5B5", "{ c #BABABA", "] c #BCBCBC", "^ c #BBBBBB", "/ c #B6B6B6", "( c #D8D8D8", "_ c #F5F5F5", ": c #979797", "< c #252525", "[ c #594F91", "} c #BFBFBF", "| c #C2C2C2", "1 c #C9C9C9", "2 c #FDFDFD", "3 c #E0E0E0", "4 c #888888", "5 c #212121", "6 c #B9B9B9", "7 c #E1E1E1", "8 c #C8C8C8", "9 c #8E8E8E", "0 c #BABAB9", "a c #B5B5B4", "b c #A9A9A9", "c c #666666", "d c #5D5D5D", "e c #565656", "f c #5A5A5A", "g c #848484", "h c #FCFCFC", "i c #FCFCFB", "j c #B8B8B8", "k c #F7F7F7", "l c #C7C7C6", "m c #A6A6A6", "n c #9A9A9A", "o c #6C6C6C", "p c #AEAEAE", "q c #F9F9F9", "r c #B7B7B7", "s c #C4C4C4", "t c #F8F8F7", "u c #FEFEFD", "v c #F5F5F4", "w c #C3C3C3", "x c #F4F4F3", "y c #F2F2F1", "z c #C3C3C2", "A c #F1F1F0", "B c #EFEFEF", "C c #FBFBFB", "D c #EEEEED", "E c #C2C2C1", "F c #EDEDEB", "G c #F7F7F6", "H c #EBEBEA", "I c #C1C1C0", "J c #F6F6F5", "K c #EAEAE8", "L c #C0C0C0", "M c #E6E6E4", "N c #A9A9A8", "O c #C0C0BF", "P c #E4E4E2", "Q c #A8A8A6", "R c #F3F3F3", "S c #E3E3E1", "T c #A7A7A5", "U c #F3F3F2", "V c #E1E1DF", "W c #E9E9E9", "X c #B6B6B5", "Y c #323232", "Z c #C5C5C4", "` c #C1C1C1", " . c #979796", ". + @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # $ ", "+ % & & & & & & & & & & & & & & & & & * = - ; ", "@ & & & & & & & & & & & > > > > > > > * , ' ) ! ", "@ & & ~ { { { ] ] ] ^ ^ ^ ^ ^ ^ ^ ^ ^ / ( & _ : < ", "@ & & ] [ [ [ } [ [ [ [ | [ [ [ [ [ { [ 1 2 2 3 4 5 ", "@ & & ] [ [ [ { [ [ [ [ | [ [ [ [ [ 6 [ [ 7 = 8 | 9 ", "@ & & ] } { { ] ^ ^ ^ ^ { { 0 6 6 6 6 a b c d e f g ! ", "@ & & ] [ [ [ ^ > > 2 2 6 h h h i * j k ' = l m n o ! ", "@ & * j [ [ [ j * * * * j * * * * * j * * * * j * p ! ", "@ & * j / / / j j j j j j j j j j j j j j ] j j * | ! ", "@ > q r [ [ [ ^ > > 2 2 6 h h h i * j q q q q r q s ! ", "@ > t / [ [ [ j * * * * j * * * * * j * * * * j t s ! ", "@ u % ~ / / / j j j j j j j j j j j j j j ] j j % s ! ", "@ 2 v ] [ [ [ } > > 2 2 6 h h h i * j q q q q r v w ! ", "@ 2 x ] [ [ [ { * * * * j * * * * * j * * * * j x w ! ", "@ h y ] } { { ] j j j j j j j j j j j j j ] j j y z ! ", "@ h A ] [ [ [ } > > 2 2 6 h h h i * j q q q q r A z ! ", "@ h B ] [ [ [ { * * * * j * * * * * j * * * * j B | ! ", "@ C D ] } { { ] j j j j j j j j j j j j j ] j j D E ! ", "@ * F ] [ [ [ } > > 2 2 6 h h h i * j q q q q r F E ! ", "@ G H ] [ [ [ { * * * * j * * * * * j * * * * j H I ! ", "@ J K ] } { { ] j j j j j j j j j j j j j ] j j K L ! ", "@ x M N [ [ [ ^ > > 2 2 6 h h h i * j q q q q r M O ! ", "@ x P Q [ [ [ j * * * * j * * * * * j * * * * j P O ! ", "@ R S T / / / j j j j j j j j j j j j j j ] j j S O ! ", "@ U V V V V V V V V V V V V V V V V V V V V V V V O ! ", "+ W V V V V V V V V V V V V V V V V V V V V V V V X ! ", "Y Z ` ` I I I I I I I I L L L L L L L L L L L L X .! ", " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ", " ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/tables.xpm000066400000000000000000000010571177057155300207770ustar00rootroot00000000000000/* XPM */ static const char * tables_xpm[] = { "16 16 12 1", " c None", ". c #000686", "+ c #FFFFFF", "@ c #DEDFDE", "# c #E7E3E7", "$ c #E7E7E7", "% c #EFEBEF", "& c #EFEFEF", "* c #889CC1", "= c #F7F3F7", "- c #F7F7F7", "; c #FFFBFF", "........... ", "........... ", ".+@#$$%%%&. ", ".+***%***&. ", ".+$$%%&&&=......", ".+***&***=......", ".+%%&&===-.%%%&.", ".+***&***-.***&.", ".+%&&===-;.&&&=.", ".+***=***;.***=.", ".+&==-;;;+.===-.", "...........***-.", " .+%&&===-;.", " .+***=***;.", " .+&==-;;;+.", " ..........."}; flamerobin_0.9.3~svn+2220.orig/res/toggle16.xpm000066400000000000000000000032261177057155300211550ustar00rootroot00000000000000/* XPM */ static const char * toggle16_xpm[] = { "16 16 87 1", " c None", ". c #B6BEC7", "+ c #A5ADB9", "@ c #A3ABB8", "# c #A1AAB6", "$ c #9FA8B5", "% c #9DA7B4", "& c #9CA5B3", "* c #9AA4B2", "= c #9DA6B3", "- c #9EA8B4", "; c #A2ABB7", "> c #A4ACB8", ", c #A6AEBA", "' c #B2BAC4", ") c #8791A0", "! c #BEC7D2", "~ c #B6C0CD", "{ c #AFBAC8", "] c #A8B4C4", "^ c #A3AFBF", "/ c #9DAABC", "( c #98A6B9", "_ c #99A6B9", ": c #9EAABC", "< c #A3AEBF", "[ c #A7B3C3", "} c #B7C0CD", "| c #BFC7D2", "1 c #C6CDD7", "2 c #929DAB", "3 c #9096A2", "4 c #E2E1E1", "5 c #E2E2E3", "6 c #E4E4E4", "7 c #E5E5E5", "8 c #E7E7E6", "9 c #E8E7E8", "0 c #E9E9E9", "a c #EAEAEA", "b c #EBEBEB", "c c #ECECEB", "d c #ECECEC", "e c #ECEDEC", "f c #EDEDED", "g c #F1F1F0", "h c #9EA6AF", "i c #959CA7", "j c #FFFFFF", "k c #A0A9B3", "l c #949BA7", "m c #BEBFC0", "n c #BEC0C2", "o c #BCBEC0", "p c #BABCBF", "q c #B8BABE", "r c #B6B9BC", "s c #B4B7BC", "t c #B4B7BB", "u c #B5B8BC", "v c #B7BABD", "w c #B9BBBE", "x c #BABCC0", "y c #BCBEC1", "z c #BDBEC0", "A c #FEFEFE", "B c #A1AAB4", "C c #949BA6", "D c #FDFDFD", "E c #FBFBFC", "F c #FEFDFD", "G c #FBFBFB", "H c #9299A5", "I c #FBF9F9", "J c #F8F7F7", "K c #F7F7F7", "L c #F7F6F6", "M c #B4BBC4", "N c #A5ADB8", "O c #A2ABB6", "P c #A0A9B5", "Q c #9EA7B3", "R c #9BA4B2", "S c #9EA6B4", "T c #A2A9B6", "U c #A9AFBD", "V c #B0B8C2", " ", ".+@#$%&**&=-;>,'", ")!~{]^/(_:<[}|12", "34567890abcdefgh", "ijjjjjjjjjjjjjjk", "ljjjjjjjjjjjjjjk", "ljjjjjjjjjjjjjjk", "ljjjjjjjjjjjjjjk", "lmnopqrstuvwxyzk", "ljAAAAjjjjjjjjjB", "CjDDDDjjjjjjjjjk", "CAEEEEjjjjjjjjjk", "CFGGGGjjjjjjjjjk", "HIJKLLjjjjjjjjjB", "MNOPQ=RRS=RRSTUV", " "}; flamerobin_0.9.3~svn+2220.orig/res/toggle24.xpm000066400000000000000000000061561177057155300211610ustar00rootroot00000000000000/* XPM */ static const char * toggle24_xpm[] = { "24 24 117 2", " c None", ". c #B8C2CA", "+ c #808D9D", "@ c #7E8B9C", "# c #7C8B9A", "$ c #7B8999", "% c #788797", "& c #778597", "* c #758395", "= c #738294", "- c #708092", "; c #6F7F91", "> c #728192", ", c #748394", "' c #758495", ") c #7F8C9C", "! c #7E8B9B", "~ c #7E8C9B", "{ c #BEC6CF", "] c #8B95A3", "^ c #D0D5DD", "/ c #C8CED8", "( c #C4CBD5", "_ c #BFC7D2", ": c #BBC3CF", "< c #B7C0CD", "[ c #B3BCCA", "} c #B0B9C8", "| c #ACB6C6", "1 c #A9B3C3", "2 c #A6B0C1", "3 c #A6B1C1", "4 c #ACB6C5", "5 c #AFB8C7", "6 c #E5E8EC", "7 c #BDC5D1", "8 c #ECEEF2", "9 c #CAD0D9", "0 c #ECEFF2", "a c #D1D6DD", "b c #919BA7", "c c #88929E", "d c #B6BFCC", "e c #CBD1DA", "f c #CCD2DA", "g c #919AA4", "h c #89949F", "i c #E4E7ED", "j c #FFFFFF", "k c #FBFBFB", "l c #FBFBFC", "m c #FBFCFC", "n c #FCFCFC", "o c #FCFCFD", "p c #FCFDFD", "q c #FDFDFD", "r c #929BA5", "s c #ACACAC", "t c #C0C1C2", "u c #BEC0C2", "v c #BDBEC1", "w c #BBBDC0", "x c #BABCBF", "y c #B9BBBE", "z c #B7BABE", "A c #B6B9BD", "B c #B5B8BC", "C c #B4B7BB", "D c #B3B7BB", "E c #B5B9BC", "F c #B7B9BD", "G c #B8BABE", "H c #BCBDC0", "I c #FEFEFF", "J c #FDFEFE", "K c #929BA7", "L c #89939F", "M c #FAFAFA", "N c #89939E", "O c #F1F2F3", "P c #8B95A1", "Q c #CBCDCE", "R c #CACBD0", "S c #C7CACF", "T c #C5C8CD", "U c #C2C6CC", "V c #BEC2C8", "W c #BBBFC5", "X c #B5BAC2", "Y c #AEB4BB", "Z c #A7AEB7", "` c #AEB1C0", " . c #B6B6C8", ".. c #B7B7CA", "+. c #BBB8CF", "@. c #C6C0D9", "#. c #C1BDD1", "$. c #C4BECC", "%. c #CDC3D4", "&. c #CBC1CF", "*. c #DCC7EB", "=. c #D2C8D9", "-. c #D3CCD7", ";. c #939CA6", ">. c #B9C2C9", ",. c #8E99A4", "'. c #8D98A4", "). c #8C98A4", "!. c #8C97A3", "~. c #8B96A3", "{. c #8A96A3", "]. c #8995A2", "^. c #8994A2", "/. c #8994A1", "(. c #8D99A6", "_. c #9099A8", ":. c #BEC5CC", " ", " ", " ", ". + @ # $ % & * = = - ; ; - > = , ' % ) ! ~ + { ", "] ^ / ( _ : < [ } | 1 2 3 1 4 5 [ 6 7 8 9 0 a b ", "c ^ / ( _ : < [ } | 1 2 3 1 4 5 [ d 7 e 9 f a g ", "h i j k l m n n n n n n n o o p q q q q q j i r ", "h i j j j j j j j j j j j j j j j j j j j j i r ", "h i j j j j j j j j j j j j j j j j j j j j i r ", "h i j j j j j j j j j j j j j j j j j j j j i r ", "h i j j j j j j j j j j j j j j j j j j j j i r ", "h i j j j j j j j j j j j j j j j j j j j j i r ", "h s s s s s s s s s s s s s s s s s s s s s s r ", "h t u u v w x y z A B C D B E F G y x H v t u r ", "h i j I I I I I I I j j j j j j j j j j j j i r ", "h i j J J J J J J J j j j j j j j j j j j j i K ", "h i j q q q q q q q j j j j j j j j j j j j i r ", "L i j m m m m m m m j j j j j j j j j j j j i r ", "L i j k k k k k k k j j j j j j j j j j j j i r ", "L i j M M M M M M M j j j j j j j j j j j j i r ", "N i O O O O O O O O O O O O O O O O O O O O i K ", "P Q R S T U V W X Y Z ` ...+.@.#.$.%.&.*.=.-.;.", ">.,.'.).!.!.~.~.{.].^././.].(.^././.].(._.'.'.:.", " "}; flamerobin_0.9.3~svn+2220.orig/res/toggle32.xpm000066400000000000000000000122361177057155300211540ustar00rootroot00000000000000/* XPM */ static const char * toggle32_xpm[] = { "32 32 190 2", " c None", ". c #BFC4C8", "+ c #A1ACB7", "@ c #A1ABB6", "# c #A0ABB6", "$ c #A0ABB5", "% c #A0AAB5", "& c #9FAAB5", "* c #9EA9B5", "= c #9EA9B4", "- c #9DA8B4", "; c #C2C7CA", "> c #98A4B1", ", c #CFD7E5", "' c #C1CCDC", ") c #BCC7D8", "! c #B6C2D5", "~ c #B1BED1", "{ c #ACBACE", "] c #A8B6CA", "^ c #A3B2C7", "/ c #9EAEC4", "( c #9AAAC1", "_ c #96A6BE", ": c #92A3BB", "< c #8FA0B9", "[ c #8B9DB7", "} c #889AB4", "| c #8EA0B9", "1 c #91A2BA", "2 c #94A5BC", "3 c #98A8BF", "4 c #9CABC1", "5 c #A0AFC4", "6 c #A3B1C6", "7 c #D0D9E2", "8 c #B2BFCF", "9 c #CDD6E1", "0 c #B4C0D2", "a c #C9D2DE", "b c #A9B7CA", "c c #A8B1BC", "d c #9BA7B2", "e c #B9BEC6", "f c #A0A8B4", "g c #9FA7B3", "h c #9EA5B2", "i c #9CA4B0", "j c #99A3AF", "k c #98A1AE", "l c #97A0AD", "m c #959EAC", "n c #949DAB", "o c #929CAA", "p c #919AA9", "q c #9099A9", "r c #8E99A8", "s c #8E97A6", "t c #8E98A6", "u c #8F99A8", "v c #939DAB", "w c #979FAD", "x c #A0A7B3", "y c #9EA6B2", "z c #A1A8B3", "A c #A3AAB4", "B c #B3B9C2", "C c #AAB3BD", "D c #9AA5B1", "E c #D2D2D2", "F c #CBCCCD", "G c #CDCDCE", "H c #CECFCF", "I c #D0D0D1", "J c #D1D1D1", "K c #D2D3D3", "L c #D4D4D4", "M c #D5D5D6", "N c #D6D6D6", "O c #D7D7D7", "P c #D8D8D8", "Q c #D9D9D9", "R c #DADADA", "S c #DADADB", "T c #DBDBDC", "U c #DCDCDB", "V c #DDDDDC", "W c #DDDDDD", "X c #DEDEDE", "Y c #DCDDDD", "Z c #DEDEDF", "` c #DFDFDF", " . c #E0E0E0", ".. c #DBDADB", "+. c #AAB2BC", "@. c #99A5B0", "#. c #CFD0D2", "$. c #EDEDEE", "%. c #EDEEEE", "&. c #EEEEEF", "*. c #EEEFEF", "=. c #EFEFF0", "-. c #EFF0F0", ";. c #F0F0F1", ">. c #F0F1F1", ",. c #F1F1F2", "'. c #F1F2F2", "). c #F1F2F3", "!. c #F2F2F3", "~. c #F2F3F3", "{. c #F3F3F3", "]. c #F3F3F4", "^. c #F3F4F4", "/. c #F4F4F5", "(. c #F4F5F5", "_. c #99A4B0", ":. c #FFFFFF", "<. c #AAB1BC", "[. c #ACACAC", "}. c #BFC0C1", "|. c #C0C1C3", "1. c #BEC0C2", "2. c #BEBFC2", "3. c #BCBEC1", "4. c #BBBDC0", "5. c #BABCC0", "6. c #B9BCBE", "7. c #B8BABE", "8. c #B7BABE", "9. c #B6B9BD", "0. c #B5B9BC", "a. c #B5B8BC", "b. c #B4B7BB", "c. c #B4B7BC", "d. c #B6B9BC", "e. c #B7B9BD", "f. c #B9BBBE", "g. c #BABCBF", "h. c #BCBEC0", "i. c #BDBEC1", "j. c #FEFEFE", "k. c #FDFDFD", "l. c #ABB4BD", "m. c #FCFCFC", "n. c #FBFBFB", "o. c #FAFBFB", "p. c #FAFAFA", "q. c #FAFAFB", "r. c #ACB4BE", "s. c #9CA7B3", "t. c #DDDEE4", "u. c #C9CFD5", "v. c #C2C8D1", "w. c #C0C4CE", "x. c #BDC5CE", "y. c #BEC5CF", "z. c #BCC3CE", "A. c #BAC2CD", "B. c #B7C0CB", "C. c #B2BBC9", "D. c #B0B9C6", "E. c #ABB6C4", "F. c #A9B3C2", "G. c #A6B1C0", "H. c #A3AEBD", "I. c #A4AFBD", "J. c #A6B0C0", "K. c #AFB8C6", "L. c #A8B3C2", "M. c #ADB6C4", "N. c #B0B8C8", "O. c #B8BDCE", "P. c #BABFD0", "Q. c #C4C5D7", "R. c #C2C6CF", "S. c #C3CAD1", "T. c #CACDD4", "U. c #D1D4D8", "V. c #ACB5BE", "W. c #C6CACC", "X. c #AEB7C0", "Y. c #ADB6BF", "Z. c #ADB5BF", "`. c #ACB5BF", " + c #ACB4BF", ".+ c #ABB4BF", "++ c #AEB7C1", "@+ c #AEB6C1", "#+ c #AEB6C0", "$+ c #C9CDCF", " ", " ", " ", ". + @ # # $ % & & * * * = = = - - = = = = * * * & $ $ # # # # ; ", "> , ' ) ! ~ { ] ^ / ( _ : < [ } } [ | 1 2 3 4 5 6 7 8 9 0 a b c ", "d e f g h i j k l m n o p q r s t u q p o v m w l x y z x A B C ", "D E F F G G H I J E K L M N O P Q Q R S T U V W X Y Z ` .F ..+.", "@.#.$.$.%.%.&.&.*.=.=.-.;.;.>.>.,.,.'.).!.~.{.].^.^././.(.$.#.+.", "_.#.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.#.<.", "_.#.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.#.<.", "_.#.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.#.<.", "_.#.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.#.<.", "_.#.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.#.<.", "_.#.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.#.<.", "_.#.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.#.<.", "_.#.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.#.<.", "_.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.<.", "_.}.|.|.1.2.3.4.5.6.7.8.9.0.a.b.b.c.a.d.e.8.7.f.g.4.h.i.1.}.|.<.", "_.#.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.#.<.", "_.#.:.j.j.j.j.j.j.j.j.j.j.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.#.<.", "_.#.:.k.k.k.k.k.k.k.k.k.k.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.#.l.", "_.#.:.k.k.k.k.k.k.k.k.k.k.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.#.<.", "_.#.:.m.m.m.m.m.m.m.m.m.m.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.#.<.", "_.#.:.n.n.n.n.n.n.n.n.n.n.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.#.<.", "_.#.:.o.o.o.o.o.o.o.o.o.o.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.#.<.", "_.#.:.p.p.p.p.p.p.p.p.p.p.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.#.<.", "_.#.:.q.q.q.q.q.q.q.q.q.q.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.#.l.", "_.#.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.o.#.r.", "s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.F.K.L.E.M.N.O.P.Q.R.S.T.U.V.", "W.X.Y.Y.Y.Y.Y.Y.Z.Z.`.`.`. + +.+.+ + +++ + +.+.+ + +++@+Y.Y.#+$+", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/trigger.xpm000066400000000000000000000010411177057155300211610ustar00rootroot00000000000000/* XPM */ static const char * trigger_xpm[] = { "16 16 11 1", " c None", ". c #000686", "+ c #FFFFFF", "@ c #F7F7F7", "# c #FFFBFF", "$ c #E7E3E7", "% c #E7E7E7", "& c #EFEBEF", "* c #EFEFEF", "= c #889CC1", "- c #F7F3F7", " ............. ", ".+@@@@@@@@####. ", ".+$$$%%%&&&&***.", ".+$...%======*-.", ".+$%%%&&&&***--.", ".+%%.&=======--.", ".+%%.&&&***---@.", ".+%&.&=======@@.", ".+&&.&***---@@@.", ".+&&.***-====@@.", ".+&&.**.--@@@@#.", ".+**.....@===##.", ".+**---.@@@###+.", ".+*---@@@@###+. ", " ............. ", " "}; flamerobin_0.9.3~svn+2220.orig/res/trigger32.xpm000066400000000000000000000040441177057155300213340ustar00rootroot00000000000000/* XPM */ static const char * trigger32_xpm[] = { "32 32 58 1", " c None", ". c #000000", "+ c #E2E2E2", "@ c #F2F2F2", "# c #F3F3F3", "$ c #F4F4F4", "% c #F5F5F5", "& c #F6F6F6", "* c #F7F7F7", "= c #DBDBDB", "- c #F0F0F0", "; c #E0E0E0", "> c #E1E1E1", ", c #E3E3E3", "' c #E4E4E4", ") c #E5E5E5", "! c #E6E6E6", "~ c #E7E7E7", "{ c #E8E8E8", "] c #E9E9E9", "^ c #EAEAEA", "/ c #EBEBEB", "( c #ECECEC", "_ c #EDEDED", ": c #EEEEEE", "< c #EFEFEF", "[ c #494066", "} c #314E6C", "| c #A2A2A2", "1 c #A3A3A3", "2 c #A4A4A4", "3 c #A5A5A5", "4 c #A6A6A6", "5 c #A7A7A7", "6 c #F1F1F1", "7 c #A1A1A1", "8 c #A8A8A8", "9 c #A9A9A9", "0 c #AAAAAA", "a c #ABABAB", "b c #ACACAC", "c c #ADADAD", "d c #F8F8F8", "e c #F9F9F9", "f c #FAFAFA", "g c #AEAEAE", "h c #FBFBFB", "i c #FCFCFC", "j c #FDFDFD", "k c #FEFEFE", "l c #FFFFFF", "m c #B0B0B0", "n c #B1B1B1", "o c #B2B2B2", "p c #D9D9D9", "q c #C9C9C9", "r c #DADADA", "s c #BDBDBD", " ", " ", " ", " ", " .................... ", " .+@@@@###$$$%%%&&**$=. ", " .-;;>+,')!~{{]^/(_:<,. ", " .@>[[[}}}~|1222345<-~. ", " .@+,,')!~{]^/((_:<-6{. ", " .#,'})7||1223445586@]. ", " .#')}~~{]^/(_:<<-6@#^. ", " .#)!}{112234558999#$/. ", " .$!~}]^^/(_:<-6@##$%(. ", " .$~{}^2334558990aa%&_. ", " .%{]}/(_::<-6@#$%&**:. ", " .%]^}(45588990aabcdd<. ", " .%^/}_:<-6@@#$%&*def-. ", " .&/(}:589@}$$abcggfh@. ", " .*__}<-6@#}}%&*defhi#. ", " .*:<}}}}}}}}}*}}}}ij$. ", " .d-6@@#$%&}}efhhijkl%. ", " .d6@0aaab*}efmmnnoll%. ", " .@@#$%&&*defhijkllllp. ", " .qr:/(_::<-6@#$%%%%'s. ", " .................... ", " ", " ", " ", " ", " ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/up.xpm000066400000000000000000000013751177057155300201540ustar00rootroot00000000000000/* XPM */ static const char * up_xpm[] = { "16 16 26 1", " c None", ". c #1C2D3D", "+ c #000000", "@ c #C5D5E4", "# c #C4D4E3", "$ c #9FB9D2", "% c #2A435B", "& c #9CB7D1", "* c #A0BAD3", "= c #3F6588", "- c #A6BED5", "; c #A4BDD5", "> c #9EB8D1", ", c #A3BCD4", "' c #AAC1D7", ") c #ABC2D8", "! c #29425A", "~ c #AFC5DA", "{ c #9BB6D0", "] c #AEC4D9", "^ c #9AB5CF", "/ c #6892B9", "( c #49759E", "_ c #4B78A2", ": c #34536F", "< c #2D4760", " ", " . ", " +@+ ", " +#$%+ ", " +#&*=%+ ", " +#-;>==%+ ", " +#,',>===%+ ", " ++++)$&=!++++ ", " +~{$=!+ ", " +){$=!+ ", " +]$$=!+ ", " +,^$=!+ ", " +/(_:<+ ", " +++++++ ", " ", " "}; flamerobin_0.9.3~svn+2220.orig/res/view.xpm000066400000000000000000000025101177057155300204720ustar00rootroot00000000000000/* XPM */ static const char * view_xpm[] = { "16 16 65 1", " c None", ". c #000686", "+ c #FEFEFE", "@ c #FDFDFD", "# c #E0E0E0", "$ c #889CC1", "% c #F1F1F1", "& c #C3C3C3", "* c #ECECEC", "= c #ADADAD", "- c #CECECE", "; c #B5B5B5", "> c #BABABA", ", c #B9B9B9", "' c #E2E2E2", ") c #A3A3A3", "! c #C2C2C2", "~ c #EEEEEE", "{ c #BBBBBB", "] c #B6B6B6", "^ c #264057", "/ c #233B51", "( c #253F56", "_ c #374E63", ": c #606B76", "< c #C1C1C1", "[ c #CACACA", "} c #334F68", "| c #E7E7E7", "1 c #FFFFFF", "2 c #000000", "3 c #314E6C", "4 c #597187", "5 c #BEBEBE", "6 c #DFDFDF", "7 c #F5F5F5", "8 c #3B5673", "9 c #506881", "0 c #E1E1E1", "a c #A0A0A0", "b c #F0F0F0", "c c #8091A3", "d c #4D657D", "e c #708296", "f c #DCDCDC", "g c #DDDDDD", "h c #757575", "i c #EBEBEB", "j c #7D8EA0", "k c #3A5572", "l c #62748A", "m c #C1C4C9", "n c #CDCED1", "o c #575757", "p c #E3E3E3", "q c #C7C7C7", "r c #EAEAEA", "s c #E5E5E5", "t c #F6F6F6", "u c #F4F4F4", "v c #F2F2F2", "w c #E4E4E4", "x c #E6E6E6", "y c #BDBDBD", "z c #BCBCBC", " ......... ", " .++++++@#$. ", " .+%%%%%%&$*. ", " .+%%%%%%=.... ", " .-;>>>>,'*$$. ", " .)......!~~{. ", " ..]^/(_:.<*{. ", " .[}|1234].5{. ", " .678112390a.{. ", " .bc333def.g{. ", " h.ijkklm.ni{. ", " op......qrs{. ", " .@tuu7uv|ww{. ", " .@xssswwppp{. ", " .!yyyzz{{{{a. ", " ........... "}; flamerobin_0.9.3~svn+2220.orig/res/view32.xpm000066400000000000000000000141341177057155300206440ustar00rootroot00000000000000/* XPM */ static const char * view32_xpm[] = { "32 32 250 2", " c None", ". c #000686", "+ c #5559AE", "@ c #7F82C2", "# c #777ABA", "$ c #7073B3", "% c #5A62AB", "& c #4451A4", "* c #2D389A", "= c #FEFEFE", "- c #FDFDFD", "; c #EFEFEF", "> c #E0E0E0", ", c #B4BED1", "' c #889CC1", ") c #FBFBFB", "! c #F8F8F8", "~ c #F7F7F7", "{ c #E4E4E4", "] c #D2D2D2", "^ c #ADB7C9", "/ c #7F8BBD", "( c #7679B9", "_ c #4F53A8", ": c #F1F1F1", "< c #DADADA", "[ c #C3C3C3", "} c #A6B0C2", "| c #BAC4D7", "1 c #ECECEC", "2 c #D5D5D5", "3 c #B8B8B8", "4 c #7E85AE", "5 c #5D65AE", "6 c #3B40A0", "7 c #CFCFCF", "8 c #ADADAD", "9 c #575A9A", "0 c #7376B6", "a c #E6E6E6", "b c #DDDDDD", "c c #D3D3D3", "d c #D4D4D4", "e c #D6D6D6", "f c #CECECE", "g c #C8C8C8", "h c #9FA0C0", "i c #222C95", "j c #676AAA", "k c #C2C2C2", "l c #B5B5B5", "m c #BABABA", "n c #B9B9B9", "o c #E2E2E2", "p c #E7E7E7", "q c #5C5F9F", "r c #8A8BAB", "s c #5B5E9E", "t c #5D60A0", "u c #9799B9", "v c #EDEDED", "w c #D4D9E2", "x c #BBC5D8", "y c #AEB8CB", "z c #A2ACBE", "A c #5159A2", "B c #525595", "C c #A3A3A3", "D c #6164A4", "E c #D8D8D8", "F c #EEEEEE", "G c #BBBBBB", "H c #5E61A1", "I c #292D8D", "J c #565999", "K c #374186", "L c #13236F", "M c #12226D", "N c #12216C", "O c #13236E", "P c #172671", "Q c #1C2A75", "R c #263179", "S c #30397E", "T c #494E91", "U c #9C9EBE", "V c #B6B6B6", "W c #6E7B87", "X c #264057", "Y c #253E54", "Z c #233B51", "` c #243D54", " . c #253F56", ".. c #2E475D", "+. c #374E63", "@. c #4C5D6D", "#. c #606B76", "$. c #C1C1C1", "%. c #D7D7D7", "&. c #333797", "*. c #6568A8", "=. c #6D759C", "-. c #75838F", ";. c #7E8B97", ">. c #87949F", ",. c #8C98A4", "'. c #919DA8", "). c #525E6A", "!. c #13202B", "~. c #233749", "{. c #344E68", "]. c #485E73", "^. c #5D6E7F", "/. c #5C668E", "(. c #9B9CBC", "_. c #CACACA", ":. c #7F8D99", "<. c #334F68", "[. c #8D9BA8", "}. c #F3F3F3", "|. c #FFFFFF", "1. c #808080", "2. c #000000", "3. c #192736", "4. c #314E6C", "5. c #45607A", "6. c #597187", "7. c #88949F", "8. c #5F62A2", "9. c #BEBEBE", "0. c #BDBDBD", "a. c #4A4EA4", "b. c #A8A9C9", "c. c #8B99A7", "d. c #37536E", "e. c #95A3B0", "f. c #F9F9F9", "g. c #435D78", "h. c #556D84", "i. c #909CA8", "j. c #CCCCCC", "k. c #8E8FAF", "l. c #505393", "m. c #585B9B", "n. c #8D8FAF", "o. c #DFDFDF", "p. c #EAEAEA", "q. c #F5F5F5", "r. c #98A6B4", "s. c #3B5673", "t. c #9DABB9", "u. c #415B77", "v. c #506881", "w. c #99A5B1", "x. c #E1E1E1", "y. c #A0A0A0", "z. c #B1B3D3", "A. c #A8B3BF", "B. c #5E748B", "C. c #7B8DA0", "D. c #98A7B6", "E. c #586776", "F. c #2C4055", "G. c #3F5A75", "H. c #506780", "I. c #60758C", "J. c #9FAAB5", "K. c #6F72B2", "L. c #9596B6", "M. c #787BBB", "N. c #F0F0F0", "O. c #B8C1CA", "P. c #8091A3", "Q. c #597088", "R. c #4D657D", "S. c #5F748A", "T. c #708296", "U. c #A6AFB9", "V. c #DCDCDC", "W. c #6E71B1", "X. c #3B3E7E", "Y. c #595C9C", "Z. c #979DC1", "`. c #B6BEC7", " + c #8696A7", ".+ c #576E86", "++ c #46607B", "@+ c #36526F", "#+ c #475F79", "$+ c #586D84", "%+ c #78889A", "&+ c #99A3B0", "*+ c #838AB0", "=+ c #6A6EAE", "-+ c #676AAC", ";+ c #A5A7C8", ">+ c #D0D0D0", ",+ c #757575", "'+ c #EBEBEB", ")+ c #B4BDC6", "!+ c #7D8EA0", "~+ c #5C7289", "{+ c #3A5572", "]+ c #4E657E", "^+ c #62748A", "/+ c #929CAA", "(+ c #C1C4C9", "_+ c #6165A8", ":+ c #CDCED1", "<+ c #DCDDDE", "[+ c #666666", "}+ c #6C6D8D", "|+ c #7275B5", "1+ c #7477B7", "2+ c #5A61A6", "3+ c #3F4A93", "4+ c #2E3C88", "5+ c #1D2E7C", "6+ c #273582", "7+ c #313D88", "8+ c #495198", "9+ c #6266A7", "0+ c #6467A7", "a+ c #A0A1C2", "b+ c #DCDCDE", "c+ c #E2E2E3", "d+ c #E8E8E8", "e+ c #575757", "f+ c #9D9D9D", "g+ c #E3E3E3", "h+ c #C7C7C7", "i+ c #D9D9D9", "j+ c #E5E5E5", "k+ c #2C2F6F", "l+ c #B6B7D7", "m+ c #7B7EBE", "n+ c #7A7DBD", "o+ c #797CBC", "p+ c #A8AACA", "q+ c #FAFAFA", "r+ c #F6F6F6", "s+ c #F4F4F4", "t+ c #F2F2F2", "u+ c #D1D1D1", "v+ c #AEAEAE", "w+ c #C0C0C0", "x+ c #BCBCBC", "y+ c #41459A", "z+ c #6063A3", "A+ c #35398F", " . . . . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . . ", " . + @ @ @ @ @ @ @ @ @ @ @ @ @ # $ % & * . ", " . . @ = = = = = = = = = = = = - ; > , ' & . . ", " . . @ = ) ! ! ! ! ! ! ! ! ! ~ ~ { ] ^ ' / ( _ . ", " . . @ = ! : : : : : : : : : : : < [ } ' | 1 ( . . ", " . . @ = ! : : : : : : : : : : : 2 3 4 & 5 ( 6 . . . ", " . . @ = ! : : : : : : : : : : : 7 8 9 . . . . . . . . ", " . . 0 a b c d e e e e e e e 2 2 f g h ( 5 & & & i . . ", " . . j f k l 3 m m m m m m m m n f o p 1 | ' ' ' & . . ", " . . q n r s q t t t t t t t t t u ] > v w x y z A . . ", " . . B C B . . . . . . . . . . . D k E F F F 2 G H . . ", " . . I B J s K L M N M O P Q R S T D U E o v d G H . . ", " . . . . s V W X Y Z ` ...+.@.#.S . D $.%.1 d G H . . ", " . . &.*.=.-.;.>.,.'.).!.~.{.].^./.s H D (.2 g G H . . ", " . . *._.:.<.[.p }.|.1.2.3.4.5.6.7.V s . 8.9.0.G H . . ", " . a.$ b.> c.d.e.}.f.|.1.2.3.4.g.h.i.j.k.l.m.8.n.G H . . ", " . . $ o.p.q.r.s.t.|.|.|.1.2.3.4.u.v.w.x.$.y.l.. H G H . . ", " . a.$ z.}.A.B.C.D.D.D.E.3.F.G.H.I.J.o.u l.8.K.L.G H . . ", " . . M.N.O.P.Q.4.4.4.4.4.G.R.S.T.U.V.W.. K.b j.G H . . ", " X.X.Y.M.Z.`. +.+++@+@+@+#+$+%+&+*+W.=+-+;+{ >+G H . . ", " ,+,+X.. ( '+)+!+~+{+{+{+]+^+/+(+_+. -+:+<+'+c G H . . ", " [+[+}+|+1+( 2+3+4+5+5+5+6+7+8+_+9+0+a+b+c+d+] G H . . ", " e+e+f+g+|+. . . . . . . . . . . 0+h+i+p.d+j+>+G H . . ", " k+k+k.N.l+m+m+n+n+n+n+m+n+n+n+o+p+%.o.p a j+>+G H . . ", " . . @ - q+r+q.s+s+s+q.q.q.s+}.t+v p a { { { >+G H . . ", " . . @ - r+F v v v v v v v 1 1 '+d+j+{ { { { 7 G H . . ", " . . @ - t+a a j+j+j+j+j+j+{ { { { g+g+g+g+g+7 G H . . ", " . . $ > i+] u+u+u+u+u+u+>+>+>+>+7 7 7 7 7 7 9.v+9 . . ", " . . D k w+0.0.0.0.0.0.x+x+x+x+G G G G G G G v+y.l.. . ", " . y+D z+8.8.8.8.8.H H H H H H H H H H H H 9 l.A+. ", " . . . . . . . . . . . . . . . . . . . . . . . "}; flamerobin_0.9.3~svn+2220.orig/src/000077500000000000000000000000001177057155300167725ustar00rootroot00000000000000flamerobin_0.9.3~svn+2220.orig/src/Isaac.h000066400000000000000000000116271177057155300201720ustar00rootroot00000000000000/* ------------------------------------------------------------------------------ The original code is taken from: http://www.burtleburtle.net/bob/c/randport.c http://www.burtleburtle.net/bob/c/standard.h http://www.burtleburtle.net/bob/c/rand.h Those files contain the following copyright notice: By Bob Jenkins. My random number generator, ISAAC. Public Domain It was modified 06.Apr 2006. by Milan Babuskov: - removed unused functions and defines - rewrote all defines to be regular functions - wrapped everything in C++ class named Isaac These modifications are also put in public domain. Usage: Isaac isc(seed); isc.getCipher(password_to_encrypt); "seed" can be up to 256 characters long. It can contain multibyte characters whose size should not be bigger than size of unsigned long int. "password_to_encrypt" can be up to 32 characters long. Same conditions apply. ------------------------------------------------------------------------------ */ #ifndef FR_ISAAC_H #define FR_ISAAC_H //----------------------------------------------------------------------------- class Isaac { private: typedef unsigned long int ub4; /* unsigned 4-byte quantities */ struct randctx { ub4 randcnt; ub4 randrsl[256]; ub4 randmem[256]; ub4 randa; ub4 randb; ub4 randc; }; typedef struct randctx randctx; randctx ctxM; void rngstep(ub4 mix,ub4& a,ub4& b,ub4*& mm,ub4*& m,ub4*& m2,ub4*& r,ub4& x, ub4& y) { x = *m; a = ((a^(mix)) + *(m2++)) & 0xffffffff; *(m++) = y = (((mm)[(x>>2)&(255)]) + a + b) & 0xffffffff; *(r++) = b = (((mm)[(y>>10)&(255)]) + x) & 0xffffffff; } void isaac(randctx* ctx) { register ub4 a,b,x,y,*m,*mm,*m2,*r,*mend; mm=ctx->randmem; r=ctx->randrsl; a = ctx->randa; b = (ctx->randb + (++ctx->randc)) & 0xffffffff; for (m = mm, mend = m2 = m+128; m>6 , a, b, mm, m, m2, r, x, y); rngstep( a<<2 , a, b, mm, m, m2, r, x, y); rngstep( a>>16, a, b, mm, m, m2, r, x, y); } for (m2 = mm; m2>6 , a, b, mm, m, m2, r, x, y); rngstep( a<<2 , a, b, mm, m, m2, r, x, y); rngstep( a>>16, a, b, mm, m, m2, r, x, y); } ctx->randb = b; ctx->randa = a; } void mix(ub4& a,ub4& b,ub4& c,ub4& d,ub4& e,ub4& f,ub4& g,ub4& h) { a^=b<<11; d+=a; b+=c; b^=c>>2; e+=b; c+=d; c^=d<<8; f+=c; d+=e; d^=e>>16; g+=d; e+=f; e^=f<<10; h+=e; f+=g; f^=g>>4; a+=f; g+=h; g^=h<<8; b+=g; h+=a; h^=a>>9; c+=h; a+=b; } /* use the contents of randrsl[] to initialize mm[]. */ void randinit(randctx* ctx) { ub4 a,b,c,d,e,f,g,h; ub4 *m,*r; ctx->randa = ctx->randb = ctx->randc = 0; m=ctx->randmem; r=ctx->randrsl; a=b=c=d=e=f=g=h=0x9e3779b9; /* the golden ratio */ for (int i=0; i<4; ++i) /* scramble it */ mix(a,b,c,d,e,f,g,h); for (int i=0; i<256; i+=8) { a+=r[i ]; b+=r[i+1]; c+=r[i+2]; d+=r[i+3]; e+=r[i+4]; f+=r[i+5]; g+=r[i+6]; h+=r[i+7]; mix(a,b,c,d,e,f,g,h); m[i ]=a; m[i+1]=b; m[i+2]=c; m[i+3]=d; m[i+4]=e; m[i+5]=f; m[i+6]=g; m[i+7]=h; } for (int i=0; i<256; i+=8) { a+=m[i ]; b+=m[i+1]; c+=m[i+2]; d+=m[i+3]; e+=m[i+4]; f+=m[i+5]; g+=m[i+6]; h+=m[i+7]; mix(a,b,c,d,e,f,g,h); m[i ]=a; m[i+1]=b; m[i+2]=c; m[i+3]=d; m[i+4]=e; m[i+5]=f; m[i+6]=g; m[i+7]=h; } isaac(ctx); /* fill in the first set of results */ ctx->randcnt=256; /* prepare to use the first set of results */ } public: Isaac(const wxString& masterpw) { for (int i=0; i<256; ++i) ctxM.randrsl[i]=(ub4)0; for (int i=0; masterpw[i] && i<256; ++i) ctxM.randrsl[i] = (wxChar)masterpw[i]; randinit(&ctxM); isaac(&ctxM); } wxString getCipher(const wxString& pwd) { wxString result; ub4 pw[33]; for (int i=0; i<33; ++i) pw[i] = 0; for (int i=0; i < (int) pwd.Length() && i<32; ++i) pw[i] = (ub4)(wxChar)pwd[i]; for (int j=0; j<32; ++j) result += wxString::Format(wxT("%08lx"), pw[j] ^ ctxM.randrsl[j]); return result; } wxString deCipher(const wxString& cipher) { wxString result; for (int i=0; i<32; ++i) { ub4 value; cipher.Mid(i*8, 8).ToULong(&value, 16); result += wxChar(value ^ ctxM.randrsl[i]); } return result; } }; //----------------------------------------------------------------------------- #endif flamerobin_0.9.3~svn+2220.orig/src/MasterPassword.cpp000066400000000000000000000073631177057155300224650ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "config/Config.h" #include "gui/AdvancedMessageDialog.h" #include "Isaac.h" #include "MasterPassword.h" //----------------------------------------------------------------------------- wxString encryptPassword(const wxString& password, const wxString& context) { wxString mpw = MasterPassword::getMasterPassword(); if (mpw.IsEmpty()) return wxEmptyString; Isaac isc(mpw+context); return isc.getCipher(password); } //----------------------------------------------------------------------------- wxString decryptPassword(const wxString& cipher, const wxString& context) { wxString mpw = MasterPassword::getMasterPassword(); if (mpw.IsEmpty()) return wxEmptyString; Isaac isc(mpw+context); return isc.deCipher(cipher); } //----------------------------------------------------------------------------- MasterPassword::MasterPassword() { } //----------------------------------------------------------------------------- MasterPassword& MasterPassword::getInstance() { static MasterPassword mps; return mps; } //----------------------------------------------------------------------------- wxString MasterPassword::getMasterPassword() { wxString& mp = getInstance().mpw; if (mp.IsEmpty()) { wxString msg(_("If you are already using FlameRobin's encrypted passwords, please enter the master password now, it will be used for the entire session.")); msg += wxT("\n\n"); msg += _("If you are using FlameRobin's encrypted passwords for the first time, please enter your master password now."); msg += wxT("\n\n"); msg += _("Please consult the manual for more information about the master password feature."); showInformationDialog(0, _("Master Password is required."), msg, AdvancedMessageDialogButtonsOk(), config(), wxT("DIALOG_MasterPasswordNotice"), _("Do not show this information again")); mp = wxGetPasswordFromUser( _("Please enter the master password"), _("Enter master password")); } return mp; } //----------------------------------------------------------------------------- void MasterPassword::setMasterPassword(const wxString& str) { wxString& mp = getInstance().mpw; mp = str; } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/MasterPassword.h000066400000000000000000000035761177057155300221340ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_MASTERPASSWORD_H #define FR_MASTERPASSWORD_H //----------------------------------------------------------------------------- wxString encryptPassword(const wxString& password, const wxString& context); wxString decryptPassword(const wxString& cipher, const wxString& context); //----------------------------------------------------------------------------- class MasterPassword { private: static MasterPassword& getInstance(); wxString mpw; MasterPassword(); public: static wxString getMasterPassword(); // before doing this you may want to decrypt passwords for all // databases and change them as well static void setMasterPassword(const wxString& str); }; //----------------------------------------------------------------------------- #endif flamerobin_0.9.3~svn+2220.orig/src/addconstrainthandler.cpp000066400000000000000000000154151177057155300236770ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "core/URIProcessor.h" #include "frutils.h" #include "gui/ExecuteSql.h" #include "gui/GUIURIHandlerHelper.h" #include "gui/MultilineEnterDialog.h" #include "metadata/MetadataItemURIHandlerHelper.h" #include "metadata/table.h" //----------------------------------------------------------------------------- class AddConstraintHandler: public URIHandler, private GUIURIHandlerHelper, private MetadataItemURIHandlerHelper { public: AddConstraintHandler() {}; bool handleURI(URI& uri); private: static const AddConstraintHandler handlerInstance; // singleton; registers itself on creation. TablePtr selectTable(DatabasePtr db, wxWindow* parent) const; wxString selectAction(const wxString& label, wxWindow* parent) const; }; //----------------------------------------------------------------------------- const AddConstraintHandler AddConstraintHandler::handlerInstance; //----------------------------------------------------------------------------- TablePtr AddConstraintHandler::selectTable(DatabasePtr db, wxWindow* parent) const { wxArrayString tables; TablesPtr ts(db->getTables()); for (Tables::const_iterator it = ts->begin(); it != ts->end(); ++it) tables.Add((*it)->getName_()); int index = ::wxGetSingleChoiceIndex(_("Select table to reference"), _("Creating foreign key"), tables, parent); if (index == -1) return TablePtr(); return ts->findByName(tables[index]); } //----------------------------------------------------------------------------- wxString AddConstraintHandler::selectAction(const wxString& label, wxWindow *parent) const { wxArrayString actions; actions.Add(wxT("RESTRICT")); actions.Add(wxT("NO ACTION")); actions.Add(wxT("CASCADE")); actions.Add(wxT("SET DEFAULT")); actions.Add(wxT("SET NULL")); int index = ::wxGetSingleChoiceIndex(wxString::Format(_("Select action for %s"), label.c_str()), _("Creating foreign key"), actions, parent); if (index == -1) return wxT("CANCEL"); return actions[index]; } //----------------------------------------------------------------------------- bool AddConstraintHandler::handleURI(URI& uri) { if (uri.action != wxT("add_constraint")) return false; wxString type = uri.getParam(wxT("type")); // pk, fk, check, unique Table* t = extractMetadataItemFromURI(uri); wxWindow* w = getParentWindow(uri); if (!t || !w) return true; // Find first available constraint name: DatabasePtr db = t->getDatabase(); wxString prefix = type + wxT("_") + t->getName_(); wxString stmt( wxT("select rdb$constraint_name from rdb$relation_constraints ") wxT("where rdb$relation_name = '") + t->getName_() + wxT("' and rdb$constraint_name starting with '") + prefix + wxT("' order by 1")); wxString default_value; wxArrayString constraintNames(db->loadIdentifiers(stmt)); for (int i = 0; ; ++i) { default_value = prefix + wxString::Format(wxT("_%d"), i); if (constraintNames.Index(default_value, false) == wxNOT_FOUND) break; } wxString cname = ::wxGetTextFromUser(_("Enter constraint name"), _("Adding new table constraint"), default_value, w); if (cname.IsEmpty()) // cancel return true; wxString sql = wxT("alter table ") + t->getQuotedName() + wxT("\nadd constraint ") + Identifier::userString(cname); if (type == wxT("PK")) { wxString columnlist = selectRelationColumns(t, w); if (columnlist.IsEmpty()) // cancel return true; sql += wxT("\nprimary key (") + columnlist + wxT(")"); } else if (type == wxT("FK")) { wxString columnlist = selectRelationColumns(t, w); if (columnlist == wxT("")) return true; TablePtr ref = selectTable(t->getDatabase(), w); if (!ref) return true; wxString refcolumnlist = selectRelationColumns(ref.get(), w); if (refcolumnlist == wxT("")) return true; sql += wxT("\nforeign key (") + columnlist + wxT(") \nreferences ") + ref->getQuotedName() + wxT(" (") + refcolumnlist + wxT(")"); wxString action = selectAction(_("update"), w); if (action == wxT("CANCEL")) return true; else if (action != wxT("RESTRICT")) sql += wxT("\non update ") + action + wxT(" "); action = selectAction(_("delete"), w); if (action == wxT("CANCEL")) return true; else if (action != wxT("RESTRICT")) sql += wxT("\non delete ") + action + wxT(" "); } else if (type == wxT("CHK")) { wxString source; if (!GetMultilineTextFromUser(w, _("Enter check condition"), source)) return true; sql += wxT("\ncheck (") + source + wxT(")"); } else if (type == wxT("UNQ")) { wxString columnlist = selectRelationColumns(t, w); if (columnlist.IsEmpty()) // cancel return true; sql += wxT("\nunique (") + columnlist + wxT(")"); } else { ::wxMessageBox(_("Unknown constraint type"), _("Error."), wxOK | wxICON_ERROR); return true; } execSql(w, wxT(""), db, sql, true); // true = commit + close at once return true; } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/config/000077500000000000000000000000001177057155300202375ustar00rootroot00000000000000flamerobin_0.9.3~svn+2220.orig/src/config/Config.cpp000066400000000000000000000335551177057155300221630ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif //----------------------------------------------------------------------------- #include "wx/fileconf.h" #include "wx/filename.h" #include "config/Config.h" #ifdef HAVE_FRCONFIG_H #include "frconfig.h" #endif #include "core/FRError.h" //----------------------------------------------------------------------------- const wxString Config::pathSeparator = wxT("/"); //----------------------------------------------------------------------------- FRConfig& config() { static FRConfig c; return c; } //----------------------------------------------------------------------------- Config::Config() : configM(0), needsFlushM(false) { #ifdef FR_CONFIG_USE_PRIVATE_STDPATHS standardPathsM.SetInstallPrefix(wxT(FR_INSTALL_PREFIX)); #endif } //----------------------------------------------------------------------------- Config::~Config() { delete configM; } //----------------------------------------------------------------------------- wxFileConfig* Config::getConfig() const { if (!configM) { wxFileName configFileName = getConfigFileName(); if (!wxDirExists(configFileName.GetPath())) wxMkdir(configFileName.GetPath()); configM = new wxFileConfig(wxT(""), wxT(""), configFileName.GetFullPath(), wxT(""), wxCONFIG_USE_LOCAL_FILE); configM->SetExpandEnvVars(false); } return configM; } //----------------------------------------------------------------------------- void Config::lockedChanged(bool locked) { // delay getConfig()->Flush() until object is completely unlocked again if (!locked && needsFlushM) { needsFlushM = false; getConfig()->Flush(); } } //----------------------------------------------------------------------------- //! return true if value exists, false if not bool Config::keyExists(const wxString& key) const { return getConfig()->HasEntry(key); } //----------------------------------------------------------------------------- //! return true if value exists, false if not bool Config::getValue(const wxString& key, wxString& value) { // if complete key is found, then return (recursion exit condition). wxString configValue; if (getConfig()->Read(key, &configValue)) { value = configValue; return true; } // does key contain a separator? If not, then the key is not found and // we're done. wxString::size_type separatorPos = key.rfind(pathSeparator); if (separatorPos == wxString::npos) return false; else { // split key into keyPart and pathPart; remove last component of // pathPart and recurse. wxString keyPart = key.substr(separatorPos + 1, key.length()); wxString pathPart = key.substr(0, separatorPos); wxString::size_type separatorPosInPath = pathPart.rfind(pathSeparator); if (separatorPosInPath == wxString::npos) return getValue(keyPart, value); else { return getValue(pathPart.substr(0, separatorPosInPath) + pathSeparator + keyPart, value); } } } //----------------------------------------------------------------------------- bool Config::getValue(const wxString& key, int& value) { wxString s; if (!getValue(key, s)) return false; // This variable is only needed because the compiler considers // int* and long* incompatible. It may be ditched if a better solution // is found. long longValue; if (!s.ToLong(&longValue)) return false; value = longValue; return true; } //----------------------------------------------------------------------------- bool Config::getValue(const wxString& key, double& value) { wxString s; if (!getValue(key, s)) return false; if (!s.ToDouble(&value)) return false; return true; } //----------------------------------------------------------------------------- bool Config::getValue(const wxString& key, bool& value) { wxString s; if (!getValue(key, s)) return false; value = (s == wxT("1")); return true; } //----------------------------------------------------------------------------- bool Config::getValue(const wxString& key, StorageGranularity& value) { int intValue = 0; bool ret = getValue(key, intValue); if (ret) value = StorageGranularity(intValue); return ret; } //----------------------------------------------------------------------------- bool Config::getValue(const wxString& key, wxArrayString& value) { wxString s; if (!getValue(key, s)) return false; value.clear(); wxString item; size_t pos = 0, sep = s.find(','); while (sep != wxString::npos) { item = s.substr(pos, sep - pos); if (!item.empty()) value.push_back(item); sep = s.find(',', pos = sep + 1); } if (!(item = s.substr(pos)).empty()) value.push_back(item); return true; } //----------------------------------------------------------------------------- //! return true if value existed, false if not bool Config::setValue(const wxString& key, const wxString& value) { bool result = getConfig()->Write(key, value); if (!isLocked()) getConfig()->Flush(); else needsFlushM = true; notifyObservers(); return result; } //----------------------------------------------------------------------------- bool Config::setValue(const wxString& key, int value) { wxString s; s << value; return setValue(key, s); } //----------------------------------------------------------------------------- bool Config::setValue(const wxString& key, double value) { wxString s; s << value; return setValue(key, s); } //----------------------------------------------------------------------------- bool Config::setValue(const wxString& key, bool value) { if (value) return setValue(key, wxString(wxT("1"))); else return setValue(key, wxString(wxT("0"))); } //----------------------------------------------------------------------------- bool Config::setValue(const wxString& key, StorageGranularity value) { return setValue(key, int(value)); } //----------------------------------------------------------------------------- bool Config::setValue(const wxString& key, const wxArrayString& value) { wxString s; for (wxArrayString::const_iterator it = value.begin(); it != value.end(); it++) { if (it != value.begin()) s += wxT(","); // this is just a parachute, if this should ever be triggered we // will need to quote and unquote this wxString or all in value wxASSERT((*it).find(',') == wxString::npos); s += *it; } return setValue(key, s); } //----------------------------------------------------------------------------- wxString Config::getHomePath() const { if (!homePathM.empty()) return homePathM + wxFileName::GetPathSeparator(); else return getDataDir() + wxFileName::GetPathSeparator(); } //----------------------------------------------------------------------------- wxString Config::getUserHomePath() const { if (!userHomePathM.empty()) return userHomePathM + wxFileName::GetPathSeparator(); else return getUserLocalDataDir() + wxFileName::GetPathSeparator(); } //----------------------------------------------------------------------------- wxFileName Config::getConfigFileName() const { return configFileNameM; } //----------------------------------------------------------------------------- void Config::setConfigFileName(const wxFileName& fileName) { configFileNameM = fileName; } //----------------------------------------------------------------------------- wxString Config::getDataDir() const { #ifdef FR_CONFIG_USE_PRIVATE_STDPATHS return standardPathsM.GetDataDir(); #else return wxStandardPaths::Get().GetDataDir(); #endif } //----------------------------------------------------------------------------- wxString Config::getLocalDataDir() const { #ifdef FR_CONFIG_USE_PRIVATE_STDPATHS return standardPathsM.GetLocalDataDir(); #else return wxStandardPaths::Get().GetLocalDataDir(); #endif } //----------------------------------------------------------------------------- wxString Config::getUserLocalDataDir() const { #ifdef FR_CONFIG_USE_PRIVATE_STDPATHS return standardPathsM.GetUserLocalDataDir(); #else return wxStandardPaths::Get().GetUserLocalDataDir(); #endif } //----------------------------------------------------------------------------- void Config::setHomePath(const wxString& homePath) { homePathM = homePath; } //----------------------------------------------------------------------------- void Config::setUserHomePath(const wxString& userHomePath) { userHomePathM = userHomePath; } //----------------------------------------------------------------------------- // class ConfigCache ConfigCache::ConfigCache(Config& config) : Observer(), cacheValidM(false) { config.attachObserver(this, false); } //----------------------------------------------------------------------------- void ConfigCache::ensureCacheValid() { if (!cacheValidM) { loadFromConfig(); cacheValidM = true; } } //----------------------------------------------------------------------------- void ConfigCache::loadFromConfig() { } //----------------------------------------------------------------------------- void ConfigCache::update() { // next call to ensureCacheValid() will reload the cached information cacheValidM = false; } //----------------------------------------------------------------------------- wxString FRConfig::getHtmlTemplatesPath() const { return getHomePath() + wxT("html-templates") + wxFileName::GetPathSeparator(); } //----------------------------------------------------------------------------- wxString FRConfig::getCodeTemplatesPath() const { return getHomePath() + wxT("code-templates") + wxFileName::GetPathSeparator(); } //----------------------------------------------------------------------------- wxString FRConfig::getUserCodeTemplatesPath() const { return getUserHomePath() + wxT("code-templates") + wxFileName::GetPathSeparator(); } //----------------------------------------------------------------------------- wxString FRConfig::getSysTemplatesPath() const { return getHomePath() + wxT("sys-templates") + wxFileName::GetPathSeparator(); } //----------------------------------------------------------------------------- wxString FRConfig::getUserSysTemplatesPath() const { return getUserHomePath() + wxT("sys-templates") + wxFileName::GetPathSeparator(); } //----------------------------------------------------------------------------- wxString FRConfig::getDocsPath() const { return getHomePath() + wxT("docs") + wxFileName::GetPathSeparator(); } //----------------------------------------------------------------------------- wxString FRConfig::getConfDefsPath() const { return getHomePath() + wxT("conf-defs") + wxFileName::GetPathSeparator(); } //----------------------------------------------------------------------------- wxString FRConfig::getImagesPath() const { return getHomePath() + wxT("images") + wxFileName::GetPathSeparator(); } //----------------------------------------------------------------------------- wxString FRConfig::getDBHFileName() const { return getUserHomePath() + wxT("fr_databases.conf"); } //----------------------------------------------------------------------------- wxFileName FRConfig::getConfigFileName() const { return wxFileName(getUserHomePath(), wxT("fr_settings.conf")); } //----------------------------------------------------------------------------- const wxString FRConfig::getSysTemplateFileName(const wxString& templateName) { wxFileName fileName = getUserSysTemplatesPath() + templateName + wxT(".template"); if (!fileName.FileExists()) fileName = getSysTemplatesPath() + templateName + wxT(".template"); if (!fileName.FileExists()) fileName = getUserCodeTemplatesPath() + templateName + wxT(".template"); if (!fileName.FileExists()) fileName = getCodeTemplatesPath() + templateName + wxT(".template"); if (!fileName.FileExists()) { fileName = getSysTemplatesPath() + templateName + wxT(".template"); if (!fileName.FileExists()) { throw FRError(wxString::Format(_("Template \"%s\" not found."), fileName.GetFullPath().c_str())); } } return fileName.GetFullPath(); } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/config/Config.h000066400000000000000000000151411177057155300216170ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_CONFIG_H #define FR_CONFIG_H #include "wx/arrstr.h" #include #include #include "core/Observer.h" #include "core/Subject.h" //----------------------------------------------------------------------------- enum StorageGranularity { sgFrame, // Store settings per frame type. sgObjectType, // Store settings per object type. sgObject, // Store settings per object. }; //----------------------------------------------------------------------------- // forward declarations class wxFileConfig; //----------------------------------------------------------------------------- //! Do not instantiate objects of this class. Use config() function (see below). #if defined(__UNIX__) && !defined(__WXMAC_OSX__) #define FR_CONFIG_USE_PRIVATE_STDPATHS #else #undef FR_CONFIG_USE_PRIVATE_STDPATHS #endif //! Base class to be used as generic container of configuration info. class Config: public Subject { private: mutable wxFileConfig* configM; bool needsFlushM; // performs lazy initialization of configM. wxFileConfig* getConfig() const; #ifdef FR_CONFIG_USE_PRIVATE_STDPATHS wxStandardPaths standardPathsM; #endif wxString homePathM; wxString userHomePathM; wxFileName configFileNameM; protected: virtual void lockedChanged(bool locked); public: Config(); virtual ~Config(); virtual wxFileName getConfigFileName() const; void setConfigFileName(const wxFileName& fileName); static const wxString pathSeparator; // We must use an instance of wxStandardPaths for UNIX, but must not // use such an instance for things to work on Mac OS X. Great... // These methods are to work around that, use them instead of // wxStandardPaths methods. wxString getDataDir() const; wxString getLocalDataDir() const; wxString getUserLocalDataDir() const; // returns the home path to use as the basis for the following calls. wxString getHomePath() const; // returns the home path to use as the basis for the following call. wxString getUserHomePath() const; // these should be called before calling the get* functions below, // otherwise defaults apply. void setHomePath(const wxString& homePath); void setUserHomePath(const wxString& userHomePath); // return true if value exists, false if not virtual bool keyExists(const wxString& key) const; virtual bool getValue(const wxString& key, wxString& value); bool getValue(const wxString& key, int& value); bool getValue(const wxString& key, double& value); bool getValue(const wxString& key, bool& value); bool getValue(const wxString& key, StorageGranularity& value); bool getValue(const wxString& key, wxArrayString& value); // returns the value for key if it exists, or default value if it doesn't. template T get(const wxString& key, const T& defaultValue) { T temp; if (getValue(key, temp)) return temp; else return defaultValue; } // return true if value existed, false if not. virtual bool setValue(const wxString& key, const wxString& value); bool setValue(const wxString& key, int value); bool setValue(const wxString& key, double value); bool setValue(const wxString& key, bool value); bool setValue(const wxString& key, StorageGranularity value); bool setValue(const wxString& key, const wxArrayString& value); }; //----------------------------------------------------------------------------- //! Class used to contain all FlameRobin and database configuration info sets. class FRConfig: public Config { public: // this class has a fixed file name - setting it through // setConfigFileName() is ineffective. virtual wxFileName getConfigFileName() const; // returns the path from which to load HTML templates. wxString getHtmlTemplatesPath() const; // returns the path from which to load code templates. wxString getCodeTemplatesPath() const; // returns the path from which to load user code templates and overrides. wxString getUserCodeTemplatesPath() const; // returns the path from which to load system templates. wxString getSysTemplatesPath() const; // returns the path from which to load user overrides of system templates. wxString getUserSysTemplatesPath() const; // returns the path containing the docs. wxString getDocsPath() const; // returns the path containing the confdefs. wxString getConfDefsPath() const; // returns the path containing the images. wxString getImagesPath() const; // returns the file name (with full path) of the file containing // registered databases. wxString getDBHFileName() const; // Returns the full pathname of the specified system template, giving // precedence to any existing user override. const wxString getSysTemplateFileName(const wxString& templateName); }; //----------------------------------------------------------------------------- FRConfig& config(); //----------------------------------------------------------------------------- // class ConfigCache // used to cache settings in a Config instance, observes the instance to // reload the information when necessary (reloads on-demand) class ConfigCache: public Observer { private: bool cacheValidM; protected: void ensureCacheValid(); virtual void loadFromConfig(); virtual void update(); public: ConfigCache(Config& config); }; //----------------------------------------------------------------------------- #endif flamerobin_0.9.3~svn+2220.orig/src/config/DatabaseConfig.cpp000066400000000000000000000060211177057155300235740ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif //----------------------------------------------------------------------------- #include "config/Config.h" #include "config/DatabaseConfig.h" #include "metadata/database.h" //----------------------------------------------------------------------------- DatabaseConfig::DatabaseConfig(const Database *d, Config& referenceConfig) :Config(), databaseM(d), referenceConfigM(referenceConfig) { // we need to copy these settings, since they may have been modified // by env variables or command line params setHomePath(referenceConfigM.getHomePath()); setUserHomePath(referenceConfigM.getUserHomePath()); } //----------------------------------------------------------------------------- wxString DatabaseConfig::addPathToKey(const wxString& key) const { if (databaseM) return wxT("DATABASE_") + databaseM->getId() + Config::pathSeparator + key; else return wxT(""); } //----------------------------------------------------------------------------- bool DatabaseConfig::keyExists(const wxString& key) const { return referenceConfigM.keyExists(addPathToKey(key)); } //----------------------------------------------------------------------------- bool DatabaseConfig::getValue(const wxString& key, wxString& value) { return referenceConfigM.getValue(addPathToKey(key), value); } //----------------------------------------------------------------------------- bool DatabaseConfig::setValue(const wxString& key, const wxString& value) { return referenceConfigM.setValue(addPathToKey(key), value); } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/config/DatabaseConfig.h000066400000000000000000000043371177057155300232510ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ //! This class is interface between Config and Database classes // Preferences dialog takes Config class as parameter, so interface like this // is needed // #ifndef FR_DATABASE_CONFIG_H #define FR_DATABASE_CONFIG_H #include "config/Config.h" #include "metadata/MetadataClasses.h" //----------------------------------------------------------------------------- class DatabaseConfig: public Config { private: const Database* databaseM; Config& referenceConfigM; wxString addPathToKey(const wxString& key) const; public: DatabaseConfig(const Database *d, Config& referenceConfig); // unhides methods of base class, for details see: // http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.7 using Config::getValue; using Config::setValue; // transform the key based on Database, and call regular config virtual bool keyExists(const wxString& key) const; virtual bool getValue(const wxString& key, wxString& value); virtual bool setValue(const wxString& key, const wxString& value); }; //----------------------------------------------------------------------------- #endif flamerobin_0.9.3~svn+2220.orig/src/core/000077500000000000000000000000001177057155300177225ustar00rootroot00000000000000flamerobin_0.9.3~svn+2220.orig/src/core/ArtProvider.cpp000066400000000000000000000251401177057155300226710ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include #include #include "config/Config.h" #include "core/ArtProvider.h" //----------------------------------------------------------------------------- // these have size 32x32 #include "flamerobin.xpm" #include "sqlicon.xpm" #include "backup32.xpm" #include "column32.xpm" #include "database32.xpm" #include "domain32.xpm" #include "function32.xpm" #include "generator32.xpm" #include "procedure32.xpm" #include "server32.xpm" #include "systemtable32.xpm" #include "table32.xpm" #include "toggle32.xpm" #include "trigger32.xpm" #include "view32.xpm" // these have size 24x24 #include "delete24.xpm" #include "insert24.xpm" #include "history24.xpm" #include "execute24.xpm" #include "ok24.xpm" #include "plan24.xpm" #include "redx24.xpm" #include "toggle24.xpm" // these have size 16x16 #include "column.xpm" #include "database.xpm" #include "delete16.xpm" #include "domain.xpm" #include "exception16_png.cpp" #include "execute16.xpm" #include "fk16_png.cpp" #include "function.xpm" #include "generator.xpm" #include "generators.xpm" #include "history.xpm" #include "insert16.xpm" #include "pk16_png.cpp" #include "pkfk16_png.cpp" #include "object.xpm" #include "ok.xpm" #include "plan16.xpm" #include "procedure.xpm" #include "procedures.xpm" #include "redx.xpm" #include "role16_png.cpp" #include "root.xpm" #include "server.xpm" #include "systemtable.xpm" #include "systemtables.xpm" #include "table.xpm" #include "tables.xpm" #include "toggle16.xpm" #include "trigger.xpm" #include "view.xpm" //----------------------------------------------------------------------------- wxBitmap bitmapFromEmbeddedPNG(const unsigned char* data, size_t len) { static int createMask = -1; if (createMask == -1) { int verMajor, verMinor; switch (wxGetOsVersion(&verMajor, &verMinor)) { case wxOS_WINDOWS_9X: createMask = 1; break; case wxOS_WINDOWS_NT: createMask = (verMajor > 5 || verMinor > 0) ? 0 : 1; break; default: createMask = 0; break; } } wxMemoryInputStream is(data, len); wxImage img(is); // work around the transparency problems of Windows versions before XP if (createMask == 1) img.ConvertAlphaToMask(16); return wxBitmap(img); } //----------------------------------------------------------------------------- wxBitmap ArtProvider::CreateBitmap(const wxArtID& id, const wxArtClient& client, const wxSize& size) { wxBitmap loadedBmp(loadBitmapFromFile(id, size)); if (loadedBmp.IsOk()) return loadedBmp; if (id == ART_FlameRobin) return wxBitmap(flamerobin32_xpm); if (id == ART_ExecuteSqlFrame) return wxBitmap(sqlicon32_xpm); if (client == wxART_FRAME_ICON || size == wxSize(32, 32)) { if (id == ART_Backup) return wxBitmap(backup32_xpm); if (id == ART_Column) return wxBitmap(column32_xpm); if (id == ART_DatabaseConnected) return wxBitmap(database32_xpm); if (id == ART_DatabaseDisconnected) return wxBitmap(database32_xpm); if (id == ART_Domain) return wxBitmap(domain32_xpm); if (id == ART_Function) return wxBitmap(function32_xpm); if (id == ART_Generator) return wxBitmap(generator32_xpm); if (id == ART_Procedure) return wxBitmap(procedure32_xpm); if (id == ART_Server) return wxBitmap(server32_xpm); if (id == ART_SystemTable) return wxBitmap(systemtable32_xpm); if (id == ART_Table) return wxBitmap(table32_xpm); if (id == ART_Trigger) return wxBitmap(trigger32_xpm); if (id == ART_ToggleView) return wxBitmap(toggle32_xpm); if (id == ART_View) return wxBitmap(view32_xpm); } if (size == wxSize(24, 24)) { if (id == ART_CommitTransaction) return wxBitmap(ok24_xpm); if (id == ART_DeleteRow) return wxBitmap(delete24_xpm); if (id == ART_ExecuteStatement) return wxBitmap(execute24_xpm); if (id == ART_History) return wxBitmap(history24_xpm); if (id == ART_InsertRow) return wxBitmap(insert24_xpm); if (id == ART_RollbackTransaction) return wxBitmap(redx24_xpm); if (id == ART_ShowExecutionPlan) return wxBitmap(plan24_xpm); if (id == ART_ToggleView) return wxBitmap(toggle24_xpm); } if (size == wxSize(16, 16)) { if (id == ART_Column) return wxBitmap(column_xpm); if (id == ART_CommitTransaction) return wxBitmap(ok_xpm); if (id == ART_Computed) return wxBitmap(function_xpm); if (id == ART_DatabaseConnected) return wxBitmap(database_xpm); if (id == ART_DatabaseDisconnected) return wxBitmap(database_xpm); if (id == ART_Domain) return wxBitmap(domain_xpm); if (id == ART_Domains) return wxBitmap(domain_xpm); if (id == ART_Exception) return bitmapFromEmbeddedPNG(exception16_png, sizeof(exception16_png)); if (id == ART_Exceptions) return bitmapFromEmbeddedPNG(exception16_png, sizeof(exception16_png)); if (id == ART_ExecuteStatement) return wxBitmap(execute16_xpm); if (id == ART_ForeignKey) return bitmapFromEmbeddedPNG(fk16_png, sizeof(fk16_png)); if (id == ART_Function) return wxBitmap(function_xpm); if (id == ART_Functions) return wxBitmap(function_xpm); if (id == ART_Generator) return wxBitmap(generator_xpm); if (id == ART_Generators) return wxBitmap(generators_xpm); if (id == ART_History) return wxBitmap(history_xpm); if (id == ART_Object) return wxBitmap(object_xpm); if (id == ART_ParameterInput) return wxBitmap(column_xpm); if (id == ART_ParameterOutput) return wxBitmap(column_xpm); if (id == ART_PrimaryAndForeignKey) return bitmapFromEmbeddedPNG(pkfk16_png, sizeof(pkfk16_png)); if (id == ART_PrimaryKey) return bitmapFromEmbeddedPNG(pk16_png, sizeof(pk16_png)); if (id == ART_Procedure) return wxBitmap(procedure_xpm); if (id == ART_Procedures) return wxBitmap(procedures_xpm); if (id == ART_Role) return bitmapFromEmbeddedPNG(role16_png, sizeof(role16_png)); if (id == ART_Roles) return bitmapFromEmbeddedPNG(role16_png, sizeof(role16_png)); if (id == ART_RollbackTransaction) return wxBitmap(redx_xpm); if (id == ART_Root) return wxBitmap(root_xpm); if (id == ART_Server) return wxBitmap(server_xpm); if (id == ART_ShowExecutionPlan) return wxBitmap(plan16_xpm); if (id == ART_SystemRole) return bitmapFromEmbeddedPNG(role16_png, sizeof(role16_png)); if (id == ART_SystemRoles) return bitmapFromEmbeddedPNG(role16_png, sizeof(role16_png)); if (id == ART_SystemTable) return wxBitmap(systemtable_xpm); if (id == ART_SystemTables) return wxBitmap(systemtables_xpm); if (id == ART_Table) return wxBitmap(table_xpm); if (id == ART_Tables) return wxBitmap(tables_xpm); if (id == ART_Trigger) return wxBitmap(trigger_xpm); if (id == ART_Triggers) return wxBitmap(trigger_xpm); if (id == ART_View) return wxBitmap(view_xpm); if (id == ART_Views) return wxBitmap(view_xpm); if (id == ART_DeleteRow) return wxBitmap(delete16_xpm); if (id == ART_InsertRow) return wxBitmap(insert16_xpm); if (id == ART_ToggleView) return wxBitmap(toggle16_xpm); } // return wxBitmap(toggle16_xpm); return wxNullBitmap; } //----------------------------------------------------------------------------- wxBitmap ArtProvider::loadBitmapFromFile(const wxArtID& id, wxSize size) { wxString name(id.Lower()); if (name.substr(0, 4) == wxT("art_")) name.erase(0, 4); if (size == wxDefaultSize) size = wxSize(32, 32); wxFileName fname(config().getImagesPath() + name + wxString::Format(wxT("_%dx%d"), size.GetWidth(), size.GetHeight())); wxArrayString imgExts; imgExts.Add(wxT("png")); imgExts.Add(wxT("xpm")); imgExts.Add(wxT("bmp")); for (size_t i = 0; i < imgExts.GetCount(); ++i) { fname.SetExt(imgExts[i]); wxLogDebug(wxT("Trying to load image file \"%s\""), fname.GetFullPath().c_str()); if (fname.FileExists()) { wxImage img(fname.GetFullPath()); if (img.IsOk() && wxSize(img.GetWidth(), img.GetHeight()) == size) return wxBitmap(img); } } return wxNullBitmap; } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/core/ArtProvider.h000066400000000000000000000115151177057155300223370ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_ARTPROVIDER_H #define FR_ARTPROVIDER_H //----------------------------------------------------------------------------- #include //----------------------------------------------------------------------------- #define ART_FlameRobin wxART_MAKE_ART_ID(ART_FlameRobin) #define ART_ExecuteSqlFrame wxART_MAKE_ART_ID(ART_ExecuteSqlFrame) #define ART_Backup wxART_MAKE_ART_ID(ART_Backup) #define ART_Column wxART_MAKE_ART_ID(ART_Column) #define ART_Computed wxART_MAKE_ART_ID(ART_Computed) #define ART_DatabaseConnected wxART_MAKE_ART_ID(ART_DatabaseConnected) #define ART_DatabaseDisconnected wxART_MAKE_ART_ID(ART_DatabaseDisconnected) #define ART_Domain wxART_MAKE_ART_ID(ART_Domain) #define ART_Domains wxART_MAKE_ART_ID(ART_Domains) #define ART_Exception wxART_MAKE_ART_ID(ART_Exception) #define ART_Exceptions wxART_MAKE_ART_ID(ART_Exceptions) #define ART_ForeignKey wxART_MAKE_ART_ID(ART_ForeignKey) #define ART_Function wxART_MAKE_ART_ID(ART_Function) #define ART_Functions wxART_MAKE_ART_ID(ART_Functions) #define ART_Generator wxART_MAKE_ART_ID(ART_Generator) #define ART_Generators wxART_MAKE_ART_ID(ART_Generators) #define ART_Object wxART_MAKE_ART_ID(ART_Object) #define ART_ParameterInput wxART_MAKE_ART_ID(ART_ParameterInput) #define ART_ParameterOutput wxART_MAKE_ART_ID(ART_ParameterOutput) #define ART_PrimaryKey wxART_MAKE_ART_ID(ART_PrimaryKey) #define ART_PrimaryAndForeignKey wxART_MAKE_ART_ID(ART_PrimaryAndForeignKey) #define ART_Procedure wxART_MAKE_ART_ID(ART_Procedure) #define ART_Procedures wxART_MAKE_ART_ID(ART_Procedures) #define ART_Role wxART_MAKE_ART_ID(ART_Role) #define ART_Roles wxART_MAKE_ART_ID(ART_Roles) #define ART_Root wxART_MAKE_ART_ID(ART_Root) #define ART_Server wxART_MAKE_ART_ID(ART_Server) #define ART_SystemRole wxART_MAKE_ART_ID(ART_SystemRole) #define ART_SystemRoles wxART_MAKE_ART_ID(ART_SystemRoles) #define ART_SystemTable wxART_MAKE_ART_ID(ART_SystemTable) #define ART_SystemTables wxART_MAKE_ART_ID(ART_SystemTables) #define ART_Table wxART_MAKE_ART_ID(ART_Table) #define ART_Tables wxART_MAKE_ART_ID(ART_Tables) #define ART_Trigger wxART_MAKE_ART_ID(ART_Trigger) #define ART_Triggers wxART_MAKE_ART_ID(ART_Triggers) #define ART_View wxART_MAKE_ART_ID(ART_View) #define ART_Views wxART_MAKE_ART_ID(ART_Views) #define ART_DeleteRow wxART_MAKE_ART_ID(ART_DeleteRow) #define ART_InsertRow wxART_MAKE_ART_ID(ART_InsertRow) #define ART_ToggleView wxART_MAKE_ART_ID(ART_ToggleView) #define ART_History wxART_MAKE_ART_ID(ART_History) #define ART_ExecuteStatement wxART_MAKE_ART_ID(ART_ExecuteStatement) #define ART_ShowExecutionPlan wxART_MAKE_ART_ID(ART_ShowExecutionPlan) #define ART_CommitTransaction wxART_MAKE_ART_ID(ART_CommitTransaction) #define ART_RollbackTransaction wxART_MAKE_ART_ID(ART_RollbackTransaction) //----------------------------------------------------------------------------- class ArtProvider : public wxArtProvider { private: wxBitmap loadBitmapFromFile(const wxArtID& id, wxSize size); protected: virtual wxBitmap CreateBitmap(const wxArtID& id, const wxArtClient& client, const wxSize& size); }; //----------------------------------------------------------------------------- #endif // FR_ARTPROVIDER_H flamerobin_0.9.3~svn+2220.orig/src/core/CodeTemplateProcessor.cpp000066400000000000000000000044151177057155300247000ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "core/CodeTemplateProcessor.h" //----------------------------------------------------------------------------- CodeTemplateProcessor::CodeTemplateProcessor(ProcessableObject*object, wxWindow* window) : TemplateProcessor(object, window) { } //----------------------------------------------------------------------------- void CodeTemplateProcessor::processCommand(const wxString& cmdName, const TemplateCmdParams& cmdParams, ProcessableObject* object, wxString& processedText) { TemplateProcessor::processCommand(cmdName, cmdParams, object, processedText); } //----------------------------------------------------------------------------- wxString CodeTemplateProcessor::escapeChars(const wxString& input, bool) { return input; } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/core/CodeTemplateProcessor.h000066400000000000000000000035771177057155300243550ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ //----------------------------------------------------------------------------- #ifndef FR_SQLTEMPLATEPROCESSOR_H #define FR_SQLTEMPLATEPROCESSOR_H #include "core/TemplateProcessor.h" //----------------------------------------------------------------------------- class CodeTemplateProcessor: public TemplateProcessor { protected: virtual void processCommand(const wxString& cmdName, const TemplateCmdParams& cmdParams, ProcessableObject* object, wxString& processedText); public: CodeTemplateProcessor(ProcessableObject* object, wxWindow* window); virtual wxString escapeChars(const wxString& input, bool processNewlines = true); }; //----------------------------------------------------------------------------- #endif // FR_SQLTEMPLATEPROCESSOR_H flamerobin_0.9.3~svn+2220.orig/src/core/FRError.cpp000066400000000000000000000043621177057155300217540ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "core/FRError.h" #include "core/StringUtils.h" //----------------------------------------------------------------------------- FRError::FRError(const wxString& message) { messageM = wx2std(message); } //----------------------------------------------------------------------------- const char* FRError::what() const throw() { return messageM.c_str(); } //----------------------------------------------------------------------------- FRError::~FRError() throw() { } //----------------------------------------------------------------------------- FRAbort::FRAbort() : FRError(wxString(_("Operation aborted"))) { } //----------------------------------------------------------------------------- FRAbort::~FRAbort() throw() { } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/core/FRError.h000066400000000000000000000036371177057155300214250ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ //----------------------------------------------------------------------------- #ifndef FR_FRERROR_H #define FR_FRERROR_H // Base class for all FlameRobin-specific exceptions. #include #include #include //----------------------------------------------------------------------------- class FRError: public std::exception { private: std::string messageM; public: FRError(const wxString& message); virtual const char* what() const throw(); virtual ~FRError() throw(); }; //----------------------------------------------------------------------------- //! A silent exception. class FRAbort: public FRError { public: FRAbort(); virtual ~FRAbort() throw(); }; //----------------------------------------------------------------------------- #endif //FR_FRERROR_H flamerobin_0.9.3~svn+2220.orig/src/core/ObjectWithHandle.h000066400000000000000000000063511177057155300232560ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_OBJECTWITHHANDLE_H #define FR_OBJECTWITHHANDLE_H //----------------------------------------------------------------------------- #include #include template class ObjectWithHandle { public: typedef unsigned long Handle; private: const Handle handleM; typedef std::map HandleMap; typedef std::pair HandlePair; static HandleMap handleMap; static Handle nextHandle; protected: // protected constructor initializes the handle ObjectWithHandle() : handleM(++nextHandle) { handleMap.insert(HandlePair(handleM, this)); } // protected copy constructor initializes the handle // each copy needs to have its own handle ObjectWithHandle(const ObjectWithHandle&) : handleM(++nextHandle) { handleMap.insert(HandlePair(handleM, this)); } public: // destructor declared as abstract to make this an abstract base class virtual ~ObjectWithHandle() { handleMap.erase(handleM); } // compiler can't auto-create assignment operator due to const member // handle must not be changed, so assignment operator does nothing ObjectWithHandle& operator = (const ObjectWithHandle&) { // let each instance keep its own handle return *this; } Handle getHandle() const { return handleM; } static bool findObjectFromHandle(Handle handle, T*& obj) { typename HandleMap::iterator it = handleMap.find(handle); if (it == handleMap.end()) { obj = 0; return false; } obj = static_cast(it->second); return true; } static T* getObjectFromHandle(Handle handle) { T* obj; return findObjectFromHandle(handle, obj) ? obj : 0; } static T* getObjectFromHandle(const wxString& handle) { Handle hv; if (handle.ToULong(&hv)) return getObjectFromHandle(hv); return 0; } }; //----------------------------------------------------------------------------- #endif // FR_OBJECTWITHHANDLE_H flamerobin_0.9.3~svn+2220.orig/src/core/Observer.cpp000066400000000000000000000067421177057155300222260ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif //----------------------------------------------------------------------------- #include #include #include "core/Observer.h" #include "core/Subject.h" //----------------------------------------------------------------------------- class ObserverLocker { private: unsigned* lockPtrM; public: ObserverLocker(unsigned* lock); ~ObserverLocker(); }; //----------------------------------------------------------------------------- ObserverLocker::ObserverLocker(unsigned* lock) : lockPtrM(lock) { if (lockPtrM) ++(*lockPtrM); } //----------------------------------------------------------------------------- ObserverLocker::~ObserverLocker() { if (lockPtrM) --(*lockPtrM); } //----------------------------------------------------------------------------- Observer::Observer() : updateLockM(0) { } //----------------------------------------------------------------------------- Observer::~Observer() { while (!subjectsM.empty()) { std::list::iterator it = subjectsM.begin(); // object will be removed by removeObservedObject() (*it)->detachObserver(this); } } //----------------------------------------------------------------------------- void Observer::doUpdate() { ObserverLocker lock(&updateLockM); if (updateLockM == 1) update(); } //----------------------------------------------------------------------------- void Observer::addSubject(Subject* subject) { if (subject) subjectsM.push_back(subject); } //----------------------------------------------------------------------------- void Observer::removeSubject(Subject* subject) { std::list::iterator it = find(subjectsM.begin(), subjectsM.end(), subject); if (it != subjectsM.end()) { subjectsM.erase(it); subjectRemoved(subject); } } //----------------------------------------------------------------------------- void Observer::subjectRemoved(Subject* /*subject*/) { } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/core/Observer.h000066400000000000000000000043571177057155300216730ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_OBSERVER_H #define FR_OBSERVER_H //----------------------------------------------------------------------------- #include class Subject; //----------------------------------------------------------------------------- class Observer { private: unsigned updateLockM; // pointer to objects that it is watching std::list subjectsM; // following methods are only called from Subject friend class Subject; void addSubject(Subject* subject); void removeSubject(Subject* subject); // BE CAREFUL: if function gets called when subject is destroyed // its derived-class destructor has already been called so // you can't, for example, dynamic_cast it to MetadataItem* virtual void subjectRemoved(Subject* subject); // call doUpdate() instead of update() from Subject // to prevent recursive calls void doUpdate(); // only Subject calls it, descending classes can still override it virtual void update() = 0; public: Observer(); virtual ~Observer(); }; //----------------------------------------------------------------------------- #endif flamerobin_0.9.3~svn+2220.orig/src/core/ProcessableObject.h000066400000000000000000000030461177057155300234670ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_PROCESSABLEOBJECT_H #define FR_PROCESSABLEOBJECT_H //----------------------------------------------------------------------------- // base class for objects handled by template processors. class ProcessableObject { public: // virtual destructor makes this a polymorphic type. virtual ~ProcessableObject() {} }; //----------------------------------------------------------------------------- #endif // FR_PROCESSABLEOBJECT_H flamerobin_0.9.3~svn+2220.orig/src/core/ProgressIndicator.cpp000066400000000000000000000040661177057155300240750ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "core/ProgressIndicator.h" //----------------------------------------------------------------------------- CancelProgressException::CancelProgressException() { } //----------------------------------------------------------------------------- ProgressIndicator::~ProgressIndicator() { } //----------------------------------------------------------------------------- void checkProgressIndicatorCanceled(ProgressIndicator* progressIndicator) { if (progressIndicator && progressIndicator->isCanceled()) throw CancelProgressException(); } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/core/ProgressIndicator.h000066400000000000000000000050041177057155300235330ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ //----------------------------------------------------------------------------- #ifndef FR_PROGRESSINDICATOR_H #define FR_PROGRESSINDICATOR_H #include //----------------------------------------------------------------------------- class CancelProgressException { public: CancelProgressException(); }; //----------------------------------------------------------------------------- class ProgressIndicator { public: virtual ~ProgressIndicator(); virtual bool isCanceled() = 0; virtual void initProgress(wxString progressMsg, size_t maxPosition = 0, size_t startingPosition = 0, size_t progressLevel = 1) = 0; virtual void initProgressIndeterminate(wxString progressMsg, size_t progressLevel = 1) = 0; virtual void setProgressMessage(wxString progressMsg, size_t progressLevel = 1) = 0; virtual void setProgressPosition(size_t currentPosition, size_t progressLevel = 1) = 0; virtual void stepProgress(int stepAmount = 1, size_t progressLevel = 1) = 0; virtual void doShow() = 0; virtual void doHide() = 0; virtual void setProgressLevelCount(size_t levelCount = 1) = 0; }; //----------------------------------------------------------------------------- void checkProgressIndicatorCanceled(ProgressIndicator* progressIndicator); //----------------------------------------------------------------------------- #endif // FR_PROGRESSINDICATOR_H flamerobin_0.9.3~svn+2220.orig/src/core/StringUtils.cpp000066400000000000000000000242261177057155300227230ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include "core/FRError.h" #include "core/StringUtils.h" //----------------------------------------------------------------------------- std::string wx2std(const wxString& input, wxMBConv* conv) { if (input.empty()) return ""; if (!conv) conv = wxConvCurrent; const wxWX2MBbuf buf(input.mb_str(*conv)); // conversion may fail and return 0, which isn't a safe value to pass // to std:string constructor if (!buf) return ""; return std::string(buf); } //----------------------------------------------------------------------------- wxString std2wx(const std::string& input, wxMBConv* conv) { if (input.empty()) return wxEmptyString; if (!conv) conv = wxConvCurrent; return wxString(input.c_str(), *conv); } //----------------------------------------------------------------------------- wxString std2wxIdentifier(const std::string& input, wxMBConv* conv) { if (input.empty()) return wxEmptyString; if (!conv) conv = wxConvCurrent; // trim trailing whitespace size_t last = input.find_last_not_of(" "); return wxString(input.c_str(), *conv, (last == std::string::npos) ? std::string::npos : last + 1); } //----------------------------------------------------------------------------- wxString getHtmlCharset() { #if !wxUSE_UNICODE struct CharsetMapping { wxFontEncoding encoding; const wxChar* htmlCS; }; static const CharsetMapping mappings[] = { { wxFONTENCODING_ISO8859_1, wxT("ISO-8859-1") }, { wxFONTENCODING_ISO8859_2, wxT("ISO-8859-2") }, { wxFONTENCODING_ISO8859_3, wxT("ISO-8859-3") }, { wxFONTENCODING_ISO8859_4, wxT("ISO-8859-4") }, { wxFONTENCODING_ISO8859_5, wxT("ISO-8859-5") }, { wxFONTENCODING_ISO8859_6, wxT("ISO-8859-6") }, { wxFONTENCODING_ISO8859_7, wxT("ISO-8859-7") }, { wxFONTENCODING_ISO8859_8, wxT("ISO-8859-8") }, { wxFONTENCODING_ISO8859_9, wxT("ISO-8859-9") }, { wxFONTENCODING_ISO8859_10, wxT("ISO-8859-10") }, { wxFONTENCODING_ISO8859_11, wxT("ISO-8859-11") }, { wxFONTENCODING_ISO8859_12, wxT("ISO-8859-12") }, { wxFONTENCODING_ISO8859_13, wxT("ISO-8859-13") }, { wxFONTENCODING_ISO8859_14, wxT("ISO-8859-14") }, { wxFONTENCODING_ISO8859_15, wxT("ISO-8859-15") }, { wxFONTENCODING_CP1250, wxT("windows-1250") }, { wxFONTENCODING_CP1251, wxT("windows-1251") }, { wxFONTENCODING_CP1252, wxT("windows-1252") }, { wxFONTENCODING_CP1253, wxT("windows-1253") }, { wxFONTENCODING_CP1254, wxT("windows-1254") }, { wxFONTENCODING_CP1255, wxT("windows-1255") }, { wxFONTENCODING_CP1256, wxT("windows-1256") }, { wxFONTENCODING_CP1257, wxT("windows-1257") } }; int mappingCount = sizeof(mappings) / sizeof(CharsetMapping); wxFontEncoding enc = wxLocale::GetSystemEncoding(); for (int i = 0; i < mappingCount; i++) { if (mappings[i].encoding == enc) return mappings[i].htmlCS; } #endif return wxT("UTF-8"); } //----------------------------------------------------------------------------- wxString escapeHtmlChars(const wxString& input, bool processNewlines) { if (input.empty()) return input; wxString result; wxString::const_iterator start = input.begin(); while (start != input.end()) { wxString::const_iterator stop = start; while (stop != input.end()) { const wxChar c = *stop; if (c == '&' || c == '<' || c == '>' || c == '"' || (processNewlines && (c == '\r' || c == '\n'))) { if (stop > start) result += wxString(start, stop); if (c == '&') result += wxT("&"); else if (c == '<') result += wxT("<"); else if (c == '>') result += wxT(">"); else if (c == '"') result += wxT("""); else if (c == '\n') result += wxT("
"); else if (c == '\r') /* swallow silently */; else wxASSERT_MSG(false, wxT("escape not handled")); // start processing *after* the replaced character ++stop; start = stop; break; } ++stop; } if (stop > start) result += wxString(start, stop); start = stop; } return result; } //----------------------------------------------------------------------------- wxString escapeXmlChars(const wxString& input) { if (input.empty()) return input; wxString result; wxString::const_iterator start = input.begin(); while (start != input.end()) { wxString::const_iterator stop = start; while (stop != input.end()) { const wxChar c = *stop; if (c == '&' || c == '<' || c == '>' || c == '"') { if (stop > start) result += wxString(start, stop); if (c == '&') result += wxT("&"); else if (c == '<') result += wxT("<"); else if (c == '>') result += wxT(">"); else if (c == '"') result += wxT("""); else wxASSERT_MSG(false, wxT("escape not handled")); // start processing *after* the replaced character ++stop; start = stop; break; } ++stop; } if (stop > start) result += wxString(start, stop); start = stop; } return result; } //----------------------------------------------------------------------------- wxString wxArrayToString(const wxArrayString& arrayStr, const wxString& delimiter) { wxString result; for (wxArrayString::const_iterator it = arrayStr.begin(); it != arrayStr.end(); ++it) { if (result.IsEmpty()) result << *(it); else result << delimiter << *(it); } return result; } //----------------------------------------------------------------------------- wxString loadEntireFile(const wxFileName& filename) { if (!filename.FileExists()) { wxString msg; msg.Printf(_("The file \"%s\" does not exist."), filename.GetFullPath().c_str()); throw FRError(msg); } // read entire file into wxString buffer std::ifstream filex(wx2std(filename.GetFullPath()).c_str()); if (!filex) { wxString msg; msg.Printf(_("The file \"%s\" cannot be opened."), filename.GetFullPath().c_str()); throw FRError(msg); } std::stringstream ss; ss << filex.rdbuf(); wxString s(std2wx(ss.str())); filex.close(); return s; } //----------------------------------------------------------------------------- wxString wrapText(const wxString& text, size_t maxWidth, size_t indent) { wxString indentStr; bool eol(false); wxString wrappedText; wxString line; wxString::const_iterator lastSpace = text.end(); wxString::const_iterator lineStart = text.begin(); for (wxString::const_iterator it = lineStart; ; ++it) { if (eol) { wrappedText += wxT('\n'); if (indentStr.IsEmpty()) indentStr.Pad(indent); lastSpace = text.end(); line.clear(); lineStart = it; } eol = false; if (it == text.end() || *it == wxT('\n')) { wrappedText << indentStr << line; eol = true; if (it == text.end()) break; } else // not EOL { if (*it == wxT(' ')) lastSpace = it; line += *it; if (maxWidth >= 0 && lastSpace != text.end()) { size_t width = line.Length(); if (width > maxWidth - indentStr.Length()) { // remove the last word from this line line.erase(lastSpace - lineStart, it + 1 - lineStart); wrappedText << indentStr << line; eol = true; // go back to the last word of this line which we didn't // output yet it = lastSpace; } } // else: no wrapping at all or impossible to wrap } } return wrappedText; } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/core/StringUtils.h000066400000000000000000000066071177057155300223730ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_STRINGUTILS_H #define FR_STRINGUTILS_H //----------------------------------------------------------------------------- #include #include #include class wxMBConv; //----------------------------------------------------------------------------- std::string wx2std(const wxString& input, wxMBConv* conv = wxConvCurrent); wxString std2wx(const std::string& input, wxMBConv* conv = wxConvCurrent); wxString std2wxIdentifier(const std::string& input, wxMBConv* conv); //----------------------------------------------------------------------------- // Converts chars that have special meaning in HTML or XML, so they get // displayed. wxString escapeHtmlChars(const wxString& input, bool processNewlines = true); wxString escapeXmlChars(const wxString& input); //----------------------------------------------------------------------------- // Returns string suitable for HTML META charset tag (used only if no // conversion to UTF-8 is available, i.e. in non-Unicode build. wxString getHtmlCharset(); //----------------------------------------------------------------------------- // Standard way to confert a boolean to a string ("true"/"false"). inline wxString getBooleanAsString(bool value) { return value ? wxT("true") : wxT("false"); } // Standard way to confert a string ("true"/"false") to a boolean. inline bool getStringAsBoolean(wxString value) { return value == wxT("true") ? true : false; } //----------------------------------------------------------------------------- // Converts a wxArrayString to a delimited string of values. wxString wxArrayToString(const wxArrayString& arrayStr, const wxString& delimiter); //----------------------------------------------------------------------------- //! loads the file into wxString wxString loadEntireFile(const wxFileName& filename); //----------------------------------------------------------------------------- //! wraps into lines of maximum characters, inserting a line // break after each line. All lines after the first are also indented by // spaces. // Code adapted from wxWidgets' wxTextWrapper function. wxString wrapText(const wxString& text, size_t maxWidth, size_t indent); //----------------------------------------------------------------------------- #endif // FR_STRINGUTILS_H flamerobin_0.9.3~svn+2220.orig/src/core/Subject.cpp000066400000000000000000000134011177057155300220240ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include "core/Observer.h" #include "core/Subject.h" //----------------------------------------------------------------------------- typedef std::list ObserverList; //----------------------------------------------------------------------------- Subject::Subject() { locksCountM = 0; needsNotifyObjectsM = false; } //----------------------------------------------------------------------------- Subject::~Subject() { detachAllObservers(); } //----------------------------------------------------------------------------- void Subject::attachObserver(Observer* observer, bool callUpdate) { if (observer && observersM.end() == std::find(observersM.begin(), observersM.end(), observer)) { observer->addSubject(this); observersM.push_back(observer); if (callUpdate) observer->doUpdate(); } } //----------------------------------------------------------------------------- void Subject::detachObserver(Observer* observer) { if (!observer) return; observer->removeSubject(this); ObserverList::iterator it = find(observersM.begin(), observersM.end(), observer); if (it != observersM.end()) observersM.erase(it); } //----------------------------------------------------------------------------- void Subject::detachAllObservers() { ObserverList orig(observersM); // make sure there are no reentrancy problems // loop over the items in the original list, but ignore all observers // which have already been removed from the original list for (ObserverList::iterator it = orig.begin(); it != orig.end(); ++it) { if (isObservedBy(*it)) (*it)->removeSubject(this); } observersM.clear(); } //----------------------------------------------------------------------------- bool Subject::isObservedBy(Observer* observer) const { return observersM.end() != std::find(observersM.begin(), observersM.end(), observer); } //----------------------------------------------------------------------------- void Subject::notifyObservers() { if (isLocked()) needsNotifyObjectsM = true; else { ObserverList orig(observersM); // make sure there are no reentrancy problems // loop over the items in the original list, but ignore all observers // which have already been removed from the original list for (ObserverList::iterator it = orig.begin(); it != orig.end(); ++it) { if (isObservedBy(*it)) (*it)->doUpdate(); } needsNotifyObjectsM = false; } } //----------------------------------------------------------------------------- void Subject::lockSubject() { if (!locksCountM) lockedChanged(true); ++locksCountM; } //----------------------------------------------------------------------------- void Subject::unlockSubject() { if (isLocked()) { --locksCountM; if (!isLocked()) { lockedChanged(false); if (needsNotifyObjectsM) notifyObservers(); } } } //----------------------------------------------------------------------------- void Subject::lockedChanged(bool /*locked*/) { } //----------------------------------------------------------------------------- unsigned int Subject::getLockCount() { return locksCountM; } //----------------------------------------------------------------------------- bool Subject::isLocked() { return locksCountM > 0; } //----------------------------------------------------------------------------- SubjectLocker::SubjectLocker(Subject* subject) { subjectM = 0; setSubject(subject); } //----------------------------------------------------------------------------- SubjectLocker::~SubjectLocker() { setSubject(0); } //----------------------------------------------------------------------------- Subject* SubjectLocker::getSubject() { return subjectM; } //----------------------------------------------------------------------------- void SubjectLocker::setSubject(Subject* subject) { if (subject != subjectM) { if (subjectM) subjectM->unlockSubject(); subjectM = subject; if (subjectM) subjectM->lockSubject(); } } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/core/Subject.h000066400000000000000000000045731177057155300215030ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_SUBJECT_H #define FR_SUBJECT_H //----------------------------------------------------------------------------- #include #include class Observer; //----------------------------------------------------------------------------- class Subject { private: friend class SubjectLocker; unsigned int locksCountM; std::list observersM; bool needsNotifyObjectsM; protected: // make these protected, as instances of this class are bogus... Subject(); virtual ~Subject(); virtual void lockedChanged(bool locked); public: unsigned int getLockCount(); virtual bool isLocked(); virtual void lockSubject(); virtual void unlockSubject(); void attachObserver(Observer* observer, bool callUpdate); void detachObserver(Observer* observer); void detachAllObservers(); bool isObservedBy(Observer* observer) const; void notifyObservers(); }; //----------------------------------------------------------------------------- class SubjectLocker { private: Subject* subjectM; protected: Subject* getSubject(); void setSubject(Subject* subject); public: SubjectLocker(Subject* subject); ~SubjectLocker(); }; //----------------------------------------------------------------------------- #endif flamerobin_0.9.3~svn+2220.orig/src/core/TemplateProcessor.cpp000066400000000000000000000561531177057155300241130ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include "config/Config.h" #include "core/StringUtils.h" #include "frutils.h" #include "core/FRError.h" #include "core/ProcessableObject.h" #include "core/ProgressIndicator.h" #include "TemplateProcessor.h" //----------------------------------------------------------------------------- TemplateProcessor::TemplateProcessor(ProcessableObject* object, wxWindow* window) : objectM(object), windowM(window) { } //----------------------------------------------------------------------------- void TemplateProcessor::processCommand(const wxString& cmdName, const TemplateCmdParams& cmdParams, ProcessableObject* object, wxString& processedText) { if (cmdName == wxT("--")) // Comment. ; // {%template_root%} // Expands to the full path of the folder containing the currently // processed template, including the final path separator. // May expand to a blank string if the template being processed does // not come from a text file. else if (cmdName == wxT("template_root")) processedText += getTemplatePath(); // {%getvar:name%} // Expands to the value of the specified string variable, or a blank // string if the variable is not defined. else if (cmdName == wxT("getvar") && !cmdParams.IsEmpty()) processedText += getVar(cmdParams.all()); // {%setvar:name:value%} // Sets the value of the specified variable and expands to a blank string. // If the variable is already defined overwrites it. else if (cmdName == wxT("setvar") && !cmdParams.IsEmpty()) { if (cmdParams.Count() == 1) clearVar(cmdParams[0]); else setVar(cmdParams[0], cmdParams[1]); } // {%clearvar:name%} // Sets the value of the specified variable to a blank string. // If the variable is not defined it does nothing. // Expands to a blank string. else if (cmdName == wxT("clearvar") && !cmdParams.IsEmpty()) clearVar(cmdParams.all()); // {%clearvars%} // Sets all defined variables to blank strings. // Expands to a blank string. else if (cmdName == wxT("clearvars")) clearVars(); // {%getconf:key:default%} // Expands to the value of the specified local config key, // or a blank string if the key is not found. // The local config is associated to the template - this is // not one of FlameRobin's global config files. else if (cmdName == wxT("getconf") && !cmdParams.IsEmpty()) { wxString text; internalProcessTemplateText(text, cmdParams[0], object); wxString defValue; if (cmdParams.Count() > 1) defValue = cmdParams.from(1); processedText += configM.get(text, defValue); } // {%setconf:key:value%} // Sets the value of the specified local config key. // If the key is already defined overwrites it. // Expands to a blank string. else if (cmdName == wxT("setconf") && !cmdParams.IsEmpty()) { if (cmdParams.Count() == 1) configM.setValue(cmdParams[0], wxString(wxT(""))); else configM.setValue(cmdParams[0], cmdParams[1]); } // {%getglobalconf:key%} // Expands to the value of the specified global config key, // or a blank string if the key is not found. else if (cmdName == wxT("getglobalconf") && !cmdParams.IsEmpty()) { wxString text; internalProcessTemplateText(text, cmdParams.all(), object); processedText += config().get(text, wxString(wxT(""))); } // {%abort%} // Throws a silent exception, interrupting the processing. // Expands to a blank string. else if (cmdName == wxT("abort")) throw FRAbort(); // {%parent_window%} // Expands to the current window's numeric memory address. // Used to call FR's commands through URIs. else if (cmdName == wxT("parent_window")) processedText += wxString::Format(wxT("%ld"), (uintptr_t)windowM); // {%colon%} else if (cmdName == wxT("colon")) processedText += wxT(":"); // {%if::[:]%} // If equals true expands to , otherwise // expands to (or an empty string). else if (cmdName == wxT("if") && (cmdParams.Count() >= 2)) { wxString val; internalProcessTemplateText(val, cmdParams[0], object); wxString trueText; internalProcessTemplateText(trueText, cmdParams[1], object); wxString falseText; if (cmdParams.Count() >= 3) internalProcessTemplateText(falseText, cmdParams.from(2), object); if (getStringAsBoolean(val)) processedText += trueText; else processedText += falseText; } // {%ifeq:::[:]%} // If equals expands to , otherwise // expands to (or an empty string). else if (cmdName == wxT("ifeq") && (cmdParams.Count() >= 3)) { wxString val1; internalProcessTemplateText(val1, cmdParams[0], object); wxString val2; internalProcessTemplateText(val2, cmdParams[1], object); wxString trueText; internalProcessTemplateText(trueText, cmdParams[2], object); wxString falseText; if (cmdParams.Count() >= 4) internalProcessTemplateText(falseText, cmdParams.from(3), object); if (val1 == val2) processedText += trueText; else processedText += falseText; } // {%!:%} or {%not:%} // If equals "true" returns "false"; // if equals "false" returns "true"; // otherwise returns . // Always expands the argument before evaluating it. else if ((cmdName == wxT("!") || (cmdName == wxT("not"))) && (cmdParams.Count())) { wxString input; internalProcessTemplateText(input, cmdParams[0], object); if (input == getBooleanAsString(true)) processedText += getBooleanAsString(false); else if (input == getBooleanAsString(false)) processedText += getBooleanAsString(true); else processedText += input; } // {%ifcontains:::[:]%} // If contains expands to , otherwise // expands to (or an empty string). // is a list of comma-separated values. else if (cmdName == wxT("ifcontains") && (cmdParams.Count() >= 3)) { wxString listStr; internalProcessTemplateText(listStr, cmdParams[0], object); wxArrayString list(wxStringTokenize(listStr, wxT(","))); for (wxString::size_type i = 0; i < list.Count(); i++) list[i] = list[i].Trim(true).Trim(false); wxString val2; internalProcessTemplateText(val2, cmdParams[1], object); wxString trueText; internalProcessTemplateText(trueText, cmdParams[2], object); wxString falseText; if (cmdParams.Count() >= 4) internalProcessTemplateText(falseText, cmdParams.from(3), object); if (list.Index(val2) != wxNOT_FOUND) processedText += trueText; else processedText += falseText; } // {%forall:::%} // Repeats once for each string in , pasting a // before each item except the first. // is a list of comma-separated values. // Inside use the placeholder %%current_value%% to // mean the current string in the list. else if (cmdName == wxT("forall") && (cmdParams.Count() >= 3)) { wxString listStr; internalProcessTemplateText(listStr, cmdParams[0], object); wxArrayString list(wxStringTokenize(listStr, wxT(","))); for (wxString::size_type i = 0; i < list.Count(); i++) list[i] = list[i].Trim(true).Trim(false); wxString separator; internalProcessTemplateText(separator, cmdParams[1], object); bool firstItem = true; for (wxArrayString::iterator it = list.begin(); it != list.end(); ++it) { wxString param = cmdParams.from(2); // Try to replace %%current_value%% both before and after expansion. param.Replace(wxT("%%current_value%%"), *(it)); wxString newText; internalProcessTemplateText(newText, param, object); newText.Replace(wxT("%%current_value%%"), *(it)); if ((!firstItem) && (!newText.IsEmpty())) processedText += escapeChars(separator); if (!newText.IsEmpty()) firstItem = false; processedText += newText; } } // {%countall:%} // Expands to the number of strings in . // is a list of comma-separated values. else if (cmdName == wxT("countall") && (cmdParams.Count() >= 1)) { wxString listStr; internalProcessTemplateText(listStr, cmdParams.all(), object); wxArrayString list(wxStringTokenize(listStr, wxT(","))); processedText << list.Count(); } // {%alternate::%} // Alternates expanding to and at each call, // starting with . // Used to alternate table row colours, for example. else if (cmdName == wxT("alternate") && (cmdParams.Count() >= 2)) { static bool first = false; first = !first; if (first) processedText += cmdParams[0]; else processedText += cmdParams[1]; } // {%substr:::%} // Extracts a substring of characters from // starting at character . // defaults to 0. defaults to 's length minus 1. else if (cmdName == wxT("substr") && (cmdParams.Count() >= 3)) { wxString text; internalProcessTemplateText(text, cmdParams[0], object); wxString from; internalProcessTemplateText(from, cmdParams[1], object); long fromI; if (!from.ToLong(&fromI)) fromI = 0; wxString for_; internalProcessTemplateText(for_, cmdParams.from(2), object); long forI; if (!for_.ToLong(&forI)) forI = text.Length() - 1; processedText += text.SubString(fromI, fromI + forI - 1); } // {%uppercase:%} // Converts to upper case. else if (cmdName == wxT("uppercase") && (cmdParams.Count() >= 1)) { wxString text; internalProcessTemplateText(text, cmdParams.all(), object); processedText += text.Upper(); } // {%lowercase:%} // Converts to lower case. else if (cmdName == wxT("lowercase") && (cmdParams.Count() >= 1)) { wxString text; internalProcessTemplateText(text, cmdParams.all(), object); processedText += text.Lower(); } // {%wrap:[:[:]]%} // Wraps to lines fo maximum chars, indenting all // resulting lines after the first one by chars. // defaults to config item sqlEditorEdgeColumn, or 80. // defaults to config item sqlEditorTabSize, or 4. else if (cmdName == wxT("wrap") && (cmdParams.Count() >= 1)) { wxString text; internalProcessTemplateText(text, cmdParams[0], object); long widthI; if (cmdParams.Count() >= 2) { wxString width; internalProcessTemplateText(width, cmdParams[1], object); if (!width.ToLong(&widthI)) widthI = config().get(wxT("sqlEditorEdgeColumn"), 80); } else widthI = config().get(wxT("sqlEditorEdgeColumn"), 80); long indentI; if (cmdParams.Count() >= 3) { wxString indent; internalProcessTemplateText(indent, cmdParams[2], object); if (!indent.ToLong(&indentI)) indentI = config().get(wxT("sqlEditorTabSize"), 4); } else indentI = config().get(wxT("sqlEditorTabSize"), 4); processedText += wrapText(text, widthI, indentI); } // {%kw:%} // Formats as a keyword (upper or lower case) // according to config item SQLKeywordsUpperCase. else if (cmdName == wxT("kw") && (cmdParams.Count() >= 1)) { wxString text; internalProcessTemplateText(text, cmdParams.all(), object); if (config().get(wxT("SQLKeywordsUpperCase"), true)) processedText += text.Upper(); else processedText += text.Lower(); } // {%tab%} // Expands to a number of spaces defined by config item // sqlEditorTabSize. else if (cmdName == wxT("tab")) { wxString tab; processedText += tab.Pad(config().get(wxT("sqlEditorTabSize"), 4)); } // Only if no internal commands are recognized, call external command handlers. else { getTemplateCmdHandlerRepository().handleTemplateCmd(this, cmdName, cmdParams, object, processedText); } } //----------------------------------------------------------------------------- void TemplateProcessor::internalProcessTemplateText(wxString& processedText, const wxString& inputText, ProcessableObject* object) { if (object == 0) object = objectM; // parse commands wxString::size_type pos = 0, oldpos = 0, endpos = 0; while (true) { pos = inputText.find(wxT("{%"), pos); if (pos == wxString::npos) { processedText += inputText.substr(oldpos); break; } wxString::size_type check, startpos = pos; int cnt = 1; while (cnt > 0) { endpos = inputText.find(wxT("%}"), startpos+1); if (endpos == wxString::npos) break; check = inputText.find(wxT("{%"), startpos+1); if (check == wxString::npos) startpos = endpos; else { startpos = (check < endpos ? check : endpos); if (startpos == check) cnt++; } if (startpos == endpos) cnt--; startpos++; } if (cnt > 0) // no matching closing %} break; processedText += inputText.substr(oldpos, pos - oldpos); wxString cmd = inputText.substr(pos + 2, endpos - pos - 2); // 2 = start_marker_len = end_marker_len // parse command name and params. wxString cmdName; TemplateCmdParams cmdParams; enum TemplateCmdState { inText, inString1, inString2 }; TemplateCmdState state = inText; wxString buffer; unsigned int nestLevel = 0; for (wxString::size_type i = 0; i < cmd.Length(); i++) { wxChar c = cmd[i]; if (c == wxT(':')) { if ((nestLevel == 0) && (state == inText)) { cmdParams.Add(buffer); buffer.Clear(); continue; } } buffer += c; if ((c == wxT('{')) && (i < cmd.Length() - 1) && (cmd[i + 1] == wxT('%'))) nestLevel++; else if ((c == wxT('}')) && (i > 0) && (cmd[i - 1] == wxT('%'))) nestLevel--; else if (c == wxT('\'')) state == inString1 ? state = inText : state = inString1; else if (c == wxT('"')) state == inString2 ? state = inText : state = inString2; } if (buffer.Length() > 0) cmdParams.Add(buffer); if (cmdParams.Count() > 0) { cmdName = cmdParams[0]; cmdParams.RemoveAt(0); if (!cmdName.IsEmpty()) processCommand(cmdName, cmdParams, object, processedText); } oldpos = pos = endpos + 2; } } //----------------------------------------------------------------------------- void TemplateProcessor::processTemplateFile(wxString& processedText, const wxFileName& inputFileName, ProcessableObject* object, ProgressIndicator* progressIndicator) { fileNameM = inputFileName; wxFileName infoFileName(inputFileName); infoFileName.SetExt(wxT("info")); infoM.setConfigFileName(infoFileName); // put settings file in user writable directory wxString confFileNameStr(inputFileName.GetFullPath()); confFileNameStr.Replace(config().getHomePath(), config().getUserHomePath(), false); wxFileName confFileName(confFileNameStr); confFileName.SetExt(wxT("conf")); configM.setConfigFileName(confFileName); progressIndicatorM = progressIndicator; internalProcessTemplateText(processedText, loadEntireFile(fileNameM), object); } //----------------------------------------------------------------------------- void TemplateProcessor::processTemplateText(wxString& processedText, const wxString& inputText, ProcessableObject* object, ProgressIndicator* progressIndicator) { fileNameM.Clear(); configM.setConfigFileName(wxFileName(wxEmptyString)); progressIndicatorM = progressIndicator; internalProcessTemplateText(processedText, inputText, object); } //----------------------------------------------------------------------------- void TemplateProcessor::setVar(const wxString& varName, const wxString& varValue) { varsM[varName] = varValue; } //----------------------------------------------------------------------------- const wxString& TemplateProcessor::getVar(const wxString& varName) { return varsM[varName]; } //----------------------------------------------------------------------------- void TemplateProcessor::clearVar(const wxString& varName) { varsM.erase(varName); } //----------------------------------------------------------------------------- void TemplateProcessor::clearVars() { varsM.clear(); } //----------------------------------------------------------------------------- wxString TemplateProcessor::getTemplatePath() { return fileNameM.GetPathWithSep(); } //----------------------------------------------------------------------------- wxString TemplateCmdParams::all() const { return from(0); } //----------------------------------------------------------------------------- wxString TemplateCmdParams::from(size_t start) const { wxString result; if (start < Count()) { result = Item(start); for (size_t i = start + 1; i < Count(); i++) result += wxT(':') + Item(i); } return result; } //----------------------------------------------------------------------------- TemplateCmdHandlerRepository& getTemplateCmdHandlerRepository() { static TemplateCmdHandlerRepository repository; return repository; } //----------------------------------------------------------------------------- //! needed to disallow instantiation TemplateCmdHandlerRepository::TemplateCmdHandlerRepository() : handlerListSortedM(false) { } //----------------------------------------------------------------------------- TemplateCmdHandlerRepository::~TemplateCmdHandlerRepository() { while (!handlersM.empty()) removeHandler(handlersM.front()); } //----------------------------------------------------------------------------- //! needed in checkHandlerListSorted() to sort on objects instead of pointers bool templateCmdHandlerPointerLT(const TemplateCmdHandler* left, const TemplateCmdHandler* right) { return *left < *right; } //----------------------------------------------------------------------------- void TemplateCmdHandlerRepository::checkHandlerListSorted() { if (!handlerListSortedM) { handlersM.sort(templateCmdHandlerPointerLT); handlerListSortedM = true; } } //----------------------------------------------------------------------------- //! returns false if no suitable handler found void TemplateCmdHandlerRepository::handleTemplateCmd(TemplateProcessor *tp, const wxString& cmdName, const TemplateCmdParams& cmdParams, ProcessableObject* object, wxString& processedText) { checkHandlerListSorted(); for (std::list::iterator it = handlersM.begin(); it != handlersM.end(); ++it) { (*it)->handleTemplateCmd(tp, cmdName, cmdParams, object, processedText); } } //----------------------------------------------------------------------------- void TemplateCmdHandlerRepository::addHandler(TemplateCmdHandler* handler) { // can't do ordered insert here, since the getPosition() function that // serves TemplateCmdHandler::operator< is virtual, and this function (addHandler) // is called in the constructor of TemplateCmdHandler. // The list will be sorted on demand (see checkHandlerListSorted()). handlersM.push_back(handler); handler->setRepository(this); handlerListSortedM = false; } //----------------------------------------------------------------------------- void TemplateCmdHandlerRepository::removeHandler(TemplateCmdHandler* handler) { handlersM.erase(std::find(handlersM.begin(), handlersM.end(), handler)); handler->setRepository(0); } //----------------------------------------------------------------------------- TemplateCmdHandler::TemplateCmdHandler() : repositoryM(0) { getTemplateCmdHandlerRepository().addHandler(this); } //----------------------------------------------------------------------------- void TemplateCmdHandler::setRepository(TemplateCmdHandlerRepository* const repository) { repositoryM = repository; } //----------------------------------------------------------------------------- //! this is currently only called on program termination TemplateCmdHandler::~TemplateCmdHandler() { if (repositoryM) repositoryM->removeHandler(this); } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/core/TemplateProcessor.h000066400000000000000000000163771177057155300235640ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ //----------------------------------------------------------------------------- #ifndef FR_TEMPLATEPROCESSOR_H #define FR_TEMPLATEPROCESSOR_H #include #include #include #include #include "config/Config.h" #include "core/ProcessableObject.h" #include "core/ProgressIndicator.h" //----------------------------------------------------------------------------- class TemplateCmdParams: public wxArrayString { public: // returns all params concatenated with the default separator. wxString all() const; // returns all params from start, concatenated with the default separator. wxString from(size_t start) const; }; //----------------------------------------------------------------------------- typedef std::map wxStringMap; //----------------------------------------------------------------------------- class TemplateCmdHandler; //----------------------------------------------------------------------------- class TemplateProcessor { private: ProcessableObject* objectM; bool flagNextM; wxFileName fileNameM; wxStringMap varsM; ProgressIndicator* progressIndicatorM; Config configM; Config infoM; wxWindow* windowM; protected: TemplateProcessor(ProcessableObject* object, wxWindow* window); // Processes a command found in template text virtual void processCommand(const wxString& cmdName, const TemplateCmdParams& cmdParams, ProcessableObject* object, wxString& processedText); // Returns the loaded file's path, including the trailing separator. wxString getTemplatePath(); public: wxWindow* getWindow() { return windowM; }; // Returns a reference to the current progress indicator, so that // external command handlers can use it. ProgressIndicator* getProgressIndicator() { return progressIndicatorM; }; // Processes all known commands found in template text // commands are in format: {%cmdName:cmdParams%} // cmdParams field may be empty, in which case the format is {%cmdName*} void processTemplateText(wxString& processedText, const wxString& inputText, ProcessableObject* object, ProgressIndicator* progressIndicator = 0); // Loads the contents of the specified file and calls internalProcessTemplateText(). void processTemplateFile(wxString& processedText, const wxFileName& inputFileName, ProcessableObject* object, ProgressIndicator* progressIndicator = 0); // Sets a variable value. If the variable already exists it is overwritten. // To clear a variable, set it to an empty string. void setVar(const wxString& varName, const wxString& varValue); // Gets a variable value. If the variable doesn't exist, an empty string is returned. const wxString& getVar(const wxString& varName); // Clears the specified variable. void clearVar(const wxString& varName); // Clears all variables. void clearVars(); // The internal config object, used to store user-supplied parameters in // interactive templates. Config& getConfig() { return configM; } // The template info config object, used to store template metadata such as // title, position in menu, etc. Config& getInfo() { return infoM; } // Name of the current template file if processTemplateFile() has been called. wxFileName getCurrentTemplateFileName() { return fileNameM; } // Processes all commands without resetting fileNameM. Should be used // internally and from command handlers, while processTemplateText() // is for external use. void internalProcessTemplateText(wxString& processedText, const wxString& inputText, ProcessableObject* object); // Processor-specific way of escaping special chars virtual wxString escapeChars(const wxString& input, bool processNewlines = true) = 0; }; //----------------------------------------------------------------------------- class TemplateCmdHandlerRepository { public: // interface for handler providers. void addHandler(TemplateCmdHandler* handler); void removeHandler(TemplateCmdHandler* handler); // interface for consumers. void handleTemplateCmd(TemplateProcessor* tp, const wxString& cmdName, const TemplateCmdParams& cmdParams, ProcessableObject* object, wxString& processedText); virtual ~TemplateCmdHandlerRepository(); private: std::list handlersM; bool handlerListSortedM; void checkHandlerListSorted(); // only getTemplateCmdHandlerRepository() may instantiate an object of this class. friend TemplateCmdHandlerRepository& getTemplateCmdHandlerRepository(); // Disable construction, copy-construction and assignment. TemplateCmdHandlerRepository(); TemplateCmdHandlerRepository(const TemplateCmdHandlerRepository&) {}; TemplateCmdHandlerRepository operator==(const TemplateCmdHandlerRepository&); }; //----------------------------------------------------------------------------- //!singleton instance of the command handler repository. TemplateCmdHandlerRepository& getTemplateCmdHandlerRepository(); //----------------------------------------------------------------------------- // Pure virtual class, specific handlers should be derived from it class TemplateCmdHandler { friend class TemplateCmdHandlerRepository; public: TemplateCmdHandler(); virtual ~TemplateCmdHandler(); virtual void handleTemplateCmd(TemplateProcessor* tp, const wxString& cmdName, const TemplateCmdParams& cmdParams, ProcessableObject* object, wxString& processedText) = 0; bool operator<(const TemplateCmdHandler& right) const { return getPosition() < right.getPosition(); } protected: virtual int getPosition() const { // By default all handlers are walked in undefined order; override this // function to force a handler to be processed earlier (return a lower // number) or later (return a higher number). return 1024; } private: TemplateCmdHandlerRepository* repositoryM; void setRepository(TemplateCmdHandlerRepository* const repository); }; //----------------------------------------------------------------------------- #endif // FR_TEMPLATEPROCESSOR_H flamerobin_0.9.3~svn+2220.orig/src/core/URIProcessor.cpp000066400000000000000000000137451177057155300227770ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif //----------------------------------------------------------------------------- #include #include #include "core/URIProcessor.h" //----------------------------------------------------------------------------- URI::URI() { } //----------------------------------------------------------------------------- URI::URI(const wxString& uri) { parseURI(uri); } //----------------------------------------------------------------------------- //! pair has format: name=value void URI::addParam(const wxString& pair) { wxString::size_type p = pair.find(wxT("=")); if (p == wxString::npos) params[pair] = wxT(""); else params[pair.substr(0, p)] = pair.substr(p + 1); } //----------------------------------------------------------------------------- wxString URI::getParam(const wxString& name) const { std::map::const_iterator it = params.find(name); if (it == params.end()) return wxT(""); else return (*it).second; } //----------------------------------------------------------------------------- bool URI::parseURI(const wxString& uri) { wxString::size_type p = uri.find(wxT("://")); // find :// if (p == wxString::npos) return false; protocol = uri.substr(0, p); wxString::size_type p2 = uri.find(wxT("?"), p); // ? if (p2 == wxString::npos) { action = uri.substr(p + 3); params.clear(); return true; } action = uri.substr(p + 3, p2 - p - 3); wxString par = uri.substr(p2 + 1); while (true) { p = par.find(wxT("&")); if (p == wxString::npos) { addParam(par); break; } addParam(par.substr(0, p)); par.erase(0, p + 1); } return true; } //----------------------------------------------------------------------------- URIProcessor& getURIProcessor() { static URIProcessor uriProcessor; return uriProcessor; } //----------------------------------------------------------------------------- //! needed to disallow instantiation URIProcessor::URIProcessor() : handlerListSortedM(false) { } //----------------------------------------------------------------------------- URIProcessor::~URIProcessor() { while (!handlersM.empty()) removeHandler(handlersM.front()); } //----------------------------------------------------------------------------- //! needed in checkHandlerListSorted() to sort on objects instead of pointers bool uriHandlerPointerLT(const URIHandler* left, const URIHandler* right) { return *left < *right; } //----------------------------------------------------------------------------- void URIProcessor::checkHandlerListSorted() { if (!handlerListSortedM) { handlersM.sort(uriHandlerPointerLT); handlerListSortedM = true; } } //----------------------------------------------------------------------------- //! returns false if no suitable handler found bool URIProcessor::handleURI(URI& uri) { checkHandlerListSorted(); for (std::list::iterator it = handlersM.begin(); it != handlersM.end(); ++it) if ((*it)->handleURI(uri)) return true; return false; } //----------------------------------------------------------------------------- void URIProcessor::addHandler(URIHandler* handler) { // can't do ordered insert here, since the getPosition() function that // serves URIHandler::operator< is virtual, and this function (addHandler) // is called in the constructor of URIHandler. // The list will be sorted on demand (see checkHandlerListSorted()). handlersM.push_back(handler); handler->setProcessor(this); handlerListSortedM = false; } //----------------------------------------------------------------------------- void URIProcessor::removeHandler(URIHandler* handler) { handlersM.erase(std::find(handlersM.begin(), handlersM.end(), handler)); handler->setProcessor(0); } //----------------------------------------------------------------------------- URIHandler::URIHandler() : processorM(0) { getURIProcessor().addHandler(this); } //----------------------------------------------------------------------------- void URIHandler::setProcessor(URIProcessor* const processor) { processorM = processor; } //----------------------------------------------------------------------------- //! this is currently only called on program termination URIHandler::~URIHandler() { if (processorM) processorM->removeHandler(this); } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/core/URIProcessor.h000066400000000000000000000071661177057155300224440ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_URIPROCESSOR_H #define FR_URIPROCESSOR_H #include #include //----------------------------------------------------------------------------- class URI { public: wxString protocol; wxString action; std::map params; URI(); URI(const wxString& uri); bool parseURI(const wxString& uri); void addParam(const wxString& pair); wxString getParam(const wxString& name) const; }; //----------------------------------------------------------------------------- class URIHandler; //----------------------------------------------------------------------------- class URIProcessor { public: // interface for handler providers. void addHandler(URIHandler *handler); void removeHandler(URIHandler *handler); // interface for consumers. bool handleURI(URI& uri); virtual ~URIProcessor(); private: std::list handlersM; bool handlerListSortedM; void checkHandlerListSorted(); // only getURIProcessor() may instantiate an object of this class. friend URIProcessor& getURIProcessor(); // Disable construction, copy-construction and assignment. URIProcessor(); URIProcessor(const URIProcessor&) {}; URIProcessor operator==(const URIProcessor&); }; //----------------------------------------------------------------------------- URIProcessor& getURIProcessor(); //----------------------------------------------------------------------------- //! pure virtual class, specific handlers should be derived from it class URIHandler { friend class URIProcessor; public: URIHandler(); virtual ~URIHandler(); virtual bool handleURI(URI& uri) = 0; bool operator<(const URIHandler& right) const { return getPosition() < right.getPosition(); } protected: virtual int getPosition() const { /* By default all handlers are walked in undefined order; override this function to force a handler to be processed earlier (return a lower number) or later (return a higher number). By convention, use numbers below 1024 for pseudo-handlers (handlers that may change the URI and generally must act before real handlers) and higher numbers for the others. Examples of pseudo-handlers are macro-substitutors and loggers. */ return 1024; } private: URIProcessor* processorM; void setProcessor(URIProcessor* const processor); }; //----------------------------------------------------------------------------- #endif // FR_URIPROCESSOR_H flamerobin_0.9.3~svn+2220.orig/src/core/Visitor.cpp000066400000000000000000000032211177057155300220630ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "Visitor.h" //----------------------------------------------------------------------------- void Visitor::defaultAction() { } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/core/Visitor.h000066400000000000000000000030761177057155300215400ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ //----------------------------------------------------------------------------- #ifndef FR_VISITOR_H #define FR_VISITOR_H // [GoF] Visitor pattern. Abstract generic Visitor. //----------------------------------------------------------------------------- class Visitor { protected: Visitor() {}; virtual ~Visitor() {}; virtual void defaultAction(); }; //----------------------------------------------------------------------------- #endif //FR_VISITOR_H flamerobin_0.9.3~svn+2220.orig/src/databasehandler.cpp000066400000000000000000000134041177057155300226020ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "core/StringUtils.h" #include "core/URIProcessor.h" #include "gui/GUIURIHandlerHelper.h" #include "metadata/server.h" #include "metadata/database.h" #include "metadata/MetadataItemURIHandlerHelper.h" //----------------------------------------------------------------------------- class DatabaseInfoHandler: public URIHandler, private MetadataItemURIHandlerHelper, private GUIURIHandlerHelper { public: DatabaseInfoHandler() {}; bool handleURI(URI& uri); private: // singleton; registers itself on creation. static const DatabaseInfoHandler handlerInstance; }; //----------------------------------------------------------------------------- const DatabaseInfoHandler DatabaseInfoHandler::handlerInstance; //----------------------------------------------------------------------------- bool DatabaseInfoHandler::handleURI(URI& uri) { bool isEditSweep, isEditForcedWrites, isEditReserve, isEditReadOnly, isEditPageBuffers; isEditSweep = (uri.action == wxT("edit_db_sweep_interval")); isEditForcedWrites = (uri.action == wxT("edit_db_forced_writes")); isEditReserve = (uri.action == wxT("edit_db_reserve_space")); isEditReadOnly = (uri.action == wxT("edit_db_read_only")); isEditPageBuffers = (uri.action == wxT("edit_db_page_buffers")); if (!isEditSweep && !isEditForcedWrites && !isEditReserve && !isEditReadOnly && !isEditPageBuffers) { return false; } DatabasePtr d = extractMetadataItemPtrFromURI(uri); wxWindow* w = getParentWindow(uri); // when either the database or the window does not exist // return immediately. Because this function returns whether // the specified uri is handled, return true. if (!d || !w || !d->isConnected()) return true; IBPP::Database& db = d->getIBPPDatabase(); IBPP::Service svc = IBPP::ServiceFactory( wx2std(d->getServer()->getConnectionString()), db->Username(), db->UserPassword()); svc->Connect(); if (isEditSweep || isEditPageBuffers) { long oldValue = 0; wxString title, label; if (isEditSweep) { oldValue = d->getInfo().getSweep(); title = _("Enter the new Sweep Interval"); label = _("Sweep Interval"); } else if (isEditPageBuffers) { oldValue = d->getInfo().getBuffers(); title = _("Enter the new value for Page Buffers"); label = _("Page Buffers"); } while (true) { wxString s; long value = oldValue; s = ::wxGetTextFromUser(title, label, wxString::Format(wxT("%d"), value), w); // return from the iteration when the entered string is empty, in // case of cancelling the operation. if (s.IsEmpty()) break; if (!s.ToLong(&value)) continue; // return from the iteration when the interval has not changed if (value == oldValue) break; if (isEditSweep) svc->SetSweepInterval(wx2std(d->getPath()), value); else if (isEditPageBuffers) svc->SetPageBuffers(wx2std(d->getPath()), value); // Before reloading the info, re-attach to the database // otherwise the sweep interval won't be changed for FB Classic // Server. db->Disconnect(); db->Connect(); d->loadInfo(); break; } } else if (isEditForcedWrites || isEditReserve || isEditReadOnly) { bool fw = !d->getInfo().getForcedWrites(); bool reserve = !d->getInfo().getReserve(); bool ro = !d->getInfo().getReadOnly(); // setting these properties requires that the database is // disconnected. db->Disconnect(); if (isEditForcedWrites) svc->SetSyncWrite(wx2std(d->getPath()), fw); if (isEditReserve) svc->SetReserveSpace(wx2std(d->getPath()), reserve); if (isEditReadOnly) svc->SetReadOnly(wx2std(d->getPath()), ro); db->Connect(); // load the database info because the info values are changed. d->loadInfo(); } svc->Disconnect(); return true; } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/engine/000077500000000000000000000000001177057155300202375ustar00rootroot00000000000000flamerobin_0.9.3~svn+2220.orig/src/engine/MetadataLoader.cpp000066400000000000000000000131301177057155300236100ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "engine/MetadataLoader.h" #include "metadata/database.h" //----------------------------------------------------------------------------- MetadataLoader::MetadataLoader(Database& database, unsigned maxStatements) : databaseM(database.getIBPPDatabase()), transactionM(), transactionLevelM(0), statementsM(), maxStatementsM(maxStatements) { } //----------------------------------------------------------------------------- void MetadataLoader::transactionStart() { ++transactionLevelM; // fix the IBPP::LogicException "No Database is attached." // which happens after a database reconnect // (this action detaches the database from all its transactions) if (transactionM != 0 && !transactionM->Started()) { try { transactionM->Start(); } catch (IBPP::LogicException&) { transactionM = 0; } } if (transactionM == 0) transactionM = IBPP::TransactionFactory(databaseM, IBPP::amRead); if (!transactionM->Started()) transactionM->Start(); } //----------------------------------------------------------------------------- void MetadataLoader::transactionCommit() { if (--transactionLevelM == 0 && transactionM != 0) { statementsM.clear(); transactionM->Commit(); transactionM = 0; } } //----------------------------------------------------------------------------- bool MetadataLoader::transactionStarted() { return (transactionM != 0 && transactionM->Started()); } //----------------------------------------------------------------------------- IBPP::Statement MetadataLoader::createStatement(const std::string& sql) { wxASSERT(transactionStarted()); return IBPP::StatementFactory(databaseM, transactionM, sql); } //----------------------------------------------------------------------------- MetadataLoader::IBPPStatementListIterator MetadataLoader::findStatement( const std::string& sql) { for (IBPPStatementListIterator it = statementsM.begin(); it != statementsM.end(); ++it) { if ((*it)->Sql() == sql) return it; } return statementsM.end(); } //----------------------------------------------------------------------------- IBPP::Statement& MetadataLoader::getStatement(const std::string& sql) { wxASSERT(transactionStarted()); IBPP::Statement stmt; IBPPStatementListIterator it = findStatement(sql); if (it != statementsM.end()) { stmt = (*it); statementsM.erase(it); } else { stmt = IBPP::StatementFactory(databaseM, transactionM, sql); } statementsM.push_front(stmt); limitListSize(); return statementsM.front(); } //----------------------------------------------------------------------------- void MetadataLoader::limitListSize() { if (maxStatementsM) { while (statementsM.size() > maxStatementsM) statementsM.remove(statementsM.back()); } } //----------------------------------------------------------------------------- void MetadataLoader::releaseStatements() { statementsM.clear(); if (transactionM != 0 && transactionM->Started()) { transactionM->Commit(); transactionLevelM = 0; } } //----------------------------------------------------------------------------- void MetadataLoader::setMaximumConcurrentStatements(unsigned count) { if (maxStatementsM != count) { maxStatementsM = count; limitListSize(); } } //----------------------------------------------------------------------------- IBPP::Blob MetadataLoader::createBlob() { wxASSERT(transactionStarted()); return IBPP::BlobFactory(databaseM, transactionM); } //----------------------------------------------------------------------------- MetadataLoaderTransaction::MetadataLoaderTransaction(MetadataLoader* loader) : loaderM(loader) { if (loaderM) loaderM->transactionStart(); } //----------------------------------------------------------------------------- MetadataLoaderTransaction::~MetadataLoaderTransaction() { if (loaderM) loaderM->transactionCommit(); } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/engine/MetadataLoader.h000066400000000000000000000113001177057155300232520ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_METADATALOADER_H #define FR_METADATALOADER_H //----------------------------------------------------------------------------- #include #include #include class Database; class MetadataLoaderTransaction; //----------------------------------------------------------------------------- class MetadataLoader { private: typedef std::list IBPPStatementList; typedef std::list::iterator IBPPStatementListIterator; friend class MetadataLoaderTransaction; IBPP::Database databaseM; IBPP::Transaction transactionM; unsigned transactionLevelM; std::list statementsM; unsigned maxStatementsM; // Returns an iterator to the prepared IBPP::Statement object // for the sql statement if available, else returns statementsM.end(). IBPPStatementListIterator findStatement(const std::string& sql); // Releases any assigned statement objects beyond the list size limit. void limitListSize(); // A read-only transaction is used to read metadata from the database. // The first call of transactionStart() starts the transaction, further // calls only increment transactionLevelM. Calls to transactionCommit() // decrease transactionLevelM, when it reaches 0 the transaction itself // is committed. // Methods are private, use of MetadataLoaderTransaction class is // exception-safe and allows for proper synchronization with locks // on metadata items (first unlock the object, then commit transaction) void transactionStart(); void transactionCommit(); bool transactionStarted(); public: // Creates MetadataLoader object for the database, which will use // a maximum of maxStatements assigned IBPP::Statement objects to // improve load times of metadata items. // Setting the parameter maxStatements to 0 will disable the size limit // of the statementsM list, and could possibly consume a lot of the // available server ressources! MetadataLoader(Database& database, unsigned maxStatements = 1); // Creates a prepared IBPP::Statement object for the sql statement. // Should be used in cases where sql is unique and can not be reused, // but should still use the same transaction. This way the cached // statements will not be replaced. IBPP::Statement createStatement(const std::string& sql); // returns a reference to a prepared IBPP::Statement object for the // sql statement, either recycled, newly created, or newly prepared // using the least recently used IBPP::Statement in statementsM IBPP::Statement& getStatement(const std::string& sql); // releases any assigned IBPP::Statement objects while keeping the maximum // number of objects untouched void releaseStatements(); // readjusts maximum number of IBPP::Statement objects in statementsM, // releasing any assigned statement objects beyond the new limit // setting the parameter count to 0 will disable the size limit of the // statementsM list, and could possibly consume a lot of the available // server ressources! void setMaximumConcurrentStatements(unsigned count); // Creates an IBPP::Blob object using the database and transaction IBPP::Blob createBlob(); }; //----------------------------------------------------------------------------- class MetadataLoaderTransaction { private: MetadataLoader* loaderM; public: MetadataLoaderTransaction(MetadataLoader* loader); ~MetadataLoaderTransaction(); }; //----------------------------------------------------------------------------- #endif //FR_METADATALOADER_H flamerobin_0.9.3~svn+2220.orig/src/frprec.cpp000066400000000000000000000030121177057155300207530ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/frutils.cpp000066400000000000000000000167551177057155300212040ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include "core/StringUtils.h" #include "frutils.h" #include "gui/ProgressDialog.h" #include "gui/UsernamePasswordDialog.h" #include "metadata/column.h" #include "metadata/relation.h" #include "metadata/server.h" //----------------------------------------------------------------------------- void adjustControlsMinWidth(std::list controls) { int w = 0; wxSize sz; // find widest control for (std::list::iterator it = controls.begin(); it != controls.end(); ++it) { wxASSERT(*it != 0); sz = (*it)->GetSize(); w = std::max(w, sz.GetWidth()); } // set minimum width of all controls for (std::list::iterator it = controls.begin(); it != controls.end(); ++it) { sz = (*it)->GetSize(); (*it)->SetSize(w, sz.GetHeight()); (*it)->SetSizeHints(w, sz.GetHeight()); } } //----------------------------------------------------------------------------- void readBlob(IBPP::Statement& st, int column, wxString& result, wxMBConv* conv) { result = wxT(""); if (st->IsNull(column)) return; IBPP::Blob b = IBPP::BlobFactory(st->DatabasePtr(), st->TransactionPtr()); st->Get(column, b); try // if blob is empty the exception is thrown { // I tried to check st1->IsNull(1) but it doesn't work b->Open(); // to this hack is the only way (for the time being) } catch (...) { return; } std::string resultBuffer; char readBuffer[8192]; // 8K block while (true) { int size = b->Read(readBuffer, 8192); if (size <= 0) break; readBuffer[size] = 0; resultBuffer += readBuffer; } result = std2wx(resultBuffer, conv); b->Close(); } //----------------------------------------------------------------------------- wxString selectRelationColumns(Relation* t, wxWindow* parent) { std::vector list; if (!selectRelationColumnsIntoVector(t, parent, list)) return wxEmptyString; std::vector::iterator it = list.begin(); wxString retval(*it); while ((++it) != list.end()) retval += wxT(", ") + (*it); return retval; } //----------------------------------------------------------------------------- bool selectRelationColumnsIntoVector(Relation* t, wxWindow* parent, std::vector& list) { t->ensureChildrenLoaded(); wxArrayInt selected_columns; wxArrayString colNames; colNames.Alloc(t->getColumnCount()); for (ColumnPtrs::const_iterator it = t->begin(); it != t->end(); ++it) colNames.Add((*it)->getName_()); // set default selection. for (std::vector::const_iterator it = list.begin(); it != list.end(); ++it) { wxString::size_type i = colNames.Index((*it)); if (i != wxNOT_FOUND) selected_columns.Add(i); } bool ok = #if wxCHECK_VERSION(2, 9, 0) ::wxGetSelectedChoices(selected_columns, #else ::wxGetMultipleChoices(selected_columns, #endif _("Select one or more fields... (use ctrl key)"), _("Table Fields"), colNames, parent) > 0; list.clear(); if (!ok) return false; for (size_t i = 0; i < selected_columns.GetCount(); ++i) { Identifier temp(colNames[selected_columns[i]]); list.push_back(temp.getQuoted()); } return true; } //----------------------------------------------------------------------------- bool connectDatabase(Database* db, wxWindow* parent, ProgressDialog* progressdialog) { wxString pass(db->getDecryptedPassword()); if (db->getAuthenticationMode().getAlwaysAskForPassword()) { // don't allow different username here UsernamePasswordDialog upd(wxGetActiveWindow(), _("Database Credentials"), db->getUsername(), true, _("Please enter the the database user's password:")); if (upd.ShowModal() != wxID_OK) return false; pass = upd.getPassword(); } wxString caption(wxString::Format(_("Connecting to Database \"%s\""), db->getName_().c_str())); if (progressdialog) { progressdialog->setProgressMessage(caption); db->connect(pass, progressdialog); } else { ProgressDialog pd(parent, caption, 1); db->connect(pass, &pd);; } return true; } //----------------------------------------------------------------------------- bool getService(Server* s, IBPP::Service& svc, ProgressIndicator* p, bool sysdba) { if (!s->getService(svc, p, sysdba)) { wxString msg; if (sysdba) msg = _("Please enter the database administrator password:"); else { if (p->isCanceled()) msg = _("You have canceled the search for a usable username and password."); else msg = _("None of the known database credentials could be used."); msg = msg + wxT("\n") + _("Please enter a valid username and password:"); } UsernamePasswordDialog upd(wxGetActiveWindow(), _("Database Credentials"), wxT("SYSDBA"), sysdba, msg); if (upd.ShowModal() != wxID_OK) return false; wxString username(upd.getUsername()); wxString password(upd.getPassword()); try { svc = IBPP::ServiceFactory(wx2std(s->getConnectionString()), wx2std(username), wx2std(password)); svc->Connect(); // exception might be thrown. If not, we store the credentials: if (sysdba || username.Upper() == wxT("SYSDBA")) s->setServiceSysdbaPassword(password); else s->setServiceCredentials(username, password); } catch(IBPP::Exception& e) { wxMessageBox(std2wx(e.ErrorMessage()), _("Error"), wxICON_ERROR | wxOK); return false; } } return true; } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/frutils.h000066400000000000000000000050751177057155300206420ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FRUTILS_H #define FRUTILS_H //----------------------------------------------------------------------------- #include #include #include #include #include "metadata/MetadataClasses.h" class ProgressDialog; class ProgressIndicator; //----------------------------------------------------------------------------- //! sets all controls to width of widest control void adjustControlsMinWidth(std::list controls); //----------------------------------------------------------------------------- //! reads blob from statement into wxString void readBlob(IBPP::Statement& st, int column, wxString& result, wxMBConv* conv); //----------------------------------------------------------------------------- //! displays a list of table columns and lets user select some wxString selectRelationColumns(Relation* t, wxWindow* parent); bool selectRelationColumnsIntoVector(Relation* t, wxWindow* parent, std::vector& list); //----------------------------------------------------------------------------- //! prompts for password if needed and connects to database bool connectDatabase(Database *db, wxWindow* parent, ProgressDialog* progressdialog = 0); //----------------------------------------------------------------------------- bool getService(Server* s, IBPP::Service& svc, ProgressIndicator* p, bool sysdba); //----------------------------------------------------------------------------- #endif // FRUTILS_H flamerobin_0.9.3~svn+2220.orig/src/frversion.h000066400000000000000000000001721177057155300211600ustar00rootroot00000000000000// $Id$ #define FR_VERSION_MAJOR 0 #define FR_VERSION_MINOR 9 #define FR_VERSION_RLS 3 #include "frsvnrev.h" flamerobin_0.9.3~svn+2220.orig/src/gui/000077500000000000000000000000001177057155300175565ustar00rootroot00000000000000flamerobin_0.9.3~svn+2220.orig/src/gui/AboutBox.cpp000066400000000000000000000073671177057155300220220ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #ifdef wxUSE_ABOUTDLG #include #endif #include #include #include "frversion.h" #include "gui/AboutBox.h" //----------------------------------------------------------------------------- void showAboutBox(wxWindow* parent) { wxString libs; libs.Printf(_("This tool uses IBPP library version %d.%d.%d.%d\nwxWidgets library version %d.%d.%d\nand Boost library version %d.%d.%d"), (IBPP::Version & 0xFF000000) >> 24, (IBPP::Version & 0x00FF0000) >> 16, (IBPP::Version & 0x0000FF00) >> 8, (IBPP::Version & 0x000000FF), wxMAJOR_VERSION, wxMINOR_VERSION, wxRELEASE_NUMBER, BOOST_VERSION / 100000, BOOST_VERSION / 100 % 1000, BOOST_VERSION % 100 ); wxString ver; #ifdef FR_VERSION_SVN ver.Printf(wxT("%d.%d.%d.%d"), FR_VERSION_MAJOR, FR_VERSION_MINOR, FR_VERSION_RLS, FR_VERSION_SVN); #else ver.Printf(wxT("%d.%d.%d"), FR_VERSION_MAJOR, FR_VERSION_MINOR, FR_VERSION_RLS); #endif #if wxUSE_UNICODE ver += wxT(" Unicode"); #endif #if defined wxUSE_ABOUTDLG && (defined __WXMAC__ || defined __WXGTK__) wxUnusedVar(parent); wxAboutDialogInfo info; info.SetName(wxT("FlameRobin")); info.SetCopyright(_("Copyright (c) 2004-2012 FlameRobin Development Team")); info.SetVersion(ver); wxString msg(_("Database Administration Tool for Firebird RDBMS")); msg += wxT("\n\n"); msg += libs; info.SetDescription(msg); // the following would prohibit the native dialog on Mac OS X #if defined __WXGTK__ info.SetWebSite(wxT("http://www.flamerobin.org")); /* possible additions AddDeveloper(...); AddDocWriter(...); AddArtist(...); AddTranslator(...); */ #endif wxAboutBox(info); #else wxString msg(wxT("FlameRobin ") + ver); #if defined(_WIN64) msg += wxT(" (x64)"); #endif msg += wxT("\n"); msg += _("Database administration tool for Firebird RDBMS"); msg += wxT("\n\n"); msg += libs; msg += wxT("\n\n"); msg += _("Copyright (c) 2004-2012 FlameRobin Development Team"); msg += wxT("\n"); msg += _("http://www.flamerobin.org"); wxMessageBox(msg, _("About FlameRobin"), wxOK | wxICON_INFORMATION, parent); #endif } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/AboutBox.h000066400000000000000000000026111177057155300214520ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ //----------------------------------------------------------------------------- #ifndef FR_ABOUTBOX_H #define FR_ABOUTBOX_H #include void showAboutBox(wxWindow* parent); //----------------------------------------------------------------------------- #endif // FR_ABOUTBOX_H flamerobin_0.9.3~svn+2220.orig/src/gui/AdvancedMessageDialog.cpp000066400000000000000000000503161177057155300244210ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif //---------------------------------------------------------------------------- #include #include #include #include "config/Config.h" #include "gui/AdvancedMessageDialog.h" #include "gui/StyleGuide.h" //---------------------------------------------------------------------------- AdvancedMessageDialogButtons::AdvancedMessageDialogButtons() { affirmativeButtonM.id = wxID_ANY; alternateButtonM.id = wxID_ANY; negativeButtonM.id = wxID_ANY; } //---------------------------------------------------------------------------- void AdvancedMessageDialogButtons::addAffirmativeButton(int id, const wxString& caption) { affirmativeButtonM.id = id; affirmativeButtonM.caption = caption; } //---------------------------------------------------------------------------- void AdvancedMessageDialogButtons::addAlternateButton(int id, const wxString& caption) { alternateButtonM.id = id; alternateButtonM.caption = caption; } //---------------------------------------------------------------------------- void AdvancedMessageDialogButtons::addNegativeButton(int id, const wxString& caption) { negativeButtonM.id = id; negativeButtonM.caption = caption; } //---------------------------------------------------------------------------- wxButton* AdvancedMessageDialogButtons::createAffirmativeButton( wxWindow* parent) { if (affirmativeButtonM.id == wxID_ANY) return 0; return new wxButton(parent, affirmativeButtonM.id, affirmativeButtonM.caption); } //---------------------------------------------------------------------------- wxButton* AdvancedMessageDialogButtons::createAlternateButton( wxWindow* parent) { if (alternateButtonM.id == wxID_ANY) return 0; return new wxButton(parent, alternateButtonM.id, alternateButtonM.caption); } //---------------------------------------------------------------------------- wxButton* AdvancedMessageDialogButtons::createNegativeButton( wxWindow* parent) { if (negativeButtonM.id == wxID_ANY) return 0; return new wxButton(parent, negativeButtonM.id, negativeButtonM.caption); } //---------------------------------------------------------------------------- int AdvancedMessageDialogButtons::getNumberOfButtons() { int count = 0; if (affirmativeButtonM.id != wxID_ANY) ++count; if (alternateButtonM.id != wxID_ANY) ++count; if (negativeButtonM.id != wxID_ANY) ++count; return count; } //---------------------------------------------------------------------------- AdvancedMessageDialogButtonsOk::AdvancedMessageDialogButtonsOk( const wxString buttonOkCaption) { addAffirmativeButton(wxID_OK, buttonOkCaption); } //----------------------------------------------------------------------------- AdvancedMessageDialogButtonsOkCancel::AdvancedMessageDialogButtonsOkCancel( const wxString buttonOkCaption, const wxString buttonCancelCaption) { addAffirmativeButton(wxID_OK, buttonOkCaption); addNegativeButton(wxID_CANCEL, buttonCancelCaption); } //----------------------------------------------------------------------------- AdvancedMessageDialogButtonsYesNoCancel:: AdvancedMessageDialogButtonsYesNoCancel(const wxString buttonYesCaption, const wxString buttonNoCaption, const wxString buttonCancelCaption) { addAffirmativeButton(wxID_YES, buttonYesCaption); addAlternateButton(wxID_NO, buttonNoCaption); addNegativeButton(wxID_CANCEL, buttonCancelCaption); } //----------------------------------------------------------------------------- class TextWrapEngine { private: static int computeBestWrapWidth(wxDC& dc, const wxString& text, int wrapWidth); static wxSize computeWrappedExtent(wxDC& dc, const wxString& text, int wrapWidth); static wxString wrapLine(wxDC& dc, const wxString& text, int wrapWidth); public: static void computeWordWrap(const wxString& text, const wxFont& font, int wrapWidth, bool minimizeWrapWidth, wxString& wrappedText, wxSize* wrappedTextExtent); }; //----------------------------------------------------------------------------- void TextWrapEngine::computeWordWrap(const wxString& text, const wxFont& font, int wrapWidth, bool minimizeWrapWidth, wxString& wrappedText, wxSize* wrappedTextExtent) { // split text into lines wxArrayString lines; wxStringTokenizer tokenizer(text, wxT("\n"), wxTOKEN_RET_EMPTY); while (tokenizer.HasMoreTokens()) lines.Add(tokenizer.GetNextToken().Trim()); // used for computation of text extents wxScreenDC dc; dc.SetFont(font); if (wrapWidth <= 0) { dc.GetTextExtent(wxT("x"), &wrapWidth, 0); wrapWidth *= 68; } // compute the minimum width that the wrapped text needs if (minimizeWrapWidth) { int bestWidth = 0; for (size_t i = 0; i < lines.size(); i++) { if (!lines[i].empty()) { int needed = computeBestWrapWidth(dc, lines[i], wrapWidth); if (bestWidth < needed) bestWidth = needed; } } if (bestWidth) wrapWidth = bestWidth; } // return the wrapped text wrappedText = wxEmptyString; for (size_t i = 0; i < lines.size(); i++) { if (!wrappedText.empty()) wrappedText += wxT("\n"); if (!lines[i].empty()) wrappedText += wrapLine(dc, lines[i], wrapWidth); } // optionally return the extents of the wrapped text if (wrappedTextExtent) { wxCoord w, h; dc.GetMultiLineTextExtent(wrappedText, &w, &h); *wrappedTextExtent = wxSize(w, h); } } //----------------------------------------------------------------------------- int TextWrapEngine::computeBestWrapWidth(wxDC& dc, const wxString& text, int wrapWidth) { wxSize origExtent = computeWrappedExtent(dc, text, wrapWidth); // don't try to wrap single-line text int h; dc.GetTextExtent(wxT("x"), 0, &h); if (origExtent.GetHeight() == h) return origExtent.GetWidth(); // binary search for smallest wrap width resulting in same height int smallWidth = wrapWidth / 8; int largeWidth = wrapWidth; while (largeWidth > smallWidth) { int tryWidth = (largeWidth + smallWidth) / 2; wxSize extent = computeWrappedExtent(dc, text, tryWidth); if (extent.GetHeight() > origExtent.GetHeight()) smallWidth = tryWidth + 1; else largeWidth = tryWidth; } return largeWidth; } //----------------------------------------------------------------------------- wxSize TextWrapEngine::computeWrappedExtent(wxDC& dc, const wxString& text, int wrapWidth) { int textW = 0, textH = 0; const wxChar* const pos = text.c_str(); const wxChar* p = text.c_str(); const wxChar* pWrap = 0; const wxChar* r = p; while (p && *p) { // scan over non-whitespace while (*r > ' ') r++; int w; dc.GetTextExtent(text.Mid(p-pos, r-p), &w, 0); if (w <= wrapWidth) // partial line fits in wrapWidth pWrap = r; if (w > wrapWidth || *r == 0) { int h; dc.GetTextExtent(text.Mid(p-pos, pWrap-p), &w, &h); textW = (w > textW) ? w : textW; textH += h; p = pWrap; // scan over whitespace while (p && *p != 0 && *p <= ' ') p++; pWrap = 0; } // scan over whitespace while (*r != 0 && *r <= ' ') r++; } return wxSize(textW, textH); } //----------------------------------------------------------------------------- wxString TextWrapEngine::wrapLine(wxDC& dc, const wxString& text, int wrapWidth) { wxString result; const wxChar* const pos = text.c_str(); const wxChar* p = text.c_str(); const wxChar* pWrap = 0; const wxChar* r = p; while (p && *p) { // scan over non-whitespace while (*r > ' ') r++; wxString partialLine = text.Mid(p-pos, r-p); int w; dc.GetTextExtent(partialLine, &w, 0); if (w <= wrapWidth) // partial line fits in wrapWidth pWrap = r; if (w > wrapWidth || *r == 0) { if (!result.empty()) result += wxT("\n"); result += text.Mid(p-pos, pWrap-p); p = pWrap; // scan over whitespace while (p && *p != 0 && *p <= ' ') p++; pWrap = 0; } // scan over whitespace while (*r != 0 && *r <= ' ') r++; } return result; } //----------------------------------------------------------------------------- AdvancedMessageDialog::AdvancedMessageDialog(wxWindow* parent, wxArtID iconId, const wxString& primaryText, const wxString& secondaryText, AdvancedMessageDialogButtons& buttons, const wxString& dontShowAgainText) : BaseDialog(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) { checkBoxM = 0; #ifndef __WXMAC__ SetTitle(_("FlameRobin")); #endif wxBoxSizer* controlsSizer = new wxBoxSizer(wxHORIZONTAL); // message box icon wxStaticBitmap* iconBmp = new wxStaticBitmap(getControlsPanel(), wxID_ANY, wxArtProvider::GetBitmap(iconId, wxART_MESSAGE_BOX)); controlsSizer->Add(iconBmp); controlsSizer->AddSpacer(styleguide().getMessageBoxIconMargin()); wxBoxSizer* textSizer = new wxBoxSizer(wxVERTICAL); // primary and secondary texts wxStaticText* labelPrimary = new wxStaticText(getControlsPanel(), wxID_ANY, wxEmptyString /*primaryText*/); wxFont primaryLabelFont(labelPrimary->GetFont()); primaryLabelFont.SetWeight(wxBOLD); #ifdef __WXGTK__ primaryLabelFont.SetPointSize(primaryLabelFont.GetPointSize() * 4 / 3); #endif labelPrimary->SetFont(primaryLabelFont); wxStaticText* labelSecondary = new wxStaticText(getControlsPanel(), wxID_ANY, wxEmptyString /*secondaryText*/); wxFont secondaryLabelFont(labelSecondary->GetFont()); #ifdef __WXMAC__ // default font sizes 13pt and 11pt, but compute it anyway secondaryLabelFont.SetPointSize(secondaryLabelFont.GetPointSize() * 11 / 13); labelSecondary->SetFont(secondaryLabelFont); #endif wxString primaryTextWrapped; wxSize primaryExtent; TextWrapEngine::computeWordWrap(primaryText, primaryLabelFont, 0, true, primaryTextWrapped, &primaryExtent); wxString secondaryTextWrapped; wxSize secondaryExtent; TextWrapEngine::computeWordWrap(secondaryText, secondaryLabelFont, 0, true, secondaryTextWrapped, &secondaryExtent); int wrapWidth = (primaryExtent.GetWidth() > secondaryExtent.GetWidth()) ? primaryExtent.GetWidth() : secondaryExtent.GetWidth(); TextWrapEngine::computeWordWrap(primaryText, primaryLabelFont, wrapWidth, false, primaryTextWrapped, 0); labelPrimary->SetLabel(primaryTextWrapped); TextWrapEngine::computeWordWrap(secondaryText, secondaryLabelFont, wrapWidth, false, secondaryTextWrapped, 0); labelSecondary->SetLabel(secondaryTextWrapped); textSizer->Add(labelPrimary, 0, wxEXPAND); textSizer->AddSpacer(styleguide().getMessageBoxBetweenTextMargin()); textSizer->Add(labelSecondary, 0, wxEXPAND); // checkbox for "Don't show/ask again" if (!dontShowAgainText.empty()) { textSizer->AddSpacer( styleguide().getUnrelatedControlMargin(wxVERTICAL)); checkBoxM = new wxCheckBox(getControlsPanel(), wxID_ANY, dontShowAgainText); textSizer->Add(checkBoxM, 0, wxEXPAND); } controlsSizer->Add(textSizer); // command buttons wxButton* affirmativeButton = buttons.createAffirmativeButton( getControlsPanel()); if (affirmativeButton) { Connect(affirmativeButton->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AdvancedMessageDialog::OnButtonClick)); } wxButton* alternateButton = buttons.createAlternateButton( getControlsPanel()); if (alternateButton) { Connect(alternateButton->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AdvancedMessageDialog::OnButtonClick)); } wxButton* negativeButton = buttons.createNegativeButton( getControlsPanel()); if (negativeButton) { Connect(negativeButton->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(AdvancedMessageDialog::OnButtonClick)); } if (affirmativeButton) { affirmativeButton->SetDefault(); affirmativeButton->SetFocus(); } else if (alternateButton) { alternateButton->SetDefault(); alternateButton->SetFocus(); } else if (negativeButton) { negativeButton->SetDefault(); negativeButton->SetFocus(); } // create sizer for buttons -> styleguide class will align it correctly wxSizer* buttonSizer = styleguide().createButtonSizer(affirmativeButton, negativeButton, alternateButton); // use method in base class to set everything up layoutSizers(controlsSizer, buttonSizer); } //----------------------------------------------------------------------------- bool AdvancedMessageDialog::getDontShowAgain() const { return checkBoxM != 0 && checkBoxM->IsChecked(); } //----------------------------------------------------------------------------- void AdvancedMessageDialog::OnButtonClick(wxCommandEvent& event) { switch (event.GetId()) { case wxID_OK: EndModal(wxOK); break; case wxID_YES: EndModal(wxYES); break; case wxID_NO: EndModal(wxNO); break; case wxID_CANCEL: EndModal(wxCANCEL); break; } } //----------------------------------------------------------------------------- int showAdvancedMessageDialog(wxWindow* parent, int style, const wxString& primaryText, const wxString& secondaryText, AdvancedMessageDialogButtons& buttons, bool* showNeverAgain = 0, const wxString& dontShowAgainText = wxEmptyString) { if (!parent) parent = ::wxGetActiveWindow(); if (showNeverAgain) *showNeverAgain = false; wxArtID iconId; switch (style) { case wxICON_INFORMATION: iconId = wxART_INFORMATION; break; case wxICON_ERROR: iconId = wxART_ERROR; break; default: // NOTE: wxART_QUESTION is deprecated in HIGs, so don't use it... iconId = wxART_WARNING; break; } AdvancedMessageDialog amd(parent, iconId, primaryText, secondaryText, buttons, dontShowAgainText); int res = amd.ShowModal(); if (showNeverAgain) *showNeverAgain = amd.getDontShowAgain(); return res; } //----------------------------------------------------------------------------- int showAdvancedMessageDialog(wxWindow* parent, int style, const wxString& primaryText, const wxString& secondaryText, AdvancedMessageDialogButtons& buttons, Config& config, const wxString& configKey, const wxString& dontShowAgainText) { int value; if (config.getValue(configKey, value)) return value; bool showNeverAgain = false; value = showAdvancedMessageDialog(parent, style, primaryText, secondaryText, buttons, &showNeverAgain, dontShowAgainText); // wxID_CANCEL means: cancel action, so it is not treated like a regular // "choice"; the checkbox ("Don't show/ask again") is ignored even if set if (value != wxCANCEL && !configKey.empty() && showNeverAgain) config.setValue(configKey, value); return value; } //----------------------------------------------------------------------------- int showInformationDialog(wxWindow* parent, const wxString& primaryText, const wxString& secondaryText, AdvancedMessageDialogButtons buttons) { return showAdvancedMessageDialog(parent, wxICON_INFORMATION, primaryText, secondaryText, buttons); } //----------------------------------------------------------------------------- int showInformationDialog(wxWindow* parent, const wxString& primaryText, const wxString& secondaryText, AdvancedMessageDialogButtons buttons, Config& config, const wxString& configKey, const wxString& dontShowAgainText) { return showAdvancedMessageDialog(parent, wxICON_INFORMATION, primaryText, secondaryText, buttons, config, configKey, dontShowAgainText); } //----------------------------------------------------------------------------- int showQuestionDialog(wxWindow* parent, const wxString& primaryText, const wxString& secondaryText, AdvancedMessageDialogButtons buttons) { return showAdvancedMessageDialog(parent, wxICON_QUESTION, primaryText, secondaryText, buttons); } //----------------------------------------------------------------------------- int showQuestionDialog(wxWindow* parent, const wxString& primaryText, const wxString& secondaryText, AdvancedMessageDialogButtons buttons, Config& config, const wxString& configKey, const wxString& dontShowAgainText) { return showAdvancedMessageDialog(parent, wxICON_QUESTION, primaryText, secondaryText, buttons, config, configKey, dontShowAgainText); } //----------------------------------------------------------------------------- int showWarningDialog(wxWindow* parent, const wxString& primaryText, const wxString& secondaryText, AdvancedMessageDialogButtons buttons) { return showAdvancedMessageDialog(parent, wxICON_WARNING, primaryText, secondaryText, buttons); } //----------------------------------------------------------------------------- int showWarningDialog(wxWindow* parent, const wxString& primaryText, const wxString& secondaryText, AdvancedMessageDialogButtons buttons, Config& config, const wxString& configKey, const wxString& dontShowAgainText) { return showAdvancedMessageDialog(parent, wxICON_WARNING, primaryText, secondaryText, buttons, config, configKey, dontShowAgainText); } //----------------------------------------------------------------------------- int showErrorDialog(wxWindow* parent, const wxString& primaryText, const wxString& secondaryText, AdvancedMessageDialogButtons buttons) { return showAdvancedMessageDialog(parent, wxICON_ERROR, primaryText, secondaryText, buttons); } //----------------------------------------------------------------------------- int showErrorDialog(wxWindow* parent, const wxString& primaryText, const wxString& secondaryText, AdvancedMessageDialogButtons buttons, Config& config, const wxString& configKey, const wxString& dontShowAgainText) { return showAdvancedMessageDialog(parent, wxICON_ERROR, primaryText, secondaryText, buttons, config, configKey, dontShowAgainText); } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/AdvancedMessageDialog.h000066400000000000000000000124361177057155300240670ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_ADVANCEDMESSAGEDIALOG_H #define FR_ADVANCEDMESSAGEDIALOG_H //----------------------------------------------------------------------------- #include #include #include "config/Config.h" #include "gui/BaseDialog.h" //----------------------------------------------------------------------------- class AdvancedMessageDialogButtons { private: struct AdvancedMessageDialogButtonData { int id; wxString caption; }; AdvancedMessageDialogButtonData affirmativeButtonM; AdvancedMessageDialogButtonData alternateButtonM; AdvancedMessageDialogButtonData negativeButtonM; protected: AdvancedMessageDialogButtons(); void addAffirmativeButton(int id, const wxString& caption); void addAlternateButton(int id, const wxString& caption); void addNegativeButton(int id, const wxString& caption); public: wxButton* createAffirmativeButton(wxWindow* parent); wxButton* createAlternateButton(wxWindow* parent); wxButton* createNegativeButton(wxWindow* parent); int getNumberOfButtons(); }; //----------------------------------------------------------------------------- class AdvancedMessageDialogButtonsOk: public AdvancedMessageDialogButtons { public: AdvancedMessageDialogButtonsOk(const wxString buttonOkCaption = _("OK")); }; //----------------------------------------------------------------------------- class AdvancedMessageDialogButtonsOkCancel: public AdvancedMessageDialogButtons { public: AdvancedMessageDialogButtonsOkCancel(const wxString buttonOkCaption, const wxString buttonCancelCaption = _("&Cancel")); }; //----------------------------------------------------------------------------- class AdvancedMessageDialogButtonsYesNoCancel: public AdvancedMessageDialogButtons { public: AdvancedMessageDialogButtonsYesNoCancel(const wxString buttonYesCaption, const wxString buttonNoCaption = _("&No"), const wxString buttonCancelCaption = _("&Cancel")); }; //----------------------------------------------------------------------------- class AdvancedMessageDialog: public BaseDialog { private: wxControl* controlPrimaryTextM; wxControl* controlSecondaryTextM; wxCheckBox* checkBoxM; public: AdvancedMessageDialog(wxWindow* parent, wxArtID iconId, const wxString& primaryText, const wxString& secondaryText, AdvancedMessageDialogButtons& buttons, const wxString& dontShowAgainText); bool getDontShowAgain() const; private: // event handling void OnButtonClick(wxCommandEvent& event); }; //----------------------------------------------------------------------------- int showInformationDialog(wxWindow* parent, const wxString& primaryText, const wxString& secondaryText, AdvancedMessageDialogButtons buttons); int showInformationDialog(wxWindow* parent, const wxString& primaryText, const wxString& secondaryText, AdvancedMessageDialogButtons buttons, Config& config, const wxString& configKey, const wxString& dontShowAgainText); int showQuestionDialog(wxWindow* parent, const wxString& primaryText, const wxString& secondaryText, AdvancedMessageDialogButtons buttons); int showQuestionDialog(wxWindow* parent, const wxString& primaryText, const wxString& secondaryText, AdvancedMessageDialogButtons buttons, Config& config, const wxString& configKey, const wxString& dontShowAgainText); int showWarningDialog(wxWindow* parent, const wxString& primaryText, const wxString& secondaryText, AdvancedMessageDialogButtons buttons); int showWarningDialog(wxWindow* parent, const wxString& primaryText, const wxString& secondaryText, AdvancedMessageDialogButtons buttons, Config& config, const wxString& configKey, const wxString& dontShowAgainText); int showErrorDialog(wxWindow* parent, const wxString& primaryText, const wxString& secondaryText, AdvancedMessageDialogButtons buttons); int showErrorDialog(wxWindow* parent, const wxString& primaryText, const wxString& secondaryText, AdvancedMessageDialogButtons buttons, Config& config, const wxString& configKey, const wxString& dontShowAgainText); //----------------------------------------------------------------------------- #endif // FR_ADVANCEDMESSAGEDIALOG_H flamerobin_0.9.3~svn+2220.orig/src/gui/AdvancedSearchFrame.cpp000066400000000000000000000673051177057155300241030ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ //----------------------------------------------------------------------------- #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include #endif #include #include #include "frutils.h" #include "gui/AdvancedSearchFrame.h" #include "gui/ContextMenuMetadataItemVisitor.h" #include "gui/controls/DBHTreeControl.h" #include "gui/MainFrame.h" #include "gui/ProgressDialog.h" #include "metadata/column.h" #include "metadata/CreateDDLVisitor.h" #include "metadata/database.h" #include "metadata/metadataitem.h" #include "metadata/domain.h" #include "metadata/parameter.h" #include "metadata/procedure.h" #include "metadata/root.h" #include "metadata/server.h" #include "metadata/table.h" #include "metadata/view.h" //----------------------------------------------------------------------------- // derived class since we need to catch size event class AdjustableListCtrl: public wxListCtrl { public: AdjustableListCtrl(wxWindow *parent, wxWindowID id, long style) :wxListCtrl(parent, id, wxDefaultPosition, wxDefaultSize, style) { }; void OnSize(wxSizeEvent& event) { int w, h; GetSize(&w, &h); #ifdef __WXMSW__ // On Linux, scrollbar is beneath the header so this isn't needed. // If it has more than fits on one page => needs scrollbar // so we deduce scrollbar width if (GetItemCount() > GetCountPerPage()) w -= wxSystemSettings::GetMetric(wxSYS_VSCROLL_X, this); #endif int w1 = w/3; SetColumnWidth(0, w1); w -= w1; if (GetColumnCount() == 3) // result list { int wd; wxMemoryDC dc; dc.SetFont(GetFont()); dc.GetTextExtent(wxT("PROCEDUREM"), &wd, &h); SetColumnWidth(1, wd); w -= wd; } SetColumnWidth(GetColumnCount() - 1, w-4); // last column event.Skip(); }; DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- BEGIN_EVENT_TABLE(AdjustableListCtrl, wxListCtrl) EVT_SIZE(AdjustableListCtrl::OnSize) END_EVENT_TABLE() //----------------------------------------------------------------------------- AdvancedSearchFrame::AdvancedSearchFrame(MainFrame* parent, RootPtr root) : BaseFrame(parent, -1, _("Advanced Metadata Search")) { wxBoxSizer *mainSizer; mainSizer = new wxBoxSizer(wxVERTICAL); mainPanel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); wxBoxSizer *innerSizer; innerSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer *leftSizer; leftSizer = new wxBoxSizer(wxVERTICAL); wxFlexGridSizer *fgSizer1; fgSizer1 = new wxFlexGridSizer(2, 3, 0, 0); fgSizer1->AddGrowableCol(1); m_staticText1 = new wxStaticText(mainPanel, wxID_ANY, _("Type")); fgSizer1->Add(m_staticText1, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5); wxString choices1[] = { wxT("TABLE"), wxT("VIEW"), wxT("PROCEDURE"), wxT("TRIGGER"), wxT("GENERATOR"), wxT("FUNCTION"), wxT("DOMAIN"), wxT("ROLE"), wxT("COLUMN"), wxT("EXCEPTION") }; int nchoices1 = sizeof(choices1) / sizeof(wxString); choice_type = new wxChoice(mainPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, nchoices1, choices1, 0); fgSizer1->Add(choice_type, 0, wxALL|wxEXPAND, 5); button_add_type = new wxButton(mainPanel, ID_button_add_type, _("Add")); fgSizer1->Add(button_add_type, 0, wxALL, 5); choice_type->SetSelection(0); m_staticText2 = new wxStaticText(mainPanel, wxID_ANY, _("Name is")); fgSizer1->Add(m_staticText2, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5); textctrl_name = new wxTextCtrl(mainPanel, wxID_ANY, _("Allows * and ? wildcards"), wxDefaultPosition, wxDefaultSize, 0); fgSizer1->Add(textctrl_name, 0, wxALL|wxEXPAND, 5); button_add_name = new wxButton(mainPanel, ID_button_add_name, _("Add")); fgSizer1->Add(button_add_name, 0, wxALL, 5); m_staticText3 = new wxStaticText(mainPanel, wxID_ANY, _("Description contains")); fgSizer1->Add(m_staticText3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5); textctrl_description = new wxTextCtrl(mainPanel, wxID_ANY, wxEmptyString); fgSizer1->Add(textctrl_description, 0, wxALL|wxEXPAND, 5); button_add_description = new wxButton(mainPanel, ID_button_add_description, _("Add")); fgSizer1->Add(button_add_description, 0, wxALL, 5); m_staticText4 = new wxStaticText(mainPanel, wxID_ANY, _("DDL contains")); fgSizer1->Add(m_staticText4, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5); textctrl_ddl = new wxTextCtrl(mainPanel, wxID_ANY, wxEmptyString); fgSizer1->Add(textctrl_ddl, 0, wxALL|wxEXPAND, 5); button_add_ddl = new wxButton(mainPanel, ID_button_add_ddl, _("Add")); fgSizer1->Add(button_add_ddl, 0, wxALL, 5); m_staticText5 = new wxStaticText(mainPanel, wxID_ANY,_("Has field named")); fgSizer1->Add(m_staticText5, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5); textctrl_field = new wxTextCtrl(mainPanel, wxID_ANY, wxEmptyString); fgSizer1->Add(textctrl_field, 0, wxALL|wxEXPAND, 5); button_add_field = new wxButton(mainPanel, ID_button_add_field, _("Add")); fgSizer1->Add(button_add_field, 0, wxALL, 5); m_staticText6 = new wxStaticText(mainPanel, wxID_ANY, _("Search in")); fgSizer1->Add(m_staticText6, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5); choice_database = new wxChoice(mainPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, 0, 0); choice_database->Append(_("[All Connected Databases]"), (void *)0); ServerPtrs servers(root->getServers()); for (ServerPtrs::iterator its = servers.begin(); its != servers.end(); ++its) { DatabasePtrs databases((*its)->getDatabases()); for (DatabasePtrs::iterator itdb = databases.begin(); itdb != databases.end(); ++itdb) { // we store DB pointer, so we observe in case database is removed Database* db = (*itdb).get(); choice_database->Append((*its)->getName_() + wxT("::") + db->getName_(), (void*)db); db->attachObserver(this, false); } } choice_database->SetSelection(0); fgSizer1->Add(choice_database, 0, wxALL|wxEXPAND, 5); button_add_database = new wxButton(mainPanel, ID_button_add_database, _("Add")); fgSizer1->Add(button_add_database, 0, wxALL, 5); leftSizer->Add(fgSizer1, 0, wxEXPAND, 5); listctrl_criteria = new AdjustableListCtrl(mainPanel, ID_listctrl_criteria, wxLC_REPORT | wxLC_VRULES | wxBORDER_THEME); listctrl_criteria->InsertColumn(0, _("Search criteria")); listctrl_criteria->InsertColumn(1, _("Value")); leftSizer->Add(listctrl_criteria, 1, wxALL|wxEXPAND, 5); wxBoxSizer *bSizer5; bSizer5 = new wxBoxSizer(wxHORIZONTAL); button_remove = new wxButton(mainPanel, ID_button_remove, _("Remove selected"), wxDefaultPosition, wxDefaultSize, 0); bSizer5->Add(button_remove, 0, wxALL, 5); bSizer5->Add(2, 2, 1, 0, 0); button_search = new wxButton(mainPanel, ID_button_start, _("Start search"), wxDefaultPosition, wxDefaultSize, 0); bSizer5->Add(button_search, 0, wxALL, 5); leftSizer->Add(bSizer5, 0, wxEXPAND, 5); innerSizer->Add(leftSizer, 1, wxEXPAND, 5); wxBoxSizer *rightSizer; rightSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer *bSizer7; bSizer7 = new wxBoxSizer(wxHORIZONTAL); label_search_results = new wxStaticText(mainPanel, wxID_ANY, _("SEARCH RESULTS"), wxDefaultPosition, wxDefaultSize, 0); bSizer7->Add(label_search_results, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5); bSizer7->Add(20, 2, 1, 0, 0); checkbox_ddl = new wxCheckBox(mainPanel, ID_checkbox_ddl, _("Show DDL for selected objects")); checkbox_ddl->SetValue(true); // checked by default bSizer7->Add(checkbox_ddl, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5); rightSizer->Add(bSizer7, 0, wxEXPAND, 5); splitter1 = new wxSplitterWindow(mainPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_3D); top_splitter_panel = new wxPanel(splitter1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); wxBoxSizer *top_splitter_sizer = new wxBoxSizer(wxVERTICAL); listctrl_results = new AdjustableListCtrl(top_splitter_panel, ID_listctrl_results, wxLC_REPORT | wxLC_VRULES | wxBORDER_THEME); listctrl_results->InsertColumn(0, _("Database")); listctrl_results->InsertColumn(1, _("Type")); listctrl_results->InsertColumn(2, _("Name")); top_splitter_sizer->Add(listctrl_results, 1, wxEXPAND, 0); top_splitter_panel->SetSizer(top_splitter_sizer); bottom_splitter_panel = new wxPanel(splitter1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); wxBoxSizer *bottom_splitter_sizer = new wxBoxSizer(wxVERTICAL); stc_ddl = new wxStyledTextCtrl(bottom_splitter_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_THEME); stc_ddl->SetWrapMode(wxSTC_WRAP_WORD); stc_ddl->SetMarginWidth(1, 0); // turn off the folding margin stc_ddl->StyleSetForeground(1, *wxWHITE); stc_ddl->StyleSetBackground(1, *wxBLUE); stc_ddl->StyleSetForeground(2, *wxWHITE); stc_ddl->StyleSetBackground(2, *wxRED); stc_ddl->SetText(_("DDL for selected objects")); bottom_splitter_sizer->Add(stc_ddl, 1, wxEXPAND, 0); bottom_splitter_panel->SetSizer(bottom_splitter_sizer); splitter1->SplitHorizontally(top_splitter_panel,bottom_splitter_panel,0); rightSizer->Add(splitter1, 1, wxEXPAND, 5); innerSizer->Add(rightSizer, 1, wxEXPAND, 5); mainPanel->SetSizer(innerSizer); mainSizer->Add(mainPanel, 1, wxEXPAND, 0); SetSizerAndFit(mainSizer); Centre(); // TODO: size(32, 32) missing for SEARCH icon #include "search.xpm" wxBitmap bmp = wxBitmap(search_xpm); wxIcon icon; icon.CopyFromBitmap(bmp); SetIcon(icon); } //----------------------------------------------------------------------------- void AdvancedSearchFrame::addCriteria(CriteriaItem::Type type, wxString value, Database *db) { if (value.IsEmpty()) return; value.MakeUpper(); if (type == CriteriaItem::ctDDL || type == CriteriaItem::ctDescription) value = wxT("*") + value + wxT("*"); CriteriaItem c(value, db); for (CriteriaCollection::const_iterator it = searchCriteriaM.lower_bound(type); it != searchCriteriaM.upper_bound(type); ++it) { if ((*it).second == c) { wxMessageBox(_("That criteria already exists"), _("Warning"), wxOK|wxICON_WARNING); return; } } searchCriteriaM.insert( std::pair(type, c)); rebuildList(); } //----------------------------------------------------------------------------- void AdvancedSearchFrame::rebuildList() { listctrl_criteria->DeleteAllItems(); long index = 0; for (CriteriaCollection::iterator it = searchCriteriaM.begin(); it != searchCriteriaM.end(); ++it) { listctrl_criteria->InsertItem(index, CriteriaItem::getTypeString((*it).first)); listctrl_criteria->SetItem(index, 1, (*it).second.value); listctrl_criteria->SetItemData(index, index); (*it).second.listIndex = index; index++; } // send size event wxSizeEvent ev(listctrl_criteria->GetSize()); listctrl_criteria->GetEventHandler()->AddPendingEvent(ev); } //----------------------------------------------------------------------------- void AdvancedSearchFrame::addResult(Database* db, MetadataItem* item) { int index = listctrl_results->GetItemCount(); listctrl_results->InsertItem(index, db->getServer()->getName_() + wxT("::") + db->getName_()); listctrl_results->SetItem(index, 1, item->getTypeName()); listctrl_results->SetItem(index, 2, item->getName_()); results.push_back(item); // become observer for that Item in case it gets dropped/deleted... item->attachObserver(this, false); // send size event wxSizeEvent ev(listctrl_results->GetSize()); listctrl_results->GetEventHandler()->AddPendingEvent(ev); } //----------------------------------------------------------------------------- // returns true if "text" matches all criteria of type "type" bool AdvancedSearchFrame::match(CriteriaItem::Type type, const wxString& text) { for (CriteriaCollection::const_iterator ci = searchCriteriaM.lower_bound(type); ci != searchCriteriaM.upper_bound(type); ++ci) { if (text.Upper().Matches((*ci).second.value)) return true; } return false; } //----------------------------------------------------------------------------- // OBSERVER functions void AdvancedSearchFrame::update() { } //----------------------------------------------------------------------------- void AdvancedSearchFrame::subjectRemoved(Subject* subject) { // NOTE: we can't do this dynamic_cast, since this function is called // from ~Subject() and ~Database() has already been called. So we // can't cast to Database (and not even MetadataItem) // Database *db = dynamic_cast(subject); // // Since we can't determine what it is by dynamic_cast, we try both: // STEP1: Check for database for (int i=choice_database->GetCount()-1; i>=0; i--) { // remove from choice_database Database *d = (Database *)choice_database->GetClientData(i); if (subject == d) { choice_database->Delete(i); choice_database->SetSelection(0); break; } } // remove from listctrl_criteria + searchCriteriaM bool removed_db = false; while (true) // in case iterators get invalidated on delete { CriteriaCollection::iterator it = searchCriteriaM.begin(); while (it != searchCriteriaM.end()) { if ((*it).second.database == subject) break; ++it; } if (it == searchCriteriaM.end()) // none to remove break; removed_db = true; searchCriteriaM.erase(it); } if (removed_db) rebuildList(); // STEP2: Check for criteria long itemIndex = 0; for (std::vector::iterator it = results.begin(); it != results.end(); ++it, itemIndex++) { if ((*it) == subject) { listctrl_results->DeleteItem(itemIndex); results.erase(it); break; } } } //----------------------------------------------------------------------------- BEGIN_EVENT_TABLE(AdvancedSearchFrame, wxFrame) EVT_LIST_ITEM_ACTIVATED(AdvancedSearchFrame::ID_listctrl_criteria, AdvancedSearchFrame::OnListCtrlCriteriaActivate) EVT_LIST_ITEM_RIGHT_CLICK(AdvancedSearchFrame::ID_listctrl_results, AdvancedSearchFrame::OnListCtrlResultsRightClick) EVT_LIST_ITEM_SELECTED(AdvancedSearchFrame::ID_listctrl_results, AdvancedSearchFrame::OnListCtrlResultsItemSelected) EVT_CHECKBOX(AdvancedSearchFrame::ID_checkbox_ddl, AdvancedSearchFrame::OnCheckboxDdlToggle) EVT_BUTTON(AdvancedSearchFrame::ID_button_remove, AdvancedSearchFrame::OnButtonRemoveClick) EVT_BUTTON(AdvancedSearchFrame::ID_button_start, AdvancedSearchFrame::OnButtonStartClick) EVT_BUTTON(AdvancedSearchFrame::ID_button_add_type, AdvancedSearchFrame::OnButtonAddTypeClick) EVT_BUTTON(AdvancedSearchFrame::ID_button_add_name, AdvancedSearchFrame::OnButtonAddNameClick) EVT_BUTTON(AdvancedSearchFrame::ID_button_add_description, AdvancedSearchFrame::OnButtonAddDescriptionClick) EVT_BUTTON(AdvancedSearchFrame::ID_button_add_ddl, AdvancedSearchFrame::OnButtonAddDDLClick) EVT_BUTTON(AdvancedSearchFrame::ID_button_add_field, AdvancedSearchFrame::OnButtonAddFieldClick) EVT_BUTTON(AdvancedSearchFrame::ID_button_add_database, AdvancedSearchFrame::OnButtonAddDatabaseClick) END_EVENT_TABLE() //----------------------------------------------------------------------------- // remove item on double-click/Enter void AdvancedSearchFrame::OnListCtrlCriteriaActivate(wxListEvent& event) { long index = event.GetIndex(); for (CriteriaCollection::iterator it = searchCriteriaM.begin(); it != searchCriteriaM.end(); ++it) { if ((*it).second.listIndex == index) { searchCriteriaM.erase(it); break; } } rebuildList(); } //----------------------------------------------------------------------------- // show DDL for selected item, and select it in main tree void AdvancedSearchFrame::OnListCtrlResultsItemSelected(wxListEvent& event) { MetadataItem *m = results[event.GetIndex()]; if (checkbox_ddl->IsChecked()) { CreateDDLVisitor cdv; m->acceptVisitor(&cdv); wxString sql(cdv.getSql()); stc_ddl->SetText(sql); sql.MakeUpper(); // highlight the found text int color = 0; // alternate red and blue color for different words for (CriteriaCollection::const_iterator ci = searchCriteriaM.lower_bound(CriteriaItem::ctDDL); ci != searchCriteriaM.upper_bound(CriteriaItem::ctDDL); ++ci, ++color) { int len = (*ci).second.value.Length() - 2; wxString sfind((*ci).second.value.Mid(1, len)); int p = -1; while (true) { p = sql.find(sfind, p+1); if (p == int(wxString::npos)) break; stc_ddl->StartStyling(p, 255); stc_ddl->SetStyling(len, 1+color%2); } } } MainFrame *mf = dynamic_cast(GetParent()); if (mf) { DBHTreeControl* tree = mf->getTreeCtrl(); if (tree) tree->selectMetadataItem(m); } } //----------------------------------------------------------------------------- void AdvancedSearchFrame::OnListCtrlResultsRightClick(wxListEvent& event) { MetadataItem *m = results[event.GetIndex()]; wxMenu MyMenu; ContextMenuMetadataItemVisitor cmv(&MyMenu); m->acceptVisitor(&cmv); PopupMenu(&MyMenu, ScreenToClient(wxGetMousePosition())); } //----------------------------------------------------------------------------- void AdvancedSearchFrame::OnCheckboxDdlToggle(wxCommandEvent& event) { if (event.IsChecked()) splitter1->SplitHorizontally(top_splitter_panel,bottom_splitter_panel); else splitter1->Unsplit(); } //----------------------------------------------------------------------------- void AdvancedSearchFrame::OnButtonRemoveClick(wxCommandEvent& WXUNUSED(event)) { // iterate all selected items and remove them from searchCriteriaM long item = -1; do { item = listctrl_criteria->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if (item != -1) { long index = listctrl_criteria->GetItemData(item); for (CriteriaCollection::iterator it = searchCriteriaM.begin(); it != searchCriteriaM.end(); ++it) { if ((*it).second.listIndex == index) { searchCriteriaM.erase(it); break; } } } } while (item != -1); rebuildList(); } //----------------------------------------------------------------------------- void AdvancedSearchFrame::OnButtonStartClick(wxCommandEvent& WXUNUSED(event)) { // build list of databases to search from if (searchCriteriaM.count(CriteriaItem::ctDB) == 0) { wxMessageBox(_("Please select at least one database to search."), _("No databases selected"), wxOK|wxICON_WARNING); return; } results.clear(); listctrl_results->DeleteAllItems(); // get all types we want to match, for faster lookup later std::set types; if (searchCriteriaM.count(CriteriaItem::ctType) != 0) { for (CriteriaCollection::const_iterator ct = searchCriteriaM.lower_bound(CriteriaItem::ctType); ct != searchCriteriaM.upper_bound(CriteriaItem::ctType); ++ct) { types.insert(getTypeByName((*ct).second.value)); } } int database_count = 0; for (CriteriaCollection::const_iterator cid = searchCriteriaM.lower_bound(CriteriaItem::ctDB); cid != searchCriteriaM.upper_bound(CriteriaItem::ctDB); ++cid) { database_count++; } // foreach database int current = 0; ProgressDialog pd(this, _("Searching..."), 2); pd.doShow(); for (CriteriaCollection::const_iterator cid = searchCriteriaM.lower_bound(CriteriaItem::ctDB); cid != searchCriteriaM.upper_bound(CriteriaItem::ctDB); ++cid) { if (pd.isCanceled()) return; pd.setProgressPosition(0, 2); Database *db = (*cid).second.database; if (!db->isConnected() && !connectDatabase(db, this, &pd)) continue; pd.initProgress(_("Searching database: ")+db->getName_(), database_count, current++, 1); std::vector colls; db->getCollections(colls, false); // false = not system objects for (std::vector::iterator col = colls.begin(); col != colls.end(); ++col) { std::vector ch; (*col)->getChildren(ch); pd.initProgress(wxEmptyString, ch.size(), 0, 2); for (std::vector::iterator it = ch.begin(); it != ch.end(); ++it) { if (!types.empty() && types.find((*it)->getType()) == types.end()) break; pd.setProgressMessage(_("Searching ") + (*col)->getName_() + wxT(": ") + (*it)->getName_(), 2); pd.stepProgress(1, 2); if (pd.isCanceled()) return; if (searchCriteriaM.count(CriteriaItem::ctName) > 0) { wxString name = (*it)->getName_(); if (!match(CriteriaItem::ctName, name)) continue; } if (searchCriteriaM.count(CriteriaItem::ctDescription) > 0) { wxString desc; if (!(*it)->getDescription(desc)) continue; if (!match(CriteriaItem::ctDescription, desc)) continue; } if (searchCriteriaM.count(CriteriaItem::ctDDL) > 0) { // TODO: add ProgressDialog, and link it up in here CreateDDLVisitor cdv; (*it)->acceptVisitor(&cdv); if (!match(CriteriaItem::ctDDL, cdv.getSql())) continue; } if (searchCriteriaM.count(CriteriaItem::ctField) > 0) { Relation* r = dynamic_cast(*it); Procedure* p = dynamic_cast(*it); if (r || p) { (*it)->ensureChildrenLoaded(); bool found = false; if (r) { ColumnPtrs::iterator it; for (it = r->begin(); it != r->end(); ++it) { if (match(CriteriaItem::ctField, (*it)->getName_())) { found = true; break; } } } if (p) { for (ParameterPtrs::iterator it = p->begin(); it != p->end(); ++it) { if (match(CriteriaItem::ctField, (*it)->getName_())) { found = true; break; } } } if (!found) // object doesn't contain that field continue; } } // everything criteria is matched -> add to results addResult(db, *it); } } } } //----------------------------------------------------------------------------- void AdvancedSearchFrame::OnButtonAddTypeClick(wxCommandEvent& WXUNUSED(event)) { addCriteria(CriteriaItem::ctType, choice_type->GetStringSelection()); } //----------------------------------------------------------------------------- void AdvancedSearchFrame::OnButtonAddNameClick(wxCommandEvent& WXUNUSED(event)) { addCriteria(CriteriaItem::ctName, textctrl_name->GetValue()); textctrl_name->Clear(); } //----------------------------------------------------------------------------- void AdvancedSearchFrame::OnButtonAddDescriptionClick(wxCommandEvent& WXUNUSED(event)) { addCriteria(CriteriaItem::ctDescription, textctrl_description->GetValue()); textctrl_description->Clear(); } //----------------------------------------------------------------------------- void AdvancedSearchFrame::OnButtonAddDDLClick(wxCommandEvent& WXUNUSED(event)) { addCriteria(CriteriaItem::ctDDL, textctrl_ddl->GetValue()); textctrl_ddl->Clear(); } //----------------------------------------------------------------------------- void AdvancedSearchFrame::OnButtonAddFieldClick(wxCommandEvent& WXUNUSED(event)) { addCriteria(CriteriaItem::ctField, textctrl_field->GetValue()); textctrl_field->Clear(); } //----------------------------------------------------------------------------- void AdvancedSearchFrame::OnButtonAddDatabaseClick( wxCommandEvent& WXUNUSED(event)) { if (choice_database->GetSelection() == 0) // all connected databases { for (size_t i = 1; i < choice_database->GetCount(); ++i) { Database* db = (Database *)choice_database->GetClientData(i); if (db && db->isConnected()) { addCriteria(CriteriaItem::ctDB, choice_database->GetString(i), db); } } } else // a single database { Database *db = (Database *) choice_database->GetClientData(choice_database->GetSelection()); addCriteria(CriteriaItem::ctDB, choice_database->GetStringSelection(), db); } } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/AdvancedSearchFrame.h000066400000000000000000000123701177057155300235400ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_ADVANCEDSEARCHFRAME_H #define FR_ADVANCEDSEARCHFRAME_H #include #include #include #include #include "core/Observer.h" #include "gui/BaseFrame.h" //----------------------------------------------------------------------------- class CriteriaItem { public: enum Type { ctType, ctName, ctDescription, ctDDL, ctField, ctDB }; wxString value; Database *database; // only used for ctDB type long listIndex; CriteriaItem(const wxString& v, Database *db) :value(v), database(db), listIndex(-1) { } bool operator==(const CriteriaItem& other) const { return (value == other.value && database == other.database); }; static wxString getTypeString(Type type) { switch (type) { case ctType: return _("Type is"); case ctName: return _("Name is"); case ctDescription: return _("Description contains"); case ctDDL: return _("DDL contains"); case ctField: return _("Has field"); case ctDB: return _("In database"); }; return wxEmptyString; } }; //----------------------------------------------------------------------------- class Database; class MetadataItem; class Root; class AdjustableListCtrl; // declaration in cpp file class MainFrame; class wxStyledTextCtrl; //----------------------------------------------------------------------------- class AdvancedSearchFrame : public BaseFrame, public Observer { private: typedef std::multimap CriteriaCollection; CriteriaCollection searchCriteriaM; void addCriteria(CriteriaItem::Type type, wxString value, Database *db = 0); void rebuildList(); std::vector results; void addResult(Database* db, MetadataItem* item); bool match(CriteriaItem::Type type, const wxString& text); // observer stuff virtual void subjectRemoved(Subject* subject); virtual void update(); protected: wxPanel *mainPanel; wxStaticText *m_staticText1; wxChoice *choice_type; wxButton *button_add_type; wxStaticText *m_staticText2; wxTextCtrl *textctrl_name; wxButton *button_add_name; wxStaticText *m_staticText3; wxTextCtrl *textctrl_description; wxButton *button_add_description; wxStaticText *m_staticText4; wxTextCtrl *textctrl_ddl; wxButton *button_add_ddl; wxStaticText *m_staticText5; wxTextCtrl *textctrl_field; wxButton *button_add_field; wxStaticText *m_staticText6; wxChoice *choice_database; wxButton *button_add_database; AdjustableListCtrl *listctrl_criteria; wxButton *button_remove; wxButton *button_search; wxStaticText *label_search_results; wxCheckBox *checkbox_ddl; wxSplitterWindow *splitter1; wxPanel *top_splitter_panel; AdjustableListCtrl *listctrl_results; wxPanel *bottom_splitter_panel; wxStyledTextCtrl *stc_ddl; public: AdvancedSearchFrame(MainFrame* parent, RootPtr root); enum { ID_button_remove=100, ID_button_start, ID_button_add_type, ID_button_add_name, ID_button_add_description, ID_button_add_ddl, ID_button_add_field, ID_button_add_database, ID_checkbox_ddl, ID_listctrl_criteria, ID_listctrl_results }; // events void OnCheckboxDdlToggle(wxCommandEvent& event); void OnButtonRemoveClick(wxCommandEvent& event); void OnButtonStartClick(wxCommandEvent& event); void OnButtonAddTypeClick(wxCommandEvent& event); void OnButtonAddNameClick(wxCommandEvent& event); void OnButtonAddDescriptionClick(wxCommandEvent& event); void OnButtonAddDDLClick(wxCommandEvent& event); void OnButtonAddFieldClick(wxCommandEvent& event); void OnButtonAddDatabaseClick(wxCommandEvent& event); void OnListCtrlResultsRightClick(wxListEvent& event); void OnListCtrlResultsItemSelected(wxListEvent& event); void OnListCtrlCriteriaActivate(wxListEvent& event); DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- #endif flamerobin_0.9.3~svn+2220.orig/src/gui/BackupFrame.cpp000066400000000000000000000376251177057155300224570ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include #include #include "core/StringUtils.h" #include "config/Config.h" #include "gui/BackupFrame.h" #include "gui/controls/DndTextControls.h" #include "gui/controls/LogTextControl.h" #include "gui/StyleGuide.h" #include "gui/UsernamePasswordDialog.h" #include "metadata/database.h" #include "metadata/server.h" //----------------------------------------------------------------------------- // worker thread class to perform database backup class BackupThread: public wxThread { public: BackupThread(BackupFrame* frame, wxString server, wxString username, wxString password, wxString dbfilename, wxString bkfilename, IBPP::BRF flags); virtual void* Entry(); virtual void OnExit(); private: BackupFrame* frameM; wxString serverM; wxString usernameM; wxString passwordM; wxString dbfileM; wxString bkfileM; IBPP::BRF brfM; void logError(wxString& msg); void logImportant(wxString& msg); void logProgress(wxString& msg); }; //----------------------------------------------------------------------------- BackupThread::BackupThread(BackupFrame* frame, wxString server, wxString username, wxString password, wxString dbfilename, wxString bkfilename, IBPP::BRF flags) : wxThread() { frameM = frame; serverM = server; usernameM = username; passwordM = password; dbfileM = dbfilename; bkfileM = bkfilename; // always use verbose flag brfM = (IBPP::BRF)((int)flags | (int)IBPP::brVerbose); } //----------------------------------------------------------------------------- void* BackupThread::Entry() { wxDateTime now; wxString msg; try { msg.Printf(_("Connecting to server %s..."), serverM.c_str()); logImportant(msg); IBPP::Service svc = IBPP::ServiceFactory(wx2std(serverM), wx2std(usernameM), wx2std(passwordM)); svc->Connect(); now = wxDateTime::Now(); msg.Printf(_("Database backup started %s"), now.FormatTime().c_str()); logImportant(msg); svc->StartBackup(wx2std(dbfileM), wx2std(bkfileM), brfM); while (true) { if (TestDestroy()) { now = wxDateTime::Now(); msg.Printf(_("Database backup canceled %s"), now.FormatTime().c_str()); logImportant(msg); break; } const char* c = svc->WaitMsg(); if (c == 0) { now = wxDateTime::Now(); msg.Printf(_("Database backup finished %s"), now.FormatTime().c_str()); logImportant(msg); break; } msg = std2wx(c); logProgress(msg); } svc->Disconnect(); } catch (IBPP::Exception& e) { now = wxDateTime::Now(); msg.Printf(_("Database backup canceled %s due to IBPP exception:\n\n"), now.FormatTime().c_str()); msg += std2wx(e.ErrorMessage()); logError(msg); } catch (...) { now = wxDateTime::Now(); msg.Printf(_("Database backup canceled %s due to exception"), now.FormatTime().c_str()); logError(msg); } return 0; } //----------------------------------------------------------------------------- void BackupThread::OnExit() { if (frameM != 0) { wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, BackupRestoreBaseFrame::ID_thread_finished); wxPostEvent(frameM, event); } } //----------------------------------------------------------------------------- void BackupThread::logError(wxString& msg) { if (frameM != 0) frameM->threadOutputMsg(msg, BackupRestoreBaseFrame::error_message); } //----------------------------------------------------------------------------- void BackupThread::logImportant(wxString& msg) { if (frameM != 0) frameM->threadOutputMsg(msg, BackupRestoreBaseFrame::important_message); } //----------------------------------------------------------------------------- void BackupThread::logProgress(wxString& msg) { if (frameM != 0) frameM->threadOutputMsg(msg, BackupRestoreBaseFrame::progress_message); } //----------------------------------------------------------------------------- BackupFrame::BackupFrame(wxWindow* parent, DatabasePtr db) : BackupRestoreBaseFrame(parent, db) { setIdString(this, getFrameId(db)); wxString databaseName(db->getName_()); wxString serverName(db->getServer()->getName_()); SetTitle(wxString::Format(_("Backup Database \"%s:%s\""), serverName.c_str(), databaseName.c_str())); createControls(); layoutControls(); updateControls(); text_ctrl_filename->SetFocus(); } //----------------------------------------------------------------------------- //! implementation details void BackupFrame::createControls() { panel_controls = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL | wxCLIP_CHILDREN); label_filename = new wxStaticText(panel_controls, wxID_ANY, _("Backup file:")); text_ctrl_filename = new FileTextControl(panel_controls, ID_text_ctrl_filename, wxEmptyString); button_browse = new wxButton(panel_controls, ID_button_browse, _("..."), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT); checkbox_checksum = new wxCheckBox(panel_controls, wxID_ANY, _("Ignore checksums")); checkbox_limbo = new wxCheckBox(panel_controls, wxID_ANY, _("Ignore limbo transactions")); checkbox_transport = new wxCheckBox(panel_controls, wxID_ANY, _("Use non-transportable format")); checkbox_metadata = new wxCheckBox(panel_controls, wxID_ANY, _("Only backup metadata")); checkbox_garbage = new wxCheckBox(panel_controls, wxID_ANY, _("Don't perform garbage collection")); checkbox_extern = new wxCheckBox(panel_controls, wxID_ANY, _("Convert external tables")); checkbox_showlog = new wxCheckBox(panel_controls, ID_checkbox_showlog, _("Show complete log")); button_start = new wxButton(panel_controls, ID_button_start, _("&Start Backup")); text_ctrl_log = new LogTextControl(this, ID_text_ctrl_log); } //----------------------------------------------------------------------------- void BackupFrame::layoutControls() { int wh = text_ctrl_filename->GetMinHeight(); button_browse->SetSize(wh, wh); wxBoxSizer* sizerFilename = new wxBoxSizer(wxHORIZONTAL); sizerFilename->Add(label_filename, 0, wxALIGN_CENTER_VERTICAL); sizerFilename->Add(styleguide().getControlLabelMargin(), 0); sizerFilename->Add(text_ctrl_filename, 1, wxALIGN_CENTER_VERTICAL); sizerFilename->Add(styleguide().getBrowseButtonMargin(), 0); sizerFilename->Add(button_browse, 0, wxALIGN_CENTER_VERTICAL); wxGridSizer* sizerChecks = new wxGridSizer(3, 2, styleguide().getCheckboxSpacing(), styleguide().getUnrelatedControlMargin(wxHORIZONTAL)); sizerChecks->Add(checkbox_checksum, 0, wxEXPAND); sizerChecks->Add(checkbox_metadata, 0, wxEXPAND); sizerChecks->Add(checkbox_limbo, 0, wxEXPAND); sizerChecks->Add(checkbox_garbage, 0, wxEXPAND); sizerChecks->Add(checkbox_transport, 0, wxEXPAND); sizerChecks->Add(checkbox_extern, 0, wxEXPAND); wxBoxSizer* sizerButtons = new wxBoxSizer(wxHORIZONTAL); sizerButtons->Add(checkbox_showlog, 0, wxALIGN_CENTER_VERTICAL); sizerButtons->Add(0, 0, 1, wxEXPAND); sizerButtons->Add(button_start); wxBoxSizer* sizerPanelV = new wxBoxSizer(wxVERTICAL); sizerPanelV->Add(0, styleguide().getFrameMargin(wxTOP)); sizerPanelV->Add(sizerFilename, 0, wxEXPAND); sizerPanelV->Add(0, styleguide().getRelatedControlMargin(wxVERTICAL)); sizerPanelV->Add(sizerChecks); sizerPanelV->Add(0, styleguide().getUnrelatedControlMargin(wxVERTICAL)); sizerPanelV->Add(sizerButtons, 0, wxEXPAND); sizerPanelV->Add(0, styleguide().getRelatedControlMargin(wxVERTICAL)); wxBoxSizer* sizerPanelH = new wxBoxSizer(wxHORIZONTAL); sizerPanelH->Add(styleguide().getFrameMargin(wxLEFT), 0); sizerPanelH->Add(sizerPanelV, 1, wxEXPAND); sizerPanelH->Add(styleguide().getFrameMargin(wxRIGHT), 0); panel_controls->SetSizerAndFit(sizerPanelH); wxBoxSizer* sizerMain = new wxBoxSizer(wxVERTICAL); sizerMain->Add(panel_controls, 0, wxEXPAND); sizerMain->Add(text_ctrl_log, 1, wxEXPAND); // show at least 3 lines of text since it is default size too sizerMain->SetItemMinSize(text_ctrl_log, -1, 3 * text_ctrl_filename->GetSize().GetHeight()); SetSizerAndFit(sizerMain); } //----------------------------------------------------------------------------- void BackupFrame::updateControls() { bool running = getThreadRunning(); button_browse->Enable(!running); text_ctrl_filename->Enable(!running); checkbox_checksum->Enable(!running); checkbox_limbo->Enable(!running); checkbox_metadata->Enable(!running); checkbox_garbage->Enable(!running); checkbox_transport->Enable(!running); checkbox_extern->Enable(!running); button_start->Enable(!running && !text_ctrl_filename->GetValue().empty()); } //----------------------------------------------------------------------------- void BackupFrame::doReadConfigSettings(const wxString& prefix) { BackupRestoreBaseFrame::doReadConfigSettings(prefix); wxArrayString flags; config().getValue(prefix + Config::pathSeparator + wxT("options"), flags); if (!flags.empty()) { checkbox_checksum->SetValue( flags.end() != std::find(flags.begin(), flags.end(), wxT("ignore_checksums"))); checkbox_limbo->SetValue( flags.end() != std::find(flags.begin(), flags.end(), wxT("ignore_limbo"))); checkbox_metadata->SetValue( flags.end() != std::find(flags.begin(), flags.end(), wxT("metadata_only"))); checkbox_garbage->SetValue( flags.end() != std::find(flags.begin(), flags.end(), wxT("no_garbage_collect"))); checkbox_transport->SetValue( flags.end() != std::find(flags.begin(), flags.end(), wxT("no_transportable"))); checkbox_extern->SetValue( flags.end() != std::find(flags.begin(), flags.end(), wxT("external_tables"))); } updateControls(); } //----------------------------------------------------------------------------- void BackupFrame::doWriteConfigSettings(const wxString& prefix) const { BackupRestoreBaseFrame::doWriteConfigSettings(prefix); wxArrayString flags; if (checkbox_checksum->IsChecked()) flags.push_back(wxT("ignore_checksums")); if (checkbox_limbo->IsChecked()) flags.push_back(wxT("ignore_limbo")); if (checkbox_metadata->IsChecked()) flags.push_back(wxT("metadata_only")); if (checkbox_garbage->IsChecked()) flags.push_back(wxT("no_garbage_collect")); if (checkbox_transport->IsChecked()) flags.push_back(wxT("no_transportable")); if (checkbox_extern->IsChecked()) flags.push_back(wxT("external_tables")); config().setValue(prefix + Config::pathSeparator + wxT("options"), flags); } //----------------------------------------------------------------------------- const wxString BackupFrame::getName() const { return wxT("BackupFrame"); } //----------------------------------------------------------------------------- /*static*/ wxString BackupFrame::getFrameId(DatabasePtr db) { if (db) return wxString(wxT("BackupFrame/") + db->getItemPath()); else return wxEmptyString; } //----------------------------------------------------------------------------- BackupFrame* BackupFrame::findFrameFor(DatabasePtr db) { BaseFrame* bf = frameFromIdString(getFrameId(db)); if (!bf) return 0; return dynamic_cast(bf); } //----------------------------------------------------------------------------- //! event handlers BEGIN_EVENT_TABLE(BackupFrame, BackupRestoreBaseFrame) EVT_BUTTON(BackupRestoreBaseFrame::ID_button_browse, BackupFrame::OnBrowseButtonClick) EVT_BUTTON(BackupRestoreBaseFrame::ID_button_start, BackupFrame::OnStartButtonClick) END_EVENT_TABLE() //----------------------------------------------------------------------------- void BackupFrame::OnBrowseButtonClick(wxCommandEvent& WXUNUSED(event)) { wxFileName origName(text_ctrl_filename->GetValue()); wxString filename = ::wxFileSelector(_("Select Backup File"), origName.GetPath(), origName.GetFullName(), wxT("*.fbk"), _("Backup file (*.fbk)|*.fbk|All files (*.*)|*.*"), wxFD_SAVE | wxFD_OVERWRITE_PROMPT, this); if (!filename.empty()) text_ctrl_filename->SetValue(filename); } //----------------------------------------------------------------------------- void BackupFrame::OnStartButtonClick(wxCommandEvent& WXUNUSED(event)) { verboseMsgsM = checkbox_showlog->IsChecked(); clearLog(); DatabasePtr database = getDatabase(); wxCHECK_RET(database, wxT("Cannot backup unassigned database")); ServerPtr server = database->getServer(); wxCHECK_RET(server, wxT("Cannot backup database without assigned server")); wxString username = database->getUsername(); wxString password = database->getDecryptedPassword(); if (password.empty()) { UsernamePasswordDialog upd(this, _("Database Credentials"), username, false, // allow different username _("Please enter a valid username and password:")); if (upd.ShowModal() == wxID_OK) { username = upd.getUsername(); password = upd.getPassword(); } } if (password.empty()) return; int flags = (int)IBPP::brVerbose; // this will be ORed in anyway if (checkbox_checksum->IsChecked()) flags |= (int)IBPP::brIgnoreChecksums; if (checkbox_limbo->IsChecked()) flags |= (int)IBPP::brIgnoreLimbo; if (checkbox_metadata->IsChecked()) flags |= (int)IBPP::brMetadataOnly; if (checkbox_garbage->IsChecked()) flags |= (int)IBPP::brNoGarbageCollect; if (checkbox_transport->IsChecked()) flags |= (int)IBPP::brNonTransportable; if (checkbox_extern->IsChecked()) flags |= (int)IBPP::brConvertExtTables; std::auto_ptr thread(new BackupThread(this, server->getConnectionString(), username, password, database->getPath(), text_ctrl_filename->GetValue(), (IBPP::BRF)flags)); startThread(thread); updateControls(); } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/BackupFrame.h000066400000000000000000000045631177057155300221170ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ //----------------------------------------------------------------------------- #ifndef BACKUPFRAME_H #define BACKUPFRAME_H #include #include "BackupRestoreBaseFrame.h" class BackupThread; //----------------------------------------------------------------------------- class BackupFrame: public BackupRestoreBaseFrame { friend class BackupThread; private: wxCheckBox* checkbox_checksum; wxCheckBox* checkbox_limbo; wxCheckBox* checkbox_metadata; wxCheckBox* checkbox_garbage; wxCheckBox* checkbox_transport; wxCheckBox* checkbox_extern; void createControls(); void layoutControls(); virtual void updateControls(); static wxString getFrameId(DatabasePtr db); protected: virtual void doReadConfigSettings(const wxString& prefix); virtual void doWriteConfigSettings(const wxString& prefix) const; virtual const wxString getName() const; public: BackupFrame(wxWindow* parent, DatabasePtr db); static BackupFrame* findFrameFor(DatabasePtr db); private: // event handling void OnBrowseButtonClick(wxCommandEvent& event); void OnStartButtonClick(wxCommandEvent& event); DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- #endif // BACKUPFRAME_H flamerobin_0.9.3~svn+2220.orig/src/gui/BackupRestoreBaseFrame.cpp000066400000000000000000000244341177057155300246100ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include "config/Config.h" #include "core/ArtProvider.h" #include "gui/BackupRestoreBaseFrame.h" #include "gui/controls/DndTextControls.h" #include "gui/controls/LogTextControl.h" #include "metadata/database.h" #include "metadata/server.h" //----------------------------------------------------------------------------- BackupRestoreBaseFrame::BackupRestoreBaseFrame(wxWindow* parent, DatabasePtr db) : BaseFrame(parent, wxID_ANY, wxEmptyString), databaseM(db), threadM(0) { wxASSERT(db); db->attachObserver(this, false); threadMsgTimeMillisM = 0; verboseMsgsM = true; // create controls in constructor of descendant class (correct tab order) panel_controls = 0; label_filename = 0; text_ctrl_filename = 0; button_browse = 0; checkbox_showlog = 0; button_start = 0; text_ctrl_log = 0; SetIcon(wxArtProvider::GetIcon(ART_Backup, wxART_FRAME_ICON)); } //----------------------------------------------------------------------------- //! implementation details void BackupRestoreBaseFrame::addThreadMsg(const wxString msg, bool& notificationNeeded) { notificationNeeded = false; wxLongLong millisNow = ::wxGetLocalTimeMillis(); wxCriticalSectionLocker locker(critsectM); threadMsgsM.Add(msg); // we post no more than 10 events per second to prevent flooding of // the message queue, and to keep the frame responsive for user interaction if ((millisNow - threadMsgTimeMillisM).GetLo() > 100) { threadMsgTimeMillisM = millisNow; notificationNeeded = true; } } //----------------------------------------------------------------------------- void BackupRestoreBaseFrame::cancelBackupRestore() { if (threadM != 0) { threadM->Delete(); threadM = 0; } } //----------------------------------------------------------------------------- void BackupRestoreBaseFrame::clearLog() { msgKindsM.Clear(); msgsM.Clear(); text_ctrl_log->ClearAll(); } //----------------------------------------------------------------------------- bool BackupRestoreBaseFrame::Destroy() { cancelBackupRestore(); return BaseFrame::Destroy(); } //----------------------------------------------------------------------------- void BackupRestoreBaseFrame::doReadConfigSettings(const wxString& prefix) { BaseFrame::doReadConfigSettings(prefix); bool verbose = true; config().getValue(prefix + Config::pathSeparator + wxT("verboselog"), verbose); checkbox_showlog->SetValue(verbose); wxString bkfile; config().getValue(prefix + Config::pathSeparator + wxT("backupfilename"), bkfile); if (!bkfile.empty()) text_ctrl_filename->SetValue(bkfile); } //----------------------------------------------------------------------------- void BackupRestoreBaseFrame::doWriteConfigSettings(const wxString& prefix) const { BaseFrame::doWriteConfigSettings(prefix); config().setValue(prefix + Config::pathSeparator + wxT("verboselog"), checkbox_showlog->GetValue()); config().setValue(prefix + Config::pathSeparator + wxT("backupfilename"), text_ctrl_filename->GetValue()); } //----------------------------------------------------------------------------- DatabasePtr BackupRestoreBaseFrame::getDatabase() const { return databaseM.lock(); } //----------------------------------------------------------------------------- const wxString BackupRestoreBaseFrame::getStorageName() const { if (DatabasePtr db = getDatabase()) return getName() + Config::pathSeparator + db->getItemPath(); return wxEmptyString; } //----------------------------------------------------------------------------- bool BackupRestoreBaseFrame::getThreadRunning() const { return threadM != 0; } //----------------------------------------------------------------------------- void BackupRestoreBaseFrame::subjectRemoved(Subject* subject) { DatabasePtr db = getDatabase(); if (!db || !db->isConnected() || subject == db.get()) Close(); } //----------------------------------------------------------------------------- bool BackupRestoreBaseFrame::startThread(std::auto_ptr thread) { wxASSERT(threadM == 0); if (wxTHREAD_NO_ERROR != thread->Create()) { ::wxMessageBox(_("Error creating thread!"), _("Error"), wxOK | wxICON_ERROR); return false; } if (wxTHREAD_NO_ERROR != thread->Run()) { ::wxMessageBox(_("Error starting thread!"), _("Error"), wxOK | wxICON_ERROR); return false; } threadM = thread.release(); return true; } //----------------------------------------------------------------------------- void BackupRestoreBaseFrame::threadOutputMsg(const wxString msg, MsgKind kind) { wxString s(msg); switch (kind) { case error_message: s.Prepend(wxT("e")); break; case important_message: s.Prepend(wxT("i")); break; case progress_message: s.Prepend(wxT("p")); break; default: wxASSERT(false); return; } bool doPostMsg = false; addThreadMsg(s, doPostMsg); if (doPostMsg) { wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, ID_thread_output); wxPostEvent(this, event); } } //----------------------------------------------------------------------------- void BackupRestoreBaseFrame::update() { DatabasePtr db = getDatabase(); if (db) updateControls(); else Close(); } //----------------------------------------------------------------------------- void BackupRestoreBaseFrame::updateControls() { // empty implementation to allow this to be called from update() // which could happen in the constructor, when descendant isn't // completely initialized yet } //----------------------------------------------------------------------------- void BackupRestoreBaseFrame::updateMessages(size_t firstmsg, size_t lastmsg) { if (lastmsg > msgsM.GetCount()) lastmsg = msgsM.GetCount(); for (size_t i = firstmsg; i < lastmsg; i++) { switch ((MsgKind)msgKindsM[i]) { case progress_message: if (verboseMsgsM) text_ctrl_log->logMsg(msgsM[i]); break; case important_message: text_ctrl_log->logImportantMsg(msgsM[i]); break; case error_message: text_ctrl_log->logErrorMsg(msgsM[i]); break; } } } //----------------------------------------------------------------------------- //! event handlers BEGIN_EVENT_TABLE(BackupRestoreBaseFrame, BaseFrame) EVT_CHECKBOX(BackupRestoreBaseFrame::ID_checkbox_showlog, BackupRestoreBaseFrame::OnVerboseLogChange) EVT_MENU(BackupRestoreBaseFrame::ID_thread_finished, BackupRestoreBaseFrame::OnThreadFinished) EVT_MENU(BackupRestoreBaseFrame::ID_thread_output, BackupRestoreBaseFrame::OnThreadOutput) EVT_TEXT(BackupRestoreBaseFrame::ID_text_ctrl_filename, BackupRestoreBaseFrame::OnSettingsChange) END_EVENT_TABLE() //----------------------------------------------------------------------------- void BackupRestoreBaseFrame::OnSettingsChange(wxCommandEvent& WXUNUSED(event)) { if (IsShown()) updateControls(); } //----------------------------------------------------------------------------- void BackupRestoreBaseFrame::OnThreadFinished(wxCommandEvent& event) { threadM = 0; OnThreadOutput(event); updateControls(); } //----------------------------------------------------------------------------- void BackupRestoreBaseFrame::OnThreadOutput(wxCommandEvent& WXUNUSED(event)) { wxCriticalSectionLocker locker(critsectM); threadMsgTimeMillisM = ::wxGetLocalTimeMillis(); size_t first = msgsM.GetCount(); for (size_t i = 0; i < threadMsgsM.GetCount(); i++) { wxString s(threadMsgsM[i]); if (s.Length() == 0) continue; switch ((wxChar)s[0]) { case 'e': msgKindsM.Add((int)error_message); break; case 'i': msgKindsM.Add((int)important_message); break; case 'p': msgKindsM.Add((int)progress_message); break; } // this depends on server type, so just in case... if (s.Last() != '\n') s.Append('\n'); msgsM.Add(s.Mid(1)); } threadMsgsM.Clear(); updateMessages(first, msgsM.GetCount()); } //----------------------------------------------------------------------------- void BackupRestoreBaseFrame::OnVerboseLogChange(wxCommandEvent& WXUNUSED(event)) { wxBusyCursor wait; verboseMsgsM = checkbox_showlog->IsChecked(); wxWindowUpdateLocker freeze(text_ctrl_log); text_ctrl_log->ClearAll(); updateMessages(0, msgsM.GetCount()); } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/BackupRestoreBaseFrame.h000066400000000000000000000074111177057155300242510ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ //----------------------------------------------------------------------------- #ifndef BACKUPRESTOREBASEFRAME_H #define BACKUPRESTOREBASEFRAME_H #include #include #include #include "core/Observer.h" #include "gui/BaseFrame.h" #include "metadata/database.h" #include "metadata/MetadataClasses.h" class FileTextControl; class LogTextControl; //----------------------------------------------------------------------------- class BackupRestoreBaseFrame: public BaseFrame, public Observer { public: enum MsgKind { progress_message, important_message, error_message }; enum { ID_thread_output = 500, ID_thread_finished }; // make sure that thread gets deleted virtual bool Destroy(); protected: wxArrayString msgsM; wxArrayInt msgKindsM; bool verboseMsgsM; DatabasePtr getDatabase() const; void cancelBackupRestore(); void clearLog(); virtual void doReadConfigSettings(const wxString& prefix); virtual void doWriteConfigSettings(const wxString& prefix) const; virtual const wxString getStorageName() const; // set threadM if thread was successfully created and started, // otherwise delete the thread bool startThread(std::auto_ptr thread); bool getThreadRunning() const; void threadOutputMsg(const wxString msg, MsgKind kind); virtual void updateControls(); BackupRestoreBaseFrame(wxWindow* parent, DatabasePtr db); private: DatabaseWeakPtr databaseM; wxThread* threadM; wxCriticalSection critsectM; wxArrayString threadMsgsM; wxLongLong threadMsgTimeMillisM; void addThreadMsg(const wxString msg, bool& notificationNeeded); void updateMessages(size_t firstmsg, size_t lastmsg); // observer stuff virtual void subjectRemoved(Subject* subject); virtual void update(); protected: enum { ID_text_ctrl_filename = 101, ID_button_browse, ID_button_showlog, ID_text_ctrl_log, ID_checkbox_showlog, ID_button_start, }; wxPanel* panel_controls; wxStaticText* label_filename; FileTextControl* text_ctrl_filename; wxButton* button_browse; wxCheckBox* checkbox_showlog; wxButton* button_start; LogTextControl* text_ctrl_log; void setupControls(); private: // event handling void OnSettingsChange(wxCommandEvent& event); void OnThreadFinished(wxCommandEvent& event); void OnThreadOutput(wxCommandEvent& event); void OnVerboseLogChange(wxCommandEvent& event); DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- #endif // BACKUPRESTOREBASEFRAME_H flamerobin_0.9.3~svn+2220.orig/src/gui/BaseDialog.cpp000066400000000000000000000201631177057155300222560ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "config/Config.h" #include "gui/BaseDialog.h" #include "gui/StyleGuide.h" //----------------------------------------------------------------------------- BaseDialog::BaseDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style) : wxDialog(parent, id, title, pos, size, style) { panel_controls = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL | wxCLIP_CHILDREN | wxNO_BORDER); } //----------------------------------------------------------------------------- wxPanel* BaseDialog::getControlsPanel() { return panel_controls; } //----------------------------------------------------------------------------- void BaseDialog::layoutSizers(wxSizer* controls, wxSizer* buttons, bool expandControls) { wxBoxSizer* sizerVert = new wxBoxSizer(wxVERTICAL); sizerVert->AddSpacer(styleguide().getDialogMargin(wxTOP)); if (controls) { sizerVert->Add(controls, expandControls ? 1 : 0, wxEXPAND); // make buttons align to bottom of dialog sizerVert->Add(0, styleguide().getDialogMargin(wxBOTTOM), expandControls ? 0 : 1, wxEXPAND); } sizerVert->Add(buttons, 0, wxEXPAND); sizerVert->AddSpacer(styleguide().getDialogMargin(wxBOTTOM)); wxBoxSizer* sizerHorz = new wxBoxSizer(wxHORIZONTAL); sizerHorz->AddSpacer(styleguide().getDialogMargin(wxLEFT)); sizerHorz->Add(sizerVert, 1, wxEXPAND); sizerHorz->AddSpacer(styleguide().getDialogMargin(wxRIGHT)); wxBoxSizer* sizerAll = new wxBoxSizer(wxHORIZONTAL); sizerAll->Add(sizerHorz, 1, wxEXPAND); panel_controls->SetSizer(sizerAll); sizerAll->Fit(this); sizerAll->SetSizeHints(this); } //----------------------------------------------------------------------------- bool BaseDialog::Show(bool show) { if (show) readConfigSettings(); else writeConfigSettings(); return wxDialog::Show(show); } //----------------------------------------------------------------------------- BaseDialog::~BaseDialog() { } //----------------------------------------------------------------------------- //! updates colors of controls void BaseDialog::updateColors(wxWindow *parent) { if (parent == 0) parent = this; const wxColour silver = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE); wxWindowList& l = parent->GetChildren(); for (wxWindowList::const_iterator it = l.begin(); it != l.end(); ++it) { if (dynamic_cast(*it)) { updateColors(dynamic_cast(*it)); continue; } // wxNullColour = reset to default. We must use that instead of // white or wxSYS_COLOUR_WINDOW or whatever since it only wxNullColour // works properly with wxGTK wxTextCtrl *tc = dynamic_cast(*it); if (tc) tc->SetBackgroundColour(tc->IsEditable() ? wxNullColour : silver); } } //----------------------------------------------------------------------------- void BaseDialog::readConfigSettings() { // default to centered dialogs bool centered = config().get(wxT("centerDialogOnParent"), true); if (config().get(wxT("FrameStorage"), false)) { wxString itemPrefix = getStorageName(); if (!itemPrefix.empty()) { wxRect r = getDefaultRect(); if (getConfigStoresWidth()) config().getValue(itemPrefix + Config::pathSeparator + wxT("width"), r.width); if (getConfigStoresHeight()) config().getValue(itemPrefix + Config::pathSeparator + wxT("height"), r.height); doReadConfigSettings(itemPrefix); if (r.width > 0 || r.height > 0) SetSize(r.width, r.height); // default to global setting, set to 0 to disable // restore the position if we don't want it centered config().getValue(itemPrefix + Config::pathSeparator + wxT("centerDialogOnParent"), centered); if (!centered) { config().getValue(itemPrefix + Config::pathSeparator + wxT("x"), r.x); config().getValue(itemPrefix + Config::pathSeparator + wxT("y"), r.y); SetSize(r); } } } if (centered) Centre(wxCENTER_FRAME | wxBOTH); } //----------------------------------------------------------------------------- void BaseDialog::doReadConfigSettings(const wxString& WXUNUSED(prefix)) { } //----------------------------------------------------------------------------- void BaseDialog::writeConfigSettings() const { if (config().get(wxT("FrameStorage"), false) && !IsIconized()) { // wxFileConfig::Flush() should only be called once SubjectLocker locker(&config()); // save window size to config. wxString itemPrefix = getStorageName(); if (!itemPrefix.empty()) { wxRect r = GetRect(); config().setValue(itemPrefix + Config::pathSeparator + wxT("width"), r.width); config().setValue(itemPrefix + Config::pathSeparator + wxT("height"), r.height); bool centered = true; config().getValue(itemPrefix + Config::pathSeparator + wxT("centerDialogOnParent"), centered); if (!centered) { config().setValue(itemPrefix + Config::pathSeparator + wxT("x"), r.x); config().setValue(itemPrefix + Config::pathSeparator + wxT("y"), r.y); } doWriteConfigSettings(itemPrefix); } } } //----------------------------------------------------------------------------- void BaseDialog::doWriteConfigSettings(const wxString& WXUNUSED(prefix)) const { } //----------------------------------------------------------------------------- const wxString BaseDialog::getName() const { // Couldn't find a reliable (meaning supportable and cross-platform) way // to use the class name here, so every derived frame needs to override getName() // if it needs to use features that depend on it. return wxT(""); } //----------------------------------------------------------------------------- const wxString BaseDialog::getStorageName() const { return getName(); } //----------------------------------------------------------------------------- const wxRect BaseDialog::getDefaultRect() const { return wxRect(-1, -1, -1, -1); } //----------------------------------------------------------------------------- bool BaseDialog::getConfigStoresWidth() const { return true; } //----------------------------------------------------------------------------- bool BaseDialog::getConfigStoresHeight() const { return true; } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/BaseDialog.h000066400000000000000000000076211177057155300217270ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef BASEDIALOG_H #define BASEDIALOG_H #include //----------------------------------------------------------------------------- // Base class for dialogs in FlameRobin. Implements helper methods to ease // dynamic layout. class BaseDialog: public wxDialog { public: BaseDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER); virtual bool Show(bool show = TRUE); virtual ~BaseDialog(); protected: void layoutSizers(wxSizer* controls, wxSizer* buttons, bool expandControls = false); wxPanel* getControlsPanel(); // Update the colors of textboxes void updateColors(wxWindow *parent = 0); // Reads any settings from config. The predefined implementation reads // the size of the dialog based on getStorageName(). No need to call // it directly except when wanting to "reload" the saved settings. void readConfigSettings(); // Use this to customize which settings are read from config(). virtual void doReadConfigSettings(const wxString& prefix); // Writes any settings to config. The predefined implementation saves // the size of the dialog based on getStorageName(). No need to call // it directly except when wanting to save settings without destroying the // dialog. void writeConfigSettings() const; // Use this to customize which settings are written to config(). virtual void doWriteConfigSettings(const wxString& prefix) const; // Returns the name of the dialog for storage purpose. // A dialog that wants its settings stored and retrieved must override this // function and return a nonempty wxString. The predefined implementation // returns getName(). virtual const wxString getStorageName() const; // Returns the name of the dialog, which can be the same for all instances // of the class or different for each instance. Currently it isn't really // used except as a base for getStorageName(). // The predefined implementation returns "". virtual const wxString getName() const; // Returns the default position and size for the dialog; it's called by // readConfigSettings() to get first-time default position and size. // The predefined implementation returns -1 for all 4 items. virtual const wxRect getDefaultRect() const; // Returns true in default implementation, but allows for descendent // classes to always come up in minimal width or height - just return // false in overridden methods. virtual bool getConfigStoresWidth() const; virtual bool getConfigStoresHeight() const; private: wxPanel* panel_controls; }; //----------------------------------------------------------------------------- #endif // BASEDIALOG_H flamerobin_0.9.3~svn+2220.orig/src/gui/BaseFrame.cpp000066400000000000000000000200221177057155300221030ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #if defined(__WXMSW__) #include "wx/msw/wrapwin.h" // for "windows.h" #endif #include "config/Config.h" #include "gui/BaseFrame.h" //----------------------------------------------------------------------------- BaseFrame::FrameIdMap BaseFrame::frameIdsM; //----------------------------------------------------------------------------- BaseFrame::BaseFrame(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style, const wxString& name) : wxFrame(parent, id, title, pos, size, style, name) { frameIdsM.insert(FrameIdPair(this, wxEmptyString)); Connect(wxEVT_CLOSE_WINDOW, wxCloseEventHandler(BaseFrame::OnClose)); } //----------------------------------------------------------------------------- BaseFrame::~BaseFrame() { frameIdsM.erase(this); } //----------------------------------------------------------------------------- bool BaseFrame::Show(bool show) { if (show && !IsShown()) readConfigSettings(); return wxFrame::Show(show); } //----------------------------------------------------------------------------- bool BaseFrame::Destroy() { writeConfigSettings(); return wxFrame::Destroy(); } //----------------------------------------------------------------------------- bool BaseFrame::canClose() { return doCanClose(); } //----------------------------------------------------------------------------- bool BaseFrame::doCanClose() { return true; } //----------------------------------------------------------------------------- void BaseFrame::doBeforeDestroy() { } //----------------------------------------------------------------------------- void BaseFrame::readConfigSettings() { // load position and size from config; it values are not set, they will be untouched wxRect r = getDefaultRect(); bool enabled = false; bool maximized = false; if (config().getValue(wxT("FrameStorage"), enabled) && enabled) { wxString itemPrefix = getStorageName(); if (!itemPrefix.empty()) { config().getValue(itemPrefix + Config::pathSeparator + wxT("maximized"), maximized); config().getValue(itemPrefix + Config::pathSeparator + wxT("x"), r.x); config().getValue(itemPrefix + Config::pathSeparator + wxT("y"), r.y); config().getValue(itemPrefix + Config::pathSeparator + wxT("width"), r.width); config().getValue(itemPrefix + Config::pathSeparator + wxT("height"), r.height); doReadConfigSettings(itemPrefix); } } SetSize(r); if (maximized) Maximize(); } void BaseFrame::doReadConfigSettings(const wxString& WXUNUSED(prefix)) { } //----------------------------------------------------------------------------- void BaseFrame::writeConfigSettings() const { // wxFileConfig::Flush() should only be called once SubjectLocker locker(&config()); // propagate call to children frames. const wxWindowList& children = GetChildren(); for (wxWindowList::const_iterator it = children.begin(); it != children.end(); ++it) { BaseFrame *f = dynamic_cast(*it); if (f) f->writeConfigSettings(); } if (config().get(wxT("FrameStorage"), false) && !IsIconized()) // don't save for minimized windows { // save window position and size to config. wxString itemPrefix = getStorageName(); if (!itemPrefix.empty()) { wxRect r = GetRect(); // TODO: move this to a better place when source is refactored #ifdef __WIN32__ WINDOWPLACEMENT wp; wp.length = sizeof(WINDOWPLACEMENT); if (::GetWindowPlacement((HWND)GetHandle(), &wp) && IsMaximized()) { r.SetLeft(wp.rcNormalPosition.left); r.SetTop(wp.rcNormalPosition.top); r.SetRight(wp.rcNormalPosition.right); r.SetBottom(wp.rcNormalPosition.bottom); } config().setValue(itemPrefix + Config::pathSeparator + wxT("maximized"), IsMaximized()); #endif config().setValue(itemPrefix + Config::pathSeparator + wxT("x"), r.x); config().setValue(itemPrefix + Config::pathSeparator + wxT("y"), r.y); config().setValue(itemPrefix + Config::pathSeparator + wxT("width"), r.width); config().setValue(itemPrefix + Config::pathSeparator + wxT("height"), r.height); doWriteConfigSettings(itemPrefix); } } } //----------------------------------------------------------------------------- void BaseFrame::doWriteConfigSettings(const wxString& WXUNUSED(prefix)) const { } //----------------------------------------------------------------------------- const wxString BaseFrame::getName() const { // Couldn't find a reliable (meaning supportable and cross-platform) way // to use the class name here, so every derived frame needs to override getName() // if it needs to use features that depend on it. return wxT(""); } //----------------------------------------------------------------------------- const wxString BaseFrame::getStorageName() const { return getName(); } //----------------------------------------------------------------------------- const wxRect BaseFrame::getDefaultRect() const { return wxRect(wxDefaultPosition, wxDefaultSize); } //----------------------------------------------------------------------------- /* static */ void BaseFrame::setIdString(BaseFrame* frame, const wxString& id) { FrameIdMap::iterator it = frameIdsM.find(frame); if (it != frameIdsM.end()) (*it).second = id; } //----------------------------------------------------------------------------- /* static */ BaseFrame* BaseFrame::frameFromIdString(const wxString& id) { if (!id.empty()) { FrameIdMap::iterator it; for (it = frameIdsM.begin(); it != frameIdsM.end(); it++) { if ((*it).second == id) return (*it).first; } } return 0; } //----------------------------------------------------------------------------- /* static */ std::vector BaseFrame::getFrames() { std::vector frames; FrameIdMap::iterator it; for (it = frameIdsM.begin(); it != frameIdsM.end(); it++) frames.push_back((*it).first); return frames; } //----------------------------------------------------------------------------- // event handling void BaseFrame::OnClose(wxCloseEvent& event) { if (event.CanVeto() && !doCanClose()) { event.Veto(); return; } doBeforeDestroy(); Destroy(); } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/BaseFrame.h000066400000000000000000000115561177057155300215640ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ //----------------------------------------------------------------------------- #ifndef BASEFRAME_H #define BASEFRAME_H #include #include //----------------------------------------------------------------------------- // Base class for all the frames in FlameRobin. Implements storing and restoring // of settings in config and other commonalities. class BaseFrame: public wxFrame { private: typedef std::map FrameIdMap; typedef FrameIdMap::value_type FrameIdPair; static FrameIdMap frameIdsM; // Override to implement checks and show confirmation dialogs to prevent // closing of the frame if necessary. virtual bool doCanClose(); // Override to execute code immediately before frame is destroyed. virtual void doBeforeDestroy(); protected: // Reads any settings from config. The predefined implementation reads // size and position of the frame based on getStorageName(). No need to call // it directly except when wanting to "reload" the saved settings. void readConfigSettings(); // Use this to customize which settings are read from config(). virtual void doReadConfigSettings(const wxString& prefix); // Writes any settings to config. The predefined implementation saves // size and position of the frame based on getStorageName(). No need to call // it directly except when wanting to save settings without destroying the // frame. void writeConfigSettings() const; // Use this to customize which settings are written to config(). virtual void doWriteConfigSettings(const wxString& prefix) const; // Returns the name of the frame for storage purpose. // A frame that wants its settings stored and retrieved must override this // function and return a nonempty wxString. The predefined implementation // returns getName(). virtual const wxString getStorageName() const; // Returns the name of the frame, which can be the same for all instances // of the class or different for each instance. Currently it isn't really // used except as a base for getStorageName(). // The predefined implementation returns "". virtual const wxString getName() const; // Returns the default position and size for the frame; it's called by // readConfigSettings() to get first-time default position and size. // The predefined implementation returns -1 for all 4 items. virtual const wxRect getDefaultRect() const; // Maintains the connection between the frame object and its id string. // The id string may be constant over the lifetime of the frame // (e.g. "BackupFrame/database_42"), or it may change with the content // of the frame (e.g. different property pages in the same MIPFrame may // have different id strings). static void setIdString(BaseFrame* frame, const wxString& id); // Returns the first frame with a given id string. Note that more than // one frame can exist for a given id string. static BaseFrame* frameFromIdString(const wxString& id); public: BaseFrame(wxWindow* parent, int id, const wxString& title, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_FRAME_STYLE, const wxString& name = wxT("FlameRobin")); virtual ~BaseFrame(); virtual bool Show(bool show = TRUE); virtual bool Destroy(); // Returns whether the frame can be closed, potentially showing // confirmation dialogs to the user // Override doCanClose() in descendent classes to implement this bool canClose(); static std::vector getFrames(); private: // event handling void OnClose(wxCloseEvent& event); }; //----------------------------------------------------------------------------- #endif // BASEFRAME_H flamerobin_0.9.3~svn+2220.orig/src/gui/CommandIds.h000066400000000000000000000105311177057155300217450ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_COMMANDIDS_H #define FR_COMMANDIDS_H //---------------------------------------------------------------------------- namespace Cmds { enum { // SQL View: View_Editor = 401, View_Statistics, View_Data, View_SplitView, View_Wrap_long_lines, View_Set_editor_font, Find_Selected_Object, // SQL History History_Search, History_EnableLogging, // SQL Query Query_Execute, Query_Show_plan, Query_Execute_selection, Query_Execute_from_cursor, Query_Commit, Query_Rollback, // next 4: order is important, because EVT_MENU_RANGE is used Query_TransactionConcurrency, Query_TransactionReadDirty, Query_TransactionReadCommitted, Query_TransactionConsistency, Query_TransactionLockResolution, Query_TransactionReadOnly, // SQL Data grid DataGrid_Insert_row, DataGrid_Delete_row, DataGrid_SetFieldToNULL, DataGrid_FetchAll, DataGrid_CancelFetchAll, DataGrid_EditBlob, DataGrid_ExportBlob, DataGrid_ImportBlob, DataGrid_Copy_as_insert, DataGrid_Copy_as_inList, DataGrid_Copy_as_update, DataGrid_Save_as_html, DataGrid_Save_as_csv, DataGrid_Set_header_font, DataGrid_Set_cell_font, DataGrid_Log_changes, Menu_RegisterServer = 600, Menu_Manual, Menu_RelNotes, Menu_License, Menu_URLHomePage, Menu_URLProjectPage, Menu_URLFeatureRequest, Menu_URLBugReport, Menu_NewObject, Menu_DatabaseRegistrationInfo, Menu_RegisterDatabase, Menu_CreateDatabase, Menu_ManageUsers, Menu_UnRegisterServer, Menu_ServerProperties, Menu_Reconnect, Menu_ConnectAs, Menu_ExecuteProcedure, Menu_UnRegisterDatabase, Menu_Backup, Menu_Restore, Menu_Connect, Menu_Disconnect, Menu_ExecuteStatements, Menu_CreateObject, Menu_DatabasePreferences, Menu_ShowAllGeneratorValues, Menu_BrowseData, Menu_LoadColumnsInfo, Menu_ObjectProperties, Menu_ObjectRefresh, Menu_DropObject, Menu_ShowGeneratorValue, Menu_SetGeneratorValue, Menu_AddColumn, Menu_RestoreIntoNew, Menu_MonitorEvents, Menu_GetServerVersion, Menu_AlterObject, Menu_DropDatabase, Menu_RecreateDatabase, Menu_DatabaseProperties, Menu_GenerateData, Menu_CloneDatabase, // view menu Menu_ToggleStatusBar, Menu_ToggleSearchBar, Menu_ToggleDisconnected, // create new ... (stuff) Menu_CreateDomain, Menu_CreateException, Menu_CreateFunction, Menu_CreateGenerator, Menu_CreateProcedure, Menu_CreateRole, Menu_CreateTable, Menu_CreateTrigger, Menu_CreateView, // blob editor BlobEditor_ChangeLineBreak, BlobEditor_Menu_BLOB, BlobEditor_Menu_BLOBSaveToFile, BlobEditor_Menu_BLOBLoadFromFile, BlobEditor_ProgressCancel, // 100 templates Menu_TemplateFirst = 700, Menu_TemplateLast = 799, Menu_TemplateMenu, // for easier copy/paste of above items (no need to mess with comma) Last_menu }; }; //---------------------------------------------------------------------------- #endif flamerobin_0.9.3~svn+2220.orig/src/gui/CommandManager.cpp000066400000000000000000000132371177057155300231410ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ //----------------------------------------------------------------------------- // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include "gui/CommandIds.h" #include "gui/CommandManager.h" //----------------------------------------------------------------------------- CommandManager::CommandManager() { init(); } //----------------------------------------------------------------------------- bool CommandManager::findShortcutFor(int id, int& flags, int& keyCode) { // our own commands ShortCutDataMap::const_iterator it; it = shortcutsM.find(id); if (it != shortcutsM.end()) { ShortCutData scd(it->second); flags = scd.flags; keyCode = scd.keyCode; return true; } // standard commands wxAcceleratorEntry ae(wxGetStockAccelerator(id)); if (ae.IsOk()) { flags = ae.GetFlags(); keyCode = ae.GetKeyCode(); return true; } return false; } //----------------------------------------------------------------------------- wxString CommandManager::getShortcutText(int id) { int flags, keyCode; if (findShortcutFor(id, flags, keyCode)) { // with different flags != wxACCEL_NORMAL ToString() will return stuff // like "Alt-Ctrl-X" -> fix this to read "Ctrl+Alt+X" instead wxString flagsText; if (flags & wxACCEL_SHIFT) flagsText += _("Shift+"); if (flags & wxACCEL_CTRL) flagsText += _("Ctrl+"); if (flags & wxACCEL_ALT) flagsText += _("Alt+"); wxAcceleratorEntry ae(wxACCEL_NORMAL, keyCode, id); return flagsText + ae.ToString(); } return wxEmptyString; } //----------------------------------------------------------------------------- wxString CommandManager::getMainMenuItemText(const wxString& text, int id) { wxString shortcut(getShortcutText(id)); return (shortcut.empty() ? text : text + wxT("\t") + shortcut); } //----------------------------------------------------------------------------- wxString CommandManager::getPopupMenuItemText(const wxString& text, int id) { bool appendShortcuts = false; // user interface guidelines state that popup menus should not // show keyboard shortcuts // could however be activated for wxGTK here... if (appendShortcuts) { wxString shortcut(getShortcutText(id)); if (!shortcut.empty()) return text + wxT("\t") + shortcut; } return text; } //----------------------------------------------------------------------------- wxString CommandManager::getToolbarHint(const wxString& text, int id) { wxString shortcut(getShortcutText(id)); return (shortcut.empty() ? text : text + wxT(" (") + shortcut + wxT(")")); } //----------------------------------------------------------------------------- void CommandManager::init() { ShortCutData scd; // missing from the stock command list: "Select All" scd.flags = wxACCEL_CTRL; scd.keyCode = 'A'; shortcutsM.insert(ShortCutDataPair(wxID_SELECTALL, scd)); // missing from the stock command list / wrong shortcut for Windows: // "Undo", "Redo" scd.flags = wxACCEL_CTRL; scd.keyCode = 'Z'; shortcutsM.insert(ShortCutDataPair(wxID_UNDO, scd)); if (wxPlatformInfo::Get().GetOperatingSystemId() & wxOS_WINDOWS) scd.keyCode = 'Y'; else scd.flags = wxACCEL_CTRL | wxACCEL_SHIFT; shortcutsM.insert(ShortCutDataPair(wxID_REDO, scd)); // statement execution commands scd.flags = wxACCEL_NORMAL; scd.keyCode = WXK_F4; shortcutsM.insert(ShortCutDataPair(Cmds::Query_Execute, scd)); scd.keyCode = WXK_F5; shortcutsM.insert(ShortCutDataPair(Cmds::Query_Commit, scd)); scd.keyCode = WXK_F8; shortcutsM.insert(ShortCutDataPair(Cmds::Query_Rollback, scd)); // view commands scd.flags = wxACCEL_CTRL | wxACCEL_ALT; scd.keyCode = 'E'; shortcutsM.insert(ShortCutDataPair(Cmds::View_Editor, scd)); scd.keyCode = 'L'; shortcutsM.insert(ShortCutDataPair(Cmds::View_Statistics, scd)); scd.keyCode = 'D'; shortcutsM.insert(ShortCutDataPair(Cmds::View_Data, scd)); scd.keyCode = 'S'; shortcutsM.insert(ShortCutDataPair(Cmds::View_SplitView, scd)); } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/CommandManager.h000066400000000000000000000037101177057155300226010ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_COMMANDMANAGER_H #define FR_COMMANDMANAGER_H //---------------------------------------------------------------------------- #include class CommandManager { private: struct ShortCutData { int flags; int keyCode; }; typedef std::multimap ShortCutDataMap; typedef std::pair ShortCutDataPair; ShortCutDataMap shortcutsM; bool findShortcutFor(int id, int& flags, int& keyCode); wxString getShortcutText(int id); void init(); public: CommandManager(); wxString getMainMenuItemText(const wxString& text, int id); wxString getPopupMenuItemText(const wxString& text, int id); wxString getToolbarHint(const wxString& text, int id); }; //---------------------------------------------------------------------------- #endif // FR_COMMANDMANAGER_H flamerobin_0.9.3~svn+2220.orig/src/gui/ConfdefTemplateProcessor.cpp000066400000000000000000000045401177057155300252250ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "core/StringUtils.h" #include "gui/ConfdefTemplateProcessor.h" //----------------------------------------------------------------------------- ConfdefTemplateProcessor::ConfdefTemplateProcessor(ProcessableObject* object, wxWindow*window) : TemplateProcessor(object, window) { } //----------------------------------------------------------------------------- void ConfdefTemplateProcessor::processCommand(const wxString& cmdName, const TemplateCmdParams& cmdParams, ProcessableObject* object, wxString& processedText) { TemplateProcessor::processCommand(cmdName, cmdParams, object, processedText); } //----------------------------------------------------------------------------- wxString ConfdefTemplateProcessor::escapeChars(const wxString& input, bool /*processNewlines*/) { return escapeXmlChars(input); } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/ConfdefTemplateProcessor.h000066400000000000000000000036211177057155300246710ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ //----------------------------------------------------------------------------- #ifndef FR_CONFDEFTEMPLATEPROCESSOR_H #define FR_CONFDEFTEMPLATEPROCESSOR_H #include "core/TemplateProcessor.h" //----------------------------------------------------------------------------- class ConfdefTemplateProcessor: public TemplateProcessor { protected: virtual void processCommand(const wxString& cmdName, const TemplateCmdParams& cmdParams, ProcessableObject* object, wxString& processedText); public: ConfdefTemplateProcessor(ProcessableObject* object, wxWindow* window); virtual wxString escapeChars(const wxString& input, bool processNewlines = true); }; //----------------------------------------------------------------------------- #endif // FR_CONFDEFTEMPLATEPROCESSOR_H flamerobin_0.9.3~svn+2220.orig/src/gui/ContextMenuMetadataItemVisitor.cpp000066400000000000000000000364061177057155300264040ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ //----------------------------------------------------------------------------- #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include "config/Config.h" #include "gui/CommandIds.h" #include "gui/ContextMenuMetadataItemVisitor.h" #include "metadata/column.h" #include "metadata/domain.h" #include "metadata/database.h" #include "metadata/exception.h" #include "metadata/function.h" #include "metadata/generator.h" #include "metadata/MetadataTemplateManager.h" #include "metadata/procedure.h" #include "metadata/role.h" #include "metadata/root.h" #include "metadata/server.h" #include "metadata/table.h" #include "metadata/trigger.h" #include "metadata/view.h" //----------------------------------------------------------------------------- MainObjectMenuMetadataItemVisitor::MainObjectMenuMetadataItemVisitor( wxMenu* menu) : MetadataItemVisitor(), menuM(menu) { } //----------------------------------------------------------------------------- MainObjectMenuMetadataItemVisitor::~MainObjectMenuMetadataItemVisitor() { } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitColumn(Column& column) { addGenerateCodeMenu(column); // do not show for system tables or views if (!column.isSystem() && column.getTable() != 0) { addSeparator(); addDropItem(column); addSeparator(); // TODO: addRefreshItem(); addPropertiesItem(); } } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitDatabase(Database& database) { menuM->Append(Cmds::Menu_Connect, _("&Connect")); menuM->Append(Cmds::Menu_ConnectAs, _("Connect &as...")); menuM->Append(Cmds::Menu_Disconnect, _("&Disconnect")); menuM->Append(Cmds::Menu_Reconnect, _("Reconnec&t")); addSeparator(); menuM->Append(Cmds::Menu_ExecuteStatements, _("Execute &SQL statements")); addGenerateCodeMenu(database); addSeparator(); wxMenu* toolsMenu = new wxMenu(); menuM->Append(0, _("&Tools"), toolsMenu); // Tools submenu toolsMenu->Append(Cmds::Menu_Backup, _("&Backup database")); toolsMenu->Append(Cmds::Menu_Restore, _("Rest&ore database")); addSeparator(); toolsMenu->Append(Cmds::Menu_RecreateDatabase, _("Recreate empty database")); addSeparator(); toolsMenu->Append(Cmds::Menu_MonitorEvents, _("&Monitor events")); toolsMenu->Append(Cmds::Menu_GenerateData, _("&Test data generator")); menuM->Append(Cmds::Menu_DropDatabase, _("Dr&op database")); addSeparator(); menuM->Append(Cmds::Menu_DatabaseRegistrationInfo, _("Database registration &info")); menuM->Append(Cmds::Menu_CloneDatabase, _("C&lone registration info")); menuM->Append(Cmds::Menu_UnRegisterDatabase, _("&Unregister database")); menuM->Append(Cmds::Menu_DatabasePreferences, _("Database &preferences")); addSeparator(); addRefreshItem(); menuM->Append(Cmds::Menu_DatabaseProperties, _("P&roperties")); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitDomain(Domain& domain) { addAlterItem(domain); addDropItem(domain); addSeparator(); addGenerateCodeMenu(domain); addSeparator(); addRefreshItem(); addPropertiesItem(); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitDomains(Domains& domains) { addCreateItem(); addSeparator(); addGenerateCodeMenu(domains); addSeparator(); addRefreshItem(); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitException(Exception& exception) { addDropItem(exception); addSeparator(); addGenerateCodeMenu(exception); addSeparator(); addRefreshItem(); addPropertiesItem(); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitExceptions(Exceptions& exceptions) { addCreateItem(); addSeparator(); addGenerateCodeMenu(exceptions); addSeparator(); addRefreshItem(); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitFunction(Function& function) { addDropItem(function); addSeparator(); addGenerateCodeMenu(function); addSeparator(); addRefreshItem(); addPropertiesItem(); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitFunctions(Functions& functions) { addDeclareItem(); addSeparator(); addGenerateCodeMenu(functions); addSeparator(); addRefreshItem(); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitGenerator(Generator& generator) { menuM->Append(Cmds::Menu_ShowGeneratorValue, _("Show &value")); menuM->Append(Cmds::Menu_SetGeneratorValue, _("&Set value")); addSeparator(); addDropItem(generator); addSeparator(); addGenerateCodeMenu(generator); addSeparator(); addRefreshItem(); addPropertiesItem(); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitGenerators(Generators& generators) { menuM->Append(Cmds::Menu_ShowAllGeneratorValues, _("Show &all values")); addSeparator(); addCreateItem(); addSeparator(); addGenerateCodeMenu(generators); addSeparator(); addRefreshItem(); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitProcedure(Procedure& procedure) { menuM->Append(Cmds::Menu_ExecuteProcedure, _("&Execute")); addShowColumnsItem(); addAlterItem(procedure); addDropItem(procedure); addSeparator(); addGenerateCodeMenu(procedure); addSeparator(); // TODO: addRefreshItem(); addPropertiesItem(); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitProcedures(Procedures& procedures) { addCreateItem(); addSeparator(); addGenerateCodeMenu(procedures); addSeparator(); addRefreshItem(); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitRole(Role& role) { addDropItem(role); addSeparator(); addGenerateCodeMenu(role); addSeparator(); // TODO: addRefreshItem(); addPropertiesItem(); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitRoles(Roles& roles) { addCreateItem(); addSeparator(); addGenerateCodeMenu(roles); addSeparator(); addRefreshItem(); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitSysRoles(SysRoles& sysRoles) { addGenerateCodeMenu(sysRoles); addSeparator(); addRefreshItem(); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitRoot(Root& root) { menuM->Append(Cmds::Menu_RegisterServer, _("&Register server")); addSeparator(); addGenerateCodeMenu(root); addSeparator(); menuM->Append(wxID_ABOUT, _("&About FlameRobin")); menuM->Append(wxID_PREFERENCES, _("&Preferences")); addSeparator(); menuM->Append(wxID_EXIT, _("&Quit")); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitServer(Server& server) { menuM->Append(Cmds::Menu_RegisterDatabase, _("&Register existing database")); menuM->Append(Cmds::Menu_CreateDatabase, _("Create &new database")); menuM->Append(Cmds::Menu_RestoreIntoNew, _("Restore bac&kup into new database")); addSeparator(); addGenerateCodeMenu(server); addSeparator(); menuM->Append(Cmds::Menu_GetServerVersion, _("Retrieve server &version")); menuM->Append(Cmds::Menu_ManageUsers, _("&Manage users")); addSeparator(); menuM->Append(Cmds::Menu_UnRegisterServer, _("&Unregister server")); menuM->Append(Cmds::Menu_ServerProperties, _("Server registration &info")); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitTable(Table& table) { addBrowseDataItem(); addGenerateCodeMenu(table); addSeparator(); if (!table.isSystem()) menuM->Append(Cmds::Menu_AddColumn, _("&Add column")); addShowColumnsItem(); addDropItem(table); addSeparator(); // TODO: addRefreshItem(); addPropertiesItem(); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitTables(Tables& tables) { addCreateItem(); addSeparator(); addGenerateCodeMenu(tables); addSeparator(); addRefreshItem(); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitSysTables(SysTables& sysTables) { addGenerateCodeMenu(sysTables); addSeparator(); addRefreshItem(); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitTrigger(Trigger& trigger) { addGenerateCodeMenu(trigger); addSeparator(); addAlterItem(trigger); addDropItem(trigger); addSeparator(); addGenerateCodeMenu(trigger); addSeparator(); // TODO: addRefreshItem(); addPropertiesItem(); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitTriggers(Triggers& triggers) { addCreateItem(); addSeparator(); addGenerateCodeMenu(triggers); addSeparator(); addRefreshItem(); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitView(View& view) { addBrowseDataItem(); addShowColumnsItem(); addGenerateCodeMenu(view); addSeparator(); addAlterItem(view); addDropItem(view); addSeparator(); // TODO: addRefreshItem(); addPropertiesItem(); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::visitViews(Views& views) { addCreateItem(); addSeparator(); addGenerateCodeMenu(views); addSeparator(); addRefreshItem(); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::addAlterItem(MetadataItem& metadataItem) { if (!metadataItem.isSystem()) menuM->Append(Cmds::Menu_AlterObject, _("&Alter")); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::addCreateItem() { // This menu command is redundant in the main Object menu. } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::addDeclareItem() { // This menu command is redundant in the main Object menu. } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::addDropItem(MetadataItem& metadataItem) { if (!metadataItem.isSystem()) menuM->Append(Cmds::Menu_DropObject, _("Dr&op")); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::addGenerateCodeMenu( MetadataItem& metadataItem, wxMenu* parent) { MetadataTemplateManager tm(&metadataItem); if (tm.descriptorsBegin() == tm.descriptorsEnd()) return; int i = (int)Cmds::Menu_TemplateFirst; wxMenu* templateMenu = new wxMenu(); for (TemplateDescriptorList::const_iterator it = tm.descriptorsBegin(); it != tm.descriptorsEnd(); ++it, ++i) { templateMenu->Append(i, (*it)->getMenuCaption()); } if (!parent) parent = menuM; parent->Append(Cmds::Menu_TemplateMenu, _("&Generate code"), templateMenu); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::addPropertiesItem() { menuM->Append(Cmds::Menu_ObjectProperties, _("P&roperties")); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::addRefreshItem() { menuM->Append(Cmds::Menu_ObjectRefresh, _("Re&fresh")); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::addBrowseDataItem() { menuM->Append(Cmds::Menu_BrowseData, _("Brow&se data")); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::addShowColumnsItem() { if (config().get(wxT("ShowColumnsInTree"), true)) menuM->Append(Cmds::Menu_LoadColumnsInfo, _("Show columns in&fo")); } //----------------------------------------------------------------------------- void MainObjectMenuMetadataItemVisitor::addSeparator() { size_t count = menuM->GetMenuItemCount(); if (count > 0 && !menuM->FindItemByPosition(count - 1)->IsSeparator()) menuM->AppendSeparator(); } //----------------------------------------------------------------------------- ContextMenuMetadataItemVisitor::ContextMenuMetadataItemVisitor( wxMenu* menu) : MainObjectMenuMetadataItemVisitor(menu) { } //----------------------------------------------------------------------------- ContextMenuMetadataItemVisitor::~ContextMenuMetadataItemVisitor() { } //----------------------------------------------------------------------------- void ContextMenuMetadataItemVisitor::addCreateItem() { menuM->Append(Cmds::Menu_CreateObject, _("Create &new")); } //----------------------------------------------------------------------------- void ContextMenuMetadataItemVisitor::addDeclareItem() { menuM->Append(Cmds::Menu_CreateObject, _("Declare &new")); } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/ContextMenuMetadataItemVisitor.h000066400000000000000000000073651177057155300260530ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_CONTEXTMENUMETADATAITEMVISITOR_H #define FR_CONTEXTMENUMETADATAITEMVISITOR_H #include "metadata/MetadataClasses.h" #include "metadata/MetadataItemVisitor.h" //----------------------------------------------------------------------------- class wxMenu; //----------------------------------------------------------------------------- class MainObjectMenuMetadataItemVisitor : public MetadataItemVisitor { public: explicit MainObjectMenuMetadataItemVisitor(wxMenu* menu); virtual ~MainObjectMenuMetadataItemVisitor(); virtual void visitColumn(Column& column); virtual void visitDatabase(Database& database); virtual void visitDomain(Domain& domain); virtual void visitDomains(Domains& domains); virtual void visitException(Exception& exception); virtual void visitExceptions(Exceptions& exceptions); virtual void visitFunction(Function& function); virtual void visitFunctions(Functions& functions); virtual void visitGenerator(Generator& generator); virtual void visitGenerators(Generators& generators); virtual void visitProcedure(Procedure& procedure); virtual void visitProcedures(Procedures& procedures); virtual void visitRole(Role& role); virtual void visitRoles(Roles& roles); virtual void visitSysRoles(SysRoles& roles); virtual void visitRoot(Root& root); virtual void visitServer(Server& server); virtual void visitTable(Table& table); virtual void visitTables(Tables& tables); virtual void visitSysTables(SysTables& tables); virtual void visitTrigger(Trigger& trigger); virtual void visitTriggers(Triggers& triggers); virtual void visitView(View& view); virtual void visitViews(Views& views); protected: wxMenu* menuM; virtual void addCreateItem(); virtual void addDeclareItem(); private: // helper member functions to add menu items and separators void addAlterItem(MetadataItem& metadataItem); void addBrowseDataItem(); void addDropItem(MetadataItem& metadataItem); void addGenerateCodeMenu(MetadataItem& metadataItem, wxMenu* parent = 0); void addPropertiesItem(); void addRefreshItem(); void addShowColumnsItem(); void addSeparator(); }; //----------------------------------------------------------------------------- class ContextMenuMetadataItemVisitor : public MainObjectMenuMetadataItemVisitor { public: explicit ContextMenuMetadataItemVisitor(wxMenu* menu); virtual ~ContextMenuMetadataItemVisitor(); protected: virtual void addCreateItem(); virtual void addDeclareItem(); }; //----------------------------------------------------------------------------- #endif //FR_CONTEXTMENUMETADATAITEMVISITOR_H flamerobin_0.9.3~svn+2220.orig/src/gui/CreateIndexDialog.cpp000066400000000000000000000233341177057155300236020ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include "core/URIProcessor.h" #include "gui/CreateIndexDialog.h" #include "gui/ExecuteSql.h" #include "gui/GUIURIHandlerHelper.h" #include "gui/StyleGuide.h" #include "metadata/column.h" #include "metadata/database.h" #include "metadata/MetadataItemURIHandlerHelper.h" #include "metadata/table.h" //----------------------------------------------------------------------------- CreateIndexDialog::CreateIndexDialog(wxWindow* parent, Table* table) : BaseDialog(parent, -1, wxEmptyString) { // can't do anything if no table is given wxASSERT(table); tableM = table; SetTitle(_("Creating Index for Table ") + table->getName_()); createControls(); setControlsProperties(); layoutControls(); button_ok->SetDefault(); } //----------------------------------------------------------------------------- void CreateIndexDialog::createControls() { label_name = new wxStaticText(getControlsPanel(), -1, _("Index name:")); textctrl_name = new wxTextCtrl(getControlsPanel(), ID_textcontrol_name, wxEmptyString); checkbox_unique = new wxCheckBox(getControlsPanel(), ID_check_unique, _("Unique index")); const wxString orderChoices[] = { _("Ascending"), _("Descending") }; radiobox_order = new wxRadioBox(getControlsPanel(), ID_radio_order, _("Index sort order"), wxDefaultPosition, wxDefaultSize, sizeof(orderChoices) / sizeof(wxString), orderChoices); label_columns = new wxStaticText(getControlsPanel(), -1, _("Select one or more columns for the index:"));; listbox_columns = new wxListBox(getControlsPanel(), ID_list_columns, wxDefaultPosition, wxDefaultSize, 0, 0, wxLB_MULTIPLE); button_ok = new wxButton(getControlsPanel(), wxID_OK, _("Create")); button_cancel = new wxButton(getControlsPanel(), wxID_CANCEL, _("Cancel")); } //----------------------------------------------------------------------------- void CreateIndexDialog::layoutControls() { wxSizer* sizerName = new wxBoxSizer(wxHORIZONTAL); sizerName->Add(label_name, 0, wxALIGN_CENTER_VERTICAL); sizerName->AddSpacer(styleguide().getControlLabelMargin()); sizerName->Add(textctrl_name, 1, wxEXPAND); wxSizer* sizerControls = new wxBoxSizer(wxVERTICAL); sizerControls->Add(sizerName, 0, wxEXPAND); sizerControls->AddSpacer( styleguide().getUnrelatedControlMargin(wxVERTICAL)); sizerControls->Add(checkbox_unique, 0, wxALIGN_TOP | wxEXPAND); sizerControls->AddSpacer( styleguide().getUnrelatedControlMargin(wxVERTICAL)); sizerControls->Add(radiobox_order, 0, wxEXPAND); sizerControls->AddSpacer( styleguide().getUnrelatedControlMargin(wxVERTICAL)); sizerControls->Add(label_columns, 0, wxEXPAND); sizerControls->AddSpacer( styleguide().getRelatedControlMargin(wxVERTICAL)); sizerControls->Add(listbox_columns, 1, wxEXPAND); // create sizer for buttons -> styleguide class will align it correctly wxSizer* sizerButtons = styleguide().createButtonSizer(button_ok, button_cancel); // use method in base class to set everything up layoutSizers(sizerControls, sizerButtons, true); } //----------------------------------------------------------------------------- void CreateIndexDialog::setControlsProperties() { // suggest name for new index wxString indexName; int nr = 1; std::vector* indices = tableM->getIndices(); while (indexName.IsEmpty()) { indexName = wxString::Format(wxT("IDX_%s%d"), tableM->getName_().c_str(), nr++); std::vector::iterator itIdx; for (itIdx = indices->begin(); itIdx != indices->end(); ++itIdx) { if ((*itIdx).getName_() == indexName) { indexName = wxEmptyString; break; } } } textctrl_name->SetValue(indexName); // fill listbox with table column names tableM->ensureChildrenLoaded(); wxArrayString colNames; colNames.Alloc(tableM->getColumnCount()); ColumnPtrs::const_iterator it; for (it = tableM->begin(); it != tableM->end(); ++it) colNames.Add((*it)->getName_()); listbox_columns->Set(colNames); } //----------------------------------------------------------------------------- const wxString CreateIndexDialog::getName() const { return wxT("CreateIndexDialog"); } //----------------------------------------------------------------------------- wxString CreateIndexDialog::getSelectedColumnsList() { wxArrayInt selection; listbox_columns->GetSelections(selection); wxString columnsList; for (size_t i = 0; i < selection.size(); i++) { if (!columnsList.IsEmpty()) columnsList += wxT(", "); Identifier id(listbox_columns->GetString(selection[i])); columnsList += id.getQuoted(); } return columnsList; } //----------------------------------------------------------------------------- const wxString CreateIndexDialog::getStatementsToExecute() { wxString sql(wxT("CREATE ")); if (checkbox_unique->IsChecked()) sql += wxT("UNIQUE "); if (radiobox_order->GetSelection() == 1) sql += wxT("DESCENDING "); sql += wxT("INDEX ") + Identifier::userString(textctrl_name->GetValue()) + wxT(" ON ") + tableM->getQuotedName() + wxT("\n") + wxT(" (") + getSelectedColumnsList() + wxT(");\n"); return sql; } //----------------------------------------------------------------------------- void CreateIndexDialog::updateButtons() { bool ok = !textctrl_name->GetValue().IsEmpty(); if (ok) { wxArrayInt selectedColumns; listbox_columns->GetSelections(selectedColumns); ok = selectedColumns.size() > 0; } button_ok->Enable(ok); } //----------------------------------------------------------------------------- //! event handling BEGIN_EVENT_TABLE(CreateIndexDialog, BaseDialog) EVT_LISTBOX(CreateIndexDialog::ID_list_columns, CreateIndexDialog::OnControlChange) EVT_TEXT(CreateIndexDialog::ID_textcontrol_name, CreateIndexDialog::OnControlChange) END_EVENT_TABLE() //----------------------------------------------------------------------------- void CreateIndexDialog::OnControlChange(wxCommandEvent& WXUNUSED(event)) { updateButtons(); } //----------------------------------------------------------------------------- class TableIndicesHandler: public URIHandler, private MetadataItemURIHandlerHelper, private GUIURIHandlerHelper { public: TableIndicesHandler() {}; bool handleURI(URI& uri); private: // singleton; registers itself on creation. static const TableIndicesHandler handlerInstance; }; //----------------------------------------------------------------------------- const TableIndicesHandler TableIndicesHandler::handlerInstance; //----------------------------------------------------------------------------- bool TableIndicesHandler::handleURI(URI& uri) { if (uri.action != wxT("add_index") && uri.action != wxT("recompute_all")) return false; Table* t = extractMetadataItemFromURI
(uri); wxWindow* w = getParentWindow(uri); if (!t || !w) return true; wxString sql; wxString frameCaption; if (uri.action == wxT("recompute_all")) { std::vector* indices = t->getIndices(); std::vector::iterator itIdx; for (itIdx = indices->begin(); itIdx != indices->end(); ++itIdx) { sql += wxString::Format(wxT("SET STATISTICS INDEX %s;\n"), (*itIdx).getQuotedName().c_str()); } frameCaption = _("Recompute All Indexes"); } else // add_index { CreateIndexDialog cid(w, t); // NOTE: this has been moved here from OnOkButtonClick() to make frame // activation work properly. Basically activation of another // frame has to happen outside wxDialog::ShowModal(), because it // does at the end re-focus the last focused control, raising // the parent frame over the newly created sql execution frame if (cid.ShowModal() == wxID_OK) { sql = cid.getStatementsToExecute(); frameCaption = cid.GetTitle(); } } if (!sql.IsEmpty()) execSql(w, frameCaption, t->getDatabase(), sql, true); return true; } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/CreateIndexDialog.h000066400000000000000000000047011177057155300232440ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ //----------------------------------------------------------------------------- #ifndef FR_CREATEINDEXDIALOG_H #define FR_CREATEINDEXDIALOG_H #include #include "core/Observer.h" #include "gui/BaseDialog.h" class Table; //----------------------------------------------------------------------------- class CreateIndexDialog: public BaseDialog { private: Table* tableM; wxStaticText* label_name; wxTextCtrl* textctrl_name; wxCheckBox* checkbox_unique; wxRadioBox* radiobox_order; wxStaticText* label_columns; wxListBox* listbox_columns; wxButton* button_ok; wxButton* button_cancel; void createControls(); void layoutControls(); void setControlsProperties(); wxString getSelectedColumnsList(); void updateButtons(); protected: virtual const wxString getName() const; public: CreateIndexDialog(wxWindow* parent, Table *table); // creation of statement execution frame outside of dialog class const wxString getStatementsToExecute(); private: // event handling enum { ID_textcontrol_name = 100, ID_check_unique, ID_radio_order, ID_list_columns }; void OnControlChange(wxCommandEvent& event); DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- #endif // FR_CREATEINDEXDIALOG_H flamerobin_0.9.3~svn+2220.orig/src/gui/DataGeneratorFrame.cpp000066400000000000000000001567331177057155300237740ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include #include #include #include #include // needed for random #include #include "core/ArtProvider.h" #include "core/FRError.h" #include "core/StringUtils.h" #include "gui/AdvancedMessageDialog.h" #include "gui/controls/DBHTreeControl.h" #include "gui/DataGeneratorFrame.h" #include "gui/ProgressDialog.h" #include "metadata/column.h" #include "metadata/database.h" #include "metadata/domain.h" #include "metadata/table.h" //----------------------------------------------------------------------------- // returns a value between 0 and (maxval-1) // I wrote this as I don't know how much is rand from stdlib portable int frRandom(double maxval) { return (int)(maxval*rand()/(RAND_MAX+1.0)); } //----------------------------------------------------------------------------- // dd.mm.yyyy void str2date(const wxString& str, int& date) { long d,m,y; if (!str.Mid(0,2).ToLong(&d) || !str.Mid(3,2).ToLong(&m) || !str.Mid(6,4).ToLong(&y) || !IBPP::itod(&date, y,m,d)) { throw FRError(_("Invalid date: ") + str); } } //----------------------------------------------------------------------------- // HH:MM:SS void str2time(const wxString& str, int& mytime) { long h = 0, m = 0, s = 0; if (!str.Mid(0, 2).ToLong(&h) || !str.Mid(3, 2).ToLong(&m) || !str.Mid(6, 2).ToLong(&s)) { throw FRError(_("Invalid time: ") + str); } IBPP::itot(&mytime, h, m, s, 0); } //----------------------------------------------------------------------------- // only used in function OnGenerateButtonClick class TableDep { public: TableDep(Table *t, std::map& needs) { table = t; std::vector *fk = t->getForeignKeys(); for (std::vector::iterator fi = fk->begin(); fi != fk->end(); ++fi) { Identifier id((*fi).getReferencedTable()); if (id.getQuoted() == t->getQuotedName()) // self reference continue; std::map::iterator it = needs.find(id.getQuoted()); if (it != needs.end() && (*it).second > 0) dependsOn.push_back(id.getQuoted()); } } void remove(const wxString& table) { std::list::iterator it = std::find(dependsOn.begin(), dependsOn.end(), table); if (it != dependsOn.end()) dependsOn.erase(it); } Table *table; std::list dependsOn; }; //----------------------------------------------------------------------------- // helper for saving settings void dsAddChildNode(wxXmlNode* parentNode, const wxString nodeName, const wxString nodeContent) { if (!nodeContent.IsEmpty()) { wxXmlNode* propn = new wxXmlNode(wxXML_ELEMENT_NODE, nodeName); parentNode->AddChild(propn); propn->AddChild(new wxXmlNode(wxXML_TEXT_NODE, wxEmptyString, nodeContent)); } } //----------------------------------------------------------------------------- // used for loading settings from XML file static const wxString getNodeContent(wxXmlNode* node) { for (wxXmlNode* n = node->GetChildren(); (n); n = n->GetNext()) { if (n->GetType() == wxXML_TEXT_NODE || n->GetType() == wxXML_CDATA_SECTION_NODE) { return n->GetContent(); } } return wxEmptyString; } //----------------------------------------------------------------------------- // used for loading settings from XML file void parseTable(wxXmlNode* xmln, std::map& tr) { wxASSERT(xmln); wxString tablename; long records = 0; for (xmln = xmln->GetChildren(); (xmln); xmln = xmln->GetNext()) { if (xmln->GetType() != wxXML_ELEMENT_NODE) continue; wxString value(getNodeContent(xmln)); if (xmln->GetName() == wxT("name")) tablename = value; else if (xmln->GetName() == wxT("records")) value.ToLong(&records); } if (!tablename.IsEmpty()) tr.insert(std::pair(tablename, records)); } //----------------------------------------------------------------------------- class GeneratorSettings { public: typedef enum { vtSkip, vtRange, vtColumn, vtFile } ValueType; ValueType valueType; wxString range; wxString sourceTable; wxString sourceColumn; wxString fileName; bool randomValues; int nullPercent; GeneratorSettings(); GeneratorSettings(GeneratorSettings* other); void toXML(wxXmlNode *parent); wxString fromXML(wxXmlNode *parent); // returns column name }; //----------------------------------------------------------------------------- GeneratorSettings::GeneratorSettings() { } //----------------------------------------------------------------------------- GeneratorSettings::GeneratorSettings(GeneratorSettings* other) { valueType = other->valueType; range = other->range; sourceTable = other->sourceTable; sourceColumn = other->sourceColumn; fileName = other->fileName; randomValues = other->randomValues; nullPercent = other->nullPercent; } //----------------------------------------------------------------------------- void GeneratorSettings::toXML(wxXmlNode *parent) { dsAddChildNode(parent, wxT("valueType"), wxString::Format(wxT("%d"), (int)valueType)); dsAddChildNode(parent, wxT("range"), range); dsAddChildNode(parent, wxT("sourceTable"), sourceTable); dsAddChildNode(parent, wxT("sourceColumn"), sourceColumn); dsAddChildNode(parent, wxT("fileName"), fileName); dsAddChildNode(parent, wxT("randomValues"), randomValues ? wxT("1") : wxT("0")); dsAddChildNode(parent, wxT("nullPercent"), wxString::Format(wxT("%d"), nullPercent)); } //----------------------------------------------------------------------------- wxString GeneratorSettings::fromXML(wxXmlNode *parent) { wxASSERT(parent); wxString colname; long l; wxXmlNode *xmln; for (xmln = parent->GetChildren(); (xmln); xmln = xmln->GetNext()) { if (xmln->GetType() != wxXML_ELEMENT_NODE) continue; wxString value(getNodeContent(xmln)); if (xmln->GetName() == wxT("name")) colname = value; else if (xmln->GetName() == wxT("valueType")) { if (!value.ToLong(&l)) return wxEmptyString; valueType = (ValueType)l; } else if (xmln->GetName() == wxT("range")) range = value; else if (xmln->GetName() == wxT("sourceTable")) sourceTable = value; else if (xmln->GetName() == wxT("sourceColumn")) sourceColumn = value; else if (xmln->GetName() == wxT("fileName")) fileName = value; else if (xmln->GetName() == wxT("randomValues")) randomValues = (value == wxT("1")); else if (xmln->GetName() == wxT("nullPercent")) { if (!value.ToLong(&l)) return wxEmptyString; nullPercent = (int)l; } } return colname; } //----------------------------------------------------------------------------- DataGeneratorFrame::DataGeneratorFrame(wxWindow* parent, Database* db) :BaseFrame(parent,-1, wxT("")), databaseM(db), loadingM(true) { // until we find something better SetIcon(wxArtProvider::GetIcon(ART_Procedure, wxART_FRAME_ICON)); SetTitle(_("Test Data Generator")); // prevent tree events from reaching the main frame // TODO: we need proper event handling for tree to allow multiple // tree controls that are completely functional SetExtraStyle(wxWS_EX_BLOCK_EVENTS); wxBoxSizer* outerSizer; outerSizer = new wxBoxSizer( wxVERTICAL ); outerPanel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL | wxCLIP_CHILDREN); wxBoxSizer* innerSizer; innerSizer = new wxBoxSizer( wxVERTICAL ); mainSplitter = new wxSplitterWindow( outerPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, // wx docs say that wxSP_NOBORDER is default, but it obviously is not the case on MSW // (I tried on Windows 98) wxSP_NOBORDER); mainSplitter->SetMinimumPaneSize(100); mainSplitter->SetSashGravity( 0.5 ); leftPanel = new wxPanel( mainSplitter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxBoxSizer* leftPanelSizer; leftPanelSizer = new wxBoxSizer( wxVERTICAL ); leftLabel = new wxStaticText( leftPanel, wxID_ANY, wxT("Select tables and columns"), wxDefaultPosition, wxDefaultSize, 0 ); leftPanelSizer->Add( leftLabel, 0, wxALL|wxEXPAND, 5 ); mainTree = new DBHTreeControl(leftPanel, wxDefaultPosition, wxDefaultSize, #if defined __WXGTK20__ || defined __WXMAC__ // doesn't seem to work on MSW when root is hidden wxTR_NO_LINES | wxTR_HIDE_ROOT | #endif wxTR_HAS_BUTTONS | wxBORDER_THEME); leftPanelSizer->Add( mainTree, 1, wxALL|wxEXPAND, 5 ); leftPanel->SetSizer( leftPanelSizer ); leftPanel->Layout(); leftPanelSizer->Fit( leftPanel ); rightPanel = new wxPanel( mainSplitter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); rightPanelSizer = new wxBoxSizer( wxVERTICAL ); rightLabel = new wxStaticText( rightPanel, wxID_ANY, wxT("Configure"), wxDefaultPosition, wxDefaultSize, 0 ); rightPanelSizer->Add( rightLabel, 0, wxALL|wxEXPAND, 5 ); tableLabel = new wxStaticText( rightPanel, wxID_ANY, wxT("Table: table name"), wxDefaultPosition, wxDefaultSize, 0 ); tableLabel->SetFont( wxFont( 10, 74, 90, 92, false, wxT("sans") ) ); rightPanelSizer->Add( tableLabel, 0, wxTOP|wxBOTTOM|wxLEFT, 10 ); wxBoxSizer* recordsSizer = new wxBoxSizer( wxHORIZONTAL ); recordsLabel = new wxStaticText( rightPanel, wxID_ANY, wxT("Number of records to create:"), wxDefaultPosition, wxDefaultSize, 0 ); recordsSizer->Add( recordsLabel, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 10 ); spinRecords = new wxSpinCtrl( rightPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 100000, 0); recordsSizer->Add( spinRecords, 0, wxRIGHT|wxLEFT, 10 ); rightPanelSizer->Add( recordsSizer, 0, wxEXPAND, 5 ); skipCheckbox = new wxCheckBox( rightPanel, ID_checkbox_skip, wxT("Skip this table"), wxDefaultPosition, wxDefaultSize, 0 ); rightPanelSizer->Add( skipCheckbox, 0, wxBOTTOM|wxRIGHT|wxLEFT, 8 ); columnLabel = new wxStaticText( rightPanel, wxID_ANY, wxT("Column: column name"), wxDefaultPosition, wxDefaultSize, 0 ); columnLabel->SetFont( wxFont( 10, 74, 90, 92, false, wxT("sans") ) ); rightPanelSizer->Add( columnLabel, 0, wxTOP|wxLEFT, 10 ); valuetypeLabel = new wxStaticText( rightPanel, wxID_ANY, wxT("Value type:"), wxDefaultPosition, wxDefaultSize, 0 ); rightPanelSizer->Add( valuetypeLabel, 0, wxALL, 10 ); wxFlexGridSizer* flexSizer = new wxFlexGridSizer( 2, 2, 3, 3 ); flexSizer->AddGrowableCol( 1 ); flexSizer->SetFlexibleDirection( wxHORIZONTAL ); radioSkip = new wxRadioButton( rightPanel, wxID_ANY, wxT("Skip"), wxDefaultPosition, wxDefaultSize, 0); flexSizer->Add( radioSkip, 0, wxALIGN_CENTER_VERTICAL, 5 ); flexSizer->Add( 0, 0, 1, wxALL, 5 ); radioRange = new wxRadioButton( rightPanel, wxID_ANY, wxT("Range/mask:"), wxDefaultPosition, wxDefaultSize, 0); flexSizer->Add( radioRange, 0, wxALIGN_CENTER_VERTICAL, 5 ); rangeText = new wxTextCtrl( rightPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); flexSizer->Add( rangeText, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); radioColumn = new wxRadioButton( rightPanel, wxID_ANY, wxT("Value from column:"), wxDefaultPosition, wxDefaultSize, 0); flexSizer->Add( radioColumn, 0, wxALIGN_CENTER_VERTICAL, 5 ); wxArrayString tables; TablesPtr t(db->getTables()); for (Tables::iterator it = t->begin(); it != t->end(); ++it) tables.Add((*it)->getQuotedName()); tables.Sort(); wxArrayString empty; valueSizer = new wxBoxSizer( wxHORIZONTAL ); valueChoice = new wxChoice( rightPanel, ID_choice_value, wxDefaultPosition, wxDefaultSize, tables); valueSizer->Add( valueChoice, 1, wxALIGN_CENTER_VERTICAL, 5 ); valueColumnChoice = new wxChoice( rightPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, empty); valueSizer->Add( valueColumnChoice, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxLEFT, 5 ); flexSizer->Add( valueSizer, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); radioFile = new wxRadioButton( rightPanel, wxID_ANY, wxT("Value from file:"), wxDefaultPosition, wxDefaultSize, 0); flexSizer->Add( radioFile, 0, wxALIGN_CENTER_VERTICAL, 5 ); wxBoxSizer* filenameSizer = new wxBoxSizer( wxHORIZONTAL ); fileText = new wxTextCtrl( rightPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); filenameSizer->Add( fileText, 1, wxALIGN_CENTER_VERTICAL, 5 ); fileButton = new wxButton( rightPanel, ID_button_file, wxT("..."), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT ); filenameSizer->Add( fileButton, 0, wxLEFT, 5 ); flexSizer->Add( filenameSizer, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); rightPanelSizer->Add( flexSizer, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 10 ); randomCheckbox = new wxCheckBox( rightPanel, wxID_ANY, wxT("Select random values rather than sequential"), wxDefaultPosition, wxDefaultSize, 0 ); randomCheckbox->SetValue(true); rightPanelSizer->Add( randomCheckbox, 0, wxALL, 8 ); wxBoxSizer* nullSizer = new wxBoxSizer( wxHORIZONTAL ); nullLabel = new wxStaticText( rightPanel, wxID_ANY, wxT("Percentage of NULLs:"), wxDefaultPosition, wxDefaultSize, 0 ); nullSizer->Add( nullLabel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); nullSpin = new wxSpinCtrl( rightPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 100, 0); nullSizer->Add( nullSpin, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); nullPercentLabel = new wxStaticText( rightPanel, wxID_ANY, wxT("%"), wxDefaultPosition, wxDefaultSize, 0 ); nullSizer->Add( nullPercentLabel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); rightPanelSizer->Add( nullSizer, 0, wxEXPAND, 5 ); copySizer = new wxBoxSizer( wxHORIZONTAL ); copyLabel = new wxStaticText( rightPanel, wxID_ANY, wxT("Copy settings from:"), wxDefaultPosition, wxDefaultSize, 0 ); copySizer->Add( copyLabel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); copyChoice = new wxChoice( rightPanel, ID_choice_copy, wxDefaultPosition, wxDefaultSize, tables, 0 ); copySizer->Add( copyChoice, 1, wxALIGN_CENTER_VERTICAL, 5 ); copyColumnChoice = new wxChoice( rightPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, empty, 0 ); copySizer->Add( copyColumnChoice, 1, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); copyButton = new wxButton( rightPanel, ID_button_copy, wxT("Copy"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT ); copySizer->Add( copyButton, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); rightPanelSizer->Add( copySizer, 0, wxEXPAND|wxRIGHT|wxLEFT, 10 ); rightPanel->SetSizer( rightPanelSizer ); rightPanel->Layout(); rightPanelSizer->Fit( rightPanel ); mainSplitter->SplitVertically( leftPanel, rightPanel, 200 ); innerSizer->Add( mainSplitter, 1, wxALL|wxEXPAND, 10 ); wxBoxSizer* buttonSizer; buttonSizer = new wxBoxSizer( wxHORIZONTAL ); buttonSizer->Add( 0, 0, 1, wxALL, 5 ); saveButton = new wxButton( outerPanel, ID_button_save, wxT("Save settings"), wxDefaultPosition, wxDefaultSize, 0 ); buttonSizer->Add( saveButton, 0, wxALL, 5 ); loadButton = new wxButton( outerPanel, ID_button_load, wxT("Load settings"), wxDefaultPosition, wxDefaultSize, 0 ); buttonSizer->Add( loadButton, 0, wxALL, 5 ); generateButton = new wxButton( outerPanel, ID_button_generate, wxT("Generate data"), wxDefaultPosition, wxDefaultSize, 0 ); buttonSizer->Add( generateButton, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); buttonSizer->Add( 10, 0, 0, wxRIGHT, 0 ); innerSizer->Add( buttonSizer, 0, wxEXPAND|wxALL, 10 ); outerPanel->SetSizer( innerSizer ); outerPanel->Layout(); innerSizer->Fit( outerPanel ); outerSizer->Add( outerPanel, 1, wxEXPAND, 5 ); SetSizer( outerSizer ); Layout(); outerSizer->Fit(this); outerSizer->SetSizeHints(this); mainSplitter->UpdateSize(); mainTree->allowContextMenu(false); TablesPtr ts(db->getTables()); wxTreeItemId rootNode = mainTree->addRootNode(ts.get()); loadingM = false; wxTreeItemIdValue cookie; wxTreeItemId node = mainTree->GetFirstChild(rootNode, cookie); if (node.IsOk()) mainTree->SelectItem(node); } //----------------------------------------------------------------------------- DataGeneratorFrame::~DataGeneratorFrame() { for (std::map::iterator it = settingsM.begin(); it!= settingsM.end(); ++it) { delete (*it).second; } } //----------------------------------------------------------------------------- const wxString DataGeneratorFrame::getName() const { return wxT("DataGeneratorFrame"); } //----------------------------------------------------------------------------- const wxRect DataGeneratorFrame::getDefaultRect() const { return wxRect(-1, -1, 700, 500); } //----------------------------------------------------------------------------- //! closes window if database is removed (unregistered) void DataGeneratorFrame::subjectRemoved(Subject* subject) { if (subject == databaseM) Close(); } //----------------------------------------------------------------------------- void DataGeneratorFrame::update() { if (!databaseM->isConnected()) Close(); } //----------------------------------------------------------------------------- bool DataGeneratorFrame::loadColumns(const wxString& tableName, wxChoice* c) { Identifier id; id.setFromSql(tableName); Table *t = dynamic_cast
(databaseM->findRelation(id)); if (!t) return false; t->ensureChildrenLoaded(); c->Clear(); for (ColumnPtrs::iterator it = t->begin(); it != t->end(); ++it) c->Append((*it)->getQuotedName()); return true; } //----------------------------------------------------------------------------- // prehaps using values from config() would be nice wxString getDefaultRange(Domain *d) { wxString dt, size, scale; d->getDatatypeParts(dt, size, scale); if (dt == wxT("Smallint") || dt == wxT("Float")) return wxT("0-100"); if ( dt == wxT("Numeric") || dt == wxT("Integer") || dt == wxT("Bigint") || dt == wxT("Decimal") || dt == wxT("Double precision")) { return wxT("0-2000000"); } if (dt == wxT("Char") || dt == wxT("Varchar")) { if (size == wxT("1")) return wxT("[az,AZ]"); else return size + wxT("[az,AZ]"); } if (dt == wxT("Timestamp")) return wxT("01.01.1980 00:00:00-31.12.2005 23:59:59"); if (dt == wxT("Date")) return wxT("01.01.1980-31.12.2005"); if (dt == wxT("Time")) return wxT("00:00:00-23:59:59"); return wxEmptyString; } //----------------------------------------------------------------------------- // returns the setting or creates a default one GeneratorSettings* DataGeneratorFrame::getSettings(Column *c) { Table *tab = c->getTable(); if (!tab) throw FRError(_("Table not set")); wxString s = tab->getQuotedName() + wxT(".") + c->getQuotedName(); std::map::iterator it = settingsM.find(s); if (it != settingsM.end()) // found return (*it).second; // check FK info wxString fkt, fkc; std::vector *fk = tab->getForeignKeys(); for (std::vector::iterator fi = fk->begin(); fi != fk->end(); ++fi) { int cnt = 0; for (std::vector::const_iterator ci = (*fi).begin(); ci != (*fi).end(); ++ci, ++cnt) { Identifier id(*ci); if (id.getQuoted() == c->getQuotedName()) { Identifier table((*fi).getReferencedTable()); Identifier column((*fi).getReferencedColumns()[cnt]); fkt = table.getQuoted(); fkc = column.getQuoted(); break; } } if (!fkc.IsEmpty()) break; } // check primary/unique bool isUnique = false; PrimaryKeyConstraint *pk = tab->getPrimaryKey(); if (pk) { for (std::vector::const_iterator ci = pk->begin(); ci != pk->end(); ++ci) { Identifier id(*ci); if (id.getQuoted() == c->getQuotedName()) { isUnique = true; break; } } } if (!isUnique) { std::vector *uq = tab->getUniqueConstraints(); for (std::vector::iterator ui = uq->begin(); !isUnique && ui != uq->end(); ++ui) { for (std::vector::const_iterator ci = (*ui).begin(); ci != (*ui).end(); ++ci) { Identifier id(*ci); if (id.getQuoted() == c->getQuotedName()) { isUnique = true; break; } } } } // It would be cool if we could detect simple check constraints: // value in (1, 2, 3, 4) // value between 1 and 4 // value < 5 // value = 1 or value = 2 or value = 3 or value = 4 GeneratorSettings *gs = new GeneratorSettings; settingsM.insert(std::pair(s, gs)); gs->randomValues = !isUnique; gs->nullPercent = (c->isNullable() ? 50 : 0); gs->valueType = GeneratorSettings::vtRange; gs->range = getDefaultRange(c->getDomain().get()); if (!c->getComputedSource().IsEmpty()) gs->valueType = GeneratorSettings::vtSkip; else if (!fkc.IsEmpty()) { gs->valueType = GeneratorSettings::vtColumn; gs->sourceTable = fkt; gs->sourceColumn = fkc; } return gs; } //----------------------------------------------------------------------------- void DataGeneratorFrame::showColumnSettings(bool show) { if (loadingM) return; wxWindow *ww[] = { columnLabel, valuetypeLabel, radioSkip, radioRange, rangeText, radioColumn, valueChoice, radioFile, fileText, fileButton, nullLabel, randomCheckbox, nullSpin, copyLabel, copyChoice, nullPercentLabel, copyButton, valueColumnChoice, copyColumnChoice }; for (int i = 0; i < sizeof(ww)/sizeof(wxWindow *); ++i) if (ww[i]) ww[i]->Show(show); rightPanelSizer->Layout(); } //----------------------------------------------------------------------------- void DataGeneratorFrame::saveSetting(wxTreeItemId item) { if (!item.IsOk()) return; // save previous settings MetadataItem *m = mainTree->getMetadataItem(item); Table *tab = dynamic_cast
(m); Column *col = dynamic_cast(m); if (!tab && col) tab = col->getTable(); if (tab) { int rec = spinRecords->GetValue(); wxString tname = tab->getQuotedName(); std::map::iterator i1 = tableRecordsM.find(tname); if (i1 == tableRecordsM.end()) tableRecordsM.insert(std::pair(tname, rec)); else (*i1).second = rec; } if (col) { GeneratorSettings *gs = getSettings(col); gs->range = rangeText->GetValue(); gs->fileName = fileText->GetValue(); gs->sourceTable = valueChoice->GetStringSelection(); gs->sourceColumn = valueColumnChoice->GetStringSelection(); wxRadioButton *btns[4] = { radioSkip, radioRange, radioColumn, radioFile }; for (int i=0; i<4; ++i) if (btns[i]->GetValue()) gs->valueType = (GeneratorSettings::ValueType)i; gs->randomValues = randomCheckbox->IsChecked(); gs->nullPercent = nullSpin->GetValue(); } } //----------------------------------------------------------------------------- BEGIN_EVENT_TABLE( DataGeneratorFrame, BaseFrame ) EVT_BUTTON( ID_button_file, DataGeneratorFrame::OnFileButtonClick ) EVT_BUTTON( ID_button_copy, DataGeneratorFrame::OnCopyButtonClick ) EVT_BUTTON( ID_button_save, DataGeneratorFrame::OnSaveButtonClick ) EVT_BUTTON( ID_button_load, DataGeneratorFrame::OnLoadButtonClick ) EVT_BUTTON( ID_button_generate, DataGeneratorFrame::OnGenerateButtonClick ) EVT_CHECKBOX(ID_checkbox_skip, DataGeneratorFrame::OnSkipCheckboxClick) EVT_CHOICE(ID_choice_value, DataGeneratorFrame::OnTableValueChoiceChange) EVT_CHOICE(ID_choice_copy, DataGeneratorFrame::OnTableCopyChoiceChange) EVT_TREE_SEL_CHANGED(DBHTreeControl::ID_tree_ctrl, DataGeneratorFrame::OnTreeSelectionChanged) END_EVENT_TABLE() //----------------------------------------------------------------------------- void DataGeneratorFrame::OnTableValueChoiceChange(wxCommandEvent& event) { if (loadColumns(event.GetString(), valueColumnChoice)) { valueColumnChoice->SetSelection(0); valueSizer->Layout(); radioColumn->SetValue(true); } } //----------------------------------------------------------------------------- void DataGeneratorFrame::OnTableCopyChoiceChange(wxCommandEvent& event) { if (loadColumns(event.GetString(), copyColumnChoice)) { copyColumnChoice->SetSelection(0); copySizer->Layout(); } } //----------------------------------------------------------------------------- void DataGeneratorFrame::OnSkipCheckboxClick(wxCommandEvent& event) { if (event.IsChecked()) spinRecords->SetValue(0); else spinRecords->SetValue(200); // TODO: load default from config } //----------------------------------------------------------------------------- void DataGeneratorFrame::OnTreeSelectionChanged(wxTreeEvent& event) { if (loadingM) return; saveSetting(event.GetOldItem()); // save old item loadSetting(event.GetItem()); // load new item } //----------------------------------------------------------------------------- void DataGeneratorFrame::loadSetting(wxTreeItemId newitem) { if (!newitem.IsOk()) return; MetadataItem *m = mainTree->getMetadataItem(newitem); Table *tab = dynamic_cast
(m); Column *col = dynamic_cast(m); showColumnSettings(col != 0); if (tab) tab->ensureChildrenLoaded(); else if (col) tab = col->getTable(); if (!tab) return; wxString tablename = tab->getQuotedName(); tableLabel->SetLabel(wxT("Table: ") + tab->getName_()); int records = 0; // tables are not filled by default std::map::iterator i1 = tableRecordsM.find(tablename); if (i1 != tableRecordsM.end()) records = (*i1).second; spinRecords->SetValue(records); skipCheckbox->SetValue(records <= 0); if (!col) return; columnLabel->SetLabel(wxT("Column: ") + col->getName_()); // copy settings from gs to controls GeneratorSettings *gs = getSettings(col); rangeText->SetValue(gs->range); fileText->SetValue(gs->fileName); if (!gs->sourceTable.IsEmpty()) { valueChoice->SetStringSelection(gs->sourceTable); if (loadColumns(gs->sourceTable, valueColumnChoice)) valueColumnChoice->SetStringSelection(gs->sourceColumn); } else { valueChoice->SetSelection(wxNOT_FOUND); valueColumnChoice->SetSelection(wxNOT_FOUND); } valueSizer->Layout(); switch (gs->valueType) { case GeneratorSettings::vtSkip: radioSkip->SetValue(true); break; case GeneratorSettings::vtRange: radioRange->SetValue(true); break; case GeneratorSettings::vtColumn: radioColumn->SetValue(true); break; case GeneratorSettings::vtFile: radioFile->SetValue(true); break; } randomCheckbox->SetValue(gs->randomValues); nullSpin->SetValue(gs->nullPercent); } //----------------------------------------------------------------------------- void DataGeneratorFrame::OnLoadButtonClick(wxCommandEvent& WXUNUSED(event)) { wxFileDialog fd(this, _("Select file to load"), wxT(""), wxT(""), _("XML files (*.xml)|*.xml|All files (*.*)|*.*"), wxFD_OPEN | wxFD_CHANGE_DIR); if (wxID_OK != fd.ShowModal()) return; wxXmlDocument doc; wxXmlNode *root = 0; wxFileInputStream stream(fd.GetPath()); if (stream.Ok() && doc.Load(stream) && doc.IsOk()) { root = doc.GetRoot(); if (root->GetName() != wxT("dgf_root")) root = 0; } if (root == 0) { showWarningDialog(this, _("Settings not loaded (1)"), _("There was an error while loading."), AdvancedMessageDialogButtonsOk()); return; } // delete current settings for (std::map::iterator it = settingsM.begin(); it!= settingsM.end(); ++it) { delete (*it).second; } settingsM.clear(); tableRecordsM.clear(); for (wxXmlNode* xmln = doc.GetRoot()->GetChildren(); (xmln); xmln = xmln->GetNext()) { if (xmln->GetType() != wxXML_ELEMENT_NODE) continue; if (xmln->GetName() == wxT("column")) { GeneratorSettings *gs = new GeneratorSettings; wxString name = gs->fromXML(xmln); if (name.IsEmpty()) { showWarningDialog(this, _("Settings not loaded"), _("There was an error while loading."), AdvancedMessageDialogButtonsOk()); return; } settingsM.insert( std::pair(name, gs)); } if (xmln->GetName() == wxT("table")) parseTable(xmln, tableRecordsM); } // update the current node loadSetting(mainTree->GetSelection()); showInformationDialog(this, _("Settings loaded"), _("The setting where successfully loaded from file."), AdvancedMessageDialogButtonsOk()); } //----------------------------------------------------------------------------- void DataGeneratorFrame::OnSaveButtonClick(wxCommandEvent& WXUNUSED(event)) { saveSetting(mainTree->GetSelection()); // save current item if changed wxFileDialog fd(this, _("Select file to save"), wxT(""), wxT(""), _("XML files (*.xml)|*.xml|All files (*.*)|*.*"), wxFD_SAVE | wxFD_CHANGE_DIR | wxFD_OVERWRITE_PROMPT); if (wxID_OK != fd.ShowModal()) return; wxBusyCursor wait; wxString dir = wxPathOnly(fd.GetPath()); if (!wxDirExists(dir)) wxMkdir(dir); wxXmlDocument doc; wxXmlNode* root = new wxXmlNode(wxXML_ELEMENT_NODE, wxT("dgf_root")); doc.SetRoot(root); // save tables for (std::map::iterator it = tableRecordsM.begin(); it != tableRecordsM.end(); ++it) { wxXmlNode* node = new wxXmlNode(wxXML_ELEMENT_NODE, wxT("table")); root->AddChild(node); dsAddChildNode(node, wxT("name"), (*it).first); dsAddChildNode(node, wxT("records"), wxString::Format(wxT("%d"), (*it).second)); } // save columns for (std::map::iterator it = settingsM.begin(); it!= settingsM.end(); ++it) { wxXmlNode* cs = new wxXmlNode(wxXML_ELEMENT_NODE, wxT("column")); root->AddChild(cs); dsAddChildNode(cs, wxT("name"), (*it).first); (*it).second->toXML(cs); } if (doc.Save(fd.GetPath())) { showInformationDialog(this, _("Settings saved"), _("The setting where successfully saved to the file."), AdvancedMessageDialogButtonsOk()); } else { showWarningDialog(this, _("Settings not saved"), _("There was an error while writing."), AdvancedMessageDialogButtonsOk()); } } //----------------------------------------------------------------------------- void DataGeneratorFrame::OnCopyButtonClick(wxCommandEvent& WXUNUSED(event)) { MetadataItem *m = mainTree->getMetadataItem(mainTree->GetSelection()); Column *col = dynamic_cast(m); if (!col) // this should never happen as the Copy button should not return; // be visible if column is not selected Table *tab = col->getTable(); if (!tab) throw FRError(_("Table not found.")); // copy settings wxString name = copyChoice->GetStringSelection() + wxT(".") + copyColumnChoice->GetStringSelection(); std::map::iterator it = settingsM.find(name); if (it == settingsM.end()) // no settings { showWarningDialog(this, _("Nothing to copy"), _("That column doesn't have any settings defined."), AdvancedMessageDialogButtonsOk()); return; } GeneratorSettings *n = new GeneratorSettings((*it).second); wxString c = tab->getQuotedName() + wxT(".") + col->getQuotedName(); it = settingsM.find(c); if (it == settingsM.end()) // this should not happen either, but still settingsM.insert(std::pair(c, n)); else { delete (*it).second; (*it).second = n; } // update the current node loadSetting(mainTree->GetSelection()); } //----------------------------------------------------------------------------- void DataGeneratorFrame::OnFileButtonClick(wxCommandEvent& WXUNUSED(event)) { wxFileDialog fd(this, _("Select file to load"), wxT(""), wxT(""), _("Text files (*.txt)|*.txt|All files (*.*)|*.*"), wxFD_OPEN | wxFD_CHANGE_DIR); if (wxID_OK != fd.ShowModal()) return; fileText->SetValue(fd.GetPath()); radioFile->SetValue(true); } //----------------------------------------------------------------------------- void DataGeneratorFrame::OnGenerateButtonClick(wxCommandEvent& WXUNUSED(event)) { saveSetting(mainTree->GetSelection()); // save current item if changed std::list
order; if (sortTables(order)) generateData(order); // perhaps add a comment like: "A total of XYZ records were inserted." showInformationDialog(this, _("Generator done"), _("Data generation completed."), AdvancedMessageDialogButtonsOk()); } //----------------------------------------------------------------------------- bool DataGeneratorFrame::sortTables(std::list
& order) { // collect list of tables // if some table is dropped from the database, it would be // removed from tree, but it will remain in tableRecordsM // That's why we just search for existing tables that are // also present in tableRecordsM std::list deps; TablesPtr t = databaseM->getTables(); for (Tables::iterator it = t->begin(); it != t->end(); ++it) { std::map::iterator i2 = tableRecordsM.find((*it)->getQuotedName()); if (i2 != tableRecordsM.end() && (*i2).second > 0) { TableDep *td = new TableDep((*it).get(), tableRecordsM); deps.push_back(td); } } // Topological sorting: // take out independent tables one by one and remove them from // dependency lists of those depending on them while (!deps.empty()) { bool removed = false; for (std::list::iterator it = deps.begin(); it != deps.end(); ++it) { if ((*it)->dependsOn.size() != 0) // has dependencies continue; order.push_back((*it)->table); wxString tablename = (*it)->table->getQuotedName(); for (std::list::iterator i2 = deps.begin(); i2 != deps.end(); ++i2) { (*i2)->remove(tablename); } delete (*it); deps.erase(it); removed = true; break; } if (!removed) { showWarningDialog(this, _("Circular dependency"), _("A circular dependency was detected among your tables. We are unable to determine to correct order of tables for insert. Currently, the only cure is to first generate data for just one of the tables."), AdvancedMessageDialogButtonsOk()); // release memory for (std::list::iterator it = deps.begin(); it != deps.end(); ++it) { delete (*it); } return false; } } return true; } //----------------------------------------------------------------------------- // range = comma separated list of values or ranges wxString getCharFromRange(const wxString& range, bool rnd, int recNo, int charNo, int chars) { wxString valueset; size_t start = 0; while (start < range.Length()) { // last wxString one = range.Mid(start); size_t p = range.find(wxT(","), start); if (p != wxString::npos) { one = range.Mid(start, p-start); start = p + 1; } else start = range.Length(); // exit on next loop if (one.Length() == 1) valueset += one; else if (one.Length() == 2) // range { for (wxChar c = one[0]; c <= one[1]; c++) valueset += c; } else throw FRError(_("Bad range: section length not 1 or 2: ") + one); } if (rnd) return valueset.Mid(frRandom(valueset.Length()), 1); // sequential: we support stuff like 001,002,003 or AAA,AAB,AAC // by converting the record counter to number with n-th base // where n is a number of characters in valueset int base = valueset.Length(); int record = recNo; for (int i=0; ifileName); if (!stream.Ok()) throw FRError(_("Cannot open file: ")+gs->fileName); wxTextInputStream text(stream); std::vector values; while (true) { wxString s = text.ReadLine(); if (s.IsEmpty()) break; values.push_back(s); } if (values.empty()) return; // select (random/sequential) string from vector wxString selected; if (gs->randomValues) selected = values[frRandom(values.size())]; else selected = values[recNo % values.size()]; // convert string to datatype int mydate, mytime; IBPP::SDT dt = st->ParameterType(param); if (st->ParameterScale(param)) dt = IBPP::sdDouble; switch (dt) { case IBPP::sdString: st->Set(param, wx2std(selected)); break; case IBPP::sdSmallint: { long l; if (!selected.ToLong(&l)) throw FRError(_("Invalid long (smallint) value: ")+selected); int16_t t = l; st->Set(param, t); break; } case IBPP::sdLargeint: { wxLongLong_t ll; if (!selected.ToLongLong(&ll)) throw FRError(_("Invalid long long numeric value: ")+selected); int64_t t = ll; st->Set(param, t); break; } case IBPP::sdInteger: { long l; if (!selected.ToLong(&l)) throw FRError(_("Invalid long numeric value: ")+selected); int32_t t = l; st->Set(param, t); break; } case IBPP::sdFloat: { double d; if (!selected.ToDouble(&d)) throw FRError(_("Invalid float value: ")+selected); float f = d; st->Set(param, f); break; } case IBPP::sdDouble: { double d; if (!selected.ToDouble(&d)) throw FRError(_("Invalid double numeric value: ")+selected); st->Set(param, d); break; } case IBPP::sdTime: str2time(selected, mytime); st->Set(param, IBPP::Time(mytime)); break; case IBPP::sdDate: str2date(selected, mydate); st->Set(param, IBPP::Date(mydate)); break; case IBPP::sdTimestamp: { str2date(selected, mydate); str2time(selected.Mid(11), mytime); int y, mo, d, h, mi, s, t; IBPP::dtoi(mydate, &y, &mo, &d); IBPP::ttoi(mytime, &h, &mi, &s, &t); st->Set(param, IBPP::Timestamp(y, mo, d, h, mi, s, t)); break; } case IBPP::sdBlob: throw FRError(_("Blob datatype not supported")); case IBPP::sdArray: throw FRError(_("Array datatype not supported")); }; } //----------------------------------------------------------------------------- template void setFromOther(IBPP::Statement st, int param, GeneratorSettings *gs, size_t recNo) { IBPP::Statement st2 = IBPP::StatementFactory(st->DatabasePtr(), st->TransactionPtr()); wxString sql = wxT("SELECT ") + gs->sourceColumn + wxT(" FROM ") + gs->sourceTable + wxT(" WHERE ") + gs->sourceColumn + wxT(" IS NOT NULL"); if (!gs->randomValues) sql += wxT(" ORDER BY 1"); st2->Prepare(wx2std(sql)); st2->Execute(); std::vector values; while (st2->Fetch()) { T value; st2->Get(1, value); values.push_back(value); if (values.size() > recNo && !gs->randomValues) { st->Set(param, value); return; } if (values.size() > 99 && gs->randomValues) break; } if (values.size() == 0) { if (gs->nullPercent > 0) { st->SetNull(param); return; } else throw FRError(_("No records found in table: ") + gs->sourceTable); } if (gs->randomValues) st->Set(param, values[frRandom(values.size())]); else st->Set(param, values[recNo % values.size()]); } //----------------------------------------------------------------------------- // format for values: // number[value or range(s)] // example: 25[az,AZ,09] means: 25 letters or numbers // example: 10[a,x,5] means: 10 chars, each either of 'a', 'x' or '5' void DataGeneratorFrame::setString(IBPP::Statement st, int param, GeneratorSettings* gs, int recNo) { wxString value; long chars = 1; size_t start = 0; while (start < gs->range.Length()) { if (gs->range.Mid(start, 1) == wxT("[")) { size_t p = gs->range.find(wxT("]"), start+1); if (p == wxString::npos) // invalid mask throw FRError(_("Invalid mask: missing ]")); for (int i = 0; i < chars; i++) { value += getCharFromRange(gs->range.Mid(start+1, p-start-1), gs->randomValues, recNo, i, chars); } start = p+1; chars = 1; } else { size_t p = gs->range.find(wxT("["), start+1); if (p == wxString::npos) // invalid mask throw FRError(_("Invalid mask, missing [")); wxString number = gs->range.Mid(start, p-start); if (!number.ToLong(&chars)) throw FRError(_("Bad number: ")+number); start = p; } } st->Set(param, wx2std(value, databaseM->getCharsetConverter())); } //----------------------------------------------------------------------------- // gs->range = x,x-y,... template void setNumber(IBPP::Statement st, int param, GeneratorSettings* gs, int recNo) { std::vector< std::pair > ranges; long rangesize = 0; size_t start = 0; while (start < gs->range.Length()) { // last wxString one = gs->range.Mid(start); size_t p = gs->range.find(wxT(","), start); if (p != wxString::npos) { one = gs->range.Mid(start, p-start); start = p + 1; } else start = gs->range.Length(); // exit on next loop p = one.find(wxT("-")); if (p == wxString::npos) { long l; if (!one.ToLong(&l)) throw FRError(_("Invalid number: ") + one); ranges.push_back(std::pair(l, l)); rangesize++; } else { long l1, l2; if (!one.Mid(0, p).ToLong(&l1) || !one.Mid(p+1).ToLong(&l2)) throw FRError(_("Invalid range: ") + one); ranges.push_back(std::pair(l1, l2)); rangesize += (l2-l1+1); } } long toget = (gs->randomValues ? frRandom(rangesize) : (recNo % rangesize)); for (std::vector< std::pair >::iterator it = ranges.begin(); it != ranges.end(); ++it) { long sz = (*it).second - (*it).first + 1; if (sz > toget) { st->Set(param, (T)((*it).first + toget)); return; } toget -= sz; } } //----------------------------------------------------------------------------- void setDatetime(IBPP::Statement st, int param, GeneratorSettings* gs, int recNo) { std::vector< std::pair > dateRanges; std::vector< std::pair > timeRanges; int dateRangesize = 0; int timeRangesize = 0; IBPP::SDT dt = st->ParameterType(param); size_t start = 0; while (start < gs->range.Length()) { // last wxString one = gs->range.Mid(start); size_t p = gs->range.find(wxT(","), start); if (p != wxString::npos) { one = gs->range.Mid(start, p-start); start = p + 1; } else start = gs->range.Length(); // exit on next loop // convert first value int date, time; if ((dt == IBPP::sdDate || dt == IBPP::sdTimestamp)) str2date(one.Mid(0,10), date); if (dt == IBPP::sdTime) str2time(one.Mid(0,8), time); if (dt == IBPP::sdTimestamp) str2time(one.Mid(11,8), time); p = one.find(wxT("-")); if (p == wxString::npos) { if (dt == IBPP::sdDate || dt == IBPP::sdTimestamp) { dateRanges.push_back(std::pair(date, date)); dateRangesize++; } if (dt == IBPP::sdTime || dt == IBPP::sdTimestamp) { timeRanges.push_back(std::pair(time, time)); timeRangesize++; } } else // range, convert second date/time { int date2, time2; if (dt == IBPP::sdDate) str2date(one.Mid(11,10), date2); if (dt == IBPP::sdTimestamp) str2date(one.Mid(20,10), date2); if (dt == IBPP::sdTime) str2time(one.Mid( 9, 8), time2); if (dt == IBPP::sdTimestamp) str2time(one.Mid(31, 8), time2); if (dt == IBPP::sdDate || dt == IBPP::sdTimestamp) { dateRanges.push_back(std::pair(date, date2)); dateRangesize += (date2-date+1); } if (dt == IBPP::sdTime || dt == IBPP::sdTimestamp) { timeRanges.push_back(std::pair(time, time2)); timeRangesize += ((time2-time) / 10000 + 1); } } } int dateToGet, timeToGet; if (gs->randomValues) { dateToGet = (dateRangesize ? frRandom(dateRangesize) : 0); timeToGet = (timeRangesize ? frRandom(timeRangesize) : 0); } else { dateToGet = (dateRangesize ? recNo % dateRangesize : 0); timeToGet = (timeRangesize ? recNo % timeRangesize : 0); } int myDate = 0; int myTime = 0; for (std::vector< std::pair >::iterator it = dateRanges.begin(); it != dateRanges.end(); ++it) { int sz = (*it).second - (*it).first + 1; if (sz > dateToGet) { myDate = ((*it).first + dateToGet); break; } dateToGet -= sz; } for (std::vector< std::pair >::iterator it = timeRanges.begin(); it != timeRanges.end(); ++it) { int sz = ((*it).second - (*it).first)/10000 + 1; if (sz > timeToGet) { myTime = ((*it).first + timeToGet*10000); break; } timeToGet -= sz; } if (dt == IBPP::sdDate) st->Set(param, IBPP::Date(myDate)); if (dt == IBPP::sdTime) st->Set(param, IBPP::Time(myTime)); if (dt == IBPP::sdTimestamp) { int y, mo, d, h, mi, s, t; IBPP::dtoi(myDate, &y, &mo, &d); IBPP::ttoi(myTime, &h, &mi, &s, &t); st->Set(param, IBPP::Timestamp(y, mo, d, h, mi, s, t)); } } //----------------------------------------------------------------------------- void DataGeneratorFrame::setParam(IBPP::Statement st, int param, GeneratorSettings* gs, int recNo) { if (gs->nullPercent > frRandom(100)) { st->SetNull(param); return; } if (gs->valueType == GeneratorSettings::vtColumn) // copy from column { switch (st->ParameterType(param)) { case IBPP::sdString: setFromOther(st, param, gs, recNo); break; case IBPP::sdSmallint: setFromOther(st, param, gs, recNo); break; case IBPP::sdInteger: setFromOther(st, param, gs, recNo); break; case IBPP::sdLargeint: setFromOther(st, param, gs, recNo); break; case IBPP::sdFloat: setFromOther(st, param, gs, recNo); break; case IBPP::sdDouble: setFromOther(st, param, gs, recNo); break; case IBPP::sdDate: setFromOther(st, param, gs, recNo); break; case IBPP::sdTime: setFromOther(st, param, gs, recNo); break; case IBPP::sdTimestamp: setFromOther(st, param, gs, recNo); break; case IBPP::sdBlob: throw FRError(_("Blob datatype not supported")); case IBPP::sdArray: throw FRError(_("Array datatype not supported")); }; return; } if (gs->valueType == GeneratorSettings::vtRange) { switch (st->ParameterType(param)) { case IBPP::sdString: setString(st, param, gs, recNo); break; case IBPP::sdSmallint: setNumber(st, param, gs, recNo); break; case IBPP::sdInteger: setNumber(st, param, gs, recNo); break; case IBPP::sdLargeint: setNumber(st, param, gs, recNo); break; case IBPP::sdFloat: setNumber (st, param, gs, recNo); break; case IBPP::sdDouble: setNumber (st, param, gs, recNo); break; case IBPP::sdDate: case IBPP::sdTime: case IBPP::sdTimestamp: setDatetime(st, param, gs, recNo); break; case IBPP::sdBlob: throw FRError(_("Blob datatype not supported")); case IBPP::sdArray: throw FRError(_("Array datatype not supported")); default: st->SetNull(param); }; } if (gs->valueType == GeneratorSettings::vtFile) setFromFile(st, param, gs, recNo); } //----------------------------------------------------------------------------- void DataGeneratorFrame::generateData(std::list
& order) { ProgressDialog pd(this, _("Generating data"), 2); pd.doShow(); pd.initProgress(_("Inserting into tables"), order.size()); // one big transaction (perhaps this should be configurable) IBPP::Transaction tr = IBPP::TransactionFactory(databaseM->getIBPPDatabase()); tr->Start(); for (std::list
::iterator it = order.begin(); it != order.end(); ++it) { pd.setProgressMessage((*it)->getName_(), 1); pd.stepProgress(); std::map::iterator i2 = tableRecordsM.find((*it)->getQuotedName()); int records = (*i2).second; pd.initProgress(wxString::Format(_("Inserting %d records."), records), records, 0, 2); // collect columns + create insert statement wxString ins = wxT("INSERT INTO ") + (*it)->getQuotedName() + wxT(" ("); wxString params(wxT(") VALUES (")); (*it)->ensureChildrenLoaded(); bool first = true; std::vector colSet; for (ColumnPtrs::iterator col = (*it)->begin(); col != (*it)->end(); ++col) { GeneratorSettings *gs = getSettings((*col).get()); // load or create if (gs->valueType == GeneratorSettings::vtSkip) continue; if (first) first = false; else { ins += wxT(", "); params += wxT(","); } ins += (*col)->getQuotedName(); params += wxT("?"); colSet.push_back(gs); } if (first) // no columns continue; IBPP::Statement st = IBPP::StatementFactory(databaseM->getIBPPDatabase(), tr); st->Prepare(wx2std(ins + params + wxT(")"))); for (int i = 0; i < records; i++) { if (pd.isCanceled()) return; pd.stepProgress(1, 2); for (int p = 0; p < st->Parameters(); ++p) setParam(st, p+1, colSet[p], i); st->Execute(); } } tr->Commit(); } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/DataGeneratorFrame.h000066400000000000000000000107361177057155300234310ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_DATAGENERATORFRAME_H #define FR_DATAGENERATORFRAME_H //----------------------------------------------------------------------------- #include #include #include #include #include #include "core/Observer.h" #include "core/StringUtils.h" #include "gui/BaseFrame.h" class Database; class Column; class Table; class DBHTreeControl; class GeneratorSettings; //----------------------------------------------------------------------------- class DataGeneratorFrame: public BaseFrame, public Observer { DECLARE_EVENT_TABLE() protected: bool loadingM; // prevent updates until loaded std::map settingsM; std::map tableRecordsM; Database* databaseM; virtual const wxString getName() const; virtual const wxRect getDefaultRect() const; void showColumnSettings(bool show); GeneratorSettings* getSettings(Column *c); void saveSetting(wxTreeItemId item); void loadSetting(wxTreeItemId newitem); bool loadColumns(const wxString& tableName, wxChoice* c); bool sortTables(std::list
& order); void generateData(std::list
& order); void setParam( IBPP::Statement st, int param, GeneratorSettings* gs, int recNo); void setString(IBPP::Statement st, int param, GeneratorSettings* gs, int recNo); enum { ID_button_file = 1000, ID_button_save, ID_button_load, ID_button_generate, ID_button_copy, ID_checkbox_skip, ID_choice_value, ID_choice_copy }; wxBoxSizer* rightPanelSizer; wxBoxSizer* valueSizer; wxBoxSizer* copySizer; wxPanel* outerPanel; wxSplitterWindow* mainSplitter; wxPanel* leftPanel; wxStaticText* leftLabel; DBHTreeControl* mainTree; wxPanel* rightPanel; wxStaticText* rightLabel; wxStaticText* tableLabel; wxStaticText* recordsLabel; wxSpinCtrl* spinRecords; wxCheckBox* skipCheckbox; wxStaticText* columnLabel; wxStaticText* valuetypeLabel; wxRadioButton* radioSkip; wxRadioButton* radioRange; wxTextCtrl* rangeText; wxRadioButton* radioColumn; wxChoice* valueChoice; wxChoice* valueColumnChoice; wxRadioButton* radioFile; wxTextCtrl* fileText; wxButton* fileButton; wxCheckBox* randomCheckbox; wxStaticText* nullLabel; wxSpinCtrl* nullSpin; wxStaticText* nullPercentLabel; wxStaticText* copyLabel; wxChoice* copyChoice; wxChoice* copyColumnChoice; wxButton* copyButton; wxButton* saveButton; wxButton* loadButton; wxButton* generateButton; void OnFileButtonClick(wxCommandEvent& event); void OnCopyButtonClick(wxCommandEvent& event); void OnSaveButtonClick(wxCommandEvent& event); void OnLoadButtonClick(wxCommandEvent& event); void OnGenerateButtonClick(wxCommandEvent& event); void OnSkipCheckboxClick(wxCommandEvent& event); void OnTableValueChoiceChange(wxCommandEvent& event); void OnTableCopyChoiceChange(wxCommandEvent& event); void OnTreeSelectionChanged(wxTreeEvent& event); private: // observer stuff virtual void subjectRemoved(Subject* subject); virtual void update(); public: DataGeneratorFrame(wxWindow* parent, Database* db); ~DataGeneratorFrame(); }; //----------------------------------------------------------------------------- #endif flamerobin_0.9.3~svn+2220.orig/src/gui/DatabaseRegistrationDialog.cpp000066400000000000000000000520461177057155300255100ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include "config/Config.h" #include "core/StringUtils.h" #include "gui/controls/DndTextControls.h" #include "gui/DatabaseRegistrationDialog.h" #include "gui/StyleGuide.h" #include "metadata/database.h" #include "metadata/server.h" //----------------------------------------------------------------------------- DatabaseRegistrationDialog::DatabaseRegistrationDialog(wxWindow* parent, const wxString& title, bool createDB, bool connectAs) : BaseDialog(parent, wxID_ANY, title) { createM = createDB; connectAsM = connectAs; isDefaultNameM = true; createControls(); setControlsProperties(); layoutControls(); updateButtons(); } //----------------------------------------------------------------------------- //! implementation details void DatabaseRegistrationDialog::createControls() { label_name = new wxStaticText(getControlsPanel(), -1, _("Display name:")); text_ctrl_name = new wxTextCtrl(getControlsPanel(), ID_textcontrol_name, wxEmptyString); label_dbpath = new wxStaticText(getControlsPanel(), -1, _("Database path:")); text_ctrl_dbpath = new FileTextControl(getControlsPanel(), ID_textcontrol_dbpath, wxEmptyString); button_browse = new wxButton(getControlsPanel(), ID_button_browse, wxT("..."), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT); label_authentication = new wxStaticText(getControlsPanel(), -1, _("Authentication:")); choice_authentication = new wxChoice(getControlsPanel(), ID_choice_authentication, wxDefaultPosition, wxDefaultSize, getAuthenticationChoices()); label_username = new wxStaticText(getControlsPanel(), -1, _("User name:")); text_ctrl_username = new wxTextCtrl(getControlsPanel(), ID_textcontrol_username, wxEmptyString); label_password = new wxStaticText(getControlsPanel(), -1, _("Password:")); text_ctrl_password = new wxTextCtrl(getControlsPanel(), ID_textcontrol_password, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD); label_charset = new wxStaticText(getControlsPanel(), -1, _("Charset:")); combobox_charset = new wxComboBox(getControlsPanel(), -1, wxT("NONE"), wxDefaultPosition, wxDefaultSize, getDatabaseCharsetChoices(), wxCB_DROPDOWN | wxCB_SORT); label_role = new wxStaticText(getControlsPanel(), -1, _("Role:")); text_ctrl_role = new wxTextCtrl(getControlsPanel(), -1, wxT("")); if (createM) { label_pagesize = new wxStaticText(getControlsPanel(), -1, _("Page size:")); choice_pagesize = new wxChoice(getControlsPanel(), -1, wxDefaultPosition, wxDefaultSize, getDatabasePagesizeChoices()); label_dialect = new wxStaticText(getControlsPanel(), -1, _("SQL dialect:")); choice_dialect = new wxChoice(getControlsPanel(), -1, wxDefaultPosition, wxDefaultSize, getDatabaseDialectChoices()); } button_ok = new wxButton(getControlsPanel(), wxID_SAVE, (createM ? _("Create") : _("Save"))); button_cancel = new wxButton(getControlsPanel(), wxID_CANCEL, _("Cancel")); } //----------------------------------------------------------------------------- wxArrayString DatabaseRegistrationDialog::getAuthenticationChoices() const { wxArrayString choices; if (connectAsM) choices.Add(_("Enter user name and password")); else { choices.Add(_("Use saved user name and password")); choices.Add(_("Use saved user name and encrypted password")); choices.Add(_("Use saved user name, but always enter password")); choices.Add(_("Use trusted user authentication")); } return choices; } //----------------------------------------------------------------------------- wxArrayString DatabaseRegistrationDialog::getDatabaseCharsetChoices() const { const wxString charset_choices[] = { wxT("NONE"), wxT("ASCII"), wxT("BIG_5"), wxT("CYRL"), wxT("DOS437"), wxT("DOS737"), wxT("DOS775"), wxT("DOS850"), wxT("DOS852"), wxT("DOS857"), wxT("DOS858"), wxT("DOS860"), wxT("DOS861"), wxT("DOS862"), wxT("DOS863"), wxT("DOS864"), wxT("DOS865"), wxT("DOS866"), wxT("DOS869"), wxT("EUCJ_0208"), wxT("GB_2312"), wxT("ISO8859_1"), wxT("ISO8859_2"), wxT("ISO8859_3"), wxT("ISO8859_4"), wxT("ISO8859_5"), wxT("ISO8859_6"), wxT("ISO8859_7"), wxT("ISO8859_8"), wxT("ISO8859_9"), wxT("ISO8859_13"), wxT("KSC_5601"), wxT("NEXT"), wxT("OCTETS"), wxT("SJIS_0208"), wxT("UNICODE_FSS"), wxT("UTF8"), wxT("WIN1250"), wxT("WIN1251"), wxT("WIN1252"), wxT("WIN1253"), wxT("WIN1254"), wxT("WIN1255"), wxT("WIN1256"), wxT("WIN1257") }; const size_t cnt = sizeof(charset_choices) / sizeof(wxString); wxArrayString choices; choices.Alloc(cnt); for (size_t i = 0; i < cnt; i++) choices.Add(charset_choices[i]); return choices; } //----------------------------------------------------------------------------- wxArrayString DatabaseRegistrationDialog::getDatabaseDialectChoices() const { wxArrayString choices; choices.Alloc(2); // IBPP allows only dialects 1 and 3 for database creation choices.Add(_("1")); choices.Add(wxT("3")); return choices; } //----------------------------------------------------------------------------- wxArrayString DatabaseRegistrationDialog::getDatabasePagesizeChoices() const { wxArrayString choices; choices.Alloc(6); choices.Add(_("Default")); choices.Add(wxT("1024")); choices.Add(wxT("2048")); choices.Add(wxT("4096")); choices.Add(wxT("8192")); choices.Add(wxT("16384")); return choices; } //----------------------------------------------------------------------------- void DatabaseRegistrationDialog::doReadConfigSettings(const wxString& prefix) { BaseDialog::doReadConfigSettings(prefix); if (createM) { int idx = config().get( prefix + Config::pathSeparator + wxT("createDialogAuthentication"), wxNOT_FOUND); bool indexValid = idx >= 0 && idx < static_cast(choice_authentication->GetCount()); if (indexValid) choice_authentication->SetSelection(idx); wxString selection, empty; selection = config().get( prefix + Config::pathSeparator + wxT("createDialogCharset"), empty); if (!selection.empty()) combobox_charset->SetStringSelection(selection); selection = config().get( prefix + Config::pathSeparator + wxT("createDialogPageSize"), empty); if (!selection.empty()) choice_pagesize->SetStringSelection(selection); selection = config().get( prefix + Config::pathSeparator + wxT("createDialogDialect"), empty); if (!selection.empty()) choice_dialect->SetStringSelection(selection); } } //----------------------------------------------------------------------------- void DatabaseRegistrationDialog::doWriteConfigSettings( const wxString& prefix) const { BaseDialog::doWriteConfigSettings(prefix); if (createM && GetReturnCode() == wxID_OK) { config().setValue( prefix + Config::pathSeparator + wxT("createDialogAuthentication"), choice_authentication->GetSelection()); config().setValue( prefix + Config::pathSeparator + wxT("createDialogCharset"), combobox_charset->GetStringSelection()); config().setValue( prefix + Config::pathSeparator + wxT("createDialogPageSize"), choice_pagesize->GetStringSelection()); config().setValue( prefix + Config::pathSeparator + wxT("createDialogDialect"), choice_dialect->GetStringSelection()); } } //----------------------------------------------------------------------------- const wxString DatabaseRegistrationDialog::getName() const { // don't use different names here, force minimal height instead // this way it will work for all combinations of control visibility return wxT("DatabaseRegistrationDialog"); } //----------------------------------------------------------------------------- bool DatabaseRegistrationDialog::getConfigStoresHeight() const { return false; } //----------------------------------------------------------------------------- void DatabaseRegistrationDialog::layoutControls() { // create sizer for controls wxGridBagSizer* sizerControls = new wxGridBagSizer(styleguide().getRelatedControlMargin(wxVERTICAL), styleguide().getControlLabelMargin()); sizerControls->Add(label_name, wxGBPosition(0, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); sizerControls->Add(text_ctrl_name, wxGBPosition(0, 1), wxGBSpan(1, 3), wxALIGN_CENTER_VERTICAL | wxEXPAND); sizerControls->Add(label_dbpath, wxGBPosition(1, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); wxBoxSizer* sizer_r1c1_3 = new wxBoxSizer(wxHORIZONTAL); sizer_r1c1_3->Add(text_ctrl_dbpath, 1, wxALIGN_CENTER_VERTICAL); sizer_r1c1_3->Add(button_browse, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, styleguide().getBrowseButtonMargin()); sizerControls->Add(sizer_r1c1_3, wxGBPosition(1, 1), wxGBSpan(1, 3), wxEXPAND); sizerControls->Add(label_authentication, wxGBPosition(2, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); sizerControls->Add(choice_authentication, wxGBPosition(2, 1), wxGBSpan(1, 3), wxALIGN_CENTER_VERTICAL | wxEXPAND); int dx = styleguide().getUnrelatedControlMargin(wxHORIZONTAL) - styleguide().getControlLabelMargin(); if (dx < 0) dx = 0; sizerControls->Add(label_username, wxGBPosition(3, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); sizerControls->Add(text_ctrl_username, wxGBPosition(3, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL | wxEXPAND); sizerControls->Add(label_password, wxGBPosition(3, 2), wxDefaultSpan, wxLEFT | wxALIGN_CENTER_VERTICAL, dx); sizerControls->Add(text_ctrl_password, wxGBPosition(3, 3), wxDefaultSpan, wxALIGN_CENTER_VERTICAL | wxEXPAND); sizerControls->Add(label_charset, wxGBPosition(4, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); sizerControls->Add(combobox_charset, wxGBPosition(4, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL | wxEXPAND); sizerControls->Add(label_role, wxGBPosition(4, 2), wxDefaultSpan, wxLEFT | wxALIGN_CENTER_VERTICAL, dx); sizerControls->Add(text_ctrl_role, wxGBPosition(4, 3), wxDefaultSpan, wxALIGN_CENTER_VERTICAL | wxEXPAND); if (createM) { sizerControls->Add(label_pagesize, wxGBPosition(5, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); sizerControls->Add(choice_pagesize, wxGBPosition(5, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL | wxEXPAND); sizerControls->Add(label_dialect, wxGBPosition(5, 2), wxDefaultSpan, wxLEFT | wxALIGN_CENTER_VERTICAL, dx); sizerControls->Add(choice_dialect, wxGBPosition(5, 3), wxDefaultSpan, wxALIGN_CENTER_VERTICAL | wxEXPAND); } sizerControls->AddGrowableCol(1); sizerControls->AddGrowableCol(3); // create sizer for buttons -> styleguide class will align it correctly wxSizer* sizerButtons = styleguide().createButtonSizer(button_ok, button_cancel); // use method in base class to set everything up layoutSizers(sizerControls, sizerButtons); } //----------------------------------------------------------------------------- void DatabaseRegistrationDialog::setControlsProperties() { int wh = text_ctrl_dbpath->GetMinHeight(); button_browse->SetSize(wh, wh); choice_authentication->SetSelection(0); combobox_charset->SetStringSelection(wxT("NONE")); if (createM) { choice_pagesize->SetStringSelection(wxT("4096")); choice_dialect->SetStringSelection(wxT("3")); } button_ok->SetDefault(); } //----------------------------------------------------------------------------- void DatabaseRegistrationDialog::setDatabase(DatabasePtr db) { wxASSERT(db); databaseM = db; /* this could be reactivated if there is a dialog with "Don't show me again" if (databaseM->isConnected()) ::wxMessageBox(_("Properties of connected database cannot be changed."), _("Warning"), wxOK |wxICON_INFORMATION ); */ text_ctrl_name->SetValue(databaseM->getName_()); text_ctrl_dbpath->SetValue(databaseM->getPath()); text_ctrl_username->SetValue(databaseM->getUsername()); text_ctrl_password->SetValue(databaseM->getDecryptedPassword()); text_ctrl_role->SetValue(databaseM->getRole()); wxString charset(databaseM->getConnectionCharset()); if (charset.empty()) charset = wxT("NONE"); combobox_charset->SetValue(charset); // see whether the database has an empty or default name; knowing that will be // useful to keep the name in sync when other attributes change. updateIsDefaultDatabaseName(); // enable controls depending on operation and database connection status // use SetEditable() for edit controls to allow copying text to clipboard bool isConnected = databaseM->isConnected(); text_ctrl_name->SetEditable(!connectAsM); text_ctrl_dbpath->SetEditable(!connectAsM && !isConnected); button_browse->Enable(!connectAsM && !isConnected); choice_authentication->Enable(!connectAsM && !isConnected); combobox_charset->Enable(!isConnected); text_ctrl_role->SetEditable(!isConnected); if (connectAsM) button_ok->SetLabel(_("Connect")); else { choice_authentication->SetSelection( databaseM->getAuthenticationMode().getMode()); } updateAuthenticationMode(); updateButtons(); updateColors(); } //----------------------------------------------------------------------------- void DatabaseRegistrationDialog::setServer(ServerPtr s) { wxASSERT(s); serverM = s; } //----------------------------------------------------------------------------- void DatabaseRegistrationDialog::updateAuthenticationMode() { bool isConnected = databaseM->isConnected(); int sel = choice_authentication->GetSelection(); // user name not for trusted user authentication text_ctrl_username->SetEditable(!isConnected && sel < 3); // password not if always to be entered // password not for trusted user authentication text_ctrl_password->SetEditable(!isConnected && sel < 2); updateButtons(); } //----------------------------------------------------------------------------- void DatabaseRegistrationDialog::updateButtons() { if (button_ok->IsShown()) { bool missingUserName = text_ctrl_username->IsEditable() && text_ctrl_username->GetValue().IsEmpty(); button_ok->Enable(!text_ctrl_dbpath->GetValue().IsEmpty() && !text_ctrl_name->GetValue().IsEmpty() && !missingUserName); } } //----------------------------------------------------------------------------- wxString DatabaseRegistrationDialog::getDefaultDatabaseName() const { return Database::extractNameFromConnectionString( text_ctrl_dbpath->GetValue()); } //----------------------------------------------------------------------------- void DatabaseRegistrationDialog::updateIsDefaultDatabaseName() { wxString name(text_ctrl_name->GetValue()); isDefaultNameM = name.empty() || name == getDefaultDatabaseName(); } //----------------------------------------------------------------------------- //! event handling BEGIN_EVENT_TABLE(DatabaseRegistrationDialog, BaseDialog) EVT_BUTTON(DatabaseRegistrationDialog::ID_button_browse, DatabaseRegistrationDialog::OnBrowseButtonClick) EVT_BUTTON(wxID_SAVE, DatabaseRegistrationDialog::OnOkButtonClick) EVT_TEXT(DatabaseRegistrationDialog::ID_textcontrol_dbpath, DatabaseRegistrationDialog::OnSettingsChange) EVT_TEXT(DatabaseRegistrationDialog::ID_textcontrol_name, DatabaseRegistrationDialog::OnNameChange) EVT_TEXT(DatabaseRegistrationDialog::ID_textcontrol_username, DatabaseRegistrationDialog::OnSettingsChange) EVT_CHOICE(DatabaseRegistrationDialog::ID_choice_authentication, DatabaseRegistrationDialog::OnAuthenticationChange) END_EVENT_TABLE() //----------------------------------------------------------------------------- void DatabaseRegistrationDialog::OnBrowseButtonClick(wxCommandEvent& WXUNUSED(event)) { wxString path = ::wxFileSelector(_("Select database file"), wxT(""), wxT(""), wxT(""), _("Firebird database files (*.fdb, *.gdb)|*.fdb;*.gdb|All files (*.*)|*.*"), wxFD_OPEN, this); if (!path.empty()) text_ctrl_dbpath->SetValue(path); } //----------------------------------------------------------------------------- void DatabaseRegistrationDialog::OnOkButtonClick(wxCommandEvent& WXUNUSED(event)) { // FIXME: implement a better interface than separate setServer() // and setDatabase() methods if (serverM) databaseM->setServer(serverM); // TODO: This needs to be reworked. If the order of method calls is important // then they must not be provided as independent methods !!! // Please note that the order of calls is important here: // setPath and setUsername and setStoreEncryptedPassword // must come before setEncryptedPassword. // The reason is that setEncryptedPassword uses those 3 values to determine // whether the password needs to be encrypted, and if it does need, it uses // them to calculate the key (using master key) if (!connectAsM) { int sel = choice_authentication->GetSelection(); databaseM->getAuthenticationMode().setMode(sel); } databaseM->setName_(text_ctrl_name->GetValue()); databaseM->setPath(text_ctrl_dbpath->GetValue()); databaseM->setUsername(text_ctrl_username->GetValue()); databaseM->setEncryptedPassword(text_ctrl_password->GetValue()); wxBusyCursor wait; // for some reason GetValue didn't work correctly before // I can't remember the exact issue, perhaps it was platform specific (Gtk1 maybe?) // so we replaced all of those with GetStringSelection() // the problem is that we are now using a *real* combo, not just a // dropdown list. So, this needs testing databaseM->setConnectionCharset(combobox_charset->GetValue()); //databaseM->setConnectionCharset(combobox_charset->GetStringSelection()); databaseM->setRole(text_ctrl_role->GetValue()); try { if (createM) // create new database { long ps = 0; if (!choice_pagesize->GetStringSelection().ToLong(&ps)) ps = 0; long dialect = 3; if (choice_dialect->GetStringSelection() == wxT("1")) dialect = 1; serverM->createDatabase(databaseM, ps, dialect); } EndModal(wxID_OK); } catch (IBPP::Exception &e) { wxMessageBox(std2wx(e.ErrorMessage()), _("Error"), wxOK|wxICON_ERROR); } catch (...) { wxMessageBox(_("SYSTEM ERROR!"), _("Error"), wxOK|wxICON_ERROR); } } //----------------------------------------------------------------------------- void DatabaseRegistrationDialog::OnSettingsChange( wxCommandEvent& WXUNUSED(event)) { if (IsShown()) { if (isDefaultNameM) text_ctrl_name->SetValue(getDefaultDatabaseName()); updateIsDefaultDatabaseName(); updateButtons(); } } //----------------------------------------------------------------------------- void DatabaseRegistrationDialog::OnNameChange(wxCommandEvent& WXUNUSED(event)) { if (IsShown()) { updateIsDefaultDatabaseName(); updateButtons(); } } //----------------------------------------------------------------------------- void DatabaseRegistrationDialog::OnAuthenticationChange( wxCommandEvent& WXUNUSED(event)) { if (IsShown()) { updateAuthenticationMode(); updateColors(); } } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/DatabaseRegistrationDialog.h000066400000000000000000000076321177057155300251560ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef DATABASEREGISTRATIONDIALOG_H #define DATABASEREGISTRATIONDIALOG_H //----------------------------------------------------------------------------- #include #include "gui/BaseDialog.h" #include "metadata/MetadataClasses.h" class FileTextControl; //----------------------------------------------------------------------------- class DatabaseRegistrationDialog: public BaseDialog { private: ServerPtr serverM; DatabasePtr databaseM; bool createM; bool connectAsM; bool isDefaultNameM; wxStaticText* label_name; wxTextCtrl* text_ctrl_name; wxStaticText* label_dbpath; FileTextControl* text_ctrl_dbpath; wxButton* button_browse; wxStaticText* label_authentication; wxChoice* choice_authentication; wxStaticText* label_username; wxTextCtrl* text_ctrl_username; wxStaticText* label_password; wxTextCtrl* text_ctrl_password; wxStaticText* label_charset; wxComboBox* combobox_charset; wxStaticText* label_role; wxTextCtrl* text_ctrl_role; wxStaticText* label_pagesize; wxChoice* choice_pagesize; wxStaticText* label_dialect; wxChoice* choice_dialect; wxButton* button_ok; wxButton* button_cancel; void createControls(); void layoutControls(); void setControlsProperties(); void updateAuthenticationMode(); void updateButtons(); wxString getDefaultDatabaseName() const; void updateIsDefaultDatabaseName(); wxArrayString getAuthenticationChoices() const; wxArrayString getDatabaseCharsetChoices() const; wxArrayString getDatabaseDialectChoices() const; wxArrayString getDatabasePagesizeChoices() const; protected: virtual void doReadConfigSettings(const wxString& prefix); virtual void doWriteConfigSettings(const wxString& prefix) const; virtual const wxString getName() const; virtual bool getConfigStoresHeight() const; public: DatabaseRegistrationDialog(wxWindow* parent, const wxString& title, bool createDB = false, // a temporary solution, as we'll change the entire login scheme soon bool connectAs = false); void setServer(ServerPtr s); // needed to create new db void setDatabase(DatabasePtr db); private: // event handling enum { ID_textcontrol_dbpath = 101, ID_textcontrol_name, ID_textcontrol_username, ID_textcontrol_password, ID_button_browse, ID_choice_authentication }; void OnAuthenticationChange(wxCommandEvent& event); void OnBrowseButtonClick(wxCommandEvent& event); void OnNameChange(wxCommandEvent& event); void OnOkButtonClick(wxCommandEvent& event); void OnSettingsChange(wxCommandEvent& event); DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- #endif // DATABASEREGISTRATIONDIALOG_H flamerobin_0.9.3~svn+2220.orig/src/gui/EditBlobDialog.cpp000066400000000000000000001306111177057155300230700ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include "AdvancedMessageDialog.h" #include "core/FRError.h" #include "core/StringUtils.h" #include "gui/CommandIds.h" #include "gui/CommandManager.h" #include "gui/controls/ControlUtils.h" #include "gui/controls/DataGridTable.h" #include "gui/EditBlobDialog.h" #include "gui/FRLayoutConfig.h" #include "gui/StyleGuide.h" // Static members /* maybe later needed if plugin will be implemented int EditBlobDialog::m_libEditBlobUseCount = 0; wxDynamicLibrary* EditBlobDialog::m_libEditBlob = NULL; */ //----------------------------------------------------------------------------- // Helper Class of wxStyledTextCtrl to handle NULL values class EditBlobDialogSTC : public wxStyledTextCtrl { public: EditBlobDialogSTC(wxWindow *parent, wxWindowID id=wxID_ANY); void setIsNull(bool isNull); bool getIsNull() { return isNullM; } void ClearAll(); void SetText(const wxString& text); private: bool isNullM; void OnChar(wxKeyEvent& event); void OnKeyDown(wxKeyEvent& event); DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- EditBlobDialogSTC::EditBlobDialogSTC(wxWindow *parent, wxWindowID id) : wxStyledTextCtrl(parent, id, wxDefaultPosition, wxDefaultSize, wxBORDER_THEME), isNullM(false) { wxFont fontNull(frlayoutconfig().getEditorFontSize(), wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false); StyleSetFont(10, fontNull); StyleSetForeground(10, wxT("RED")); } //----------------------------------------------------------------------------- void EditBlobDialogSTC::OnKeyDown(wxKeyEvent& event) { if (GetReadOnly()) { event.Skip(); return; } int kc = event.GetKeyCode(); if ((kc == WXK_DELETE) && (GetText() == wxT(""))) { setIsNull(true); return; } if ((kc == WXK_DELETE) || (kc == WXK_RETURN) || (kc == WXK_BACK) || (kc == WXK_TAB)) setIsNull(false); event.Skip(); } //----------------------------------------------------------------------------- void EditBlobDialogSTC::OnChar(wxKeyEvent& event) { if (GetReadOnly()) { event.Skip(); return; } setIsNull(false); event.Skip(); } //----------------------------------------------------------------------------- void EditBlobDialogSTC::setIsNull(bool isNull) { if (isNull == isNullM) return; if (isNull) { wxStyledTextCtrl::SetText(wxT("[null]")); SelectAll(); StartStyling(0, 0xff); SetStyling(GetTextLength(), 0x0A); } else { StartStyling(0, 0xff); SetStyling(GetTextLength(), 0); } isNullM = isNull; } //----------------------------------------------------------------------------- void EditBlobDialogSTC::ClearAll() { setIsNull(false); wxStyledTextCtrl::ClearAll(); } //----------------------------------------------------------------------------- void EditBlobDialogSTC::SetText(const wxString& text) { setIsNull(false); wxStyledTextCtrl::SetText(text); } //----------------------------------------------------------------------------- //! event handling BEGIN_EVENT_TABLE(EditBlobDialogSTC, wxStyledTextCtrl) EVT_KEY_DOWN(EditBlobDialogSTC::OnKeyDown) EVT_CHAR(EditBlobDialogSTC::OnChar) END_EVENT_TABLE() //----------------------------------------------------------------------------- // Helper Class of wxStyledTextCtrl // -> adds a context to toggle "Linkebreak" on / off class EditBlobDialogSTCText : public EditBlobDialogSTC { public: EditBlobDialogSTCText(wxWindow *parent, wxWindowID id=wxID_ANY); bool hasSelection(); private: void OnContextMenuCmd(wxCommandEvent& event); void OnContextMenu(wxContextMenuEvent& WXUNUSED(event)); DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- EditBlobDialogSTCText::EditBlobDialogSTCText(wxWindow *parent, wxWindowID id) : EditBlobDialogSTC(parent,id) { } //----------------------------------------------------------------------------- bool EditBlobDialogSTCText::hasSelection() { return GetSelectionStart() != GetSelectionEnd(); } //----------------------------------------------------------------------------- void EditBlobDialogSTCText::OnContextMenu(wxContextMenuEvent& event) { if (AutoCompActive() || CallTipActive()) return; SetFocus(); bool isWrapModeWord = (GetWrapMode() == wxSTC_WRAP_WORD); wxMenu m; m.Append(wxID_UNDO, _("&Undo"))->Enable(CanUndo()); m.Append(wxID_REDO, _("&Redo"))->Enable(CanRedo()); m.AppendSeparator(); m.Append(wxID_CUT, _("Cu&t"))->Enable(hasSelection()); m.Append(wxID_COPY, _("&Copy"))->Enable(hasSelection()); m.Append(wxID_PASTE, _("&Paste"))->Enable(CanPaste()); m.Append(wxID_DELETE, _("&Delete"))->Enable(hasSelection()); m.AppendSeparator(); m.Append(wxID_SELECTALL, _("Select &All")); m.AppendCheckItem(Cmds::BlobEditor_ChangeLineBreak, _("Line break"))->Check(isWrapModeWord); PopupMenu(&m, calcContextMenuPosition(event.GetPosition(), this)); } //----------------------------------------------------------------------------- void EditBlobDialogSTCText::OnContextMenuCmd(wxCommandEvent& event) { switch (event.GetId()) { case wxID_UNDO : Undo(); break; case wxID_REDO : Redo(); break; case wxID_CUT : Cut(); break; case wxID_COPY : Copy(); break; case wxID_PASTE : Paste(); break; case wxID_DELETE : Clear(); break; case wxID_SELECTALL : SelectAll(); break; case Cmds::BlobEditor_ChangeLineBreak : int newWrapMode = (GetWrapMode() == wxSTC_WRAP_NONE) ? wxSTC_WRAP_WORD : wxSTC_WRAP_NONE; SetWrapMode(newWrapMode); break; } } //----------------------------------------------------------------------------- BEGIN_EVENT_TABLE(EditBlobDialogSTCText, EditBlobDialogSTC) EVT_CONTEXT_MENU(EditBlobDialogSTCText::OnContextMenu) EVT_MENU(wxID_UNDO, EditBlobDialogSTCText::OnContextMenuCmd) EVT_MENU(wxID_REDO, EditBlobDialogSTCText::OnContextMenuCmd) EVT_MENU(wxID_CUT, EditBlobDialogSTCText::OnContextMenuCmd) EVT_MENU(wxID_COPY, EditBlobDialogSTCText::OnContextMenuCmd) EVT_MENU(wxID_PASTE, EditBlobDialogSTCText::OnContextMenuCmd) EVT_MENU(wxID_DELETE, EditBlobDialogSTCText::OnContextMenuCmd) EVT_MENU(wxID_SELECTALL, EditBlobDialogSTCText::OnContextMenuCmd) EVT_MENU(Cmds::BlobEditor_ChangeLineBreak, EditBlobDialogSTCText::OnContextMenuCmd) END_EVENT_TABLE() //----------------------------------------------------------------------------- // Helper-Class for streaming into blob / buffer class FRInputBlobStream : public wxInputStream { public: FRInputBlobStream(IBPP::Blob blob); virtual ~FRInputBlobStream(); virtual size_t GetSize() const; protected: virtual size_t OnSysRead(void *buffer, size_t size); private: IBPP::Blob blobM; int sizeM; }; //----------------------------------------------------------------------------- class FROutputBlobStream : public wxOutputStream { public: FROutputBlobStream(IBPP::Blob blob); virtual ~FROutputBlobStream(); virtual bool Close(); protected: virtual size_t OnSysWrite(const void *buffer, size_t bufsize); private: IBPP::Blob blobM; }; //----------------------------------------------------------------------------- // Helper Class - ProgressPanel - Progress-info with Progressbar //----------------------------------------------------------------------------- class EditBlobDialogProgressSizer : public wxBoxSizer { public: EditBlobDialogProgressSizer(wxWindow* parent); void Hide(); bool canCancel(); void cancel(); void initProgress(const wxString& progressTitle, int range, bool canCancel); bool isActive(); bool isCanceled(); void stepProgress(int stepAmount); private: bool activeM; bool canceledM; bool canCancelM; int posM; int rangeM; wxButton* buttonCancelM; wxWindow* parentM; wxGauge* progressGaugeM; wxStaticText* progressTextM; }; //----------------------------------------------------------------------------- EditBlobDialogProgressSizer::EditBlobDialogProgressSizer(wxWindow* parent) : wxBoxSizer(wxHORIZONTAL), parentM(parent) { activeM = false; rangeM = 0; posM = 0; canCancelM = false; progressTextM = new wxStaticText(parent, wxID_ANY, wxT("")); buttonCancelM = new wxButton(parent, Cmds::BlobEditor_ProgressCancel, _("&Cancel")); int gaugeHeight = wxSystemSettings::GetMetric(wxSYS_HSCROLL_Y); progressGaugeM = new wxGauge(parent, wxID_ANY, 0, wxDefaultPosition, wxSize(10, gaugeHeight), wxGA_HORIZONTAL | wxGA_SMOOTH); Add(progressTextM, 0, wxALIGN_CENTER_VERTICAL); AddSpacer(styleguide().getFrameMargin(wxLEFT)); Add(progressGaugeM, 1, wxALIGN_CENTER_VERTICAL); AddSpacer(styleguide().getFrameMargin(wxRIGHT)); Add(buttonCancelM, 0, wxALIGN_CENTER_VERTICAL); //Layout(); Hide(); }; //----------------------------------------------------------------------------- bool EditBlobDialogProgressSizer::canCancel() { return canCancelM; } //----------------------------------------------------------------------------- void EditBlobDialogProgressSizer::cancel() { if (canCancelM) canceledM = true; } //----------------------------------------------------------------------------- void EditBlobDialogProgressSizer::Hide() { progressTextM->Hide(); buttonCancelM->Hide(); progressGaugeM->Hide(); activeM = false; } //----------------------------------------------------------------------------- void EditBlobDialogProgressSizer::initProgress(const wxString& progressTitle, int range, bool canCancel) { posM = 0; rangeM = range; canceledM = false; canCancelM = canCancel; activeM = true; progressTextM->SetLabel(progressTitle); progressGaugeM->SetRange(rangeM); progressGaugeM->SetValue(posM); progressTextM->Show(); buttonCancelM->Show(canCancelM); progressGaugeM->Show(); //parentM->Layout(); Layout(); } //----------------------------------------------------------------------------- bool EditBlobDialogProgressSizer::isActive() { return activeM; } //----------------------------------------------------------------------------- bool EditBlobDialogProgressSizer::isCanceled() { return canceledM; } //----------------------------------------------------------------------------- void EditBlobDialogProgressSizer::stepProgress(int stepAmount) { posM += stepAmount; progressGaugeM->SetValue(posM); wxYieldIfNeeded(); } //----------------------------------------------------------------------------- // Main (dialog) class for blob editor EditBlobDialog::EditBlobDialog(wxWindow* parent) :BaseDialog(parent, -1, wxEmptyString) { runningM = false; // disable wxNotebookPageChanged-Events dataModifiedM = false; editorModeM = noData; cacheM = 0; cacheIsNullM = false; dialogCaptionM = wxT(""); dataGridTableM = 0; dataGridM = 0; fieldNameM = wxT(""); rowM = 0; colM = 0; blobM = 0; loadingM = false; statementM = 0; readonlyM = false; notebook = new wxNotebook(getControlsPanel(), wxID_ANY); blob_noData = new wxPanel(notebook, wxID_ANY); blob_noDataText = new wxStaticText(blob_noData, wxID_ANY, wxT("")); blob_text = new EditBlobDialogSTCText(notebook, wxID_ANY); blob_binary = new EditBlobDialogSTC(notebook, wxID_ANY); progress = new EditBlobDialogProgressSizer(getControlsPanel()); // dialog "menu" buttons button_menu_blob = new wxButton(getControlsPanel(), Cmds::BlobEditor_Menu_BLOB, _("&BLOB")); // dialog buttons button_reset = new wxButton(getControlsPanel(), wxID_RESET, _("&Reset")); button_save = new wxButton(getControlsPanel(), wxID_SAVE, _("&Save")); CommandManager cm; buildMenus(cm); set_properties(); do_layout(); runningM = true; // enable wxNotebookPageChanged-Events } //----------------------------------------------------------------------------- EditBlobDialog::~EditBlobDialog() { /* // activate later if plugin will be implemented m_libEditBlobUseCount--; if (m_libEditBlobUseCount = 0) { // TODO unload lib if (m_libEditBlob) delete m_libEditBlob; } */ delete menu_blob; cacheDelete(); } //----------------------------------------------------------------------------- void EditBlobDialog::buildMenus(CommandManager& cm) { menu_blob = new wxMenu(); // dynamic menus, created at runtime menu_blob->Append(Cmds::BlobEditor_Menu_BLOBLoadFromFile, cm.getMainMenuItemText(_("&Load from File..."), Cmds::BlobEditor_Menu_BLOBLoadFromFile)); menu_blob->Append(Cmds::BlobEditor_Menu_BLOBSaveToFile, cm.getMainMenuItemText(_("&Save to File"), Cmds::BlobEditor_Menu_BLOBSaveToFile)); } //----------------------------------------------------------------------------- void EditBlobDialog::cacheDelete() { dataValidM.clear(); if (!cacheM) return; delete cacheM; cacheM = 0; } //----------------------------------------------------------------------------- void EditBlobDialog::notebookAddPageById(int pageId) { // if page is already added -> do nothing int i = notebookGetPageIndexById(pageId); if (i > -1) return; // add page to notebook switch (pageId) { case noData : blob_noData->Show(); notebook->AddPage(blob_noData, _("No data"), false); break; case binary : blob_binary->Show(); notebook->AddPage(blob_binary, _("Binary"), false); break; case text : blob_text->Show(); notebook->AddPage(blob_text, _("Text"), false); break; } } //----------------------------------------------------------------------------- int EditBlobDialog::notebookGetPageIndexById(int pageId) { for (unsigned int i = 0; i < notebook->GetPageCount(); i++) if (notebook->GetPage(i)->GetId() == pageId) return i; return -1; } //----------------------------------------------------------------------------- void EditBlobDialog::notebookRemovePageById(int pageId) { int i = notebookGetPageIndexById(pageId); if (i > -1) { // Hide the page that will be removed // That is needed otherwise the removed // page is still visible on the wxNotebook. switch (pageId) { case noData : blob_noData->Hide(); break; case binary : blob_binary->Hide(); break; case text : blob_text->Hide(); break; } notebook->RemovePage(i); } } //----------------------------------------------------------------------------- void EditBlobDialog::notebookSelectPageById(int pageId) { int i = notebookGetPageIndexById(pageId); if (i > -1) notebook->ChangeSelection(i); } //----------------------------------------------------------------------------- void EditBlobDialog::closeDontSave() { // We dont want to save the blob data back to DB. dataModifiedM = false; Close(); } //----------------------------------------------------------------------------- bool EditBlobDialog::setBlob(DataGrid* dg, DataGridTable* dgt, IBPP::Statement* st, unsigned row, unsigned col, bool saveOldValue) { // cancel load progress or wait for save progress progressCancel(); // Save last blob value if modified if (saveOldValue) saveBlob(); dataGridTableM = dgt; dataGridM = dg; statementM = st; rowM = row; colM = col; readonlyM = dataGridTableM->isReadonlyColumn(colM); // generator blob fieldname wxString tableName = dgt->getTableName(); wxString fieldName = dg->GetColLabelValue(dg->GetGridCursorCol()); fieldNameM = tableName + wxT(".") + fieldName; dialogCaptionM = wxString::Format(_("Edit BLOB: %s #%i"), fieldNameM.c_str(), rowM+1); SetTitle(dialogCaptionM); return loadBlob(); } //----------------------------------------------------------------------------- bool EditBlobDialog::loadBlob() { bool isTextual; bool isBlob = dataGridTableM->isBlobColumn(colM, &isTextual); // disable wxNotebookPageChanged-Events runningM = false; bool res = false; // we load data from blob now, so we dont need the cache ATM // if the user changes data and switches the notebook-page // the cach will be created again cacheDelete(); dataUpdateGUI(); if (isBlob) { // Loading BLOB into Editor IBPP::Blob* tmpBlob = dataGridTableM->getBlob(rowM, colM, false); if (tmpBlob != 0) blobM = *tmpBlob; else blobM = 0; FRInputBlobStream inpblob(blobM); if (!isTextual) { res = loadFromStreamAsBinary(inpblob, blobM == 0, _("Loading BLOB into editor.")); editorModeM = binary; } else { res = loadFromStreamAsText(inpblob, blobM == 0, _("Loading BLOB into editor.")); editorModeM = text; } dataValidM.insert(editorModeM); } if ((isBlob) && (res)) { notebookAddPageById(binary); notebookAddPageById(text); notebookRemovePageById(noData); notebookSelectPageById(editorModeM); dataSetModified(false, editorModeM); button_reset->SetLabel(_("&Reset")); button_reset->Disable(); } else { blobM = 0; notebookAddPageById(noData); notebookRemovePageById(binary); notebookRemovePageById(text); notebookSelectPageById(noData); wxString noDataInfo; if (isBlob) noDataInfo = _("The loading operation was canceled."); else noDataInfo = _("No BLOB."); blob_noDataText->SetLabel(noDataInfo); // needed to center blob_noDataText blob_noData->GetSizer()->Layout(); editorModeM = noData; dataSetModified(false, editorModeM); if (isBlob) { button_reset->SetLabel(_("&Load")); button_reset->Enable(); } else { button_reset->SetLabel(_("&Reset")); button_reset->Disable(); } res = true; } // enable wxNotebookPageChanged-Events runningM = true; return res; } //----------------------------------------------------------------------------- bool EditBlobDialog::loadFromStreamAsText(wxInputStream& stream, bool isNull, const wxString& progressTitle) { if (isNull) { loadingM = true; blob_text->SetReadOnly(false); blob_text->setIsNull(true); blob_text->SetReadOnly(readonlyM); loadingM = false; dataSetModified(false, text); return true; } int toread = stream.GetSize(); progressBegin(progressTitle, toread, true); // disable OnDataModified event loadingM = true; // set the wxStyledTextControl to ReadOnly = false to modify the text blob_text->SetReadOnly(false); blob_text->ClearAll(); // allocate a buffer of the full size that is needed // for the text. So we have no troubles with splittet // multibyte-chars./amaier char* buffer = (char*)malloc(toread+1); if (buffer == NULL) { showErrorDialog(this, _("ERROR"), _("Not enough Memory!"), AdvancedMessageDialogButtonsOk()); return false; } char* bufptr = buffer; int readed = 0; // Load text in 32k-Blocks. // So we can give the user the ability to cancel. while ((!progress->isCanceled()) && (readed < toread)) { int nextread = std::min(32767, toread - readed); stream.Read((void*)bufptr, nextread); int lastread = stream.LastRead(); if (lastread < 1) break; bufptr += lastread; readed += lastread; progress->stepProgress(lastread); } buffer[readed] = '\0'; if (!progress->isCanceled()) { blob_text->SetText(std2wx(buffer)); } free(buffer); progressEnd(); blob_textSetReadonly(readonlyM); // enable OnDataModified event loadingM = false; dataSetModified(false, text); return !progress->isCanceled(); } //----------------------------------------------------------------------------- bool EditBlobDialog::loadFromStreamAsBinary(wxInputStream& stream, bool isNull, const wxString& progressTitle) { if (isNull) { loadingM = true; blob_binary->SetReadOnly(false); blob_binary->setIsNull(true); blob_binary->SetReadOnly(true); loadingM = false; dataSetModified(false, binary); return true; } int size = stream.GetSize(); progressBegin(progressTitle, size, true); // disable OnDataModified event loadingM = true; blob_binary->Freeze(); // set the wxStyledTextControl to ReadOnly = false to modify the text blob_binary->SetReadOnly(false); blob_binary->ClearAll(); int col = 0; int line = 0; wxString txtLine; while (!progress->isCanceled()) { char buffer[32768]; stream.Read((void*)buffer, 32767); int size = stream.LastRead(); if (size < 1) break; buffer[size] = '\0'; int bufpos = 0; while (bufpos < size) { txtLine += wxString::Format( wxT("%02X"), (unsigned char)(buffer[bufpos]) ); bufpos++; col++; if ((col % 8) == 0) txtLine += wxT(" "); if (col >= 32) { blob_binary->AddText(txtLine + wxT("\n")); txtLine = wxT(""); col = 0; line++; } } progress->stepProgress(size); } // add the last line if col > 0 if (!progress->isCanceled()) { if (col > 0) blob_binary->AddText(txtLine); } // Prepare text styling data const int Columns = 4; const int BytesPerColumn = 8; const int CharsPerColumn = 2 * BytesPerColumn; // a space after each column, and one additional byte for the end-of-line const int CharsPerLine = Columns * (CharsPerColumn + 1) + 1; std::vector styleBytes(CharsPerLine, '\0'); for (int col1 = 0; col1 < Columns; ++col1) { int colStart = col1 * (CharsPerColumn + 1); for (int charInCol = 1; charInCol < BytesPerColumn; charInCol += 2) { // the two chars of every odd byte have different color styleBytes[colStart + 2 * charInCol] = '\1'; styleBytes[colStart + 2 * charInCol + 1] = '\1'; } } // Set text styling blob_binary->StartStyling(0, 0xff); for (int i = 0; i < blob_binary->GetLineCount(); i++) blob_binary->SetStyleBytes(CharsPerLine, &styleBytes[0]); progressEnd(); blob_binary->SetReadOnly(true); blob_binary->Thaw(); // enable OnDataModified event loadingM = false; dataSetModified(false, binary); return !progress->isCanceled(); } //----------------------------------------------------------------------------- bool EditBlobDialog::saveToStream(wxOutputStream& stream, bool* isNull, const wxString& progressTitle) { progressBegin(progressTitle, 0, false); switch (editorModeM) { case binary : { *isNull = blob_binary->getIsNull(); if (*isNull) break; const int maxBufSize = 32768; char buffer[maxBufSize]; int bufSize = 0; wxString txt = blob_binary->GetText(); wxString::const_iterator txtIt; txtIt = txt.begin(); while ((txtIt != txt.end()) && (!progress->isCanceled())) { wxChar ch1 = *txtIt; txtIt++; // skip spaces and cr if ((ch1 == ' ') || (ch1 == 0x0A) || (ch1 == 0x0D)) continue; // that should never happen // but it would be possible if binary data is corrupted if (txtIt == txt.end()) throw FRError(_("Internal error. (Binary data seems corrupted.)")); wxChar ch2 = *txtIt; txtIt++; int dig1 = 0; int dig2 = 0; if (isdigit(ch1)) dig1 = ch1 - '0'; else if ((ch1 >= 'A') && (ch1 <= 'F')) dig1 = ch1 - 'A' + 10; else if ((ch1 >= 'a') && (ch1 <= 'f')) dig1 = ch1 - 'a' + 10; else throw FRError(wxString::Format(_("Wrong HEX-value: %s"), ch1)); if (isdigit(ch2)) dig2 = ch2 - '0'; else if ((ch2 >= 'A') && (ch2 <= 'F')) dig2 = ch2 - 'A' + 10; else if ((ch2 >= 'a') && (ch2 <= 'f')) dig2 = ch2 - 'a' + 10; else throw FRError(wxString::Format(_("Wrong HEX-value: %s"), ch1)); buffer[bufSize] = dig1 * 16 + dig2; if (bufSize >= maxBufSize-1) { stream.Write(buffer, bufSize); progress->stepProgress(bufSize); bufSize = 0; } else bufSize++; }; if (bufSize > 0) { stream.Write(buffer, bufSize); progress->stepProgress(bufSize); } } break; case text : { *isNull = blob_text->getIsNull(); if (*isNull) break; std::string txt = wx2std(blob_text->GetText()); stream.Write(txt.c_str(), txt.length()); } break; default : throw FRError(_("Unknown editormode!")); } progressEnd(); return !progress->isCanceled(); } //----------------------------------------------------------------------------- void EditBlobDialog::set_properties() { dialogCaptionM = wxT(""); SetTitle(dialogCaptionM); int style = GetWindowStyle(); SetWindowStyle(style | wxMINIMIZE_BOX | wxMAXIMIZE_BOX | wxSYSTEM_MENU | wxSTAY_ON_TOP); blob_noData->SetId(noData); blob_text->SetId(text); blob_text->SetModEventMask(wxSTC_MODEVENTMASKALL); blob_binary->SetId(binary); blob_binary->SetModEventMask(wxSTC_MODEVENTMASKALL); button_reset->Enable(false); button_save->Enable(false); } //----------------------------------------------------------------------------- void EditBlobDialog::do_layout() { // Maybe we can find a better solution to get the margin font // I assume here it is the default font./amaier int marginCharWidth = blob_binary->TextWidth(0, wxT("9")); // *** TEXT-EDIT-LAYOUT *** blob_text->SetSizeHints(200, 100); blob_text->SetSize(200, 100); // fixed-width font (i think it is better for showing) wxFont fTxt(frlayoutconfig().getEditorFontSize(), wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false); blob_text->StyleSetFont(0, fTxt); // numbering on text should be usefull blob_text->SetMarginType(0, wxSTC_MARGIN_NUMBER); blob_text->SetMarginWidth(0, marginCharWidth * 5); blob_text->SetMarginWidth(1, 0); blob_text->SetMarginWidth(2, 0); // *** BINARY-SHOW-LAYOUT *** // fixed-width font wxFont fBin(frlayoutconfig().getEditorFontSize(), wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false); blob_binary->StyleSetFont(0, fBin); blob_binary->StyleSetBackground(0, frlayoutconfig().getReadonlyColour()); blob_binary->StyleSetFont(1, fBin); blob_binary->StyleSetBackground(1, frlayoutconfig().getReadonlyColour()); blob_binary->StyleSetForeground(1, wxT("MEDIUM BLUE")); blob_binary->StyleSetBackground(10, frlayoutconfig().getReadonlyColour()); // set with of the viewport to avoid "empty" space after each line blob_binary->SetScrollWidth(600); // set up a left-margin for numbering lines // TODO - calc with of dialog to fit excact a binary line without scrolling" blob_binary->SetMarginType(0, wxSTC_MARGIN_NUMBER); blob_binary->SetMarginWidth(0, marginCharWidth * 5); blob_binary->SetMarginWidth(1, 0); blob_binary->SetMarginWidth(2, 0); // Background-color for araes with no text blob_binary->SetSizeHints(200, 100); blob_binary->SetSize(200, 100); blob_binary->StyleSetBackground(wxSTC_STYLE_DEFAULT, frlayoutconfig().getReadonlyColour()); blob_binary->SetReadOnly(true); // center no-data-label on no-data-panel horizontal and vertical wxBoxSizer* blob_noDataSizerH = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* blob_noDataSizerV = new wxBoxSizer(wxVERTICAL); blob_noDataSizerV->Add(blob_noDataText, 0, wxALIGN_CENTER_HORIZONTAL, 0); blob_noDataSizerH->Add(blob_noDataSizerV, 1, wxALIGN_CENTER_VERTICAL, 0); blob_noData->SetSizer(blob_noDataSizerH); notebookAddPageById(noData); notebookAddPageById(binary); notebookAddPageById(text); wxBoxSizer* sizerTop = new wxBoxSizer(wxHORIZONTAL); sizerTop->Add(button_menu_blob, 0, wxALIGN_LEFT); sizerTop->AddSpacer(styleguide().getUnrelatedControlMargin(wxVERTICAL)); sizerTop->Add(progress, 1, wxEXPAND); wxBoxSizer* sizerControls = new wxBoxSizer(wxVERTICAL); //sizerControls->Add(button_menu_blob, 0, wxALIGN_LEFT); sizerControls->Add(sizerTop, 0, wxEXPAND); sizerControls->AddSpacer(styleguide().getFrameMargin(wxLEFT)); sizerControls->Add(notebook, 1, wxEXPAND); //sizerControls->AddSpacer(styleguide().getFrameMargin(wxLEFT)); //sizerControls->Add(progress, 0, wxEXPAND); wxSizer* sizerButtons = styleguide().createButtonSizer(button_reset, button_save); layoutSizers(sizerControls, sizerButtons, true); SetSize(620, 400); Centre(); progress->Layout(); } //----------------------------------------------------------------------------- void EditBlobDialog::saveBlob() { // If there is no blob loaded (no Data) OR // data wasn't modified and cache isn't initialized (cacheM = 0) // then data was not changed. if ((editorModeM == noData) || ((!dataModifiedM) && (!cacheM))) return; // Save Editor-Data into BLOB DataGridRowsBlob b = dataGridTableM->setBlobPrepare(rowM, colM); // if nothing was modified and the cache is created we can // directly write the cache to the blob. This saves time. char buffer[32768]; bool ok = false; wxString progressTitle = _("Saving editor-data."); if ((!dataModifiedM) && (cacheM)) { progressBegin(progressTitle, 0, false); if (cacheIsNullM) { b.blob = 0; } else { wxMemoryInputStream inBuf(*cacheM); inBuf.Read((void*)buffer, 32767); int bufLen = inBuf.LastRead(); b.blob->Create(); while ((bufLen > 0) && (!progress->isCanceled())) { b.blob->Write(buffer, bufLen); inBuf.Read((void*)buffer, 32767); bufLen = inBuf.LastRead(); } b.blob->Close(); } ok = !progress->isCanceled(); progressEnd(); } else { bool isNull; FROutputBlobStream bs(b.blob); ok = saveToStream(bs, &isNull, progressTitle); bs.Close(); if (isNull) b.blob = 0; } if (!ok) return; if (b.blob == 0) dataGridTableM->setValueToNull(b.row, b.col); else { dataGridTableM->setBlob(b); } blobM = b.blob; // update datagrid to force an update (in GUI) of the changed blob-value // NOTE: There are two reasons to call it // 1) The data grid has to be updated to show the new blob value // 2) There will be a error if user changes to another blob and // then again to the same. If the blob is selected again the // cell will be updated and opens the blob. This will happen // while the cancel-dialog in loadBlob is shown. (wxYieldIfNeeded) // At this moment the blob is already opend by loadBlob and // the IBPP::LocicalException - blob already open will occur. // amaier/2009-07-19 dataGridM->refreshAndInvalidateAttributes(); cacheDelete(); dataSetModified(false, editorModeM); dataUpdateGUI(); } //----------------------------------------------------------------------------- void EditBlobDialog::OnClose(wxCloseEvent& event) { // Save implicit if data was modified saveBlob(); // destroy the window if (event.CanVeto()) { event.Veto(); this->Hide(); } else this->Destroy(); } //----------------------------------------------------------------------------- void EditBlobDialog::OnResetButtonClick(wxCommandEvent& WXUNUSED(event)) { loadBlob(); } //----------------------------------------------------------------------------- void EditBlobDialog::OnSaveButtonClick(wxCommandEvent& WXUNUSED(event)) { saveBlob(); } //----------------------------------------------------------------------------- void EditBlobDialog::OnNotebookPageChanged(wxNotebookEvent& event) { if (!runningM) return; int page = event.GetSelection(); int oldPage = event.GetOldSelection(); if ((page < 0) || (oldPage < 0)) return; int pageId = notebook->GetPage(page)->GetId(); if (pageId == noData) return; // Save data to cache // We only store the data if it was changed by the user if (dataModifiedM) { // Maybe we have to initialize the cache (cacheM) if (cacheM) delete cacheM; cacheM = new wxMemoryOutputStream(0, 0); if (!saveToStream(*cacheM, &cacheIsNullM, _("Switching editor-mode. (Saving)"))) { showErrorDialog(this, _("ERROR"), _("A error occured while switching editor-mode. (Saving)"), AdvancedMessageDialogButtonsOk()); notebook->ChangeSelection(oldPage); return; } } EditorMode newEditorMode = (EditorMode)pageId; // Load data from cache or blob - only if the data is not already loaded (valid) if ((dataModifiedM) || dataValidM.find(newEditorMode) == dataValidM.end()) { bool loadOk = false; bool isNull; wxString loadTitle = _("Switching editor-mode. (Loading)"); wxInputStream* inBuf; if (cacheM) { inBuf = new wxMemoryInputStream(*cacheM); isNull = cacheIsNullM; } else { inBuf = new FRInputBlobStream(blobM); isNull = (blobM == 0); } switch (pageId) { case binary : loadOk = loadFromStreamAsBinary(*inBuf, isNull, loadTitle); break; case text : loadOk = loadFromStreamAsText(*inBuf, isNull, loadTitle); break; } delete inBuf; if (!loadOk) { showErrorDialog(this, _("ERROR"), _("A error occured while switching editor-mode. (Loading)"), AdvancedMessageDialogButtonsOk()); notebook->ChangeSelection(oldPage); //event.Veto(); return; } dataValidM.insert(newEditorMode); } editorModeM = newEditorMode; } //----------------------------------------------------------------------------- void EditBlobDialog::OnProgressCancel(wxCommandEvent& WXUNUSED(event)) { progress->cancel(); } //----------------------------------------------------------------------------- void EditBlobDialog::OnDataModified(wxStyledTextEvent& WXUNUSED(event)) { if (loadingM) return; dataSetModified(true, editorModeM); } //----------------------------------------------------------------------------- void EditBlobDialog::OnMenuBLOBButtonClick(wxCommandEvent& WXUNUSED(event)) { int h = button_menu_blob->GetSize().GetHeight(); button_menu_blob->PopupMenu(menu_blob, 0, h); } //----------------------------------------------------------------------------- void EditBlobDialog::OnMenuBLOBLoadFromFile(wxCommandEvent& WXUNUSED(event)) { if (editorModeM == noData) throw FRError(_("Not a BLOB column")); wxString filename = ::wxFileSelector(_("Select a file"), wxT(""), wxT(""), wxT(""), wxT("*"), wxFD_OPEN | wxFD_FILE_MUST_EXIST, this); if (filename.IsEmpty()) return; cacheDelete(); bool res; wxFileInputStream fs(filename); if (editorModeM == binary) res = loadFromStreamAsBinary(fs, false, _("Loading BLOB into editor.")); else res = loadFromStreamAsText(fs, false, _("Loading BLOB into editor.")); if (res) dataSetModified(true, editorModeM); } //----------------------------------------------------------------------------- void EditBlobDialog::OnMenuBLOBSaveToFile(wxCommandEvent& WXUNUSED(event)) { //DataGridTable* dgt = grid_data->getDataGridTable(); //if (!dgt || !grid_data->GetNumberRows()) // return; //if (!dgt->isBlobColumn(grid_data->GetGridCursorCol())) // throw FRError(_("Not a BLOB column")); if (editorModeM == noData) throw FRError(_("Not a BLOB column")); wxString filename = ::wxFileSelector(_("Select a file"), wxT(""), wxT(""), wxT(""), wxT("*"), wxFD_SAVE | wxFD_OVERWRITE_PROMPT, this); if (filename.IsEmpty()) return; //ProgressDialog pd(this, _("Saving BLOB to file")); //pd.Show(); //dgt->exportBlobFile(filename, grid_data->GetGridCursorRow(), // grid_data->GetGridCursorCol(), &pd); wxFileOutputStream fs(filename); bool dummy; saveToStream(fs, &dummy, _("Importing BLOB from file")); } //----------------------------------------------------------------------------- void EditBlobDialog::dataUpdateGUI() { wxString status; bool canSave; if ((dataModifiedM) || (cacheM)) { status = wxT("*"); canSave = true; } else { status = wxT(""); canSave = false; } SetTitle(dialogCaptionM+status); button_reset->Enable(canSave); button_save->Enable(canSave); } //----------------------------------------------------------------------------- void EditBlobDialog::dataSetModified(bool value, EditorMode editorMode) { if (dataModifiedM == value) return; dataModifiedM = value; // if the data is modified all other allready loaded data // (binary,text,http,image,...) gets invalid dataValidM.clear(); dataValidM.insert(editorMode); dataUpdateGUI(); } //----------------------------------------------------------------------------- void EditBlobDialog::blob_textSetReadonly(bool readonly) { if (readonly) { blob_text->StyleSetBackground(0, frlayoutconfig().getReadonlyColour()); blob_text->StyleSetBackground(wxSTC_STYLE_DEFAULT, frlayoutconfig().getReadonlyColour()); } else { blob_text->StyleSetBackground(0, wxT("WHITE")); blob_text->StyleResetDefault(); } blob_text->SetReadOnly(readonly); } //----------------------------------------------------------------------------- void EditBlobDialog::progressBegin(const wxString& progressTitle, int maxPosition, bool canCancel) { button_menu_blob->Enable(false); notebook->Enable(false); progressCancel(); progress->initProgress(progressTitle, maxPosition, canCancel); progress->Show(true); Update(); } //----------------------------------------------------------------------------- void EditBlobDialog::progressCancel() { // cancel load progress or if (progress->canCancel()) { while (!progress->isCanceled()) progress->cancel(); } // wait for save progress else { while (progress->isActive()) wxSleep(500); } } //----------------------------------------------------------------------------- void EditBlobDialog::progressEnd() { progress->Hide(); button_menu_blob->Enable(true); notebook->Enable(true); } //----------------------------------------------------------------------------- //! event handling BEGIN_EVENT_TABLE(EditBlobDialog, BaseDialog) EVT_MENU(wxID_RESET, EditBlobDialog::OnResetButtonClick) EVT_BUTTON(wxID_RESET, EditBlobDialog::OnResetButtonClick) EVT_BUTTON(wxID_SAVE, EditBlobDialog::OnSaveButtonClick) EVT_CLOSE(EditBlobDialog::OnClose) EVT_NOTEBOOK_PAGE_CHANGED(wxID_ANY, EditBlobDialog::OnNotebookPageChanged) EVT_STC_MODIFIED(wxID_ANY, EditBlobDialog::OnDataModified) // Menu events EVT_BUTTON(Cmds::BlobEditor_Menu_BLOB, EditBlobDialog::OnMenuBLOBButtonClick) EVT_MENU(Cmds::BlobEditor_Menu_BLOBLoadFromFile, EditBlobDialog::OnMenuBLOBLoadFromFile) EVT_MENU(Cmds::BlobEditor_Menu_BLOBSaveToFile, EditBlobDialog::OnMenuBLOBSaveToFile) // Progress EVT_BUTTON(Cmds::BlobEditor_ProgressCancel, EditBlobDialog::OnProgressCancel) END_EVENT_TABLE() //----------------------------------------------------------------------------- // Helper-Class for streaming into blob / buffer // frInputBlobStream FRInputBlobStream::FRInputBlobStream(IBPP::Blob blob) :wxInputStream() { blobM = blob; if (blobM != 0) { blobM->Close(); blobM->Open(); blobM->Info(&sizeM, 0, 0); } else sizeM = 0; } //----------------------------------------------------------------------------- FRInputBlobStream::~FRInputBlobStream() { if (blobM != 0) blobM->Close(); } //----------------------------------------------------------------------------- size_t FRInputBlobStream::OnSysRead(void* buffer, size_t size) { if ((blobM != 0) && (sizeM > 0)) return blobM->Read(buffer, size); else return 0; } //----------------------------------------------------------------------------- size_t FRInputBlobStream::GetSize() const { return sizeM; } //----------------------------------------------------------------------------- // Helper-Class for streaming into blob / buffer // frOutputBlobStream FROutputBlobStream::FROutputBlobStream(IBPP::Blob blob) :wxOutputStream() { blobM = blob; blobM->Create(); } //----------------------------------------------------------------------------- FROutputBlobStream::~FROutputBlobStream() { Close(); } //----------------------------------------------------------------------------- size_t FROutputBlobStream::OnSysWrite(const void* buffer, size_t bufsize) { if (bufsize == 0) return 0; blobM->Write(buffer, bufsize); return bufsize; } //----------------------------------------------------------------------------- bool FROutputBlobStream::Close() { if (blobM != 0) blobM->Close(); return true; } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/EditBlobDialog.h000066400000000000000000000124151177057155300225360ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_EDITBLOBDIALOG_H #define FR_EDITBLOBDIALOG_H #include #include #include #include #include #include "controls/DataGrid.h" #include "gui/BaseDialog.h" #include "gui/CommandManager.h" //----------------------------------------------------------------------------- class EditBlobDialogProgressSizer; // declared in cpp class EditBlobDialogSTCText; // declared in cpp class EditBlobDialogSTC; // declared in cpp //----------------------------------------------------------------------------- // Main Class: EditBlobDialog class EditBlobDialog : public BaseDialog { public: EditBlobDialog(wxWindow* parent); virtual ~EditBlobDialog(); // close without saving (for rollback-transaction) void closeDontSave(); // DataGrid is needed to update a blob-cell due to blob is saved bool setBlob(DataGrid* dg, DataGridTable* dgt, IBPP::Statement* st, unsigned row, unsigned col, bool saveOldValue = true); private: enum EditorMode { noData = wxID_HIGHEST+1, binary = wxID_HIGHEST+2, text = wxID_HIGHEST+3 }; IBPP::Blob blobM; DataGridTable* dataGridTableM; DataGrid* dataGridM; wxString dialogCaptionM; EditorMode editorModeM; wxString fieldNameM; unsigned colM; unsigned rowM; bool runningM; IBPP::Statement* statementM; std::set dataValidM; wxMemoryOutputStream* cacheM; bool cacheIsNullM; bool dataModifiedM; bool loadingM; bool readonlyM; /* // activate later if plugin will be implemented // Dialog-Plugin-lib static int m_libEditBlobUseCount; static wxDynamicLibrary* m_libEditBlob; */ // Switching Editor-Mode // B = Binary // T = Text // H = HTML // I = Image (bmp/jpg/...) // R = RTF (Win only) // // o = allowed // x = not allowed (e.g. makes no sence) // // X B T H I R // B - o o o o // T o - o x o // H o o - x x // I o x x - x // R o o x x - // cache/data-functions void cacheDelete(); void dataSetModified(bool value, EditorMode editorMode); void dataUpdateGUI(); // notebook-functions void notebookAddPageById(int pageId); int notebookGetPageIndexById(int pageId); void notebookRemovePageById(int pageId); void notebookSelectPageById(int pageId); // Loading - (calls LoadFromStreamAsXXXX) bool loadBlob(); // Loading (Blob/Stream) bool loadFromStreamAsBinary(wxInputStream& stream, bool isNull, const wxString& progressTitle); bool loadFromStreamAsText(wxInputStream& stream, bool isNull, const wxString& progressTitle); // Saving - (calls SaveToStream) void saveBlob(); // Saving (Blob/Stream) bool saveToStream(wxOutputStream& stream, bool* isNull, const wxString& progressTitle); // initialization void buildMenus(CommandManager& cm); void do_layout(); void set_properties(); // progress void progressBegin(const wxString& progressTitle, int maxPosition, bool canCancel); void progressCancel(); void progressEnd(); // misc void blob_textSetReadonly(bool readonly); // Events void OnClose(wxCloseEvent& event); void OnDataModified(wxStyledTextEvent& WXUNUSED(event)); void OnMenuBLOBButtonClick(wxCommandEvent& WXUNUSED(event)); void OnMenuBLOBLoadFromFile(wxCommandEvent& WXUNUSED(event)); void OnMenuBLOBSaveToFile(wxCommandEvent& WXUNUSED(event)); void OnNotebookPageChanged(wxNotebookEvent& WXUNUSED(event)); void OnProgressCancel(wxCommandEvent& WXUNUSED(event)); void OnResetButtonClick(wxCommandEvent& WXUNUSED(event)); void OnSaveButtonClick(wxCommandEvent& WXUNUSED(event)); protected: wxNotebook* notebook; EditBlobDialogSTCText* blob_text; EditBlobDialogSTC* blob_binary; wxPanel* blob_noData; wxStaticText* blob_noDataText; EditBlobDialogProgressSizer* progress; wxButton* button_reset; wxButton* button_save; wxButton* button_menu_blob; wxMenu* menu_blob; DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- #endif // FR_EDITBLOBDIALOG_H flamerobin_0.9.3~svn+2220.orig/src/gui/EventWatcherFrame.cpp000066400000000000000000000401261177057155300236370ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include #include "config/Config.h" #include "controls/LogTextControl.h" #include "core/FRError.h" #include "core/StringUtils.h" #include "gui/EventWatcherFrame.h" #include "gui/MultilineEnterDialog.h" #include "gui/StyleGuide.h" #include "metadata/database.h" //----------------------------------------------------------------------------- class EventLogControl: public LogTextControl { public: EventLogControl(wxWindow* parent, wxWindowID id = wxID_ANY); void logAction(const wxString& action); void logEvent(const wxString& name, int count); }; //----------------------------------------------------------------------------- EventLogControl::EventLogControl(wxWindow* parent, wxWindowID id) : LogTextControl(parent, id) { } //----------------------------------------------------------------------------- void EventLogControl::logAction(const wxString& action) { wxString now(wxDateTime::Now().Format(wxT("%H:%M:%S "))); addStyledText(now, logStyleImportant); logMsg(action + wxT("\n")); } //----------------------------------------------------------------------------- void EventLogControl::logEvent(const wxString& name, int count) { wxString now(wxDateTime::Now().Format(wxT("%H:%M:%S "))); addStyledText(now, logStyleImportant); logMsg(name); addStyledText(wxString::Format(wxT(" (%d)\n"), count), logStyleError); } //----------------------------------------------------------------------------- EventWatcherFrame::EventWatcherFrame(wxWindow* parent, DatabasePtr db) : BaseFrame(parent, -1, wxEmptyString), databaseM(db), eventsM(0) { wxASSERT(db); timerM.SetOwner(this, ID_timer); setIdString(this, getFrameId(db)); // observe database object to close on disconnect / destruction db->attachObserver(this, false); SetTitle(wxString::Format(_("Event Monitor for Database: %s"), db->getName_().c_str())); createControls(); layoutControls(); updateControls(); button_add->SetFocus(); #include "new.xpm" wxBitmap bmp(new_xpm); wxIcon icon; icon.CopyFromBitmap(bmp); SetIcon(icon); } //----------------------------------------------------------------------------- void EventWatcherFrame::createControls() { panel_controls = new wxPanel(this, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL | wxCLIP_CHILDREN); static_text_monitored = new wxStaticText(panel_controls, wxID_ANY, _("Monitored events")); static_text_received = new wxStaticText(panel_controls, wxID_ANY, _("Received events")); listbox_monitored = new wxListBox(panel_controls, ID_listbox_monitored, wxDefaultPosition, wxDefaultSize, 0, 0, wxLB_EXTENDED); eventlog_received = new EventLogControl(panel_controls, ID_log_received); button_add = new wxButton(panel_controls, ID_button_add, _("&Add Events")); button_remove = new wxButton(panel_controls, ID_button_remove, _("&Remove Selected")); button_load = new wxButton(panel_controls, ID_button_load, _("&Load")); button_save = new wxButton(panel_controls, ID_button_save, _("&Save")); button_monitor = new wxButton(panel_controls, ID_button_monitor, _("Start &Monitoring")); } //----------------------------------------------------------------------------- void EventWatcherFrame::layoutControls() { wxBoxSizer* sizerList = new wxBoxSizer(wxVERTICAL); sizerList->Add(static_text_monitored); sizerList->AddSpacer(styleguide().getControlLabelMargin()); sizerList->Add(listbox_monitored, 1, wxEXPAND); wxBoxSizer* sizerLog = new wxBoxSizer(wxVERTICAL); sizerLog->Add(static_text_received); sizerLog->AddSpacer(styleguide().getControlLabelMargin()); sizerLog->Add(eventlog_received, 1, wxEXPAND); wxBoxSizer* sizerTop = new wxBoxSizer(wxHORIZONTAL); sizerTop->Add(sizerList, 2, wxEXPAND); sizerTop->AddSpacer(styleguide().getUnrelatedControlMargin(wxHORIZONTAL)); sizerTop->Add(sizerLog, 3, wxEXPAND); wxBoxSizer* sizerButtons = new wxBoxSizer(wxHORIZONTAL); sizerButtons->Add(button_add); sizerButtons->AddSpacer(styleguide().getBetweenButtonsMargin(wxHORIZONTAL)); sizerButtons->Add(button_remove); sizerButtons->AddSpacer(styleguide().getUnrelatedControlMargin(wxHORIZONTAL)); sizerButtons->Add(button_load); sizerButtons->AddSpacer(styleguide().getBetweenButtonsMargin(wxHORIZONTAL)); sizerButtons->Add(button_save); sizerButtons->Add(styleguide().getUnrelatedControlMargin(wxHORIZONTAL), 0, 1, wxEXPAND); sizerButtons->Add(button_monitor); wxBoxSizer* sizerPanelV = new wxBoxSizer(wxVERTICAL); sizerPanelV->AddSpacer(styleguide().getFrameMargin(wxTOP)); sizerPanelV->Add(sizerTop, 1, wxEXPAND); sizerPanelV->AddSpacer(styleguide().getUnrelatedControlMargin(wxVERTICAL)); sizerPanelV->Add(sizerButtons, 0, wxEXPAND); sizerPanelV->AddSpacer(styleguide().getFrameMargin(wxBOTTOM)); wxBoxSizer* sizerPanelH = new wxBoxSizer(wxHORIZONTAL); sizerPanelH->AddSpacer(styleguide().getFrameMargin(wxLEFT)); sizerPanelH->Add(sizerPanelV, 1, wxEXPAND); sizerPanelH->AddSpacer(styleguide().getFrameMargin(wxRIGHT)); wxBoxSizer* sizerAll = new wxBoxSizer(wxHORIZONTAL); sizerAll->Add(sizerPanelH, 1, wxEXPAND); panel_controls->SetSizer(sizerAll); sizerAll->Fit(this); sizerAll->SetSizeHints(this); } //----------------------------------------------------------------------------- void EventWatcherFrame::updateControls() { bool isSelected = false; bool hasEvents = !listbox_monitored->IsEmpty(); if (hasEvents) { wxArrayInt sel; isSelected = listbox_monitored->GetSelections(sel) > 0; } button_remove->Enable(isSelected); button_save->Enable(hasEvents); button_monitor->Enable(hasEvents || timerM.IsRunning()); } //----------------------------------------------------------------------------- void EventWatcherFrame::addEvents(wxString& s) { // deselect all items so user can cleanly see what is added for (int ix = 0; ix < (int)listbox_monitored->GetCount(); ++ix) { if (listbox_monitored->IsSelected(ix)) listbox_monitored->Deselect(ix); } while (true) { int p = s.Find(wxT("\n")); wxString s2; if (p == -1) s2 = s.Strip(); else { s2 = s.Left(p).Strip(wxString::both); s.Remove(0, p); s.Trim(false); } if (!s2.IsEmpty() && listbox_monitored->FindString(s2) == wxNOT_FOUND) listbox_monitored->Select(listbox_monitored->Append(s2)); if (p == -1) break; } updateControls(); } //----------------------------------------------------------------------------- void EventWatcherFrame::defineMonitoredEvents() { if (eventsM != 0) { // prevent timer from messing our business bool timerRunning = timerM.IsRunning(); setTimerActive(false); // get a list of events to be monitored std::vector events; for (int i = 0; i < (int)listbox_monitored->GetCount(); i++) events.push_back(wx2std(listbox_monitored->GetString(i))); eventsM->Clear(); std::vector::const_iterator it; for (it = events.begin(); it != events.end(); it++) { eventsM->Add(*it, this); // make IBPP::Events pick up the initial event count eventsM->Dispatch(); } updateControls(); if (timerRunning) setTimerActive(true); } } //----------------------------------------------------------------------------- DatabasePtr EventWatcherFrame::getDatabase() const { return databaseM.lock(); } //----------------------------------------------------------------------------- bool EventWatcherFrame::setTimerActive(bool active) { if (active && !timerM.Start(100)) wxMessageBox(_("Can not start timer"), _("Error"), wxOK | wxICON_ERROR); if (!active && timerM.IsRunning()) { timerM.Stop(); wxSafeYield(); } return active == timerM.IsRunning(); } //----------------------------------------------------------------------------- void EventWatcherFrame::updateMonitoringActive() { if (eventsM != 0) { setTimerActive(true); button_monitor->SetLabel(_("Stop &Monitoring")); eventlog_received->logAction(_("Monitoring started")); } else { timerM.Stop(); button_monitor->SetLabel(_("Start &Monitoring")); eventlog_received->logAction(_("Monitoring stopped")); } updateControls(); } //----------------------------------------------------------------------------- void EventWatcherFrame::ibppEventHandler(IBPP::Events events, const std::string& name, int count) { eventlog_received->logEvent(std2wx(name), count); } //----------------------------------------------------------------------------- //! closes window if database is removed (unregistered) void EventWatcherFrame::subjectRemoved(Subject* subject) { DatabasePtr db = getDatabase(); if (!db || !db->isConnected() || subject == db.get()) Close(); } //----------------------------------------------------------------------------- void EventWatcherFrame::update() { DatabasePtr db = getDatabase(); if (!db || !db->isConnected()) Close(); } //----------------------------------------------------------------------------- void EventWatcherFrame::doReadConfigSettings(const wxString& prefix) { BaseFrame::doReadConfigSettings(prefix); wxArrayString events; config().getValue(prefix + Config::pathSeparator + wxT("events"), events); listbox_monitored->Append(events); updateControls(); } //----------------------------------------------------------------------------- void EventWatcherFrame::doWriteConfigSettings(const wxString& prefix) const { BaseFrame::doWriteConfigSettings(prefix); config().setValue(prefix + Config::pathSeparator + wxT("events"), listbox_monitored->GetStrings()); } //----------------------------------------------------------------------------- const wxString EventWatcherFrame::getName() const { return wxT("EventWatcherFrame"); } //----------------------------------------------------------------------------- wxString EventWatcherFrame::getFrameId(DatabasePtr db) { if (db) return wxString(wxT("EventWatcherFrame/") + db->getItemPath()); else return wxEmptyString; } //----------------------------------------------------------------------------- EventWatcherFrame* EventWatcherFrame::findFrameFor(DatabasePtr db) { BaseFrame* bf = frameFromIdString(getFrameId(db)); if (!bf) return 0; return dynamic_cast(bf); } //----------------------------------------------------------------------------- BEGIN_EVENT_TABLE(EventWatcherFrame, wxFrame) EVT_BUTTON(EventWatcherFrame::ID_button_add, EventWatcherFrame::OnButtonAddClick) EVT_BUTTON(EventWatcherFrame::ID_button_remove, EventWatcherFrame::OnButtonRemoveClick) EVT_BUTTON(EventWatcherFrame::ID_button_load, EventWatcherFrame::OnButtonLoadClick) EVT_BUTTON(EventWatcherFrame::ID_button_save, EventWatcherFrame::OnButtonSaveClick) EVT_BUTTON(EventWatcherFrame::ID_button_monitor, EventWatcherFrame::OnButtonStartStopClick) EVT_LISTBOX(EventWatcherFrame::ID_listbox_monitored, EventWatcherFrame::OnListBoxSelected) EVT_TIMER(EventWatcherFrame::ID_timer, EventWatcherFrame::OnTimer) END_EVENT_TABLE() //----------------------------------------------------------------------------- void EventWatcherFrame::OnButtonLoadClick(wxCommandEvent& WXUNUSED(event)) { wxFileDialog fd(this, _("Select file to load"), wxT(""), wxT(""), _("Text files (*.txt)|*.txt|All files (*.*)|*.*"), wxFD_OPEN | wxFD_CHANGE_DIR); if (wxID_OK != fd.ShowModal()) return; wxFFile f(fd.GetPath()); if (!f.IsOpened()) { wxMessageBox(_("Cannot open file."), _("Error"), wxOK|wxICON_ERROR); return; } wxBusyCursor wait; wxString s; f.ReadAll(&s); f.Close(); addEvents(s); defineMonitoredEvents(); } //----------------------------------------------------------------------------- void EventWatcherFrame::OnButtonSaveClick(wxCommandEvent& WXUNUSED(event)) { wxFileDialog fd(this, _("Select file to save"), wxT(""), wxT(""), _("Text files (*.txt)|*.txt|All files (*.*)|*.*"), wxFD_SAVE | wxFD_CHANGE_DIR | wxFD_OVERWRITE_PROMPT); if (wxID_OK != fd.ShowModal()) return; wxBusyCursor wait; wxString s; for (int i = 0; i < (int)listbox_monitored->GetCount(); ++i) s += listbox_monitored->GetString(i) + wxT("\n"); wxFile f; if (!f.Open(fd.GetPath(), wxFile::write) || !f.Write(s)) { wxMessageBox(_("Cannot write to file."), _("Error"), wxOK|wxICON_ERROR); return; } if (f.IsOpened()) f.Close(); } //----------------------------------------------------------------------------- void EventWatcherFrame::OnButtonAddClick(wxCommandEvent& WXUNUSED(event)) { wxString s; if (GetMultilineTextFromUser(this, _("Add Events for Monitoring"), s, _("You can add multiple events by adding one per line."), _("Add Events"))) { addEvents(s); defineMonitoredEvents(); } } //----------------------------------------------------------------------------- void EventWatcherFrame::OnButtonRemoveClick(wxCommandEvent& WXUNUSED(event)) { wxArrayInt sel; if (listbox_monitored->GetSelections(sel) == 0) return; wxBusyCursor wait; // going backwards to keep indexes valid for (int ix = sel.GetCount() - 1; ix >= 0; --ix) listbox_monitored->Delete(sel.Item(ix)); defineMonitoredEvents(); } //----------------------------------------------------------------------------- void EventWatcherFrame::OnButtonStartStopClick(wxCommandEvent& WXUNUSED(event)) { if (eventsM != 0) eventsM.clear(); else { DatabasePtr database = getDatabase(); if (!database) { Close(); return; } IBPP::Database db(database->getIBPPDatabase()); eventsM = IBPP::EventsFactory(db); defineMonitoredEvents(); } updateMonitoringActive(); } //----------------------------------------------------------------------------- void EventWatcherFrame::OnListBoxSelected(wxCommandEvent& WXUNUSED(event)) { updateControls(); } //----------------------------------------------------------------------------- void EventWatcherFrame::OnTimer(wxTimerEvent& WXUNUSED(event)) { if (eventsM != 0) eventsM->Dispatch(); else // stop timer, update UI updateMonitoringActive(); } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/EventWatcherFrame.h000066400000000000000000000072231177057155300233050ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ //----------------------------------------------------------------------------- #ifndef FR_EVENT_FRAME_H #define FR_EVENT_FRAME_H #include #include #include #include #include #include #include "core/Observer.h" #include "controls/LogTextControl.h" #include "gui/BaseFrame.h" #include "metadata/database.h" #include "metadata/MetadataClasses.h" class EventLogControl; //----------------------------------------------------------------------------- class EventWatcherFrame : public BaseFrame, public Observer, public IBPP::EventInterface { private: DatabaseWeakPtr databaseM; wxTimer timerM; IBPP::Events eventsM; wxPanel* panel_controls; wxStaticText* static_text_monitored; wxStaticText* static_text_received; wxListBox* listbox_monitored; EventLogControl* eventlog_received; wxButton *button_add; wxButton *button_remove; wxButton *button_load; wxButton *button_save; wxButton *button_monitor; void createControls(); void layoutControls(); void updateControls(); static wxString getFrameId(DatabasePtr db); void addEvents(wxString& s); // multiline allowed void defineMonitoredEvents(); DatabasePtr getDatabase() const; bool setTimerActive(bool active); void updateMonitoringActive(); virtual void ibppEventHandler(IBPP::Events events, const std::string& name, int count); // observer stuff virtual void subjectRemoved(Subject* subject); virtual void update(); protected: virtual void doReadConfigSettings(const wxString& prefix); virtual void doWriteConfigSettings(const wxString& prefix) const; virtual const wxString getName() const; public: EventWatcherFrame(wxWindow* parent, DatabasePtr db); static EventWatcherFrame* findFrameFor(DatabasePtr db); private: // event handling enum { ID_listbox_monitored = 101, ID_log_received, ID_button_add, ID_button_remove, ID_button_load, ID_button_save, ID_button_monitor, ID_timer }; void OnButtonAddClick(wxCommandEvent& event); void OnButtonRemoveClick(wxCommandEvent& event); void OnButtonLoadClick(wxCommandEvent& event); void OnButtonSaveClick(wxCommandEvent& event); void OnButtonStartStopClick(wxCommandEvent& event); void OnListBoxSelected(wxCommandEvent& event); void OnTimer(wxTimerEvent& event); DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- #endif flamerobin_0.9.3~svn+2220.orig/src/gui/ExecuteSql.cpp000066400000000000000000000044171177057155300223520ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ //----------------------------------------------------------------------------- // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "gui/ExecuteSqlFrame.h" //----------------------------------------------------------------------------- ExecuteSqlFrame* showSql(wxWindow* parent, const wxString& title, DatabasePtr database, const wxString &sql) { ExecuteSqlFrame* eff = new ExecuteSqlFrame(parent, -1, title, database); eff->Show(); eff->setSql(sql); return eff; } //----------------------------------------------------------------------------- void execSql(wxWindow* parent, const wxString& title, DatabasePtr database, const wxString &sql, bool closeWindow) { ExecuteSqlFrame* eff = showSql(parent, title, database, sql); eff->Update(); eff->executeAllStatements(closeWindow); } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/ExecuteSql.h000066400000000000000000000036421177057155300220160ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef EXECUTESQL_H #define EXECUTESQL_H //----------------------------------------------------------------------------- // These functions are used to show (and execute) sql statements // they are separated here since: // a) it is used in many places and improves compilation time a lot // b) it allows us to change the way it is done easily #include "metadata/MetadataClasses.h" class ExecuteSqlFrame; //----------------------------------------------------------------------------- ExecuteSqlFrame* showSql(wxWindow* parent, const wxString& title, DatabasePtr database, const wxString &sql); void execSql(wxWindow* parent, const wxString& title, DatabasePtr database, const wxString &sql, bool closeWindow); //----------------------------------------------------------------------------- #endif // EXECUTESQL_H flamerobin_0.9.3~svn+2220.orig/src/gui/ExecuteSqlFrame.cpp000066400000000000000000004157601177057155300233340ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include #include #include #include #include #include #include #include "config/Config.h" #include "core/ArtProvider.h" #include "core/CodeTemplateProcessor.h" #include "core/FRError.h" #include "core/StringUtils.h" #include "core/URIProcessor.h" #include "engine/MetadataLoader.h" #include "gui/AdvancedMessageDialog.h" #include "gui/CommandIds.h" #include "gui/CommandManager.h" #include "gui/controls/ControlUtils.h" #include "gui/controls/DataGrid.h" #include "gui/controls/DataGridTable.h" #include "gui/GUIURIHandlerHelper.h" #include "gui/MetadataItemPropertiesFrame.h" #include "gui/ProgressDialog.h" #include "gui/EditBlobDialog.h" #include "gui/ExecuteSql.h" #include "gui/ExecuteSqlFrame.h" #include "gui/FRLayoutConfig.h" #include "gui/InsertDialog.h" #include "gui/StatementHistoryDialog.h" #include "gui/StyleGuide.h" #include "frutils.h" #include "logger.h" #include "metadata/column.h" #include "metadata/CreateDDLVisitor.h" #include "metadata/database.h" #include "metadata/exception.h" #include "metadata/function.h" #include "metadata/generator.h" #include "metadata/MetadataItemURIHandlerHelper.h" #include "metadata/procedure.h" #include "metadata/server.h" #include "metadata/table.h" #include "metadata/view.h" #include "sql/Identifier.h" #include "sql/IncompleteStatement.h" #include "sql/MultiStatement.h" #include "sql/SelectStatement.h" #include "sql/SqlStatement.h" #include "sql/StatementBuilder.h" #include "statementHistory.h" //----------------------------------------------------------------------------- class SqlEditorDropTarget : public wxDropTarget { public: SqlEditorDropTarget(ExecuteSqlFrame* frame, SqlEditor* editor, Database* database); virtual wxDragResult OnData(wxCoord x, wxCoord y, wxDragResult def); virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames); virtual bool OnDropText(wxCoord x, wxCoord y, const wxString& text); private: ExecuteSqlFrame* frameM; SqlEditor* editorM; Database* databaseM; wxFileDataObject* fileDataM; wxTextDataObject* textDataM; }; //----------------------------------------------------------------------------- SqlEditorDropTarget::SqlEditorDropTarget(ExecuteSqlFrame* frame, SqlEditor* editor, Database* database) : frameM(frame), editorM(editor), databaseM(database) { wxDataObjectComposite* dataobj = new wxDataObjectComposite; dataobj->Add(fileDataM = new wxFileDataObject); dataobj->Add(textDataM = new wxTextDataObject); SetDataObject(dataobj); } //----------------------------------------------------------------------------- wxDragResult SqlEditorDropTarget::OnData(wxCoord x, wxCoord y, wxDragResult def) { if (!GetData()) return wxDragNone; wxDataObjectComposite* dataobj = (wxDataObjectComposite*) m_dataObject; // test for wxDF_FILENAME if (dataobj->GetReceivedFormat() == fileDataM->GetFormat()) { if (OnDropFiles(x, y, fileDataM->GetFilenames())) return def; } else // try everything else as dropped text if (OnDropText(x, y, textDataM->GetText())) return def; return wxDragNone; } //----------------------------------------------------------------------------- bool SqlEditorDropTarget::OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames) { return (filenames.GetCount() == 1 && frameM->loadSqlFile(filenames[0])); } //----------------------------------------------------------------------------- // TODO: This needs to be reworked to use the tokenizer // Perhaps we could have a SelectStatement class, that would be able to: // - load the select statement // - alter some of it (add new table, column, etc.) // - dump statement back to editor bool SqlEditorDropTarget::OnDropText(wxCoord, wxCoord, const wxString& text) { if (text.Mid(0, 7) != wxT("OBJECT:")) return false; long address; if (!text.Mid(7).ToLong(&address)) return false; MetadataItem *m = (MetadataItem *)address; DatabasePtr db = m->getDatabase(); if (db.get() != databaseM) { wxMessageBox(_("Cannot use objects from different databases."), _("Wrong database."), wxOK | wxICON_WARNING); return false; } wxString columns; Table* t = 0; Column* c = dynamic_cast(m); if (c) t = c->getTable(); else t = dynamic_cast(m); if (t == 0) { wxMessageBox(_("Only tables and table columns can be dropped."), _("Object type not supported."), wxOK | wxICON_WARNING); return false; } SelectStatement sstm(editorM->GetText()); if (!sstm.isValidSelectStatement()) { StatementBuilder sb; sb << kwSELECT << ' ' << kwFROM << ' '; // blank statement sstm.setStatement(sb); } // add the column(s) if (c) { sstm.addColumn(t->getQuotedName() + wxT(".") + c->getQuotedName()); } else { t->ensureChildrenLoaded(); for (ColumnPtrs::const_iterator it = t->begin(); it != t->end(); ++it) { sstm.addColumn( t->getQuotedName() + wxT(".") + (*it)->getQuotedName()); } } // read in the table names, and find position where FROM clause ends std::vector tableNames; sstm.getTables(tableNames); // if table is not there, add it if (std::find(tableNames.begin(), tableNames.end(), t->getQuotedName()) == tableNames.end()) { std::vector relatedTables; if (Table::tablesRelate(tableNames, t, relatedTables)) // foreign keys { wxArrayString as; for (std::vector::iterator it = relatedTables.begin(); it != relatedTables.end(); ++it) { wxString addme = (*it).getReferencedTable() + wxT(": ") + (*it).getJoin(false); // false = unquoted if (as.Index(addme) == wxNOT_FOUND) as.Add(addme); } wxString join_list; if (as.GetCount() > 1) // let the user decide { int selected = ::wxGetSingleChoiceIndex( _("Multiple foreign keys found"), _("Select the desired table"), as); if (selected == -1) return false; join_list = relatedTables[selected].getJoin(true /*quoted*/); } else join_list = relatedTables[0].getJoin(true); // FIXME: dummy test value // can_be_null = (check if any of the FK fields can be null) bool can_be_null = true; wxString joinType = (can_be_null ? wxT("LEFT JOIN"):wxT("JOIN")); sstm.addTable(t->getQuotedName(), joinType, join_list); } else { sstm.addTable(t->getQuotedName(), wxT("CARTESIAN"), wxT("")); } } editorM->SetText(sstm.getStatement()); return true; } //----------------------------------------------------------------------------- // Setup the Scintilla editor SqlEditor::SqlEditor(wxWindow *parent, wxWindowID id) : SearchableEditor(parent, id) { wxString s; if (config().getValue(wxT("SqlEditorFont"), s) && !s.empty()) { wxFont f; f.SetNativeFontInfo(s); if (f.Ok()) StyleSetFont(wxSTC_STYLE_DEFAULT, f); } else { wxFont font(frlayoutconfig().getEditorFontSize(), wxMODERN, wxNORMAL, wxNORMAL); StyleSetFont(wxSTC_STYLE_DEFAULT, font); } int charset; if (config().getValue(wxT("SqlEditorCharset"), charset)) StyleSetCharacterSet(wxSTC_STYLE_DEFAULT, charset); setup(); } //----------------------------------------------------------------------------- bool SqlEditor::hasSelection() { return GetSelectionStart() != GetSelectionEnd(); } //----------------------------------------------------------------------------- void SqlEditor::markText(int start, int end) { centerCaret(true); GotoPos(end); GotoPos(start); SetSelectionStart(start); SetSelectionEnd(end); centerCaret(false); } //----------------------------------------------------------------------------- void SqlEditor::setChars(bool firebirdIdentifierOnly) { SetKeyWords(0, SqlTokenizer::getKeywordsString(SqlTokenizer::kwLowerCase)); wxString chars(wxT("_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"$")); if (!firebirdIdentifierOnly) { // see Document::SetDefaultCharClasses in stc/Document.cxx for (int ch = 0x80; ch < 0x0100; ch++) if (isalnum(ch)) chars += wxChar(ch); } SetWordChars(chars); } //----------------------------------------------------------------------------- //! This code has to be called each time the font has changed, so that the control updates void SqlEditor::setup() { StyleClearAll(); StyleSetForeground(0, wxColour(0x80, 0x00, 0x00)); StyleSetForeground(1, wxColour(0x00, 0xa0, 0x00)); // multiline comment StyleSetForeground(2, wxColour(0x00, 0xa0, 0x00)); // one-line comment StyleSetForeground(3, wxColour(0x00, 0xff, 0x00)); StyleSetForeground(4, wxColour(0x00, 0x00, 0xff)); // number StyleSetForeground(5, wxColour(0x00, 0x00, 0x7f)); // keyword StyleSetForeground(6, wxColour(0x00, 0x00, 0xff)); // 'single quotes' StyleSetForeground(7, wxColour(0xff, 0x00, 0xff)); StyleSetForeground(8, wxColour(0x00, 0x7f, 0x7f)); StyleSetForeground(9, wxColour(0xff, 0x00, 0x00)); StyleSetForeground(10, wxColour(0x00, 0x00, 0x00)); // ops StyleSetForeground(11, wxColour(0x00, 0x00, 0x00)); StyleSetBackground(wxSTC_STYLE_BRACELIGHT, wxColour(0xff, 0xcc, 0x00)); // brace highlight StyleSetBackground(wxSTC_STYLE_BRACEBAD, wxColour(0xff, 0x33, 0x33)); // brace bad highlight StyleSetBold(5, TRUE); StyleSetBold(10, TRUE); StyleSetBold(wxSTC_STYLE_BRACELIGHT, TRUE); StyleSetBold(wxSTC_STYLE_BRACEBAD, TRUE); StyleSetItalic(2, TRUE); StyleSetItalic(1, TRUE); SetLexer(wxSTC_LEX_SQL); setChars(false); int tabSize = config().get(wxT("sqlEditorTabSize"), 4); SetTabWidth(tabSize); SetIndent(tabSize); SetUseTabs(false); SetTabIndents(true); SetBackSpaceUnIndents(true); AutoCompSetIgnoreCase(true); AutoCompSetAutoHide(true); // info in ScintillaDoc.html file (in scintilla source package) SetMarginWidth(0, 40); // turn on the linenumbers margin, set width to 40pixels SetMarginWidth(1, 0); // turn off the folding margin SetMarginType(0, 1); // set margin type to linenumbers if (config().get(wxT("sqlEditorShowEdge"), false)) { SetEdgeMode(wxSTC_EDGE_LINE); SetEdgeColumn(config().get(wxT("sqlEditorEdgeColumn"), 50)); } if (!config().get(wxT("sqlEditorSmartHomeKey"), true)) CmdKeyAssign(wxSTC_KEY_HOME, wxSTC_SCMOD_NORM, wxSTC_CMD_HOMEDISPLAY); centerCaret(false); } //----------------------------------------------------------------------------- BEGIN_EVENT_TABLE(SqlEditor, wxStyledTextCtrl) EVT_CONTEXT_MENU(SqlEditor::OnContextMenu) EVT_KILL_FOCUS(SqlEditor::OnKillFocus) END_EVENT_TABLE() //----------------------------------------------------------------------------- void SqlEditor::OnContextMenu(wxContextMenuEvent& event) { if (AutoCompActive() || CallTipActive()) return; SetFocus(); wxMenu m; m.Append(wxID_UNDO, _("&Undo")); m.Append(wxID_REDO, _("&Redo")); m.AppendSeparator(); m.Append(wxID_CUT, _("Cu&t")); m.Append(wxID_COPY, _("&Copy")); m.Append(wxID_PASTE, _("&Paste")); m.Append(wxID_DELETE, _("&Delete")); m.AppendSeparator(); m.Append(wxID_SELECTALL, _("Select &All")); m.Append(Cmds::Query_Execute_selection, _("E&xecute selected")); int slen = GetSelectionEnd() - GetSelectionStart(); if (slen && slen < 50) // something (small) is selected { wxString sel = GetSelectedText().Strip(); size_t p = sel.find_first_of(wxT("\n\r\t")); if (p != wxString::npos) sel.Remove(p); m.Append(Cmds::Find_Selected_Object, _("S&how properties for ") + sel); } PopupMenu(&m, calcContextMenuPosition(event.GetPosition(), this)); } //----------------------------------------------------------------------------- void SqlEditor::OnKillFocus(wxFocusEvent& event) { if (AutoCompActive()) AutoCompCancel(); if (CallTipActive()) CallTipCancel(); event.Skip(); // let the STC do it's job } //----------------------------------------------------------------------------- void SqlEditor::setFont() { // step 1 of 2: set font wxFont f, f2; wxString s; // since we can't get the font from control we ask config() for it if (config().getValue(wxT("SqlEditorFont"), s) && !s.empty()) { f.SetNativeFontInfo(s); f2 = ::wxGetFontFromUser(this, f); } else // if config() doesn't have it, we'll use the default { wxFont font(frlayoutconfig().getEditorFontSize(), wxMODERN, wxNORMAL, wxNORMAL); f2 = ::wxGetFontFromUser(this, font); } if (!f2.Ok()) // user Canceled return; StyleSetFont(wxSTC_STYLE_DEFAULT, f2); // step 2 of 2: set charset std::map sets; // create human-readable names from wxSTC charsets sets[wxT("CHARSET_ANSI")] = 0; sets[wxT("CHARSET_EASTEUROPE")] = 238; sets[wxT("CHARSET_GB2312")] = 134; sets[wxT("CHARSET_HANGUL")] = 129; sets[wxT("CHARSET_HEBREW")] = 177; sets[wxT("CHARSET_SHIFTJIS")] = 128; #ifdef __WXMSW__ sets[wxT("CHARSET_DEFAULT")] = 1; // according to scintilla docs these only work on Windows sets[wxT("CHARSET_BALTIC")] = 186; // so we won't offer them sets[wxT("CHARSET_CHINESEBIG5")] = 136; sets[wxT("CHARSET_GREEK")] = 161; sets[wxT("CHARSET_MAC")] = 77; sets[wxT("CHARSET_OEM")] = 255; sets[wxT("CHARSET_RUSSIAN")] = 204; sets[wxT("CHARSET_SYMBOL")] = 2; sets[wxT("CHARSET_TURKISH")] = 162; sets[wxT("CHARSET_JOHAB")] = 130; sets[wxT("CHARSET_ARABIC")] = 178; sets[wxT("CHARSET_VIETNAMESE")] = 163; sets[wxT("CHARSET_THAI")] = 222; #endif wxArrayString slist; // copy to wxArrayString slist.Alloc(sets.size()); std::map::iterator it; for (it = sets.begin(); it != sets.end(); ++it) slist.Add((*it).first); wxString c = wxGetSingleChoice(_("Select charset to use"), _("Setting font for editor"), slist, this); if (c.IsEmpty()) // Canceled return; it = sets.find(c); if (it == sets.end()) return; // should never happen StyleSetCharacterSet(wxSTC_STYLE_DEFAULT, (*it).second); if (wxYES == wxMessageBox(_("Would you like to keep these settings permanently?"), _("SQL Editor"), wxYES_NO|wxICON_QUESTION)) { wxString fontdesc = f2.GetNativeFontInfoDesc(); if (!fontdesc.IsEmpty()) config().setValue(wxT("SqlEditorFont"), fontdesc); config().setValue(wxT("SqlEditorCharset"), (*it).second); } setup(); // make control accept new settings showInformationDialog(wxGetTopLevelParent(this), _("The SQL editor font has been changed."), _("This setting affects only the SQL editor font. The font used in the result set data grid has to be changed separately."), AdvancedMessageDialogButtonsOk(), config(), wxT("DIALOG_WarnFont"), _("Do not show this information again")); } //----------------------------------------------------------------------------- class ScrollAtEnd { private: wxStyledTextCtrl *controlM; public: ScrollAtEnd(wxStyledTextCtrl *c) :controlM(c) { } ~ScrollAtEnd() { scroll(); } void cancel() { controlM = 0; } void scroll() { if (controlM) controlM->ScrollToLine(controlM->GetLineCount()-1); } }; //----------------------------------------------------------------------------- // MB: we don't use the 'parent' parameter here, because of some ugly bugs. // For example, if user clicks the 'drop trigger' link on the trigger // property page, it creates new ExecuteSqlFrame with trigger property // page as a parent. When dropping SQL statement is committed, it destroys // the trigger object and the observer pattern takes the trigger property // page down with it - since it is the parent of ExecuteSqlFrame it takes // down the ExecuteSqlFrame as well, and the code in commitTransaction // function keeps executing in an invalid object. // This is equivallent to 'delete this' in the middle of some function // // I have hard-coded the app's top window as the parent to all SQL frames // here as a sure way to prevent the problem. I didn't go into removing // the parent parameter everywhere as we might want to find some nice way // to make this work, and maybe we won't want to have the top frame as a // parent sometime. ExecuteSqlFrame::ExecuteSqlFrame(wxWindow* WXUNUSED(parent), int id, wxString title, DatabasePtr db, const wxPoint& pos, const wxSize& size, long style) : BaseFrame(wxTheApp->GetTopWindow(), id, title, pos, size, style), Observer(), databaseM(db.get()) { wxASSERT(db); loadingM = true; updateEditorCaretPosM = true; updateFrameTitleM = true; transactionIsolationLevelM = IBPP::ilConcurrency; transactionLockResolutionM = IBPP::lrWait; transactionAccessModeM = IBPP::amWrite; timerBlobEditorM.SetOwner(this, TIMER_ID_UPDATE_BLOB); CommandManager cm; buildToolbar(cm); buildMainMenu(cm); panel_contents = new wxPanel(this, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); splitter_window_1 = new wxSplitterWindow(panel_contents, -1); styled_text_ctrl_sql = new SqlEditor(splitter_window_1, ID_stc_sql); notebook_1 = new wxNotebook(splitter_window_1, -1, wxDefaultPosition, wxDefaultSize, 0); notebook_pane_1 = new wxPanel(notebook_1, -1); styled_text_ctrl_stats = new wxStyledTextCtrl(notebook_pane_1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_THEME); styled_text_ctrl_stats->SetWrapMode(wxSTC_WRAP_WORD); styled_text_ctrl_stats->StyleSetForeground(1, *wxRED); styled_text_ctrl_stats->StyleSetForeground(2, *wxBLUE); notebook_1->AddPage(notebook_pane_1, _("Statistics")); notebook_pane_2 = new wxPanel(notebook_1, -1); grid_data = new DataGrid(notebook_pane_2, ID_grid_data); notebook_1->AddPage(notebook_pane_2, _("Data")); statusbar_1 = CreateStatusBar(4); SetStatusBarPane(-1); editBlobDlgM = 0; set_properties(); do_layout(); // observe database object to close on disconnect / destruction databaseM->attachObserver(this, false); executedStatementsM.clear(); inTransaction(false); // enable/disable controls setKeywords(); // set words for autocomplete feature historyPositionM = StatementHistory::get(databaseM).size(); // set drop target for DnD styled_text_ctrl_sql->SetDropTarget( new SqlEditorDropTarget(this, styled_text_ctrl_sql, databaseM)); setViewMode(false, vmEditor); loadingM = false; } //----------------------------------------------------------------------------- Database* ExecuteSqlFrame::getDatabase() const { return databaseM; } //----------------------------------------------------------------------------- void ExecuteSqlFrame::buildToolbar(CommandManager& cm) { //toolBarM = CreateToolBar( wxTB_FLAT|wxTB_HORIZONTAL|wxTB_TEXT, wxID_ANY ); toolBarM = CreateToolBar( wxTB_FLAT | wxTB_HORIZONTAL, wxID_ANY ); #ifdef __WXGTK20__ wxSize bmpSize(24, 24); #else wxSize bmpSize(16, 16); #endif toolBarM->SetToolBitmapSize(bmpSize); toolBarM->AddTool( wxID_NEW, _("New"), wxArtProvider::GetBitmap(wxART_NEW, wxART_TOOLBAR, bmpSize), wxNullBitmap, wxITEM_NORMAL, cm.getToolbarHint(_("New window"), wxID_NEW)); toolBarM->AddTool( wxID_OPEN, _("Open"), wxArtProvider::GetBitmap(wxART_FILE_OPEN, wxART_TOOLBAR, bmpSize), wxNullBitmap, wxITEM_NORMAL, cm.getToolbarHint(_("Load a file"), wxID_OPEN)); toolBarM->AddTool( wxID_SAVE, _("Save"), wxArtProvider::GetBitmap(wxART_FILE_SAVE, wxART_TOOLBAR, bmpSize), wxNullBitmap, wxITEM_NORMAL, cm.getToolbarHint(_("Save to file"), wxID_SAVE)); toolBarM->AddTool( wxID_SAVEAS, _("Save as"), wxArtProvider::GetBitmap(wxART_FILE_SAVE_AS, wxART_TOOLBAR, bmpSize), wxNullBitmap, wxITEM_NORMAL, cm.getToolbarHint(_("Save under different name"), wxID_SAVEAS)); toolBarM->AddSeparator(); toolBarM->AddTool( wxID_BACKWARD, _("Back"), wxArtProvider::GetBitmap(wxART_GO_BACK, wxART_TOOLBAR, bmpSize), wxNullBitmap, wxITEM_NORMAL, cm.getToolbarHint(_("Go to previous statement"), wxID_BACKWARD)); toolBarM->AddTool( wxID_FORWARD, _("Next"), wxArtProvider::GetBitmap(wxART_GO_FORWARD, wxART_TOOLBAR, bmpSize), wxNullBitmap, wxITEM_NORMAL, cm.getToolbarHint(_("Go to next statement"), wxID_FORWARD)); toolBarM->AddTool( Cmds::History_Search, _("History"), wxArtProvider::GetBitmap(ART_History, wxART_TOOLBAR, bmpSize), wxNullBitmap, wxITEM_NORMAL, cm.getToolbarHint(_("Browse and search statement history"), Cmds::History_Search)); toolBarM->AddSeparator(); toolBarM->AddTool( Cmds::Query_Execute, _("Execute"), wxArtProvider::GetBitmap(ART_ExecuteStatement, wxART_TOOLBAR, bmpSize), wxNullBitmap, wxITEM_NORMAL, cm.getToolbarHint(_("Execute statement(s)"), Cmds::Query_Execute)); toolBarM->AddTool( Cmds::Query_Show_plan, _("Show plan"), wxArtProvider::GetBitmap(ART_ShowExecutionPlan, wxART_TOOLBAR, bmpSize), wxNullBitmap, wxITEM_NORMAL, cm.getToolbarHint(_("Show query execution plan"), Cmds::Query_Show_plan)); toolBarM->AddTool( Cmds::Query_Commit, _("Commit"), wxArtProvider::GetBitmap(ART_CommitTransaction, wxART_TOOLBAR, bmpSize), wxNullBitmap, wxITEM_NORMAL, cm.getToolbarHint(_("Commit transaction"), Cmds::Query_Commit)); toolBarM->AddTool( Cmds::Query_Rollback, _("Rollback"), wxArtProvider::GetBitmap(ART_RollbackTransaction, wxART_TOOLBAR, bmpSize), wxNullBitmap, wxITEM_NORMAL, cm.getToolbarHint(_("Rollback transaction"), Cmds::Query_Rollback)); toolBarM->AddSeparator(); toolBarM->AddTool( Cmds::DataGrid_Insert_row, _("Insert row(s)"), wxArtProvider::GetBitmap(ART_InsertRow, wxART_TOOLBAR, bmpSize), wxNullBitmap, wxITEM_NORMAL, cm.getToolbarHint(_("Insert row(s) into recordset"), Cmds::DataGrid_Insert_row)); toolBarM->AddTool( Cmds::DataGrid_Delete_row, _("Delete row(s)"), wxArtProvider::GetBitmap(ART_DeleteRow, wxART_TOOLBAR, bmpSize), wxNullBitmap, wxITEM_NORMAL, cm.getToolbarHint(_("Delete row(s) from recordset"), Cmds::DataGrid_Delete_row)); toolBarM->AddSeparator(); toolBarM->AddTool( Cmds::View_SplitView, _("Toggle split view"), wxArtProvider::GetBitmap(ART_ToggleView, wxART_TOOLBAR, bmpSize), wxNullBitmap, wxITEM_CHECK, cm.getToolbarHint(_("Toggle split view"), Cmds::View_SplitView)); toolBarM->Realize(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::buildMainMenu(CommandManager& cm) { menuBarM = new wxMenuBar(); wxMenu* fileMenu = new wxMenu(); // dynamic menus, created at runtime fileMenu->Append(wxID_NEW, cm.getMainMenuItemText(_("&New..."), wxID_NEW)); fileMenu->Append(wxID_OPEN, cm.getMainMenuItemText(_("&Open..."), wxID_OPEN)); fileMenu->Append(wxID_SAVE, cm.getMainMenuItemText(_("&Save"), wxID_SAVE)); fileMenu->Append(wxID_SAVEAS, cm.getMainMenuItemText(_("Save &As..."), wxID_SAVEAS)); fileMenu->AppendSeparator(); fileMenu->Append(wxID_CLOSE, cm.getMainMenuItemText(_("&Close"), wxID_CLOSE)); menuBarM->Append(fileMenu, _("&File")); wxMenu* editMenu = new wxMenu(); editMenu->Append(wxID_UNDO, cm.getMainMenuItemText(_("&Undo"), wxID_UNDO)); editMenu->Append(wxID_REDO, cm.getMainMenuItemText(_("&Redo"), wxID_REDO)); editMenu->AppendSeparator(); editMenu->Append(wxID_CUT, cm.getMainMenuItemText(_("Cu&t"), wxID_CUT)); editMenu->Append(wxID_COPY, cm.getMainMenuItemText(_("&Copy"), wxID_COPY)); editMenu->Append(wxID_PASTE, cm.getMainMenuItemText(_("&Paste"), wxID_PASTE)); editMenu->Append(wxID_DELETE, cm.getMainMenuItemText(_("&Delete"), wxID_DELETE)); editMenu->AppendSeparator(); editMenu->Append(wxID_SELECTALL, cm.getMainMenuItemText(_("Select &all"), wxID_SELECTALL)); editMenu->AppendSeparator(); editMenu->Append(wxID_REPLACE, cm.getMainMenuItemText(_("Fi&nd and replace"), wxID_REPLACE)); menuBarM->Append(editMenu, _("&Edit")); wxMenu* viewMenu = new wxMenu(); viewMenu->AppendRadioItem(Cmds::View_Editor, cm.getMainMenuItemText(_("Sql &editor"), Cmds::View_Editor)); viewMenu->AppendRadioItem(Cmds::View_Statistics, cm.getMainMenuItemText(_("&Log view"), Cmds::View_Statistics)); viewMenu->AppendRadioItem(Cmds::View_Data, cm.getMainMenuItemText(_("&Data grid"), Cmds::View_Data)); viewMenu->AppendSeparator(); viewMenu->AppendCheckItem(Cmds::View_SplitView, cm.getMainMenuItemText(_("&Split view"), Cmds::View_SplitView)); viewMenu->AppendSeparator(); viewMenu->Append(Cmds::View_Set_editor_font, _("Set editor &font")); viewMenu->AppendSeparator(); viewMenu->AppendCheckItem(Cmds::View_Wrap_long_lines, _("&Wrap long lines")); menuBarM->Append(viewMenu, _("&View")); wxMenu* historyMenu = new wxMenu(); historyMenu->Append(wxID_FORWARD, _("&Next")); historyMenu->Append(wxID_BACKWARD, _("&Previous")); historyMenu->AppendSeparator(); historyMenu->Append(Cmds::History_Search, _("&Search")); historyMenu->AppendSeparator(); historyMenu->AppendCheckItem(Cmds::History_EnableLogging, _("&Enable logging")); menuBarM->Append(historyMenu, _("&History")); wxMenu* statementMenu = new wxMenu(); statementMenu->Append(Cmds::Query_Execute, cm.getMainMenuItemText(_("&Execute"), Cmds::Query_Execute)); statementMenu->Append(Cmds::Query_Show_plan, cm.getMainMenuItemText(_("Show execution &plan"), Cmds::Query_Show_plan)); statementMenu->Append(Cmds::Query_Execute_selection, cm.getMainMenuItemText(_("Execute &selection"), Cmds::Query_Execute_selection)); statementMenu->Append(Cmds::Query_Execute_from_cursor, cm.getMainMenuItemText(_("Exec&ute from cursor"), Cmds::Query_Execute_from_cursor)); statementMenu->AppendSeparator(); wxMenu* stmtPropMenu = new wxMenu(); stmtPropMenu->AppendRadioItem(Cmds::Query_TransactionConcurrency, cm.getMainMenuItemText(_("Concurrency isolation mode"), Cmds::Query_TransactionConcurrency)); stmtPropMenu->AppendRadioItem(Cmds::Query_TransactionReadDirty, cm.getMainMenuItemText(_("Dirty read isolation mode"), Cmds::Query_TransactionReadDirty)); stmtPropMenu->AppendRadioItem(Cmds::Query_TransactionReadCommitted, cm.getMainMenuItemText(_("Read committed isolation mode"), Cmds::Query_TransactionReadCommitted)); stmtPropMenu->AppendRadioItem(Cmds::Query_TransactionConsistency, cm.getMainMenuItemText(_("Consistency isolation mode"), Cmds::Query_TransactionConsistency)); stmtPropMenu->AppendSeparator(); stmtPropMenu->AppendCheckItem(Cmds::Query_TransactionLockResolution, cm.getMainMenuItemText(_("Wait for lock resolution"), Cmds::Query_TransactionLockResolution)); stmtPropMenu->AppendSeparator(); stmtPropMenu->AppendCheckItem(Cmds::Query_TransactionReadOnly, cm.getMainMenuItemText(_("Read only transaction"), Cmds::Query_TransactionReadOnly)); statementMenu->AppendSubMenu(stmtPropMenu, _("Transaction settings")); statementMenu->AppendSeparator(); statementMenu->Append(Cmds::Query_Commit, cm.getMainMenuItemText(_("&Commit transaction"), Cmds::Query_Commit)); statementMenu->Append(Cmds::Query_Rollback, cm.getMainMenuItemText(_("&Rollback transaction"), Cmds::Query_Rollback)); menuBarM->Append(statementMenu, _("&Statement")); wxMenu* gridMenu = new wxMenu(); gridMenu->Append(Cmds::DataGrid_Insert_row, _("I&nsert row")); gridMenu->Append(Cmds::DataGrid_Delete_row, _("&Delete row")); gridMenu->AppendSeparator(); gridMenu->Append(wxID_COPY, _("&Copy")); gridMenu->Append(Cmds::DataGrid_Copy_as_insert, _("Copy &as insert statements")); gridMenu->Append(Cmds::DataGrid_Copy_as_update, _("Copy as &update statements")); gridMenu->AppendSeparator(); gridMenu->Append(Cmds::DataGrid_EditBlob, _("Edit BLOB...")); gridMenu->Append(Cmds::DataGrid_ImportBlob, _("Import BLOB from file...")); gridMenu->Append(Cmds::DataGrid_ExportBlob, _("Save BLOB to file...")); gridMenu->AppendSeparator(); gridMenu->Append(Cmds::DataGrid_SetFieldToNULL, _("Set field to &NULL")); gridMenu->AppendSeparator(); gridMenu->Append(Cmds::DataGrid_FetchAll, _("&Fetch all records")); gridMenu->Append(Cmds::DataGrid_CancelFetchAll, _("&Stop fetching all records")); gridMenu->AppendSeparator(); gridMenu->Append(Cmds::DataGrid_Save_as_html, _("Save as &html")); gridMenu->Append(Cmds::DataGrid_Save_as_csv, _("Save as cs&v")); gridMenu->AppendSeparator(); gridMenu->Append(Cmds::DataGrid_Set_header_font, _("Set h&eader font")); gridMenu->Append(Cmds::DataGrid_Set_cell_font, _("Set cell f&ont")); gridMenu->AppendSeparator(); gridMenu->AppendCheckItem(Cmds::DataGrid_Log_changes, _("&Log data changes")); menuBarM->Append(gridMenu, _("&Grid")); SetMenuBar(menuBarM); // logging is always enabled by default menuBarM->Check(Cmds::History_EnableLogging, true); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::set_properties() { SetSize(wxSize(628, 488)); int statusbar_widths[] = { -2, 100, 60, -1 }; statusbar_1->SetStatusWidths(4, statusbar_widths); statusbar_1->SetStatusText(databaseM->getConnectionInfoString(), 0); statusbar_1->SetStatusText(wxT("Rows fetched"), 1); statusbar_1->SetStatusText(wxT("Cursor position"), 2); statusbar_1->SetStatusText(wxT("Transaction status"), 3); grid_data->SetTable(new DataGridTable(statementM, databaseM), true); splitter_window_1->Initialize(styled_text_ctrl_sql); viewModeM = vmEditor; SetIcon(wxArtProvider::GetIcon(ART_ExecuteSqlFrame, wxART_FRAME_ICON)); closeWhenTransactionDoneM = false; autoCommitM = config().get(wxT("autoCommitDDL"), false); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::do_layout() { // log control notebook pane wxBoxSizer* sizerPane1 = new wxBoxSizer(wxHORIZONTAL); sizerPane1->Add(styled_text_ctrl_stats, 1, wxEXPAND); notebook_pane_1->SetSizer(sizerPane1); // data grid notebook pane wxBoxSizer* sizerPane2 = new wxBoxSizer(wxHORIZONTAL); sizerPane2->Add(grid_data, 1, wxEXPAND); notebook_pane_2->SetSizer(sizerPane2); // splitter is only control in panel_contents wxBoxSizer* sizerContents = new wxBoxSizer(wxHORIZONTAL); sizerContents->Add(splitter_window_1, 1, wxEXPAND); panel_contents->SetSizer(sizerContents); sizerContents->Fit(this); sizerContents->SetSizeHints(this); } //----------------------------------------------------------------------------- bool ExecuteSqlFrame::doCanClose() { bool saveFile = false; if (filenameM.IsOk() && styled_text_ctrl_sql->GetModify()) { Raise(); int res = showQuestionDialog(this, _("Do you want to save changes to the file?"), wxString::Format(_("You have made changes to the file\n\n%s\n\nwhich will be lost if you close without saving."), filenameM.GetFullPath().c_str()), AdvancedMessageDialogButtonsYesNoCancel(_("&Save"), _("Do&n't Save"))); if (res != wxYES && res != wxNO) return false; saveFile = res == wxYES; } if (transactionM != 0 && transactionM->Started()) { Raise(); int res = showQuestionDialog(this, _("Do you want to commit the active transaction?"), _("If you don't commit the transaction then it will be automatically rolled back, and all changes made by statements executed in this transaction will be lost."), AdvancedMessageDialogButtonsYesNoCancel(_("&Commit Transaction"), _("&Rollback Transaction")), config(), wxT("DIALOG_ActiveTransaction"), _("Don't ask again, &always commit/rollback")); if (res != wxYES && res != wxNO) return false; if (res == wxYES && !commitTransaction()) return false; } if (saveFile && !styled_text_ctrl_sql->SaveFile(filenameM.GetFullPath())) return false; return true; } //----------------------------------------------------------------------------- void ExecuteSqlFrame::doBeforeDestroy() { // prevent editor from updating the invalid dataset if (grid_data->IsCellEditControlEnabled()) grid_data->EnableCellEditControl(false); // make sure that further calls to update() will not call Close() again databaseM = 0; } //----------------------------------------------------------------------------- void ExecuteSqlFrame::showProperties(wxString objectName) { MetadataItem *m = databaseM->findByName(objectName); if (!m) m = databaseM->findByName(objectName.Upper()); if (m) { MetadataItemPropertiesFrame::showPropertyPage(m); return; } wxMessageBox( wxString::Format(_("Object %s has not been found in this database."), objectName.c_str()), _("Search failed."), wxOK | wxICON_INFORMATION); } //----------------------------------------------------------------------------- BEGIN_EVENT_TABLE(ExecuteSqlFrame, wxFrame) EVT_STC_UPDATEUI(ExecuteSqlFrame::ID_stc_sql, ExecuteSqlFrame::OnSqlEditUpdateUI) EVT_STC_CHARADDED(ExecuteSqlFrame::ID_stc_sql, ExecuteSqlFrame::OnSqlEditCharAdded) EVT_STC_CHANGE(ExecuteSqlFrame::ID_stc_sql, ExecuteSqlFrame::OnSqlEditChanged) EVT_STC_START_DRAG(ExecuteSqlFrame::ID_stc_sql, ExecuteSqlFrame::OnSqlEditStartDrag) EVT_SPLITTER_UNSPLIT(wxID_ANY, ExecuteSqlFrame::OnSplitterUnsplit) EVT_CHAR_HOOK(ExecuteSqlFrame::OnKeyDown) EVT_CHILD_FOCUS(ExecuteSqlFrame::OnChildFocus) EVT_IDLE(ExecuteSqlFrame::OnIdle) EVT_MENU(wxID_NEW, ExecuteSqlFrame::OnMenuNew) EVT_MENU(wxID_OPEN, ExecuteSqlFrame::OnMenuOpen) EVT_MENU(wxID_SAVE, ExecuteSqlFrame::OnMenuSaveOrSaveAs) EVT_MENU(wxID_SAVEAS, ExecuteSqlFrame::OnMenuSaveOrSaveAs) EVT_MENU(wxID_CLOSE, ExecuteSqlFrame::OnMenuClose) EVT_MENU(wxID_UNDO, ExecuteSqlFrame::OnMenuUndo) EVT_MENU(wxID_REDO, ExecuteSqlFrame::OnMenuRedo) EVT_MENU(wxID_CUT, ExecuteSqlFrame::OnMenuCut) EVT_MENU(wxID_COPY, ExecuteSqlFrame::OnMenuCopy) EVT_MENU(wxID_PASTE, ExecuteSqlFrame::OnMenuPaste) EVT_MENU(wxID_DELETE, ExecuteSqlFrame::OnMenuDelete) EVT_MENU(wxID_SELECTALL,ExecuteSqlFrame::OnMenuSelectAll) EVT_MENU(wxID_REPLACE, ExecuteSqlFrame::OnMenuReplace) EVT_UPDATE_UI(wxID_UNDO, ExecuteSqlFrame::OnMenuUpdateUndo) EVT_UPDATE_UI(wxID_REDO, ExecuteSqlFrame::OnMenuUpdateRedo) EVT_UPDATE_UI(wxID_CUT, ExecuteSqlFrame::OnMenuUpdateCut) EVT_UPDATE_UI(wxID_COPY, ExecuteSqlFrame::OnMenuUpdateCopy) EVT_UPDATE_UI(wxID_PASTE, ExecuteSqlFrame::OnMenuUpdatePaste) EVT_UPDATE_UI(wxID_DELETE, ExecuteSqlFrame::OnMenuUpdateDelete) EVT_MENU(Cmds::View_Editor, ExecuteSqlFrame::OnMenuSelectView) EVT_UPDATE_UI(Cmds::View_Editor, ExecuteSqlFrame::OnMenuUpdateSelectView) EVT_MENU(Cmds::View_Statistics, ExecuteSqlFrame::OnMenuSelectView) EVT_UPDATE_UI(Cmds::View_Statistics, ExecuteSqlFrame::OnMenuUpdateSelectView) EVT_MENU(Cmds::View_Data, ExecuteSqlFrame::OnMenuSelectView) EVT_UPDATE_UI(Cmds::View_Data, ExecuteSqlFrame::OnMenuUpdateSelectView) EVT_MENU(Cmds::View_SplitView, ExecuteSqlFrame::OnMenuSplitView) EVT_UPDATE_UI(Cmds::View_SplitView, ExecuteSqlFrame::OnMenuUpdateSplitView) EVT_MENU(Cmds::View_Set_editor_font, ExecuteSqlFrame::OnMenuSetEditorFont) EVT_MENU(Cmds::View_Wrap_long_lines, ExecuteSqlFrame::OnMenuToggleWrap) EVT_MENU(Cmds::Find_Selected_Object, ExecuteSqlFrame::OnMenuFindSelectedObject) EVT_MENU(wxID_FORWARD, ExecuteSqlFrame::OnMenuHistoryNext) EVT_MENU(wxID_BACKWARD, ExecuteSqlFrame::OnMenuHistoryPrev) EVT_MENU(Cmds::History_Search, ExecuteSqlFrame::OnMenuHistorySearch) EVT_UPDATE_UI(wxID_FORWARD, ExecuteSqlFrame::OnMenuUpdateHistoryNext) EVT_UPDATE_UI(wxID_BACKWARD, ExecuteSqlFrame::OnMenuUpdateHistoryPrev) EVT_MENU(Cmds::Query_Execute, ExecuteSqlFrame::OnMenuExecute) EVT_MENU(Cmds::Query_Show_plan, ExecuteSqlFrame::OnMenuShowPlan) EVT_MENU(Cmds::Query_Execute_selection, ExecuteSqlFrame::OnMenuExecuteSelection) EVT_MENU(Cmds::Query_Execute_from_cursor, ExecuteSqlFrame::OnMenuExecuteFromCursor) EVT_UPDATE_UI(Cmds::Query_Execute, ExecuteSqlFrame::OnMenuUpdateWhenExecutePossible) EVT_UPDATE_UI(Cmds::Query_Show_plan, ExecuteSqlFrame::OnMenuUpdateWhenExecutePossible) EVT_UPDATE_UI(Cmds::Query_Execute_selection, ExecuteSqlFrame::OnMenuUpdateWhenExecutePossible) EVT_UPDATE_UI(Cmds::Query_Execute_from_cursor, ExecuteSqlFrame::OnMenuUpdateWhenExecutePossible) EVT_MENU(Cmds::Query_Commit, ExecuteSqlFrame::OnMenuCommit) EVT_MENU(Cmds::Query_Rollback, ExecuteSqlFrame::OnMenuRollback) EVT_UPDATE_UI(Cmds::Query_Commit, ExecuteSqlFrame::OnMenuUpdateWhenInTransaction) EVT_UPDATE_UI(Cmds::Query_Rollback, ExecuteSqlFrame::OnMenuUpdateWhenInTransaction) EVT_MENU_RANGE(Cmds::Query_TransactionConcurrency, Cmds::Query_TransactionConsistency, ExecuteSqlFrame::OnMenuTransactionIsolationLevel) EVT_UPDATE_UI_RANGE(Cmds::Query_TransactionConcurrency, Cmds::Query_TransactionConsistency, ExecuteSqlFrame::OnMenuUpdateTransactionIsolationLevel) EVT_MENU(Cmds::Query_TransactionLockResolution, ExecuteSqlFrame::OnMenuTransactionLockResolution) EVT_UPDATE_UI(Cmds::Query_TransactionLockResolution, ExecuteSqlFrame::OnMenuUpdateTransactionLockResolution) EVT_MENU(Cmds::Query_TransactionReadOnly, ExecuteSqlFrame::OnMenuTransactionReadOnly) EVT_UPDATE_UI(Cmds::Query_TransactionReadOnly, ExecuteSqlFrame::OnMenuUpdateTransactionReadOnly) EVT_MENU(Cmds::DataGrid_Insert_row, ExecuteSqlFrame::OnMenuGridInsertRow) EVT_MENU(Cmds::DataGrid_Delete_row, ExecuteSqlFrame::OnMenuGridDeleteRow) EVT_MENU(Cmds::DataGrid_SetFieldToNULL, ExecuteSqlFrame::OnMenuGridSetFieldToNULL) EVT_MENU(Cmds::DataGrid_Copy_as_insert, ExecuteSqlFrame::OnMenuGridCopyAsInsert) EVT_MENU(Cmds::DataGrid_Copy_as_inList, ExecuteSqlFrame::OnMenuGridCopyAsInList) EVT_MENU(Cmds::DataGrid_Copy_as_update, ExecuteSqlFrame::OnMenuGridCopyAsUpdate) EVT_MENU(Cmds::DataGrid_EditBlob, ExecuteSqlFrame::OnMenuGridEditBlob) EVT_MENU(Cmds::DataGrid_ImportBlob, ExecuteSqlFrame::OnMenuGridImportBlob) EVT_MENU(Cmds::DataGrid_ExportBlob, ExecuteSqlFrame::OnMenuGridExportBlob) EVT_MENU(Cmds::DataGrid_Save_as_html, ExecuteSqlFrame::OnMenuGridSaveAsHtml) EVT_MENU(Cmds::DataGrid_Save_as_csv, ExecuteSqlFrame::OnMenuGridSaveAsCsv) EVT_MENU(Cmds::DataGrid_Set_header_font, ExecuteSqlFrame::OnMenuGridGridHeaderFont) EVT_MENU(Cmds::DataGrid_Set_cell_font, ExecuteSqlFrame::OnMenuGridGridCellFont) EVT_MENU(Cmds::DataGrid_FetchAll, ExecuteSqlFrame::OnMenuGridFetchAll) EVT_MENU(Cmds::DataGrid_CancelFetchAll, ExecuteSqlFrame::OnMenuGridCancelFetchAll) EVT_UPDATE_UI(Cmds::DataGrid_Insert_row, ExecuteSqlFrame::OnMenuUpdateGridInsertRow) EVT_UPDATE_UI(Cmds::DataGrid_Delete_row, ExecuteSqlFrame::OnMenuUpdateGridDeleteRow) EVT_UPDATE_UI(Cmds::DataGrid_SetFieldToNULL, ExecuteSqlFrame::OnMenuUpdateGridCanSetFieldToNULL) EVT_UPDATE_UI(Cmds::DataGrid_Copy_as_insert, ExecuteSqlFrame::OnMenuUpdateGridHasData) EVT_UPDATE_UI(Cmds::DataGrid_Copy_as_update, ExecuteSqlFrame::OnMenuUpdateGridHasData) EVT_UPDATE_UI(Cmds::DataGrid_EditBlob, ExecuteSqlFrame::OnMenuUpdateGridCellIsBlob) EVT_UPDATE_UI(Cmds::DataGrid_ImportBlob, ExecuteSqlFrame::OnMenuUpdateGridCellIsBlob) EVT_UPDATE_UI(Cmds::DataGrid_ExportBlob, ExecuteSqlFrame::OnMenuUpdateGridCellIsBlob) EVT_UPDATE_UI(Cmds::DataGrid_Save_as_html, ExecuteSqlFrame::OnMenuUpdateGridHasSelection) EVT_UPDATE_UI(Cmds::DataGrid_Save_as_csv, ExecuteSqlFrame::OnMenuUpdateGridHasSelection) EVT_UPDATE_UI(Cmds::DataGrid_FetchAll, ExecuteSqlFrame::OnMenuUpdateGridFetchAll) EVT_UPDATE_UI(Cmds::DataGrid_CancelFetchAll, ExecuteSqlFrame::OnMenuUpdateGridCancelFetchAll) EVT_COMMAND(ExecuteSqlFrame::ID_grid_data, wxEVT_FRDG_ROWCOUNT_CHANGED, \ ExecuteSqlFrame::OnGridRowCountChanged) EVT_COMMAND(ExecuteSqlFrame::ID_grid_data, wxEVT_FRDG_STATEMENT, \ ExecuteSqlFrame::OnGridStatementExecuted) EVT_COMMAND(ExecuteSqlFrame::ID_grid_data, wxEVT_FRDG_INVALIDATEATTR, \ ExecuteSqlFrame::OnGridInvalidateAttributeCache) EVT_COMMAND(ExecuteSqlFrame::ID_grid_data, wxEVT_FRDG_SUM, \ ExecuteSqlFrame::OnGridSum) EVT_GRID_CMD_SELECT_CELL(ExecuteSqlFrame::ID_grid_data, ExecuteSqlFrame::OnGridCellChange) EVT_GRID_CMD_LABEL_LEFT_DCLICK(ExecuteSqlFrame::ID_grid_data, ExecuteSqlFrame::OnGridLabelLeftDClick) EVT_TIMER(ExecuteSqlFrame::TIMER_ID_UPDATE_BLOB, ExecuteSqlFrame::OnBlobEditorUpdate) END_EVENT_TABLE() //----------------------------------------------------------------------------- // Avoiding the annoying thing that you cannot click inside the selection and have it deselected and have caret there void ExecuteSqlFrame::OnSqlEditStartDrag(wxStyledTextEvent& event) { wxPoint mp = ::wxGetMousePosition(); int p = styled_text_ctrl_sql->PositionFromPoint(styled_text_ctrl_sql->ScreenToClient(mp)); styled_text_ctrl_sql->SetSelectionStart(p); // deselect text styled_text_ctrl_sql->SetSelectionEnd(p); // cancel drag operation, because drag and drop editing is disabled // by our own SqlEditorDropTarget anyway event.SetDragText(wxEmptyString); } //----------------------------------------------------------------------------- //! display editor col:row in StatusBar and do highlighting of braces () void ExecuteSqlFrame::OnSqlEditUpdateUI(wxStyledTextEvent& WXUNUSED(event)) { if (loadingM) return; // mghie: do not update the statusbar from here, because that slows // everything down a lot on Mac OS X updateEditorCaretPosM = true; // check for braces, and highlight int p = styled_text_ctrl_sql->GetCurrentPos(); int c1 = styled_text_ctrl_sql->GetCharAt(p); int c2 = (p > 1 ? styled_text_ctrl_sql->GetCharAt(p-1) : 0); if (c2=='(' || c2==')' || c1=='(' || c1==')') { int sp = (c2=='(' || c2==')') ? p-1 : p; int q = styled_text_ctrl_sql->BraceMatch(sp); if (q == wxSTC_INVALID_POSITION) styled_text_ctrl_sql->BraceBadLight(sp); else styled_text_ctrl_sql->BraceHighlight(sp, q); // remove calltip if needed if (styled_text_ctrl_sql->CallTipActive() && (c1==')' || c2==')') && q == styled_text_ctrl_sql->CallTipPosAtStart() - 1) { styled_text_ctrl_sql->CallTipCancel(); } } else styled_text_ctrl_sql->BraceBadLight(wxSTC_INVALID_POSITION); // remove light } //----------------------------------------------------------------------------- //! returns true if there is a word in "wordlist" that starts with "word" bool HasWord(wxString word, wxString& wordlist) { word.MakeUpper(); wxStringTokenizer tkz(wordlist, wxT(" ")); while (tkz.HasMoreTokens()) { if (tkz.GetNextToken().Upper().StartsWith(word)) return true; } return false; } //----------------------------------------------------------------------------- //! autocomplete stuff void ExecuteSqlFrame::OnSqlEditCharAdded(wxStyledTextEvent& event) { int pos = styled_text_ctrl_sql->GetCurrentPos(); if (pos == 0) return; int c = event.GetKey(); if (c == '\n') { if (config().get(wxT("sqlEditorAutoIndent"), true)) { int lineNum = styled_text_ctrl_sql->LineFromPosition(pos - 1); int linestart = styled_text_ctrl_sql->PositionFromLine(lineNum); int indpos = styled_text_ctrl_sql->GetLineIndentPosition(lineNum); wxString indent(styled_text_ctrl_sql->GetTextRange(linestart, indpos)); int selpos = styled_text_ctrl_sql->GetSelectionStart(); styled_text_ctrl_sql->InsertText(selpos, indent); styled_text_ctrl_sql->GotoPos(selpos + indent.Length()); } } else if (c == '(') { if (config().get(wxT("SQLEditorCalltips"), true)) { int start = styled_text_ctrl_sql->WordStartPosition(pos - 2, true); if (start != -1 && start != pos - 2) { wxString word = styled_text_ctrl_sql->GetTextRange(start, pos - 1).Upper(); wxString calltip; Procedure* p = dynamic_cast(databaseM->findByNameAndType(ntProcedure, word)); if (p) calltip = p->getDefinition(); Function* f = dynamic_cast(databaseM->findByNameAndType(ntFunction, word)); if (f) calltip = f->getDefinition(); if (!calltip.empty()) { styled_text_ctrl_sql->CallTipShow(start, calltip); styled_text_ctrl_sql->CallTipSetHighlight(0, pos - 1 - start); // start, end } } } } else { if (config().get(wxT("AutocompleteEnabled"), true)) { #ifndef __WXGTK20__ bool allow = config().get(wxT("autoCompleteQuoted"), true); if (!allow) { // needed since event that updates the style happens later ::wxSafeYield(); if (styled_text_ctrl_sql->GetStyleAt(pos - 1) != 7) // not in quotes allow = true; } #else bool allow = true; // ::wxSafeYield kills the focus on gtk2 // so, until we make a parser to detect whether we're // inside quotes or not - this #ifdef stays #endif if (allow) { if (styled_text_ctrl_sql->CallTipActive()) { if (!config().get(wxT("AutoCompleteDisableWhenCalltipShown"), true)) autoComplete(false); } else autoComplete(false); } } } // join table ON __autocomplete FK relation__ if (c == 'N' && pos > 1 && 'O' == styled_text_ctrl_sql->GetCharAt(pos-2)) { // TODO: // autocomplete JOIN table t2 ON ... write FK relation automatically // IncompleteStatement is(databaseM, styled_text_ctrl_sql->GetText()); // wxString join = is.getJoin(pos); // if (!join.IsEmpty()) // add "join" to sql editor } } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnSqlEditChanged(wxStyledTextEvent& WXUNUSED(event)) { updateFrameTitleM = true; } //----------------------------------------------------------------------------- void ExecuteSqlFrame::autoCompleteColumns(int pos, int len) { int start; if (pos > 2 && styled_text_ctrl_sql->GetCharAt(pos-2) == '"') { // first we check if object name is quoted start = pos-3; while (start > -1 && styled_text_ctrl_sql->GetCharAt(start) != '"') --start; } else { // only allow chars valid for FB identifier styled_text_ctrl_sql->setChars(true); start = styled_text_ctrl_sql->WordStartPosition(pos-1, true); styled_text_ctrl_sql->setChars(false); // reset to default behavior if (start == -1) return; } wxString table = styled_text_ctrl_sql->GetTextRange(start, pos-1); IncompleteStatement is(databaseM, styled_text_ctrl_sql->GetText()); wxString columns = is.getObjectColumns(table, pos); if (columns.IsEmpty()) return; if (HasWord(styled_text_ctrl_sql->GetTextRange(pos, pos+len), columns)) styled_text_ctrl_sql->AutoCompShow(len, columns); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::autoComplete(bool force) { if (styled_text_ctrl_sql->AutoCompActive()) return; int autoCompleteChars = 1; if (!force) { autoCompleteChars = config().get(wxT("AutocompleteChars"), 3); if (autoCompleteChars <= 0) return; } int pos = styled_text_ctrl_sql->GetCurrentPos(); int start = styled_text_ctrl_sql->WordStartPosition(pos, true); if (start > 1 && styled_text_ctrl_sql->GetCharAt(start - 1) == '.') { autoCompleteColumns(start, pos-start); return; } if (start != -1 && pos - start >= autoCompleteChars) { // GTK version crashes if nothing matches, so this check must be made for GTK // For MSW, it doesn't crash but it flashes on the screen (also not very nice) if (HasWord(styled_text_ctrl_sql->GetTextRange(start, pos), keywordsM)) styled_text_ctrl_sql->AutoCompShow(pos-start, keywordsM); } } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuFindSelectedObject(wxCommandEvent& WXUNUSED(event)) { wxString sel = styled_text_ctrl_sql->GetSelectedText(); int p = sel.Find(wxT(" ")); if (p != -1) sel.Remove(p); showProperties(sel); } //----------------------------------------------------------------------------- //! handle function keys void ExecuteSqlFrame::OnKeyDown(wxKeyEvent& event) { int key = event.GetKeyCode(); if (!event.HasModifiers() && key == WXK_F3) { styled_text_ctrl_sql->find(false); return; } if (wxWindow::FindFocus() == styled_text_ctrl_sql) { if (!styled_text_ctrl_sql->AutoCompActive()) { enum { acSpace=0, acTab }; int acc = acSpace; config().getValue(wxT("AutoCompleteKey"), acc); if (acc == acSpace && event.ControlDown() && key == WXK_SPACE) { autoComplete(true); return; } // TAB completion works when there is no white space before cursor and there is no selection if (acc == acTab && key == WXK_TAB && styled_text_ctrl_sql->GetSelectionStart() == styled_text_ctrl_sql->GetSelectionEnd()) { int p = styled_text_ctrl_sql->GetCurrentPos(); if (p > 0) { int ch = styled_text_ctrl_sql->GetCharAt(p-1); if (ch != ' ' && (ch < 0x09 || ch > 0x0d)) // <- as taken from scintilla/src/Document.cxx { autoComplete(true); return; // don't Skip the event } } } } else if (key == WXK_RETURN) { if (!config().get(wxT("AutoCompleteWithEnter"), true)) styled_text_ctrl_sql->AutoCompCancel(); } } event.Skip(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnChildFocus(wxChildFocusEvent& WXUNUSED(event)) { doUpdateFocusedControlM = true; } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnIdle(wxIdleEvent& event) { if (doUpdateFocusedControlM) updateViewMode(); if (updateEditorCaretPosM) { updateEditorCaretPosM = false; int p = styled_text_ctrl_sql->GetCurrentPos(); int row = styled_text_ctrl_sql->GetCurrentLine(); int col = p - styled_text_ctrl_sql->PositionFromLine(row); statusbar_1->SetStatusText(wxString::Format(wxT("%d : %d"), row + 1, col + 1), 2); } if (updateFrameTitleM) { updateFrameTitleM = false; updateFrameTitle(); } event.Skip(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuNew(wxCommandEvent& WXUNUSED(event)) { ExecuteSqlFrame *eff = new ExecuteSqlFrame(GetParent(), -1, _("Execute SQL statements"), databaseM->shared_from_this()); eff->setSql(styled_text_ctrl_sql->GetSelectedText()); eff->Show(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuOpen(wxCommandEvent& WXUNUSED(event)) { wxFileDialog fd(this, _("Open File"), filenameM.GetPath(), filenameM.GetName(), _("SQL script files (*.sql)|*.sql|All files (*.*)|*.*"), wxFD_OPEN | wxFD_CHANGE_DIR); if (wxID_OK == fd.ShowModal()) loadSqlFile(fd.GetPath()); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuSaveOrSaveAs(wxCommandEvent& event) { wxString filename(filenameM.GetFullPath()); if (event.GetId() == wxID_SAVEAS || !filenameM.IsOk()) { wxFileDialog fd(this, _("Save File As"), filenameM.GetPath(), filenameM.GetName(), _("SQL script files (*.sql)|*.sql|All files (*.*)|*.*"), wxFD_SAVE | wxFD_CHANGE_DIR | wxFD_OVERWRITE_PROMPT); if (wxID_OK != fd.ShowModal()) return; filename = fd.GetPath(); } if (styled_text_ctrl_sql->SaveFile(filename)) { filenameM = filename; updateFrameTitleM = true; statusbar_1->SetStatusText((_("File saved")), 2); } } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuClose(wxCommandEvent& WXUNUSED(event)) { Close(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUndo(wxCommandEvent& WXUNUSED(event)) { if (viewModeM == vmEditor) styled_text_ctrl_sql->Undo(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateUndo(wxUpdateUIEvent& event) { event.Enable(viewModeM == vmEditor && styled_text_ctrl_sql->CanUndo()); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuRedo(wxCommandEvent& WXUNUSED(event)) { if (viewModeM == vmEditor) styled_text_ctrl_sql->Redo(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateRedo(wxUpdateUIEvent& event) { event.Enable(viewModeM == vmEditor && styled_text_ctrl_sql->CanRedo()); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuCopy(wxCommandEvent& WXUNUSED(event)) { if (viewModeM == vmEditor) styled_text_ctrl_sql->Copy(); else if (viewModeM == vmGrid) grid_data->copyToClipboard(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateCopy(wxUpdateUIEvent& event) { bool enableCmd = false; if (viewModeM == vmEditor) enableCmd = styled_text_ctrl_sql->hasSelection(); else if (viewModeM == vmGrid) enableCmd = grid_data->getDataGridTable() && grid_data->GetNumberRows(); event.Enable(enableCmd); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuCut(wxCommandEvent& WXUNUSED(event)) { if (viewModeM == vmEditor) styled_text_ctrl_sql->Cut(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateCut(wxUpdateUIEvent& event) { event.Enable(viewModeM == vmEditor && styled_text_ctrl_sql->hasSelection()); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuDelete(wxCommandEvent& WXUNUSED(event)) { if (viewModeM == vmEditor) styled_text_ctrl_sql->Clear(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateDelete(wxUpdateUIEvent& event) { event.Enable(viewModeM == vmEditor && styled_text_ctrl_sql->hasSelection()); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuPaste(wxCommandEvent& WXUNUSED(event)) { if (viewModeM == vmEditor) styled_text_ctrl_sql->Paste(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdatePaste(wxUpdateUIEvent& event) { event.Enable(viewModeM == vmEditor && styled_text_ctrl_sql->CanPaste()); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuSelectAll(wxCommandEvent& WXUNUSED(event)) { if (viewModeM == vmEditor) styled_text_ctrl_sql->SelectAll(); else if (viewModeM == vmLogCtrl) styled_text_ctrl_stats->SelectAll(); else if (viewModeM == vmGrid) grid_data->SelectAll(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuReplace(wxCommandEvent &WXUNUSED(event)) { styled_text_ctrl_sql->find(true); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateWhenInTransaction(wxUpdateUIEvent& event) { event.Enable(inTransactionM && !grid_data->IsCellEditControlEnabled()); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuSelectView(wxCommandEvent& event) { if (event.GetId() == Cmds::View_Editor) setViewMode(vmEditor); else if (event.GetId() == Cmds::View_Statistics) setViewMode(vmLogCtrl); else if (event.GetId() == Cmds::View_Data) setViewMode(vmGrid); else wxCHECK_RET(false, wxT("event id not handled")); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateSelectView(wxUpdateUIEvent& event) { if (event.GetId() == Cmds::View_Editor && viewModeM == vmEditor) event.Check(true); else if (event.GetId() == Cmds::View_Statistics && viewModeM == vmLogCtrl) event.Check(true); else if (event.GetId() == Cmds::View_Data && viewModeM == vmGrid) event.Check(true); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuSplitView(wxCommandEvent& WXUNUSED(event)) { setViewMode(!splitter_window_1->IsSplit(), viewModeM); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateSplitView(wxUpdateUIEvent& event) { event.Check(splitter_window_1->IsSplit()); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuSetEditorFont(wxCommandEvent& WXUNUSED(event)) { styled_text_ctrl_sql->setFont(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuToggleWrap(wxCommandEvent& WXUNUSED(event)) { const int mode = styled_text_ctrl_sql->GetWrapMode(); styled_text_ctrl_sql->SetWrapMode( (mode == wxSTC_WRAP_WORD) ? wxSTC_WRAP_NONE : wxSTC_WRAP_WORD); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuHistoryNext(wxCommandEvent& WXUNUSED(event)) { StatementHistory& sh = StatementHistory::get(databaseM); if (historyPositionM != sh.size()) // we're already at the end? { historyPositionM++; if (historyPositionM == sh.size()) setSql(localBuffer); else setSql(sh.get(historyPositionM)); } } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuHistoryPrev(wxCommandEvent& WXUNUSED(event)) { StatementHistory& sh = StatementHistory::get(databaseM); if (historyPositionM > 0 && sh.size() > 0) { if (historyPositionM == sh.size()) // we're on local buffer => store it localBuffer = styled_text_ctrl_sql->GetText(); historyPositionM--; setSql(sh.get(historyPositionM)); } } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuHistorySearch(wxCommandEvent& WXUNUSED(event)) { StatementHistory& sh = StatementHistory::get(databaseM); StatementHistoryDialog *shf = new StatementHistoryDialog(this, &sh); if (shf->ShowModal() == wxID_OK) setSql(shf->getSql()); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateHistoryNext(wxUpdateUIEvent& event) { StatementHistory& sh = StatementHistory::get(databaseM); event.Enable(sh.size() > historyPositionM); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateHistoryPrev(wxUpdateUIEvent& event) { StatementHistory& sh = StatementHistory::get(databaseM); event.Enable(historyPositionM > 0 && sh.size() > 0); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuExecute(wxCommandEvent& WXUNUSED(event)) { clearLogBeforeExecution(); prepareAndExecute(false); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuShowPlan(wxCommandEvent& WXUNUSED(event)) { prepareAndExecute(true); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuExecuteFromCursor(wxCommandEvent& WXUNUSED(event)) { clearLogBeforeExecution(); wxString sql( styled_text_ctrl_sql->GetTextRange( styled_text_ctrl_sql->GetCurrentPos(), styled_text_ctrl_sql->GetLength() ) ); parseStatements(sql, false, false, styled_text_ctrl_sql->GetCurrentPos()); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuExecuteSelection(wxCommandEvent& WXUNUSED(event)) { clearLogBeforeExecution(); if (config().get(wxT("TreatAsSingleStatement"), false)) execute(styled_text_ctrl_sql->GetSelectedText(), wxT(";")); else parseStatements(styled_text_ctrl_sql->GetSelectedText(), false, false, styled_text_ctrl_sql->GetSelectionStart() ); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuGridFetchAll(wxCommandEvent& WXUNUSED(event)) { grid_data->fetchAll(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuGridCancelFetchAll(wxCommandEvent& WXUNUSED(event)) { grid_data->cancelFetchAll(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateGridCellIsBlob(wxUpdateUIEvent& event) { DataGridTable* dgt = grid_data->getDataGridTable(); event.Enable(dgt && grid_data->GetNumberRows() && dgt->isBlobColumn(grid_data->GetGridCursorCol())); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::closeBlobEditor(bool saveBlobValue) { if ((editBlobDlgM) && (editBlobDlgM->IsShown())) { if (saveBlobValue) editBlobDlgM->Close(); else editBlobDlgM->closeDontSave(); } } //----------------------------------------------------------------------------- void ExecuteSqlFrame::updateBlobEditor() { DataGridTable* dgt = grid_data->getDataGridTable(); if (!dgt || !grid_data->GetNumberRows()) return; unsigned row = grid_data->GetGridCursorRow(); unsigned col = grid_data->GetGridCursorCol(); if (!editBlobDlgM->IsShown()) { editBlobDlgM->Show(); editBlobDlgM->Update(); } editBlobDlgM->setBlob(grid_data, dgt, &statementM, row, col); SetFocus(); grid_data->SetFocus(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuGridEditBlob(wxCommandEvent& WXUNUSED(event)) { if (!editBlobDlgM) { editBlobDlgM = new EditBlobDialog(this); } updateBlobEditor(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuGridExportBlob(wxCommandEvent& WXUNUSED(event)) { DataGridTable* dgt = grid_data->getDataGridTable(); if (!dgt || !grid_data->GetNumberRows()) return; if (!dgt->isBlobColumn(grid_data->GetGridCursorCol())) throw FRError(_("Not a BLOB column")); wxString filename = ::wxFileSelector(_("Select a file"), wxT(""), wxT(""), wxT(""), wxT("*"), wxFD_SAVE | wxFD_OVERWRITE_PROMPT, this); if (filename.IsEmpty()) return; ProgressDialog pd(this, _("Saving BLOB to file")); pd.doShow(); dgt->exportBlobFile(filename, grid_data->GetGridCursorRow(), grid_data->GetGridCursorCol(), &pd); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuGridImportBlob(wxCommandEvent& WXUNUSED(event)) { DataGridTable* dgt = grid_data->getDataGridTable(); if (!dgt || !grid_data->GetNumberRows()) return; if (!dgt->isBlobColumn(grid_data->GetGridCursorCol())) throw FRError(_("Not a BLOB column")); wxString filename = ::wxFileSelector(_("Select a file"), wxT(""), wxT(""), wxT(""), wxT("*"), wxFD_OPEN | wxFD_FILE_MUST_EXIST, this); if (filename.IsEmpty()) return; ProgressDialog pd(this, _("Importing BLOB from file")); pd.doShow(); dgt->importBlobFile(filename, grid_data->GetGridCursorRow(), grid_data->GetGridCursorCol(), &pd); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuGridInsertRow(wxCommandEvent& WXUNUSED(event)) { DataGridTable *tb = grid_data->getDataGridTable(); if (tb && grid_data->GetNumberCols()) { wxArrayString tables; tb->getTableNames(tables); wxString tab; if (tables.GetCount() == 0) throw FRError(_("No valid tables found.")); if (tables.GetCount() == 1) tab = tables[0]; else { // show list of tables for user to select into which one to insert tab = wxGetSingleChoice(_("Select a table"), _("Multiple tables found"), tables, this); if (tab.IsEmpty()) return; } // show dialog to enter values InsertDialog* id = new InsertDialog(this, tab, tb, statementM, databaseM); id->Show(); Disable(); } } //----------------------------------------------------------------------------- // this returns an array of row numbers of fully selected rows, or the number // of the active row wxArrayInt getSelectedGridRows(DataGrid* grid) { wxArrayInt rows; if (grid) { // add fully selected rows rows = grid->GetSelectedRows(); // add rows in selection blocks that span all columns wxGridCellCoordsArray tlCells(grid->GetSelectionBlockTopLeft()); wxGridCellCoordsArray brCells(grid->GetSelectionBlockBottomRight()); wxASSERT(tlCells.GetCount() == brCells.GetCount()); for (size_t i = 0; i < tlCells.GetCount(); ++i) { wxGridCellCoords tl = tlCells[i]; wxGridCellCoords br = brCells[i]; if (tl.GetCol() == 0 && br.GetCol() == grid->GetNumberCols() - 1) { size_t len = br.GetRow() - tl.GetRow() + 1; size_t first = rows.GetCount(); rows.SetCount(first + len); for (size_t j = 0; j < len; ++j) rows[first + j] = tl.GetRow() + j; } } // add the row of the active cell if nothing else is selected if (!rows.GetCount()) rows.Add(grid->GetGridCursorRow()); } return rows; } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuGridDeleteRow(wxCommandEvent& WXUNUSED(event)) { if (!grid_data->getDataGridTable() || !grid_data->GetNumberRows()) return; // M.B. when this is enabled the grid behaves strange on GTK2 (wx2.8.6) // when deleting multiple items. I didn't test other platforms // grid_data->BeginBatch(); wxArrayInt rows(getSelectedGridRows(grid_data)); size_t count = rows.GetCount(); if (count > 1) { bool agreed = wxOK == showQuestionDialog(this, _("Do you really want to delete multiple rows?"), wxString::Format(_("You have more than one row selected. Are you sure you wish to delete all %d selected rows?"), count), AdvancedMessageDialogButtonsOkCancel(_("Delete"))); if (!agreed) return; } // Since we are not really removing the rows (only changing the color) // we can go from first to last. If we decide to revert to old code // we should go from last to first. for (size_t i = 0; i < rows.GetCount(); i++) { if (grid_data->DeleteRows(rows[i], 1)) grid_data->DeselectRow(rows[i]); else break; } // grid_data->EndBatch(); // see comment for BeginBatch above } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuGridSetFieldToNULL(wxCommandEvent& WXUNUSED(event)) { DataGridTable* dgt = grid_data->getDataGridTable(); if (!dgt) return; // get selection into array (cells) wxGridCellCoordsArray cells = grid_data->getSelectedCells(); int count = cells.size(); if (count == 0) { wxGridCellCoords curCell(grid_data->GetGridCursorRow(), grid_data->GetGridCursorCol()); cells.push_back(curCell); } if (count > 1) { bool agreed = wxOK == showQuestionDialog(this, _("Do you really want to set multiple fields to NULL?"), wxString::Format(_("You have more than one data field selected. Are you sure you wish to set all %d selected fields to NULL?"), count), AdvancedMessageDialogButtonsOkCancel(_("Set to NULL"))); if (!agreed) return; } // check, if a selected column is readonly // -> prepare - get distinct list of columns std::set colsReadonly; for (int i = 0; i < count; i++) colsReadonly.insert(cells[i].GetCol()); // -> remove all fiels that are nullable and not readonly std::set::iterator col; for (col = colsReadonly.begin(); col != colsReadonly.end();) { if (!dgt->isReadonlyColumn(*col) && dgt->isNullableColumn(*col)) colsReadonly.erase(col++); else ++col; } // generate a string for message with column names wxString colNames = wxEmptyString; for (col = colsReadonly.begin(); col != colsReadonly.end(); col++) { if (colNames != wxEmptyString) colNames += wxT(", "); colNames += dgt->GetColLabelValue(*col); } // -> if colNames != "" the user has readonly columns selected // -> we will inform him if (colNames != wxEmptyString) { showQuestionDialog(this, _("You have read-only or not nullable fields selected!"), wxString::Format(_("The following fields are read-only or not nullable:\n%s\n\nThey can not be set to NULL!"), colNames.c_str()), AdvancedMessageDialogButtonsOk()); } // set fields to NULL for (int i = 0; i < count; i++) { int row = cells[i].GetRow(); int col = cells[i].GetCol(); // do not set to null if field is not nullable or readonly if (colsReadonly.find(col) != colsReadonly.end()) continue; dgt->setValueToNull(row, col); // if visible, update BLOB editor if (editBlobDlgM && editBlobDlgM->IsShown() && grid_data->GetCursorColumn() == col && grid_data->GetCursorRow() == row) { editBlobDlgM->setBlob(grid_data, dgt, &statementM, row, col, false); } } // fields that change from NOT NULL to NULL need to update the text color grid_data->refreshAndInvalidateAttributes(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuGridCopyAsInsert(wxCommandEvent& WXUNUSED(event)) { grid_data->copyToClipboardAsInsert(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuGridCopyAsInList(wxCommandEvent& WXUNUSED(event)) { grid_data->copyToClipboardAsInList(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuGridCopyAsUpdate(wxCommandEvent& WXUNUSED(event)) { grid_data->copyToClipboardAsUpdate(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuGridSaveAsHtml(wxCommandEvent& WXUNUSED(event)) { grid_data->saveAsHTML(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuGridSaveAsCsv(wxCommandEvent& WXUNUSED(event)) { CodeTemplateProcessor ctp(0, this); wxString code; ctp.processTemplateFile(code, config().getSysTemplateFileName(wxT("save_as_csv")), 0); wxString fileName; if (!ctp.getConfig().getValue(wxT("CSVExportFileName"), fileName)) return; int i; if (!ctp.getConfig().getValue(wxT("CSVFieldDelimiter"), i)) return; static const wxChar fieldDelimiters[] = { '\t', ',', ';' }; if (i < 0 || i >= sizeof(fieldDelimiters) / sizeof(wxChar)) return; wxChar fieldDelimiter(fieldDelimiters[i]); if (!ctp.getConfig().getValue(wxT("CSVTextDelimiter"), i)) return; static const wxChar textDelimiters[] = { '\0', '"', '\'' }; if (i < 0 || i >= sizeof(textDelimiters) / sizeof(wxChar)) return; wxChar textDelimiter(textDelimiters[i]); grid_data->saveAsCSV(fileName, fieldDelimiter, textDelimiter); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuGridGridHeaderFont(wxCommandEvent& WXUNUSED(event)) { grid_data->setHeaderFont(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuGridGridCellFont(wxCommandEvent& WXUNUSED(event)) { grid_data->setCellFont(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateGridHasSelection(wxUpdateUIEvent& event) { event.Enable(grid_data->IsSelection()); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateGridFetchAll(wxUpdateUIEvent& event) { DataGridTable* table = grid_data->getDataGridTable(); event.Enable(table && table->canFetchMoreRows() && !table->getFetchAllRows()); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateGridCancelFetchAll(wxUpdateUIEvent& event) { DataGridTable* table = grid_data->getDataGridTable(); event.Enable(table && table->canFetchMoreRows() && table->getFetchAllRows()); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateGridCanSetFieldToNULL(wxUpdateUIEvent& event) { if (DataGridTable* dgt = grid_data->getDataGridTable()) { std::vector selCols(grid_data->getColumnsWithSelectedCells()); for (size_t i = 0; i < selCols.size(); i++) { if (selCols[i] && !dgt->isReadonlyColumn(i)) { event.Enable(true); return; } } if (!dgt->isReadonlyColumn(grid_data->GetGridCursorRow())) { event.Enable(true); return; } } event.Enable(false); } //----------------------------------------------------------------------------- bool ExecuteSqlFrame::loadSqlFile(const wxString& filename) { if (!styled_text_ctrl_sql->LoadFile(filename)) return false; filenameM = filename; updateFrameTitleM = true; return true; } //----------------------------------------------------------------------------- //! enable/disable and show/hide controls depending of transaction status void ExecuteSqlFrame::inTransaction(bool started) { inTransactionM = started; splitScreen(); if (started) statusbar_1->SetStatusText(_("Transaction started"), 3); else { grid_data->ClearGrid(); statusbar_1->SetStatusText(wxEmptyString, 1); } } //----------------------------------------------------------------------------- void ExecuteSqlFrame::setSql(wxString sql) { styled_text_ctrl_sql->SetText(sql); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::clearLogBeforeExecution() { if (config().get(wxT("SQLEditorExecuteClears"), false)) styled_text_ctrl_stats->ClearAll(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::prepareAndExecute(bool prepareOnly) { bool hasSelection = styled_text_ctrl_sql->GetSelectionStart() != styled_text_ctrl_sql->GetSelectionEnd(); bool ok; if (hasSelection && config().get(wxT("OnlyExecuteSelected"), false)) { if (config().get(wxT("TreatAsSingleStatement"), false)) { ok = execute(styled_text_ctrl_sql->GetSelectedText(), wxT(";"), prepareOnly); } else { ok = parseStatements(styled_text_ctrl_sql->GetSelectedText(), false, prepareOnly, styled_text_ctrl_sql->GetSelectionStart()); } } else { ok = parseStatements(styled_text_ctrl_sql->GetText(), false, prepareOnly); } if (ok || config().get(wxT("historyStoreUnsuccessful"), true)) { // add to history StatementHistory& sh = StatementHistory::get(databaseM); sh.add(styled_text_ctrl_sql->GetText()); historyPositionM = sh.size(); } if (!inTransactionM) setViewMode(false, vmEditor); } //----------------------------------------------------------------------------- //! adapted so we don't have to change all the other code that utilizes SQL editor void ExecuteSqlFrame::executeAllStatements(bool closeWhenDone) { clearLogBeforeExecution(); bool ok = parseStatements(styled_text_ctrl_sql->GetText(), closeWhenDone); if (config().get(wxT("historyStoreGenerated"), true) && (ok || config().get(wxT("historyStoreUnsuccessful"), true))) { // add buffer to history StatementHistory& sh = StatementHistory::get(databaseM); sh.add(styled_text_ctrl_sql->GetText()); historyPositionM = sh.size(); } if (closeWhenDone && autoCommitM && !inTransactionM) Close(); } //----------------------------------------------------------------------------- //! Parses all sql statements in STC //! when autoexecute is TRUE, program just waits user to click Commit/Rollback and closes window //! when autocommit DDL is also set then frame is closed at once if commit was successful bool ExecuteSqlFrame::parseStatements(const wxString& statements, bool closeWhenDone, bool prepareOnly, int selectionOffset) { wxBusyCursor cr; MultiStatement ms(statements); while (true) { SingleStatement ss = ms.getNextStatement(); if (!ss.isValid()) break; wxString newTerminator, autoDDLSetting; if (ss.isCommitStatement()) { if (!commitTransaction()) return false; } else if (ss.isRollbackStatement()) rollbackTransaction(); else if (ss.isSetTermStatement(newTerminator)) { if (newTerminator.empty()) { ::wxMessageBox(_("SET TERM command found without terminator.\nStopping further execution."), _("Warning"), wxOK | wxICON_WARNING); return false; } } else if (ss.isSetAutoDDLStatement(autoDDLSetting)) { if (autoDDLSetting.CmpNoCase(wxT("ON")) == 0) autoCommitM = true; else if (autoDDLSetting.CmpNoCase(wxT("OFF")) == 0) autoCommitM = false; else if (autoDDLSetting.empty()) autoCommitM = !autoCommitM; else { ::wxMessageBox(_("SET AUTODDL command found with invalid parameter (has to be \"ON\" or \"OFF\").\nStopping further execution."), _("Warning"), wxOK | wxICON_WARNING); return false; } } else if (ss.getSql().length() && !execute(ss.getSql(), ms.getTerminator(), prepareOnly)) { int stmtStart = selectionOffset + ms.getStart(); #if wxUSE_UNICODE // STC uses UTF-8 internally in Unicode build // account for possible differences in string length // if system charset != UTF-8 std::string stmt(wx2std(ss.getSql(), &wxConvUTF8)); int stmtEnd = stmtStart + stmt.size(); #else int stmtEnd = selectionOffset + ms.getEnd(); #endif styled_text_ctrl_sql->markText(stmtStart, stmtEnd); styled_text_ctrl_sql->SetFocus(); return false; } } if (closeWhenDone) { closeWhenTransactionDoneM = true; // TODO: HOWTO focus toolbar button? button_commit->SetFocus(); } ScrollAtEnd sae(styled_text_ctrl_stats); log(_("Script execution finished.")); return true; } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateWhenExecutePossible(wxUpdateUIEvent& event) { event.Enable(!closeWhenTransactionDoneM); } //----------------------------------------------------------------------------- wxString IBPPtype2string(Database *db, IBPP::SDT t, int subtype, int size, int scale) { if (scale > 0) return wxString::Format(wxT("NUMERIC(%d,%d)"), size==4 ? 9:18, scale); if (t == IBPP::sdString) { int bpc = db->getCharsetById(subtype).getBytesPerChar(); return wxString::Format(wxT("STRING(%d)"), bpc ? size/bpc : size); } switch (t) { case IBPP::sdArray: return wxT("ARRAY"); case IBPP::sdBlob: return wxString::Format( wxT("BLOB SUB_TYPE %d"), subtype); case IBPP::sdDate: return wxT("DATE"); case IBPP::sdTime: return wxT("TIME"); case IBPP::sdTimestamp: return wxT("TIMESTAMP"); case IBPP::sdSmallint: return wxT("SMALLINT"); case IBPP::sdInteger: return wxT("INTEGER"); case IBPP::sdLargeint: return wxT("BIGINT"); case IBPP::sdFloat: return wxT("FLOAT"); case IBPP::sdDouble: return wxT("DOUBLE PRECISION"); default: return wxT("UNKNOWN"); } } //----------------------------------------------------------------------------- void ExecuteSqlFrame::compareCounts(IBPP::DatabaseCounts& one, IBPP::DatabaseCounts& two) { for (IBPP::DatabaseCounts::iterator it = two.begin(); it != two.end(); ++it) { wxString s; IBPP::DatabaseCounts::iterator i2 = one.find((*it).first); IBPP::CountInfo c; IBPP::CountInfo& r1 = (*it).second; IBPP::CountInfo& r2 = c; if (i2 != one.end()) r2 = (*i2).second; if (r1.inserts > r2.inserts) s += wxString::Format(_("%d inserts. "), r1.inserts - r2.inserts); if (r1.updates > r2.updates) s += wxString::Format(_("%d updates. "), r1.updates - r2.updates); if (r1.deletes > r2.deletes) s += wxString::Format(_("%d deletes. "), r1.deletes - r2.deletes); if (!s.IsEmpty()) { wxString relName; try { IBPP::Statement st = IBPP::StatementFactory( databaseM->getIBPPDatabase(), transactionM); st->Prepare( "select rdb$relation_name " "from rdb$relations where rdb$relation_id = ?"); st->Set(1, (*it).first); st->Execute(); if (st->Fetch()) { std::string s; st->Get(1, s); relName = std2wxIdentifier(s, databaseM->getCharsetConverter()); } } catch (...) { } if (relName.IsEmpty()) relName.Format(_("Relation #%d"), (*it).first); log(relName + wxT(": ") + s, ttSql); } } } //----------------------------------------------------------------------------- wxString millisToTimeString(long millis) { if (millis >= 60 * 1000) { // round to nearest second by adding 500 millis before truncating millis += 500; int hh = millis / (60 * 60 * 1000); millis -= 60 * 60 * 1000 * hh; int mm = millis / (60 * 1000); millis -= 60 * 1000 * mm; int ss = millis / 1000; return wxString::Format(wxT("%d:%.2d:%.2d (hh:mm:ss)"), hh, mm, ss); } else return wxString::Format(wxT("%.3fs"), 0.001 * millis); } //----------------------------------------------------------------------------- bool ExecuteSqlFrame::execute(wxString sql, const wxString& terminator, bool prepareOnly) { ScrollAtEnd sae(styled_text_ctrl_stats); // check if sql only contains comments SqlTokenizer tk(sql); bool hasStatements = false; do { SqlTokenType stt = tk.getCurrentToken(); if (stt != tkWHITESPACE && stt != tkCOMMENT && stt != tkEOF) { hasStatements = true; break; } } while (tk.nextToken()); if (!hasStatements) { log(_("Parsed query: " + sql), ttSql); log(_("Empty statement detected, bailing out...")); return true; } if (styled_text_ctrl_sql->AutoCompActive()) styled_text_ctrl_sql->AutoCompCancel(); // remove the list if needed notebook_1->SetSelection(0); wxStopWatch swTotal; bool retval = true; try { if (transactionM == 0 || !transactionM->Started()) { log(_("Starting transaction...")); // fix the IBPP::LogicException "No Database is attached." // which happens after a database reconnect // (this action detaches the database from all its transactions) if (transactionM != 0 && !transactionM->Started()) { try { transactionM->Start(); } catch (IBPP::LogicException&) { transactionM = 0; } } if (transactionM == 0) { transactionM = IBPP::TransactionFactory( databaseM->getIBPPDatabase(), transactionAccessModeM, transactionIsolationLevelM, transactionLockResolutionM); } transactionM->Start(); inTransaction(true); grid_data->EnableEditing(transactionAccessModeM == IBPP::amWrite); } int fetch1 = 0, mark1 = 0, read1 = 0, write1 = 0, ins1 = 0, upd1 = 0, del1 = 0, ridx1 = 0, rseq1 = 0, mem1 = 0; int fetch2, mark2, read2, write2, ins2, upd2, del2, ridx2, rseq2, mem2; IBPP::DatabaseCounts counts1, counts2; bool doShowStats = config().get(wxT("SQLEditorShowStats"), true); if (!prepareOnly && doShowStats) { databaseM->getIBPPDatabase()-> Statistics(&fetch1, &mark1, &read1, &write1, &mem1); databaseM->getIBPPDatabase()-> Counts(&ins1, &upd1, &del1, &ridx1, &rseq1); databaseM->getIBPPDatabase()->DetailedCounts(counts1); } grid_data->ClearGrid(); // statement object will be invalidated, so clear the grid statementM = IBPP::StatementFactory(databaseM->getIBPPDatabase(), transactionM); log(_("Preparing statement: " + sql), ttSql); sae.scroll(); { wxStopWatch sw; statementM->Prepare(wx2std(sql, databaseM->getCharsetConverter())); log(wxString::Format(_("Statement prepared (elapsed time: %s)."), millisToTimeString(sw.Time()).c_str())); } // we don't check IBPP::Select since Firebird 2.0 has a new feature // INSERT ... RETURNING which isn't detected as stSelect by IBPP bool hasColumns = false; try { int cols = statementM->Columns(); hasColumns = cols > 0; if (doShowStats) { for (int i = 1; i <= cols; i++) { wxString tablename(std2wxIdentifier(statementM->ColumnTable(i), databaseM->getCharsetConverter())); wxString colname(std2wxIdentifier(statementM->ColumnName(i), databaseM->getCharsetConverter())); wxString aliasname(std2wxIdentifier(statementM->ColumnAlias(i), databaseM->getCharsetConverter())); log(wxString::Format(_("Field #%02d: %s.%s Alias:%s Type:%s"), i, tablename.c_str(), colname.c_str(), aliasname.c_str(), IBPPtype2string( databaseM, statementM->ColumnType(i), statementM->ColumnSubtype(i), statementM->ColumnSize(i), statementM->ColumnScale(i)).c_str() ), ttSql); } } } catch(IBPP::Exception&) // reading column info might fail, { // but we still want to show the plan } // so we have separate exception handlers // for some statements (DDL) it is never available // for INSERTs, it is available sometimes (insert into ... select ... ) // but if it not, IBPP throws an exception try { std::string plan; statementM->Plan(plan); log(std2wx(plan, databaseM->getCharsetConverter())); } catch(IBPP::Exception&) { log(_("Plan not available.")); } if (prepareOnly) return true; log(wxEmptyString); log(wxEmptyString); log(_("Executing statement...")); sae.scroll(); { wxStopWatch sw; statementM->Execute(); log(wxString::Format(_("Statement executed (elapsed time: %s)."), millisToTimeString(sw.Time()).c_str())); } IBPP::STT type = statementM->Type(); if (hasColumns) // for select statements: show data { grid_data->fetchData(transactionAccessModeM == IBPP::amRead); setViewMode(vmGrid); } if (doShowStats) { databaseM->getIBPPDatabase()->Statistics( &fetch2, &mark2, &read2, &write2, &mem2); databaseM->getIBPPDatabase()-> Counts(&ins2, &upd2, &del2, &ridx2, &rseq2); log(wxString::Format( _("%d fetches, %d marks, %d reads, %d writes."), fetch2-fetch1, mark2-mark1, read2-read1, write2-write1)); log(wxString::Format( _("%d inserts, %d updates, %d deletes, %d index, %d seq."), ins2-ins1, upd2-upd1, del2-del1, ridx2-ridx1, rseq2-rseq1)); log(wxString::Format(_("Delta memory: %d bytes."), mem2-mem1)); databaseM->getIBPPDatabase()->DetailedCounts(counts2); compareCounts(counts1, counts2); } if (type != IBPP::stSelect) // for other statements: show rows affected { // left trim wxString::size_type p = sql.find_first_not_of(wxT(" \n\t\r")); if (p != wxString::npos && p > 0) sql.erase(0, p); if (type == IBPP::stInsert || type == IBPP::stDelete || type == IBPP::stExecProcedure || type == IBPP::stUpdate) { // INSERT INTO..RETURNING and EXECUTE PROCEDURE may throw // when they return a single record try { wxString addon; if (statementM->AffectedRows() % 10 != 1) addon = wxT("s"); wxString s = wxString::Format(_("%d row%s affected directly."), statementM->AffectedRows(), addon.c_str()); log(wxT("") + s); statusbar_1->SetStatusText(s, 1); } catch (IBPP::Exception&) { } } SqlStatement stm(sql, databaseM, terminator); if (stm.isDDL()) type = IBPP::stDDL; executedStatementsM.push_back(stm); setViewMode(vmEditor); if (type == IBPP::stDDL && autoCommitM) { if (!commitTransaction()) retval = false; } } } catch(IBPP::Exception& e) { splitScreen(); wxString msg(std2wx(e.ErrorMessage(), databaseM->getCharsetConverter())); log(_("Error: ") + msg + wxT("\n"), ttError); retval = false; } catch (std::exception& e) { splitScreen(); log(_("Error: ") + std2wx(e.what()) + wxT("\n"), ttError); retval = false; } catch (...) { splitScreen(); log(_("SYSTEM ERROR!"), ttError); retval = false; } log(wxString::Format(_("Total execution time: %s"), millisToTimeString(swTotal.Time()).c_str())); return retval; } //----------------------------------------------------------------------------- void ExecuteSqlFrame::splitScreen() { if (!splitter_window_1->IsSplit()) // split screen if needed { splitter_window_1->SplitHorizontally(styled_text_ctrl_sql, notebook_1); ::wxYield(); } } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuTransactionIsolationLevel(wxCommandEvent& event) { if (event.GetId() == Cmds::Query_TransactionConcurrency) transactionIsolationLevelM = IBPP::ilConcurrency; else if (event.GetId() == Cmds::Query_TransactionConsistency) transactionIsolationLevelM = IBPP::ilConsistency; else if (event.GetId() == Cmds::Query_TransactionReadCommitted) transactionIsolationLevelM = IBPP::ilReadCommitted; else if (event.GetId() == Cmds::Query_TransactionReadDirty) transactionIsolationLevelM = IBPP::ilReadDirty; wxCHECK_RET(transactionM == 0 || !transactionM->Started(), wxT("Can't change transaction isolation level while started")); transactionM = 0; } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateTransactionIsolationLevel( wxUpdateUIEvent& event) { event.Enable(transactionM == 0 || !transactionM->Started()); if (event.GetId() == Cmds::Query_TransactionConcurrency) event.Check(transactionIsolationLevelM == IBPP::ilConcurrency); else if (event.GetId() == Cmds::Query_TransactionConsistency) event.Check(transactionIsolationLevelM == IBPP::ilConsistency); else if (event.GetId() == Cmds::Query_TransactionReadCommitted) event.Check(transactionIsolationLevelM == IBPP::ilReadCommitted); else if (event.GetId() == Cmds::Query_TransactionReadDirty) event.Check(transactionIsolationLevelM == IBPP::ilReadDirty); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuTransactionLockResolution(wxCommandEvent& event) { transactionLockResolutionM = event.IsChecked() ? IBPP::lrWait : IBPP::lrNoWait; wxCHECK_RET(transactionM == 0 || !transactionM->Started(), wxT("Can't change transaction lock resolution while started")); transactionM = 0; } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateTransactionLockResolution( wxUpdateUIEvent& event) { event.Enable(transactionM == 0 || !transactionM->Started()); event.Check(transactionLockResolutionM == IBPP::lrWait); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuTransactionReadOnly(wxCommandEvent& event) { transactionAccessModeM = event.IsChecked() ? IBPP::amRead : IBPP::amWrite; wxCHECK_RET(transactionM == 0 || !transactionM->Started(), wxT("Can't change transaction access mode while started")); transactionM = 0; } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateTransactionReadOnly(wxUpdateUIEvent& event) { event.Enable(transactionM == 0 || !transactionM->Started()); event.Check(transactionAccessModeM == IBPP::amRead); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuCommit(wxCommandEvent& WXUNUSED(event)) { // we need this because sometimes, somehow, Close() which is called in // commitTransaction() can destroy the object (at least, with wxGTK 2.8.8) // before closeWhenTransactionDoneM is checked and if the dummy memory // location returns false, we have a crash bool doClose = closeWhenTransactionDoneM; if (commitTransaction() && !doClose) setViewMode(false, vmEditor); } //----------------------------------------------------------------------------- bool ExecuteSqlFrame::commitTransaction() { if (transactionM == 0 || !transactionM->Started()) // check { inTransaction(false); return true; // nothing to commit, but it wasn't error } closeBlobEditor(true); wxBusyCursor cr; ScrollAtEnd sae(styled_text_ctrl_stats); try { log(_("Commiting transaction...")); sae.scroll(); { wxStopWatch sw; statementM->Close(); transactionM->Commit(); log(wxString::Format(_("Transaction committed (elapsed time: %s)."), millisToTimeString(sw.Time()).c_str())); } statusbar_1->SetStatusText(_("Transaction commited"), 3); inTransaction(false); SubjectLocker locker(databaseM); // log statements, done before parsing in case parsing crashes FR if (menuBarM->IsChecked(Cmds::History_EnableLogging)) { for (std::vector::const_iterator it = executedStatementsM.begin(); it != executedStatementsM.end(); ++it) { if (!Logger::logStatement(*it, databaseM)) break; } } // parse all successfully executed statements for (std::vector::const_iterator it = executedStatementsM.begin(); it != executedStatementsM.end(); ++it) { databaseM->parseCommitedSql(*it); } // possible future version (see database.cpp file for details: ONLY IF FIRST solution is used from database.cpp) //for (std::vector::const_iterator it = executedStatementsM.begin(); it != executedStatementsM.end(); ++it) // databaseM->addCommitedSql(*it); //databaseM->parseAll(); executedStatementsM.clear(); // workaround for STC bug with 100% CPU load during Idle(), // it was supposed to be fixed in wxWidgets versions 2.5.4 and later, // but it looks like it is not (at least for gtk1) styled_text_ctrl_stats->SetWrapMode(wxSTC_WRAP_WORD); if (closeWhenTransactionDoneM) { sae.cancel(); Close(); return true; } } catch (IBPP::Exception &e) { splitScreen(); log(std2wx(e.ErrorMessage(), databaseM->getCharsetConverter()), ttError); return false; } catch (std::exception &se) { splitScreen(); log(wxString(_("ERROR!\n")) + std2wx(se.what()), ttError); return false; } notebook_1->SetSelection(0); // apparently is has to be at the end to have any effect setViewMode(vmEditor); return true; } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuRollback(wxCommandEvent& WXUNUSED(event)) { wxBusyCursor cr; // see comments for OnMenuCommit to learn why this temp. variable is needed bool closeIt = closeWhenTransactionDoneM; if (rollbackTransaction() && !closeIt) setViewMode(false, vmEditor); } //----------------------------------------------------------------------------- bool ExecuteSqlFrame::rollbackTransaction() { if (transactionM == 0 || !transactionM->Started()) // check { executedStatementsM.clear(); inTransaction(false); return true; } closeBlobEditor(false); ScrollAtEnd sae(styled_text_ctrl_stats); try { log(_("Rolling back the transaction...")); sae.scroll(); { wxStopWatch sw; statementM->Close(); transactionM->Rollback(); log(wxString::Format(_("Transaction rolled back (elapsed time: %s)."), millisToTimeString(sw.Time()).c_str())); } statusbar_1->SetStatusText(_("Transaction rolled back"), 3); inTransaction(false); executedStatementsM.clear(); if (closeWhenTransactionDoneM) { sae.cancel(); Close(); return true; } } catch (IBPP::Exception &e) { splitScreen(); log(std2wx(e.ErrorMessage(), databaseM->getCharsetConverter()), ttError); return false; } catch (...) { splitScreen(); log(_("ERROR!\nA non-IBPP C++ runtime exception occured !"), ttError); return false; } notebook_1->SetSelection(0); setViewMode(vmEditor); return true; } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateGridInsertRow(wxUpdateUIEvent& event) { DataGridTable* tb = grid_data->getDataGridTable(); event.Enable(inTransactionM && tb && tb->canInsertRows()); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateGridHasData(wxUpdateUIEvent& event) { event.Enable(grid_data->getDataGridTable() && grid_data->GetNumberRows()); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnMenuUpdateGridDeleteRow(wxUpdateUIEvent& event) { DataGridTable *tb = grid_data->getDataGridTable(); if (!tb || !grid_data->GetNumberRows()) { event.Enable(false); return; } bool colsSelected = grid_data->GetSelectedCols().GetCount() > 0; bool deletableRows = false; if (!colsSelected) { wxArrayInt selRows(getSelectedGridRows(grid_data)); for (size_t i = 0; !deletableRows && i < selRows.GetCount(); ++i) { if (tb->canRemoveRow(selRows[i])) deletableRows = true; } } event.Enable(!colsSelected && deletableRows); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnGridCellChange(wxGridEvent& event) { event.Skip(); // Start timer-event (for updating the blob-value) only if // - the blob-dialog is created and visible AND // - a different col/row is selected if ((editBlobDlgM) && (editBlobDlgM->IsShown()) && ((event.GetCol() != grid_data->GetGridCursorCol()) || (event.GetRow() != grid_data->GetGridCursorRow()))) timerBlobEditorM.Start(500, true); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnGridInvalidateAttributeCache(wxCommandEvent& event) { event.Skip(); grid_data->refreshAndInvalidateAttributes(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnGridRowCountChanged(wxCommandEvent& event) { wxString s; long rowsFetched = event.GetExtraLong(); s.Printf(_("%d row(s) fetched"), rowsFetched); statusbar_1->SetStatusText(s, 1); // TODO: we could make some bool flag, so that this happens only once per execute() // to fix the problem when user does the select, unsplits the window // and then browses the grid, which fetches more records and unsplits again if (!splitter_window_1->IsSplit()) // already ok return; bool selectMaximizeGrid = false; config().getValue(wxT("SelectMaximizeGrid"), selectMaximizeGrid); if (selectMaximizeGrid) { int rowsNeeded = 10; // default config().getValue(wxT("MaximizeGridRowsNeeded"), rowsNeeded); if (rowsFetched >= rowsNeeded) { //splitScreen(); // not needed atm, might be later (see TODO above) setViewMode(false, vmGrid); } } } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnGridStatementExecuted(wxCommandEvent& event) { ScrollAtEnd sae(styled_text_ctrl_stats); log(event.GetString(), ttSql); if (menuBarM->IsChecked(Cmds::DataGrid_Log_changes)) { SqlStatement stm(event.GetString(), databaseM); executedStatementsM.push_back(stm); } } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnGridSum(wxCommandEvent& event) { statusbar_1->SetStatusText(event.GetString(), 3); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnGridLabelLeftDClick(wxGridEvent& event) { DataGridTable* table = grid_data->getDataGridTable(); if (!table) return; int column = 1 + event.GetCol(); if (column < 1 || column > table->GetNumberCols()) return; SelectStatement sstm(std2wx(statementM->Sql(), databaseM->getCharsetConverter())); // rebuild SQL statement with different ORDER BY clause sstm.orderBy(column); execute(sstm.getStatement(), wxEmptyString); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::OnSplitterUnsplit(wxSplitterEvent& WXUNUSED(event)) { if (splitter_window_1->GetWindow1() == styled_text_ctrl_sql) setViewMode(vmEditor); else if (splitter_window_1->GetWindow1() == notebook_1) { if (notebook_1->GetSelection() == 0) setViewMode(vmLogCtrl); else setViewMode(vmGrid); } } //----------------------------------------------------------------------------- void ExecuteSqlFrame::update() { if (databaseM && !databaseM->isConnected()) Close(); } //----------------------------------------------------------------------------- //! closes window if database is removed (unregistered) void ExecuteSqlFrame::subjectRemoved(Subject* subject) { if (subject == databaseM) Close(); } //----------------------------------------------------------------------------- static int CaseUnsensitiveCompare(const wxString& one, const wxString& two) { // this would be the right solution, but it doesn't work well as it // sorts the underscore character differently // return one.CmpNoCase(two); // we have to check for underscore first int min = one.Length() > two.Length() ? two.Length() : one.Length(); for (int i = 0; i < min; ++i) { if (one[i] == '_' && two[i] != '_') return 1; if (one[i] != '_' && two[i] == '_') return -1; if (one[i] != two[i]) return one.CmpNoCase(two); } return one.CmpNoCase(two); } //! Creates a list for autocomplete feature //! The list consists of: //! - sql keywords //! - names of database objects (tables, views, etc.) // void ExecuteSqlFrame::setKeywords() { // TODO: // we can also make ExecuteSqlFrame observer of YTables/YViews/... objects // so it can reload this list if something changes wxArrayString as(SqlTokenizer::getKeywords(SqlTokenizer::kwDefaultCase)); // get list od database objects' names std::vector v; databaseM->getIdentifiers(v); for (std::vector::const_iterator it = v.begin(); it != v.end(); ++it) as.Add((*it).getQuoted()); // The list has to be sorted for autocomplete to work properly as.Sort(CaseUnsensitiveCompare); keywordsM.clear(); // create final wxString from array keywordsM.Alloc(20480); // preallocate 20kB for (size_t i = 0; i < as.GetCount(); ++i) // separate words with spaces keywordsM += as.Item(i) + wxT(" "); } //----------------------------------------------------------------------------- //! logs all activity to text control // this is made a separate function, so we can change the control to any other // or we can also log to some .txt file, etc. void ExecuteSqlFrame::log(wxString s, TextType type) { int startpos = styled_text_ctrl_stats->GetLength(); styled_text_ctrl_stats->SetCurrentPos(startpos); styled_text_ctrl_stats->AddText(s + wxT("\n")); int endpos = styled_text_ctrl_stats->GetLength(); int style = 0; if (type == ttError) style = 1; if (type == ttSql) style = 2; styled_text_ctrl_stats->StartStyling(startpos, 255); styled_text_ctrl_stats->SetStyling(endpos-startpos-1, style); } //----------------------------------------------------------------------------- const wxString ExecuteSqlFrame::getName() const { return wxT("ExecuteSqlFrame"); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::doReadConfigSettings(const wxString& prefix) { BaseFrame::doReadConfigSettings(prefix); int zoom; if (config().getValue(prefix + Config::pathSeparator + wxT("zoom"), zoom)) styled_text_ctrl_sql->SetZoom(zoom); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::doWriteConfigSettings(const wxString& prefix) const { BaseFrame::doWriteConfigSettings(prefix); config().setValue(prefix + Config::pathSeparator + wxT("zoom"), styled_text_ctrl_sql->GetZoom()); } //----------------------------------------------------------------------------- const wxRect ExecuteSqlFrame::getDefaultRect() const { return wxRect(-1, -1, 528, 486); } //----------------------------------------------------------------------------- bool ExecuteSqlFrame::Show(bool show) { bool retval = BaseFrame::Show(show); // bug reported 2008-08-19 by Valdir Marcos: status bar position wrong // when ExecuteSqlFrame is created in maximized state if (IsMaximized()) SendSizeEvent(); return retval; } //----------------------------------------------------------------------------- void ExecuteSqlFrame::setViewMode(ViewMode mode) { setViewMode(splitter_window_1->IsSplit(), mode); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::setViewMode(bool splitView, ViewMode mode) { wxCHECK_RET(mode == vmEditor || mode == vmLogCtrl || mode == vmGrid, wxT("Try to set invalid view mode")); viewModeM = mode; // select notebook pane first (could still be invisible) if (mode == vmLogCtrl) notebook_1->SetSelection(0); else if (mode == vmGrid) notebook_1->SetSelection(1); // split if necessary if (splitView && !splitter_window_1->IsSplit()) { styled_text_ctrl_sql->Show(); notebook_1->Show(); splitter_window_1->SplitHorizontally(styled_text_ctrl_sql, notebook_1); } // unsplit or switch panes if necessary if (!splitView) { if (mode == vmEditor) { if (splitter_window_1->IsSplit()) splitter_window_1->Unsplit(notebook_1); else if (splitter_window_1->GetWindow1() == notebook_1) { splitter_window_1->ReplaceWindow(notebook_1, styled_text_ctrl_sql); } styled_text_ctrl_sql->Show(); notebook_1->Hide(); } else { if (splitter_window_1->IsSplit()) splitter_window_1->Unsplit(styled_text_ctrl_sql); else if (splitter_window_1->GetWindow1() == styled_text_ctrl_sql) { splitter_window_1->ReplaceWindow(styled_text_ctrl_sql, notebook_1); } notebook_1->Show(); styled_text_ctrl_sql->Hide(); } } if (mode == vmEditor) styled_text_ctrl_sql->SetFocus(); else if (mode == vmLogCtrl) styled_text_ctrl_stats->SetFocus(); else if (mode == vmGrid) grid_data->SetFocus(); } //----------------------------------------------------------------------------- void ExecuteSqlFrame::updateViewMode() { doUpdateFocusedControlM = false; wxWindow* focused = FindFocus(); if (focused == styled_text_ctrl_sql) viewModeM = vmEditor; else if (focused == styled_text_ctrl_stats) viewModeM = vmLogCtrl; else if (focused == grid_data || grid_data->IsCellEditControlEnabled() || focused == grid_data->GetGridWindow() || focused == grid_data->GetGridColLabelWindow() || focused == grid_data->GetGridRowLabelWindow() || focused == grid_data->GetGridCornerLabelWindow()) { viewModeM = vmGrid; } } //----------------------------------------------------------------------------- void ExecuteSqlFrame::updateFrameTitle() { if (filenameM.IsOk()) { wxString title(filenameM.GetFullName()); if (styled_text_ctrl_sql->GetModify()) title += wxT("*"); SetTitle(title); return; } const wxString text(styled_text_ctrl_sql->GetText()); if (text.empty()) { SetTitle(_("Execute SQL Statements")); return; } size_t p = text.find(wxT("@FR-TITLE@")); if (p != wxString::npos) { size_t q = text.find(wxT("*/"), p); if (q == wxString::npos) q = text.find_first_of(wxT("\n\r"), p); if (q != wxString::npos) SetTitle(text.substr(p+11, q - p - 11)); else SetTitle(text.substr(p+11)); return; } SqlTokenizer tk(text); const SqlTokenType lookfor[] = { kwALTER, kwCREATE, kwDECLARE, kwDROP, kwEXECUTE, kwINSERT, kwRECREATE, kwREVOKE, kwGRANT, kwSELECT, kwUPDATE, kwDELETE, tkIDENTIFIER }; const wxString namesShort[] = { wxT("alt"), wxT("cre"), wxT("dclr"), wxT("drop"), wxT("exec"), wxT("ins"), wxT("recr"), wxT("rvk"), wxT("grnt"), wxT("sel"), wxT("upd"), wxT("del") }; const wxString namesVeryShort[] = { wxT("a"), wxT("c"), wxT("decl"), wxT("drop"), wxT("x"), wxT("i"), wxT("recr"), wxT("rev"), wxT("grnt"), wxT("s"), wxT("u"), wxT("del") }; const wxString* names = 0; int setting = config().get(wxT("sqlEditorWindowKeywords"), 1); if (setting == 1) names = &namesShort[0]; else if (setting == 2) names = &namesVeryShort[0]; int cnt = 0; wxString title; do { SqlTokenType stt = tk.getCurrentToken(); for (unsigned int i=0; i(uri); wxWindow* w = getParentWindow(uri); if (!c || !w) return true; Table *t = 0; if (uri.action == wxT("drop_field")) { if (Column *cp = dynamic_cast(c)) t = cp->getTable(); } else { if (Constraint *cs = dynamic_cast(c)) t = cs->getTable(); } if (!t) return true; wxString sql = wxT("ALTER TABLE ") + t->getQuotedName() + wxT(" DROP "); if (uri.action == wxT("drop_constraint")) sql += wxT("CONSTRAINT "); sql += c->getQuotedName(); wxString msg(wxString::Format( _("Are you sure you wish to drop the %s %s?"), c->getTypeName().Lower().c_str(), c->getName_().c_str())); if (wxOK != showQuestionDialog(w, msg, _("Once you drop the object it is permanently removed from database."), AdvancedMessageDialogButtonsOkCancel(_("&Drop")), config(), wxT("DIALOG_ConfirmDrop"), _("Always drop without asking"))) { return true; } execSql(w, _("Dropping field"), c->getDatabase(), sql, true); return true; } //----------------------------------------------------------------------------- //! drop multiple columns class DropColumnsHandler: public URIHandler, private MetadataItemURIHandlerHelper, private GUIURIHandlerHelper { public: DropColumnsHandler() {}; bool handleURI(URI& uri); private: static const DropColumnsHandler handlerInstance; }; //----------------------------------------------------------------------------- const DropColumnsHandler DropColumnsHandler::handlerInstance; //----------------------------------------------------------------------------- bool DropColumnsHandler::handleURI(URI& uri) { if (uri.action != wxT("drop_fields")) return false; Table* t = extractMetadataItemFromURI
(uri); wxWindow* w = getParentWindow(uri); if (!t || !w) return true; // get list of columns wxString sql; std::vector list; if (selectRelationColumnsIntoVector(t, w, list)) { for (std::vector::iterator it = list.begin(); it != list.end(); ++it) { Identifier temp(*it); sql += wxT("ALTER TABLE ") + t->getQuotedName() + wxT(" DROP ") + temp.getQuoted() + wxT(";\n"); } execSql(w, _("Dropping fields"), t->getDatabase(), sql, true); } return true; } //----------------------------------------------------------------------------- //! drop any metadata item class DropObjectHandler: public URIHandler, private MetadataItemURIHandlerHelper, private GUIURIHandlerHelper { public: DropObjectHandler() {}; bool handleURI(URI& uri); private: static const DropObjectHandler handlerInstance; }; //----------------------------------------------------------------------------- const DropObjectHandler DropObjectHandler::handlerInstance; //----------------------------------------------------------------------------- bool DropObjectHandler::handleURI(URI& uri) { if (uri.action != wxT("drop_object")) return false; MetadataItem* m = extractMetadataItemFromURI(uri); wxWindow* w = getParentWindow(uri); if (!m || !w) return true; wxString msg(wxString::Format( _("Are you sure you wish to drop the %s %s?"), m->getTypeName().Lower().c_str(), m->getName_().c_str())); if (wxOK != showQuestionDialog(w, msg, _("Once you drop the object it is permanently removed from database."), AdvancedMessageDialogButtonsOkCancel(_("&Drop")), config(), wxT("DIALOG_ConfirmDrop"), _("Always drop without asking"))) { return true; } execSql(w, _("DROP"), m->getDatabase(), m->getDropSqlStatement(), true); return true; } //----------------------------------------------------------------------------- //! show DDL in SQL editor class EditDDLHandler: public URIHandler, private MetadataItemURIHandlerHelper, private GUIURIHandlerHelper { public: EditDDLHandler() {}; bool handleURI(URI& uri); private: static const EditDDLHandler handlerInstance; }; //----------------------------------------------------------------------------- const EditDDLHandler EditDDLHandler::handlerInstance; //----------------------------------------------------------------------------- bool EditDDLHandler::handleURI(URI& uri) { if (uri.action != wxT("edit_ddl")) return false; MetadataItem* m = extractMetadataItemFromURI(uri); wxWindow* w = getParentWindow(uri); if (!m || !w) return true; // use a single read-only transaction for metadata loading DatabasePtr db = m->getDatabase(); MetadataLoaderTransaction tr(db->getMetadataLoader()); ProgressDialog pd(w, _("Extracting DDL Definitions"), 2); pd.doShow(); CreateDDLVisitor cdv(&pd); m->acceptVisitor(&cdv); if (pd.isCanceled()) return true; ExecuteSqlFrame* eff = new ExecuteSqlFrame(wxTheApp->GetTopWindow(), -1, wxT("DDL"), db); eff->setSql(cdv.getSql()); // ProgressDialog needs to be hidden before ExecuteSqlFrame is shown, // otherwise the HTML frame will be raised over the ExecuteSqlFrame // when original Z-order is restored after pd has been destroyed pd.doHide(); eff->Show(); return true; } //----------------------------------------------------------------------------- class EditProcedureHandler: public URIHandler, private MetadataItemURIHandlerHelper, private GUIURIHandlerHelper { public: EditProcedureHandler() {}; bool handleURI(URI& uri); private: // singleton; registers itself on creation. static const EditProcedureHandler handlerInstance; }; //----------------------------------------------------------------------------- const EditProcedureHandler EditProcedureHandler::handlerInstance; //----------------------------------------------------------------------------- bool EditProcedureHandler::handleURI(URI& uri) { if (uri.action != wxT("edit_procedure")) return false; Procedure* p = extractMetadataItemFromURI(uri); wxWindow* w = getParentWindow(uri); if (!p || !w) return true; CreateDDLVisitor cdv; p->acceptVisitor(&cdv); showSql(w->GetParent(), _("Editing stored procedure"), p->getDatabase(), cdv.getSuffixSql()); return true; } //----------------------------------------------------------------------------- class AlterViewHandler: public URIHandler, private MetadataItemURIHandlerHelper, private GUIURIHandlerHelper { public: AlterViewHandler() {}; bool handleURI(URI& uri); private: // singleton; registers itself on creation. static const AlterViewHandler handlerInstance; }; //----------------------------------------------------------------------------- const AlterViewHandler AlterViewHandler::handlerInstance; //----------------------------------------------------------------------------- bool AlterViewHandler::handleURI(URI& uri) { if (uri.action != wxT("alter_relation") && uri.action != wxT("alter_field")) { return false; } Relation* r; wxString column; if (uri.action == wxT("alter_relation")) r = extractMetadataItemFromURI(uri); else { Column* c = extractMetadataItemFromURI(uri); r = c->getTable(); column = c->getName_(); } wxWindow* w = getParentWindow(uri); if (!r || !w) return true; showSql(w->GetParent(), _("Altering dependent objects"), r->getDatabase(), r->getRebuildSql(column)); return true; } //----------------------------------------------------------------------------- class EditTriggerHandler: public URIHandler, private MetadataItemURIHandlerHelper, private GUIURIHandlerHelper { public: EditTriggerHandler() {}; bool handleURI(URI& uri); private: // singleton; registers itself on creation. static const EditTriggerHandler handlerInstance; }; //----------------------------------------------------------------------------- const EditTriggerHandler EditTriggerHandler::handlerInstance; //----------------------------------------------------------------------------- bool EditTriggerHandler::handleURI(URI& uri) { if (uri.action != wxT("edit_trigger")) return false; Trigger* t = extractMetadataItemFromURI(uri); wxWindow* w = getParentWindow(uri); if (!t || !w) return true; showSql(w->GetParent(), _("Editing trigger"), t->getDatabase(), t->getAlterSql()); return true; } //----------------------------------------------------------------------------- class EditGeneratorValueHandler: public URIHandler, private MetadataItemURIHandlerHelper, private GUIURIHandlerHelper { public: EditGeneratorValueHandler() {}; bool handleURI(URI& uri); private: // singleton; registers itself on creation. static const EditGeneratorValueHandler handlerInstance; }; //----------------------------------------------------------------------------- const EditGeneratorValueHandler EditGeneratorValueHandler::handlerInstance; //----------------------------------------------------------------------------- bool EditGeneratorValueHandler::handleURI(URI& uri) { if (uri.action != wxT("edit_generator_value")) return false; Generator* g = extractMetadataItemFromURI(uri); wxWindow* w = getParentWindow(uri); if (!g || !w) return true; g->invalidate(); int64_t oldvalue = g->getValue(); DatabasePtr db = g->getDatabase(); wxString value = wxGetTextFromUser(_("Changing generator value"), _("Enter new value"), #ifndef wxLongLong // MH: I have no idea if this works on all systems... but it should be better // MB: we'll use wxLongLong wherever it is available wxLongLong(oldvalue).ToString(), w); #else wxString::Format(wxT("%d"), oldvalue), w); #endif if (value != wxT("")) { wxString sql = wxT("SET GENERATOR ") + g->getQuotedName() + wxT(" TO ") + value + wxT(";"); execSql(w, sql, db, sql, true); } return true; } //----------------------------------------------------------------------------- class EditExceptionHandler: public URIHandler, private MetadataItemURIHandlerHelper, private GUIURIHandlerHelper { public: EditExceptionHandler() {}; bool handleURI(URI& uri); private: // singleton; registers itself on creation. static const EditExceptionHandler handlerInstance; }; //----------------------------------------------------------------------------- const EditExceptionHandler EditExceptionHandler::handlerInstance; //----------------------------------------------------------------------------- bool EditExceptionHandler::handleURI(URI& uri) { if (uri.action != wxT("edit_exception")) return false; Exception* e = extractMetadataItemFromURI(uri); wxWindow* w = getParentWindow(uri); if (!e || !w) return true; showSql(w->GetParent(), _("Editing exception"), e->getDatabase(), e->getAlterSql()); return true; } //----------------------------------------------------------------------------- class IndexActionHandler: public URIHandler, private MetadataItemURIHandlerHelper, private GUIURIHandlerHelper { public: IndexActionHandler() {}; bool handleURI(URI& uri); private: // singleton; registers itself on creation. static const IndexActionHandler handlerInstance; }; //----------------------------------------------------------------------------- const IndexActionHandler IndexActionHandler::handlerInstance; //----------------------------------------------------------------------------- bool IndexActionHandler::handleURI(URI& uri) { if (uri.action != wxT("index_action")) return false; Index* i = extractMetadataItemFromURI(uri); wxWindow* w = getParentWindow(uri); if (!i || !w) return true; wxString sql; wxString type = uri.getParam(wxT("type")); // type of operation if (type == wxT("DROP")) { wxString msg(wxString::Format( _("Are you sure you wish to drop the index %s?"), i->getName_().c_str())); if (wxOK != showQuestionDialog(w, msg, _("Once you drop the object it is permanently removed from database."), AdvancedMessageDialogButtonsOkCancel(_("&Drop")), config(), wxT("DIALOG_ConfirmDrop"), _("Always drop without asking"))) { return true; } sql = wxT("DROP INDEX ") + i->getQuotedName(); } else if (type == wxT("RECOMPUTE")) sql = wxT("SET STATISTICS INDEX ") + i->getQuotedName(); else if (type == wxT("TOGGLE_ACTIVE")) sql = wxT("ALTER INDEX ") + i->getQuotedName() + (i->isActive() ? wxT(" INACTIVE") : wxT(" ACTIVE")); execSql(w, wxEmptyString, i->getDatabase(), sql, true); return true; } //----------------------------------------------------------------------------- class ActivateTriggersHandler: public URIHandler, private MetadataItemURIHandlerHelper, private GUIURIHandlerHelper { public: ActivateTriggersHandler() {}; bool handleURI(URI& uri); private: static const ActivateTriggersHandler handlerInstance; }; //----------------------------------------------------------------------------- const ActivateTriggersHandler ActivateTriggersHandler::handlerInstance; //----------------------------------------------------------------------------- bool ActivateTriggersHandler::handleURI(URI& uri) { if (uri.action != wxT("activate_triggers") && uri.action != wxT("deactivate_triggers")) { return false; } MetadataItem* mi = extractMetadataItemFromURI(uri); Relation* r = dynamic_cast(mi); Database* d = dynamic_cast(mi); wxWindow* w = getParentWindow(uri); if ((!r && !d) || !w) return true; std::vector list; if (r) { r->getTriggers(list, Trigger::afterTrigger); r->getTriggers(list, Trigger::beforeTrigger); } else d->getDatabaseTriggers(list); // don't show empty SQL editor if no triggers found if (list.empty()) return true; wxString sql; for (std::vector::iterator it = list.begin(); it != list.end(); ++it) { sql += wxT("ALTER TRIGGER ") + (*it)->getQuotedName() + wxT(" "); if (uri.action == wxT("deactivate_triggers")) sql += wxT("IN"); sql += wxT("ACTIVE;\n"); } execSql(w, wxEmptyString, mi->getDatabase(), sql, true); return true; } //----------------------------------------------------------------------------- class ActivateTriggerHandler: public URIHandler, private MetadataItemURIHandlerHelper, private GUIURIHandlerHelper { public: ActivateTriggerHandler() {}; bool handleURI(URI& uri); private: static const ActivateTriggerHandler handlerInstance; }; //----------------------------------------------------------------------------- const ActivateTriggerHandler ActivateTriggerHandler::handlerInstance; //----------------------------------------------------------------------------- bool ActivateTriggerHandler::handleURI(URI& uri) { if (uri.action != wxT("activate_trigger") && uri.action != wxT("deactivate_trigger")) return false; Trigger* t = extractMetadataItemFromURI(uri); wxWindow* w = getParentWindow(uri); if (!t || !w) return true; wxString sql = wxT("ALTER TRIGGER ") + t->getQuotedName() + wxT(" "); if (uri.action == wxT("deactivate_trigger")) sql += wxT("IN"); sql += wxT("ACTIVE;\n"); execSql(w, wxEmptyString, t->getDatabase(), sql, true); return true; } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/ExecuteSqlFrame.h000066400000000000000000000246301177057155300227710ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef EXECUTESQLFRAME_H #define EXECUTESQLFRAME_H //----------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include "core/Observer.h" #include "core/StringUtils.h" #include "controls/DataGridTable.h" #include "gui/BaseFrame.h" #include "gui/EditBlobDialog.h" #include "gui/FindDialog.h" #include "sql/SqlStatement.h" #include "statementHistory.h" //----------------------------------------------------------------------------- class CommandManager; class Database; class DataGrid; class ExecuteSqlFrame; //----------------------------------------------------------------------------- class SqlEditor: public SearchableEditor { private: void setup(); public: SqlEditor(wxWindow *parent, wxWindowID id); void markText(int start, int end); void setChars(bool firebirdIdentifierOnly); void setFont(); bool hasSelection(); void OnContextMenu(wxContextMenuEvent& event); void OnKillFocus(wxFocusEvent& event); DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- class ExecuteSqlFrame: public BaseFrame, public Observer { public: ExecuteSqlFrame(wxWindow* parent, int id, wxString title, DatabasePtr db, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_FRAME_STYLE); bool loadSqlFile(const wxString& filename); void setSql(wxString sql); void executeAllStatements(bool autoExecute = false); virtual bool Show(bool show = TRUE); Database* getDatabase() const; private: virtual bool doCanClose(); virtual void doBeforeDestroy(); // query parsing and execution void prepareAndExecute(bool prepareOnly = false); bool parseStatements(const wxString& statements, bool autoExecute = false, bool prepareOnly = false, int selectionOffset = 0); bool execute(wxString sql, const wxString& terminator, bool prepareOnly = false); std::vector executedStatementsM; wxFileName filenameM; void compareCounts(IBPP::DatabaseCounts& one, IBPP::DatabaseCounts& two); void showProperties(wxString objectName); typedef enum { ttNormal, ttSql, ttError } TextType; void log(wxString s, TextType type = ttNormal); // write messages to textbox void clearLogBeforeExecution(); void splitScreen(); Database* databaseM; StatementHistory::Position historyPositionM; wxString localBuffer; bool autoCommitM; bool inTransactionM; IBPP::Transaction transactionM; IBPP::Statement statementM; IBPP::TIL transactionIsolationLevelM; IBPP::TLR transactionLockResolutionM; IBPP::TAM transactionAccessModeM; void inTransaction(bool started); // changes controls (enable/disable) bool commitTransaction(); bool rollbackTransaction(); void autoComplete(bool force); void autoCompleteColumns(int pos, int len = 0); void OnSqlEditUpdateUI(wxStyledTextEvent& event); void OnSqlEditCharAdded(wxStyledTextEvent& event); // autocomplete stuff void OnSqlEditChanged(wxStyledTextEvent& event); // update title void OnSqlEditStartDrag(wxStyledTextEvent& event); // enable click&remove selection wxString keywordsM; // text used for autocomplete void setKeywords(); void buildMainMenu(CommandManager& cm); void buildToolbar(CommandManager& cm); bool doUpdateFocusedControlM; enum ViewMode { vmNotebook, vmEditor, vmLogCtrl, vmGrid, vmGridEditor }; ViewMode viewModeM; void setViewMode(ViewMode mode); void setViewMode(bool splitView, ViewMode mode); void updateViewMode(); bool updateEditorCaretPosM; bool updateFrameTitleM; void updateFrameTitle(); // blob-editor-timer enum { TIMER_ID_UPDATE_BLOB = 1 }; wxTimer timerBlobEditorM; // blob-editor dialog EditBlobDialog* editBlobDlgM; // blob-editor event void OnBlobEditorUpdate(wxTimerEvent& event); // blob-editor function to update blob-editor value void closeBlobEditor(bool saveBlobValue); void updateBlobEditor(); // events void OnChildFocus(wxChildFocusEvent& event); void OnKeyDown(wxKeyEvent& event); void OnGridCellChange(wxGridEvent& event); void OnGridInvalidateAttributeCache(wxCommandEvent& event); void OnGridRowCountChanged(wxCommandEvent& event); void OnGridStatementExecuted(wxCommandEvent& event); void OnGridSum(wxCommandEvent& event); void OnGridLabelLeftDClick(wxGridEvent& event); void OnSplitterUnsplit(wxSplitterEvent& event); void OnIdle(wxIdleEvent& event); // menu events void OnMenuNew(wxCommandEvent& event); void OnMenuOpen(wxCommandEvent& event); void OnMenuSaveOrSaveAs(wxCommandEvent& event); void OnMenuClose(wxCommandEvent& event); void OnMenuUndo(wxCommandEvent& event); void OnMenuUpdateUndo(wxUpdateUIEvent& event); void OnMenuRedo(wxCommandEvent& event); void OnMenuUpdateRedo(wxUpdateUIEvent& event); void OnMenuCut(wxCommandEvent& event); void OnMenuUpdateCut(wxUpdateUIEvent& event); void OnMenuCopy(wxCommandEvent& event); void OnMenuUpdateCopy(wxUpdateUIEvent& event); void OnMenuPaste(wxCommandEvent& event); void OnMenuUpdatePaste(wxUpdateUIEvent& event); void OnMenuDelete(wxCommandEvent& event); void OnMenuUpdateDelete(wxUpdateUIEvent& event); void OnMenuSelectAll(wxCommandEvent& event); void OnMenuReplace(wxCommandEvent& event); void OnMenuSelectView(wxCommandEvent& event); void OnMenuUpdateSelectView(wxUpdateUIEvent& event); void OnMenuSplitView(wxCommandEvent& event); void OnMenuUpdateSplitView(wxUpdateUIEvent& event); void OnMenuSetEditorFont(wxCommandEvent& event); void OnMenuToggleWrap(wxCommandEvent& event); void OnMenuHistoryNext(wxCommandEvent& event); void OnMenuUpdateHistoryNext(wxUpdateUIEvent& event); void OnMenuHistoryPrev(wxCommandEvent& event); void OnMenuUpdateHistoryPrev(wxUpdateUIEvent& event); void OnMenuHistorySearch(wxCommandEvent& event); void OnMenuExecute(wxCommandEvent& event); void OnMenuShowPlan(wxCommandEvent& event); void OnMenuExecuteSelection(wxCommandEvent& event); void OnMenuExecuteFromCursor(wxCommandEvent& event); void OnMenuCommit(wxCommandEvent& event); void OnMenuRollback(wxCommandEvent& event); void OnMenuUpdateWhenInTransaction(wxUpdateUIEvent& event); void OnMenuUpdateWhenExecutePossible(wxUpdateUIEvent& event); void OnMenuTransactionIsolationLevel(wxCommandEvent& event); void OnMenuUpdateTransactionIsolationLevel(wxUpdateUIEvent& event); void OnMenuTransactionLockResolution(wxCommandEvent& event); void OnMenuUpdateTransactionLockResolution(wxUpdateUIEvent& event); void OnMenuTransactionReadOnly(wxCommandEvent& event); void OnMenuUpdateTransactionReadOnly(wxUpdateUIEvent& event); void OnMenuGridInsertRow(wxCommandEvent& event); void OnMenuUpdateGridInsertRow(wxUpdateUIEvent& event); void OnMenuGridDeleteRow(wxCommandEvent& event); void OnMenuUpdateGridDeleteRow(wxUpdateUIEvent& event); void OnMenuGridSetFieldToNULL(wxCommandEvent& WXUNUSED(event)); void OnMenuGridEditBlob(wxCommandEvent& event); void OnMenuGridImportBlob(wxCommandEvent& event); void OnMenuGridExportBlob(wxCommandEvent& event); void OnMenuUpdateGridCellIsBlob(wxUpdateUIEvent& event); void OnMenuGridCopyAsInList(wxCommandEvent& event); void OnMenuGridCopyAsInsert(wxCommandEvent& event); void OnMenuGridCopyAsUpdate(wxCommandEvent& event); void OnMenuGridSaveAsHtml(wxCommandEvent& event); void OnMenuGridSaveAsCsv(wxCommandEvent& event); void OnMenuGridGridHeaderFont(wxCommandEvent& event); void OnMenuGridGridCellFont(wxCommandEvent& event); void OnMenuGridFetchAll(wxCommandEvent& event); void OnMenuGridCancelFetchAll(wxCommandEvent& event); void OnMenuUpdateGridHasSelection(wxUpdateUIEvent& event); void OnMenuUpdateGridHasData(wxUpdateUIEvent& event); void OnMenuUpdateGridFetchAll(wxUpdateUIEvent& event); void OnMenuUpdateGridCancelFetchAll(wxUpdateUIEvent& event); void OnMenuUpdateGridCanSetFieldToNULL(wxUpdateUIEvent& event); void OnMenuFindSelectedObject(wxCommandEvent& event); void set_properties(); void do_layout(); private: // observer stuff virtual void subjectRemoved(Subject* subject); virtual void update(); protected: enum { ID_grid_data = 101, ID_stc_sql }; bool closeWhenTransactionDoneM; bool loadingM; wxPanel* panel_contents; wxSplitterWindow* splitter_window_1; SqlEditor* styled_text_ctrl_sql; wxNotebook* notebook_1; wxPanel* notebook_pane_1; wxPanel* notebook_pane_2; DataGrid* grid_data; wxStyledTextCtrl* styled_text_ctrl_stats; wxStatusBar* statusbar_1; wxMenuBar* menuBarM; wxToolBar* toolBarM; virtual const wxString getName() const; virtual void doReadConfigSettings(const wxString& prefix); virtual void doWriteConfigSettings(const wxString& prefix) const; virtual const wxRect getDefaultRect() const; DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- #endif // EXECUTESQLFRAME_H flamerobin_0.9.3~svn+2220.orig/src/gui/FRLayoutConfig.cpp000066400000000000000000000166651177057155300231330ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include "gui/FRLayoutConfig.h" //----------------------------------------------------------------------------- class RgbHsvConversion // used by StyleGuidFR::getReadonlyColour() { private: float redM, greenM, blueM; float hueM, satM, valM; bool rgbValidM, hsvValidM; void calcHsvFromRgb(); void calcRgbFromHsv(); public: RgbHsvConversion(const wxColour& colour); wxColour getColour(); float getValue(); void setValue(float value); }; //----------------------------------------------------------------------------- RgbHsvConversion::RgbHsvConversion(const wxColour& colour) { redM = colour.Red() / 255.0; greenM = colour.Green() / 255.0; blueM = colour.Blue() / 255.0; rgbValidM = colour.IsOk(); hueM = 0.0; satM = 0.0; valM = 0.0; hsvValidM = false; } //----------------------------------------------------------------------------- // Adapted from public domain code by Zack Booth Simpson // http://www.mine-control.com/zack/code/zrgbhsv.cpp void RgbHsvConversion::calcHsvFromRgb() { float rgbMin = std::min(redM, std::min(greenM, blueM)); float rgbMax = std::max(redM, std::max(greenM, blueM)); valM = rgbMax; float delta = rgbMax - rgbMin; if (delta == 0.0) { // gray value, saturation is 0, hue is undefined hueM = -1.0; satM = 0.0; hsvValidM = true; return; } satM = delta / rgbMax; if (redM == rgbMax) // between yellow & magenta hueM = (greenM - blueM) / delta; else if (greenM == rgbMax) // between cyan & yellow hueM = 2 + (blueM - redM) / delta; else // between magenta & cyan hueM = 4 + (redM - greenM) / delta; hueM *= 60; // degrees if (hueM < 0.0) hueM += 360.0; hueM /= 360.0; hsvValidM = true; } //----------------------------------------------------------------------------- // Adapted from public domain code by Zack Booth Simpson // http://www.mine-control.com/zack/code/zrgbhsv.cpp void RgbHsvConversion::calcRgbFromHsv() { if (satM == 0.0) // gray value, saturation is 0, hue is undefined { redM = greenM = blueM = valM; rgbValidM = true; return; } float f, p, q, t; float h = 6.0 * hueM; int sector = (int) floor(h); f = h - sector; p = valM * (1.0 - satM); q = valM * (1.0 - satM * f); t = valM * (1.0 - satM * (1.0 - f)); switch (sector) { case 0: redM = valM; greenM = t; blueM = p; break; case 1: redM = q; greenM = valM; blueM = p; break; case 2: redM = p; greenM = valM; blueM = t; break; case 3: redM = p; greenM = q; blueM = valM; break; case 4: redM = t; greenM = p; blueM = valM; break; default: redM = valM; greenM = p; blueM = q; break; } rgbValidM = true; } //----------------------------------------------------------------------------- wxColour RgbHsvConversion::getColour() { if (!rgbValidM) { wxASSERT(hsvValidM); calcRgbFromHsv(); } return wxColour((unsigned char)(255.0 * redM), (unsigned char)(255.0 * greenM), (unsigned char)(255.0 * blueM)); } //----------------------------------------------------------------------------- float RgbHsvConversion::getValue() { if (!hsvValidM) { wxASSERT(rgbValidM); calcHsvFromRgb(); } return valM; } //----------------------------------------------------------------------------- void RgbHsvConversion::setValue(float value) { if (value < 0.0 || value > 1.0) return; if (rgbValidM && !hsvValidM) calcHsvFromRgb(); if (valM != value) { valM = value; rgbValidM = false; } } //----------------------------------------------------------------------------- FRLayoutConfig::FRLayoutConfig() { } //----------------------------------------------------------------------------- FRLayoutConfig::~FRLayoutConfig() { } //----------------------------------------------------------------------------- wxColour FRLayoutConfig::getReadonlyColour() { static wxColour colourReadOnly; if (!colourReadOnly.IsOk()) { // first try to compute a colour that is between "white" and "gray" // (but use the actual system colours instead of hard-coded values) wxColour clWnd(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); int r1 = clWnd.Red(), g1 = clWnd.Green(), b1 = clWnd.Blue(); wxColour clBtn = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE); int r2 = clBtn.Red(), g2 = clBtn.Green(), b2 = clBtn.Blue(); int distance = abs(r1 - r2) + abs(g1 - g2) + abs(b1 - b2); if (distance >= 72) { // start at 50 %, and use progressively lighter colours for larger // distances between white and gray int scale = (distance >= 192) ? distance / 64 : 2; colourReadOnly.Set(r1 + (r2 - r1) / scale, g1 + (g2 - g1) / scale, b1 + (b2 - b1) / scale); } else { // wxSYS_COLOUR_WINDOW and wxSYS_COLOUR_BTNFACE are too similar // compute a darker shade of wxSYS_COLOUR_WINDOW RgbHsvConversion rgbhsv(clWnd); rgbhsv.setValue(std::max(0.0, rgbhsv.getValue() - 0.05)); colourReadOnly = rgbhsv.getColour(); } } return colourReadOnly; } //----------------------------------------------------------------------------- int FRLayoutConfig::getEditorFontSize() { #ifdef __WINDOWS__ return 10; // WIN #else return 12; // MAC, GTK #endif } //----------------------------------------------------------------------------- FRLayoutConfig& frlayoutconfig() { static FRLayoutConfig layout; return layout; } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/FRLayoutConfig.h000066400000000000000000000034761177057155300225740ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ //! Support for optimal dialog layout // // #ifndef FR_FRLAYOUTCONFIG_H #define FR_FRLAYOUTCONFIG_H #include //----------------------------------------------------------------------------- class FRLayoutConfig { public: FRLayoutConfig(); virtual ~FRLayoutConfig(); /* returns the default font size for the SQL editor control */ virtual int getEditorFontSize(); /* returns the colour for "read-only" controls */ wxColour getReadonlyColour(); }; //-------------------------------------------------------------------------------------- FRLayoutConfig& frlayoutconfig(); //-------------------------------------------------------------------------------------- #endif // FR_FRLAYOUTCONFIG_H flamerobin_0.9.3~svn+2220.orig/src/gui/FieldPropertiesDialog.cpp000066400000000000000000001001471177057155300245050ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include "core/ArtProvider.h" #include "core/URIProcessor.h" #include "gui/ExecuteSql.h" #include "gui/FieldPropertiesDialog.h" #include "gui/GUIURIHandlerHelper.h" #include "gui/StyleGuide.h" #include "metadata/column.h" #include "metadata/database.h" #include "metadata/domain.h" #include "metadata/generator.h" #include "metadata/MetadataItemURIHandlerHelper.h" #include "metadata/table.h" //----------------------------------------------------------------------------- struct DatatypeProperties { //wxString name; // doesn't work with Borland //wxChar name[]; // doesn't work with MSVC const wxChar* name; bool hasSize; bool hasScale; bool isChar; }; static const DatatypeProperties datatypes[] = { { wxT("Char"), true, false, true }, { wxT("Varchar"), true, false, true }, { wxT("Integer") }, { wxT("Smallint") }, { wxT("Numeric"), true, true, false }, { wxT("Decimal"), true, true, false }, { wxT("BigInt") }, { wxT("Float") }, { wxT("Double precision") }, { wxT("Date") }, { wxT("Time") }, { wxT("Timestamp") }, { wxT("Array") }, { wxT("Blob") } }; const size_t datatypescnt = sizeof(datatypes) / sizeof(DatatypeProperties); //----------------------------------------------------------------------------- FieldPropertiesDialog::FieldPropertiesDialog(wxWindow* parent, Table* table, Column* column) : BaseDialog(parent, wxID_ANY, wxEmptyString), columnM(column), tableM(table) { // can't do anything if no table is given wxASSERT(table); if (table) table->attachObserver(this, false); if (columnM) columnM->attachObserver(this, false); createControls(); setControlsProperties(); updateControls(); layoutControls(); SetIcon(wxArtProvider::GetIcon(ART_Column, wxART_FRAME_ICON)); } //----------------------------------------------------------------------------- void FieldPropertiesDialog::createControls() { label_fieldname = new wxStaticText(getControlsPanel(), wxID_ANY, _("Field name:")); textctrl_fieldname = new wxTextCtrl(getControlsPanel(), ID_textctrl_fieldname, wxEmptyString); label_domain = new wxStaticText(getControlsPanel(), wxID_ANY, _("Domain:")); choice_domain = new wxChoice(getControlsPanel(), ID_choice_domain, wxDefaultPosition, wxDefaultSize, 0, 0); button_edit_domain = new wxButton(getControlsPanel(), ID_button_edit_domain, _("Edit domain")); label_datatype = new wxStaticText(getControlsPanel(), wxID_ANY, _("Datatype:")); wxArrayString datatypes_choices; datatypes_choices.Alloc(datatypescnt); for (size_t n = 0; n < datatypescnt; n++) datatypes_choices.Add(datatypes[n].name); choice_datatype = new wxChoice(getControlsPanel(), ID_choice_datatype, wxDefaultPosition, wxDefaultSize, datatypes_choices); label_size = new wxStaticText(getControlsPanel(), wxID_ANY, _("Size:")); textctrl_size = new wxTextCtrl(getControlsPanel(), wxID_ANY, wxEmptyString); label_scale = new wxStaticText(getControlsPanel(), wxID_ANY, _("Scale:")); textctrl_scale = new wxTextCtrl(getControlsPanel(), wxID_ANY, wxEmptyString); label_charset = new wxStaticText(getControlsPanel(), wxID_ANY, _("Charset:")); const wxString charset_choices[] = { wxT("NONE") }; choice_charset = new wxChoice(getControlsPanel(), ID_choice_charset, wxDefaultPosition, wxDefaultSize, sizeof(charset_choices) / sizeof(wxString), charset_choices); label_collate = new wxStaticText(getControlsPanel(), wxID_ANY, _("Collate:")); choice_collate = new wxChoice(getControlsPanel(), ID_choice_collate, wxDefaultPosition, wxDefaultSize, 0, 0); checkbox_notnull = new wxCheckBox(getControlsPanel(), wxID_ANY, _("Not null")); static_line_autoinc = new wxStaticLine(getControlsPanel()); label_autoinc = new wxStaticText(getControlsPanel(), wxID_ANY, _("Autoincrement")); radio_generator_new = new wxRadioButton(getControlsPanel(), ID_radio_generator_new, _("Create new generator:")); textctrl_generator_name = new wxTextCtrl(getControlsPanel(), ID_textctrl_generator_name, wxEmptyString); radio_generator_existing = new wxRadioButton(getControlsPanel(), ID_radio_generator_existing, _("Use existing generator:")); choice_generator = new wxChoice(getControlsPanel(), ID_choice_generator, wxDefaultPosition, wxDefaultSize, 0, 0); checkbox_trigger = new wxCheckBox(getControlsPanel(), ID_checkbox_trigger, _("Create trigger")); textctrl_sql = new wxTextCtrl(getControlsPanel(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_READONLY); button_ok = new wxButton(getControlsPanel(), wxID_OK, _("Execute")); button_cancel = new wxButton(getControlsPanel(), wxID_CANCEL, _("Cancel")); } //----------------------------------------------------------------------------- void FieldPropertiesDialog::layoutControls() { // create sizer for controls wxGridBagSizer* sizerTop = new wxGridBagSizer(styleguide().getRelatedControlMargin(wxVERTICAL), styleguide().getControlLabelMargin()); sizerTop->Add(label_fieldname, wxGBPosition(0, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); sizerTop->Add(textctrl_fieldname, wxGBPosition(0, 1), wxGBSpan(1, 5), wxALIGN_CENTER_VERTICAL | wxEXPAND); sizerTop->Add(label_domain, wxGBPosition(1, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); wxBoxSizer* sizerDomain = new wxBoxSizer(wxHORIZONTAL); sizerDomain->Add(choice_domain, 1, wxEXPAND); sizerDomain->Add(styleguide().getBrowseButtonMargin(), 0); sizerDomain->Add(button_edit_domain); sizerTop->Add(sizerDomain, wxGBPosition(1, 1), wxGBSpan(1, 5), wxALIGN_CENTER_VERTICAL | wxEXPAND); int dx = styleguide().getUnrelatedControlMargin(wxHORIZONTAL) - styleguide().getControlLabelMargin(); if (dx < 0) dx = 0; sizerTop->Add(label_datatype, wxGBPosition(2, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); sizerTop->Add(choice_datatype, wxGBPosition(2, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL | wxEXPAND); sizerTop->Add(label_size, wxGBPosition(2, 2), wxDefaultSpan, wxLEFT | wxALIGN_CENTER_VERTICAL, dx); sizerTop->Add(textctrl_size, wxGBPosition(2, 3), wxDefaultSpan, wxALIGN_CENTER_VERTICAL | wxEXPAND); sizerTop->Add(label_scale, wxGBPosition(2, 4), wxDefaultSpan, wxLEFT | wxALIGN_CENTER_VERTICAL, dx); sizerTop->Add(textctrl_scale, wxGBPosition(2, 5), wxDefaultSpan, wxALIGN_CENTER_VERTICAL | wxEXPAND); sizerTop->Add(label_charset, wxGBPosition(3, 2), wxDefaultSpan, wxLEFT | wxALIGN_CENTER_VERTICAL, dx); sizerTop->Add(choice_charset, wxGBPosition(3, 3), wxDefaultSpan, wxALIGN_CENTER_VERTICAL | wxEXPAND); sizerTop->Add(label_collate, wxGBPosition(3, 4), wxDefaultSpan, wxLEFT | wxALIGN_CENTER_VERTICAL, dx); sizerTop->Add(choice_collate, wxGBPosition(3, 5), wxDefaultSpan, wxALIGN_CENTER_VERTICAL | wxEXPAND); sizerTop->AddGrowableCol(1); sizerTop->AddGrowableCol(3); sizerTop->AddGrowableCol(5); wxGridBagSizer* sizerGenerator = new wxGridBagSizer( styleguide().getRelatedControlMargin(wxHORIZONTAL), styleguide().getRelatedControlMargin(wxVERTICAL)); sizerGenerator->Add(radio_generator_new, wxGBPosition(0, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); sizerGenerator->Add(textctrl_generator_name, wxGBPosition(0, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL | wxEXPAND); sizerGenerator->Add(radio_generator_existing, wxGBPosition(1, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); sizerGenerator->Add(choice_generator, wxGBPosition(1, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL | wxEXPAND); sizerGenerator->AddGrowableCol(1); // stack everything vertically wxBoxSizer* sizerControls = new wxBoxSizer(wxVERTICAL); sizerControls->Add(sizerTop, 0, wxEXPAND); sizerControls->Add(0, styleguide().getUnrelatedControlMargin(wxVERTICAL)); sizerControls->Add(checkbox_notnull); sizerControls->Add(0, styleguide().getUnrelatedControlMargin(wxVERTICAL)); sizerControls->Add(static_line_autoinc, 0, wxEXPAND); sizerControls->Add(0, styleguide().getRelatedControlMargin(wxVERTICAL)); sizerControls->Add(label_autoinc); sizerControls->Add(0, styleguide().getRelatedControlMargin(wxVERTICAL)); sizerControls->Add(sizerGenerator, 0, wxEXPAND); sizerControls->Add(0, styleguide().getUnrelatedControlMargin(wxVERTICAL)); sizerControls->Add(checkbox_trigger); sizerControls->Add(0, styleguide().getRelatedControlMargin(wxVERTICAL)); sizerControls->Add(textctrl_sql, 1, wxEXPAND); // create sizer for buttons -> styleguide class will align it correctly wxSizer* sizerButtons = styleguide().createButtonSizer(button_ok, button_cancel); // use method in base class to set everything up layoutSizers(sizerControls, sizerButtons, true); } //----------------------------------------------------------------------------- const wxString FieldPropertiesDialog::getName() const { return wxT("FieldPropertiesDialog"); } //----------------------------------------------------------------------------- void FieldPropertiesDialog::subjectRemoved(Subject* subject) { if ((subject) && ((subject == tableM) || (subject == columnM))) { subject->detachObserver(this); EndModal(wxID_CANCEL); } } //----------------------------------------------------------------------------- void FieldPropertiesDialog::update() { updateControls(); } //----------------------------------------------------------------------------- bool FieldPropertiesDialog::getDomainInfo(const wxString& domain, wxString& type, wxString& size, wxString& scale, wxString& charset) { if (DatabasePtr db = tableM->getDatabase()) { if (DomainPtr dm = db->getDomain(domain)) { dm->getDatatypeParts(type, size, scale); charset = dm->getCharset(); return true; } } return false; } //----------------------------------------------------------------------------- bool FieldPropertiesDialog::getIsNewDomainSelected() { // first item is "[Create new]" // Note: The following code does not work when there are no user defined // domains: // return choice_domain->GetSelection() == 0; return choice_domain->GetStringSelection() == _("[Create new]"); } //----------------------------------------------------------------------------- // UDD = user defined domain // AGD = auto generated domain (those starting with RDB$) bool FieldPropertiesDialog::getStatementsToExecute(wxString& statements, bool justCheck) { wxString colNameSql(Identifier::userString(textctrl_fieldname->GetValue())); Identifier selDomain(choice_domain->GetStringSelection()); bool newDomain = getIsNewDomainSelected(); wxString selDatatype = choice_datatype->GetStringSelection(); wxString dtSize = textctrl_size->GetValue(); wxString dtScale = textctrl_scale->GetValue(); bool isNullable = !checkbox_notnull->IsChecked(); int n = choice_datatype->GetSelection(); if (n >= 0 && n < datatypescnt) { if (!datatypes[n].hasSize) dtSize.Clear(); if (!datatypes[n].hasScale) dtScale.Clear(); } wxString alterTable = wxT("ALTER TABLE ") + tableM->getQuotedName() + wxT(" "); enum unn { unnNone, unnBefore, unnAfter } update_not_null = unnNone; // detect changes to existing field, create appropriate SQL actions if (columnM) { // field name changed ? // compare regardless of active quoting rules, so that name // will remain unchanged if edit field contents haven't changed // OR if the altered name would result in same SQL identifier if (textctrl_fieldname->GetValue() == columnM->getName_() || colNameSql == columnM->getQuotedName()) { // no changes -> use original name for all other statements colNameSql = columnM->getQuotedName(); } else { statements += alterTable + wxT("ALTER ") + columnM->getQuotedName() + wxT(" TO ") + colNameSql + wxT(";\n\n"); } // domain changed ? wxString type, size, scale, charset; if (!getDomainInfo(columnM->getSource(), type, size, scale, charset)) { ::wxMessageBox(_("Can not get domain info - aborting."), _("Error"), wxOK | wxICON_ERROR); return false; } if (columnM->getSource() != selDomain.get() && !newDomain) { // UDD -> other UDD or AGD -> UDD statements += alterTable + wxT("ALTER ") + colNameSql + wxT(" TYPE ") + selDomain.getQuoted() + wxT(";\n\n"); } else if (newDomain || type.CmpNoCase(selDatatype) || size != dtSize || scale != dtScale) { // UDD -> AGD or AGD -> different AGD statements += alterTable + wxT("ALTER ") + colNameSql + wxT(" TYPE "); statements += selDatatype; if (!dtSize.IsEmpty()) { statements += wxT("(") + dtSize; if (!dtScale.IsEmpty()) statements += wxT(",") + dtScale; statements += wxT(")"); } statements += wxT(";\n\n"); } // not null option changed ? if (isNullable != columnM->isNullable()) { if (!isNullable) // change from NULL to NOT NULL update_not_null = unnBefore; statements += wxT("UPDATE RDB$RELATION_FIELDS SET RDB$NULL_FLAG = "); if (isNullable) statements += wxT("NULL"); else statements += wxT("1"); // direct change in RDB$RELATION_FIELDS needs unquoted field name Identifier id; id.setFromSql(colNameSql); wxString fnm = id.get(); fnm.Replace(wxT("'"), wxT("''")); statements += wxT("\nWHERE RDB$FIELD_NAME = '") + fnm + wxT("' AND RDB$RELATION_NAME = '") + tableM->getName_() + wxT("';\n\n"); } } else // create new field { wxString addCollate; statements += alterTable + wxT("ADD \n") + colNameSql + wxT(" "); if (newDomain) { statements += selDatatype; if (!dtSize.IsEmpty()) { statements += wxT("(") + dtSize; if (!dtScale.IsEmpty()) statements += wxT(",") + dtScale; statements += wxT(")"); } if (datatypes[n].isChar) { wxString charset = choice_charset->GetStringSelection(); wxString collate = choice_collate->GetStringSelection(); if (!charset.IsEmpty()) { statements += wxT(" CHARACTER SET ") + charset; if (!collate.IsEmpty()) addCollate = wxT(" COLLATE ") + collate; } } } else statements += selDomain.getQuoted(); if (!isNullable) { statements += wxT(" NOT NULL"); update_not_null = unnAfter; } statements += addCollate + wxT(";\n\n"); } if (update_not_null != unnNone && !justCheck) { wxString s = ::wxGetTextFromUser( _("Enter value for existing fields containing NULL"), _("Update Existing NULL Values"), wxT(""), this); wxString sqlAdd = wxT("UPDATE ") + tableM->getQuotedName() + wxT(" \nSET ") + colNameSql + wxT(" = '") + s + wxT("' \nWHERE ") + colNameSql + wxT(" IS NULL;\n"); if (update_not_null == unnBefore) statements = sqlAdd + statements; else statements += wxT("COMMIT;\n") + sqlAdd; } statements += textctrl_sql->GetValue(); return !statements.IsEmpty(); } //----------------------------------------------------------------------------- const wxString FieldPropertiesDialog::getStatementsToExecute() { wxString statements; getStatementsToExecute(statements, false); return statements; } //----------------------------------------------------------------------------- void FieldPropertiesDialog::loadCharsets() { wxWindowUpdateLocker freeze(choice_charset); choice_charset->Clear(); choice_charset->Append(wxT("NONE")); if (DatabasePtr db = tableM->getDatabase()) { wxString stmt = wxT("select rdb$character_set_name") wxT(" from rdb$character_sets order by 1"); wxArrayString charsets(db->loadIdentifiers(stmt)); charsets.Remove(wxT("NONE")); choice_charset->Append(charsets); } } //----------------------------------------------------------------------------- void FieldPropertiesDialog::loadCollations() { wxWindowUpdateLocker freeze(choice_collate); choice_collate->Clear(); if (DatabasePtr db = tableM->getDatabase()) { wxString charset(choice_charset->GetStringSelection()); choice_collate->Append(db->getCollations(charset)); } } //----------------------------------------------------------------------------- void FieldPropertiesDialog::loadDomains() { wxWindowUpdateLocker freeze(choice_domain); choice_domain->Clear(); if (columnM == 0 || !MetadataItem::hasSystemPrefix(columnM->getSource())) { choice_domain->Append(_("[Create new]")); if (!columnM) choice_domain->SetSelection(0); } if (DatabasePtr db = tableM->getDatabase()) { if (columnM) { wxString name(columnM->getSource()); if (!name.empty()) choice_domain->Append(name); } DomainsPtr ds(db->getDomains()); for (Domains::const_iterator it = ds->begin(); it != ds->end(); ++it) choice_domain->Append((*it)->getName_()); } } //----------------------------------------------------------------------------- void FieldPropertiesDialog::loadGeneratorNames() { wxWindowUpdateLocker freeze(choice_generator); choice_generator->Clear(); if (DatabasePtr db = tableM->getDatabase()) { GeneratorsPtr gs(db->getGenerators()); for (Generators::const_iterator it = gs->begin(); it != gs->end(); ++it) { choice_generator->Append((*it)->getName_()); } } } //----------------------------------------------------------------------------- void FieldPropertiesDialog::setControlsProperties() { // set dialog title wxString fmt; if (columnM) fmt = _("Table %s: Field Properties"); else fmt = _("Table %s: Create New Field"); SetTitle(wxString::Format(fmt, tableM->getName_().c_str())); // bold font for "Autoincrement" label wxFont font(label_autoinc->GetFont()); font.SetWeight(wxBOLD); label_autoinc->SetFont(font); // select items in controls without selection, this is called after // database and field (if applicable) have been set if (choice_domain->GetCount() > 0 && choice_domain->GetSelection() == wxNOT_FOUND) choice_domain->SetSelection(0); if (choice_datatype->GetCount() > 0 && choice_datatype->GetSelection() == wxNOT_FOUND) choice_datatype->SetSelection(0); if (choice_charset->GetCount() > 0 && choice_charset->GetSelection() == wxNOT_FOUND) choice_charset->SetSelection(0); textctrl_generator_name->SetEditable(false); updateColors(); radio_generator_existing->SetValue(true); if (choice_generator->GetCount() > 0 && choice_generator->GetSelection() == wxNOT_FOUND) choice_generator->SetSelection(0); button_ok->SetDefault(); button_cancel->SetFocus(); } //----------------------------------------------------------------------------- void FieldPropertiesDialog::updateColumnControls() { if (columnM) { textctrl_fieldname->SetValue(columnM->getQuotedName()); checkbox_notnull->SetValue(!columnM->isNullable()); choice_domain->SetSelection( choice_domain->FindString(columnM->getSource())); updateDomainControls(); loadCollations(); choice_collate->SetSelection( choice_collate->FindString(columnM->getCollation())); } updateDatatypeInfo(); } //----------------------------------------------------------------------------- void FieldPropertiesDialog::updateControls() { button_ok->Enable(!textctrl_fieldname->GetValue().IsEmpty()); wxString genName; if (tableM) genName = wxT("GEN_") + tableM->getName_() + wxT("_ID"); textctrl_generator_name->SetValue(genName); loadGeneratorNames(); loadCharsets(); loadDomains(); updateColumnControls(); } //----------------------------------------------------------------------------- void FieldPropertiesDialog::updateDatatypeInfo() { int n = choice_datatype->GetSelection(); bool indexOk = n >= 0 && n < datatypescnt; choice_charset->Enable(columnM == 0 && indexOk && datatypes[n].isChar); if (!choice_charset->IsEnabled()) choice_charset->SetSelection(wxNOT_FOUND); textctrl_size->SetEditable(indexOk && datatypes[n].hasSize); if (!textctrl_size->IsEditable()) textctrl_size->SetValue(wxEmptyString); textctrl_scale->SetEditable(indexOk && datatypes[n].hasScale); if (!textctrl_scale->IsEditable()) textctrl_scale->SetValue(wxEmptyString); choice_collate->Enable(columnM == 0 && indexOk && datatypes[n].isChar); if (!choice_collate->IsEnabled()) choice_collate->SetSelection(wxNOT_FOUND); updateColors(); } //----------------------------------------------------------------------------- void FieldPropertiesDialog::updateDomainControls() { wxString domain = choice_domain->GetStringSelection(); bool newDomain = getIsNewDomainSelected(); if (!newDomain) updateDomainInfo(domain); // data type, size, scale and collate are not editable for all other // already existing domains bool allowEdit = (newDomain || domain.Mid(0, 4) == wxT("RDB$")); choice_datatype->Enable(allowEdit); if (allowEdit) updateDatatypeInfo(); else { textctrl_size->SetEditable(false); textctrl_scale->SetEditable(false); choice_collate->Enable(false); updateColors(); // charset is editable only for new fields with new domain choice_charset->Enable(columnM == 0 && newDomain); } } //----------------------------------------------------------------------------- void FieldPropertiesDialog::updateDomainInfo(const wxString& domain) { wxString type, size, scale, charset; if (!getDomainInfo(domain, type, size, scale, charset)) return; textctrl_scale->SetValue(scale); textctrl_size->SetValue(size); choice_datatype->SetSelection(choice_datatype->FindString(type)); choice_charset->SetSelection(choice_charset->FindString(charset)); } //----------------------------------------------------------------------------- void FieldPropertiesDialog::updateSqlStatement() { wxString fNameSql(Identifier::userString(textctrl_fieldname->GetValue())); Identifier generator(choice_generator->GetStringSelection()); wxString sql; if (radio_generator_new->GetValue()) { generator.setText(textctrl_generator_name->GetValue()); sql = wxT("CREATE GENERATOR ") + generator.getQuoted() + wxT(";\n\n"); } if (checkbox_trigger->IsChecked()) { // TODO: we could use BIGINT for FB 1.5 and above Identifier triggername(tableM->getName_() + wxT("_BI")); sql += wxT("SET TERM !! ;\n"); sql += wxT("CREATE TRIGGER ") + triggername.getQuoted() + wxT(" FOR ") + tableM->getQuotedName() + wxT("\n") + wxT("ACTIVE BEFORE INSERT POSITION 0\nAS\n") + wxT("DECLARE VARIABLE tmp DECIMAL(18,0);\nBEGIN\n") + wxT(" IF (NEW.") + fNameSql + wxT(" IS NULL) THEN\n") + wxT(" NEW.") + fNameSql + wxT(" = GEN_ID(") + generator.getQuoted() + wxT(", 1);\n") + wxT(" ELSE\n BEGIN\n tmp = GEN_ID(") + generator.getQuoted() + wxT(", 0);\n if (tmp < new.") + fNameSql + wxT(") then\n tmp = GEN_ID(") + generator.getQuoted() + wxT(", new.") + fNameSql + wxT("-tmp);\n END\nEND!!\n"); sql += wxT("SET TERM ; !!\n"); } textctrl_sql->SetValue(sql); } //----------------------------------------------------------------------------- //! event handling BEGIN_EVENT_TABLE(FieldPropertiesDialog, BaseDialog) EVT_BUTTON(FieldPropertiesDialog::ID_button_edit_domain, FieldPropertiesDialog::OnButtonEditDomainClick) EVT_BUTTON(wxID_OK, FieldPropertiesDialog::OnButtonOkClick) EVT_CHECKBOX(FieldPropertiesDialog::ID_checkbox_trigger, FieldPropertiesDialog::OnNeedsUpdateSql) EVT_CHOICE(FieldPropertiesDialog::ID_choice_charset, FieldPropertiesDialog::OnChoiceCharsetClick) EVT_CHOICE(FieldPropertiesDialog::ID_choice_datatype, FieldPropertiesDialog::OnChoiceDatatypeClick) EVT_CHOICE(FieldPropertiesDialog::ID_choice_domain, FieldPropertiesDialog::OnChoiceDomainClick) EVT_CHOICE(FieldPropertiesDialog::ID_choice_generator, FieldPropertiesDialog::OnNeedsUpdateSql) EVT_RADIOBUTTON(FieldPropertiesDialog::ID_radio_generator_existing, FieldPropertiesDialog::OnRadioGeneratorClick) EVT_RADIOBUTTON(FieldPropertiesDialog::ID_radio_generator_new, FieldPropertiesDialog::OnRadioGeneratorClick) EVT_TEXT(FieldPropertiesDialog::ID_textctrl_fieldname, FieldPropertiesDialog::OnTextFieldnameUpdate) EVT_TEXT(FieldPropertiesDialog::ID_textctrl_generator_name, FieldPropertiesDialog::OnNeedsUpdateSql) END_EVENT_TABLE() //----------------------------------------------------------------------------- void FieldPropertiesDialog::OnButtonEditDomainClick(wxCommandEvent& WXUNUSED(event)) { if (getIsNewDomainSelected()) { // no domain selected return; } // TODO: // create DomainPropertiesFrame & show it // when done, reload domain definition // updateDomainInfo(wx2std(cb_domains->GetValue())); // Currently we just open the SQL editor and close this dialog wxString domain = choice_domain->GetStringSelection(); if (DatabasePtr db = tableM->getDatabase()) { Domain* d = dynamic_cast(db->findByNameAndType(ntDomain, domain)); if (d) { showSql(GetParent(), _("Alter domain"), db, d->getAlterSqlTemplate()); EndModal(wxID_CANCEL); } } } //----------------------------------------------------------------------------- void FieldPropertiesDialog::OnButtonOkClick(wxCommandEvent& WXUNUSED(event)) { updateSqlStatement(); wxString statements; if (getStatementsToExecute(statements, true)) EndModal(wxID_OK); } //----------------------------------------------------------------------------- wxString FieldPropertiesDialog::getStatementTitle() const { if (columnM) return _("Executing Field Modification Script"); else return _("Executing Field Creation Script"); } //----------------------------------------------------------------------------- void FieldPropertiesDialog::OnChoiceCharsetClick(wxCommandEvent& WXUNUSED(event)) { wxString oldCol(choice_collate->GetStringSelection()); loadCollations(); choice_collate->SetSelection(choice_collate->FindString(oldCol)); } //----------------------------------------------------------------------------- void FieldPropertiesDialog::OnChoiceDatatypeClick(wxCommandEvent& WXUNUSED(event)) { updateDatatypeInfo(); } //----------------------------------------------------------------------------- void FieldPropertiesDialog::OnChoiceDomainClick(wxCommandEvent& WXUNUSED(event)) { updateDomainControls(); } //----------------------------------------------------------------------------- void FieldPropertiesDialog::OnNeedsUpdateSql(wxCommandEvent& WXUNUSED(event)) { updateSqlStatement(); } //----------------------------------------------------------------------------- void FieldPropertiesDialog::OnRadioGeneratorClick(wxCommandEvent& WXUNUSED(event)) { textctrl_generator_name->SetEditable(radio_generator_new->GetValue()); updateColors(); choice_generator->Enable(radio_generator_existing->GetValue()); updateSqlStatement(); } //----------------------------------------------------------------------------- void FieldPropertiesDialog::OnTextFieldnameUpdate(wxCommandEvent& WXUNUSED(event)) { button_ok->Enable(!textctrl_fieldname->GetValue().IsEmpty()); updateSqlStatement(); } //----------------------------------------------------------------------------- class ColumnPropertiesHandler: public URIHandler, private MetadataItemURIHandlerHelper, private GUIURIHandlerHelper { public: ColumnPropertiesHandler() {}; bool handleURI(URI& uri); private: // singleton; registers itself on creation. static const ColumnPropertiesHandler handlerInstance; }; //----------------------------------------------------------------------------- const ColumnPropertiesHandler ColumnPropertiesHandler::handlerInstance; //----------------------------------------------------------------------------- bool ColumnPropertiesHandler::handleURI(URI& uri) { bool addField = uri.action == wxT("add_field"); bool editField = uri.action == wxT("edit_field"); if (!addField && !editField) return false; wxWindow* w = getParentWindow(uri); MetadataItem* mo = extractMetadataItemFromURI(uri); if (!mo || !w) return true; Column* c = 0; Table* t; if (addField) t = (Table*)mo; else { c = (Column*)mo; t = c->getTable(); } wxString statements, title; { // we want FPD to go out of scope and get destroyed since the action in // ESF can destroy the field, and take down the FPD. Accessing FPD in turn // leads to mysterious crash FieldPropertiesDialog fpd(w, t, c); // NOTE: this has been moved here from OnOkButtonClick() to make frame // activation work properly. Basically activation of another // frame has to happen outside wxDialog::ShowModal(), because it // does at the end re-focus the last focused control, raising // the parent frame over the newly created sql execution frame if (fpd.ShowModal() == wxID_OK) { statements = fpd.getStatementsToExecute(); title = fpd.getStatementTitle(); } } if (!statements.IsEmpty()) execSql(w, title, t->getDatabase(), statements, true); return true; } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/FieldPropertiesDialog.h000066400000000000000000000106441177057155300241540ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_FIELDPROPERTIESDIALOG_H #define FR_FIELDPROPERTIESDIALOG_H //----------------------------------------------------------------------------- #include #include #include "core/Observer.h" #include "gui/BaseDialog.h" class Database; class Table; class Column; //----------------------------------------------------------------------------- class FieldPropertiesDialog: public BaseDialog, public Observer { private: DatabasePtr databaseM; Table* tableM; Column* columnM; wxStaticText* label_fieldname; wxTextCtrl* textctrl_fieldname; wxStaticText* label_domain; wxChoice* choice_domain; wxButton* button_edit_domain; wxStaticText* label_datatype; wxChoice* choice_datatype; wxStaticText* label_size; wxTextCtrl* textctrl_size; wxStaticText* label_scale; wxTextCtrl* textctrl_scale; wxCheckBox* checkbox_notnull; wxStaticText* label_charset; wxChoice* choice_charset; wxStaticText* label_collate; wxChoice* choice_collate; wxStaticLine* static_line_autoinc; wxStaticText* label_autoinc; wxRadioButton* radio_generator_new; wxTextCtrl* textctrl_generator_name; wxRadioButton* radio_generator_existing; wxChoice* choice_generator; wxCheckBox* checkbox_trigger; wxTextCtrl* textctrl_sql; wxButton* button_ok; wxButton* button_cancel; void createControls(); bool getDomainInfo(const wxString& domain, wxString& type, wxString& size, wxString& scale, wxString& charset); bool getIsNewDomainSelected(); bool getStatementsToExecute(wxString& statements, bool justCheck); void layoutControls(); void loadCharsets(); void loadCollations(); void loadDomains(); void loadGeneratorNames(); void setControlsProperties(); void updateColumnControls(); void updateControls(); void updateDatatypeInfo(); void updateDomainControls(); void updateDomainInfo(const wxString& domain); void updateSqlStatement(); // observer stuff virtual void subjectRemoved(Subject* subject); virtual void update(); protected: virtual const wxString getName() const; public: // Database is required so that domains, charsets, generators can be loaded FieldPropertiesDialog(wxWindow* parent, Table* table, Column* column = 0); wxString getStatementTitle() const; const wxString getStatementsToExecute(); private: // event handling enum { ID_textctrl_fieldname = 101, ID_choice_domain, ID_button_edit_domain, ID_choice_datatype, ID_choice_charset, ID_choice_collate, ID_radio_generator_new, ID_textctrl_generator_name, ID_radio_generator_existing, ID_choice_generator, ID_checkbox_trigger }; void OnButtonEditDomainClick(wxCommandEvent& event); void OnButtonOkClick(wxCommandEvent& event); void OnChoiceCharsetClick(wxCommandEvent& event); void OnChoiceDatatypeClick(wxCommandEvent& event); void OnChoiceDomainClick(wxCommandEvent& event); void OnNeedsUpdateSql(wxCommandEvent& event); void OnRadioGeneratorClick(wxCommandEvent& event); void OnTextFieldnameUpdate(wxCommandEvent& event); DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- #endif // FR_FIELDPROPERTIESDIALOG_H flamerobin_0.9.3~svn+2220.orig/src/gui/FindDialog.cpp000066400000000000000000000423241177057155300222670ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include "gui/FindDialog.h" #include "gui/StyleGuide.h" //----------------------------------------------------------------------------- FindFlags::FindFlags() { flags = se::DEFAULT; } //----------------------------------------------------------------------------- bool FindFlags::has(unsigned int flag) const { return ((flags & flag) == flag); } //----------------------------------------------------------------------------- void FindFlags::remove(unsigned int flag) { flags &= ~flag; } //----------------------------------------------------------------------------- void FindFlags::add(unsigned int flag) { flags |= flag; } //----------------------------------------------------------------------------- int FindFlags::asStc() const // returns "flags" converted to wxSTC search flags { int retval = 0; if (has(se::WHOLE_WORD)) retval |= wxSTC_FIND_WHOLEWORD; if (has(se::MATCH_CASE)) retval |= wxSTC_FIND_MATCHCASE; if (has(se::REGULAR_EXPRESSION)) retval |= wxSTC_FIND_REGEXP; return retval; } //----------------------------------------------------------------------------- // Used for debugging void FindFlags::show() const { wxString retval(wxString::Format(wxT("Flags (%d) contains:\n"), flags)); if (has(se::WHOLE_WORD)) retval += wxT("se::WHOLE_WORD\n"); if (has(se::MATCH_CASE)) retval += wxT("se::MATCH_CASE\n"); if (has(se::REGULAR_EXPRESSION)) retval += wxT("se::REGULAR_EXPRESSION\n"); if (has(se::FROM_TOP)) retval += wxT("se::FROM_TOP\n"); if (has(se::WRAP)) retval += wxT("se::WRAP\n"); if (has(se::CONVERT_BACKSLASH)) retval += wxT("se::CONVERT_BACKSLASH\n"); wxMessageBox(retval); } //----------------------------------------------------------------------------- FindFlags& FindFlags::operator= (const FindFlags& source) { flags = source.flags; return *this; } //----------------------------------------------------------------------------- //! wxStyledTextCtrl with Search&Replace capability SearchableEditor::SearchableEditor(wxWindow *parent, wxWindowID id) : wxStyledTextCtrl(parent, id, wxDefaultPosition, wxDefaultSize, wxBORDER_THEME), fd(0) { } //----------------------------------------------------------------------------- wxString SearchableEditor::convertBackslashes(const wxString& source) { wxString result(source); result.Replace(wxT("\\n"), wxT("\n")); result.Replace(wxT("\\r"), wxT("\r")); result.Replace(wxT("\\t"), wxT("\t")); while (true) // hexadecimal bytes can be given if format: \xNN where NN is in range from 00 to ff { int p = result.Find(wxT("\\x")); if (p == -1) break; unsigned long number; if (result.Mid(p+2, 2).ToULong(&number, 16)) { result.Remove(p, 3); result[p] = (wxChar)number; } else { wxMessageBox(_("Only single-byte hexadecimal numbers are allowed\nin format: \\xNN, where NN is in range 00-ff"), _("Error in escape sequence"), wxICON_WARNING|wxOK); break; } } result.Replace(wxT("\\\\"), wxT("\\")); return result; } //----------------------------------------------------------------------------- void SearchableEditor::setupSearch(const wxString& findText, const wxString& replaceText, const FindFlags& flags) { findFlagsM = flags; if (findFlagsM.has(se::CONVERT_BACKSLASH)) { findTextM = convertBackslashes(findText); replaceTextM = convertBackslashes(replaceText); } else { findTextM = findText; replaceTextM = replaceText; } } //----------------------------------------------------------------------------- bool SearchableEditor::find(bool newSearch) { if (!fd) fd = new FindDialog(this, ::wxGetTopLevelParent(this)); if (newSearch || findTextM.empty()) { if (newSearch) { // find selected text wxString findText(GetSelectedText()); // failing that initialize with the word at the caret if (findText.empty()) { int pos = GetCurrentPos(); int start = WordStartPosition(pos, true); int end = WordEndPosition(pos, true); if (end > start) findText = GetTextRange(start, end); } fd->SetFindText(findText); } // do not re-center dialog if it is already visible if (!fd->IsShown()) fd->Show(); fd->SetFocus(); return false; // <- caller shouldn't care about this } int start = GetSelectionEnd(); if (findFlagsM.has(se::FROM_TOP)) { start = 0; findFlagsM.remove(se::ALERT); // remove flag after first find } int end = GetTextLength(); int p = FindText(start, end, findTextM, findFlagsM.asStc()); if (p == -1) { if (findFlagsM.has(se::WRAP)) p = FindText(0, end, findTextM, findFlagsM.asStc()); if (p == -1) { if (findFlagsM.has(se::ALERT)) wxMessageBox(_("No more matches"), _("Search complete"), wxICON_INFORMATION|wxOK); return false; } } centerCaret(true); GotoPos(p); GotoPos(p + findTextM.Length()); SetSelectionStart(p); SetSelectionEnd(p + findTextM.Length()); centerCaret(false); return true; } //----------------------------------------------------------------------------- bool SearchableEditor::replace(bool force) { int start = GetSelectionStart(); int end = GetSelectionEnd(); if (start == end || FindText(start, end, findTextM, findFlagsM.asStc()) == -1) { if (!find(false)) return false; if (!force) return false; } // we have selection here start = GetSelectionStart(); ReplaceSelection(replaceTextM); SetSelectionEnd(start + replaceTextM.Length()); // position at end of replaced text find(false); return true; } //----------------------------------------------------------------------------- int SearchableEditor::replaceAll() { int caret = GetSelectionStart(); // remember position, so we return to some sensible place at end SetSelectionStart(0); // start from beginning of file SetSelectionEnd(0); findFlagsM.remove(se::FROM_TOP); bool alert = findFlagsM.has(se::ALERT); if (alert) findFlagsM.remove(se::ALERT); // turn flag off temporary (we'll popup a different message) bool wrap = findFlagsM.has(se::WRAP); if (wrap) findFlagsM.remove(se::WRAP); // turn it off to prevent endless loop (if replace text contains search text) int cnt = 0; while (replace(true)) cnt++; if (alert) { wxMessageBox(wxString::Format(_("%d replacements were made."), cnt), _("Replace"), wxICON_INFORMATION|wxOK); findFlagsM.add(se::ALERT); // turn it back on } if (wrap) // turn it back on findFlagsM.add(se::WRAP); SetSelectionStart(caret); SetSelectionEnd(caret); return cnt; } //----------------------------------------------------------------------------- int SearchableEditor::replaceInSelection() { findFlagsM.remove(se::FROM_TOP); // turn flag off bool alert = findFlagsM.has(se::ALERT); if (alert) findFlagsM.remove(se::ALERT); // turn flag off temporary bool wrap = findFlagsM.has(se::WRAP); if (wrap) findFlagsM.remove(se::WRAP); // turn it off to prevent endless loop (if replace text contains search text) int cnt = 0; int selstart = GetSelectionStart(); int selend = GetSelectionEnd(); SetSelectionEnd(selstart); // start replace from here while (find(false)) { int start = GetSelectionStart(); int end = GetSelectionEnd(); if (end <= selend) // in range { selend += replaceTextM.Length() - (end-start); // expand/contract range ReplaceSelection(replaceTextM); SetSelectionEnd(start + replaceTextM.Length()); // move to appropriate position for next find() cnt++; } else break; } if (alert) { wxMessageBox(wxString::Format(_("%d replacements were made."), cnt), _("Replace"), wxICON_INFORMATION|wxOK); findFlagsM.add(se::ALERT); // turn it back on } if (wrap) // turn it back on findFlagsM.add(se::WRAP); SetSelectionStart(selstart); SetSelectionEnd(selend); return cnt; } //----------------------------------------------------------------------------- void SearchableEditor::centerCaret(bool doCenter) { if (doCenter) // try to keep it in center of screen { SetXCaretPolicy(wxSTC_CARET_STRICT|wxSTC_CARET_EVEN, 0); SetYCaretPolicy(wxSTC_CARET_STRICT|wxSTC_CARET_EVEN, 0); } else { SetXCaretPolicy(wxSTC_CARET_SLOP|wxSTC_CARET_EVEN|wxSTC_CARET_STRICT, 50); SetYCaretPolicy(wxSTC_CARET_SLOP|wxSTC_CARET_EVEN|wxSTC_CARET_STRICT, 2); } } //----------------------------------------------------------------------------- FindDialog::FindDialog(SearchableEditor *editor, wxWindow* parent, const wxString& title, FindFlags *allowedFlags) :BaseDialog(parent, -1, title) { parentEditorM = editor; FindFlags flags; if (allowedFlags) flags = *allowedFlags; // copy settings label_find = new wxStaticText(getControlsPanel(), -1, _("Fi&nd:")); text_ctrl_find = new wxTextCtrl(getControlsPanel(), -1); label_replace = new wxStaticText(getControlsPanel(), -1, _("Re&place with:")); text_ctrl_replace = new wxTextCtrl(getControlsPanel(), -1); checkbox_wholeword = checkbox_matchcase = checkbox_regexp = checkbox_convertbs = checkbox_wrap = checkbox_fromtop = 0; if (flags.has(se::WHOLE_WORD)) checkbox_wholeword = new wxCheckBox(getControlsPanel(), -1, _("Whole &word only")); if (flags.has(se::MATCH_CASE)) checkbox_matchcase = new wxCheckBox(getControlsPanel(), -1, _("&Match case")); if (flags.has(se::REGULAR_EXPRESSION)) checkbox_regexp = new wxCheckBox(getControlsPanel(), -1, _("Regular e&xpression")); if (flags.has(se::CONVERT_BACKSLASH)) checkbox_convertbs = new wxCheckBox(getControlsPanel(), -1, _("Convert &backslashes")); if (flags.has(se::WRAP)) checkbox_wrap = new wxCheckBox(getControlsPanel(), -1, _("Wrap ar&ound")); if (flags.has(se::FROM_TOP)) checkbox_fromtop = new wxCheckBox(getControlsPanel(), -1, _("Start search from &top")); button_find = new wxButton(getControlsPanel(), wxID_FIND, _("&Find")); button_replace = new wxButton(getControlsPanel(), wxID_REPLACE, _("&Replace")); button_replace_all = new wxButton(getControlsPanel(), wxID_REPLACE_ALL, _("Replace &all")); button_replace_in_selection = new wxButton(getControlsPanel(), ID_button_replace_in_selection, _("In &selection")); button_close = new wxButton(getControlsPanel(), wxID_CANCEL, _("&Close")); do_layout(); button_find->SetDefault(); text_ctrl_find->SetFocus(); } //----------------------------------------------------------------------------- void FindDialog::do_layout() { wxFlexGridSizer* sizerEdits = new wxFlexGridSizer(2, 2, styleguide().getRelatedControlMargin(wxVERTICAL), styleguide().getControlLabelMargin()); sizerEdits->Add(label_find, 0, wxALIGN_CENTER_VERTICAL); sizerEdits->Add(text_ctrl_find, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL); sizerEdits->Add(label_replace, 0, wxALIGN_CENTER_VERTICAL); sizerEdits->Add(text_ctrl_replace, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL); sizerEdits->AddGrowableCol(1, 1); wxGridSizer* sizerChecks = new wxGridSizer(2, 2, styleguide().getCheckboxSpacing(), styleguide().getUnrelatedControlMargin(wxHORIZONTAL)); if (checkbox_wholeword) sizerChecks->Add(checkbox_wholeword); if (checkbox_matchcase) sizerChecks->Add(checkbox_matchcase); if (checkbox_regexp) sizerChecks->Add(checkbox_regexp); if (checkbox_convertbs) sizerChecks->Add(checkbox_convertbs); if (checkbox_wrap) sizerChecks->Add(checkbox_wrap); if (checkbox_fromtop) sizerChecks->Add(checkbox_fromtop); wxBoxSizer* sizerButtons = new wxBoxSizer(wxHORIZONTAL); sizerButtons->Add(0, 0, 1, wxEXPAND); sizerButtons->Add(button_find); sizerButtons->Add(styleguide().getBetweenButtonsMargin(wxHORIZONTAL), 0); sizerButtons->Add(button_replace); sizerButtons->Add(styleguide().getBetweenButtonsMargin(wxHORIZONTAL), 0); sizerButtons->Add(button_replace_all); sizerButtons->Add(styleguide().getBetweenButtonsMargin(wxHORIZONTAL), 0); sizerButtons->Add(button_replace_in_selection); sizerButtons->Add(styleguide().getBetweenButtonsMargin(wxHORIZONTAL), 0); sizerButtons->Add(button_close); wxBoxSizer* sizerControls = new wxBoxSizer(wxVERTICAL); sizerControls->Add(sizerEdits, 1, wxEXPAND); sizerControls->Add(0, styleguide().getUnrelatedControlMargin(wxVERTICAL)); sizerControls->Add(sizerChecks); // use method in base class to set everything up layoutSizers(sizerControls, sizerButtons); } //----------------------------------------------------------------------------- void FindDialog::setup() { FindFlags flags; if (!checkbox_wholeword->IsChecked()) flags.remove(se::WHOLE_WORD); if (!checkbox_matchcase->IsChecked()) flags.remove(se::MATCH_CASE); if (!checkbox_regexp->IsChecked()) flags.remove(se::REGULAR_EXPRESSION); if (!checkbox_convertbs->IsChecked()) flags.remove(se::CONVERT_BACKSLASH); if (!checkbox_wrap->IsChecked()) flags.remove(se::WRAP); if (!checkbox_fromtop->IsChecked()) flags.remove(se::FROM_TOP); wxString find = text_ctrl_find->GetValue(); wxString replace = text_ctrl_replace->GetValue(); parentEditorM->setupSearch(find, replace, flags); if (flags.has(se::FROM_TOP)) checkbox_fromtop->SetValue(false); } //----------------------------------------------------------------------------- void FindDialog::SetFindText(const wxString& text) { // don't overwrite search text with empty or multiline text if (text.empty() || text.find_first_of('\n') != wxString::npos) return; text_ctrl_find->ChangeValue(text); text_ctrl_find->SelectAll(); } //----------------------------------------------------------------------------- BEGIN_EVENT_TABLE(FindDialog, BaseDialog) EVT_BUTTON(wxID_FIND, FindDialog::OnFindButtonClick) EVT_BUTTON(wxID_REPLACE, FindDialog::OnReplaceButtonClick) EVT_BUTTON(wxID_REPLACE_ALL, FindDialog::OnReplaceAllButtonClick) EVT_BUTTON(FindDialog::ID_button_replace_in_selection, FindDialog::OnReplaceInSelectionButtonClick) END_EVENT_TABLE() //----------------------------------------------------------------------------- void FindDialog::OnFindButtonClick(wxCommandEvent& WXUNUSED(event)) { wxBusyCursor wait; setup(); parentEditorM->find(false); } //----------------------------------------------------------------------------- void FindDialog::OnReplaceButtonClick(wxCommandEvent& WXUNUSED(event)) { wxBusyCursor wait; setup(); parentEditorM->replace(); } //----------------------------------------------------------------------------- void FindDialog::OnReplaceAllButtonClick(wxCommandEvent& WXUNUSED(event)) { wxBusyCursor wait; setup(); parentEditorM->replaceAll(); } //----------------------------------------------------------------------------- void FindDialog::OnReplaceInSelectionButtonClick(wxCommandEvent& WXUNUSED(event)) { wxBusyCursor wait; setup(); parentEditorM->replaceInSelection(); } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/FindDialog.h000066400000000000000000000105321177057155300217300ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_FIND_DIALOG #define FR_FIND_DIALOG //----------------------------------------------------------------------------- #include #include #include #include "gui/BaseDialog.h" //----------------------------------------------------------------------------- namespace se // instead of defines { const unsigned int WHOLE_WORD = 1; const unsigned int MATCH_CASE = 2; const unsigned int REGULAR_EXPRESSION = 4; const unsigned int CONVERT_BACKSLASH = 8; const unsigned int WRAP = 16; const unsigned int FROM_TOP = 32; const unsigned int ALERT = 64; const unsigned int DEFAULT = 127; }; //----------------------------------------------------------------------------- class FindFlags { private: unsigned int flags; public: FindFlags(); bool has(unsigned int flag) const; void remove(unsigned int flag); void add(unsigned int flag); int asStc() const; // returns "flags" converted to wxSTC search flags FindFlags& operator=(const FindFlags& source); void show() const; }; //----------------------------------------------------------------------------- class FindDialog; //----------------------------------------------------------------------------- // this allows us to add search&replace to all wxSTC derivatives class SearchableEditor: public wxStyledTextCtrl { private: wxString convertBackslashes(const wxString& source); FindDialog *fd; FindFlags findFlagsM; wxString findTextM; wxString replaceTextM; // only accessible to FindDialog void setupSearch(const wxString& findText, const wxString& replaceText, const FindFlags& flags); bool replace(bool force = false); int replaceAll(); int replaceInSelection(); public: friend class FindDialog; bool find(bool newSearch); void centerCaret(bool doCenter); SearchableEditor(wxWindow *parent, wxWindowID id); }; //----------------------------------------------------------------------------- class FindDialog: public BaseDialog { protected: void setup(); void do_layout(); SearchableEditor *parentEditorM; wxCheckBox *checkbox_wholeword; // gui wxCheckBox *checkbox_matchcase; wxCheckBox *checkbox_regexp; wxCheckBox *checkbox_convertbs; wxCheckBox *checkbox_wrap; wxCheckBox *checkbox_fromtop; wxStaticText *label_find; wxStaticText *label_replace; wxTextCtrl *text_ctrl_find; wxTextCtrl *text_ctrl_replace; wxButton *button_find; wxButton *button_replace; wxButton *button_replace_all; wxButton *button_replace_in_selection; wxButton *button_close; public: enum { ID_button_replace_in_selection = 101 }; void OnFindButtonClick(wxCommandEvent &event); void OnReplaceButtonClick(wxCommandEvent &event); void OnReplaceAllButtonClick(wxCommandEvent &event); void OnReplaceInSelectionButtonClick(wxCommandEvent &event); FindDialog(SearchableEditor *editor, wxWindow* parent, const wxString& title = _("Find and replace"), FindFlags* allowedFlags = 0); void SetFindText(const wxString& text); DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- #endif flamerobin_0.9.3~svn+2220.orig/src/gui/GUIURIHandlerHelper.cpp000066400000000000000000000035241177057155300237300ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "gui/GUIURIHandlerHelper.h" //----------------------------------------------------------------------------- wxWindow* GUIURIHandlerHelper::getParentWindow(const URI& uri) { wxString ms = uri.getParam(wxT("parent_window")); unsigned long mo; if (!ms.ToULong(&mo)) return 0; return (wxWindow*)mo; } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/GUIURIHandlerHelper.h000066400000000000000000000032011177057155300233650ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_GUIURIHANDLERHELPER_H #define FR_GUIURIHANDLERHELPER_H //----------------------------------------------------------------------------- #include #include "core/URIProcessor.h" //----------------------------------------------------------------------------- // URI parsing helper for GUI-related URIHandlers. class GUIURIHandlerHelper { protected: wxWindow* getParentWindow(const URI& uri); }; //----------------------------------------------------------------------------- #endif // FR_GUIURIHANDLERHELPER_H flamerobin_0.9.3~svn+2220.orig/src/gui/HtmlHeaderMetadataItemVisitor.cpp000066400000000000000000000110701177057155300261360ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ //----------------------------------------------------------------------------- #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "gui/HtmlHeaderMetadataItemVisitor.h" #include "metadata/database.h" //----------------------------------------------------------------------------- HtmlHeaderMetadataItemVisitor::HtmlHeaderMetadataItemVisitor( std::vector& titles) : MetadataItemVisitor(), titlesM(titles) { } //----------------------------------------------------------------------------- HtmlHeaderMetadataItemVisitor::~HtmlHeaderMetadataItemVisitor() { } //----------------------------------------------------------------------------- void HtmlHeaderMetadataItemVisitor::visitDatabase(Database& database) { emptyTitles(); addSummary(); // database triggers have been introduced in Firebird 2.1 (ODS 11.1) if (database.getInfo().getODSVersionIsHigherOrEqualTo(11, 1)) addTriggers(); addDDL(); } //----------------------------------------------------------------------------- void HtmlHeaderMetadataItemVisitor::visitDomain(Domain& /*domain*/) { emptyTitles(); addSummary(); // TODO: Support dependencies retrieval in MetadataItem::getDependencies(). //addDependencies(); addDDL(); } //----------------------------------------------------------------------------- void HtmlHeaderMetadataItemVisitor::visitException(Exception& /*exception*/) { emptyTitles(); addSummary(); addDependencies(); addDDL(); } //----------------------------------------------------------------------------- void HtmlHeaderMetadataItemVisitor::visitFunction(Function& /*function*/) { emptyTitles(); addSummary(); addDependencies(); addDDL(); } //----------------------------------------------------------------------------- void HtmlHeaderMetadataItemVisitor::visitGenerator(Generator& /*generator*/) { emptyTitles(); addSummary(); addDependencies(); addDDL(); } //----------------------------------------------------------------------------- void HtmlHeaderMetadataItemVisitor::visitProcedure(Procedure& /*procedure*/) { emptyTitles(); addSummary(); addPrivileges(); addDependencies(); addDDL(); } //----------------------------------------------------------------------------- void HtmlHeaderMetadataItemVisitor::visitRole(Role& /*role*/) { emptyTitles(); addSummary(); addPrivileges(); addDDL(); } //----------------------------------------------------------------------------- void HtmlHeaderMetadataItemVisitor::visitTable(Table& /*table*/) { emptyTitles(); addSummary(); addConstraints(); addIndices(); addTriggers(); addPrivileges(); addDependencies(); addDDL(); } //----------------------------------------------------------------------------- void HtmlHeaderMetadataItemVisitor::visitTrigger(Trigger& /*trigger*/) { emptyTitles(); addSummary(); addDependencies(); addDDL(); } //----------------------------------------------------------------------------- void HtmlHeaderMetadataItemVisitor::visitView(View& /*view*/) { emptyTitles(); addSummary(); addTriggers(); addPrivileges(); addDependencies(); addDDL(); } //----------------------------------------------------------------------------- void HtmlHeaderMetadataItemVisitor::defaultAction() { emptyTitles(); } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/HtmlHeaderMetadataItemVisitor.h000066400000000000000000000054611177057155300256120ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_HTMLHEADERMETADATAITEMVISITOR_H #define FR_HTMLHEADERMETADATAITEMVISITOR_H #include "metadata/metadataitem.h" #include "metadata/MetadataItemVisitor.h" //----------------------------------------------------------------------------- class HtmlHeaderMetadataItemVisitor: public MetadataItemVisitor { public: HtmlHeaderMetadataItemVisitor(std::vector& titles); virtual ~HtmlHeaderMetadataItemVisitor(); virtual void visitDatabase(Database& database); virtual void visitDomain(Domain& domain); virtual void visitException(Exception& exception); virtual void visitFunction(Function& function); virtual void visitGenerator(Generator& generator); virtual void visitProcedure(Procedure& procedure); virtual void visitRole(Role& role); virtual void visitTable(Table& table); virtual void visitTrigger(Trigger& trigger); virtual void visitView(View& view); protected: virtual void defaultAction(); private: std::vector& titlesM; void emptyTitles() { titlesM.clear(); }; // TODO: These should be localizable - see also HtmlTemplateProcessor. void addSummary() { titlesM.push_back(wxT("Summary")); }; void addPrivileges() { titlesM.push_back(wxT("Privileges")); }; void addTriggers() { titlesM.push_back(wxT("Triggers")); }; void addConstraints() { titlesM.push_back(wxT("Constraints")); }; void addIndices() { titlesM.push_back(wxT("Indices")); }; void addDependencies() { titlesM.push_back(wxT("Dependencies")); }; void addDDL() { titlesM.push_back(wxT("DDL")); }; }; //----------------------------------------------------------------------------- #endif // FR_HTMLHEADERMETADATAITEMVISITOR_H flamerobin_0.9.3~svn+2220.orig/src/gui/HtmlTemplateProcessor.cpp000066400000000000000000000076541177057155300245760ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "core/StringUtils.h" #include "frutils.h" #include "gui/HtmlHeaderMetadataItemVisitor.h" #include "metadata/metadataitem.h" #include "HtmlTemplateProcessor.h" //----------------------------------------------------------------------------- class ProcessableObject; //----------------------------------------------------------------------------- HtmlTemplateProcessor::HtmlTemplateProcessor(ProcessableObject* object, wxWindow* window) : TemplateProcessor(object, window) { } //----------------------------------------------------------------------------- void HtmlTemplateProcessor::processCommand(const wxString& cmdName, const TemplateCmdParams& cmdParams, ProcessableObject* object, wxString& processedText) { TemplateProcessor::processCommand(cmdName, cmdParams, object, processedText); MetadataItem* metadataItem = dynamic_cast(object); if (!metadataItem) return; if (cmdName == wxT("header") && !cmdParams.empty()) // include another file { std::vector pages; HtmlHeaderMetadataItemVisitor v(pages); metadataItem->acceptVisitor(&v); wxString page = loadEntireFile(getTemplatePath() + wxT("header.html")); bool first = true; while (!page.Strip().IsEmpty()) { wxString::size_type p2 = page.find('|'); wxString part(page); if (p2 != wxString::npos) { part = page.substr(0, p2); page.Remove(0, p2+1); } else page.Clear(); for (std::vector::iterator it = pages.begin(); it != pages.end(); ++it) { if (part.Find(wxT(">")+(*it)+wxT("<")) == -1) continue; if (first) first = false; else processedText += wxT(" | "); wxString allParams = cmdParams.all(); if (part.Find(wxT(">") + allParams + wxT("<")) != -1) processedText += allParams; else internalProcessTemplateText(processedText, part, object); } } } } //----------------------------------------------------------------------------- wxString HtmlTemplateProcessor::escapeChars(const wxString& input, bool processNewlines) { return escapeHtmlChars(input, processNewlines); } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/HtmlTemplateProcessor.h000066400000000000000000000036021177057155300242300ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ //----------------------------------------------------------------------------- #ifndef FR_HTMLTEMPLATEPROCESSOR_H #define FR_HTMLTEMPLATEPROCESSOR_H #include "core/TemplateProcessor.h" //----------------------------------------------------------------------------- class HtmlTemplateProcessor: public TemplateProcessor { protected: virtual void processCommand(const wxString& cmdName, const TemplateCmdParams& cmdParams, ProcessableObject* object, wxString& processedText); public: HtmlTemplateProcessor(ProcessableObject* object, wxWindow* window); virtual wxString escapeChars(const wxString& input, bool processNewlines = true); }; //----------------------------------------------------------------------------- #endif // FR_HTMLTEMPLATEPROCESSOR_H flamerobin_0.9.3~svn+2220.orig/src/gui/InsertDialog.cpp000066400000000000000000000610101177057155300226440ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include "core/ArtProvider.h" #include "core/FRError.h" #include "core/StringUtils.h" #include "gui/controls/DataGridRowBuffer.h" #include "gui/controls/DataGridTable.h" #include "gui/InsertDialog.h" #include "gui/StyleGuide.h" #include "metadata/column.h" #include "metadata/database.h" #include "metadata/generator.h" #include "metadata/procedure.h" #include "metadata/table.h" #include "metadata/trigger.h" #include "metadata/view.h" /* The dialog creates a DataGridRowBuffer, and uses ResultsetColumnDefs from the active grid to format the values. I.e. new potential row is created and filled with values as the user types them. When all values are entered, we try to INSERT into database, and if all goes well, the prepared row buffer is simply added to the grid. */ //----------------------------------------------------------------------------- namespace InsertOptions { // make sure you keep these two in sync if you add/remove items const wxString insertOptionStrings[] = { wxT(""), wxT("NULL"), wxTRANSLATE("Skip (N/A)"), wxTRANSLATE("Column default"), wxTRANSLATE("Hexadecimal"), wxT("CURRENT_DATE"), wxT("CURRENT_TIME"), wxT("CURRENT_TIMESTAMP"), wxT("CURRENT_USER"), wxTRANSLATE("File..."), wxTRANSLATE("Generator...") }; typedef enum { ioRegular = 0, ioNull, ioSkip, ioDefault, ioHex, ioDate, ioTime, ioTimestamp, ioUser, ioFile, ioGenerator } InsertOption; // null is also editable bool optionIsEditable(InsertOption i) { return (i == ioRegular || i == ioHex || i == ioNull); } bool optionAllowsCustomValue(InsertOption i) { return (optionIsEditable(i) || i == ioFile || i == ioGenerator || i == ioDefault); } bool optionValueLoadedFromDatabase(InsertOption i) { return (i == ioDate || i == ioTime || i == ioTimestamp || i == ioUser || i == ioGenerator || i == ioDefault); } InsertOption getInsertOption(wxGrid* grid, int row) { wxString opt = grid->GetCellValue(row, 2); for (int i=0; i& triggers, Column *c) { for (std::vector::iterator tt = triggers.begin(); tt != triggers.end(); ++tt) { std::vector list; (*tt)->getDependencies(list, true); Generator *gen = 0; bool found = false; for (std::vector::iterator di = list.begin(); di != list.end(); ++di) { MetadataItem *m = (*di).getDependentObject(); if (!gen) gen = dynamic_cast(m); if (c->getTable() == m && (*di).getFields() == c->getName_()) found = true; } if (found && gen) return gen; } return 0; } //----------------------------------------------------------------------------- // MB: When editor is shown for NULL field, we want to reset the color from // red to black, so that user does not see the red letters. // I tried to do that in InsertDialog::OnCellEditorCreated. However, it // does not work there because Show() is called *after* creating. // Then I tried to set it in InsertDialog::OnEditorKeyDown, however, it // turns black only after the second character. The reason is that the // first KeyDown event is caught by the grid control and sent to // the editor via StartingKey function without posting the key event to it class GridCellEditorWithProperColor: public wxGridCellTextEditor { public: virtual void Show(bool show, wxGridCellAttr *attr = (wxGridCellAttr *)NULL) { wxGridCellTextEditor::Show(show, attr); GetControl()->SetForegroundColour( wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); } }; //----------------------------------------------------------------------------- InsertDialog::InsertDialog(wxWindow* parent, const wxString& tableName, DataGridTable *gridTable, IBPP::Statement& st, Database *db) :BaseDialog(parent, -1, wxEmptyString), tableNameM(tableName), bufferM(0), gridTableM(gridTable), statementM(st), databaseM(db) { DataGridTable::FieldSet fields; gridTable->getFields(tableName, fields); // 500 should be reasonable for enough rows on the screen, but not too much gridM = new wxGrid(getControlsPanel(), ID_Grid, wxDefaultPosition, fields.size() < 12 ? wxDefaultSize : wxSize(-1, 500), wxWANTS_CHARS | wxBORDER_THEME); gridM->SetRowLabelSize(50); gridM->DisableDragRowSize(); gridM->SetRowLabelAlignment(wxALIGN_RIGHT, wxALIGN_CENTRE); gridM->SetColLabelAlignment(wxALIGN_LEFT, wxALIGN_CENTRE); gridM->SetDefaultCellAlignment(wxALIGN_LEFT, wxALIGN_CENTRE); wxString labels[] = { wxTRANSLATE("Field name"), wxTRANSLATE("Data type"), wxTRANSLATE("Special"), wxTRANSLATE("Value") }; bufferM = new InsertedGridRowBuffer(gridTable->GetNumberCols()); for (unsigned u = 0; (int)u < gridTable->GetNumberCols(); u++) bufferM->setFieldNA(u, true); gridM->CreateGrid(fields.size(), sizeof(labels)/sizeof(wxString)); for (int i=0; iSetColLabelValue(i, labels[i]); // preload triggers std::vector triggers; if (!fields.empty()) // not empty { Table *t = (*(fields.begin())).second.second->getTable(); t->getTriggers(triggers, Trigger::beforeTrigger); } // columns 0, 1: gray, read-only for (int col = 0; col <= 1; ++col) { wxGridCellAttr *cro = new wxGridCellAttr(); cro->SetBackgroundColour(gridM->GetLabelBackgroundColour()); cro->SetReadOnly(); gridM->SetColAttr(col, cro); } // column 2: selection with "special" colour wxGridCellChoiceEditor *types = new wxGridCellChoiceEditor( sizeof(insertOptionStrings)/sizeof(wxString), insertOptionStrings); wxGridCellAttr *ca = new wxGridCellAttr(); ca->SetEditor(types); ca->SetBackgroundColour(wxColour(255, 255, 197)); gridM->SetColAttr(2, ca); // column 3: editable GridCellEditorWithProperColor *gce = new GridCellEditorWithProperColor; wxGridCellAttr *gca = new wxGridCellAttr(); gca->SetEditor(gce); gridM->SetColAttr(3, gca); int row = 0; for (DataGridTable::FieldSet::iterator it = fields.begin(); it != fields.end(); ++it, ++row) { Column *c = (*it).second.second; ResultsetColumnDef *def = (*it).second.first; gridM->SetRowLabelValue(row, wxString::Format(wxT("%d"), row+1)); gridM->SetCellValue(row, 0, c->getName_()); gridM->SetCellValue(row, 1, c->getDatatype()); gridM->SetCellAlignment( def->isNumeric() ? wxALIGN_RIGHT : wxALIGN_LEFT, row, 3); if (c->hasDefault()) { gridM->SetCellValue(row, 2, insertOptionStrings[ioDefault]); gridM->SetCellValue(row, 3, c->getDefault()); updateControls(row); } else { if (c->isNullable()) { gridM->SetCellValue(row, 2, insertOptionStrings[ioNull]); updateControls(row); } else if (def->isNumeric()) gridM->SetCellValue(row, 3, wxT("0")); } InsertColumnInfo ici(row, c, def, (*it).first); columnsM.push_back(ici); Generator *gen = findAutoincGenerator(triggers, c); if (gen) { gridM->SetCellValue(row, 2, insertOptionStrings[ioGenerator]); updateControls(row); gridM->SetCellValue(row, 3, gen->getQuotedName()); } } checkboxInsertAnother = new wxCheckBox(getControlsPanel(), wxID_ANY, _("Keep dialog open after inserting")); button_ok = new wxButton(getControlsPanel(), wxID_OK, _("&Insert")); button_cancel = new wxButton(getControlsPanel(), wxID_CANCEL, _("&Cancel")); set_properties(); do_layout(); if (gridM->GetNumberRows() > 0) gridM->SetGridCursor(0, 3); gridM->SetFocus(); // until we find something better SetIcon(wxArtProvider::GetIcon(ART_Trigger, wxART_FRAME_ICON)); } //----------------------------------------------------------------------------- void InsertDialog::OnClose(wxCloseEvent& WXUNUSED(event)) { // make sure parent window is properly activated again wxWindow* p = GetParent(); if (p) { p->Enable(); Hide(); p->Raise(); } Destroy(); } //----------------------------------------------------------------------------- InsertDialog::~InsertDialog() { delete bufferM; } //----------------------------------------------------------------------------- void InsertDialog::set_properties() { SetTitle(wxString::Format(_("Insert Record(s) Into Table \"%s\""), tableNameM.c_str())); button_ok->SetDefault(); } //----------------------------------------------------------------------------- void InsertDialog::do_layout() { gridM->AutoSize(); wxScreenDC sdc; wxSize sz = sdc.GetTextExtent(wxT("CURRENT_TIMESTAMP WWW")); gridM->SetColSize(2, sz.GetWidth()); gridM->SetColSize(3, sz.GetWidth()); // reasonable default width? gridM->ForceRefresh(); wxSizer* sizerControls = new wxBoxSizer(wxVERTICAL); sizerControls->Add(gridM, 1, wxEXPAND, 0); sizerControls->AddSpacer( styleguide().getUnrelatedControlMargin(wxVERTICAL)); sizerControls->Add(checkboxInsertAnother, 0, wxEXPAND); wxSizer* sizerButtons = styleguide().createButtonSizer(button_ok, button_cancel); layoutSizers(sizerControls, sizerButtons, true); } //----------------------------------------------------------------------------- const wxString InsertDialog::getName() const { return wxT("InsertDialog"); } //----------------------------------------------------------------------------- bool InsertDialog::getConfigStoresWidth() const { return true; } //----------------------------------------------------------------------------- bool InsertDialog::getConfigStoresHeight() const { return false; } //----------------------------------------------------------------------------- void InsertDialog::updateControls(int row) { InsertOption ix = getInsertOption(gridM, row); if (!optionAllowsCustomValue(ix)) gridM->SetCellValue(row, 3, wxEmptyString); gridM->SetReadOnly(row, 3, !optionIsEditable(ix)); updateColors(this); if (ix == ioNull) { gridM->SetCellTextColour(row, 3, *wxRED); gridM->SetCellValue(row, 3, wxT("[null]")); } else { gridM->SetCellTextColour(row, 3, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); } } //----------------------------------------------------------------------------- void InsertDialog::storeValues() { for (std::vector::iterator it = columnsM.begin(); it != columnsM.end(); ++it) { InsertOption sel = getInsertOption(gridM, (*it).row); wxString previous = (*it).columnDef->getAsString(bufferM); wxString value = gridM->GetCellValue((*it).row, 3); try { if (sel == ioHex) { if ((*it).columnDef->isNumeric()) // hex -> dec { long l; // should we support 64bit? if (!value.ToLong(&l, 16)) throw FRError(_("Invalid hexadecimal number")); value.Printf(wxT("%d"), l); } else // convert hex string to regular string and set { wxString result; for (size_t i = 0; i < value.Len(); i+=2) { unsigned long l; if (!value.Mid(i, 2).ToULong(&l, 16)) throw FRError(_("Invalid hexadecimal character")); result += wxChar(l); } value = result; } gridM->SetCellValue((*it).row, 2, insertOptionStrings[ioRegular]); sel = ioRegular; } switch (sel) { case ioRegular: (*it).columnDef->setFromString(bufferM, value); gridM->SetCellValue((*it).row, 3, (*it).columnDef->getAsString(bufferM)); // there is no break; here deliberately! case ioFile: bufferM->setFieldNull((*it).index, false); bufferM->setFieldNA((*it).index, false); break; case ioSkip: bufferM->setFieldNA((*it).index, true); break; case ioNull: bufferM->setFieldNull((*it).index, true); bufferM->setFieldNA((*it).index, false); break; default: break; } } catch(...) { // we take the old value from buffer gridM->SetCellValue((*it).row, 3, previous); throw; } } } //----------------------------------------------------------------------------- void InsertDialog::preloadSpecialColumns() { // step 1: build list of CURRENT_* and generator values wxString sql(wxT("SELECT ")); bool first = true; for (std::vector::iterator it = columnsM.begin(); it != columnsM.end(); ++it) { InsertOption sel = getInsertOption(gridM, (*it).row); if (!optionValueLoadedFromDatabase(sel)) continue; if (first) first = false; else sql += wxT(","); if (sel == ioGenerator) // generator sql += wxT("GEN_ID(") + gridM->GetCellValue((*it).row, 3) + wxT(", 1)"); else if (sel == ioDefault) { if (!(*it).column->isString()) sql += wxT("CAST("); sql += gridM->GetCellValue((*it).row, 3); if (!(*it).column->isString()) { // false = no custom formatting, just the pure type sql += wxT(" AS ") + (*it).column->getDatatype(false) + wxT(")"); } } else // CURRENT_ USER/DATE/TIMESTAMP... sql += gridM->GetCellValue((*it).row, 2); } // step 2: load those from the database IBPP::Statement st1 = IBPP::StatementFactory(statementM->DatabasePtr(), statementM->TransactionPtr()); if (!first) // we do need some data { sql += wxT(" FROM RDB$DATABASE"); st1->Prepare(wx2std(sql)); st1->Execute(); st1->Fetch(); } // step 3: save values into buffer and edit controls // so that the next run doesn't reload generators unsigned col = 1; for (std::vector::iterator it = columnsM.begin(); it != columnsM.end(); ++it) { InsertOption sel = getInsertOption(gridM, (*it).row); if (!optionValueLoadedFromDatabase(sel)) continue; bufferM->setFieldNA((*it).index, false); bufferM->setFieldNull((*it).index, st1->IsNull(col)); if (!st1->IsNull(col)) (*it).columnDef->setValue(bufferM, col, st1, wxConvCurrent); ++col; if (sel != ioGenerator) // what follows is only for generators continue; gridM->SetCellValue((*it).row, 3, (*it).columnDef->getAsString(bufferM)); gridM->SetCellValue((*it).row, 2, insertOptionStrings[ioRegular]); // treat as regular value updateControls((*it).row); } } //----------------------------------------------------------------------------- //! event handling BEGIN_EVENT_TABLE(InsertDialog, BaseDialog) #if wxCHECK_VERSION(2, 9, 0) EVT_GRID_CELL_CHANGED(InsertDialog::OnGridCellChange) EVT_GRID_EDITOR_CREATED(InsertDialog::OnCellEditorCreated) #else EVT_GRID_CMD_CELL_CHANGE(InsertDialog::ID_Grid, InsertDialog::OnGridCellChange) EVT_GRID_CMD_EDITOR_CREATED(InsertDialog::ID_Grid, InsertDialog::OnCellEditorCreated) #endif EVT_BUTTON(wxID_OK, InsertDialog::OnOkButtonClick) EVT_BUTTON(wxID_CANCEL, InsertDialog::OnCancelButtonClick) EVT_CLOSE(InsertDialog::OnClose) END_EVENT_TABLE() //----------------------------------------------------------------------------- void InsertDialog::OnCellEditorCreated(wxGridEditorCreatedEvent& event) { wxTextCtrl *editor = dynamic_cast(event.GetControl()); if (!editor) return; editor->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(InsertDialog::OnEditorKeyDown), 0, this); } //----------------------------------------------------------------------------- void InsertDialog::OnEditorKeyDown(wxKeyEvent& event) { wxTextCtrl *editor = dynamic_cast(event.GetEventObject()); if (event.GetKeyCode() == WXK_DELETE && editor->GetValue().IsEmpty()) { // dismiss editor and set null gridM->HideCellEditControl(); int row = gridM->GetGridCursorRow(); gridM->SetCellValue(row, 2, insertOptionStrings[ioNull]); updateControls(row); return; } event.Skip(); } //----------------------------------------------------------------------------- void InsertDialog::OnCancelButtonClick(wxCommandEvent& WXUNUSED(event)) { Close(); } //----------------------------------------------------------------------------- void InsertDialog::OnOkButtonClick(wxCommandEvent& WXUNUSED(event)) { storeValues(); preloadSpecialColumns(); Identifier tableId(tableNameM); wxString stm = wxT("INSERT INTO ") + tableId.getQuoted() + wxT(" ("); wxString val = wxT(") VALUES ("); bool first = true; for (std::vector::iterator it = columnsM.begin(); it != columnsM.end(); ++it) { InsertOption sel = getInsertOption(gridM, (*it).row); if (sel == ioSkip) // skip continue; if (first) first = false; else { stm += wxT(","); val += wxT(","); } stm += (*it).column->getQuotedName(); if (sel == ioFile) val += wxT("?"); else if (sel == ioNull || bufferM->isFieldNull((*it).index)) val += wxT("NULL"); else { val += wxT("'") + (*it).columnDef->getAsFirebirdString(bufferM) + wxT("'"); } } IBPP::Statement st1 = IBPP::StatementFactory(statementM->DatabasePtr(), statementM->TransactionPtr()); stm += val + wxT(")"); st1->Prepare(wx2std(stm, databaseM->getCharsetConverter())); // load blobs int index = 1; for (std::vector::iterator it = columnsM.begin(); it != columnsM.end(); ++it) { if (getInsertOption(gridM, (*it).row) != ioFile) continue; wxFFile fl(gridM->GetCellValue((*it).row, 3), wxT("rb")); if (!fl.IsOpened()) throw FRError(_("Cannot open BLOB file.")); IBPP::Blob b = IBPP::BlobFactory(st1->DatabasePtr(), st1->TransactionPtr()); b->Create(); boost::uint8_t buffer[32768]; while (!fl.Eof()) { size_t len = fl.Read(buffer, 32767); // slow when not 32k if (len < 1) break; b->Write(buffer, len); } fl.Close(); b->Close(); st1->Set(index++, b); bufferM->setBlob((*it).columnDef->getIndex(), b); } st1->Execute(); // add buffer to the table and set internal buffer marker to zero // (to prevent deletion in destructor) gridTableM->addRow(bufferM, stm); if (checkboxInsertAnother->IsChecked()) { bufferM = new InsertedGridRowBuffer(bufferM); } else { bufferM = 0; databaseM = 0; // prevent other event handlers from making problems Close(); } } //----------------------------------------------------------------------------- // helper function for OnChoiceChange void InsertDialog::setStringOption(InsertColumnInfo& ici, const wxString& s) { if (!s.IsEmpty()) gridM->SetCellValue(ici.row, 3, s); else { gridM->SetCellValue(ici.row, 2, insertOptionStrings[ioNull]); updateControls(ici.row); } } //----------------------------------------------------------------------------- void InsertDialog::OnGridCellChange(wxGridEvent& event) { if (!databaseM) // dialog already closed return; static wxMutex m; // prevent reentrancy since we set the value wxMutexLocker ml(m); if (!ml.IsOk()) return; int row = event.GetRow(); InsertOption option = getInsertOption(gridM, row); if (event.GetCol() == 3) { if (option != ioNull && option != ioRegular) return; wxString cellValue = gridM->GetCellValue(row, 3); if (cellValue.IsEmpty()) // we assume null for non-string columns { // here we can change the NULL behaviour for string columns, i.e. // whether empty field is NULL or '' // if ((*it).column->isString() ... bufferM->setFieldNull(columnsM[row].index, true); gridM->SetCellValue(row, 2, insertOptionStrings[ioNull]); updateControls(row); return; } // write data to buffer and retrieve the formatted value try { columnsM[row].columnDef->setFromString(bufferM, cellValue); } catch(...) { event.Veto(); throw; } gridM->SetCellValue(row, 3, columnsM[row].columnDef->getAsString(bufferM)); gridM->SetCellValue(row, 2, insertOptionStrings[ioRegular]); updateControls(row); bufferM->setFieldNull(columnsM[row].index, false); bufferM->setFieldNA(columnsM[row].index, false); } else if (event.GetCol() == 2) { if (optionIsEditable(option)) gridM->SetCellValue(row, 3, wxEmptyString); updateControls(row); if (option == ioFile) setStringOption(columnsM[row], ::wxFileSelector(_("Select a file"))); if (option == ioDefault) setStringOption(columnsM[row], columnsM[row].column->getDefault()); if (option == ioGenerator) { // select generator name and store in tx wxArrayString as; GeneratorsPtr gs(databaseM->getGenerators()); for (Generators::const_iterator it = gs->begin(); it != gs->end(); ++it) { as.Add((*it)->getQuotedName()); } wxString s(::wxGetSingleChoice(_("Select a generator"), _("Generator"), as, this)); setStringOption(columnsM[row], s); } } } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/InsertDialog.h000066400000000000000000000064531177057155300223230ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_INSERTDIALOG_H #define FR_INSERTDIALOG_H //----------------------------------------------------------------------------- #include #include #include #include "gui/BaseDialog.h" class Column; class Database; class DataGridTable; class InsertedGridRowBuffer; class ResultsetColumnDef; // link all column info in the same place: class InsertColumnInfo { public: InsertColumnInfo(int gridRow, Column *f, ResultsetColumnDef *r, int idx) :row(gridRow), column(f), columnDef(r), index(idx) { }; int row; // insert grid row Column *column; ResultsetColumnDef *columnDef; int index; // column index in dataset }; //----------------------------------------------------------------------------- class InsertDialog: public BaseDialog { public: InsertDialog(wxWindow* parent, const wxString& tableName, DataGridTable *, IBPP::Statement& st, Database *db); virtual ~InsertDialog(); void OnOkButtonClick(wxCommandEvent& event); void OnCancelButtonClick(wxCommandEvent& event); void OnClose(wxCloseEvent& event); void OnGridCellChange(wxGridEvent& event); void OnCellEditorCreated(wxGridEditorCreatedEvent& event); void OnEditorKeyDown(wxKeyEvent& event); enum { ID_Choice = 1001, ID_Grid }; private: Database *databaseM; void storeValues(); void preloadSpecialColumns(); IBPP::Statement& statementM; std::vector columnsM; DataGridTable *gridTableM; InsertedGridRowBuffer *bufferM; wxString tableNameM; void updateControls(int row); void setStringOption(InsertColumnInfo& ici, const wxString& s); void set_properties(); void do_layout(); protected: wxStaticText* labelFieldName; wxStaticText* labelDataType; wxStaticText* labelModifiers; wxStaticText* labelValue; wxCheckBox* checkboxInsertAnother; wxGrid *gridM; wxButton* button_ok; wxButton* button_cancel; virtual const wxString getName() const; virtual bool getConfigStoresWidth() const; virtual bool getConfigStoresHeight() const; DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- #endif flamerobin_0.9.3~svn+2220.orig/src/gui/MainFrame.cpp000066400000000000000000002064311177057155300221270ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include #include #include "config/Config.h" #include "config/DatabaseConfig.h" #include "core/ArtProvider.h" #include "core/CodeTemplateProcessor.h" #include "core/FRError.h" #include "core/URIProcessor.h" #include "frutils.h" #include "gui/AboutBox.h" #include "gui/AdvancedMessageDialog.h" #include "gui/AdvancedSearchFrame.h" #include "gui/BackupFrame.h" #include "gui/CommandIds.h" #include "gui/ContextMenuMetadataItemVisitor.h" #include "gui/controls/DBHTreeControl.h" #include "gui/DataGeneratorFrame.h" #include "gui/DatabaseRegistrationDialog.h" #include "gui/EventWatcherFrame.h" #include "gui/ExecuteSql.h" #include "gui/ExecuteSqlFrame.h" #include "gui/MainFrame.h" #include "gui/MetadataItemPropertiesFrame.h" #include "gui/PreferencesDialog.h" #include "gui/ProgressDialog.h" #include "gui/RestoreFrame.h" #include "gui/ServerRegistrationDialog.h" #include "gui/SimpleHtmlFrame.h" #include "main.h" #include "metadata/column.h" #include "metadata/domain.h" #include "metadata/generator.h" #include "metadata/MetadataItemCreateStatementVisitor.h" #include "metadata/MetadataTemplateManager.h" #include "metadata/procedure.h" #include "metadata/root.h" #include "metadata/server.h" #include "metadata/table.h" #include "metadata/trigger.h" #include "metadata/view.h" //----------------------------------------------------------------------------- bool checkValidDatabase(DatabasePtr database) { if (database) return true; wxMessageBox(_("Operation can not be performed - no database assigned"), _("Internal Error"), wxOK | wxICON_ERROR); return false; } //----------------------------------------------------------------------------- bool checkValidServer(ServerPtr server) { if (server) return true; wxMessageBox(_("Operation can not be performed - no server assigned"), _("Internal Error"), wxOK | wxICON_ERROR); return false; } //----------------------------------------------------------------------------- DatabasePtr getDatabase(MetadataItem* mi) { if (mi) return mi->getDatabase(); return DatabasePtr(); } //----------------------------------------------------------------------------- ServerPtr getServer(MetadataItem* mi) { if (mi) { if (Server* s = dynamic_cast(mi)) return s->shared_from_this(); if (DatabasePtr db = mi->getDatabase()) return db->getServer(); } return ServerPtr(); } //----------------------------------------------------------------------------- //! helper class to enable drag and drop of database files to the tree ctrl #if wxUSE_DRAG_AND_DROP class DnDDatabaseFile : public wxFileDropTarget { private: MainFrame* frameM; public: DnDDatabaseFile(MainFrame* frame) { frameM = frame; } virtual bool OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames) { for (size_t i = 0; i < filenames.GetCount(); i++) frameM->openUnregisteredDatabase(filenames[i]); return true; } }; #endif //----------------------------------------------------------------------------- MainFrame::MainFrame(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style) : BaseFrame(parent, id, title, pos, size, style, wxT("FlameRobin_main")), rootM(new Root()) { wxArtProvider::Push(new ArtProvider); mainPanelM = new wxPanel(this); treeMainM = new DBHTreeControl(mainPanelM, wxDefaultPosition, wxDefaultSize, #if defined __WXGTK20__ || defined __WXMAC__ wxTR_NO_LINES | #endif wxTR_HAS_BUTTONS | wxBORDER_THEME); wxArrayString choices; // load from config? searchPanelM = new wxPanel(mainPanelM, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL | wxBORDER_THEME); searchBoxM = new wxComboBox(searchPanelM, ID_search_box, wxEmptyString, wxDefaultPosition, wxDefaultSize, choices, wxCB_DROPDOWN | wxCB_SORT | wxTE_PROCESS_ENTER); wxSize btnBmpSize(16, 16); button_prev = new wxBitmapButton(searchPanelM, ID_button_prev, wxArtProvider::GetBitmap(wxART_GO_BACK, wxART_TOOLBAR, btnBmpSize)); button_next = new wxBitmapButton(searchPanelM, ID_button_next, wxArtProvider::GetBitmap(wxART_GO_FORWARD, wxART_TOOLBAR, btnBmpSize)); button_advanced = new wxBitmapButton(searchPanelM, ID_button_advanced, wxArtProvider::GetBitmap(wxART_FIND, wxART_TOOLBAR, btnBmpSize)); button_advanced->SetToolTip(_("Advanced metadata search")); button_prev->SetToolTip(_("Previous match")); button_next->SetToolTip(_("Next match")); buildMainMenu(); SetStatusBarPane(-1); // disable automatic fill set_properties(); do_layout(); treeMainM->SetFocus(); #if wxUSE_DRAG_AND_DROP treeMainM->SetDropTarget(new DnDDatabaseFile(this)); #endif if (!config().get(wxT("showSearchBar"), true)) { searchPanelSizerM->Show(searchPanelM, false, true); // recursive searchPanelSizerM->Layout(); } } //----------------------------------------------------------------------------- void MainFrame::buildMainMenu() { menuBarM = new wxMenuBar(); databaseMenuM = new wxMenu(); databaseMenuM->Append(Cmds::Menu_RegisterDatabase, _("R&egister existing database...")); databaseMenuM->Append(Cmds::Menu_CreateDatabase, _("Create &new database...")); databaseMenuM->Append(Cmds::Menu_RestoreIntoNew, _("Restore bac&kup into new database...")); databaseMenuM->AppendSeparator(); menuBarM->Append(databaseMenuM, _("&Database")); #ifdef __WXMAC__ wxMenu* editMenu = new wxMenu(); editMenu->Append(wxID_CUT, _("Cu&t")); editMenu->Append(wxID_COPY, _("&Copy")); editMenu->Append(wxID_PASTE, _("&Paste")); editMenu->Append(wxID_CLEAR, _("&Delete")); menuBarM->Append(editMenu, _("&Edit")); #endif wxMenu* viewMenu = new wxMenu(); viewMenu->AppendCheckItem(Cmds::Menu_ToggleStatusBar, _("&Status bar")); viewMenu->AppendCheckItem(Cmds::Menu_ToggleSearchBar, _("S&earch bar")); viewMenu->AppendCheckItem(Cmds::Menu_ToggleDisconnected, _("&Disconnected databases")); viewMenu->AppendSeparator(); viewMenu->Append(wxID_PREFERENCES, _("P&references...")); menuBarM->Append(viewMenu, _("&View")); // frameManager().setWindowMenu(viewMenu); wxMenu* serverMenu = new wxMenu(); serverMenu->Append(Cmds::Menu_RegisterServer, _("&Register server...")); serverMenu->Append(Cmds::Menu_UnRegisterServer, _("&Unregister server")); serverMenu->Append(Cmds::Menu_ServerProperties, _("Server registration &info")); serverMenu->AppendSeparator(); serverMenu->Append(Cmds::Menu_GetServerVersion, _("Retrieve server &version")); serverMenu->Append(Cmds::Menu_ManageUsers, _("&Manage users")); menuBarM->Append(serverMenu, _("&Server")); objectMenuM = new wxMenu(); wxMenu* newMenu = new wxMenu(); newMenu->Append(Cmds::Menu_CreateDomain, _("&Domain")); newMenu->Append(Cmds::Menu_CreateException, _("&Exception")); newMenu->Append(Cmds::Menu_CreateFunction, _("&Function")); newMenu->Append(Cmds::Menu_CreateGenerator, _("&Generator")); newMenu->Append(Cmds::Menu_CreateProcedure, _("&Procedure")); newMenu->Append(Cmds::Menu_CreateRole, _("&Role")); newMenu->Append(Cmds::Menu_CreateTable, _("&Table")); newMenu->Append(Cmds::Menu_CreateTrigger, _("Tr&igger")); newMenu->Append(Cmds::Menu_CreateView, _("&View")); // removed accelerator from "New", any of them potentially conflicts // with one of the commands in the object menu objectMenuM->Append(Cmds::Menu_NewObject, _("New"), newMenu); menuBarM->Append(objectMenuM, _("&Object")); wxMenu* helpMenu = new wxMenu(); helpMenu->Append(Cmds::Menu_Manual, _("&Manual")); helpMenu->Append(Cmds::Menu_RelNotes, _("&What's new")); helpMenu->Append(Cmds::Menu_License, _("&License")); helpMenu->AppendSeparator(); helpMenu->Append(Cmds::Menu_URLHomePage, _("FlameRobin &home page")); helpMenu->Append(Cmds::Menu_URLProjectPage, _("SourceForge &project page")); helpMenu->Append(Cmds::Menu_URLFeatureRequest, _("SourceForge &feature requests")); helpMenu->Append(Cmds::Menu_URLBugReport, _("SourceForge &bug reports")); #ifndef __WXMAC__ helpMenu->AppendSeparator(); #endif helpMenu->Append(wxID_ABOUT, _("&About")); menuBarM->Append(helpMenu, _("&Help")); SetMenuBar(menuBarM); // update checkboxes config().setValue(wxT("HideDisconnectedDatabases"), false); viewMenu->Check(Cmds::Menu_ToggleDisconnected, true); if (config().get(wxT("showStatusBar"), true)) { CreateStatusBar(); viewMenu->Check(Cmds::Menu_ToggleStatusBar, true); GetStatusBar()->SetStatusText(_("[No database selected]")); } if (config().get(wxT("showSearchBar"), true)) viewMenu->Check(Cmds::Menu_ToggleSearchBar, true); } //----------------------------------------------------------------------------- void MainFrame::showDocsHtmlFile(const wxString& fileName) { wxFileName fullFileName(config().getDocsPath(), fileName); showHtmlFile(this, fullFileName); } //----------------------------------------------------------------------------- void MainFrame::showUrl(const wxString& url) { if (!wxLaunchDefaultBrowser(url)) wxLogError(_T("Failed to open URL \"%s\""), url.c_str()); } //----------------------------------------------------------------------------- void MainFrame::set_properties() { SetTitle(_("FlameRobin Database Admin")); // Default (generic) tree looks pretty ugly on GTK 1 #if defined(__WXGTK__) && !defined(__WXGTK20__) treeMainM->SetIndent(12); #endif if (!rootM->load()) { wxString confile = config().getDBHFileName(); if (confile.Length() > 20) confile = wxT("\n") + confile + wxT("\n"); // break into several lines if path is long else confile = wxT(" ") + confile + wxT(" "); wxString msg; msg.Printf(_("The configuration file:%sdoes not exist or can not be opened.\n\nThis is normal for first time users.\n\nYou may now register new servers and databases."), confile.c_str()); wxMessageBox(msg, _("Configuration file not found"), wxOK|wxICON_INFORMATION); ServerPtr s(new Server()); s->setName_(wxT("Localhost")); s->setHostname(wxT("localhost")); rootM->addServer(s); rootM->save(); } wxTreeItemId rootNode = treeMainM->addRootNode(rootM.get()); treeMainM->Expand(rootNode); // make the first server active wxTreeItemIdValue cookie; wxTreeItemId firstServer = treeMainM->GetFirstChild(rootNode, cookie); if (firstServer.IsOk()) { treeMainM->SelectItem(firstServer); } SetIcon(wxArtProvider::GetIcon(ART_FlameRobin, wxART_FRAME_ICON)); } //----------------------------------------------------------------------------- void MainFrame::do_layout() { wxSizer* sizerCB = new wxBoxSizer(wxVERTICAL); sizerCB->AddStretchSpacer(1); sizerCB->Add(searchBoxM, 0, wxEXPAND); sizerCB->AddStretchSpacer(1); wxSizer* sizerSearch = new wxBoxSizer(wxHORIZONTAL); sizerSearch->Add(sizerCB, 1, wxEXPAND); sizerSearch->Add(button_prev); sizerSearch->Add(button_next); sizerSearch->Add(button_advanced); searchPanelM->SetSizer(sizerSearch); searchPanelSizerM = new wxBoxSizer(wxVERTICAL); searchPanelSizerM->Add(treeMainM, 1, wxEXPAND); searchPanelSizerM->Add(searchPanelM, 0, wxEXPAND); mainPanelM->SetSizer(searchPanelSizerM); wxBoxSizer* sizerAll = new wxBoxSizer(wxVERTICAL); sizerAll->Add(mainPanelM, 1, wxEXPAND, 0); SetAutoLayout(true); SetSizer(sizerAll); Layout(); } //----------------------------------------------------------------------------- const wxRect MainFrame::getDefaultRect() const { return wxRect(-1, -1, 360, 480); } //----------------------------------------------------------------------------- DBHTreeControl* MainFrame::getTreeCtrl() { return treeMainM; } //----------------------------------------------------------------------------- BEGIN_EVENT_TABLE(MainFrame, wxFrame) EVT_MENU(Cmds::Menu_RegisterServer, MainFrame::OnMenuRegisterServer) EVT_MENU(wxID_EXIT, MainFrame::OnMenuQuit) EVT_MENU(wxID_ABOUT, MainFrame::OnMenuAbout) EVT_MENU(Cmds::Menu_Manual, MainFrame::OnMenuManual) EVT_MENU(Cmds::Menu_RelNotes, MainFrame::OnMenuRelNotes) EVT_MENU(Cmds::Menu_License, MainFrame::OnMenuLicense) EVT_MENU(Cmds::Menu_URLHomePage, MainFrame::OnMenuURLHomePage) EVT_MENU(Cmds::Menu_URLProjectPage, MainFrame::OnMenuURLProjectPage) EVT_MENU(Cmds::Menu_URLFeatureRequest, MainFrame::OnMenuURLFeatureRequest) EVT_MENU(Cmds::Menu_URLBugReport, MainFrame::OnMenuURLBugReport) EVT_MENU(wxID_PREFERENCES, MainFrame::OnMenuConfigure) EVT_MENU(Cmds::Menu_RegisterDatabase, MainFrame::OnMenuRegisterDatabase) EVT_UPDATE_UI(Cmds::Menu_RegisterDatabase, MainFrame::OnMenuUpdateIfServerSelected) EVT_MENU(Cmds::Menu_CreateDatabase, MainFrame::OnMenuCreateDatabase) EVT_UPDATE_UI(Cmds::Menu_CreateDatabase, MainFrame::OnMenuUpdateIfServerSelected) EVT_MENU(Cmds::Menu_RestoreIntoNew, MainFrame::OnMenuRestoreIntoNewDatabase) EVT_UPDATE_UI(Cmds::Menu_RestoreIntoNew, MainFrame::OnMenuUpdateIfServerSelected) EVT_MENU(Cmds::Menu_ManageUsers, MainFrame::OnMenuManageUsers) EVT_UPDATE_UI(Cmds::Menu_ManageUsers, MainFrame::OnMenuUpdateIfServerSelected) EVT_MENU(Cmds::Menu_UnRegisterServer, MainFrame::OnMenuUnRegisterServer) EVT_UPDATE_UI(Cmds::Menu_UnRegisterServer, MainFrame::OnMenuUpdateUnRegisterServer) EVT_MENU(Cmds::Menu_ServerProperties, MainFrame::OnMenuServerProperties) EVT_UPDATE_UI(Cmds::Menu_ServerProperties, MainFrame::OnMenuUpdateIfServerSelected) EVT_MENU(Cmds::Menu_UnRegisterDatabase, MainFrame::OnMenuUnRegisterDatabase) EVT_UPDATE_UI(Cmds::Menu_UnRegisterDatabase, MainFrame::OnMenuUpdateIfDatabaseNotConnected) EVT_MENU(Cmds::Menu_GetServerVersion, MainFrame::OnMenuGetServerVersion) EVT_UPDATE_UI(Cmds::Menu_GetServerVersion, MainFrame::OnMenuUpdateIfServerSelected) EVT_MENU(Cmds::Menu_MonitorEvents, MainFrame::OnMenuMonitorEvents) EVT_UPDATE_UI(Cmds::Menu_MonitorEvents, MainFrame::OnMenuUpdateIfDatabaseConnectedOrAutoConnect) EVT_MENU(Cmds::Menu_GenerateData, MainFrame::OnMenuGenerateData) EVT_UPDATE_UI(Cmds::Menu_GenerateData, MainFrame::OnMenuUpdateIfDatabaseConnectedOrAutoConnect) EVT_MENU(Cmds::Menu_CloneDatabase, MainFrame::OnMenuCloneDatabase) EVT_UPDATE_UI(Cmds::Menu_CloneDatabase, MainFrame::OnMenuUpdateIfDatabaseSelected) EVT_MENU(Cmds::Menu_DatabaseRegistrationInfo, MainFrame::OnMenuDatabaseRegistrationInfo) EVT_UPDATE_UI(Cmds::Menu_DatabaseRegistrationInfo, MainFrame::OnMenuUpdateIfDatabaseSelected) EVT_MENU(Cmds::Menu_Backup, MainFrame::OnMenuBackup) EVT_UPDATE_UI(Cmds::Menu_Backup, MainFrame::OnMenuUpdateIfDatabaseSelected) EVT_MENU(Cmds::Menu_Restore, MainFrame::OnMenuRestore) EVT_UPDATE_UI(Cmds::Menu_Restore, MainFrame::OnMenuUpdateIfDatabaseNotConnected) EVT_MENU(Cmds::Menu_Connect, MainFrame::OnMenuConnect) EVT_UPDATE_UI(Cmds::Menu_Connect, MainFrame::OnMenuUpdateIfDatabaseNotConnected) EVT_MENU(Cmds::Menu_ConnectAs, MainFrame::OnMenuConnectAs) EVT_UPDATE_UI(Cmds::Menu_ConnectAs, MainFrame::OnMenuUpdateIfDatabaseNotConnected) EVT_MENU(Cmds::Menu_Disconnect, MainFrame::OnMenuDisconnect) EVT_UPDATE_UI(Cmds::Menu_Disconnect, MainFrame::OnMenuUpdateIfDatabaseConnected) EVT_MENU(Cmds::Menu_Reconnect, MainFrame::OnMenuReconnect) EVT_UPDATE_UI(Cmds::Menu_Reconnect, MainFrame::OnMenuUpdateIfDatabaseConnected) EVT_MENU(Cmds::Menu_RecreateDatabase, MainFrame::OnMenuRecreateDatabase) EVT_UPDATE_UI(Cmds::Menu_RecreateDatabase, MainFrame::OnMenuUpdateIfDatabaseConnectedOrAutoConnect) EVT_MENU(Cmds::Menu_DropDatabase, MainFrame::OnMenuDropDatabase) EVT_UPDATE_UI(Cmds::Menu_DropDatabase, MainFrame::OnMenuUpdateIfDatabaseConnectedOrAutoConnect) EVT_MENU(Cmds::Menu_ExecuteStatements, MainFrame::OnMenuExecuteStatements) EVT_UPDATE_UI(Cmds::Menu_ExecuteStatements, MainFrame::OnMenuUpdateIfDatabaseConnectedOrAutoConnect) EVT_UPDATE_UI(Cmds::Menu_NewObject, MainFrame::OnMenuUpdateIfDatabaseConnectedOrAutoConnect) EVT_MENU(Cmds::Menu_DatabasePreferences, MainFrame::OnMenuDatabasePreferences) EVT_UPDATE_UI(Cmds::Menu_DatabasePreferences, MainFrame::OnMenuUpdateIfDatabaseSelected) EVT_MENU(Cmds::Menu_DatabaseProperties, MainFrame::OnMenuDatabaseProperties) EVT_UPDATE_UI(Cmds::Menu_DatabaseProperties, MainFrame::OnMenuUpdateIfDatabaseConnectedOrAutoConnect) EVT_MENU(Cmds::Menu_BrowseData, MainFrame::OnMenuBrowseData) EVT_MENU(Cmds::Menu_LoadColumnsInfo, MainFrame::OnMenuLoadColumnsInfo) EVT_MENU(Cmds::Menu_AddColumn, MainFrame::OnMenuAddColumn) EVT_MENU(Cmds::Menu_ExecuteProcedure, MainFrame::OnMenuExecuteProcedure) EVT_MENU(Cmds::Menu_ShowAllGeneratorValues, MainFrame::OnMenuShowAllGeneratorValues) EVT_UPDATE_UI(Cmds::Menu_ShowAllGeneratorValues, MainFrame::OnMenuUpdateIfMetadataItemHasChildren) EVT_MENU(Cmds::Menu_ShowGeneratorValue, MainFrame::OnMenuShowGeneratorValue) EVT_MENU(Cmds::Menu_SetGeneratorValue, MainFrame::OnMenuSetGeneratorValue) EVT_MENU(Cmds::Menu_CreateObject, MainFrame::OnMenuCreateObject) EVT_MENU(Cmds::Menu_AlterObject, MainFrame::OnMenuAlterObject) EVT_MENU(Cmds::Menu_DropObject, MainFrame::OnMenuDropObject) EVT_MENU(Cmds::Menu_ObjectProperties, MainFrame::OnMenuObjectProperties) EVT_UPDATE_UI(Cmds::Menu_ObjectProperties, MainFrame::OnMenuUpdateIfDatabaseConnectedOrAutoConnect) EVT_MENU(Cmds::Menu_ObjectRefresh, MainFrame::OnMenuObjectRefresh) EVT_UPDATE_UI(Cmds::Menu_ObjectRefresh, MainFrame::OnMenuUpdateIfDatabaseConnected) EVT_MENU(Cmds::Menu_ToggleStatusBar, MainFrame::OnMenuToggleStatusBar) EVT_MENU(Cmds::Menu_ToggleSearchBar, MainFrame::OnMenuToggleSearchBar) EVT_MENU(Cmds::Menu_ToggleDisconnected, MainFrame::OnMenuToggleDisconnected) EVT_TEXT_ENTER(MainFrame::ID_search_box, MainFrame::OnSearchBoxEnter) EVT_TEXT(MainFrame::ID_search_box, MainFrame::OnSearchTextChange) EVT_BUTTON(MainFrame::ID_button_advanced, MainFrame::OnButtonSearchClick) EVT_BUTTON(MainFrame::ID_button_prev, MainFrame::OnButtonPrevClick) EVT_BUTTON(MainFrame::ID_button_next, MainFrame::OnButtonNextClick) EVT_MENU(Cmds::Menu_CreateDomain, MainFrame::OnMenuCreateDomain) EVT_MENU(Cmds::Menu_CreateException, MainFrame::OnMenuCreateException) EVT_MENU(Cmds::Menu_CreateFunction, MainFrame::OnMenuCreateFunction) EVT_MENU(Cmds::Menu_CreateGenerator, MainFrame::OnMenuCreateGenerator) EVT_MENU(Cmds::Menu_CreateProcedure, MainFrame::OnMenuCreateProcedure) EVT_MENU(Cmds::Menu_CreateRole, MainFrame::OnMenuCreateRole) EVT_MENU(Cmds::Menu_CreateTable, MainFrame::OnMenuCreateTable) EVT_MENU(Cmds::Menu_CreateTrigger, MainFrame::OnMenuCreateTrigger) EVT_MENU(Cmds::Menu_CreateView, MainFrame::OnMenuCreateView) EVT_MENU_RANGE(Cmds::Menu_TemplateFirst, Cmds::Menu_TemplateLast, MainFrame::OnMenuGenerateCode) EVT_MENU_OPEN(MainFrame::OnMainMenuOpen) EVT_TREE_SEL_CHANGED(DBHTreeControl::ID_tree_ctrl, MainFrame::OnTreeSelectionChanged) EVT_TREE_ITEM_ACTIVATED(DBHTreeControl::ID_tree_ctrl, MainFrame::OnTreeItemActivate) EVT_SET_FOCUS(MainFrame::OnSetFocus) END_EVENT_TABLE() //----------------------------------------------------------------------------- void MainFrame::OnMainMenuOpen(wxMenuEvent& event) { #ifndef __WXGTK__ if (event.IsPopup()) // on gtk all menus are treated as popup apparently { event.Skip(); return; } #endif MetadataItem* m = treeMainM->getSelectedMetadataItem(); if (!m) { event.Skip(); return; } if (m->getType() == ntUnknown) { event.Skip(); return; } if (event.GetMenu() == objectMenuM) { // rebuild object menu while (objectMenuM->GetMenuItemCount() > 2) objectMenuM->Destroy(objectMenuM->FindItemByPosition(2)); if (objectMenuM->GetMenuItemCount() == 1) objectMenuM->AppendSeparator(); // object has to be subitem of database DatabasePtr db = m->getDatabase(); if (db && db.get() != m) { MainObjectMenuMetadataItemVisitor visitor(objectMenuM); m->acceptVisitor(&visitor); } if (objectMenuM->GetMenuItemCount() == 2) // separator objectMenuM->Destroy(objectMenuM->FindItemByPosition(1)); } else if (event.GetMenu() == databaseMenuM) { // rebuild database menu while (databaseMenuM->GetMenuItemCount() > 4) databaseMenuM->Destroy(databaseMenuM->FindItemByPosition(4)); // current object has to be subitem of database DatabasePtr db = m->getDatabase(); if (db && db.get()) { ContextMenuMetadataItemVisitor cmvd(databaseMenuM); db.get()->acceptVisitor(&cmvd); databaseMenuM->AppendSeparator(); } databaseMenuM->Append(wxID_EXIT, _("&Quit")); } event.Skip(); } //----------------------------------------------------------------------------- void MainFrame::updateStatusbarText() { if (wxStatusBar* sb = GetStatusBar()) { if (DatabasePtr db = getDatabase(treeMainM->getSelectedMetadataItem())) sb->SetStatusText(db->getConnectionInfoString()); else sb->SetStatusText(_("[No database selected]")); } } //----------------------------------------------------------------------------- void MainFrame::OnTreeSelectionChanged(wxTreeEvent& WXUNUSED(event)) { updateStatusbarText(); /* currently disabled until we decide on the new AUI interface for it // switch notebook to show the "Items" page int pg = notebookM->GetPageIndex(labelPanelM); if (pg == wxNOT_FOUND) // Create it? { return; } notebookM->SetSelection(pg); // TODO: listctrl should show what tree shows, but it should also contain // info about metadata items, provide context menu and double-click // action for each of them and Observe the items for removal, // changes and adding new ones. // i.e. we need a special, separate class for this wxListCtrl *lc = labelPanelM->getListCtrl(); lc->SetImageList(treeMainM->GetImageList(), wxIMAGE_LIST_SMALL); lc->ClearAll(); wxTreeItemId t = treeMainM->GetSelection(); if (!t.IsOk()) return; for (wxTreeItemId id = treeMainM->GetLastChild(t); id.IsOk(); id = treeMainM->GetPrevSibling(id)) { lc->InsertItem(0, treeMainM->GetItemText(id), treeMainM->GetItemImage(id)); } wxString path; while (t.IsOk()) { if (!path.IsEmpty()) path = wxT(" > ") + path; path = treeMainM->GetItemText(t) + path; t = treeMainM->GetItemParent(t); } labelPanelM->setLabel(path); */ } //----------------------------------------------------------------------------- //! handle double-click on item (or press Enter) void MainFrame::OnTreeItemActivate(wxTreeEvent& event) { #ifndef __WXGTK__ event.Skip(); #endif wxTreeItemId item = treeMainM->GetSelection(); if (!item.IsOk()) return; MetadataItem* m = treeMainM->getSelectedMetadataItem(); if (!m) return; NodeType nt = m->getType(); enum { showProperties = 0, showColumnInfo, selectFromOrExecute }; int treeActivateAction = showProperties; config().getValue(wxT("OnTreeActivate"), treeActivateAction); if (treeActivateAction == showColumnInfo && (nt == ntTable || nt == ntSysTable || nt == ntView || nt == ntProcedure)) { if (!treeMainM->ItemHasChildren(item)) { wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, Cmds::Menu_LoadColumnsInfo); AddPendingEvent(event); } } else if (treeActivateAction == selectFromOrExecute && (nt == ntTable || nt == ntSysTable || nt == ntView)) { wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, Cmds::Menu_BrowseData); AddPendingEvent(event); } else if (treeActivateAction == selectFromOrExecute && (nt == ntProcedure)) { wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, Cmds::Menu_ExecuteProcedure); AddPendingEvent(event); } else { switch (nt) { case ntDatabase: if (!dynamic_cast(m)->isConnected()) { wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, Cmds::Menu_Connect); AddPendingEvent(event); return; } break; case ntGenerator: showGeneratorValue(dynamic_cast(m)); break; case ntColumn: case ntTable: case ntSysTable: case ntView: case ntProcedure: case ntDomain: case ntFunction: case ntTrigger: case ntException: case ntRole: case ntSysRole: { wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, Cmds::Menu_ObjectProperties); AddPendingEvent(event); } return; default: break; }; } // Windows tree control automatically does it #ifdef __WXGTK__ bool toggle = true; config().getValue(wxT("ToggleNodeOnTreeActivate"), toggle); if (toggle) { if (treeMainM->IsExpanded(item)) treeMainM->Collapse(item); else treeMainM->Expand(item); } #endif } //----------------------------------------------------------------------------- bool MainFrame::doCanClose() { std::vector frames(BaseFrame::getFrames()); for (std::vector::iterator it = frames.begin(); it != frames.end(); it++) { if ((*it) != this && !(*it)->Close()) return false; } return true; } //----------------------------------------------------------------------------- void MainFrame::doBeforeDestroy() { Raise(); //frameManager().setWindowMenu(0); // tell it not to update menus anymore // the next few lines fix the (threading?) problem on some Linux distributions // which leave FlameRobin running if there were connected databases upon exit. // also, some other versions might crash (on Debian 64bit for example). // apparently, doing disconnect before exiting makes it work properly, and // on some distros, the wxSafeYield call is needed as well // as it doesn't hurt for others, we can leave it all here, at least until // Firebird packagers for various distros figure out how to properly use NPTL treeMainM->Freeze(); rootM->disconnectAllDatabases(); wxSafeYield(); treeMainM->Thaw(); wxTheClipboard->Flush(); } //----------------------------------------------------------------------------- void MainFrame::OnMenuQuit(wxCommandEvent& WXUNUSED(event)) { Close(); } //----------------------------------------------------------------------------- void MainFrame::OnMenuAbout(wxCommandEvent& WXUNUSED(event)) { showAboutBox(this); } //----------------------------------------------------------------------------- void MainFrame::OnMenuManual(wxCommandEvent& WXUNUSED(event)) { showDocsHtmlFile(wxT("fr_manual.html")); } //----------------------------------------------------------------------------- void MainFrame::OnMenuRelNotes(wxCommandEvent& WXUNUSED(event)) { showDocsHtmlFile(wxT("fr_whatsnew.html")); } //----------------------------------------------------------------------------- void MainFrame::OnMenuLicense(wxCommandEvent& WXUNUSED(event)) { showDocsHtmlFile(wxT("fr_license.html")); } //----------------------------------------------------------------------------- void MainFrame::OnMenuURLHomePage(wxCommandEvent& WXUNUSED(event)) { showUrl(wxT("http://www.flamerobin.org")); } //----------------------------------------------------------------------------- void MainFrame::OnMenuURLProjectPage(wxCommandEvent& WXUNUSED(event)) { showUrl(wxT("http://sourceforge.net/projects/flamerobin")); } //----------------------------------------------------------------------------- void MainFrame::OnMenuURLFeatureRequest(wxCommandEvent& WXUNUSED(event)) { showUrl(wxT("http://sourceforge.net/tracker/?atid=699237&group_id=124340")); } //----------------------------------------------------------------------------- void MainFrame::OnMenuURLBugReport(wxCommandEvent& WXUNUSED(event)) { showUrl(wxT("http://sourceforge.net/tracker/?atid=699234&group_id=124340")); } //----------------------------------------------------------------------------- void MainFrame::OnMenuConfigure(wxCommandEvent& WXUNUSED(event)) { PreferencesDialog pd(this, _("Preferences"), config(), wxFileName(config().getConfDefsPath(), wxT("fr_settings.confdef"))); if (pd.isOk() && pd.loadFromTargetConfig()) { static int pdSelection = 0; pd.selectPage(pdSelection); pd.ShowModal(); pdSelection = pd.getSelectedPage(); } } //----------------------------------------------------------------------------- void MainFrame::OnMenuDatabaseProperties(wxCommandEvent& WXUNUSED(event)) { DatabasePtr db = getDatabase(treeMainM->getSelectedMetadataItem()); if (!checkValidDatabase(db)) return; if (!tryAutoConnectDatabase()) return; MetadataItemPropertiesFrame::showPropertyPage(db.get()); } //----------------------------------------------------------------------------- void MainFrame::OnMenuDatabasePreferences(wxCommandEvent& WXUNUSED(event)) { DatabasePtr d = getDatabase(treeMainM->getSelectedMetadataItem()); if (!checkValidDatabase(d)) return; DatabaseConfig dc(d.get(), config()); PreferencesDialog pd(this, wxString::Format(_("%s Preferences"), d->getName_().c_str()), dc, wxFileName(config().getConfDefsPath(), wxT("db_settings.confdef"))); if (pd.isOk() && pd.loadFromTargetConfig()) { pd.selectPage(0); pd.ShowModal(); } } //----------------------------------------------------------------------------- void MainFrame::OnMenuGenerateCode(wxCommandEvent& event) { MetadataItem* mi = treeMainM->getSelectedMetadataItem(); if (!mi) return; DatabasePtr database = getDatabase(mi); if (!checkValidDatabase(database)) return; if (!tryAutoConnectDatabase(database)) return; MetadataTemplateManager tm(mi); int i = (int)Cmds::Menu_TemplateFirst; for (TemplateDescriptorList::const_iterator it = tm.descriptorsBegin(); it != tm.descriptorsEnd(); ++it, ++i) { if (i == event.GetId()) { executeCodeTemplate((*it)->getTemplateFileName(), mi, database); break; } } } //----------------------------------------------------------------------------- void MainFrame::OnMenuExecuteProcedure(wxCommandEvent& WXUNUSED(event)) { executeSysTemplate(wxT("execute_procedure"), treeMainM->getSelectedMetadataItem(), this); } //----------------------------------------------------------------------------- void MainFrame::OnMenuBrowseData(wxCommandEvent& WXUNUSED(event)) { executeSysTemplate(wxT("browse_data"), treeMainM->getSelectedMetadataItem(), this); } //----------------------------------------------------------------------------- void MainFrame::OnMenuRegisterDatabase(wxCommandEvent& WXUNUSED(event)) { ServerPtr s = getServer(treeMainM->getSelectedMetadataItem()); if (!checkValidServer(s)) return; DatabaseRegistrationDialog drd(this, _("Register Existing Database")); drd.setServer(s); DatabasePtr db(new Database()); drd.setDatabase(db); if (drd.ShowModal() == wxID_OK) { s->addDatabase(db); rootM->save(); treeMainM->selectMetadataItem(db.get()); } } //----------------------------------------------------------------------------- void MainFrame::OnMenuRestoreIntoNewDatabase(wxCommandEvent& WXUNUSED(event)) { ServerPtr s = getServer(treeMainM->getSelectedMetadataItem()); if (!checkValidServer(s)) return; DatabaseRegistrationDialog drd(this, _("New database parameters")); drd.setServer(s); DatabasePtr db(new Database()); drd.setDatabase(db); if (drd.ShowModal() != wxID_OK) return; s->addDatabase(db); rootM->save(); treeMainM->selectMetadataItem(db.get()); RestoreFrame* f = new RestoreFrame(this, db); f->Show(); } //----------------------------------------------------------------------------- void MainFrame::OnMenuCloneDatabase(wxCommandEvent& WXUNUSED(event)) { ServerPtr s = getServer(treeMainM->getSelectedMetadataItem()); if (!checkValidServer(s)) return; DatabasePtr d = getDatabase(treeMainM->getSelectedMetadataItem()); if (!checkValidDatabase(d)) return; DatabasePtr db(new Database()); db->setName_(d->getName_()+_(" clone")); db->getAuthenticationMode().setMode(db->getAuthenticationMode().getMode()); db->setPath(d->getPath()); db->setUsername(d->getUsername()); db->setEncryptedPassword(d->getDecryptedPassword()); db->setConnectionCharset(d->getConnectionCharset()); db->setRole(d->getRole()); DatabaseRegistrationDialog drd(this, _("Clone Registration Info")); drd.setDatabase(db); if (drd.ShowModal() == wxID_OK) { s->addDatabase(db); rootM->save(); treeMainM->selectMetadataItem(db.get()); } } //----------------------------------------------------------------------------- void MainFrame::OnMenuDatabaseRegistrationInfo(wxCommandEvent& WXUNUSED(event)) { DatabasePtr d = getDatabase(treeMainM->getSelectedMetadataItem()); if (!checkValidDatabase(d)) return; DatabaseRegistrationDialog drd(this, _("Database Registration Info")); drd.setDatabase(d); if (drd.ShowModal() == wxID_OK) rootM->save(); } //----------------------------------------------------------------------------- void MainFrame::OnMenuCreateDatabase(wxCommandEvent& WXUNUSED(event)) { ServerPtr s = getServer(treeMainM->getSelectedMetadataItem()); if (!checkValidServer(s)) return; DatabaseRegistrationDialog drd(this, _("Create New Database"), true); drd.setServer(s); DatabasePtr db(new Database()); drd.setDatabase(db); if (drd.ShowModal() == wxID_OK) { s->addDatabase(db); rootM->save(); treeMainM->selectMetadataItem(db.get()); } } //----------------------------------------------------------------------------- void MainFrame::OnMenuManageUsers(wxCommandEvent& WXUNUSED(event)) { ServerPtr s = getServer(treeMainM->getSelectedMetadataItem()); if (checkValidServer(s)) MetadataItemPropertiesFrame::showPropertyPage(s.get()); } //----------------------------------------------------------------------------- void MainFrame::OnMenuUnRegisterServer(wxCommandEvent& WXUNUSED(event)) { ServerPtr s = getServer(treeMainM->getSelectedMetadataItem()); if (!checkValidServer(s)) return; int res = showQuestionDialog(this, _("Do you really want to unregister this server?"), _("The registration information for the server and all its registered databases will be deleted. This operation can not be undone."), AdvancedMessageDialogButtonsOkCancel(_("Unregister"))); if (res == wxOK) { rootM->removeServer(s); rootM->save(); } } //----------------------------------------------------------------------------- void MainFrame::OnMenuServerProperties(wxCommandEvent& WXUNUSED(event)) { ServerPtr s = getServer(treeMainM->getSelectedMetadataItem()); if (!checkValidServer(s)) return; ServerRegistrationDialog srd(this, _("Server Registration Info"), s); if (srd.ShowModal() == wxID_OK) rootM->save(); } //----------------------------------------------------------------------------- void MainFrame::OnMenuRegisterServer(wxCommandEvent& WXUNUSED(event)) { ServerRegistrationDialog srd(this, _("Register New Server")); if (srd.ShowModal() == wxID_OK) { ServerPtr s = srd.getServer(); rootM->addServer(s); rootM->save(); treeMainM->selectMetadataItem(s.get()); } } //----------------------------------------------------------------------------- void MainFrame::OnMenuUnRegisterDatabase(wxCommandEvent& WXUNUSED(event)) { DatabasePtr d = getDatabase(treeMainM->getSelectedMetadataItem()); if (!checkValidDatabase(d)) return; // command should never be enabled when database is connected wxCHECK_RET(!d->isConnected(), wxT("Can not unregister connected database")); int res = showQuestionDialog(this, _("Do you really want to unregister this database?"), _("The registration information for the database will be deleted. This operation can not be undone."), AdvancedMessageDialogButtonsOkCancel(_("Unregister"))); if (res == wxOK) unregisterDatabase(d); } //----------------------------------------------------------------------------- void MainFrame::unregisterDatabase(DatabasePtr database) { wxCHECK_RET(database, wxT("Cannot unregister unassigned database")); ServerPtr server = database->getServer(); wxCHECK_RET(server, wxT("Cannot unregister database without server")); server->removeDatabase(database); rootM->save(); } //----------------------------------------------------------------------------- void MainFrame::OnMenuGetServerVersion(wxCommandEvent& WXUNUSED(event)) { ServerPtr s = getServer(treeMainM->getSelectedMetadataItem()); if (!checkValidServer(s)) return; std::string version; try { // progress dialog will get closed in case of fatal exception or when // retieving is complete ProgressDialog pd(this, _("Retrieving server version"), 1); pd.doShow(); IBPP::Service svc; if (!getService(s.get(), svc, &pd, false)) // false = no need for sysdba return; svc->GetVersion(version); } catch (IBPP::Exception& e) { wxMessageBox(std2wx(e.ErrorMessage()), _("Error")); return; } wxMessageBox(std2wx(version), _("Server Version"), wxOK | wxICON_INFORMATION); } //----------------------------------------------------------------------------- void MainFrame::OnMenuGenerateData(wxCommandEvent& WXUNUSED(event)) { DatabasePtr db = getDatabase(treeMainM->getSelectedMetadataItem()); if (!checkValidDatabase(db)) return; if (!tryAutoConnectDatabase(db)) return; DataGeneratorFrame* f = new DataGeneratorFrame(this, db.get()); f->Show(); } //----------------------------------------------------------------------------- void MainFrame::OnMenuMonitorEvents(wxCommandEvent& WXUNUSED(event)) { DatabasePtr db = getDatabase(treeMainM->getSelectedMetadataItem()); if (!checkValidDatabase(db)) return; if (!tryAutoConnectDatabase(db)) return; EventWatcherFrame* ewf = EventWatcherFrame::findFrameFor(db); if (ewf) { ewf->Raise(); return; } ewf = new EventWatcherFrame(this, db); ewf->Show(); } //----------------------------------------------------------------------------- void MainFrame::OnMenuBackup(wxCommandEvent& WXUNUSED(event)) { DatabasePtr db = getDatabase(treeMainM->getSelectedMetadataItem()); if (!checkValidDatabase(db)) return; BackupFrame* bf = BackupFrame::findFrameFor(db); if (bf) { bf->Raise(); return; } bf = new BackupFrame(this, db); bf->Show(); } //----------------------------------------------------------------------------- void MainFrame::OnMenuRestore(wxCommandEvent& WXUNUSED(event)) { DatabasePtr db = getDatabase(treeMainM->getSelectedMetadataItem()); if (!checkValidDatabase(db)) return; RestoreFrame* rf = RestoreFrame::findFrameFor(db); if (rf) { rf->Raise(); return; } rf = new RestoreFrame(this, db); rf->Show(); } //----------------------------------------------------------------------------- void MainFrame::OnMenuReconnect(wxCommandEvent& WXUNUSED(event)) { DatabasePtr db = getDatabase(treeMainM->getSelectedMetadataItem()); if (!checkValidDatabase(db)) return; wxBusyCursor bc; db->reconnect(); } //----------------------------------------------------------------------------- void MainFrame::OnMenuConnectAs(wxCommandEvent& WXUNUSED(event)) { DatabasePtr db = getDatabase(treeMainM->getSelectedMetadataItem()); if (!checkValidDatabase(db)) return; // command should never be enabled when database is connected wxCHECK_RET(!db->isConnected(), wxT("Can not connect to already connected database")); DatabaseRegistrationDialog drd(this, _("Connect as..."), false, true); db->prepareTemporaryCredentials(); drd.setDatabase(db); if (wxID_OK != drd.ShowModal() || !connect()) db->resetCredentials(); } //----------------------------------------------------------------------------- void MainFrame::OnMenuConnect(wxCommandEvent& WXUNUSED(event)) { connect(); } //----------------------------------------------------------------------------- bool MainFrame::getAutoConnectDatabase() { int value; if (config().getValue(wxT("DIALOG_ConfirmAutoConnect"), value)) return value == wxYES; // enable all commands to show the dialog when connection is needed return true; } //----------------------------------------------------------------------------- bool MainFrame::tryAutoConnectDatabase() { DatabasePtr db = getDatabase(treeMainM->getSelectedMetadataItem()); return checkValidDatabase(db) && tryAutoConnectDatabase(db); } //----------------------------------------------------------------------------- bool MainFrame::tryAutoConnectDatabase(DatabasePtr database) { if (database->isConnected()) return true; int res = showQuestionDialog(this, _("Do you want to connect to the database?"), _("The database is not connected. You first have to establish a connection before you can execute SQL statements or otherwise work with the database."), AdvancedMessageDialogButtonsYesNoCancel(_("C&onnect"), _("Do&n't connect")), config(), wxT("DIALOG_ConfirmAutoConnect"), _("Don't ask again, &always (don't) connect")); if (res == wxYES) connect(); return database->isConnected(); } //----------------------------------------------------------------------------- bool MainFrame::connect() { DatabasePtr db = getDatabase(treeMainM->getSelectedMetadataItem()); if (!checkValidDatabase(db)) return false; if (db->isConnected() || !connectDatabase(db.get(), this)) return false; if (db->isConnected()) { if (db->usesDifferentConnectionCharset()) { DatabaseConfig dc(db.get(), config()); if (dc.get(wxT("differentCharsetWarning"), true)) { if (wxNO == wxMessageBox(wxString::Format( _("Database charset: %s\nis different from connection charset: %s.\n\nWould you like to be reminded next time?"), db->getDatabaseCharset().c_str(), db->getConnectionCharset().c_str()), _("Warning"), wxICON_QUESTION | wxYES_NO)) { dc.setValue(wxT("differentCharsetWarning"), false); } } } treeMainM->Expand(treeMainM->GetSelection()); } updateStatusbarText(); Raise(); Update(); return true; } //----------------------------------------------------------------------------- void MainFrame::OnMenuDisconnect(wxCommandEvent& WXUNUSED(event)) { DatabasePtr db = getDatabase(treeMainM->getSelectedMetadataItem()); if (!checkValidDatabase(db)) return; // give SQL editor windows with active transactions a chance to commit // or even cancel this action std::vector frames(BaseFrame::getFrames()); for (std::vector::iterator it = frames.begin(); it != frames.end(); it++) { ExecuteSqlFrame* esf = dynamic_cast(*it); if (esf && esf->getDatabase() == db.get() && !esf->canClose()) return; } treeMainM->Freeze(); try { db->disconnect(); } catch (...) { } wxSafeYield(); treeMainM->Thaw(); updateStatusbarText(); } //----------------------------------------------------------------------------- void MainFrame::showGeneratorValue(Generator* g) { if (g) { // make sure value is reloaded from database g->invalidate(); g->ensurePropertiesLoaded(); } } //----------------------------------------------------------------------------- void MainFrame::OnMenuShowGeneratorValue(wxCommandEvent& WXUNUSED(event)) { showGeneratorValue(dynamic_cast(treeMainM->getSelectedMetadataItem())); } //----------------------------------------------------------------------------- void MainFrame::OnMenuSetGeneratorValue(wxCommandEvent& WXUNUSED(event)) { Generator* g = dynamic_cast(treeMainM->getSelectedMetadataItem()); if (!g) return; URI uri(wxT("fr://edit_generator_value")); uri.addParam(wxString::Format(wxT("parent_window=%ld"), (uintptr_t)this)); uri.addParam(wxString::Format(wxT("object_handle=%d"), g->getHandle())); getURIProcessor().handleURI(uri); } //----------------------------------------------------------------------------- void MainFrame::OnMenuShowAllGeneratorValues(wxCommandEvent& WXUNUSED(event)) { DatabasePtr db = getDatabase(treeMainM->getSelectedMetadataItem()); if (checkValidDatabase(db)) db->loadGeneratorValues(); } //----------------------------------------------------------------------------- void MainFrame::OnMenuCreateDomain(wxCommandEvent& WXUNUSED(event)) { showCreateTemplate( MetadataItemCreateStatementVisitor::getCreateDomainStatement()); } //----------------------------------------------------------------------------- void MainFrame::OnMenuCreateException(wxCommandEvent& WXUNUSED(event)) { showCreateTemplate( MetadataItemCreateStatementVisitor::getCreateExceptionStatement()); } //----------------------------------------------------------------------------- void MainFrame::OnMenuCreateFunction(wxCommandEvent& WXUNUSED(event)) { showCreateTemplate( MetadataItemCreateStatementVisitor::getCreateFunctionStatement()); } //----------------------------------------------------------------------------- void MainFrame::OnMenuCreateGenerator(wxCommandEvent& WXUNUSED(event)) { showCreateTemplate( MetadataItemCreateStatementVisitor::getCreateGeneratorStatement()); } //----------------------------------------------------------------------------- void MainFrame::OnMenuCreateProcedure(wxCommandEvent& WXUNUSED(event)) { showCreateTemplate( MetadataItemCreateStatementVisitor::getCreateProcedureStatement()); } //----------------------------------------------------------------------------- void MainFrame::OnMenuCreateRole(wxCommandEvent& WXUNUSED(event)) { showCreateTemplate( MetadataItemCreateStatementVisitor::getCreateRoleStatement()); } //----------------------------------------------------------------------------- void MainFrame::OnMenuCreateTable(wxCommandEvent& WXUNUSED(event)) { showCreateTemplate( MetadataItemCreateStatementVisitor::getCreateTableStatement()); } //----------------------------------------------------------------------------- void MainFrame::OnMenuCreateTrigger(wxCommandEvent& WXUNUSED(event)) { showCreateTemplate( MetadataItemCreateStatementVisitor::getCreateTriggerStatement()); } //----------------------------------------------------------------------------- void MainFrame::OnMenuCreateView(wxCommandEvent& WXUNUSED(event)) { showCreateTemplate( MetadataItemCreateStatementVisitor::getCreateViewStatement()); } //----------------------------------------------------------------------------- void MainFrame::OnMenuCreateObject(wxCommandEvent& WXUNUSED(event)) { MetadataItem* item = treeMainM->getSelectedMetadataItem(); if (!item) return; MetadataItemCreateStatementVisitor csv; item->acceptVisitor(&csv); showCreateTemplate(csv.getStatement()); } //----------------------------------------------------------------------------- void MainFrame::showCreateTemplate(const wxString& statement) { // TODO: add a call for wizards. For example, we can have NewTableWizard which is a frame with grid in which // user can enter column data for new table (name, datatype, null option, collation, default, etc.) and also // enter a name for new table, etc. Wizard should return a bunch of DDL statements as a wxString which would we // pass to ExecSqlFrame. if (statement == wxEmptyString) { wxMessageBox(_("The feature is not yet available for this type of database objects."), _("Not yet implemented"), wxOK | wxICON_INFORMATION); return; } DatabasePtr db = getDatabase(treeMainM->getSelectedMetadataItem()); if (!checkValidDatabase(db)) return; if (!tryAutoConnectDatabase(db)) return; showSql(this, wxEmptyString, db, statement); } //----------------------------------------------------------------------------- void MainFrame::OnMenuLoadColumnsInfo(wxCommandEvent& WXUNUSED(event)) { MetadataItem* m = treeMainM->getSelectedMetadataItem(); if (!m) return; m->ensureChildrenLoaded(); Procedure* p = dynamic_cast(m); if (p && !p->getParamCount()) { ::wxMessageBox( _("This procedure doesn't have any input or output parameters."), _("Information"), wxOK | wxICON_INFORMATION, this); } wxTreeItemId id = treeMainM->GetSelection(); if (id.IsOk() && treeMainM->ItemHasChildren(id)) treeMainM->Expand(id); } //----------------------------------------------------------------------------- void MainFrame::OnMenuAddColumn(wxCommandEvent& WXUNUSED(event)) { Table* t = dynamic_cast(treeMainM->getSelectedMetadataItem()); if (!t) return; URI uri(wxT("fr://add_field")); uri.addParam(wxString::Format(wxT("parent_window=%ld"), (uintptr_t)this)); uri.addParam(wxString::Format(wxT("object_handle=%d"), t->getHandle())); getURIProcessor().handleURI(uri); } //----------------------------------------------------------------------------- void MainFrame::OnMenuToggleDisconnected(wxCommandEvent& event) { config().setValue(wxT("HideDisconnectedDatabases"), !event.IsChecked()); // no need to call notifyAllServers() - DBH tree nodes observe the global // config objects themselves } //----------------------------------------------------------------------------- void MainFrame::OnMenuToggleStatusBar(wxCommandEvent& event) { wxStatusBar* s = GetStatusBar(); if (!s) s = CreateStatusBar(); bool show = event.IsChecked(); config().setValue(wxT("showStatusBar"), show); s->Show(show); SendSizeEvent(); } //----------------------------------------------------------------------------- void MainFrame::OnMenuToggleSearchBar(wxCommandEvent& event) { bool show = event.IsChecked(); config().setValue(wxT("showSearchBar"), show); searchPanelSizerM->Show(searchPanelM, show, true); // recursive searchPanelSizerM->Layout(); } //----------------------------------------------------------------------------- void MainFrame::OnSearchTextChange(wxCommandEvent& WXUNUSED(event)) { if (treeMainM->findText(searchBoxM->GetValue())) searchBoxM->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); else searchBoxM->SetForegroundColour(*wxRED); wxStatusBar *sb = GetStatusBar(); if (sb) sb->SetStatusText(_("Hit ENTER to focus the tree.")); } //----------------------------------------------------------------------------- void MainFrame::OnSearchBoxEnter(wxCommandEvent& WXUNUSED(event)) { wxString text = searchBoxM->GetValue(); if (text.IsEmpty()) return; // if it's a wildcard, add wildcard to the list... if (searchBoxM->GetForegroundColour() == *wxRED) searchBoxM->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); else { if (text.Find(wxChar('*')) != -1 || text.Find(wxChar('?')) != -1) searchBoxM->Append(text); else // ...otherwise, add item's name to the list searchBoxM->Append(treeMainM->GetItemText(treeMainM->GetSelection())); } searchBoxM->SetValue(wxEmptyString); treeMainM->SetFocus(); wxStatusBar *sb = GetStatusBar(); if (sb) sb->SetStatusText(_("Item added to the list.")); } //----------------------------------------------------------------------------- void MainFrame::OnButtonSearchClick(wxCommandEvent& WXUNUSED(event)) { AdvancedSearchFrame *asf = new AdvancedSearchFrame(this, rootM); asf->Show(); } //----------------------------------------------------------------------------- void MainFrame::OnButtonPrevClick(wxCommandEvent& WXUNUSED(event)) { // move backward and search then wxTreeItemId id = treeMainM->GetSelection(); if (id.IsOk()) { treeMainM->SelectItem(treeMainM->getPreviousItem(id)); treeMainM->findText(searchBoxM->GetValue(),false); if (id == treeMainM->GetSelection()) { wxStatusBar *sb = GetStatusBar(); if (sb) sb->SetStatusText(_("No more matches.")); } } } //----------------------------------------------------------------------------- void MainFrame::OnButtonNextClick(wxCommandEvent& WXUNUSED(event)) { // move forward and search then wxTreeItemId id = treeMainM->GetSelection(); if (id.IsOk()) { treeMainM->SelectItem(treeMainM->getNextItem(id)); treeMainM->findText(searchBoxM->GetValue(), true); if (id == treeMainM->GetSelection()) { wxStatusBar *sb = GetStatusBar(); if (sb) sb->SetStatusText(_("No more matches.")); } } } //----------------------------------------------------------------------------- void MainFrame::OnMenuObjectProperties(wxCommandEvent& WXUNUSED(event)) { MetadataItem* m = treeMainM->getSelectedMetadataItem(); if (!m) return; if (!tryAutoConnectDatabase()) return; Column* c = dynamic_cast(m); if (c) { // Return when we're dealing with a system column if (c->isSystem() || !c->getTable()) return; URI uri(wxT("fr://edit_field")); uri.addParam(wxString::Format(wxT("parent_window=%ld"), (uintptr_t)this)); uri.addParam(wxString::Format(wxT("object_handle=%d"), c->getHandle())); getURIProcessor().handleURI(uri); } else MetadataItemPropertiesFrame::showPropertyPage(m); } //----------------------------------------------------------------------------- void MainFrame::OnMenuObjectRefresh(wxCommandEvent& WXUNUSED(event)) { if (MetadataItem* mi = treeMainM->getSelectedMetadataItem()) { if (!tryAutoConnectDatabase()) return; // make sure notifyObservers() is called only once SubjectLocker lock(mi); mi->invalidate(); mi->invalidateDescription(); mi->notifyObservers(); } } //----------------------------------------------------------------------------- void MainFrame::OnMenuAlterObject(wxCommandEvent& WXUNUSED(event)) { MetadataItem* mi = treeMainM->getSelectedMetadataItem(); Procedure* p = dynamic_cast(mi); if (p) { URI uri(wxT("fr://edit_procedure")); uri.addParam(wxString::Format(wxT("parent_window=%ld"), (uintptr_t)this)); uri.addParam(wxString::Format(wxT("object_handle=%d"), p->getHandle())); getURIProcessor().handleURI(uri); return; } DatabasePtr db = getDatabase(mi); View* v = dynamic_cast(mi); Trigger* t = dynamic_cast(mi); Domain *dm = dynamic_cast(mi); if (!db || !p && !v && !t && !dm) return; wxString sql; if (v) sql = v->getRebuildSql(); else if (t) sql = t->getAlterSql(); else if (dm) sql = dm->getAlterSqlTemplate(); showSql(this, wxString(_("Alter object")), db, sql); } //----------------------------------------------------------------------------- void MainFrame::OnMenuRecreateDatabase(wxCommandEvent& WXUNUSED(event)) { DatabasePtr db = getDatabase(treeMainM->getSelectedMetadataItem()); if (!checkValidDatabase(db)) return; wxString msg(wxString::Format( _("Are you sure you wish to recreate the database \"%s\"?"), db->getName_().c_str())); wxString secondary; if (!db->isConnected()) secondary = _("First a connection to the database will be established. You may need to enter the password.\n"); secondary += _("The database will be dropped, and a new empty database will be created. All the data will be deleted, this is an irreversible action!"); if (wxOK == showQuestionDialog(this, msg, secondary, AdvancedMessageDialogButtonsOkCancel(_("Recreate")))) { // it's unclear at this point whether the database does still exist // try to connect to it, and if that succeeds then drop it // ignore all errors along the way... try { if (!db->isConnected()) connect(); if (db->isConnected()) db->drop(); } catch(IBPP::Exception&) {} // use the dialog as some information (charset and page size) is // not necessarily available, and the user may want to change it too DatabaseRegistrationDialog drd(this, _("Recreate Database"), true); drd.setDatabase(db); drd.setServer(db->getServer()); if (drd.ShowModal() == wxID_OK) treeMainM->selectMetadataItem(db.get()); } } //----------------------------------------------------------------------------- void MainFrame::OnMenuDropDatabase(wxCommandEvent& WXUNUSED(event)) { DatabasePtr db = getDatabase(treeMainM->getSelectedMetadataItem()); if (!checkValidDatabase(db) || !tryAutoConnectDatabase(db)) return; if (!confirmDropDatabase(db.get())) return; int result = wxMessageBox( _("Do you wish to keep the registration info?"), _("Dropping database: ") + db->getName_(), wxYES_NO | wxCANCEL | wxICON_QUESTION); if (result == wxCANCEL) return; db->drop(); if (result == wxNO) unregisterDatabase(db); } //----------------------------------------------------------------------------- void MainFrame::OnMenuDropObject(wxCommandEvent& WXUNUSED(event)) { MetadataItem* mi = treeMainM->getSelectedMetadataItem(); if (!mi) return; DatabasePtr db = getDatabase(mi); if (!checkValidDatabase(db)) return; if (!confirmDropItem(mi)) return; // TODO: We could first check if there are some dependant objects, // and offer the user to either drop dependencies, or drop those // objects too. // Then we should create a bunch of sql statements that do it. wxString stmt(mi->getDropSqlStatement()); if (!stmt.empty()) execSql(this, wxEmptyString, db, stmt, true); } //----------------------------------------------------------------------------- //! create new ExecSqlFrame and attach database object to it void MainFrame::OnMenuExecuteStatements(wxCommandEvent& WXUNUSED(event)) { DatabasePtr db = getDatabase(treeMainM->getSelectedMetadataItem()); if (!checkValidDatabase(db)) return; if (!tryAutoConnectDatabase(db)) return; showSql(this, wxString(_("Execute SQL statements")), db, wxEmptyString); } //----------------------------------------------------------------------------- const wxString MainFrame::getName() const { return wxT("MainFrame"); } //----------------------------------------------------------------------------- void MainFrame::OnMenuUpdateUnRegisterServer(wxUpdateUIEvent& event) { ServerPtr s = getServer(treeMainM->getSelectedMetadataItem()); event.Enable(s != 0 && !s->hasConnectedDatabase()); } //----------------------------------------------------------------------------- void MainFrame::OnMenuUpdateIfServerSelected(wxUpdateUIEvent& event) { ServerPtr s = getServer(treeMainM->getSelectedMetadataItem()); event.Enable(s != 0); } //----------------------------------------------------------------------------- void MainFrame::OnMenuUpdateIfDatabaseConnected(wxUpdateUIEvent& event) { DatabasePtr d = getDatabase(treeMainM->getSelectedMetadataItem()); event.Enable(d != 0 && d->isConnected()); } //----------------------------------------------------------------------------- void MainFrame::OnMenuUpdateIfDatabaseConnectedOrAutoConnect( wxUpdateUIEvent& event) { DatabasePtr d = getDatabase(treeMainM->getSelectedMetadataItem()); event.Enable(d != 0 && (d->isConnected() || getAutoConnectDatabase())); } //----------------------------------------------------------------------------- void MainFrame::OnMenuUpdateIfDatabaseNotConnected(wxUpdateUIEvent& event) { DatabasePtr d = getDatabase(treeMainM->getSelectedMetadataItem()); event.Enable(d != 0 && !d->isConnected()); } //----------------------------------------------------------------------------- void MainFrame::OnMenuUpdateIfDatabaseSelected(wxUpdateUIEvent& event) { DatabasePtr d = getDatabase(treeMainM->getSelectedMetadataItem()); event.Enable(d != 0); } //----------------------------------------------------------------------------- void MainFrame::OnMenuUpdateIfMetadataItemHasChildren(wxUpdateUIEvent& event) { MetadataItem* mi = treeMainM->getSelectedMetadataItem(); event.Enable(mi != 0 && mi->getChildrenCount()); } //----------------------------------------------------------------------------- bool MainFrame::confirmDropItem(MetadataItem* item) { wxString msg(wxString::Format( _("Are you sure you wish to drop the %s %s?"), item->getTypeName().Lower().c_str(), item->getName_().c_str())); return wxOK == showQuestionDialog(this, msg, _("Once you drop the object it is permanently removed from database."), AdvancedMessageDialogButtonsOkCancel(_("&Drop")), config(), wxT("DIALOG_ConfirmDrop"), _("Always drop without asking")); } //----------------------------------------------------------------------------- bool MainFrame::confirmDropDatabase(Database* db) { wxString msg(wxString::Format( _("Are you sure you wish to drop database %s?"), db->getName_().c_str())); return wxOK == showQuestionDialog(this, msg, _("Once you drop the database, all data is lost."), AdvancedMessageDialogButtonsOkCancel(_("&Drop"))); } //----------------------------------------------------------------------------- bool MainFrame::openUnregisteredDatabase(const wxString& dbpath) { DatabasePtr database(new Database()); database->setPath(dbpath); database->setName_(Database::extractNameFromConnectionString(dbpath)); wxString iscUser, iscPassword; if (!wxGetEnv(wxT("ISC_USER"), &iscUser)) iscUser = wxT("SYSDBA"); database->setUsername(iscUser); if (!wxGetEnv(wxT("ISC_PASSWORD"), &iscPassword)) iscPassword = wxEmptyString; database->setRawPassword(iscPassword); DatabaseRegistrationDialog drd(this, _("Database Connection Settings")); drd.setDatabase(database); if (drd.ShowModal() == wxID_OK) { rootM->addUnregisteredDatabase(database); treeMainM->selectMetadataItem(database.get()); if (connectDatabase(database.get(), this)) return true; } return false; } //----------------------------------------------------------------------------- void MainFrame::OnSetFocus(wxFocusEvent& event) { // fix an annoying bug where closing a MetadataItemPropertyFrame does // focus the main frame instead of its previously focused control mainPanelM->SetFocus(); event.Skip(); } //----------------------------------------------------------------------------- void MainFrame::executeSysTemplate(const wxString& name, MetadataItem* item, wxWindow* parentWindow) { DatabasePtr database = getDatabase(item); if (!checkValidDatabase(database)) return; if (!tryAutoConnectDatabase(database)) return; wxString code; ProgressDialog pd(parentWindow, _("Processing template...")); CodeTemplateProcessor tp(item, parentWindow); tp.processTemplateFile(code, config().getSysTemplateFileName(name), item, &pd); handleTemplateOutput(tp, database, code); } //----------------------------------------------------------------------------- void MainFrame::executeCodeTemplate(const wxFileName& fileName, MetadataItem* item, DatabasePtr database) { wxString code; ProgressDialog pd(this, _("Processing template...")); CodeTemplateProcessor tp(item, this); tp.processTemplateFile(code, fileName, item, &pd); handleTemplateOutput(tp, database, code); } //----------------------------------------------------------------------------- void MainFrame::handleTemplateOutput(TemplateProcessor& tp, DatabasePtr database, const wxString& code) { if (getStringAsBoolean(tp.getVar(wxT("output.autoexec")))) execSql(this, wxString(_("Execute SQL statements")), database, code, false); else showSql(this, wxString(_("Execute SQL statements")), database, code); } //----------------------------------------------------------------------------- bool MainFrame::handleURI(URI& uri) { if (uri.action == wxT("create_trigger")) { Relation* r = extractMetadataItemFromURI(uri); wxWindow* w = getParentWindow(uri); if (!r || !w) return true; executeSysTemplate(wxT("create_trigger"), r, w); return true; } else return false; } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/MainFrame.h000066400000000000000000000201231177057155300215640ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef MAINFRAME_H #define MAINFRAME_H //-------------------------------------------------------------------------------------- #include #include #include #include #include #include "gui/BaseFrame.h" #include "gui/GUIURIHandlerHelper.h" #include "metadata/MetadataClasses.h" #include "metadata/MetadataItemURIHandlerHelper.h" //----------------------------------------------------------------------------- class DBHTreeControl; class LabelPanel; class TemplateProcessor; class wxFileName; //----------------------------------------------------------------------------- class MainFrame: public BaseFrame, private URIHandler, private MetadataItemURIHandlerHelper, private GUIURIHandlerHelper { public: // menu handling events void OnMenuRegisterServer(wxCommandEvent& event); void OnMenuQuit(wxCommandEvent& event); void OnMenuAbout(wxCommandEvent& event); void OnMenuManual(wxCommandEvent& event); void OnMenuRelNotes(wxCommandEvent& event); void OnMenuLicense(wxCommandEvent& event); void OnMenuURLHomePage(wxCommandEvent& event); void OnMenuURLProjectPage(wxCommandEvent& event); void OnMenuURLFeatureRequest(wxCommandEvent& event); void OnMenuURLBugReport(wxCommandEvent& event); void OnMenuConfigure(wxCommandEvent& event); void OnMenuRegisterDatabase(wxCommandEvent& event); void OnMenuCloneDatabase(wxCommandEvent& event); void OnMenuDatabaseRegistrationInfo(wxCommandEvent& event); void OnMenuCreateDatabase(wxCommandEvent& event); void OnMenuRecreateDatabase(wxCommandEvent& event); void OnMenuDropDatabase(wxCommandEvent& event); void OnMenuRestoreIntoNewDatabase(wxCommandEvent& event); void OnMenuManageUsers(wxCommandEvent& event); void OnMenuUnRegisterServer(wxCommandEvent& event); void OnMenuServerProperties(wxCommandEvent& event); void OnMenuUnRegisterDatabase(wxCommandEvent& event); void OnMenuGetServerVersion(wxCommandEvent& event); void OnMenuMonitorEvents(wxCommandEvent& event); void OnMenuGenerateData(wxCommandEvent& event); void OnMenuBackup(wxCommandEvent& event); void OnMenuExecuteStatements(wxCommandEvent& event); void OnMenuInsert(wxCommandEvent& event); void OnMenuBrowseData(wxCommandEvent& event); void OnMenuRestore(wxCommandEvent& event); void OnMenuShowAllGeneratorValues(wxCommandEvent& event); void OnMenuShowGeneratorValue(wxCommandEvent& event); void OnMenuSetGeneratorValue(wxCommandEvent& event); void OnMenuToggleStatusBar(wxCommandEvent& event); void OnMenuToggleSearchBar(wxCommandEvent& event); void OnMenuToggleDisconnected(wxCommandEvent& event); void OnMenuCreateObject(wxCommandEvent& event); void OnMenuLoadColumnsInfo(wxCommandEvent& event); void OnMenuAddColumn(wxCommandEvent& event); void OnMenuObjectProperties(wxCommandEvent& event); void OnMenuObjectRefresh(wxCommandEvent& event); void OnMenuDropObject(wxCommandEvent& event); void OnMenuAlterObject(wxCommandEvent& event); void OnMenuCreateTriggerForTable(wxCommandEvent& event); void OnMenuGenerateCode(wxCommandEvent& event); void OnMenuExecuteProcedure(wxCommandEvent& event); void OnMenuDisconnect(wxCommandEvent& event); void OnMenuConnect(wxCommandEvent& event); void OnMenuConnectAs(wxCommandEvent& event); void OnMenuReconnect(wxCommandEvent& event); void OnMenuDatabasePreferences(wxCommandEvent& event); void OnMenuDatabaseProperties(wxCommandEvent& event); // create new object void showCreateTemplate(const wxString& statement); void OnMenuCreateDomain(wxCommandEvent& event); void OnMenuCreateException(wxCommandEvent& event); void OnMenuCreateFunction(wxCommandEvent& event); void OnMenuCreateGenerator(wxCommandEvent& event); void OnMenuCreateProcedure(wxCommandEvent& event); void OnMenuCreateRole(wxCommandEvent& event); void OnMenuCreateTable(wxCommandEvent& event); void OnMenuCreateTrigger(wxCommandEvent& event); void OnMenuCreateView(wxCommandEvent& event); // enabled menu items void OnMenuUpdateUnRegisterServer(wxUpdateUIEvent& event); void OnMenuUpdateIfServerSelected(wxUpdateUIEvent& event); void OnMenuUpdateIfDatabaseConnected(wxUpdateUIEvent& event); void OnMenuUpdateIfDatabaseConnectedOrAutoConnect(wxUpdateUIEvent& event); void OnMenuUpdateIfDatabaseNotConnected(wxUpdateUIEvent& event); void OnMenuUpdateIfDatabaseSelected(wxUpdateUIEvent& event); void OnMenuUpdateIfMetadataItemHasChildren(wxUpdateUIEvent& event); // other events void OnMainMenuOpen(wxMenuEvent& event); void OnTreeSelectionChanged(wxTreeEvent& event); void OnTreeItemActivate(wxTreeEvent& event); void OnSetFocus(wxFocusEvent& event); // search stuff (IDs 600+ are taken!) enum { ID_button_advanced = 401, ID_button_prev, ID_button_next, ID_search_box, ID_notebook }; void OnSearchTextChange(wxCommandEvent& event); void OnSearchBoxEnter(wxCommandEvent& event); void OnButtonSearchClick(wxCommandEvent &event); void OnButtonPrevClick(wxCommandEvent &event); void OnButtonNextClick(wxCommandEvent &event); DBHTreeControl* getTreeCtrl(); MainFrame(wxWindow* parent, int id, const wxString& title, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_FRAME_STYLE); bool openUnregisteredDatabase(const wxString& dbpath); bool handleURI(URI& uri); private: RootPtr rootM; virtual bool doCanClose(); virtual void doBeforeDestroy(); bool getAutoConnectDatabase(); bool tryAutoConnectDatabase(); bool tryAutoConnectDatabase(DatabasePtr database); void unregisterDatabase(DatabasePtr database); bool connect(); void showGeneratorValue(Generator* g); void updateStatusbarText(); void showDocsHtmlFile(const wxString& fileName); void showUrl(const wxString& url); void set_properties(); void do_layout(); void buildMainMenu(); bool confirmDropItem(MetadataItem* item); bool confirmDropDatabase(Database* db); void executeSysTemplate(const wxString& name, MetadataItem* item, wxWindow* parentWindow); void handleTemplateOutput(TemplateProcessor& tp, DatabasePtr database, const wxString& code); void executeCodeTemplate(const wxFileName& fileName, MetadataItem* item, DatabasePtr database); protected: DBHTreeControl* treeMainM; wxMenuBar* menuBarM; wxMenu* windowMenuM; // dynamic menu wxMenu* objectMenuM; wxMenu* databaseMenuM; wxPanel* mainPanelM; wxPanel* searchPanelM; wxBoxSizer* searchPanelSizerM; wxComboBox* searchBoxM; wxBitmapButton* button_prev; wxBitmapButton* button_next; wxBitmapButton* button_advanced; virtual const wxString getName() const; virtual const wxRect getDefaultRect() const; DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- #endif // MAINFRAME_H flamerobin_0.9.3~svn+2220.orig/src/gui/MetadataItemPropertiesFrame.cpp000066400000000000000000000604411177057155300256560ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include #include #include #include #include #include "config/Config.h" #include "core/ArtProvider.h" #include "core/FRError.h" #include "core/URIProcessor.h" #include "engine/MetadataLoader.h" #include "gui/GUIURIHandlerHelper.h" #include "gui/HtmlTemplateProcessor.h" #include "gui/MetadataItemPropertiesFrame.h" #include "gui/ProgressDialog.h" #include "metadata/column.h" #include "metadata/database.h" #include "metadata/parameter.h" #include "metadata/procedure.h" #include "metadata/table.h" #include "metadata/view.h" //----------------------------------------------------------------------------- //! MetadataItemPropertiesPanel class class MetadataItemPropertiesPanel: public wxPanel, public Observer { private: enum { ptSummary, ptConstraints, ptDependencies, ptTriggers, ptTableIndices, ptDDL, ptPrivileges } pageTypeM; MetadataItem* objectM; bool htmlReloadRequestedM; PrintableHtmlWindow* html_window; // load page in idle handler, only request a reload in update() void requestLoadPage(bool showLoadingPage); void loadPage(); // observer stuff virtual void subjectRemoved(Subject* subject); virtual void update(); public: MetadataItemPropertiesPanel(MetadataItemPropertiesFrame* parent, MetadataItem* object); virtual ~MetadataItemPropertiesPanel(); MetadataItem* getObservedObject() const; MetadataItemPropertiesFrame* getParentFrame(); void setPage(const wxString& type); private: // event handling void OnCloseFrame(wxCommandEvent& event); void OnHtmlCellHover(wxHtmlCellEvent &event); void OnIdle(wxIdleEvent& event); void OnRefresh(wxCommandEvent& event); }; //----------------------------------------------------------------------------- typedef std::list MIPPanels; static MIPPanels mipPanels; //----------------------------------------------------------------------------- MetadataItemPropertiesPanel::MetadataItemPropertiesPanel( MetadataItemPropertiesFrame* parent, MetadataItem* object) : wxPanel(parent, wxID_ANY), pageTypeM(ptSummary), objectM(object), htmlReloadRequestedM(false) { wxASSERT(object); mipPanels.push_back(this); html_window = new PrintableHtmlWindow(this, wxID_ANY); parent->SetTitle(object->getName_()); wxBoxSizer* bSizer2 = new wxBoxSizer( wxVERTICAL ); bSizer2->Add(html_window, 1, wxEXPAND, 0 ); SetSizer( bSizer2 ); Layout(); wxAcceleratorEntry entries[4]; entries[0].Set(wxACCEL_CMD, (int) 'W', wxID_CLOSE_FRAME); entries[1].Set(wxACCEL_CMD, (int) 'R', wxID_REFRESH); // MSW only entries[2].Set(wxACCEL_CTRL, WXK_F4, wxID_CLOSE_FRAME); entries[3].Set(wxACCEL_NORMAL, WXK_F5, wxID_REFRESH); bool isMSW = (wxPlatformInfo::Get().GetOperatingSystemId() & wxOS_WINDOWS) != 0; wxAcceleratorTable acct(isMSW ? 4 : 2, entries); SetAcceleratorTable(acct); Connect(wxID_CLOSE_FRAME, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MetadataItemPropertiesPanel::OnCloseFrame)); Connect(wxID_ANY, wxEVT_COMMAND_HTML_CELL_HOVER, wxHtmlCellEventHandler(MetadataItemPropertiesPanel::OnHtmlCellHover)); Connect(wxID_REFRESH, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MetadataItemPropertiesPanel::OnRefresh)); // request initial rendering requestLoadPage(true); objectM->attachObserver(this, true); } //----------------------------------------------------------------------------- MetadataItemPropertiesPanel::~MetadataItemPropertiesPanel() { mipPanels.remove(this); } //----------------------------------------------------------------------------- MetadataItem* MetadataItemPropertiesPanel::getObservedObject() const { return objectM; } //----------------------------------------------------------------------------- //! defer (possibly expensive) creation and display of html page to idle time void MetadataItemPropertiesPanel::requestLoadPage(bool showLoadingPage) { if (!htmlReloadRequestedM) { if (showLoadingPage) { html_window->LoadFile(config().getHtmlTemplatesPath() + wxT("ALLloading.html")); } Connect(wxID_ANY, wxEVT_IDLE, wxIdleEventHandler(MetadataItemPropertiesPanel::OnIdle)); htmlReloadRequestedM = true; } } //----------------------------------------------------------------------------- //! determine the path, load and display html page void MetadataItemPropertiesPanel::loadPage() { wxString fileName = config().getHtmlTemplatesPath(); switch (pageTypeM) { case ptSummary: fileName += objectM->getTypeName() + wxT(".html"); break; case ptConstraints: fileName += objectM->getTypeName() + wxT("constraints.html"); break; case ptTriggers: fileName += objectM->getTypeName() + wxT("triggers.html"); break; case ptPrivileges: fileName += objectM->getTypeName() + wxT("privileges.html"); break; case ptTableIndices: fileName += wxT("TABLEindices.html"); break; case ptDependencies: fileName += wxT("dependencies.html"); break; case ptDDL: fileName += wxT("DDL.html"); break; } wxBusyCursor bc; // start a transaction for metadata loading and lock the object DatabasePtr db = objectM->getDatabase(); MetadataLoaderTransaction tr((db) ? db->getMetadataLoader() : 0); SubjectLocker lock(objectM); ProgressDialog pd(this, _("Processing template...")); pd.doShow(); wxString htmlpage; HtmlTemplateProcessor tp(objectM, this); tp.processTemplateFile(htmlpage, fileName, 0, &pd); pd.SetTitle(_("Rendering page...")); wxWindowUpdateLocker freeze(html_window); int x = 0, y = 0; html_window->GetViewStart(&x, &y); // save scroll position html_window->setPageSource(htmlpage); html_window->Scroll(x, y); // restore scroll position // set title if (MetadataItemPropertiesFrame* pf = getParentFrame()) { pf->setTabTitle(this, objectM->getName_() + wxT(": ") + html_window->GetOpenedPageTitle()); } } //----------------------------------------------------------------------------- //! closes window if observed object gets removed (disconnecting, dropping, etc) void MetadataItemPropertiesPanel::subjectRemoved(Subject* subject) { // main observed object is getting destroyed if (subject == objectM) { objectM = 0; if (MetadataItemPropertiesFrame* f = getParentFrame()) f->removePanel(this); } } //----------------------------------------------------------------------------- MetadataItemPropertiesFrame* MetadataItemPropertiesPanel::getParentFrame() { for (wxWindow* w = GetParent(); w; w = w->GetParent()) { if (MetadataItemPropertiesFrame* f = dynamic_cast(w)) { return f; } } return 0; } //----------------------------------------------------------------------------- void MetadataItemPropertiesPanel::setPage(const wxString& type) { if (type == wxT("constraints")) pageTypeM = ptConstraints; else if (type == wxT("dependencies")) pageTypeM = ptDependencies; else if (type == wxT("triggers")) pageTypeM = ptTriggers; else if (type == wxT("indices")) pageTypeM = ptTableIndices; else if (type == wxT("ddl")) pageTypeM = ptDDL; else if (type == wxT("privileges")) pageTypeM = ptPrivileges; // add more page types here when needed else pageTypeM = ptSummary; requestLoadPage(true); } //----------------------------------------------------------------------------- //! recreate html page if something changes void MetadataItemPropertiesPanel::update() { Database* db = dynamic_cast(objectM); if (db && !db->isConnected()) { objectM = 0; if (MetadataItemPropertiesFrame* f = getParentFrame()) f->Close(); // MB: This code used to use: //f->removePanel(this); // which would allow us to mix property pages from different // databases in the same Frame, but there are some mysterious // reasons why it causes heap corruption with MSVC return; } // if table or view columns change, we need to reattach if (objectM->getType() == ntTable || objectM->getType() == ntView) // also observe columns { Relation* r = dynamic_cast(objectM); if (!r) return; SubjectLocker locker(r); r->ensureChildrenLoaded(); for (ColumnPtrs::iterator it = r->begin(); it != r->end(); ++it) (*it)->attachObserver(this, false); } // if description of procedure params change, we need to reattach if (objectM->getType() == ntProcedure) { Procedure* p = dynamic_cast(objectM); if (!p) return; SubjectLocker locker(p); p->ensureChildrenLoaded(); for (ParameterPtrs::iterator it = p->begin(); it != p->end(); ++it) (*it)->attachObserver(this, false); } // with this set to false updates to the same page do not show the // "Please wait while the data is being loaded..." temporary page // this results in less flicker, but may also seem less responsive if (!htmlReloadRequestedM) requestLoadPage(false); } //----------------------------------------------------------------------------- void MetadataItemPropertiesPanel::OnCloseFrame(wxCommandEvent& WXUNUSED(event)) { if (MetadataItemPropertiesFrame* f = getParentFrame()) f->removePanel(this); } //----------------------------------------------------------------------------- void MetadataItemPropertiesPanel::OnHtmlCellHover(wxHtmlCellEvent& event) { wxHtmlCell* c = event.GetCell(); if (!c) return; wxHtmlLinkInfo* lnk = c->GetLink(); if (!lnk) return; wxString addr = lnk->GetHref(); URI uri(addr); if (uri.protocol == wxT("info")) // special { // GetStatusBar()->SetStatusText(uri.action); // I'm having a hard time trying to convert this to screen coordinates // since parent's coords cannot be retrieved(?) //wxRect r(c->GetPosX(), c->GetPosY(), c->GetWidth(), c->GetHeight()); // M.B. So I decided to use a 21x9 box around the mouse wxRect r(::wxGetMousePosition().x - 10, ::wxGetMousePosition().y - 4, 21, 9); wxTipWindow* tw = new wxTipWindow(this, uri.action); tw->SetBoundingRect(r); } } //----------------------------------------------------------------------------- void MetadataItemPropertiesPanel::OnIdle(wxIdleEvent& WXUNUSED(event)) { Disconnect(wxID_ANY, wxEVT_IDLE); wxBusyCursor bc; loadPage(); htmlReloadRequestedM = false; } //----------------------------------------------------------------------------- void MetadataItemPropertiesPanel::OnRefresh(wxCommandEvent& WXUNUSED(event)) { if (objectM) objectM->invalidate(); // with this set to false updates to the same page do not show the // "Please wait while the data is being loaded..." temporary page // this results in less flicker, but may also seem less responsive requestLoadPage(false); SetFocus(); } //----------------------------------------------------------------------------- // TODO: replace this with a nice generic property page icon for all types wxIcon getMetadataItemIcon(NodeType type) { wxSize sz(32, 32); switch (type) { case ntColumn: return wxArtProvider::GetIcon(ART_Column, wxART_OTHER, sz); case ntDatabase: return wxArtProvider::GetIcon(ART_DatabaseConnected, wxART_OTHER, sz); case ntDomain: return wxArtProvider::GetIcon(ART_Domain, wxART_OTHER, sz); case ntFunction: return wxArtProvider::GetIcon(ART_Function, wxART_OTHER, sz); case ntGenerator: return wxArtProvider::GetIcon(ART_Generator, wxART_OTHER, sz); case ntProcedure: return wxArtProvider::GetIcon(ART_Procedure, wxART_OTHER, sz); case ntServer: return wxArtProvider::GetIcon(ART_Server, wxART_OTHER, sz); case ntSysTable: return wxArtProvider::GetIcon(ART_SystemTable, wxART_OTHER, sz); case ntTable: return wxArtProvider::GetIcon(ART_Table, wxART_OTHER, sz); case ntTrigger: return wxArtProvider::GetIcon(ART_Trigger, wxART_OTHER, sz); case ntView: return wxArtProvider::GetIcon(ART_View, wxART_OTHER, sz); default: break; } return wxArtProvider::GetIcon(ART_FlameRobin, wxART_OTHER, sz); } //----------------------------------------------------------------------------- //! MetadataItemPropertiesFrame class MetadataItemPropertiesFrame::MetadataItemPropertiesFrame(wxWindow* parent, MetadataItem* object) : BaseFrame(parent, wxID_ANY, wxEmptyString) { // we need to store this right now, since we might lose the object later setStorageName(object); wxStatusBar* sb = CreateStatusBar(); DatabasePtr db = object->getDatabase(); if (db) // server property page doesn't have a database, so don't crash sb->SetStatusText(db->getConnectionInfoString()); else sb->SetStatusText(object->getName_()); if (db && config().get(wxT("linksOpenInTabs"), true)) { SetIcon(wxArtProvider::GetIcon(ART_DatabaseConnected, wxART_FRAME_ICON)); databaseNameM = db->getName_(); } else // when linksOpenInTabs, only the server node { SetIcon(getMetadataItemIcon(object->getType())); } notebookM = new wxAuiNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxAUI_NB_DEFAULT_STYLE | wxAUI_NB_WINDOWLIST_BUTTON | wxAUI_NB_TAB_EXTERNAL_MOVE | wxNO_BORDER); auiManagerM.SetManagedWindow(this); auiManagerM.AddPane(notebookM, wxAuiPaneInfo().CenterPane().PaneBorder(false)); auiManagerM.Update(); Connect(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE, wxAuiNotebookEventHandler( MetadataItemPropertiesFrame::OnNotebookPageClose), NULL, this); Connect(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, wxAuiNotebookEventHandler( MetadataItemPropertiesFrame::OnNotebookPageChanged), NULL, this); } //----------------------------------------------------------------------------- MetadataItemPropertiesFrame::~MetadataItemPropertiesFrame() { auiManagerM.UnInit(); } //----------------------------------------------------------------------------- /*static*/ MetadataItemPropertiesPanel* MetadataItemPropertiesFrame::openNewPropertyPageInFrame(MetadataItem* object) { MetadataItemPropertiesFrame* mf = new MetadataItemPropertiesFrame( wxTheApp->GetTopWindow(), object); MetadataItemPropertiesPanel* mpp = new MetadataItemPropertiesPanel(mf, object); mf->showPanel(mpp, object->getName_()); return mpp; } //----------------------------------------------------------------------------- /*static*/ MetadataItemPropertiesPanel* MetadataItemPropertiesFrame::openNewPropertyPageInTab(MetadataItem* object, MetadataItemPropertiesFrame* parentFrame) { // find frame showing the same database MetadataItemPropertiesFrame* mf = 0; if (object) { DatabasePtr db = object->getDatabase(); if (db) { for (MIPPanels::iterator it = mipPanels.begin(); it != mipPanels.end(); ++it) { MetadataItem* mi = (*it)->getObservedObject(); if (mi && mi->getDatabase() == db) { mf = (*it)->getParentFrame(); if (parentFrame == 0 || parentFrame == mf) break; } } } } if (!mf) return openNewPropertyPageInFrame(object); MetadataItemPropertiesPanel* mpp = new MetadataItemPropertiesPanel(mf, object); mf->showPanel(mpp, object->getName_()); return mpp; } //----------------------------------------------------------------------------- /*static*/ MetadataItemPropertiesPanel* MetadataItemPropertiesFrame::showPropertyPage(MetadataItem* object) { if (object) { for (MIPPanels::iterator it = mipPanels.begin(); it != mipPanels.end(); ++it) { if ((*it)->getObservedObject() == object) { if (MetadataItemPropertiesFrame* mf = (*it)->getParentFrame()) mf->showPanel(*it, object->getName_()); return *it; } } } if (config().get(wxT("linksOpenInTabs"), true)) return openNewPropertyPageInTab(object, 0); return openNewPropertyPageInFrame(object); } //----------------------------------------------------------------------------- const wxRect MetadataItemPropertiesFrame::getDefaultRect() const { return wxRect(-1, -1, 600, 420); } //----------------------------------------------------------------------------- const wxString MetadataItemPropertiesFrame::getName() const { return wxT("MIPFrame"); } //----------------------------------------------------------------------------- const wxString MetadataItemPropertiesFrame::getStorageName() const { return storageNameM; } //----------------------------------------------------------------------------- void MetadataItemPropertiesFrame::removePanel( MetadataItemPropertiesPanel* panel) { int pg = notebookM->GetPageIndex(panel); if (pg == wxNOT_FOUND) return; notebookM->DeletePage(pg); if (notebookM->GetPageCount() < 1) Close(); } //----------------------------------------------------------------------------- void MetadataItemPropertiesFrame::setStorageName(MetadataItem* object) { StorageGranularity g; if (!config().getValue(wxT("MetadataFrameStorageGranularity"), g)) g = sgFrame; if (config().get(wxT("linksOpenInTabs"), true)) g = sgFrame; switch (g) { case sgFrame: storageNameM = getName(); break; case sgObjectType: storageNameM = getName() + Config::pathSeparator + object->getTypeName(); break; case sgObject: storageNameM = getName() + Config::pathSeparator + object->getItemPath(); break; default: storageNameM = wxT(""); break; } } //----------------------------------------------------------------------------- void MetadataItemPropertiesFrame::setTabTitle( MetadataItemPropertiesPanel* panel, const wxString& title) { int pg = notebookM->GetPageIndex(panel); if (pg == wxNOT_FOUND) return; notebookM->SetPageText(pg, title); } //----------------------------------------------------------------------------- void MetadataItemPropertiesFrame::showPanel(MetadataItemPropertiesPanel* panel, const wxString& title) { int pg = notebookM->GetPageIndex(panel); if (pg == wxNOT_FOUND) notebookM->AddPage(panel, title, true); else notebookM->SetSelection(pg); Show(); if (panel) panel->SetFocus(); Raise(); } //----------------------------------------------------------------------------- // when last tab is closed, close the frame void MetadataItemPropertiesFrame::OnNotebookPageClose( wxAuiNotebookEvent& WXUNUSED(event)) { // seems that page count returns pages before event not after // probably because event can be Vetoed if (notebookM->GetPageCount() < 2) Close(); } //----------------------------------------------------------------------------- // when last tab is closed, close the frame void MetadataItemPropertiesFrame::OnNotebookPageChanged( wxAuiNotebookEvent& event) { int sel = event.GetSelection(); if (sel == wxNOT_FOUND) return; if (databaseNameM.empty()) SetTitle(notebookM->GetPageText(sel)); else SetTitle(databaseNameM + wxT(" - ") + notebookM->GetPageText(sel)); } //----------------------------------------------------------------------------- //! PageHandler class class PageHandler: public URIHandler, private GUIURIHandlerHelper { public: PageHandler() {}; bool handleURI(URI& uri); private: static const PageHandler handlerInstance; // singleton; registers itself on creation. }; const PageHandler PageHandler::handlerInstance; //----------------------------------------------------------------------------- bool PageHandler::handleURI(URI& uri) { if (uri.action != wxT("page")) return false; MetadataItemPropertiesPanel* mpp = dynamic_cast< MetadataItemPropertiesPanel*>(getParentWindow(uri)); if (!mpp) return true; if (uri.getParam(wxT("target")) == wxT("new")) { mpp = MetadataItemPropertiesFrame::openNewPropertyPageInFrame( mpp->getObservedObject()); } else if (uri.getParam(wxT("target")) == wxT("new_tab")) { mpp = MetadataItemPropertiesFrame::openNewPropertyPageInTab( mpp->getObservedObject(), mpp->getParentFrame()); } mpp->setPage(uri.getParam(wxT("type"))); //frameManager().rebuildMenu(); return true; } //----------------------------------------------------------------------------- //! PropertiesHandler class class PropertiesHandler: public URIHandler, private GUIURIHandlerHelper { public: PropertiesHandler() {}; bool handleURI(URI& uri); private: static const PropertiesHandler handlerInstance; // singleton; registers itself on creation. }; const PropertiesHandler PropertiesHandler::handlerInstance; //----------------------------------------------------------------------------- bool PropertiesHandler::handleURI(URI& uri) { if (uri.action != wxT("properties")) return false; MetadataItemPropertiesPanel* parent = dynamic_cast< MetadataItemPropertiesPanel*>(getParentWindow(uri)); if (!parent) return true; DatabasePtr db = parent->getObservedObject()->getDatabase(); if (!db) return true; NodeType n = getTypeByName(uri.getParam(wxT("object_type"))); MetadataItem* object = db->findByNameAndType(n, uri.getParam(wxT("object_name"))); if (!object) { ::wxMessageBox( _("Cannot find destination object\nThis should never happen."), _("Error"), wxICON_ERROR); return true; } if (uri.getParam(wxT("target")) == wxT("new_tab")) { MetadataItemPropertiesFrame::openNewPropertyPageInTab(object, parent->getParentFrame()); } else if (uri.getParam(wxT("target")) == wxT("new")) MetadataItemPropertiesFrame::openNewPropertyPageInFrame(object); else MetadataItemPropertiesFrame::showPropertyPage(object); return true; } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/MetadataItemPropertiesFrame.h000066400000000000000000000062041177057155300253200ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ #ifndef FR_METADATAITEMPROPERTIESFRAME_H #define FR_METADATAITEMPROPERTIESFRAME_H //----------------------------------------------------------------------------- #include #include #include #include #include "core/Observer.h" #include "gui/BaseFrame.h" #include "gui/controls/PrintableHtmlWindow.h" class MetadataItem; class MetadataItemPropertiesPanel; //----------------------------------------------------------------------------- class MetadataItemPropertiesFrame: public BaseFrame { private: wxString databaseNameM; // used to remember the value among calls to getStorageName(), // needed because it's not possible to access objectM // (see getStorageName()) after detaching from it. mutable wxString storageNameM; void setStorageName(MetadataItem* object); protected: virtual const wxString getName() const; virtual const wxString getStorageName() const; virtual const wxRect getDefaultRect() const; public: MetadataItemPropertiesFrame(wxWindow* parent, MetadataItem* object); virtual ~MetadataItemPropertiesFrame(); static MetadataItemPropertiesPanel* openNewPropertyPageInFrame( MetadataItem* object); static MetadataItemPropertiesPanel* openNewPropertyPageInTab( MetadataItem* object, MetadataItemPropertiesFrame* parentFrame); static MetadataItemPropertiesPanel* showPropertyPage( MetadataItem* object); private: wxAuiManager auiManagerM; wxAuiNotebook* notebookM; friend class MetadataItemPropertiesPanel; void removePanel(MetadataItemPropertiesPanel* panel); void setTabTitle(MetadataItemPropertiesPanel* panel, const wxString& title); void showPanel(MetadataItemPropertiesPanel* panel, const wxString& title); // event handling void OnNotebookPageClose(wxAuiNotebookEvent& event); void OnNotebookPageChanged(wxAuiNotebookEvent& event); }; //----------------------------------------------------------------------------- #endif // FR_METADATAITEMPROPERTIESFRAME_H flamerobin_0.9.3~svn+2220.orig/src/gui/MultilineEnterDialog.cpp000066400000000000000000000101641177057155300243440ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "gui/controls/TextControl.h" #include "gui/MultilineEnterDialog.h" #include "gui/StyleGuide.h" //----------------------------------------------------------------------------- bool GetMultilineTextFromUser(wxWindow* parent, const wxString& title, wxString& value, const wxString& caption, const wxString& buttonLabel) { MultilineEnterDialog med(parent, title, caption); med.setText(value); if (!buttonLabel.IsEmpty()) med.setOkButtonLabel(buttonLabel); if (wxID_OK != med.ShowModal()) return false; value = med.getText(); return true; } //----------------------------------------------------------------------------- MultilineEnterDialog::MultilineEnterDialog(wxWindow* parent, const wxString& title, const wxString& caption) : BaseDialog(parent, wxID_ANY, title) { if (!caption.IsEmpty()) static_caption = new wxStaticText(getControlsPanel(), -1, caption); else static_caption = 0; text_ctrl_value = new TextControl(getControlsPanel()); button_ok = new wxButton(getControlsPanel(), wxID_OK, _("Save")); button_cancel = new wxButton(getControlsPanel(), wxID_CANCEL, _("Cancel")); layoutControls(); button_ok->SetDefault(); } //----------------------------------------------------------------------------- wxString MultilineEnterDialog::getText() const { return text_ctrl_value->GetText(); } //----------------------------------------------------------------------------- void MultilineEnterDialog::setText(const wxString& text) { text_ctrl_value->SetText(text); } //----------------------------------------------------------------------------- void MultilineEnterDialog::setOkButtonLabel(const wxString& label) { button_ok->SetLabel(label); } //----------------------------------------------------------------------------- const wxString MultilineEnterDialog::getName() const { return wxT("MultilineEnterDialog"); } //----------------------------------------------------------------------------- void MultilineEnterDialog::layoutControls() { wxBoxSizer* sizerControls = new wxBoxSizer(wxVERTICAL); if (static_caption) { sizerControls->Add(static_caption, 0, wxEXPAND); // styleguide().getControlLabelMargin() doesn't look good sizerControls->AddSpacer( styleguide().getRelatedControlMargin(wxVERTICAL)); } text_ctrl_value->SetSizeHints(200, 100); text_ctrl_value->SetSize(200, 100); sizerControls->Add(text_ctrl_value, 1, wxEXPAND); wxSizer* sizerButtons = styleguide().createButtonSizer(button_ok, button_cancel); layoutSizers(sizerControls, sizerButtons, true); } //----------------------------------------------------------------------------- flamerobin_0.9.3~svn+2220.orig/src/gui/MultilineEnterDialog.h000066400000000000000000000045401177057155300240120ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ //----------------------------------------------------------------------------- #ifndef MULTILINEENTERDIALOG_H #define MULTILINEENTERDIALOG_H #include #include "gui/BaseDialog.h" class TextControl; //----------------------------------------------------------------------------- bool GetMultilineTextFromUser(wxWindow* parent, const wxString& title, wxString& value, const wxString& caption = wxEmptyString, const wxString& buttonLabel = wxEmptyString); //----------------------------------------------------------------------------- //! normally you shouldn't need to create objects of this class, just use // the GetMultilineTextFromUser() function class MultilineEnterDialog: public BaseDialog { private: TextControl* text_ctrl_value; wxStaticText* static_caption; wxButton* button_ok; wxButton* button_cancel; void layoutControls(); protected: virtual const wxString getName() const; public: MultilineEnterDialog(wxWindow* parent, const wxString& title, const wxString& caption = wxEmptyString); wxString getText() const; void setText(const wxString& text); void setOkButtonLabel(const wxString& label); }; //----------------------------------------------------------------------------- #endif flamerobin_0.9.3~svn+2220.orig/src/gui/PreferencesDialog.cpp000066400000000000000000000665131177057155300236560ustar00rootroot00000000000000/* Copyright (c) 2004-2012 The FlameRobin Development Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. $Id$ */ // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include #include #include #include #include #include #include "config/Config.h" #include "core/ArtProvider.h" #include "core/FRError.h" #include "core/StringUtils.h" #include "gui/ConfdefTemplateProcessor.h" #include "gui/PreferencesDialog.h" #include "gui/StyleGuide.h" //----------------------------------------------------------------------------- static bool hasParamNode(wxXmlNode* node, const wxString& param) { for (wxXmlNode* n = node->GetChildren(); (n); n = n->GetNext()) { if (n->GetType() == wxXML_ELEMENT_NODE && n->GetName() == param) return true; } return false; } //----------------------------------------------------------------------------- static const wxString getNodeContent(wxXmlNode* node, const wxString& defvalue) { for (wxXmlNode* n = node->GetChildren(); (n); n = n->GetNext()) { if (n->GetType() == wxXML_TEXT_NODE || n->GetType() == wxXML_CDATA_SECTION_NODE) { return n->GetContent(); } } return defvalue; } //----------------------------------------------------------------------------- //! return wxString for comparison, used to limit features to certain platforms wxString getPlatformName() { #ifdef __WINDOWS__ return wxT("win"); #elif defined(__MAC__) || defined(__APPLE__) return wxT("mac"); #elif defined(__UNIX__) return wxT("unix"); #else return wxT("undefined"); #endif } //----------------------------------------------------------------------------- static void processPlatformAttribute(wxXmlNode *node) { wxString s; bool isok; wxXmlNode *c = node->GetChildren(); while (c) { isok = false; #if wxCHECK_VERSION(2, 9, 0) if (!c->GetAttribute(wxT("platform"), &s)) #else if (!c->GetPropVal(wxT("platform"), &s)) #endif isok = true; else { wxStringTokenizer tkn(s, wxT(" |")); while (!isok && tkn.HasMoreTokens()) { if (tkn.GetNextToken().compare(getPlatformName()) == 0) isok = true; } } if (isok) { processPlatformAttribute(c); c = c->GetNext(); } else { wxXmlNode *c2 = c->GetNext(); node->RemoveChild(c); delete c; c = c2; } } } //----------------------------------------------------------------------------- // Optionbook class class Optionbook: public wxBookCtrlBase { public: Optionbook() { Init(); } Optionbook(wxWindow *parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, const wxString& name = wxEmptyString) { Init(); (void)Create(parent, id, pos, size, style, name); } bool Create(wxWindow *parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, const wxString& name = wxEmptyString); virtual wxSize CalcSizeFromPage(const wxSize& sizePage) const { return sizePage; } virtual int GetSelection() const { return m_selection; } // this is sloppy, SetSelection should actually send a notification event, // while ChangeSelection() should not... virtual int SetSelection(size_t n); virtual int ChangeSelection(size_t n) { return SetSelection(n); } virtual wxString GetPageText(size_t n) const; virtual bool SetPageText(size_t n, const wxString& strText); virtual int GetPageImage(size_t /*n*/) const { return -1; } virtual bool SetPageImage(size_t /*n*/, int /*imageId*/) { return false; } virtual bool InsertPage(size_t n, wxWindow *page, const wxString& text, bool bSelect = false, int imageId = -1); void OnSetFocus(wxFocusEvent& event); void OnSize(wxSizeEvent& event); protected: virtual wxWindow *DoRemovePage(size_t page); wxRect GetPageRect() const { return GetClientRect(); } wxArrayString pageTextsM; int m_selection; private: void Init(); DECLARE_EVENT_TABLE() }; //----------------------------------------------------------------------------- bool Optionbook::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name) { style &= ~wxBORDER_MASK; style |= wxBORDER_NONE | wxBK_LEFT; return wxControl::Create(parent, id, pos, size, style, wxDefaultValidator, name); } //----------------------------------------------------------------------------- wxWindow* Optionbook::DoRemovePage(size_t page) { const int page_count = GetPageCount(); wxWindow *win = wxBookCtrlBase::DoRemovePage(page); pageTextsM.RemoveAt(page); if (win && m_selection >= (int)page) { // force new sel valid if possible int sel = m_selection - 1; if (page_count == 1) sel = wxNOT_FOUND; else if ((page_count == 2) || (sel == -1)) sel = 0; // force sel invalid if deleting current page - don't try to hide it m_selection = (m_selection == (int)page) ? wxNOT_FOUND : m_selection - 1; if (sel != wxNOT_FOUND && sel != m_selection) SetSelection(sel); } return win; } //----------------------------------------------------------------------------- wxString Optionbook::GetPageText(size_t n) const { if (n < GetPageCount()) return pageTextsM[n]; else return wxEmptyString; } //----------------------------------------------------------------------------- void Optionbook::Init() { m_selection = wxNOT_FOUND; } //----------------------------------------------------------------------------- bool Optionbook::InsertPage(size_t n, wxWindow *page, const wxString& text, bool bSelect, int imageId) { if (!wxBookCtrlBase::InsertPage(n, page, text, bSelect, imageId)) return false; pageTextsM.Insert(text, n); // if the inserted page is before the selected one, we must update the // index of the selected page if (int(n) <= m_selection) { // one extra page added m_selection++; } // some page should be selected: either this one or the first one if there // is still no selection int selNew = wxNOT_FOUND; if (bSelect) selNew = n; else if (m_selection == wxNOT_FOUND) selNew = 0; if (selNew != m_selection) page->Hide(); if (selNew != wxNOT_FOUND) SetSelection(selNew); InvalidateBestSize(); return true; } //----------------------------------------------------------------------------- bool Optionbook::SetPageText(size_t n, const wxString& strText) { wxCHECK((n >= pageTextsM.GetCount()), false); pageTextsM[n] = strText; return true; } //----------------------------------------------------------------------------- int Optionbook::SetSelection(size_t n) { wxCHECK((n < GetPageCount()), wxNOT_FOUND); const int oldSel = m_selection; if (int(n) != m_selection) { if (m_selection != wxNOT_FOUND) m_pages[m_selection]->Hide(); wxWindow *page = m_pages[n]; page->SetSize(GetPageRect()); page->Show(); m_selection = n; } return oldSel; } //----------------------------------------------------------------------------- BEGIN_EVENT_TABLE(Optionbook, wxBookCtrlBase) EVT_SET_FOCUS(Optionbook::OnSetFocus) EVT_SIZE(Optionbook::OnSize) END_EVENT_TABLE() //----------------------------------------------------------------------------- void Optionbook::OnSetFocus(wxFocusEvent& event) { if (m_selection != wxNOT_FOUND) { wxWindow *page = m_pages[m_selection]; if (page) page->SetFocus(); } event.Skip(); } //----------------------------------------------------------------------------- void Optionbook::OnSize(wxSizeEvent& event) { if (m_selection != wxNOT_FOUND) { wxWindow *page = m_pages[m_selection]; if (page) page->SetSize(GetPageRect()); } event.Skip(); } //----------------------------------------------------------------------------- // PreferencesDialog class PreferencesDialog::PreferencesDialog(wxWindow* parent, const wxString& title, Config& targetConfig, const wxFileName& confDefFileName, const wxString& saveButtonCaption, const wxString& dialogName) : BaseDialog(parent, -1, title), targetConfigM(targetConfig), dialogNameM(dialogName) { initControls(saveButtonCaption); loadConfDefFile(confDefFileName); setControlLayout(); } //----------------------------------------------------------------------------- PreferencesDialog::PreferencesDialog(wxWindow* parent, const wxString& title, Config& targetConfig, const wxString& confDefData, const wxString& saveButtonCaption, const wxString& dialogName) : BaseDialog(parent, -1, title), targetConfigM(targetConfig), dialogNameM(dialogName) { initControls(saveButtonCaption); loadConfDef(confDefData); setControlLayout(); } //----------------------------------------------------------------------------- void PreferencesDialog::initControls(const wxString& saveButtonCaption) { // we don't want this dialog centered on parent since it is very big, and // some parents (ex. main frame) could even be smaller. // Don't use targetConfig here, the setting must go in the global instance. config().setValue(getStorageName() + Config::pathSeparator + wxT("centerDialogOnParent"), false); treectrl_1 = new wxTreeCtrl(getControlsPanel(), ID_treectrl_panes, wxDefaultPosition, wxDefaultSize, wxBORDER_THEME | wxTR_DEFAULT_STYLE | wxTR_HAS_BUTTONS | wxTR_HIDE_ROOT); panel_categ = new wxPanel(getControlsPanel(), wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_THEME); static_text_categ = new wxStaticText(panel_categ, wxID_ANY, wxT("Dummy min size text")); bookctrl_1 = new Optionbook(getControlsPanel(), ID_bookctrl_panes, wxDefaultPosition, wxDefaultSize); button_save = new wxButton(getControlsPanel(), wxID_SAVE, saveButtonCaption); button_cancel = new wxButton(getControlsPanel(), wxID_CANCEL, _("Cancel")); } //----------------------------------------------------------------------------- void PreferencesDialog::setControlLayout() { // order of these is important: first create all controls, then set // their properties (may affect min size), then create sizer layout setProperties(); layout(); bookctrl_1->SetFocus(); // do this last, otherwise default button style may be lost on MSW button_save->SetDefault(); } //----------------------------------------------------------------------------- PreferencesDialog::~PreferencesDialog() { std::list::iterator it; for (it = settingsM.begin(); it != settingsM.end(); ++it) delete (*it); } //----------------------------------------------------------------------------- bool PreferencesDialog::createControlsAndAddToSizer(wxPanel* page, wxSizer* sizerPage) { // get a list of all settings belonging to this page std::list pageSettings; std::list::iterator it; for (it = settingsM.begin(); it != settingsM.end(); it++) { if ((*it)->getPage() == page) pageSettings.push_back((*it)); } // create all controls on this page, creation order equals tab order for (it = pageSettings.begin(); pageSettings.end() != it; ++it) { if (!(*it)->createControl(!debugDescriptionM)) return false; } // align controls after all controls have been created std::vector groups; for (it = pageSettings.begin(); pageSettings.end() != it; ++it) { int group = (*it)->getControlAlignmentGroup(); if (group > 0 && std::find(groups.begin(), groups.end(), group) == groups.end()) { groups.push_back(group); // get maximum left coordinate of controls in this group std::list::iterator it2; int left = 0; for (it2 = it; pageSettings.end() != it2; ++it2) { if ((*it2)->getControlAlignmentGroup() == group) left = std::max(left, (*it2)->getControlLeft()); } // set maximum left coordinate of controls in this group for (it2 = it; pageSettings.end() != it2; ++it2) { if ((*it2)->getControlAlignmentGroup() == group) (*it2)->alignControl(left); } } } // add controls to sizer, ignore empty settings PrefDlgSetting* previous = 0; for (it = pageSettings.begin(); pageSettings.end() != it; ++it) { if ((*it)->addToSizer(sizerPage, previous)) previous = (*it); } return true; } //----------------------------------------------------------------------------- const wxString PreferencesDialog::getName() const { if (!dialogNameM.IsEmpty()) return dialogNameM; else return wxT("PreferencesDialog"); } //----------------------------------------------------------------------------- int PreferencesDialog::getSelectedPage() { return (bookctrl_1) ? bookctrl_1->GetSelection() : wxNOT_FOUND; } //----------------------------------------------------------------------------- bool PreferencesDialog::isOk() { return loadSuccessM; } //----------------------------------------------------------------------------- void PreferencesDialog::layout() { wxBoxSizer* sizerCateg = new wxBoxSizer(wxHORIZONTAL); sizerCateg->Add(static_text_categ, 1, wxEXPAND|wxALL|wxFIXED_MINSIZE, 5); panel_categ->SetAutoLayout(true); panel_categ->SetSizerAndFit(sizerCateg); wxBoxSizer* sizerRight = new wxBoxSizer(wxVERTICAL); sizerRight->Add(panel_categ, 0, wxEXPAND); sizerRight->Add(0, styleguide().getUnrelatedControlMargin(wxVERTICAL)); sizerRight->Add(bookctrl_1, 1, wxEXPAND); wxBoxSizer* sizerControls = new wxBoxSizer(wxHORIZONTAL); int bookProportion = 1; if (bookctrl_1->GetPageCount() > 1) { int treeProportion = 0; // for some reason the tree width isn't calculated correctly on the Mac // use proportional widths for tree and book controls there if (wxPlatformInfo::Get().GetOperatingSystemId() & wxOS_MAC) { treeProportion = 2; bookProportion = 5; } sizerControls->Add(treectrl_1, treeProportion, wxEXPAND); sizerControls->Add(styleguide().getUnrelatedControlMargin(wxHORIZONTAL), 0); } sizerControls->Add(sizerRight, bookProportion, wxEXPAND); // create sizer for buttons -> styleguide class will align it correctly wxSizer* sizerButtons = styleguide().createButtonSizer(button_save, button_cancel); // use method in base class to set everything up layoutSizers(sizerControls, sizerButtons, true); } //----------------------------------------------------------------------------- void PreferencesDialog::loadConfDefFile(const wxFileName& filename) { loadSuccessM = false; if (!filename.FileExists()) { wxString msg; msg.Printf(_("The support file:\n%s\ndoes not exist!\n\nThis means there is a problem with your installation of FlameRobin."), filename.GetFullPath().c_str()); wxMessageBox(msg, _("Support file not found"), wxOK | wxICON_ERROR); return; } loadConfDef(loadEntireFile(filename)); } //----------------------------------------------------------------------------- void PreferencesDialog::loadConfDef(const wxString& confDefData) { wxStringInputStream stream(confDefData); wxXmlDocument doc; if (!doc.Load(stream)) return; wxXmlNode* xmlr = doc.GetRoot(); if (xmlr->GetName() != wxT("root")) { wxLogError(_("Invalid root node in confdef.")); return; } processPlatformAttribute(xmlr); debugDescriptionM = hasParamNode(xmlr, wxT("debug")); wxTreeItemId root = treectrl_1->AddRoot(wxEmptyString); for (wxXmlNode* xmln = doc.GetRoot()->GetChildren(); (xmln); xmln = xmln->GetNext()) { if (xmln->GetType() == wxXML_ELEMENT_NODE && xmln->GetName() == wxT("node")) { if (!parseDescriptionNode(root, xmln)) return; } } loadSuccessM = true; } //----------------------------------------------------------------------------- bool PreferencesDialog::loadFromTargetConfig() { std::list::iterator it; for (it = settingsM.begin(); it != settingsM.end(); it++) { if (!(*it)->loadFromTargetConfig(targetConfigM)) return false; } return true; } //----------------------------------------------------------------------------- bool PreferencesDialog::parseDescriptionNode(wxTreeItemId parent, wxXmlNode* xmln) { // ignore empty nodes if (!xmln->GetChildren()) return true; wxTreeItemId item = treectrl_1->AppendItem(parent, wxEmptyString, -1, -1); wxPanel* page = new wxPanel(bookctrl_1); wxString caption; wxString description; // parse subnodes and settings (recursively) for (xmln = xmln->GetChildren(); (xmln); xmln = xmln->GetNext()) { if (xmln->GetType() != wxXML_ELEMENT_NODE) continue; if (xmln->GetName() == wxT("caption")) caption = getNodeContent(xmln, wxEmptyString); else if (xmln->GetName() == wxT("description")) description = getNodeContent(xmln, wxEmptyString); else if (xmln->GetName() == wxT("image")) { wxString value(getNodeContent(xmln, wxEmptyString)); long l; if (!value.IsEmpty() && value.ToLong(&l)) treectrl_1->SetItemImage(item, l); } else if (xmln->GetName() == wxT("node")) { if (!parseDescriptionNode(item, xmln)) return false; } else if (xmln->GetName() == wxT("setting")) { if (!parseDescriptionSetting(page, xmln, 0)) return false; } } if (!caption.IsEmpty()) { treectrl_1->SetItemText(item, caption); if (description.IsEmpty()) description = caption; } treectrl_1->ExpandAllChildren(item); // add all settings controls of this page to a sizer wxBoxSizer* sizerPage = new wxBoxSizer(wxVERTICAL); bool controlsok = createControlsAndAddToSizer(page, sizerPage); page->SetSizerAndFit(sizerPage); // add this page to the bookctrl, and use the tree item index // in treeItemsM to select the page (see OnTreeSelChanged() ) bookctrl_1->AddPage(page, description); treeItemsM.Add(item); return controlsok; } //----------------------------------------------------------------------------- bool PreferencesDialog::parseDescriptionSetting(wxPanel* page, wxXmlNode* xmln, PrefDlgSetting* enabledby) { #if wxCHECK_VERSION(2, 9, 0) wxString type(xmln->GetAttribute(wxT("type"), wxEmptyString)); wxString style(xmln->GetAttribute(wxT("style"), wxEmptyString)); #else wxString type(xmln->GetPropVal(wxT("type"), wxEmptyString)); wxString style(xmln->GetPropVal(wxT("style"), wxEmptyString)); #endif PrefDlgSetting* setting = PrefDlgSetting::createPrefDlgSetting(page, type, style, enabledby); // ignore unknown settings unless debug mode is active if (setting == 0) { if (!debugDescriptionM) return true; wxLogError(_("Unknown config setting \"%s\" in description"), type.c_str()); return false; } settingsM.push_back(setting); for (xmln = xmln->GetChildren(); (xmln); xmln = xmln->GetNext()) { if (xmln->GetType() != wxXML_ELEMENT_NODE) continue; if (xmln->GetName() == wxT("enables")) { for (wxXmlNode* xmlc = xmln->GetChildren(); (xmlc); xmlc = xmlc->GetNext()) { if (xmlc->GetType() == wxXML_ELEMENT_NODE && xmlc->GetName() == wxT("setting")) { if (!parseDescriptionSetting(page, xmlc, setting)) return false; } } } else { if (!setting->parseProperty(xmln)) return false; } } return true; } //----------------------------------------------------------------------------- bool PreferencesDialog::saveToTargetConfig() { // Avoid flushing the config object at each write. SubjectLocker locker(&targetConfigM); std::list::iterator it; for (it = settingsM.begin(); it != settingsM.end(); it++) { if (!(*it)->saveToTargetConfig(targetConfigM)) return false; } return true; } //----------------------------------------------------------------------------- void PreferencesDialog::selectPage(int index) { if (bookctrl_1 && index >= 0 && index < (int)treeItemsM.GetCount()) { treectrl_1->SelectItem(treeItemsM[index]); bookctrl_1->SetSelection(index); bookctrl_1->SetFocus(); } } //----------------------------------------------------------------------------- void PreferencesDialog::setProperties() { // setup image list for tree control wxSize sz(16, 16); imageListM.Create(sz.GetWidth(), sz.GetHeight()); imageListM.Add(wxArtProvider::GetIcon(ART_Column, wxART_OTHER, sz)); imageListM.Add(wxArtProvider::GetIcon(ART_Procedure, wxART_OTHER, sz)); imageListM.Add(wxArtProvider::GetIcon(ART_Trigger, wxART_OTHER, sz)); imageListM.Add(wxArtProvider::GetIcon(ART_Object, wxART_OTHER, sz)); imageListM.Add(wxArtProvider::GetIcon(ART_Table, wxART_OTHER, sz)); imageListM.Add(wxArtProvider::GetIcon(ART_Domain, wxART_OTHER, sz)); treectrl_1->SetImageList(&imageListM); treectrl_1->SetQuickBestSize(false); // show category description in colors for highlighted text panel_categ->SetBackgroundColour( wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT)); static_text_categ->SetForegroundColour( wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT)); wxFont font(static_text_categ->GetFont()); font.SetPointSize(15); font.SetWeight(wxBOLD); static_text_categ->SetFont(font); } //----------------------------------------------------------------------------- BEGIN_EVENT_TABLE(PreferencesDialog, wxDialog) EVT_BUTTON(wxID_SAVE, PreferencesDialog::OnSaveButtonClick) EVT_TREE_SEL_CHANGED(PreferencesDialog::ID_treectrl_panes, PreferencesDialog::OnTreeSelChanged) END_EVENT_TABLE() //----------------------------------------------------------------------------- void PreferencesDialog::OnSaveButtonClick(wxCommandEvent& WXUNUSED(event)) { wxBusyCursor wait; if (saveToTargetConfig()) EndModal(wxID_OK); } //----------------------------------------------------------------------------- void PreferencesDialog::OnTreeSelChanged(wxTreeEvent& event) { wxTreeItemId item = event.GetItem(); // search page for selected tree item, select it, and update description for (size_t i = 0; i < treeItemsM.GetCount(); i++) { if (treeItemsM[i] == item) { bookctrl_1->SetSelection(i); static_text_categ->SetLabel(bookctrl_1->GetPageText(i)); break; } } } //----------------------------------------------------------------------------- bool PreferencesDialog::Show(bool show) { bool r = BaseDialog::Show(show); if (show && bookctrl_1->GetPageCount() <= 1) treectrl_1->Hide(); if (bookctrl_1->GetPageCount()) static_text_categ->SetLabel(bookctrl_1->GetPageText(0)); return r; } //----------------------------------------------------------------------------- class PreferencesDialogTemplateCmdHandler: public TemplateCmdHandler { private: static const PreferencesDialogTemplateCmdHandler handlerInstance; // singleton; registers itself on creation. public: PreferencesDialogTemplateCmdHandler() {}; virtual void handleTemplateCmd(TemplateProcessor *tp, const wxString& cmdName, const TemplateCmdParams& cmdParams, ProcessableObject* object, wxString& processedText); }; //----------------------------------------------------------------------------- const PreferencesDialogTemplateCmdHandler PreferencesDialogTemplateCmdHandler::handlerInstance; //----------------------------------------------------------------------------- void PreferencesDialogTemplateCmdHandler::handleTemplateCmd(TemplateProcessor *tp, const wxString& cmdName, const TemplateCmdParams& /*cmdParams*/, ProcessableObject* object, wxString& /*processedText*/) { // {%edit_conf%} shows a gui to set config params based on