sailcut-1.3.5/0000755000175000007640000000000011457411327013111 5ustar sharkyjerrywebsailcut-1.3.5/sailcut.nsi.in0000644000175000007640000000534111100121003015646 0ustar sharkyjerryweb;Sailcut CAD Installer !define PRODUCT_NAME "Sailcut CAD" !define PRODUCT_VERSION "@VERSION@" !define PRODUCT_DIR_REGKEY "Software\${PRODUCT_NAME}" Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" OutFile "..\sailcut-${PRODUCT_VERSION}-win32.exe" SetCompressor lzma InstallDir "$PROGRAMFILES\${PRODUCT_NAME}" InstallDirRegKey HKCU "${PRODUCT_DIR_REGKEY}" "" !include "MUI.nsh" !define MUI_ABORTWARNING !insertmacro MUI_PAGE_LICENSE "COPYING" !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !define MUI_FINISHPAGE_RUN "$INSTDIR\sailcut.exe" !define MUI_FINISHPAGE_LINK "Visit the Sailcut CAD website" !define MUI_FINISHPAGE_LINK_LOCATION "http://sailcut.sourceforge.net/" !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_LANGUAGE "English" Section "Sailcut CAD" SecSailcut SectionIn RO SetOutPath "$INSTDIR" WriteRegStr HKCU "${PRODUCT_DIR_REGKEY}" "" $INSTDIR File sailcut.exe File *.dll File ChangeLog File COPYING File README File /r data File /r icons WriteUninstaller "$INSTDIR\uninstall.exe" SectionEnd Section "Documentation" SecHandbook File /r doc SectionEnd Section "Start Menu Shortcuts" SecShortcut CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}" CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Sailcut CAD.lnk" "$INSTDIR\sailcut.exe" "" "$INSTDIR\icons\sailcut.ico" CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" "$INSTDIR\uninstall.exe" SectionEnd Section "Register File Types" SecFileType WriteRegStr HKCR "SailcutCAD.SailDef" "" "Sailcut CAD Sail definition" WriteRegStr HKCR "SailcutCAD.SailDef\shell\open\command" "" '"$INSTDIR\sailcut.exe" "%1"' WriteRegStr HKCR "SailcutCAD.SailDef\DefaultIcon" "" "$INSTDIR\icons\sailcut-file.ico" WriteRegStr HKCR ".saildef" "" "SailcutCAD.SailDef" SectionEnd !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SecSailcut} "Installs Sailcut CAD." !insertmacro MUI_DESCRIPTION_TEXT ${SecHandbook} "Installs the Sailcut CAD HandBook." !insertmacro MUI_DESCRIPTION_TEXT ${SecShortcut} "Adds icons to your start menu for easy access." !insertmacro MUI_DESCRIPTION_TEXT ${SecFileType} "Register Sailcut CAD file types." !insertmacro MUI_FUNCTION_DESCRIPTION_END Section "Uninstall" DeleteRegKey HKCR "SailcutCAD.SailDef" DeleteRegKey HKCR ".saildef" DeleteRegKey HKCU "${PRODUCT_DIR_REGKEY}" RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}" Delete "$INSTDIR\sailcut.exe" Delete "$INSTDIR\*.dll" Delete "$INSTDIR\ChangeLog" Delete "$INSTDIR\COPYING" Delete "$INSTDIR\README" RMDir /r "$INSTDIR\data" RMDir /r "$INSTDIR\icons" RMDir /r "$INSTDIR\doc" Delete "$INSTDIR\uninstall.exe" RMDir "$INSTDIR" SectionEnd sailcut-1.3.5/.addcopyright0000644000175000007640000000154111177775720015605 0ustar sharkyjerryweb{ 'directories': [ 'src', 'src/geocpp', 'src/sailcpp', ], 'license': """Copyright (C) 1993-2009 Robert & Jeremy Laine See AUTHORS file for a full list of contributors. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA """, } sailcut-1.3.5/cmake/0000755000175000007640000000000011457411327014171 5ustar sharkyjerrywebsailcut-1.3.5/cmake/Bundle.plist.in0000644000175000007640000000142311161735522017062 0ustar sharkyjerryweb CFBundleInfoDictionaryVersion 6.0 CFBundleExecutable @CPACK_BUNDLE_NAME@ CFBundleIdentifier @CPACK_BUNDLE_IDENTIFIER@ CFBundleName @CPACK_BUNDLE_NAME@ CFBundlePackageType APPL CFBundleShortVersionString @CPACK_PACKAGE_VERSION@ CFBundleSignature ???? CFBundleVersion @CPACK_PACKAGE_VERSION@ CFBundleIconFile sailcut.icns sailcut-1.3.5/cmake/modules/0000755000175000007640000000000011457411327015641 5ustar sharkyjerrywebsailcut-1.3.5/cmake/modules/ShipDepends.cmake0000644000175000007640000000131511200264735021044 0ustar sharkyjerryweboption(SHIP_DEPENDS_ENABLED "Whether to include dependencies in release packages") find_package(PythonInterp) set(SHIP_DEPENDS_FILE ${CMAKE_BINARY_DIR}/shipdepends.cmake) set(SHIP_DEPENDS_SCRIPT ${CMAKE_SOURCE_DIR}/cmake/scripts/shipdepends.py) # SHIP_DEPENDS(TARGETS) macro(ship_depends) if(SHIP_DEPENDS_ENABLED) foreach(_this_target ${ARGN}) get_target_property(_this_file ${_this_target} LOCATION) add_custom_command(TARGET ${_this_target} POST_BUILD COMMAND ${PYTHON_EXECUTABLE} ${SHIP_DEPENDS_SCRIPT} -c ${SHIP_DEPENDS_FILE} -x ${CMAKE_BINARY_DIR} ${_this_file} DEPENDS ${_this_target}) endforeach() endif(SHIP_DEPENDS_ENABLED) endmacro(ship_depends) include(${SHIP_DEPENDS_FILE} OPTIONAL) sailcut-1.3.5/cmake/modules/IconUtilities.cmake0000644000175000007640000000545411161761576021445 0ustar sharkyjerryweb# Macros for generating various icons from SVG. find_program(ICOTOOL icotool) find_program(INKSCAPE inkscape) find_program(PNGTOPNM pngtopnm) find_program(PPMTOXPM ppmtoxpm) find_program(PNG2ICNS png2icns) macro(generate_name OUTPUT INPUT EXT) get_filename_component(_svg_name ${INPUT} NAME_WE) get_filename_component(_svg_path ${INPUT} PATH) set(${OUTPUT} ${_svg_path}${_svg_name}.${EXT}) endmacro(generate_name) # GENERATE_ICNS(OUTPUT SVGS..) # # Generate MacOS/X .icns icons from SVG files. # macro(generate_icns OUTPUT) set(${OUTPUT}) foreach(_this_svg ${ARGN}) generate_name(_this_icns ${_this_svg} icns) set(_this_png ${_this_icns}.tmp.png) add_custom_command(OUTPUT ${_this_icns} DEPENDS ${_this_svg} COMMAND ${INKSCAPE} -z --file=${CMAKE_CURRENT_SOURCE_DIR}/${_this_svg} --export-png=${_this_png} --export-width=128 --export-height=128 COMMAND ${PNG2ICNS} ${_this_icns} ${_this_png} COMMAND rm -f ${_this_png}) list(APPEND ${OUTPUT} ${_this_icns}) endforeach() endmacro(generate_icns) # GENERATE_ICO(OUTPUT SVGS..) # # Generate Windows .ico icons from SVG files. # macro(generate_ico OUTPUT) set(${OUTPUT}) foreach(_this_svg ${ARGN}) generate_name(_this_ico ${_this_svg} ico) add_custom_command(OUTPUT ${_this_ico} DEPENDS ${_this_svg} COMMAND ${INKSCAPE} -z --file=${CMAKE_CURRENT_SOURCE_DIR}/${_this_svg} --export-png=${_this_ico}.48 --export-width=48 --export-height=48 COMMAND ${INKSCAPE} -z --file=${CMAKE_CURRENT_SOURCE_DIR}/${_this_svg} --export-png=${_this_ico}.32 --export-width=32 --export-height=32 COMMAND ${INKSCAPE} -z --file=${CMAKE_CURRENT_SOURCE_DIR}/${_this_svg} --export-png=${_this_ico}.16 --export-width=16 --export-height=16 COMMAND ${ICOTOOL} -c -o ${_this_ico} ${_this_ico}.48 ${_this_ico}.32 ${_this_ico}.16 COMMAND rm -f ${_this_ico}.48 ${_this_ico}.32 ${_this_ico}.16) list(APPEND ${OUTPUT} ${_this_ico}) endforeach() endmacro(generate_ico) # GENERATE_XPM(OUTPUT SVGS..) # # Generate XPM icons from SVG files. # macro(generate_xpm OUTPUT) set(${OUTPUT}) foreach(_this_svg ${ARGN}) generate_name(_this_xpm ${_this_svg} xpm) get_filename_component(_this_xpm_title ${_this_svg} NAME_WE) string(REPLACE "-" "_" _this_xpm_title ${_this_xpm_title}) set(_this_alpha ${_this_xpm}.tmp.alpha) set(_this_png ${_this_xpm}.tmp.png) add_custom_command(OUTPUT ${_this_xpm} DEPENDS ${_this_svg} COMMAND ${INKSCAPE} -z --file=${CMAKE_CURRENT_SOURCE_DIR}/${_this_svg} --export-png=${_this_png} --export-width=32 --export-height=32 COMMAND ${PNGTOPNM} -alpha ${_this_png} > ${_this_alpha} COMMAND ${PNGTOPNM} ${_this_png} | ${PPMTOXPM} -alpha ${_this_alpha} -name ${_this_xpm_title}_xpm | sed -e 's/static char/static const char/g' > ${_this_xpm} COMMAND rm -f ${_this_alpha} ${_this_png}) list(APPEND ${OUTPUT} ${_this_xpm}) endforeach() endmacro(generate_xpm) sailcut-1.3.5/cmake/modules/RelativePath.cmake0000644000175000007640000000036311161652456021237 0ustar sharkyjerryweb# RELATIVE_PATH(OUTPUT BASE TARGET) # Calculate the path to TARGET relative to BASE. macro(relative_path OUTPUT BASE TARGET) string(REGEX REPLACE "[^/]+" ".." _temp ${BASE}) set(${OUTPUT} "${_temp}/${TARGET}") endmacro(relative_path) sailcut-1.3.5/cmake/modules/SailcutDocs.cmake0000644000175000007640000000217111161652456021063 0ustar sharkyjerryweb# Macros for generating Sailcut CAD's documentation find_program(FIG2DEV fig2dev) find_program(XSLTPROC xsltproc) # TRANSFORM_DOCBOOK(OUTPUT STYLESHEET DOCBOOK) macro(transform_docbook OUTPUT STYLESHEET INPUT) get_filename_component(_docbook_name ${INPUT} NAME_WE) get_filename_component(_docbook_path ${INPUT} PATH) set(${OUTPUT} ${CMAKE_CURRENT_BINARY_DIR}/${_docbook_path}/${_docbook_name}.html) add_custom_command(OUTPUT ${${OUTPUT}} COMMAND ${XSLTPROC} -o ${${OUTPUT}} ${CMAKE_CURRENT_SOURCE_DIR}/${STYLESHEET} ${CMAKE_CURRENT_SOURCE_DIR}/${INPUT} DEPENDS ${STYLESHEET} ${INPUT}) endmacro(transform_docbook) # TRANSFORM_FIGS(OUTPUT FIG..) macro(transform_figs OUTPUT) set(${OUTPUT}) foreach(_this_fig ${ARGN}) get_filename_component(_fig_name ${_this_fig} NAME_WE) get_filename_component(_fig_path ${_this_fig} PATH) set(_this_png ${CMAKE_CURRENT_BINARY_DIR}/${_fig_path}/${_fig_name}.png) add_custom_command(OUTPUT ${_this_png} COMMAND ${FIG2DEV} -L png -S2 ${CMAKE_CURRENT_SOURCE_DIR}/${_this_fig} ${_this_png} DEPENDS ${_this_fig}) list(APPEND ${OUTPUT} ${_this_png}) endforeach() endmacro(transform_figs) sailcut-1.3.5/cmake/sailcut.rc.in0000644000175000007640000000141011161663155016564 0ustar sharkyjerryweb#include VS_VERSION_INFO VERSIONINFO FILEVERSION ${SAILCUT_VERSION_WIN32} PRODUCTVERSION ${SAILCUT_VERSION_WIN32} FILEFLAGSMASK 0x3fL FILEFLAGS 0x0L FILEOS 0x4L FILETYPE 0x1L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904B0" BEGIN VALUE "FileDescription", "Sailcut CAD ${SAILCUT_VERSION}\0" VALUE "FileVersion", "${SAILCUT_VERSION_WIN32}\0" VALUE "LegalCopyright", "Copyright 1993-2009 Robert & Jeremy Laine\0" VALUE "ProductName", "Sailcut CAD\0" VALUE "ProductVersion", "${SAILCUT_VERSION_WIN32}\0" END END END IDR_MAINFRAME ICON "${CMAKE_SOURCE_DIR}/icons/sailcut.ico" sailcut-1.3.5/cmake/Bundle.start.in0000644000175000007640000000033011200327127017050 0ustar sharkyjerryweb#!/bin/sh BUNDLE="`echo "$0" | sed -e 's/\/Contents\/MacOS\/.*//'`" RESOURCES="$BUNDLE/Contents/Resources" export DYLD_LIBRARY_PATH=$RESOURCES/@SAILCUT_LIBRARY_DIR@ exec "$RESOURCES/@SAILCUT_RUNTIME_DIR@/sailcut" sailcut-1.3.5/cmake/scripts/0000755000175000007640000000000011457411327015660 5ustar sharkyjerrywebsailcut-1.3.5/cmake/scripts/shipdepends.py0000644000175000007640000000770611200264735020545 0ustar sharkyjerrywebimport getopt import os import re import shutil def copy_lib(base, lib, dest): sourcefile = os.path.join(base, lib) destfile = os.path.join(dest, lib) destdir = os.path.dirname(destfile) if os.path.exists(destfile): return False if not os.path.exists(sourcefile): raise Exception("Could not find %s" % sourcefile) if not os.path.exists(destdir): os.makedirs(destdir) sys.stderr.write(" copying %s\n" % lib) shutil.copy(sourcefile, destfile) if os.path.islink(sourcefile): target = os.readlink(sourcefile) if target.count("/"): raise Exception("Could not handle link to %s" % target) copy_lib(base, target, dest) return True def get_type(bin): # cheap tests if re.match(".*\.(exe|dll)", bin): return "pe32" elif re.match(".*\.dylib", bin): return "mach-o" # magic numbers magic = file(bin, "rb").read(4) if magic == '\x7fELF': return "elf" elif magic == '\xce\xfa\xed\xfe': return "mach-o" return None def get_elf_depends(bin): out = os.popen("objdump -p %s" % bin).read() for line in out.splitlines(): m = re.match('^\s+NEEDED\s+(.*)', line) if m: name = m.group(1) yield name def get_mach_o_depends(bin): out = os.popen("otool -l %s" % bin).read() for line in out.splitlines(): m = re.match('^\s+name (.*) \(', line) if m: name = m.group(1) if not name.startswith("/usr/lib/") and not name.startswith("/System/Library/"): yield name def get_pe32_depends(bin): out = os.popen("i586-mingw32msvc-objdump -p %s" % bin).read() for line in out.splitlines(): m = re.match('^\s+DLL Name: (.*)', line) if m: name = m.group(1) if re.match(".*\.dll", name) and not re.match("(msvcrt|.*32)\.dll", name): yield name def get_depends(bin, exclude, externals=[]): if not os.path.exists(bin): raise Exception("Could not find %s" % bin) type = get_type(bin) if type == "elf": for name in get_elf_depends(bin): lib = name externals.append(lib) elif type == "mach-o": for name in get_mach_o_depends(bin): if exclude and name.startswith(exclude): continue lib = name if not os.path.exists(lib): lib = os.path.join("/Library/Frameworks", name) if not os.path.exists(lib): continue if not externals.count(lib): externals.append(lib) if os.path.islink(lib): lib = os.path.join(os.path.dirname(lib), os.readlink(lib)) externals.append(lib) get_depends(lib, exclude, externals) if type == "pe32": for name in get_pe32_depends(bin): lib = os.path.join("/usr/i586-mingw32msvc/bin", name) if not os.path.exists(lib): continue if not externals.count(lib): externals.append(lib) get_depends(lib, exclude, externals) return externals def fix_depends(bin, cmakefile=None, exclude=None): if not os.path.exists(bin): raise Exception("Could not find %s" % bin) # get binary type type = get_type(bin) if not type: raise Exception("Unknown binary type %s" % bin) # figure out destination if type == "pe32": destination = 'bin' else: destination = 'lib' sys.stderr.write("Processing %s (%s)\n" % (bin, type)) if cmakefile: lines = [] if os.path.exists(cmakefile): lines = file(cmakefile).readlines() for shipped in get_depends(bin, exclude): line = "install(FILES %s DESTINATION %s)\n" % (shipped, destination) if not lines.count(line): lines.append(line) file(cmakefile, "w").write("".join(sorted(lines))) if type == "mach-o": for name in get_mach_o_depends(bin): if name.count("/") and (not exclude or not name.startswith(exclude)): sys.stderr.write(" making %s relative\n" % name) os.system("install_name_tool -change %s %s %s" % (name, os.path.basename(name), bin)) if __name__ == "__main__": import sys opts, args = getopt.getopt(sys.argv[1:], "c:x:") config = {} for k, v in opts: if k == "-c": config['cmakefile'] = v elif k == "-x": config['exclude'] = v if len(args) < 1: sys.stderr.write("Usage: shipdepends.py [options] \n") sys.exit(1) for bin in args: fix_depends(bin, **config) sailcut-1.3.5/ChangeLog0000644000175000007640000001711111454124177014665 0ustar sharkyjerrywebSailcut CAD 1.3.5 * improved - mitre cut2 panels near mitre to luff interrsection * improved - relaxed constraint on jib luff to 20% round to accommodate code zero * improved - relaxed constraint maximum number of radial gores to 12 in radial cut * improved - integration of manual in various operating systems Sailcut CAD 1.3.4 * improved - make it possible to specify a scale when printing drawings * improved - switch to CMake, makes native Windows builds possible Sailcut CAD 1.3.3 * added - saving sail in 3d DXF one panel per file, option DXF(split) * added - saving developed sail in 2d DXF one panel per file, option DXF(split) * added - print preview dialog for previewing text or drawing output * improved - make it possible to select which pages to print * added - Mitre2 layout with panels parallel to leech and foot (contribution from Peter Meuse) * added - foot hem width is now distinct from other hems width * added - make it possible to export to one panel per DXF file * fixed - crash in rare case of perfectly straight luff or leech (indetermined intersection of lower and upper segments) * fixed - crash in case SVG is not present on Linux system * fixed - offset of boat components can now be positive or negative value Sailcut CAD 1.3.2 * added - export sail to SVG vector graphics format * improved - doubled the width of seams between horizontal sections in radial layout * improved - Dutch translation by Stephan Paternote * improved - increased range for mould depth and shaping coefficients * improved - key points printing format * fixed - undersized printing on Windows by using Qt 4.3.4 Sailcut CAD 1.3.1 * fixed - fix a crash on startup (seen on Linux 64-bit) * fixed - save all the type of boat elements (fixes display of saved boats) * improved - manual in French * improved - manual in English * improved - use 3 colors grading for sail panels * improved - use red color for rig and blue color for hull * added - file save and open for rig and hull Sailcut CAD 1.3.0 * added - mast definition : fully operational * added - hull definition : preliminary version not fully operational * improved - redesign user interface as a multiple document interface * improved - add shaded view to the boat viewer * improved - code readability is sailworker * fixed - bug in leech length condition resulting in a crash * fixed - bug in initialisation of shaded view (should fix empty view) * fixed - bug in rounding of profile data * fixed - compilation on MacOS/X with Qt 4.3 (added -framework Cocoa) * fixed - icon for MacOS/X Sailcut CAD 1.2.4 * fixed - remove offset at tack and clew in radial cut * improved - add a stylesheet for the Sailcut CAD Handbook * improved - when possible, use default browser to view the Handbook * added - the Windows version of Sailcut CAD comes with an installer Sailcut CAD 1.2.3 * added - position of max depth, entry and exit angles in mould screen * improved - extend range of sails dimensions and round limits Sailcut CAD 1.2.2 * improved - better layout of coordinates in print developed panels * fixed - fix bug on Jib tack height Sailcut CAD 1.2.1 * improved - increased range of luff and leech shape factor * fixed - fix bug reported by Rob Harms and cleaned up add hems code * added - add a deck to the sail display * improved - make printing of sail drawing consistent with viewer * fixed - fix the display of the 'language' menu entries * fixed - vertical slider of mould inverted * added - add draft French and Spanish versions of the Handbook Sailcut CAD 1.2.0 * added - key points coordinates in printout of developed panels similar to Sailcut4 * added - a drawing describing the radial cut layout in handbook * added - a descrition of developed panel drawing in handbook * added - a description of TXT file formats in the Handbook * improved - switch to Qt version 4 * improved - better handling of non-ASCII characters * improved - use icon for Sailcut CAD window * fixed - correct "Open recent" characterset issue report by Miguel * fixed - correct bug with radial luff gore number Sailcut CAD 1.1.1 * fixed - correct VC++ project files in source distribution * improved - update Dutch translation (thanks Stephan) * improved - update Norwegian translation (thanks Rolf) * improved - update Danish translation (thanks Lasse) * improved - update Portuguese translation (thanks Miguel) * improved - update Russian translation (thanks Slava) * added - document compilation instructions for MacOS/X * added - icons for Sailcut CAD and its files (thanks Stephan) Sailcut CAD 1.1 * added - Russian translation (thanks Slava) * added - wing style of sail for kites (half a kite is displayed) * added - various sail width data displayed when pressing "Compute" button * improved - add support for per-language Handbook * improved - auto-redimension profile views in mould window * added - Danish translation (thanks Peo) Sailcut CAD 1.0 * added - printing of sail data sheet * added - print of developed sail * added - Portugese translation (thanks Miguel) * improved - updated translations Sailcut CAD 0.8.0 * improved - better checks on input data * added - radial cut code * added - calculation of sail area and of diagonal head-clew Sailcut CAD 0.7.0 * improved - use a tabbed view in the main window * added - wireframe view even when OpenGL is enabled * added - Carlson plotter export of developed panels * added - preliminary rig viewer * added - user preferences are stored to file * added - most recently used file list * improved - different file extension for each file type * added - labels for the sail panels * fixed - compiles with Qt 3.3 Sailcut CAD 0.6.1 * added checks on sail dimensions * improved sail mould equations for racing users * fixed compilation/linking problems reported by Torsten Eberhardt * fixed compilation issues on MacOS/X * added Norwegian translation (takk Stein) * added German translation (danke Heinz) * improved the Sailcut CAD Handbook with explanatory figures * added m4 routine to find lrelease and lupdate Sailcut CAD 0.6.0 * seam width is now operational * added facility for hem width around sail edges the leech hem width is twice the hem width on other sides * development screen shows the above material allowance * DXF of developed panel show draw line in blue and cut line in red * cross, twist, horizontal, vertical and mitre cut are all working * added Dutch translation (bedankt Stephan!) * added Italian translation (thanks to Massimo) Sailcut CAD 0.5.5 * big performance gains (4x for sail creation) * internationalisation support * added horizontal layout * added DXF export * added viewer for the Handbook Sailcut CAD 0.5.0 * updated admin/* (KDE build system) * added export of developped panels to file * added plaintext export of sails * added basic twist foot layout * finished mould view * fixed various GUI glitchs (overlapping widgets) * fixed some some GCC warnings * fixed some bugs in the gaff area Sailcut CAD 0.4.0 * added flat panel development * added doxygen comments to the code Sailcut CAD 0.3.10 * added twist to the surface of the sail * added zoom in/out buttons * added OpenGL shading Sailcut CAD 0.3.9 * added pan and zoom * added OpenGL rendering support * fixed "breaks" in the depth calculations * all panels now follow the curved sides of the sail Sailcut CAD 0.3.8 * depth calculation for the sail points * sail mould gets saved and read from file Sailcut CAD 0.3.6 * XML file input/output of sail definition * XML output of sail points * updated docs Sailcut CAD 0.3 * simple flat cross-cut layout -EOF- sailcut-1.3.5/AUTHORS0000644000175000007640000000157011454124177014165 0ustar sharkyjerryweb Authors of Sailcut (trademark) 2010 Jeremy LainУЉ * GeoCpp linear algebra library * Graphics and file I/O code Robert LainУЉ alias sailcuter * Original Sailcut software and owner of Sailcut name * Sail layout and profile algorithms and implementation Contributors: Stephan Paternotte * Dutch translation * Sailcut CAD icons Peter G. Meuse * Modification of Mitre layout code for laying panels parallel to leech and foot Massimo Cislaghi * Italian translation Stein Strandmoe * Norwegian translation Rolf Nilsen * Norvegian translation update Heinz Wartenburg * German translation Miguel Porfirio * Portuguese translation Cees van Duin * Dutch translation fix Lasse Skjalm * Danish translation Peo Grenholm * Swedish translation Vyacheslav Shvidky * Russian translation -EOF- sailcut-1.3.5/mingw32.toolchain0000644000175000007640000000147311200271614016273 0ustar sharkyjerryweb# specify system and cross compiler set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_C_COMPILER i586-mingw32msvc-gcc) set(CMAKE_CXX_COMPILER i586-mingw32msvc-g++) set(CMAKE_RC_COMPILER i586-mingw32msvc-windres) set(CMAKE_RC_COMPILE_OBJECT " --input-format rc --output-format coff -i -o ") # where is the target environment set(CMAKE_FIND_ROOT_PATH /usr/i586-mingw32msvc) # search for programs in the build host directories set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # for libraries and headers in the target directories set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # Qt 4 set(QT_HEADERS_DIR ${CMAKE_FIND_ROOT_PATH}/include/qt4) set(QT_LIBRARY_DIR ${CMAKE_FIND_ROOT_PATH}/lib) set(QT_PLUGINS_DIR ${CMAKE_FIND_ROOT_PATH}/lib/qt4) sailcut-1.3.5/Doxyfile0000644000175000007640000002007610741541617014625 0ustar sharkyjerryweb#--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = "Sailcut CAD" PROJECT_NUMBER = OUTPUT_DIRECTORY = apidocs CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO DETAILS_AT_TOP = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = NO EXTRACT_PRIVATE = NO EXTRACT_STATIC = NO EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = YES HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES SHOW_DIRECTORIES = YES FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = src FILE_PATTERNS = RECURSIVE = YES EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = YES INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = YES TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = YES TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = YES LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = YES HIDE_UNDOC_RELATIONS = YES HAVE_DOT = NO CLASS_GRAPH = YES COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES DOT_IMAGE_FORMAT = png DOT_PATH = DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 0 DOT_TRANSPARENT = NO DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO sailcut-1.3.5/CMakeLists.txt0000644000175000007640000000361211457404323015651 0ustar sharkyjerrywebcmake_minimum_required(VERSION 2.6) set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH}) include(RelativePath) include(SailcutDocs) include(ShipDepends) # project and version project(sailcut) set(SAILCUT_VERSION_MAJOR 1) set(SAILCUT_VERSION_MINOR 3) set(SAILCUT_VERSION_PATCH 5) set(SAILCUT_VERSION ${SAILCUT_VERSION_MAJOR}.${SAILCUT_VERSION_MINOR}.${SAILCUT_VERSION_PATCH}) # dependencies find_package(Qt4 REQUIRED) # configuration set(SAILCUT_RUNTIME_DIR bin CACHE STRING "Sailcut runtime directory.") set(SAILCUT_LIBRARY_DIR lib CACHE STRING "Sailcut library directory.") set(SAILCUT_DATA_DIR share/${PROJECT_NAME} CACHE STRING "Sailcut data directory.") set(SAILCUT_DOC_DIR share/doc/${PROJECT_NAME}/html CACHE STRING "Sailcut documentation directory.") # packaging set(CPACK_PACKAGE_CONTACT "info@sailcut.com") set(CPACK_PACKAGE_DESCRIPTION "Sailcut CAD is a sail design and plotting software") set(CPACK_PACKAGE_INSTALL_DIRECTORY "Sailcut CAD ${SAILCUT_VERSION}") set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "Sailcut CAD ${SAILCUT_VERSION}") set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/COPYING) set(CPACK_PACKAGE_EXECUTABLES "sailcut" "Sailcut CAD") set(CPACK_PACKAGE_VERSION_MAJOR ${SAILCUT_VERSION_MAJOR}) set(CPACK_PACKAGE_VERSION_MINOR ${SAILCUT_VERSION_MINOR}) set(CPACK_PACKAGE_VERSION_PATCH ${SAILCUT_VERSION_PATCH}) if(APPLE) set(CPACK_BUNDLE_NAME ${PROJECT_NAME}) set(CPACK_BUNDLE_ICON ${CMAKE_SOURCE_DIR}/icons/sailcut.icns) set(CPACK_BUNDLE_IDENTIFIER com.sailcut.Sailcut) set(CPACK_BUNDLE_PLIST ${CMAKE_BINARY_DIR}/Bundle.plist) set(CPACK_BUNDLE_STARTUP_COMMAND ${CMAKE_BINARY_DIR}/Bundle.start) endif(APPLE) include(CPack) configure_file(${CMAKE_SOURCE_DIR}/cmake/Bundle.plist.in ${CMAKE_BINARY_DIR}/Bundle.plist) configure_file(${CMAKE_SOURCE_DIR}/cmake/Bundle.start.in ${CMAKE_BINARY_DIR}/Bundle.start) add_subdirectory(doc) add_subdirectory(icons) add_subdirectory(src) sailcut-1.3.5/README0000644000175000007640000000146011454124177013773 0ustar sharkyjerrywebSailcut CAD - sail designer Copyright (C) 1993-October 2010 Robert & Jeremy LainУЉ See AUTHORS file for a full list of contributors. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -EOF- sailcut-1.3.5/refresh0000755000175000007640000000014411200217326014461 0ustar sharkyjerryweb#!/bin/sh set -e echo "Refreshing translations" lupdate src/*.cpp src/*.h src/*.ui -ts src/ts/*.ts sailcut-1.3.5/test-cases/0000755000175000007640000000000011457411327015164 5ustar sharkyjerrywebsailcut-1.3.5/test-cases/main2.saildef0000644000175000007640000000362111141411136017511 0ustar sharkyjerryweb sailcut-1.3.5/test-cases/testBugMitre2-100.saildef0000644000175000007640000000363211141411136021503 0ustar sharkyjerryweb sailcut-1.3.5/test-cases/rig1.3.3.rigdef0000644000175000007640000000173011141411136017477 0ustar sharkyjerryweb sailcut-1.3.5/test-cases/jib1.2.4.saildef0000644000175000007640000000354211141411136017634 0ustar sharkyjerryweb sailcut-1.3.5/test-cases/testBugMitre2-800.saildef0000644000175000007640000000361711141411136021515 0ustar sharkyjerryweb sailcut-1.3.5/test-cases/main1.3.3.saildef0000644000175000007640000000363011141411136020012 0ustar sharkyjerryweb sailcut-1.3.5/test-cases/hull1.3.3.hulldef0000644000175000007640000000151011141411136020041 0ustar sharkyjerryweb sailcut-1.3.5/test-cases/testBugMitre2.saildef0000644000175000007640000000363411141411136021207 0ustar sharkyjerryweb sailcut-1.3.5/test-cases/genoa1.2.4.saildef0000644000175000007640000000354411141411136020163 0ustar sharkyjerryweb sailcut-1.3.5/test-cases/main1.2.4.saildef0000644000175000007640000000356111141411136020015 0ustar sharkyjerryweb sailcut-1.3.5/TODO0000644000175000007640000000002211156674155013601 0ustar sharkyjerrywebMarch 2009 - EOF sailcut-1.3.5/doc/0000755000175000007640000000000011457411327013656 5ustar sharkyjerrywebsailcut-1.3.5/doc/en/0000755000175000007640000000000011457411327014260 5ustar sharkyjerrywebsailcut-1.3.5/doc/en/model-sailcut-en.sxw0000644000175000007640000013225511354200643020166 0ustar sharkyjerrywebPK[Њъ2сЅ19mimetypeapplication/vnd.sun.xml.writerPK[Њъ2ŸuЊn``-Pictures/100000000000018300000214DEE083DF.jpgџиџрJFIFPPџлC    $.' ",#(7),01444'9=82<.342џлC  2!!22222222222222222222222222222222222222222222222222џРƒ"џФ џФЕ}!1AQa"q2‘Ё#BБСRб№$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™šЂЃЄЅІЇЈЉЊВГДЕЖЗИЙКТУФХЦЧШЩЪвгдежзийкстуфхцчшщъёђѓєѕіїјљњџФ џФЕw!1AQaq"2B‘ЁБС #3R№brб $4с%ё&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™šЂЃЄЅІЇЈЉЊВГДЕЖЗИЙКТУФХЦЧШЩЪвгдежзийктуфхцчшщъђѓєѕіїјљњџк ?їњ(Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€)ък”:6}Њ\,•М—,`*ŠX’p=EaјoФїњєЖR>ХДЫлI. ПАН’с2Œ‹БУCж;л‚sћЖ меЄО‡FО—K†9ѕЗ‘­bс^PЇbžGА:ЈЏ+ТКнОН&­сяџbУsЅ\GЊщ3[=•фТ,C$nsѓœ"0T…˜0q­јВЯўyѕФѓМе‚›ћбіO3!™§э›ˆžЊцŸЉjRјЧ[вюжгьvііЗmo0ЌžjА“'нЦB:žœ]Ц•т ьќ^ПиКхФкІˆ–pЫsgОIqˆхŠd?(Qђ9 БљѕалˆћМаQeт]RIУ[гn’7 КG ЮлP 7w< Џ{у/ щЯ^kњl%ю$ЕюW *.чF9Т•Юq‚Ъ:А.ю[^б^цo џg_ЄЖ3Њ|/Љ]uo„{_1Ђ:qЖ$~ћnCXpРŒђ O<6Жђм\K0D…ф’F Ј d’OЮk>?ш3isj‘kzkщ№ОЩnжщ HмpЯœѓ/їЕ—у‹}vM;NКа,`дn,ЕЎeАžQмЦ  Ÿ—rГ+Љn nHздсеЎMжlќ7хмZъЂъkqмOЗ{vrA1љ€8  Єj7v€ ЩЉљЗPHё%ХмSG#Б˜–C ГeO т=[M›T›K‹PД}Bп-ЂЬІT^9dЮ@љ—’;Z/5m7OИЕЗНд--ЇЛ}–бЭ2ЃLй ЫАЃжМџС~ ЙбuK4ж4лЛћ§2тхсзfеЂ‘&мKЌЩYXОжR |ЌлирЭ~ЫV‹ЦZ^ЉЁйп•o'™ДšдШw+ЋHЎ$Œ3КВ)ћХNC:энў‚Ж?ёїіјјOјјџž=жГзкЋъ>+№ў“іс}­XУ%„^uд&u2Dœ`”w;”9, d‘\НЖ*|UПБ…1Ё4Pы—ŠПnbё.@eašsœIЖAрзНб5уџ †—ІщїЫЄjz}ыEфАВ‹зШЬ %,БЫЙмЋ… У#ˆЄž%аaвсе%жєдгц}‘]ЕвЙс_8'хnь}*KэwGг%’+§VЦвHтКOp‘•ŒА@фТ–!sг'k‡ё'‡ЕsФ6эж‘Њнi’щђщзZ,z‚лMч-цe&ШЎU“xуa;Б…иK+н+\а>Ы Nж:~‰=ЉЗ1КFчЩ)ДŽЎм@WqQїœ|л@:K=[Mд..­ьЕ K™эeЬpЬЎаЖHУ€rЇ*FЁєЋ•УјSLе­Ѕ№Ђ^щSк.™сљ,ЎIb`&-nЁFЧbx›8ЦyЮ@ю(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠфў&оMg№п\6і’]Яqoі8с;™ЇaР’A“8яŒqšЙрŸџТcс ьcћW™ћ7ЬлЖFOНœэЯNѕroш6к вчжєиЕъ‚бю‘e,ик6œœŒ s‘^w№Rьi|]с˜эЇ[[ UфЖɘѓ‰ оОё Ÿ—gЏiэwgЉ$`ЪžPg1чШЪ]JЖWч$ƒ@Ež­ІъVіZ…ЅЬіВц8fWh[$aР9S•#ањUЪцќ З…muV25оД‰ЉнГШЭћйQIUЩ;QT**іT^Ї$хју[еДпЖЫЃмNгišyП–H–ЃЬ ЮюйXDЪЋ •mЬЁ•”ИЌ§+[гЕПЖџg\yпaЛ’Ъуфeй2crђq‘ШШїЎTё.ЁІќTгМ>О!’M>ют7Й,Аƒfх'dЖ'Ъ БаXЩˆлxиŽ.‘т›M>іMORАНXmыЩ‰й HЪcї’m,ЄWp э(Ќ j Њxrвю;›ыћУНќ+ъъьЌ’"ЊЈe`PрSдьPEPEPEPEPEPEPEPEPEPEPEP>ƒс] УlўХг ВћdОtўP?3vєQ“…Q“€2kbŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(Ќ§WDгЕПБhлљпaЛŽіпчeй2gkpFq“СШі­ (№n‰Їyз:џйџтgіНJЫЯопъ~п3элП{œу>ѕд_XYъvrYпкAwk&7У!ЭъZoƒДЉœѓ\ЁC*Ћo”HCЧnœ`žвИ1"ш?^# q[ј—LV’Ьг]л• BРœ€бƒœчМ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( СПђЙџАЎЅџЅГWA\џƒфsџa]KџKfЎ‚€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ ѓџ†Ÿё8Мё?ŒПхžЕЈyvŒœ$–ЖуЪ‰ТŸ™XќљнŽœ:ь|Eдя4‡њХЮ ђпgк:lБфђO&Е(Ђ€ (Ђ€ (Ђ€ (Ђ€ Ыё&‰ˆќ5Љhгљa/-о яFФ|ЏДѕ*иaШфEjQ@п€5іёG€єmbV‘Їžм,юъЊ^T%$l/V#рŽJщ+‡№|IЁјгХо+Гэ7k­л<“Ћ<Щ8 & …I#a“§хЯbнХQEQEQEQEQEQEQEQEQEQEsў џЯ§…u/§-šК чќџ ;Ÿћ ъ_њ[5tQEQEQEQEQEQYњVЗЇkmўЮИѓОУw%•ЧШЫВdЦхф у#‘‘яZQXїў K-Z-:->њіcф™ЭЊ+ d–C;ю`J’ЏЁЖ„$€1“CёkоdiїаZ˜ЃžоъtQдRnкбФє\•`Ќ.@ЭlWрWm_Tё/Š ШаjПdВХЪЭ[[f5xёа4†fЧNr:юmыэсы:ФM"ЯЙXXЄЎBFиn ЪNsР<•sТš7ќ#овt‚$––‘Х/0 QН‡9mЧ$dч'šиЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ƒё”ЭЁxѓСкђж ›‰4[Н‘Љ–Q8 Щqdqф“€rEw•ЯјуGИзМЊXY<щ|bѓm DoчЦD‘aнљбyуъ:еЯ ыpјУZnГ–ђн%(’ lGЬ›‡R­•<AрPЅW/џ %чќ-?јEќИ>У§‰§Ёцm>g™чљxЮqЗБœї ЂŠЫжќCІxzпЯдЇ’4иђLСeмЊ+‹‘–#pЩЏЈјУ@в’о[НJ5‚tŽEž4i"D‘ЖЦя"‚БЃœ€ppx8мЂБя|QЄиj+c<гљЦXр-ЄВG’"ЉDb]8bOB Ы№ї‹э.ц:uхм’ъЉпZІлw(<ЙІ)HЋБ\E;I F9€u”QEQEQEQEQEQEQEsў џЯ§…u/§-šК чќџ ;Ÿћ ъ_њ[5tQEQEQEQEQEх|K шз3Зе5Н6ЦvёEѓЌwWIЪ €ФdŸcRjž,г„WWSxƒьЋ>ЗІощТ[жЗ2YКкeBTД$ї6ф9#*qъPЕ‡‡Єјт$Йж.тxtЫk™еuЫˆŒ_МИi m”mEVŒэсT8 мь|3Šв?‡: ймI:Ke ;5ЫЬAЋЊюcАR6  ŒkЌЂ€<џЦё>ј‹с GѓGg+kЗ…>W‰bЪРA<iЉџts^^_ЄxWNёцЙуWФКgкmdд›eРlХЏЪЯ ЃUмБ!p2Ќ nkq~i–ie‡ЋјƒD‚ЭЫЄ:œСОhхоЄg'ю9Эv”Wк?єфН’УХznЊюрлAЋižXw 2фэ<‡%Fфд‰ЎxкЮђжкџСа^ТbтѓJду > Т3д7ъHХvWЉјъыHђОгрЩцчoй- ЙЦ1œљS6оНёžqадzoФx/Ў+ јЛO@…„ЗZ,ЌЄф|ЃЫоsЮzcƒЯL€v”WЉќO№ž‰хk]пXyйђўзЅ]ХПЮ7D3ŒŽžЂД?с2вџчз\џСяџ ‚ŠсяО%Хiy$ј?ЦWБЎ1<3„|€xUИщШ=9Ћšo/5[vžпС>'DW(EдVіэœТЩ2’9ыŒuє4жQ\;ыŸЕ n­Ќ<cЅу&оѓUджD`pбBЗЯА=N0Dаў!jкмпјЦЧKЦХž•І,ˆР1хe˜Гn+Žvрzd€wСќ;™Д§SХ~FЃIдк{d‚5XЂЖЙЬБЦИфљ`dHIТэ&K;›=cYёЙk>мУЉjвВ.гŸК…AчцЯнХW—MГ№GŽ|2њt?eбЏ­E’?ДсŠE&hгЫШЧЮ\’I/з'цє тѕ-^‹тZјЇK‡MЙƒћiЭелРСМу&рV'cё>œі”P›ъ~ ж5ŸEтmKI№хэТDlN—w+Ый№dД9 џЫ2 0I'јkфјŽmJ3УšŒwіAqЁg„Г’$ЋлЦ~ьЏX‹)љWї€tєŠ(аДŸhКЖЃjntЋуP’юкWоГлЄ’dŒЦkх™€bумC -ќ=Ќ[џfќ–-і/]пџЧУіѓ§ЃŸѕ|HПhћМƒГя ёиQ@Q@Q@Q@Q@Q@Q@Q@џƒфsџa]KџKfЎ‚ЙџџШчўТК—ў–Э]QEQEQEQEQEQE‡у}|-рэWZfŒ=­Л4^bГ+J~Xд…чЪŽнzŽЕЙ\_‹Еј_УМ›ръїІ•FH­ёхCї‘цdџО:e@6< /…МЅhЊБ‡ЕЗU—ЫfeiOЭ#мрЙcлЏAвЗ(Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ тў*iГ^јђіЭЃPбн5[9œœE$yl`†;7€’3ъ;J(Н…ѕОЇЇ[_йЩцZнD“BћHмŒSƒШШ#­XЎсЯйє}KУR4ўw‡ѕ ЌP]KКgЗмZ `aJ0Uу'p;Š(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠчќџ ;Ÿћ ъ_њ[5tЯј7ў@w?ідПєЖjш(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(Ў/ТhкПŒ|Qт9’M‰p4‹!5ВЃ$VљѓJ8ћШѓ3џп=0Л1ззТоеuІhУклГEц+2ДЇхH^p\ЈэзЈыGƒД№ЗƒД­V0іЖъВљlЬ­)љЄ`[œ,{uш:PхQ@Q@Q@Q@Q@Q@Q@?юДŒ?ђТ8|OЇџЖвIukџŽЊљ2~&>ЧяwХќO3YxN=zк;Йn4;и5†йЪU[dŠФBžLћuу іO еМWђЧ4 xфƒ+ЉСsš’Š( Š( Š( Š( Š( Š( Š( Š( Š( СПђЙџАЎЅџЅГWA\џƒфsџa]KџKfЎ‚€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€8П;jў1№П‡!y6%СеяL7*Œ‘[уЪ‡я#ЬЩџ|tЪі•Сј6fз|yуyФmЕФz-ІјдK€˜dИвIИrIРШЛЪ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠЏcoЉщз6‘љ–ЗQ<3&т7#dr2 щ\ПУ;чŸСpiЗ2@їк$Вi^BА@№ƒКх6кэаvУщlвў0ы–OчЫcЌщ№ъQ;ec†HvРшЃЬA‰ m wQEQEQEQEQEQEQEQEQEsў џЯ§…u/§-šК чќџ ;Ÿћ ъ_њ[5tQEQEQEQEQEVŒuѕ№ЗƒЕ]iš0іЖьбyŠЬ­)љcRœ*;uъ:жхp~?‚msФ№РŠFГЛН{ыц ^6†иђЄN…XрМElx@o јFбхYx-УNŽЪХ%r^EЪ№@f`1žфѕЎ’Š(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(Ўт7•Єџ`јНМ„ўУдэЭМьЕŸї3mUћЭѓЃї;є=Хeј“D‡Ф~дДiќА—–яwŒH#b>Wкz•l0фr"€5(ЎoР”кЏ€єk‹ЅЛ[ДЗї"ь/1H[$œяF<ѓыƒХt”QEQEQEQEQEQEQEQEЯј7ў@w?ідПєЖjш+Ÿ№oќ€юь+ЉщlеаPEPEPEPEPEP\?†|­wт/‰ќB<‰#АйЁZШ›еЧ—ћЩУ)рўёд?ЙЧЗIтMnxkRжgђЪYлМЁA‘€љSqшYАЃƒЩЇр}уA№^—azѓН№‹ЭЛiх?Ÿ!2K–{чvчŸЉы@Q@Q@V\о%аmЕAЅЯ­щБjеЃн"ЪYБДl'99ч"€5(Њ№пйм^\йУw—VЛ~б H ХИew(хr9ыV(ЂЋкпйпyџcЛ‚уШ• ›Щ?—"§фlta‘yb€ (ЊџoГўбўЮћ\nђМџГyƒЬђѓЗ~оЛsЦzf€,QEQEQEУјgЪаО"јŸУУШŽ;§šэЌiНœљŸЛœГяHћќqТїУјТлћ7Цžё4k>дЛm*ь[E“$wЌfFШ§кJƒ‘—ШчїQEQEQEQEQEQEQEQEЯј7ў@w?ідПєЖjш+Ÿ№oќ€юь+ЉщlеаPEPEPEPEPEPуЄm_T№з…ТHаjПkНЭВЭ[[bFI3а4†ЯNpzэnвИ љZяФ_ј„yGaГBЕ‘7Ћ/ї“†SС§уЈsŽ9nт€ (Ђ€9=VџХW*Мвєth`Ег"КнВ4“HђЊЇШъ1Ы`‘шsЦ\^$ё†­ЈшПйQшqXы:Rj}Љfi-0`ѓCm KФп(^IфП5OУплž9П]OHе_IЙгрГћL‡‘ э3Г‰9•йH•Te;Ифє‹сэ15K-F($Š{skl‘O"EGAАLpНWјWћЋ€nЧФ>$КO^Гщ_aё Mф ЗIe#[Дёю>a(ЪиђЩ8# aийъPщVšЅџќ#їщmт9bE›Hc,m.ІcwŽC1иwУх8Т‚N3]І›рŸщŒ7ж:—4oйдЭ#ЧmцœЩхFЬR-ЧЎР8ШшqRAскТ+ŽьлЧz/е$Оѓ8}ћ‰g%†џŸiЪ–љˆЯ4Щј“Ф сjsйщўuў­—g Ф‹ѓЯ$—jЎљeн…@9aЊЛ”|ЫжxVї_Нвхoщ‘и^%УЂeФбpRMЊюpW{rЄчT—обЕ?эA}gі•е"ŽЕšWed;‚p˜,Ь6cц;КѓW4н.гIЗhm@ЫШђЪђЩ#` ЛЙ,ЧI8 @qіз3izжЗaЄЧio>Ѕт1Щ$%у‰Žюх”БcМ9}Фœ`Щkтb]Mќ5s.•К.чŠ;­Ž`–8у†\ЌEУ \ йПlИ… л—>ая-юaИД’Aqz5vИ—Ь[€,ˆћЗF@UaХS›сп…gГЖЖ“JџkЖНŠqq*Ю'c–ЬЬ,H%н_юŒGЉъž!гl,­ЄŸM}Zg›‹kЇѓ•_„„HЛVMђ<ˆс…}2ђgХ^з–в8'д|9q+у СKк:ЁlСKЖ>ЇšиŸТ:<щfО]м&б$HЄЖОžФŒ­&чG х™U‰bI<žI5&—с}'G–вK(gVГДk+q%мВˆс,ЈФuUчЎFpїzЖБЊjzЖсл­* ­+jKќO)–GŒHœ#ЉŽ<0ЮтNќ(йѓSз|EЏZУтGLiДа эnbrї*АЧ<…eVФgd…@(мЎIСРдО№O‡urMjуOЭќБ'’9ЄŒOЧЩ*Ћ‘N!С@KС>еѕЏЏДџ2iќЏД(šDŽчЪ9ЭX$ЛOMрёаb€9§cФž0вu|yzњf•hКžэГ$ЯnVsхc%|Таэпœѓmlэ] &Аž2еПЗ'Б–јщZyoАТёЦŸМКЪьХАsѓ|ЙљEn7‡ДЧе/u`’Yя­Х­ЪM<‘ с LХ1Ыt_тoя6kшžбќ=qчщБнЦџgKP%Оže!Ъ Wv.N08мqŒœ€nQEЯјчDџ„Ркж’Жџhš{Gђ"пГtЪ7GЮF>pЇ“^3Rx;__ј;Jж•Ѓ/un­/–ЌЊВ–EЙРpУПNЇ­nWрTm#Tё/…ЪHАiїПkВХВУл\цEHёд,‚eЯN0:mPвГѕjЫ@гžџQiве2]сЖ’m€K0XЊ€X№=kBБќUgЊjдlДSb/ю"1Foг| 1Уn\ќЅА œdšЙЇj–šЊ\=›ШщФ–ЮЭ ѓ#mЎp€`Fс‘Fx5rИџј{X№Ž˜њТXЩЄZЫ1АЙŽсЬц6ВЌЈc ЛцlВЖ: НыА Š( Š( Š( Š( Š( БќUт x_Qз.—|v‘ ’<Ч'™уsЧЩтЖ+ЯхџŠчт+ZЗЯ x^Xц%8ъ\•Цw,Jy\ЉpС…GрXМeuсež[§Цy/oZ{gгd˜Х/кЅѓzмFэиРщŽOSв}Цєаџ№M7џ%QрпљмџиWRџвйЋ  ь~0џ ю‡џ‚iПљ*БјУўƒКў ІџфЊш( ь~0џ ю‡џ‚iПљ*БјУўƒКў ІџфЊш( ь~0џ ю‡џ‚iПљ*БјУўƒКў ІџфЊш( ь~0џ ю‡џ‚iПљ*БјУўƒКў ІџфЊш( ь~0џ ю‡џ‚iПљ*Иџˆž4ё'Уэ+щЕMђътQН г$ŒПvbMЩ!@ъ@<ВŽ3šє‹ћы}3NЙПМ“ЫЕЕ‰ц™і“ЕЧ“€J№љХЧŒЫ„pГn`Ќ'‚нЦ‰ЌjО#Зѓєoјbљ#И‡K‘š0У+Н~е”'†№}+ДЎo[№&Ў_џiЭk%ЎЌЈыЅa3[м!dйЛzИ… л€c‚'иќaџAнџгђUcё‡§t?ќMџЩU“ёCћ=О­щZхŠЪwlE$7)кБnи.Щœђsœ~!мiоZx›Т:ц’оSЭqs "івŽZXI=Ÿ”c<ёѓPЧиќaџAнџгђUcё‡§t?ќMџЩUcFё_‡ќCАiеь›Щ†u2*rЩЫд0N5Б@џиќaџAнџгђUcё‡§t?ќMџЩUаQ@џиќaџAнџгђUgнмxТпXгДиѕ}YЎќйў%/• kѓIџ?7Юё&мчї™шІК sSўЦаяuŸ$3EmІy:$jp~gbЊ’РOрыы}ћGФЩц­ьЂ)к-ЂЯ–р6KЩ!у*вДmЬd cё‡§t?ќMџЩT}Цєаџ№M7џ%WAEsџcё‡§t?ќMџЩT}Цєаџ№M7џ%WAEsџcё‡§t?ќMџЩT}Цєаџ№M7џ%WAEsџcё‡§t?ќMџЩT}Цєаџ№M7џ%VфѓУko-ХФБУH^I$`ЊŠI$№цЙ;я‰ž‚Y-Дл‰ѕыфˆMіMМr›‚“”љ чsоЃ cё‡§t?ќMџЩT}Цєаџ№M7џ%V;x‡Ч:ϘК/„ гax’[kнv№.sД•x"мъи-СaŒdрќД?УЧжхКx‚ћZ†|ЊиBЭef‰И:*7Ы2œс™ЮJƒ@z—Ф[л[…Двѕэ7ФW…mЁhнВG’7Б[Н €Fsѓ/9ЌxФ;oˆ:ˆќC‡є™u[wбs†•` Дб†A(ЫЛ&k‘Юћ%…ž™g…Є–Бчd0F#EЩ$сG$“јз?ё KИе<|l5;ЗіЖтgYс"EиЇј›iOјрє >Чуњшј&›џ’Ћ‡ј•Єп]щж+ЏйAт JЦєЯ\Щ$\|ФВ]Ўе?/Й88;r=3IдЁжtkRнdX/mуИd0WPР3ƒъjхxП€<;ёŠЦtm[^‚оФJцH57ћtђ`TчnqР•pA8=в>Чуњшј&›џ’Ћ Ђ€9џБјУўƒКў ІџфЊ>Чуњшј&›џ’Ћ Ђ€9џБјУўƒКў ІџфЊ>Чуњшј&›џ’Ћ Ђ€9џБјУўƒКў ІџфЊчѕmoЦ>(бќ=gЈшw—зћх›ў%s*кл љЅ|\БфсT6Fс]Х§ѕО™Ї\поIхккФѓLћIкŠ cЩРЅqџьn5??Ч:Д~^ЅЎD† }СжЮаdЧ7'чHиР,GЪЄю(ЂŠ(ЂŠхќoтNЖгєЅѓ5н^_Бщъ>[s; 11Ц>f!O`pF‡…|=oсO щкЋoŽв …№G˜фхпœnbЧу8W/рџј­PьЇЬœ2žw+•Œ)Œѕ­ #Oџ…w№жцYGлoЌэ&д/Є2|зwL’&мœ‘Д3v…ЮqR|6б&аќІУyц6Ёr†ђіIЃ)+Э)ооfy.ЙIфэ:ВŠ( Š( [№7…МGчЖ­ имM>п2уЪ 3mЦ?zИqРƒгŽ•—ӘtћјЎ4ЏxŸO‚ ”z€šо% З9•Сч8=1ŽвЋп_йщ–r^_нСik7Э<‚4\X№2Hq№шПtЫ;–‡ХњVГtл|Јѕ-'ШEСчц…ђ2un€q’h›Zј‹ІYл,овЕ›ІнцЩІъоB.,Щ‘{3t'Œ[1бю4жo5 +.чЖ†yЎаG/—,ˆЌЎpс`cпЋš—‰tсmѕMoMБ:Чut‘1\‘ƒŒ‚3ьh“ёšъž.№фš žз!ЕЛ–/ДЪЗAв4pч`ѓШ,Jчn-Ю6Дpќ@‡ECЇAрЊ[Л)йІ‰C6тYМС!оKKфю$œœцЗKДВ–O™ˆ‰фQЗ ž$Є€A;–zЖ›Ј\][йj—3к>ۘс™]Ёl‘‡хNTŒCщ@ў›ућ;ыv–уBё>žсЪˆЎДK†b0>aхЋŒsŽЙрёг9ѓќOXn%‰<уYбЊЫŽС\ї†цЏ P+МЂ€8§3ЧWZП›іoјЎ?+ОзmЖsœcЭ™wtэœqžЂOФў,‹ЪўЩј}}uœљŸkд­-ієЦ6ЛчП\cЎxь( ?ў.=ЦБџ2ЅŽ˜пѕёw2|ПіЩ[-ўюяŽkУрПнймкыŸѕ[ˆфлАщЖXК`фќсYЙуЁ^рфю( >псЇ‡апVкѕХІџ.mfђKЏПз1Бђњ`pПТQšъ,l,єЫ8ьь- ДЕ;!‚1.I' 8$ŸЦЌQ@Q@Q@Ти[Fвѕ JcSЁjrСn†EiMʖ)$СЦXHм€ЦAЎђИ{ЙSBјУЇmБј“O– !ŠžлчY]ѓ“ћЗtќЈЦот€ (Ђ€ (Ђ€ (Ќ?ј– x~]IэфЛœКУkgK™œс#Aд’y8рЦ(›ёќVо4Е№Є?>•ЃЫюК#Ко ‰ˆмрЎмѓтНЙПxjo x|С{qжЉyq%юЃs*ВмHrФ€…рvч$WI@Q@p~=žoокјM–Hю5[NTcƒOЕЪЗwvсЗkЌз5›?hwКНћьЕД‰Ѕ| cЂЎH‰Р<’sўбЏ ‹Rё&Ўž^Џт RъhH лBРй,ŠH'h$’q’жA6Жё[лХ0D#Ž5 Ј `Ц*J( СПђЙџАЎЅџЅГWA\џƒфsџa]KџKfЎ‚€ (Ђ€ (Ђ€ (Џ7ёЕжˆž-Авцёњ=фћ/Џ%›VЙЗ‡ьЈлLq*Ц$МHп{n@;OkpјsУZ–Г?–RЮнхђФŒЪ›BЭ…Hрз€|6“Х~&НгoДhd'Nsm&ЃЉ‘<6тGѓю$!ЄžVfCЗiXЪЋ1/ц/ЏјЛHoˆžг4ћ Щ!бuŽюющs%Ае7Ь˜ЦAЦFЯenЃJвЌt=.пLг-ЃЖГЗM‘D2IЩ$ђI$фšфў#yZЗі„ШэЭA>блЦћX?}6ж_Кп"(џЗQмWЂЛkuнT<†ЯHЗM"мЅЪМO+5Си9WSфЁџtч$a{J(ЂŠ(ЂŠ+›ё}…набo-4Шѕ3Іъiw%Ѓ:#:љrGЙ ќЛаШWюuвQ@>|!Ќнъ‘ъZž‰ЊмщВџhZOЄEЉ$"Orї`RpŽЌЌБК^T0Жищ>!МГД№‡іЄ‘xjЪЭ-ЁžŽ$пr -$ьЌcmЊ кr%s^‘YcУњzјѕХћXПtTvГylЊPbпАЙˆx,OSšсф№жЙc пш‘щ’]НЯ„­єЅЙ‚h„Bт(юASН•№Lˆ G<уF“e=ЗŠІ4™,єљД{8bФ‰ч&ЊЧ,Ћ Џž™щ( Š( Š( Š( Š( Š( Š( /т}›?„уж"З’ц}і ] YV1 …Вс‰,ЙуœзЁь žЋxЎ-хŽh%@ёЩWR2#‚ч4O7VђлмEаJ…$ŽE ЎЄ`‚Ц+‹јQ}q/‚џВodѓoДЙД‹‰@F0œ.Ьc* ЩœњтŠ( Š( МџLџŠыЧ2ы/ў‘сщyљЁКМЩѓ.WІя/˜дЫœВsZ5›Ы}:hЏЗФ:юћkIE‰@YK‚6ьBHЦ[vм+s]‡ЃYј{CВв,e­ЄKd[YА,NI8ф’hBŠ( Š( ?дџтКёЬZ2ЄxgFЬšІ>hnЏ2<ЛfщЛЫтFВч РW W/k№ћУі>иЦЋoчЪгЭфы7‰цHпyлђЧ$ђjЧќ!К_ќ§kŸј=НџудаQ\џќ!К_ќ§kŸј=НџудТЅџЯжЙџƒлпў=@ƒфsџa]KџKfЎ‚И? јONŸGИwЙжAњ|šет -мЪ8Y@Ю'Љ9'$“[Ÿ№†щѓѕЎріїџPAEsџ№†щѓѕЎріїџQџn—џ?ZчўoјѕtW?џn—џ?Zчўoјѕ№†щѓѕЎріїџPAEsџ№†щѓѕЎріїџQџn—џ?ZчўoјѕtOVдЁбДkэRсdh,­фИ‘cБTRФ 3ъ+/ўн/ў~ЕЯќоџёъуќqс­.kЯјj;‹щdжuѓ НеЏeGЕ„yГ` юљQFGёq‚7(Q№їKИвќboЦu;эзїюжтiц&FоЃј—pOјрtEsџ№†щѓѕЎріїџQџn—џ?ZчўoјѕtW?џn—џ?Zчўoјѕ№†щѓѕЎріїџPAEsџ№†щѓѕЎріїџQџn—џ?ZчўoјѕtW?џn—џ?Zчўoјѕ№†щѓѕЎріїџPAEsџ№†щѓѕЎріїџQџn—џ?ZчўoјѕtW?џn—џ?Zчўoјѕ№†щѓѕЎріїџPAEsџ№†щѓѕЎріїџQџn—џ?ZчўoјѕtW?џn—џ?Zчўoјѕ№†щѓѕЎріїџPAEsџ№†щѓѕЎріїџQџn—џ?ZчўoјѕtW?џn—џ?Zчўoјѕ№†щѓѕЎріїџPAEsџ№†щѓѕЎріїџQџn—џ?ZчўoјѕtW?џn—џ?Zчўoјѕ№†щѓѕЎріїџPA\]ЋЖ‰ёfњжG“ьž!ВKИ З+Д\лт98њфФbbzќ‡Ј.Їќ!К_ќ§kŸј=НџуеУќN№е†ƒЃщО(‚уUй„2]HukЉ&ћ+АŽTˆД‡k6хЮ №4ыW?џn—џ?Zчўoјѕ№†щѓѕЎріїџPAQЯ<6Жђм\K0D…ф’F Ј d’OЮkўн/ў~ЕЯќоџёъЏ}№ћУњœ–wуUЛЕ“сŸYМ‘•2рр€ Ы№x†іыЧк”RGqЈ#[i‘:˜Ьx}Ш{ЛА.[,+Д€q]хPEPEPEPEP?рпљмџиWRџвйЋ ЎСПђЙџАЎЅџЅГWA@Q@Q@Q@qz+ЖЗё7]еCШlє‹tв-Ъ\ЋФђБ\ƒ•u>JїNrFЈеЕ(tmћTИY +y.$XР,UБ$ рzŠцўйм[ќ?гЎЏŒЉядЎІ…љЏ;6љЖВƒЧp8€; (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ ЇЋiАы:5і—pв,Жђ[Шб+ЉRFAСє5rŠхўъ—Ї‚ьEљЦЇcКТ§рLы<$ЦлиmџžЇЈЎУЎƒё7ХZš5ƒQHЕЛKe Ф&;‡f#‚dU;rFЦ9М Š( Š( Š( Š( Š( Š( СПђЙџАЎЅџЅГWA\џƒфsџa]KџKfЎ‚€ (Ђ€ (Ђ€ (Ђ€<џтŸќMьє_ЧѓIт B8цUсжж"%™бЪvЇ\ч'žž\„k_u}Bт)г@ВŠЦдHЅбІ˜ d• с!T`2Ha’ЛЪ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠсќ}s§‡ЌxWФЅЇкъЦь‰|ИRохvД’œ}еu‰†HЙw‡у|SрэWEeŒНеЛ,^c2ЊЪ>hи•чТž§:”x;__ј;Jж•Ѓ/un­/–ЌЊВ–EЙРpУПNЇ­nQEQEQEQEQEQEЯј7ў@w?ідПєЖjш+Ÿ№oќ€юь+ЉщlеаPEPEPUяя­єЭ:цўђO.жж'šgкNдPKN=*ХqЏєН;Т№<‚}~і;I<‹•ŠTЖ_о\:чя#ЇЮ9к@$јgb№x. Jц8ћ[–M^ыШf(^sМ`7L!EЧћ=њžТŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЎСї?йО4ёw†diіЅкъЖ†ц\™#ИЄЎювPќŒŒО9'ИЎФоV…ёУ!>DqпяаЎЄ}ьчЬ§фTp?xŒ ?пчŽTИЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(Ÿ№oќ€юь+ЉщlеаW?рпљмџиWRџвйЋ  Š( Š( МпRахёЏХ Ѕ:–ЋІлј^(’оKXб7нL<Щ ШСƒ(ЪVB9ни›а/я­єЭ:цўђO.жж'šgкNдPKN=+—јgb№x. Jц8ћ[–M^ыШf(^sМ`7L!EЧћ=њ ёZ|EаЂVІ•тˆЧ™$Бмл§‚sђ‰&шљ9ћЪ=3ƒ•?сcdСЛХўеt ‘yВмylДLОе_:п1у†Uєю3мQ@њ7Šќ?тƒHжЌodh„оL3Љ‘Pу–Lю^ ‚py­ŠчѕПx[Ф~{jк Фгэѓ.< “6мcїЋ‡8=8щYmрmNЩ/[CёЧˆ-gЙpШ/ž;јЁ‰кЋ*–Ц |„–Хv”WќDБМЕŒ]xsWБH€žIЃšЪygхѓPsД’g$85LxыФš}ЛЯЏ|:ж`Bъ‘ .xubA'rЉR `s‚9эЦ@;Ъ+‹ƒтЗƒоў-:ѓR“KдIkЉлIlа’›іЛ:„SіАxС9щ4ЭwGжќпьVЦџЩЧ™іK„—fsŒэ'СышhBŠ( Š( Š( Š( Š( Š( Š( ŠцчјƒрлkyghХ#Bь#Ни€3ТЉ%АžеžПєЫФВ—Cв(xFо№XкъŸкЗяK І•нМИэS+Лх<1дрsUсјSсй>ЮкдкЏˆfЖ”ЫšХќ“љyл• BЄЈШ*sаф`WacagІYЧgaiЅЌyй ˆбrI8QРЩ$ў4ЧЗˆ|sЋљ‹ЂјB 6‰%ЖНзoч;IW‚-Ю­‚мЦNЫXў/№‡Œu jw7ў+ŸэаХхЎŸЃZyQ$ё.эВe—,п˜aАлNPЂ€3є-OћoУкf­фљ?nДŠчЪнЛfє З8Цqœ аЎсЯ•ЄџoxA|„ўУдьёCМьЕŸїаюfћЭѓКŸї;ѕ=ХQEQEQEQEQEsў џЯ§…u/§-šК чќџ ;Ÿћ ъ_њ[5tQEQEХќHvПвєя Рђ ѕћиэ$ђ.V)RйypыŸМhTŽŸ8чiэ+ƒЕ™ЕЯ7йЕЇ†єФ€$БЎфЙЙ!Ь‘œ)’H# 'М Š( Š( Š( ЙЙўx6цоXТК0IЃьЃFŒpЪSю#Еt”PІќ(№vpз^wc;!F’зSК‰ŠфВŒ€qь(г~OЅ\4іў9ёsЛ!B.ЏbИ\dH˜Ч\gЏЉЎвŠсь|5уыKШч›тБЎsњa ŽJH­Ч^щщХ\д јƒКЖ—Љxbц}р2]iї(\C,ЮIЮ8ЧsЯѕ”PŸџХпџЉџ&ыCL›т<^oіЕ….Г/ь——ћzч;Ђ|іщŒ`ѕЯ…Я§ГЦєаџ№s7џ"біЯа CџСЬпќ‹]СЮ~,ЕФ­o‚Ѓ€Й1ЄtьЋž`'№3ш(€|Ykˆ–тOGp$xвщйW<Є€N;dgдWyEssщў2šоX“Фz4шUeEВ>№нrFG^A ж}Ÿ„|RіїPk?Е+”™6!ААЖДdп6Ч9ф`ЉR1љv”PІ|<ЕАѓ~гт?ъ[ёЗэzмыху9Ч”SЎ{ч Ц9ЬzoТ_щW =П†­й tЯpИШ<,ŒР:у=}Mv”P~™Ёhњ'›§“ЅXиyиѓ>Щn‘oЦq g=}MhQEQEQEQEpїvпипtэEqoЏiђиЪАХˆўбяRI[8,c*фdРу8ю+ј™bѓј.}Jк8ћD–=^зЯfМф/\ uЧћ]КŽЂТњпSг­Џьфѓ-nЂIЁ}ЄnFЉСфdж€,QEQEQEQEQEЯј7ў@w?ідПєЖjш+Ÿ№oќ€юь+ЉщlеаPEPUяя­єЭ:цўђO.жж'šgкNдPKN=*Хpџ>йyс{]ЧЯIЕэB5Їƒ% ‰yЈћЫВ6 2вrp  ,n"№_іЕь~UіНw6ЏqА(Іc•йŒсJ8$‘“ŸAмTpA ­МVіёG  HуBЊ(РqŠ’€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€#žn­хЗИŠ9 • IŠ]HС#ŒW№РMeс94™.хИаяgгžk”(eUmёВ‚IbxёэгŒкW$]уKФaŽ+щŠТRYškЛbrЃ“ДXк0sœ€w”QEQEQEQEQEsў џЯ§…u/§-šК чќџ ;Ÿћ ъ_њ[5tQEWћ­уќА’ iџэЌ‘н]уЌОL“ЙћНЄѓУko-ХФБУH^I$`ЊŠI$№цЙ?†б\KсwжяxюЕлЙuGŠiФОRH@‰U€ћЂ%‹єщЧ@иQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWё!УKгМQHgа/cЛ“ШЖYe{f§нТ.~ш1Йbz|€ёУДЊzЖ›ГЃ_iw "С{o%М‚К•$dœC@(Ў?с}хХЧУ§:жј@—њf§6ъ\7”№1Œ+`Ÿ›jЉ<ѓЛ#‚+А Š( Š( Š( Š( СПђЙџАЎЅџЅГWA\џƒфsџa]KџKfЎ‚€ (Ђ€8џ‰2мKсtб,кxюЕлИДД–ОRHI•™IћЂ%—$tыЧQжA6Жё[лХ0D#Ž5 Ј `Ц+‹§жПё‡ўXI†4џіжHюЎПёж_&?РЩм§от€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ +ћХžг/$ГПё•iu7У=ьqКф2ЄфdУдО-xJИX.фLрO,“!Ш#”v*zїuы]Х‡‚ќ+kqХП†Дhg‰УЧ$v+#A Aч5ЙEQEQEQEQEQEQEQEQUяЎ%ДГ’xlЇН‘qˆ (ђ@рЛ*ёз’:zё\М_,.t; JзJеn&МдM|qGі˜g]х–U.`!c“Р œ€…Q@ŸЊнъ6ŸbўЮвўпч]ЧЧњBХіxNwKЯолЧЪ99­ (ЂŠ(ЂŠ(ЂЉъК­Ž‡ЅмjzЬvжvщОY_ЂцI8I “@~ џЯ§…u/§-šК сќ17‹"бKХсыЁЙЛКЛŽ;§EрRiф•D‘ЌАу#qЧ|БіЯа CџСЬпќ‹@gъz­љ_ккUџ“Ÿ/эvщ.Ьу8м3гаVлњЋ)рšѓ9Дї“УзЖV5єњ’kvџи—_и­iž]!s*+Ф|Ћu–)7‘Ф—о}#эž0џ ‡џƒ™ПљЙПОНuЃBšЅж›сиТ•ЛЕёCк3Жжљ ЕЎ#'ьƒк€2є›{+Я‡ОДџ„fњлVг.єші\hђ#РџhІ‘_fАнœуv [žЗ6Е”[.ЂЙIgЅЮ›$3РТE lfhРš#c!Ž6ђšѓ7тФЉnќ?%Ї‹-.Ў 1Кщѓ•Д Œ+Ъ"2CЎIрmЮ}ŸУZ–ПЉлЯ.НсшєGW B§nZAŽXэPt’O<2ЙEPEP^т/ј­МikсH~}+G–+нt7F#uМ9+ЙС]Иц Хt4ё'ќ"оКдbЯОlAclsOpчlh З'$/;CcЅ№пќ#Z‘4žvЅw+^ъS†ШšъLF ‘€ЦrHAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPUюЌ,яМЖZAqфJГУчFЫ‘~ыЎz0ЩСŠБEQEQEQ\5›Ш"г|7Є?—Ћј‚WЕ†`H6а…ЬгЎЫ"@м $œ`€gшџёZ|EЏя4-'Двf_ЙspќO27ЊхџJœƒ^YњgсэЫHАM–Ж‘,IlufРБ9$у’I­ (ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠфў"јŽo јMІГОДВд/."ВГИЛЪŽIир… п-ЧЫШ=№УХж~,ёЮЙЊ­ѕЭѕц&'NГBDQ33edr ВЁebAуkm>-x{Tёџ‹t/ i<6іб5іЁrуї#ЖШЩљЄ§м /{Јˆє xcK№Ž‡‘ЄAх[ЧЫ3rђЙъю{БРќ€чќY.ЅЇэŽпХwаъњœ­—amknб—ўЪб<žZ 4Л€€2Ћ]f•kweЅллпъjh˜–щтHЬ­мэ@ŽРz’NIчлУў&_оыx‹Mq2m ЙвYХЄ@’U ЮЇ,v—'я^UsGВМБГqЈ_§КђY^YfT1Ї'хTŒГlUPЋ€yСc–bH\~0ŠkйЌ#в5#~-ўзohоJKs№†EVР,8—Ыn U€чѕiў*№.Ћ}ЇХтгэв'žїJИЗŠx‡”ЗЕŒœRЈуЎXЈЮ 4ПkZ[У$:і›ёY\[}Ђ ЌВЫ*Ч›‰ LТIwCGЭѓдNЫсЎБІhКжeтx ŽБ.…оžѓIч<"9ІчКB сЗp|€v^"‚пФ0hpкЯw|ё-ФЉ ФОD%і ;ЉeШ9иŒrхЮХs~!№еЮЙЌщЉyilšmТ\Fџespoо*ЪВЈщђ2•`G'mŸvz›8KЊВ2Jfт1iM™e^,ЁЅŽОhP/’*‚ўЎ$X!ЇИfэ7IІJё\MХ+l6_ЗђТАыкёЛc•+“D'cЩ§tЮX–ЫќИЧV.ЇIY^Зro…‘ИGВЎР{•DЛL"XџlБјВ–qмвШБ‘ХФПРŠЎќaзЮzN%l!CPfЗcџўu%ѓX вŽ†Ÿ˜*›Z)Ѕ2љћ{ф@x–Ъ|\ƒђIGYеFКЮ+F?9›OšЊd<Su{ЖШпv‡2КL‰‘RXVиМнSg‘™]Y&2_Ѕ!тЪПЕМ5^ке§ы&sЪ‘ЮŠTН_K;М_G= АєБsо L“1Ађ:;я]]VЩhЪљJ›jƒр9’iЉцJ%eЙ№ОЧцд0‘ іВ{љ` П5kи^яЗЋїŸŸсУпАЁўв&љSlючзаНК‰†Жє§[їнLšq’яІj„0ЛзН—фбЄгxalоГЯџhš О“ф18YГнжыVfЖN‡1иеЏЙЮUаЊD(Iх\љsХlm>8о-Єу•Šко)>8хям)ЗзѕёoисўИ љVTлпћщ6oеэП–vл\ќњ]БЯhј&G$МїЗVђо’Qмђ9Ш­gи›юя–ы§?,кјUЬѓЭRШтцУНќ.9ј:Вx‹кУЃбЯ‡­!Neв$ЧHk:Ћпz‘ѓZќїџ3н,Ї­Э{ЙQЕ§ЊK'Š,bьк­4лsЛtКv!рw`K‡]ЗМя;Л ч#ГЕ9п&QhЎHЙŸј!kw8б&љЬЩtЗахb*jМ5*]‘цГФŠœ88ЅIqв1*Њюp -–~оэК №0­Г$—9хЏНrЯш’†‘eеxdTмј46JхЯУДnЮЫ,“m ‡†š=єг]х—ѓАЭZ,аœLЧF}ЇђGЈi)3lЁІЯžоО†–xю­эџКCЯШ#–ъ›‚QОuМќP№Ѓ8)‹TЮvu]qnIеqВ—_лэ]Є) С’:'ЖnDьяpпŒ Й§M‰ J=ЊІˆ™$gО#+ХуНя@%ќ‘Њ+˜МЬe:C„“ЉЇŠ‡CI”ЁC),>pWЋе)є$АУф‡Gа_“:WФпЈNsU–ўн|‰j"+;м3ЭЅ,љqrхvЋЂš4) L“љL:Щ+z іКжы0$Ј`•RЭец#G21н ;šРЄtm"Ч q•ыЉWDСTpi >ЩыO^>)2ANђіLnЁѓ{зшќЇП…щ]шИŽHQЗРЫ`ЩЎІВ„Н%№]:S“T•т(м?~pDПЯш"сы0kAуjHHLЈВпН/>;#Хe*гfЖƒAJPц`ь И…еуTOХС>hхЅR˜„ђzW|ЪСƒдšЋV–T32§KЅŠ–В›)Уй‘'уœѕчТйп…ждЬEэ\!›‰‹ЏФїџƒ%rч<bHб,J•ЃЖћчqѕq&ѓ W5ѓ“КJвЄdь'ЮЅ dOTІLDїю`Ÿ%ЩцвЦNb1“—€hbŠ*&rH&;V '=ХЈŒгф €oъ$К„Њ‚"Ря y@ ‘*œ;7Eс…g=ЙpJq%г$fVРњPv* “E”4tš%ыё’д)v“dД і:ФEKП&eЄС9Ц g‚ЅЩ…IЦ№­g’LHч;Ь!Hпо@1˜‚™€F>`BŸ'‘бфCтЫЄЌСžѕЕ›ћ В!ж`™ЦелFЎgЉ•МоСŽ ЃѓИе hдnУMєбК5<}KЊЋnЎЊ-ƒкр\Sžз•ŠМ\‰)’išтэšлІЅх–&Жv FЧ ]$ +фаK/p№YУўŒШШ#№?‚7Ђ„uЯœ€€I"в­ŒHбЄ@GћзЩ/Ќ$\-KЪЩ&V#Ѕsi5ВДdО~jН™eь˜ Yзl9Ы•lАhBЬЅuЧ\Г.}^†љаMZ]c*ŸГАJP{ЕіRu&п'YљЩЉvё&еЧ<‡)RИ0ыЂ*šSЫЈ†јфЪXЇvYKVpY%Ы™ „&)ЂŸe! USJ>оt‘ьcзmаTˆ{еЌ+ОШAЎЊsШH"сQАЕз@™Эd4RTЛzKaёB’qNŒЎЧZAlЄІ sРЭлвfSTЛТјTIњЎˆPёиК%‹4 HRtх‚эZй! Я:a4\ЩЁv)ЇŸeX[ аХfЖутл<обЋuaŽчn5ЮиРioѕtdtЊШejCхЊФ"Œ$V xёJђSˆ {43‡СЉАю ќшЉХq6ДљŠЮ2•!жp*Х>yЌ crD4›к жжmЭiѕ["EDr–!EС†Щ…Š0o$ПjА%0T"ьdEeѕЉјЅXŸЮFAyНIьˆ Pя•р]cу›sZТћuŠˆЂЄ-З&+H!о$W§•ZLХY(5ЫVHqяw`m†ƒIV#“2('ТYmщтc\ШZс^gyЮŒž#ЁLФk%БŽCkFЅЬиž(y…‚KYЭЛ%l)Т!Š|Тв4ёв[‰ŒŽ|S(yЩg2ˆЄ{kљФ?ШЁКcЉlЦr SЬЃl!ћa%]‘YE—<з9b” ъ UбФ†#И7Y mQ&.ЩёрYŒ.JEрPqЉgыВpЮ2НЮкж*Ы[зќо23 ЊscЌ˜хmХK­нrw<}<`ЇЪ WVla,P хш9Žц}яИдЌШ$%ИОGиЌѓRМeyЙ№T|@&Mе>=ЙА 4RЖєћЇHчЇiђ{"VlљЧ9—O\ E Fvз~‘%Q\цъ ФљД vЂ<эдbBЋœЉІ- ЗВ{уH‡h /–ЗsŽF|CЭ !6QЮ*ГPЬ–фК!ї)b…xЛћя”k ‹IЂЫgт€l Й№~l'­G#до d€’hЯ{Zр”SлъŒ_?ІьБ•фјFЇџNopIžВМФcлn›K$ЩW yŸх}v+Т"HеЊяrє€ТЮtтNЌћ…œэ=ЪЁ*Ю„пЂ^"D‘И#*n2Ѕ Tій, VЪOМ™ђ+ъŸа! ŸmrйV[ДEtIІЫEџ+-Ћmсш#‹ЏЬWœJAywWMн9}uЙ_—2PЗ…jбЊ;"sМ4)kКAИg)ФЏшBzЏЖ бœіxрдŸ 2Т;C;ОтN›kЉљЈХ’tTЇЖзI8Й‡HOЦž~`ХбЗbkЯ S5g[%ОŸ›r6їУFэAѕлH1†Ѓ&ШŠz/#˜оd&`CdTђ Ÿ-RцvыЕЄCМ~Dъя‰CW8ssC{ЯЖъЭ„wH жGЃћеnAп‚ЙncЬ'№?уxЬ…z/ЙцœkYаПТВB,rHХЎЯлuzoШИХŒzјР{hмoЦ<юGaЦЃуЃУeЬxи=МwxА 3ю-`Цn‹žŸŸ?ypoџ—Р„[щP8Жаі`ЗurнЈ%B!`ƒцХР6ШяgQнўіЊЛзНИwМЌКƒюƒћ‡ЋTзп Кƒп„ъ>•ŒЧ|хЙ|э„O&гFЈK\п0Г :О’ю,t)›јКx9ЋЁ(\Ќ*]#kСhoдЬ4—+a›hТЉђ‰ж•р{qЎг-г)ЕƒЄсњ(1(њwжqiT7иУ0жъx№Z„3ђЪїб]Уœ!WднУляџ#KB*њўПi"•Ь|$Ч7лнRЯ3kЃгЗžнRU‹+nх‰;* ‡ЕьЄФА‰ч #’НMиLISјюя ЖЉЏафл[ъЂ­“BЯ)йю}0ЈЙ$-јHЪF_Ы R6щƒen–C‹нr‘Z -ВFУ‘Зг7Ц.˜лЩ9ƒ :*Є“™Gж6UЙ•Б/ ‰Ђ’ЁŒЭёwшЂ№Zиc8{Zlё.кQИю1‡Wмбт–`Іы4n)g‹­oмкqg№\WT|l*І;ƒ•ЗхhgЌsw—еuBќЁ^h)5а;НƒІ#Ѕ N8P„#`7kNѓяэйO[WaКT+№Ц‚'‘/л†2!@ їш,0NgsЬХH†[DЎЖ:$‹U”dи†M|…m{ ДПЎЉnќЏем vDYШƒхт cѓюжm+оІ1B5ЙЎ–Ъ 6\юrЅў`е]""гиcI?­ЦIФ[5]"фїЙ}ше†ЗЭъ ƒ‹ц9ЌЫе4сжюШї…y gƒKaю‚ТЗЬшvь|твE т-ЉР_Цcs™jJPЖ"ŽAяєќ†ŒпIКfOР+'Гl;Њ’аdHоQхтќ<Жъ\Х7^ иŸ|#рњЈmk}юёРL}3ЊjпсЎiКтrŒ-.эй 'л2мОжYQкC{[ЏЙ7k”uО!вшЫЛ хѕйК1H ТEвpНЉы/ вуЦе0КЩP‡dћоfу&с/TPnzляwuЅuЙнм-‚UИNАЉq‘>HXЇz<[ЊЦ›pЕйА†r>…vБЛиLвАьЉ6)_Cв%&s‹йћЂѓЋмСђœЖƒэЕЏ`ЛCлЪo\ЯЃS>ŒЇN˜oк4G}еiЁ'фЛГ7mџšoZИУšK•­+”сJИј„%žŠ—ѕ/žбѕ№ШЪ’ѕаA"К­ЫЩЧ]Jу{Ы_&YУй§ЮРоБАW ќЇ5{I’$ •лF0}C*Дˆ§GvDvLE‰.ј_–IЦЕI…єpIЙл`-ЯКžAˆюЧ~­фetЛ­џц${­яcѕжќKЦƒџPKPр{epYPK[Њъ2 styles.xmlэZ[oл6~пЏа4lи€Ъђ%iœ,nБ&MW MŠ&ЖЇ–(››D eЧ§ѕ;$E]Ќ‹•:5 l/ Ьs?ќЮсMчЏЃаZažFgіh0Д-L=цʘйїWЮд~§ъЛѓя/o/юџќјжbA@<|ц3/0N"6!NЌoЎп_XЖуКЗ1ІЗŠkРјТu/я/-§ћ2ВРŒыОНБ-[ЋјТЗ_ЗшirІ‰3{)D|цК ЌАТЪx8КњЗ (щN~Хaи~м’!gFѓК‡aї9ZwrKШИсXЮН^Џы‰тžžКм]ЛWŒG(їх1$єŸV~E5Ќ4ц˜w{‚Њф%Y-š”ыЎr—Н%тнљSEF&ўŽŒL|У С.[œК€Јў|И.вЧЃNх’!Яу$юі\Гић•jЩQ0@ЌН0yuЎXŒXњ7E`ц-Y„l+`š!@ 7fќ…uzФG ЂЩ ы'ГфW=bнС0„п8AЁѕ@ д+Ж>мщQлэvр ‰рEж…œЬыОhE5ЦLПUвсСмЌИ"ПУі=‰  o№књСв6Ы[l v5ПГРsтЭlЎе}Йg*—uВсЫЩš$Щ.ЫnHВ!нфŒs>Pf­Я(Э|Yp/‰—и†9ц€V.фJ6Pгф@Сc'‰‘ ХY2N>ƒQЮьс`4ъ-эVў•дч5rcъ?AwЛYГ$MА§ЯgkGeШc!ƒ6%xŠ+™нЂ„|ђh,kЦBD)ZРжLKЉрЩwojj”D”—јЄ~УЇ­hЂ1dh8Ы,ТУ]нЎЧЂ8Ф=,чœЖsjнzN*ьЫХЬAЉ`rz C”б<еjкцPјАЊ@ ^nlЭ‰sAП™й!wФ<#,x€Z'юлјЬ‡*јюњqЄ€п„њџбshє@–›x‰)™… Ў ТКшp!BЙо;JЩЬз˜т4Yю` ‘яуœNє“ˆˆ>ŽSъ‰TkYx`u‡@еkФ ŒŸ@{ЄRѓpp\nVе"ˆ!{Жля2Ў5я@ЕИoЗЂнLBˆ’А,їžnЛО{ [sцov*„|kэ4;SЖйPt0KтMвйбЙ)FчLЩД ЇЙ"?;ђr Iџ’jёg1„R_kуh*#Н;ыэ№Š%Ъž1э G}ђ^ЄЗ;љл n˜58=ІIqтЕЗЋaб2 1CmnLjGKjжŸг ЩьЃ6Iо‚EUЕ9у ћOт{ъуЧgœBЂє}ьОV€7ђРюa' Cˆ†NРЩbYпk}юѕГiUѓz] Щ‚ЪЅAYЕапi"HА9К€ќЌїЫ+ ’“3O‹Е \Єœ 9“j^Шˆ™š№"^цecіЯЦ7)ёˆУљbaщы€*::}Ж—њŽСУщАтr Сp‰HШ“JI3еlЧŠ­YЏ/ѕjj}4HЕЎ@KЃћэЮРппгй„ Џ‹Ш=KМcfПѕZьљя›X!­жэИhзю:‚CзС‡лсu]ЈеvЏpDwфЇкьW‹ГЧЂGСЏЭVЧв{f)†8UЖ.IbŒ}'з˜д7ч’‚Є‚Ѕ|Ћнх},fr“ЩтуАфЏRƒ‹Њ/nДSu‡UЃЖЈщєw&П‡Ю{љ$ѓдlэ™ЅўйЙН~ћпNŒŠˆЅB_r5Œ…x…УьNCяофtЗR=9КЪŸйR/щё^в“НЄі’>оKњх^в'{IOї’>нKz4lw[(OН•Ы4]ВŸюЏўКI#kl—љJ†ГЃE;Z“4Tъ ЩЇї­uЩ#šƒ™5ёхSŽЙQЩЃhёф ~Ž{ћљ[y0ФЪпI6дЫn л‚PЛsgŽAMљNш`Nz8ъУшР5E№KSш9Іht№)ЊtȘcрЯНЃю;oу‡ѕrПАže2ЧŸЬ“§Ђ&=›8Ќщ70™“ƒOцщa&ѓшРaU7ЯГ( NNЦ;тОьJ‰\оЁŒ ЪNфБ, ‹”ЋЧšFП3/е[ѕ …Љ\}ГСB ьх‰PeЈ™ВŒvEОиH}цуЂ|†ЉпЯвь‰›ЯХ…ЉЊВзК,,*™эШDІЇˆXоОf4х8RwŒЧхя”Жт›yw:‰чB yuЁЊКВsŒЃFјLKdИŠ5ОФњx4ъˆЩh%T8pњпQ6‘Œ ŽˆАЗ_>Fm5‚О— ЦЕw’ьjК ™sf§;ПЇвXƒќ<ц‘щCjёeIЦ’ри(453žTВ`žГТ“"Šmr:mdCjЕЭ\Ш——гzо5є8/Њv|ќcqWмe ЫЏхїњь<Œ‘|‚U?мr˜ЅAЗ†wu eЭИПlPjЊРoћ™ЅdЪ)Z‚ћ–vЗљУТWџPKр—У l§(PK[Њъ2їОŽ ––meta.xml OpenOffice.org 1.1.4 (Linux)Sails surface formulation in Sailcut2004-02-21T17:18:042005-07-10T23:18:542004-02-29T19:53:36en-GB0PT0SPK[Њъ2ObjBFFFD752/content.xmlэ]џŽл8’ўŸBы[,вIл&Yќ™Mg‘tf€УЮь,&™См2€bЋЛЕ-У?вЩўuяАoВћћ(ї$W”lЕ(YЖDЕЯb˜ЖMвdЋ>V‘ќфМјуЇй4ј-W“x~еЃв Ђљ(OцЗWНо}нзН?ОќЭ‹пОљюњн§хЋ ОЙ™ŒЂчуxД™EѓuЯзјќх‡зпќчuаы‡п-ЂљwIГAММпМ{ЄŸпlПр8УсWюНДПСx=юН|Qе9Ъ8_=OkЏzwыѕтљpу0ёУ0Œ2L?їЖ_X­?OЗOZьšЏЃOыƒ­mƒЌqјсHпI‹]ѓё2М?ик6Р9пЕП‰Гжїїїƒ{HZRcЬ№ЇЗп ПŽ—Г0“хгt2џkeћЄvзtО™}ˆ–‡% зЁ3/ЋЗћ:O'№c&ђш.\žПЄХУŒРјШŒРxз•НЋPPПХЪфЯЗпЅЙGМлc2 „fС*žNЦСфПЄХ,\оNц§itcг–F)fЄN=Љ:§ёїP9DmЫЗJTъКmЖмхhGк­уEsд_xNŽju“dО$xЂљИrкр‚’ѓзЏл•Жл<твр;3[НГ~JГQЦJq9J Б~›LeЛ-ŒїT>†шэвзЎDБД[ѓ=z†ќxzWFЉНyi“•чrыТ k!›ž†ѓлMxkq—ž‰тЭ|НDОўўPКН7y.Œн|К“fWЭОБv?МmЛяЌo2№б:.&О€ЅіHs2Ћећˆ‡•GћлŠёјѓЫщйZђw{Ю–šт­НиB(ІeљUРэ9плпюiš\lOявЕ#Ybі.*Ук}ВЃ}к]@§ў`з_z?КmКТнп" збјЊ<"їщoпящЬbЦХОŠЂ`б>AьFѕˆъЌЄVU_ІvKQГeЮ5†…™№ŸšН% q!{Оx‰KиЭdМ 'гбf§bИ-v%А})ІфAЮW?^ЕŽfXњN7Q§ya—дilљЙŠЋžxY\b@o;v'Ж§nяифћ“к3-і08Й$ьWГь3ЫŸNj60ќalviјЏVЩmСk7…Г‹9АН Ў< ^§ ~^QТфФ|ЯЯDГДЉЭ4Мъ]бgџ3јŠНђњ˜`" &ЮЧЬўЭў -ўф ўYР.‚ЇAњ–^\œ­МюЦ афћс“'‰/Из\3J„Š€yАЊ=јM~ущЅрS}B%Чпф‘kЗгƒп4ПыhEzF*Аo+ƒ*мЭ–uƒњDшzЈЧІ^ЈЧЌž‚RЮe.ѕЃСдƒЛЋSИ[ ]Иc‰м з‚rсhlxk ^Ѓ4[œ'ЖhŽsJЅ"œSУ$FyзУш™y;ѕ qюyOVI г* г@ЇŒ„\A”ІЮvž^bMGpЇѕсN§рNИ”4žyїˆ…wх]нšРž–`OН`oРh  šуr-ƒ~г>ХGЁvшЇшGУРB8JЧ1 aЎУ‰/ЇG?mŠ~ШЯ7tхYјY#№Sf8тт ;Т=Ћ{цƒ{KиaDтž^9ЫCny”uѓЬѓЌ„yц‡y#Иp•ІrvђьрЮМрN™V„jЁ4СљйщсЮУн ,а]А‡*МC#t(­)e —_(k:=д=ј‚^j*U@Д0EЭАВCшƒ/єЁ}№‚О’ѓIcВьЋ–yŽХ?dјќ[CБS~ †в}юЬ.яЌ š-…ћ’Ю№ЯЋ№ЯE`h$Œ;VmЛ+‘Яы#Ÿ{"ŸbЄpŽŠэ=J—Сžћ"ž—ЯН€;тђр2{žA{A]0ЃP.LRYpВУа8=дycЈЛWDнХzQ…uб€Ёпф:л]wБІ#Ф‹њˆОˆg@Aи0O ўqЯ:МЉw•k|QО№:ПWŠs FiŽyєc„z‘с_xсI)Хфo‡;М Ÿ§Ђ)њ№‹ю}љŽ5!п‘Г–а…L ;Т}}ѓbрYмƒнB–і-ДЫЋzцЫФc%&ѓaт pЗf8ІЯюІnOИИf)љђаӘмюИ0уŠэмЂ}cVžpп]ДЏbхБ&Ќ<Ы-рм>ИШeѕдя‘ХЈЏЯЪc^Ќ<ЋW0кi0іЬТUЌгs|_^+ёђ˜/OqТ…1зq`кЙ­Wmя--ў3^ѓсхYЫ`"‚2b֘†‚Ыўѓœ“й]МЏ"цБІћ` ДД n™ WП>/yёђ’ѕ ”д…]dыЅь т}yyЌФЫc~М<‰™=юqы‡&ЎYЦЪc>Ќ<Ф1V0ЬkŽЏќ“іxеœл)~c^žt‰нХњ*^kТЫCн3#nbhЁК‚|}^ѓтх%Ч\’crKy9ж‹.г|_f+1ѓ˜3OhEpoC$QœQчЮЋк/3љ0ѓЌУЁЋe4У>ЃЊрsчьsѓ”“]uьЁŠ›MИyV5eе(@_Дv”§а‡њф<№"чYшK ˜FoэБИ;дƒ/AJ=№"ш Ђ(Ч”FЮ–к2ŠјPєЌ‡Yсp‹Џ№рІрi‡s’““єм)WE|Ј"щA’^ђ34˜yIЪЗлGŽV§a_ŸЄ^$Ні`Єt0Y>Ы—цњрЫвƒKМXzœ M ЅF2mˆГйфЌѕ)э5d,=№aщYўЄЦЬ­C$(ч“#,тг/yzЮэЉю.тWёє  OЯšУP!u#+ј#П>M|izTJL`8/@ОЅч„М/IJ$=№"щмБiчоЫкc=ЃшEЯ:—Ђš ЁЄ”^№В3cфCc’žv/OК іU$=hFвУ`Я5V Ўћџр\ Шз'щ/IJm0иqЊ-3Ёь[Ўe‘яЫбƒGМ8zLиgЉˆHаŠ8kOХИ†ŒЃ~=t7щ  )1…э§‘GOП4&щЙAtьЋHzаŒЄG3к§ѕ §ŽNі >KМYzŠbdбІИНW-яБЂо—Ї%žxёєЈТ$_iюонгGxЬ2Іј1ѕьу^іь˜pм€PZмоŸYSѕŒ3хІЛˆ_EеƒfT=ммkЩˆT%ЪQv >UМЉzˆммkІ&КК€§.ЗїОT=(QѕР‹ЊGДB­з6Ї—ЋKк?iq WќИzN8ЅBp%5јп(жœўчuoяТаХ—;Х№~:Њ†\UNYEэƒfд>Ь# ~9d}Mі)Rsщ№fћ)E ы…зБјQ%.#Оє?(бџр §_ #_CF?* ) ši*­йtГvњХфD? ›/y™§лgщ?qЖћ4ŽG›Y”ќ#tѓ5ООќPKœ?Uаъ‹PK[Њъ2ObjBFFFD752/styles.xmlэZэRм6§пЇpN&™Сk{’…ьšiBвv†&@Ї§)l­W[ђШ2 }ОIŸЌњєїzIйdCІРж=КїъшшJШЬŽoгФК4GЯmфйФ!‰Žчіех;gj?Ь~<9{sљчљ[‹,(„G ‹bцфь.Йu~ѕњєЗ7–эИюYё™D]їфђФRЯ'К“ХУИюлЖe+wЃˆEv0[у›gˆѓ#eœлKЦВ#з%< ЉЂŒ=ЯsеГ­;Шоƒx‰0poй ZJ0Иор[" <Ђ`5ˆЮИС/H‰^­VЃеD"§УУCї‹SїЁ)(sЙMўД/­Š‹євсL ^ђ›ИЯЙ"№ІL9\:ЬŸDTŒLЂ ŒL"цƒ]Ўрд}ЯђлћгŠ>š:€r|!Eйpц bэ7VKЉксŠ`˜фСLXЕXъƒ”kцgŠ@тлж‚(РЄ(ЙгэЖUыš!ђqпnbr‡ПF,g‚дz#˜†Ду)ШHўЊTЭ뉧;ЄРК8пН„><ў%X’tCЊі=ыДQrkЯRбTK-М1ШyАЎ0тEZя/žœžйЭЎ,N 1Є(œлљ хљІШnўt“ЊŸ&Й.@‘шЊjœъ\dЕrB˜$Жg”/Ъ/РІˆR8YB˜Яэq#ГіP€уФМ bй’3Ъc]]t:: GWkC™ cХCcгоњL•зЄYo+yДќ–і>ЯНFЮчdN„rАиќбјe˜Ъ™шс9˜ЉšЋKoƒ|EйЯnM†(С hЗК[њ)EиA˜С˜{ŒPЬWЯCІа­є”ђН§Ў/ п{y>”ˆЖм0$Ж>F‹Zz•ыЛєš$&ЯІ Ж&„рЇ2х–‹5#яс 'ЦSRdђL#ЏQеdхОd ЮYgIљ'„яМO ОЃx"H+ЇLG>>bZеиS•Ы GˆЩэђ$|іќiЬ^ЭK­,K4ЩNC‹"џЋыљ—зv№Япdол §ћЁ­KuЧŒmEЋўД:~œZнQё?^­юИЎŽЗ еЩудъŽъъф>(|еwВEя?NEяЈњюяŠоqоп‚ЂОoE›~ЪžтЎxn;Ю—RќСџŠџЏМoeEмkEЈ§38§ќ+–6G“ ­Н|QЛiЈkЂvfЕ›8w}ч0юЋ- х‹ЇЗ_ЙђђLц6b AayѕХЕъ8‚4A˜[s>бU1iZНЄ7љ{u§Й‚(^rнpyFЕ[Г lЉwNўїq“Ќjъkї C\џ A$пЭllIч8цЫ!ф]Х•}NiqrRPqЯИ@З‰9њK\=Оo%жЬкУјжƒю\ мkд†БўQGˆТP刄•#І„бш!ЋЙ}шu“u[їкњŒЄМsшƒЩ,†N rЮkclYъЏПх^Q^ŸpьЄ$та„:ьКЧ’ЌНВ›ƒХaЉїF/ќ0•S‘sSТаlЄоlН&ŒKx4ю—ћ’XТОVbŒd=Y53p;3АyRЦoR„хšаHМSѕFоtІVNYO<љ!ˆдыtёЇІ?‰§GІX> =ёYВPC№(†зешОIQ|;ЌlЅЛЖ†hƒЖ*‹nž†ієZ$Ї[zд”3Qы2§3_BЈо^ЧЧЧ3ЗнЈ[ВжФЗж‚˜8ГнЁœaxх^€$oМЊ$Ќ§\ E?ˆЌе&№MМZ['уЊСљ` n‡ЦMЬ~„ЁƒФŽ;ФъЦb[љ|&зж3…cˆ%uˆz~осЁЉб$зL+:?‡РЕG~а)AŽ<)ѓuтxтЫЦcзїФ&ьы*иГLЖЕЬ‚T”х^IogwEу…,зœZ!kзіУ Т‘,зЛRAЪ€W>їЅJљ(]DIи]ж}/œGwВL…њŸMQ9kKћ+ŒШWћ4MЏввЮVеu]оѕО˜z”ЬбтЖ*g&вЫќ6kЏБП„\)gц{pqnѓ)ь_ŠL–ІЏYJyc~З!†\ ‡FвK'_GЂ.U”Вќђ!№œѓЫЧШчAZ-)зъЇёMˆAnшъѕэЗл?хCёс њ‡О`šџ•vc„bуѕџGlx-ЁDдБ2 H;€™œ—П:?жНЯ'п@№Яфš5’p!ќшжh:ƒ1œ@vЖK)†€H'№4lљ]Ъ/…nФШ??yK5)Іёг­TэІЄiз7ЇGн XытЧfхI”Юaф;дЃу€Цbе•NC7Г’„ФЂi_”йѓЧ/œьV™X† ЗX/сbwі:t)f6<,Kgqb9дŒУC НђчГdрл—и‹yА п{[R&ЙХ[ћvтжsˆŸ^o'Ў–ˆ џL№ќрO•N†7Vˆйkт1%h/PуŒ„S`/СЂTœпІШЃ+GіR1J>‹79`2hO5=убІядлžж мЦPя8Fj†jр…~ф†VШhу7Tь’о1гєЉfАŽ=Лкjщ…–ˆпЂ}ЇЅпЗ1вfуTџЕпёѓЬQRWV]фJ, ыVр7ъэхEx=d0ЎЮ/g31№„цLF1dлuяxўўzbйjБ6Œ‰С §„x<йц.PнmА„Ѓь’д#&Іь[HvyˆiшР0zЏЪ|Т‰Б8NmЫС#uM@<ˆ?ўёžМх7WGљиEИђPK˜ЄƒžБPK[Њъ2ObjBFFFD753/content.xmlэ]m“лЖўо_ЁЊž~Ш„о Иw—Iт8MЧŽ=Е=г~ф‘<‰5EjHъЮ—_пAŠєт;ЧˆьVіX7кАРтйg o|ён‡U>ЙMЋ:+‹Ы)žЁщ$-т2ЩŠХхєнлчœ~wѕЇ‹??{ѕулПўiRомdqњ4)уЭ*-š .‹~N^ПћсХ/?NІС|ўjЏкfГВZЬчЯо>›˜яЯК^А3Ÿџєыt25уЭ’&™^]цXдOіrКlšѕгљМ3х`† „ццћДыP7їљёіm‹Оy“~hŽЖж ЖЃыŒнЖш›'UtwДЕn>ялп”лжwwwГ;кЖФJЉљПо̘?/ЋUДЫ‡<+оlпjћІХfuVЧg5‘х—њvБopуРлэ”уeTї_лb№M>тšєaБЫ ”ѓ— l?^ОмW­ŽЎlзWйњјЬM“iў8ъњrк­ЇZAДХrДiJ˜}­OыЋ ГнNщЄ§|ZD+€дЏ‚цћMДЪђћЫЉогpъtŸtпVYd+ 1ЩYГУгљеХ|ЕL#ёјI$iœ­Ђdm{ІМ5rxвл&{І§ˆ ‰Vc”ёћ`ГNЪЛ"ИŽ*р‚›(Џa‚c§]ж,ƒл2пh#–ОYVi 4‚цл(wєIšЎd@MHMЕЌЌ;!кJюWз% а^rЋчяh;›:MFНЁT)вИйЛ YшP—›J—/Б^TQїкUСm”oмuІUUVС*ЊY12dФyy|™gЋЌйбmжыƒК8.ЋћžЧ:шCЕ-вQЗ*]Ti­4їыдюзц„<КNѓ /,ЈMmeяг э]oєРлНN8ЄЌ`›ZТ2ЩбН™‘ Й  ;ёО†Яџ€Ћ2иьъcЪMЃQ—— ЧfЙвnї% .єja ЗрКJЃїЮX­ыЂЊŠŠEЊЫeШ YMя§s тЌЮкRеє…Ќd Е-UђІšкЉВЫUPзu"ˆФD_(^Yт>‡ЁіЯ’УдŒŸг–‡ДuаЏ_\І23}A№G„.|Jу`ќЂЌ2;,ЂuœmЅ[AЃ;ХЙхЬ-gn9Ю-;GфО;цЙіskП}ф0C$!тИЃЭЌэ%Xu…ю?G=АЈ9Т[JQ*ФQо"Ё:Ъ[cНУ[fь3oyыЋх-yц­/‘Зњ™овbt-wц­3o}ЕМЅЮМѕ%ђMвkšјс­8n"ŸyыЬ[_/oс—N>щЭŠ#я:ЄBџkВP‹uьъ–iЖX6Fљ˜Х|цзDZПЊнЬОуг)ЎЫфўъЂ{@Ќ?[nъяьйŒ’А'Ќ~ЉjЦЙдТЎ—yгH_дЯЧ‡чњ˜о@žБ$“ё—p•™лјJoLX0лНi№IIЋЖ ЂWnыМl‚ЈJЃН !‡Е/Н=S№^ћь ˆ’Dч‹Ыщ›eš6xіфЧ'˜?=yў„ ‹љЭуё`е& @—ЊМл>УауvIRYm2YЗ gЩFЋA3ЪЗŽэНgLьё6в)Ѓ_^є!ЋmЧїљБŸ‡YъК|VїС‡§cлU–иЖ~Z( &›oы€§ЖяїлцŸhлМЄАwHБВнЈu™ЭЖXЇрЁфrJ№h`3膧 -§ ­~чаwQžяf4„кM^–еўVу‘ЗyuabЏ§ьтаєШЫ8‚ŠЋЭV+рз(xъоHБuFЈ =ЎЧ^a?П]У`p›К†іжY^p qЬD?ф\я mtŽЄ›bq]i yAП’лsѕ›IдцѓbоI?ярŸ}иЩ7Œ>їЈ1ѕѕІJŽ;пйЁ}PкЛ™йоLѓŸхн‹пЛxˆD§ЎѕHч51˜–Ьw–аLq&KцЛK##^|Ff‘PЮчT‘‘ћ\е#ѕйРzY8Ÿa‚9B ak­лбјDN‘b˜!AЦXrT~ь3„ IС ellпQy‚вkdˆ *Ф,ийЊSСЮK<tІ0V!ІcФ BO›MCуЃ1ЬЧROЉ”ŒJлъ ѕф_„„D=”H ЫЫЖъTРRО"ŠQE‘`Ыл5жјйl"BЦИdH…‚л|цЈќи—LŒ(хЇˆтБ}GхЩћ‚3L)фK„Ё–ћmе‰`G|е8TTPЛpшd~ЖВ"Іс8Д™ЇjIŽЗ,і2_^Х"DŒaEp•э\Ku*8љ‰#<Ђ`!т(”иЊЪŸFLI%ІЌЅ*+qЙ:OPSTI  Щ †„ВgЋ|љB1АС€.‰Н–ъTРѓТ*А:L#й˜ы…^lІP……VО‹} ЮЋм6;–zѓА –<”„rцјyЌ:ДŽчцOпцPJŒ аЁЮN[_ s‚CŠ$Wю\Ѕ'Р…Bu "œ6ŸK„ €АЂ,T”ЩEDвsp9B§€еFXЫ™DьЛД{‡ЌvєвУG)+€ї_јѕЫ›eY g|9Pз“М"\вNNвg`„уУmE 8q;IŸ>ёOљHЗmkЖЖ"gѓљіпXsQЦЃ—ЎШйяC^m”ЪгNbпфR7й=q`3ZNŽБ˜ЮOзDlђ$›Œ‘WгтСC=o =Kї |ю7ЭџPKЛYLPK[Њъ2 settings.xmlЭXYsЃ8~п_схuЫсˆsJ<…Я8‰O|$~Јc˜‰"иљѕ#АqьT‡ЊѕЉљZjuнЭѕe@JЏР#ŸбE?б”P—aŸ.n”ЩИUОT~TџКўЛбЏŸЭ{~і]ИТЬ ЂR6* &Е‡NНЄ”UЕэgr'Œ/TЕ1n”жЯЭk%ЉHU›=ЅЄЌOАРJѕњ К\%Ўжг7Š'DxЅЊLъaџъ14MSзЯЪц…%ёщЫЛ|’$'Щi&Ћ›ІЉfГ[Q—бgё ЖЎЎE”­ ўАкћкЗKЎ^ЏХ7Рe_@юЇДІ(;yѕ!yпЅВя?хЇRот€Ц,TЖ3bЪŸ ЅjѓђZ§ˆђuфxћ uуB;yцcсэƒ6ŒSэќ8ь[№оўu›чч9n{,–^uбD; Ц ЊTŸ‰ П’[@јЬѓ д8K"щ ij1&ŠздЁ8t†o/(,ћУ№Gи8й;’DјъknдС;KOЭSMcдШяž‡ЊЂ_\фG=@КVЙаsУFОC Ш€‹рЌ xt(ігГ‹ЪQа5& іšC7єГœ–ž3Œ%дЎУyŒKфœVNA[ШŒя‡еЕœРШЎмтr G@яќ=:Mo~П€Lš_KБы‡˜#!“ѕЩЕЦФбI?АCф~Т•‚Ч9Љr 9FŒ ­%`—€ОƒŠd‰3 1ћШxыљ eNфвп€зYrˆвbшлН:Г-MOрŽ9E$рЕuZ\†$!‘ї(ЩЖ1@!№T‘ "охТяа"=6 QYlK?/ТXй>в 1@Ÿ”CG†Cq€Ї+ЌXАѕ‘Дњ:“ЌЦHQЦОз{Pч•šO_)U{qћjLз0уўИЉ[џѓпPŸ'o!qo{ЏЮЯ—eoxPtfY]ыeѓ Њ—5ЫђlyлФђbІ?jЗД'лZжim…fgкќБcЮkoŽQ9ыŽ'їЮщ]8—уOЃPŽ™“ЖЙТЗwzо?f‚fгЗСИyя=ЯiOЬюиJъюЙ`$ћ€щnыФЁCГ[O’‡†u­№Їc,_н`$ї0bƒqG“њпœід˜ЯѓїyŸѓБ–дIm8jЪ§вцШУэц§naQЪD–тѓ|N ЖТЌ&№ЈNiљ@p‘aiЃW˜Ў›ѕ>­С№Љ’6a"лiъ-‚ƒ;б=pjE>Ђƒ˜К"ЮŽНˆtBќ•dl XфІцVŽ9—жJ+eБєпf1w?8ёКSПЬ“НХъЖЅƒ0bддЯŽИZV№еEfKAЉД= оНБ˜rcЗ@Ж„-d’-(ї 8‹Bй‰UиД9 =п-р0,BX’щUlQHс‘$ЫђQМЇ$Яиc rрй›… /’чаŠХЛgђi4ѕœГ4 Op/рХu_iќећВр,І{Ая>–уˆЃСQ’ЕБ՘ЄFЄ=ZВЭ“Пvыъ‡OфъЁўе_PKHўХkŸ™PK[Њъ2META-INF/manifest.xmlЕ”Яo‚0€яћ+Xя№@ЗЬбDdЩ6=шaЧZX…Ргџ~н2Ійt тИPHћ}эћббф5MŒ=ЅЬ”ЫЫf*‘…RХ.[-sР&уЋбЕ7Ÿ-ŸО‘r%#,iXŒХjњp?3˜ 0ЯQЭЃH ДВ"№–žёXЯгlџ‰Ќўe…2 џЩд›RхзЇЫ6Dљ гќьРяйЖѕ$ 2ЄH&hЂЂЂ:к1†’›Tхш2žч‰œєЉaЏBЋм)KK­—BьА(к%‰™sкИ ДrШ”ЧлугМ…Д+АЧ>zœAџунsn<пЗ}/АЖyмвн`lIгбЊƒЕ–Šеi|ТЋlGІрbƒ- „Џ:ЇС"SЄПgшЂм’ЊЫ‹cS$оz6_oЇAxwЗ=ш‡fvчXќDњ>щ?зЇ‚'ЂY|с“єЁk§^/Ч†џ*ѕcGчTŸЭЦ†дьНlя~+Њ ŸƒёPKR‹6wоPK[Њъ2сЅ19mimetypePK[Њъ2ŸuЊn``-DPictures/100000000000018300000214DEE083DF.jpgPK[Њъ27yрG†† `layout-cachePK[Њъ2Pр{epY ?acontent.xmlPK[Њъ2р—У l§( нvstyles.xmlPK[Њъ2їОŽ ––~meta.xmlPK[Њъ2œ?Uаъ‹=ƒObjBFFFD752/content.xmlPK[Њъ2аЖпс1%l“ObjBFFFD752/styles.xmlPK[Њъ2˜ЄƒžБ‘™ObjBFFFD752/settings.xmlPK[Њъ2pжgЁ 9auObjBFFFD753/content.xmlPK[Њъ2ЛYL[ЉObjBFFFD753/styles.xmlPK[Њъ2HўХkŸ™ НЊsettings.xmlPK[Њъ2R‹6wо–ЏMETA-INF/manifest.xmlPK GPБsailcut-1.3.5/doc/en/rigplan.fig0000644000175000007640000001343710700004326016376 0ustar sharkyjerryweb#FIG 3.2 Produced by xfig version 3.2.5-alpha5 Landscape Center Metric A4 100.00 Single -2 1200 2 1 3 0 1 1 7 50 -1 -1 0.000 1 0.0000 8145 8145 45 45 8145 8145 8190 8145 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 2655 5490 1890 7650 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 1710 7650 1710 8865 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 1800 5445 1395 5445 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 1890 4095 1080 4095 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 2070 2745 765 2745 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 540 1350 540 7650 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 855 2745 855 7650 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 1170 4095 1170 7650 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 1485 5445 1485 7650 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 180 7650 3600 7650 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 3690 765 2835 765 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 2655 7650 2655 8100 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 2835 7650 2835 8100 2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 2652 765 2835 765 2835 7650 2652 7650 2652 765 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 6 2655 1350 2070 2745 1890 4050 1800 5400 1710 7650 1710 7605 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 3555 765 3555 7650 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 1.00 60.00 120.00 1710 8775 2745 8775 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 1.00 60.00 120.00 1890 8370 2745 8370 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 2430 8055 2655 8055 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 1.00 60.00 120.00 2835 8055 3285 8055 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 1890 7650 1890 8460 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 1440 4905 1800 5445 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 2395 4898 2755 5438 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 1485 4995 2430 4995 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 1720 2198 2080 2738 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 1620 3645 2430 3645 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 1800 2295 2430 2295 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 2371 2184 2731 2724 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 2395 3548 2755 4088 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 1540 3548 1900 4088 2 1 3 1 1 7 50 -1 -1 10.000 0 0 -1 0 0 2 2745 9000 2745 405 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 2655 1350 495 1350 2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 2070 2745 2655 2745 2655 2790 2070 2790 2070 2745 2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 1890 4095 2655 4095 2655 4140 1890 4140 1890 4095 2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 1800 5445 2655 5445 2655 5490 1800 5490 1800 5445 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 4545 7650 8010 1125 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 8010 1170 8010 8775 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 4545 7650 4545 8910 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 7650 7650 7650 8370 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 8145 7650 8145 8370 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 8505 765 8505 8235 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 8010 8685 4545 8685 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 7650 8145 8145 8145 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 8145 8145 8505 8145 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 1.00 60.00 120.00 7650 8145 7020 8145 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 1.00 60.00 120.00 8505 8145 9045 8145 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 7650 8325 4545 8325 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 7155 5670 7740 6030 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 4140 7650 10710 7650 2 3 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 6 8013 765 8508 765 8148 7650 7653 7650 8013 900 8013 765 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 8010 1170 4275 1170 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 4455 1170 4455 7650 2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 0 0 2 8415 2070 9180 2070 2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 9045 2070 9045 7650 2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 9585 6525 9585 7650 2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 0 0 2 8235 6525 9720 6525 2 1 0 2 18 7 50 -1 -1 0.000 0 0 -1 0 0 4 8415 2070 10035 495 11655 6165 8235 6525 4 0 1 50 -1 0 12 1.5708 4 180 1455 3510 4905 mast height = MH\001 4 0 1 50 -1 0 12 1.5708 4 180 2070 810 5535 Spreader 3 height = SPH3\001 4 0 0 50 -1 0 12 0.0000 4 135 405 6705 5670 Mast\001 4 0 4 50 -1 0 12 1.5708 4 180 1695 4365 5040 fore triangle hoist = I\001 4 0 1 50 -1 0 12 0.0000 4 135 1290 5220 8235 mast base = MB\001 4 0 4 50 -1 0 12 0.0000 4 180 1665 5220 8640 fore triangle base = J\001 4 0 1 50 -1 0 12 0.0000 4 135 315 7110 8055 MC\001 4 0 1 50 -1 0 12 0.0000 4 135 360 3015 7965 MW\001 4 0 1 50 -1 0 12 0.0000 4 135 360 2160 8325 LSB\001 4 0 1 50 -1 0 12 0.0000 4 135 375 2025 8730 CSB\001 4 0 1 50 -1 0 12 0.0000 4 135 495 1755 3555 SPW2\001 4 0 1 50 -1 0 12 0.0000 4 135 495 1755 2205 SPW3\001 4 0 1 50 -1 0 12 0.0000 4 135 495 1710 4950 SPW1\001 4 0 1 50 -1 0 12 1.5708 4 180 2070 495 4500 Cap shroud height = CSH\001 4 0 1 50 -1 0 12 1.5708 4 180 1650 1440 7380 Spreader 1 h = SPH1\001 4 0 1 50 -1 0 12 1.5708 4 180 2070 1125 6615 Spreader 2 height = SPH2\001 4 0 1 50 -1 0 12 0.0000 4 135 1305 8640 8055 Mast rake = MR\001 4 0 18 50 -1 0 12 0.0000 4 180 1635 9090 4455 Head height = HAD \001 4 0 18 50 -1 0 14 0.0000 4 165 810 9450 3285 Mainsail\001 4 0 18 50 -1 0 12 0.0000 4 180 1575 9630 7065 Tack height = BAD\001 sailcut-1.3.5/doc/en/sailcut-profile-en.sxc0000644000175000007640000003117410510643102020472 0ustar sharkyjerrywebPK§Ѓ$3EМ”mimetypeapplication/vnd.sun.xml.calcPK§Ѓ$3 content.xmlэ]џr9rў?OС№ЎRЖ,’ј§CБ|eЫЛIъМЗWkя–“”ЗjDŽ$fIkHZіў•wШ›фор%O’Ц 9ЬpЈ8‰ЋнЊЕHКбнР7фЫ?}™N:ŸУx1Žfч]мGнN8FЃёьњМћу‡o{ЊћЇWџ№ђп~ёспџњM'ККУГQ4\MУйВ7ŒfKјлљыoо§лEЇл ОŸ‡Гя“f§(О о~xлIпП]Њу пќЅлщІ§ѕGЫQїеЫЊЮAЦйт,­=яо,—ѓГС ‚aЂЛaBhОяЎ?АX~ьnŸДи4_†_–;[›YурђžО“›цЃ8Инйк4€9пДПŠВжЗЗЗ§[šДФZыСЧїяпFё4Шdљ2Я~ЉlŸдnšЮVгЫ0о-IА ЌyY|Оожy:Ÿ3‘‡7AМ{ў’w3BGїЬmƒВ7 ЊСwP™ќѓнЛЛщ‹Ї;;7 2§†ёxО[ђДIwу§УIАXœwѓ8 F‹›0МЋВ–Rцбщчйћ+pьо(NЏ^&s}WвIпЯ‚)ИзыxLpЗsЅ Ў‚щxђu]оэф>:/‡0EŸЈ1~7инё›ёrБщЇ c”0.ёOС Џ’ Gˆ ЇE4:@Щљfq:ЕХO/Ѓyе‡дЎТХЧ­vV˜lRЗkчЛŒ&#нЋ@јtwаВ л@Ыи@n6œIь ˆХыОnb2У^ДZBЊТ_“…]5ŒЃХв;гЦю<щБN\Мџ m02iHV–&И3“ І1c2кт&aэq’Šе LeмюТЙžC@ноb У…­l&r/XŒƒйЖидЛЉMEЮW&v^зnFЬеЇТьhŒ=ŒІѓIјЅrєЌОbќЌОZ‚Š&ЩT†гљMкЄdЮ8œŒУ+їЅRxЯRЙЯ›&C§dќŽуАШpЌ+_ойяuыˆ д^jЏ[˜ѓJЋў/Ѓ} XzаXn ;ѓ дім'‹'˜ŒЏgfќYrц˜[VIMo­bsЦ5ў’›ы]n9 тыёlуНN™~ˆїЫКх€­ЎAМ_ ЖџЭ™c§ўшІП”9КnКшХс< –сшМK‘`VИoŸqtЛЅCCЪ)Œ §m9Ф%)ЋZЊ{gšдю s‡akwZП)„ifufВсЉ%І!@ёйќећ`<Ў–уЋё$|9X—л"˜ž*ћnbжХDЏ:ї‘ЂаaЖ>“Uи[~јŸD†ћЋ8яђЛ‘љ)D$NcзЖ*kСЊtЧt7mЃZЕ„Ž9—EЇˆќnІ:fњsЋV"}ЭюЦ&Їš§nЅVЊн”mkњЈ&+gізѓюМшМўЉ3шА‡кNdN Џ5`žrYM‚ѓю9~ёŸ§oШЇУ2 <П ?тeГьАьk0ъГg`лђМsвI_тчЯЁпьih0Гј4xі,1ї ђќd§ ДsиЇ8х3Ђв…ЕkqЗѕ№XсТ8Тр Ђѓџ§?7Ріћлž~ˆќ•ŸъZЛgЬUHѓѕПwѕŒНxсяJƒ*W?wкGRW‡мъKџ.цdЙЩЋ\У0)џ>§ghоkѓї>>џа p МNњ2A<ƒ‰чПўa N>Ўmlњо= Ш§їПеn BД^œ|„пtž[ŸkrСБЭвч2Ый†У‰свkcGc§ЏЋБŽоL>лСк cф–ФЉN>6'<В9ЩE}УUќ9XЎтцУž№Iќb]tВўћќчПџmyлornМвЉ#вЁš ;Wјв@ žыюзМ7Єы†;Рnqаі>ѕ–еЕЗЭqpэTУЪ,-я9шЩЧХќцьгЩГ^ђJР+l^ОСтгѓŸ“2ђ)­ЃŸN6Еhб8‡š=q яЌЩ6Ež­5Xa{НQ ‡uгŸЩ‹ЄLеWѕ5g*o-ЭЄ#F'Л –щFž'‰юцЭINщ;­EІ5нhН)IпK‡Yhм] ŸЋlф lrxsfѓ61шLЄОG’>dtRЮчTч:rЪ§ #N~›єжхфУ>ыh‘d"9Иiї1С!0љsМ?Х„ДŒMВ>6I?l‚С)в 3$ЌK!№vg˜’О0%K0%=`ЊЯ&\pЄ'”Бќ„@ес`KfА%Н`K32D…’1 ЖДOЖЄ+lсМ…qћq”ЊB-‡eмЃ}Б–˜ц‹žjм6`Љњ€Ѕќ‹QЉAUDЌэ†QѕXЅ|БJ•АJљ`•T)Pнž !НЎнъС”Ъ`JyРэ#$‚э†%ЄАМЁЇSЪІ,уіЃ+]…SкЇ C€jŠ#XInяRЌЗu+]ЌДXX‹Œ+†ДмŽЎH›В3bi_Фв%Фв>ˆЅ˜"QЪ5—ˆZ{/TЖt[к+КœaJ!1DXjљ­pМе=fивЎАeЛ|ыбAЈe*ЬЅІ‚к‡Pж.^%ЪдУ+hъ…Wb*ЅХZРŽ,ЎF€ЪжеЈŒц6PA‰PiІ8fмš ЭАxB”k„JlчŽP ‰УšˆЌlOХO&А2ЦvD(+Аrхj5QИ ЂАDс>DL"ŽЄТжБ>…𖁠з*ьTˆ ЁЈТ”%•}єШ ВВuv,\,ьXšjС‰bА1 mс–>\BТnp {рј-l­ˆд BBb;n;ь‘рvХ-šЗ0m?В"UАEœ` ЭE6bAaЫˆEъ#ёA,C$HPЉЅ•іšG8TvF+т‹VЄ„VФ­4gмž |а{AsTФ Ј0QaХЅ"”Гц§ѕH€Š8•Е9гі,Z…Tдi§JЅ0&Ж*ZXТPг2\бњpE}сJ(Ь –)Ў‹Cх€ѕ-Z-ъZRˆ9’„ˆBj(›HБ*‹fШE=Ыx.ˆK!A„0AшЂя>Jƒ1Кtn[G.V…\Ьi)s;a–нљЁ.Ь*1‹еЧ,ц‰Y!-Иu­dюt"РbОXХJXХМАŠRШ‘Э;ЃЬYRЬ Є8бфe”R"А(8kqсq€s)ћ"М§јŠWЁwZМТ иЈ’НGAMЫXХыcїХ*B1х&ДТHSiCyц•­Д dёdqЏЛA)УTsФ!фДі^uШ№ŠgШХН‹rLЦ`DПбLЗ ТиqрwХ- ЖxћСUИиQŸлЋB~…-#V};ёbБФЂцшЃ”§т‡ ^_6;)Б鉛͏`С3HЊьЋесЎ Ї2b;ё!ЖƒЇЭ™Щч!Hf’іщDXЮЬvnCUћVГИ0л ‡Œ1ѓ§Lё 7СaqТЋњЬvтХl7ъ2Щ(DŠjsfg+ќ w„ОмvRтЖ/nЛdˆq­9ьX”(‹}%›`yT!WЦm'>мvcI Av• QДрКOЙœЩэжЅh?ЦЊ"ЗзsŠpщXч@9R%dечЖ/n{‚аT U8§88яФ*_n;)qл‰З]@ˆyс‰ЄœЌЉŒйN|˜эА.Е†B+Х ­Я?ёi.LєгЙ!tцЖ ћё…іуЋ*n;qсЖƒЮ’hA AvZ`Ь/лЋњмvтХmOР 2 )fхјŠ?DRшЫn'%v;ёbЗs%dШH ЩЖ8XPu8шЪиэФ‡нn\I­І‚`Y№нЇ`9ѓлЅCЗ`б*~;uсЗ•ЅyиЕZќ@9RhбњwъEp7 %0…$ЂШТ‚тіёŠњ’мi‰фNНHюIЬ М”…ГиУAЭhюд‡цn<еMˆ–№?eКрБMФ‡GUд™шnYЖeб*Ђ;u!К'_ЙёЕЈЬJjтКХ АънЉб=,Њ…ЂръЂ|O( 3ЄОLwZbКS/І;#\a„БDidq0вРНKteLwъУt7Я,(ˆСšHPN W…Ј‘g‹ŽКœЙю‹EЕeUqнЉ зн8€Ц\Јцэю„YѕЉюд—ъŽ…€`’БXшNt'Xљнi‰шNНˆю”Q‚ЈВи Pv8”Ъhюд‡цnœTbE8—BsL+xы“y’:н•}м~€UEtЇnDwА˜"”ЌѓјBы§СЊ>бњнБP †•a ЌЁѓNЬђхЙгЯzём 7OЛ#žf[š‘&ЈxUа•ёмЉЯмжDWˆp*0в…cЌFО^т8 Ы™шn?.к~€UEtЇnDwФ‰Vі7ŠаjљьжgКSoІЛФА;+]<Ц’њТЏxхЫuЇ%Ў;ѕтКc )ЁTЬцbс~ Эиюдэnд7ЗDˆA‹qёыЩаFЉ3н][FжэGYUtwъFwGœ+A%ђ(т-“Gi}К;ѕІЛУЅтJ)!§Qдzˆc,_К;-бнЉн) ГA˜2™ЕŸдAMgxSј%ЈЭћЏщ—ѕ'њ2Я~9Л‰УЋѓюњƒяSНХІ"]r‹БљщјMйт&К=я†`бІ(.W љy7šН‹‚QЩ$;WYЅiХСbЭѕУ;›чpљЋгMЩ‰Пdў™f”„yр_пWMњS` И сЖ[г№q#џ2ˆЏУeкЂXoАир„9я* 8ˆЎЎЦУ№ь2}Н{7ІЋi8ƒй‰fKјћъџPKЦA љл­PK§Ѓ$3 styles.xmlнYыnл6ўПЇадЁhЪ’ІгиСкДи€Д rЖŸДDЩD%R Љ8щЯ=ЯžjOВCR”%ыт,NЛvm‘B<Ях;‡‡GЪбёM–:з˜ ТшЬзС4dЁЩЬНК|чИЧѓŽ~<љјцђГЗ‹cтУˆ…E†Љє„МMБpЮЎ^ŸўњЦq=cњQЃFŒ'Оryт˜ч“r“f|џэзqКQ$#w~дЃ<ЄтаgюRЪќаїXak+“ |ѓь–єюAМFXИФ7r­-Жшж 8Z ЂЗј˜Uшеj5Zэiфx:њП_œњяЯPхЫMJшЇ^М–Z(-ВцУž ‰МˆыЄKЙ!№Кr9\">ЬŸFЌй‹Ж0ВY0Ль №РB§у§щš>ž *W€*О“|иsqmэ7NKUЕ1ƒŠp˜Šљ‘&pНт˜gŠ2Ј™Ÿ9Aщиubf1ЪHz[ЎЛNmkNdq_#Јbђ‡П&RHŽQцМQLcоЖёхLМjЭђУиў sф\ *:Bм4_awwр-Y†к&Эњ3чДI„иzцkfЅfо t"œ+J  bч§ХюЮ•Љнžq#ёL1'сЬ+"ФчeЗДмЫCПуˆ”KІХл "Ѓ"-ПUZzЉЊт4u-<чpZЙ$pGи§!ЩPъх) Б˜Й“†gУ”Єˆ&JЉ^YA%ЫW-5бОК7`Ћаb)ЃиЪJн]ЂЕeyŠoжХНЁЗ’wiю‡Р-ЫНˆ‰ЈКNЧЃЩЫ0гYъШС]“p”/I(њгRьСѕБ•ЇЃ YЪр’МР}еxI2иўЏœsоЁЙТ VbeJЯ*ђ‰ъщїЭМmу5БRkХ“чJљ—-„Еб аiіuЃŽ‡ ЩDŽT‘3fЅљВr /h( $с2єV †v@”ЖЪBБЗ€уу VО­8‘0яxДи™›ƒ—Uѕиы’\T_•šСІœoUj§‡РнЈZ5ч ЛБн)Ÿ2B=B%N@cD8щP3њ tXЋt„ч0@пv91Ю†)%з,Nе|ЉOH‡ълlСRыgГ|-ЖVТѓŸ*—7TєDобF9Бв„Г"з/кёUMVюJж`ЮZНF\нXХ1Œmr 4Є zюUюшЧя˜V{†ђъ0гˆH=“^ЃДРOž>NфЋYUk(Яг’dЏQ‹ЛІшХ.ѕќЅиЉ'йЙgЮcоЮљЛswўїŸѕg}7*ПNЕџяHГ№тNgЁџzяqСl’ПЗ…ќоЋЧnЛub.ЩMЯj“ДпПљ‹сНv@МњVу5эv—­[ЬЧ"QJТЦиQаs59Јi‚&)ю–к!r=PЎчЛ&Щ^щЁ>ЂкdЛ…-№ф^7ЩZЇОжm‡ИўЃHўypВЭ$—’ŽC[еWњŒЇ$ž`Wc^LnZCђ‹rHюЪкn|—AяЕeЌ;ъˆpšЪ*bЮЄ™U‘*Ћ™; кЮњяЅхЃš…3иzЭV5ЙzРk#Ж<їП5‡п”{rБ.Ž%Жy›ъцА,F/їЧ№њІзO@”тX š‹М„7WLBXJЫdПёихDܘќZŽСјпсUгП•эI™|IQ’у‘њlŒ‚ƒƒ0sKIф< єШQdОиd|`ЗЁ№“КЈid›хЃ0P+jИ‰<јЪѕ-ХЗУЪіЂє{{H)0РЮR.*MCwzЭ’зn=&eѓ#еыѓђБФи|X˜љ›‹хJО‘јГ gЏ;"`„ЮЃT4>I2YГ~ІB)”зf†™­НкZЫЋЊСљ  ~‹ЦmЬžуœёAb'-bЫ‹'ъZQўќKЎ''‰LыѓќДХCУRcIŸ™ ы0‡ро‘ фщIЮ‰ЈюмŸVw•NгЙџЌžПдяѓщД4k_ЈюќюƒюwџОsўPKBCЖц"”PK§Ѓ$3Object 6/content.xmlэ]m“лЖўо_ЁЊž~Ш„о_мЛЫ$qœІc'™кži?ђHžŽ5%jHъЮ—_пAŠєт;Чˆ’Vч‰nД `ХГЯ.@офтЋЫbr—Uu^Ў.Їx†І“l•”iОZ\NпН}ЉщWWКјѓ‹ŸО}ћяŸП›”77y’=OЫdГЬVM””Ћ~O~~їЭЋОLЃљќЇuЖњЉm6+ЋХ|ўтэ‹‰§ўЂы5;ѓљw?N'S;о,mвщеХЁСaŽЋњЙе^No›f§|>/СL9˜!ЁЙ§>э:дЭCqМ}лЂoоdšЃ­Mƒmујњ#cЗ-њцiпmm€Яћі7хЖѕ§§§ьžЖ-БжzўЏ7Џц/ЫjoчђЁШWяЖoЕ}геfyUЧg7Бу—њnБopыРЛэ”“лИ:юПЖХрš~Ф#4эУbo,PЭ_ƒВ§x§jp_Е<:ИiА]_Rхыу3ЗMІ=њ“"ЎыЫiЗžNшбЫёІ)aіyЕ>­Џ.ьt;aЅ“іѓљ*^Є~„Дпoтe^<\NЭŽи†SЏћЄћЖЬWQБВ€г|‘70;<_]ЬїX{Ф0OŸDš%љ2.Ђu'L€N?qzж№юД’[ьЯЪnAпe]СцUMžеO0DUО‡ŽЋrhnE7yQЏ%С_nкŸv"#›Ч&@ž6cэrZ—EžюГŸjѓo:Й)БРw§ _Wy\l- šh‘­В*O`ШћМЎыМI FюbшлO?hџSW3ŒЬU˜ -ЉAѓюјqЧ€рПЦыВўлзЋ4М‰WѕфнVіхФў~§fђ}ймц‰+ўћїxђCŠo(zБ§6Вѓѓ>CЧцжzoђn•CЫ&ЏпИкW›$OуЎЇmг7xпBЌюzЕwЫрлQ уоОСуœœ”Ыu‘}ИœZ{_Nь”j˜бžI>fm{ІМ5rxвл&{І§„ ‰Vc”ЩћhГNЫћUtWР7qQУЧњћМЙюЪbcŒ8њцЖЪ2 Ј пЦ…ЇOГlэ‰ BjЊЭ`eн бVђАМ.aАˆі’;3яdЧ@л1кдY:ъ ЅЪ*KšН ‚…uЙЉLљ’˜E­ъ^ЛЬтUtYU•UДŒЋEОВтЂМО,ђeоьш6ыѕA] —еCЯ‰cєJ кŠйЈ[•-ЊЌ6ŽŽš‡uціksB_gEддЖЖrїiаіЎЗњ'`эЧ^'RVДM­a™ц‰јСЮШ‡\ˆ„x_УчРU9lvѕБFхІ1ЦЈ+Ъ„csЛ4юіE% Ўˆєa ЗшКЪтїоX­ытЊŠW‹Ь”Ыђš>DцїФyЗЅЊэ Y!Э+@j[ЊM5uSe—Ћ ЎыD‰Љ)ОPВtФ}k™§&9LЯј9mH[§њЛЫTvІO ўD‚0…яc)bŒПC”Uюf‚EМюƒЃ­tЫ!шiдтІИ3ЗœЙхЬ-ЧЙeчˆќБТwЇР<з~~эЗfˆуƒ!D’t4c˜ЕНD ЃЮR˜Юуй*нЏwч~nnЮ‡ѓџ&њП<œЫ3G}~ŽzdQs„ЗДІTˆЃМEЄ>Ъ[cНЧ[vь3oyыЫ[ъЬ[ПGоъd!xЫ<Š1Ем™ЗЮМѕ‡х-}ц­п#oб4ЛІiоJ’і!ђ™ЗЮМѕЧх-МѓвЩ'НYqф]‡L˜cMОjqЎ€}нm–/nЋ|Ъb>ѓk"К§йСќр;>тКLЎ.КФцГхІўЮžЭЄd=aѕKе3ЮZыzй7ЬE§№||x^aоˆщ K:‰WЙНЏЬ№ж€“™DДЗ Ђ3eяСій fщVБ.Ъ&ŠЋ,ол’Xћжлѓ$їЕЂ8MMТИœОЙЭВЯž}ћ ѓчГg/ŸQсPП}>нЦЕЭаЅ*яЗ1ЬИ]V\VлTж-иYубjаŒrйянgŠпнjІ5aПОјC^ЛЎя3d?Лжu­Ђћ=ЦЖ.Њ6€Л†бр,6ѕ эЌГФр)@т™ ‰yЬЙокъf1Я–ї,~эъ!Эыж#йФL`>XВпCXB3Э™,йяA,Œё™qDЄ œ3ЮЉ&#їљЊ'ыГEY8Ÿa‚9Bak­лг„DN‘f˜!AЦXђTaь3„ )С ellпS‚6kdˆ %5bь\еЉ`$ž#:гk‰щqƒ0аfSЉa|4†љXт’*ХЈr­в@ўEH(бC‰R8^vUЇ–QŒjŠ#XIюдXfГ‰ŒqХ–‚Л|цЉТиWLŒ(хšУAэ{Њ@оœaJ!_",uмяЊN;Њ~РRSAнТЁ“…йjШŠ˜ЪqhВ@еS3юXьeЁМŠ…DŒaMp•ы\Gu*8…‰#<Ђ`q$vЊ2OfЃBQ…)kЉЪI\О.д4е hB1ˆ!ЁФЙЊPў‡аE l0 Kтn€Ѓ:№‚А ЌЭE.цza›€)‚TaвЩзcq(Сy•ЛfЧв`VaХЅ"”3ЯЯcеЉ u<7њ6KЅ0&B‡z;эhBL(Ь –)Ў§ јЪ@€“Bu $ ^uUСvЇ9)œДПŽюTр sаF3L‚s–мЩYФiСГз 0J!7#їNЎ“…ђ+бFgJ{нХzКSA*ЃРQ №ЂНžrcЩб„‚Ё˜rУVŽђвE™Ћ tж”p ХTsФ4Л3OЬџ˜ Œaz|дѕ5Ї‚]('fiЪK`Н0иЈ)Ivђі 1иCIЩ=‚ вP&PšZИš9еџŽюTр ѓ4v”3†8ŸТG˜Ѓ eIF1ё˜ЯiЎ. р$CPћkСD‰rюЯщВВP­!f­ƒ’`ќРvђT  scўŒ’hA Anё5Сi‚)L0лх3Wn\I СЙ’ьмЃyЊ`ўџ"ЉŠ иоИЪ†y&`^ќ–цбБ‡ЛN rSHў]к 4$1ƒСНKЄС6ŸK„ €АЂ,T”ЩEDвsp9B§€еFXЫ™DьЛД{‡ЌvєвУG)+€ї_јѕЫ›eY g|9Pз“М"\вNNвg`„уУmE 8q;IŸ>ёOљHЗmkЖЖ"gѓљіпXsQЦЃ—ЎШйяC^m”ЪгNbпфR7й=q`3ZNŽБ˜ЮOзDlђ$›Œ‘WгтСC=o =Kї |ю7ЭџPKЛYLPK§Ѓ$3/Ф‹meta.xml OpenOffice.org 1.1.4 (Linux)2004-02-29T17:21:282005-09-04T22:31:592004-02-29T19:50:47en-US15PT6H26M29SPK§Ѓ$3 settings.xmlэ™[wЂ:€пЯЏ№№z–EщдЛ:ЮBМіjmы[€T2 + ЂўњD{Z*­E|8ГкЇ†$пойIі%ž§šћИ4ƒŒ#J~*еЃŠR‚ФЁ."гŸЪШъ”(П§нК1Ќ‡AЛD‘O]ъ„>$ЂЬЁr,/ FЭЫОQRЪЊz@rГwDйTU[VЋ”Д[ыi%)HUлзJII€GЎp•ЦY&]jIјiв§Sё„NU•J9є?9ZЅRQ“ЖВž0Чˆ<=Ђш(:^­жыuuеЛъPђˆІяАЋj2Dйир•еžuпЈм8K†ЏСe$ ЏЇДўL€/W2C0z^ЅВmЮыёcФ‘ЁЮ Аh l:Х"ˆЅQ9SпB>О„т0ф;ф oКzR;йпƒhъmU]ЋTwц—}”qсКiY0кОKЋ9ђФВХ.УЈяІдф‚Щ# 4тЮъЇ4Ё)=- -ђ‘ЂЏЇ =Eu‡h„ŒS6  yјяЗYЛ–o'_“Жž-КGZR"‰+ъТД§=Ъі8у фŠžв~cЁ"яшK§РзfpE7™f˜'чцnє-иomАf–Sй“[ЌџоP›TъМхуKg–еНђ:ЛnќЪe8МФёь}1F1ЖЫ 1кїœ–Pъ[’Sш•ŽЁc€У45ёr•М‡La@оЅзrТ‡bMiŸ ЦЉKŠoSŠ! Jу`ѓ‹™@FWњѓ,‚…{№ЏЉ8КЫP:Д@ŽЉХ”Ѕа˜ЦWЈЊеŽ5э$gи}ЕЏАJpЉzш“F=\™5DШЪ‘HOszŸп„B pИ№mŠљІB!B†50НбEмЌмчыŒљ`LШх~gf‡емž8ЯHїУCлE3Ф3е/О]љМG'СыsФ‡ тxŒД„9QЮl`]-m ЫлнŠсЄ2oюgЊтЏ˜ё‡ХŒKDžF Ь.ІŽПТбW8њ Gt8њH’ jь„XКŠтёYЂЪu\ЫFFѕ NЩ^pyyУєC€ 8Ќ}k"иBi€ЈїЊ#GЋ‡њџряЖ:О-ьєЎgієнЁwК~ЅѓлЄЁЊ?:zg2’џ>йђлаЏ#ГлЉ< ѕЙAš pwR™мїы“ћцвжО]иЧчСD~{И7йЎКѕ…л;їР§эХƒVРнx9АкŽvэйнQ§Ъв#УЏzŽяЖoz€Œ—nЗŠmr[П2ЂшВЅѓ+=јmkѓ™у›R“Ќ~EЪ^кнБ6Й‹ъ/ћ]џžX•ШРЭ[Г-зJL лІчvлЃn‡LЦзєG5Ћ;ЎИнёBoуащ+#9пm–лэ„“ng1‘ Юyќƒ/FВ ˆуŸ§єнЁЬFЎ ‰с‡Э}Т/™†рэkрцnхМX cљдб0ч)`t ]Sеч7с™зdЌvB›ИяЮп7wџаЎ›7Ј0ШуАQјУXŸ_@Ft.m=‰#BАх)Кw&0ƒуфМb`Ъ‘$9l‡Qп‚~№^кCˆŽБЬЦуhrNmтb ПUсІОљ]SЭњ•Жё/PKmp}vЫNPK§Ѓ$3META-INF/manifest.xmlЕ”СjУ0 †я{ OїDэc”Є…Е ЖЅ‡єАЃч(­‡у„X-ЭлЯƒ%ЌeДЄ7ЩHп/§GГCaФžjЇKУ8 ЋЪLлM ыє)x€йє&К]$ѓє}Е…Д:'Ч“6ЋѕуЫѓ\@€˜Td“<зŠТВо .в…xmы<qљкЇ0у <ќ/гe]—ЦАeЎ&ˆЅч—=џn4c[фAЂ'хкP@–ыцзФ”ipSQ ВЊŒV’§жИЗYшv6єЂЁ’FAп’яŒ *Щл№,…у”•VМЋЩKc:0њSUiй7o0(зqcШ]€=ŽK>>IБИЧыИасЏeG'pБ/'Яn+kўGtаU b9ќЙГџ7:c"ь!?Сє PKL•Ъ’!qPK§Ѓ$3EМ”mimetypePK§Ѓ$3ЦA љл­ Bcontent.xmlPK§Ѓ$3BCЖц"” Vstyles.xmlPK§Ѓ$3/еwvЅ
The Sailcut CAD Handbook Robert LainУЉ Jeremy LainУЉ Sailcut CAD 1.3.5 - 19 October 2010 Introduction About Sailcut CAD Sailcut is a software for designing boat sails and developing then into flat panels. Sails can be either 4 sided sails like for old timer gaff rig or 3 sided sails like jibs or main sails for Marconi rig. The first version of Sailcut was developed in 1978 and used by Robert LainУЉ for making the sails of his IOR 1/4 ton named "Flying Sheep III". Sailcut has been available on the web since 1994 and is used by many professional and amateur sail makers for offshore racing, cruising and recently for model yacht. Sailcut uses a unique mathematical definition of the surface of the sail which ensure that the sail profile is smooth and aerodynamic. How to obtain Sailcut CAD? You can download the latest version of Sailcut CAD from the project's home page at . Sailcut CAD is made available both in binary (compiled for you) and in source code form. Technical information on the code Sailcut CAD is written with portability in mind. As such it is written in C++ and uses the Qt library from Trolltech for the graphical user interface. Sailcut CAD uses OpenGL to display the 3D view of the sail. Sailcut CAD is known to compile and run on GNU/Linux, Microsoft Windows and MacOS/X. Using Sailcut CAD Upgrade notes As of release 0.6.5, Sailcut CAD uses different extensions for each file type instead of ending all files with ".xml". If you wish to open sails created with a previous version of Sailcut CAD you should rename your sail definition file so that it ends with ".saildef". When opening the resulting old file, all dimensions data except for the mould will be preserved. Redefine your sail mould, then save the file. User preferences Preferences file Your preferences are stored in a file called .sailcutrc. On UNIX-like platforms, this file is located in your HOME directory. On Windows this file is located in your Documents and Settings\USER directory. Internationalisation As of release 0.5.5, Sailcut CAD has support for internationalisation. Translations of the user interface in various languages are currently provided. On startup, Sailcut selects the language corresponding to your locale. You can use the Language submenu of the View menu to switch to another language. Creating a sail When you start Sailcut CAD, you are presented with a default sail. At the top of the window you will find a number of roll down menus. The File menu is used for loading an existing sail, saving the parameters of the sail and Export the developed panels. You can modify the dimensions of the sail by using the Dimensions entry of the View menu. You can modify the profile of the sail through the Mould entry of the View menu. You can display several sails on the same rig through the Rig entry of the View menu. Dimensions dialog screen You can access the sail dimensions dialog from the Dimensions entry of the View menu. The program is tailored to design either triangular or quadrangular boat sails. A classical triangular sail is essentially a quadrangular sail with a very small top edge. The surface of the sail is generated from a single set of equations defining the profile of the sail at all levels. The profiles rest on the edges of the sails which are defined by their length and the amount of round (also called roach) in each side and the twist of the sail. The Definition window is divided into a number of boxes which group the parameters defining the sail. You can use the Compute button to compute and display ancillary data like IRC width. This can result in some text box color being changed. Red color indicate that the value exceed the upper limit and yellow indicate that it is below the lower limit. The value itself will be changed to the acceptable limit. When you have finished entering the dimensions, press OK to display the sail in 3D. Rig geometry The first step is to select the type of sail you are going to work on, then enter the data defining the correspУДnding rig geometry and sail plan such that the sail will have the proper orientation. Select the type of sail by pressing the corresponding Radio Button: Jib for any sail which will be set on a stay, Mainsail for any sail set on a mast, Wing for any type of kite symetrical about the foot. The rig data are used for displaying the sails in their proper relative position with the rig.
Sailcut plan definition
Sail identifier You enter there a text describing the sail you are working on (maximum 40 characters spaces included). Sail dimensions This is where the dimensions of the sail are entered. On a main sail the minimum value for the gaff length (headboard) is constrained to 5 mm. Value smaller than that will default back to 5 mm. The gaff angle is constrained to 90 degrees maximum between the gaff and the luff. Positive round (roach) of the luff, foot, leech and gaff extend the sail outside of the straight edge line. Negative round is equivalent to hollowing that edge of the sail. The position of the round or roach is expressed in percentage of the side length starting from the lower or most leftward end of that edge.
Sailcut edges definition
Dimensions and angles defining the sail plan are expressed in millimetre and degrees. Length of the sail sides and diagonal are the 3D straight line distance between the corners of the sail. The actual length on the finished sail lais on the floor can be slightly longer depending on the shape of the sail. For example, the foot length entered in the screen below is 3600 mm. If the foot camber is null then that will be the actual distance between clew and tack (straight foot) of the finished sail. If a 10% camber is entered for the foot depth, then the actual foot will be the length of the arc which has 10% camber, that is 2.7% longer than the straight line foot length. Having entered the sail main dimensions you can press on the Compute button to obtain additional informations on the sail, like the X-Y coordinates of the corners of the sail, the perpendicular length LP measured from the clew to the luff as well as IRC racing rules width. The X-Y coordinates of the sail corners are usefull to quickly adjust the data entered. For example if you find that the clew height (Y) is way below or above the height of the tack when you would like it to be leveled, then you can substract or add the difference to the leech length.
Layout Click on the radio button corresponding to the desired layout of the sail. The layout of the panels does not affect the shape of the sail which is defined by its dimensions and its mould. Except for the Radial cut layout, the number of panels is determined by the cloth width and seam width entered in the Cloth box. The most commonly used layout is the Crosscut. The panels are laid perpendicular to the straight line joining the peak to the clew of the sail. The Twist foot layout is similar to the cross cut except that the lower panels are rotated such that they do not intersect the foot of the sail. The Horizontal cut layout lay the seams in the horizontal plane. This option can be used to visualise the profile of the sail at various levels and to output files with the 3D coordinates of the sails for use by CFD tools. The Vertical cut layout places the panels parrallel to the straight line joining the peak to the clew of the sail. This is the favorite layout for the old timer's main sail. The Mitre cut layout is the favorite for the old timer's genoa. The sail is divided in two parts by a line joining the clew to the mid point on the luff and the panels organised to be perpendicular to the foot in the lower part of the sail and perpendicular to the leech in its upper part. The Radial cut is used mostly for competition as the cloth is mostly aligned with the directions of maximum strain. When using the Radial cut option it is important to understand the definition of the number of sections, number of radial gores and number of luff gores (see ).
Radial cut gores definition
Sail shape You enter there the depth of the sail at 3 levels, near the foot, in the middle of the sail(the exact position being defined in the mould screen) and near the top of the sail. The twist angle is the angle expressed in degrees by which the top of the sail is rotated with respect to the foot. The twist is globally determined by the amount by which the apparent wind at the top of the mast is rotated with respect to the apparent wind at deck level. For a jib the twist is sometime driven by the need to have the upper part of the leech sufficiently open to clear the spreaders. For a mainsail the twist is also driven by the ability of the rig to carry the tension in the leech, in particular a gaff rig will have more twist in its main sail than a Bermuda rig. It is important that the twist angle entered in Sailcut reflects the reality of the shape of the leech when sailing in an average wind. The sheeting angle value is the actual sheeting angle measured from the boat centerline when the sail is set on the boat. For a jib the minimum value is 5 degrees. The value is of importance to ensure that the sail is properly positioned when displayed in the rig viewer. You can then visualise for example the slot between a jib and the main sail as set on the boat. Cloth Enter there the width of cloth used, the width of the seams between adjacent panels, the width of material to be added to the leech to make the leech hem and the width of material for the foot hem and for other edges hems. describes the location of the various hems and seam width. Sailcut will compute the panels such that they fit within the declared cloth width including the seam and hems width as appropriate, except for a radial cut sail for which the width of each panels is computed from the number of radial panels entered. Note that when using the radial layout, the seam width between horizontal sections will be twice the width of the seams between adjacent panels of the same section.
Sailcut seams and hems definition
Mould dialog screen You can access the mould dialog from the Mould entry of the View menu. The depth and the shape of the sail can be entered at three levels located at the bottom (foot) the middle (sail's maximum depth height can be adjusted) and at the top of the sail. The position of the point of maximum depth of a profile is shown under the depth value. This position which depend of the luff and leech shape factors is expressed in relation to the cord of the profile. For exemple: 0.34 means that the point of maximum depth is at 34% of the local cord counting from the luff end of the profile. The luff shape and the leech shape can be adjusted for the Top profile and Middle profile only. The foot profile is always an arc of circle. Under the luff shape factor, the corresponding value of the angle of entry of the profile is provided in degree. The angle under the leech shape factor is the exit angle of the profile. These angles are refered to the local cord and if you want to know for exemple the real entry angle of a profile with respect to the axis of the boat you have to add to the entry angle the twist at the level of the profile plus the sheeting angle. The vertical position of the sail's maximum depth profile is controled by the vertical slide bar to the right of the left vertical frame. In order to avoid that the leech makes a hook in the upper part of the sail when the wind increases, it is recommended that the Top profile luff shape value be higher than that of the middle profile and that the leech shape value at the top be lower than the middle value. View controls It is possible to zoom, pan and rotate the sail in the view window: Rotation : you can control the rotation that is applied to the sail by using the elevation and azimuth sliders located at the edges of the graphic pane. Pan : click on a point with the left mouse to center the view on that point. Zoom : to zoom in press CTRL + and to zoom out press CTRL -. You can also use the zoom buttons in the view controls or your mouse wheel to zoom in and out. Sail panels development The developed sail is display by clicking on the Development tab from Sailcut CAD's main window. This presents you with a view of the developed (flat) panels of the sail. The view controls are the same as those of the main window. The blue line represents the edge of the finished panel (draw line) and the red line represents the outer edge taking into account the seam and hems width allowance (cut line). You can export the points which define the edges of the developed panels with the draw line and the cut line to the following file formats from the Export development submenu of the File menu: Carlson Design plotter (.sp4) using the to Carlson plotter menu entry. DXF file using the to DXF menu entry. All the panels will be placed in a single file with one panel per layer. Multiple DXF files using the to DXF (split) menu entry. Each panel will be placed in a separate file on layer 1. The name of the file is the base name entered completed with the number of the panel (0,1,2,...). XML dump of the points using to XML sail menu entry (see for file format details). plain ASCII text dump of the points using the to TXT sail menu entry (see for file format details). Loading and saving sails Once you have customised your sail, you can save it to a file by using the Save or Save As entries in the File. You can reload it by using the Open entry of the File next time you want to work on it. Both the sail's dimensions and the parameters of the mould are saved simultanously. This feature allows you to reload a sail and reuse its mould even if you change the dimensions of the sail to fit a new rig. Sailcut CAD uses XML files to store the sail data. These files are plain text so they can easily be viewed using your favourite text editor. Exporting 3D sails In addition to Sailcut CAD's native file format, it is possible to export all the 3D points located on the edges and seams of the panels that make up a sail. You can export the three dimensional sail to the following file formats from the Export 3D sail submenu of the File menu: DXF file using the to DXF menu entry. All the panels will be placed in a single file with one panel per layer. Multiple DXF files using the to DXF (split) menu entry. Each panel will be placed in a separate file on layer 1. The name of the file is the base name entered completed with the number of the panel. XML dump of the points using the to XML sail menu entry (see for file format details). Plain ASCII text dump of the points using the to TXT sail menu entry (see for file format details). SVG (Scalable Vector Graphics) file using the to SVG menu entry. Printing data and drawings The Print submenu of the File menu offers various printout possibilities: The data menu entry will print the data of the sail. The drawing menu entry will print a drawing of the complete sail. A dialog box allows to preview the printout with a spin box to adjust the scale factor. The scale factor is the factor by which the sail size is multiplied to obtain the drawing size. The scale factor can be as small as 0.001 (1000 mm sail will be printed as 1mm), the default value is such that the sail fits in 80% of the paper size. The develop menu entry will print all the developed panels with key points coordinates (1 panel per page). A dialog box allows to preview the printout with a spin box to adjust the scale factor as for the complete sail. The layout of the paper is set to landscape. The definition of the developed panel key points coordinates is given in . The X,Y coordinates are absolute coordinates referenced to the lower left corner of the box enveloping the contour of the CUT line of the panel (edge of cloth). The dX,dY coordinates are relative to the straight line joining the end of the corresponding edge and it should be remembered that the origin of dX is at the left end of the edge and positive value of dY indicate that the point is left of the straight line joining the origin to the end points of the edge. The printout scaling is such that the sail drawing and the largest developed panel automatically fit in one page. For printing panels to a precise scale it is preferable to export the developed sail in a DXF file and use a CAD package to print the panels.
Developed panels drawing
Creating a rig This module allow the design of a mast with up to 3 levels of spreaders. It is accessed via the Rig entry of the main screen's File New menu. The Dimensions entry of the View menu will display the screen from which you can enter and modify the dimensions of the rig. The definition of the various dimensions is given in . Please note that, in order to allow the design of sails independently from the design of the rig, the definition of the mast rake and mast curve are refered to the full mast length which are different from that of the sail luff rake and curve of the sail design module which are refered to the sail luff length. This rig module provides the data to be used when designing the mainsail which fit on the rig.
Sailcut Rig definition
Saving and Loading a rig file The Save entry of the File menu is used to save a rig. Any Rig which has been saved can be later opened as an entity with the Open entry of the File menu and can be used as an element to constitute a boat. View controls The controls of the viewer are identical to those of the sail viewer. You can rotate the rig with the sliders located around the graphic display, zoom with the mouse's wheel, pan with the mouse left click, view in wireframe or shaded surface modes. Rig dimensions The Dimensions entry of the View menu display the rig dimension screen which is divided in boxes corresponding to the entities listed below. Note that angles are expressed in degrees and linear dimensions in millimetres. Rig ID A free text identifying or describing the rig can be entered in this box. The number of characteres is limited to 40. Fore triangle The height = I and base = J of the fore triangle are entered in the corresponding fields. Note that the dimensions are measured in the vertical and horizontal directions. In particular be carefull when measuring the J dimension when the mast is inclined. Mast The mast is assumed to have a constant section from foot to tip. The heights are refered to the stem fitting horizontal plane. Mast height = MH is the straight line height of the mast top above the stem. It shall be greater than J. Mast round = MRnd is the maximum deviation from the straight line. Mast round position = MRndPos spin box is used to enter the relative height of the point at which the mast round is measured. It is expressed in percentage of the mast height. Mast rake = MRkM is the horizontal distance between the tip of the mast and its foot. Sailcut CAD will compute and display the corresponding mast rake angle = MRkD. Mast cord = MC is the fore-aft width of the mast section. Mast width = MW is the transverse width of the mast section. Mainsail See below the chapter about mainsail luff curve. Shrouds Cap shrouds height = CSH is the height of the point of attachment of the outer shroud to the mast. Cap shrouds base width = CSB is the base width of the outer shroud measured from the central line. Lower shrouds base width = LSB is the base width of the lower (inner) shroud which shall be smaller or equal to the cap shroud base width. Spreaders Number of spreaders = SPNB can be from 0 (none) to maximum 3. If only no spreader is present, the outer shroud will be identical to the lower shroud. Spreaders height SPH are entered in ascending order with 1 being the lowest. Spreaders length SPW are measured from the ecentral line. Checking and validating data Use the Check button any time after entering new data to perform a verification that the data entered are consistant with a reasonable rig design and the ancillary data are computed. In case of inconsistancy between data, the color of the fonts will tell you which data is suspicious. Red indicate a too high value, purple a too low value and blue signals which related parameter is to be checked. Once you have entered all necessary data, click on the OK button to close the rig dimensions window and display it. If there is an incompatibility in the data, the dimensions window will not close until it is corrected. Mainsail luff curve In most case users have designed sails independently from the design of a rig. However the user may wish to design a sail compatible with a rig. In the rig dimensions screen, the box labeled Mainsail is used to compute the mainsail tack position and luff curve which will fit the rig. These data can be used for creating the corresponding mainsail or to verify that a mainsail luff curve will fit the rig. The only data to be entered are the mainsail tack height = BAD and head height = HAD. Sailcut CAD will compute the other data.
Creating a hull Please note that this module is not yet fully operational, for the time being a single chine hull ouline will appear whatever the number of chine is entered. This module allow the design of a hard chines hull. It is accessed via the Hull entry of the main screen's File New menu. View controls The controls of the viewer are identical to those of the sail viewer. You can rotate the hull with the sliders located around the graphic display, zoom with the mouse's wheel, pan with the mouse left click, view in wireframe or shaded surface modes. Saving and Loading a hull file The Save entry of the File menu is used to save a hull. Any hull which has been saved can be later opened as an entity with the Open entry of the File menu and can be used as an element to constitute a boat. Hull dimensions You can modify the dimensions of the hull by using tab Deck and bottom of the screen Dimensions entry of the View menu. The deck and bottom screen is divided in boxes in which the various dimensions of the hull are entered. The hull is constructed upward from the bottom planks. The most important line is the chine which defines the outer edge of the bottom planks. The height are refered to any arbitrary horizontal datum plane located conveniently near the bottom of the hull. Angles are measured in degrees from the same horizontal datum plane. Hull ID A free text identifying or describing the hull being designed can be entered in this box. Deck Forward height Aft height Bottom Length Stem angle Transom angle Forward height Chine angle Aft height Max width Max width position Aft width Forward shape Aft shape Dead rise angle Bottom sweep angle Planking Number of planks Automatic planking Top plank angle lower plank angle Checking and validating data Use the Check button any time after entering new data to perform a verification that the data entered are consistant with a reasonable hull design and the ancillary data are computed. In case of inconsistancy between data, the color of the fonts will tell you which data is suspicious. Red indicate a too high value, purple a too low value and blue signals which related parameter is to be checked. Once you have entered all necessary data, click on the OK button to close the hull dimensions window and display it. If there is an incompatibility in the data, the dimensions window will not close until it is corrected. Planks adjustment Individual side planks can be ajusted by using the tab Planks of the screen Dimensions entry of the View menu. The planks screen is divided in boxes in which the various dimensions of the hull are entered. Forward height Aft height Plank angle Sweep angle Chine angle Checking and validating data Use the Check button any time after entering new data to perform a verification that the data entered are consistant with a reasonable hull design and the ancillary data are computed. In case of inconsistancy between data, the color of the fonts will tell you which data is suspicious. Red indicate a too high value, purple a too low value and blue signals which related parameter is to be checked. Once you have entered all necessary data, click on the OK button to close the hull dimensions window and display it. If there is an incompatibility in the data, the dimensions window will not close until it is corrected. Creating a boat This boat design module allows you to assemble hull, rig and sails files created earlier and make a virtual boat. It is accessed via the Boat entry of the main screen's File New menu. View controls The controls of the viewer are identical to those of the sail viewer. You can rotate the hull with the sliders located around the graphic display, zoom with the mouse's wheel, pan with the mouse left click, view in wireframe or shaded surface modes. Adding and removing boat elements The boat viewer is initially showing a black screen and files are added via the Add entry of the main screen's File menu. A new tab will appear with the details of the file selected and the element identification which was given at the time of creating the element (sail ID, Rig ID, Hull ID). A boat element can be removed by selecting the corresponding tab and then clicking on the Remove button. Saving and loading a boat file The Save entry of the File menu is used to save the file of a boat with any combination of hull rig and sails. The file of a boat can be opened as an entity with the Open entry of the File menu. Shifting boat elements All boat elements will be displayed in the position entered at the time the element was created. Please remember that the point of coordinate X=0, Y=0, Z=0 is located at the forward end of the deck of the hull (stem). The boat elements can be individually shifted in X, Y or Z direction by adjusting the corresponding offset in the element spinbox, then clicking on the Update button. At any time, clicking on the Reload button will restore the corresponding element to its initial position. Sails surface formulation in Sailcut This section is a translation of the paper presented by Robert LainУЉ to the second Workshop Science Voile IRENAV in Brest, France, on 21 May 2004. History Sailcut software was initially written in 1978 in Basic language on a computer with 1.6 KB of memory, one line text screen and a small 32 columns text printer. Hence the necessity to keep the surface formulation simple for designing the sails which I built and used on my IOR ТМton. This short cycle: "design => manufacturing => utilisation => modification", without commercial constraints linked to sailmakers work habits has allowed me to converge quickly on a compact and robust way of describing the sail surface. The method is valid for classical triangular sails and also for quadrangular sails used on old timers and modern rigs with very large headboard. Later on, the use of Sailcut by professional sailmakers has necessitated the addition of graphic interface to the kernel of Sailcut, but that is an other story... Since 1993 the Microsoft Visual Basic version of Sailcut is available at and since 2003, the source code of Sailcut re-written in C++ is available at . For protection of the intellectual rights, the name Sailcut is a registered trademark, but the author maintains free and unrestricted access to Sailcut. Of the complexity of the definition of the surface of a sail A sail is a complex surface which sailmakers have historically defined by notions like depth at various height and position of the point of maximum depth along the local cord of the profile. This method of defining the surface of the sail by control points allows for an easy comparison of the shape between the intended design and reality. Unfortunately a large number of different surfaces can pass through these few control points. Then notions like the slope at the leading edge and trailing edge of the profiles were introduced to help sailmaker get a better control of the shape of the sail profile. Using interpolation between basic control points, with or without constraints on the tangents at the extremities of the profiles, to determine the depth of the sail in all points were too demanding for old days personal computer processing capability. From the beginning of my racing activities, I was interested in the aerodynamic of sails. The books Theory of wings sections by Ira H. Abbott and Albert E. von Doenhoff, and Sailing Theory and Practice by C.A. Marchaj convinced me that the distribution of camber along the profile was the determining factor in the quality of a sail profile. I was very sceptical about the definition of a profile by its depth, the position of its maximum depth along the cord and segments of cubic or quadratic curves on either side. Rather than trying to reproduce existing sail shape based on depth measurements, I looked for a law of distribution of its camber giving a reasonably aerodynamic profile on the complete sail surface. The first attempt was to model directly the distribution of camber, however that required to process simultaneously the first and second derivative of the surface many points of the sail surface, far too much work for my small computer. At the time I was racing on the North Sea often in relatively heavy weather for my ТМ ton and I wanted sail profiles with a high peak of pressure very far forward to fight against the tendency of the depth to move backward as the cloth stretched in increasing winds. I finally selected a simple equation defining only the second derivative of the profile and giving a monotonic decrease of its value along the cord of the profile. Experience showed that with the then available cloth, the leech was sometime falling to leeward in the upper part of the sail. I then introduced a second term in the equation to be able to control the minimum value of the second derivative at the leech. This equation is therefore controlled by only two parameters. Some Maths The coordinate system used is such that the plane X-Y contains the tack, the clew and the head of the luff. The X axis is horizontal and orientated positively from tack toward clew. The Y axis is vertical orientated upward and the Z axis (depth) is perpendicular to the X-Y plane. Profiles are defined by the intersection of the surface of the sail with an horizontal plane parallel to Z-X plane. The depth Z of any point of a given profile is a function of the local X ordinate normalised to the profile local cord as shown in .
Sailcut coordinate system
The following equation is used to describe the second derivative of the profile function of X: Z''= K*[-A*(1-X)^AV - AR*X] After a first integration it gives the slope of the profile: Z'= K*[A*(1 - X)^(AV + 1) / (AV+1) - AR/2*X^2 + C] Finally after a second integration the equation giving the depth at any point is: Z = K*[-A*(1-X)^(AV+2) / (( AV+2)*(AV+1)) - AR/6*X^3 + C*X + B] To meet the profile end conditions (X=0, Z=0) and (X=1, Z=0) the constants B and C are: B = A / ((AV + 2) * (AV + 1)) C = AR / 6 - B The maximum depth is obtained when the slope Z' is equal to zero, this allow to calculate K such that the depth at that point is the one desired. The factors AV and AR give a measure of the camber at the leading edge (AV) and trailing edge (AR). Together with the maximum depth value these factors are sufficient to describe the profile of the sail at any height. The factor A defines different families of profiles with a different distribution of fullness fore/aft. In practice A = 1 give good profiles for sails used in light conditions. I prefer to use sail profiles with more fullness forward and a flatter leech as obtained with the factor A = 1 + AV / 4. This is the factor used in Sailcut and it give a good range of utilisation of the sails. The following table give an example of profile data obtained with the above equations. AV = 5.00 AR = 0.02 K = 2.94 A = 2.250 B = 0.054 C =-0.050 curvature = z" / (1+ z'*z')^3/2 xz" z' z curvature 0.0 -6.615 0.955 0.00 -2.503 0.1 -3.912 0.438 0.0674 -3.007 0.2 -2.179 0.140 0.0949 -2.117 0.3 -1.129 -0.021 0.1000 -1.129 0.4 -0.538 -0.101 0.0934 -0.530 0.5 -0.236 -0.138 0.0812 -0.230 0.6 -0.103 -0.154 0.0665 -0.099 0.7 -0.057 -0.161 0.0507 -0.055 0.8 -0.049 -0.166 0.0343 -0.047 0.9 -0.053 -0.172 0.0174 -0.051 1.0 -0.059 -0.177 0.00 -0.056 Having defined a single equation for all profiles it is a matter of varying the maximum depth and the factors AV and AR as function of the height of the profile to generate the complete surface of the sail. The profile at foot level being always an arc of circle, the factors AV and AR are equal to zero and only the depth of the foot is entered by the user. A profile called "mid profile" is located around the middle of the height and the factors AV and AR are set such that the profile has the required shape. A third control profile defined as for the "mid profile" is located at the top of the sail. For all other profiles the depth value is interpolated by a quadratic equation and the factors AV and AR are interpolated linearly between between the foot, the middle and top values. In total 3 values of depth, 2 pairs of factor (AV, AR) and the vertical position of the "mid profile" are used to define the basic mould of the sail. Note that in Sailcut software the value displayed for the luff factor is equal to the AV ceofficient while the leech factor displayed is 50 time the AR coefficient used in the above equations such that the users can use more friendly range of data than second and third decimal figures.
Other aspects of the surface formulation The above basic mould is not sufficient to define a real sail. Indeed the luff, gaff, leech and foot of the sail are never straight and further more the sail profiles are always twisted from the foot to the top of the sail. I use the distance from the point of maximum round to the straight line and two arcs of parabola rejoining the adjacent corners to define the real edges of the sail. The profiles defined by the sail mould described above are resting on the real edges of the sail. The twist of the sail is finally obtained by applying to each profile a rotation around the leading edge end point. It is to be noted that this method of modelling the surface of sails gives shapes without bumps or hollows and guarantees that there is no inversion of camber in the profiles. The method is applicable to triangular and quadrangular sails and Sailcut is commonly used for designing old timers gaff sails.
Where can I find more information about Sailcut CAD? The Sailcut CAD project lives at . This is where you will find links to all matters related to Sailcut CAD! I think I found a bug, what should I do? Sailcut CAD is constantly under development and feedback from users is very welcome! If you think you found bug, visit Sailcut's homepage , you will find instructions in the "Reporting a Bug" section. I would like to help develop Sailcut CAD, what should I do? You can help us improve Sailcut even if you are not a programmer! Simply using Sailcut and reporting any bugs you might find is of considerable help to us. We are also looking for people to help keep translations up to date and to produce new translations. If you are interested in translating Sailcut into your native language, visit the Sailcut CAD homepage and send an email to the development mailing list! If you have some knowledge of C++ and are interested in making Sailcut CAD a better program, visit the Sailcut CAD homepage where you will find both snapshots of the Sailcut CAD code and how to access to the CVS repository. Once you have had a chance to familiarise yourself with the code, contact us via the forums or our mailing lists! File formats used by Sailcut CAD Text representation of developed sail This section describes the structure of the file generated by Sailcut CAD using the to TXT sail entry of the Export development submenu of the File menu. The extension of a text sail file is ".txt". A sail is made of a number of panels, each panel has 4 basic sides : left, top, right, bottom which are joined by a drawing line. The origin is at the bottom left corner of a rectangle surrounding the panel. These four basic sides define the net area of the panel after assembly in the sail. Around the basic panel there is provision for stiching the panels and sail edge hems, the outer side of the panel is defined by four sides named cutLeft, cutTop, cutRight, cutBottom and the material is cut along these sides. Depending on whether or not you have added material for hems around the sail some of these sides may be identical to the basic sides of the panel. Test main sail cross cut (flat) // name of the sail ===== CPanel : 0 ==== // begining of panel 0 == CPanelLabel : name == // marker for panel label name 0 == CPanelLabel : height == // marker for label height 5 == CPanelLabel : color == // marker for label color 1 == CPanelLabel : origin == // marker for label origin coordinates 427.717 764.064 0 // X Y Z coordinates (Z is always =0) == CPanelLabel : direction == // marker for label orientation 168.204 -57.8975 0 == CSide : left == // begin left side of panel #0 92.5718 886.006 0 // X Y Z coordinates of point 0 #1 92.5718 886.006 0 // X Y Z coordinates of point 1 ... == CSide : top == // begin top side #0 92.5718 886.006 0 // X Y Z coordinates of point 0 #1 262.77 886.006 0 ... == CSide : right == // begin right side #0 3533.09 25.5986 0 #1 3526.2 169.113 0 ... == CSide : bottom == // begin bottom side #0 92.5718 886.006 0 #1 259.921 823.943 0 ... == CSide : cutLeft == // begin left cut line #0 0 899.006 0 // X Y Z coordinates of point 0 of left cut line #1 0 899.006 0 ... == CSide : cutTop == // begin top cut line #0 1150.25 899.006 0 #1 262.77 899.006 0 ... == CSide : cutRight == // begin right cut line #0 3574.36 0 0 #1 3566.15 171.031 0 ... == CSide : cutBottom == // begin bottom cut line #0 0 899.006 0 #1 252.966 805.191 0 ... ===== CPanel : 1 ==== // beginning of panel 1 == CPanelLabel : name == // marker for panel label name 1 == CPanelLabel : height == 5 == CPanelLabel : color == 1 == CPanelLabel : origin == 889.341 2.64113 0 == CPanelLabel : direction == 170.396 0.562482 0 == CSide : left == #0 548.746 0.388633 0 #1 367.439 68.706 0 ... == CSide : top == #0 203.679 871.331 0 #1 393.052 872.078 0 ... Text representation of 3D sail This section describes the structure of the file generated by Sailcut CAD using the menu to TXT sail entry of the Export 3D sail submenu of the File menu. The extension of a text sail file is ".txt". A 3D sail is made of a number of panels, each panel has 4 basic sides : left, top, right, bottom which are joined by a drawing line. Test main sail cross cut (3D) // name of the sail ===== CPanel : 0 ==== // begining of panel 0 == CPanelLabel : name == // marker for panel label name 0 == CPanelLabel : height == // marker for label height 5 == CPanelLabel : color == // marker for label color 1 == CPanelLabel : origin == // marker for label origin coordinates 427.717 764.064 0 // X Y Z coordinates (Z is always =0) == CPanelLabel : direction == // marker for label orientation 168.204 -57.8975 0 == CSide : left == // begin left side of panel #0 92.5718 886.006 0 // X Y Z coordinates of point 0 #1 92.5718 886.006 0 // X Y Z coordinates of point 1 ... == CSide : top == // begin top side #0 92.5718 886.006 0 // X Y Z coordinates of point 0 #1 262.77 886.006 0 ... == CSide : right == // begin right side #0 3533.09 25.5986 0 #1 3526.2 169.113 0 ... == CSide : bottom == // begin bottom side #0 92.5718 886.006 0 #1 259.921 823.943 0 ... ===== CPanel : 1 ==== // beginning of panel 1 == CPanelLabel : name == // marker for panel label name 1 == CPanelLabel : height == 5 == CPanelLabel : color == 1 == CPanelLabel : origin == 889.341 2.64113 0 == CPanelLabel : direction == 170.396 0.562482 0 == CSide : left == #0 548.746 0.388633 0 #1 367.439 68.706 0 ... == CSide : top == #0 203.679 871.331 0 #1 393.052 872.078 0 ... XML representation of a sail This describe the structure of the file generated by Sailcut using the menu to XML sail entry of the Export development or Export 3D sail submenus of the File menu. The extension of an XML sail file is ".sail3d". A sail is made of a number of panels Each panel has 4 basic sides : left, top, right, bottom which are joined by a drawing line. The origin is at the bottom left corner of a rectangle surrounding the panel. These four basic sides define the net area of the panel after assembly in the sail. Around the basic panel there is provision for stiching the panels and sail edge hems, the outer side of the panel is defined by four sides named cutLeft, cutTop, cutRight, cutBottom and the material is cut along these sides. Depending on whether or not you have added material for hems around the sail some of these sides may be identical to the basic sides of the panel. <!DOCTYPE Sailcut > <CSailDoc> // header begin file <CSail name="sail" > // begin sail + name of sail <vector size="10" name="panel" > // indicate that the sail is made of 10 panels <CPanel name="0" > // begin panel 0 <CSide name="left" > // begin of left side of the panel <vector size="7" name="point" > // number of points on left side is 7 <CPoint3d name="0" > // first point = 0 <real value="92.5718" name="x" /> // first point coordinate X <real value="886.006" name="y" /> // first point coordinate Y <real value="0" name="z" /> // coordinate Z is always 0 // for a developped panel </CPoint3d> // end of first point <CPoint3d name="1" > // second point = 1 <real value="92.5718" name="x" /> <real value="886.006" name="y" /> <real value="0" name="z" /> </CPoint3d> // end of second point ... </vector> // end of list of left side points </CSide> // end of left side <CSide name="top" > // begin top side <vector size="21" name="point" > // number of points on top side is 21 <CPoint3d name="0" > // first point = 0 <real value="92.5718" name="x" /> <real value="886.006" name="y" /> <real value="0" name="z" /> </CPoint3d> <CPoint3d name="1" > // second point = 1 <real value="262.77" name="x" /> <real value="886.006" name="y" /> <real value="0" name="z" /> </CPoint3d> ... </vector> // end list of points of top side </CSide> // end top side <CSide name="right" > // begin right side ... </CSide> // end right side <CSide name="bottom" > // begin bottom side ... </CSide> // end bottom side <int value="1" name="hasHems" /> // header indicating that the panel has hems cloth around the edges <CSide name="cutLeft" > // begin left side cut line <vector size="7" name="point" > // left side has 7 points <CPoint3d name="0" > // first point = 0 <real value="0" name="x" /> <real value="899.006" name="y" /> <real value="0" name="z" /> </CPoint3d> // end first point ... </vector> // end list of left side points </CSide> // end left side cut line <CSide name="cutTop" > // begin top cut line ... </CSide> // end top cut line <CSide name="cutRight" > // begin right cut line ... </CSide> // end right cut line <CSide name="cutBottom" > // begin bottom cut line ... </CSide> // end bottom cut line </CPanel> // end of first panel <CPanel name="1" > // begin second panel = 1 <CSide name="left" > // begin left side <vector size="7" name="point" > <CPoint3d name="0" > <real value="548.746" name="x" /> <real value="0.388633" name="y" /> <real value="0" name="z" /> </CPoint3d> ... </vector> </CSide> // end left side ... ... </CSail> // end sail </CSailDoc> // end file Copyright Copyright (C) 1993-2007 Robert & Jeremy LainУЉ. Sailcut is a Registered Trademark of Robert LainУЉ. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See for the licence terms and details. 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., 675 Mass Ave, Cambridge, MA 02139, USA. The authors would appreciate that publications on sails designed with Sailcut include some acknowledgement of their work.
sailcut-1.3.5/doc/en/develop_panel_drawing.fig0000644000175000007640000000716310510643102021271 0ustar sharkyjerryweb#FIG 3.2 Produced by xfig version 3.2.5-alpha5 Landscape Center Metric A4 100.00 Single -2 1200 2 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 3 6705 3510 7155 5040 7245 6615 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 3 1215 6750 1620 5085 2565 3375 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 3 900 6930 1350 5085 2430 3105 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 3 6885 3285 7425 5040 7515 6975 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 1 3 0 0 1.00 120.00 240.00 0 0 1.00 120.00 240.00 900 1350 900 7290 9900 7290 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1710 2385 2565 3375 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 4230 2655 3960 3285 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 6390 2745 6120 3600 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 7965 2385 6705 3510 2 1 0 1 9 7 50 -1 -1 0.000 0 0 -1 1 1 3 0 0 1.00 90.00 180.00 0 0 1.00 90.00 180.00 1170 4500 1215 6750 8595 6570 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 2880 7785 3240 7020 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 900 8100 1215 6750 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 6525 6525 6165 7875 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 7245 6615 7605 8055 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1575 6345 1215 6750 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 3 0 0 1.00 90.00 180.00 0 0 1.00 90.00 180.00 2610 1530 2565 3375 8955 3600 2 2 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 5 900 7290 7515 7290 7515 2970 900 2970 900 7290 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 2790 2745 2565 3375 2610 3375 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 900 7290 810 7380 3 2 0 2 1 7 50 -1 -1 0.000 0 0 0 4 1215 6750 3735 7020 6075 6570 7245 6615 0.000 -1.000 -1.000 0.000 3 2 0 2 1 7 50 -1 -1 0.000 0 0 0 4 2565 3375 4185 3285 6030 3555 6705 3510 0.000 -1.000 -1.000 0.000 3 2 0 2 4 7 50 -1 -1 0.000 0 0 0 4 900 6930 3690 7290 6030 6840 7515 6975 0.000 -1.000 -1.000 0.000 3 2 0 2 4 7 50 -1 -1 0.000 0 0 0 4 2430 3105 4185 3015 6030 3285 6885 3285 0.000 -1.000 -1.000 0.000 4 0 0 50 -1 0 12 0.0000 4 135 705 2115 8055 dY = -10\001 4 0 0 50 -1 0 12 0.0000 4 135 750 2115 7830 dX = 321\001 4 0 1 50 -1 0 12 0.0000 4 135 540 1665 6210 dX = 0\001 4 0 1 50 -1 0 12 0.0000 4 135 540 1665 6435 dY = 0\001 4 0 0 50 -1 0 12 0.0000 4 135 750 7785 2025 X = 1789\001 4 0 0 50 -1 0 12 0.0000 4 135 645 7785 2295 Y = 678\001 4 0 0 50 -1 0 12 0.0000 4 135 645 1395 2070 X = 234 \001 4 0 0 50 -1 0 12 0.0000 4 135 645 1395 2340 Y = 789\001 4 0 0 50 -1 0 12 0.0000 4 135 540 5265 8145 dY = 2\001 4 0 0 50 -1 0 12 0.0000 4 135 855 5265 7875 dX = 1345\001 4 0 9 50 -1 0 12 0.0000 4 135 240 1215 4500 dY\001 4 0 0 50 -1 0 12 0.0000 4 135 750 7740 7965 X = 1890\001 4 0 0 50 -1 0 12 0.0000 4 135 540 7740 8235 Y = 35\001 4 0 0 50 -1 0 18 0.0000 4 195 645 3600 5040 Panel\001 4 0 0 50 -1 0 12 0.0000 4 135 750 4050 2340 dX = 345\001 4 0 0 50 -1 0 12 0.0000 4 135 540 4050 2565 dY = 5\001 4 0 0 50 -1 0 12 0.0000 4 135 600 6075 2700 dY = -2\001 4 0 0 50 -1 0 12 0.0000 4 135 855 6075 2475 dX = 1234\001 4 0 1 50 -1 0 12 0.0000 4 135 540 2835 2520 dX = 0\001 4 0 1 50 -1 0 12 0.0000 4 135 540 2835 2700 dY = 0\001 4 0 1 50 -1 0 12 0.0000 4 180 1185 8145 3420 dX upper edge\001 4 0 9 50 -1 0 12 0.0000 4 180 1170 8145 6435 dX lower edge\001 4 0 1 90 -1 0 12 0.0000 4 135 1740 5130 5040 DRAW line is in blue\001 4 0 1 50 -1 0 12 0.0000 4 180 1185 2745 1710 dY upper edge\001 4 0 4 50 -1 0 12 0.0000 4 135 435 315 7335 X = 0\001 4 0 4 50 -1 0 12 0.0000 4 135 435 315 7560 Y = 0\001 4 0 4 50 -1 0 18 0.0000 4 195 210 9540 7155 Y\001 4 0 4 50 -1 0 18 0.0000 4 195 210 585 1845 X\001 4 0 0 50 -1 0 12 0.0000 4 135 540 270 8145 X = 15\001 4 0 0 50 -1 0 12 0.0000 4 135 540 270 8370 Y = 25\001 4 0 4 50 -1 0 12 0.0000 4 135 1440 5445 5445 CUT line is in red\001 sailcut-1.3.5/doc/en/sailplan.fig0000644000175000007640000000737711112616675016571 0ustar sharkyjerryweb#FIG 3.2 Produced by xfig version 3.2.5-alpha5 Landscape Center Metric A4 100.00 Single -2 1200 2 5 1 0 2 1 7 50 -1 -1 0.000 0 0 1 1 4980.000 1860.000 5175 720 5625 900 5940 1215 0 0 2.00 60.00 120.00 0 0 2.00 60.00 120.00 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 1350 7920 8955 7920 8865 8280 1575 8280 1350 7920 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1350 7920 4590 3150 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 4140 7290 4140 8955 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 1350 7920 315 7920 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 1530 7695 675 7695 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 4140 7245 3285 7245 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 5 4140 7245 4923 2028 6840 630 8685 7110 4113 7248 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 3 1 1.00 60.00 120.00 3150 4005 4275 3555 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 3960 7920 4905 1575 4815 1575 3870 7920 3960 7920 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 3 1 1.00 60.00 120.00 5220 6255 4230 7155 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 3 1 1.00 60.00 120.00 4995 2070 5486 2479 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 3 1 1.00 60.00 120.00 8550 7020 7335 6300 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 3 1 1.00 60.00 120.00 6750 810 6480 1575 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 4590 3195 360 3195 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 1530 7695 4185 3780 3645 7605 1530 7695 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 3420 7245 3420 6705 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 3420 7920 3420 8190 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 3 1 1.00 60.00 120.00 4230 1710 4669 2140 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 3 1 2.00 60.00 120.00 3 1 2.00 60.00 120.00 1350 8775 4140 8775 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 3 1 2.00 60.00 120.00 3 1 2.00 60.00 120.00 4140 8775 4950 8775 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 1 2 3 1 2.00 60.00 120.00 3 1 2.00 60.00 120.00 1350 9135 4545 9135 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 4545 3195 4545 9135 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 1350 7740 1350 9135 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 4905 2070 5130 720 5130 675 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 4950 2025 4950 8910 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 1 2 3 1 1.00 60.00 120.00 3 1 1.00 60.00 120.00 405 7920 405 3195 3 2 0 2 4 7 50 -1 -1 0.000 0 0 1 2 3 1 2.00 60.00 120.00 720 7695 720 6840 0.000 0.000 3 2 0 2 4 7 50 -1 -1 0.000 0 0 1 2 3 1 2.00 60.00 120.00 720 7920 720 8280 0.000 0.000 4 0 1 50 -1 0 16 0.0000 4 195 525 6390 7110 Foot\001 4 0 4 50 -1 0 14 0.0000 4 210 1200 540 5265 Fore triangle\001 4 0 4 50 -1 0 14 0.0000 4 150 780 540 5490 hoist = I\001 4 0 1 50 -1 0 16 0.0000 4 195 675 7785 3375 Leech\001 4 0 1 50 -1 0 18 0.0000 4 195 1080 5940 4275 Main sail\001 4 0 0 50 -1 0 16 0.0000 4 195 555 5310 6165 Tack\001 4 0 0 50 -1 0 16 0.0000 4 195 570 5580 2565 Head\001 4 0 0 50 -1 0 16 0.0000 4 195 525 6345 1800 Peak\001 4 0 0 50 -1 0 16 0.0000 4 195 555 7110 6210 Clew\001 4 0 4 50 -1 0 18 0.0000 4 195 315 3195 5985 Jib\001 4 0 0 50 -1 0 18 0.0000 4 195 585 3600 1665 Mast\001 4 0 0 50 -1 0 16 0.0000 4 255 960 2160 4005 Forestay\001 4 0 1 50 -1 0 16 0.0000 4 195 480 4635 4680 Luff\001 4 0 0 50 -1 0 14 0.0000 4 165 1590 6705 7830 Boat Deck LOA\001 4 0 1 50 -1 0 14 0.0000 4 165 795 2565 7110 mainsail\001 4 0 1 50 -1 0 14 0.0000 4 165 885 5040 8730 Luff rake\001 4 0 1 50 -1 0 14 0.0000 4 165 2595 1485 8685 mainsail tack-stem distance\001 4 0 4 50 -1 0 14 0.0000 4 210 2025 1935 9045 Fore triangle base = J\001 4 0 1 50 -1 0 16 0.0000 4 195 510 6075 765 Gaff\001 4 0 4 50 -1 0 14 0.0000 4 150 270 810 6795 Jib\001 4 0 4 50 -1 0 14 0.0000 4 210 1035 810 7020 tack height\001 4 0 1 50 -1 0 14 0.0000 4 210 1035 2475 7470 tack height\001 4 0 1 50 -1 0 14 0.0000 4 210 1920 3375 630 Gaff angle from luff\001 sailcut-1.3.5/doc/fr/0000755000175000007640000000000011457411327014265 5ustar sharkyjerrywebsailcut-1.3.5/doc/fr/model-sailcut-fr.pdf0000644000175000007640000112624510510643102020125 0ustar sharkyjerryweb%PDF-1.4 %фімп 1 0 obj << /Length 2 0 R >> stream 0 w q 0 -0.1 612.1 792.1 re W* n q 0 0 0 rg BT 187.4 711 Td /F1 10 Tf <01> Tj 8.4 0 Td <02> Tj 6.1 0 Td <0304> Tj 11.7 0 Td <05> Tj 2.8 0 Td <06> Tj 2.7 0 Td <07> Tj 5.6 0 Td <08> Tj 5.6 0 Td <09> Tj 3.3 0 Td <06> Tj 2.8 0 Td <020A> Tj 12.2 0 Td <0B> Tj 2.8 0 Td <030C> Tj 11.6 0 Td <0B> Tj 2.8 0 Td <05> Tj 2.7 0 Td <08> Tj 5.6 0 Td <0B> Tj 2.7 0 Td <07> Tj 5.6 0 Td <0D> Tj 6 0 Td <0E0F> Tj 7.2 0 Td <08> Tj 5.5 0 Td <10> Tj 5.6 0 Td <0C> Tj 5.5 0 Td <0B> Tj 2.8 0 Td <03> Tj 6 0 Td <0C> Tj 5.6 0 Td <07> Tj 5.5 0 Td <0B> Tj 2.8 0 Td <11> Tj 5.6 0 Td <0206> Tj 8.8 0 Td <05> Tj 2.8 0 Td <0C> Tj 5.5 0 Td <07> Tj 5.6 0 Td <0B> Tj 2.8 0 Td <0308> Tj 11.6 0 Td <0A> Tj 6.1 0 Td <07> Tj 5.6 0 Td <0B> Tj 2.7 0 Td <12> Tj 6.7 0 Td <08> Tj 5.5 0 Td <06> Tj 2.7 0 Td <05> Tj 2.7 0 Td <10> Tj 5.6 0 Td <0D> Tj 6.1 0 Td <09> Tj ET Q q 0 0 0 rg BT 218 688.7 Td /F2 10 Tf <01> Tj 7.2 0 Td <02> Tj 5.5 0 Td <03> Tj 5.5 0 Td <04> Tj 5.6 0 Td <05> Tj 3.3 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <08> Tj 5.5 0 Td <09> Tj 5.6 0 Td <0A> Tj 2.1 0 Td <0B> Tj 5.5 0 Td <0C> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0D> Tj ET Q q 0 0 1 rg BT 281 688.7 Td /F2 10 Tf <05> Tj 3.4 0 Td <02> Tj 5.4 0 Td <03> Tj 5.5 0 Td <04> Tj 5.6 0 Td <05> Tj 3.3 0 Td <06> Tj 2.8 0 Td <0E> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.5 0 Td <1011> Tj 15.1 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <12> Tj 5 0 Td <13> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0E> Tj 2.8 0 Td <12> Tj 5 0 Td <02> Tj 5.5 0 Td <14> Tj ET Q q 1 0 0 1 281 688.7 cm 0.6 w 0 0 1 RG 0 -0.8 m 109.8 -0.8 l S Q q 0 0 0 rg BT 390.8 688.7 Td /F2 10 Tf <15> Tj ET Q q 0 0 0 rg BT 304.7 677.5 Td /F2 10 Tf <07> Tj ET Q q 0 0 0 rg BT 194.5 666.4 Td /F2 10 Tf <16> Tj 6.7 0 Td <09> Tj 5.4 0 Td <17> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <05> Tj 3.4 0 Td <0C> Tj 5.5 0 Td <11> Tj 5 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0C> Tj 5.6 0 Td <07> Tj 2.7 0 Td <09> Tj 5.6 0 Td <13> Tj 5.5 0 Td <07> Tj 2.7 0 Td <18> Tj 5.6 0 Td <19> Tj 5.5 0 Td <14> Tj 8.4 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <1A> Tj 9.5 0 Td <02> Tj 5.7 0 Td <05> Tj 3.4 0 Td <1B> Tj 5.1 0 Td <11> Tj 5.1 0 Td <1C> Tj 5.5 0 Td <02> Tj 5.6 0 Td <17> Tj 5.7 0 Td <07> Tj 2.7 0 Td <1D> Tj 6.7 0 Td <12> Tj 4.9 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <12> Tj 4.9 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <1E> Tj 6.6 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <04> Tj ET Q q 0 0 0 rg BT 224.7 655.2 Td /F2 10 Tf <1F> Tj 2.8 0 Td <01> Tj 7.1 0 Td <20> Tj 6.6 0 Td <21> Tj 7.2 0 Td <22> Tj 6.6 0 Td <1E> Tj 6.6 0 Td <23> Tj 2.8 0 Td <07> Tj 2.8 0 Td <24> Tj 6.6 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <06> Tj 2.7 0 Td <23> Tj 2.8 0 Td <07> Tj 2.8 0 Td <2505> Tj 9.4 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <12> Tj 5 0 Td <04> Tj 5.5 0 Td <23> Tj 2.8 0 Td <07> Tj 2.8 0 Td <18> Tj 5.5 0 Td <26> Tj 5.5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.4 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.3 0 Td <07> Tj 2.7 0 Td <18> Tj 5.5 0 Td <27> Tj 5.5 0 Td <27> Tj 5.6 0 Td <28> Tj ET Q q 0 0 0 rg BT 286.7 610.6 Td /F1 10 Tf <13> Tj 7.2 0 Td <04> Tj 5.5 0 Td <07> Tj 5.5 0 Td <0D14> Tj 15 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 588.3 Td /F2 10 Tf <29> Tj 7.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.6 0 Td <09> Tj 5.5 0 Td <17> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.5 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <0C> Tj 5.5 0 Td <12> Tj 5 0 Td <05> Tj 3.4 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <09> Tj 5.6 0 Td <07> Tj 2.7 0 Td <14> Tj 8.4 0 Td <09> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <19> Tj 5.6 0 Td <05> Tj 3.2 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.6 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <1113> Tj 10.6 0 Td <05> Tj 3.3 0 Td <2B> Tj 2.8 0 Td <09> Tj 5.5 0 Td <1204> Tj 10.7 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2C> Tj 4.9 0 Td <02> Tj 5.6 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <14> Tj 8.3 0 Td <02> Tj 5.6 0 Td <2A> Tj 5.6 0 Td <0C> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <11> Tj 4.9 0 Td <0C> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.6 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <02> Tj 5.5 0 Td <2D> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <12> Tj 5 0 Td <0A> Tj 2.1 0 Td <04> Tj 5.6 0 Td <0F> Tj 2.1 0 Td <07> Tj 2.8 0 Td <1D> Tj 6.7 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <12> Tj 5 0 Td <13> Tj 5.5 0 Td <06> Tj 2.7 0 Td <0E> Tj 2.8 0 Td <07> Tj 2.8 0 Td <29> Tj 7.2 0 Td <04> Tj 5.5 0 Td <06> Tj 2.7 0 Td <06> Tj 2.8 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 577.2 Td /F2 10 Tf <14> Tj 8.4 0 Td <02> Tj 5.6 0 Td <2A> Tj 5.5 0 Td <0C> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <09> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <09> Tj 5.6 0 Td <0F> Tj 2.1 0 Td <2E> Tj 4.9 0 Td <06> Tj 2.6 0 Td <0A> Tj 2.2 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <05> Tj 3.4 0 Td <04> Tj 5.5 0 Td <17> Tj 5.5 0 Td <02> Tj 5.6 0 Td <11> Tj 5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <30> Tj 1.8 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <09> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <30> Tj 1.9 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <11> Tj 5 0 Td <04> Tj 5.6 0 Td <13> Tj 5.5 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <0C> Tj 5.5 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <09> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <0C> Tj 5.5 0 Td <12> Tj 5 0 Td <05> Tj 3.3 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.4 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <09> Tj ET Q q 0 0 0 rg BT 90 566 Td /F2 10 Tf <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.5 0 Td <0E> Tj 2.8 0 Td <07> Tj 2.7 0 Td <08> Tj 5.6 0 Td <30> Tj 1.8 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0C> Tj 5.5 0 Td <05> Tj 3.4 0 Td <31> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <3013> Tj 7.5 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <06> Tj 2.7 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.4 0 Td <02> Tj 5.5 0 Td <2A> Tj 5.5 0 Td <0C> Tj 5.6 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <09> Tj 5.5 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <11> Tj 4.9 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <2B> Tj 2.8 0 Td <09> Tj 5.6 0 Td <12> Tj 5 0 Td <04> Tj 5.7 0 Td <07> Tj 2.7 0 Td <04> Tj 5.5 0 Td <11> Tj 5.1 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <02> Tj 5.6 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <04> Tj 5.6 0 Td <05> Tj 3.3 0 Td <14> Tj 8.4 0 Td <04> Tj 5.6 0 Td <06> Tj 2.7 0 Td <06> Tj 2.8 0 Td <09> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <02> Tj 5.6 0 Td <13> Tj 5.5 0 Td <2C> Tj 4.9 0 Td <04> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 554.9 Td /F2 10 Tf <1205> Tj 8.4 0 Td <04> Tj 5.5 0 Td <13> Tj 5.6 0 Td <32> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <06> Tj 2.8 0 Td <02> Tj 5.5 0 Td <13> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <02> Tj 5.6 0 Td <0A> Tj 2.1 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <04> Tj 5.6 0 Td <1106> Tj 7.7 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <0A> Tj 2.2 0 Td <14> Tj 8.4 0 Td <17> Tj 5.5 0 Td <0F> Tj 2.3 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <33> Tj 5.5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.4 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <34> Tj 9.4 0 Td <13> Tj 5.5 0 Td <2C> Tj 5 0 Td <05> Tj 3.2 0 Td <04> Tj 5.6 0 Td <23> Tj 2.7 0 Td <07> Tj 2.8 0 Td <06> Tj 2.7 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2D> Tj 5.5 0 Td <09> Tj 5.5 0 Td <05> Tj 3.4 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <11> Tj 5.1 0 Td <11> Tj 5 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <03> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 543.7 Td /F2 10 Tf <2B> Tj 2.8 0 Td <02> Tj 5.6 0 Td <05> Tj 3.3 0 Td <14> Tj 8.4 0 Td <04> Tj 5.7 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2C> Tj 4.9 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <0E> Tj 2.7 0 Td <07> Tj 2.8 0 Td <08> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <02> Tj 5.5 0 Td <2D> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <12> Tj 4.9 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.8 0 Td <1D> Tj 6.6 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <12> Tj 4.9 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <04> Tj 5.6 0 Td <06> Tj 2.7 0 Td <07> Tj 2.7 0 Td <11> Tj 5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <02> Tj 5.6 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <11> Tj 5 0 Td <02> Tj 5.6 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <12> Tj 4.9 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <29> Tj 7.2 0 Td <35> Tj 5.8 0 Td <35> Tj 5.7 0 Td <07> Tj 2.8 0 Td <11> Tj 4.9 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <14> Tj 8.3 0 Td <09> Tj 5.6 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <1117> Tj 10.5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <03> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <11> Tj ET Q q 0 0 0 rg BT 90 532.6 Td /F2 10 Tf <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <1204> Tj 10.5 0 Td <0B> Tj 5.6 0 Td <12> Tj 4.9 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <36> Tj 7.8 0 Td <0B> Tj 5.5 0 Td <13> Tj 5.6 0 Td <36> Tj 7.7 0 Td <16> Tj 6.7 0 Td <08> Tj 5.5 0 Td <0E> Tj 2.8 0 Td <07> Tj ET Q q 0 0 0 rg BT 276.9 488 Td /F1 10 Tf <15> Tj 2.8 0 Td <0A> Tj 6.1 0 Td <09> Tj 3.3 0 Td <0E02030D> Tj 22.2 0 Td <10> Tj 5.5 0 Td <09> Tj 3.3 0 Td <06> Tj 2.8 0 Td <020A> Tj ET Q q 0 0 0 rg BT 90 465.7 Td /F2 10 Tf <08> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <02> Tj 5.5 0 Td <2D> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <12> Tj 5 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <1202> Tj 10.6 0 Td <13> Tj 5.5 0 Td <17> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.4 0 Td <07> Tj 2.8 0 Td <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <1D> Tj 6.7 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <12> Tj 5 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <0C> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0C> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <0C> Tj 5.5 0 Td <2C> Tj 5 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <02> Tj 5.5 0 Td <17> Tj 5.5 0 Td <17> Tj 5.5 0 Td <0C> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <0B> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.6 0 Td <14> Tj 8.3 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <26> Tj 5.5 0 Td <37> Tj 5.5 0 Td <38> Tj 5.6 0 Td <39> Tj 5.5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <24> Tj 6.6 0 Td <09> Tj 5.5 0 Td <11> Tj 5 0 Td <0A> Tj 2.2 0 Td <12> Tj 5 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <07> Tj 2.8 0 Td <13> Tj 5.5 0 Td <0B> Tj ET Q q 0 0 0 rg BT 90 454.5 Td /F2 10 Tf <12> Tj 5 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <12> Tj 5 0 Td <13> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.6 0 Td <0A> Tj 2.1 0 Td <11> Tj 5 0 Td <17> Tj 5.5 0 Td <02> Tj 5.6 0 Td <11> Tj 5 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <3013> Tj 7.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0C> Tj 5.5 0 Td <12> Tj 5 0 Td <05> Tj 3.4 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <09> Tj 5.5 0 Td <2C> Tj 4.9 0 Td <04> Tj 5.5 0 Td <12> Tj 5.1 0 Td <07> Tj 2.7 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.1 0 Td <2D> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.4 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <3206> Tj 7.7 0 Td <04> Tj 5.6 0 Td <23> Tj 2.8 0 Td <07> Tj 2.7 0 Td <13> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <14> Tj 8.4 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <0A> Tj 2.3 0 Td <14> Tj 8.3 0 Td <09> Tj 5.6 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <33> Tj 5.5 0 Td <07> Tj 2.7 0 Td <3A> Tj 5.5 0 Td <18> Tj 5.6 0 Td <07> Tj 2.7 0 Td <12> Tj 5 0 Td <02> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.6 0 Td <1107> Tj 7.7 0 Td <04> Tj 5.6 0 Td <06> Tj ET Q q 0 0 0 rg BT 90 443.4 Td /F2 10 Tf <11> Tj 5 0 Td <04> Tj 5.6 0 Td <13> Tj 5.5 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.6 0 Td <14> Tj 8.4 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <26> Tj 5.5 0 Td <0E> Tj 2.7 0 Td <3B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <1B02> Tj 10.7 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.4 0 Td <0C> Tj 5.6 0 Td <14> Tj 8.3 0 Td <02> Tj 5.6 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.4 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2C> Tj 5 0 Td <0A> Tj 2.2 0 Td <2C> Tj 4.9 0 Td <04> Tj 5.5 0 Td <0E> Tj 2.7 0 Td <07> Tj 2.8 0 Td <3C> Tj 7.2 0 Td <30> Tj 1.9 0 Td <02> Tj 5.5 0 Td <3D> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <0B> Tj 5.5 0 Td <0C> Tj 5.6 0 Td <12> Tj 5 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <110A> Tj 7.3 0 Td <06> Tj 2.7 0 Td <0C> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2B> Tj 2.8 0 Td <09> Tj 5.6 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <110A> Tj 7.2 0 Td <14> Tj 8.4 0 Td <17> Tj 5.6 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.6 0 Td <02> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <14> Tj 8.4 0 Td <02> Tj 5.5 0 Td <2A> Tj 5.6 0 Td <0C> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <04> Tj 5.5 0 Td <05> Tj 3.4 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <2B> Tj 2.8 0 Td <09> Tj 5.5 0 Td <12> Tj 5 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 432.2 Td /F2 10 Tf <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <1107> Tj 7.8 0 Td <2C> Tj 4.9 0 Td <02> Tj 5.6 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.7 0 Td <2F> Tj 5.6 0 Td <13> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <3E> Tj 2.2 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2B> Tj 2.8 0 Td <09> Tj 5.6 0 Td <03> Tj 5.5 0 Td <05> Tj 3.4 0 Td <0A> Tj 2.1 0 Td <2F> Tj 5.6 0 Td <13> Tj 5.5 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <13> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <14> Tj 8.3 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.8 0 Td <3F> Tj 8.3 0 Td <07> Tj 2.7 0 Td <06> Tj 2.8 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <1F> Tj 2.8 0 Td <40> Tj 7.7 0 Td <01> Tj 7.2 0 Td <0E> Tj 2.8 0 Td <07> Tj 2.8 0 Td <29> Tj 7.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <2E> Tj 5 0 Td <12> Tj 4.9 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.4 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <1202> Tj 10.6 0 Td <0B> Tj 5.5 0 Td <12> Tj 5 0 Td <04> Tj 5.5 0 Td <17> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <41> Tj 3.4 0 Td <42> Tj ET Q q 0 0 0 rg BT 90 421.1 Td /F2 10 Tf <2B> Tj 2.8 0 Td <09> Tj 5.6 0 Td <03> Tj 5.5 0 Td <05> Tj 3.4 0 Td <0A> Tj 2.2 0 Td <12> Tj 4.9 0 Td <09> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <41> Tj 3.4 0 Td <42> Tj 5.8 0 Td <07> Tj 2.7 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <09> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.8 0 Td <41> Tj 3.3 0 Td <42> Tj 5.8 0 Td <07> Tj 2.7 0 Td <12> Tj 5.1 0 Td <02> Tj 5.5 0 Td <05> Tj 3.3 0 Td <05> Tj 3.4 0 Td <04> Tj 5.5 0 Td <12> Tj 5.1 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <05> Tj 3.4 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <43> Tj 3.5 0 Td <12> Tj 5 0 Td <02> Tj 5.6 0 Td <14> Tj 8.4 0 Td <14> Tj 8.4 0 Td <04> Tj 5.6 0 Td <05> Tj 3.4 0 Td <12> Tj 5 0 Td <0A> Tj 2.2 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <4307> Tj 6.3 0 Td <2A> Tj 5.6 0 Td <30> Tj 1.8 0 Td <09> Tj 5.5 0 Td <2A> Tj 5.6 0 Td <09> Tj 5.5 0 Td <17> Tj 5.5 0 Td <06> Tj 2.8 0 Td <09> Tj 5.5 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <09> Tj 5.5 0 Td <13> Tj 5.6 0 Td <32> Tj 5 0 Td <07> Tj 2.8 0 Td <1C> Tj 5.5 0 Td <09> Tj 5.5 0 Td <03> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.7 0 Td <13> Tj 5.5 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.5 0 Td <11> Tj ET Q q 0 0 0 rg BT 90 409.9 Td /F2 10 Tf <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <09> Tj 5.5 0 Td <2C> Tj 4.9 0 Td <09> Tj 5.6 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.7 0 Td <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.6 0 Td <05> Tj 3.2 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.6 0 Td <1107> Tj 7.7 0 Td <14> Tj 8.4 0 Td <3009> Tj 7.6 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <04> Tj 5.6 0 Td <05> Tj 3.3 0 Td <14> Tj 8.4 0 Td <0A> Tj 2.2 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <12> Tj 5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <2C> Tj 4.9 0 Td <04> Tj 5.6 0 Td <05> Tj 3.2 0 Td <2D> Tj 5.6 0 Td <04> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <05> Tj 3.3 0 Td <09> Tj 5.5 0 Td <17> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <14> Tj 8.4 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <11> Tj 4.9 0 Td <13> Tj 5.6 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <14> Tj 8.4 0 Td <02> Tj 5.5 0 Td <2A> Tj 5.5 0 Td <0C> Tj 5.6 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <09> Tj 5.5 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <12> Tj 5 0 Td <02> Tj 5.6 0 Td <14> Tj 8.4 0 Td <17> Tj 5.5 0 Td <09> Tj 5.6 0 Td <12> Tj 5 0 Td <06> Tj 2.8 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <04> Tj 5.5 0 Td <06> Tj ET Q q 0 0 0 rg BT 90 398.8 Td /F2 10 Tf <05> Tj 3.4 0 Td <02> Tj 5.5 0 Td <03> Tj 5.5 0 Td <13> Tj 5.6 0 Td <1106> Tj 7.7 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.3 0 Td <2B> Tj 2.8 0 Td <09> Tj 5.6 0 Td <12> Tj 5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.5 0 Td <1107> Tj 7.7 0 Td <2C> Tj 4.9 0 Td <02> Tj 5.6 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.6 0 Td <11> Tj 4.9 0 Td <0E> Tj 2.8 0 Td <07> Tj 2.8 0 Td <16> Tj 6.6 0 Td <0F> Tj 2.2 0 Td <13> Tj 5.5 0 Td <1107> Tj 7.8 0 Td <06> Tj 2.7 0 Td <09> Tj 5.6 0 Td <05> Tj 3.2 0 Td <2A> Tj 5.6 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <30> Tj 1.8 0 Td <13> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <0A> Tj 2.3 0 Td <11> Tj 4.9 0 Td <09> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <1D> Tj 6.7 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <12> Tj 5 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <09> Tj 5.5 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.7 0 Td <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.6 0 Td <05> Tj 3.2 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.6 0 Td <1107> Tj 7.7 0 Td <09> Tj 5.6 0 Td <07> Tj 2.7 0 Td <1202> Tj 10.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <05> Tj 3.2 0 Td <0A> Tj 2.3 0 Td <03> Tj 5.5 0 Td <13> Tj 5.5 0 Td <0C> Tj 5.5 0 Td <07> Tj 2.8 0 Td <33> Tj ET Q q 0 0 0 rg BT 90 387.6 Td /F2 10 Tf <0F> Tj 2.2 0 Td <30> Tj 1.9 0 Td <09> Tj 5.5 0 Td <3E> Tj 2.3 0 Td <02> Tj 5.5 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <30> Tj 1.9 0 Td <0A> Tj 2.1 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <04> Tj 5.6 0 Td <05> Tj 3.3 0 Td <2B> Tj 2.8 0 Td <09> Tj 5.5 0 Td <12> Tj 5.1 0 Td <04> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.8 0 Td <2D> Tj 5.5 0 Td <05> Tj 3.3 0 Td <09> Tj 5.6 0 Td <17> Tj 5.5 0 Td <1C> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <04> Tj 5.6 0 Td <1107> Tj 7.7 0 Td <09> Tj 5.6 0 Td <13> Tj 5.5 0 Td <07> Tj 2.7 0 Td <0B> Tj 5.5 0 Td <02> Tj 5.5 0 Td <2E> Tj 4.9 0 Td <09> Tj 5.5 0 Td <13> Tj 5.4 0 Td <07> Tj 2.8 0 Td <1D> Tj 6.6 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <12> Tj 4.9 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <14> Tj 8.4 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <11> Tj 5.1 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <04> Tj 5.6 0 Td <12> Tj 5 0 Td <0A> Tj 2.2 0 Td <07> Tj 2.8 0 Td <04> Tj 5.6 0 Td <11> Tj 4.9 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <09> Tj 5.5 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <1C> Tj 5.5 0 Td <0A> Tj 2.3 0 Td <11> Tj 5 0 Td <06> Tj 2.7 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.3 0 Td <04> Tj 5.5 0 Td <0E> Tj 2.8 0 Td <0E> Tj 2.8 0 Td <0E> Tj 2.8 0 Td <07> Tj 2.7 0 Td <07> Tj 2.8 0 Td <3C> Tj 7.2 0 Td <04> Tj 5.5 0 Td <17> Tj 5.5 0 Td <13> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <26> Tj 5.5 0 Td <37> Tj 5.6 0 Td <37> Tj 5.5 0 Td <3A> Tj 5.5 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj ET Q q 0 0 0 rg BT 90 376.5 Td /F2 10 Tf <2C> Tj 5 0 Td <04> Tj 5.5 0 Td <05> Tj 3.3 0 Td <110A> Tj 7.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <1E> Tj 6.6 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <13> Tj 5.5 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.8 0 Td <24> Tj 6.6 0 Td <09> Tj 5.5 0 Td <11> Tj 5 0 Td <0A> Tj 2.2 0 Td <12> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.4 0 Td <07> Tj 2.8 0 Td <1D> Tj 6.7 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <12> Tj 5 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <04> Tj 5.6 0 Td <1106> Tj 7.7 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <0A> Tj 2.1 0 Td <03> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <1F> Tj 2.7 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <05> Tj 3.3 0 Td <0B> Tj 5.6 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <0D> Tj 3.3 0 Td <1C> Tj 5.5 0 Td <06> Tj 2.8 0 Td <06> Tj 2.7 0 Td <17> Tj 5.5 0 Td <44> Tj 2.8 0 Td <45> Tj 2.8 0 Td <45> Tj 2.7 0 Td <46> Tj 7.2 0 Td <46> Tj 7.1 0 Td <46> Tj 7.1 0 Td <0E> Tj 2.8 0 Td <11> Tj 4.9 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <12> Tj 4.9 0 Td <13> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0E> Tj 2.8 0 Td <1202> Tj 10.6 0 Td <14> Tj 8.4 0 Td <15> Tj 3.5 0 Td <07> Tj 2.7 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <17> Tj 5.5 0 Td <13> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <18> Tj 5.6 0 Td <27> Tj 5.5 0 Td <27> Tj 5.5 0 Td <3A> Tj 5.5 0 Td <23> Tj ET Q q 0 0 0 rg BT 90 365.3 Td /F2 10 Tf <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <02> Tj 5.6 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <1102> Tj 10.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <12> Tj 5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <1D> Tj 6.6 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <12> Tj 4.9 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <05> Tj 3.3 0 Td <0C> Tj 5.6 0 Td <12> Tj 5 0 Td <05> Tj 3.3 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <29> Tj 7.1 0 Td <35> Tj 5.8 0 Td <35> Tj 5.8 0 Td <07> Tj 2.7 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <0A> Tj 2.1 0 Td <11> Tj 5 0 Td <17> Tj 5.5 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <0A> Tj 2.1 0 Td <03> Tj 5.6 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <33> Tj 5.5 0 Td <07> Tj 2.8 0 Td <1C> Tj 5.5 0 Td <06> Tj 2.8 0 Td <06> Tj 2.7 0 Td <17> Tj 5.5 0 Td <44> Tj 2.8 0 Td <45> Tj 2.7 0 Td <45> Tj 2.8 0 Td <11> Tj 5 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <12> Tj 5 0 Td <13> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0E> Tj 2.8 0 Td <11> Tj 5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <12> Tj 5 0 Td <04> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <02> Tj 5.5 0 Td <05> Tj 3.4 0 Td <2D> Tj 5.5 0 Td <04> Tj 5.6 0 Td <0E> Tj 2.7 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0E> Tj 2.8 0 Td <07> Tj 2.8 0 Td <16> Tj 6.6 0 Td <02> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.5 0 Td <11> Tj ET Q q 0 0 0 rg BT 90 354.2 Td /F2 10 Tf <05> Tj 3.4 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <1206> Tj 7.8 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <0A> Tj 2.1 0 Td <0C> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0C> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.7 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <1206> Tj 7.8 0 Td <13> Tj 5.5 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <23> Tj 2.8 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0B> Tj 5.5 0 Td <02> Tj 5.5 0 Td <14> Tj 8.5 0 Td <07> Tj 2.8 0 Td <1D> Tj 6.6 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <12> Tj 4.9 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <0C> Tj 5.5 0 Td <17> Tj 5.5 0 Td <02> Tj 5.6 0 Td <11> Tj 4.9 0 Td <0C> Tj 5.6 0 Td <07> Tj 2.8 0 Td <14> Tj 8.3 0 Td <09> Tj 5.6 0 Td <0A> Tj 2.2 0 Td <11> Tj 5.1 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <30> Tj 1.8 0 Td <09> Tj 5.6 0 Td <13> Tj 5.5 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <13> Tj 5.5 0 Td <05> Tj ET Q q 0 0 0 rg BT 90 343 Td /F2 10 Tf <14> Tj 8.4 0 Td <09> Tj 5.6 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <30> Tj 1.9 0 Td <09> Tj 5.6 0 Td <12> Tj 5 0 Td <12> Tj 5 0 Td <19> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <03> Tj 5.5 0 Td <05> Tj 3.3 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <2D> Tj 5.6 0 Td <05> Tj 3.3 0 Td <09> Tj 5.5 0 Td <06> Tj 2.8 0 Td <13> Tj 5.5 0 Td <0A> Tj 2.1 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <09> Tj 5.6 0 Td <13> Tj 5.4 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <02> Tj 5.5 0 Td <2D> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <12> Tj 5 0 Td <0A> Tj 2.1 0 Td <04> Tj 5.6 0 Td <0F> Tj 2.1 0 Td <07> Tj 2.8 0 Td <1D> Tj 6.6 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <12> Tj 4.9 0 Td <13> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0E> Tj 2.8 0 Td <07> Tj ET Q q 0 0 0 rg BT 175.7 298.4 Td /F1 10 Tf <16> Tj 6.7 0 Td <0E> Tj 3.8 0 Td <02> Tj 6.1 0 Td <1705> Tj 8.8 0 Td <04> Tj 5.6 0 Td <14> Tj 8.8 0 Td <08> Tj 5.6 0 Td <09> Tj 3.3 0 Td <06> Tj 2.8 0 Td <180D> Tj 12.2 0 Td <0C> Tj 5.6 0 Td <0B> Tj 2.7 0 Td <03> Tj 6.1 0 Td <0C> Tj 5.6 0 Td <0B> Tj 2.7 0 Td <05> Tj 2.7 0 Td <08> Tj 5.6 0 Td <0B> Tj 2.8 0 Td <0304> Tj 11.6 0 Td <0F> Tj 3.3 0 Td <06> Tj 2.8 0 Td <0A> Tj 6.1 0 Td <06> Tj 2.8 0 Td <09> Tj 3.3 0 Td <06> Tj 2.8 0 Td <020A> Tj 12.3 0 Td <0B> Tj 2.7 0 Td <03> Tj 6.1 0 Td <0C> Tj 5.6 0 Td <0B> Tj 2.7 0 Td <05> Tj 2.7 0 Td <08> Tj 5.6 0 Td <0B> Tj 2.8 0 Td <07> Tj 5.5 0 Td <0D0E0F> Tj 13.3 0 Td <08> Tj 5.5 0 Td <10> Tj 5.5 0 Td <0C> Tj 5.6 0 Td <0B> Tj 2.7 0 Td <03> Tj 6.1 0 Td <19> Tj 2.4 0 Td <0D0A> Tj 12.2 0 Td <0C> Tj 5.6 0 Td <0B> Tj 2.8 0 Td <11> Tj 5.6 0 Td <02> Tj 6.1 0 Td <06> Tj 2.7 0 Td <05> Tj 2.8 0 Td <0C> Tj ET Q q 0 0 0 rg BT 90 276.1 Td /F2 10 Tf <47> Tj 7.2 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <2B> Tj 2.7 0 Td <09> Tj 5.6 0 Td <12> Tj 5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <02> Tj 5.6 0 Td <14> Tj 8.3 0 Td <17> Tj 5.6 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.6 0 Td <3204> Tj 10.5 0 Td <07> Tj 2.8 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <05> Tj 3.3 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <0C> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <1109> Tj 10.5 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <1C> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <06> Tj 2.7 0 Td <02> Tj 5.6 0 Td <05> Tj 3.3 0 Td <0A> Tj 2.2 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <04> Tj 5.6 0 Td <14> Tj 8.4 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <09> Tj 5.5 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.5 0 Td <1107> Tj 7.8 0 Td <0B> Tj 5.5 0 Td <02> Tj 5.5 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <11> Tj ET Q q 0 0 0 rg BT 90 265 Td /F2 10 Tf <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.6 0 Td <1107> Tj 7.7 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <05> Tj 3.4 0 Td <04> Tj 5.5 0 Td <13> Tj 5.6 0 Td <32> Tj 5 0 Td <07> Tj 2.7 0 Td <33> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <0A> Tj 2.3 0 Td <2B> Tj 2.7 0 Td <2B> Tj 2.8 0 Td <0C> Tj 5.6 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <1C> Tj 5.5 0 Td <09> Tj 5.5 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <11> Tj 5 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.6 0 Td <07> Tj 2.7 0 Td <1205> Tj 8.4 0 Td <04> Tj 5.5 0 Td <13> Tj 5.6 0 Td <32> Tj 5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.3 0 Td <09> Tj 5.6 0 Td <320A> Tj 7.3 0 Td <14> Tj 8.3 0 Td <13> Tj 5.6 0 Td <14> Tj 8.7 0 Td <07> Tj 2.7 0 Td <1113> Tj 10.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <12> Tj 5 0 Td <02> Tj 5.6 0 Td <05> Tj 3.3 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <02> Tj 5.5 0 Td <12> Tj 4.9 0 Td <09> Tj 5.6 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.5 0 Td <0E> Tj ET Q q 0 0 0 rg BT 90 253.8 Td /F2 10 Tf <29> Tj 7.2 0 Td <04> Tj 5.6 0 Td <06> Tj 2.7 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <14> Tj 8.4 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <0A> Tj 2.2 0 Td <19> Tj 5.6 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <0C> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <0B> Tj 5.6 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <09> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <05> Tj 3.3 0 Td <48> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <04> Tj 5.5 0 Td <05> Tj 3.3 0 Td <14> Tj 8.4 0 Td <04> Tj 5.6 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2B> Tj 2.8 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.4 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2B> Tj 2.7 0 Td <09> Tj 5.6 0 Td <120A> Tj 7.2 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.6 0 Td <14> Tj 8.3 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 242.7 Td /F2 10 Tf <12> Tj 5 0 Td <02> Tj 5.6 0 Td <05> Tj 3.3 0 Td <05> Tj 3.3 0 Td <0C> Tj 5.6 0 Td <0F> Tj 2.1 0 Td <09> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2C> Tj 5 0 Td <0A> Tj 2.1 0 Td <11> Tj 5 0 Td <13> Tj 5.5 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.4 0 Td <02> Tj 5.5 0 Td <2A> Tj 5.6 0 Td <19> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2C> Tj 4.9 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.4 0 Td <07> Tj 2.8 0 Td <05> Tj 3.3 0 Td <0C> Tj 5.6 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <03> Tj 5.5 0 Td <09> Tj 5.5 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <09> Tj 5.5 0 Td <13> Tj 5.6 0 Td <0E> Tj 2.7 0 Td <07> Tj 2.8 0 Td <49> Tj 8.3 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <1C> Tj 5.5 0 Td <04> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <04> Tj 5.5 0 Td <13> Tj 5.5 0 Td <11> Tj 5 0 Td <04> Tj 5.6 0 Td <14> Tj 8.4 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <09> Tj 5.5 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <2F> Tj 5.6 0 Td <13> Tj 5.5 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <04> Tj 5.5 0 Td <11> Tj ET Q q 0 0 0 rg BT 90 231.5 Td /F2 10 Tf <17> Tj 5.5 0 Td <02> Tj 5.6 0 Td <0A> Tj 2.1 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <04> Tj 5.5 0 Td <13> Tj 5.5 0 Td <2C> Tj 5 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <09> Tj 5.6 0 Td <11> Tj 5 0 Td <1104> Tj 10.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <13> Tj 5.6 0 Td <0B> Tj 5.4 0 Td <07> Tj 2.8 0 Td <2D> Tj 5.6 0 Td <05> Tj 3.2 0 Td <09> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <2A> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0B> Tj 5.5 0 Td <02> Tj 5.6 0 Td <14> Tj 8.4 0 Td <03> Tj 5.5 0 Td <05> Tj 3.4 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <1113> Tj 10.6 0 Td <05> Tj 3.3 0 Td <2B> Tj 2.8 0 Td <09> Tj 5.5 0 Td <12> Tj 5.1 0 Td <04> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <13> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <02> Tj 5.6 0 Td <13> Tj 5.4 0 Td <07> Tj 2.8 0 Td <14> Tj 8.4 0 Td <02> Tj 5.6 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <03> Tj 5.5 0 Td <02> Tj 5.6 0 Td <11> Tj 5 0 Td <11> Tj 5 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <0C> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <0E> Tj 2.8 0 Td <07> Tj 2.7 0 Td <20> Tj 6.7 0 Td <0B> Tj 5.5 0 Td <1113> Tj 10.5 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.7 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj ET Q q 0 0 0 rg BT 90 220.4 Td /F2 10 Tf <0B> Tj 5.5 0 Td <02> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <0F> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.6 0 Td <1107> Tj 7.7 0 Td <2F> Tj 5.6 0 Td <13> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.7 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <09> Tj 5.6 0 Td <13> Tj 5.4 0 Td <07> Tj 2.8 0 Td <03> Tj 5.6 0 Td <02> Tj 5.5 0 Td <05> Tj 3.3 0 Td <2A> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <30> Tj 1.9 0 Td <09> Tj 5.5 0 Td <06> Tj 2.8 0 Td <06> Tj 2.7 0 Td <09> Tj 5.5 0 Td <2F> Tj 5.6 0 Td <13> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <09> Tj 5.5 0 Td <13> Tj 5.6 0 Td <07> Tj 2.7 0 Td <03> Tj 5.5 0 Td <02> Tj 5.6 0 Td <05> Tj 3.3 0 Td <2A> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2B> Tj 2.8 0 Td <13> Tj 5.6 0 Td <0A> Tj 2.1 0 Td <06> Tj 2.8 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2B> Tj 2.8 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <2A> Tj 5.6 0 Td <13> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <1107> Tj 7.7 0 Td <17> Tj 5.6 0 Td <02> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <09> Tj 5.6 0 Td <14> Tj 8.4 0 Td <0C> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <05> Tj 3.4 0 Td <04> Tj 5.5 0 Td <05> Tj ET Q q 0 0 0 rg BT 90 209.2 Td /F2 10 Tf <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <48> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.6 0 Td <07> Tj 2.7 0 Td <14> Tj 8.4 0 Td <09> Tj 5.5 0 Td <4A> Tj 2.8 0 Td <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <04> Tj 5.7 0 Td <07> Tj 2.7 0 Td <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.5 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.4 0 Td <07> Tj 2.8 0 Td <2B> Tj 2.8 0 Td <02> Tj 5.6 0 Td <05> Tj 3.4 0 Td <14> Tj 8.3 0 Td <04> Tj 5.7 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <05> Tj 3.3 0 Td <02> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.3 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2C> Tj 4.9 0 Td <02> Tj 5.6 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <0E> Tj 2.7 0 Td <07> Tj 2.8 0 Td <29> Tj 7.1 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.4 0 Td <0C> Tj 5.5 0 Td <06> Tj 2.8 0 Td <1C> Tj 5.6 0 Td <02> Tj 5.5 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.4 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <09> Tj 5.6 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <33> Tj 5.5 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj ET Q q 0 0 0 rg BT 90 198.1 Td /F2 10 Tf <12> Tj 5 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <12> Tj 5 0 Td <13> Tj 5.5 0 Td <0F> Tj 2.3 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <30> Tj 1.9 0 Td <0A> Tj 2.1 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <05> Tj 3.3 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <09> Tj 5.5 0 Td <11> Tj 5 0 Td <1104> Tj 10.5 0 Td <4B> Tj 4.9 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <2A> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <13> Tj 5.5 0 Td <2C> Tj 5 0 Td <04> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <13> Tj 5.5 0 Td <32> Tj 5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <06> Tj 2.7 0 Td <02> Tj 5.6 0 Td <13> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <3013> Tj 7.4 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.5 0 Td <23> Tj 2.8 0 Td <07> Tj 2.7 0 Td <12> Tj 5 0 Td <09> Tj 5.6 0 Td <0F> Tj 2.2 0 Td <12> Tj 4.9 0 Td <13> Tj 5.6 0 Td <0F> Tj 2.2 0 Td <11> Tj ET Q q 0 0 0 rg BT 90 186.9 Td /F2 10 Tf <2A> Tj 5.5 0 Td <0C> Tj 5.6 0 Td <17> Tj 5.5 0 Td <09> Tj 5.5 0 Td <11> Tj 5 0 Td <11> Tj 5.1 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <09> Tj 5.5 0 Td <17> Tj 5.5 0 Td <09> Tj 5.6 0 Td <12> Tj 5 0 Td <0A> Tj 2.1 0 Td <06> Tj 2.8 0 Td <0C> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.5 0 Td <1107> Tj 7.8 0 Td <12> Tj 5 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <12> Tj 5 0 Td <13> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <04> Tj 5.6 0 Td <05> Tj 3.3 0 Td <11> Tj 5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <30> Tj 1.9 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <0E> Tj 2.8 0 Td <07> Tj 2.8 0 Td <07> Tj 2.7 0 Td <07> Tj 2.8 0 Td <07> Tj 2.7 0 Td <07> Tj 2.8 0 Td <07> Tj ET Q q 0 0 0 rg BT 90 164.6 Td /F2 10 Tf <3C> Tj 7.2 0 Td <19> Tj 5.6 0 Td <1107> Tj 7.7 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <0C> Tj 5.5 0 Td <03> Tj 5.5 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.4 0 Td <04> Tj 5.5 0 Td <11> Tj 5.2 0 Td <07> Tj 2.7 0 Td <09> Tj 5.6 0 Td <12> Tj 4.9 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <2C> Tj 4.9 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.7 0 Td <0C> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <17> Tj 5.5 0 Td <02> Tj 5.6 0 Td <05> Tj 3.3 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <2C> Tj 4.9 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2C> Tj 4.9 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <23> Tj 2.7 0 Td <07> Tj 2.8 0 Td <3E> Tj 2.2 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <14> Tj 8.4 0 Td <04> Tj 5.7 0 Td <07> Tj 2.7 0 Td <11> Tj 5 0 Td <13> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0C> Tj 5.5 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <11> Tj 5 0 Td <0C> Tj 5.6 0 Td <07> Tj 2.7 0 Td <33> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <30> Tj 1.9 0 Td <09> Tj 5.5 0 Td <0C> Tj 5.5 0 Td <05> Tj 3.4 0 Td <02> Tj 5.5 0 Td <2A> Tj 5.4 0 Td <2E> Tj 4.9 0 Td <0B> Tj 5.6 0 Td <09> Tj 5.5 0 Td <14> Tj 8.3 0 Td <0A> Tj 2.2 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj ET Q q 0 0 0 rg BT 90 153.5 Td /F2 10 Tf <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.5 0 Td <0E> Tj 2.8 0 Td <07> Tj 2.7 0 Td <08> Tj 5.6 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <12> Tj 5 0 Td <06> Tj 2.8 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <0A> Tj 2.2 0 Td <2C> Tj 4.9 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <434C> Tj 9.7 0 Td <1C> Tj 5.5 0 Td <04> Tj 5.6 0 Td <02> Tj 5.5 0 Td <05> Tj 3.2 0 Td <2E> Tj 4.9 0 Td <07> Tj 2.7 0 Td <02> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <07> Tj 2.8 0 Td <46> Tj 7.2 0 Td <0A> Tj 2.1 0 Td <0B> Tj 5.5 0 Td <2D> Tj 5.5 0 Td <1107> Tj 7.8 0 Td <11> Tj 5 0 Td <04> Tj 5.5 0 Td <1206> Tj 7.8 0 Td <0A> Tj 2.1 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <11> Tj 5 0 Td <4307> Tj 6.3 0 Td <14> Tj 8.4 0 Td <3009> Tj 7.6 0 Td <07> Tj 2.7 0 Td <12> Tj 5 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <2C> Tj 4.9 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.6 0 Td <12> Tj 4.9 0 Td <13> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <07> Tj 2.7 0 Td <12> Tj 5 0 Td <02> Tj 5.6 0 Td <14> Tj 8.4 0 Td <17> Tj 5.5 0 Td <06> Tj 2.8 0 Td <09> Tj 5.6 0 Td <0A> Tj 2.1 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <0F> Tj 2.1 0 Td <13> Tj 5.6 0 Td <11> Tj ET Q q 0 0 0 rg BT 90 142.3 Td /F2 10 Tf <2A> Tj 5.5 0 Td <09> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <09> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <09> Tj 5.6 0 Td <0F> Tj 2.1 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.7 0 Td <0C> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <30> Tj 1.8 0 Td <13> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.6 0 Td <05> Tj 3.2 0 Td <02> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.3 0 Td <07> Tj 2.7 0 Td <0C> Tj 5.6 0 Td <06> Tj 2.7 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <05> Tj 3.3 0 Td <0C> Tj 5.5 0 Td <17> Tj 5.5 0 Td <09> Tj 5.6 0 Td <05> Tj 3.3 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <1202> Tj 10.6 0 Td <13> Tj 5.5 0 Td <05> Tj 3.3 0 Td <03> Tj 5.6 0 Td <13> Tj 5.5 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <2D> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <05> Tj 3.3 0 Td <02> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <0E> Tj 2.8 0 Td <07> Tj 2.8 0 Td <08> Tj 5.5 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <0C> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <0B> Tj 5.5 0 Td <0A> Tj 2.3 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <30> Tj 1.9 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <05> Tj 3.4 0 Td <02> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj ET Q q 0 0 0 rg BT 90 131.2 Td /F2 10 Tf <17> Tj 5.5 0 Td <09> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <1205> Tj 8.4 0 Td <04> Tj 5.5 0 Td <13> Tj 5.6 0 Td <32> Tj 5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.3 0 Td <09> Tj 5.6 0 Td <320A> Tj 7.2 0 Td <14> Tj 8.4 0 Td <13> Tj 5.6 0 Td <14> Tj 8.4 0 Td <23> Tj 3 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <02> Tj 5.5 0 Td <11> Tj 5 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.1 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <13> Tj 5.5 0 Td <32> Tj 5.1 0 Td <07> Tj 2.7 0 Td <04> Tj 5.6 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <04> Tj 5.5 0 Td <2D> Tj 5.6 0 Td <14> Tj 8.4 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2B> Tj 2.8 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <12> Tj 5.1 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.1 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <09> Tj 5.6 0 Td <2A> Tj 5.5 0 Td <05> Tj 3.3 0 Td <09> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <02> Tj 5.5 0 Td <13> Tj ET Q q 0 0 0 rg BT 90 120 Td /F2 10 Tf <12> Tj 5 0 Td <13> Tj 5.6 0 Td <03> Tj 5.5 0 Td <0A> Tj 2.1 0 Td <2F> Tj 5.6 0 Td <13> Tj 5.5 0 Td <04> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <14> Tj 8.4 0 Td <04> Tj 5.7 0 Td <07> Tj 2.7 0 Td <11> Tj 5 0 Td <04> Tj 5.6 0 Td <14> Tj 8.4 0 Td <03> Tj 5.5 0 Td <0F> Tj 2.3 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.1 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <13> Tj 5.5 0 Td <11> Tj 5 0 Td <17> Tj 5.5 0 Td <04> Tj 5.6 0 Td <1206> Tj 7.7 0 Td <04> Tj 5.6 0 Td <0E> Tj 2.8 0 Td <07> Tj 2.8 0 Td <07> Tj 2.7 0 Td <16> Tj 6.7 0 Td <0F> Tj 2.1 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <48> Tj 5.5 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <121C> Tj 10.6 0 Td <04> Tj 5.5 0 Td <05> Tj 3.4 0 Td <12> Tj 4.9 0 Td <1C> Tj 5.6 0 Td <04> Tj 5.5 0 Td <05> Tj 3.4 0 Td <07> Tj 2.8 0 Td <33> Tj 5.5 0 Td <07> Tj 2.7 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <17> Tj 5.5 0 Td <05> Tj 3.4 0 Td <02> Tj 5.5 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.5 0 Td <0A> Tj 2.3 0 Td <05> Tj 3.2 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2C> Tj 4.9 0 Td <02> Tj 5.6 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <320A> Tj 7.2 0 Td <1106> Tj 7.8 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <04> Tj 5.5 0 Td <11> Tj 5.1 0 Td <23> Tj 2.7 0 Td <07> Tj 2.8 0 Td <3E> Tj 2.2 0 Td <3009> Tj 7.5 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 108.9 Td /F2 10 Tf <12> Tj 5 0 Td <1C> Tj 5.6 0 Td <04> Tj 5.5 0 Td <05> Tj 3.3 0 Td <12> Tj 5.1 0 Td <1C> Tj 5.5 0 Td <0C> Tj 5.5 0 Td <07> Tj 2.8 0 Td <33> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <05> Tj 3.3 0 Td <02> Tj 5.6 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <12> Tj 5 0 Td <02> Tj 5.6 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <03> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <05> Tj 3.2 0 Td <09> Tj 5.6 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <09> Tj 5.5 0 Td <03> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <14> Tj 8.4 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <09> Tj 5.6 0 Td <0C> Tj 5.5 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <2A> Tj 5.4 0 Td <2E> Tj 4.9 0 Td <0B> Tj 5.5 0 Td <09> Tj 5.6 0 Td <14> Tj 8.3 0 Td <0A> Tj 2.2 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <06> Tj 2.8 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <06> Tj 2.7 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <09> Tj 5.6 0 Td <07> Tj 2.7 0 Td <11> Tj 5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <2B> Tj 2.8 0 Td <09> Tj 5.5 0 Td <1204> Tj 10.7 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <09> Tj ET Q q 0 0 0 rg BT 90 97.7 Td /F2 10 Tf <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.5 0 Td <0E> Tj 2.8 0 Td <07> Tj 2.7 0 Td <08> Tj 5.6 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <14> Tj 8.3 0 Td <0A> Tj 2.2 0 Td <19> Tj 5.6 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <09> Tj 5.5 0 Td <17> Tj 5.5 0 Td <17> Tj 5.5 0 Td <05> Tj 3.4 0 Td <02> Tj 5.5 0 Td <12> Tj 5 0 Td <1C> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <09> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0C> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0C> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.3 0 Td <02> Tj 5.6 0 Td <2A> Tj 5.6 0 Td <0C> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <04> Tj 5.5 0 Td <05> Tj 3.4 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.3 0 Td <04> Tj 5.5 0 Td <1206> Tj 7.8 0 Td <04> Tj 5.6 0 Td <14> Tj 8.3 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <02> Tj 5.6 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <03> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.3 0 Td <09> Tj 5.6 0 Td <0A> Tj 2.2 0 Td <11> Tj 5.1 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0B> Tj 5.5 0 Td <0C> Tj 5.6 0 Td <12> Tj 4.9 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <11> Tj 5 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.8 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.1 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 86.6 Td /F2 10 Tf <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <110A> Tj 7.2 0 Td <14> Tj 8.4 0 Td <13> Tj 5.6 0 Td <0F> Tj 2.2 0 Td <06> Tj 2.8 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <0C> Tj 5.6 0 Td <14> Tj 8.3 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.6 0 Td <0C> Tj 5.5 0 Td <05> Tj 3.3 0 Td <0A> Tj 2.2 0 Td <2C> Tj 4.9 0 Td <0C> Tj 5.5 0 Td <04> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <04> Tj 5.5 0 Td <14> Tj 8.4 0 Td <0A> Tj 2.2 0 Td <19> Tj 5.6 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <11> Tj 5 0 Td <04> Tj 5.6 0 Td <12> Tj 5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <06> Tj 2.7 0 Td <02> Tj 5.6 0 Td <13> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.6 0 Td <06> Tj 2.7 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <12> Tj 5 0 Td <07> Tj 2.8 0 Td <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <17> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <1209> Tj 10.5 0 Td <0F> Tj 2.2 0 Td <12> Tj 5.1 0 Td <13> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <11> Tj ET Q q 0 0 0 rg BT 90 75.4 Td /F2 10 Tf <17> Tj 5.5 0 Td <02> Tj 5.6 0 Td <13> Tj 5.5 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <14> Tj 8.4 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <02> Tj 5.5 0 Td <05> Tj 3.4 0 Td <2A> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <09> Tj 5.5 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <0E> Tj 2.7 0 Td <07> Tj 2.8 0 Td <21> Tj 7.2 0 Td <09> Tj 5.5 0 Td <2C> Tj 4.9 0 Td <0A> Tj 2.2 0 Td <2D> Tj 5.5 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <33> Tj 5.5 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <4D> Tj 2.2 0 Td <0C> Tj 5.5 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <14> Tj 8.4 0 Td <04> Tj 5.6 0 Td <05> Tj 3.4 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.5 0 Td <07> Tj 2.8 0 Td <21> Tj 7.2 0 Td <02> Tj 5.6 0 Td <05> Tj 3.2 0 Td <2A> Tj 5.6 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <2A> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <09> Tj 5.5 0 Td <11> Tj 5 0 Td <11> Tj 5.1 0 Td <04> Tj 5.5 0 Td <4B> Tj ET Q Q endstream endobj 2 0 obj 63303 endobj 3 0 obj << /Length 4 0 R >> stream 0 w q 0 -0.1 612.1 792.1 re W* n q 0 0 0 rg BT 90 711 Td /F2 10 Tf <14> Tj 8.4 0 Td <13> Tj 5.6 0 Td <1112> Tj 10 0 Td <0F> Tj 2.2 0 Td <0C> Tj 5.6 0 Td <04> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <14> Tj 8.4 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <3F> Tj 8.3 0 Td <07> Tj 2.8 0 Td <06> Tj 2.7 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <23> Tj 2.7 0 Td <07> Tj 2.8 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.4 0 Td <04> Tj 5.6 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <02> Tj 5.6 0 Td <03> Tj 5.5 0 Td <3E> Tj 2.2 0 Td <04> Tj 5.6 0 Td <12> Tj 5 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <2B> Tj 2.8 0 Td <11> Tj 5.2 0 Td <07> Tj 2.7 0 Td <0C> Tj 5.6 0 Td <06> Tj 2.7 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <4D> Tj 2.2 0 Td <02> Tj 5.5 0 Td <03> Tj 5.5 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2B> Tj 2.8 0 Td <02> Tj 5.6 0 Td <05> Tj 3.3 0 Td <14> Tj 8.4 0 Td <04> Tj 5.7 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <05> Tj 3.3 0 Td <02> Tj 5.6 0 Td <2B> Tj 2.7 0 Td <0A> Tj 2.3 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.7 0 Td <09> Tj 5.5 0 Td <2E> Tj 4.9 0 Td <09> Tj 5.4 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.6 0 Td <07> Tj 2.8 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <12> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 699.8 Td /F2 10 Tf <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <04> Tj 5.5 0 Td <1111> Tj 10.1 0 Td <0A> Tj 2.1 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.8 0 Td <09> Tj 5.5 0 Td <2C> Tj 4.9 0 Td <09> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <120C> Tj 10.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.7 0 Td <12> Tj 5 0 Td <02> Tj 5.6 0 Td <14> Tj 8.4 0 Td <03> Tj 5.5 0 Td <09> Tj 5.6 0 Td <06> Tj 2.8 0 Td <06> Tj 2.7 0 Td <05> Tj 3.4 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <06> Tj 2.7 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <2A> Tj 5.5 0 Td <09> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <12> Tj 5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.6 0 Td <07> Tj 2.7 0 Td <12> Tj 5 0 Td <05> Tj 3.4 0 Td <04> Tj 5.5 0 Td <13> Tj 5.6 0 Td <32> Tj 5 0 Td <07> Tj 2.8 0 Td <33> Tj 5.5 0 Td <07> Tj 2.8 0 Td <05> Tj 3.2 0 Td <04> Tj 5.6 0 Td <12> Tj 5 0 Td <13> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.6 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <2A> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2C> Tj 5 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <09> Tj 5.5 0 Td <13> Tj 5.5 0 Td <2D> Tj 5.6 0 Td <14> Tj 8.3 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <04> Tj 5.5 0 Td <0E> Tj 2.8 0 Td <07> Tj 2.8 0 Td <4E> Tj 5 0 Td <4D> Tj 2.2 0 Td <09> Tj 5.5 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 688.7 Td /F2 10 Tf <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <09> Tj 5.6 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.6 0 Td <14> Tj 8.4 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <1C> Tj 5.6 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <0A> Tj 2.2 0 Td <07> Tj 2.8 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0C> Tj 5.5 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <09> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <0C> Tj 5.6 0 Td <2B> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <11> Tj 5.1 0 Td <11> Tj 5 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <0C> Tj 5.6 0 Td <05> Tj 3.3 0 Td <0A> Tj 2.1 0 Td <2C> Tj 5 0 Td <0C> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <04> Tj 5.6 0 Td <12> Tj 5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.6 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <14> Tj 8.4 0 Td <04> Tj 5.7 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 677.5 Td /F2 10 Tf <0C> Tj 5.5 0 Td <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <13> Tj 5.5 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <13> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.4 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <41> Tj 3.4 0 Td <12> Tj 5 0 Td <0A> Tj 2.2 0 Td <07> Tj 2.7 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <48> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <0C> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <09> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <04> Tj 5.5 0 Td <13> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.6 0 Td <14> Tj 8.3 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <13> Tj 5.5 0 Td <32> Tj 5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.6 0 Td <09> Tj 5.5 0 Td <05> Tj 3.3 0 Td <09> Tj 5.5 0 Td <14> Tj 8.4 0 Td <19> Tj 5.6 0 Td <06> Tj 2.7 0 Td <05> Tj 3.4 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <0E> Tj ET Q q 0 0 0 rg BT 90 655.2 Td /F2 10 Tf <08> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <11> Tj 4.9 0 Td <2E> Tj 5 0 Td <11> Tj 4.9 0 Td <06> Tj 2.8 0 Td <19> Tj 5.5 0 Td <14> Tj 8.4 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <02> Tj 5.5 0 Td <02> Tj 5.5 0 Td <05> Tj 3.4 0 Td <2A> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <0C> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.7 0 Td <121C> Tj 10.6 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <0A> Tj 2.2 0 Td <07> Tj 2.7 0 Td <04> Tj 5.6 0 Td <11> Tj 4.9 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.1 0 Td <07> Tj 2.8 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <0F> Tj 2.1 0 Td <09> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.7 0 Td <4F> Tj 6.7 0 Td <41> Tj 3.4 0 Td <50> Tj 6.5 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <4D> Tj 2.2 0 Td <09> Tj 5.6 0 Td <14> Tj 8.3 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <23> Tj 2.8 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <06> Tj ET Q q 0 0 0 rg BT 90 644.1 Td /F2 10 Tf <2A> Tj 5.5 0 Td <4D> Tj 2.2 0 Td <0C> Tj 5.6 0 Td <12> Tj 4.9 0 Td <02> Tj 5.6 0 Td <13> Tj 5.5 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <06> Tj 2.8 0 Td <31> Tj 5.5 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2D> Tj 5.5 0 Td <13> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <2A> Tj 5.5 0 Td <09> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0E> Tj 2.7 0 Td <07> Tj 2.8 0 Td <08> Tj 5.5 0 Td <4D> Tj 2.2 0 Td <09> Tj 5.6 0 Td <3204> Tj 10.5 0 Td <07> Tj 2.7 0 Td <4F> Tj 6.7 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <11> Tj 5.1 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <1C> Tj 5.5 0 Td <02> Tj 5.5 0 Td <05> Tj 3.3 0 Td <0A> Tj 2.2 0 Td <4B> Tj 4.9 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.7 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.1 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <4D> Tj 2.2 0 Td <09> Tj 5.6 0 Td <14> Tj 8.3 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <2C> Tj 5 0 Td <04> Tj 5.5 0 Td <05> Tj 3.3 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <4D> Tj 2.2 0 Td <0C> Tj 5.5 0 Td <12> Tj 5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <23> Tj ET Q q 0 0 0 rg BT 90 632.9 Td /F2 10 Tf <0F> Tj 2.2 0 Td <4D> Tj 2.2 0 Td <09> Tj 5.5 0 Td <3204> Tj 10.5 0 Td <07> Tj 2.8 0 Td <50> Tj 6.5 0 Td <07> Tj 2.7 0 Td <04> Tj 5.6 0 Td <11> Tj 4.9 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <2C> Tj 5 0 Td <04> Tj 5.5 0 Td <05> Tj 3.3 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <12> Tj 5 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.8 0 Td <2C> Tj 4.9 0 Td <04> Tj 5.6 0 Td <05> Tj 3.3 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <1C> Tj 5.6 0 Td <09> Tj 5.5 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <4D> Tj 2.1 0 Td <09> Tj 5.6 0 Td <3204> Tj 10.5 0 Td <07> Tj 2.7 0 Td <5107> Tj 8.9 0 Td <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <11> Tj 4.9 0 Td <2C> Tj 5 0 Td <04> Tj 5.5 0 Td <05> Tj 3.4 0 Td <1104> Tj 10.6 0 Td <07> Tj 2.7 0 Td <09> Tj 5.5 0 Td <13> Tj 5.6 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <4F> Tj 6.7 0 Td <41> Tj 3.4 0 Td <50> Tj 6.6 0 Td <0E> Tj 2.6 0 Td <07> Tj 2.8 0 Td <08> Tj 5.5 0 Td <04> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <1102> Tj 10.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <0C> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <02> Tj 5.7 0 Td <14> Tj 8.4 0 Td <14> Tj 8.4 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 621.8 Td /F2 10 Tf <0F> Tj 2.2 0 Td <4D> Tj 2.2 0 Td <0A> Tj 2.1 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <04> Tj 5.5 0 Td <05> Tj 3.4 0 Td <11> Tj 5 0 Td <04> Tj 5.5 0 Td <12> Tj 5.1 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <09> Tj 5.6 0 Td <07> Tj 2.7 0 Td <1113> Tj 10.6 0 Td <05> Tj 3.3 0 Td <2B> Tj 2.8 0 Td <09> Tj 5.6 0 Td <12> Tj 5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <09> Tj 5.5 0 Td <2C> Tj 5 0 Td <04> Tj 5.5 0 Td <12> Tj 5 0 Td <07> Tj 2.8 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.6 0 Td <0F> Tj 2.1 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <1C> Tj 5.5 0 Td <02> Tj 5.6 0 Td <05> Tj 3.2 0 Td <0A> Tj 2.2 0 Td <4B> Tj 4.9 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.1 0 Td <07> Tj 2.8 0 Td <50> Tj 6.6 0 Td <41> Tj 3.2 0 Td <510E> Tj 8.9 0 Td <07> Tj 2.8 0 Td <08> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <5107> Tj 8.8 0 Td <2A> Tj 5.5 0 Td <4D> Tj 2.2 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <4D> Tj 2.2 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj ET Q q 0 0 0 rg BT 90 610.6 Td /F2 10 Tf <2A> Tj 5.5 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <0C> Tj 5.5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <12> Tj 5.1 0 Td <07> Tj 2.7 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <2B> Tj 2.8 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <12> Tj 5 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <30> Tj 1.9 0 Td <09> Tj 5.5 0 Td <03> Tj 5.6 0 Td <1112> Tj 9.9 0 Td <0A> Tj 2.3 0 Td <11> Tj 5 0 Td <11> Tj 5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <4F> Tj 6.8 0 Td <07> Tj 2.7 0 Td <0B> Tj 5.5 0 Td <02> Tj 5.6 0 Td <05> Tj 3.3 0 Td <14> Tj 8.4 0 Td <09> Tj 5.6 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <0C> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <09> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <05> Tj 3.3 0 Td <09> Tj 5.5 0 Td <17> Tj 5.6 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <05> Tj 3.4 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <33> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <09> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <2D> Tj 5.5 0 Td <13> Tj 5.5 0 Td <04> Tj 5.6 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <02> Tj 5.5 0 Td <05> Tj 3.4 0 Td <2A> Tj 5.5 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 599.5 Td /F2 10 Tf <0F> Tj 2.2 0 Td <02> Tj 5.5 0 Td <12> Tj 5 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <02> Tj 5.6 0 Td <14> Tj 8.4 0 Td <14> Tj 8.4 0 Td <04> Tj 5.7 0 Td <07> Tj 2.8 0 Td <14> Tj 8.3 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <05> Tj 3.4 0 Td <0C> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <2D> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <0A> Tj 2.3 0 Td <41> Tj 3.3 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.5 0 Td <1111> Tj 10 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <11> Tj 5 0 Td <44> Tj 2.8 0 Td <07> Tj ET Q q 0 0 0 rg BT 90 226.5 Td /F2 10 Tf <08> Tj 5.5 0 Td <4D> Tj 2.2 0 Td <0C> Tj 5.5 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.6 0 Td <09> Tj 5.5 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <06> Tj 2.7 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <13> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <0C> Tj 5.5 0 Td <12> Tj 5 0 Td <05> Tj 3.3 0 Td <0A> Tj 2.3 0 Td <05> Tj 3.2 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <0C> Tj 5.5 0 Td <05> Tj 3.3 0 Td <0A> Tj 2.2 0 Td <2C> Tj 4.9 0 Td <0C> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <11> Tj 5 0 Td <04> Tj 5.6 0 Td <12> Tj 5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <05> Tj 3.3 0 Td <02> Tj 5.6 0 Td <2B> Tj 2.7 0 Td <0A> Tj 2.3 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.7 0 Td <04> Tj 5.6 0 Td <11> Tj 4.9 0 Td <06> Tj 2.8 0 Td <44> Tj ET Q q 0 0 0 rg BT 126 215.3 Td /F2 10 Tf <513030> Tj 10 0 Td <07> Tj 2.7 0 Td <52> Tj 5.8 0 Td <07> Tj 2.8 0 Td <53> Tj 6.6 0 Td <07> Tj 2.7 0 Td <54> Tj 3.9 0 Td <07> Tj 2.7 0 Td <0D> Tj 3.4 0 Td <07> Tj 2.7 0 Td <41> Tj 3.4 0 Td <22> Tj 6.6 0 Td <07> Tj 2.8 0 Td <54> Tj 3.8 0 Td <07> Tj 2.8 0 Td <0D> Tj 3.3 0 Td <26> Tj 5.5 0 Td <07> Tj 2.8 0 Td <41> Tj 3.4 0 Td <07> Tj 2.7 0 Td <4F15> Tj 9.9 0 Td <5522> Tj 11.3 0 Td <1E> Tj 6.7 0 Td <07> Tj 2.7 0 Td <56> Tj 5.5 0 Td <07> Tj 2.8 0 Td <22> Tj 6.6 0 Td <01> Tj 7.2 0 Td <07> Tj 2.8 0 Td <54> Tj 3.8 0 Td <07> Tj 2.8 0 Td <4F> Tj 6.6 0 Td <15> Tj ET Q q 0 0 0 rg BT 90 193 Td /F2 10 Tf <29> Tj 7.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2F> Tj 5.6 0 Td <13> Tj 5.5 0 Td <0A> Tj 2.1 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <09> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0C> Tj 5.5 0 Td <2D> Tj 5.6 0 Td <05> Tj 3.3 0 Td <09> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.4 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <05> Tj 3.4 0 Td <02> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.8 0 Td <44> Tj 2.7 0 Td <07> Tj ET Q q 0 0 0 rg BT 126 181.3 Td /F2 10 Tf <5130> Tj 8.1 0 Td <07> Tj 2.7 0 Td <52> Tj 5.8 0 Td <07> Tj 2.7 0 Td <53> Tj 6.6 0 Td <07> Tj 2.8 0 Td <54> Tj 3.8 0 Td <07> Tj 2.8 0 Td <0D> Tj 3.4 0 Td <07> Tj 2.7 0 Td <22> Tj 6.6 0 Td <07> Tj 2.8 0 Td <54> Tj 3.8 0 Td <07> Tj 2.8 0 Td <0D> Tj 3.3 0 Td <26> Tj 5.6 0 Td <07> Tj 2.7 0 Td <41> Tj 3.4 0 Td <07> Tj 2.7 0 Td <4F> Tj 6.7 0 Td <15> Tj 3.3 0 Td <550D> Tj 7.9 0 Td <22> Tj 6.7 0 Td <1E> Tj 6.6 0 Td <07> Tj 2.8 0 Td <35> Tj 5.8 0 Td <07> Tj 2.7 0 Td <26> Tj 5.6 0 Td <15> Tj 3.3 0 Td <07> Tj 2.8 0 Td <45> Tj 2.7 0 Td <07> Tj 2.8 0 Td <0D> Tj 3.2 0 Td <22> Tj 6.7 0 Td <1E> Tj 6.6 0 Td <07> Tj 2.8 0 Td <35> Tj 5.8 0 Td <26> Tj 5.5 0 Td <15> Tj 3.3 0 Td <07> Tj 2.8 0 Td <56> Tj 5.5 0 Td <07> Tj 2.8 0 Td <22> Tj 6.6 0 Td <01> Tj 7.2 0 Td <45> Tj 2.7 0 Td <18> Tj 5.6 0 Td <07> Tj 2.7 0 Td <54> Tj 3.9 0 Td <07> Tj 2.7 0 Td <4F> Tj ET Q q 0 0 0 rg BT 343.9 181.3 Td /F4 10 Tf <00> Tj ET Q q 0 0 0 rg BT 347.5 181.3 Td /F2 10 Tf <07> Tj 2.8 0 Td <35> Tj 5.7 0 Td <07> Tj 2.8 0 Td <29> Tj 7.2 0 Td <07> Tj 2.8 0 Td <15> Tj ET Q q 0 0 0 rg BT 90 158.7 Td /F2 10 Tf <20> Tj 6.7 0 Td <06> Tj 2.7 0 Td <07> Tj 2.7 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.8 0 Td <09> Tj 5.5 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <19> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.7 0 Td <13> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <11> Tj 5 0 Td <04> Tj 5.6 0 Td <1202> Tj 10.5 0 Td <0B> Tj 5.6 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0C> Tj 5.5 0 Td <2D> Tj 5.6 0 Td <05> Tj 3.2 0 Td <09> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <44> Tj 2.7 0 Td <07> Tj ET Q q 0 0 0 rg BT 126 147 Td /F2 10 Tf <5107> Tj 8.9 0 Td <52> Tj 5.8 0 Td <07> Tj 2.7 0 Td <53> Tj 6.6 0 Td <07> Tj 2.8 0 Td <54> Tj 3.8 0 Td <07> Tj 2.8 0 Td <0D> Tj 3.3 0 Td <07> Tj 2.8 0 Td <41> Tj 3.4 0 Td <22> Tj 6.6 0 Td <07> Tj 2.7 0 Td <54> Tj 3.9 0 Td <07> Tj 2.7 0 Td <0D> Tj 3.3 0 Td <26> Tj 5.6 0 Td <07> Tj 2.8 0 Td <41> Tj 3.3 0 Td <07> Tj 2.8 0 Td <4F> Tj 6.7 0 Td <15> Tj 3.2 0 Td <55> Tj 4.7 0 Td <0D> Tj 3.3 0 Td <22> Tj 6.6 0 Td <1E> Tj 6.7 0 Td <07> Tj 2.7 0 Td <35> Tj 5.8 0 Td <07> Tj 2.8 0 Td <18> Tj 5.5 0 Td <15> Tj 3.3 0 Td <07> Tj 2.8 0 Td <45> Tj 2.8 0 Td <07> Tj 2.7 0 Td <0D> Tj 3.4 0 Td <0D> Tj 3.3 0 Td <07> Tj 2.8 0 Td <22> Tj 6.7 0 Td <1E> Tj 6.5 0 Td <07> Tj 2.8 0 Td <35> Tj 5.7 0 Td <07> Tj 2.8 0 Td <18> Tj 5.5 0 Td <15> Tj 3.4 0 Td <07> Tj 2.7 0 Td <54> Tj 3.9 0 Td <07> Tj 2.7 0 Td <0D> Tj 3.3 0 Td <22> Tj 6.6 0 Td <1E> Tj 6.7 0 Td <07> Tj 2.7 0 Td <35> Tj 5.8 0 Td <26> Tj 5.5 0 Td <15> Tj 3.4 0 Td <15> Tj 3.3 0 Td <07> Tj 2.8 0 Td <56> Tj 5.5 0 Td <07> Tj 2.8 0 Td <22> Tj 6.6 0 Td <01> Tj 7.2 0 Td <45> Tj 2.7 0 Td <3B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <54> Tj 3.9 0 Td <07> Tj 2.7 0 Td <4F> Tj ET Q q 0 0 0 rg BT 400.9 147 Td /F4 10 Tf <01> Tj ET Q q 0 0 0 rg BT 404.5 147 Td /F2 10 Tf <07> Tj 2.8 0 Td <35> Tj 5.7 0 Td <07> Tj 2.8 0 Td <29> Tj 7.2 0 Td <07> Tj 2.8 0 Td <54> Tj 3.8 0 Td <07> Tj 2.8 0 Td <4F> Tj 6.7 0 Td <07> Tj 2.7 0 Td <35> Tj 5.8 0 Td <07> Tj 2.8 0 Td <24> Tj 6.6 0 Td <07> Tj 2.7 0 Td <15> Tj ET Q q 0 0 0 rg BT 90 124.4 Td /F2 10 Tf <16> Tj 6.7 0 Td <02> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <11> Tj 4.9 0 Td <09> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.3 0 Td <11> Tj 5 0 Td <2B> Tj 2.7 0 Td <09> Tj 5.6 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.4 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <2A> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <0D> Tj 3.3 0 Td <4F> Tj 6.7 0 Td <52> Tj 5.8 0 Td <27> Tj 5.6 0 Td <23> Tj 2.7 0 Td <07> Tj 2.8 0 Td <51> Tj 6 0 Td <52> Tj 5.8 0 Td <27> Tj 5.6 0 Td <15> Tj 3.3 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <0D> Tj 3.4 0 Td <4F52> Tj 12.4 0 Td <26> Tj 5.6 0 Td <23> Tj 2.8 0 Td <07> Tj 2.7 0 Td <51> Tj 6.1 0 Td <52> Tj 5.8 0 Td <27> Tj 5.5 0 Td <15> Tj 3.4 0 Td <07> Tj 2.7 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <2A> Tj 5.6 0 Td <07> Tj 2.7 0 Td <44> Tj 2.8 0 Td <07> Tj ET Q q 0 0 0 rg BT 126 113.3 Td /F2 10 Tf <24> Tj 6.6 0 Td <07> Tj 2.8 0 Td <52> Tj 5.7 0 Td <07> Tj 2.8 0 Td <22> Tj 6.6 0 Td <07> Tj 2.8 0 Td <45> Tj 2.7 0 Td <07> Tj 2.8 0 Td <0D> Tj 3.3 0 Td <0D> Tj 3.3 0 Td <22> Tj 6.6 0 Td <1E> Tj 6.7 0 Td <07> Tj 2.8 0 Td <35> Tj 5.7 0 Td <07> Tj 2.8 0 Td <18> Tj 5.5 0 Td <15> Tj 3.4 0 Td <07> Tj 2.7 0 Td <54> Tj 3.9 0 Td <07> Tj 2.7 0 Td <0D> Tj 3.3 0 Td <22> Tj 6.6 0 Td <1E> Tj 6.7 0 Td <07> Tj 2.7 0 Td <35> Tj 5.8 0 Td <07> Tj 2.8 0 Td <26> Tj 5.5 0 Td <15> Tj 3.3 0 Td <15> Tj ET Q q 0 0 0 rg BT 126 102.1 Td /F2 10 Tf <29> Tj 7.2 0 Td <07> Tj 2.8 0 Td <52> Tj 5.7 0 Td <07> Tj 2.8 0 Td <22> Tj 6.6 0 Td <01> Tj 7.2 0 Td <07> Tj 2.8 0 Td <45> Tj 2.7 0 Td <07> Tj 2.8 0 Td <3B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <56> Tj 5.5 0 Td <07> Tj 2.7 0 Td <24> Tj ET Q q 0 0 0 rg BT 90 79.8 Td /F2 10 Tf <08> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <14> Tj 8.4 0 Td <09> Tj 5.6 0 Td <320A> Tj 7.2 0 Td <14> Tj 8.4 0 Td <13> Tj 5.6 0 Td <14> Tj 8.6 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <51> Tj 6.1 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <2C> Tj 4.9 0 Td <0C> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2F> Tj 5.6 0 Td <13> Tj 5.5 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <2A> Tj 5.5 0 Td <07> Tj 2.8 0 Td <51> Tj 6.1 0 Td <3007> Tj 4.7 0 Td <52> Tj 5.7 0 Td <07> Tj 2.8 0 Td <27> Tj 5.5 0 Td <23> Tj 2.8 0 Td <07> Tj 2.7 0 Td <1204> Tj 10.6 0 Td <07> Tj 2.7 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.6 0 Td <0A> Tj 2.1 0 Td <07> Tj 2.8 0 Td <17> Tj 5.6 0 Td <04> Tj 5.5 0 Td <05> Tj 3.3 0 Td <14> Tj 8.4 0 Td <04> Tj 5.5 0 Td <06> Tj 2.9 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <11> Tj 5 0 Td <13> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <09> Tj 5.6 0 Td <0F> Tj 2.2 0 Td <12> Tj 4.9 0 Td <13> Tj 5.6 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <53> Tj 6.6 0 Td <07> Tj 2.8 0 Td <17> Tj 5.6 0 Td <02> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <51> Tj ET Q Q q 192.2 257.7 227.7 317.3 re W* n q 227.7 0 0 317.2 192.2 257.9 cm /Im5 Do Q Q endstream endobj 4 0 obj 25919 endobj 5 0 obj << /Type /XObject /Subtype /Image /Width 384 /Height 532 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Length 20178 >> stream џиџрJFIFџлC    ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROџлC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOџР€"џФ џФЕ}!1AQa"q2‘Ё#BБСRб№$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™šЂЃЄЅІЇЈЉЊВГДЕЖЗИЙКТУФХЦЧШЩЪвгдежзийкстуфхцчшщъёђѓєѕіїјљњџФ џФЕw!1AQaq"2B‘ЁБС #3R№brб $4с%ё&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™šЂЃЄЅІЇЈЉЊВГДЕЖЗИЙКТУФХЦЧШЩЪвгдежзийктуфхцчшщъђѓєѕіїјљњџк ?єъ(Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€+_нЅ……ХфЁš;xšW ŒЃ'8Ю­fišмзkЬ№Z%„Жя8Л†хЄE TХЃ]Ї’y9[ `жћмЧapі1Ќ—+QŽ>аyN;­ršv‰:јŠЛmДЋ+‹vMNео&‚cЗ Tœœ“’B‚шIЋŽівiR(n ’GˆLЈВZ2pеsпЅR—ФZ$qТяЋYl™Ьhтu+И žs€Fr{дŒфx{Oy4­B;јЄКŠ;MЕMЪKhй—‚f#i9\љhOL—ZУЌЧkbзVwwFЦ§Œaо;Р`uЯ™ДАgС9’3šкЕдVmFчO•­–т0HюБCаВр2žA Œ|Уѓ…ўкв<П7ћRЫfЯ3wк7mнœєнЦzgŽЕЯјw@šТід-&ЙЙГ–fQ’ёŠ:Щ’XFXчv#ИœfХЌˆўЭпЅ\Ї•Њ\\I™!љ#“ЭкNŸѕУ“ђЗЖ@7'дl-эcЛИНЗŠо\yrМЊЈй9СШЩеrИgаoЄКŠђюЪютжUКŠkю„O’w6C…`AUeншyЧжšђјZm*н"оЩ­уMх’<ЁP7’Љ g§?XДдoюmьg‚т8"ЬаЪХЦо8lЏёtѕЕg{i–ЪъˆеЖ–†@рg№Gц+–Лг5=^гQЕŽТM\щаA2FcVм˜Ч–йкCэЮШшЏ‡ЌEЛ\]Ж—=Œї+˜ЯxnйAw0к3€r ч `dFmFТою;[‹лhЎ$ЦШd•Uп'œœ‘Ž;вџhи§ПьmЖћgќћљЋцtЯнЮzsгЇ5ЇGЋC{{g}ЄЧ<^™сЛЉVRСp~mШ…Р#хQРЊБд_ЫгŸKVHѕ_ЕЅс• ,~q— }рј&<ŽIЮ nЎ­ІДГDКЁ’нYІA2“S†,3РЩщоˆѕm6U-Ѓhъ"3ГЉ§и$р§аAєbАєЫ-G~ƒouЅ$'HVWЛ2Ѓ3уцУd1Ш\mЧ'Z ^A‡7 vf6вд\FГљЊ„ЉaЇ`€xщЩкДзl.aОИћUВйкЬ"ћOžІ6Ъ#gwAЫэЦzТЌFС­Rь^лwнЖQ*ьm “ƒœb}>•€bе ф—ыЄN6jItАЩ,AфŒлљ-Д†#p9lg=ia|ЗQ^7Шjэrа$ˆZ8Ь іч–У ?1ъs@Rъ–IІ>ЂЗ0ЫjЊH•f@ŒAЦ$ёЩ<LМ:t7š•Э•ЊKЎ.CDйЩ\…Ю@ЯAпЎ3\ѕоЉH-&\ВYjR=ДW>KN’Л‘X`Ј~„Љ9a1MсІ†k)"гn_LВZО›ёG„3—мXИ Л€ЫЛŒP]q{ik41\нA “ЖиVI™@ТƒЩ<ŽžЕO]жbбma–_,чXЅЧb ЫАhР<рѓŒрdŒщl/,ЏєЙ4Ћ9уhЃ†кр$ЊіцpTю`хU‚фч9 hыПhkXc‡JS†Iеnmп`§о м €zћuЗдЄŽоъ]b(,кP…ЬљU!ƒ2ЏmН:‚)Въ;Е]: ;н9ЁI#is4ŠW(бpFAЩ<`q\о›ЄъњbOЅмzке­ /—Њcrь…Щ@ Ѓ$ЅИЩЩбг,я‘tИ_OЙ…-ѕ ™нІ•Њ0—nHrI>jŽч!‰ьH…–Ї"iЖЏ-Єйо–@ХFQ ?{ш3вЎ&Ѓa$xя­к ‘eRЅT€Эœу ш;з=qo­AЏJлLћEЙН“| *(b…Щ–л‘хИ сˆРмHбxЎЁЛГдbвп шіа<{дШшс‰%W?!-‚~fрАЩ  rkZ\wvжЯЈ[ nIљƒїŠHƒœ’1ыЮ3ƒцtЛkћU№љ—OŸ6і i8bbbЭЪ‘2qŽ3ХtдQEQEQEQEaxЪy №žЂaЇ’hМ„3’d!89?7NјЧzБсН[ћsBЗдќ#ЯнћНћЖсŠѕРЯOJеЎ'сд`}oGHdкоГE,‡™–ŒvƒЩHРХiј“PОД7ЇЫ!{+SrёЊ Œ˜ƒ#0,A@Ш9 @GErКЕеЇŒэtЕеэg•RD`лБY ТNЬbO“јSŽ бЉ­пызLж–vЖыm4€^3€nЭлœЖTюр Iшя5 ?gляm­МЬьѓЅTнŒg#8Шќш]FХч†НЗiЇO2ФЊZE Ъ3ШР<CFЁЇйj–­mЈ[Eq ЯЪыœШ=AС8#gƒ\ї‚втся'дnфККгg“LIX‚XЎHмЧžЄ*їЩ mQ@Q@Q@Q@UОГЗдlхДН…fЗ•vК7C§AG €jеVЦЮпNГŠвЪ†о%кˆНѕ$žI<’IЋTQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@TОгэuoіИМЯГNЗ|Фm‘sƒСЦOjЗE`ј{OД2KЉљ_щž}нП™ИџЋћLŒgyЮ3ZzN™}(–ћNДЙ.аѓBЎ@Щ8Žœž*Ш:_њ§Лџв‰+R€3ŸEвeB’ivL­З*жшAк6Џь аp8ЉWNБIс,­жhЫ†A†@ *œp0OдеЪ(Њvzu†ŸПьVжоf7љ1*nЦqœœdўurŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(Њ:ЎЉcЄY›НFх`ƒ!wI$єI=x=b§ŸWё&N ВщZIс­2 їHyљиsЦQЯ, щ@еМO"5нŸ‡Ќ›UОЕVѓе8H8у'ј›Щ ГДb(Й’§IlœДrFрx зGcgoЇYХie УoэD^ƒњ’O$žI$аf—сјэoЇЈмЖЅЋ+іЉ&еш|Њ1žG$–чœVэP\м№§ƒЧvЗJ$j–Џnс цЧѓЋ9Ю )М Œ€Ищœt•ƒуv“@’юЎ4ч[и|ТB†Œю9ЎT0ЧПn zŠ‚жц+ЛHnmпt3"Ш‚2Єdyшjz(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠЫ№їќƒЅџЏлП§(’Е+/Упђ—ўПnџєЂJд Š( Š( Š( Š( Š( Š( Š( Š( Б|Wy-žp-NnюqmlЂQ$;Fгъ2[ўzuUЬъЎoМmЄi€)ŽЮ'д&Iטу*pNрФžУП$ nиZ%……НœEš;x–$/ŒЃ8ЮЅYЂŠ(ЂŠ*9bŽhž)QdŽEкЪУ!р‚;ƒRQ@їƒhІLѓМКmФ–­$ЋДИr 8RŒИ§8С= s!†›ё“ЫD‹XД9$™'„œЯЫ#ЈрcœчІ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š(  ПШ:_њ§Лџв‰+RВќ=џ щыіяџJ$­J(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ+—№~/Ў5}|}нFчlxW†!БOЭœњtЏxЖђтЫУWѓZE+м2Ђ{€Ўr 1Щ?\бєєвє›]>=ЅmуT%T(b-а“’}Э^ЂŠ(ЂŠ(ЂŠ(žёr›k;]f%s&—pГЗ—whЫ*ŒєX“ўшщдt5Zўб/ь.,х,БмDб9Ld8ШЦp}++СsЭ/†-aЙђжцЯuЄЩхДdЎ ч|фpEoQEQEQEQEQEQEQEQEQEQE—сяљKџ_ЗњQ%jV_‡Пф/§~нџщD•Љ@Q@Q@Q@Q@Q@Q@Q@Q@оГГQёN‘Ѕ~э–зvЃ2ЖрУoЩp~v$івW=сІkыЭWY,Ц;Ћ&п ХЪqа2њЯC@Q@Q@Q@sкrЖŸт§FШ+/т[шЖФСЪ7ЌvЧыЮ3“аз3тФ6зš.Д…@БМЬв0‘Mђ3‘Ш%qƒЦrA€šŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š(  ПШ:_њ§Лџв‰+RВќ=џ щыіяџJ$­J(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ++ФЗгiКхЭВЪз6@#@эц1 ˜ЏЬУзшzV­szЮЭGХ:F•ћЖ[]кŒЪлƒ П$dСљи’?йќЖЇІ—Єкщёэ+oЁ*ЁC9l„œ“юjѕPEPEPEPTu=5M&ыO“h[ˆйe ‘У`ѕ рqWЈ   jGX№е…ћ–2I3 :хXрp ‘эщвЕы›аQtяkzY|щЦЁ4€Д‹ УсG +Љ>Ѓ=‰щ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(/Упђ—ўПnџєЂJдЌПШ:_њ§Лџв‰+R€ (Ђ€ (Ђ€ (ЌнoVM"Э%0МѓЭ*Сo œyВЗн\žrO@^вЂЙЭNџTв^еЎЕMd“ЊШ’ЦmиЧ‘НДЄў€ъЎЉfгAЪфмK$1Ÿ-А^2лдœ`ЕБ’3ƒŒаъ+ Mе"DЙ{›љюKнШБ#XМOюќСЭ˘„ƒŽr\UЇз4фгвњIй`’_%‰УД›Šэ ХВРраc­G&”/nƒ {‰Ђ.СduG‚ХЖЎHЦF РтУjіKn$•ФˆЮЉюBВЋe@$ЮdфppЁEeYыЖWЗыin.]žчY>Ют6GЉмF zрdрd‚­ЯxišњѓUжK1ŽъуЩЗФТD1Cђ†\tŒ‡ўГkХ:‘бќ5~…„‘ФDl ЎиU8< ћzєЉє=<щz%•‰ЋA Ѓљc \˜ŽS“г'Љ  (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€9ŸHкw‰4IBˆц•Дљі .ў`1’>шeЩч#eŸQжЇбѕе4›]B=Ёn#W!X0RG+‘дƒ}Х^ЂŠРИеoюѕљД!mдZ"=еЬс˜FXЈ#I$sЛdp(~Šцn5 cMдmЦ­-ЇиžсQ%ЗˆЉ”І% cЛzЧ€Мœ€2IbпTГИŽоHЄl\JаЦ6R]CRБКгщ@ЈЌy|CaV’…Л‘.хx“eЌŒU“vрЫЗp9R1Œ№N0 ІБ`њˆгжу§!Зl,…~№V#kz€I9hбEQEQEQEQEQE—сяљKџ_ЗњQ%jV_‡Пф/§~нџщD•Љ@Q@Q@fыzJjіi™рžV{y”gЪ•~ы`№Рsz‚zpF•Э_iКжЎкRъи@ЖW‘нI$3;я( Ov8Е гu(Џ-$Д{[{љnŒ;+А“ЬШйА€GšqѓsЗЖxшh  ьЛџэЕэЖџЇкvy­ўЋьўNsЗя:vЯziг5(эс0}“эК”ЗQ+Л–9L† eЗ@У*:фуЁЂ€9СЇkI[}ЖЫ#^Ы4Љф‘‡йм" e!™zBѕС"HПВЙГy ВŠ~жІ8eb%‘d]Ѓ`JуŒщ]ЯhznЇІЫl'KFl Е•’v%LFLA НHЧ=qЯCEЫkџё2ёV‰Є/)nчRŸo 8Œ‚x Б “єы]MqЖ=ЇˆѕvїYГѓЁ{Ёin’ƒ”Hx,С›9‚ <жˆ№Є nš]ўЉЇGnХ–;{Ж(I9х_pЦsЦ0rsšшhЎyЌ|OjЗi­к^Г01G{gА(ЯBб‘“ƒзiЩiЩЈј† сŠыAŽт=™–{+ЕРlHѕ3Р=Iт€7шЌ пOeГЮ№юЖлѓ"цЦ1зcœuяж›gт˜Ў&)6‹ЎZЈ\я—Or ШрmмsјcŠшhЌ Яhš~ЯЗЯsmцgge:nЧ\eq‘VџЗЌџчŽЅџ‚лў7@”W7qтД†wŽ-_ИQвHь+qž7`ћrѕЉэ5ћ‹ШŒ‘x{YU Д‰’(ŽpG9ыŒ~F€7hЎmЕмМакш6ж}LSооR28)'$gŒрzžтщў)ЙxfКз­Ќњ `ВГЄdђBNHЧ8Рє=Р:Jц|&цкѓZб\(7†HV5)ОuQ€9Жr8Ю pє№…“лЫЁЋjPЩŒЧwzхFz)ѓƒЮz bЂ{H ШЇ– dКYВ9ЩЧ8РгPEPEPEPEPEPEPEPVб]кMmp›Ё™7\‘•#qЯCYИi4э&xкуNvВ›Ы(hЮб‚zхBœћіш7Ћ›ВћEŸŽѕvѓпPЕKДc‘Дx”„‘А“СƒС ’Š( Š( Š( Š( Š( Š( Š( Š(  ПШ:_њ§Лџв‰+RВќ=џ щыіяџJ$­J(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ+3Фбє+н@• DІрH.xP@чˆQжДыšёDrj:ž‹Ѓьcї qrqЙLp€v:є*Х”rp8'{Ткiбќ5a`с„‘Ф ŠФЎйf {zѕ­z( Š( Š( Š( Š( Š( Š( Š( ЙЯэВўЭз–ПйЗKцМ›Žиd§лрЇцSџяаєuGXггTвnДљ6…ИPСI6RїzŠЧ№Нм—žА’eœLБІ§џ1ЦЮyЮх=yѕчŠи Š( Š( Š( Š( Š( Š( Š(  ПШ:_њ§Лџв‰+RВќ=џ щыіяџJ$­J(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ+›бЖj>)еѕ_нВкэгЁeмmљфЮРўЯтuЕA4Н&ыP“i[xйРf Тфє$рsPxjЦm7@ГЖЙiZр&љЬŽМЦ%Ÿ$uљ˜њ§OZеЂŠ(ЂŠ(ЂЃ–Xс‰х•ж8у]ЬЬpI'АE,sD’Фы$r.хe9  ƒм’Š( Š‚ ˜.<ЯГЯОS˜фисЖ0ъЇу"Ї Š( Š( Š*ŒšЖ›чифдmшАQLЁђqЗ9ЩЯОE^Ђ Žц g–о9уyЁЧ›И,™FG#=jzцєmšwŠu}+їjЗ[uUw;ОI 'ѓЈ Еј’ЙЭ~/ВјƒCжI…œйN"NY%Mч?u_oŒЖG<Ž€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€2ќ=џ щыіяџJ$­JЫ№їќƒЅџЏлП§(’Е(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(žё*Еѕц•ЃcеЧq˜Dˆb‡ц*йш Ц§Gbўэ,,./% блФвИLd…8ЩЦp=kFйЈјЇWеvЫkЗN…—paЗчx?;ћ?‰ш%Š9ЂxЅE’9k+ †‚ю cЩ}ЉZX\j“Iasf–r\*[† P$$†R7|лWБЧ$<њєWЏaцщвM5ЋЭm/’шЁ‘”2Кю$‚pAуž ZАа4­:­ЇюY?.YUUnY@r@ѕРЮp(Га4ЫцкUšnЯ#:F3…V,JœсHчЈ“Їjž!ОўЮipћst­ВI<ИеSТšj[ъ6KtžpМ1яФœcnO\c™/4Яэ\‹л жВšж8<июМИлa`ЪВ яeO9ш9:УKГ[л{Єу’к# J’2Ђ!ъЁ ŽQиz dкъzДЫЅмВћ>Ќ‡ЫQяЗs‘2wb@qА“‚1аgкСwœ7—_йw+ЌшЂKН оfG2Ї'#ƒŒsŒж§Ÿ‡єЛ+ДЙЖЕкёoђ‘™!оrл’Љ“§а8уЁЇEЂXEl–Ш“˜–р\…{™їЗd’Ф‘ЛцСрžqžh;XЃOjlˆЊdДЖg Xю˜dњœ3шЅkеXьс†ђ{ХWѓЇUYЛ…Юа$2xrI<еЊЪё.Ÿ§ЉсЭBФEцЩ, хІэЙrœфN=xЇxRЦ…eЈЅІˆкЧ <р0#№ъzжsоVБМеtbЌ#ЕИѓ­ёS|СW@a ЯџЈt5OPд-єлVЙМ2,K’ЭO&а$ 0IтЎV~З хЮumІ›ДЪ…мЎшР'#*0БнІшЎ’exѓ.љ#цBШШ!Ž"€с”зцб„sam#\\!kFЃљЯИn€FsŒФѕ:ўFНџA-7џђёъ<=џ щыіяџJ$­JЫђ5яњ iПј/“џQфkпєг№_'џ­J(/ШзПш%ІџрОOў=G‘ЏаKMџС|ŸќzЕ(  П#^џ –›џ‚љ?јѕFНџA-7џђёъдЂ€2ќ{ў‚Zoў фџудyї§ДпќЩџЧЋRŠЫђ5яњ iПј/“џV‹uэ[У:j\Щ{ІЯ4ЏВ(E›!nффЪHu8<8ЮkЋКЙŠввk›‡л (в;`œ('Žz ѓЩКюЋЅо]G‰5›ЌCሂТѓ60 ќЬ@lђЦ‚cMКёO‡4ДƒVVж6мnвмн\™Єл*А IЩƒƒз‚z:њїU‹ЬгЕэсBЋ0K'%A‡•'žƒщ] dj>г5ŸЕМ/шRюкCЋ•лЫŒr;cаќ{ў‚Zoў фџудyї§ДпќЩџЧЊ„v~(гМЈ­5 -Jм9Ял‘Ѓ™cwІC–+œѓЮpxž[]Ћ­hz•‰ивK*F. ‰FNKЧ“аzqžxц€4<{ў‚Zoў фџудyї§ДпќЩџЧЉњvГЅъ˜~ЁmpЬžg—€И^9+дu@С8ыZ4—фkпєг№_'џЃШзПш%ІџрОOў=Z”P_‘ЏаKMџС|ŸќzЊO&Н§­Ђ_iЮѓяvџAlG-ўЛŸ™‘qзцЯ@kORМћqt#22 Œру8>Еf€<џТк_mфSЉЧИvпл}ЁЯЫСу8уxСуБы<{ў‚Zoў фџуеЉEeљї§ДпќЩџЧЈђ5яњ iПј/“џVЅ—фkпєг№_'џЃШзПш%ІџрОOў=Z”P_‘ЏаKMџС|ŸќzВяЕ zпXАв­юєщю.З<Ÿшr J9vФЄђp@ё‘] еЬV–“\м>иaF‘лс@Щ|1УœчІїщлЅšОИ›>Сс{™ГоuмcІ1†lїєш:чњ(ў*й/џц mfыЌђ/№r~˜О9†=Yž ЁдќS{*О6›H"Жaƒ“ѓOЇB;ѕЭt”P^вПpк€ЙдхƒvЩ/чiОї\Љ;:`tьQšиЕЖ‚вн`Е‚8!LэŽ5 Ѓ''p9$ў5=QEQEЬј) …юˆћAг/8”А/фЖАzЧАщŒdщЋ›зNёнЉ ЌZМmЦd‡цЭдќŒЫјМcЄ Š( Š( Š+3]еSEгэЂiф,#† 4в1ТЊї'<№ Р'  [ў'ў ‡DцВАtИдр9#1GƒР‘–crдж?†є™4,Чs*Эyq+м]ЪЃхc’@шрp8Юkb€ ц|Q$šФ>ГwInдKxр•ђэCaˆ?оcђ‚' koRПЗг4ы‹ыІл ]А@'Щ$рмœV_†,'Ž;­[P]ЗкЋЌвGШ0Ц#Œ№2T€rpsŒамQG IHБЧэUQ€ p€Љ(Ђ€2ќ=џ щыіяџJ$­JЫ№їќƒЅџЏлП§(’Е(ЂŠ(ЂŠ(ЂŠфМI>œКхЕ”šД–ЫЖтw’іhЃђTрЊ€сC1рp7ИШўБЈ&—Єнjm+o8 СC8\ž„œюkЬќ коЏqiqЇFФк7”зWdIA›Ь•†H-#’Tу)’[pюuыт"вжжwŽТё–yцU4@ ф1%H8Р sи{;}:Ю+K(Vx—j"єд’y$ђI&€1М[Жїћ7A>[i]/š’nЁї‚:•Gќ ЗQбз=Ї3j/дoC1‚Т%Б‹lЁ‘œ‘$ЇhшУїj~œч QEQE…­ЎЇЇІ^iіk{ -"Я +(`‘7Л€ 99У0 #vŠцѕ-4_IЄ4њr"]I,ё‘ˆ•еЧЭ’2K2ГШЪ“’@&Ÿ‡t Ќ/`]Bвk››9fhѕ/ЃЌ™%„e‰w`‚1С;‰Ц{ (™бэЏэя4ˆ&гЇXь,вIїЧБ›їXeЗm>YъфdqOУ–ке†Еwu{ЄШАъXr‘м#‹6Й+ѓ>XћЩ^ь@^УВЂ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€9я@ЭЂ%њDвЩЅмG|Б‡ Ы9`IЅЏЏCЛБЭKЌ‘ШЛ•”ф0<‚ph–(ц‰т•Hф]ЌЌ2#И5Яјтg№џиЎ_}Ц™;иЪРЄЦp6уJŒ>ДвQEQEW/eŸxѕ§ю‘ЇсlћЧ4љ;І3З•‚3’9Ћ>)Пž+Xє­5БЉъ{ЂЖ$•мАЦ6Љ$c'8Р<жІ›aoІiжі6ЋЖ"фN:“€IЩ'Й9  tQErїЙёˆгOOощ~ZѓМsO‘Жг;xb#8Šъ+ щvўgйХь^k™$йpЛиѕc‡фž2joь?љэЉрЪуџŽPЅ—§ƒgџ=Е/ќ\ёЪ?АlџчЖЅџƒ+ў9@‡Пф/§~нџщD•Љ\Ю‡ЂкЩc#4Зр‹Л•љu д`O 8žЄђrMi`йџЯmKџWќr€5(ЌПь?љэЉрЪуџŽQ§ƒgџ=Е/ќ\ёЪдЂВџАlџчЖЅџƒ+ў9Gі ŸќідП№eqџЧ(RŠЫўСГџžк—ў Ў?јхи6ѓлRџС•Чџ  J­v–’†hэтi\&2BŒœdу8ЕSћЯў{j_ј2Иџу•ƒтM&Щю4Н!eЙwд.‡™ХѕУЋCп&b3Т‘пŒc cТ–rйшцшfюч77,bБ’CИюЃ!р#ЇAЕYи6ѓлRџС•ЧџЃћЯў{j_ј2Иџу”ЉEeџ`йџЯmKџWќrь?љэЉрЪуџŽPЅ—§ƒgџ=Е/ќ\ёЪ?АlџчЖЅџƒ+ў9@”V_і ŸќідП№eqџЧ(ўСГџžк—ў Ў?јхjQYи6ѓлRџС•ЧџЃћЯў{j_ј2Иџу”ЉEeџ`йџЯmKџWќrь?љэЉрЪуџŽPЅ—§ƒgџ=Е/ќ\ёЪ?АlџчЖЅџƒ+ў9@”V_і ŸќідП№eqџЧ(ўСГџžк—ў Ў?јхjQYи6ѓлRџС•ЧџЃћЯў{j_ј2Иџу”ЉEeџ`йџЯmKџWќrь?љэЉрЪуџŽPЅ—§ƒgџ=Е/ќ\ёЪ?АlџчЖЅџƒ+ў9@”V_і ŸќідП№eqџЧ(ўСГџžк—ў Ў?јхjW=6Ÿу{ˆ\З‘Ћ[Ќё—˜cЮ‹ ЪЉз% й=@тяі ŸќідП№eqџЧ+ё–“mЇXкk1Kz>Сt3›щžO%ŽзT%И'#ЁЭvдV_і ŸќідП№eqџЧ(ўСГџžк—ў Ў?јхjTrЫ1<ВКЧkЙ™ŽЩ$іГџАlџчЖЅџƒ+ў9PмјgLЛЗh.…ь№О7G-ќюЇ# О:љP? G&Їq7‰Џв[Е1YЁ|ЛPйPGї˜ќФф‚СŠщЈЂ€ (Ђ€ (Ђ€ (Ђ€2ќ=џ щыіяџJ$­JЫ№їќƒЅџЏлП§(’Е(ЂŠ(ЂŠ(ЂŠ(Ў{Nfд<_Јо†c„KcйC#9"INбб‡юд§9Ю06/ювТТтђPЭМM+„ЦHQ“ŒœgжВМбxbжkŸ-Ўo7]ЬёЈcHKdрp@іЦPѕQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@VПДKћ ‹9K,w4NS†21œJГEbјRђ[Эм]]лfкхLЂFFvЧдр7ќuъvЋ™б”iО0жtб"ˆюе5"$%ebOrРgŒcšщЈЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(/Упђ—ўПnџєЂJдЌПШ:_њ§Лџв‰+R€ (Ђ€ (Ђ€ (Ђ€9џІСЇш ЫъЗJВУP‡‘”ž^ЙЮNэдW3k—ў=ОК•AЅлЅД!e2HГЉшЌ…8Щ Œœq]5QEQEQEQEQEQEQEQEQEQEQEQEQEs~)—ћ>џFеѓ ŽЃm>dkЃœу `‡’@юA%fxƒMЦ…{ЇЅІˆ„мHЧ*Iр0№шzQс§Hk–  –š _h 0ѓ€РУЉы@tQEQEQEQEQEeј{ўAвџзэпў”IZ•—сяљKџ_ЗњQ%jPEPEPP]\Хii5ЭУэ†iАN “Ч=O\ї‹˜мйкшб3‰5K…МЙ‚:Ф>iXgЈ Єї‡^„ўЗhєюцHжуQvН›Ы$Љiс€zaJŒ{wъwЈЂ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ ч4 ~Ыт sGs&q{•љd”eі }е}мŽ2и<ђz:цѕšwŠtWїjЗ[Дщ™З;ОxРѓЉџЕј€’Š( Š( Š( Š( Š(  ПШ:_њ§Лџв‰+RВќ=џ щыіяџJ$­J(ЂŠ(ЂŠ+’Мгп_ёŒіЛлHєTE‰ЁU]гH71 AШ А#ПЇ^šъц+KIЎnl0ЃHэ‚p dž9ш+#СжэмЩмj.зГyd•-!м0L)Qn§H)ŠДф^Yk(7ГЌБ}šCЧЪЊЫ•ыъзœ…џ„ЃьQчФUю™Е7МЛ|ј-€<ШѓЩу‚ъ3бб@кvГЅъ˜~ЁmpЬžg—€И^9+дu@С8ыZ5•ЉxwFе<У}І[K$Ип.РВc8УvЏN:U3сылqptЯjI3ПieЙH№s€g$}рzN(ЁЂА~*Жžщ7жъ€Hв,–ђ;sщНGbN=Fё­mIЊxVў1И* 9cК$IШгЎњqšŠчЂё–„з)kqvжwEAhnтhLy]иbР(8їСьNkVЯQАд7§‚ікчЫЦџ&U}ЙЮ3‚qœЪ€.QEQEQEQEQEQEQEQXђј›@Š'‘ЕЋ ЈЅˆ[…cЯIіеaтЫIжнєЛ SQŽсŠЌ–іŒqЫ>бŒчœр`чаб\ѓ_xžщnгDДВe`"’іѓxažЅcІс‚zœS“Nё ѓУ-жНМ{1,V‹‚и<‡Бъzу:Эoж Ч‹є(чћ4ŸmЙd/HгĘрgƒС#N5 ~в›Ы:”—КЄОјоўхЄлгŒŽ9їШХnклAinАZСІvЧ…Q““€8’ТmOФwЛЦЁGhŒŠё\j7g8$4I–№Hщ“ЯG^б5ћэюk­j_ДF‹<6ЖlE‘vƒ’я’988шeETвюџД4ЛKя/ЫћL).ЬчnхяŒѕЋuЮxKm—і–‚<ЕўЭКo)#мvУ'я$ѕ?3ј~ЇЃ Š( Š( Š( Š(  ПШ:_њ§Лџв‰+RВќ=џ щыіяџJ$­J(ЂŠ(ЂŠчМ\ЦцЮзF‰œIЊ\, хЬж!ѓJУ=@U џМ:є= s0Йд> \giƒHДXТКŒЌгл”ѕЦХСЩш$зM@Q@Q@Q@cЫсXž6бl6К•%mеNмs[P=gрЭЦC-Єівк^Щ‘qУŽхEЇ†ЅГ”ЫˆѕЦbЛq5ТJ1СшШFxызЏ­t4P9oЅxš …’OЧpЃ9ŽM56ЖGrЌx#ђтЇМХ)6Wz<ВnСY­eŒƒЮDŒsгŒwыыЙEsё^дЕџ‘ъЭœž,MџoЖб&Ю6љ7ХŽЙЮQГлг={oQ@~~Нџ@н7џёš<§{ўКoў $џу5ЉEsRДЌa_$e‰Uf™ˆруОаQёЛJЂf№ђFXeY˜žH€N;d}EtДP<ЖкћФшšЕ„LЪ@uгл*Oq™HШыШ#ыU­єMeЂš-GХs,‹ЕMЕДPƒЮж9щ‚#љt4P Ÿ†!Ж/чjкноьcЮд$qž› ўЙщLД№_†Ќх2EЄ@ЬTЎ&-(Ч^ŒHЯzзCESГгЌ4§џ`ВЖЖѓ1ПЩ‰Sv3Œр у'ѓЋ”Q@Q@Q@Q@м№§ƒЧvЗJ$j–Џnс цЧѓЋ9Ю )М Œ€Ищœt•ƒуv“@’юЎ4ч[и|ТB†Œю9ЎT0ЧПnЃ^жц+ЛHnmпt3"Ш‚2Єdyшhz(Ђ€ (Ђ€ (Ђ€ (Ђ€2ќ=џ щыіяџJ$­JЫ№їќƒЅџЏлП§(’Е(ЂŠ(Ј.ЎbДДšцсіУ 4Žи' Iуž‚ЇЎsЦпhŸG‡MЖѓMNъ;C$y&59flЃjFGфрPxоd№џлnSeЦЇ;пJ ‚ Шr6у8BœO'>•вTqE1$Q"ЧkЕUFРvЄ Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( хŠ9ЂxЅE’9k+ †‚ю ax0IˆњdЯ;ЫІмIjвJЛK€w!“…(ЫгŒаз2iП<ДHЕ‹@C’I’xIШ№<В:€9Ю@:j(Ђ€ (Ђ€ (Ђ€ (Ђ€2ќ=џ щыіяџJ$­JЫ№їќƒЅџЏлП§(’Е(ЂŠ(ЎsфдМyџ,й4[_іƒ,г~„yiџw=7х–8byeuŽ8зs3’IьbxA%}Е"ЭЊNїŒ’HbЖG`0NœtєQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEЯxЙMЕЎГЙ“KИYлЫ„;ДGх•FzЌIџttъ:­h—іr–Xю"hœІ2 dc8>”fŠС№\ѓKс‹Xn|ЕЙГнi2FРљm+ƒ‚yРп9[дQEQEQE—сяљKџ_ЗњQ%jV_‡Пф/§~нџщD•Љ@Q@/y_G]:мШГj“ЅšМq‡и­’фƒи |‘гЏFмQG IHБЧэUQ€ p€Ќ“RёчќГdбmк ГMњхЇў=мєшшЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂГю5­&вw‚ыTВ‚dЦшфИUa‘‘NGЮЛёЇ†ЌхЫЋРЬT6a (ЧNЊЯ:аCEsгјЎеb†[=7YПŠUмкТLcƒ– AуўTџэнF{>УУZ“Шпq.^(3ƒƒœЙaп/сЮsг{ŒєэвЃЗе|M=ТЧ'…ЃЗSœЩ&Є›WИU'žœљs]ЮХfїѓŠмП§6‘еsџ @њgкŸwІx’т`ёx– U ‚щЪA<ѓѓ;ў8уыž‚ŠРН№ьїЛ<яkkГ8ђ&Žчv ЯN§)с .цЮ;mJK§AQЗnКН•‰<рр0P@8р+ЂЂ€3єУDЕkm2"s!]ьп1–$єД(Ђ€ (Ђ€ (Ђ€ (Ђ€2ќ=џ щыіяџJ$­JЫ№їќƒЅџЏлП§(’Е(Јх–8byeuŽ8зs3’IьI\Яo З†ок9’ 5 Vбe“9љ‹“бv†Œ‘‘ѕ  ќ ’ОŽкР‘fе'{ЦI$Б[#А@˜ЇN: њТјoOГjкzС…T‚E|W'Žр}*8з‚юЬжщЧЋ8чЇ^О”GЊјŽkг№ТХbiѕœ1рp3‚zуšшhЎrсМhѓЙЕ@ŠЋ$“;;<чАўДћН3Ф—‹ФАZЈ\‡NR чŸ™ичёЧ\€tVњннЌpоxV,И,іц(2иСЦдШž ?Ž3A№ІŸ-‡й/ю5фoОnoц;љШШ ƒŒqиwц€6х–8byeuŽ8зs3’IьgџТG џаoMџРИџЦЊYј;У–[ќйЗу>p3c1МœuэŒї­M'LБ”ЫcЇZ[HWixaT$dN™Œќ==чиэЏкyї МВ#9Це9р‘Ц9І\x­!у‹Aзюt’; мgи>м§kЄЂ€9ыЭc^Y@Б№ЌђЧЗ–šіШ<ё€[Œcœўr\MтщЂ‰ььД{F+™цтIH$ •@r Бѕшh  ВјЂтУdкЎgrнZкЭЄйЯbяƒ‘ъНЯж–VkYaд^vyб+эЮ3ŒƒŒр~U_ЯзПшІџрТOў3GŸЏа7MџС„Ÿќf€-ййZXDbВЕ†о6mХaŒ 'Ю|љ ГY~~Нџ@н7џёš<§{ўКoў $џу4ЉEeљњї§tпќIџЦhѓѕяњщПј0“џŒаЅ—чыпє г№a'џЃЯзПшІџрТOў3@”V_ŸЏа7MџС„Ÿќf?^џ n›џƒ ?јЭjQY~~Нџ@н7џёš<§{ўКoў $џу4ЉEeљњї§tпќIџЦhѓѕяњщПј0“џŒаЅ—чыпє г№a'џЃЯзПшІџрТOў3@”V_ŸЏа7MџС„Ÿќf?^џ n›џƒ ?јЭjQY~~Нџ@н7џёš<§{ўКoў $џу4ЉEeљњї§tпќIџЦhѓѕяњщПј0“џŒаЅ—чыпє г№a'џЃЯзПшІџрТOў3@”V_ŸЏа7MџС„Ÿќf?^џ n›џƒ ?јЭjQY~~Нџ@н7џёš<§{ўКoў $џу4ЉEeљњї§tпќIџЦhѓѕяњщПј0“џŒаЅ—чыпє г№a'џЃЯзПшІџрТOў3@”V_ŸЏа7MџС„Ÿќf?^џ n›џƒ ?јЭjQY~~Нџ@н7џёš<§{ўКoў $џу4cSv‹KЛ’8%в"(˜ЋЙ pЊWO@G9щ\\–жтУYє››Шк7Š })эLKЁ1Ћ)кР4dБмq’2hы<§{ўКoў $џу4yњї§tпќIџЦh‰Ž I­-,ЏmяBХ{pњБ‚Р7кKЗЩ2†BВ($q‚p B‚;кЧcЂлZТзf(”ˆЭпњЭЙ8ШуР 0Iчыпє г№a'џЌŸЖЇ5‚ й­4ЈќаD№ы cƒђю0ђЩЧЖ{PvБkЈЩЉGу+I&–ЭФ0XД.’IЮЎJрХœ‘Р@$ХvбH%‰%PС]CШTŒњƒ‚БфWšYјŸХЯ)m%Ёз!š_-ZШDАgйф†'Ž3Р<їКEоЇw’jšRщЬAr&/ъNtЧ9ыРу tQEЫjпё?ё:$5•ƒЅЦЄЩŠ<†ŒА#x­OjŸињ<зHžeЩФvбc&YXсT ‚y9 s€qвщGIгќЙ_ЬКЭХм€ф<Э‚фpРѓ@ДQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEіа\yh‚9|ЇGНlaб†zЮ OEQEQX'Пž8эt=ЖпjЎаЧ' У’AШЩPrAЩШЮ1@ДџјŸxЅЕqѓщкr4RЛ4­Ф’)рлнOPx5дUM6ТпLг­ьmWl0 EШœu' “’OrsVшЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ХšЌšVŠ^от {Ћ‰Rо gb3']Э“ЧчЁР№fЗЕт-FѕmюfИŸ… ђэ RB!$ф3И…Ш$ƒЦщ—О%жДэШШ‘B†тъVЛEcЕN3Ы|ЎуЏ\dŽЋFвlД=:;ЖDœ’ygnьЧЙ<~€`(ЗzМ6wБС<ЄrJА ‚!‘Оъ€Nц'#•rFYx‚Н\щŸdЙŠэ7c‘Ѓ&% „3msСѓ gœєС5ўƒwsЈOs эЂ%ŠEilЬ’F#(Т0тAђqъЧЙЭEџюЁМњФ:Т›Їi[O э)Œ*NF 'žљžЯХšMюВšeДоcЫМE"2В9OМ0Ая‚Р‚A#ЕЌБЗ…я.5‰4ћH,bŽ2sм’ъйь“з Дm]ЖЗПё-Gg†мХѓ&юJ™ 9PI#€йР,@ ЛVгЕлЫY-ЕaЗЗo0С-Б‘dqœ;з;NЁѓ€Убъ"ЬЯЉоЯ;\6јЂ–ЁŒфЊАU|}юР№:dьV}Ењ]Дњ…єSќ#ŽZ$^IbAvмOЪ2zЦ2sЁ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@џй endstream endobj 6 0 obj << /Length 7 0 R >> stream 0 w q 0 -0.1 612.1 792.1 re W* n q 0 0 0 rg BT 90 711 Td /F2 10 Tf <14> Tj 8.4 0 Td <09> Tj 5.6 0 Td <320A> Tj 7.2 0 Td <14> Tj 8.4 0 Td <13> Tj 5.6 0 Td <14> Tj 8.6 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <1204> Tj 10.5 0 Td <0F> Tj 2.2 0 Td <13> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.5 0 Td <1C> Tj 5.6 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.7 0 Td <0C> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0D> Tj 3.3 0 Td <12> Tj 5.1 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <13> Tj 5.5 0 Td <32> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.6 0 Td <13> Tj 5.4 0 Td <07> Tj 2.8 0 Td <17> Tj 5.6 0 Td <05> Tj 3.2 0 Td <02> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <15> Tj 3.4 0 Td <0E> Tj ET Q q 0 0 0 rg BT 90 688.7 Td /F2 10 Tf <08> Tj 5.5 0 Td <04> Tj 5.6 0 Td <1107> Tj 7.8 0 Td <12> Tj 5 0 Td <02> Tj 5.5 0 Td <04> Tj 5.5 0 Td <2B> Tj 2.9 0 Td <2B> Tj 2.7 0 Td <0A> Tj 2.3 0 Td <120A> Tj 7.2 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.8 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <22> Tj 6.6 0 Td <1E> Tj 6.6 0 Td <07> Tj 2.7 0 Td <04> Tj 5.6 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <22> Tj 6.6 0 Td <01> Tj 7.2 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.3 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <04> Tj 5.7 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <03> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <09> Tj 5.5 0 Td <13> Tj 5.5 0 Td <07> Tj 2.8 0 Td <03> Tj 5.5 0 Td <02> Tj 5.6 0 Td <05> Tj 3.3 0 Td <2A> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <4D> Tj 2.2 0 Td <09> Tj 5.5 0 Td <06> Tj 2.7 0 Td <06> Tj 2.8 0 Td <09> Tj 5.5 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <04> Tj 5.6 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <09> Tj 5.5 0 Td <13> Tj 5.5 0 Td <07> Tj 2.8 0 Td <03> Tj 5.5 0 Td <02> Tj 5.6 0 Td <05> Tj 3.2 0 Td <2A> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 677.5 Td /F2 10 Tf <2B> Tj 2.8 0 Td <13> Tj 5.6 0 Td <0A> Tj 2.1 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <0E> Tj 2.8 0 Td <07> Tj 2.8 0 Td <22> Tj 6.6 0 Td <2C> Tj 4.9 0 Td <04> Tj 5.6 0 Td <12> Tj 5 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <13> Tj 5.5 0 Td <32> Tj 5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.4 0 Td <09> Tj 5.6 0 Td <320A> Tj 7.2 0 Td <14> Tj 8.4 0 Td <13> Tj 5.6 0 Td <14> Tj 8.4 0 Td <23> Tj 3 0 Td <07> Tj 2.7 0 Td <1204> Tj 10.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <13> Tj 5.6 0 Td <32> Tj 5 0 Td <07> Tj 2.7 0 Td <12> Tj 5.1 0 Td <02> Tj 5.5 0 Td <04> Tj 5.5 0 Td <2B> Tj 2.9 0 Td <2B> Tj 2.7 0 Td <0A> Tj 2.3 0 Td <12> Tj 5 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <11> Tj 5 0 Td <13> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <0C> Tj 5.6 0 Td <1205> Tj 8.3 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <05> Tj 3.3 0 Td <02> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.3 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2C> Tj 4.9 0 Td <02> Tj 5.6 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <33> Tj ET Q q 0 0 0 rg BT 90 666.4 Td /F2 10 Tf <06> Tj 2.8 0 Td <02> Tj 5.5 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <1C> Tj 5.5 0 Td <09> Tj 5.5 0 Td <13> Tj 5.6 0 Td <06> Tj 2.7 0 Td <04> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <11> Tj 5 0 Td <0E> Tj 2.8 0 Td <07> Tj 2.8 0 Td <08> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <02> Tj 5.5 0 Td <04> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <120A> Tj 7.2 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <22> Tj 6.6 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <04> Tj 5.5 0 Td <05> Tj 3.4 0 Td <14> Tj 8.4 0 Td <04> Tj 5.5 0 Td <06> Tj 2.9 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <0C> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <2B> Tj 2.9 0 Td <2B> Tj 2.7 0 Td <0C> Tj 5.6 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2B> Tj 2.8 0 Td <09> Tj 5.5 0 Td <14> Tj 8.4 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <05> Tj 3.3 0 Td <02> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <09> Tj 5.5 0 Td <2C> Tj 4.9 0 Td <04> Tj 5.6 0 Td <1207> Tj 7.7 0 Td <13> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.7 0 Td <03> Tj 5.6 0 Td <02> Tj 5.5 0 Td <05> Tj 3.3 0 Td <2A> Tj ET Q q 0 0 0 rg BT 90 655.2 Td /F2 10 Tf <2A> Tj 5.5 0 Td <4D> Tj 2.2 0 Td <09> Tj 5.5 0 Td <06> Tj 2.8 0 Td <06> Tj 2.7 0 Td <09> Tj 5.5 0 Td <2F> Tj 5.6 0 Td <13> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <0F> Tj 2.1 0 Td <13> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <02> Tj 5.5 0 Td <13> Tj 5.5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.3 0 Td <02> Tj 5.6 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <05> Tj 3.3 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <2A> Tj 5.5 0 Td <0E> Tj 2.8 0 Td <07> Tj 2.7 0 Td <20> Tj 6.7 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <09> Tj 5.5 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <22> Tj 6.6 0 Td <07> Tj 2.7 0 Td <52> Tj 5.8 0 Td <07> Tj 2.7 0 Td <26> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <03> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <1107> Tj 7.7 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <02> Tj 5.6 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <06> Tj 2.8 0 Td <02> Tj 5.5 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2C> Tj 4.9 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <11> Tj ET Q q 0 0 0 rg BT 90 644.1 Td /F2 10 Tf <0B> Tj 5.5 0 Td <09> Tj 5.6 0 Td <2C> Tj 4.9 0 Td <0A> Tj 2.2 0 Td <2D> Tj 5.5 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.7 0 Td <1202> Tj 10.5 0 Td <0B> Tj 5.6 0 Td <2A> Tj 5.5 0 Td <0A> Tj 2.1 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <1107> Tj 7.7 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <2C> Tj 4.9 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <14> Tj 8.4 0 Td <02> Tj 5.5 0 Td <2E> Tj 4.9 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.7 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2B> Tj 2.8 0 Td <09> Tj 5.6 0 Td <0A> Tj 2.2 0 Td <03> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <0E> Tj 2.8 0 Td <07> Tj 2.7 0 Td <16> Tj 6.7 0 Td <04> Tj 5.5 0 Td <05> Tj 3.3 0 Td <11> Tj 5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.6 0 Td <14> Tj 8.3 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <3E> Tj 2.3 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.6 0 Td <05> Tj 3.2 0 Td <0C> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <19> Tj 5.5 0 Td <05> Tj 3.4 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <2C> Tj 4.9 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <02> Tj 5.6 0 Td <03> Tj 5.5 0 Td <06> Tj 2.7 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <0A> Tj 2.3 0 Td <05> Tj ET Q q 0 0 0 rg BT 90 632.9 Td /F2 10 Tf <13> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <03> Tj 5.5 0 Td <02> Tj 5.6 0 Td <05> Tj 3.3 0 Td <2A> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <4D> Tj 2.2 0 Td <09> Tj 5.5 0 Td <06> Tj 2.8 0 Td <06> Tj 2.7 0 Td <09> Tj 5.5 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <13> Tj 5.5 0 Td <1107> Tj 7.8 0 Td <17> Tj 5.5 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.6 0 Td <0A> Tj 2.1 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <3E> Tj 2.3 0 Td <4D> Tj 2.2 0 Td <13> Tj 5.5 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <11> Tj 4.9 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <22> Tj 6.6 0 Td <07> Tj 2.7 0 Td <52> Tj 5.8 0 Td <07> Tj 2.7 0 Td <26> Tj 5.6 0 Td <07> Tj 2.7 0 Td <35> Tj 5.8 0 Td <07> Tj 2.7 0 Td <22> Tj 6.6 0 Td <1E> Tj 6.6 0 Td <07> Tj 2.8 0 Td <45> Tj 2.8 0 Td <07> Tj 2.7 0 Td <28> Tj 5.6 0 Td <0E> Tj 2.7 0 Td <07> Tj 2.8 0 Td <29> Tj 7.1 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <12> Tj 5 0 Td <02> Tj 5.6 0 Td <04> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <12> Tj 5.1 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <04> Tj 5.6 0 Td <11> Tj 4.9 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <04> Tj 5.6 0 Td <0F> Tj 2.2 0 Td <13> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <07> Tj 2.7 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <0C> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <09> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <1202> Tj 10.5 0 Td <2A> Tj 5.6 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 621.8 Td /F2 10 Tf <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <1D> Tj 6.7 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <12> Tj 5 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0E> Tj ET Q q 0 0 0 rg BT 90 599.5 Td /F2 10 Tf <08> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <06> Tj 2.8 0 Td <09> Tj 5.5 0 Td <03> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <09> Tj 5.5 0 Td <13> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <0A> Tj 2.2 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <11> Tj 5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <3204> Tj 10.5 0 Td <14> Tj 8.4 0 Td <17> Tj 5.6 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.8 0 Td <02> Tj 5.5 0 Td <03> Tj 5.6 0 Td <06> Tj 2.7 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <13> Tj 5.6 0 Td <07> Tj 2.7 0 Td <09> Tj 5.5 0 Td <2C> Tj 5 0 Td <04> Tj 5.5 0 Td <12> Tj 5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <09> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2B> Tj 2.8 0 Td <02> Tj 5.6 0 Td <05> Tj 3.3 0 Td <14> Tj 8.4 0 Td <13> Tj 5.6 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <120A> Tj 7.2 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <11> Tj 5 0 Td <13> Tj 5.5 0 Td <110E> Tj 7.8 0 Td <07> Tj ET Q Q q 131.3 257.9 349.5 317.1 re W* n 0 0 0 rg 283.5 566.6 89.6 0 re f* 283.5 558.1 89.6 0 re f* 283.5 549.6 89.6 0 re f* 283.5 541.2 89.6 0 re f* 194.7 453.6 224.7 0 re f* 194.7 445.2 224.7 0 re f* 194.7 267.4 224.7 0 re f* 194.7 267.4 0 186.3 re f* 238.8 267.4 0 186.3 re f* 283.5 541.2 0 25.4 re f* 283.5 267.4 0 186.3 re f* 328.3 541.2 0 25.4 re f* 328.3 267.4 0 186.3 re f* 373.1 541.2 0 25.4 re f* 373.1 267.4 0 186.3 re f* 419.3 267.4 0 186.3 re f* BT 1.3408 0 0 1 132.2 560.3 Tm /F1 7 Tf <1A> Tj 1.3408 0 0 1 138 560.3 Tm <0E> Tj 1.3408 0 0 1 141.7 560.3 Tm <02> Tj 1.3408 0 0 1 147.4 560.3 Tm <0F> Tj 1.3408 0 0 1 150.6 560.3 Tm <0605> Tj 1.3408 0 0 1 155.8 560.3 Tm <0B12> Tj 1.3408 0 0 1 164.8 560.3 Tm <08> Tj 1.3408 0 0 1 170 560.3 Tm <0605100D> Tj 1.3408 0 0 1 186.3 560.3 Tm <09> Tj ET BT 1.3408 0 0 1 309.3 560.3 Tm /F2 7 Tf <22> Tj 1.3408 0 0 1 315.6 560.3 Tm <1E> Tj 1.3408 0 0 1 321.9 560.3 Tm <52> Tj ET BT 1.3408 0 0 1 348.6 560.3 Tm /F2 7 Tf <57232727> Tj 1.3408 0 0 1 366.9 560.3 Tm <27> Tj ET BT 1.3408 0 0 1 308.8 551.8 Tm /F2 7 Tf <22> Tj 1.3408 0 0 1 315.1 551.8 Tm <01> Tj 1.3408 0 0 1 321.9 551.8 Tm <52> Tj ET BT 1.3408 0 0 1 348.6 551.8 Tm /F2 7 Tf <27232718> Tj 1.3408 0 0 1 366.9 551.8 Tm <27> Tj ET BT 1.3408 0 0 1 315.6 543.4 Tm /F2 7 Tf <5352> Tj ET BT 1.3408 0 0 1 348.6 543.4 Tm /F2 7 Tf <18233728> Tj 1.3408 0 0 1 366.9 543.4 Tm <27> Tj ET BT 1.3408 0 0 1 132.2 526.6 Tm /F5 7 Tf <01> Tj 1.3408 0 0 1 138.7 526.6 Tm <02> Tj 1.3408 0 0 1 141.7 526.6 Tm <03> Tj 1.3408 0 0 1 149.6 526.6 Tm <02> Tj 1.3408 0 0 1 152.6 526.6 Tm <04> Tj 1.3408 0 0 1 158.6 526.6 Tm <02050201> Tj 1.3408 0 0 1 179 526.6 Tm <06> Tj 1.3408 0 0 1 185.5 526.6 Tm <0207> Tj 1.3408 0 0 1 191.6 526.6 Tm <02> Tj 1.3408 0 0 1 194.6 526.6 Tm <08> Tj ET BT 1.3408 0 0 1 315.6 526.4 Tm /F2 7 Tf <2252> Tj ET BT 1.3408 0 0 1 348.6 526.4 Tm /F2 7 Tf <18231857> Tj 1.3408 0 0 1 366.9 526.4 Tm <27> Tj ET BT 1.3408 0 0 1 132.2 518.1 Tm /F5 7 Tf <0902030201> Tj 1.3408 0 0 1 159.1 518.1 Tm <02> Tj 1.3408 0 0 1 162.1 518.1 Tm <07> Tj 1.3408 0 0 1 165.2 518.1 Tm <020A0A01> Tj 1.3408 0 0 1 182.1 518.1 Tm <06> Tj 1.3408 0 0 1 188.6 518.1 Tm <0205020B> Tj 1.3408 0 0 1 208.5 518.1 Tm <0C> Tj 1.3408 0 0 1 212.2 518.1 Tm <020D> Tj 1.3408 0 0 1 219.9 518.1 Tm <020A0106> Tj 1.3408 0 0 1 239.5 518.1 Tm <02> Tj 1.3408 0 0 1 242.5 518.1 Tm <05> Tj 1.3408 0 0 1 250.5 518.1 Tm <0204> Tj 1.3408 0 0 1 259.4 518.1 Tm <0C> Tj 1.3408 0 0 1 263.1 518.1 Tm <0C> Tj ET BT 1.3408 0 0 1 315.6 518 Tm /F2 7 Tf <2452> Tj ET BT 1.3408 0 0 1 348.6 518 Tm /F2 7 Tf <27232757> Tj 1.3408 0 0 1 366.9 518 Tm <28> Tj ET BT 1.3408 0 0 1 132.2 509.7 Tm /F5 7 Tf <0E> Tj 1.3408 0 0 1 138.8 509.7 Tm <0203> Tj 1.3408 0 0 1 149.7 509.7 Tm <02> Tj 1.3408 0 0 1 152.7 509.7 Tm <01> Tj 1.3408 0 0 1 159.2 509.7 Tm <0F020702100211> Tj 1.3408 0 0 1 188.7 509.7 Tm <02> Tj 1.3408 0 0 1 191.7 509.7 Tm <09> Tj ET BT 1.3408 0 0 1 315.1 509.5 Tm /F2 7 Tf <29> Tj 1.3408 0 0 1 321.9 509.5 Tm <52> Tj ET BT 1.3408 0 0 1 345.4 509.5 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 348.6 509.5 Tm <27232757> Tj 1.3408 0 0 1 366.9 509.5 Tm <27> Tj ET BT 1.3408 0 0 1 132.2 472.9 Tm /F5 7 Tf <1213130203> Tj 1.3408 0 0 1 154.8 472.9 Tm <0214> Tj 1.3408 0 0 1 164 472.9 Tm <020D> Tj 1.3408 0 0 1 171.7 472.9 Tm <020A0215> Tj 1.3408 0 0 1 184.8 472.9 Tm <0102> Tj 1.3408 0 0 1 194.3 472.9 Tm <0D> Tj 1.3408 0 0 1 199 472.9 Tm <020A> Tj 1.3408 0 0 1 205.7 472.9 Tm <04021502160C1701> Tj 1.3408 0 0 1 245.7 472.9 Tm <06> Tj 1.3408 0 0 1 252.1 472.9 Tm <02> Tj 1.3408 0 0 1 255.1 472.9 Tm <11> Tj 1.3408 0 0 1 259.8 472.9 Tm <0201> Tj 1.3408 0 0 1 269.3 472.9 Tm <0F> Tj 1.3408 0 0 1 275.9 472.9 Tm <020D> Tj 1.3408 0 0 1 283.6 472.9 Tm <02160C> Tj ET BT 1.3408 0 0 1 132.2 464.5 Tm /F5 7 Tf <18> Tj 1.3408 0 0 1 137.4 464.5 Tm <191A> Tj 1.3408 0 0 1 149.1 464.5 Tm <1B1C1A1B1D02> Tj 1.3408 0 0 1 177.7 464.5 Tm <03> Tj 1.3408 0 0 1 185.6 464.5 Tm <021E> Tj 1.3408 0 0 1 193.6 464.5 Tm <131307> Tj 1.3408 0 0 1 202 464.5 Tm <0A> Tj 1.3408 0 0 1 205.7 464.5 Tm <0405> Tj 1.3408 0 0 1 219.6 464.5 Tm <1E> Tj 1.3408 0 0 1 224.6 464.5 Tm <130D> Tj 1.3408 0 0 1 231.9 464.5 Tm <1E> Tj 1.3408 0 0 1 236.9 464.5 Tm <130C17> Tj 1.3408 0 0 1 251.1 464.5 Tm <1F> Tj 1.3408 0 0 1 254.8 464.5 Tm <07> Tj 1.3408 0 0 1 258 464.5 Tm <20> Tj ET BT 1.3408 0 0 1 214.4 447.4 Tm /F2 7 Tf <32> Tj ET BT 1.3408 0 0 1 257 447.4 Tm /F2 7 Tf <4B> Tj 1.3408 0 0 1 261.7 447.4 Tm <30> Tj 1.3408 0 0 1 263.5 447.4 Tm <30> Tj ET BT 1.3408 0 0 1 302.7 447.4 Tm /F2 7 Tf <4B> Tj 1.3408 0 0 1 307.4 447.4 Tm <30> Tj ET BT 1.3408 0 0 1 338.7 447.4 Tm /F2 7 Tf <4B> Tj 1.3408 0 0 1 343.4 447.4 Tm <07> Tj 1.3408 0 0 1 346 447.4 Tm <54072627> Tj ET BT 1.3408 0 0 1 374.1 447.4 Tm /F2 7 Tf <12> Tj 1.3408 0 0 1 378.8 447.4 Tm <02> Tj 1.3408 0 0 1 384.1 447.4 Tm <1305> Tj 1.3408 0 0 1 392.5 447.4 Tm <0313> Tj 1.3408 0 0 1 403 447.4 Tm <05> Tj 1.3408 0 0 1 406.1 447.4 Tm <04> Tj ET BT 1.3408 0 0 1 214.2 438.9 Tm /F2 7 Tf <27232727> Tj 1.3408 0 0 1 232.6 438.9 Tm <27> Tj ET BT 1.3408 0 0 1 255.8 438.9 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 259 438.9 Tm <3B233B26> Tj 1.3408 0 0 1 277.4 438.9 Tm <57> Tj ET BT 1.3408 0 0 1 303.8 438.9 Tm /F2 7 Tf <27233757> Tj 1.3408 0 0 1 322.1 438.9 Tm <57> Tj ET BT 1.3408 0 0 1 348.6 438.9 Tm /F2 7 Tf <27232727> Tj 1.3408 0 0 1 366.9 438.9 Tm <27> Tj ET BT 1.3408 0 0 1 391.6 438.9 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 394.8 438.9 Tm <18> Tj 1.3408 0 0 1 400 438.9 Tm <2357273A> Tj ET BT 1.3408 0 0 1 214.2 430.4 Tm /F2 7 Tf <27232757> Tj 1.3408 0 0 1 232.6 430.4 Tm <27> Tj ET BT 1.3408 0 0 1 255.8 430.4 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 259 430.4 Tm <57232618> Tj 1.3408 0 0 1 277.4 430.4 Tm <18> Tj ET BT 1.3408 0 0 1 303.8 430.4 Tm /F2 7 Tf <27233B3B> Tj 1.3408 0 0 1 322.1 430.4 Tm <3A> Tj ET BT 1.3408 0 0 1 348.6 430.4 Tm /F2 7 Tf <27232827> Tj 1.3408 0 0 1 366.9 430.4 Tm <26> Tj ET BT 1.3408 0 0 1 391.6 430.4 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 394.8 430.4 Tm <18> Tj 1.3408 0 0 1 400 430.4 Tm <23373B38> Tj ET BT 1.3408 0 0 1 214.2 422 Tm /F2 7 Tf <27232627> Tj 1.3408 0 0 1 232.6 422 Tm <27> Tj ET BT 1.3408 0 0 1 255.8 422 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 259 422 Tm <3A233726> Tj 1.3408 0 0 1 277.4 422 Tm <18> Tj ET BT 1.3408 0 0 1 303.8 422 Tm /F2 7 Tf <2723283A> Tj 1.3408 0 0 1 322.1 422 Tm <39> Tj ET BT 1.3408 0 0 1 348.6 422 Tm /F2 7 Tf <27233B38> Tj 1.3408 0 0 1 366.9 422 Tm <28> Tj ET BT 1.3408 0 0 1 391.6 422 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 394.8 422 Tm <3A> Tj 1.3408 0 0 1 400 422 Tm <23272738> Tj ET BT 1.3408 0 0 1 214.2 413.5 Tm /F2 7 Tf <27232657> Tj 1.3408 0 0 1 232.6 413.5 Tm <27> Tj ET BT 1.3408 0 0 1 255.8 413.5 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 259 413.5 Tm <18233728> Tj 1.3408 0 0 1 277.4 413.5 Tm <28> Tj ET BT 1.3408 0 0 1 303.8 413.5 Tm /F2 7 Tf <2723183B> Tj 1.3408 0 0 1 322.1 413.5 Tm <38> Tj ET BT 1.3408 0 0 1 348.6 413.5 Tm /F2 7 Tf <27233928> Tj 1.3408 0 0 1 366.9 413.5 Tm <39> Tj ET BT 1.3408 0 0 1 391.6 413.5 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 394.8 413.5 Tm <18> Tj 1.3408 0 0 1 400 413.5 Tm <233B5728> Tj ET BT 1.3408 0 0 1 214.2 405 Tm /F2 7 Tf <27231827> Tj 1.3408 0 0 1 232.6 405 Tm <27> Tj ET BT 1.3408 0 0 1 255.8 405 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 259 405 Tm <18232638> Tj 1.3408 0 0 1 277.4 405 Tm <37> Tj ET BT 1.3408 0 0 1 303.8 405 Tm /F2 7 Tf <27232628> Tj 1.3408 0 0 1 322.1 405 Tm <27> Tj ET BT 1.3408 0 0 1 348.6 405 Tm /F2 7 Tf <27233728> Tj 1.3408 0 0 1 366.9 405 Tm <37> Tj ET BT 1.3408 0 0 1 391.6 405 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 394.8 405 Tm <18> Tj 1.3408 0 0 1 400 405 Tm <23262638> Tj ET BT 1.3408 0 0 1 214.2 396.6 Tm /F2 7 Tf <27231857> Tj 1.3408 0 0 1 232.6 396.6 Tm <27> Tj ET BT 1.3408 0 0 1 255.8 396.6 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 259 396.6 Tm <26235739> Tj 1.3408 0 0 1 277.4 396.6 Tm <28> Tj ET BT 1.3408 0 0 1 303.8 396.6 Tm /F2 7 Tf <27232728> Tj 1.3408 0 0 1 322.1 396.6 Tm <38> Tj ET BT 1.3408 0 0 1 348.6 396.6 Tm /F2 7 Tf <27233737> Tj 1.3408 0 0 1 366.9 396.6 Tm <28> Tj ET BT 1.3408 0 0 1 391.6 396.6 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 394.8 396.6 Tm <26> Tj 1.3408 0 0 1 400 396.6 Tm <23573837> Tj ET BT 1.3408 0 0 1 214.2 388.1 Tm /F2 7 Tf <27233A27> Tj 1.3408 0 0 1 232.6 388.1 Tm <27> Tj ET BT 1.3408 0 0 1 255.8 388.1 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 259 388.1 Tm <26232618> Tj 1.3408 0 0 1 277.4 388.1 Tm <37> Tj ET BT 1.3408 0 0 1 300.6 388.1 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 303.8 388.1 Tm <27232718> Tj 1.3408 0 0 1 322.1 388.1 Tm <26> Tj ET BT 1.3408 0 0 1 348.6 388.1 Tm /F2 7 Tf <26232727> Tj 1.3408 0 0 1 366.9 388.1 Tm <27> Tj ET BT 1.3408 0 0 1 391.6 388.1 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 394.8 388.1 Tm <26> Tj 1.3408 0 0 1 400 388.1 Tm <23261837> Tj ET BT 1.3408 0 0 1 214.2 379.6 Tm /F2 7 Tf <27233A57> Tj 1.3408 0 0 1 232.6 379.6 Tm <27> Tj ET BT 1.3408 0 0 1 255.8 379.6 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 259 379.6 Tm <27233839> Tj 1.3408 0 0 1 277.4 379.6 Tm <39> Tj ET BT 1.3408 0 0 1 300.6 379.6 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 303.8 379.6 Tm <2723273B> Tj 1.3408 0 0 1 322.1 379.6 Tm <39> Tj ET BT 1.3408 0 0 1 348.6 379.6 Tm /F2 7 Tf <27233738> Tj 1.3408 0 0 1 366.9 379.6 Tm <38> Tj ET BT 1.3408 0 0 1 391.6 379.6 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 394.8 379.6 Tm <27> Tj 1.3408 0 0 1 400 379.6 Tm <2338393A> Tj ET BT 1.3408 0 0 1 214.2 371.2 Tm /F2 7 Tf <27232827> Tj 1.3408 0 0 1 232.6 371.2 Tm <27> Tj ET BT 1.3408 0 0 1 255.8 371.2 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 259 371.2 Tm <2723573A> Tj 1.3408 0 0 1 277.4 371.2 Tm <39> Tj ET BT 1.3408 0 0 1 300.6 371.2 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 303.8 371.2 Tm <27232627> Tj 1.3408 0 0 1 322.1 371.2 Tm <26> Tj ET BT 1.3408 0 0 1 348.6 371.2 Tm /F2 7 Tf <2723373A> Tj 1.3408 0 0 1 366.9 371.2 Tm <28> Tj ET BT 1.3408 0 0 1 391.6 371.2 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 394.8 371.2 Tm <27> Tj 1.3408 0 0 1 400 371.2 Tm <23573A27> Tj ET BT 1.3408 0 0 1 214.2 362.7 Tm /F2 7 Tf <27232857> Tj 1.3408 0 0 1 232.6 362.7 Tm <27> Tj ET BT 1.3408 0 0 1 255.8 362.7 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 259 362.7 Tm <27233A57> Tj 1.3408 0 0 1 277.4 362.7 Tm <37> Tj ET BT 1.3408 0 0 1 300.6 362.7 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 303.8 362.7 Tm <27232618> Tj 1.3408 0 0 1 322.1 362.7 Tm <3A> Tj ET BT 1.3408 0 0 1 348.6 362.7 Tm /F2 7 Tf <27233938> Tj 1.3408 0 0 1 366.9 362.7 Tm <38> Tj ET BT 1.3408 0 0 1 391.6 362.7 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 394.8 362.7 Tm <27> Tj 1.3408 0 0 1 400 362.7 Tm <233A5726> Tj ET BT 1.3408 0 0 1 214.2 354.2 Tm /F2 7 Tf <27235727> Tj 1.3408 0 0 1 232.6 354.2 Tm <27> Tj ET BT 1.3408 0 0 1 255.8 354.2 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 259 354.2 Tm <2723183A> Tj 1.3408 0 0 1 277.4 354.2 Tm <3B> Tj ET BT 1.3408 0 0 1 300.6 354.2 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 303.8 354.2 Tm <2723263A> Tj 1.3408 0 0 1 322.1 354.2 Tm <39> Tj ET BT 1.3408 0 0 1 348.6 354.2 Tm /F2 7 Tf <27233926> Tj 1.3408 0 0 1 366.9 354.2 Tm <18> Tj ET BT 1.3408 0 0 1 391.6 354.2 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 394.8 354.2 Tm <27> Tj 1.3408 0 0 1 400 354.2 Tm <23183A27> Tj ET BT 1.3408 0 0 1 214.2 345.8 Tm /F2 7 Tf <27235757> Tj 1.3408 0 0 1 232.6 345.8 Tm <27> Tj ET BT 1.3408 0 0 1 255.8 345.8 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 259 345.8 Tm <27232657> Tj 1.3408 0 0 1 277.4 345.8 Tm <28> Tj ET BT 1.3408 0 0 1 300.6 345.8 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 303.8 345.8 Tm <27232628> Tj 1.3408 0 0 1 322.1 345.8 Tm <38> Tj ET BT 1.3408 0 0 1 348.6 345.8 Tm /F2 7 Tf <27233828> Tj 1.3408 0 0 1 366.9 345.8 Tm <27> Tj ET BT 1.3408 0 0 1 391.6 345.8 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 394.8 345.8 Tm <27> Tj 1.3408 0 0 1 400 345.8 Tm <23265727> Tj ET BT 1.3408 0 0 1 214.2 337.3 Tm /F2 7 Tf <27233B27> Tj 1.3408 0 0 1 232.6 337.3 Tm <27> Tj ET BT 1.3408 0 0 1 255.8 337.3 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 259 337.3 Tm <27232627> Tj 1.3408 0 0 1 277.4 337.3 Tm <3A> Tj ET BT 1.3408 0 0 1 300.6 337.3 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 303.8 337.3 Tm <27232657> Tj 1.3408 0 0 1 322.1 337.3 Tm <28> Tj ET BT 1.3408 0 0 1 348.6 337.3 Tm /F2 7 Tf <27233B3B> Tj 1.3408 0 0 1 366.9 337.3 Tm <57> Tj ET BT 1.3408 0 0 1 391.6 337.3 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 394.8 337.3 Tm <27> Tj 1.3408 0 0 1 400 337.3 Tm <23273737> Tj ET BT 1.3408 0 0 1 214.2 328.8 Tm /F2 7 Tf <27233B57> Tj 1.3408 0 0 1 232.6 328.8 Tm <27> Tj ET BT 1.3408 0 0 1 255.8 328.8 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 259 328.8 Tm <27232738> Tj 1.3408 0 0 1 277.4 328.8 Tm <3A> Tj ET BT 1.3408 0 0 1 300.6 328.8 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 303.8 328.8 Tm <27232657> Tj 1.3408 0 0 1 322.1 328.8 Tm <39> Tj ET BT 1.3408 0 0 1 348.6 328.8 Tm /F2 7 Tf <27235739> Tj 1.3408 0 0 1 366.9 328.8 Tm <38> Tj ET BT 1.3408 0 0 1 391.6 328.8 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 394.8 328.8 Tm <27> Tj 1.3408 0 0 1 400 328.8 Tm <23273827> Tj ET BT 1.3408 0 0 1 214.2 320.4 Tm /F2 7 Tf <27233827> Tj 1.3408 0 0 1 232.6 320.4 Tm <27> Tj ET BT 1.3408 0 0 1 255.8 320.4 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 259 320.4 Tm <27232757> Tj 1.3408 0 0 1 277.4 320.4 Tm <38> Tj ET BT 1.3408 0 0 1 300.6 320.4 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 303.8 320.4 Tm <2723263B> Tj 1.3408 0 0 1 322.1 320.4 Tm <26> Tj ET BT 1.3408 0 0 1 348.6 320.4 Tm /F2 7 Tf <27235727> Tj 1.3408 0 0 1 366.9 320.4 Tm <38> Tj ET BT 1.3408 0 0 1 391.6 320.4 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 394.8 320.4 Tm <27> Tj 1.3408 0 0 1 400 320.4 Tm <23275757> Tj ET BT 1.3408 0 0 1 214.2 311.9 Tm /F2 7 Tf <27233857> Tj 1.3408 0 0 1 232.6 311.9 Tm <27> Tj ET BT 1.3408 0 0 1 255.8 311.9 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 259 311.9 Tm <27232757> Tj 1.3408 0 0 1 277.4 311.9 Tm <26> Tj ET BT 1.3408 0 0 1 300.6 311.9 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 303.8 311.9 Tm <2723263B> Tj 1.3408 0 0 1 322.1 311.9 Tm <28> Tj ET BT 1.3408 0 0 1 348.6 311.9 Tm /F2 7 Tf <27232818> Tj 1.3408 0 0 1 366.9 311.9 Tm <3B> Tj ET BT 1.3408 0 0 1 391.6 311.9 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 394.8 311.9 Tm <27> Tj 1.3408 0 0 1 400 311.9 Tm <23272837> Tj ET BT 1.3408 0 0 1 214.2 303.4 Tm /F2 7 Tf <27233927> Tj 1.3408 0 0 1 232.6 303.4 Tm <27> Tj ET BT 1.3408 0 0 1 255.8 303.4 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 259 303.4 Tm <27232728> Tj 1.3408 0 0 1 277.4 303.4 Tm <37> Tj ET BT 1.3408 0 0 1 300.6 303.4 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 303.8 303.4 Tm <2723263B> Tj 1.3408 0 0 1 322.1 303.4 Tm <3B> Tj ET BT 1.3408 0 0 1 348.6 303.4 Tm /F2 7 Tf <27233A28> Tj 1.3408 0 0 1 366.9 303.4 Tm <3A> Tj ET BT 1.3408 0 0 1 391.6 303.4 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 394.8 303.4 Tm <27> Tj 1.3408 0 0 1 400 303.4 Tm <23272838> Tj ET BT 1.3408 0 0 1 214.2 295 Tm /F2 7 Tf <27233957> Tj 1.3408 0 0 1 232.6 295 Tm <27> Tj ET BT 1.3408 0 0 1 255.8 295 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 259 295 Tm <27232757> Tj 1.3408 0 0 1 277.4 295 Tm <27> Tj ET BT 1.3408 0 0 1 300.6 295 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 303.8 295 Tm <2723263B> Tj 1.3408 0 0 1 322.1 295 Tm <37> Tj ET BT 1.3408 0 0 1 348.6 295 Tm /F2 7 Tf <27231857> Tj 1.3408 0 0 1 366.9 295 Tm <37> Tj ET BT 1.3408 0 0 1 391.6 295 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 394.8 295 Tm <27> Tj 1.3408 0 0 1 400 295 Tm <23272839> Tj ET BT 1.3408 0 0 1 214.2 286.5 Tm /F2 7 Tf <27233727> Tj 1.3408 0 0 1 232.6 286.5 Tm <27> Tj ET BT 1.3408 0 0 1 255.8 286.5 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 259 286.5 Tm <27232757> Tj 1.3408 0 0 1 277.4 286.5 Tm <3A> Tj ET BT 1.3408 0 0 1 300.6 286.5 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 303.8 286.5 Tm <27232638> Tj 1.3408 0 0 1 322.1 286.5 Tm <18> Tj ET BT 1.3408 0 0 1 348.6 286.5 Tm /F2 7 Tf <27232638> Tj 1.3408 0 0 1 366.9 286.5 Tm <28> Tj ET BT 1.3408 0 0 1 391.6 286.5 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 394.8 286.5 Tm <27> Tj 1.3408 0 0 1 400 286.5 Tm <23275726> Tj ET BT 1.3408 0 0 1 214.2 278 Tm /F2 7 Tf <27233757> Tj 1.3408 0 0 1 232.6 278 Tm <27> Tj ET BT 1.3408 0 0 1 255.8 278 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 259 278 Tm <27232757> Tj 1.3408 0 0 1 277.4 278 Tm <3B> Tj ET BT 1.3408 0 0 1 300.6 278 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 303.8 278 Tm <27232638> Tj 1.3408 0 0 1 322.1 278 Tm <28> Tj ET BT 1.3408 0 0 1 348.6 278 Tm /F2 7 Tf <27232739> Tj 1.3408 0 0 1 366.9 278 Tm <39> Tj ET BT 1.3408 0 0 1 391.6 278 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 394.8 278 Tm <27> Tj 1.3408 0 0 1 400 278 Tm <2327573A> Tj ET BT 1.3408 0 0 1 214.2 269.6 Tm /F2 7 Tf <26232727> Tj 1.3408 0 0 1 232.6 269.6 Tm <27> Tj ET BT 1.3408 0 0 1 255.8 269.6 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 259 269.6 Tm <27232757> Tj 1.3408 0 0 1 277.4 269.6 Tm <37> Tj ET BT 1.3408 0 0 1 300.6 269.6 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 303.8 269.6 Tm <27232638> Tj 1.3408 0 0 1 322.1 269.6 Tm <38> Tj ET BT 1.3408 0 0 1 348.6 269.6 Tm /F2 7 Tf <27232727> Tj 1.3408 0 0 1 366.9 269.6 Tm <27> Tj ET BT 1.3408 0 0 1 391.6 269.6 Tm /F2 7 Tf <41> Tj 1.3408 0 0 1 394.8 269.6 Tm <27> Tj 1.3408 0 0 1 400 269.6 Tm <2327573B> Tj ET BT 1.3408 0 0 1 132.2 491.3 Tm /F2 7 Tf <51> Tj 1.3408 0 0 1 138 491.3 Tm <0752> Tj 1.3408 0 0 1 146.1 491.3 Tm <07530754> Tj 1.3408 0 0 1 161.3 491.3 Tm <070D> Tj 1.3408 0 0 1 167.1 491.3 Tm <0741> Tj 1.3408 0 0 1 172.9 491.3 Tm <22> Tj 1.3408 0 0 1 179.2 491.3 Tm <07> Tj 1.3408 0 0 1 181.8 491.3 Tm <54070D> Tj 1.3408 0 0 1 191.3 491.3 Tm <26> Tj 1.3408 0 0 1 196.5 491.3 Tm <0741> Tj 1.3408 0 0 1 202.3 491.3 Tm <074F> Tj 1.3408 0 0 1 211.2 491.3 Tm <15> Tj 1.3408 0 0 1 214.3 491.3 Tm <55> Tj 1.3408 0 0 1 218.8 491.3 Tm <0D> Tj 1.3408 0 0 1 221.9 491.3 Tm <22> Tj 1.3408 0 0 1 228.2 491.3 Tm <1E0735> Tj 1.3408 0 0 1 242.7 491.3 Tm <0718> Tj 1.3408 0 0 1 250.6 491.3 Tm <15> Tj 1.3408 0 0 1 253.7 491.3 Tm <074507> Tj 1.3408 0 0 1 261.6 491.3 Tm <0D> Tj 1.3408 0 0 1 264.7 491.3 Tm <0D> Tj 1.3408 0 0 1 267.9 491.3 Tm <0722> Tj 1.3408 0 0 1 276.8 491.3 Tm <1E> Tj 1.3408 0 0 1 283.1 491.3 Tm <073507181507> Tj 1.3408 0 0 1 304.9 491.3 Tm <54> Tj 1.3408 0 0 1 308.5 491.3 Tm <070D> Tj 1.3408 0 0 1 314.3 491.3 Tm <22> Tj 1.3408 0 0 1 320.6 491.3 Tm <1E> Tj 1.3408 0 0 1 326.9 491.3 Tm <0735> Tj 1.3408 0 0 1 335.1 491.3 Tm <26> Tj 1.3408 0 0 1 340.3 491.3 Tm <15> Tj 1.3408 0 0 1 343.5 491.3 Tm <15> Tj 1.3408 0 0 1 346.6 491.3 Tm <0756> Tj 1.3408 0 0 1 354.5 491.3 Tm <0722> Tj 1.3408 0 0 1 363.4 491.3 Tm <0145> Tj 1.3408 0 0 1 372.9 491.3 Tm <3B> Tj 1.3408 0 0 1 378.1 491.3 Tm <0754074F> Tj ET BT 1.3408 0 0 1 393.3 491.3 Tm /F4 7 Tf <01> Tj ET BT 1.3408 0 0 1 396.8 491.3 Tm /F2 7 Tf <073507290754> Tj 1.3408 0 0 1 420.7 491.3 Tm <074F> Tj 1.3408 0 0 1 429.6 491.3 Tm <07> Tj 1.3408 0 0 1 432.2 491.3 Tm <35> Tj 1.3408 0 0 1 437.8 491.3 Tm <0724> Tj 1.3408 0 0 1 446.7 491.3 Tm <0715> Tj ET BT 1.3408 0 0 1 132.2 481.4 Tm /F2 7 Tf <51> Tj 1.3408 0 0 1 138 481.4 Tm <30> Tj 1.3408 0 0 1 139.8 481.4 Tm <07> Tj 1.3408 0 0 1 142.4 481.4 Tm <52> Tj 1.3408 0 0 1 147.9 481.4 Tm <0753> Tj 1.3408 0 0 1 156.8 481.4 Tm <0754> Tj 1.3408 0 0 1 163.1 481.4 Tm <070D> Tj 1.3408 0 0 1 168.9 481.4 Tm <072207> Tj 1.3408 0 0 1 180.4 481.4 Tm <54> Tj 1.3408 0 0 1 184.1 481.4 Tm <070D> Tj 1.3408 0 0 1 189.9 481.4 Tm <26> Tj 1.3408 0 0 1 195.2 481.4 Tm <0741> Tj 1.3408 0 0 1 200.9 481.4 Tm <074F> Tj 1.3408 0 0 1 209.8 481.4 Tm <15> Tj 1.3408 0 0 1 213 481.4 Tm <55> Tj 1.3408 0 0 1 217.4 481.4 Tm <0D> Tj 1.3408 0 0 1 220.6 481.4 Tm <22> Tj 1.3408 0 0 1 226.9 481.4 Tm <1E> Tj 1.3408 0 0 1 233.2 481.4 Tm <07> Tj 1.3408 0 0 1 235.8 481.4 Tm <350726150745070D> Tj 1.3408 0 0 1 263.4 481.4 Tm <22> Tj 1.3408 0 0 1 269.7 481.4 Tm <1E0735> Tj 1.3408 0 0 1 284.1 481.4 Tm <26> Tj 1.3408 0 0 1 289.4 481.4 Tm <15> Tj 1.3408 0 0 1 292.5 481.4 Tm <0756> Tj 1.3408 0 0 1 300.4 481.4 Tm <0722> Tj 1.3408 0 0 1 309.3 481.4 Tm <014518> Tj 1.3408 0 0 1 324 481.4 Tm <0754074F> Tj ET BT 1.3408 0 0 1 339.2 481.4 Tm /F4 7 Tf <00> Tj ET BT 1.3408 0 0 1 342.7 481.4 Tm /F2 7 Tf <073507290715> Tj ET Q endstream endobj 7 0 obj 33620 endobj 8 0 obj << /Length 9 0 R >> stream 0 w q 0 -0.1 612.1 792.1 re W* n q 0 0 0 rg BT 90 711 Td /F2 10 Tf <08> Tj 5.5 0 Td <09> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <2D> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <12> Tj 5 0 Td <0A> Tj 2.2 0 Td <41> Tj 3.4 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.5 0 Td <1111> Tj 9.9 0 Td <02> Tj 5.6 0 Td <13> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2B> Tj 2.7 0 Td <02> Tj 5.6 0 Td <05> Tj 3.4 0 Td <14> Tj 8.4 0 Td <04> Tj 5.7 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <13> Tj 5.5 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <02> Tj 5.6 0 Td <2B> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <02> Tj 5.5 0 Td <03> Tj 5.5 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <13> Tj 5.6 0 Td <44> Tj ET Q q 0 0 0 rg BT 90 400.4 Td /F2 10 Tf <22> Tj 6.6 0 Td <2E> Tj 4.9 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.6 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <0C> Tj 5.6 0 Td <2B> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <07> Tj 2.8 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2B> Tj 2.8 0 Td <02> Tj 5.6 0 Td <05> Tj 3.4 0 Td <14> Tj 8.3 0 Td <13> Tj 5.6 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <0A> Tj 2.2 0 Td <14> Tj 8.4 0 Td <17> Tj 5.5 0 Td <0F> Tj 2.3 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <1107> Tj 7.7 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <11> Tj 5.1 0 Td <23> Tj 2.7 0 Td <07> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <13> Tj 5.5 0 Td <2B> Tj 2.9 0 Td <2B> Tj 2.7 0 Td <0A> Tj 2.3 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2B> Tj 2.7 0 Td <09> Tj 5.6 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.4 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2C> Tj 4.9 0 Td <09> Tj 5.6 0 Td <05> Tj 3.2 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.6 0 Td <1107> Tj 7.8 0 Td <2C> Tj 4.9 0 Td <09> Tj 5.6 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <13> Tj 5.5 0 Td <32> Tj 5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <06> Tj ET Q q 0 0 0 rg BT 90 389.2 Td /F2 10 Tf <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <1107> Tj 7.8 0 Td <12> Tj 5 0 Td <02> Tj 5.5 0 Td <04> Tj 5.5 0 Td <2B> Tj 2.9 0 Td <2B> Tj 2.7 0 Td <0A> Tj 2.3 0 Td <120A> Tj 7.2 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.8 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <22> Tj 6.6 0 Td <1E> Tj 6.6 0 Td <07> Tj 2.7 0 Td <04> Tj 5.6 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <22> Tj 6.6 0 Td <01> Tj 7.2 0 Td <07> Tj 2.7 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.7 0 Td <2B> Tj 2.8 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <12> Tj 5 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <1C> Tj 5.5 0 Td <09> Tj 5.6 0 Td <13> Tj 5.5 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.6 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <1107> Tj 7.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2C> Tj 4.9 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <0E> Tj 2.7 0 Td <07> Tj 2.8 0 Td <16> Tj 6.6 0 Td <02> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <03> Tj 5.5 0 Td <02> Tj 5.5 0 Td <05> Tj 3.4 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <07> Tj 2.7 0 Td <04> Tj 5.6 0 Td <1106> Tj ET Q q 0 0 0 rg BT 90 378.1 Td /F2 10 Tf <13> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <09> Tj 5.6 0 Td <05> Tj 3.3 0 Td <12> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <04> Tj 5.6 0 Td <05> Tj 3.3 0 Td <12> Tj 5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <23> Tj 2.8 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.6 0 Td <1107> Tj 7.7 0 Td <12> Tj 5 0 Td <02> Tj 5.6 0 Td <04> Tj 5.5 0 Td <2B> Tj 2.9 0 Td <2B> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <12> Tj 5.1 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <22> Tj 6.6 0 Td <1E> Tj 6.6 0 Td <07> Tj 2.8 0 Td <04> Tj 5.6 0 Td <06> Tj 2.7 0 Td <07> Tj 2.7 0 Td <22> Tj 6.6 0 Td <01> Tj 7.2 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <0B> Tj 5.5 0 Td <13> Tj 5.6 0 Td <0F> Tj 2.1 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <11> Tj 5 0 Td <04> Tj 5.6 0 Td <13> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <13> Tj 5.5 0 Td <32> Tj 5.1 0 Td <07> Tj 2.7 0 Td <04> Tj 5.6 0 Td <11> Tj 4.9 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.6 0 Td <0C> Tj 5.5 0 Td <2B> Tj 2.7 0 Td <0A> Tj 2.3 0 Td <0B> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <09> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <4D> Tj 2.2 0 Td <13> Tj 5.5 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <09> Tj 5.5 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <0E> Tj 2.7 0 Td <07> Tj 2.8 0 Td <47> Tj 7.2 0 Td <0B> Tj ET Q q 0 0 0 rg BT 90 366.9 Td /F2 10 Tf <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <13> Tj 5.5 0 Td <32> Tj 5.1 0 Td <07> Tj 2.7 0 Td <14> Tj 8.4 0 Td <09> Tj 5.6 0 Td <320A> Tj 7.2 0 Td <14> Tj 8.4 0 Td <13> Tj 5.6 0 Td <14> Tj 8.6 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <11> Tj 5 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <0C> Tj 5.5 0 Td <07> Tj 2.8 0 Td <09> Tj 5.5 0 Td <13> Tj 5.5 0 Td <06> Tj 2.7 0 Td <02> Tj 5.6 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <58> Tj 8.2 0 Td <07> Tj 2.8 0 Td <1C> Tj 5.5 0 Td <09> Tj 5.6 0 Td <13> Tj 5.5 0 Td <06> Tj 2.7 0 Td <04> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <2C> Tj 4.9 0 Td <02> Tj 5.6 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2C> Tj 4.9 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <22> Tj 6.6 0 Td <1E> Tj ET Q q 0 0 0 rg BT 90 355.8 Td /F2 10 Tf <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <22> Tj 6.6 0 Td <01> Tj 7.2 0 Td <07> Tj 2.7 0 Td <1102> Tj 10.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <09> Tj 5.6 0 Td <3E> Tj 2.2 0 Td <13> Tj 5.5 0 Td <11> Tj 5 0 Td <06> Tj 2.8 0 Td <0C> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <09> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <4D> Tj 2.2 0 Td <13> Tj 5.5 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <0A> Tj 2.3 0 Td <11> Tj 4.9 0 Td <09> Tj 5.5 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <17> Tj 5.6 0 Td <02> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <02> Tj 5.5 0 Td <03> Tj 5.5 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <2B> Tj 2.8 0 Td <02> Tj 5.5 0 Td <05> Tj 3.4 0 Td <14> Tj 8.4 0 Td <04> Tj 5.7 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.6 0 Td <0C> Tj 5.5 0 Td <11> Tj 4.9 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.4 0 Td <0C> Tj 5.5 0 Td <04> Tj 5.6 0 Td <0E> Tj 2.7 0 Td <07> Tj 2.8 0 Td <08> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <05> Tj 3.3 0 Td <02> Tj 5.6 0 Td <2B> Tj 2.7 0 Td <0A> Tj 2.3 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.7 0 Td <1C> Tj 5.5 0 Td <09> Tj 5.5 0 Td <13> Tj 5.6 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <06> Tj ET Q q 0 0 0 rg BT 90 344.6 Td /F2 10 Tf <2A> Tj 5.5 0 Td <0C> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.3 0 Td <31> Tj 5.7 0 Td <14> Tj 8.4 0 Td <04> Tj 5.7 0 Td <07> Tj 2.7 0 Td <14> Tj 8.4 0 Td <09> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <19> Tj 5.6 0 Td <05> Tj 3.2 0 Td <04> Tj 5.6 0 Td <0E> Tj 2.8 0 Td <07> Tj 2.8 0 Td <16> Tj 6.6 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.7 0 Td <06> Tj 2.7 0 Td <02> Tj 5.6 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <09> Tj 5.5 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <05> Tj 3.4 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.6 0 Td <05> Tj 3.2 0 Td <02> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.3 0 Td <07> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <05> Tj 3.3 0 Td <14> Tj 8.4 0 Td <0C> Tj 5.6 0 Td <2A> Tj 5.5 0 Td <0A> Tj 2.3 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.3 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <2C> Tj 5 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.6 0 Td <13> Tj 5.4 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <13> Tj 5.5 0 Td <32> Tj 5.1 0 Td <07> Tj 2.7 0 Td <04> Tj 5.6 0 Td <1106> Tj 7.8 0 Td <07> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <05> Tj 3.3 0 Td <17> Tj 5.5 0 Td <02> Tj 5.6 0 Td <0F> Tj 2.1 0 Td <0C> Tj 5.5 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 333.5 Td /F2 10 Tf <17> Tj 5.5 0 Td <09> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2B> Tj 2.8 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <1206> Tj 7.8 0 Td <0A> Tj 2.1 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <09> Tj 5.5 0 Td <05> Tj 3.4 0 Td <09> Tj 5.5 0 Td <03> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.1 0 Td <2F> Tj 5.6 0 Td <13> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2C> Tj 4.9 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <02> Tj 5.5 0 Td <04> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <120A> Tj 7.2 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <22> Tj 6.6 0 Td <1E> Tj 6.6 0 Td <07> Tj 2.7 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <22> Tj 6.6 0 Td <01> Tj 7.2 0 Td <07> Tj 2.7 0 Td <04> Tj 5.6 0 Td <11> Tj 4.9 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <05> Tj 3.3 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <0C> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.1 0 Td <0B> Tj 5.6 0 Td <0C> Tj 5.5 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <14> Tj 8.3 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.6 0 Td <06> Tj ET Q q 0 0 0 rg BT 90 322.3 Td /F2 10 Tf <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <05> Tj 3.4 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <05> Tj 3.4 0 Td <02> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.4 0 Td <07> Tj 2.8 0 Td <05> Tj 3.3 0 Td <0C> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <0C> Tj 5.5 0 Td <05> Tj 3.4 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <12> Tj 5 0 Td <04> Tj 5.5 0 Td <0E> Tj 2.8 0 Td <07> Tj ET Q q 0 0 0 rg BT 90 300 Td /F2 10 Tf <22> Tj 6.7 0 Td <13> Tj 5.4 0 Td <07> Tj 2.8 0 Td <06> Tj 2.8 0 Td <02> Tj 5.5 0 Td <06> Tj 2.7 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.8 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <13> Tj 5.5 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <1104> Tj 10.5 0 Td <07> Tj 2.8 0 Td <3A> Tj 5.5 0 Td <07> Tj 2.7 0 Td <2C> Tj 5 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.6 0 Td <13> Tj 5.5 0 Td <05> Tj 3.3 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <12> Tj 5.1 0 Td <05> Tj 3.3 0 Td <04> Tj 5.5 0 Td <13> Tj 5.6 0 Td <3223> Tj 7.8 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <02> Tj 5.6 0 Td <11> Tj 4.9 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2C> Tj 5 0 Td <04> Tj 5.5 0 Td <05> Tj 3.3 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.3 0 Td <12> Tj 5 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <13> Tj 5.5 0 Td <32> Tj 5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.4 0 Td <09> Tj 5.6 0 Td <320A> Tj 7.2 0 Td <14> Tj 8.4 0 Td <13> Tj 5.6 0 Td <14> Tj 8.4 0 Td <23> Tj 3 0 Td <07> Tj 2.7 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <18> Tj 5.5 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.3 0 Td <05> Tj 3.2 0 Td <04> Tj 5.6 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 288.9 Td /F2 10 Tf <12> Tj 5 0 Td <02> Tj 5.6 0 Td <04> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <12> Tj 5 0 Td <0A> Tj 2.3 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <0D> Tj 3.3 0 Td <22> Tj 6.6 0 Td <1E> Tj 6.6 0 Td <23> Tj 2.8 0 Td <22> Tj 6.6 0 Td <01> Tj 7.2 0 Td <15> Tj 3.4 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <0C> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <0B> Tj 5.6 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.4 0 Td <02> Tj 5.5 0 Td <13> Tj 5.5 0 Td <0F> Tj 2.3 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.5 0 Td <0E> Tj ET Q q 0 0 0 rg BT 90 266.6 Td /F1 10 Tf <1B> Tj 7.2 0 Td <0209> Tj 9.4 0 Td <0C> Tj 5.6 0 Td <1C> Tj 3.4 0 Td <0B> Tj ET Q q 0 0 0 rg BT 118.3 266.6 Td /F2 10 Tf <3C> Tj 7.2 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <02> Tj 5.5 0 Td <2D> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <12> Tj 5 0 Td <0A> Tj 2.1 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.8 0 Td <1D> Tj 6.7 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <12> Tj 5 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <23> Tj 2.7 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <09> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2C> Tj 5 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <09> Tj 5.6 0 Td <2B> Tj 2.7 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <121C> Tj 10.6 0 Td <0C> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2B> Tj 2.8 0 Td <02> Tj 5.6 0 Td <05> Tj 3.3 0 Td <14> Tj 8.4 0 Td <04> Tj 5.7 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2D> Tj 5.5 0 Td <13> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <2A> Tj 5.5 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <0A> Tj 2.3 0 Td <05> Tj 3.2 0 Td <04> Tj 5.6 0 Td <12> Tj 5 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <14> Tj 8.4 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 255.4 Td /F2 10 Tf <12> Tj 5 0 Td <02> Tj 5.6 0 Td <04> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <12> Tj 5 0 Td <0A> Tj 2.3 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <22> Tj 6.6 0 Td <1E> Tj 6.6 0 Td <07> Tj 2.7 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <02> Tj 5.6 0 Td <05> Tj 3.3 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2F> Tj 5.6 0 Td <13> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <12> Tj 5 0 Td <1C> Tj 5.5 0 Td <13> Tj 5.6 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2C> Tj 5 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <09> Tj 5.6 0 Td <2B> Tj 2.7 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <12> Tj 5 0 Td <1C> Tj 5.6 0 Td <0C> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <57> Tj 5.6 0 Td <27> Tj 5.5 0 Td <07> Tj 2.7 0 Td <2B> Tj 2.8 0 Td <02> Tj 5.6 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <12> Tj 5.1 0 Td <02> Tj 5.5 0 Td <04> Tj 5.5 0 Td <2B> Tj 2.9 0 Td <2B> Tj 2.7 0 Td <0A> Tj 2.3 0 Td <12> Tj 5 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <22> Tj 6.6 0 Td <1E> Tj 6.6 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <0C> Tj 5.5 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.6 0 Td <09> Tj 5.5 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <11> Tj ET Q q 0 0 0 rg BT 90 244.3 Td /F2 10 Tf <12> Tj 5 0 Td <0A> Tj 2.2 0 Td <41> Tj 3.4 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <11> Tj 4.9 0 Td <13> Tj 5.6 0 Td <1123> Tj 7.8 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <04> Tj 5.5 0 Td <12> Tj 5 0 Td <0A> Tj 2.2 0 Td <07> Tj 2.8 0 Td <09> Tj 5.6 0 Td <2B> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2F> Tj 5.6 0 Td <13> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <09> Tj 5.6 0 Td <06> Tj 2.7 0 Td <04> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <09> Tj 5.5 0 Td <2C> Tj 5 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <09> Tj 5.6 0 Td <2C> Tj 4.9 0 Td <04> Tj 5.5 0 Td <12> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <1107> Tj 7.7 0 Td <12> Tj 5 0 Td <1C> Tj 5.5 0 Td <0A> Tj 2.3 0 Td <2B> Tj 2.8 0 Td <2B> Tj 2.8 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <11> Tj 5.1 0 Td <07> Tj 2.8 0 Td <17> Tj 5.6 0 Td <0F> Tj 2.1 0 Td <13> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <0A> Tj 2.2 0 Td <14> Tj 8.4 0 Td <17> Tj 5.5 0 Td <0F> Tj 2.3 0 Td <04> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2C> Tj 4.9 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <33> Tj ET Q q 0 0 0 rg BT 90 233.1 Td /F2 10 Tf <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <13> Tj 5.6 0 Td <32> Tj 4.9 0 Td <0A> Tj 2.2 0 Td <19> Tj 5.6 0 Td <14> Tj 8.3 0 Td <04> Tj 5.7 0 Td <07> Tj 2.7 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <07> Tj 2.7 0 Td <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <0A> Tj 2.2 0 Td <19> Tj 5.6 0 Td <14> Tj 8.3 0 Td <04> Tj 5.7 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <0C> Tj 5.5 0 Td <12> Tj 5 0 Td <0A> Tj 2.2 0 Td <14> Tj 8.4 0 Td <09> Tj 5.6 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.6 0 Td <110E> Tj ET Q q 0 0 0 rg BT 225.6 210.8 Td /F1 10 Tf <1D> Tj 7.2 0 Td <0D> Tj 6 0 Td <09> Tj 3.2 0 Td <0E> Tj 3.9 0 Td <0C> Tj 5.5 0 Td <07> Tj 5.4 0 Td <0B> Tj 2.8 0 Td <08> Tj 5.5 0 Td <07> Tj 5.5 0 Td <1A0C> Tj 11.6 0 Td <10> Tj 5.6 0 Td <09> Tj 3.3 0 Td <07> Tj 5.6 0 Td <0B> Tj 2.7 0 Td <03> Tj 6.1 0 Td <0C> Tj 5.6 0 Td <0B> Tj 2.7 0 Td <05> Tj 2.8 0 Td <08> Tj 5.5 0 Td <0B> Tj 2.8 0 Td <140203> Tj 21 0 Td <04> Tj 5.6 0 Td <05> Tj 2.7 0 Td <06> Tj 2.8 0 Td <07> Tj 5.5 0 Td <08> Tj 5.6 0 Td <09> Tj 3.3 0 Td <06> Tj 2.8 0 Td <02> Tj 6.1 0 Td <0A> Tj ET Q q 0 0 0 rg BT 90 188.5 Td /F2 10 Tf <08> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <14> Tj 8.4 0 Td <02> Tj 5.6 0 Td <13> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <120A> Tj 7.2 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <11> Tj 4.9 0 Td <13> Tj 5.6 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <0B> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <1113> Tj 10.6 0 Td <2B> Tj 2.8 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.9 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <09> Tj 5.5 0 Td <1107> Tj 7.8 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.7 0 Td <2B> Tj 2.8 0 Td <09> Tj 5.6 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <13> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2C> Tj 4.9 0 Td <05> Tj 3.3 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <0E> Tj 2.7 0 Td <07> Tj 2.8 0 Td <20> Tj 6.7 0 Td <0B> Tj 5.4 0 Td <07> Tj 2.8 0 Td <04> Tj 5.6 0 Td <2B> Tj 2.7 0 Td <2B> Tj 2.8 0 Td <04> Tj 5.6 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <03> Tj 5.5 0 Td <02> Tj 5.5 0 Td <05> Tj 3.4 0 Td <2A> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <4D> Tj 2.2 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <11> Tj 5.1 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj ET Q q 0 0 0 rg BT 90 177.4 Td /F2 10 Tf <05> Tj 3.4 0 Td <09> Tj 5.5 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <14> Tj 8.4 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.8 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <13> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2C> Tj 4.9 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.4 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <05> Tj 3.4 0 Td <0C> Tj 5.5 0 Td <11> Tj 5 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <12> Tj 5 0 Td <04> Tj 5.6 0 Td <05> Tj 3.3 0 Td <06> Tj 2.8 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.1 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.8 0 Td <2C> Tj 4.9 0 Td <05> Tj 3.3 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <09> Tj 5.5 0 Td <2D> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <05> Tj 3.3 0 Td <02> Tj 5.6 0 Td <2B> Tj 2.7 0 Td <0A> Tj 2.3 0 Td <0F> Tj 2.2 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <1C> Tj 5.5 0 Td <09> Tj 5.5 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <04> Tj 5.6 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <03> Tj 5.5 0 Td <09> Tj 5.6 0 Td <110E> Tj ET Q q 0 0 0 rg BT 90 166.2 Td /F2 10 Tf <16> Tj 6.7 0 Td <02> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <0C> Tj 5.6 0 Td <2B> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.4 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2B> Tj 2.8 0 Td <02> Tj 5.6 0 Td <05> Tj 3.3 0 Td <14> Tj 8.4 0 Td <04> Tj 5.7 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <03> Tj 5.5 0 Td <02> Tj 5.6 0 Td <05> Tj 3.3 0 Td <2A> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <3E> Tj 2.3 0 Td <4D> Tj 2.1 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <11> Tj 4.9 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <14> Tj 8.4 0 Td <09> Tj 5.6 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <09> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <2B> Tj 2.8 0 Td <02> Tj 5.6 0 Td <05> Tj 3.4 0 Td <14> Tj 8.3 0 Td <13> Tj 5.6 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <09> Tj 5.6 0 Td <2C> Tj 4.9 0 Td <04> Tj 5.5 0 Td <12> Tj 5 0 Td <07> Tj 2.8 0 Td <13> Tj 5.6 0 Td <0B> Tj 5.4 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <17> Tj 5.5 0 Td <05> Tj 3.4 0 Td <0C> Tj 5.5 0 Td <1104> Tj 10.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <09> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 155.1 Td /F2 10 Tf <05> Tj 3.4 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <2A> Tj 5.5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.4 0 Td <09> Tj 5.6 0 Td <320A> Tj 7.2 0 Td <14> Tj 8.4 0 Td <13> Tj 5.6 0 Td <14> Tj 8.6 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.5 0 Td <07> Tj 2.8 0 Td <03> Tj 5.5 0 Td <02> Tj 5.5 0 Td <05> Tj 3.3 0 Td <2A> Tj 5.5 0 Td <23> Tj 2.8 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <4D> Tj 2.2 0 Td <04> Tj 5.5 0 Td <1106> Tj 7.8 0 Td <07> Tj 2.8 0 Td <33> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.3 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <4D> Tj 2.1 0 Td <0C> Tj 5.5 0 Td <1209> Tj 10.6 0 Td <05> Tj 3.3 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <14> Tj 8.3 0 Td <09> Tj 5.6 0 Td <320A> Tj 7.3 0 Td <14> Tj 8.3 0 Td <13> Tj 5.6 0 Td <14> Tj 8.7 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <13> Tj 5.5 0 Td <07> Tj 2.7 0 Td <03> Tj 5.6 0 Td <02> Tj 5.5 0 Td <05> Tj 3.3 0 Td <2A> Tj 5.5 0 Td <07> Tj 2.8 0 Td <05> Tj 3.3 0 Td <0C> Tj 5.5 0 Td <04> Tj 5.6 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <09> Tj 5.5 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <05> Tj 3.3 0 Td <09> Tj 5.5 0 Td <17> Tj 5.5 0 Td <17> Tj 5.6 0 Td <02> Tj 5.5 0 Td <05> Tj 3.4 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <33> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.1 0 Td <2D> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.8 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 143.9 Td /F2 10 Tf <3E> Tj 2.3 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.1 0 Td <2D> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <02> Tj 5.6 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <09> Tj 5.5 0 Td <2A> Tj 5.6 0 Td <3E> Tj 2.2 0 Td <09> Tj 5.6 0 Td <1204> Tj 10.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <11> Tj 5 0 Td <23> Tj 2.8 0 Td <07> Tj 2.7 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <13> Tj 5.6 0 Td <32> Tj 5 0 Td <07> Tj 2.7 0 Td <09> Tj 5.6 0 Td <05> Tj 3.3 0 Td <1211> Tj 10.1 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <09> Tj 5.5 0 Td <05> Tj 3.3 0 Td <09> Tj 5.6 0 Td <03> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <07> Tj 2.7 0 Td <3E> Tj 2.3 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <2D> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.1 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <05> Tj 3.2 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <2A> Tj 5.6 0 Td <07> Tj 2.7 0 Td <14> Tj 8.4 0 Td <09> Tj 5.6 0 Td <320A> Tj 7.2 0 Td <14> Tj 8.4 0 Td <13> Tj 5.6 0 Td <14> Tj 8.6 0 Td <07> Tj 2.8 0 Td <09> Tj 5.6 0 Td <13> Tj 5.5 0 Td <32> Tj ET Q q 0 0 0 rg BT 90 132.8 Td /F2 10 Tf <12> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.6 0 Td <0E> Tj 2.6 0 Td <07> Tj 2.8 0 Td <08> Tj 5.5 0 Td <04> Tj 5.6 0 Td <1107> Tj 7.7 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <11> Tj 5 0 Td <4D> Tj 2.2 0 Td <09> Tj 5.5 0 Td <17> Tj 5.5 0 Td <17> Tj 5.6 0 Td <13> Tj 5.5 0 Td <0A> Tj 2.1 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <11> Tj 5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <1204> Tj 10.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <03> Tj 5.5 0 Td <02> Tj 5.5 0 Td <05> Tj 3.4 0 Td <2A> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.5 0 Td <0E> Tj 2.8 0 Td <07> Tj 2.7 0 Td <08> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <2C> Tj 5 0 Td <05> Tj 3.3 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <2D> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2C> Tj 4.9 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.4 0 Td <07> Tj 2.8 0 Td <04> Tj 5.6 0 Td <11> Tj 4.9 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <02> Tj 5.5 0 Td <03> Tj 5.5 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <13> Tj ET Q q 0 0 0 rg BT 90 121.6 Td /F2 10 Tf <17> Tj 5.5 0 Td <09> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <06> Tj 2.8 0 Td <09> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <09> Tj 5.6 0 Td <13> Tj 5.5 0 Td <06> Tj 2.7 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <04> Tj 5.6 0 Td <3206> Tj 7.7 0 Td <05> Tj 3.4 0 Td <0C> Tj 5.5 0 Td <14> Tj 8.4 0 Td <0A> Tj 2.2 0 Td <06> Tj 2.8 0 Td <0C> Tj 5.6 0 Td <07> Tj 2.7 0 Td <12> Tj 5 0 Td <02> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0C> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2D> Tj 5.5 0 Td <13> Tj 5.6 0 Td <0A> Tj 2.1 0 Td <0B> Tj 5.5 0 Td <2A> Tj 5.6 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0E> Tj 2.7 0 Td <07> Tj 2.8 0 Td <08> Tj 5.5 0 Td <4D> Tj 2.1 0 Td <09> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <2D> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <06> Tj 2.8 0 Td <09> Tj 5.5 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <04> Tj 5.6 0 Td <1106> Tj ET Q q 0 0 0 rg BT 90 110.5 Td /F2 10 Tf <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <17> Tj 5.5 0 Td <02> Tj 5.6 0 Td <05> Tj 3.3 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.7 0 Td <33> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <1C> Tj 5.5 0 Td <09> Tj 5.5 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <13> Tj 5.5 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <13> Tj 5.6 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <0E> Tj 2.8 0 Td <07> Tj ET Q q 0 0 0 rg BT 90 88.2 Td /F2 10 Tf <1F> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <07> Tj 2.8 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <33> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0B> Tj 5.5 0 Td <02> Tj 5.5 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <2F> Tj 5.6 0 Td <13> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <1204> Tj 10.5 0 Td <06> Tj 2.8 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.3 0 Td <0C> Tj 5.6 0 Td <06> Tj 2.8 0 Td <1C> Tj 5.5 0 Td <02> Tj 5.6 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <14> Tj 8.4 0 Td <02> Tj 5.6 0 Td <2A> Tj 5.5 0 Td <0C> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <09> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <11> Tj 5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <2B> Tj 2.8 0 Td <09> Tj 5.6 0 Td <1204> Tj 10.6 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <04> Tj 5.6 0 Td <05> Tj 3.3 0 Td <14> Tj 8.4 0 Td <04> Tj 5.6 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <11> Tj 5 0 Td <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <13> Tj 5.5 0 Td <0A> Tj 2.3 0 Td <05> Tj 3.3 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 77 Td /F2 10 Tf <13> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <09> Tj 5.5 0 Td <2E> Tj 4.8 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.7 0 Td <07> Tj 2.7 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2B> Tj 2.8 0 Td <02> Tj 5.5 0 Td <05> Tj 3.4 0 Td <14> Tj 8.4 0 Td <04> Tj 5.7 0 Td <07> Tj 2.7 0 Td <11> Tj 5 0 Td <09> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <03> Tj 5.5 0 Td <02> Tj 5.6 0 Td <1111> Tj 10 0 Td <04> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <07> Tj 2.7 0 Td <14> Tj 8.4 0 Td <0C> Tj 5.5 0 Td <17> Tj 5.6 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <06> Tj 2.8 0 Td <11> Tj 5 0 Td <23> Tj 2.8 0 Td <07> Tj 2.8 0 Td <0B> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <02> Tj 5.5 0 Td <11> Tj 5 0 Td <11> Tj 5 0 Td <0A> Tj 2.2 0 Td <03> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.1 0 Td <06> Tj 2.8 0 Td <0C> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <4D> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <2C> Tj 4.9 0 Td <04> Tj 5.5 0 Td <05> Tj 3.4 0 Td <11> Tj 4.9 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <1209> Tj 10.6 0 Td <14> Tj 8.4 0 Td <03> Tj 5.6 0 Td <05> Tj 3.3 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj ET Q Q q 109.9 431.6 392.2 266.1 re W* n 1 1 1 rg 109.9 697.7 m 502 697.7 l 502 431.7 l 109.9 431.7 l 109.9 697.7 l h f* 0.90196 0.90196 0.90196 rg 153.8 687.8 m 431.5 687.8 l 431.5 437.1 l 153.8 437.1 l 153.8 687.8 l h f* 0 0 0 RG 153.8 437.1 m 431.5 437.1 l S 153.8 452.7 m 431.5 452.7 l S 153.8 468.4 m 431.5 468.4 l S 153.8 484.1 m 431.5 484.1 l S 153.8 499.7 m 431.5 499.7 l S 153.8 515.4 m 431.5 515.4 l S 153.8 531.1 m 431.5 531.1 l S 153.8 546.7 m 431.5 546.7 l S 153.8 562.4 m 431.5 562.4 l S 153.8 578.1 m 431.5 578.1 l S 153.8 593.8 m 431.5 593.8 l S 153.8 609.4 m 431.5 609.4 l S 153.8 625.1 m 431.5 625.1 l S 153.8 640.8 m 431.5 640.8 l S 153.8 656.4 m 431.5 656.4 l S 153.8 672.1 m 431.5 672.1 l S 153.8 687.8 m 431.5 687.8 l S 153.8 437.1 m 153.8 687.8 l S 167.7 437.1 m 167.7 687.8 l S 181.6 437.1 m 181.6 687.8 l S 195.4 437.1 m 195.4 687.8 l S 209.3 437.1 m 209.3 687.8 l S 223.2 437.1 m 223.2 687.8 l S 237.1 437.1 m 237.1 687.8 l S 251 437.1 m 251 687.8 l S 264.9 437.1 m 264.9 687.8 l S 278.8 437.1 m 278.8 687.8 l S 292.7 437.1 m 292.7 687.8 l S 306.5 437.1 m 306.5 687.8 l S 320.4 437.1 m 320.4 687.8 l S 334.3 437.1 m 334.3 687.8 l S 348.2 437.1 m 348.2 687.8 l S 362.1 437.1 m 362.1 687.8 l S 376 437.1 m 376 687.8 l S 389.9 437.1 m 389.9 687.8 l S 403.8 437.1 m 403.8 687.8 l S 417.7 437.1 m 417.7 687.8 l S 431.5 437.1 m 431.5 687.8 l S 153.8 437.1 m 431.5 437.1 l S 153.8 656.4 m 431.5 656.4 l S 153.8 652.2 m 153.8 656.4 l S 167.7 652.2 m 167.7 656.4 l S 181.6 652.2 m 181.6 656.4 l S 195.4 652.2 m 195.4 656.4 l S 209.3 652.2 m 209.3 656.4 l S 223.2 652.2 m 223.2 656.4 l S 237.1 652.2 m 237.1 656.4 l S 251 652.2 m 251 656.4 l S 264.9 652.2 m 264.9 656.4 l S 278.8 652.2 m 278.8 656.4 l S 292.7 652.2 m 292.7 656.4 l S 306.5 652.2 m 306.5 656.4 l S 320.4 652.2 m 320.4 656.4 l S 334.3 652.2 m 334.3 656.4 l S 348.2 652.2 m 348.2 656.4 l S 362.1 652.2 m 362.1 656.4 l S 376 652.2 m 376 656.4 l S 389.9 652.2 m 389.9 656.4 l S 403.8 652.2 m 403.8 656.4 l S 417.7 652.2 m 417.7 656.4 l S 431.5 652.2 m 431.5 656.4 l S 153.8 437.1 m 153.8 687.8 l S 153.8 437.1 m 153.8 687.8 l S 149.6 437.1 m 153.8 437.1 l S q 0 0 0 rg BT 119.8 433.8 Td /F2 9.3 Tf <41> Tj 3.1 0 Td <38> Tj 5.3 0 Td <23> Tj 2.6 0 Td <27> Tj 5.4 0 Td <27> Tj 5.2 0 Td <27> Tj ET Q 0 0 0 RG 149.6 452.7 m 153.8 452.7 l S q 0 0 0 rg BT 119.8 449.5 Td /F2 9.3 Tf <41> Tj 3.1 0 Td <3B> Tj 5.3 0 Td <23> Tj 2.6 0 Td <57> Tj 5.4 0 Td <27> Tj 5.2 0 Td <27> Tj ET Q 0 0 0 RG 149.6 468.4 m 153.8 468.4 l S q 0 0 0 rg BT 119.8 465.2 Td /F2 9.3 Tf <41> Tj 3.1 0 Td <3B> Tj 5.3 0 Td <23> Tj 2.6 0 Td <27> Tj 5.4 0 Td <27> Tj 5.2 0 Td <27> Tj ET Q 0 0 0 RG 149.6 484.1 m 153.8 484.1 l S q 0 0 0 rg BT 119.8 480.8 Td /F2 9.3 Tf <41> Tj 3.1 0 Td <57> Tj 5.3 0 Td <23> Tj 2.6 0 Td <57> Tj 5.4 0 Td <27> Tj 5.2 0 Td <27> Tj ET Q 0 0 0 RG 149.6 499.7 m 153.8 499.7 l S q 0 0 0 rg BT 119.8 496.5 Td /F2 9.3 Tf <41> Tj 3.1 0 Td <57> Tj 5.3 0 Td <23> Tj 2.6 0 Td <27> Tj 5.4 0 Td <27> Tj 5.2 0 Td <27> Tj ET Q 0 0 0 RG 149.6 515.4 m 153.8 515.4 l S q 0 0 0 rg BT 119.8 512.2 Td /F2 9.3 Tf <41> Tj 3.1 0 Td <28> Tj 5.3 0 Td <23> Tj 2.6 0 Td <57> Tj 5.4 0 Td <27> Tj 5.2 0 Td <27> Tj ET Q 0 0 0 RG 149.6 531.1 m 153.8 531.1 l S q 0 0 0 rg BT 119.8 527.8 Td /F2 9.3 Tf <41> Tj 3.1 0 Td <28> Tj 5.3 0 Td <23> Tj 2.6 0 Td <27> Tj 5.4 0 Td <27> Tj 5.2 0 Td <27> Tj ET Q 0 0 0 RG 149.6 546.7 m 153.8 546.7 l S q 0 0 0 rg BT 119.8 543.5 Td /F2 9.3 Tf <41> Tj 3.1 0 Td <3A> Tj 5.3 0 Td <23> Tj 2.6 0 Td <57> Tj 5.4 0 Td <27> Tj 5.2 0 Td <27> Tj ET Q 0 0 0 RG 149.6 562.4 m 153.8 562.4 l S q 0 0 0 rg BT 119.8 559.2 Td /F2 9.3 Tf <41> Tj 3.1 0 Td <3A> Tj 5.3 0 Td <23> Tj 2.6 0 Td <27> Tj 5.4 0 Td <27> Tj 5.2 0 Td <27> Tj ET Q 0 0 0 RG 149.6 578.1 m 153.8 578.1 l S q 0 0 0 rg BT 119.8 574.9 Td /F2 9.3 Tf <41> Tj 3.1 0 Td <18> Tj 5.3 0 Td <23> Tj 2.6 0 Td <57> Tj 5.4 0 Td <27> Tj 5.2 0 Td <27> Tj ET Q 0 0 0 RG 149.6 593.8 m 153.8 593.8 l S q 0 0 0 rg BT 119.8 590.5 Td /F2 9.3 Tf <41> Tj 3.1 0 Td <18> Tj 5.3 0 Td <23> Tj 2.6 0 Td <27> Tj 5.4 0 Td <27> Tj 5.2 0 Td <27> Tj ET Q 0 0 0 RG 149.6 609.4 m 153.8 609.4 l S q 0 0 0 rg BT 119.8 606.2 Td /F2 9.3 Tf <41> Tj 3.1 0 Td <26> Tj 5.3 0 Td <23> Tj 2.6 0 Td <57> Tj 5.4 0 Td <27> Tj 5.2 0 Td <27> Tj ET Q 0 0 0 RG 149.6 625.1 m 153.8 625.1 l S q 0 0 0 rg BT 119.8 621.9 Td /F2 9.3 Tf <41> Tj 3.1 0 Td <26> Tj 5.3 0 Td <23> Tj 2.6 0 Td <27> Tj 5.4 0 Td <27> Tj 5.2 0 Td <27> Tj ET Q 0 0 0 RG 149.6 640.8 m 153.8 640.8 l S q 0 0 0 rg BT 119.8 637.5 Td /F2 9.3 Tf <41> Tj 3.1 0 Td <27> Tj 5.3 0 Td <23> Tj 2.6 0 Td <57> Tj 5.4 0 Td <27> Tj 5.2 0 Td <27> Tj ET Q 0 0 0 RG 149.6 656.4 m 153.8 656.4 l S q 0 0 0 rg BT 122.9 653.2 Td /F2 9.3 Tf <27> Tj 5.3 0 Td <23> Tj 2.6 0 Td <27> Tj 5.4 0 Td <27> Tj 5.2 0 Td <27> Tj ET Q 0 0 0 RG 149.6 672.1 m 153.8 672.1 l S q 0 0 0 rg BT 122.9 668.9 Td /F2 9.3 Tf <27> Tj 5.3 0 Td <23> Tj 2.6 0 Td <57> Tj 5.4 0 Td <27> Tj 5.2 0 Td <27> Tj ET Q 0 0 0 RG 149.6 687.8 m 153.8 687.8 l S q 0 0 0 rg BT 122.9 684.6 Td /F2 9.3 Tf <26> Tj 5.3 0 Td <23> Tj 2.6 0 Td <27> Tj 5.4 0 Td <27> Tj 5.2 0 Td <27> Tj ET Q 0 0.4 0.8 rg 153.1 449.3 m 167 496.2 l 167.7 495.9 l 168.3 495.7 l 154.5 448.9 l 153.1 449.3 l h f* 167.7 495.9 m 167 496.2 l 180.9 534.2 l 181.6 533.8 l 182.2 533.6 l 168.3 495.7 l 167.7 495.9 l h f* 181.6 533.8 m 180.9 534.2 l 194.8 564.5 l 195.4 564.2 l 196.1 563.8 l 182.2 533.6 l 181.6 533.8 l h f* 195.4 564.2 m 194.8 564.5 l 208.7 588.6 l 209.3 588.1 l 209.9 587.7 l 196.1 563.8 l 195.4 564.2 l h f* 209.3 588.1 m 208.7 588.6 l 222.7 607.3 l 223.2 606.8 l 223.7 606.3 l 209.9 587.7 l 209.3 588.1 l h f* 223.2 606.8 m 222.7 607.3 l 236.7 621.6 l 237.1 621 l 237.5 620.5 l 223.7 606.3 l 223.2 606.8 l h f* 237.1 621 m 236.7 621.6 l 250.6 632.4 l 251 631.8 l 251.3 631.1 l 237.5 620.5 l 237.1 621 l h f* 251 631.8 m 250.6 632.4 l 264.6 640.3 l 264.9 639.6 l 265.2 638.9 l 251.3 631.1 l 251 631.8 l h f* 264.9 639.6 m 264.6 640.3 l 278.6 645.9 l 278.8 645.2 l 279 644.5 l 265.2 638.9 l 264.9 639.6 l h f* 278.8 645.2 m 278.6 645.9 l 292.5 649.8 l 292.6 649 l 292.8 648.3 l 279 644.5 l 278.8 645.2 l h f* 292.6 649 m 292.5 649.8 l 306.5 652.3 l 306.5 651.6 l 306.6 650.9 l 292.8 648.3 l 292.6 649 l h f* 306.5 651.6 m 306.5 652.3 l 320.4 654 l 320.4 653.2 l 320.5 652.5 l 306.6 650.9 l 306.5 651.6 l h f* 320.4 653.2 m 320.4 654 l 334.3 654.9 l 334.3 654.2 l 334.3 653.4 l 320.5 652.5 l 320.4 653.2 l h f* 334.3 654.2 m 334.3 654.9 l 348.2 655.4 l 348.2 654.7 l 348.2 654 l 334.3 653.4 l 334.3 654.2 l h f* 348.2 654.7 m 348.2 655.4 l 362.1 655.6 l 362.1 654.9 l 362.1 654.2 l 348.2 654 l 348.2 654.7 l h f* 362.1 654.9 m 362.1 655.6 l 376 655.7 l 376 654.9 l 376 654.2 l 362.1 654.2 l 362.1 654.9 l h f* 376 654.9 m 376 655.7 l 389.9 655.6 l 389.9 654.9 l 389.8 654.2 l 376 654.2 l 376 654.9 l h f* 389.9 654.9 m 389.9 655.6 l 403.8 655.5 l 403.8 654.8 l 403.7 654.1 l 389.8 654.2 l 389.9 654.9 l h f* 403.8 654.8 m 403.8 655.5 l 417.7 655.4 l 417.7 654.7 l 417.6 654 l 403.7 654.1 l 403.8 654.8 l h f* 417.7 654.7 m 417.7 655.4 l 431.5 655.3 l 431.5 653.9 l 417.6 654 l 417.7 654.7 l h f* 0.59999 0.2 0.4 rg 154.2 687 m 168 677.9 l 167.7 677.2 l 167.3 676.6 l 153.4 685.8 l 154.2 687 l h f* 167.7 677.2 m 168 677.9 l 181.8 670.8 l 181.6 670.2 l 181.3 669.5 l 167.3 676.6 l 167.7 677.2 l h f* 181.6 670.2 m 181.8 670.8 l 195.6 665.5 l 195.4 664.8 l 195.2 664.2 l 181.3 669.5 l 181.6 670.2 l h f* 195.4 664.8 m 195.6 665.5 l 209.5 661.5 l 209.3 660.8 l 209.2 660.2 l 195.2 664.2 l 195.4 664.8 l h f* 209.3 660.8 m 209.5 661.5 l 223.3 658.6 l 223.2 657.9 l 223.1 657.2 l 209.2 660.2 l 209.3 660.8 l h f* 223.2 657.9 m 223.3 658.6 l 237.2 656.5 l 237.1 655.8 l 237 655.1 l 223.1 657.2 l 223.2 657.9 l h f* 237.1 655.8 m 237.2 656.5 l 251 655.1 l 251 654.3 l 251 653.6 l 237 655.1 l 237.1 655.8 l h f* 251 654.3 m 251 655.1 l 264.9 654 l 264.9 653.3 l 264.8 652.6 l 251 653.6 l 251 654.3 l h f* 264.9 653.3 m 264.9 654 l 278.8 653.3 l 278.8 652.6 l 278.8 651.9 l 264.8 652.6 l 264.9 653.3 l h f* 278.8 652.6 m 278.8 653.3 l 292.6 652.8 l 292.6 652.1 l 292.6 651.4 l 278.8 651.9 l 278.8 652.6 l h f* 292.6 652.1 m 292.6 652.8 l 306.5 652.6 l 306.5 651.8 l 306.5 651.1 l 292.6 651.4 l 292.6 652.1 l h f* 306.5 651.8 m 306.5 652.6 l 320.4 652.4 l 320.4 651.6 l 320.4 650.9 l 306.5 651.1 l 306.5 651.8 l h f* 320.4 651.6 m 320.4 652.4 l 334.3 652.2 l 334.3 651.5 l 334.3 650.8 l 320.4 650.9 l 320.4 651.6 l h f* 334.3 651.5 m 334.3 652.2 l 348.2 652.1 l 348.2 651.4 l 348.2 650.7 l 334.3 650.8 l 334.3 651.5 l h f* 348.2 651.4 m 348.2 652.1 l 362.1 652.1 l 362.1 651.3 l 362.1 650.6 l 348.2 650.7 l 348.2 651.4 l h f* 362.1 651.3 m 362.1 652.1 l 376 652 l 376 651.2 l 376 650.5 l 362.1 650.6 l 362.1 651.3 l h f* 376 651.2 m 376 652 l 389.9 651.9 l 389.9 651.1 l 389.8 650.4 l 376 650.5 l 376 651.2 l h f* 389.9 651.1 m 389.9 651.9 l 403.8 651.8 l 403.8 651.1 l 403.7 650.4 l 389.8 650.4 l 389.9 651.1 l h f* 403.8 651.1 m 403.8 651.8 l 417.7 651.7 l 417.7 651 l 417.6 650.3 l 403.7 650.4 l 403.8 651.1 l h f* 417.7 651 m 417.7 651.7 l 431.5 651.6 l 431.5 650.2 l 417.6 650.3 l 417.7 651 l h f* 0 0 0 rg 153.3 657 m 167.2 669.6 l 167.2 669.6 l 167.3 669.7 l 167.7 669 l 168.2 668.5 l 154.3 655.9 l 153.3 657 l h f* 167.3 669.7 m 181.2 678.2 l 181.2 678.2 l 181.3 678.2 l 181.6 677.6 l 181.9 677 l 168 668.4 l 167.7 669 l 167.3 669.7 l h f* 181.6 677.6 m 181.3 678.2 l 195.3 683.7 l 195.4 683 l 195.6 682.4 l 181.8 676.9 l 181.6 677.6 l h f* 195.4 683 m 195.3 683.7 l 209.3 686.9 l 209.3 686.2 l 209.4 685.5 l 195.6 682.4 l 195.4 683 l h f* 209.3 686.2 m 209.3 686.9 l 223.2 688.3 l 223.2 687.6 l 223.2 686.9 l 209.4 685.5 l 209.3 686.2 l h f* 223.2 687.6 m 223.2 688.3 l 237.1 688.5 l 237.1 687.8 l 237.1 687.1 l 223.2 686.9 l 223.2 687.6 l h f* 237.1 687.8 m 237.1 688.5 l 251.1 687.8 l 251 687.1 l 250.9 686.4 l 237.1 687.1 l 237.1 687.8 l h f* 251 687.1 m 251.1 687.8 l 265 686.4 l 264.9 685.7 l 264.8 685 l 250.9 686.4 l 251 687.1 l h f* 264.9 685.7 m 265 686.4 l 278.9 684.7 l 278.8 683.9 l 278.7 683.2 l 264.8 685 l 264.9 685.7 l h f* 278.8 683.9 m 278.9 684.7 l 292.8 682.6 l 292.6 681.9 l 292.5 681.2 l 278.7 683.2 l 278.8 683.9 l h f* 292.6 681.9 m 292.8 682.6 l 306.7 680.4 l 306.5 679.7 l 306.4 679 l 292.5 681.2 l 292.6 681.9 l h f* 306.5 679.7 m 306.7 680.4 l 320.5 678 l 320.4 677.3 l 320.3 676.6 l 306.4 679 l 306.5 679.7 l h f* 320.4 677.3 m 320.5 678 l 334.4 675.6 l 334.3 674.8 l 334.2 674.1 l 320.3 676.6 l 320.4 677.3 l h f* 334.3 674.8 m 334.4 675.6 l 348.3 673.1 l 348.2 672.3 l 348.1 671.6 l 334.2 674.1 l 334.3 674.8 l h f* 348.2 672.3 m 348.3 673.1 l 362.2 670.5 l 362.1 669.8 l 362 669.1 l 348.1 671.6 l 348.2 672.3 l h f* 362.1 669.8 m 362.2 670.5 l 376.1 667.9 l 376 667.2 l 375.8 666.5 l 362 669.1 l 362.1 669.8 l h f* 376 667.2 m 376.1 667.9 l 390 665.3 l 389.9 664.6 l 389.7 663.9 l 375.8 666.5 l 376 667.2 l h f* 389.9 664.6 m 390 665.3 l 403.9 662.7 l 403.8 661.9 l 403.6 661.2 l 389.7 663.9 l 389.9 664.6 l h f* 403.8 661.9 m 403.9 662.7 l 417.8 659.9 l 417.7 659.2 l 417.5 658.5 l 403.6 661.2 l 403.8 661.9 l h f* 417.7 659.2 m 417.8 659.9 l 431.6 657.2 l 431.4 655.7 l 417.5 658.5 l 417.7 659.2 l h f* 0.23921 0.92156 0.23921 rg 154.3 578.5 m 168.2 564 l 167.7 563.5 l 167.6 562.8 l 167.6 562.8 l 167.5 562.8 l 167.4 562.8 l 167.3 562.8 l 167.1 563 l 153.3 577.5 l 154.3 578.5 l h f* 167.7 564.2 m 181.6 562.9 l 181.6 562.2 l 182 561.7 l 182 561.7 l 181.9 561.6 l 181.8 561.5 l 181.7 561.5 l 181.5 561.5 l 167.6 562.8 l 167.7 563.5 l 167.7 564.2 l h f* 181.1 562.8 m 195 573.8 l 195.4 573.3 l 196 572.8 l 196 572.8 l 195.9 572.7 l 182 561.7 l 181.6 562.2 l 181.1 562.8 l h f* 195.4 573.3 m 194.9 573.7 l 208.8 590.6 l 209.3 590.1 l 209.9 589.7 l 196 572.8 l 195.4 573.3 l h f* 209.3 590.1 m 208.8 590.6 l 222.7 607.5 l 223.2 607 l 223.7 606.5 l 209.9 589.7 l 209.3 590.1 l h f* 223.2 607 m 222.7 607.5 l 236.7 621.7 l 237.1 621.1 l 237.5 620.5 l 223.7 606.5 l 223.2 607 l h f* 237.1 621.1 m 236.7 621.7 l 250.6 632.6 l 251 631.9 l 251.3 631.3 l 237.5 620.5 l 237.1 621.1 l h f* 251 631.9 m 250.6 632.6 l 264.6 640.5 l 264.9 639.8 l 265.2 639.2 l 251.3 631.3 l 251 631.9 l h f* 264.9 639.8 m 264.6 640.5 l 278.6 646.1 l 278.8 645.4 l 279 644.7 l 265.2 639.2 l 264.9 639.8 l h f* 278.8 645.4 m 278.6 646.1 l 292.5 650 l 292.6 649.2 l 292.8 648.5 l 279 644.7 l 278.8 645.4 l h f* 292.6 649.2 m 292.5 650 l 306.5 652.5 l 306.5 651.8 l 306.6 651.1 l 292.8 648.5 l 292.6 649.2 l h f* 306.5 651.8 m 306.5 652.5 l 320.4 654.1 l 320.4 653.3 l 320.5 652.6 l 306.6 651.1 l 306.5 651.8 l h f* 320.4 653.3 m 320.4 654.1 l 334.3 655 l 334.3 654.2 l 334.3 653.5 l 320.5 652.6 l 320.4 653.3 l h f* 334.3 654.2 m 334.3 655 l 348.2 655.5 l 348.2 654.7 l 348.2 654 l 334.3 653.5 l 334.3 654.2 l h f* 348.2 654.7 m 348.2 655.5 l 362.1 655.7 l 362.1 654.9 l 362.1 654.2 l 348.2 654 l 348.2 654.7 l h f* 362.1 654.9 m 362.1 655.7 l 376 655.7 l 376 655 l 376 654.3 l 362.1 654.2 l 362.1 654.9 l h f* 376 655 m 376 655.7 l 389.9 655.7 l 389.9 654.9 l 389.8 654.2 l 376 654.3 l 376 655 l h f* 389.9 654.9 m 389.9 655.7 l 403.8 655.6 l 403.8 654.9 l 403.7 654.2 l 389.8 654.2 l 389.9 654.9 l h f* 403.8 654.9 m 403.8 655.6 l 417.7 655.5 l 417.7 654.8 l 417.6 654.1 l 403.7 654.2 l 403.8 654.9 l h f* 417.7 654.8 m 417.7 655.5 l 431.5 655.4 l 431.5 654 l 417.6 654.1 l 417.7 654.8 l h f* 0.85098 0.85098 0.85098 rg 447.1 589.7 m 493.6 589.7 l 493.6 540.9 l 447.1 540.9 l 447.1 589.7 l h f* 0 0 0 RG 470.3 540.9 m 447.1 540.9 l 447.1 589.7 l 493.6 589.7 l 493.6 540.9 l 470.3 540.9 l h S 0 0.4 0.8 rg 450.3 587.5 m 458.3 579.5 l 457.2 578.5 l 449.2 586.5 l 450.3 587.5 l h f* q 0 0 0 rg BT 460.4 579.8 Td /F2 8 Tf <4B> Tj 3.8 0 Td <30> Tj 1.5 0 Td <30> Tj ET Q 0.59999 0.2 0.4 rg 450.3 576 m 458.3 568 l 457.2 567 l 449.2 575 l 450.3 576 l h f* q 0 0 0 rg BT 460.4 568.3 Td /F2 8 Tf <4B> Tj 3.8 0 Td <30> Tj ET Q 0 0 0 rg 450.3 564.5 m 458.3 556.5 l 457.2 555.4 l 449.2 563.4 l 450.3 564.5 l h f* q 0 0 0 rg BT 460.4 556.7 Td /F2 8 Tf <4B> Tj 3.8 0 Td <07> Tj 2.2 0 Td <54> Tj 3.1 0 Td <07> Tj 2.2 0 Td <26> Tj 4.3 0 Td <27> Tj ET Q 0.23921 0.92156 0.23921 rg 450.3 552.9 m 458.3 544.9 l 457.2 543.9 l 449.2 551.9 l 450.3 552.9 l h f* q 0 0 0 rg BT 460.4 545.2 Td /F2 8 Tf <12> Tj 4.1 0 Td <02> Tj 4.1 0 Td <13> Tj 4.3 0 Td <05> Tj 2.6 0 Td <03> Tj 4.4 0 Td <13> Tj 4.3 0 Td <05> Tj 2.6 0 Td <04> Tj ET Q Q endstream endobj 9 0 obj 54771 endobj 10 0 obj << /Length 11 0 R >> stream 0 w q 0 -0.1 612.1 792.1 re W* n q 0 0 0 rg BT 90 711 Td /F2 10 Tf <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <1123> Tj 7.8 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <04> Tj 5.5 0 Td <12> Tj 5 0 Td <0A> Tj 2.2 0 Td <07> Tj 2.8 0 Td <09> Tj 5.6 0 Td <2C> Tj 4.9 0 Td <04> Tj 5.5 0 Td <1207> Tj 7.8 0 Td <17> Tj 5.5 0 Td <04> Tj 5.5 0 Td <13> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <09> Tj 5.6 0 Td <05> Tj 3.2 0 Td <09> Tj 5.6 0 Td <14> Tj 8.4 0 Td <19> Tj 5.5 0 Td <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <11> Tj 5.1 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <12> Tj 5 0 Td <13> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <0A> Tj 2.2 0 Td <14> Tj 8.4 0 Td <17> Tj 5.6 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <11> Tj 5.1 0 Td <0E> Tj 2.7 0 Td <07> Tj 2.8 0 Td <08> Tj 5.5 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.3 0 Td <0C> Tj 5.6 0 Td <06> Tj 2.8 0 Td <1C> Tj 5.5 0 Td <02> Tj 5.6 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <04> Tj 5.6 0 Td <11> Tj 4.9 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <09> Tj 5.5 0 Td <17> Tj 5.6 0 Td <17> Tj 5.5 0 Td <0F> Tj 2.1 0 Td <0A> Tj 2.2 0 Td <12> Tj 5 0 Td <09> Tj 5.5 0 Td <03> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <09> Tj 5.5 0 Td <13> Tj 5.5 0 Td <11> Tj 5.1 0 Td <11> Tj 5 0 Td <0A> Tj 2.2 0 Td <07> Tj 2.7 0 Td <03> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.5 0 Td <0B> Tj ET Q q 0 0 0 rg BT 90 699.8 Td /F2 10 Tf <09> Tj 5.5 0 Td <13> Tj 5.6 0 Td <32> Tj 5 0 Td <07> Tj 2.8 0 Td <2C> Tj 4.9 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <1107> Tj 7.7 0 Td <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <0A> Tj 2.2 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <2D> Tj 5.6 0 Td <13> Tj 5.5 0 Td <0F> Tj 2.1 0 Td <09> Tj 5.6 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.3 0 Td <04> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <4D> Tj 2.2 0 Td <09> Tj 5.5 0 Td <13> Tj 5.6 0 Td <32> Tj 5 0 Td <07> Tj 2.8 0 Td <2C> Tj 4.9 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <1107> Tj 7.7 0 Td <33> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2F> Tj 5.6 0 Td <13> Tj 5.5 0 Td <09> Tj 5.5 0 Td <06> Tj 2.8 0 Td <05> Tj 3.2 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <02> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0C> Tj 5.6 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <04> Tj 5.6 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <1D> Tj 6.6 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <12> Tj 5 0 Td <13> Tj 5.6 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <13> Tj 5.5 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <11> Tj 4.9 0 Td <0C> Tj 5.6 0 Td <07> Tj 2.7 0 Td <05> Tj 3.4 0 Td <0C> Tj 5.5 0 Td <2D> Tj 5.5 0 Td <13> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.1 0 Td <19> Tj 5.6 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <14> Tj 8.4 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj ET Q q 0 0 0 rg BT 90 688.7 Td /F2 10 Tf <2C> Tj 5 0 Td <0A> Tj 2.1 0 Td <04> Tj 5.6 0 Td <13> Tj 5.5 0 Td <3207> Tj 7.7 0 Td <2D> Tj 5.6 0 Td <05> Tj 3.3 0 Td <0C> Tj 5.5 0 Td <04> Tj 5.6 0 Td <14> Tj 8.3 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.7 0 Td <11> Tj 5.1 0 Td <0E> Tj 2.8 0 Td <07> Tj ET Q q 0 0 0 rg BT 278.9 644.1 Td /F1 10 Tf <1E> Tj 7.2 0 Td <020A10> Tj 17.7 0 Td <05> Tj 2.8 0 Td <0D07> Tj 11.6 0 Td <06> Tj 2.8 0 Td <020A> Tj ET Q q 0 0 0 rg BT 90 621.8 Td /F2 10 Tf <29> Tj 7.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.6 0 Td <09> Tj 5.5 0 Td <17> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.5 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <0C> Tj 5.5 0 Td <11> Tj 5 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.7 0 Td <0C> Tj 5.6 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.4 0 Td <07> Tj 2.8 0 Td <14> Tj 8.4 0 Td <0C> Tj 5.6 0 Td <06> Tj 2.8 0 Td <1C> Tj 5.5 0 Td <02> Tj 5.5 0 Td <2A> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <02> Tj 5.5 0 Td <2D> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <0C> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.6 0 Td <09> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <02> Tj 5.5 0 Td <2D> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <12> Tj 5 0 Td <0A> Tj 2.2 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.7 0 Td <1D> Tj 6.7 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <12> Tj 5 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0E> Tj 2.7 0 Td <07> Tj 2.8 0 Td <3C> Tj 7.2 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.7 0 Td <1204> Tj 10.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.7 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <4D> Tj 2.2 0 Td <13> Tj 5.5 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <0A> Tj 2.3 0 Td <11> Tj 4.9 0 Td <09> Tj 5.5 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <11> Tj ET Q q 0 0 0 rg BT 90 610.6 Td /F2 10 Tf <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <09> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <14> Tj 8.4 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <12> Tj 5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.4 0 Td <14> Tj 8.3 0 Td <0C> Tj 5.8 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <03> Tj 5.5 0 Td <13> Tj 5.6 0 Td <11> Tj 5 0 Td <06> Tj 2.8 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <11> Tj 5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.4 0 Td <07> Tj 2.8 0 Td <14> Tj 8.4 0 Td <0C> Tj 5.6 0 Td <06> Tj 2.8 0 Td <1C> Tj 5.5 0 Td <02> Tj 5.5 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <0E> Tj 2.7 0 Td <07> Tj 2.8 0 Td <08> Tj 5.5 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <14> Tj 8.4 0 Td <02> Tj 5.6 0 Td <2A> Tj 5.5 0 Td <0C> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <09> Tj 5.6 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.1 0 Td <02> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <11> Tj 4.9 0 Td <0A> Tj 2.3 0 Td <14> Tj 8.3 0 Td <17> Tj 5.6 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <04> Tj 5.6 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <04> Tj 5.5 0 Td <05> Tj 3.4 0 Td <14> Tj 8.4 0 Td <04> Tj 5.6 0 Td <06> Tj ET Q q 0 0 0 rg BT 90 599.5 Td /F2 10 Tf <2A> Tj 5.5 0 Td <4D> Tj 2.2 0 Td <09> Tj 5.5 0 Td <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.3 0 Td <07> Tj 2.7 0 Td <09> Tj 5.6 0 Td <12> Tj 5 0 Td <1219> Tj 10.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.3 0 Td <04> Tj 5.5 0 Td <1206> Tj 7.8 0 Td <04> Tj 5.6 0 Td <14> Tj 8.3 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.6 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <33> Tj 5.5 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <09> Tj 5.6 0 Td <05> Tj 3.3 0 Td <09> Tj 5.6 0 Td <14> Tj 8.3 0 Td <19> Tj 5.6 0 Td <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <11> Tj 5.1 0 Td <04> Tj 5.5 0 Td <12> Tj 5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <2A> Tj 5.5 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <06> Tj 2.7 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <2F> Tj 5.6 0 Td <13> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.7 0 Td <04> Tj 5.6 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <07> Tj 2.8 0 Td <06> Tj 2.7 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <1107> Tj 7.7 0 Td <2A> Tj 5.6 0 Td <4D> Tj 2.1 0 Td <13> Tj 5.5 0 Td <0B> Tj ET Q q 0 0 0 rg BT 90 588.3 Td /F2 10 Tf <17> Tj 5.6 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <2B> Tj 2.8 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.2 0 Td <0E> Tj 2.8 0 Td <07> Tj 2.7 0 Td <07> Tj ET Q q 0 0 0 rg BT 90 566 Td /F2 10 Tf <08> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <12> Tj 5 0 Td <02> Tj 5.6 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <11> Tj 5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <12> Tj 5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <1D> Tj 6.7 0 Td <09> Tj 5.5 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <12> Tj 5 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <04> Tj 5.5 0 Td <11> Tj 5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <0A> Tj 2.3 0 Td <11> Tj 4.9 0 Td <17> Tj 5.6 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <03> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.7 0 Td <11> Tj 5 0 Td <02> Tj 5.6 0 Td <13> Tj 5.5 0 Td <11> Tj 5.1 0 Td <07> Tj 2.7 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <1204> Tj 10.5 0 Td <0B> Tj 5.6 0 Td <12> Tj 4.9 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <36> Tj 7.8 0 Td <0B> Tj 5.5 0 Td <13> Tj 5.6 0 Td <07> Tj 2.7 0 Td <36> Tj 7.8 0 Td <04> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <04> Tj 5.5 0 Td <05> Tj 3.3 0 Td <09> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <07> Tj 2.8 0 Td <16> Tj 6.6 0 Td <13> Tj 5.6 0 Td <03> Tj 5.5 0 Td <0F> Tj 2.1 0 Td <0A> Tj 2.2 0 Td <1207> Tj 7.8 0 Td <08> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <12> Tj 4.9 0 Td <04> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <1204> Tj 10.6 0 Td <07> Tj 2.7 0 Td <04> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <04> Tj 5.5 0 Td <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.8 0 Td <31> Tj 5.5 0 Td <06> Tj 2.8 0 Td <05> Tj 3.3 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 554.9 Td /F2 10 Tf <13> Tj 5.5 0 Td <06> Tj 2.8 0 Td <0A> Tj 2.1 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <0C> Tj 5.5 0 Td <07> Tj 2.8 0 Td <12> Tj 5 0 Td <02> Tj 5.6 0 Td <14> Tj 8.4 0 Td <14> Tj 8.4 0 Td <04> Tj 5.7 0 Td <07> Tj 2.8 0 Td <03> Tj 5.5 0 Td <09> Tj 5.6 0 Td <11> Tj 4.9 0 Td <04> Tj 5.6 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.4 0 Td <07> Tj 2.7 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <12> Tj 4.9 0 Td <09> Tj 5.6 0 Td <0F> Tj 2.2 0 Td <12> Tj 5 0 Td <13> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <11> Tj 5 0 Td <07> Tj 2.8 0 Td <09> Tj 5.5 0 Td <0C> Tj 5.6 0 Td <05> Tj 3.3 0 Td <02> Tj 5.5 0 Td <2A> Tj 5.4 0 Td <2E> Tj 4.9 0 Td <0B> Tj 5.6 0 Td <09> Tj 5.5 0 Td <14> Tj 8.3 0 Td <0A> Tj 2.2 0 Td <2F> Tj 5.5 0 Td <13> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <0E> Tj 2.8 0 Td <07> Tj 2.8 0 Td <08> Tj 5.5 0 Td <4D> Tj 2.1 0 Td <09> Tj 5.6 0 Td <13> Tj 5.5 0 Td <06> Tj 2.7 0 Td <04> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <06> Tj 2.7 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <11> Tj 5 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <03> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <17> Tj 5.5 0 Td <02> Tj 5.5 0 Td <13> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <13> Tj 5.5 0 Td <0B> Tj 5.5 0 Td <04> Tj 5.5 0 Td <07> Tj 2.8 0 Td <06> Tj 2.7 0 Td <04> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <04> Tj ET Q q 0 0 0 rg BT 90 543.7 Td /F2 10 Tf <12> Tj 5 0 Td <02> Tj 5.6 0 Td <02> Tj 5.5 0 Td <17> Tj 5.5 0 Td <0C> Tj 5.5 0 Td <05> Tj 3.4 0 Td <09> Tj 5.5 0 Td <06> Tj 2.7 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <0B> Tj 5.6 0 Td <07> Tj 2.7 0 Td <2C> Tj 5 0 Td <0A> Tj 2.2 0 Td <11> Tj 4.9 0 Td <09> Tj 5.6 0 Td <0B> Tj 5.5 0 Td <06> Tj 2.8 0 Td <07> Tj 2.7 0 Td <33> Tj 5.5 0 Td <07> Tj 2.8 0 Td <09> Tj 5.6 0 Td <14> Tj 8.4 0 Td <0C> Tj 5.5 0 Td <0F> Tj 2.2 0 Td <0A> Tj 2.2 0 Td <02> Tj 5.5 0 Td <05> Tj 3.3 0 Td <04> Tj 5.6 0 Td <05> Tj 3.3 0 Td <07> Tj 2.8 0 Td <0F> Tj 2.2 0 Td <09> Tj 5.5 0 Td <07> Tj 2.7 0 Td <17> Tj 5.5 0 Td <04> Tj 5.6 0 Td <05> Tj 3.3 0 Td <2B> Tj 2.8 0 Td <02> Tj 5.6 0 Td <05> Tj 3.3 0 Td <14> Tj 8.4 0 Td <09> Tj 5.6 0 Td <0B> Tj 5.6 0 Td <1204> Tj 10.6 0 Td <07> Tj 2.8 0 Td <2A> Tj 5.5 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <07> Tj 2.7 0 Td <2C> Tj 5 0 Td <02> Tj 5.5 0 Td <0A> Tj 2.2 0 Td <0F> Tj 2.1 0 Td <04> Tj 5.6 0 Td <11> Tj 5 0 Td <0E> Tj 2.7 0 Td <07> Tj ET Q q 0 0 0 rg BT 282.5 521.4 Td /F2 10 Tf <41> Tj 3.4 0 Td <41> Tj 3.3 0 Td <41> Tj 3.4 0 Td <41> Tj 3.4 0 Td <41> Tj 3.3 0 Td <41> Tj 3.4 0 Td <41> Tj 3.3 0 Td <41> Tj 3.4 0 Td <41> Tj 3.4 0 Td <41> Tj 3.3 0 Td <41> Tj 3.4 0 Td <41> Tj 3.3 0 Td <41> Tj 3.4 0 Td <41> Tj ET Q Q endstream endobj 11 0 obj 14014 endobj 13 0 obj << /Type /Page /Parent 12 0 R /MediaBox [ 0 0 612 792 ] /Contents 1 0 R >> endobj 14 0 obj << /Type /Page /Parent 12 0 R /MediaBox [ 0 0 612 792 ] /Contents 3 0 R >> endobj 15 0 obj << /Type /Page /Parent 12 0 R /MediaBox [ 0 0 612 792 ] /Contents 6 0 R >> endobj 16 0 obj << /Type /Page /Parent 12 0 R /MediaBox [ 0 0 612 792 ] /Contents 8 0 R >> endobj 17 0 obj << /Type /Page /Parent 12 0 R /MediaBox [ 0 0 612 792 ] /Contents 10 0 R >> endobj 18 0 obj << /Length 19 0 R /Filter /FlateDecode /Length1 15948 >> stream xœн{ xTеЙшZћпkо“ЬL^„и$†‡„ Яˆ2y I $1 ­(“Ь$L2afBˆˆ ШУ‚т[аЂEj)RŠ9=VQЄШioоRхZ+m#в^j-&›ѓЏЕїф%Zяwяљюwo63{=ўѕП_kќŒ„Z§ФFж юк&oЫІmЎ!„МCuе.(ЙIПyЧРOw]K}гЉПzРйTпи^WДУo&Dn $>ГСяѕygNШэИ?ЕnQ›8G|ф††ІШŠ“vлFœ_Цљ§СZяў*ъ!$9‚ѓТ&яŠ–3ЌZЦy'Ю•fo“ЪуЙU8џ!Уџм GЖЌk„L?Цї[Bў–КЫђ9œ_ „!„тУџl84№Й23Mf‹еf‰u8]qё ‰IC’‡ІЄ>B!џПџб)Є“œФчd/yŠО€Г:\^†+ЛЄdiХ•7шIњ 4з^ —Щi„м@NТ^™а9$W 9Ч$r…V“ƒˆcЇ3Œ™ШeђAЙRю”/ЪЇШ49,Ÿ’—ШašЯБьќЬ€7%9AFNњ> “#№ фРQЙPŽ!яУ)иK>B*hoЄБ…ь&+‘—x$ЋЅ•R%ЎgЇШјqџ}†žFюŽаЕф,y dЉ˜r€Œ‡В1 y гичxђ)љ”y }Hњœœ‚B2–дЩ—Pз$ž20$J2Ч~)ЃФЗп}ыBхэE#Чgš*ЃВŸTьЗЗ+зЎU,”SиЂ§,u?d˜іЫщ|нцу3чV,Tіїx uЌž%…ИVЕ‡|†ЫИю)*!uj‡\ЧvcІ1’Ёn›ќ%1|IMlЕ$“ ЧЮtM"Ž3]gК&Ц9G:3F:GжЩЄ; )нЉ֘/ў2ŒEчь,Ž,фˆ;8)‘™,9“Љгт”€ХшdВ/š`1ё|Цю33Г }—ЋХЬ,VЧ™cI3&‘ 3/œщrݘˆœьS#ў‹ОLкаЁЅPl”.vчЦ’…d9i!› 3R“dГœH“ЅtЁTaЋЇ в К\КBr›q…iн(­Б=&=rвbВиLGвš#!]:Њ^’2д•I3~ГБчЮgYLO2ьЛ:ŽЎVяC9Яб%ь]xNh-еm'OI†ЇdЃ2I79КgЫюелШё`Ј^Uљžлsy/цУ0?uf!sн љАK–vБћŒd—й4Т dE-tыFLшЪОТQЁЅбЙћcЋўБ^{ ‘XёqOwN›Ош`,ФЪвтi#lJFŽ)ЊtŽњ8ѕџ’ЮщоНWw_=Л—чbЬЬь]&убtЗ“˜щSF`R‚L’,†“Эё^їЬю™œь|›H9.gКsф”‘Nи'я9НЇчД4žЩ=ЇїђС^ЬPДз фїhйЩ œјKм—œ”’|щO73aŒЃVюЪю3Б0Ќf\4j…‰Е†РP$БяР*X F1J&йlH ёвPy(Л‘ŒЂЃЄБђX–aPLгIЭ‘fЪ3й4C1ёPT"—А"У"ВРP'фЛ›,G'h—лYЋaщ1ђЈa,MoFыKszо:MЯбпџІч8;ћe’ќЩеqМz]Ы— |@ЦЛуЩP*Qi(Ш—v’ћd‰P˜plЪтИве' ћ“dклѓХ^vіŸM<о|hїн"VьdГ{ЕƒcУŽ‘`5юb<ЈЭBR &йуxяЬЬc]йNЎЅ gfveGƒA>шOoАVЯнoЏў.КD q#Ї1$цкkТ%м7ZЩЄ˜,"вFОGŒ‰tЊjLЅeДмVn_@ыh+НжQЛц§уЬIHЦƒ*QuŠzіь‰ž;XFї‡pЊ;gК‹.y:V"wЁ&т$ )pЇ'“ѓз}t‡хЧ#œV“—<‚‘˜дD–œše&Љ.yЄЃЛ+Лй™4c†А{з•.ЧЅФІЁ™бЯВЇN™<*Нw12;1!о`Nтхє‘єZјƒЇŸўz”ŽлОmлvе*ЩЏЎЙgЧѓъх/{>–NєœпАiѓ:ЉNН%ZжђТk/?ј\МrђБЗZйЏўMZipЁЮЫнБДyŒнHРe qдђ…ь.Ї0_wзDTi\ѕuД Мx1|_[7H ёЎЄєQв”ЩЎiвЪѕїЏ]ЗЋcЧіG Ў?ЉЗ\МЈоєб_ш[xŸыТsЈЗ9XлRЩѓюбиюРTLŠ„'Х|ЧГЮэі]ёлdьˆУ"QKj’ Ун˜‡_{ЭщšЁч‚~NЦ>Em ?H@?HЌўюм§ёТ† і‡‘aQgШž//` ŒwЫwГх)’и($ЫCБlЄFШrCыаpJ$ѕ~В>љўЁїЇмŸК‡ьIqЂSd`№O™JІнBЙEв Ц)Заœl™›Х@А;љEwi˜>”уїУѕwž^qї™…гxЯw“е+{їюmЃлr›-iыШ/xgRіЧЏпў|Ы0ѕ/<эFk…5FИcмFЬe.9ЮDа3ЏєY#.'б•/гЇКІL–vЃbwtьZЗv­СеЅЮ|џjю_>Ђo^МH_GЌ7Ksр д­“”Й3v+‘mfЃ,Щ&xœ9m[hЬ6—ЩfГС sP|Ќl5Чл .Ч™™ВпУOв Ї+I„16ŒМЄ8ŸH3f`TАбг˜3Ч™o`j­ЯUї‡д§ЙД^}<—V„h…ќўыoдœT7аі“5oМ^{’ЖЋN"gсkВбШY2™ъj6fŸe‡“>KіЩ;’Ж975&лЩФxЧP Мр^И""уѓKЦІŒH‘08ВhКBœ‚Б1-!Іw’ШFз]МџQ/S%ї_Ќ[њщъеЛщzZЕўSVsіЮ;дуъядsъё;ю<]\LwRЌ‚tgцŒaV1‡ојВ{ V`А jd`NY†|l%@NиaŽпaПЯŠ§:81Žc˜%9YvЮŠЗЄкфa"ІёvjA=“—*з ўєЯ„ТKИ‡ѓ|žwe„Q†хй('žЧ!IЮ 4CЃ ЃŒЃLЃЬЪ№ЉtЊ4›Ю–XЋмЪкт663a&OКSРi4MXЧЅ|гrь`&Ќхљ21Xя;sСЉЅёЏдМɞݘŒ,"YDВK4Й™d11Ž•FЇ‹Ѕ"cБЩЬРj"жDjrX'XЇР г,kЬ1•[чУ"SLAkЌ0­ЖюД&ЂэБЉЂ<1б‘ayGwџђfип]ЯЮ>ёepяђ6.Щ›А—EХЮw[шXІ “dйС;*^І‘KW5ЯѕœKYp‰)1ЪЅнЭ*ижТЖВ]ЬА˜Л b я9‹WхБГTtoŸЙטxПctjнŽоїц›˜@~b6`Sh0бT"[yАœ9&ЊљLž[єZоЏ••yзc%ЧKT–ЬІDi cš&Me“MEвlV`š/еKЫЅ6ЖVкШƘЖKOš.J ищ2Г!’ ћjуУЦn4N•ЇВЉ†)Ц‰ЖњОДZZ‹6pТнNvМїŽhEcь“Rz>’жюцА7ЃFoBZQійfЇХŠ7ЃЩЪ_fг §R‰ёHиџR'!ж|+Њ[ъ#"ˆХ† ц{ЧœIƒє=АЫќjз‰ŽaгzЊЙћc„wиDЩЗсЃ•|w'6 h˜dS’uДiДuВ4н4е:зД}зT'нej“кЌыЅ5вЖЩДЮК]к*=Ъž6uXS д &ЃбŒW4T’йaEЧHcacmkUьSШd:n’s 7'›'[І[gй‹Эхі…ж;э~тЇKa)Z.`Э–аnhЧ‹Ь*ѓjЫ ыВ†ЂOР:і€i­u‹}+йJЗ#щG ;LXwкbwѓисmЎ™Іу?zп9І­чT/4ъэъЂпK š‹їфt!­ьYУј}ір}їіCмlсЩ}F Ьˆ–Ѕђlп)"УpTqB-V‹OH˜DzNгMj+^ЧВkТEМ…'“YюВžn”cжл7Z;хУIМКьЄ8оƒ%№BД:д+—П4бmMqЄЌIйšВ+…щЅ0š@E)Lг3&\,{КтЇoНѕгŠЇЫц=ПИG§-O ѓŸ“ЇМ4nм‡ЇN}8nмоn ЗаъЂЙщ˜э‘+ЙЙВ’$2Чg8ь"‡mЎЭCЬЎи[С•р‚!{%ЪВ’>+y%YiXm\mZ:_m]i[m_Г:vЕcЕsЅkWђхdчРќ>:›sЇё(…ЗПєЃМєв#—ЉKНtљЏъgд я_GНО=ШŒюЋQ ё$…ДИoРNХМоД‘%МHйa}uШaWЇmsjJ‚dJ0‘Й’+ж“*LqLєъмiДvрŠжŒ5ЌeиЎaПvy›EfбYвЌ„Y),г8С4Сœi ’ JС„`Šyё2юш#‡гœўэvFЁ\ЃМКћ€эд+Kздўњ.ѕ КЬию?RcЇєќЦ'ЧHw|ччЧ'Oоwc&N-шKъљcмї ЗьBДьЛшQfrа=TwQцѓM/’Ѓ№"VxLвTјьc__рљ­гvнН?YDвД№}-iц3)Q%I%Ff5ХZ‡@ŠiœIБNХr?бъІnЩƒ%Ъю6,њwZ—а%RЊ%Ќ џыOЌ)Jџ2XкS*ь^%ьёЫKіtПћШШ@š5вCв)ьсЦbїh’g9oq^‰;Ÿ`?oўТ№дѓЪщлЦ&Ц‘јф{G9ю…јцБ(ю1ў{жХ:Ў\шъО€гh+Gy{ЩiJЂищщSєПMš#.Ћ’эvџЯ_žБjіфЖ‚ІСЦwмсѕн9Іюж’5гЖОјy‰ЋЉђžѕ ёэ)CЫgЯ)mœ53їfWRищZ^ыY‚Мп!=%Dо‡`>КЌТoОv;ƒ$тcЋШ AіуИпЛeBnf$ЬЖИЖ…џ`ЭV’лЅђ&†з щC<Г’мЬёШud™ќYЦ\dЬ!GX<9"wсZYSH ЙC№‘FžФч(љ'жВGhЇ”"…ЅW ќpzф ђп˜‘5В' Y†BЃг˜cМзј+“е”oњОщ sР|м’($IЦbЧC„ЖFМѓ'Аb7‘ЦєЪŸлЋ Š>WK„‘yњpНRЫ8іыc†ЭШ }lРъѕ€>6’‰(6ЦЫ49Љ­шQчєБнGўЪЙ‘Э8‹Xd}LбД+єБD,–gє1рњ},уј?є1#C,WєБdYmњиH–XsѕБ‰ЄZŸаЧVdу>ЖЛFY[кCњ†ˆ2ІvЌ’=qbŽRгЎф"сHШяmЪTJškГ”МЦFЅ’C…•JиZюїeѕТ( ќ!ЏRхmW›МЭзYПЈПбя ћ•IY“&іnѓ]О9ўzˆaХЋDB^ŸПЩКK ж цВžЯ"‘–м кккВjЂYЕСІo%Анr=‰э–џU–ьЛЅТj „У`3‡o№‡ќHЏ>фmŽј}™J]ШячkМЁzІ *оцvЅХ у`MФh4з#ZdœCFќJ]АѓжЂ<-Ю" ˆН1PыoF­ŽI›Э!вЦ"2Ÿт ‡ƒЕ/вS|Скж&sФсќд§ae Ч((UСКH›7фO+8 љ[BA_k­_ ёPД@MkФ/xp S 4з6Жњ8'mHCА5‚Ь4tB>ЄiбЖ†ž‹“Љ4љ…д-­5pCf?™œц„`H ћб@Vuё‘цЬ!кЎшˆЎ:AЈ­!иєем u­Ёf$ш}A%ЬTТ­5K§ЕОЂщИБ1иЦЊ 6ћ\Žp.7h5nzk‚Ы§BЭ— НŽаŒ !Тк*ЗKKŸh{JИС‹bејuН!#fХ;@в`3zFHi †ќз\‰ДЗјыМH(+ЪжР§&o;ЇаєъмйМt? ZЏЯ'Єзд‡Ф[М!фЌЕбЄ|ўp ОY0Rпиовц‡И—zkI˜ŸˆrLIѓ:ŸІ4oуѕшgЂ|єaCіšл•РWGqB~ўŸН,„Й*ЙmЂ!тGПѓkЬЗCОА’жiœvtCIуС›І+ ­SЊGMу‰уmE;p–НЌљWD0noK ™ЗІбЯ74щї У4x#Jƒ7Œ§ЭЕ‚фњ|мЇД6ћt–гц–4MЦoЖl8иШЃ[˜ŽЪЋ4ђ,‚1lёжох­Gб0›ƒН9флЛжR˜ИIcЦVБG™]^V­T•ЯЎО-ЏвЃ”T)•х J =…JZ^Юг2•лJЊ‹ЫчW+Q™WVНH)Ÿ­ф•-Rц–”f*ž…•žЊ*ЅМR)™WQZтСЕ’В‚вљ…%eEJ>ž++ЏVJKц•T#въrqTGUтЉтШцy* Šqš—_RZRН(S™]R]ЦqЮFЄyJE^euIСќвМJЅb~eEy•q"кВ’Вй•HХ3ЯƒB Ђ‚ђŠE•%EХе™xЈ3•ъЪМBЯММЪЙ™œУrЙR YШ%тP< јсЊтМвR%ПЄКЊКв“7Уrэ••Яу:š_V˜W]R^Іф{P”МќRЦŠRPšW2/S)Ь›—WфЉъ#ТСtqњдСyЪ<•yЅ™JU…Ї „P%•ž‚j‰КGM” v ЪЫЊ<ЗЮЧ„‹’@ƒ{  џЮ„јe(.ЧS]^YнЫЪm%UžL%ЏВЄŠГ0ЛВйхіФ\ЦљЈOnМ2_n#ОіUя@(~ZАа“WŠЋ8_ўхYQыo‰pџжƒ\K’"ЁjY4SxЎ– а‹š1|Е51DŸЦјHЫr;„L= ѓ4‚ŽUIKТОх~Ь„ažR0F‚<ЉДТ"оБ6ѕњі6"1<е …9глˆЧТНl Њhal №H[(С”Ђx[q5И[/Щ!Нd –€SЬШnСŠXюolЯBиЏk‚“@s]0дЄ‹.дWЩцвˆR/ћP№`Ј>‹ i!э$DЄž4Q№цV‹=ДBВБ›HrpTƒ ЩG˜ у'„А—4‘L\-!ЭŸ…Ѓ<вˆ‚sWXЬќјіу™хјэCШЏтQШсХQ~7уn%rж$Цпўлbѕ#|ŸѓЄIШЯ$”ђЋЇЃgЃ'ЧkŽBn>Šˆю№s!rЎIнПдхѕ№GїўЯYЬN,пкfіПZjNƒ*Ю&1ŒпAмтo{~]ОzAЉёq.9Ў:БыяЅX‹'8ѕИ–)x .›Хљ-ЌS"жюpЦ?ѕК<ЕКЦЃ8#‚ N+(hkrз И&„дАG1phїF|зтЩfнїЦрwv/Ž4aA~ж'оaСW-žёъђ)јс+­HХ/NёЈ~ъpд(ьЦ1GyьЃРc€ѓ!mB#~AБO'|ЅПƒHЅU№йЧOH>WƒЛБЅёѕ2…нИuё”ЏW'mТКUœуšik§%Šт №MлVЁУЬ~жсу&aЯЈ­[ЊFрущЬЏ‘#ГWЮ ˆ)„ГАШНИКVZџ›ЅŽjNуЖЅзЃ#ƒМЎOЂ6ЁІoE! u(CHxkXœщЃшпœFІxsM,EˆZOƒщяЧ\о А‹fЁZAл'8шœціFhЕ~в‹Xƒ"GєйЁ^ъгТW3B3ТGєˆ€ЦKŸжњчўч!ЗWЗVЎ™>г4чМп`SŽYЫ!сEA]ЫпжтІ]№['2Чѕm}гyЎ—і^šDDLG3ч?Ђg?mEу–ыезЯі§НO“МEPбtжŠXМт\T*Ÿр–лЌЙŸFъŽKд Џ…њхRЏ№"Э‡Ѓ4ы(ќ/eъŸы|<Э+ьєэ9HgА>ЎЧ[ІnѓFq.№ Y=Єg ПрЋiошJИз+Ѓq3ИŠјѕ|ч љ6!•OœOЛNmLы•{№ ­Мiƒ)4 фщп§tжg§2нКНЖ.^іU­м&bб# ђ„­ЋzЕ0[Фя<ѓљ§<,jЧљК–їr6PПб8ŠТ}›мЁсŠвhСBсOЅ:‡UНкјзxћђ—k\­ИџDzѓїРJоП“ьыPћїЂ™§rnџЮ@ЫЦEЖi\пЊ–ЇЕњеwъпЫ}гoZпз GЛ-‡kwЅўАOєьZOюэRД:ьэTкФn_}зn‡MЂџ§/,шj’Еъ'увњLЏш8Е№uДљM•j№БEд~J›Gє.…ЫзЊУђѕЛн’CƒnYџЪQYў•ўCТо-њ+ 4ЬћЫ,oˆDяk}:сЈ{MƒЌоч}[.м—rдїумЇ[<(њ‹,ёпЎХпЕqdЫѕўИNiћк—*\‡fРй№ј<ўЎТўgќ-ўк—3рГяхБЯTИдŸv@зUјЫUјГ ŸфТЧљpQ…?eУGЊиGp/TС‡œР>М œЈ№оЯ†џч;р=оuСяWСЙWсw*ќСЛ Юž)bgWС™"8§›vZ…пЄРSсз*ќJ…џPсTМsr8{G…“Ус—йpB…Зж9й[Љ№f"Sс ^Wс*МІТПЋ№sўM…Ѓ*МЊТ'^ŸСЋаљЪЋЌS…W-fЏМ ЏЌ‘§,ƒZьО‡мђЯ2р  ?э€*МЌТ~~ЂТ>ќ8^њQ{Щ?кыb?Ъ€Н.x™~ё*ьQс‡*М Тѓ.и­Тž‹a?Ш†чbрYьB]АS…gžЖБgTxкO=™ЬžђС“O8и“Щ№„ЗРc*<кagЊаa‡xhGl$†mФРУWaлжWй6ЖnYЬЖО [зШ[ОŸСЖ,†-nљћ№ ›7eБЭ*lЪ‚яЁ˜пЫƒ7ZйƒёАб paƒжЃІжgР:'< Ткћl­ ї;с>жЈАZїЕ{W­bїЊАjмуƒ•е leм­BЛ +b ЭЫ-аЊBф*„ЏBш*,Л -*UhVЁq$мЅТRg>[ZVA=NъT№ЋрSЁV…МЙАф*мaƒХ*|W…яЈАhЁ…-К -p[b2Л-Ј0)ЯЯ‡ъЈЂV5*усж9qьV*ЌPЎBй<+SažJU˜‹;sU˜Sт`sт d˜•8 иE*ЬюOЊP gW!џUШ› nfЉpЫЭ.vK<м<3–нь‚™7ййLїЕXИЩЙ*ЬPaњДx6§*L›ъ`гтaъ+›ъ€)V˜<rь=ЩЪВU˜d…‰ЌlЂ&X!kМ™e9`М2Гaмlœnыb7fРXŒСЦфСш •aeЃb!У 7ЈЎBZ,ŒD9GК@ёСˆЋ0EюƒavHE ІЊr†цC2N’Uтƒ$дT’ ‰x(1TˆW!NИTpЂЌЮ|pЌ‚XФЈ`З%2Л 6„Ж%‚U‹Ь*˜ЬЄ‚1 >qSFH\$œKу:€Ј@;ЉoнCtмџ фџ6пј7ь?Дукœ endstream endobj 19 0 obj 9046 endobj 20 0 obj << /Type /FontDescriptor /FontName /FAAAAA+BitstreamVeraSans-Roman /Flags 4 /FontBBox [ -183 -235 1286 928 ] /ItalicAngle 0 /Ascent 928 /Descent -235 /CapHeight 928 /StemV 80 /FontFile2 18 0 R >> endobj 21 0 obj << /Length 376 /Filter /FlateDecode >> stream xœ]’Эn‚@…ї$МУ,эТР šё'qбŸ”іЎ–ЄdФ…o_8G›ІЭ7sюх~™Ќї›НmzМЙЖ*ЄWЧЦжN.эеUЂrjЌяiЃъІъˆПъ\vО ѕХэвЫyo­Z.}OЉр}\zwS“Uнф ‡ЏЎзи“š|Ў зЎћ–Ги^…О—eЊ–уиѓЙь^ЪГЈхг}=$šў6 џD>n(УЭйЊЖ–KWVтJ{п[†aІ–Л]ц{bыџЗ‘aесX}•nLы!†3`&D€h˜‹Ы N)ov€9kf€Пc+Цц€œ1оЌyГl+Р– "РŽEйшбЧ„1MŸ 4}L  Я њюS}їСlš>ё@Ÿ„­щ“РTг'єI9}}Цш“r6њфhmш“>суЉЦзФўюJuunXь)жc\ŒЦЪя.wm‡КћЯ3ЗЙхendstream endobj 22 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FAAAAA+BitstreamVeraSans-Roman /FirstChar 0 /LastChar 32 /Widths [ 600 684 317 837 636 837 684 336 636 686 390 636 390 500 698 694 636 500 685 274 655 360 685 837 549 611 633 411 634 615 524 400 400 ] /FontDescriptor 20 0 R /ToUnicode 21 0 R >> endobj 23 0 obj << /Length 24 0 R /Filter /FlateDecode /Length1 29796 >> stream xœэ}{|TХѕјЬмЛ{їю{7›}фСоЭ&›ЧцEи‘м@…D0A#Y’ YЭ‹dCРV@ЊЂС*Zпк’ZEЊЖ,‰ЄЦGЕЖ_ПвкZД/ZБЈ•ЏДЕj-ьўЮЬо(+=‘”ŸQє8њ%ЮСУŸ!њЛ№\Д ёш№–ш,КйP#К [Q&ВЃ5hцЦnЦїЧ7ЧпC лбƒёЇёЮјЃа~+z } ќ–ЧЈ ­њ5(„оуоAЭёћэB:Д­ЦvDoРчo У7ашјЋёOaTк §U *T.~хЁ›љ=Њcт“ш6tЋуmё0šƒ2а0ёЧпˆџљP3њzdђуIў"фAWЁыб=иХНиш!УzвТ-U= #-CkQBУшQєclХѕЊcЊгёЏФO"5JB9 SН‡Kё ђ0Џ/ŽП….CшG0_њ™ф/уQ]ЋŒ3ўЦfМwтoу(>Ž? "Щ ЋHЙ‹dЉ†Q{I?шi'љЙF >GЩ[ф7фOфoœŠЫрцs›ИosQnœ;Ъ§‘7ѓ>ОŸЫЏтзёqАL‰ъBUƒjПъ1еѓЊгъ uЛКO§ЎАSИNѓgѓЮў6†bБhl |Wžt5hт[шA№ћ'Р?ў'H|}VHСœ r—уZ\‡WрKёх8„wт]јv|О?ˆП3€9dї“*в@‚$DЎ#ЛШзЩ№9D^!ocфHюрМœŸ›Ы-ужq—q=0‡ЗЛ4{ї(її:w’{—;Vs№sјAўjў^ўў ўЇЊ‹Uн№yPѕЌjRѕSее5QЇЈгдEъ+ећедТ|Ё^ИIјЙ№WMNУy Й4;ZЌС9фQbуЗуSP‘Žyd‚™ћС А*ўŠ*ЙиХHлAЖdтт“(ЇZцЃРС‡Q)ў!кЎ&Dbў8ХП&ЧљШшИЛјGИе‰=бhy†ЦKаЄ‚Ќ%pПƒїЃwРпЗ ;№Ux=†Oс…ј\†ЗЃŸ;з€ЏCё EМ ŸF К–oGWќы(ˆЫбЏб{БoёўЋŸЦб]`бЧбя№wбgXџЂб(Qцf№їыz-АЮЖУztAщRП†ž ;ŠPІ^Ь_NЃПЃїT‡РЃ–@$= ѓптпŽ—Х `…С*CћaнuЂ aХМ^rЪДt9Ќt-Ф’XеѕhjGз@дЛ-?џZ|kМ§x?Уљј3<+b8*арs+zя†uxсџlˆЕЃIє>vт,\ыс”jГjъQеЊЈ^UЯm_‡юўxГfа†~ŠоGŸ` иЦ…ђQф]В7Ё.вЬAKq ъƒ5›q|‰2“шe'hяXЯG`mœ†8q9њ:† vРŒк`| єSz^дћР‚_УcPгQ;§ цmФ HЦ“ЁЇЛ jM‚LПFmЧ™\љЊёZшыt)j‡цЃz|еЦŸ‚HЕUsџњЮФfДgр‡€ЏVЈЅЃrе똠ќиЪјцŽР‡њиНRбxHa‚yœEЩx*­FљВ,W.О bбТђeЅy%s‹‹ ђ§yЙ9йОЌLo†GrЯIOKMq9іd[’еb6 zVдjЯŒђkМЕ­Rдзх}о‹.* eo*‚Г*ZЃTеžK•Z™t.Ѕ ”ŸЃ””ђ4%6KЈЂ _ЊёJбWЋНв8^wIр_Џі6KбS _С№= 7юёƒTуьЌ–ЂИUЊ‰жnюЎi­†юъДKНKCк‚|tPЋTXдсэ;ˆ‹1CˆЃfсA‚4*šт­Ў‰КМеT‚(—Ulж_вTSъё4фGёв6я†(ђ.‰šќŒ-eУDеKЃF гй нвСќЩс›ЧЭhCЋ_пюm^ох‚Эt ‹Ц­Ž:Ў>сœ)BчжЅMЛfЗІrУ5ЮАD‹УУЛЄшф%MГ[=4on†>€—dеЖзТа7ƒы$\пмХзУ Ub~!o ­iНRŠŠо%оЮс+[С4)УQДzЋg4%EžˆG)5вpc“з­Lѕ6Ћгка№ъ­c.YrлRаlI(і бЄ zУl$4нЦ0FNБКегšХT"я2pˆЈд&$M^˜гš… сЖ@?ЭИЂэ`‘pT\к:l^Hы)T•eіJУCроSœ[TjдYцП!ŠR?™v5hŸТЃ~4/КˆАl 2.fхв‚ќЭуdОЗЯ,ѕЁzаmАyaЈпуЁо=.Ѓ PˆюИЄ)Q–а†дQ$љ›ЃЄ•ЖLNЕ$ЏЁ-;ІZІй[НрЩOА;@rTу›ўg2л“j:FБ§_4‡эu оКKж5I5У­ŠnыЯ)%кLЗ)X4ii—JŒЄrЌœђђibZhвGљ,јЇfNнхР)Y–jЃцж‹yГжуљЇ<у‚fгxќ4хb`†M‘2Каnyб9хsЄгs /я#uы†‡ЕчДеBЎѕJЕУ­УСёјŽ ^Щьž G†ћjZЇ :?Д;5Z{s3LЂ/,€#еЖ >АУ hЩЧдТ8Љ”“ŠqH+№1Œ\Е*FИgА‰pАt"ЇпќqХйŠ•ц*Vœ­@•€›Я@6ЗиcёXВ УАYŸ‘ИЩ3В §Iќ$Н§н'мiєјqYЇу|ŸŽу9ЬФ˜Ж0 •. ˆуёуc ”J+„ZШдЂFћЖј–чE­6‰Єёfб­ѕ’|^‹ДI'Џд‘-ќCтЃк'ХCкХЯДіНќqЏі%ёэ/Щ1ў ёMэIђ.џŽјОж0$nб~мЬMМYЛ‡MКЙ’п(vj7“­МPMъјjБN{ЉцRБI+8ЕEЦYШФEкJЃР=ЏEm2IсЂ0_$pZQт5ЂXТё6Žу‰NЋ-с DЇс8=Oˆ^ЋEAу6bу86ŒбшY€TёЩБЫZЊёјЄьhh ЈJYиЎСš#лA5Gt’NOЦЩй І’Щ@„JмzЌЇнц‚5>кtЪя7Wќ—Й"Хe>ЛщьІŠЇљЌпц›Р@+*+ЌŽђ]ЊBџЎk^мUшЄР?ЗзE“š&&~ќ NZА ЗАŸM§~јAўM-ѓРœ˜в–л№aиэќLьTь7БЗcПU:уфо§Ќ–пљm4С`uќ]ў>~12РљфnљЂwёIЭ'IŸ$ѓ/“wUФъRЙDвl^›ДжоьМ›мЃОGsЗ~\ќљ•ъзт/є'U'еяЬh~BўC§‚ц%НjPs“њ: g'‘Q­Ю@Жё‚­\HiMэK%ЉFrЅ4U9§р+N­4oњxХ)TyЊђдмbДЉЗlZк$‹as‡ЕУvђИЅAeRР:^ JЖ!oFІ/ЫfŸW2П4рѓfЈWŸ}рЯ8{хƒлcŸ cщЎžž;яьщЙ‹dмŒеУБ—?ќsь…ытћПЕџШћїУB0п јЕ юЯ{фkГКYлl]k_ыlNЛGИWќTћць˜Cr§Тф€k9W­_ž\эКWmtR*] ”Q'MАLДŽ\ЃС‡ЧqЎl2Ё”[чр9fЦ•оT1kŠ+N­ј#X>‰ЉЖрM-0SCXж†aЎЮpšКŽЅjЕ7YЬжy%0ЅЭ13W>ћGеСuOЧў{~t'vЕU_МёКэЛИЌЎM8іЙю ц3}^мѓ№CO{o<7ќwљlеыФGрў.„‘ЙВ…—NKD’VI FZgД$]ЮE~‚Ѕ RŠrсОтїЗlкTJuЧњ_БЁ4ќ dŽ*зъЪяя3мeоЏzD{XЂ> Л‡lsЪ9ЖJЇ<ЧYЊВ4K%]{Э•gЁ}YA АRa€ˆA ЃptŠєЃ–Mњ‚k9zдAAtLд.fХ*O%,i ?сЗXЫ[и№FДdЄƒщ№F”…XЇEB T`Ы<-›P‹ЋР›Єl_ЉСђсp&Aэ ŸaчќїФўt}л^?…­ъГ2З3Иd]6ЗeэхЏ.КялOоі№+ьхи‘kv_„ЛЎоОtщнѓћЩеыА-•“АdM`iNf .Ћœ™#м8n–EРпAf‚!(ŸЦ=ШХџёЋ‰uёбЉ3UjЫ&жяOJђрУУxQьПFћс=+•C 4ђЪЙmЅЌЊWСИQИ—U}ЈRЙU­ЊэЊЈPСў› с|˜Й€шЩ Р€•‰…шW6ПJиї`эѕћ!PZОa‡ћЌ\df, M ј+щhbНHvˆQqR<*~(ЊмbЋИ] Ї`лх Шш(м8дЈUjзС‡љ)x—ц 2Р&мВЉ‚S™+ дOI”DЃvBЊиIИп?…љи™,ч}џx ДQ kЯ k/єШпR[д^MЖУт№оcНЧvwіyЂ`ЋЕыaУ„ёeЯ;оO gЈs k !УКЛ­dLш…*ЏœYэл˜бюлeнeЛ!уk™b™ЏF]Ћ[nXeЊѕ,Щ22Г}eњROiFЉЗ4SPkUбу4dы322МBf†œ? пbлšМ9w0яЦфыђюKО3я‰Œ'М†јVЧЭЮ{ѓО›ЭWgŒЧ2–“№(0ƒР5<К3eW +ЫЉ€\eРѓ3j3ю1м‘ёbЦЯ3дž НчSЈŸ„5цбе?ц(ЈФЪђ`хŒЌ…rz Ќy\Œe\љVМŸЦ‚ m=œЋyF™dJŒх>Фуѕќiž№Е9:Л ]лч9dшз!CЇЙД,р§…eхB§šnЧzGЏƒwЌI‘32І\ŸO!)ЕI‚Уc—=о€]Nsмvќ;;ЖЯгxъГnЭ"YВ3=•’ЯŽ рFѕљИ8хуќ9žb36ЯУ­Lb%ƒ@’pYб.ып2Nнх Ќjˆ<›h ‚§§cџ&Z‚ЫМЧџQ "ў~ZќШЏhАp”+ЦЯ\ m‚Ÿ–n2уЏШЂЮZiЪ ,№СS†rНM_NбQ}9иц§ƒКrR`Y6Уžœ”EУFlBйОlpвьХv‡*F’a‡тщХЖ-_1NБіДu—eй’—ХПlл[яМѕѓœи'–ѕMНХRš?змєб‡ožХEўеkrвŠЄd›Ѕnёк{‡ŸЙeїмХKмvяœфДŽхu7мўГ(ЌЩeрё…рё^T‚WЪBŠ&M•nOYžzQкВЌ_™gчЛj]—њ:\}7јnw}#e_ЪDъЫ)?JеЋе†dЛкeЯVч&7Л†Ш dŸњIѕKj§Г7Э$=ГdЎ%пIm)gф@цJєfžЩ$™ЕщдХА}\ŽQК9=šўїt>==ЯC2дšD[уЁ!иCCАGvRW&‘'yAoаR›A[ОјŠ|КѓШ6нœЙ>MЎ˜chvыїъ  уp6”і€>eUZaЅпRŒ1ž—ыYяРПsрUЬ9‡kžВ+™[ДаНЩŸ( qN•~-А Pп8a-//8EНЖЮ&iPЫ&œ=ŸбžЬйь KдДѓЫц—%ŽX­ІцeЖыуPмџГзžЏуRГbяыЬwбC-Y{џэ?МИОЗЎ_1џ§ЬВІъ‹kц™uф…їнб|ггБё›ЏП8­ЬЅЉ­НqнзывВЄДKjХ~f-qfW,Z[т+Ы бXяŽПKnS}Ю ЏЪЙ’АW›kZh\nl6 ЎdффьЩШaMВa‡•иА“­ wвEmBŽGдСЕ˜=c~4гЃкJІї#8Ћщupё(BЈЏЧB/ч89ŸУК&ЙвЖзvРЦЕкvиіиŽкNлTШfЖIЖbosЅl™вx]ДЌЁ.Кю}ШŸ\а\Б‚оЁ>jЉ0ф:œpЌЃї* =ЪЖЬ3Сн…qВзbcыЧA š.ЕxKч•fYШе“КьДьхЮ _НјъrxэЕ8…ї5юєЇЅО•7я’šЙwтзŽПўPьІФmŒo†Е`G{eЇфHZЇщд№у<hцjMЕщ=ГJMчšnŒЕ^ЇƒЃ)С>;’ЅЬР„уаIŠ“њЖтичˆ“є9O;Щ‡Nьдъ|zИцфŽ zvx–=> žщr({—ŠцSfz‘dсˆUАэŒнVІOЕ%@CƒZ {™'ќlIц›c'3/)_ёУжІк§zЫ}ЋмdЮуЁѕзЦмМя'–v^ї•/ߘ_ž1gŸ1ПОаРћРы—Z6ZюRqЂкЅЎ –:Rg9IеЖ…зй‘6йfгŠъ$›/9មбЮ|пŽуА5џ п5гNЏСЇс2ЎгЯіјЇ*Ь_№љ–ФЅЭKл“XьѓчS”[Й№HјЊG/Ц.їъЪ‹њѓАkяš WoFћхœЛUX4тU‡jPХY›ŒЦ>+ЏMzЗžмЊыIЅ~•žшЧЩœ+АЮ9Ђжц б,‹}"/ІlЗюЕ’ѕжэжжЃVоjF>ЬQ…шйG К,•8 %ц8kYмтZAƒ›ЬЙМ„Zі Tu@ќ+…јwP[В.хЖЖaq;Жи-x„ЎьЅWUЗ6_zс‹VёОЛЏЊ.§[aеЃБ?УАИџї;—Kцѓ8—Ь’Ѕ™псTiјg$йn!6ЋнbL2!Г1 УЕС&jL:М^з5ГV-І„9iqŽtwК›kХy•šUšz ЇЩ1Yж[ˆ…†yƒ1ЩGlыбˆ}вNьt}‹њ€нхи2AТ‰щћ7%"љ™цЎФфсhNчєXU^ЂDrКm&ЭЃфд”““чApїXМЮЪям2р[Кј‚вŸ§,vђоWУu ™/šЫ/ЉћЭ™ЇЙeдЦkР—+СЦ.є{љ’&SГЕйоi [Уіkœ[]w“Лѕ/™_rўвќ†ѓ=ѕ{šї’оKўTД iAђrыr{­ГYж ­eі2'7Є2эRн`КЩЕпњˆ}Тњ”]4ВИ” №IЋ-`œg 5Ў9M–€сцaGˆШV‹Щ@Šd CѓіРYуЦˆ‡&Щ!`Z Їг"E ‰№•*xlч<ДЁсЪџб)?D?j9ЇŽГбƒЇŸ.‡M *Ь‡‰УУќ2•ђHтƒŸћ“БmUјšэWеwР6эџшеїbТіSЯПC>(ihМэб#\ж[єƒч1м А€ГЁКгСюЗт€§—œЌЪI) 4SгLC3n<~l ЛtI) їёXЭщ4­^—Œ“‰•KSДЈ@їВNяДœб]‹T:rщВPž.€ъv!Q‡ДМN+Š„`5рb9еŸьLЫ ш nCБA6№‡#ХЌ­дЎвrкqR,ыxRЎгЎт9ў)†­v‡lв—",С•„У.§‹pŠpбc„пЙтT ЌЕзЪšPѕY™]щ?k9Ж–—SOѓЗаАЪЂЗ{’єHзcќtЌgџhЁCm4џ{b ГxВЦ^P@цАтђјљПР ЫЧQљ‚ ЫxњS9/хѓB’ьHr$;§!U('ЂоbˆфМЉУЋoжЎ1ЎЩhіvъ;Ќ=сœљCщ7Єпхб[НьТцP(‡р‚vIЦ%оч2žѓђ›26yЏЭИжћћŒп{е~mž!3#г[nxыДu†ъŒЅо+ !яVУе7†3іi1ьЯHЕЂAЁіКД.ƒю˜^­ЧŽЕNй%zИзЙзIœ‡HЅ‚Іѕ)хюTœZ`уаEьvЗ,E $юv­xЏ(ž„НтПx9ЅмЬcО Ot~w`‡œф8ъ„l_JЁ;{Ф5sўа"Ёbиœ]?kHœфъš"yA3lЗ-д‘њћщ…ŠнЇN$`?žс Х.TlџЬ}ЄІ/}UрлЃIєЎt”^нJGe“Ем YЫЕ,™hнЛpњ„:CЙжISRЙіOsbХ(w,њœ/›}Xœ‘јs.YvzЩтНZŽЅ”НЛnНэ‚‹џеКkћ‡пХp.bЧ’ЎЙцкeEљ pєЕС›ушйићБ7№oвnЛqы%eЉжТEkЗ~Пя…ŽПќиАЉ­4Ѓ<Uдб}dїЖ__ыДtBЊgT‡P2ђ OххІeІK…+uWъ1ŽxŸ2ЕjZыаиЕѓЕЦZ“ 1‹›бfВ™чч›.4 Зš_зъЖˆ[\›гootнЎэ6ŽY ЦAуuЦ;Œп1ЊŒ’AoƒГІIŸlpиГ’Ь6мjБ› Iž,‚‰СhLF8’>#g#ƒй@ ?OЭQGе“ъЃj^НЋЯ‹%oБ—x=ЩN˜xœьۘл–А2нДйvF­<Е[Ÿ­`7"€Ž:хЛ §-ЦkЬ/bK9‚ВrzЅЯЯK˜ІЛн‘фс ‰зkБА-ЧыН‹єўщ;žЎѕš+ЧbпzЃПёŠŽŠ_§тЪŠUe>qRuhеw>ќЫД7<ћЎ|Ќйsіnefг’х—щщуWД !ѕ=А dуE(ќЛюў ѕЩjЛ>РСiо№V“MГкЋ—ИЂмБ5wGюом‡дћєOЊŸдGsцЯ5ЂмЂмzhx6їwЙъ\њДЂЪ;XЃJ№№BJК=…нE([ydAЁ<фЮвlЙ RЄЬь@ЖМ№‚@QіkйПЫцLйюьйЪ–В‹Гуй|Ж+чэŠЉы”тўЪбуc8Ћ‚Y>одB‹ˆ,$šйгrj­„…pПŸnУиŸФЎvЛФ:ьєЂШžОsЬ\?ЖanїdЧ]ХЕ^>ј`Nzьdzі%‹: c'чTЮЏъ,ˆф}З}ЗqЭšЦѕ—WпsЖ™ЌџVaХEЛяŠR{џКќкыю={lv3ю іlА—=‡+ А7@cоЌФ› J›#€TєЩфеёФ#Щ>еiПCg-Т! со„ЅO 'бiDЈЫвg†<ъсчюRЪь'” бg”7уххА ~Ъо\ЄЂ!9K­šАM8Й UxЃъ БZВ`й T3]@&ЄБgА@ХuИп,лнщХщ­щ}щ;вUщfгь•“6ЗafхЌ0ob›˜,lеАЗ…,PD’ƒ­Е іz]dfeм‰…ЋЗ=Ксю•WОђмƒ6/НтЂве!Лч7v‡-ЩgЩ?k-мPUпiаТРЛрDt‡ђ&ц›єVѓЉідЗПIcэeБ.~Ф JGп”ЫЌ$`и*в–“jCЕmyšІЯг5ЩŽ@ГЊY{ЉamRГЃ9emњ>эОДOХ ŸиєdLЅ“чuЩ‰Щ &ГкщбИцXs!žћ,6yёV36ЇИЏЃ>о”ИИOАƒмЌЉу?\ц0{%Ѕ k;’ТŽАЋ#]нвŒ-єј–эKœпЅ ЬюИee­rps“Wо_Йищыл;nК.М=жEь6мИ›1Тюu—}ѓГZю‰яь}0zрўягHx9wпжWЁХВ§е'*Ђ†+Яf‡TЦЊ‚;‹FжбяYќ{ѕŠЅ ]qUЎ8UЮb8 ›’ИRO2w[).)„.-Ÿ~ћjx7hјnvЇJCїЩ… ’.J"жWn(O ЄVsЫ Ы’ЊSџž*RO›zџїБ№їT ФЦй^eзщЬ&у”WYrF“Яlf/ќtŸїЋэ~ЮГш%Š)—zжЌї}pЇHмЂтZє•пŒkэЦъyпПr“虉І[WСЫ~KЧ†7ДmМ‘ї=Pпћmьlьуи›ЕkЮОЧMŒ=іЭБGм КНvr/шVФћdЃШЉ5.ЮЁс­‡р ŒЦЌКJn<ё&›B9ЏЁ1Р•› Р§‰yBD(№є%6O_bѓ%ъзTXСBvЩКz]ЋŽыгэа‘нЄŽHКbИЂiDЅS ecCC@,a1fB'2Zњњ[‰2,јг#жЧJ‰EfU”исgз5/Ю-^ 0.Оу)]Љf‡Ў” |AJa@г™ŠГs%œЬёЕмѕš=šЭЈцЇ~‘{Mѓ–†ƒнSрСЕ№vnЏf„; ‰rЯjt{вW9"C&а3ЎЁЈ$@$š ЖRЈЙ[=…вЃЎ#A 2 'сB>Щ‘yТJ" —“Е‚h#ЉТ R#м'<&ќ„МIо%'…П]6Щ– [„…Ч‰šFѕўщГšzm^@пкгЇeиr–HNЧђьAеЁ3мыАlž9SM=њX6€[}GU(Їr АZН€зŠ8Bд>,ЉŠUDu@ѓъcє-єqdХЧЪЋѕЉWKЏ$^-q Яќ•цДgњН’gС_ЄХ%Hˆ“ХВrИ_A–PWNi@-ч0u“ы=йаY.ЪуѓT9к"§TІЊд_‰Ў$!ЎCеЉйЈ}—3-WcЂ1ї)^1ј‚`CHP‹Е5іY„Ыѓ~ќ^CщьqX™СјIеpGKA?—Wм оdЛЩОнЃ~Yќ9їsнп81KЬбчrmЙіAе xƒJз7\пЙ$ЫR 9ЊJМ пЋК[|…ћЁNРЋЭє7JNгmœОGr&žPj ё:йс,р5Fйh ыж›№*6ЩЩЮl 9r†Е@Ы™>4ЎE"ш’р”b8ђ%gи$И…bЃ‡†БдmЪЩ`г9*ЯвїM'@ЯСZртЯn(Ьш1!q}Q[Ь4Ђё•иН$іъБ_ЧnФWу6ьo/‰§*хсЭпљЩF6?JR/;§ОЏУ=јЮНWDkћЏ{?іYь§юb_;І_Љўщ­ПЙє+ыMгИ4ьлИО]‘>ыЛЙ]ъ{@З‰ЪяЎ0>aql%Z:ѓцЯ}ЁWRг'HЂлјЗбjHќЊЂ‰<Š“rє š \ iдЙц6ЈCŒюmєu.э‚z'”з@вЉжЂхЊ—б]B:кt7CљN лщ2|]p7Дп<ЏD(Шф˜ѓ№ƒ$…Ш\-7Ф}‹Љ†днъГBПаЏйЂљ@МBќ­іЋ:“ОHџ{УaCмИбјŽЉУt—йfŽ[ђ-ПЗ^УfцAѓР<#ь|EЈ ю+Ь]ЌŒаzўjDП=Ц”ХrŽiDЫJ'Hƒ5 ЮЁ&lVpйpЇ‚ЋUСе€пЁрz?Ўрф#} .Ђar—‚kљч9IСuhƒ№зЃMЕ‚дOhUp#КмtХДЭЖ›)8F*sЙ‚Ф›+8‡ђЭKœGZs‚ЋоМEСе€_Їрк`оЃр”dў‹‚‹ЈЦЂRp- Z–+ИЭMzlњ7Ѓц%§ZС м:›IСЈаI0OЕntм­р{?УгЉ<ЙфЩ}šсnFџŠ‚SњзžI} ї=Ш§УѓЈ~ђ њЩKШY@#A^Ў‚ѓSИ†щљѓ˜џhиМђ.QpZПžтњ§VЇѕЛЮь’їmЇу~5Ђ­Ј…PФК6€њ.ЄFдЩ№Јѕ@Š(TDы^д8ЭƒPfдt!`еЌ>јиSбДdj€–.48M3uЫ&Ц›‹ЪсSŒ Ќ„еVGРеРГdˆ0ЎеапЄ~Дђv ъ‡і P.acДAЮ…ГhЄiЊ…h-ыe`Zj:ъШ%”}„AЖ~h€д}хžЗ—жЧ mС,ЙgеŸi–ъ­њшиЎ‚::кџ\чд†@[a)ТdЃ:’ Li"JЏkРЊgќђБёV@О Цю`К=х AЏTлCŒ“іVx™vю…qЉL}@ЛѕŸR…˜QК!&еЦщqУŠї0+їЂ Šд+YK'гbЄЩŸ–НŸЕ„™Ї6@>ШЄNX$сUдK™$Іх)Нѕƒ,P_LxT˜щОyѕЙ6жlЛЗ)}™l”Г›ѕHхю„ёЛY эKLъ ЏMБFЂ…J= и#Шц˜рл:mџАтэ}ŠCL7ЬГ›ВPP‘&БfK5eyЊZb}wЮђJлЫњJŒ=UŸаvDбH›тЉ_ ‹@Ÿ!І•0РDпmJЭ г4ѕЈŸюe+ЗŸiД‹ёSIЉ=ЛЎЉкџfeдА2гФzЄ=ЬhЁ(io‰кН†эі*3 3њAVšБъѓв.&нљ}b*ЖLЯ…ЖuГўfњ ёт*Eк Ђџ6ѕ$e•NщЌН‘е&јщ +6ьdыЎOё‘^ШщŠоЌh;бУLД2[%МCb:lSцfVыb4}lэ%МБ‡q&f2лЛУгžEWўХ2нLъ››•Е•ˆ;]гrtГвŒїF>З# |n~mЪXƒLгэчјfm‚њ)ЭRпn›žaѓm‰љРІлцw‘щx’А:•=Бо#JдHЌІХЫfЂgЂЕ›Y$ˆЎfќ ЉiПmЌuЦгЃЗ3mѕБUВuzScїА˜IлƒL§Ъt %ДaќSOѕоЧ|Ј›ХЭ)й йоЖ…АЇAПєSШЈfGиBКЂ“­Ѕ.РКыa БвZЯ| aёТiЪџЛ# 1Iа†fВ"}#ьћЕ–‚чQ|дв ђ‹Y} д4@N}ѓBи jрГ‚е6"мІhjdо4p_“Іыы$Ёб>Eч3>њяэb3–™ŠШSvоРZЗ§рє˜mгБ-сЯ3ћбьh™ˆ3q4Б~УJЬPжєFжKh:&векЌŒFWїf%–n˜оcFў…fІbчаtt )+.4эг§,~D”ѕмЁјуљє5Е ЉЦBГz™YХ_Џ]йЉn`‘1!ѕХ2=JЯчГP6›еЙšJDф/zХGžŠm4ŠйY4Ѓv)кPbШ?›j дЬФй­_АEH9eЬ>s%ЂwIдЧ4VN:џŽЭ%Х{fХЖЉqi$igšЯкEњg•ѓЇЉћgљэЬо§Џ5EЅыf§OљUя9§ 1ћ_ХЌ9ћ:g({6qBdЇ§wNЯ'!зlяюV"jBџ‰UеЇјЧLф=з‡ўеŒfќc›ћ-7uіЂ{NH9Ё%f“8яЕ1Ћі|Ю§ŸгїLЯьД:ШN§‰}h3; ЁйЇЋџНѕЇњыWЮaхЮsОSмэ˜ажЬ‰ЕѕљХuYƒъЪbh -/Cѓ QЎљЈю4боџ{{нџ|gœj+њœіІїУЦ­}ЁŽ`[HњЎди’VєієF JZклпзлŒ„{{ЄОЎЖBЉ: ўoˆŠhgRCoз ­–ѕпмђђтШJ ЅЊЎ.iuxcgd@ZѕoЕWѕ‡ƒ]KzЛкЇњ\Шj$ZЕpmЈ€v]RИ DЪYnыяшэˆфЮЬІ`ЕЌЏF†я—ћƒэЁю`џURoЧП”\ъm DB§Ёv)м#E€tMƒTŒH>Љq…ДЊЃЃP іДKЁЎаP'Nїsюниьым:Л*$Uї‡Т=)oд[ ­юн]Џ Зuіvђiя§сЖpPjіДУD@U J–ііDBнTЖў­в@ДŠ wHэЁ№Цž|)1ї6  †ЁБЛЗ?$uv{@|Љ­3иlƒi@!м6ѓіHаЖ•Ю? jяƒ †кBН0Pњlы”ТJWtђƒ=!i(щdjшюэmЇмБ# H(u`Њ.2ъ‰„C@нШ`џжB‰iКwsЈ?іŽє‡‚‘nhЂ mƒ`ѓ:ЕcЈŸ‰а1ие(“†яю…AТ=эƒ6еШжЎаlMPo Ѓ„њЛУ=ŒЂПї*ш6ђЗ Т@ Ж‡ƒ{iћP'ш\ъ uѕFzЅсЭ!FРм>(u:ЄюшЎ'мфСООЈБЇ-ƒ$дІЪ’B[`2нЁЎ­Ьm|Ї‹ібюbъ( i@Џ 86„ЄСp)ІЭаІA*ь`еПдб S†aR‘ѕ˜zьз3 €Ъ˜{BБ;И1xuИКEкђJіі№@_Wp+‚rї„†њ‚} Дƒˆ‘№э˜’їѕїvїВо ;#‘О…EECCC…нŠУЖѕvuFКЛŠК#єяˆuЌв‰вЪ“a(дЕ!ЦВrUуВкeKЋ—­Z)­Њ•.^ЖДfeCTuсъšš5+ ZƒЖБд:Ѕ5Њbjfa=Яc“ЁŽLчМaЋДЕwrЖQo=Гu”pKpцЃ`_X~=@ми QO,”š­3nаЛ.#рŒœ# ѕЮ!ъN!0\ˆjК?д;w€gфЂ&ьнb$ЬФг|`№о ƒшФь…5kBйSB#OЋbš™z›Д9и5м™Э](­щa>Лuj0'%r{ЅОP[‚Юg.{˜ЗQо`{{˜њxe?‹ЪљДКŸщ–­юЯ еюг С ŒnЈЗџЊ„“2d•НCP7t…:щ8аWBннрЈ ?˜ЊoЋ”p^ECчФєБЌcfr4zm Аa юЕ…њ{”є+r3тЮоСЎvXC›УЁЁDИњТє)X2 }&ФMЯФbЕ-2cc:Б "uЧљЛe"O3(ы^щЦ FR‚5 UА ф,”хJesŠ‹EqMTЯ@^6ЏL*›_Z^Znаў“Uї/#-)тБuзеrHЂGйYЮm‰ Al€ЃС{чаЬдv ssKJM­ђаcv‹RЧнШс^фž…ќрьіsъП|m№хkƒ/_|љкрЫз_О6јђЕС—Џ О|m№хkƒ/_|љкрЫз_О6јђЕСџУЏ ІŸ„б?{ВhЙ`Т[{YЭр9Д_lНEsЈІъjб{PО } єяAнЙOЮm›т™:_ѕžЗЧ™жЕ ›M“ЈЙˆ•6ГччЖŸлRЏьОƒьюзЫVхlъѓЕЯжTя?еa/яцѓ‹јЅќ|~/ѓ№u|љlъѓЖ7žї‰ЮLmэц“ЈЉЃ%<hfЗЭдж)gгЋ>'ёЌzlAрМр%ГкЇыў]Пљ7uѓoїїЏќJљО<ŠgЃ_ЂѓќсюC&Lџ„б$wߘйV"sїŽ™’Jф*3w'Њ‡DP”[&!дЫн†ЖC"@^7Z0Зd‚"cZc‰шw# вHГВ ‰вяKВгюП6jВ0ОЏŒؘйYR_eуЖ Ь…ИфEnnР9лІмРЕCœ rЪc&sЩЏШ+ЙdBnЎŠГЃ€е\ JedƒЃЦФ8ƒЃ9y%UZn)чd$&ЮбШЭi8aДФ-цdTцnuTОGЭЩ%GИы9й€jP9мІ#œAЂ3i %{Њє\#LГдтцшWѕїВ\цzFЁ#Џ†KCvhЛŠKGЩkЙ9ЃЩюЩУм7йэДoёЈfccЩd•ШбпˆrЗ€ЦoaЃэѓ-(AU>.C" дэ€mЇ_ч†3 ƒi†С4У Х0Rƒнo‚–›€ІˆЛѕqChЄН€ѓаeђ(hp‚!™9%œ‹s‚&Ь‡AwjSЦD#•Ь9jMbdЮ1НБЄђ7€VA" |dЬс,щ=ЬхБЉф9S)CпЈЈе9ЖF;ЕС.›У4‘Ю4­rC#чF˜ќ˜Ѕк!Џ“_PћвџМСŸ(№UўgЦ'Щб1E'?Ѓ№xUy:[O~ƒіFШaђl4nђЇR7ЩЊx Ъэ'Юxhдѓ#ї8Вп?jАгЩ’F§E тЮRGЊ‚Xэ%UYфyђJƒ.~ 0рsde| р$‰ |’”ЂEŸPр‹фъгфiђь˜n26jЄ"DG ŒЊ)јў(J”ъ‹мЯя“ЧP ~oд—ЕћЧ|™nгaш“‡Id4нm­в’oу&ќ c"+ypДŒvВgєЩ=Aі=ВГLЮ’ ф}\qVqAё>NЪ’ Є2iŸTe&З (,й 9ьЮМ’ iЙi”/‹V…9бyДђ†ЕBоЧ0ЙyКѕ4У*Щѕh$}lƒДвHз"ђЋ!}вW!]Уj"! AјшŽ>ршŽ>Цб}Рб}ŒЃ>‰rДG+pДG+уhŽVрhŽVЦAхmŽVЦQѕРQѕŒЃ8ъЃ8ъG=pдG=уC8dЦ!‡ 2pШŒC8dЦQ ХРQ ХŒЃ8ЁЃ8ŠG1pG1у€C 8$Ц!‡pHŒC 8$Цa3p˜УЬ8ЬРa3p˜‡™йgх8Чу8pgЧу8pŽуŒу8pŽуdш wДъ‡РrXŽЫQЦrXŽЫQ`9ЪXŽЫQ`9ЊL=Т”AРmЖAкi$Ъ; М“Р; М“Œw’Йз $ЪŽ(pD#Ъ8ЂРŽ(pDG8ЂРe#Р1#Р1Т8F€c8F€c„qŒ0Ч„D9ўћNљп6 Й7i`s%;p.ƒлб nCЧМd№Ћhƒ_A;М•18„| B F[ƒGнeІ*;„€UжCъ…ДвHЯBіЄпAŠ“R9ƒ7 Ћ„НТсYAu@8.“z•zЏњ€њYЕъ€њИšHUЉФРт(„t+ЫЗCў!$иD ЏdX% РИˆГЅ№ €l9%}˜‡_ЫУЯцсyјж<\%’ 1Я"œѓ Ž›dНoБћЄ2_іbˆLЗ<ѕУ=ъ›яЧЯ$@ЎьјЄƒіAк Љ R ЄHYмЌ.ш›ф ЅЫg eCђ@’шШn‡ГеЂ‘'ˆяћЁб_ЫЭЮОУЃйХЦGГWxz4{ƒЛJФOЁlz ТO‚хx`д}šП—Ки?ъhЭ.pйhіЋю*^ƒмщо—u“ћ~ш g=хОз]шОЅ`\е_ЙobCŒКwJуф19ЩНУ]ьŽœpИ—Лƒюею–,Јu_ю~†Š‰šqyь)w=tИ f‘5ъО0kœ‰Xыоъ–нйюrщЊ_Д бoYС3TЈ$1z>ш7/kœњјšВql‘ѓ„гТс2a‰АH№ Т!]АiЌГЦЈбkДF­с5Dƒ46њЛ№~њЫ•65§лjHЭгœgИ™аœ$~ƒ–` AЫQ4‰Ћ#u Kp]tВ еmЂ7xЧБі’uQ•w ŽZыP]у’шнИ_-ѓзE…њЫšb|K3дFЩу56у8­К>•ўП#1КўыЉcзѕ_onFNћцJgЅuБЅМЖњ(IŒ& ЁcŒцXšEМе}>Fх•pЅТM^‰ –Ы:rЛЄРЭHроцfЙ1,Z4C’Ѕ”N“”ВБ8Г)бРy"чћ й юШuбМ†Кш|њї!†j­n†КТЉ:ŽcuEБf<> ~Gшpѓcњwжd-мК2ЂН*DЦRвKzРОмуШаhЛ/“ЁБŒ,z‰Œ•& мO)Mё”аП€PЌf% l)dOжž‚=e#Y##ejњЧ їAЅ{нJG‹іq(т˜R ‘f”јѓo0оЗGгвйР#ёћ›§ьєЁЯЋкЏќс>PњДb”^Xї‘)ƒ$ъP‚8бшœbTXXу cє*o; endstream endobj 24 0 obj 15723 endobj 25 0 obj << /Type /FontDescriptor /FontName /BAAAAA+Arial-BoldMT /Flags 4 /FontBBox [ -627 -376 2032 1047 ] /ItalicAngle 0 /Ascent 905 /Descent -211 /CapHeight 1047 /StemV 80 /FontFile2 23 0 R >> endobj 26 0 obj << /Length 363 /Filter /FlateDecode >> stream xœ]’Mkƒ@†я‚џaщ!шњй€Љ‰C?Јэ0ю˜ u]Vs№пWчmBщEyі}иёŠгсЄЛIxovh*šDлieiЎЖ!qІKЇ]GBuЭtC~5}m\Ч[њЋyœЈ?щvYц:BxяKС8йYlіj8гОZEЖгБљ,*UWcОЉ'= пuђ\(jз™ЯЕyЉ{ЗoOjЉшІyЛ4ў)љ˜ ‰џж ŠFS7dk}!зЩ|?YYцЎCZ§OC]чЖљЊэZ-—jпљ CR2„€ˆ!b8юb$C@’2Є!У#ЩАC‚i{$G†'†Рg(Ф єŽ€€ЁDYВ‚єќQ Ÿ |b$№‰y€„OТк>+HјФќ;> zр“В„O2Р'E|"–“№ ї №‰0>Qˆ‹К]ШzgМfїhЎж.ЫРлШKА^ЇщОБf0мїћјЯЕendstream endobj 27 0 obj << /Type /Font /Subtype /TrueType /BaseFont /BAAAAA+Arial-BoldMT /FirstChar 0 /LastChar 30 /Widths [ 750 833 610 610 556 277 277 556 556 333 610 277 556 610 389 333 556 556 666 722 889 277 666 610 610 237 610 722 333 722 722 ] /FontDescriptor 25 0 R /ToUnicode 26 0 R >> endobj 28 0 obj << /Length 29 0 R /Filter /FlateDecode /Length1 41516 >> stream xœдМw|e?ў<Яєй™нй^ГйЭf7e„B ’AК+Az'4A‚вTєNФ vP‘CёDŽУŠ`=ХS№ы]”ЛCN…ьў>ЯьRМя§~ЏяППyži;3ŸчSоŸ2Л`оТIHAˆAњ„YучўЇаў3Bш„АmТЂЁўВр4єЯ"ФOž;eжШ' ­‰B\г”™K&w+џ“!ѕBЃп™:iќФЊюы-MнПбi*lx1y‡ыЧ`=wъЌ‹ПŽ]˜ ыпТo.˜9gТј?uЈ`š>іž5~ёмcђqЁXЭ?kRэы'ю‚ѕЮХп›;gў‚ЭЈ0…аƒ н?wоЄЙ-yмыEЩmА УD?Аѓt0,Ч Ђ$›ГEГкьЇЫэёњYСьP8'’ххЦ‹кЕяPмБЄДМSEчЪ.]ЋnшV­wПБGЯ^НћєэwSџ5ƒj:lјˆ‘ЃъF‹ўџђс"/Ь>ю9фecшšњцoi›œ–њ–юЇ-љnЩЬmG;ё4ДНŠŽтѓpж.t5Ѓ7ѕDЂeшїh-тбhиrлНЉfд=Мє:ЧŽDЗЃƒШ…=Љяа ДšљЮZT”ƒКЃZ4нЄЂБш {'Њ@аl47ІFЅюIнŸz=ƒ0oЄк ља˜NЄ~р>I§Еƒ3@Ё3ј~iвс*pфchz˜IА85%ѕ+мAн їРЂt!qјѕIшьСۘ№+OЅšRЧрЈJ Љшat—у>$ЬMеЄN \c1ќъChкS zЦ w>ѕtъ<ђЂ"дžЇН‹0ЩЖ•ЩjJh RЊ„=sааышŽрзШNсJ8[šњ9PG4юі98ѓkќr;L+˜уlядШ tЙR§ }‰}И„G2‡<ЮЬC"\Б#Lб4 їјѕ/pя' 9Щ<ХОР^тГ’gSf‘z=†^У*цKжЧždS@чn3З•лЮНРхЮѓŠp‡ˆФw.?еVиіE%з%7'ї$›S_"'ŒЁЈЊрюЧУ4Ц{3pм.єV€v>\ˆЛс@™qx:nР‹’Ћ№Ујуо_Т‡JЦ?Т=Ћ$`мs{RNn$ƒ`К™L" dЙŸ4“ЩЏŒР˜ уd ™>L‚™Ф,`–0›™&ццsцЏЬEц2L)VfГй6ЦЦй>ь8v!ћ8ћ ћ 7–{›ћŠ—љYќО…џЇаIш&д ƒ…„pЏА_јPЌюќ#к‡^О^цёYf%г‹й‡ю!ЅЌ—МKо~‡&258•lЧыШrмLrЙХ|WвDчйањ8йJ.’ЎL ю‡ЂщЄcњзxћ<4UьQ+{žэ]јхХМ‚o'?ђ кƒЉ„kў‰)fуЬлш4s ьш3VЦnмJžcj ^aЛqЃP˜yНФ4рхhщћ’Ијx ~єТ0\‚fRˆ!‹*˜ПЁ;б ђ j9^‡Фй)шTŠ—ЁoаГ мlОwт7Щ4v=БуfDи№t•83œ­Т цaўGђ)ZˆNВ2њ‚yюў$y‰ЉaЯsC№T€хh jH­DKИQьћx b№eЯ‚v[Ц”АahW€V :m?HїAан™итЮ|14ФУ0m=СM Zь]дЬ#-h gЦ ubпNAЃSЯЂ‡RSаьд§ЈшƒЕЉe№‹лбWш^ДЏNо†цЂ HЮxз›œфzЇк‘ѕфS2”lўэјЕЃиƒО‡щ%дuуЁѕьŸбPTк˜њИ;4ьCшt:Oљ\Ё/s•&’нЉоЬ\xо3hpъЙT6–бддL4FЯ/Фѕюнѕъn7TuэRйЙЂМЌДЄcq‡іэŠт…љyБhn$'Ъfќ>ЏЧэr:ь6Ћf1ЋŠI–DчX†`Tд+вЛ>дЋobc‘О}лбѕШxи0ўК ѕM!идћЗЧ4…ъУBП=R‡#'џз‘zњH§ъ‘X UЁЊvEЁ^‘Pг‰ž‘P =xєяюЉ 5Е§ЃПЩшЋа‡с„P/ЯдžЁ&\ъед{бдѕНъ{ТЯэ6Щ="=&ЩэŠаnй]єšм‘ЙЛБЛ6:ФнЋЫn‚DnЊЩщйЋЩщIя ‰‰і?БЉv№Ј^=§сp]ЛЂ&мcBф–&ЙБЩ7A=ŒЫ4ё=šу2Ёiєiа†аюЂ#ы7Жhш–њИ212qќиQMЬј:z kЎлГЩНєœчк*ќИ­ЧЈЕзяѕ3ы{yІ…шъњѕkCMлК~o˜.ыър7р\э]ПО7\z#Бџа\ЌЎе„WУ%CєIшSЅŸoRЄнR?=д$EnŒL]?Н†ЦЗО YоуѓщRg‘ЏWh§АQ‘pSЕ?R7Оg`З­ВdЏWyЛЇ]бnЭš&ьnГ%гQды;“Ўю3zЦсДзШUЪbzG‘~РMЁ !И“QxІЮt1Љ3Z?Ё3Ÿ: g5M„™ж$ѕЈ_ЏuЁлщљM\T‹„жџ„€"­џјэ–ё™-|Tћ б.х“ЋЌћЏє›тёІТBЪ"BSИЧnЦzyЛЂE-$™Ћ… ђЁZ эјК.€ќс0р -:КVšJЏ‡а-ў=HяЏk"ѕtЯ‘+{œУщžЦ+{Ўž^Nn6РЏГIŒ]§Z4—Нзд.MиѕџБ{RzџЁ‘ўƒG ѕZ_ŸЁmџaПYKяя|u_Ізdя1Šё“Lјc/0хиЋг•QJ…/o0ѕФAЎ4ЖрPя&­ОozY'‡Уџ—'ЕЄЮгГŒцкi™лlъџэzзпЌџці”ѕ м0СўУFЏ_/џfАZњ‚§2 p<6*ъᄆƒdFсл’:в™Юuў&Hжƒќ—о”Y§ЭўLП>”;лѕEЗ~}яHЈїњњѕу[RЗDBZd§r”]?ЗW§ЦiIмрoъНБh5wi‡6Р'‡Э шЦf‚ЯёB yHЗ#Ž=Ч Y`ЯaфyюaƒQ—тЕGžИvБЊ­j vЁЊІ­ UC_Л ‹ŽХakи…“v9ФЙЌsш БGРИЎGмN№<(а-6“л:FgOgeГЖ–д_їк|eаžп›“WfЅыYyeZІЕdZиџЩоЌXz?ЏeZК_ŸЈљІРMЁЁІБYyвbѓЫjyхAu‡ЅХђ­љ‹fV”етАZ-V‹"й5њ\2ЖHU8$Йм>oаэFсœ Сy<‹Y ЦЬђ‰PюммЦ\&7ЧТ!ˆDЄыvOШ tаНч<­@ &J[eи\UйСцЎФVwхZsћ8З\;жБ'тW>(œЊЫЂnЉДh]ЌЖ.А­7РЦШœњBїy+­9оJЬf=PЉх8`Ю†йY™љ…КRkИФ•\n—лaк“МX$b…Э:•—Х"с'Шњcя,}ыƒšќсRŽŸ=В]Иџ—ј‰е›>јT˜;8ш%~œЭИ0й€;Ўкий$Д-dJ+–є™К†Ž]ЯдЗlл ќ//zMOийЋєсћŠ#ј:q ?MЫД.Ж.ЎrO/­П­ПЋ—g,7VЂ%l зЯ,n–4Q›e›хšшЙ;%žSЧ0УИaђe&3‰›$ЯTdw€Ќ“Щ‘+sыімhYБ€‘  !:žёc?ню FЪŠЁoЮE:’Њсц:њЪ*(O&т­ZCКГДSйyjхCш: њ{ ­Я1CЊтUmчДФ…yчP5№‡ЕВОЦ“"эЭЕцхЧ(ЏЬУ‰RkЉГ0Š[ '№Nыъ'ЛMЋssЗoьzГ#ШЦžhшлхЙМ>еѕѓк>ЄїŸ›њ)фBnдxЩ0‘X™DoІ;tНaE•1ƒ\šЗШМ+И,Z˜еUpJ{IНъ…ЙBЃАI`hŠmB“pD8%№ТA2ypЇн“гоJЭдЙ U”ЫЁk…qВ––joІЕqд ‹•[#хЅж x’ˆеA‹hОUЗЬ,ZЕjяО}іx~№‰­ZЗIO’ Б03yїЦЖпељшГlO­4‡Ju– rH Б˜m!Ящf0›СwkмН›Џ†ёЌюX ДГ†›’їЙƒПў{'HЩM %л|TГє{$U*єЊОТЕААRэфЌ№w)ьW˜P…геi…ѕХые5ЛёэPЯzŸЯпя=”Ь{2џ}ччљbOЮvg{тE…e•leQ?ЖoбБ.>Yœ_ЄЌUоT~Q‰[+Ъܘе:ф–ЙKТЯИ‚9Є аС\mОзМеœ2s[ЭЛЬ?šГ9РИЉ<Й<8ѕЪ“K`` ЦkуQ4œлBЦшZžŽbZ,+ŽэŠqБŽ•tLГЉlUЉ$л*qЅ;ъЩщћ*’'й|5OјŽщ0Е^hе€п.&Z/TЕ}ѕЊsTТЌTРZ Ѕ|ЬчNk(ЊоЃTЦbхe:USy™!]B^7R v\MЇУхŽФ^0ЇЁьс ІjтщЛї™пЗ|Цщ)ИДзКKВš<ГOнЕюљZMrчИo96glЩЌiSŸŒeн9Мї ЋЎш0ЋОмЈ<Лн u ž† §ѕё7Е_|ўвъ:уЯѓZ~M‡Оѕcнp+Œр:`‹*рŠ­–ы‰Aв&i›д$‘ЮHч%Iйв\ЉQкšйtVJIrЖq :+p#9ƒ™9Ь Д‚aц 9˜ ТЕ„Р(h aжbЗњ=d гB†юC^ігч ЋSгvЁ UЗ%ЊшxТPŸн^Ъ|БњaŸЧž$M‰ eЩСЄžћАШ КœgСHГ ЂІЕрвНhЋY„VЗ [Э7гk…†yбњиFƒqк.Жj)p­6~ЧˆЕ Љt8hq у3М[3њ№Ъ%y7Dрy“ƒуŸБљ‡гm—Nе­п|ш•dv’ЊЖƒpkб  @Tї*$“ЊqhZv!vьпЦ>БХИ^‚šMаyР•Oœ8Aя§NXTВВёт€jЫ8JНВђt[м1нцDV:нe.›лЪсиAА8Я1йм\Ў‘Kq,А•L˜4Їб_28ЮWZ^Жс#ш<Шц5ЖcЏJO<ž–JКЊ–яl•мЮ™“,|Ф}„њ ‘ш?њH6Ќ…\сpД\-5ї2їѓє їЮэнЏЯˆaцЅfWДЧЄТЌXAЙЏSeшO]昹ˆ‚§ъFLђLŠN.Xф[š5/wЕg•oc憹к˜зЌеš3Д…вeK^БЉжDL‚ыщ‹z ўфPs.Œœ {_ю‚CёЙq?ˆkP9ДПCп\‹€СoЛSЗhЕнPЎm›%ЗX› №ч оќфёцъЮ…ЙpМ„"фq] •уrяЈ‘г€ІІЕ дюPЙmЖЂ­­ Њx[ЕжъФЙжДОЭТДЎekЃтхЎ(exCЃVtВ•—‘мH жЦ–†r}x6’“››GWиPИ„aдz~^ г“КDš {Wї'зmŸідПц|М2gяІ`AVљˆyЋ_Hю<ё}rљGсп§„y|ЫЈ}Ѕ?'ŸџчЩЛ’?ї6q)~ ы?у ѓЦПГџ“^УjвuЧАЮЫњЎЏ7LзŸъ?fъ'+ЗтъmcДпhёчнP‹е{ŸУ9/}–œђ§OЩЧw4н>эєŠy_=№Ъg>ЧzћЭo'Пјђ­ТkЁш(ЃJnŸЧ]мПшc7ч'У бJАь+Ž•ЦЪcMc•БъtqК4]žnšЎLW›cЭy–МXn^nAЇмбriblbў‚Шp4'?ЊмŸџ`бХOЫ;”ЇђžЮпћSЬ•е^Ё-X9ZЬ‹*2ы ХœЌЉ}–кф@ЖЗк;Ш;ЮЛЫ{вЫ[Мйо9о3^6л{Џ—x‘с€ЙІiXЧDУЇРСХ&˜Ъ‰УUF[=hЖ–aм~lжЬ,’p l Н)л‡}Й^ню)ѓ‚}п#фТ‘/*OтB_‰ЁнOз—)!е%%Є”ЮEЁ\KЮ„Ћб oЧ+КЁЬ|ыМ†šЇ(њBМužсА5€ƒўžg8$ѓЮЅэ}Цмƒђзѓк#œЃ(fеlš]cј5фGRОрЧ\;XА6Gќ('Ђ*bьЧљy’ЬЧY?ЪжВЈ™ˆSя<НРTФ у+WЎЄ6ƒЪ„НТ•vnђbyэ=)Єэˆ6!рћРЎс:ЦЊїXюКmйтђшяŽ?4Ј{чТћ†.eДЕI™?mйt—ЋƒеЋŽ˜v|љЩOё ѓ&ѕМ!т‰–є[9АЯ’ќьxплІx†ŒR dйхмвюЫЦŽо:ђEЪiЕРi­Рi>tBя#)8;аУоУ=д>д]oЏw?BaVŸжžі)Ђъ•Ї“iЬtnЁ2WmTŸUіIћх}ŠтRж(#Œ9gœeŽe……Б`Ъ§Š‘ŽjQ=š‹6Ёm џЮ# Y,&€ЎЖ€I№€{А`KЎ9ЧOбЙ)ž`м/рЬ=)`ъ ЁЃП,у€еHЬЫ„ШЈЭ;вЙЎuо…ЬPТHZ+;h №ЮQнєmИтeДЧšRŠ3UЛГ~|щtђ?ѓОЛkч_ВwyWŒ^їќгЋІпƒWЛ_>‰ГАќ"&+w=сŸ1ѓ||єj3€JgМє+њt`HШюЂС ѓzЭQЗу\бюRАнeЧЧ 8•КЂЗWмјˆЛњ ї‡Тпy™ылцkђЅ|ЌO‰JW#РeRH:(•zЏ˜ŒxыЄ’с=W]Q–РЌ>V3Ћ•№‚Ш‹œx…UќH­~DaCaсJаЈРсrCЇ‚žk FЩб‰і™ъeнќд ЭдlВЮ<јžЎЭ6ї5Ј|>ЙПmянћ zя:R @ЮРq| 8&‚Ž@RъН;€Ж({Ž='}щў*Ф}Ф] ЗŠHHb˜H0Р;&u#>Џ&ŸŠтMбmQuЛ}цш&+ЖЖрФ>Ot Мр„юEЄ4ХЇІœChрeXkonД/оІ‰LЧРŒPk’hиkRЯЏ€ЊЊУUеh ѕVЗA  ‰ЬŠУs(V?ЖЉЮ ˆ[I}чјgвхІ‹ыAэA‡ТЙ'JžОшСьлпzќљН‘БнцўОyдФ+ЛАБŽЛeдС]ћлђШc3ЧuyрщЖЩžХ‹kОЏэгџBJJ>Щзˆ$kй$Š•ф­ ІXЩ‚Ж27[Ьйfb~біП‘’=М š"–WJ‘ІFкVТфмЗtхсб5'“ƒёYќхс›з~џRлщ’џJŠ qkЌЃчŽдЫ'Yg8H­ПcŒ6ЦСš” ХlFn}m1бђaјњнхўЉыNM_xцЖбїЖЗ>Лhё Я-˜П;9{e§рСS[žJ^к0 Kл%цщЧоўшэЗў CS#+pG€ZпшКr]љCмЋќ!сuёЭ€аOЉS†™g(ЭKmKэwйлОђ}х?яS^5Нl'~- eiAџCъ<Rg‘­ZЬ”5‘чп јРйі‰ƒ‰ш 0jPk!OяdЊgŸtp(HБЃEžяўьˆŽ”сCd%€] wжыОj2ŽЬ!+K’\”янНС`%АЧуUк…жt<ЂЕ-qЮj­mщЈЕyЙv,;Уг%фМЈ3Ћ Žw†lBžASjјВТх тŽ>ѕ№лКэŽGёћЯя}pБяsGŸмЙГ{е„#ЗћjђŒп=Ко~ђгяwŽzў№гыЦwќ>˜}>Xl71ТtVPn–l<7gЇБьkЮXCМFЂмЂї oЌ^71Љ/І[Ќ†#pе!ѓЙМeЕИ–!:S‹N…жBМЏ=˜:aѕ{‰—m8€; ДжJI~˜–іФ(€РІПwп7џЄžЕо^„„E4Я7ъ= PЬZ`‹y*Q'рПNž~ЈЕŸ­gieщбЖˆ[,ДаŒЃvBфd“ЂHЊйbЭhГбz3Г%UЕ—Cžm›•ЖњhЇ(…GH#Xi'ŠAЇЧсtzlŠ$6шкЌŠХвЌMГк$Eє89‹USсœ Чx4‹E’D‘€ІёиlV+} §Ею ,ЃРв ГŽ8oM›ЯгжцѓЖy M5ѓЁe&ЪA™8„1WVЎ­i_ЛќикіžџГRЎ5kЧŽСЂъи•оѕ мПЩ2Д“аЦ›ьiI]ьмЙ6FacЁA… Ј“ ƘaЫ^Eчt8Цj^"ŒKэ`M* БAc/ХЫUƒOоіњ™\_gЛПP$аюы?&gJО'ИЩ7Йƒ—Ћ|ряЙЬmОф?ўНЁ™yщзоlbchRŸKOбё^оћЯ0о&ќŽюјќh‰БЈџц.ђЬpцV™иј=\&вФ–-Ц7Я7CkуŒ acƒО Ж№,ЫБ|…д‡хЂ|;y”|+ГP>Эќžхq„ QБ’я,UЋƒд:ЖŽ%дIЫй%мCвqў}іcўџ№ўбi“eŽaXђУ +0ЦQwЯАl”“'ЫЌˆ`bŒGбdB2л‚-{И=2Аžo“ŠUS‘(ЈлЋ@^QП ї™œ1јiГ†шb"-&ЈЎЂ/Ў}œн­ЧP"‚&V‰UŒБ„Q1R_RQVЅ$feUёрйьЩЊ„цУ=!ЃйN'ЙъЈ!Нy1>udOИ’ ёmОиЃUђщЦXSŒfЗ)“!ЋЃ(‹^Ъі9‹E‡ ЎцpT 8ыт=љЛ§щУqЂЮАдїЧЅИDАЎkЦЯ—œŽ_§"љФ `ˆУИ)ЙЈm"Щ^š“‰ЂбjHк}Й@ЕЈ€DЃl9г‹9ЈВp/gѕ\а:nбЊX ‡‘%Р “ гЂ>"ai ‹j%7ЂЎѓ.2зЕЭефJЙXqќПЦшWЁ('CsЂR PŒ<ЮеЈ™™7 Q3ЏјБ*ZЎ-№zАтH›Сы‘UѓэGНдПyсŒкЛЋИƒmџК?ёєЃmуШkozЯђЖCpcSпА UŒ’њЃ˜ ь|fpW^9SшСєdѕЪю™л;o(S'ŒЭ™—нœЏЦrI.“эd)‹єŒіъ0:4"2<:г4]ažь˜фYbZЊ.Е,зцЮЎaж›юRз[южVчоН_нlйь FsЭЊ‰ В‚~QрY†№8š›лx.шow/ ЄVjЇсЎХѕx.@А\“m К.иNђЧ|7I1T€ |%с˜ ЧlУ(Јђvœ0&9gАѓnO0ХЈ1ž6а™ј3ujьARšNДR?>fDЂџЫgdнF~`FnlьЫъИ7–Яy~hэиЎЩ™ƒЇMЙ§_Пъ—5мAЫЮMOTvЦŸŽj\КцвcЏ'џ§ўГ6ћю‘7ЮяйkJФ=>^ёдЄ9ЏMœіЮJѓ†{VŽTZ:#ПыОE OЮ_№<ƒ„зИPF?щ};pИх3QЙƒRЌд+w‰wI›”#ЪyХRj&‘Ш’9XpђB„sТI˜pп…d$J“D<‰ˆ”эLљ•Е"n7‰АŽБЎ=ПrСї’­„КХтj9RЬеs›И#мyŽуZШКНІz0^ŠЦЮWвйCupЇЯлъЉЎЂк*а _ЄѕЖƒЊwd‘[Rџм#й0mDiI§айјP…Ÿ‡uКІ№x`^P№8­р1щоіЦћxyћьœvxуёЖЃмСKnœЛx1[№ko дЋ ЖWбЦпяЃ(›ЁХЮ7ЄCŒЅeщЖ]qКЭ/HЗ‘tшqoV0нz|щPdU+ Сƒя­ жн Rb;Оі№Б9[6n‚Ы=Щ~\gШ+hЃ=@ѕDк_­H‡ЉHОzдˆ:bє$`JЊ[LhŒю6EA@ KнY šhфЫš­LЦм’C*‘}*+eœЅы˜k% [_8OЃМŒЫ QŸfŸТ™љI6їђуLќђGЬ*юрЮdѕ‹Iu'Еsб\З„Опm3бЋ–лe"ЇDА."F”XB$Ad™Яs‰ ‡LЕІzг\SЃ‰3fIk2Ю4юOюš&HF] ЗcјWFиk cЊС›EНЗЁїїїЎѕ’tЗЄRШёV‹|Бп н’t—n]нЉЬ˜эt§Т~;tГвн,ш:iїчнWы)pІ0#S[QŠa8"ињшы 9јњх$№вJv@€ЦKˆЄк€*u@™qPŸаA+жІˆSЅzmГI{“;ЮбЮk&‘ЋУ#H­6едЄ§[љЗњoГФ*ЌЪš“,q,ЋЈf‘њ"ЏTХ аTЁдe!9N ђ пBцъ•яtрr›€LКM ЁI3Є–=Щža™M4ѓ’iЊUŽgf“‚КЎY„“Y!4‚uџху?ёA>Н0Узвщѓj­­ЄгзZ}ЎJk…яЩщ,Ь аŒKЗ0Bi‚d6ГF‚ƒR?ЇХv^C"’aТŒ=ЬPрХвїШЈЯ_h{ф‰Oё?ъ(Ѕ<'{’бxѓ[яођ|ђ |':Zmр>™AТ | Ўеc˜Љм*cšf``ё….ƒP:сА qh›ЩШ6\HЉ_šGЂKа?m­iO†І†УRБџDэШ’ЪNЬ‰ b5оёc@Ti>ї;W+ЪB…hЅ^ЫВН##"“#ѓЅU?ЭЗ›+Э7нЩнiтѓ\уЩ+ КВ$Щn  0Q0:йС  jOŒ)ОЂЌ`F*узЛ№3Ищ7"IЃg4єiš+}ІШ–fСс’Длn=ьЋ0ЂщапLbлпž?yЪъ{G6ОЖ1љ;|УЪЮ7ѕя}ЧуЩЯ№Ќ›c=FwіРЦфNю`нI7?[šwИqЪюњŽЬЋkrMП9—Ж JчН‡,щHe~;PaЕ!ѓ§ѕBCћм+рЋ ”ЯЃ!2т3]е82}ЖпhœsWу‰џж6л™Я/EšкjЉІщВГm2ќТ„Ш%№Ђe4_1Кj-›СЎ ї’‡DіEKˆч#qX!ј-9K?ЗWї)œЎZвzйL7s8ФщсМІƒИ Џ6м8j‰2 ЩЈ_ЋІžn†ЬёpФ РЙИЂ”\jюўСАџкa{[Зeй/ѕyk­…ШЧ їGk~і5ѓ!ЏПш№pм]0л`ЖшЛ…хз’uІu–7Эœ$˜<Є—}€ѓ&oџ0ћXчXяџ a†i‚}Іs†ЗоП„мЪ/2-ЕЌхЗ›Е7=ЇЩЧќЧІЯ,>_хAUuЯ—ЈG_Lc‘šDЄMйжљшЪƒ†РкД)јњ†+•PгH0]•h@ Уu7|wЛf`]6ЇFCy1ЛF#V №ŠРŸёСЖE{м8§ƒ'>\rпЫ–эиqћВ›фЬт^З7™:L&џИsЫЫјБфƒ?žЧSёєІub>рЭР *К wВRІ*+;”7n3@§=Ыи0‘Т3ИКŒ€EUпbX8,ŒŠˆЂВsˆB""x›.#–…Cа[рœЩ/ƒпЂge—Щ-ИBW='R&4†Ы…MšhеUеQ†ˆFBрЫя3ЗрFpу  G<~!^Ѕ}mи–jэBеХЊ+%,kгŠХbIЛ# „­RяC7•V29э*œ“ŒbTы9нTЉ4жV*zЌRЩ @л.уЈ[—уRЃ~„БbВЙmyьwЧ7'ЫёИg˜§—oz&љ ЏкfЗNN}У- …Zєњ dz Ёuš‹d5ЂUY›аУм Ь3ъІY}]=…Юe§;ЫjЖeYГ˜B>пZeїQG8F:GxЇr3ВnГmА=Ьp$ћCю#ћчоЏь_9~tџнћ•QCчЪЮŽћhс]­Тк“\ЕНЋ )Wћ“^joGПРHy„:E§ŠџЦѕ+О`жА“1›€<ў€IА"й`LžRŒЂVKTгNYБfе­ѕжF+k]`Ы}Ќщ!%АзŠе^ЩrЕЖ{L-N•‘ >YеЕт:ZК’ §_IЇRѓК$гyвБ-œўсѕ›;ьm НИpб3лo[ќФšЧ7^zj+fжюNЬПі&ЖwоzэјщwŽGйAЃмhЏtHитэр-іъоЙоG”GеЊшSѓе&я/ыЅŒяЫ.ЫUFБdь$q‡ex$ou`GЪЎГю(‹r?N'в;fщr Лl\ы)ї0>ˆТш"–AЏЦAыа"XY€­ ЊєЋŒhbЅ5э„:4+/ МШ^“l~dхСЅ™•+qШ1Џ”V_•—U\Ћ"s:Љ$эйКеюЛsб€БўЮ%Czž<Щ<МБaFYя‘ЖЧфоѕЗlМL­†њрl Щјц—ЫСХЮБVЪќЉжJЩe ”‰tB№§^hqІ…#>бЅ`И хУжОеЅœhrСжNыћђл—Ё,,JЪ—br%*—ћЂ>ђ€suт(i2žLІ‰гЄХшV|+Y".–n•зтЕd s—АN\/=†ЖHїЩ/Ђ'хWаЫТnљMє'љ4њHўњ›| ]‹dФЩф’ѓQLЎ!№ ns•qКI-“QŒJВC’dMЧњ8YFr:pЧ ВФ Ьux—#ъК.5‚ehСў}:зfzК":Ю1}џ>Е €якm ŸЇѕ\"]ЌXy5dc5т5з"rРІ€†Ўе*хЪWтhіRŒ_JЮќУЙhЖ'ўЩйlЌmе”9У‘uДЖˆ “ƒ™яйn(јщМ^o2qŽ"Sд1РдЫСKYоЌ"SЬQЉ4urмdъэ!Œ2M5§*џф4Зхu‹tЫЗЉh[‘а)мЉ КЈЗЉwИWСА№А‚iТ„№„‚њЂЦЂгyп†ˆќ˜guЛxg йнœА FІS Ёb#ЯйˆŽ SˆV€.зЛs€Eю•Pd—Г4Z*G=žSnЌЙuwНЛбЭКXpхdчОj9i9cIYиlKЕe…БxуE ТeWr\Tj†lЗЛHх9#bNлЊŒ­mpгDБQi–"Nвю./ЕІЧззOоe*щБ`љ:/jњьќьїю>МєйIŸmћУї=Л|йіKoх-™8КЂiЎњ| ЦЗ4^žўѓЩХ/0…яyѕ?џ#H@ш§H€Џнk ` хўЇ•љŽ–]2р(нB,Ёќт2.РеАЙT-Я”ЇфЉ”NjЙљ!Ћ)п–oяыЊГейыœгlгьгœKјEъыRЧRчjuНuЃmЃ§.ЧyЛщАvШzаёНќу'ЕMћХ‘ m‹ЂYm6рUЏУnкdЌX‹U‰šd‡Щ$лm6E1ёLРkA-@:^ @ ЉоgБы6нбB†щІj›n#уlЏкˆ­пИп‚sP/ПLwй,!“Ў‡”beТд*)…€OsуоxXRнь-›ь‰ƒгF`qъЫxД чМђЕњиќџШі5џђНG+ 9JœпrЅщ­Œ&гШЇЪgžПЙОѓ~эПL,˜U>Аfо`MШь6—"j-XГш–zKЃ…Е,Аў ˜ќЌЄ…жнўw5`kІ  SF:~cўŠ ўJђЧ9мўЇ†'лТ/.žџьЎE ŸJN#bзИ=Ж%я|іž_{0;Oœјуы~ќ:ѕXF3{qžQ‡гˆc0їAЬЪо„ žЮ7Ц.9UŸVŽЛ˜Vт{LbлHЖNЈ32?ˆЗШ[L/“х г[цwДгЬGв{ъgкWВЭЦr% ѓМФБ cВX4ГЊb‹EеLр—еФ(šЬƒЊ‘ЕушИDД(’I QЋX*ŒCQY’`€ЊК—йА­ŸzЛ’#[Цѓвэ:|џЫ:_Ы7сŽК9ФмNrСƒіГ.;–IY– Є\ћJЛаj”R_K?QСNd,Y"#з•ЫZбH%Ѕ—а†Јg2ЭfOVЅЩeЊwіwы{Т•š|œ•8'\)щ+Ё"*ь(ž IА†Ѕn*т4gРфa ^•|шЫЇкŠЂ{џœМoјќt—фw$'щS|cщЅЄві.ОЉ.™@РoFЕЗСoR&пљkІцtkх•Є2 г4gхojN4$ѕ­а4AЕGхшяњЌ˜sЄ‰єtѕŒєѕ/ьйЎIЯВ‘мHqhd\l\саvSФЉцњм™Б™…кйЧ– +#C\cМЄФUщыRXкЎ[II™€д|фtDеђвMŽmтp0ё€\а4Yˆwљ5?ёS“ъS=_wјtщЎши‚э+жOйБТF“ЕЬоBVшZ8ї ЋљAџМЎе‚ЕЖХŒ4P›кFБ5A+)p6оЋ0^8ШD3хЏ(]‡xЕˆjФЄ_ЎЈ0jŒbјњЗTx.lИ%ЬћŽ/§2йК№ЧћзŸ(еп\іЌ‘Ыч™Нk&мjŽџ}яš/_ъ3іw+[і­y гŽєWЖ.ZќмЎ qЃиДjўЈФьфћЩž}mЮп3{ЇсcЧпўсыЧOмrФњрЃOSYœ‡Zй.ь~dBѕl4["ПˆЬlNрЅй2+џТсйеdЈЏ2rtЦУКPеZЅЋЊB.ањчŽХQ№"Ужt˜„рdОїy|oВЁпПЖл“Гс:ГР{<X?Š>б{љ~'ЉЯУ7‹vlcrsQиц&Q$ѓю ™ y уX^47Ф0!ЪЋ/y^cЮЫŠ…d,{cW ­5Zтb‚жOTбКћ+е\UЦjКяJ§NO6тјоУ+1-ъŒeЧФ(‹D=jVЙ,і0ьА‡XЫсЂa0ЙУиa…EP ‡Q. ” К5yW>…F.Zу_КмрРбxЃЮЦлЪ ГюMžкіIrkѓ^\ћйVŒяэ пВЮъЃЗ†;ЏХфОлЯw#е/тЖГѓцР7ђ1žп<ЅхїХskЏДnыБфЯу+АѕJtЧkдp‚u-ытрв#c\##“™™ЎYО)‘ЅОхСО С‡];|‡}пЛО] йop=юкщbКLфIоСдYIе=сЪ23Г9tpјƒZЙ2Е™ дьƒИ™pgнъ1";Œ<š‡x6смЙэ‹ЮЗ^ №€лIЌ›тW<2!уЄDц%$ыIg4рL1# цёiŠ@ZlV#шУeзЊяцюt-?tym'мщаЌ§—Бpќожл–ўѓЩO“ЗŸYАxЯŽeЫŸРCЕЅГЌјdЎт1‹ŸœСкУЩП%џ•ќ&ЙїЅW™ВGі{tуЎ]TЦ#ФКИчŠцъцc* Ь‘•б•b‚YIQчƒ =Ш(JaˆЯ"Ю—ўŽсqxaЊЁ™ƒW`{Э-ј~Ы1єEUЭ Б;-SјDѓœ†W ОŠН<ьфУ ‘N6[ХxfпЦdkџN–ЬџО‹§uчЦ’ЖфЅ–ЯvтяёыR:43оn—сŒ^QюТЎ~Ў~БЏ•яŠ9Љ/GЫё2vи`šЇ,T—К7 ѕx#ЛF\iZЅЌQяvПc=nЗхДЄЮю „|Д …:аІ](F3ПС‚‚‚ЄјƒэЗЕЧэm Š\~аІчП*aЉ…LбЕј|‹А€%зРvЖрћі—xц71˜§{rч;ЏВSwчІŽзиДЅ‘єНhЭˆjЂCk&К•с#ю—˜G—‘žLWшdjЖ\я0зu/јMŸ;ѓыW|?cжкЛ“?§4yёО[жܘʜЎЩSжuщЗiшЪэ;яXёу/и2}лщ3л&?XPtlнсТјШНЏсaSWн9nТкU—S5›=лxЧѓл;FЄОю8‚тш=ŸS]j/uЪіВŽД.ђ3C\3ЕщމЎ…ъЧuНу.џ3ЊЬ…ŒКЩЄЈfVРUСДјI‡;„щ_чЈИМYQœЌч yyЩT=з plА@ЕЭšњЎQ˜3d,†щЋI$ЖЉdlї|wІ‰Dнt-ŒZ”сИпкЇ_G2вТзŠ“1Ѕ0ъ\­ ІБдŠk„ЬTF]OјиˆцьfЌиѕфђв›i~Ыšщг6:šУпПДј­“'оБ)љэЧЏЅ№ž‡ж6нБь Чуdёђ wЌZкїњ”=Ч=к>јЪ=G’?} w\\ьšв\Х=o†їtgOoЯаhлАа fЂ0Qœn›Z . Ќз>?tY js^( SъZѓƒКZЋUuјёувjJ—И ŸЭЅR€T’fаQУHг4Ђm*’)ƒИR—Ћнумsм+Р“n!Й{ЏЈЊж+єЫ/‘~ыŠЊ2Ш&oDв’1J%[цЭ\ЋёžЎ _ЯЬЅНžЂ~3Ft~ щ~xJsл­ЇV}™<їи]пюќМ­bа=ч=§фmKŸg‡šЇзwћс/ъ“џy}ыэИ?^†wМЖ§шхЯЯзЕ<О…ъ*Ѓ“ ў‚hЗJ…Вq1МБjA нБHЉ/;KЫф7‚зНРg8™Фa;1ўtЕ/+ВМзуѓо$+В*3Мгхpй] яgРњйЬА№ˆ0vЩж02ь_!|VтtщІЫэ"3‰DУ%™ђ:Ѓ~џђТшлыЬИєОЋ“Лqх}ЯtьUѓрЬ;“яpYnIž<і\2Йc|ЩЮN{}їьзџ) R„iTKг‘F˜0#фдeŒ}Vд7šЋшш’z29w1rф6є^УrQЎ+[Ъ­с8ЗШqЫ–Г#ЌšzжЪ™њЦš‰VЫ&nЗOQдЈ,o2сlSЕi‰1yэŽзJ… „1P3Š„QuсRdqѕх5kiщZMLж,j–˜ЈЩ~,™…t5­ІoЖсД”бтiњvЩšцфдœNйšKЛ?и§юНї~Йэ!sПћйБ—ЖЋ™І ЭHНЮпШ‰1jp§ы!—Уј’kмпХкХ?MFkќ’п?йJ гŠР‡ѕ,†8Рf™1˜АYПец1ћЌ6?'|+ЖЇі˜XЕgыNE1SŒ]nЗfё{‡wЂЅ…4э1лmє€v1yf“ЏмюџХjЇaэsЙнUђ`Я‹YŠZЮБЂ№6}д8„Ÿ@S‘›WЇкEJѓ3<УtMЛ=Е m™ъ;ъ ЛКёЪ{“є­W›QФВжHъˆ%мИ3жLоЫŠЫЏ$1œŒ•ЙЬ|єво“—vлвa&s0Й?АtъдM_WђЪ/)КЭ1§†6kћ№mјtв=ѓaЬc!љ HзРЈŸs"3x4+єzŸ;4‡УяіћYVc&ЗЩЯюpя773nЗЧOBYКu}[їтFI#ЕсжqібюqžО‘ў ю‡ˆц 2Œ-h’œБ€_cЮВФŒ žРѕ ‹ЭX\ŸќJ$ь} ‰Š•(+в/e—а*h^‡;Н{ПаœмџъЩфСэoрЌ?†§KОЛянфŸЩ[x~ьhђ™ПœInлї§‡ф’'qіяХІп%ПЂ˜Ї;˜Єщd№T‘юKц2Єз‚#ˆјИЙF@`юнщьЃі5ъP7†(FМвр–}ћшЏЬEeЛВЄџЇ+ф^2‚#‡ШhиЭ’б{8,V-тp-ЈујЯWёШ'†8Ь-ЈOЁ}„T№v№ЕТЧуЃpтФ ІюФ‰ЫЯ8AkьRпJCG =€˜д{щb’ЃђA~f+Г‹!Ь"„Љ:%Ž“™oљьфJvяRѕh.Є žвХN‰ЋўсЄ•…;6%GyЙќJFq/УГиШn]Г8p![ “›ЌcЌїX+-•ВУeZ +]AЊяЬЮ-cyEВѓ~ЩkуXФђ&ЩdmВ3! њMYц\ ХИЙ • ]ФЎцžL^jФўІ–>ж›lc,Cl3LБ-с— ФќAЫ~лOќ%)пdЭGљjž9п’gыршŒ*lЗŠkФ-ЬƒЪsx;йnzVй‡іѓЭoАѓŸJпВпZОБ]р•6Ц(e8I–E“ЂШšеjiIѕпЫ![Ј%еOŸ,[ЬЁ?Z1$XmЖ8'8Рœ˜eE‰Њf‡ЊšEЋХ—EœNы›39DА`cE‹U1ЋВUf›Њ(ДŠ&AlњЮ„ьИЈЉИ^Ѕ/B1 ‡Ÿгха Я‘WШDn!УuiЯБЎ7ŠЎ™4зoŒ2М_Д_œlАЈЗцB"сiK4Р—™žџ]лœa!ЋБќП(mІб&:г>ћ7eеЌ†”9 .#†йœ:еŒŠ-! ВЋаНЎSйаQ˜:Е[   6„‡іo*5jрФдйнB(Не–ЉПЁsjП%D[lIк#г_мƒ:“ƒщ+]§ёЋчЙѓЌЉГ{хЂХWcнцд‡ћm•ЈfZ”kЏLGОш;ВД.зH СmЛлЈЋfђм?yшрŽjЖtЧ­х7ьп•l>ДЃрЯlЌэ‘sжЗШьЖ-oŸ “/&Ыі]>IхьDŽQAл Ы1Ы(v”јІШБ.ЛГЌŒэ*іfoYžхОЕ ЂCxH№’#F!Йj]„ўѕGЃ‹qЉFDУј—8WN8iU= кH4\L›#WuР!m a`M+[tbђв‡я&{ДЯЮхяч^о§yђђSї`ѕ;fах=ЏюЛх(Ш> +уПq dE2БтГ€ЌBКєі%e[В‘араuQbњ–Т„x §їМP_ˆEtПШ.Rж(o(ŒЄєSњY˜6Њ™G1cиEъbѓZU4NЌT;™‘ў €|БFНб,o!1›…Этvц9З‡bŽ€`QQеbN„ЎЈ Б Ёя}‘ўЅ­ DЭЌ!Q"ѕЖFБ$лСъИ‡†СuY‘фЎЌ0aгA2™Б іlв%pRC–Й€XZШˆ—C\}Z‚ШіНVJgZяy!Qх%oф_ яЛКr.<4-Ќ]7mj§?ђŽзJЩ^AJъ0љЧ€I?Ю€*А/п`W5ѕѓnГLЗfj7>мЎ4…њ§•ц’ ЃЛЏlmwЅ|^ƒQONЁvКb4lXq[Зр\<Іих-Чу0w(9bWrw№вПюы[ћsљзоьл—ЪйГ—B0ъЉA%M5F} ёСe#ф4x “юЫWЧšŽєq8fЉaЉbК‹а?aсž2оPG!рšЇиtr–кФЏiL#]zМйј›Œђb>„ГЭxЎкZШ›"Бс››ОT№Ў.Aw Џеo‚NЩ—:h•ИRю‡{“оb?i6#УФбR­6O Фщвmxx›ДЏя’~Сˆп+Цp—*ХgФ?cЦМ_жœeф^Ђх0y€ЭII&Ђ,G1ЕL0­[$уЙ8ИnђxЉqГ \biеЬёєП@АЃn3cdжЭѕцFѓy3g^€фл1о…№ 4Ѕшk„mA˜іЏНR@гFчД4Њ5jїО'ы+Ѓ|"У-šљXм Дv ž.ёпW€c"}Ÿ9M‘ жŽОLЩCi”66дс„С0"v }КLѓэЫўJItљo Fv›nњY—]•ФГЯu-ю_ZŽљHР:•†љфщљЃ’ƒ˜‰mЏЭY2џ§~FќкћЖРИŠ+СЊ{owпюжЃе-ыa=њЪЖZOKВА­‡eдВ%[Бel,ЦЦ\ЕЎЄЦ-Ем+" ѓCВ! йŒ&р K`dУЌM`8“!,„’8Вё’d v-kЯ9ЗК[~Рdfїc?lљT[uЊъд9ЇЗЗ­_ЙњKіoƒўъ`>p”Юˆvљг-RБ"уб9ЋEБOKб)Э<ЊљДUуR-ЎјpўЇwMŒUЫ4 rЫŠЫ+жцьм‚<6Ь~ ыtТgƒпeHж˜Зо–~[–е:фѓ§%JqІнюƒЉ€ЯЙCѓpЭуїlђ\уQ<мЧ:н‡щь0^Т§ЯЉ‚™œjХ ЎXƒ1п i;`ХЖ‘РКkЫаѓмЭЯ§˜?˜wрњебф?žЮŸ>qэ;Lœž_МxЄ+§>7Яч9NЉТ]сiф rЃкhoLoЮXцn№8мЭ]ВдN Њx‡']јvсЋИ ђ RЩшŒђQЇфS*lхЮЪ Ÿ{ЙвЌ6;1ЧЫдne‡КнyUFЗ{€ЪЕъ.g0УpЧ•ыTМ1ъѕмЂмaЛУёueZ}к§Cхeѕ хgъ›ЏЛ?P~Ѓў&у}wЕем”Ѓ-9—Ы“‰{r.Wz–луInЫyNnuIЛУуб’›r0E˜Г#'yhGN­ЧчСМ–цЇ=іOkŽ{ЧВcоTvŠsџг~‡ѕIПk“ы—ь"˜oБќьy?(Сsџа’ё†иŽМ_чŸкqj tIьмmКГfMДKGћtцќ\ЯмВ{A|Z+бЉ;qЫ.П‰у'ђђ šмиš š<ІЇ@Ѓ>\аЄ.(РЦ||ВА‰Оџх-lђј ›d€єŒœм;'wЅjLVЃmРшяИ›œiE%+9+*iq:“KѓфB˜'Т“Ћ:ыŸƒїpМ(‚;„‰ ‰ЛgvЉсLкмБeс’еМьЕ™ЉъїgіyK–Ь;sЏtZњЏgn‹ЗnК’яйpњSЩЙxйІт3<ёЖ€w=вјвУЊНYVV@х>˜2‡„ќ€(љрШшиё›‰yd•?ѓЏD)Ч ЦЈV:j3”A>htОcUа|ЌЊЭnЕк­В]s8aюДЪVЛЌI<gкiN+‡Ю‹;ЇЅ|?Ь№С‚ +ۘ–ђќі4ћfПcчкќ)Кг™І1ys—ДlхЉIІ myВ€>јgsPМ –OSжЄBJВRЊШ’VЬќшwМdSЧЊЋyс/gž–†ф gж\}є^ўФщЉ™ЏЁМ+ Ÿ@yГїЙ3а€šс­і2ОVНЬ.У{Ž]zLСpЎи ОЂ’Ѕхў)ЬC5ЎРHЉ8Ъ…K9:Ј†)№T‡C!‰Ѕиf•œŽbh{ŽgјSјЎR,`Ж:еЏJъњДV˜‰Э‡aдbНœхЇу €їQq|Фу™->онт:щ:\ŽlЩj"ЄїЮниКФ[Ч •п$-ШoJŒoЫЬё­d^…єбІЫNџ“2џєЫ=ђ'хЧњж hzЌЬўŒотRНЅ?‹кE5Д ш-x[&аѓШˆг Э&ЛIёg7aХŸ*4y7†lƒб*‚shѓIМ„У[ж§?~Цm3п’nže3ŸќоrtІBzcцћЇП)Нџл3x†љх€єЯ–зXЛХП,кQР ŠУN?АaГ:Й”‡_З1EVsнщ M ~+œ>žžцЬVlВЪV‹“1—–ЭГY-Ьљˆuš&V0–g)ЫЯ1?mTЕсcќ,GЫЬŽ–ІZ|cO\iЇPs- І ЙОВKЌ6<8`У;{e8ii№љkі_цсїЩй{knМneј‹Э]ыїФъoRогXёT{рыKЋяЉЬXvлжЎлю^Пu_M>жoЙ4)п ѕГ2nЇљчe71ЄOЊ%ЋнЅ…[[`ncјs%K‹г,ЋU–дFхm9$НЭƒ6ѕY^ЯJј1~Љ§ј“OfЙW6еšWчjOЂЋчЛwWUyЬћ4сњ}<№дŸЁш’гяJ[йгќ„–№KБ?“/У5HZ$ЅeЉЙk24qE‰ђїн‡ќуюw‰хяX1ћ­ПЈsўXбEї{Оыy>эѕДŸЈvO^Fх|й^gЉsт:‚ ­ЩхqЬƒYЦ‰ŒЬь OvFfњДєЗ~O†Ѓxž?уAмїЮєУ\b^Ё?]•Љ№зpзnšчљтxжNWиuЃkŸKqлЂчь‚kюgѕLўux1mœЬxъB;uоГwъR{u-sЗХГ@~'oUЭ/№2sЛ˜ЖŸц|єЧмЇѓР„Z6ПK_ЋкњїѓОКљЩƒw]yWљїю‘оœyКы+їчjью_šсуЎ;ю|сс&ЛZsЄ?<~fЯі3ŸМњт}“ясо2ю3м&і*йЛўмк^[}IIЋЏНЄЛфёђgЫWŽїчpsЁФ\I,Џ€† dаCu•3MБЈЖТМ‚Г7ьЮДfl 6ф“tцх^V.ѕВ V!ѕњ••0e—эeGЅ+фE~ЯМŠЭ••Сj‹’–^[ №Ъб>Uuх Šюк$hqс|jцЖ|ѓƒ›™љИЕЅИ>žIўШ (kЮ&Тy{Ы–/j8їГјE9PN*ОѓПЇ–›[ вJkхЅ\+(эшXе6яEїю§Цн+яя^ШoОРCcг•?ёVTе­Ќ]•9мГЕЛГ1Жrс}Ÿ\zѕw“|гђ™-R TњЕƒ‡UV™јхмгЂ/ИСЬWќжк<Г]zf#[њ„s~g‡‚,/В‡”(kИ Sz”э•šи"ќ§ xО`=‘нў­"ў€ы!ў(„YѕВ0є€­› ўЫжGй­oЙ‚§Hг"вѕию††ЪЬМ ~;€ђ9ўУРЧЖ\1;ЯТѓ§ЪЏи {`+Р|ˆя Ф{ љ€ЏПќЫј­ь*QцŸ‰iPрvv‡tРЪф<;YЏэ-ЇБ~ЕEрщж'е‡žСЖg^‘l7fN š†k‰Р%fs-ИЬj]+ЎMHр–цк-p+аџЕРmЌзѕЋЬу“‰лY‡ыS;$=ыR;йЯўф/v]тљ‰РгхЋВegАšмР WPъiЙwnAф~ƒp+…—p…OЎў<сvдQюkхН*pаQоЯ:ЪћPр ЃќЕх_.pаQ~Pр ЃќQƒŽцЏ8шhО.pабќџ.pа‘ї РAGZІРAGZ\р ЃВ ТXЏВН„;Б.eїžFсžAИ™Ї ыRv„pрюВ Я&š7 ŸGљќš№ џсљ˜Жœ^€4х&oEHSю%мKxс‹ˆО№JТ;_Œ-Ѓ| т*ё/p*Ћ|'тifј.ТЉ.хЃЌ›БfА~ІГјћ@7$| Гa€˜ в ЇГршъ$ BBОАv зџ/sЊMrІБ-bё$MТжo–З„5С_[,Аz mƒ!№7Cšр!FЉ6C~Q€лnPE ^JŒ€2B№9лц9”к9ДЭь Ъ1šЌrаЎЦЪ!Ї №˜(@?фX1'ЏЯJ™ЂиrH=}Ÿ$Šђъƒ”CTў.УœџуВж kNbФЪFƒgЄ‰‰\З‚4Ж‰вkЬGхmЗ Ъю'™ы@щ ШЅВ,ДЕa*kЎНD^:ё†)‡(Gф{ЪЂMщkФЕNх„6Ьф:*єЁSЭtcI§…• $›(YžYЛ„†tСœJгЈ„Й\%4ВСчQЪ{pŽ5 m˜ђ2ЫN„›вŽ ‰„ЅFЯЃ‹AžI%О™w@„ФIвhQ)›S‹DC”9E}‰T‰”~(5(jjЖ=Ь!%…~jУ!š’kPH7,j$њ8=ЅД%+ wЖ‰DŸMжу†(ПTи7ьмъBўъэ4бJ2ыЃВ(дL-,(t8HэnDиH\lб{„ДЭRНМNК2­C#D§ƒЄЕбŒPл3­q˜Rš5™kнСЄeaЫџЂаЬqƒЖЙGД-Гп %љЂЇ”ѕЦЮ‰Ђчд/ ЪшЅт$щОГlг`Л!Юѕ$ТЭvbJtDШž,3ьлL{NGs{KГчHѕЃfћ Š>3*кєхb$ћDl­=Ђ4lн{D_к›Ь2cŸ#™Dп9šь бтŒЄMGЈџˆ‰ім/ьёBђJДB”˜1'—T+>ПМ>1ЂіRЯhrн+43,rО†ЪЈVgKЪь‘ЯЗŠѓKNєmи‹щ4еЁдvTє!ŸU6J+„ЄњйБѓtaˆYЦм9—й{ыФбI6(f:‰Ю5a‹УsњЖDЙи“є‘ЄƒsF‘Шœ9ru’:2ЧnScїчK ЙЂќv>+ПQвџ.вцмyhЂLQ†жœЁЦIт˜џ`В>&_s­{HєЈІќЭV5"ь#еѓžmCŸWЃ”}ЌЃКŸЏЙФм ЧCЬаЬꘃНiuјDЮ‘w*ч(ЭVqFв'ЦЁ=47esgWџЖіљEФќ/(оu.4‹;_ІДR3жхy~;NhL?Gж§џ.nSR>П„ГЧћГ92Ф,6cO"|?icц›@9Ьс—ВxзвР]O‹с q)@УU‚­ЌSPжбя;/…?o`—`ЊхlМ `юџОБю?>2&тjЯ‘^r<ь1њѕ€Ё}Oы4Д ссp ‚ДесШH8ЂЧ‚сam$Јб꾘ўoеbfк–p(Ž!Qmн0Є[вдTЗœњ­-в6cQmГ5"{ŒОЖHPm6т!=’ШЖ™5к|…‰bѕ5ѕZљ†` ކћcD57’6t“w@ыŽш}ЦйЅ…ћ?—k-b Ѓ1#bєiСa-Є[Зh›є˜цгК7h]§§5š>мЇЁЈ1:d5Щœ Осˆ>2867Шак#њhpxгAД‹ЕЭс^Шzc00щбjЬ= um‹юƒ:€˜ыW‡‡cЦђгЂ:H„ьзњŒhp`ИZ3х*=‘CсˆЁ Ц‡єa`_ ъ=切` ѕа‡5ˆУњAф#PA#`DЃa(+ЄCўёР YaхуУ†6Œ ’†Тс>L8АF дh",6j Ч‚P‰GЦj4’txбAзБˆЁЧ† т я(†к3"ФB<”x…т‡ТPHpИ/QUЃББ1WhЉQ,Хˆ ‡‰"ойъР ™ ь ъaŒ™kƒFh$ж‚{ " “зЕˆC2@vУСы##ˆq8`@!ІИƒ(,Эј"TfШiPЗ(иNѓ †HМ1бˆЂЂМЄш5ДxLŠЄiьŽ#ГёЪ_ыC•!GЈT,†vU ї˜Ј) "#ѓ„Ч!}@П.8 YБ@Е)4HоŒŽ„є1,SЃб}X’>`1ŒbЦH> …)ЗšСXlЄЙЖvttДfHlM в& шњR]\ВŽРuЌXJЧX1]pнсl‰хdбюEFPŽkF‚­[к`(o\кPЁ5,i\\ЗДЎЮnпк uK–,] nУ% ZУђeMЫšвŸбъ>З1тS­`к!МЊ†щ%'хјŠ6ЦгaрП&вД!З…ІAј’ˆ“Ж>љљќїђ1€#ђQљё‹Kњ—єйХ%§‹Kњ—є/.щ_\вПИЄqIџт’ўХ%§‹Kњ—є/.щ_\вџџpIџЌ7џЎ§…т~qNуЌ5ZјŒ˜™мZ€.€ћіX‰CТ7ј=ХјхмЩЏ^тŸяNђІЎ егЃn>nпASWі˜ў†ЫMП}Iжl’-YjзЌ2§Вjгw—жЃяHЏ?о–#чАŸШxјr\.НР29g^і <MHВU„јeїд"_§ўcВТИ,Щdъ=.ѓЩєЌњ6‡4+}ФмЬ+§щ”#šЪШЊппЖ^њ%{р€,§ў~!§‚н(Н‡_ДЗ`?Р1€W>АJяСпЛ№їŽєP§ Ћhи АрРG6щ_РuIoуi`roЄЗСuI?‡j§мLщ-Ро’ож^›lhЊ?BHU­@МЅЩ-ˆ;Ї~Zњo“ŸVxЇЅ_MiUолъЄŸВ ћ)dўSІlИ`Р иы€НЮЦюx`Р i^‡4ЏCšџ№:Ћ№lPЅŸLB1гв+“ОUоЖщŸЄY.ѕЧвKфџЃєCђ$§љ/ƒ_ ў щ‡“Х^жц„xi\рЛРЏ…x‹ємд"ЗwЖ-K:тё‚[ а аА`€U:&-˜ьѓК!“gи •х$ћќПcЋЬ­зя[ 6ІЁуk^ 8ћЕ§>ЩяЛџ[№ˆŽяžЏ†Žя+w†ŽяК›CЧк:ООkCЧwеNРаёuuЮДє7O/*ѓ6tэтZ[І4 R)‚”F™"тћTAоО=YYщХЛ5U•оёЃ|ќY>О™?ЬЧ >~П‰З№ёЋљx/фуХ|мЯЧŸс ŠqюђЌЧ&?СЧђё(їёёR>ОˆkМС?-•LЎЛ„МђІкА]ПђвњLрБ$Zf]ЭўИЏЬв“ˆД&q~1њ І*[Эчšцњpлeвѓ№yPУѓь]є<˜бѓ žNЯЗ`'Рq€f%ќ~дЛв`|Й™ржДьИр#+Бѓ€ФТ‚Х'ˆБZСt>IЯУпј+‘JќEЎBW•ы2y_!Я,ц]ХГХRЫСл ю,5kšЇўsњПў9йльв=в>VŠИWјћ&?-ђNѓoNњžёЖЭуп`Х Xob>^ ~#‹вѓ2VЈЂП”J_?Yx…œвWэ=Ъ30еaяЇ…'НNK€ўІ№якДТ'Нџ !іўД№vяЫЕг*„<ы›цреˆєHaЃїр "Н "˜єо€оaя_Ўѕю*ЄУŒИ: OўLяfпUоЫ ПіТ^Џ? yіЖ^эm1Љ–ašУо:`ЁЪD+йŠB*ta1eИЕašњЋmїлЖйКlЫmѕЖj[‰Эk+ВиВUЗъR3д4еЁЊЊUUTIej6оS­ТЫйVнїІл“ с.ќЬ н"С~Ћ[Я&> endobj 31 0 obj << /Length 605 /Filter /FlateDecode >> stream xœ]”Ыnт@EїHќC/3‹Л6‘R#Б˜‡†ЬЛЩXŒeœ?pO'Э&шаеUuКBЭжЛЭЎkG3ћ1œы}ЭБэš!^ЮяCЭk|kЛщ$ЗІiыёѕQŸ§t2Лнп_/c<эКуй,г‰1ГŸЗ€Ы8\ЭУss~_єхїЁ‰CлН™‡_ы=_эпћўO<Хn4йtВ\š&я9Пњo‡S43]м5ЗˆvМ>о.ўђrэЃБ|‘г[}nтЅ?дq8toq:Ydйв,ЖлхtЛцџгљœ[ЏЧњїaИGчЗш, vy+(Жpт ‚’“№‚R`3С\рз‚'ф‚gрIА*СZPqВ!л\P„mЙЃдyFЭё) љј”RШ“ЯF€UбŸ@6|J'эŸJНхј„R|V| Т№ ДƒO(јxu`“Ејxi[|МбтcѕЏо,>^Љ->Ž;ј8љифЃЩY|МzГi>œ$ВсSјвЖј”(рSЊЈУЧ*ЬсS= №)ѕ:ŸJН9љф<•Kѓб‹:|<й’ŠКфУ >Žдј8ВсуЄр№ё2uјlЩ†OAЃјЌєж>ЭGПе?’ЧЧiX>ЭG#ёЬЧ)›O>$HПuэё НЧgЋо|šu№ЉЈƒOIj|wю>6Ыхуёё„сє:Ÿ АіТBђQб€з>–0|‚к Eѕж!ЭG>Ÿе†еєБ‚ю[J‹ѕsжяУp[кПZ{ї…зvёsGїч^ївŸПz@дendstream endobj 32 0 obj << /Type /Font /Subtype /TrueType /BaseFont /CAAAAA+ArialMT /FirstChar 0 /LastChar 88 /Widths [ 750 722 556 556 556 333 277 277 556 556 222 556 556 333 277 222 1015 500 500 556 833 333 666 556 556 556 943 500 556 666 666 277 666 722 666 277 666 610 556 556 556 722 556 277 500 556 500 556 190 556 500 556 943 583 777 556 556 556 556 556 722 556 222 833 777 333 583 354 277 277 722 722 556 833 277 500 610 222 500 666 666 610 583 666 389 469 556 556 833 ] /FontDescriptor 30 0 R /ToUnicode 31 0 R >> endobj 33 0 obj << /Length 34 0 R /Filter /FlateDecode /Length1 1492 /Length2 32825 /Length3 0 >> stream xœœЗctdmД.[;лЖm[лfЧЇcvаБmvlГуtмЙљОНЯ9wя}~мqGЊБж;чћ<Я|W-JRuFQs'S )'G7FV&dJJqW  ›“ЃаЭ‚ хjPrђиЌМ|,,|ЌьŸМŸŽ17лЇГ@УлйР ј тъdх tјД‹;9{ЛкXYЛ§Л€ŽwGgwS{Е…9РгЩе`ъ§џ’u4cbˆL]mЬ­,ŠЂLŸHЂіі€‘@W …Ћ‡…9гПŽ–6цŽn6@ћOls€ГЋ“ГЋ…аерцєпp?7h2Љ3Є•Е$е”%•4j’ъjВт’5Yi ѕO kфdщц tЕИ}ff 4ГјкмнЬ №iќМєјЄ§ŒпЦЭњb04A ŸHцюЮі6fџжрф 0З™й;м?Q?svГЖH;yXИ::|&№,Шнджт“с3№Я$н\mЬўй њњЌШТ `щфњЩgујяоOd Ghхjaё/Ф?ј4J‰Њ8й˜ииИYy4fДЖЯЏ"а›сГ<мДџ„цimс:џŸЉ§g?ућѕџ,§G– "8Yўk”P–јфўщѕ/ч'лrqГ| у3s›џи ~ВВr~ўˆ~іФў_rкˆўЇ7э'вёcќг]7W ™›“+Габ§Г nŸЕs§ЇTџM0џ„СЪ ВqЙд? nџMD6V6Іџ"кOрgЅ­l@nЎŸнќ$3Зp~Jђ3пџ&VжЯі}іЦєгн™љЁЫ:Z:xџcљГгџi˜?{њЉБ1Бќ3RДŸ$@s'G{o€Й…х?JNnŸнаќџРџuџe˜ў'Ћ”ЛННас“їџР‰[]?ГџП8lьНџ?Лk[ќ›’“Ћаўкeн€ŸКuДњЫџZДIйxY˜ЋиИ™Y,іŸjўO‹ІЃЙ…ЋНЃ…ŠШцпљadeс§жЯQ5ГsД\Ќџ->GрПPџлЉГ`ўЯиХ4еœ>ѕєf ЃлПЇЫџёџЯгьп+?‡б  ЯТФТТњщјљљ_W†џNвбЬЩмЦбъS…Ÿуt5џп џMLЬЩ рЫШњ2#;€••—РЫХюџп 4m\м-d%Ќœœь,\<џ.›ЙЛК~vј_е}fћПю-m> kaсea†\”†+#ЪšS1ЯDŸuлLшсЗф‡P§ж „7…СЪn–MВт†GTИј:–j|эfєј1L№Ѓт{ЋьёiЄШЁ=ЂоcЄfЮpšm#1ћLИњЂ"JpТУ…н}Ащй (hќ+Q-aHcтRч-~‡!О–sъЬžЂRuzЪIЈы<ЄNS‡fBЛIЇсцzэз€›СШTВ>Б‚АЙ)Кў”Œ—n>Ё™Љ—[нPўjotgWм‹o,f= №Ц84j˜mАFў8№Hы/p”z…из gЮО$|›ЭЋtіГя9ч6sЅьБGЯХQYЉї‹:x!‡Ктnч-ZаŒV“їŽјЕsyZщт‰AŠsf„бƒыi1кЫD4oJjнeBю ћmЬгqљо*йEF’ntћj_ФФ JПЖtДZзК‘Ќў!vкЪ;Џ$g …ЮхЁ;ŠЃ­Л•Љєё|Вi}4Ђp‚ћ#=iU„еп-вšE•щбrZK›Т @ŠC%€A/тЋп=Кž§€1щ_Ј†НШЕихE–ˆmЧЋDgsўу„Фул9 Б~KчL"m•rюa`ЅTˆєC€‘ъZшU—кк)A$`­'В–sLш1„W˜˜V>ј|эRЧWЅSn@эхењї–#яWл%jеПƒ4ЦoxCМA’BhЫ™ъKЋЮЁщk‚Eqs@Џ'№мDŒ3NkдJ'Бб‡Єі;~С…ЉGŒЎрzCT№>џw+‚Фїк™™у^gжЫвˆšXDhБžщ{3+Ж>1)ќh‹TЉэ{9ЖїWX“_ЈЖ,AŸчЗЊ^{€ УWˆЪЋJбРВШqъd<:Ы‰Х&№DЬ’ПЙыHунBQ%гЉ§ ™Њ3гЬПЕ1-цjК›”•5EіЭЭmхfОлАьРЦ аЎю tях+;6таaаярйлЬЖж-:k›<y ЕіЬДbэ0Я>ѓg›‹U“С=wщѕЇx ›Њ>Фў`Dэ>kќ+Кщщ'6М2…Qс…фЬx!˜ež\њ@2d‡U>Ўщ™сњ˜CZ4Ь[я}ќlя(-eъ|—˜ёьЖ~lЁЬЖ4>~!SДТј:h!зєOЊ§ нкІёqЎ"ёН3]2мч{к“єvмRмИUёwВ0siHМџ˜6Фўм aрфa[М€а>!мЂ@^їЋЫ<І“oњЁдћЬ7АŠ$”‹~…ЈОѕžѕБФ`THTБрМШУ”гІУЕё{“r‹[ч"ФЊ‡aR7a{@бПІ(бГ†‰{ё|L‚{р!ќ г9„6БМ}\СљОьлMА•hШэG5>ж\HzбФ$иbl™П^”xЁЄ€вN~Б оw0 w"xxЖ1дКжаќпиG/;и5'єWˆfЪ=PЯё”ЄауfЗxяРФRфХ|(ІZ˜ЌZ №Џ•M)оaИЮxr.ЏГq)tbЎнРОЄŒ м­ЭЙ_2љœс(oР0пЅн,9 j^Ћ#}BPŒgѓs"s‚80„нѕšSьЖ1 цkЇх$8­ЁЦVцИ;ЪEр1Hg/‡9цЩ§}У ‹йПЏЛXCБр4ўN›"…ENСlrџIDl’ОќwVѕк4 ЖFкЂƒќАЂЧ{Ъщ,їжЅ!ыЖLРš5aй“$CЭ– лJ‚ЕI“Г2U3}З%>Ч žсММIј мY€NЗ7tЌПJь еtS8џўЃ{ЏtDhЈFсЌ-9™џЃnХbKEц'єІA{2С уvй›І{шЖE_tQf z)ЧнЉЊЙyрV˜ОŸSm€5 ЬЬЗїE<зНrОЊI‚:ВгунжIЏДйЎё]ъ;Г6юZhђЫЂип\энQПд“gпьМ{ОnЋЂ™1аN1#ы8‰ш7 ц;ЦЪЯЂ­JЎжАЫB…IGV$F’CУЫЇЅЪћ-X BпЕ|ЋпБŽУ+>Ѓ+<§ ŸЬЎhH*}IрЉ.ёІщЧдŒЄ›/>ƒЛЗfр AьњкдX™ЛП{5š‰ ‰кŠѕї†8ОX(єЪv+ЂŒ@ JсЇ2Цˆ~uы+]]…UетX ўж>Яхсф'ёђэ нЙш-4ІƒL)ЇЈ˜&K4тe\Дщ"БП„?u+mрАє`Є“Гтќ Ÿ‡‚пѓќ| я=шNXЛKЕѓ…‡Г‹њA_яыщ^Њг˜`ЪBВПMžQ+}їjЌЁ'СЁ<’(@˜ЅЅДР•ИіЋŸ*R‚ŸЬжЛ‚-Ѕƒ"НРcЁaэБ§]ВЭ‘МгЏ‹ј"Bj˜*и‰ИБщ? [Mw>zIzВ1ЊЫа†а^ыTЂJTеŒЦ+)њгv;/Hўо4…ŠЊ Љп$I ээž1,§qќНzюЎВ"Хcн“*]цƒˆЛє`l‚‰—ƒЮФСY6й…Y;цvkюСB љзˆ*}а ЏІl2K‰ŒƒbxBђvтќ˜г_’S†/ѓПѕщьр-lIDг\D]<*Л9ољ­.RXО2ŸЋbkйЗ Ф–Џ6Aѕ*RіIБxˆ]жт!ЖTZ­„ i,№ŸДЋ•MNљ™МЮћ>Г@wФP­0ЏIsC5}u33Е 1s*d—|Lй^шкJœŸЎ1Ї1иќ7 зŸЌXМ%ъТ YоŸџlЏеR^PGдЩ†Ѓђr!§е1N†ИВtlЪЎ­ШМRЮ1і§wщыPwо’4І“Ъ28AMJcђЯПЏЋ~I{nЃ ~nНЫуќ—хЌЭ-šЦЗЗХї—QG–ыzбœДЯN›Н&М\Х>‡)IП›RЃ*~;m“€яЦ2иqB0ц.h@‰lХx\INg.#я§+ЙїљTš(ruљЙї=0ДЋО{…ПЭ]г8 Л/CЦъЁpmз7`як•+™šImЁ"^–eЉyN§з>J)КЙp2йЈцIЕУЌ[Л‹­* ­К|иХр§‰Y5ЉЏ{М`жXџGп˜Я:Щ иўВџжо=тћuЩ ьЗЕwIfяV•ш›*@оjЧGbsФ{…Їщ€Эї…щHLЛWЦkС)ьЙъОЗ……‡ўЖТiШ-MЯЧGšOJ{пињ[Ёƒ%ДРЂ9ЃЅыФPxУoЯр&эОсz‡™ЌгuRz3С&D‚wj{DЭ2SќК—ѕыМШ\yКкXГОмЬљи?‘i_eњ‰ŸжlК–H8Ѓ•§HсМЙщ7A[p-ЬцщVZ)т‹иC`CoЫ; П™юіЇ’єтПA;гˆ)ЪёXФy/Ж$CбJ|M}‹­чzp_"Ъ8UЁ‚HЧ… ™ž“‰L$зЬžС”ўUДЌЄ|+ље/^њRžѕрјfъсъXydыMї<,ивЮfa‰”рбШ“СЗˆr!nЖpEќ8а’ўcЉ‡ъgLш7M[fе‘ЈЂ Ь>wcBIл‚Сыyбm‚кJzёJ‚edeь“7EйтЅс”w;•)r‘Ё›О}НK.ъЏYћЉ>ј%J^гotТЙ•цo%“ќдЄNщ§fŽЏж f‘ЁёИОQа8§mƒ`ёЬ4 y 3ўЎ$ŠZ­_kCЎ‹6У2юЪрэцЏЖШ/oь˜UеЊп#оtг кФk'pbNŒЎ’`†2WсЕћ —fчО>V‹ зŸ™@їьƒАЯZЯJя]v‡Й•gЭWЅSав?РКљы5(Ѕ’ГФХЦейв1%~:fQ ЭоЅ zŽњBŸ2ьЈ‘tšR%…х—7šу‚гЊѓ68гUBG[2dБZP`|›і/>чБЪkћбп—b+ С‘РпSuwj9žи№ЬЄO>Ђrэsпј—:уТчˆe!šgМЫЃћAивГплЌHй&$ѓ(wn#vф:ѕŠ )h@лВі%mХœ!ЖŠ zЌе‹qн.Ьzк6ЋJит9œ…G9РднeљО~>Њ&ggмх\6_P “aPLЕЫОl Ћ5pг3†SЪцЗЬЩ$Ё˜}5О†”ЅШh_ЕАVОЎšJx-?S?ср.5љ Pƒ”_nJR.ШtЄ#1Ru4 N'ѓѕТОбСБ‡јмЭяГоoї}k>›ЙУр€\рH^‰”\ПОƒbe‡˜€(мCе#ћГ№ ЮКузў фДЄю-ђ/QVљFТ+’д5’фЏ5ЯNѕК‹ОUUдv’ЧйЧЖ8аЦЊйIЈRaHУьAЊKЭБžfПGФ;{}ІСы‰ГXнА!‘LА†ZƒDAюЁ’тЂЖљkeFЄЮРјŽžБ9_бвшЮи_тЩhљ6ј рћf` ИeN0ЄАМz†HПаУ#Яn*~жљиmь9ŒDЈм.шё†|IФА‘ Ћqwу^ПguХP\Љ’qСt ЅцО_ТвI3к?ŒQVЕ•хЊТЋЊˆ+нfM;ьШ||cдšЖ№іƒˆIХNЋeЊЁЪўDN7$)8ЃЛY;аYS„QPьа^ю№/ЙEnФ”М‚Lр-N6НtдЉBR і…>фn1nџtwS]•ыбЕђ’уяk‚`ѕіФ7o хv™Зе‡_%Я6ѓ’—0kоwњ#ЮыЮфІWTЌ”ѓЅ1˜sŒZqMQu IЄЬг §)пш3fс ŽB: їžD–ˆRв‰фгЌB№pД:Т:lC+›ЛЉŒ6нЗэQХ“\€~Э((1fїGPвГ>єЕкЅиP)ђ]І+рGђ‹Ы9qlя3Д>ЫU9C,fŽ-НPш\‹Ќ {я•жYX…uјРSeсœё=ь ј€~нKЄћE…YЪ ђФG•!ЕНОЋц с,]@ВёУ5лОбд U›Щуm‘ шУ;ыH3Нј6Щ—]зy(“2Џ*нєт}ч&к Šщcт SјZ‚X4/д^ФtQчжЁh y зW*ј$кŒ ЗуЩs:jNœЖcя; eдйBАрЙЮ Х˜›–‚•—Йі•Ћыњ eO“аvHЩНKЗі<Џ{е*VAЈQwЈ‡Дпc4‡­Ћ9ўF­ТEі‹кЉK9нv#rko˜šОрЦЫ=kv‰&mХ6 Q жlДњИ…Nѓq|ђ‰ћ9хул fl ЉP’Шv'Ющђl›ъњ•9-Пq:ЉOiИЊсOŠgЭлЙІ…ќ€Ѓ{˜ИŸEЉuЄu:ЧlO;г(ф‚ѕ§ёѓчЭ&ЧЅ'щ H' „ШƒъœЂџІkуС…ш7с\^šƒеЗ“Щ]ЧP6Чmо‘jКРш5\ qоўЪBœЩКЁMЛA2оšКmицF2ЋыН‚е €НFwu,AЉО‘‹MМ68ф>ѓQ™Ѕ)рlЬ†j/)?@b‡„r\ вќккV ];0 їїђфѓ$ёNžДOѕw˜љй}ЗѓWVЕЁyэоА‹оЫЇРиА'SZz`ІP•ёу ь V `A\пбcNaР ђљ‘e›Ю*4И|•м˜BІЅjж\щВE6)'л}ЌЯІа“ Ъh7СДкћвTyeT0цЂS6+Ђo“G<ІбJ[жЊ/+/лp­‘ќ-­#p<цч=|Шsь#Ѓr ЇШыwЇ”RДлвCL’‹CkDЮјсxМѕ§Ж).u}љЦŒіdсЅ=ч‚ЈF^Щ.чXЊЙ‡}‹ЈА}BЁЬЈЭCІК{um)›АCЋsиГw…х вы/8ЬСuЦ"kЬЖX_ИTЊБB\+ЧІЛvхtq…iі•ЮJZVгЁaоoіщ‚ХЈF№П"хŽWі+2‰эEЪИK|{N„o%0_Bџi‘лYŽШняЄ›7[Žеšя[ŒT.7(У[r­мвђd2!L}—„6фИ’OѕЬw_ іюЕž+ЌгРВ+p9yШ§э—nP& &”‡О”kђŠ*BzэŒѓЃРЊ +ƒ§№И@“hА$юќхжВљ‹gM[kšјкc4к-Е іОФ2gЅЯƒbY­л№s-T:DeњйNB3ђъœ-еќ›wJtАаc8b˜W“J›С›œjИ@Ф2ЭЯ*|–vО]:т…lt/61+Љ$"ŠqЊН‚лжмI–кg}“ѕ’Q˜Й0Ь(Р•ў_[q"yяHfЅсРв‹Bm/ю#iи­Ж'Ak|(u›МDКG+ДvџrбnE#u\ŠKЧ$ RрјxЖ[ЎѓТ*Q?me{D+Ц=›XЫэŒж/FтВ1ƒявlтMП‘ЬУБ2]OП3Ѕж7[>!1->Зж)К†ш™бр ­%з:i\Й†žZf§ќŽГюŒт~§ІЗй|БвЙэПDОAѓQ˜§s›hСDЕ0Tj"Y‹0|HРКя†$Є˜)кВ8§офЃ“НЫ3пK"жbЌг2aŒй зŠr iгЯg›гcЊ“VЫТЭ|ѓдNёbT[Й9˜ŸxЈжКџЁцр ‘КП`J^ѕ{sяfпoNПйЩшЇщKъœ ŸOё\^_D|ѕGЖуъp‘ЃЎ№rNїЋя,йfрЯжG>ІВEАCJЌo …n2Е|G#‰нГѕЃ‚іу,џЉh3†—]HU\ЈTГ &њz™ŸашцsЉ‹4ƒ‘~,%7mJ>)•р.u'–[СдB‚кƒBц.9`VRХ„›МyЬdŒЁa1kў.rїn’ѕZ–C–Ђ%ЎГv•}ќзrSXGh‚–ъЧ„ vTІš~m…c-CЬ52УNŸу\ЙМйЈЋЯюВG ЧіžHnœюgM"O,~бп˜uЌќХo>КzZЄуk.SФ€ГЃЖНк§žёФ•d‡Phu!шч!ўЌa%mрŒєЌЏ$ч|жИРв b v˜ИхДъЛЪ)ZѓRжњжЛ'лїFїu‚П0лЄжПЂЁЉЮSу…˜шvЅ “уbmXоN$|b(ВЊ)Чѓљ sТЮК•`cO}(пz Ы9t84wA №cІЗсmУ1GТтЋГ‰nЕ+ƒ,RQ1Ѓъй,g2hЉe›xS$чт™#‡j=‚Л—Œy;цСpы’qТПTx§I НђЮЬ^ž)7гn~Wі)ъЄuf_ЪдrmLYЁUѓлћ§лЦЄjrкY\?+S#q9ЩЬ~яWoьᇂэЉб~ЧiLтЎхЈєёLŸЯјш~nAб5цТНhZЗqё “юhЈ2еЈуRџ!`рєegЖћw+ЕчIЮQG…Ььэнb…Ѓ,<€С&fnЗйО~Єk2ёЉёIЄцч!Aa§npGLeсВ”аRN s*Ў ѕ:]ё№ћМ/шљ†НƒQџGэ\ЙА$й­4iк~№нИ—Віqш&ї*{@.IВЄsQœП.™ЗбGгЊT’yњжс Ђ…ЌЕ6L—љЖіQ:fЈ?Ш‰žЯл ё~rcOIБаX”ЗЖ,{6FњMBЂќУаэ­д є}Ц*S(”!ŠЊНљoйэ­ŸйО9ЎœPPіЮЮім W Сw№Ž/‡БpСBьквПеЙšє’!їЎы#‡/\эsGЉ›эи65T РŠЬЗџ:ЊBѕжˆPІЊ4’б’+фх:~Pvш7хтKзѕф,LUуRшгЉуЊe9L\х$]IErц˜ЉWw+Пa)cЅП&"њabМwЂœY]igЗ"я№­Р}И…T93К’2ž)ВOuЋЮ 3юœї ‡FBш? ЬtŠ[ё]ук-М,r–Би!„ПŸэуsbhF ™RКФ§6]кŽwD6ЧЮ qkі•џ ЮСщ”оs2цЮпŸбŠV1 [-Р—ѓкеШ=ьІr8x зцрєєuŠйыƒ УхтДжей>н—ЬЁŠš@њ9ырqtрЇPгрЛщ‹A­™Š‡rhлuOс:ˆš™YV ЫuTЃя#œ!<їžR ё>v ER$lиEњ@ќзнщMd?\ѓАіЩPƒУИБїЕ?EХЈУЄ{:Ю1т‡> В‡МОА šЗ1{юйlvРŠ%ОзВ+Й_љ:Ы(‰бa`БЖ Lї#Ћ–w5х‰ ЗЯ_т„хy|•З ќ.ЪИg’]%M&7ˆ;(в>O /_ђu$оSђ7єfAgƒ?WЧoŒ`*GzаПлАињЗQHЋuiJ=РAЅ9„ГБк|fl;№SщЕшу"гЪіж&I­Ђ˜ыеS4x=ˆ@a83FЗ/сRN–ЎŽb‚йQkЧОt-џВqp cаё>7 ZЙEсy ^&;zе3RЩв9УrГ“дэњ/ўxТ•л‚ ЦэУХ3ЩкRљ\:Z‘u%W3cpˆђбы™*~ї~O‡ŒN8ЈХЧ<шд}б”nЎƒ*Ў˜ХouЮŽg2f-ЎЋOŽ˜ЕЛљеrг*GBЃzЕ8ћТSФДыqnŸWлPS• №<єьsУКq%VСšЛ$Ор`љЕмЛ}9KOёtрm7ƒы%нш{’ьp7xєm—%#uТvТCH: лF‘пф ИЬSєJдO‘ТKbWэMиSJБЃЪ ЬЗИ@#L*i—№ТМ1ЊЊЖ%XљеG„ЅыЏuRƒ=Yтuю.љ5ЦrzУ"ьšЬ­ЪM>п]йŒ№’j јYм†XЖФЪ >Iaй  хZьFI§ї"ыНм!Э6w:?\ћятдЪqМкъeѓзJaqЙХ0˜ъ„uС?')мн4€гИrєlНtьMЦбžЙБ\‚ЬЂАšEс§Еƒ]ПЉVН}ƒGпЌЃ=5Ч*yккˆ‚ЬьW9;…-`“RсfћнDSьGЖJ+Fњ…:sfkъб]jN8­hД8ˆ§ѓ7p rы58˜8dЎ[еЈ 4BъeтVЖь=%yIy,Ч7Ѓз+йЕЫfžвv§!ƒFž‘!gc7ѕШi!ЗЈRЧ4~ ЄЕ‘. .ц-Ћ-NЕЇ5vН9ўа˜“ЉгpЌ†м{Ёzѕ,Ч ‹&OсM„св08m*›іhџч ЛMFЏ^Œh,DhзaЯѕЂX‘j3ZЕцвФ—Д?f; U~ГM DЖ§ГoЯ!Же\Lu;ЎїБЩУSъYч0џP˜vёІhЌЛ’>љ+|AДЩ 'G}UI{FЮлтПBа˜)X'?єbGС^і†ќщ>˜ФД8ЮT1і ГЯhЛK˜іXЮeP^/ ф”б6ѕhЫ.wD"Ѓš‚ зЛ1љ›ц2ЫХhћуі> ˜Ўˆ•Я)J6t7Яttu ўЪube~кQлKwbх„ћЖgoЋ{lљQ†Oє.3]R! с*ЬK?јВЕeмdЋ†єПж[ХЈЅйжАљFХAЯJ‡л™Y9ˆЇ2Ф…уцэ—Y ЋцNьљћmШ#Ъ@Lиф1Кчв™d—ЎГˆ  NžƒHhэ>9%/й§Ъ›Ѓqq ЪtWдTЅ€VЏЗРУdmN1А`љK^Ц- w>žЫ‚Y.О‚RЎVЄЏœ зQ цХGTђу~;5Ф…€_Ѕ™е‡I-?\ФСШ,у>tŒцоы`ДёСvУ0,Ј %Ўm§Qh!ЪV)@жЗЙs]„>ЬЮ‘:м—[“бCL8]•]чз&>ƒ‹W><1Пч}žƒqгцХѕIі4qїз‰^щћ“?n† ŠпчHЧcAЙрвпŸJчОu„3h9І*5(‡xq#cЅžO5NЗB‚ЮЮњІ”Фy*ГoВ7Э_Vp_ц t;7]Q_ЊyGй&#H}`=“xhЈШт‹gnРif‡хџІЇo|mѓмФџЎR\fрlhуЉЦћwl}јu‹М _Ќs›­„њRЄК"k žvh^Ї,c‡YЩ•"ќ™хёЖЪQcЌ6_'GxKџЅКˆБи{Lх™€ЏщуЈWК§…)=№UуЕ,TЦ–cњh`4xfзxБ<нŠЗQС%Ж;гRF&ТЏ9Ћ>02Д_`0h hšx@ъc‚gPVydRЫФ)пUˆНrєD뚘DllжbА9ЅьХ‘Sj$'ТBaE!I@;-Ю:lNIъzдPuNJQo"Xјмх$$j%бˆ‚мкЬ0VQЇ8ПЭЂaˆСч;;„eЈ•ЫBгШM?-b­QeNыx^Щšїђ№ЎямМбgк2?ыЏ–Иh‹Т:žё2R<%NЦ Ђ&єŠrФіЂOH“GYyД‡­шZччШKтKx:і—ЗнДгЂPїмi№)LŒpƒЎуГ]9рщђ ЕxЗUИšVо_`Ќ—Ш№WЭHD%:ьMИВСЉeJyџ ›џрњнžD0–C}7нЖЎfкЛЯ%”[ТЦШ xeП™CЗїЏч}*ЄJя?B$ун”šЪoЙэjDУOХVЌхfGЦBoЖzЕ„ГєџL†ƒ’яM\9--ЦыqIХњГыЛ*гБ…trЧr§ аEЎќгˆ•П5Б{:RGКРk—t`[AhЪŒдKпCЅ˜œo/иbуq"Ў’йŒНXыжyqiЉ<Ѓй‚єбƒ~ŽQS>tl5uюA9Ъc˜}KЦћnЫ1˜уDЧ“дАdЋгDmЁKЮSсКШњАЭТЅћJ=Y–Аd§уwМ]ƒЩќJЬeйѕ=Pp\ЌAы{ѕ-h†8>|џ‰_Y$ЙNgЄмїІѕj>8н–1 :ЦNmtС …НђКБаЦАb+n[p„РУдnЭšПЯˆ/Ѕџщpѕ<ЅЧ‡шyХс˜хБЪAѕюWœ5§˜_ЙО–!”ƒ’їЉ>—ч†љЌТIN`е„юьѕЦ2&њгYь4'ŠЏ[ОЯ“мѓI,’ЕЛ›\™тV]яћ;/ž_ЊЮ_л kнУЫ6ЅёyЖлы\3L@ппБЉОџ`)ХЂOШЫDаB2Z}МсЛ­ЯтSƒюћ9Tc.Yܘo3Д1x]—‚№Д`5Mзeз5_7kŠƒё„ъŸFЃјnЮПKсжСй4Вб)Љd1ŒQRИkAЯUГ›н7cв€\Ћј“ЧoЩ2KTXhœНwй…O8ЉbЋjdщъ‹EѕažвI:ц5ЕS†TmЋ­Ќ@аЦЫ<k›rЫЙ/Q2кЌ(к‹~MOœѓGЉ ћA§,oЬe[ж='•>НЕЪ_ ТœТ™№ЩnА ‚qїѓejK4vMЮЇчлїe‡ЈДЅ Дчo–Щ ы/Іы ŠŒYHШЦ.СDЇuщуJ &Bјќ™ђилTюУ­б)тЇž">G—”MЌg!хKї(7ёЈЃ(ѓњ"9‘›@<ёAћ;V–ЧВЊZ1…ѓ53]лŽ/5W^ ц†аи§DTВєхwBzЪэшcЂь:О8.ZEVљMœIP•Яњ~`P-GbSЧЪ[›bдx)я6Бg) Q0УЙЁ№K]yЃу<БOФє>lЋиф[(YŽfр„D.#‰и…DЌНSВ†q4­ДW­зr*ењЫEKщ$б“Ћ­RШ_ЁЬ›Ў6˜Ф‹[‘нЄpЌ(э4‡wŒ,ЊlcИУЇХІ‡‹WЋ]qQђo &АMИ4Š'з:M•жA12gVЂ К#ўVїSeЗ№Х ˆžТEvŸa“ќvпB†ЗйБYL­сфBќЂtпbл2‚fFЫh[cbVіb(xл@So“уЇЫС1.хrЖИm G–2ˆ6ѓAМžШЊEьсюяIяЙаЬ:|рБнЬ&шv“wю ”'t’iДЄ\Д!јeнYw–ы]ћйФVЄљпˆцmёƒоnыi&e„M†?е^?зfм“Ђ' &3NœФХ.…э›Цx КFНQКќB‰kWhў.-оfЌy ыЄ‰”UУ:Yƒhˆ…<ё:oкŽо,5o=Эђ„gК™фЦж:}И‰A…Рб“ўђH(ODъ К9|у*А5™Є5VˆЂз0dЎFQК~ЎГзQwГШ+”|хlи-AЦ.IˆЫIн~ЁФЊЦмEМ–?іЉЯљjaЕЖ@1eХQXЏ/t˜lпэ п\bєшЊЌvY  ўѕ€ћ‚0ЌГЛŽ%Д?Љ•рсфŽжo Вўлзœƒ252ШђL˜уцk˜_|L6Ы–DЦ:4њїy4F‡л~?лнrбyd D@bвЩu–СК•И›4‹юLп3aІХŠ\љ"ђž“OЊа Л'gфGФHA;ЖPхЁIU ИTмФ3f№шIlЋуЦЈ:гXц‘11~ЖeVд—iR?&п qjT€)pQwz•Иsх:(NRь1Ѓ–{…лыЋJgучЋ XЯTa№&ЩKЌsЋTЈ,є”ЏŸШЙј6Д!˜ч9vшѕHEєфФm2ЁjДha–NътЪv-ћ›r С/—9‹< нЊгяП6 1SВo,Ќј)Gk†*}Or5x’GBЪКВkЫ Uя$R*ёЙјmХ%: ]–д^ЙЉb}tVP.J‰0^Ў@’хРП[5>hіЁжД\lвLŒўаˆщSZш&GŠ(ŒYƒ ކtЮЁv9ш]М‡6]!ъЊР lgb?2ц: tNdЈЬ—:AйыSЪ9„ ]ЮЎzšљВ\Ш90{ џ­бSВЩ2Пвьv$э•Ђб -јР„Вb­эŸеzе#yОхG ї$rM+мŒ\{‡;СЯ‚IЬ•!ї К>V;ЛХng?ќ&У ёDu…@Я­]šŠт`о=№/ЌrђYХ|L4ŒЛKчИЌEтЄћVKЇўQPЈ›їн‘ЄX /і#sВИ3мхрвИЫ<Фљ /яЕ}Оцqˆдж„Ј1ЊеђIфŽп%мšџk–НАёCWа—ЁЧсЭс <ЕЁ,“EžiЭ ‡jШљ =ЖьгЩ{rЭчІ'ј|ЛЬiLП1.g•5ВSrvжсХ’ЋyѓщїМ[Ђ^…Ь‚uб’гœUwŸ0њ xK†ƒ–!6]RШXSњю88§Кў€m†,БЊ…гJННŒгœЌqʘ‰У"ИЉP-ЉЕЉ4Oїo.žЮ=љ5НТ@vЅJЂ= і‰]ЇVѕ<~ю‚гјЅЃ‹кщhЫ}‚pкр#x7q’•]–ŽЖћƒ}Ч~ƒг‚чv"‰Џ‹Я1КФЩœ› кvs†ц>ѓ&p+-UY7$~№Ж™ƒИчКMе+Дu‘3А<ХkŒіAКЇ-'цтu7ˆ+2-bѓ‚ћ‹xЪ>OЌй+ЅoEє\y-‚єјN5EіKuf'oёЬиЮYЯp'tШЬM8a†•О8џFќрЏжЯЙлŽ>ы v|\œDzy’SЬ9АуA)йВM$%ЇTЋ ,Ѕо­тqYw‡ЇЌŽдSи6`^Š,ёož?")ёV’ЏшюД4'JhR Ћyе ,Н Ј—lЙU3sРDФ‡YДšОV,р‹ЌбЖЩmHмкIАУЯе'gHяB$#%сбЅ/бГ{ЏI@|ЇaЃ‰ёі бЁw9LpбшFrMUЯЙk ~4'йЃ'ЄSŒшд7ZфhвD,ИєЗЫ^Ж\Ч%є№|ЖЗqН–•х!+ЮсМtиПюAѕ_Ÿ$I\lBВІ:gКрј№œc" ѓW­—sYЦЃV5љnЎW–}ˆЊHS;И  йУ#MэEњРЈfQЮ‡4Въo'‰sNrюM|6эЮб8Ўшй‘Яѕš—%яPоќ‡™=aы ЊЭЏ~˜уЂIЗ…eЄ U:dŸ{лxU[UMУId)ШЫнЯл0sс4ѓ:Йщу–rxЄЛ"nw˜Y,#:2ЅС‚UЩУкўдaп‰.пeЧШGyEх/Э]ЎЁfЂпAАН xcЭ>ї/0pF|Ы&-”Yъ"CПЪЧлдmWœбш#ЉЌџЩGqBXBНжmЁ1! ёg†]W№–b_аTд,<ўУВ5ТŽ%z8бmтЖ`К[Gс|š+Z-wGэЬ††‚Й&сUФЭgуьфцyш ˜ЃaЫЪ­oq4…ЖцƒІыџt ђ УјdgDВg&нЧОв•oОЮGэУMеАсЌЊœріИлбВ0M~Ьс№ЉŒ`kM/Бv^ЈБЇсcРPЦ‡‰Bu†+з—то-ЋŒтЫЉќ4‰­Л1СО|K‚ЅЌЖ˜†} ЇХЄЌ д z ‰Ч‘Gш ЋœMяŒt\HџщЁh"ѓз(B…‰ƒ€}м?зqі1оЊим‡Œ”šБзzЃqЩz[8™Мю–х@Н;ž WZQНcQдцћдЋъємPП†цА#ахЖЁ ђ’Y*J9™i;#0ЂšжџVБЅў)~lžСRЄњж ю'—%•юHЮ„0єлЄAзбz ђO“Ќ0‹МцXHdQR оAўЩхiЃуIwЂ]ъ!v/ў;ћ‘ъ_uЎН`‘%ЩдЗ? -ДО[•т Rbo\Q A>~ТгУ/щ–ТрлДѓТ.$ЩЉЎЕхŽcЛу‡яУеiБД“Œ::КK~&ЪюшМZюЕhh%ГЫ,ч ЉпОWњy<ЭЪ9GhЅЉйЕ{лрhф5‘вЌpЯ2љ@ЅjGQŸЁŽBўxVqофZзђ$ь<ЃЧhЌ•qяZУЎyvРИЮ^`<ђ]‚E' iZёѕЋтк~›nІE…SьЩ“|Ђб$ФГ+?AŽЇš•JефСя;ВЄ%)bщNыојƒYy A}ЙƒžaU№ЖЁіcоцыyBwwј%aad&4jUЭЊБ­‚Ся ГСэђ/К7йoДEЧдю<<Ї#Ž-жЧžУ­ЛLpPІ‹ОN•Ѓgт uи­ІЉ_/P‡™–ъ*–ийœітэŠП7ЦТјœ,]8nжФtєд1[ч+š? BЗD=aјLп TЄр-lЭРŠ"Ёda{ЬўЪй ёВ^ЇUЁjPОЉ#.ИTЉШjXг‰šz˜ЏВЖ~у[цOј;єrdп§д$ъšt]нКy7dXї4ЯЫЉVф‘HпоќEяиšŸ§\/рН7іNяѓдм–M„Я?ГNjmубБJi%ћzиnsњх\‘юœп‰ŸI5ђќIІoP?ќxвЭЦH+FJNХсХYЗЇ э^‡@*чЊ &9ЭэО<ЇЙ ЕШKўЕѓ1%“зmBШЄВЂŒЮуq…GЉДкрЦD@g-j‘LЌ2k&с‡ˆ™сф‘ >ЕaЯшQЄвю•z9ѕщЫ­[( шo~„дяdEТs1 xГ<ЄЈъ5‰dі,ф%"L ‡uJI•іпрбЩ=*o€лўєUэMЎnћp Dя—окЁ9ГLёйИœ№|_ъЈ/^i’nЉ?ЅUg…Їѓž‡РX„сУџІ'ъХ d мaеkPUЅнџRˆ0 dурКkЉV/Rh.ў,‡oЧМj ЁOd6Х4YВХT‹” {0" i0р !>Н^unšсЄ=СУТy,-kSџх$dIbcƒ]˜CћXz-Kтєs†_фkрџBŸсjу‘UˆЊк Ђ­C!w."єxЛk4,4ytа" ~'о>ыY сыwpYхSлб =Ї%ъеšIiq“vY–№іеШœ…MќХx{юьhЈ2 НШЙOЄйŠЕGѕзrыъZ/тŸtЭиу‰mŠNЕRэЧŠwМRaЪиї§l,f:Щ‚р]‘єђз(иЎ9Ѓ—<эёоuС+#`2ч@.jˆ’пцhПЭ}Ё`жCСЗx.Nft:–Юyч~Ємп…2šЎ{Гeџ`Œ~ їЇ—„эзГСD–{\Xе—ШŽ >žЭ\L–љ ї@ /иHj Йб,'TI™ДsIїуХjцц%œќНЄќ€Љ!Њgq-хx­Ж.6НіЌх~в c\:ШkЊтїШћNЦЭ1жЦЈa?АТДiDЈхѕLтr<длTФЇbдАЙE§є-pуїЮDХžu3D}ДFP{ЕCzљlќЌ[GЂ$м9И3гT…KWYи+ЗыFњЕТл‹О<QtrыЮѕЇ^ц йWфћE–Пњ<цкгY-g*ЅЖ%њЙзыЉ­Ъ„ч dЉ_о0u‡vqˆжцe„yё›ЧRвоQЮ]СЎ;gйjуь‘[’%˜юаJ"ш8Ч}МФН\@А"ижјF—QjAogТуz‡ь4Б: \'&АЫeЋЦ,4л№МИьШЪ№ЋФK? —u1–9ИYл‰MЩŠ~О}p’q0Н" Ќдцю‹vќцЈЭ‹ўюяЛ-ЪRri=SŠ№лW–нсtѓ[му ‘I=fŠў9ўy@Z‘аvИ<ЉіШ@U-/ђЋ‰ …pЪтЇА‘вЭvєф4Кыeр[ЮШКїйРЦМDžцŽъ~НЎ™3ЉgОš$ьдЊSЉ‘XКСЭк0р€џ ˜глАaА*§хu9,Z-с…гRLм#lŸ Ÿ3‚6eмЄЛ AєМT—ЇЛ$фП9ц?”)F@PQšјкпмyЧ/Z5ЌЮЋЇaтŽ!Ц~.џшВU—’@8+Mѓ{{лпЄ–p6Ъ2—Ы jAћДP”•9wЖ іЇэu/й <іІŽ6q$rЄцЋЖЉpYїDЇ6{Ћ02ГЄЬy!ВЄћФYЉ”kьІ?_ёUcн3žЦ)ЫбŽZД,|С§w+_HаКw§о ˆ>б6Q9` њl‘a ЛВп-ѓ7М#љ(‚Џƒ2vЮ6јЕYA’шŠ4г ђљ s‰ёhб{zА_ОŠ’бŠќію я=Ж:›Crвg вd‰ў…дBћ Хм!AžІфFzFaŸёѓ!љ nЉоІбтžЯу{+ЇнмqЏХf-/'—OяБWv$_пжƒnѕfBLEгвя m‹…LС…SpЁџ@сП@]=% ЛўЎ‰IбП…‰QАh@І.Њ0ЄƒO(эБ.ЯAіЖсй>"њЖБЉOљј%ВиІз>ЧaЋ“мAЕ9u™AbЭнКдАwі,ІиcnCбEФІ См„­ЄщЃ"њŽЉœ‡ХЮё<оЩї…YЛриЁщЮ:'5Ž­=ЛёЌ­ќtFИI›пpBў:QЛLйРіFуfхpgф•ідр8еЈ)нЕ ьL‚эЅК€Ч?PмТxy˜U3;‡#;O|XНRЕxYG1еЦвЭcKœMTи9ЦWњЂ\Ќž дЎ ‡œšuTZруЎѓЮS‰5дгˆІ4FcћЭ-ёИ {†ac2б(WС\еч‚ŠTК‹к~F.п˜ZХCŠ1ЧХ`m3g>Aф5Geh"–ЏЬ&И#œЈ\šAkЅУXВлK„?§CтV€yЭЌў xМ(В№ЭX~ЋТЦ-єr?#Ў’&њЧf™4Ž›ЂоДYЙД…З`АгNёЕyмМЏ Тœ›а_ХЩMђ2Љт@•бВ”Џ ЩŸnщ+”№Ръ хk7…19Кїћ–BѕЮ0рЮ'œ•PM}РМ*•mйгИЂт†5Q№ЖСœ42ИоЖyЗZbНo‡AўќQпЪЭ:ЛГ“Ц oвR#Н йB&o,бo&šИŽxYЌЪђa‘"Y‡W_^ й@йg{оŒBR3ЇК‰mаЋіЙE1;ЃEOŸЗђ”ОўžšЪlnС$Pы  $яHъ&РP _R㘠>4АN){>зQЄg(wЕ№ЙG~o#@Ж:–ќ*ѓ№)FКWаЧjTSWђЁ&~ЫБ§МЛЛИt,b>фYt WqђлmПežЬ/<Всjwќ)‘—E[šЖ…=9=™ЇевЬkuvОаNg^a0;і№Я№o„”АŠƒvЗ7œ)mv]#!з‚ђЃt<‘‹Іk?ЫРD|k†‚oГjКвУ%рд‹qi››лIЯjLI^Ўж vёœ`2ЂœќI)6ї›“юlЫ№хwKк—WйŒqк\M ƒ\E,В&Ѕ4п@“ЮJхqЅпDРW}Ђ\ЋКЊ‰#ЫЖ+r­­uНциev ёIч…[7rй яЙ’пltlpа;T`ЮДпTYДхF№?НšеlYсf з•WFƒ~‘TzN Н€еёC‚,<"<§УŸ"‹”UwZэkD.ЭЩ;ўH@^.т8/Ns:ГЖb~ЇЕЮз–IŠ‹Йžm„јMT ГѓyœKўЅ9’ƒТnAtNдФ8vЮPn^џIС-€;Т:œ™#Б'К]~ч[оы/T ”yжЦK\›_ЏGJzAކє{лАНѕMPQ‰x\ЇжRЊШ,!Щ—„ен›~Л’пђ}—#}‘Ÿ™^ЩюXPyŽАF)јbR_–0='bБ”QˆйѓЮŽHFнˆР^РљЧ)BТ–y"ђІЮєЧЂЂЌ-їJ@•p!-Ї%€QСs­1Со‹єЉ!ќžЙVfЮ7^›тЋ63Iс%aЗх@ВЉВCтYƒћ'I6'wŠ<œь—ю­ЛŸ#bu); ЊМok@[ќЌЉяЗBм§“в№oШыasќV%ѓ1ыъ$ћ‘ї—\BKd—-”&МSвjЅЉЙLKрЛ<№C/‚˜&;КV=МЖлUшќh:V!до‹=<ц-§Чaџiz”Hh kдскде`‚SьO sУѓкsSV5єˆƒц1Їи#‹И] іƒœrј=ЬќXНмњК,*[cЎіž•;j‘[ІЕŽ=Ћƒхpœ mm ‰\RNЎ#O—Ua5ћr4йў‹šQчкО!g3Ш<юs`6I=xЧ‰ЯЁžЫАhЮсh[ёхв*/гx?š <ю’Єўаа^$s—ЄIШH–О•ŸRпаЦb ‚АGГM#yЖјГh]Єѕѓ…bwќ)„В\Ќy‡ ЛŸўКФ™оf Рjм‡ZC”hѕрС{ Ю"BгЕй0ЙЗЏФЮ‰ВВl€)bзMДЛ7Й'ТBђбиNtiМщ:J‰­JмNš§ˆ2ЪјДѓёЫк ‘—ћ 5hж\ёьŽ}жЧі”–ЫЇ6ˆиЦ›–СIseс\y!ЦtБŽHME˜%ЪчЎožђ:9O`ІEШbM=˜Ÿ>іМ*\ѓ№эЪћ?ї(Ж“уž/hю\4h1ў’<бtЌЎч9&ЬьƒњCфЩЃћ ї 8uЊзЃ’!РsYRf7А’m?@BfG*,{6Vз,OиН ўГзIВ?xpZJЌˆ)ылшї ѕI$)uts‚Џ/ВЈ@ЇWц@DЖ7‡*‹ )uƒ88 sAАGˆ“и)эзѕhчmЕйтЗ~f1­1˜љT#ˆCcЁљ&Ѓ"2ч‹`ь+TљЩ Ю4^,\юЯMїРkb•kВЏЃqМ ьќ бfЁЁZ\šAАOьt\pпЄЬЏ€рxO№Ы” ‘Њ'(БѓJ͘9ћІхз<6ЄЅђ9%*OшЖ•‹п|]Nл gФѓИ•‰[охЊ€tnљP№Ч…Оwen Ь“Мфе5Ё‹ ЮьŠНЋyŠz1j†S›4'OІюY4ь є1–ЂNCНbыу1ЮsђžSъ*љobљУKAUПa0ТёoЖ№ЮЕЫЎ1Ђы—„гЪЩл3W‰ЫtЃ GPЅeXсzBХ ™№@V*œ(ќnъ„эк_Гт<š(іZГ–.сj  czіŒQМЈ'F >к[ОУ›„8иrdїЃє"Н<РmwЬXw*И!‹йМ фC˜2YjуŽv—bћŒ ж-h 2ю ыЛš-^ЇЃС§ёp"І98дОšље№ЄH€РьоPмяЄ†ЁњWц$6АŸtPц+PgG$YЦ.†ЋрxoОєЫёЏ0Dœs!ПІу †п-Ђдuƒ7 $ки‚uьJц‚џDЧюЗžў3SШф„b}mЄWœGeзБй…^?БЧтF;?Џƒd˜Х1KЗЅ.‚ћ‹ГџРвwoл6Йф ›с›Цq–‰Фў$%s!|~@RД§ъ*8ќ<‡ФЪ|/sьќнЂх юWПјb­Х;В•џ9хф.іЫІ&сЛ-ЉёŠ„–тє (,;л#x ї]GЃ>EЬvъu’)Л >4nV№ЇіЭЂl_ФБzš.•r€ГЬР—ПkфŒM0Т_9и'‹2ƒЗЂz>ЭУJm;‹cз^~iЛёŠв шW7.wVІ эK`ЖЋРZ l>БЯAXsэYK –”0ѕ№WV є5R%q8‰"ЖБАЋ„BчО=ш1МзS!kж(Ѕж;аћЭhЦДv]NBm`„Т=g€9ЗL~(}а:Щž•@VїƒQнЬШЇуќd+ЃмEйJїB_’}сЋ„ёŽѕ”§љ\ёуl]ШЧ“€тЬЄ~И"ж|o)эd†фЉЄ\ёКМІKbqG‡ркI\4‚ЉИМѓЏЮЌ–єш;ф˜ЃFgаŒфЃ#:онЅlyпй’KХzfsRd‘†я ,ФЭ–Ц&X<іIЬ"CQјMY9Э`Ь@D-XУЛ›JQжБlŒ’p6aихvKrob4-,ѓт’ФvјЛќ#•к ёElu$MVІХ*хкJc›eСW(;жјŠSЁuy$еп$3Œф<ѕЧ#Ѓ.PЮ9e 3рь“ќ P~{Šџcдљ‹Рb(шэгˆ7ІіlгvšlM>ЊВв|ъ‚ŸCfгvцnЭz>њ№C8іф{>C2Ћ*•~ФvЂ;ќECMИ URj$kk>˜ Zu:mЃ'k[й=h‘ђофрМK;§5pіDzЂfќЎ-хјЉ-AБЮтx Ј“Ч’B8ыКсЁzXЎ2•цГ~Gq­Ў}•ФШ.ЁTь,RЯzXŸЯXˆфш=йЈзЮсž3ФР*qЇЇeSkпйёDŒхuBйд9ЈІФ˜Ё#ЉUФ[]ЌqLАŠЬ}Nœ„X’ЫеЄTЛC<'„ТђЬЎКuЊ)œ Ѕ‹ЯF2У4{:?ДVГ8|;?iМЧ1ygEŽ|ЗraнЈСИЈтаŠ|T’ zЇMМИОаєйˆбX‡=БpА.Tm†ьичЉs†hЎьнжЌidё€Yš?ЌPЈЙc€6}н  ЯSСБ–ч‘‡qэбкКПБyFAЉ§]Иs‹A ob­Ї&€‰Эй…БDР:GГА“xЇ$>ƒ•€аqхzИxZcп›|Ў['"mќ|Š)"PУ%š\1ŒЪ!И„[дќ1Y *Х"йд2UСz„ˆџѓеUг•6œ…8T^Hp?ЌvCГ ЂЬо ˆа+%>wїOИ dp-­T‰lШйp?;S=Е” g-оY,yзБЪ.ёЦb{ЮћІ—/jчЦ‚гЩ"А^рTc MТ”‰–L}j#ztЗZ_А|Z6цjУSѓX5 Њ=БнOˆю…Иѕњ"_ЯП3~­Tƒ §НЦeЫN6|ёC/Љмт§]ь5зg‰ъi№Їд§I"t|MQj"РХлf7Мя‡у4M–lўхі–юK6g)‰*4пD}0GbАbљ/шЈъo€жЎїtСŽ…сPщ;ŒŸ”юw_”4ж’е™Š#ХЄž…6НEa;ќў_€`рмkЦjЛ;‘c LѓŠФwgэƒmx”бFi"ІŠxџРn~АђЌ=%ЙпЁžœЉjYбї­eGŒdL‡№ћwXДv…a%љ ‡^Ѓ*Z вј^lЏgСвСЩ*Х–qяє™‚xsvb6 пPƒЭ|]/ХЉЏбрqфjSI{в€Јѕ_]Ms^(ШьIлїЎEм•YЬщтlъЎPR|211Ж'  у7 ОЅычcТЊ=ЂBE:Ÿ->[ЯkЈ…1;щshФ­mrЧ™куФ|7*Ћ™М:Љ Хя!/№в№жЇngжжЪЏХ/›`Л§ŽWЮ ЂМ уШ5‚Х” ~сЂvЕvЙIЙuќсљШAєxКйи‹&ЌV‡sŠšгу9ДЗˆђюцАсЖNАбZ4чЗкT{ўЖГ3 Qў–ІќYy]ШЬЦѕп“~№]›чіЗвЖ–9?kєуЩTќМZ‰Ÿbœ6ѓ0зqН <ТeЅЗŸЇEM5­MoТФ ФкЃЅ‹B}Ф"м‡l‰љгs‡VYƒŸВйъ›cŠ| 4ѓC+htq#ђFДќ”їЉkНuђZІРЏ…wd§0Л’;‘щ1Ѕ,Бx ŒофЂ!ќэЁTфrnIтѕ_ћ+eОНџЖ›аyд——nСЯє$й\%Q&п‹:1А Ђ4<„O уsE'лэшItЩŠ й;Kг%Рy5Ъ_Dhи<ДU -Фб\ПДичj9?V!WЭёa0#iJ˜[яШў В8DRkа ешЩ0ЬЅ%AЦЅTЃ:Gž%м#ЮoнЇXЌZh*~ЖgF Oм98ЖйЂ50-ƒt–kDŠг‘шйŸГОiLВЋ€ˆџB†oˆšczг|L; RAZL€р[ŠЯ‡VхЂCчSФЯ7§wп锉6•ѕ]H`ˆЈєFЦ§Ы1BD0ЩOЙ$A^Рєђ П—|\зXQЏОфК\-нbЊС o'cˆЊBЭVєЖsiVtЏЊGMо~xО\У№š9ѕzˆДKЦ„ C[РљБљEfФ%cвBЙЪI€}5VУнђ]ГњЃдЬpUD82тƒПА4ИЃN†Kn0ч*^Ь=cš5Ž€j6яŸ ЗcMqe<Тœ[-ƒЗхЎh(ђt|TдКЃИї3ѕМž/kє>№3СЈŸ *„Њ„ОЩZžч=ъ …0IŒї1'jЭђ{†Žёпuђ’cёA&ћ<PKяo…ЅEgХZФS\ЎЌчЙ ы"Bq”j,{e 7—šЧмнQ_ZŸ[Ы{ cвЙd> ЛЋ:ЦейС(!t> щaхНyUFF|Ђ-‹ъ$.(<і1 х9 s{ZHИ/(4‚GcШеТjn ­а.‚Ё6ёWЊW§qy“я n“NаzЭЌ8Ћ/œ.љJ0і o"ASії)mУЭР NdЁ‰‰[IuІw’K>Ь‘%Й“(Y80H Rк= žЬаrФмGѕx/ЌJ7HЮ ќ“ ~ЗEьJ+ЂЗ•~ђFuy‘џЕТO@Эѓ“ .QГ‡Е}ЭЛШFCм#Њ&6Ћ&ё.6З‡Џ‡Р˜"КЙf|єДZ‚€]я:•ЗzQця‘Лxѕ3MуZnwТцL%Й_Џ^ли РфГЦipцDd'•G Чсы FЪOА‹п{ž”%іIkžК”Nb{LcžПЊ]g—єъ>ѕ)N„”RЛ4…8ПпЏ й˜ ›ђ(A$LNрЬђ\tmŸЅфZо_Ыd;`LЂAд\ЉyУohЙШДо+HHМ?ЉЕv}6Т>^I‘1ыЇЙГЗћ]б_вфЋБ$1iDžJЕ˜^!5”Ї2luЊyc9хwЋJ0IT~Ђ;cТ^IŠё—_3шМП‘*БсЯ;)WЉŠИ™Ђ3гUŒOКМZМdШѓь‰‹y"KТЈvIдK}ЙО=7b"+ШmpŽG#fыkЫhhqс;{”Ш3=†ДЖ–oНмрl;уіЪКŽLЁp дm%`ЪO‹Wђх`[%}mйuJt€JЗђиГ‹џCБтК› №ф9Ц]!s,sG|.ЛћЫ5xљCоЉ SсіуYуЅёє}RyЂ+XФdИб‘сЪЪёo_mШ†:мюѕЙ H…и™ oiŒрxхъР•›bПd5Ё†Iт“SЎvЙ:}ѕhwЬ/Сv9S(н~I“|ЃOЬщвXsЃї8#ЩŠццVЂБРlЈЏСde”ИШЫ“L=dЏФї}yът+аЈ|Џ*”јF% ‹^[q˜э„vIЧњZ>Вѕ‘?CчAVИ–jŠ@СњBЫцбsƒbјmлh˜qœИљMuГк@0В‡ађЅюН2kZБћ:RГЮЊОЎ€‹ДвM‘‰ Œ_›ђ6yТЬGcПжY›fї8рйвм-?сQ‘|އўPkАл•о(с3tzЖрТЫ~šэMЙх9иh6[&ЩЂиЈэЉ :"нm(A r•yk+­}ˆОRТŒювNdѕўѕле}ъРЊ+ЏўЬЕЉЪtGцШ r‚WEўршP3*АsЅіс Z9Ёоb‰џ;Ќ4j7%PpXœЋP. E‰ф‹–r )ћ,J#нЁ|Xњ”…2фm!:QЗЈoЈєб{Јѕ| Лo,TЩlяМz•‹ЏoI,й\„Li4ёъџKcч ŽЬ/pMYvE‹ЋiЗЎiž=>Ж—Ќвz(ИS!ЇLЧР:єЁO ЦЬ<ЉYMЌ VH€бтТнIйјиЖqA&kКњъ_ГfDсLЊ pР&…>Ž{7ФPyаШXЇm“u’_‚ЩvуЛ /7FFbГšщ.[PNЉІ-OЄDХ Еюф8М”§ ЊыrXУХєTyL$3•СЯХzїв’MS3\ъ €ї0K3КЈѓДфйгWsёgžПЄ› žvЈ‡`Iа$<МЋT5ыљM‡§"йрГP_СŒЖЅ&я…§:hИВ !–У42љ<]R#WЯo_А #Y1Д…~ћЋЁBКЭ‹vџD,l'ˆа"\ЌпехC@Д0эжІ+= ŽЗ‚FнOыѓ\Ы[ЫE)%>ф…“U‘ъrГН~_—]BШ„Н ПOк^qNІOГ~ВЦГъyk_PЛTХ wj4ђВ'г“ЈeL,МЊˆЬмБyо—н/‚8lЛsE€-тVїІnзŠРы‡х/z0с…Мб.Є\б˜)ЦŽАgQ9тМжОфTK[№саBхХнЃх,ёЛцљŒŒsљ­[ nдH^фEЭ)бц5яЙOвxdfЎ,Uщнoœ…ВfКp№?yк1dlфѕ Пв§ВgQzТйТЂ ]8œ–ЂЕN'ŸЛАв/Н8ЮсueРZтybшѕњрпЋжЏWћЪЅ#Ы?1W&зБ!dОЛ)фDKHюКŠБШмЁ•)ˆ _ˆ@ЮЎџкЉf•6кѕGдCcv—8yГојў ЊН№6?ѕsnгщa сmFˆдТf OL]Ц^l ib’ސgž0 |–(:д0ѕ[йyЙl[ j"?„ЉrW™Ѓ ОON+Mgз›>Ќё€ЙXш†S+DЇr)Ќ\ќŸо`(Љ[МжI мœШќ•!эI’šDуЪЫы6X/Кж‰6Хз[пMчі~–hЊjO\LЌЇA€-ќPm мmmЗ$YŽw=и FD s3˜§+;UЙƒTš+жЯG у~ыB› s‡†?zfб3шЇЊІЄY6•Hы)Ум§Њ-pS0G2:NўИОСv;KEEЪ;ХМAЃЩЙ(A˜žŽwBГs?85ŽћUЖW­ћHвtўЃЎ†­TЅxі;ˆŽ"qЧцЦэ1ЂИЮА\RЎšЬс‡œЄЭаl.ОЄЇ3чhзц:ЉBцОHBГЩГŽsЈћW!oбŽМwчjук­Є”—Y R*h_nœп№—МLКяѕVJєO€[@4КNъ ; wxАЉ“]C41SдFЪ*2pыtaТiЎ&\š‡l™4аVЫо этœ ƒ4].#мGЭ“ )@Vd žЗ•ЄТ‚Йcэ$љ€ˆhоy‡Œz^ rљS\р§ыђ2вЇŠАОXlˆЊ*дщм%zнTl˜њ Ўjш>ўWŽ?Y–А+Ukš`вЙ+шЬЌ{„d+‘lQ{їь'ЄЕˆі<'уN Їт†Žz=iп |:іьXyЂћœШ_BЮaCц”‰х6_vНгц(tнз')м™іMG ЫM6–дnQcGg№UЂ‚р>„*,ЖA5XAњ†›eя1yоtq`›w‰эzр zз1 Gn€ѕЬу‡ўвœоуXЎ?јВС%Юѕo6ШщX 9.ьщмЋzQR„~О2~9TCŸ‘ЪZ[d§аі‰сu6ъIkXрђ„_>ъМЧЗ:лНŠзG‹jб’ЋЮ‡u^oИO OЦ‚Ѕ"?Tsч§џUDƒ›Ћ1+œ‹ WŽ$?wŠgДЦіYРРHЈ й4№CЙržB_RЅ?ЭџYј9УŽЪРЎ2H*v3i$ЧŒw8up'i}Њы(ј  ІбyПб0Ќ‰Ѓ!БrcШ=џšзF8ЄGpщяuиQНдЃшџDk6b"Qmždcѕц‰ЊИS.Ше‰хњŠ ѕП‚BЎЏP‹ЯЕ№s}Злгe}ˆoыКƒcмэюНЊЩЧ„*lЬL6ЖЧ cr”GжBЌNpœ)ЩћЉ‚џ=—)s A˜Є2СdХmŒDBЅ4Э-"'И8Юч(žˆs›ЛЙbЉ Єн‡Евжжяћжш§ВЅK[ЭY*‡Зqм62‰ф8™в˜й'^Ybj:†5 кШƒњЌв№ЃЂо <ћ+КёlTЈре21О„gRR#EёФ fлЇРrОˆ’ЦюУ†’TlVЕ]IМ/ъvYeIпДCErqќчШЋpWѓ)­ќ:юрDбК`@й|Ÿ:щ~Ќ*в^ ˜'šЈеEhЄš2г}’`ЯКeEПЄ‹XЬiџŠKŸљТЋP‹›c‘ьcvЋЌГ шр7ф B€'&І‰в мГчѓ-иъE‹ Щ ЉЗ@:?Fж-ьЦ&W›Ѓj–Ym…ЎД•­)Щ•J?ўH’Зє t$( XіsЮ 0нMй­сB(?QЧHВЉ†ЂЃњ<НmIžдsЦ т Боэєm  у@цНRЦтЉ`&ЕW?dгЩq-fxХНю` г&ЏЉЇž1ЊБkQ ЙЈО њEšeМ@п)@‹r:Ци5,Щџ[PŸn‹ђ#ŠЈƒ\пK, т‚х-Ш‘эUe™a†BFœж ЧФEKVбжЪв"ђЗ„ф‚/SK-=fC`уДеІ—гˆ„S}J fГ}в#ŒЛIONЏЛn­Ц€6Ѕ$wМГ\№'}Є&е ­.k€|!ЏТ'ёЗ1Ъќ=.wфђШ ђrPr‡ и9оmYEхЃ(ЮJХЅl…AЅб$БZwLЖт`M•иЃuИQ’Їе$uƒb5A’f 8Љkл DŸ аhнžkŠеUG>с—†ŠњyхUz{[ъфбУ™'РИсйФa@“@у‹1%­ЮЧЋLЋ)—Хёп–ЌŒ6‘O^Ш‘c=Т"‚•ПУё-Qp|Ђ™8’ЬLМЇ§ѕјК8МнVNqt]q<ЙŽў^кИОл#јIї–иm­)EрчЖœlNлјМин-€aQ T sv"„ˆ~Ыѓ–юТУpz,Уfа1%ьлІ8]"ЇVЗN€ЉƒzF‰fХqLу\Y”БLhЄїЃŒKFoШz—Иœэп[BїЇОРwкМБЩQ"YЮІqодj$џ№ѕ|ПеЭ№Т'5WЃv`тTЅ—/жЂUA%aЙ>Т>љ‹JžЦТЊ^џhЊЉPтјў#*!”rл/СжтОђ 0bб™ЩŠП­CЁP!‰оžћЊ^iз•.4‡u–˜зВcIЕ`Uхm1ьEЬЯ…+ЛC_Т§аœ—ЬR ѓ“лЛLWI”+zYьа!Г†г1џsуіуMjjњ O.nѕEžœtЮјMц&ІЁKtEЫCн'‚уФ‡8Ўф+ ѓJj 3Е—„и\ЅэОзUBМQ) №Јa17ƒ+)Ж†BI.b\ХОndвnKwрJЉhТЦ6!ubЭцЭНЌLAьц z=%9SqЖbзc”оgw—уОG|хспЊІ€Žы0уО#0œ*ёє8…ОпйёFд€0ˆД'ЫЬ,xE‰к?x˜ nŠц3 pѓљп›М“ЌeтŒ%влюE!іNЮХШhp9 д5gіq§aи.н,1d!Z‹ўдќ,BŽ>ои3 –ЉИ$=™?сщ_…їp+ъаCAньП™vїyЬп.Р‡‘Ю§”№.“ЯШlšЪ$q.ВaЮТЋKBЪш0т9_ЮZЎо0 tљHЎо ­ђ ГqtЭcг_ъUРКnlБ~ѕzžœ:шxє г,"B]0wŒЈкOTкЇ„_lƒVœGЛљ„OпzZ65н$Љx0лЇоћ‹VU#vl.}+ма D_й& Њјavu й=ьˆhіБ$ˆЂ‹GnoьџяLoЪXЭž2J—№m T:SтеvBТ1,ˆМїuq‰Ь”МЩЮ‚[HОqfЅЌ_Н)xАƒшЖ >9>(бСь”: ёЧСœІ‰К*‹г k јЎUѕ&ЊМЯе@Р-&к}Ђœ?aяrя!”Є‘ЖЃ€‹МŒOО§ЊпsмwDцЮ):Ё,œoEЧгС— šБ‡їЃ ПјAW1ЦЈХвбPQјШxІЙэ_:"Љ}•ƒЕЅ+ъ3n>&г {'џnwBƒŸ№F ю}ёо€шrб•KXbуѓЛЎ4Г}1 нOOДъbЪ[аЎЧwt9@€CМ‹š7ёŽКMЮІЦRбяи5Вeї= PјCŸAТ Sd†іѓж§mГjКаўНdЭEyCЭђеѕ5ыwДо#"Сd—7|Ч>аuЧyз'Њ?ax+c œу‰ъЁvrD’zQиљЯ\ѓ?њЮШђKГ-~oЪX~>`7;|УXŽЖ4iнє!J5./U@МЇЧ^ћъ\e‰ [™цеAfД?К'№“cЋf –ko ёnхq^Lx'†УУžxЈџ‹ПЎйR=Mю*ѓ‰Эм-Ђ ЦнSУћaѕ§}тъE 9sК\cЪ.АИЌTй?+нn>јЙл-њ‰JМЈ\сŸ„@ЛлЉwdš& Иј&Х#Vˆnіkw‡+Е$УД“QялЋšЃс ѓџЪ‚'ŒAгЩЩsF"Іv—qцЊ˜BHZ(GR}ы”œ›Ј­ №{ac“{Jk0Ї9](пАўHНЗ‹–i‹`Я||тт{ЅЋЌ&НбRЋБа[Ÿ7чЩџ@М\žѓšž^Z YLр`№ћАLХЪъDТRЭчIіУ›йrN­FK™ї&(jGьGі™ГˆІЏ\šE=WЎbЎ…-Ќggh›ХIЌмЭ…щЋc)ч)vыkЙ<мfЦДNH>ж…r ШЯ/’эЎ*‹2wДB ќszkŠZК% ?ъ)fџWx”34ќ;Ъ!РУДИƒ“гCБоœr1y=82lбкЏ™qЖИawЛ4Ър2у/*Ч€Юъ1i78’бЁ‘r7xЃwФХ{8ƒUД§п ш>N‡?„OЧг-x ^№й$zѕ­ƒж(VF d,+EЛœЉр5xv‰SBвnIPЕЭьЖЈъœПlљќsщЯДджDП|ДеeЌ|їk& bГfєI“p'' Ёшв2–њяЗm™ ѕЅљ“š)ћ‚Ы+ЌK!ŸЙ№M€BЋkлPу‘Ь9(У6ЏžIтœХѓ522ъюИOБ›ЃлdтХ;?wM”њЫGкдAЁЬ^dЖмрп+0:ЧпЮтao@z?d.{•[}~vpTЖЖpѓѕяіД"жAžˆЩa>‡•ЧБЎА}їХT]QЪ РNEЕмЎЬq;Rц.‘lQw0š—Чqуј”&^Ž‹Оx€ЭtїлXз\Ѕэ™(DпIјк‡Ћ=€  y}ё:ЎA0ЙS ЄЙс0ФvkMп1ЁУЖZОšUˆпqт|Јk2>ВUDhЙ0Я Еh%п4 ФRх3mМ*qaѕЗоAо1Л fЎJPыРЖvК‰еШГОјc^БЬHјЊE…#Lћ4;я§ˆ Iџ^о%VXFkчЃЧфˆгєЦƒ kмд џyЕƒ FМФˆjХЮtРЇi ЈMŠъ~^Uої7/ињЪZ(ѓ8eОe“œавU_+Yvю9›ЋгЊnВFЧ0‚Зк%† иИQЕH@Œ–Y>u’4ЛФ;•ьi/тЊr%УjoФp2Dˆ=2}&№чЕєDЂcљЋpњin\эЊ­Uc2тї)N0@Р2XзюmLГŒ­MNїўмнЉ,9CЗ0TИияЕЙCE№б‰ŒыЂ:ѓ щнЗXvзR[uAaYіљ3с|gњWЕoшї\жsЂџ&#тсzЎЊЄН–2ђя,Ф Ќь@žљ К—+ашOхlЊВpќюСUцГУ“mr ѓmЗjЁ/ЅkЯ<ќљж‘Чd`Ё&–G"бзŒЙыфЃ —,ЦБоа›кS…ыT_…^KD•ŒВ%ИŸ›ѕР›0П} ѓ9˜усзёxв.вЖ@ЛА6)nŽївЮ цљ‡$qЅе‹в(ЮFcњЭ— э;@AтŠ~NˆцŽ Ф&ЂѓД&зеР€"Еб1u§WJуr•г5šKФЛ‰Й*kSаЏXwууўйZŒ#z•ŽW . •жђдРШŠЬчу`34яt_ЈтЋTU?94ˆ`А7ПЌ­$IdxЮ–ƒ’г…˜кureк№wыMвГжЃUС=@АјЪџБš‘ЪН|eЊ#ёш„‹ БIЉcfЬИ#ыъгYФc1ЎуŒjЦћч“HTpƒяФ…hк‰їV~{мqюxюўдfl nMI­… ‘ž!Кч МwTJЩуш0‚iБИ/H_аOА§хМ 1eЁШOM?Сœvg|и 6ц g7ыРƒУF:{xŸ?и Vэ’•’ ьœZŽМЋVоИ‡Нa;кЌCвХ„WtСb,жЈЎc€ZAxу@ьюРWПIНk2pЮХе&Z№RаCQtоi08ћЂilˆ \дRŒЎМQbФ—”’>PCšгП…Ш МI' { Еh&7жRАNх˜eЉВXсњRe§сLЃK{Е“-ƒЪ*оžg?j–/П"7‘д<{H;™Нуѕ@“ка1~V]ЂE‰љoќ\Y1ЋЌ &Ёяžj?БГHЕƒ:qГЊB5Ђ{яJщмиПѕ8xНh–iœиЯЌњTNДШ„FIFУфаQ|EьОD%љ[šQc]о8Ђњc§п€јЕьќ*"-NЧњЯ`њTœЊ{ь"аЧВB_Rт"Щ€ЛЈQкPqЗ уЪ@ЋCWіxdЂLВћЅWђ_ы?nf3ЙžXкг uSньdгк'bў/@їфЂёC[E•сћњ[mн§ ъzш:д ЛААЕЂЅ:lJ­љЄ_OFѕŠ<ИЬIЗVЧНѕ^БУ„а€pI—ƒPХ=БЁxЃ6б$–е„{’ў%Ч99ЗЊ$\u–чNRЉБƒБ‡ЃЮІЈa?Ё С~ЊVšuІШИьrgюгќ@@cН{л#8Ќ[9У<п€іfš]%)џY[tџ vќ|Тв€Л§Ќ\б6YйЈлдr+џДvкqzсŽПЈhJi\TmТоІE01ѓŸясГІšфє^ШMёdh ПƒјolСJ-яЩB€х…{Ц#„}=fђ: ј3~Џ­2iРd#Ѕ&_Uвќ];ЊGцРŠRЛx6јЉz˜–8Ѓ$ЧъЗ‚EШх-/6@ˆњОAп­&JуѓЄB™–ьS ,2&‹Œ­ ‰ўъ_TTЬˆD[єа5€(НmnЃЦїp 2N6kvxUё=е$ˆ§њn^бЅчхi3YFЧœ2JОtЂJЋчвГm#=@љ$мXЮт&е;ї№5dвЧЏŸ§Y­Ч,вskV—л№яШ:ЅН;џЄЮ‰Иѓйа}Ђ рзeа=—kНr=Я%кЖ=]ЃKчЪ4~ ж˜сWІЏкѕ>P>‘ѓ§^QЅї_АEЖйТюwTЂCDnQcз[ЪЙ[OоЏЫ…V бv5fЦzK8 +FeЉCћJЂ 6єу„ НB|Ћ‡Ўwnqˆkƒ„~ŸC’бЙ;ŽьЌ~S“'scЭŸрAYvoB]Љ lŸ+ Ыћєж‘К*Ќ&ђЩ`@ЛDЕ>#РўZуG3ўLШѕоЁЊЄ ЬyЛ-Йь_eжТьЏdїq!2ѓЉ–йm[\ђE mСb›kГe9„}бœуy;з Г@Лn›Н|ђ€ш~ў˜q€IS Ѕћп’gA:ГX"r:ЫV'й$Йщ Р„"tмdўjит5)ъеХˆ 6ЭLЫХ‰—LE/ŸЩ“s^‰lLKƒ`NЇКОШ;TCЈмџHј§тв[˜Ц9%\§gIЯё#lИТ‡‹ѓLh[ђP>ИЫё‚ёkjЬё&4­UfњžЕLcSјцЖž“/щkмEp0м–bЩцџ(zЬfЗšБ“fK>\1ны"рЂp фзыS{$‹}y“EtПЛNA#ѓ{х˜yэŠКДЁ‚Ъ)ЅДЌ”,ѕцЃ@)Ч/уqHо8|Х^ЋЄШqт5€tŒ™yЏ™—w^Озƒ$ћВ+Фг\uЈЮПоЫ"ІwїLѓЂ9VA8iлрэ}&дP§ЎєЦdV es‘(0•еˆ™HGуBВДІ6eЛ}"дpUˆЃй7•ЦяE1ŸRъі}С\žvM›бzк§ц\EЋ(щЭФЌІmєљr†М{жїrЅ ЮŠ‰ Ÿ%ЎWRбиыb­Ђ$,яqхњ$в!{Ю№цWQє#ŸqАщ/vэ5##bЁщЪПpАVоtZ;šzУСУњЖ?Œњ…aъ˜{KЌ#yjLюЭg+ўt_щйс&p#ЂЈ~Ђ…VЧПv|i‚]ЈзwЩ”'e#ќ1ћv:3?5ІМНWАlƒЪžџ мб9 @JњІЭˆzyжZ3јк p ГcjЂ’јЈмБЏl†už6… ]рШБь№unMмTXЪ:‡Ф[йЩэ!ыhЅVg^У,—Џў}RHщы%x5Р™5Іфѓ‡ЁѓD•мvєfM ЫС*Њix3ь”Ѓq*ИЙk+ 0чxtЕ‚V*С–Œd:…TЕ_“ŠЇ+ѕц>fлw%c5oЂкAьšз‚"CmдiиšдьЫzиѕœ>’UЩэрнsQ~?Џ^ЫQ3Ž>бЉYЉ!^к,y]‰žЗњiдЉw…iIa„Ы"+Еї’:CuиW­\Јъ3ѕA98]БP€M€ŸgOŠš%ІД]Z­/fХ‚ г*8№Р‹к`ˆ<НУxNВИљДбќ +:(]GXОюп№*dŒ- endstream endobj 34 0 obj 33862 endobj 35 0 obj << /Type /FontDescriptor /FontName /CharterBT-Roman /Flags 4 /FontBBox [ -162 -237 1193 963 ] /ItalicAngle 0 /Ascent 963 /Descent -237 /CapHeight 963 /StemV 80 /FontFile 33 0 R >> endobj 36 0 obj << /Length 881 /Filter /FlateDecode >> stream xœ]жЭnл8†сНпƒ–э"А$ђ1` e Шb~0i/РБ•д@#ŠГШнѕНJ1гMŒЯЮ#2ДVЭУюa8]‹епуљ№и_‹чгpћЗѓћxш‹Їўх4,U]O‡ыgдЧсuY.VЗљoзўѕax>›ЭrQЋnМ]ЧтK:žŸњЏњђЏёиЇсЅјђНyфЋЧїЫхgџкзЂ\.Жлти?O5џи_ўмПіХJгяŽЗ+NзЛлФџ\ђэув5_Tєv8ћЗЫўаћсЅ_.6eЙ-6]З].њсјћhU–L{z>ќиЗЫыщђВLхv •Тэc 5ЁVpЇр ^СІA!оB]Vk…{FюжF!)dBVhТŽFw -#­BG˜Ь‡ЧЩу№8y'Ууфqxœ<“ЧсqђИHˆ xœ<“Чсqђ8> endobj 38 0 obj << /Type /Encoding /Differences [ 0 /twosuperior /threesuperior ] >> endobj 39 0 obj << /Length 234 /Filter /FlateDecode >> stream xœ]ЭjХ …ї‚я0ЫлХ%&нЁНхB§ЁiРш$•‰YфэkДЙ”n”s<пpœъв=uЮFЈоШы#ŒжТХЏЄœЌуЌnРX™/=ЋРY•ј~["Ю=Д-gе{ ,‘68=?р]6_Щ Y7СщѓвЋ_CјЦ]С™”`pмg>Ћ№Ђf„*учЮЄ„л9"[@hŠQ—nк\‚вHЪMШY+„„іz•œЁ3џ_› ЃўRt„…xlф.ъ"ю {„і1љчЗ’z%J§ђ‚rЏН‘ux[b№!sПЧB“r endstream endobj 40 0 obj << /Type /Font /Subtype /Type1 /BaseFont /CharterBT-Roman /Encoding 38 0 R /ToUnicode 39 0 R /FirstChar 0 /LastChar 1 /Widths [ 370 370 ] /FontDescriptor 35 0 R >> endobj 41 0 obj << /F1 27 0 R /F2 32 0 R /F3 37 0 R /F4 40 0 R /F5 22 0 R >> endobj 42 0 obj << /Im5 5 0 R >> endobj 43 0 obj << /Font 41 0 R /XObject 42 0 R /ProcSet [ /PDF /ImageC /ImageI ] >> endobj 12 0 obj << /Type /Pages /Resources 43 0 R /MediaBox [ 0 0 595 842 ] /Kids [ 13 0 R 14 0 R 15 0 R 16 0 R 17 0 R ] /Count 5 >> endobj 44 0 obj << /Type /Catalog /Pages 12 0 R >> endobj 45 0 obj << /Creator /Producer /CreationDate (D:20050710232258+02'00') >> endobj xref 0 46 0000000000 65535 f 0000000017 00000 n 0000063380 00000 n 0000063408 00000 n 0000089387 00000 n 0000089415 00000 n 0000109799 00000 n 0000143479 00000 n 0000143507 00000 n 0000198338 00000 n 0000198366 00000 n 0000212442 00000 n 0000304840 00000 n 0000212471 00000 n 0000212580 00000 n 0000212689 00000 n 0000212798 00000 n 0000212907 00000 n 0000213017 00000 n 0000222171 00000 n 0000222197 00000 n 0000222451 00000 n 0000222910 00000 n 0000223274 00000 n 0000239105 00000 n 0000239132 00000 n 0000239377 00000 n 0000239823 00000 n 0000240162 00000 n 0000265960 00000 n 0000265987 00000 n 0000266227 00000 n 0000266915 00000 n 0000267530 00000 n 0000301533 00000 n 0000301560 00000 n 0000301798 00000 n 0000302762 00000 n 0000303960 00000 n 0000304057 00000 n 0000304374 00000 n 0000304593 00000 n 0000304695 00000 n 0000304737 00000 n 0000305055 00000 n 0000305116 00000 n trailer << /Size 46 /Root 44 0 R /Info 45 0 R >> startxref 305323 %%EOF sailcut-1.3.5/doc/fr/sailcut-math.lyx0000644000175000007640000002345210510643102017407 0ustar sharkyjerryweb#LyX 1.3 created this file. For more info see http://www.lyx.org/ \lyxformat 221 \textclass article \language french \inputencoding auto \fontscheme pslatex \graphics default \paperfontsize default \spacing single \papersize Default \paperpackage a4 \use_geometry 0 \use_amsmath 0 \use_natbib 0 \use_numerical_citations 0 \paperorientation portrait \secnumdepth 3 \tocdepth 3 \paragraph_separation indent \defskip medskip \quotes_language english \quotes_times 2 \papercolumns 1 \papersides 1 \paperpagestyle default \layout Title Algшbre linщaire pour Sailcut CAD \layout Standard Les caractшres en gras comme \begin_inset Formula $\mathbf{AB}$ \end_inset ou \begin_inset Formula $\mathbf{x}$ \end_inset reprщsentent des vecteurs ou des points tel que \series bold p1 \series default . \layout Section CSubSpace (des sous-espaces vectoriels de l'espace) \layout Standard Ces sous-espaces peuvent ъtre dщfinis soit par une base de vecteurs, soit par des щquations. La base de vecteurs semble etre ce qui est le plus facile р imaginer. Cependant, il y a une interprщtation tout р fait gщomщtrique des щquations dy type : \layout Standard a*x + b*y + c*z = 0 \layout Standard Le vecteur (a,b,c) et le vecteur (x,y,z) doivent avoir un produit scalaire nul, ce qui signifie tout simplement que (a,b,c) et (x,y,z) sont orthogonaux. Ainsi, donner les щquations (indщpendantes) qui dщfinissent un sous-espace (droite, plan, etc..), c'est simplement donner une base de vecteurs qui sont orthogonaux р ce sous-espace. \layout Subsection Opщrations vectorielles щlщmentaires \layout Standard Si on a deux vecteurs \series bold v1 \series default et \series bold v2 \series default et deux points \series bold p1 \series default et \series bold p2 \series default : \layout Itemize \series bold v1 \series default .norm() donne la norme (longueur) du vecteur \series bold v1 \series default \layout Itemize CVector3d( \series bold v1 \series default ).unit(); donne le vecteur unitaire du vecteur \series bold v1 \layout Itemize CVector3d( \series bold p2 \series default - \series bold p1 \series default ).norm() donne la distance du point \series bold p1 \series default au point \series bold p2 \layout Itemize Produit scalaire de 2 vecteurs s'щcrit \series bold v1 \series default * \series bold v2 \series default = | \series bold v1 \series default | * | \series bold v2 \series default |*cos( \series bold v1 \series default , \series bold v2 \series default ) \layout Subsection Dщplacement de points \layout Itemize point \series bold p2 \series default dщfini comme щtant le point \series bold p1 \series default avec une translation d'un vecteur \series bold v1 \series default : \layout Quotation \series bold p2 \series default = \series bold p1 \series default + \series bold v \series default 1; \layout Itemize point \series bold p2 \series default dщfini comme щtant le point \series bold p1 \series default translatщ de \series bold d \series default selon le vecteur unitaire \series bold x \series default : \layout Quotation \series bold p2 \series default = \series bold p1 \series default + \series bold x*d \series default ; \layout Itemize dщplacer le point \series bold p1 \series default de la distance \series bold d \series default dans la direction \series bold p1 \series default => \series bold p2 \series default : \layout Quotation \series bold p1 \series default = \series bold p1 \series default + CVector3d( \series bold p2 \series default - \series bold p1 \series default ).unit() * \series bold d; \series default \layout Section Distance d'un point р une droite \layout Subsection Dщmonstration \layout Standard Soit \begin_inset Formula $\mathcal{D}$ \end_inset la droite engendrщe par le vecteur directeur unitaire \begin_inset Formula $\mathbf{u}$ \end_inset et passant par le point \begin_inset Formula $B$ \end_inset et soit \begin_inset Formula $A$ \end_inset un autre point. Soit \begin_inset Formula $H$ \end_inset la projection orthogonale de \begin_inset Formula $A$ \end_inset sur \begin_inset Formula $\mathcal{D}$ \end_inset . On cherche р connaitre la distance du point \begin_inset Formula $A$ \end_inset р la droite \begin_inset Formula $\mathcal{D}$ \end_inset que l'on notera \begin_inset Formula $d(A,\mathcal{D})$ \end_inset . \layout Standard D'aprшs le thщorшme de Pythagore \begin_inset Formula \[ \left\Vert \mathbf{AB}\right\Vert ^{2}=\left\Vert \mathbf{AH}\right\Vert ^{2}+\left\Vert \mathbf{HB}\right\Vert ^{2}\] \end_inset ce qu'on peut щgalement щcrire \begin_inset Formula \[ \left\Vert \mathbf{AH}\right\Vert ^{2}=\left\Vert \mathbf{AB}\right\Vert ^{2}-\left\Vert \mathbf{HB}\right\Vert ^{2}\] \end_inset \layout Standard \begin_inset Formula $\left\Vert \mathbf{AH}\right\Vert ^{2}$ \end_inset est le carrщ de la distance cherchщe soit \begin_inset Formula $d(A,\mathcal{D})^{2}$ \end_inset . De plus, \begin_inset Formula $\mathbf{HB}$ \end_inset reprщsente la projection de \begin_inset Formula $\mathbf{AB}$ \end_inset sur le vecteur \begin_inset Formula $\mathbf{u}$ \end_inset de telle sorte que \begin_inset Formula \[ \left\Vert \mathbf{HB}\right\Vert ^{2}=(\mathbf{\mathbf{AB}}.\mathbf{u})^{2}\] \end_inset d'oљ \layout Standard \begin_inset Formula \[ d(A,\mathcal{D})=\sqrt{\left\Vert \mathbf{AB}\right\Vert ^{2}-(\mathbf{AB}.\mathbf{u})^{2}}\] \end_inset \layout Standard Si on dispose non pas d'un vecteur directeur unitaire mais d'un vecteur directeur \begin_inset Formula $\mathbf{x}$ \end_inset de norme arbitraire non nulle, on peut щcrire \layout Standard \begin_inset Formula \[ d(A,\mathcal{D})=\sqrt{\left\Vert \mathbf{AB}\right\Vert ^{2}-\left(\frac{\mathbf{AB}.\mathbf{x}}{\left\Vert x\right\Vert }\right)^{2}}\] \end_inset \layout Subsection Exemple de code utilisant GeoCpp \layout Quote \family typewriter CPoint3d A(1,9,0); \newline CPoint3d B(0,0,0); \newline CVector3d x(2,1,0); \newline CVector3d AB = CVector3d(B - A); \newline \newline // build unit vector \newline CVector3d u = x.unit(); \newline \newline // calculate distance \newline real d = sqrt( (AB * AB) - (AB * u) * (AB * u) ); \newline \newline // result is 7.602631 \layout Section Rotations \layout Subsection rotation de vecteurs \layout Standard Le vecteur \series bold d \series default selon l'axe X se dщfini par : \layout Quotation CVector3d \series bold v \series default (d,0,0); \layout Paragraph \series medium Pour faire tourner le vecteur \series default v \series medium de l'angle AA autour de l'axe \series default z \series medium (l'axe numщro "2") : \layout Quotation \series bold v \series medium = CMatrix::rot3d(2,AA) * \series bold v \series medium ; \layout Standard Le point \series bold p2 \series default qui est р l'extrщmitщ du vecteur \series bold v1 \series default dont l'origine est \series bold p2 \series default s'щcrit alors : \layout Quotation \series bold p2 \series default = \series bold p1 \series default + \series bold v1 \series default ; \layout Standard Si on n'a pas besoin de \series bold v \series default dans d'autres calculs, on fait tout en une ligne: \layout Quotation \series bold p2 \series default = \series bold p1 \series default + CMatrix::rot3d(2,AA) * CVector3d(d,0,0); \layout Subsection Matrice de rotation \layout Standard Pour dщfinir la matrice en question connaissant l'angle de rotation ALPHA autour de Z (axe 2): \layout Quotation CMatrix m = CMatrix::rot3d(2,ALPHA); \layout Standard voir р http://dev.jerryweb.org/doxygen/sailcut/classCMatrix.html#d2 \layout Subsection dщplacement dans une direction perpendiculaire р un vecteur \layout Standard Le point \series bold p2 \series default qui est le dщplacement de l'extrщmitщ \series bold p2 \series default du vecteur \series bold v1 \series default d'une valeur \series bold d \series default perpendiculaire (+PI/2) au vecteur \series bold v1 \series default . On parle d'une rotation dans le plan du vecteur, aprшs avoir vщrifiщ que \series bold v1 \series default n'est pas le vecteur nul: \layout Quotation \series bold p2 \series default = \series bold p2 \series default \series bold + CMatrix::rot3d(2,PI/2) * v1 *(d/v1.norm()); \layout Subsection Rotation d'un panneau \layout Standard Utiliser la fonction rotate pour tourner un panneau developpщ : \layout Quotation \series bold flatpanel = flatpanel.rotate( ton_point, ta_matrice) \layout Section Intersection de 2 droites \layout Standard On connaюt 2 droites dщfinies par les points \series bold (L1,L2) \series default et \series bold (P1,P2) \series default et on cherche le point d'intersection de la droite \series bold (P1,P2) \series default avec la parallшle р \series bold (L1,L2) \series default situщe р la distance \series bold d1 \series default de \series bold (L1,L2) \series default  : \layout Standard La solution ci-dessous est complшtement gщnщrique, elle ne suppose pas que le point P1 est sur (L1,L2).  On reprend le point \series bold p1b \series default calculщ ci-dessus : \layout Quote CSubSpace pp(p1b, CVector3d(p2-p1).matrix(), GEOCPP_FROM_BASE); \layout Quote CSubSpace ll(l1, CVector3d(l2-l1).matrix(), GEOCPP_FROM_BASE); \layout Quote CSubSpace p = pp.intersect(ll); \layout Standard Voilр.. il ne reste qu'р vщrifier que la dimension de "p" est bien 0 (un point) avec \layout Quote p.getdim(); \layout Standard et si c'est le cas, on extrait le point avec \layout Quote p.getp(); \layout Section Sites intщressants \layout Itemize Dщmonstration pratique du produit scalaire \newline \begin_inset LatexCommand \htmlurl{http://homeomath.imingo.net/scalaire.htm} \end_inset \the_end sailcut-1.3.5/doc/fr/rigplan.fig0000644000175000007640000001346710700004326016406 0ustar sharkyjerryweb#FIG 3.2 Produced by xfig version 3.2.5-alpha5 Landscape Center Metric A4 100.00 Single -2 1200 2 1 3 0 1 1 7 50 -1 -1 0.000 1 0.0000 8145 8145 45 45 8145 8145 8190 8145 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 2655 5490 1890 7650 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 1710 7650 1710 8865 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 1800 5445 1395 5445 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 1890 4095 1080 4095 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 2070 2745 765 2745 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 540 1350 540 7650 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 855 2745 855 7650 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 1170 4095 1170 7650 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 1485 5445 1485 7650 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 225 7650 3600 7650 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 3690 765 2835 765 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 2655 7650 2655 8100 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 2835 7650 2835 8100 2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 2652 765 2835 765 2835 7650 2652 7650 2652 765 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 6 2655 1350 2070 2745 1890 4050 1800 5400 1710 7650 1710 7605 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 3555 765 3555 7650 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 1.00 60.00 120.00 1710 8775 2745 8775 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 1.00 60.00 120.00 1890 8370 2745 8370 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 2430 8055 2655 8055 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 1.00 60.00 120.00 2835 8055 3285 8055 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 1890 7650 1890 8460 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 1440 4905 1800 5445 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 2395 4898 2755 5438 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 1485 4995 2430 4995 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 1720 2198 2080 2738 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 1620 3645 2430 3645 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 1800 2295 2430 2295 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 2371 2184 2731 2724 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 2395 3548 2755 4088 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 1540 3548 1900 4088 2 1 3 1 1 7 50 -1 -1 10.000 0 0 -1 0 0 2 2745 9000 2745 405 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 2655 1350 495 1350 2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 2070 2745 2655 2745 2655 2790 2070 2790 2070 2745 2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 1890 4095 2655 4095 2655 4140 1890 4140 1890 4095 2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 1800 5445 2655 5445 2655 5490 1800 5490 1800 5445 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 4545 7650 8010 1125 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 8010 1170 8010 8775 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 4545 7650 4545 8910 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 7650 7650 7650 8370 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 8145 7650 8145 8370 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 8505 765 8505 8235 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 8010 8685 4545 8685 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 7650 8145 8145 8145 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 8145 8145 8505 8145 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 1.00 60.00 120.00 7650 8145 7020 8145 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 1.00 60.00 120.00 8505 8145 9045 8145 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 7650 8325 4545 8325 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 7155 5670 7740 6030 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 4140 7650 11520 7650 2 3 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 6 8013 765 8508 765 8148 7650 7653 7650 8013 900 8013 765 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 8010 1170 4275 1170 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 4455 1170 4455 7650 2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 0 0 4 8460 2205 9900 585 11700 5760 8190 6615 2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 0 0 2 8235 6615 9540 6615 2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 0 0 2 8460 2205 9135 2205 2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 9405 6615 9405 7650 2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 9090 2205 9090 7650 4 0 1 50 -1 0 12 1.5708 4 135 1755 3510 4905 Hauteur du mat = MH\001 4 0 4 50 -1 0 12 1.5708 4 180 2325 4365 5040 Hauteur du triangle avant = I\001 4 0 1 50 -1 0 12 0.0000 4 135 1470 5175 8235 base du mat = MB\001 4 0 4 50 -1 0 12 0.0000 4 180 2055 5130 8640 base du triangle avant = J\001 4 0 1 50 -1 0 12 0.0000 4 135 315 7110 8055 MC\001 4 0 1 50 -1 0 12 0.0000 4 135 360 3105 8010 MW\001 4 0 1 50 -1 0 12 0.0000 4 135 360 2070 8325 LSB\001 4 0 1 50 -1 0 12 0.0000 4 135 375 2070 8730 CSB\001 4 0 1 50 -1 0 12 0.0000 4 135 495 1710 4905 SPW1\001 4 0 1 50 -1 0 12 0.0000 4 135 495 1755 3600 SPW2\001 4 0 1 50 -1 0 12 0.0000 4 135 495 1755 2205 SPW3\001 4 0 1 50 -1 0 12 1.5708 4 135 2640 810 5940 hauteur barre de fleche 3 = SPH3\001 4 0 1 50 -1 0 12 1.5708 4 135 2640 1125 7155 hauteur barre de fleche 2 = SPH2\001 4 0 1 50 -1 0 12 1.5708 4 180 2205 495 4500 hauteur du capelage = CSH\001 4 0 1 50 -1 0 12 1.5708 4 135 450 1440 6840 SPH1\001 4 0 1 50 -1 0 12 0.0000 4 165 1590 8640 8055 Quete du mat = MR\001 4 0 0 50 -1 0 12 0.0000 4 135 330 6660 5670 Mat\001 4 0 18 50 -1 0 14 0.0000 4 165 1140 9585 4635 Grand-voile\001 4 0 18 50 -1 0 12 0.0000 4 135 1785 9495 7110 Hauteur amure = BAD\001 4 0 18 50 -1 0 12 0.0000 4 135 1590 9180 3645 Hauteur tete = HAD\001 sailcut-1.3.5/doc/fr/coordinates_system.fig0000644000175000007640000000306110510643102020655 0ustar sharkyjerryweb#FIG 3.2 Produced by xfig version 3.2.5-alpha5 Landscape Center Metric A4 100.00 Single -2 1200 2 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 1 3 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 630 9000 1755 8055 8235 8055 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 1755 8055 1755 1080 2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 6 2250 7560 4095 1845 5355 1350 6660 7200 2205 7560 2250 7560 2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 6390 4275 5805 5040 2070 5040 2925 4275 6390 4275 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 3330 4275 2880 4815 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 6390 4275 6660 4275 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 4284 4282 3956 4676 3 2 0 1 4 7 50 -1 -1 0.000 0 0 0 3 3330 4275 4005 4680 6030 4275 0.000 -1.000 0.000 3 2 0 1 0 7 50 -1 -1 0.000 0 0 0 3 3915 2520 4635 2700 5580 2475 0.000 -1.000 0.000 3 2 0 1 0 7 50 -1 -1 0.000 0 0 0 3 2745 6030 3510 6345 6390 5940 0.000 -1.000 0.000 4 0 0 50 -1 0 12 0.0000 4 150 510 1035 1035 Y axis\001 4 0 0 50 -1 0 12 0.0000 4 150 495 900 9135 Z axis\001 4 0 0 50 -1 0 12 0.0000 4 150 510 7875 8370 X axis\001 4 0 0 50 -1 0 12 0.0000 4 90 105 6570 4185 x\001 4 0 0 50 -1 0 12 0.0000 4 135 630 4095 7590 bordure\001 4 0 0 50 -1 0 12 0.0000 4 135 450 5985 3510 chute\001 4 0 0 50 -1 0 12 0.0000 4 180 735 2790 3465 guindant\001 4 0 0 50 -1 0 12 0.0000 4 195 1200 3780 4860 creux du profil\001 4 0 0 50 -1 0 12 0.0000 4 195 1740 3870 4185 corde locale du profil\001 4 0 0 50 -1 0 12 0.0000 4 90 90 2745 4860 z\001 sailcut-1.3.5/doc/fr/sail_seams.fig0000644000175000007640000001221611112611300017053 0ustar sharkyjerryweb#FIG 3.2 Produced by xfig version 3.2.5-alpha5 Landscape Center Metric A4 100.00 Single -2 1200 2 5 1 0 1 0 7 50 -1 -1 0.000 0 1 1 0 5120.579 -4210.354 2655 3015 5985 3375 8460 2655 0 0 2.00 60.00 120.00 5 1 0 1 0 7 50 -1 -1 0.000 0 0 1 0 3867.387 6515.855 1755 2700 3645 2160 5715 2565 0 0 2.00 60.00 120.00 5 1 0 1 0 7 50 -1 -1 0.000 0 1 1 0 4720.387 5318.285 1260 5490 1755 7110 2655 8100 0 0 2.00 60.00 120.00 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 5 485 5869 1101 1770 2112 530 3880 5869 464 5871 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1016 5869 3597 4985 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1051 2086 2289 5869 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1581 1202 3077 5866 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 591 5197 3348 4239 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 6 5752 1148 5292 1700 5246 2068 6488 5886 7270 5886 5752 1148 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 6 5715 1035 5175 1665 5130 2025 6435 5985 7290 5985 5715 1035 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 5 8370 315 7650 1215 9180 5940 10215 5940 8370 315 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 5 8300 534 7760 1209 9245 5844 10055 5844 8300 534 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 6 4770 7110 1845 8100 1755 8820 2205 8820 5040 7875 4770 7110 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 6 4635 7200 1890 8145 1800 8775 2340 8775 4905 7920 4635 7200 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 9495 3690 9720 3600 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 9138 3833 9363 3743 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 8547 3637 8772 3547 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 8232 3772 8457 3682 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 5898 4058 6123 3968 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 5583 4193 5808 4103 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 4542 7642 4767 7552 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 4893 7484 5118 7394 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 1.00 60.00 120.00 2070 8775 2070 8550 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 2070 9045 2070 8820 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 6840 5895 6840 5670 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 9675 5850 9675 5625 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 8055 855 8235 1035 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 7785 585 7965 765 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 5310 1125 5490 1305 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 5580 1395 5760 1575 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 5266 1883 5536 1928 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 4906 1838 5176 1883 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 3150 7335 3240 7605 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 3285 7695 3375 7965 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 1887 8347 2247 8392 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 1438 8297 1798 8342 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 6840 6210 6840 5985 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 9675 6165 9675 5940 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 9675 2205 8955 2520 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 9627 1523 8907 1838 4 0 0 50 -1 0 14 0.0000 4 150 780 1800 6165 Bordure\001 4 0 0 50 -1 0 14 0.0000 4 150 540 1170 1035 Gaffe\001 4 0 0 50 -1 0 14 0.0000 4 165 1110 5220 7380 ourlet chute\001 4 0 0 50 -1 0 17 0.0000 4 195 150 2745 8235 1\001 4 0 0 50 -1 0 16 0.0000 4 195 135 1665 2970 2\001 4 0 0 50 -1 0 16 0.0000 4 195 135 2430 2925 3\001 4 0 0 50 -1 0 17 0.0000 4 195 150 8505 2565 3\001 4 0 4 50 -1 0 16 0.0000 4 255 2655 8415 8910 Ligne de coupe en rouge\001 4 0 0 69 -1 0 16 0.0000 4 195 135 1305 5355 1\001 4 0 0 50 -1 0 17 0.0000 4 195 150 5805 2700 2\001 4 0 0 50 -1 0 17 0.0000 4 285 2550 3825 8685 Coupe laize transverse\001 4 0 0 50 -1 0 14 0.0000 4 165 1335 9765 6255 ourlet bordure\001 4 0 0 50 -1 0 17 0.0000 4 285 2370 7695 6840 Coupe laize verticale\001 4 0 0 50 -1 0 14 0.0000 4 210 1425 2565 7290 largeur couture\001 4 0 0 50 -1 0 14 0.0000 4 210 1425 4275 4095 largeur couture\001 4 0 0 50 -1 0 14 0.0000 4 210 1425 6840 3645 largeur couture\001 4 0 0 50 -1 0 14 0.0000 4 165 1110 9765 3465 ourlet chute\001 4 0 4 50 -1 0 14 0.0000 4 210 1545 9765 1485 d\351coupe (rouge)\001 4 0 0 50 -1 0 14 0.0000 4 165 1065 3825 1755 autre ourlet\001 4 0 0 50 -1 0 14 0.0000 4 165 1065 4275 990 autre ourlet\001 4 0 0 50 -1 0 14 0.0000 4 165 1065 6660 585 autre ourlet\001 4 0 1 50 -1 0 14 0.0000 4 225 1290 9810 2205 tra\347age (bleu)\001 4 0 0 50 -1 0 14 0.0000 4 165 1065 540 8190 autre ourlet\001 4 0 0 50 -1 0 14 0.0000 4 150 885 45 2700 Guindant\001 4 0 0 50 -1 0 14 0.0000 4 150 570 2565 1710 Chute\001 4 0 1 50 -1 0 16 0.0000 4 255 2475 8415 8550 Ligne de tra\347\351 en bleu \001 4 0 0 50 -1 0 14 0.0000 4 165 1335 2205 9135 ourlet bordure\001 4 0 0 50 -1 0 14 0.0000 4 165 1335 6930 6300 ourlet bordure\001 sailcut-1.3.5/doc/fr/sail_edges.fig0000644000175000007640000001100710510643102017035 0ustar sharkyjerryweb#FIG 3.2 Produced by xfig version 3.2.5-alpha5 Landscape Center Metric A4 100.00 Single -2 1200 2 6 6030 1350 7245 2295 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 6030 2025 6255 2295 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 6231 2230 7221 1375 -6 6 5175 315 9810 7515 6 5175 315 9810 7515 3 2 0 2 1 7 50 -1 -1 0.000 0 0 0 3 7965 360 9090 3285 9765 7065 0.000 -1.000 0.000 3 2 0 2 1 7 50 -1 -1 0.000 0 0 0 3 5963 1985 6818 995 7943 365 0.000 -1.000 0.000 3 2 0 2 1 7 50 -1 -1 0.000 0 0 0 3 5222 7216 7382 7441 9767 7081 0.000 -1.000 0.000 3 2 0 2 1 7 50 -1 -1 0.000 0 0 0 3 5967 1973 5423 4042 5198 7192 0.000 -1.000 0.000 -6 -6 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 3 1 1.00 60.00 120.00 3060 7290 2970 7920 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 3 1 1.00 60.00 120.00 315 7965 270 7335 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 3 1 1.00 60.00 120.00 2835 1890 2160 1665 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 270 7245 2970 1935 3060 7155 270 7245 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 945 4455 1530 4725 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 1755 4860 1980 4950 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 1620 6705 1620 7200 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 1620 7380 1620 7785 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 2520 4590 2835 4590 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 3015 4590 3735 4590 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 5217 7206 5994 1996 7956 373 9756 7078 5217 7206 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 7027 1163 7297 1478 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 6538 619 6853 979 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 3 1 1.00 60.00 120.00 8190 450 9090 675 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 9810 7110 10440 6930 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 9140 3346 9725 3166 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 8376 3576 8826 3441 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 9396 3287 10341 6932 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 4957 3970 5407 4060 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 6001 4188 5535 7246 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 5668 4110 6433 4245 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 3 1 1.00 60.00 120.00 9781 7185 10276 7725 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 7380 6750 7380 7155 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 7380 7470 7380 8055 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 3 1 1.00 60.00 120.00 5047 7832 5182 7247 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 3 1 1.00 60.00 120.00 5888 1955 5258 1730 3 2 0 2 4 7 50 -1 -1 0.000 0 0 0 3 270 7245 1665 7380 3060 7155 0.000 -1.000 0.000 3 2 0 2 4 7 50 -1 -1 0.000 0 0 0 3 2970 1935 2835 4590 3060 7155 0.000 -1.000 0.000 3 2 0 2 4 7 50 -1 -1 0.000 0 0 0 3 2970 1935 1800 4725 270 7245 0.000 -1.000 0.000 4 0 4 50 -1 0 18 0.0000 4 195 450 2025 5445 Foc\001 4 0 4 50 -1 0 12 0.0000 4 195 1380 405 4365 (valeur n\351gative)\001 4 0 4 50 -1 0 14 0.0000 4 225 1410 585 4185 Rond guindant\001 4 0 4 50 -1 0 12 0.0000 4 195 1380 3060 4770 (valeur n\351gative)\001 4 0 4 50 -1 0 14 0.0000 4 180 1095 3060 4500 Rond chute\001 4 0 4 50 -1 0 14 0.0000 4 180 1320 1260 8010 Rond bordure\001 4 0 0 50 -1 0 14 0.0000 4 165 660 180 8190 Amure\001 4 0 0 50 -1 0 14 0.0000 4 165 660 2745 8235 Ecoute\001 4 0 0 50 -1 0 14 0.0000 4 165 420 1575 1665 Tete\001 4 0 0 50 -1 0 14 0.0000 4 225 1800 6525 2250 Position rond gaffe\001 4 0 0 50 -1 0 14 0.0000 4 165 300 9495 990 Pic\001 4 0 0 50 -1 0 14 0.0000 4 180 2115 9855 4725 Position rond de chute\001 4 0 1 50 -1 0 14 0.0000 4 240 2970 9450 3105 Rond de chute (valeur positive)\001 4 0 0 50 -1 0 14 0.0000 4 225 2145 5940 5670 Position rond guindant\001 4 0 1 50 -1 0 14 0.0000 4 225 1410 6120 4095 Rond guindant\001 4 0 1 50 -1 0 14 0.0000 4 240 1530 6120 4545 (valeur positive)\001 4 0 0 50 -1 0 14 0.0000 4 165 660 10395 7740 Ecoute\001 4 0 1 50 -1 0 14 0.0000 4 180 1605 7605 7785 Rond de bordure\001 4 0 1 50 -1 0 12 0.0000 4 195 1335 7560 8055 (valeur positive)\001 4 0 0 50 -1 0 14 0.0000 4 165 660 4635 8100 Amure\001 4 0 0 50 -1 0 14 0.0000 4 165 420 4950 1620 Tete\001 4 0 1 50 -1 0 14 0.0000 4 225 1350 5175 585 Rond de gaffe\001 4 0 1 50 -1 0 12 0.0000 4 195 1335 5220 810 (valeur positive)\001 4 0 1 50 -1 0 18 0.0000 4 240 1500 6435 3240 Grand Voile\001 sailcut-1.3.5/doc/fr/sailcut-profile-fr.sxc0000644000175000007640000003120310510643102020475 0ustar sharkyjerrywebPKёЃ$3EМ”mimetypeapplication/vnd.sun.xml.calcPKёЃ$3 content.xmlэ]ы’л8vўŸЇPД[)_Z€ƒkЧэ-Л=“ЄжГГ5іL9IyЊиЛ[ЕЈвХmЯЏМCо$ћћ(y’›QM@"Л5žЉšЖ€Р98Ю?Š/ўєљfвљЮуhzжЅ}вэ„гa4OЏЮК?ОџЖЇЛzљ/ўёЭїчяџ§ЏпtЂЫЫё0<EУеM8]і†бt‰џvўњуыЗџvощіƒяgсєћИY?š_ oоПщ$ппЌЏър8ƒС7щvКI§бrд}љЂЊs”qК8MjЯКзЫхьt0ˆp˜шnF$пЛы Ы/“нэу›цЫ№ѓrgkл m\мгwмbг|4nwЖЖ pЮ7э/ЃДѕээmџт–д3ј№юэрлh~ЄВ|žŒЇПTЖk7MЇЋ›‹pО[’`фцeёщj[чЩ~JE^ѓнѓЗИ›н3#0к4FeЏ+дƒяА2ўѓнлЛщ›пььм6HѕЮЧГн’'MКяN‚ХтЌЛ˜ЭУ`ДИУЛЊмRJ=:Й~~ПDЧюТсdёђE<зw%фћ4ИAїz5кэ\FIƒЫрf<љВ.яv2—ЮЦЫ!NбЇkЌп vwќzМ\,Qњ›ЮЙ5J8/ёOС,ZќsЉaR|˜Б чAч]0]lQБ8|кvозбMP2)?щМ] ЧЃ`ct’б’’Ь№›ŠиЇc„ЬАѓнЛ§…[›і~‹'5НЋpЮЧCєЦлёbq`Льg/ [–ШК(X-б>ЫёАw‘ЎјoN•aDгqж‚ЧpŒ;Ъdu3эnЎœЭqЕЯ—уpaН@~щ]„и‡mгIrYяv<В8Фњ Х№&–6#С.qXƒтаОкMhVзйс‹8NŽhT&•‹8ѓ*OžGЗлdI АВwŽЏЎq[#}ЮьЛХ\-Т^4[Žo‚I/{ѕrО ]Є­ptiiIкeА}n7…7…ѓо,И {ЩoТЫ`5YnS%Ођt4^Ь&СWI†a^…“ѕgСмХё—ћхБѓЭG(џEДDм<ыNЃiиЭ”OТЫxТ aУ›Ю"šŒG?јПlГy2ЕХЋ—бЌъbЕЋpёqЋЦ›дэкљ.ЂЩШEї*>нДЌТі#а26˜›gb{#ЂGѓѕ _7Б™a/Z-1еBс/ƒЩ"_5œG‹ІwЖMОѓИЧ:qёbќ+ЖЁФІ!iY’рNm6˜ФŒёh‹ы…ЭWЌІЈ`"уvЮєД"ъіГ`.ђЪІ"ї‚Х8˜n‹M­А›кDфlelчuэfФL}"ЬŽёиУшf6 ?WŽžжWŒŸжWKPб$žЪ№fv$6)™sNЦсЅћRЉ <ŽgЉмчЭ“!~2~Ч-Иб,2ыЪWЭ;ћНn§БоKэu {^™Ћџ Ѕd(–6›цІ`А3п mЯ}Мx‚ЩјjjЧŸЦgŽ™eзєбjnЯј/ЧŸ3sНЫ-o‚љеxКё^ЇL?Єћe]M9`н5xoЛУИ(н/I;ŽYr….К_іЖџЄЯšЅ§ВПжfЩђч`ПАў€Ы'‹РсtT~‹“T‚мЖ6KК_RАчІх2eЛfЫEс§УVоKПŠ=Vё~кБ„ЃlПА№h"?жТyћ#и{иƒЏWhеRШЪьl}/НЭлТсњ~^м„ояЫkзГ*o/ж8‡ЫœІј…уГI0НZWЇЪЬ0ZM—s”слvЏm=-+Œэ~œО‘fSNяю:Чbm*~|Зяz}ы”!ч€жйС[zKm‘І5Ћећ *i5ыŠ‹hєхх‹фЦvќw}“;1Х;Ы{УЅ˜”eё%ОЏžЯцc{,Šлгрф’ў+zКўє/ КЙж,‹-Ц”žѕMіПb˜л lƒк}В{ћДGtѕћƒM бrнtᛇГ0X†ЃГ.xDоРЌп>чбэ–-‡Ѕ06іЗmф–ЄЌjЉяiVЛ/Lбы[ЛгВЋšВXдAa&<ЕЬ6D(>Н|Œ'УеВ“|_ ^"*_Ž'/ыњМ(ЖЧЪ11ћђNВW?љHQш0ѕOСdі–_fv˜D–2Љ8ыŠЛ‘Х F&NcзЖ.Д`]и1н‡Жб­кCШŒы’Т~7S3§ЙU+БОсwcГУЗв+еnКuПyT“•1ћЋЮY‡vžw^§дtјCm'*#зА‡Ќ&СYїŒ>џЯў7ьу€з_Ld—GМ 2–}–}…F}ђmћМУžvžu’єщгG`шз{Э,?ž<‰Э§œ=}Жў„к9ьS„ЂœщфЏЬэZТm=Ќ­l{п=JўїПеnb!Иž?ћ€_wžцЎ;ф’;bЋ%OœЅЖЫ›ŽЦІK>ЌЭХœЭѕПЎц:zCљl kCЬ‘YJ'$&xісАБТ#›“Lф7ŒVѓ‹е<ФщШO:%}О)УZzњѓпџ6H§э79;^IещPPШ3|>@"žщюзЌC5вѕ;E7Їnбаv “ђњ:@ЏЬohэ|#—^8ž]о3v68ўу7фŸ=щХŸ$~Ђіуk*?>§9.c“:јјlSQ;Š–}I3Ай“'јНaMЖ)ђd­ † ƒЬчbЖQэgі<.гѕ•$}#ИЮZЫˆ†tЄфйnƒЅКБЇqЖЛљђ,Ѓєж2е6ZoJ’яЪaZrзsjy{pѓ&6ъ Vп#Yг:%™\0йЌŽП=ФaлІ1ЖБЭq]Ž?ђ‡0ёVйЊ\U!’ƒ›іDŸ2*1„ ™=Ьы‰ЪXУ:mSЉ&6)?l’’I)€N9‘Й;-RРлЗЉЛІ”/LЉL)˜ъsB™‚h)pžЌjЪўч(ьЖ”lkFN@jeЯС–‘ъЋ-х [4kazЩ Еtj9,ує ЅFQШœк6`щњ€Ѕ§‹ƒ2Ј*aЙэ†ƒ~ЌвОXЅKXЅ}АJ*аUЯЯ…T^їоъС”NaJ{Рє ‘šрvLK%sоJШзSкІr&ІэGWІ ЇŒNYš ’3Њ•ШяRМ1З­+SЌŒX1\‹\hNŒ’"]БClЪЮˆe|Ы”Ыј –цšQ ŒPr{/V5[&…-у]IС)&†„J„˜ЌпJЧ[ЛЧ [ЦЖђ.пztХHjй ѓSe@Bў0ЫкХЋX™zx…MН№ s@ JхЈ д‘Ъu ЪыъTVѓЗyqлc„%uсєЃ1pо‰UОмvVтЖ3?nЛФ<ŠТI‡xpВЄRf;ѓaЖуК47V ­4ЧД>ћФЇНabОž;„Юмv™|Ё§јЊŠлЮ\ИэЈГbFc$ŸXѓЋЖСЊ>ЗyqлcАТL‚cЪCy9О‘њВлY‰нЮМиэB+‚2‘DqFs,ЌjКRv;ѓaЗ[ЧE—%ЪhFA2Њ ОћѕXЮќv•‹Ё[А Šп.ќvЋВВЛ@K4цВлA ъмС‹рnAKRР$ЂШТТтіё |IюP"ЙƒЩ]E9†—ЊpлTAJsšЛѕT+4cFсџРMСcT3б=odеz”UDwp!КЧПЛˆёЕ‘ЄЬJ:Фэ'РЊOt/Ђ{ X`ЄtuYОO( 3_І;”˜юрХtчLhJ(5’iCrGœ5vпхRІ;ј0нэ3 Ѓ@Д&‘  pЋтйЂ#.gЎ{ŽХЂлВЊИюрТuЗ`Јњ№vwТЌњTw№ЅКS)1˜фМV ­Э`хKt‡бМˆюРа96–5‡R)Э|hюжIеL% Œ№‚З~5O‚3б]чoЗ`UнСшŽз XсС:_ЕоЌънС—шNЅ6HpЊ-­`5„Ю;1Ы—ч%ž;xём™АOЛ‘fч4cЭQёЮ!хЙƒЯнжFW„ ”˜Т1ж!~^тH Ы™шž\Д§ЋŠшnDw"˜бљ_Е еђй;дgКƒ7г]QмЕ)cЉ†јG;ёЪ—ы%Ў;xqнЉТ”Pižчbб RЖ;јБнэƒњі.с˜ЦRZ<ЦњjhЃрLw79#›іЃЌ*К;Ибн‰Z2"U‰lф_ѓЋp™Д(жk*78‚с@ЦЛJЂЫЫё0<НˆF_юОЂсъ&œтьDг%ўћђџPK/"RЉх?ЌPKёЃ$3 styles.xmlнYыnл6ўПЇадahЪ’^т4vА6-6 mƒ\†э'-б2QJH*NіsЯГЇк“ьeнйiзЎ-RˆчуЙ|ч№№H9>ЙMЈsƒЙ ,ЙуQр:8 YDвxц^_Нѓн“љwЧпŸ~|sѕћљ[‡-—$ФG ѓЇвђŽbсœ_П>ћхуzОџ1УщG1ћўщеЉcžO‹M˜ё§З\Ч5ъF‘Œмљqn№0GF8sWRfGОЯР лX™Aр›gЗи wт5ТТ%О•ƒh(СhБEЗFXxФбz­РИХ/Y‰^ЏзЃѕFŽЇгЉџлх™џŽё•ОмR’~ъХkЉ…ІyВР|и$Qqw)7о”.‡+Ф‡љгˆ #бF" †`W=њяAЈМ?лаЧ“Aх PЦr’ {n Ў­§кi)ЋvЩ b#R1?жnVѓœЂjц'NЛЮ’Р%„оыЎSйšBм7$Њ˜ќaХЏ‰’c”8oг˜Зmќˆ2&^Е€fљalџŠ9r.Q*:Blš/Бћ;p…V,Am“f§Љs–‡$Bl=uŒ5ГR1o:ЮuJ  bч§хўЮЉнžq#ёbœbNТ™+жDˆЮЫ~iйЩCПуˆKІХл "МD9-ПUZxЉЊbJ] Я8œV. мvHDНŒЂ‹™;Љy6L EiœЃ8е !ЫSЩСђѕeK‡Ai_нАUhБ)KБ•КЛD!K2Šo7Хна[ЪЛ4w Cр–e^D„DЉКNЧЃЩЫ0бYъШС}s”­H(њг’ ьСѕБЕЇЃ ep IžуОjМ" lџ€зЮ„žоЃЙТ VbiJ?TфегwЭМmуБRkХ“gJљч-„баiv‡:QЧCЙd"CЊHH„™NГ‡hЖ*Шђ4”9’pzkC; J[щIБЗ€уу –О­9‘0яx Ди™›—eѕи›’мT_•šСІ˜ojUj§‡РmT­šs аmlwŠЇ„ЄI%ŽAcDb8щP3њ tX+u„9ч0@пu91Я‡)$7ŒЇjОд'ЄCѕ]В`дњY/_‹­”№ќ‡вх†ŠžШ;кш 'Vs–gњХA;^ЁЊЮЪ}ЩЬYЋзшƒЋЫЃхЦЖ@9PR=їJwєу7LЋ‰=AYy˜гˆH=“о šуЧO~ŒхЋYYk(ЫhAВWЋХ}SєbŸzў\ьT“ьь˜ѓ%oчќн…;џћЯПњГО•_ІкџwЄ?ШYxqЏГаНŒЧ;\0MђЖп{ѕУmЗNЭ%йєЌ2Iћ§›/Аоk‡ФЫo5^нnwйšБХ|œ!QжЦŽ<0W“ƒš&в˜тnЉ"7хfО[cЏр•ъ#ЊLЖ[и2OvŠИNж&ѕ•n;ФѕЯEњѓЯƒ“m&9Jb8!lU_Њ3ž’x‚х\yKrл’_CrWжіуЛzМSд–БюЈ#Тqhz•eФœI3Ћ"UV3wДѕяЅХЃš…иzѕV5Йz Рk-Ж,їПе‡_Ъ=ЙиЧ kžьzpЊ9Ќ ЦƒбЫчcx}гыˆЧ ЂxЉѕE^РыЋ &!,ЅeђМіихФ’1љЅƒёПУЋК~+л“2љі’Ђ$ Ц#ѕй6‡‡aтFIф< єШPdОиd|hЗЁ№“КЈгШ6ЫGa ў–,TpХx№•ыk*ŠЏ‡•эEщїіB`€ЮR,*MCwzХ’зn=&eѓcеыВтБТи|X˜ŸœœћЭХb%k$ОqTтьuGŒ0аЙ—ˆŠк'I&+жЯU(ХƒђкЬ0ѓБЕWYkЙ`Uе8tСoбИй œ1>HьЄElqБрX]+ЪŸЩЕѓир$‘Д 1ЯOZ<д,е–є™iX‡9їŽ$0ш” OOЪpNМ@§sчС3?˜Њ_~/СL9˜!ЁЙ§>э:дЭCqМ}лЂoоdšЃ­Mƒmујњ#cЗ-њцiпmm€Яћі7хЖѕ§§§ьžЖ-БжzўЏ7Џц/ЫjoчђЁШWяЖoЕ}геfyUЧg7Бу—њnБopыРЛэ”“лИ:юПЖХрš~Ф#4эУbo,PЭ_ƒВ§x§jp_Е<:ИiА]_Rхыу3ЗMІ=њ“"ЎыЫiЗžNшбЫёІ)aіyЕ>­Џ.ьt;aЅ“іѓљ*^Є~„Дпoтe^<\NЭŽи†SЏћЄћЖЬWQБВ€г|‘70;<_]ЬїX{Ф0OŸDš%љ2.Ђu'L€N?qzж№юД’[ьЯЪnAпe]СцUMžеO0DUО‡ŽЋrhnE7yQЏ%С_nкŸv"#›Ч&@ž6cэrZ—EžюГŸjѓo:Й)БРw§ _Wy\l- šh‘­В*O`ШћМЎыМI FюbшлO?hџSW3ŒЬU˜ -ЉAѓюјqЧ€рПЦыВўлзЋ4М‰WѕфнVіхФў~§fђ}ймц‰+ўћїxђCŠo(zБ§6Вѓѓ>CЧцжzoђn•CЫ&ЏпИкW›$OуЎЇmг7xпBЌюzЕwЫрлQ уоОСуœœ”Ыu‘}ИœZ{_Nь”j˜бžI>fm{ІМ5rxвл&{І§„ ‰Vc”ЩћhГNЫћUtWР7qQУЧњћМЙюЪbcŒ8њцЖЪ2 Ј пЦ…ЇOГlэ‰ BjЊЭ`eн бVђАМ.aАˆі’;3яdЧ@л1кдY:ъ ЅЪ*KšН ‚…uЙЉLљ’˜E­ъ^ЛЬтUtYU•UДŒЋEОВтЂМО,ђeоьш6ыѕA] —еCЯ‰cєJ кŠйЈ[•-ЊЌ6ŽŽš‡uціksB_gEддЖЖrїiаіЎЗњ'`эЧ^'RVДM­a™ц‰јСЮШ‡\ˆ„x_УчРU9lvѕБFхІ1ЦЈ+Ъ„csЛ4юіE% Ўˆєa ЗшКЪтїоX­ытЊŠW‹Ь”Ыђš>DцїФyЗЅЊэ Y!Э+@j[ЊM5uSe—Ћ ЎыD‰Љ)ОPВtФ}k™§&9LЯј9mH[§њЛЫTvІO ўD‚0…яc)bŒПC”Uюf‚EМюƒЃ­tЫ!шiдтІИ3ЗœЙхЬ-ЧЙeчˆќБТwЇР<з~~эЗfˆуƒ!D’t4c˜ЕНD ЃЮR˜Юуй*нЏwч~nnЮ‡ѓџ&њП<œЫ3G}~ŽzdQs„ЗДІTˆЃМEЄ>Ъ[cНЧ[vь3oyыЫ[ъЬ[ПGоъd!xЫ<Š1Ем™ЗЮМѕ‡х-}ц­п#oб4ЛІiоJ’і!ђ™ЗЮМѕЧх-МѓвЩ'НYqф]‡L˜cMОjqЎ€}нm–/nЋ|Ъb>ѓk"К§йСќр;>тКLЎ.КФцГхІўЮžЭЄd=aѕKе3ЮZыzй7ЬE§№||x^aоˆщ K:‰WЙНЏЬ№ж€“™DДЗ Ђ3eяСій fщVБ.Ъ&ŠЋ,ол’Xћжлѓ$їЕЂ8MMТИœОЙЭВЯž}ћ ѓчГg/ŸQсPП}>нЦЕЭаЅ*яЗ1ЬИ]V\VлTж-иYубjаŒrйянgŠпнjІ5aПОјC^ЛЎя3d?Лжu­Ђћ=ЦЖ.Њ6€Л†бр,6ѕ эЌГФр)@т™ ‰yЬЙокъУ|, qI•bTЙVi џ"$‚шЁD )/ЛЊSK‡Š(F5E‚Ќ$wjЌ ГйDHЦИbHKС]>ѓTaь+ІF”rЭсЧі=U я Ю0Ѕ/„:юwU'‚ U?`ЉЉ nсаЩТl5dELх8ДY j)Žw,іВP^ХB"ЦА&ИЪuЎЃ:œТФžQ0‰8’ ;U™Ї Гбˆ ЁЈТ”ЕTх$._jšj4ЁФат\U(џCш"6а%q7РQ xAXV‡‰f„"sН0ˆMРAЊ0щфыБ8ШрМЪ]Гci0+‰АтRЪ™ччБъTа:ž›?}›ЅRЁCНv4Ё@&цKŠзў|e РI!€:’„/КЊ`;ƒSШœЮкпGw*№…9hЃ&A„9Kюd,b„ДрЮйkЅ›‘{'зЩBљ•h Ѓ3 ЅНРюb=нЉ ŠQр(xб^OЙБфhBС‹PLЙa+ GyщЂЬе:kJ8аbЊ9т@šЮн™Ї цLЦА@=>ъњšSС.‰Г4х%А^ lд”$;y{‚ь!ƒЄфAi((M-\ЭœъGw*p…y;ЪCŠOс#Ьб„ВЮ$ЃР ŽxЬч4Wp’!Ј§5‡`ЂD9їgž*˜€4С7!ŠzptЇ‚^ЈJ#Š№NЙдЪ‚J(ќ=“0д/Ш‰pдpŸtYYЈƒжГРVŠAI0~`ЛGy*P…ЙЧ1EIД „ 7‰јš`ƒ4С&˜эђ™Ћ 7Ў$‚р\Щvюб6ŸK„ €АЂ,T”ЩEDвsp9B§€еFXЫ™DьЛД{‡ЌvєвУG)+€ї_јѕЫ›eY g|9Pз“М"\вNNвg`„уУmE 8q;IŸ>ёOљHЗmkЖЖ"gѓљіпXsQЦЃ—ЎШйяC^m”ЪгNbпфR7й=q`3ZNŽБ˜ЮOзDlђ$›Œ‘WгтСC=o =Kї |ю7ЭџPKЛYLPKёЃ$3“Ўmeta.xml OpenOffice.org 1.1.4 (Linux)2004-02-29T17:21:282005-09-04T22:31:342004-02-29T19:50:47en-US15PT6H27M40SPKёЃ$3 settings.xmlэ™[Wъ8€пчW0}Ѕ…ЊœƒK9Ћ”ЋW(•ЗД4Ч4щJR*ќњI)8ZЉb)s–>™&љіЮNВ/сьзГK3Ш8Ђф\Љ–•$u™ž+#Ћ}№SљUџыьяц­a=є[%њјˆxъR'є! !ЧђRдИъ%х@UoHn—у)›Њjгj–’vs5­$ЉjыF)) №аЎR?ЫЄK- ?MКЯOˆрTUЉ”Cџ“Ѓ•Ыe5i+Ћ Я‘Ї—ёQFGЫБ•Z­І.{зCJбєvEM†(kМБк‹юk•ыgЩ№ј шЧы)­>рЫ•ЬŒ^VЉlšѓvќqdcЈ3,(ыN1d'"BЉ—Ядї/ЏрЃиљЙТл„ЎœTOvЧw!šzUзЊ'•­љ>qс3tгВ`Дy—–sф‰eѓm4†QЯMЉЩ“G@ЉЧ•/iCSzZ@Zф3EпNzŠЪ'аЇЌO9ђ№пoВіIО|K~иxNŽѓЁЛ”Ё%рa€‘ИІ.LлпЃl‡3™@ЮОш)эз*ђŽОж|нh—ti†yД|№ЕОћ­5жЬr*;r‹ѕпkjƒ A§/€7||эЬВК—^gл_њЃ ‡—8ž/†У(Ц6`™!Fћ‘гВJ}Kr Нв1t p˜І&^Ўœї€)ŒШ‡єjNјаЃQ, !#эSŸС8uIёmJ1DЉ?Ьa~1ШшRž%@Аpў ћBwJ‡іШ1堘Вгј UДъ‘ІT из=XЅ ИT=є‰IЃ.ЎЬšї"dщHЄЇйНЧoC!‹8œћ6Х|гЁ!C‹š€ ˜ош"nVюёUЦМ7 &фrП3ГУJnOœЦoNwФCлE3Ф3е/ОYљМG'СыЯˆчФё%hs8ЂœйРЊZк<@–ЗлУI#d омЏTХп1у‹Wˆ<˜]L}‡ЃяpєŽўшpє™$=ди БtХућВD•ыИ‘Œъœ’рђђ†щ‡pX=n и\ЉƒЈћЊ#GЋ…њџрoPF‹;н›™=§pшЎ_ы|4Tѕg[oOFђп'[~њ5dvкх‡ЁўlЦм”'їНкфОБАЕуKћш"˜Шoїf лЕQЇ6wЛИ\>hЕм}Ћuщh7žнеЎ-=2ќŠчјn`ћІШxсv*и&ƒкЕEWM_ыСo[{ž9О)ѕ7iпъ•Ѕь…нk“ЛЈіКпѕёя‰UŽ м˜-ЙVbbи2=ЗгКuкd2О  ?ЊZqйэŒчz ‡Nw\Щљn3АмN;œtкѓ‰\pЮуx>т5EџьЇя6e6r]H 0рˆ8lюњ~Ш4я_зw+чХ2hЫЯ Ž†9ŸHC€ЄэŠЊ~>ПЇˆШМ&cЕ[ZФ§pўЎЙћЇv]яМA§€A‡ТЦzќ2Ђsiы~H‚ Oб…М3'ПрнSО $ЩaлŒњєƒ‚дBtŒe6G“ j€8Sј- 7ѕняšjжЏДѕPKЃ p™ЪNPKёЃ$3META-INF/manifest.xmlЕ”СjУ0 †я{ OїDэc”Є…Е ЖЅ‡єАЃч(­‡у„X-ЭлЯƒ%ЌeДЄ7ЩHп/§GГCaФžjЇKУ8 ЋЪLлM ыє)x€йє&К]$ѓє}Е…Д:'Ч“6ЋѕуЫѓ\@€˜Td“<зŠТВо .в…xmы<qљкЇ0у <ќ/гe]—ЦАeЎ&ˆЅч—=џn4c[фAЂ'хкP@–ыцзФ”ipSQ ВЊŒV’§жИЗYшv6єЂЁ’FAп’яŒ *Щл№,…у”•VМЋЩKc:0њSUiй7o0(зqcШ]€=ŽK>>IБИЧыИасЏeG'pБ/'Яn+kўGtаU b9ќЙГџ7:c"ь!?Сє PKL•Ъ’!qPKёЃ$3EМ”mimetypePKёЃ$3/"RЉх?Ќ Bcontent.xmlPKёЃ$3M ьŸ!” `styles.xmlPKёЃ$3( xЄ ;aЙObject 6/content.xmlPKёЃ$3ЛYLŸ$Object 6/styles.xmlPKёЃ$3“Ўў%meta.xmlPKёЃ$3Ѓ p™ЪN (*settings.xmlPKёЃ$3L•Ъ’!q,/META-INF/manifest.xmlPKн0sailcut-1.3.5/doc/fr/model-sailcut-fr.sxw0000644000175000007640000013163111354200643020175 0ustar sharkyjerrywebPKиЊъ2сЅ19mimetypeapplication/vnd.sun.xml.writerPKиЊъ2Okу``-Pictures/100000000000018000000214F983AB6A.jpgџиџрJFIFPPџлC    $.' ",#(7),01444'9=82<.342џлC  2!!22222222222222222222222222222222222222222222222222џР€"џФ џФЕ}!1AQa"q2‘Ё#BБСRб№$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™šЂЃЄЅІЇЈЉЊВГДЕЖЗИЙКТУФХЦЧШЩЪвгдежзийкстуфхцчшщъёђѓєѕіїјљњџФ џФЕw!1AQaq"2B‘ЁБС #3R№brб $4с%ё&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™šЂЃЄЅІЇЈЉЊВГДЕЖЗИЙКТУФХЦЧШЩЪвгдежзийктуфхцчшщъђѓєѕіїјљњџк ?їњ(Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€)ък”:6}Њ\,•М—,`*ŠX’p=Esњ‹Ўu4ЗОКДгcбn,ЅМ]Nв§ц‰l€Ќ…сŒ!У1ффyn8ш5i/ЁбЏЅвсŽ}A-фkXЄ8W”)иЇ‘СlЃъ+Эє_о/эu/ Iсэ&ђЪHu§:YmфДЙ;6ЦБЧ6Nц9%P€YƒzDЖ›uqНОЁi4ђл‹ЈуŽefxIРrPž7tЌЙМuс8"Ж–Oi^MЬ­ R‹Дd.ЋЙ`p0ЮHћЪ:А—№f‰,ўжЁеэчд-m~еЁiёo@ѓXТю˜ #QŽSw“8Цу%…ЗŠ`гєwПгu-@щZУД+4–ТюKCi*+H|я-œ<ЛIм  FI ГOзRы\ПбЎЦ;ы\HАСzВЛDz3ІбАTTЏЮИfЩСџ g†ќ?ў +ЩђМџ3эБэђїљ{ѓŸЛПхЯMмuЎ/С~ ЙбuK4ж4лЛћ§2тхсзfеЂ‘&мKЌЩYXОжR |Ќлирš}ІЖПи>o‡ЏЂђщ­• пhиЧœџЧЪф Ÿ‘јћЛ€; ­wGБг дo5[{іљ73\"G&сЙvБ89‘ŽЂД+Шх№fЏ>ЁmЊj:VЅyЇм&ЁmsЃAЈ‹y`YюхdЪЬБШJ#ІџюŸ›хў‚ї.|;g’IЅ=Œ1yЭ$qEШмЪ8ˆЩ8Я&т7^жoЌДЛЋKи--р•ЎmnVU-#J6Й=Œp;шiКЖ›ЌлЕЦ—ЈZ_@ЎQЄЕ™ePиЉ#8 умWъзМQІkštZ4ўћv‰ggЁhcxd•šфЙo-–P€э.ьЏE='‚єuБ{эAќ?wЄо_$"шоjm{,ЎŠGо.уb†ТЖA<хT Ы­wGБд`гЏ5[{щіљ6г\"I&уЕvЉ99 ŽІэнћcћ#ћVЧћOў|Оаžwннї3ЛюѓгЇ5ЫшАјŠгVеДЭSУp]йЭЊ›ЫmL\FQу2S*Б2y‘EL)".UT=S“Hз&шrјz7ŠџiEЊЕЬF$‡э&чrЏњС.Ёк“Л€;ё.ƒ%ХнКkzkOdŽїQ­вPсЫŒхBž 8Чz!ё.ƒr…ржєйP[ЕбdКFb­'юш"И§Hз О БП№єvЇУ‰"MЉ5ЬR,ЊА4 !л—Ф›–B&6rqUэМ!"ќ?е-m|#ik}&Іn„тЅчк#‰š2ы,љ`7ф}оHYЇxЧGПЕеЏПД,cг4ћЕЖћкаУ&b‰їoћЃц—f2y_| зtwгЃдWUБkwљw"с oА3688фњoC\YЖё ъwФ~ЛSЛ ЖГ\лЌ“BжBеі‘—zœОЈ#6Nš~ЋGЈ[ъ‡Aћ"ЯтY/фГŠh‹У YНП›&)bј‘‚–?9ћЧ4жOт-*ЫЎ%§Єњz!ež;˜ФnAлДHЬ%О^X №HЈгФvšЎЇ­пiVмcdЋ~н’Л%`›ВЃ=~ fИ}GТКэТщ—bвљЃвѕНFitћ{ёlїмK!IЂ‘$dYЪХ ЫЎ@?5{Ÿ=­ж“5О…}.€К|њ|К ІЌбЩl$•Ѕѓ ™UdпТШ›№0d zeц­ІщїЖїК…ЅДїoВк9ІTi› a9c–дzж_‹МUoс=:вцуШ wv–‘5ЬЦUи3fG Х yкy#8a‡sЃjzNГсйє .юЗЗЖБНXю#–Щ­`Цоd‹!xfIdчФ Я зг­!Ж№єѕЌЗh—жSЧю0ФК‰RЪсЏЗоYkгCeЈмxŽогFK+™ЎЫ@ъR6В:'Єйгя)Јю5п3ФzžŸЊшokw“Э —Йš2™‰эд2ф1$ёХpz†МMсшo-є§3R‡CўгI4л6šвkн>3 †W‰Єf‰A‘•,ЧcHp‹ЭJеЁ‹УЖвшЗжбйыwї’НеЬR”†EЙђЫ0•™˜§Ёs•rN0XsKё бПˆЎtл84ЭLлЧ:ЙŽ1 G‘—g8п‰@=xњ‘kК<іkyЋc%ЋE$ы2\!Cd 6qЕIžƒ<зweтЋ/ЖЛc }ЖФъГyЖr\Ф˜šкк%Й‹/А00Ътl„aw’Л’СЈZъZ^З‡ф!-я"–ТЮX|дiхŠ@ьY‘ §гУј.2дЉ/Šќ?Ѓca&ЕbЗWё ­ЮППB@RЇ8;‹ ПоСЦpqБ\aЌiЉрЖŸDЛЭ–&›xЋ,лЙk`Пy†B!sђю8ЧтЛЪ(ЂŠ(ЂŠ(ЂŠ(ЂЙ?‰З“Yќ7з НЄ—sм[§Ž8cЮцiиB0$dЮ;уf€.x'Фџ№˜јBЧ_ћиўец~уЭѓ6э‘“я`g;sгНtфџ!ўЦ—ХоŽкuЕАе^Kk™3ЦYс€86Ч,8$‘ŠшZ”#ТЄЈєŠАšх­фzUŠ]ZD Ж™mа<1€@DleWŒ95ЁEŸІhZ>‰цџdщV6v<ЯВ[Є[ёœghЦO_SZPEPEPEPEPEPEPEPEPEeыў#в<-ЅЖЅ­_Gih&і‹1шTЧЉР€O@k“ћ‰|ЮЏў№г|ЏІnSwЈФ~oоИц#j˜зццE'Ё  юHwЎ2 зYЁjл~г5o'ЩћuЄW>Vэл7 mЙРЮ3ŒрTšV•cЁщvњf™mЕКlŠ$шЃљ’NI'’I'$з'№чЪвЗМ ОBaъіxЁоvZЯћшw3}цљнOћњтŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( СПђЙџАЎЅџЅГWA\џƒфsџa]KџKfЎ‚€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ тѕ_MsЊ\h>БYж-пЫМwЧkažJјљШcў­2Ф#є+ŠЫВ}Sтœ to?Г|вЩллœЭЋФЎЪYœ…hc;@ит €œ5оiZUއЅлщšeДvжvщВ(“ЂцI9$žI$œ“@ўрxtэQuэjњMsФ кSЦ#Цx JvF1žG$Гѓ†"КЪ( И{ЛoьoŒ:vЂ‹8ЗзДљleXbФh‡їЉ$­œ1‰r2`qœwЧќLБyќ>Ѕm}ЂKЏkчГоrЎP:у§Ўн@aEWАОЗдєыkћ9<Ы[Ј’h_i‘€*pyuЋQEQEQEQEQEQEQEQEQEQEЯј7ў@w?ідПєЖjш+Ÿ№oќ€юь+ЉщlеаPEPEPEPEPEPEPEPEP\ПФ-RуK№]№А9дяЖиX"м]Ї˜ˆзcт]Хџр‘дuСј‚fж>,јgAQ[щЖѓkWQЭ•sЬ0”8'zЛ3vƒ’@РaЄщАшк5Ž—nв4VёлЦвXЊ(PNРєrŠ(ЂŠ(Јч‚Ћymю"Žh%B’G"†WR0A‚у%Хќ0YxNMцKЙn4;йєчšх U[|l ’Bž<{tуі•С‰AјвёcŠпФКbА”–fšюиœЈфэфvŒч=хQEQEQEQEQEQEQEQEQEQEsў џЯ§…u/§-šК чќџ ;Ÿћ ъ_њ[5tQEQEQEQEQEQEQEQEWŸќ4џ‰Хч‰ќeџ,ѕ­CЫДdс$ЕЗTNќЪЧчЮьtрзcт.ЇyЄ|?ж.tшg–љтжыnХdLЫВ м ‚ф‘Ž:жЇ†єH|9с­7FƒЫ)gn‘HФbFц}ЃЁfЫO$ђhRŠ( Š( Š( /тB5†—ЇxЂЯ ^Чw'‘lВЪіЭћЛ„\§аcrФєљу‡iTѕm6gFОвюE‚іоKy2u*HШ#8>†ЙП…ї—єы[с_щ›єлЈapоSРЦ0­‚~mЊЄѓЮьŽ ТŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( СПђЙџАЎЅџЅГWA\џƒфsџa]KџKfЎ‚€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€8yZяФ_ xxљGaП]КїЋ/їpaС§уБ џsž8nтИПЛjњЇ‰|P^FƒPНћ%–.Vhšкл1ЋЧށЄ36:s‘зsv”QEQEQEWЂЃhŸuн($‚ЯWЗM^м%ВЄI*‘ Ро9gcфЙџxчхЛJрў"Bк~ЉсOЦcQЄъkЫЯ"ЌQ[\т)$lr Lp2I;Ъ(Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€9џџШчўТК—ў–Э]sў џЯ§…u/§-šК (ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ+ŸёЦБq ј/TПВIојEхZ, ЯˆтТŸНѓКёЯаєЎ‚ИyZяФ_ xxљGaП]КїЋ/їpaС§уБ џsž8`“Уz$>№ж›ЃAх”ГЗH‹Єb1#ѓ>баГe'’y5ЉEQEQEQEV_‰4H|Gс­KFŸЫ ynёxФ‚6#х}ЇЉVУG r+RŠцќЏЗŠ<ЃkД<ісgwURђЁ)#axВБЧp:WI\?ƒтMЦž.№љ]ŸiЛ]nйфYцIРY0€d*I Ÿя.{ю(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(Ÿ№oќ€юь+ЉщlеаW?рпљмџиWRџвйЋ  Š( Š( Š+Х^%‡У\W o%енеТYикЁ n.;qсС%др Ъ+‡зuЏxj]:KџјSЩžю4š+˜Щк РJёГм0fPРу™Р="x‡L’тЮžF{Ы‰э`" 6ДА—!mИR<ЗЦHнДу8  J+“бгУ’ ž'ЁС”PЊш*ёCјr=bЭ4ЭN Fyэ.х”Ъб+|ЋDЛC1ючhўї{  kжкІ™щВщіZХЦЂg{ЗI]gѓї/–" ћAЧЯѓlwwЫкQ@ќ#кЧічі–Ыљ>пх§Ёџупь_eЮ|ПѕŸЧЗэЛНF|;ЏAalж‡Mћe†ЛsЈлЄВЙŽтžlЋА\ЦћnAдŽвŠсгBё:јq,ЖXЄЭЊмн\CЉ4"X%ye 'HƒЃ,’'нˆљ8bДxcУЦЅЩ-ž•okk§ЅCirфGФёЯСх(;J+РЦсХХјK@зД+‹Л‡MxGДгЎ+З,nfУ"˜€`ТDЮJэчя`gДЂŠѓџФћт/„|5Эœ­Ўољ^%‹+№UЄbЄ[§бЭzy~‘с];ЧšчŒu_щŸiЕ“Pm”WГvП+<2ŒWrФ…РЪА%Й­ХјiІYЅ”ZЏт  7.Xъr4LKљЃ—z‘œœ`Ич4кQ\[hў?г’іKщКЋЛƒm­Іyb5мx2@Ы“Дђv• “R&Йуk;Ы[kџA{ ˆ‹Э+SŒ€ј<,SЯP8мpЉ#иQ\~ЇуЋ­#ЪћOќW'›ПdЖ‚чЦsхLлzїЦyЧCQщПрОИhЎ<+тэ=нhВВ“‘ђ/yЯ9щŽ=2кQ\~Їё?Тz'•§­w}aчgЫћ^•wќc8нЮ2:zŠаџ„ЫKџŸ]sџWПќf€: +‡Ој—ЅфCрџ^ЦИФ№hЮђр9VуЇ tєцЎiО4Меmк{ј\ЁQ[лЖp $ЪHчЎ1зааYEpяЎ|Bд%КЖА№uŽ—Œ›{ЭWSY€aУEfмWЗ–LlСр+ƒА ќй^ТŠсэє[щкk§—Jkы-nяPђ~н уœ\qПЩШe7ЦвLфgПƒ>Т#yМzv‡5­ЄВНЖЊаgPxмFџ(r<РФPЛrОEQEQEQEQEQEQEsў џЯ§…u/§-šК чќџ ;Ÿћ ъ_њ[5tQEQEQEQEQEQEVŒuѕ№ЗƒЕ]iš0іЖьбyŠЬ­)љcRœ*;uъ:жхq~,vеќcсBђlKƒЋо˜nU"ЗЧ”оG™“ўј8щ•и№v€О№v•ЂЊЦжнV_-™•Ѕ?4Œ s‚хnНJмЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ+‹јЉІЭ{р;Ыл6Ž=CGtеlцrqхБ‚ьо`FHЯЈэ(  іжњžmg'™kuM э#r0N# ŽЕbИ†7?gбѕ/ Hгљод&БAu.щžпqh$a…(СWŒœqРю(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(Ÿ№oќ€юь+ЉщlеаW?рпљмџиWRџвйЋ  Š( Š( Š( Š( Š( Š( ИП Ѓjў1ёGˆцI6%Рв,„жЪŒ‘[чЭ(уя#ЬЯџ| єТьxЧ__ x;Uж™ЃknЭ˜ЌЪвŸ–5!yСrЃЗ^Ѓ­аТовДUXУклЊЫхГ2ДЇц‘np\Бэз щ@”QEQEQEQEQEQEQEpџКа>0џЫсё>ŸўлI%еЏў:ЋфЩј˜ћНмWё<Эeс8ѕыhюхИая`дRg(eUm’+ by3эзŒƒиA<7Vё\[ЫаJу’6 ЎЄdGЮhJ(Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€9џџШчўТК—ў–Э]sў џЯ§…u/§-šК (ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠтќXэЋјЧТў…фи—WН0мЊ2Eo(:М3'§№qг+кWрй›]ёчŒuчДзшЖ›уQ,BZa>уI&сЩ' ` я(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(Н§ОЇЇ\и^GцZнD№Ь›ˆмŒa‘ШШ'Ѕrџ яžСІмЩпh’ЩЄ]y СРv ы”йџkЗAиWЅ§ГKјУЎY?Ÿ-ŽГЇУЉDэ•Ž!лЂŽC16$`Дx4мQEQEQEQEQEQEQEQEЯј7ў@w?ідПєЖjш+Ÿ№oќ€юь+ЉщlеаPEPEPEPEPEPX~1ззТоеuІhУклГEц+2ДЇхH^p\ЈэзЈы[•Сјў ЕЯxKУ)ЮюѕяЏ˜)xк`Ъ‘:vtc€v№IБр М/р=G•dYрЗ :;+•Щy+С™€Цx“жКJ( Š( Š( Š( Š( Š( Š( Š( ИˆоV“§ƒтіђћPOДK6ѓВжмЭЕWя7ЮŒ?мяаї—тMјkRбЇђТ^[МAо1 ˆљ_iъUАУ‘ШŠдЂЙПjSjОбЎ.–эnвм[м‹АDОtDХ!l’sНѓЯЎвPEPEPEPEPEPEPEP?рпљмџиWRџвйЋ ЎСПђЙџАЎЅџЅГWA@Q@Q@Q@Q@Q@pўђЕпˆО'ёђ$ŽУf…k"oW_я' ЇƒћЧPўчrн'‰5И|9с­KYŸЫ)gnђ„ybFхMЧЁfТŽ$pjŸє{Сz]…ыЮїТ/6эЇ”Hў|„Щ.X}ялž~Ї­tQEQETsЯ ­МЗЧ !y$‘‚Њ($“Рsš žЋxЎ-хŽh%@ёЩWR2#‚ч4%Q@^жўЮћЯћмD­оLќЙя#cЃ ŒƒШЋQEQEQEeЭт]лT\њо› ]PZ=в,Ѕ›FТs“‘Žr(RŠЏ §ХхЭœ7pIukЗэЄ€М[†WrŽW#‘žЕb€8 љZФ_јxyЧГ]Е7ГŸ3їs–cР§т)Ž8^тИ[fјгТ>&gк—mЅ]‹hВdŽрŒШйЛIBpr2љрт€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€9џџШчўТК—ў–Э]sў џЯ§…u/§-šК (ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠтќtЋъž№ИI BїэwЙЖYЂkklHЩ&zТЙщЮ]­дjк”:6}Њ\,•М—,`*ŠX’p=Er~ђЕпˆО'ёђ$ŽУf…k"oW_я' ЇƒћЧPўчrнЄ№Cuo-НФQЭЈRHфPЪъF №Ab€9yЕ{MбЏ|Cu>}ЅХІM|й+ЋnUŠГe‘ яі'№М#šїЦкДš?кt9юЎtљnЌn~Ы4HВE$jщ,~cЌ%L2А# •›TіLq\}m[ьђ<)$+€#xб‚:`(кР‚Љ5шšхХеЪ_ .%ŽyD:•Ь(в @Б$ ИyiƒŒќ ѕЧмјŽ_ јŸUаєM3ЭдЕnG„GM–6вЪХL‘f-§ѕъЭ’Fжя<9uЋоx~Ю}{OOеЙЖŽQ"ЋFAŒc'ЦN3Uю|!Ёо[мУqi$‚тєjэq/˜З(YїnŒ€ЊТŠдББЗгЌуЕЕЫ…2@,X’I,ЬЧ%˜’IbI$’I&€8 ъЦГтokЁБHѕ ђцккж7ЬМЖŒЊђ3~ёЖ”Щ €zŒVІт-KSИ№л\ A­ЁBDŽ& “)ƒ8bФl"~˜ШлїŽxЙІј+AбѕotыYэф‡ЭF—“y1‰NчU‹–ЊNаИШYјGGгѕH5Xюв{txсOЗNb‰DˆОХO•pЁp6Ўк0ŸЊпјЊуХWš^ƒ. КdW[Џр–F’iUTљBІ"9l=xЫ‹Фž0еЕћ*=+gJMB/Е,Э%І hmЄ x›хЫЩ<‘ЗцБЉј{ћsЧ7ыЉщЋщ7:|iƒPђ!}Іvq"G2Л)ЊŒЁчwž‘|=І&ЉeЈХ‘Ocnmm’)фHЃˆу("V ŽЊџ џupЭиј‡Ф—Iсыж}+ь>!‰М„ђ ,Єkvž=ЧЬ"e[Y'c$ ;=J*гTПџ„~§-МG,HГi eЅдЬnёШf;уИ|ЇPIЦkДг|сн#Q†њЧOђцƒЭћ:™ЄxэМг™<ЈйŠEИѕи*H<#ЃлXEb‘н›xяEњЄ—гОgПq,фАпѓэ9Rп1ц€+щ№CФm}тŠ4yДЫ••@.оeвхНNеQ“икКJЇ—imЊ^jQЄŸkМHвgi]Xїl Є nc…%‰9&ЎP?уў?kZJл§ЂiэШ‹~Эг(н9љТžN=xЭIрэ}|Sрэ+ZVŒНеКДОZВЊЪ>YчУ§:žЕЙ\_QДSФО)"СЇо§ЎЫЫ Kms™#ЧPВ —=8РщЕ@;JЯжuЋ-N{§EЇKTЩw†кIЖ ,Т5bЊ9cРѕ­ ЧёUžЉЈx_QВбMˆПИˆХПM№€Ч Йpsђ–Р ‚qFhцЊZjЉpіo#Є[;4NƒЬЖИ]Рn†FAреЪуќсэcТ:cш c&‘k,ЦТц;‡3˜кBЪВЁŒ.я™ВЪиш6їЎТ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ ЧёWˆmќ)с}G\К]ёкD\&Hѓœ"dЬTgg'ŠиЏ?—ў+Ÿˆ­jп>сyc˜”рOЉrTмБ)хrЄ9Уbё•з…–yoєkфННiэŸM’cПj—Ь]ыpЗcІ9=OIі?аwCџС4пќ•Gƒфsџa]KџKfЎ‚€9џБјУўƒКў ІџфЊ>Чуњшј&›џ’Ћ Ђ€9џБјУўƒКў ІџфЊ>Чуњшј&›џ’Ћ Ђ€9џБјУўƒКў ІџфЊ>Чуњшј&›џ’Ћ Ђ€9џБјУўƒКў ІџфЊ>Чуњшј&›џ’Ћ Ђ€9џБјУўƒКў ІџфЊуў"xгФŸД8ЏІе4;ЫЋ‰DVіƒL’2§й‰7$…ЉђЪ8Юkв/я­єЭ:цўђO.жж'šgкNдPKN=+Уч0ё‡Е;ш6ЯтmCm­НЬ FК5Ћ‰ЬR)ї’0WЯЬ`U$ šЃёР~ŽгФqІŸљЉGdк‹)”ДвМћ.РBЭЙ‚А8<ž w&БЊјŽпЯбМcс‹фŽт.FhУ ЎѕћVPœСєЎвЙНoРšЙ§Ї5Ќ–КВЃЌz•„Эop…“fэшFт7nqŒŸcё‡§t?ќMџЩT}Цєаџ№M7џ%V<:OФ ьіњvЗЅk–+)н§БмЄ#hTХИ;`Л&sЩЮpј‡qЇyiтoыšKyO5ХЬ0‹лHn9ia$є^~QŒѓЧЭ@cё‡§t?ќMџЩT}Цєаџ№M7џ%UХ~ёСЄkV7В4Bo&дШЈqЫ&w/P@С8<жХsџcё‡§t?ќMџЩT}Цєаџ№M7џ%WAEsџcё‡§t?ќMџЩUŸwqу }cNгcеє9fЛѓdј”LОT1ЏЭ'ќ|ќп;Ф›sŸоgЂšш5ЭOћCНдD>|DЭЖ™фш‘ЉСљŠЈKX€й/$‡ŒЋJбЗ1,}Цєаџ№M7џ%Qі?аwCџС4пќ•]Я§Цєаџ№M7џ%Qі?аwCџС4пќ•]Я§Цєаџ№M7џ%Qі?аwCџС4пќ•]Я§Цєаџ№M7џ%Qі?аwCџС4пќ•[“Я ­МЗЧ !y$‘‚Њ($“РsšфяО&xj dЖгn'зЏ’!7й4HёЪn NSф'Ь;zŒ€h}Цєаџ№M7џ%Qі?аwCџС4пќ•XэтъўbшОƒM…тImЏuлРЙЮвUр‹sЋ`З†1“ƒђаџ[–щќaт эjђЋa 5•š&ръ<Јп,Ъs†fP$Qъkx”&мцWcœрєЦ;JЏ}gІYЩywЅЌxп4ђбr@cРЩ ~4ЧУЂќEг,юZщZЭгmђЃдДŸ!ŸšШШ=еКЦIЂmkт.™glГxCJжn›w›&›ЋyИ<|Г&FAьЭаž2t тЯ П—ЗФSyБ<ёті3О4нЙЧ<Јиљ=жє5bЯ]бѕ УgeЊимн–s 7ю#` ОаsД†RCИzау5е<]сЩ4<#ЎCkw,_i•n,ƒЄhсЮСчX” Юм[œmhсјЇNƒР5TЗvSГM†mФГy‚CМ–$—ЩмI99ЭvŸлК?§lугэпё№Ÿёяџ=КџЋџkЇН:юЉЫV­м’DgD‚с$-b…Р• чІF:а›ућ;ыv–уBё>žсЪˆЎДK†b0>aхЋŒsŽЙрёг9ѓќOXn%‰<уYбЊЫŽС\ї†цЏ P+МЂ€8§3ЧWZП›іoјЎ?+ОзmЖsœcЭ™wtэœqžЂOФў,‹ЪўЩј}}uœљŸkд­-ієЦ6ЛчП\cЎxь( ?ў.=ЦБџ2ЅŽ˜пѕёw2|ПіЩ[-ўюяŽkУрПнймкыŸѕ[ˆфлАщЖXК`фќсYЙуЁ^рфю( >псЇ‡апVкѕХІџ.mfђKЏПз1Бђњ`pПТQšъ,l,єЫ8ьь- ДЕ;!‚1.I' 8$ŸЦЌQ@Q@Q@Ти[Fвѕ JcSЁjrСn†EiMʖ)$СЦXHм€ЦAЎђИ{ЙSBјУЇmБј“O– !ŠžлчY]ѓ“ћЗtќЈЦот€ (Ђ€ (Ђ€ (Ќ?ј– x~]IэфЛœКУkgK™œс#Aд’y8рЦ(›ёќVо4Е№Є?>•ЃЫюК#Ко ‰ˆмрЎмѓтНЙПxjo x|С{qжЉyq%юЃs*ВмHrФ€…рvч$WI@p~=žoокјM–Hю5[NTcƒOЕЪЗwvсЗkЌз5›?hwКНћьЕД‰Ѕ| cЂЎH‰Р<’sўбЏ ‹Rё&Ўž^Џт RъhH лBРй,ŠH'h$’q’жA6Жё[лХ0D#Ž5 Ј `Ц*J( СПђЙџАЎЅџЅГWA\џƒфsџa]KџKfЎ‚€ (Ђ€ (Ђ€ (Џ7ёЕжˆž-Авцёњ=фћ/Џ%›VЙЗ‡ьЈлLq*Ц$МHп{n@;OkpјsУZ–Г?–RЮнхђФŒЪ›BЭ…Hрз€|6“Х~&НгoДhd'Nsm&ЃЉ‘<6тGѓю$!ЄžVfCЗiXЪЋ1/ц/ЏјЛHoˆžг4ћ Щ!бuŽюющs%Ае7Ь˜ЦAЦFЯenЃJвЌt=.пLг-ЃЖГЗM‘D2IЩ$ђI$фšфў#yZЗі„ШэЭA>блЦћX?}6ж_Кп"(џЗQмWЂЛkuнT<†ЯHЗM"мЅЪМO+5Си9WSфЁџtч$a{J(ЂŠ(ЂŠ+“ёTzќ №ўЉЄiqъЖ–Џ4w–†eŽD 4{ШMъз“œHЪ0‘жQ@>ЙЁ.Б?†ыС№M z„зP‘o"лЧ"H§Фe™фŽG ИnF9bЖ_‚ќsЂъ–iЌiЗwїњeХЫУЎЭЊ;E"MИ—X ’ВБ}ЌЅ@љYЗБР>™Ep~Аж,5O к]h—qСЄшђщГ^љАџб№ш›Ъ!Б•ц\Ю2ќaт­ХzžЁЉјntЕзvЪбС{‹ІИžbPя—.Ќ$2Г'ё9;PЂ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€8П‰іlўXŠоK™є и5teXФ‚Ы†$<ВчŽr^‡А‚xn­тИЗ–9 •Ч$l]HШ Ž#œб<н[ЫoqsA*’92К‘‚<GЎ/сEѕФО ўЩН“ЭОаnцв.$UТpЛ1ŒЈBƒ$psъ@;Š(Ђ€ (Ђ€ ѓ§3ў+ЏЫЌПњG†tlGЅчц†ъѓ'ЬЙ^›МОcRC.rЪAЭh|@жo-єш<=ЂОпыЛэЌ %%e.лБ #mлp­ЭtgсэЫHАM–Ж‘,IlufРБ9$у’I  (Ђ€<џSџŠыЧ1hЩў‘с2j˜љЁКМШђэ›Ія/‰Ыœ+q^\НЏУяиљџc­ПŸ+O7“Ќо'™#}чlKЫ “ЩЋ№†щѓѕЎріїџPAEsџ№†щѓѕЎріїџQџn—џ?Zчўoјѕ џЯ§…u/§-šК рќ'с=:}сочYjwщђkWˆ0Зs(сe8žЄфœ’MnТЅџЯжЙџƒлпў=@ЯџТЅџЯжЙџƒлпў=Gќ!К_ќ§kŸј=НџудаQ\џќ!К_ќ§kŸј=НџудТЅџЯжЙџƒлпў=@ЯџТЅџЯжЙџƒлпў=Gќ!К_ќ§kŸј=НџудаU=[R‡FбЏЕK…‘ ВЗ’тEŒХQK2@ЮЈЌПјCtПљњз?№{{џЧЋёЧ†ДЙЏ<;сЈю/Ѕ“YдЮ‚їVН•жцЭ€d+ЛхEХЦм GУн.уK№]‰ПдяЗ_пЛ[ˆ]Ї˜™zт]С?раuЯџТЅџЯжЙџƒлпў=Gќ!К_ќ§kŸј=НџудаQ\џќ!К_ќ§kŸј=НџудТЅџЯжЙџƒлпў=@ЯџТЅџЯжЙџƒлпў=Gќ!К_ќ§kŸј=НџудаQ\џќ!К_ќ§kŸј=НџудТЅџЯжЙџƒлпў=@ЯџТЅџЯжЙџƒлпў=Gќ!К_ќ§kŸј=НџудаQ\џќ!К_ќ§kŸј=НџудТЅџЯжЙџƒлпў=@ЯџТЅџЯжЙџƒлпў=Gќ!К_ќ§kŸј=НџудаQ\џќ!К_ќ§kŸј=НџудТЅџЯжЙџƒлпў=@ЯџТЅџЯжЙџƒлпў=Gќ!К_ќ§kŸј=НџудаQ\џќ!К_ќ§kŸј=НџудТЅџЯжЙџƒлпў=@ЯџТЅџЯжЙџƒлпў=Gќ!К_ќ§kŸј=НџудаQ\џќ!К_ќ§kŸј=НџудТЅџЯжЙџƒлпў=@qvЎк'Х›ыYOВx†Щ.р2мЎбsoˆфHуы“‰‰ыђ |КŸ№†щѓѕЎріїџWё;УVІјЂ TdjЩu!еЎЄ›ьЎТ9R"вЌл—8+Р<аЌQ\џќ!К_ќ§kŸј=НџудТЅџЯжЙџƒлпў=@G<№клЫqq,pС’I*Ђ’I<9Ќ?јCtПљњз?№{{џЧЊНїУяъvrYпVюжLo†}fђDlFTЫƒ‚ќ(/РPMтлЏjQIЦ mІDъc0iсї eююРЙlА ЎвХw”Q@Q@Q@Q@џƒфsџa]KџKfЎ‚ЙџџШчўТК—ў–Э]QEQEQEХшЎкпФнwU!Гв-гHЗ)rЏЪФMpvUдљ(н9Щ^ЃVдЁбДkэRсdh,­фИ‘cБTRФ 3ъ+›ј_gqo№џNКО0=ўЇПRКš цМьd ицкЪmРр ь(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ*ž­ІУЌшзк]УHА^лЩo#F@`ЎЅIgаеЪ(—ј{Њ\jž БчŽы єk3Ќ№“oaќMД?ќ rzžЂИ? FКФпhBhж E"жэ-”3\˜ю˜Ž ‘TэЩ#фђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€9џџШчўТК—ў–Э]sў џЯ§…u/§-šК (ЂŠ(ЂŠ(ЂŠѓџŠё7Гб|Э'ˆ5у™W‡[Xˆ–gF?(eкsœœzzpvM­|eеѕ ˆЄ[MЪ+Q"—Fš`%’T'„p…Q€Щ!†H я(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(‡ёѕЯіБс_–œCkЈВ%ђсK{•квJqїUж& dфмVŒtёOƒЕ]–2їVьБyŒЪЋ(љЃbWœ {єшzQрэ}|Sрэ+ZVŒНеКДОZВЊЪ>YчУ§:žДЙEPEPEPEPEP?рпљмџиWRџвйЋ ЎСПђЙџАЎЅџЅГWA@Q@Q@WПОЗг4ы›ћЩ<Л[XžiŸi;QA,p98єЋХќHvПвєя Рђ ѕћиэ$ђ.V)RйypыŸМhTŽŸ8чi“с‹СрИ5+˜рKэnY5{Џ!˜ЁyЮё€н0…ьїъ{ ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ИмџfјгХо‘Їк—kЊк™rdŽрFИЛICђ22ј<фžтИyZФ_ x„љЧПBК‘їГŸ3їQР§т0$џž9PтŠ( Š( Š( Š( Š( СПђЙџАЎЅџЅГWA\џƒфsџa]KџKfЎ‚€ (Ђ€ (Ђ€ ѓ}KC—ЦП&”ъZЎ›oсxЂKy-cDпu0ѓ$+# Ђ?)Yчw`~o@ПОЗг4ы›ћЩ<Л[XžiŸi;QA,p98єЎ_с‹СрИ5+˜рKэnY5{Џ!˜ЁyЮё€н0…ьїъ@+ХiёB‰XjšWŠ#d’Чsoі ЯЪ6$l›Ѓфчя(єЮTџ…§“яјwUа6EцЫqх§Вб2ћU|шw|ЧŽWгИЯqEcшо+№џˆv #ZБН‘Ђy0ЮІECŽY3Йz€r СцЖ+Ÿжќ сoљэЋh67OЗЬИђ‚LлqоЎpрєуЅeЗЕ;$НmЧ ЕžхУ Оxят„'jЌЊ[$}№z[кQ\zCёЦђж1uсЭ^Х"y&Žk)ф|Ÿ—ЭAЮвHQœре1уЏiія>Н№ыY ЊD4Йсд‰ЪЅJЮчЗя(Ў.Šо{јДыЭJM/Pd %ЎЇm%ГBJoкьъN?кСуфgЄг5н[ѓВu[џ'gй.]™Ю3ДœgЏЁ  (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ +›Ÿтƒm­хќUЃ АŽі7bЯ Є–>Р{VzќKг/Ъ]HёЗу”IьtЩ%!‚ќвKБ@ЮFr@кsŠэ(Ў-Еъ){‡…4н)бРЖŸVдќС"ю<˜рVСк9Ц СЉCёЕхх­ЭџŒ`В„DХž•ІF|VYŒ‡Љэ аšь+МјЁс{СckЊjпМM,6šTOvђрЕL`Ўя”№HЧSЭW‡сO‡dћ;kSjО!šкS,kђOхчnT(! ’Ѓ ЉЯC‘]……ž™g…Є–Бчd0F#EЩ$сG$“јао!ёЮЏц.‹с4и^$–кї]М œэ%^З:Ж pXc8?-cјПТ1ж<%ЉмпјЎЗCw–К~iхD“ФЛЖЩ–\А~a†Уm8 =BŠЯаЕ?эПišЗ“ф§Кв+Ÿ+vэ›а6мрgЦp+BИ‡>V“§НсђћPГХѓВжпCЙ›я7ЮъмядїQEQEQEQEЯј7ў@w?ідПєЖjш+Ÿ№oќ€юь+ЉщlеаPEPEPё!кџKгМ/Ш'зяcД“ШЙXЅKe§хУЎ~№ЁR:|рsЇДЎжfз>4пdFжžг’ЦЛ’цф‡2FpN<Є I Ž@$žђ€ (Ђ€ (Ђ€ (Ђ€ цчј}рл›y` шС$BŒcВ1У(OИ ŽевQ@^›№ЃСк5У\izuнŒь…K]Nъ&+pJШ2ЧАЃMј}>•pглјчХЮь…КНŠсqxY"`qžОІЛJ(‡Б№з­/#žoˆp^ЦЙЬшQ„|‚9)"Зx#ЇЇsRƒт Vък^Ѕс‹™ї€ЩuЇм@Ёpy Г9'8уЯКЮ<ПВ^\[эыœю‰ѓлІ1ƒзгџлY#ККџЧY|˜џ'sї{Š(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(Ќ{яxoLМ’ЮџФUЅдxп їБЦыЪ“‘AќkRјЕр=*с`Иё-ЃЛ pmUю#–XЧLчЇЈ вŠтя>%iё[кмiк‰ѕˆ.zЩaЃЭД.S™‚ЙщлŒЩџ ŽЗyЃ§ГI№Й,ЯўЎљmЌѓ†СнКBыР$e9уБЭvWkЋјїPгЇјDє­.ыцH–ћX2ру‡"(ˆ+“гp'ЇЃгcј›-У.Љwсh6Џkms;ШрЋH€ gœіsРiEpі>ёМw‘ЕџФ‰чЕп5ДNмaˆ`9Ч№ŸN:бџ л~ЃіЩќkу)s/š№џjљqП9+Ж5]ЊzavрtХwŸЉыК>‰хkjЖ6v|ПЕм$[ёŒуqЦGOQ\оЅ№ЃСкЭТмjšuнєъK­NъV ’p HN2IЧЙ­OјA<џBІ‡џ‚шјšЇЉ|N№F•nГмxŸMtgЌТсГ‚yXї8ыŒtѕЏФЯjztїКGіЎЋ[†,t›Љ78иЫкфu#ЈЩК‹ =2Ю;; H--cЮШ`ŒF‹’IТŽI'ёЋЧщž:КеќпГxХqљXніЛh-ГœуlЫЛЇlуŒѕ^ЧФО>ЛМŽ ОAeg3ЯЎЦQ0 ф$lмєрОœзqEpџёtфдцMЗБiщъi#?№ьћ ŸJ“R№ї/Ў[Ziш)ŠзBFRr~cцJч<уЎ8uЯiEqњŸnЕ+э>8ё\~Vv§’ц lчЯ• ющп8чMG'Тџ_ipиkSы:кFћїъ:ЕУ’мрэW @!GŽ{J(У~бМ#ЇIaЁй§’жILЬžkЩ— rфžŠ?*иЂŠ(ЂŠ(ЂŠ(ЂŠчќџ ;Ÿћ ъ_њ[5tЯј7ў@w?ідПєЖjш(Јчžn.%Ž"BђI#TP2I'€ч5%pЕVгќ-ŒW1кOЌ\GІ%ФлDQ OЮвїSЫW€$dpsсДWј]ѕЛХž;­vю]Qтšq/”’"U`>ш‰bР=:qаvЩЭёРК.–|GЃ%ЅВ*$6“Є…W…c'Žр{ ЏgёSТк­НдК4К–ЌіЩЙтАвюdlvЏњМи n {аiEqzoФѕ[†‚пРо.GT.Mе”VыŒУI*‚yщœѕє4Cт?\ъ†н|ЕЁv uw­D (Ю ,jф€07`žИц€;J+‡ОŠr^Hжx6 S‘Я5дЎМ х‚Ј<чјGЇ=jMKУо<ОИYmќyiЇ @І+] IЩљ™+œѓŽИрqз ЅЧнx'Rдєш-ЕxŒШ›YфБk{MЮ \[‚œŸ”БэдŒбџ лDИбџГukЭsW…Пж§bхМп›pмЊъœc :ќаY<№клЫqq,pС’I*Ђ’I<9Ќ?јNќџC^‡џƒјЊЯг>јHѓ~Эс›<мnћZ›œc8Чš[o^иЯш+sM№жƒЃ\5Ц—ЂiЖ3Вi-mR&+pJ€q=…s№ќX№UжЈtЫ=^KЫЭь‚+K+‰Ы•ЮvьB`‘‘ž•їФИ­/$‚јЪі5Ц'ƒFpЪЗ9ЇЇ5мQ@^ЅтŸХpЋЅќ;ЛЙƒ`,їZ­Ќ '€ЊЮЦ9ЯsЧ——_ЎээeгtЏ iЮЩКhЏяgИ`H_нЦ Ш8,cЧ=ЅЧџg|@ОбќЛŸhz]ѓ§чАвфŸЫУqЕЅ— s”у'ЂзТ~#“NžлWёўЋq$Л—ЬБГЕЕк„cїlСКќС‡l`ŒзaEqzoУˆ,n[xЛPB…DWZдЊ ф|УЫиsЦ:у“ЧLGc№Р:}фwPјr‘3<ВL‡ ŽQиЉымqз­wP №­­ФWўбЁž'‘иDЌŒA.AœжхPEPEPEPEPEPEPEPEPEђ46ђЪЩ;ЂXЃ*Шtn dєфъEIEqџ№Б,ЋоЩЅjБнiWqк\i†(кьМŒ‹TW!•‹Ї?63пЌ‚Fšо)^ w@Э…K!#юЄŒŽœ=   (ЂŠ(ЂЉъК­Ž‡ЅмjzЬvжvщОY_ЂцI8I “@~ џЯ§…u/§-šК сќ17‹"бKХсыЁЙЛКЛŽ;§EрRiф•D‘ЌАу#qЧ|БіЯа CџСЬпќ‹@gъz­љ_ккUџ“Ÿ/эvщ.Ьу8м3гаVл’Ц5К-4LаG$gdd„—%л#*›в>йуњhј9›џ‘hћgŒ?шЁџрцoўE '†Ы]}3Nвu;UcЗеoeёZhТA~вHDW(ŽhСa•Сl(eBY}sСњl:G„ь4ћfдšоe„ъDyў^уЗpРк6уj Ў‚lё‡§Д?ќЭџШЕЭјеѕы­е.ДпР.­нЏŠбЖЗШ]­pA8џdд‡тm?[›\‡т†™ЇOuqІЪЖЖšD–ВХ<жŸМŽFdСo1žRЫР  Р’Tzф-ЭМS $ˆD‘В0g•` ŸbыР4пˆЅИg№ќ–ž,ДКИ0ЦыЇЮVа‚0Џ(ŠЩЙ'З8Pyі jZўЇo<Кї‡Ѓб\,Q ѕЙi9cЕ@QаI<№8ШхQ@yџˆПтЖёЅЏ…!љє­XЏuам ж№`фHЌFчvр˜7аxгФŸ№‹x^ыQŠ?>љБА]Э=УБ \‚мœМэ Ž”x;У№h~Dвyк•м­{ЉN"kЉ0de.FpЩ Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@WКАГОђ>йiЧ‘*Я.EћЎЙшУ'r*ХQEQEqў<жo ‹M№оў^Џт ^ж лB3NИ#,ŠAp$Fq‚ŸЃџХiёќJПМаДHžгI™~хЭУё<ШмЊ—ќHy*r zgшz5Ÿ‡Д;-"С6ZкDБ&@Бе›Фф“ŽI&Д(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(“ј‹т9М7с6šЮњвЫPМИŠЪЮть*9$lc‚*|З/ є<_УYјГЧ:цЊЖwз7з˜T˜D<:Э DЬЭ•‘Ш.Ъ…•‰­ДјЕсэSЧў-аМ)І4№ллDзк…ЫмDŽл#$gц“їr€М}ю n#в<1с/Т::F‘•o,ЭЫЪчЋЙюЧђ=GХк^ЉoiwiwмGhЗЌb3Щї#PЬЩШх”dфЏЖž™у{]OФgУџйЗжњœ~aИ‚g€›tT‰ƒОЩ[хo9эЮHlДšЇЌx/Rд5›Лћ}WMˆЯqo4osІ4гТАДN!YЫћЃ$;ЪрrьzœејA5Ј|c/Š-|Qд$yу"ъРЫйaŠм(•vˆйKn\,Iя šoФП ъў(‡AБЙѓцИѓEМёI‘ЪбŒИТЙuр1еU‚’ЅшxЭ•œкЅп‰ЇбtЫHЗHж№ТI9фБ‘?ТUAЩ?{p _У>И№Ж4ћWў$K$ЖЖ&м"’c3wF™‡Ъ;ArOhZжЏЊiз:еЅ­›љЭeq`gIхкЮDЈHC†P1†PФ’ƒ-ѕХвоѓ\еnяёќлk{›hЁ{XNJ#„EЬЛHпи€8Ыt•ІiњФZŒЗšО­пю„PCijіёЧЩ.ХLЏНШ2~шSŒnlьPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPџйџиџрJFIFPPџлC    $.' ",#(7),01444'9=82<.342џлC  2!!22222222222222222222222222222222222222222222222222џР€"џФ џФЕ}!1AQa"q2‘Ё#BБСRб№$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™šЂЃЄЅІЇЈЉЊВГДЕЖЗИЙКТУФХЦЧШЩЪвгдежзийкстуфхцчшщъёђѓєѕіїјљњџФ џФЕw!1AQaq"2B‘ЁБС #3R№brб $4с%ё&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™šЂЃЄЅІЇЈЉЊВГДЕЖЗИЙКТУФХЦЧШЩЪвгдежзийктуфхцчшщъђѓєѕіїјљњџк ?їњ(Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (Ђ€ (ЂPKиЊъ2іŠŠ layout-cachep†P ]FѓЩЩP .[FA ѓNХP 7F–^ЄШP EМPKиЊъ2 content.xmlэ\KsGrОћW”gУ r…™СрSжрKA/D"HJІxpDMwЭLQн]­ЊnаiџУž|ѓQаС{/ŽА/š№й_т/ГЊ_ѓТЌJВ‚Œ0S]]••Я/3 Кї‡wi"Ю”uкd‡Нб`З'T™XgгУо—/їoїўpєwїўўсГ/П>}$ЬdЂ#u76Q™ЊЌшG&+№[œ~yџфЩбы‡Яr•=уicЇУсУ—…џў0М%АЯpјшiOєќzƒИˆ{Gїж-3wз?=ьЭŠ"П;lcšmіvww‡ў{/МрŠѓdѓ|žQM/дЛbуlšPO–уKжцеєиЪЗgг№Мš?1ѕьЗoпоюѓЬб;w†Џ^œ ›Ъš–w‰ЮОY;ŸŸVSГ2+Л™YШ_мйtетžg5ЩбLкЭќу GіуK8ВW“qийšо~‡ќу‹“†}6нИ8MЈЯYoІмOщUк%вЙУžз‡0жБЁZ•§‹УњћнU”ИЃ{ЬфfDјя™LЁW/хЬЄВ'&ЦO˜ШT'чејŽ8)#K'3З#>‘ЙqŸљёC~ zplЕLФ—™†U+ёХ ?кn&рО.\a•LХ’šВЫДј…–&†ѕEkѕ\фw&A Х%{ПдЉrтЉz+žуАйКІ­изЯяOUІЌŽ{ж/їг)c^.г†7ььоjч.лyИBIТ, а^шЈЯKдкУ?;$žŽъmuЙДrje>Ћ`€М+щћЗž’CЉТ(лЯхДzўЂY,-9щА†…иBC­C­ф’гпapДK„БDfг+і&^Љ"Sf…ЁŸ7/НUz:ƒQŽMїЗшKЇeЖŠяДWѕдяиzшзЌЏ^92ižЈwkзЎŸЏ[НžрзЧyШMєeЂЇи4уЩ–ќ{oJWшЩ9VЮІХ[cс'2qЊ‰ 8э]V’–р7hСо{hСGџ<2о^šћW+ЭO№СЏX§ЎFб~Š&}xОпјШїeОoЯО›WngЉДSѕ5ЃлмаY4ыЕXяw§јoƒпЕžы,ГNGPІпyм‰xо@0Чх’ВНЬdЊц-r*АофЎiУю­Ѕ|ыЃ‘Ќ s+йПНнўh@ПJк^‚w>ЧjŒ‘ф~гЋ‰БŠИ2Н*ŽvХ,џ­aѕЋ‘ићфи%іГfая+ъ_s"§ЫЈ_D(/—Ь+БПYnoߘ%e]Ч>[bьaяwЛј7™|шФb.RlЂ3Ьє Бњi?аУ{ёчџ_ЊЬl­ŠЫіэw]*Џls'd:я ŸО~BЭЁ0ekj'vЩ^йъШmpЁŸWSжђrfЌўЪЄŸЗш„ZO­JVИэT[K ЧО‡8бљaЯЊЈИЦx[,§МодЇЛ›”ЉЮdFžkїТѕ*­tEkШЊИѕmj•ЪZпЧIй~*гTB§ъх`јu[)јO~ˆ2Ч<‹Ю;$а;Љ‰ЩдЊ‚§п І%яБ…˜ž<Кz -б<\л Ц&>?КGVpзЉoK0FU”хAСCБvy"ЯћІ,иџ$ъŒЈчЧўxO’СЬbK“YяЕиЫЊбѓ~ЋЉПя"CЛ™8НžkЙЅ-ягQяш Я/э˜+"V"‘Т•v‚PŽoNœ йˆJ*^HDevЩ7,МWjег§^uт\fЫЯ Žž›1ДOœHЭ/ФЕъ`˜^•‚{сw‹ѓœƒљГ^›Y59ьЅ Ж0w-Џ4HА’њGчO0€џЛ„†НобК7;ФјЯђв]_ёж&дє Зœ~*s­ЌШэќТС6С6YŠНљїЉџlь7nfrё"вЄт+’ъvЫ>yўшщёW;тОUЎи-љЪБ7`Аилн=иjMњ№>O!Їч8p™Ю/Ж уЦЦЕnєŽ(‘{>Т,"Ћ В‡TfzўН…AРУ­10GЄС–цЪ МrbІLO*уˆЊ(T=злЬdr^h˜­А юUб"ёm№Ва†Ё 3T‰ѕчп–ўQnЪŠjŠGpс›f2тФПЏI?ьќ‡ЂН`Ё’d‘АЎC C˜Ц!RœF‚+јVXS"ФёSЋЪwэ…‚]˜вJьэйхVЬџMа"–чќяŸЫ3 ѕТм‚ОOGВB;G{‘c“с']љ ізЧZfДPи'`Bxё>§”† в^КФДУЫšLIŽŽˆL†ШL>ЯЪЯOOт 4ыЇ?…†?1q‘HЎBЫльŠI–eоpГf „r‘> ъ˜<Чgщ˜[ёЭ/Аstчжmњ}3bЅ-Сr‰їY(RHт-KЏvgЕЪ RV8LyІ".% LM…аXЎ {ЎX C,Xaії$Ј‚#9зKГM„[i7Х7†ж‚gH ™Ф™>ƒЊ<єЛ›љ‘r"КDЪ9Эч„^Iš“ Њ2вы•†Oі№†о[иЏдLP0Y|qМF&~ќoшt&ž<{N@DчQ‰ ДЉœЭ­џЩДјЬЏЩжHлј‘ШXBЗ4@7‡„‡ЌЄвт“oKS|†@•*‘Аќ@eъ2–yмŒt&ЧК(щ@lТђLВЯчГг№"лЛv^eЭNС€<{ž{ё/КЪ5dКР„T@0Еg Ф)0š(vWzПF90Ј”žz\B–а‘№О|CЎ$Ў§žт=№xвs'3sŽŸет)I.R‘f?EGX…bЬД+H•ƒAЃsU^bњшЮ}vwф‹ЏД+e ЃE8­и8цйЂ*{ЎЕnХЕЧub]ьЗAРнпЉp№k­хm[Се-ьЖ„-Њх§ №ЇS5 ‡pкGЩвF$)‚ВyЩQv`ЕwФSŽЈ(щг–™Д{ољИЙЬиJ0%;іУšдЇЂљїфƒЧ–u‚*JœђYІПДg>…F'p0вoЯwТŽrQ7біlKvЉ3џВZЌVжjЗхЋГлЦHD\eжГb“џђ†\Wfш Ю#W‡~юPЅXO&€”:ј–'Л?вуЪ№B*пщДL=В!cЕФƒ`ЁjPT-UQhQQ „їB…џ%ЉHуТq~"q„М%\’ї"gАL†:xъ‘9ЌяHїЛa>Obr;Юd9_Шd†cЊв5Ќ_v$В\ё3Gq:œХdcИ !L%wgJP СчБС P'r„2WъB­•ycђі0‹1XY{wР1zЎŠц иСKMJ’,Ё ]0Х8žLЩ]А[ЭTˆ.•ѓ'&OсќUЎФ˜(dР7Ь б.y#…Сw\Ч#ч&ˆ†і”ЂДq m T.ЩE‹кi6€г‘8’КIЁц]ЁИЌ#(б…wdVЛxovбaяFoЋ\ьR‹}ШўU|\ВввхWФH}F4фЦт ›Ќ:жšўУzєив t3ё9ЖiЙЂ KСкВа Œ`ТЫ™2і\˜‰ Жі~оЬP‡~ ј№дQЩк‘Oбь` II’ђšьГ‰‡2ёЬЎБ^аш…єY•%љр˜-7Ixh\z›К›6ЦGшјеХ…ЩяЗЭЮjWФž‚Ю:%fW2ѓFкcы§9›fTާgbПJЧ бяJ—ƒSЊ…€\Šљ_|‚DОiє…џHBШщитl7e|ЇЉВ3„tŸuxЯKЖ~‹СБбЌ{љјœQŠ=б‚ќЩR)‹Z@Z]ЅШ­JНЧ•96Уо ъWmьkB›~ЃЖ Rj#ib‡’№0–Рt™р˜’ќВ>VŸ‘›kрИх3YьеО“-”zGф rцA0ё€а3Ÿ$8;БQФSyІЇвЛфЏњWB ь3Шб’*@\4ŸЂTŸРsQZ’-ДNаb: •‰гљї8Љ\QbыЮ]СE/ЖШГ$!ŽV`&O€ОъэOр5дЋЫRІЅѕ˜ЖƒЂГ]yДPЬ(˜MгR“ JOшEРЎWМYSgfv—цtaхђ;ЌЖДЬзМЬUуЁјѕȘ†0эЕрV=fTPŒЊ#.бљкG%vСI"ЏРqиu@ў ЇQЅъ~ёжЩОюПц*Ьk>MЈЯгИh/ Ÿ9{Щš=ƒЛ*Iќѓэ)_Q#ѕAЮFЁ‘Zrˆ(ЙШ e8YЪъwQЧЅ‰žг#н‡ЭSЉчю‡Я ŽюqCGЇrЊ|oЇ=j<кi•B…†.ї}•Лні:›о}ЋcњKЊ§СшцшvИT†сYh voюћqор;ОcіюАЗз-”џюT34pУбnыпшЖџН7:x|чіўё§›Чƒ7љДЗЁ№юfцэa1RХеP | fšьФШјŠд лIхХЌ‚,еbєwцŠЛ[rГwєкЋЅџ)ХХяХ5б?І_#бЏЎџЫёWтЏњГ8~ŽБWзЗZvг oq!šVЬхNR}}SпНjаsž­4љv}šњэc\У9>Ѓыb(ј#>љc їш`{ћНЃџЃнфРJФ6МИ}/Q9ЋUд–Й%эыр^ДmЭеђєŒиcF€EсЫя+ЎдlЙЙ[ўs‰-x ПяoХž[—Б‡+6T!s>їMКpцкЋУнёњp—ЫHј6 п7!!ŒЗcж­Њ!UнлнѓŽ™E ‚ mwВЅ%а’ЯБцMfё§ЋрЯ‰Њk1E(F”V"0xќди8r›PQPuP'@зНЇ ‰аыІВa€~№6bЫLrt-єB*CНО айтL$cE sЭ) иjС:і Ђ–V-&Wu]€€УњrС@SАЏя:ЅŠИVŒ‘ЎФgЧeЫQР99qЌ­Uэˆ!DkUhWSиЉ BВ_oH”k0ЖЋAЪв)Ле Ё: о хЛchР(јм˜{M pђеˆ†цФeUžБ*“ˆ.OЭ9ђl SъuZ•~ЃИo;сT ;aq+šzj uWlLjzGзмoкiЩRв)f,Га7š–šjeЁ?нЊ-/рПЏ„LŒѕ-Џj‘hЊкKлаj7vБ‹v+V"­Ј‹Ў RЅлё­~Ifе)m阎nE$\b%`ТJ: ЕU Я;LŠџ9ћBЁeЭEI`@Єкљo’u*“ІњЙэѕРЫф8"%ЅВЊмЈp•…ЗЏf\UrХŠXЃ3СhŽЙ ИйG nвYЉыk[РоP№€фг]ЈVmі€VСЙа Ищ ‡[Œ* ažYЋn-P7}ыњ)5w]uёЁеuЎjїim”нК=Ж;ы)W@ЉѕуI“^Н)ыhђQŸsAБ6i/wе­ -‹HкbqЎoLЏЊ†њЫSФ#%о|“ЁпqК#у7’.mЛЯA8 ФLŸ8yoьу)Пк-„/P-9їг™ыxŸn™™r•мщQлэvр ‰рEж…œЬыОhE5ЦLПUвсСмЌИ"ПУі=‰  o№књСв6Ы[l v5ПГРsтЭlЎе}Йg*—uВсЫЩš$Щ.ЫnHВ!нфŒs>Pf­Я(Э|Yp/‰—и†9ц€V.фJ6Pгф@Сc'‰‘ ХY2N>ƒQЮьс`4ъ-эVў•дч5rcъ?AwЛYГ$MА§ЯgkGeШc!ƒ6%xŠ+™нЂ„|ђh,kЦBD)ZРжLKЉрЩ‡ЛšZ%бх%>Љп№i+šh ЮХ2‹†аdзcQтЧ–sЮFл9Еn='іхbц T09=!Ъhžj5ms(|XU /7ЖцDШЙŒ пЬь;bžƒ<@-‹ їm|цC|ї}Œ8RРoB§џш94z ЫMМФ ШL€ТWa]t8ŽЁŽ\яЅdfkLqš,wА„ШїqNЇ њIDDЧ)ѕDЊЕЌ<АКC jƒЕ тЦŽO =RЉy88.7ЋjФ=лэЦwз„w кGмЗ[бn&!DIX–{OЗ]п=а­9ѓ7;Т@ОЕvš)лl(:˜ЅqШІi‚ьшмЃs&‹dк†г‰Ю\‘ŸyЙ†ЄIЕјГBЉЏЕq4•‘оѕvјХeߘvˆ„Ѓ>y/влќэ7Ьœг‡$‹8ёклеАh…˜Ё67&ЕЃ%5ыЯщЦ‚„dvˆQ›‹$oAŠЂЊкœq†§'ё=ѕёу3N!QњОv_+Рy` їŠА!DC'рdБЌŒ?m}їцЋЎŸMЋ"˜зыJHT. ъШЊ…ўNA‚ ШбфgЭИ_^•œœyZ„Ќх"хTШ™TѓBF|ЬдД€ё2/Г6ОI‰Ї@Юo K_TабщГНдp N‡—S†KDBžTJšЉf;VlЭњ{}ЉWSыЃAЊuZнo‡pўцјікљ‘{–xЧЬ~ыЕи;ђп7БBZ3ЌлqбЎнu‡Ўƒ+џЖУыКPЋь^сˆюШOЕйЏgE‚_›­ŽЅїЬR$ qЊl]’ФћNЎ1ЉoЮ%IKљVЛЫћXЬф&“Х5ЧaЩ_ЅU_м:h ІъЋFmQг;щяL~їђIцЉйк3K§Гs{§іПK…Офj ё ‡й†оНЩшnЅzru•?ГЅў^вуНЄ'{Iэ%}М—єЫНЄOі’žю%}К—єhи&юЖ"Pžz+—iКd?н_§u“Fжи.ѓ• gG‹vД&iЈдA“Oя[ы>’G43kтЫЇsЃ’GбтЩќїіѓЗђ`ˆ”П“lЈ—нЖЁvчЮƒšђаСœєpд3†б#8jŠр—ІаsLбшрSTщp1Ч*РŸ{GнwоЦых~a=ЫdŽ>™'ћEMz69pXгo`2'ŸЬгУLцбУЊnžgQœœŒwФ1:}й7”ЙМC ” œШcY@)W5~g^ЊЗъ SЙњfƒ…иЫЁ>ЪP2eэŠ|Б‘њЬЧEљ SПŸ'Єй7Ÿ/Š SUe;ЎuY$XT2둉LOБМ}Эh ЫqЄюЫп(mХ7ђюtЯ1„ ђъ&B TueчG№ ˜–Ш€1j|‰ѕ№hд“бJЈpрєОЃl"aoП|Œк=j}/=Œkя$йеtA2чЬњw~OЅБљyЬ#г‡дтЫ’Œ%СБQhjf8<ЉdС OpenOffice.org 1.1.4 (Linux)2004-02-21T17:18:042005-07-10T23:22:492004-02-29T19:53:36en-US20PT3H20M46SPKиЊъ2ObjBFFFD752/content.xmlэ]џŽЙ‘ўџžЂO;’H:іx8d7ЌН‹Н;xЖд3#D# њсБѓзНУНЩх ђ(y’ЛЅžfЗZjВЇemА ьH")ВŠUЋH~-ПјУЇЛiє1YЎ&ѓйeH/JfЃљx2ЛЙь§№юыОю§схПНјї7п]НћЏ?ЭЏЏ'Ѓфљx>км%Гu4Ÿ­ё5њѓЏПљЯЋЈзП[$Гявfƒљђf8|ѓюM”}~Г§V„у ‡_§ЉѕВўуѕИїђE]ч(уlѕ<ЋНьнЎз‹чУс‡™? У!Уьsoћ…ењѓєpћДХЎљ:љД>ик6ШЧŽєЖи5/ућƒ­mœѓ]ћыyоњўў~piKjŒўєі›сзѓх]œЫђi:™§ЅЖ}ZЛk:лм}H–‡%‰зБ3/Ћ7ћ:Я&№c.ђш6^žПДХУŒРјШŒРxз•Н­QPПХЪєЯЗпqВЌьп&“›лЕ•JMгQ ЛY%§љb=Й‹Ї§bых&ёИЦё}6RœLрuМ†w…w˜y$Ыў"ОIњй7о$зёfКоЇMњЭчуЩj1?ћJ2JъБdš/Д‹xiгаєУqyvkі§vj>ЬЇcъБ`,‡Љх–Ї8™/ЗгЕmbлў|ГЦL{МŽЇ+ЗjДœЏV˜к6—Нй|–8ІAX_MўŠM(БIT^–Ѕч3›Ыf!/luЃЌю0iХf6N–™ˆY]yТ =­FшС§е"%+Wз\т~МšФГ}Ёе ЛЋЭD.VІsП­нXЈЯ„9а {4П[L“OЕЃчѕ5учѕѕд4IЇ2Й[мЦ™M*ж\&гIrН­№pпКˆзв}x˜‡€u№W|=:ОКEа/!uљN3мЖАлsЇўO”Ш‡]ХОqewуюƒщ ЦгЩЭЬ?KЗ—…ЙMkњЋљfisЎ'ŸВмcОлЃ 2РwšoGЋљt2ŽўƒЄџЅютхЭdжŸ&з6yёL8uъ‰Шtъ˜ЏqsU€еЖ|ЋЦ!…З-—Лtэxгѕ|сяšњ ЯLХЮgЖЬ—T27@S; Prўž`Н эіИ`„NЯVѓМŸ=ѓQХMy™J1R;Э>ѓйn‹<Ÿ$}Л ЗЋ№Q.эмˆžG?ЊоU1kЏmкЄя…$Мt<[JЛЇёьfпXfъЃљfЖ^Ђ _(/п›e—ЦіпЎюЄйе%Г‡ЃВTЌ]ХoлnP›[ЇК<Ђuмj|Kэ‘цdVk0і kяЖцуЯ/_d‡pщпэ\fŠЗіV Ё˜•{ш|o{рЛЇizгА=цЫ–t•йЛЎ їЩŽіiw Эћƒ]йхъЖщ З‰‹$^'уЫ<ђˆ<ЄПхќ~OgіЬЛ4.іU‹і bwДGTgЕъњ2[І- Ў1,ЭDјдь•(mˆ йѓХK\ТЎ'гшm<™Ž6ыУmБ+эш L1%rОњёВНp4ЧвЧxКIњыЯ ЛЄNч–œPЈИь‰‡‘…ёmЧюФЖ_Тэ›|R›`ВХЗŸ~5Ы>ГќёЄVaУЦЖŸ~ЕJaCоИ)œ]”(€эUtбшYєъЧhёѓŠІ ц#x~.šх\mІёeя’>ћŸСWь§7ЧEL0qž˜8fізhіWhё'Oа№Я"v=ВЗєттlНрu7^€> пŸЁЯЖOЗЏ?џ§oУмEџuЇьЬкЈQHB?ЕЗmЁ7ЧŸКшљqћФѕ€ЖNКв Ч Иіz ‹н™8‘АѓЮbFќ›Џ~Уп?}вOпI|GэлзTОПј9-cяГ:xџtWб8u–I ћыьѓ#IМOр'[‰1В яw йN…ŸйГДL7W† ŒрК8ћFДд…’Ї‡ ыР.в§ьюУг‚rкЩ\;иiЗ+Щ>+mйЭЎЈн’лѓ™7щєЃn0dЭ=‰ pІ$‚ ІИГU№Хq[T6qЛ3є9np:УЕЊУЕ‡sєХ€2*1„ YХGЁvшЇшGЏТРB8JЧ1 aЎУ‰/ЇG?ѕE?чК‹ђЌќЬ ќ”Ю€ИИЧТŽpЯšуž…рОŸŽ%ющ•ГaБХ-Вbž…bžU0ЯТ0oЎвєQЮюQžмYм)гŠP-”f И—ŸюЬюN`ю‚=дсМаЁДІ”1\~ЁЌщєає zЉЉ`TбТ”5УЪЁЁа‡ є!њJJЬs$QŒЩRВЏZц9џу№o§ ХLљ1JSіЙ3ЛМГ&№[Jї%сŸзсŸ{E`h$Œ;VmЛk‘Я›#Ÿ"ŸbЄpŽŠma—Сž‡"žWЯƒ€;тђр2{žCA]0ЃP.LRYrВУа8=дЙ7дн+ЂюbНЈУК№‚`(ФХ7НЮvз]ЌщёЂ9тE(тP6ЬS‚\рГoъ]х|€/*РAчїJqNС"0Эq"~ŒP/rќ‹ ќƒ  )EЃ˜тэBVsfшОшwР/К єuф;цCО#f-ЁK™0v„ћц <ФРГиЛ…Ќь[h—Wѕ,”‰Ч*L<ТФрnЭpLŸнLнžpqХrR !хЁ31#ИнqaЦ+9кЙE{oVžpп]ДЏcх1Vžepn\фВŒzіШbд7gхБ Vžž+э4{fс*жщ9~(/Uxy,ˆ—Ї8сТы80эмжЋЖї–џ9/…№ђььc"‚2b֘†’ЫўН‰yЮIŠь.озѓ˜я>­lƒ[fУЕРoЮЫcAММд…@I]кEЖ^Ъ">”—Ч*М<ЦЫ“˜йSQтЗ~hтŠхЌ<ТЪCмƒaУМцИё*> ‘UžжНyyв%BvыыxyЬ‡—‡К)f$0FмФ0­щ ђЭyy,ˆ——ЂsIŽЩ-хеX/КLѓC™yЌТЬcAЬ<ЁСН ‘DqF;{ЌjПфЬ<ТЬГn…ЎF”б wјŒЊ’Я[Аїцц)'Лъ,иC7|ИyV5eе(A_Дv”§а‡цф<"чYxK ˜F–oэБИ;дC(A*="ш Ђ(Ч”F•Ю–кrŠ„PєЌ3Yсp‹Џ№рІфi‡s’“МIzю”ЋЮ">д‘єР‡Є—>ˆ™—‘ЄzЛ}фh5іЭIzDвKё Fj@“еГ|йaЎЁ,=ЈАє ˆЅЧ™а”Pj$г†8›MЮZŸв^AЮвƒ–žхHjЬ<а:D‚€вq>9Т">§рЭгsnOuwПŽЇ><НtЦЉкЫ сШoNгƒPš•ЮKoщљ!Jвƒ I‚HzРwlкЙЗУВіXЯ)zBбKљаT3!”4‚2ТK^vfŒ|№&щiїђЄЛ`_Gв?’{ЎАq=ќч@О9IBIzTjƒСŽSm™ х`пr-;ˆќPŽT8zФбcТ>KEDv„цPФY{*Цф=ушЁЛйHO˜I‰)mя<xњР›Єч>б]АЏ#щIfДћы9щ’v§ц,=fщ)Š‘E›ђі^ЕМЧ>ˆњPžTxzФгЃ “|ЅЙ{wOс1{Ш™zЦдГ{йГcТqBiy{fd№ІъgЪMwПŽЊ~T=ммkЩˆTЪQv 9U‚ЉzˆммkІ&КК„§.ЗїЁT=ЈPѕ ˆЊGДB­з6Ї—ЋKк?iq9WТИzN8ЅBp%5јяkNџѓ‡КЗwa№dёN1‚ŸŽj WSжQћРк‡ydщ ,‡lЎЩ>E.Сl?ЅhiН:?ЊфСe$”ўњ|Ётk`ф+ШЉ€FФ EA3MЅ5›і‹`Ї_LNє“АХ’—љП}–§gЛOуљhs—ЄџнlЏ/џ PK 9.Fй=‹PKиЊъ2ObjBFFFD752/styles.xmlеXыoл6џОПBS†ЂЂHvžvmkвb’&h’aћHK”LT"ŠŠ“ўѕ;>є–хѕБ­M‚$Кћё?'/ЮŸвФzФ<'Œ.эЩg[˜,$4^кїяœ3ћмџiёѓхЭХ§_Зo-E$РѓEŠЉprёœрмК}xsѕћ…e;Ў{“azЃPŒЧЎ{yiщчKГШ7ЎћіНmйкмA(Bл_lБ в|Ў•K{-D6w]^XэeъyžЋŸmГ@­Х+D јIŒЂ% Ѓел QТCŽ6Ѓh ЦK|Ф*єfГ9и*фd6›Йо]ЙяOQЫSBшЧ­xЅ-ЁДHW˜G‚jё’?ЦCЦ5UШСёqўЂfф0мСШaX‚!йѕ–ЯмkPЊ_зW5}<5.U~'йxфb—Еп:-UеF *6ФA’ћ E`-Бє3E)дЬЏœ db[г€Ѕ$y6rлj,Эˆ яGYLюИс7Dф‚c”Z’iЬћ>^ ŒхЏ{@-ў6ОџРYwˆцЛНWаЏїж,E}—ZОo] QОі-эMKюK…кыh‚иКОћњрЬЮюоp­qbL1'СвЮ7$ЯwyvъЯˆtџ,ƒ q„ŠФtевЈ‰Eu+'РIb—№ŒУQр‚@.з$E‰“%(РљвžЖ"ыІš (ІJА‚ Оюz ”DыГЁеЅ‰RKХЅЮXRеV–f ~ЊЫЃcЗвYTOРЫœфQyyЧ„kЕDћ нtMяmБЏ9{яйн=XэЮrЫ<Ѕ„:„ ƒХФpЄ ЉМU6‚‚sИмŸ‡‚˜xGЗcЭ#K ђюМh„W›~NW,)уlWA‰mT‚џKrЧФ–ЬЊp”“RsVdjЈQ7ЈjГђOЩнГо RѕŸ0ИzїЂЎO`ЩЙТwЊpдуLЋЮ=EYužhH„К/QRр—Џ^ФтѕВЊ5”e‰!йiетю-к~Є&оЩчЊ.‡;8иzмДу~X—К1t#k4_wћт8_k4теььД§Іъ—fX&%$ЈК”ЂSаs"A›УFз­ ­uL}+kъџњЦл`ЏaФ‚ђ }r[:сщeм&ЋоњF…q§FЁЧП9йŠ4р8†уРR9Ѕ5шT'g—WKDžjsђ D“9ˆnйЕЏул$=љЂЌKЦ†Г Чю‰Ј2цL )t,ЋЅ=ѓњСКQЦ<ЂBР….HрДgœL^ы)МРРЉnц–Ѕ“эƒЭ†CЂБ“ТРrGЌътXCbн“нNN6‡Еaм;˜ЮŽOе< TˆЧ Mp$u]17kКђ4цЭЮŽ:УХP<cт?Žf -Жƒq{ћВ{ЋІ?єVIэŠёPОgƒј№шDŠ­œ%$Ді<ѕЅ@ ѕЇ,€ђN'ѕb|”з* ЫžКxђЛЂЅ€ +Ц5љuКп{С|o4э.[wkя1 ьt$#”–Цf†'ЇпВєњ yGЬ3ѓ7_cЌ_tќѓѓѓ…лIжЉ„Юi‘лX^“$‡б:~„’МѕVЫDУћ­LХ<ШЈѕьуOJ Y/„вT‹ѓбмЛ˜§€3ЦG‰іˆ5Žхu$уљLЎ­—'ˆHš§ќЊЧCЫSKЄЮOЧ;Ь/xы(Rrд„ GХёфэ{Чюd&?Ф:2!H”Пo•бBшгЩќ№t>=­"*vpџ[=YnЈ^xќйЌ дВЉюмсƒюnэџ PKдVƒl]\PKиЊъ2ObjBFFFD752/settings.xmlЭ—[—Ђ8€пїWАМюБAмюiћиЮAМO{i@пDЩ†‘љѕХюБufкжs–'BUОЊJ*UЁіyai †(y”Ы7Њ,Aтг‘хЃ<БлЅ{љs§кŸЭ‘aЛу–D фУ‡€њi /1ШЙаeвxвxъ’\R”Q ЩhЇwC“ЅЂ4эІTŒ›ћi’0Є(­Ё,Щ№&р\ЏЄ / {(ФrШyќ (TиЁџйбTUUŠБМŸАСˆЌ^ѕГ,ЛЩ*;нrЕZUvвUŸ’Zў„]V љe ~XЕWп_\Ўз ѕ=И„8ŒЖёHћЯD"’5‚йk”ђБ9?ъ;ˆ!C=РІБќ"фy,„ˆpЙЎж”ЗwŸр‚_‡5hлИa9ПVъњ@џК(Ъ}[oЯ'тuх=ыКU‘йiЋЎЅo вБпЊѓYЏjjN:Ÿѕc7o<ћNƒŽ“QUШёоVСДšŽЦк'fюNБjDУЕпСиџІ Ю№wКСcЛ• є˜ЛГ>м•;Ы~Хфsaclыl`dйSSџтjUцUњЋљЌЁ‚Іšѕ8ѓЕ "‡ Няфѓие&UС|žДЬІЇm} [юЬ мчšcƒYŒG+1З[ьн™ЩЧ8Ÿ0˜4—O~# №E^4ŠШЖUТ№унјЬ"зc_`Bt†ЇФчщююw…^`5tŠ_Њ10eзh8Х•ЅаШ†QќГšє#:ЦтђЕ-}ъ€јПѓOог•7?šЪЉпцњПPKЖН…ЩПпPKиЊъ2ObjBFFFD753/content.xmlэ]ksлЦ§о_СВž~ШфОЎЄLЧi:vьЉэ™і#@$jр dхзї.vљАфhCЗCyB яYьнН{імЛ4Йјюг*›м&e•љхЯаt’фQЇљтrњс§Ы@MПЛњгХŸ_Мљё§Ппў4)nnв(yбf•фuy П'o?ќ№ъ—'г`>ГNђ7MГYQ.цѓя_Lкя/КЋ&рg>џщзщdкі7‹ыxzuqЈsc^=oбЫщВЎзЯчѓмƒ‚šЗпЇнU}ŸoпДш›зЩЇњhkг`л8МўLпM‹Оy\†wG[›ѓО§MБm}ww7ЛЃMKЌЕžџынЋљЫЂ\…лБ|ЪвќуСі к7Э7ЋыЄ<>’А­ИTЗ‹}ЗМн9Z†хёј5-†ˆај3Ёqп&Л<0A5 `ѓёњеОruДsг`;ПЈLзЧGо6™іьВАЊ.Їн|:ЃЕ‰Ж\7uЃOЃ ‰iuuб.AЗ­uв|>ЯУPъWи‚эї›p•fї—SГ"mУЉsљЄћЖJѓ …НВ€уt‘ж0:<_]Ьїx{Р0DœDщ*Ь‚uF €NПpx­унaEKьŽЊ]‚ў’u ‹WжiRMЬ~‚.Ът#\˜9АЙ1нЄYК’А ўrгќ4љ<6ђИo—гЊШвxŸџX›гЩMŒНы;§ОLУlыi@‚E’'eA—wiUY-жiСЙ скFxњNЋє7К2єнэ0Ќв(ћзp]Tћ>C˜ёЛ0Џ&~imпNкпЏпM~.ъeйцПџм™'џ8ќpшЭэЗ‘ŸЗћ[ЎЩ‡<…М•L^ПГбW›(УюЪЖMпр}И„ЭЙЦ>,C0G-L<ћЂЋu–|КœЖОДcЈ`{FѕЩьужЩсQn›˜q>‚хєС,oшЃˆ>›u\мхСuXТіО Г F4ЦявzмйЦ8Б№zY& ($}#Ёaцрq’Ќ$5Ѓ1uЙМЌ;#кZюWзtаоrkЦэ8h. 6UЎ†ъ#OЂzя„`ТUБ)ME™IхUЎ’0nУlуЮ3)ЫЂ VaЙHѓ‘Ѓжœw YКJыlГ^ФЂ„Е(я{™cpUTИHF—•ЩЂL*ш О_'іuЬgсu’}­pnЫ%{Д}‹?‚{l?ї:у…‚mЖ0ПЗ$NЋДЉ>лkAшуДІ6еGV—S;ћuщJЕЮ;16ѕŠV–ЙOKЈљљCв’žбЦжHRІФ9KyШR ђW—Ді ћ:ТЉ#Іф}Ј’Œїь $E™к cЎћ=ŒбжК•є8В3сY‚Юt– '‘ 3єчЪшrѕ\IК•ф> ™!ŽъˆQдЉ‘рц.x],…Йxм"Щу§Иuzз№sss>НџЯŠвџщщ]žeчщeчхЬ)вšR!ŽJ‘њЈqGŠкОЯRt–ЂЏIŠдYŠОF)ъOW>ЄШKбз(E4NЎiьGŠЂЈyМ{–ЂГ}UR„wо№јЂзŽМXѓoŒЄ+P ыЎЋ‹-“tБЌ[№1“yтw2tѓГ;‚љСj:рКˆяЏ.КGЗцГ‘›ў69)Ъ{ ъЇЊgTQcьЎj_ы1їЦ‡'зУ#ѓњIя K@+тЩјKDJлрЅщОuьРxІДш}C€`,nmФLНжYQa™„{B^j^1{%Оц~}ЦБЩ—гwЫ$ЉёьйЯ0>{іђ–šЗOЎƒeXЕТ—”ХніЙщЗKžЊ6;uг1‚ЫFГAГ!А}Дё IъF[Э3-ћщ…ŸвЪŽ|ŸѓњqДS]—@ађ>јД?`lлсЂLcЛУцaKУЅСхaїMnпяћ~Пoў…Олїіv)Ж]6 Е.вМоfјuŠ/Ї:n;{@зв_зЪ_зњwv}fйўнŒ†­v“EЙПеИчэŽМКhї^ѓйэУіŠЌˆBЈЂšŒaЕ cиOнЫ"6жЃЧ]БзиЇнП]У`›КŽіvжy]pА8nAРb,ЎwКn1Чв Бйq]Й ‰СМлїsѕ[›šлЯ‹yg}кЮŸМлЩ7ŒžКзФњzS&GћяЌа>*э]Ь‡,я†љЯтn‚Хя<ьDѓfѓ€3˜˜ ЬOэwžаLsІOэw/žFNМФŒЬ8"RЮчT“Qј\ш‘Фz2ВH/ч3L0GH#ЬaŽЃy;ˆ A„рi†dЬ%ђуŸ!LИрH N(ccџф‰vкЬ‘!*”дˆYДГЁSбЮЫ~шLcЌ%ІcЦ FO‹MЅ†ўб˜цcЋ'ŠKЊЃЪі:X=Х!ЁьJ”ТŠВ ŠXкзŽbTS$СJr{C?‹M„dŒ+†Дмж3ђу_1E0Ђ”k.Хcџф)њ‚3L)фK„ЁVјmшDД#Оъ,5д.:›ŸЅ†ЌˆЉoэСцЉкcŠcЦ-НЭWTБˆ1Ќ‰­ВƒkAЇЂ“Ÿ}„g L"ŽЄТVUц ~1!U˜ВFЊЌФхbžЈІЉV ŠСкbœ љŠ?l]ФРЙ$іXаЉˆчEU`v˜hF(В9зНјN$  “VО›}‘ ЮЋмv;Жz‹А’+.Ёœ9qCЇЂжёмќхЫ,•Т˜и:дYi ёE2Ё0'XRЄИvр‚ž'…щH"œъКШЉhчKФ‰™šrXoєE6jJ’М=˜=Q жARВ ƒеW„ ”€І­fVѕПƒŠ\~žРŠrЦ‡тSИ Г_о™dCСЙšfc~'‚к_sиL”(ыў™y‹ˆ&xс&DQ'v*ъљЊ$0Ђя”KЭйЉ„Тпqй}=№‚œG ћIWkѓu№бі,Ј•bPŒиюOE*?їqЬ$-(!ШN".т`&˜ТГ]=Г1?tуJ"HаЮ•Œ`ы>šy‹?ФI­TdpРv–РOD>ъч™€y“[šGЧя:Ѓ/Ъ L!=ИївГ'Ђ!‰”іНДСъ-ТЦдdўЃL;‘ЖСSбЫW­€ m@E"аюэЌ1тhT E!Ўbїќic~(ЧWСY@Ѕ‘u7Э|ХŸ)Q˜)”Sчъ‚Ї"ŸЗЊ‚iЬ…SLД6o„ ›Œ9Lk~(G[Ј”uoЃЗy‹ЋФŠp.…ц˜ циOE*_O@ǘ"”8O]ФС”Н`X™ћwЎЂY˜Кnо@М­Чщ˜uфOбŒb!ТЉРHKWб,№TфѓЖѓ8бЪ~uv0њЂœФА‘•vЋЕ­йб0”ќ\*fпWЌўЖЗ4Ї-Ф 3cьVk6x*zy,U• HШ{ЗтhŒ@=Ір L9lГ0?”CJ‚Т”Щ]д~DхbоV€2Œ9G„B `Ю"ирЉшч­XхЪ)жРрl; “^Aоџ.Р„ NЮŠ(8@У$”Лsm№‘Єq-•mКъџ’ЊљМкўUgћЧ›ѓџ€ЋџPKг‹7 Ї`PKиЊъ2ObjBFFFD753/styles.xml…’Ao‚@…я§лНУ`ЙT˜T4ibŠI1БGd$…]ВЌ@џ}qW0&ŠЧЩ|ѓцххЙ‹Ў,PCEsцс™iaDYТIЮ2яЂЕёŽў‹ћ„ЫшgЛB6ŸK„ €АЂ,T”ЩEDвsp9B§€еFXЫ™DьЛД{‡ЌvєвУG)+€ї_јѕЫ›eY g|9Pз“М"\вNNвg`„уУmE 8q;IŸ>ёOљHЗmkЖЖ"gѓљіпXsQЦЃ—ЎШйяC^m”ЪгNbпфR7й=q`3ZNŽБ˜ЮOзDlђ$›Œ‘WгтСC=o =Kї |ю7ЭџPKЛYLPKиЊъ2 settings.xmlЭX[SъH~п_Сцu “GЅœ WQЙ†‹ђ6ЩД$:™IM&ќѕgР=СrЉZd:_ЯtОўК›ыŸKŸЃ7Š~І) У]м(“qЋxЉќЌўu§wЃ_? šіќь9p…™љ@E1!ЄmXLjzA)Њj?кOэЮ_Јjcм(ЌЏ›Ч в‘Њ6{JAYža•ъѕAtЙK^­—oWˆрJU™єУўѕSв4M]_+›–ФЃЏіqŸХхдV7 CMWЗІЃЯот l]]›(лќЕНoЗ\Н^›o€‹ž?9Oas›"_žфЭƒју”ЪОgўДŸJ{“Г@йЎˆU W<*”ъЅqQЙИV?Ѓ|љžХ>hэ8虇…ЛЗT*kчЧaп‚ЗpїnZ7ЮЯ3nмrY<,)uб„;lЦ ЊTŸ !Л“[@јЬѕд8‹CЩ„œ<Ељ{ъаК УIр‹> ŠХАќ™ћГ&}F*_}FМГеP№$<е$AKйщy(›є‹Ыr9;ьєзЕŠQЮœLЁg8yњЇЈyШU <:”љ‰ЌTŽ‚Ў1!˜П?ЬFEћ‘ |ޘ?–PЛtsЯхД…Сј~X]Ым - рР-.odHч=7ЯЭCЫ›tпo ыхїЊыњ"тHШ:§_ЪЌ‰ёq4F’V€œ/”R№(ЃPЄТˆ$mьЪЯ)„јAv7“#БOŠЗЬШ-+"—|^g~Р!Lњ “Г:%COрŽйy”пutZ\І$ј‘пsp’c€р‰# DДЋ…Ї№"›ІЈьГ%ЯѓVzŽЄ< аЭа‘щf\р a… Ж~х9эОЮЄЊ1’Wp€яe сМRѓ(т+Ѕj-nџQKги)QмдЭџљпPŸ'яqn{oіЫыВ7qx=‹Љп–Щоч^u;ЯA2jшЛїП…–‡|w“щр’S%э„Ш†6цгmьіЧІА„ЌБ9•Оga ‘Мњš6Gы99М “Ї>d[Gд’{&ЩЎмGящШ™х7Ще‘ЃYђCъZБhї|dMи3vц!є юEО <Пс+ЩПr^œEєрvъзrœp48Šг)6ŸдˆŒGKіБYъзСa]§єуИzшЇўъ/PKИІ=zœ“PKиЊъ2META-INF/manifest.xmlЕ”[o‚0€пї+Xпс€ютŒhМ‘,йІњАЧZPƒ…РбП.гl8'aМPHћ}эЙД7xнФЦГ\&ЪeŽe3•H|ЉB—-žйaƒўEяr2/žчScУ• 0Їn90цЫбУ§и`&Р,E5 )аJВ`˜х<Э˜>1ƒ•П,Ÿ|Іс?™zS*џњtYD”vЭOіќ–m;PNв cO dŒ&*ЪŠƒЃ/ЙIEŠ.уiKСIŸvЪЗђ­ВДдzЩ$aЦі‹‚m›)ЇШeРр,‡м№abXЭ›KAл spьƒЧщ|М[Ю•wзiG7Ck†gКOЯЄщh•СZIХГЂѓ"й’)Иˆ№Lс+N@5X$Šєтї 5ЪЭЉˆ1oЛAт5 еАйj=ђ
Manuel de Sailcut CAD Robert Lainé Jeremy Lainé Sailcut CAD 1.3.5 - 19 octobre 2010 Introduction Ce manuel est en cours de rédaction. A propos de Sailcut CAD Sailcut is est un logiciel de tracé de voiles et de développement à plat des laizes. Les voiles peuvent être à 3 cotés ou à 4 cotés pour les gréements anciens par exemple. La première version de Sailcut a été développée en 1978 et utilisée par Robert Lainé sur son 1/4 ton IOR "Flying Sheep III". Sailcut est disponible sur la toile Internet depuis 1994 et est utilisé par beaucoup de professionels et amateurs maУЎtres voiliers, pour des bateaux de course, de croisière ou maquettes navigantes. Sailcut utilise une définition mathématique de la surface des voiles qui garantie que le profil de la voile sera lisse et aérodynamique. OУЙ obtenir Sailcut CAD? Vous pouvez télécharger la dernière version de Sailcut CAD depuis la page du projet à . Sailcut CAD est disponible sous forme binaire (compilé pour vous) et code source. Informations techniques sur le code Sailcut CAD est écrit dans le but d'être portable. Le code est donc du C++ qui utilise la librairie Qt de Trolltech pour l'interface graphique. Sailcut CAD utilise OpenGL pour tous les affichages 3D. Sailcut se compile et tourne sur GNU/Linux, Microsoft Windows et MacOS/X. Utilisation de Sailcut CAD Notes sur l'utilisation de fichier de versions précédentes A partir de la version 0.6.5 Sailcut CAD utilise des extensions de nom de fichier distincts au lieu de l'extension générique ".xml". Si vous souhaitez réutiliser des fichiers de données de voile de ce type vous devez les renommer avec l'extension ".saildef". Vous pourrez alors récupérer les données dimensionelles de la voile mais pas le moule que vous devrez redéfinir avant de sauvegarder les données. Préférences utilisateur Fichier des préférences Vos préférences sount enregistrées dans le fichier .sailcutrc. Sur les plateformes Unix ce fichier est placé dans votre répertoire HOME. Sous Windows ce fichier se trouve généralement dans le répertoire Documents and Settings\UTILISATEUR. Internationalisation A partir de la version 0.6.5, Sailcut CAD est internationalisé. La traduction des interfaces utilisateur est disponibles dans plusieurs languages. Au démarrage Sailcut utilise la langue correspondante à vos paramètres locaux. Vous pouvez changer la langue en utilisant le sous-menu Langue du menu Vue. Créer une voile Au lancement Sailcut CAD vous présente une voile par défaut. En haut de la fenêtre vous trouverez une série de menus déroulant. Le menu Fichier est utilisé pour le chargement d'une voile existante, la sauvegarde des données et paramètres de la voile et l'export des panneaux développés. Vous pouvez changer les dimensions de la voile à partir de l'entrée Dimensions du menu déroulant Vue. Vous pouvez modifier le profil de la voile à partir de l'entrée Moule du menu déroulant Vue. Vous pouvez visualiser plusieurs voiles sur le même gréement à partir de l'entrée Gréement du menu déroulant Vue. Définition de la voile Dans cette fenêtre vous définissez toutes les dimensions de la voile. Le programme est concu pour traiter les voiles triangulaires et quadrangulaires. Une voile triangulaire peut être vue comme une voile quadrangulaire dont le coté haut est très petit. La surface de la voile est générée à partir d'un jeu d'équations qui défini le profil de la voile à toutes les hauteurs. Ces profils reposent sur les bords de la voile qui sont eux même définis par leur longueur et le rond de ces bords, ainsi que par le vrillage de la voile. La fenêtre Définition de la voile est constituée de boites regroupant les divers paramètres de la voile. Utilisez le bouton Calculer pour calculer et afficher des données auxiliaire et en particulier la largeur de la voile aux points spécifiés par la règle IRC. Cette opération peut aussi changer la couleur de certaines zones de saisie. La couleur est rouge c' si la valeur est trop forte et jaune si elle est trop faible. La valeur elle même sera changée pour être à la limite acceptable. Lorsque vous avez fini d'entrer les données pressez le bouton OK pour afficher la voile en 3D. Géométrie du gréement La première étape est de choisir le type de voile sur laquelle vous voulez travailler et d'entrer les dimensions du gréement et du pont du bateau. Choisissez le type de voile en appuyant sur le bouton radio correspondant: Grand-voile pour toute voile montée sur un mât. Foc pour toute voile montée sur un étais fixe ou mobile. Aile pour toute voile cerf-volant ou planneur symétrique par rapport à la bordure. Les dimensions du gréement sont utilisée pour que les voiles s'affichent à la bonne position dans la fenêtre Gréement.
Définition du plan des voiles dans Sailcut
Identifiant de la voile Vous pouvez attacher un nom explicite aux données de la voile (maximum 40 caractères espaces compris). Dimensions de la voile C'est içi que vous entrez les dimensions de la voile. Pour une Grand-voile la longueur minimum de la vergue est de 5mm. Cette vergue peut aussi être la têtière. Une longueur inférieur à 5mm sera corrigée automatiquement par Sailcut. L'angle de la vergue par rapport au guindant est limité à 90 degrés. Une valeur positive du rond de guindant, bordure, chute ou vergue fait que le bord de la voile est à l'extérieur de la ligne droite joignant les coins correspondants. Un rond négatif revient à creuser le bord de la voile. Laposition du rond est exprimé en pourcentage de la longueur du bord correspondant, mesuré en partant du coin gauche ou bas de ce bord.
Définition des bords des laizes dans Sailcut
Les dimensions et les angles sont exprimés en millimètres et degrés. La longueur des bords ou de la diagonale d'une voile est la distance en ligne droite dans l'espace 3D entre les coins correspondants. Selon la forme de la voile, la longueur réelle d'un bord de la voile finie telle que mesurée sur le plancher, peut être légèrement plus grande que celle entrée. Par exemple, pour une longueur de bordure entrée de 3600 mm, si le creux de la bordure est nul, ce sera aussi la distance à plat entre point d'amure et d'écoute. Si le creux de la voile au niveau de la bordure est de 10%, alors la distance à plat entre point d'amure et d'écoute sera 2.7% plus grande que la longueur entrée. Après avoir entré les dimensions de la voile, vous pouvez cliquer sur le bouton Calculer pour obtenir des informations supplémentaires, tel que les coordonnées des coins de la voile, la distance perpendiculaire LP mesurée du point d'écoute au guindant anisi que les largeurs de la voile selon la règle de jauge IRC. Les coordonnées X-Y des coins de la voile sont utiles pour ajuster rapidement le plan de la voile. Si par exemple vous voyez que le point d'écoute est trop haut ou trop bas par rapport au point d'amure (valeur de Y), vous pouvez corriger cela en ajoutant ou retranchant la différence à la longueur de la chute.
Coupe Cliquez sur le bouton radio correspondant à la coupe de voile désirée. L'arrangement des laizes n'affecte pas la forme de la voile qui est définie par ses dimensions et son moule. Sauf pour la coupe radiale, le nombre de panneaux est déterminé automatiquement par la largeur du tissus et la largeur de couture entrés dans la boite Tissus. La coupe la plus courante est la Coupe transversale. Les laizes sont positionnées perpendiculairement à la ligne droite joignat le point d'écoute au pic de la voile. La Coupe twist est similaire à la coupe transversale sauf que les laizes du bas sont réorientées pour ne pas couper la bordure de la voile. La Coupe horizontale positionne les laizes horizontalement. Cette option peut être utilisée pour visualiser la forme de la voile et pour sortir des fichiers de points 3D positionés dans des plans horizontaux pour être utilisés par des outils de calcul d'écoulement de l'air. La Coupe verticale positionne les laizes parallélement à la chute. C'est la coupe classique des grand-voiles de vieux gréements. La Coupe mУЎtre est classiquement utilisée pour les génoas de vieux gréements. La voile est divisée en deux par une ligne joignant le point d'écoute au milieu du guindant. Les laizes sont placées perpendiculairement à la bordure dans la moitié inférieure et perpendiculairement à la chute dans la moitiée supérieure. La Coupe radiale est surtout utilisée en compétition avec les laizes orientées selon les directions de contrainte maximum. Avant d'utiliser cette coupe radiale il est important de bien comprendre la définition du nombre de sections, du nombre de fuseaux radiaux et du guindant (voir ).
Définition des fuseaux radiaux dans Sailcut
Forme Vous entrez içi le creux de la voile à trois hauteurs dans la voile: à la bordure, au milieu (la position exacte est définie dans le moule de la voile) et en haut de la voile. Ces valeurs se retrouvent dans la fenêtre Moule de la voile. L'angle de vrillage exprimé en degrés est l'ouverture du haut de la voile par rapport à la bordure. Le vrillage est essentiel pour tenir compte de la différence de direction du vent apparent entre le bas de la voile et le haut. Quelque fois le vrillage des focs ou génoas est déterminé par le besoin de passer la chute en dehors des barres de flèche. Pour une grand-voile à vergue, le vrillage est aussi déterminé par la capacité du gréement à tenir la tension de la chute. Ceci fait que le vrillage de ces gréements est plus important que pour un gréement Bermudien. Dans tous les cas il est important d'entre un angle de vrillage qui reflète la réalité de la forme de la voile sur le bateau dans les conditions de vent attendues. L'angle d'Ouverture est l'angle que fait la ligne joignant le point d'amure au point d'écoute par rapport à l'axe du bateau. Pour un foc la valeur minimum est de 5 degrés. Il est important de donner la bonne valeur de facon à ce que l'ensemble grand-voile + foc soit bien positionné dans la vue Gréement. ceci vous permettra de bien visualiser la fente entre le foc et la grand voile, comme sur le bateau. Notez que cet angle d'ouverture s'ajoute au vrillage pour donner l'angle du profile de la voile à toutes les hauteurs dans la voile. Tissus Entrez içi la largeur du tissus utilisé, la largeur de couture nécessaire pour assembler les laizes et les réservations de tissus pour faire les ourlets de la chute, de la bordure et des autres bords de la voile. La figure donne la position des réservations pour couture et ourlets. Sailcut CAD va calculer la position des coutures pour que les laizes utilisent au maximum la largeur du tissus, sauf dans la coupe radiale ou la largeur des laizes dépend du nombre de fuseaux. Notez que dans la coupe radiale, la largeur des coutures entre sections horizontales est le double de la largeur des coutures entre panneaux adjacent d'une section.
Définition des coutures et ourlets dans Sailcut
Moule de la voile La profondeur et la forme de la voile sont définies par trois profiles situés au niveau de la bordure, au milieu et en haut de la voile. Ces profiles peuvent être ajusté avec les 3 curseurs placé en dessous de chaque profile. La position du creux maximum de chaque profile est indiqué en dessous de la valeur du creux. Cette position dépend des coefficients de forme du guindant et de la chute, elle est exprimé par rapport à la corde de ce profile. Par exemple: 0.34 veut dire que le creux maximum du profile est situé à 34% de la corde en partant du guindant. La forme du profile coté guidant et coté chute peuvent être modifiés avec les curseurs correspondants. Dans le cas d'une voile à bordure libre, il est recommandé de mettre le coefficient de forme guidant à 1 et celui de la chute à 0 pour avoir un arc de cercle. Sous les coefficients de forme du guidant et de la chute, les valeurs correspondantes de l'angle d'entrée et de sortie du profile sont affichées en degrés. Ces angles sont rapportés à la corde du profile. Pour obtenir l'angle d'entrée ou de sortie du profile par rapport à l'axe du bateau il faut y ajouter l'angle de vrillage du profile et l'angle d'ouverture de la voile. En particulier pour un foc il est utile de vérifier que l'angle de sortie des profiles ajouté à l'angle d'ouverture de la voile ne donne pas une valeur trop négative (risque de renvois dans la grand-voile). La position verticale du creux maximum de la voile peut être ajusté par le curseur vertical situé à la droite du panneau vertical de gauche. Afin d'éviter que le haut de la voile ne se referme trop quand le vent augmente, il est recommandé de donner un coefficient de forme du guindant qui augmente avec la hauteur du profile et que par contre, le coefficient de forme de la chute diminue avec la hauteur du profile. Controle des vues Il est possible de faire un zoom, déplacer (pan) ou tourner les voiles dans une zone d'affichage graphique: Rotation : Vous pouvez tourner la voile en azimuth et élévation avec les curseurs situés au bord du panneau d'affichage. Déplacement : Cliquez sur un point de la voile pour le placer au centre de la zone d'affichage graphique. Zoom: Utilisez les touches CTRL + pour agrandir la vue et CTRL - pour la réduire. Vous pouvez aussi utiliser la molette de la souris pour ces fonctions de zoom avant et arrière. Développement des laizes Le développement de la voile s'affiche en cliquant sur l'onglet Développement de la fenêtre principale de Sailcut CAD. Les fonctions de controle de la vue sont les mêmes que pour la vue 3D. Les lignes bleues représentent les ligne de tracé des laizes et les ligne rouges les lignes de découpe prenant en compte les marges de couture. Vous pouvez exporter les points qui définissent les lignes de tracé et de découpe des laizes aux formats suivants à l'aide du sous-menu Export développement du menu déroulant Fichier: Fichier pour table traçante Carlson Design avec l'entrée table traçante Carlson. Fichier AutoCAD DXF avec l'entrée DXF. Tous les panneaux sont dans un seul fichier avec un panneau par calque. Plusieurs fichiers AutoCAD DXF avec l'entrée DXF (divisé). Chaque panneau est enregistré dans un fichier distinct sur le calque 1. Le nom des fichiers est le nom saisi complété avec le numéro du panneau (0,1,2,...). Fichier pouvant être lu avec un éditeur de texte pour le traçage à la main avec l'entrée traçage manuel. Fichier XML de toutes les laizes avec l'entrée voile XML (voir pour les détails du format du fichier). Fichier texte ASCII ordinaire de toutes les laizes avec l'entrée voile TXT (voir pour les détails du format du fichier). Fichier SVG (Scalable Vector Graphics) avec l'entrée SVG. Enregistrer et ouvrir les voiles Dès que vous avez créé une voile, vous pouvez enregistrer ses données dans un fichier avec les entrées Enregistrer ou Enregistrer sous du menu déroulant Fichier. Vous pouvez ensuite la recharger avec l'entrée Ouvrir la prochaine fois que vous voulez y retravailler. Les dimensions de la voile et la forme du moule sont sauvegardées simultanément. Ceci permet de recharger une voile et réutiliser son moule même si les dimensions de la voile sont changées par la suite. Sailcut CAD cré des fichiers XML pour sauvegarder les données des voiles. Ces fichiers peuvent être lus avec n'importe quel éditeur de texte. Exporter les voiles 3D En plus d'enregistrer les caractéristiques des voiles comme ci-dessus, il est possible d'exporter les points 3D situés sur les bords et les coutures de la voile. Ceci peut être fait dans les formats suivants à l'aide du sous-menu Export voile 3D du menu déroulant Fichier: Fichier AutoCAD DXF avec l'entrée DXF. Tous les panneaux sont dans un seul fichier avec un panneau par calque. Plusieurs fichiers AutoCAD DXF avec l'entrée DXF (divisé). Chaque panneau est enregistré dans un fichier distinct sur le calque 1. Le nom des fichiers est le nom saisi complété avec le numéro du panneau. Fichier XML avec l'entrée voile XML (voir pour les détails du format du fichier). Fichier texte ASCII ordinaire avec l'entrée voile TXT (voir pour les détails du format du fichier). Imprimer les données et dessins Le sous-menu Imprimer du menu Fichier offre plusieurs possibilités d'impression: L'entrée donnés permet d'imprimer les caractéristiques de la voile. L'entrée dessin permet d'imprimer un dessin de la voile complète. Une fenètre de prévisualiser l'impression et un spinbox permet de changer le facteur d'échelle. Le facteur d'échelle est le nombre par lequel on multiplie la dimension de la voile pour avoir sa taille sur le dessin imprimé. Le facteur d'échelle peut être aussi petit que 0.001 (une voile de 1000mm sera imprimée dans 1mm), la valeur par défaut est telle que la voile tiens dans 80% de la taille du papier. L'entrée développement permet d'imprimer le dessin d'une laize développée par page avec les coordonnées des points clés sur les bords. Une fenètre de prévisualiser l'impression et un spinbox permet de changer le facteur d'échelle comme pour la voile entière. L'impression est en mode paysage. La définition des coordonnées des points clés est donnée dans . Les coordonnées X,Y sont référencées au coin en bas à gauche du rectangle qui enveloppe la ligne de coupe de la laize. Les coordonnées dX,dY sont référencées à la ligne droite qui joint les extrémités du bord concerné. Le point dX = 0 (origine) est à l'extrémité gauche du bord et les points avec des valeurs dY positives sont situés à gauche de la ligne droite joignant l'origine (dX = 0) à l'autre extrémité du bord concerné en partant de l'origine du bord. Le facteur d'échelle d'impression est tel que le dessin de la voile et de la laize la plus grande logent sur une page. Pour imprimer les laizes à échelle 1 ou autre, il est préferrable d'exporter la voile au format DXF et d'utiliser un logicile de CAO pour piloter l'impression.
Dessin des laizes développées
Créer un gréement Ce module permet de dessiner un mât avec jusqu'à 3 niveaux de barres de flèche. On y accède avec l'entrée Gréement du menu principal Fichier Nouveau. L'entrée Dimensions du menu Vue affiche l'écran à partir duquel vous pouvez saisir et modifier les dimensions du gréement. La définition des diverses dimensions est donnée dans la figure . Veuillez noter que pour assurer que l'on puisse définir des voiles indépendament du gréement, la définition de la quête et de la courbure du mât se réfère à la hauteur complète du mât alors que dans la grandvoile, la courbe du guindant et son inclinaison sont rapportées à la longeur du guindant. Le module du gréement permet de calculer ces dernières données en partant de la hauteur du point d'amure et de la hauteur de la têtière.
Définitions du gréement Sailcut
Sauvegarder et Charger un fichier de gréement L'entrée Sauvegarder du menu Fichier est utilisée pour sauvegarder les données d'un gréement. Tout gréement qui est sauvegardé peut ensuite être chargé en utilisant l'entrée Ouvrir du menu Fichier et peut être utilisé comme élément constitutif d'un bateau. ContrУДle des vues Le contrУДle des vues est identiques à celui de l'écran graphique des voiles. Vous pouvez fare tourner le gréement avec les curseurs situés au bord de la fenêtre graphique, faire un zoom avec la roulette de la souris, recentrer la vue avec un clic gauche sur un point, afficher le gréement en surfaces colorées ou vue fil de fer. Dimensions d'un gréement L'entrée Dimensions du menu Vue affiche l'écran avec les dimensions du gréement. Cet écran est divisé en cadres correspondants aux entités listées ci-dessous. Veillez noter que les angles sont exprimés en degrés et les dimensions linéaires en millimètres. Gréement ID Un texte libre identifiant ou décrivant le gréement. Le nombre de caractères est limité à 40. Triangle avant La hauteur = I et la base = J du triangle avant sont entrées dans les cjhamps correspondants. Notez que ces dimensions sont prises selon la verticale et l'horizontale. Soyez attentifs à la mesure de J quand le mât est incliné. Mât Le mât a une section constante du haut en bas. Les hauteurs sont référencées au plan horizontal passant par la ferrure d"étrave. Hauteur du mât = MH hauteur du sommet du mât, elle doit être supérieure à J. Rond du mât = MRnd déviation maximum par rapport à la ligne droite joingant le sommet du ma à son pied. Position du rond du mât = MRndPos spin box permettant d'entrer la hauteur relative du point de rond maximum, exprimé en pourcentage de la hauteur du mât. Quête du mât = MRkM distance horizontale entre le sommet du mât et son pied. Sailcut CAD calcul en degré l'inclinaison correspondante du mât = MRkD. Corde du mât = MC dimension avant-arrière du profile de mât. Largeur du mât = MW dimension transversse du profile du mât. Grandvoile Voir plus loin le paragraphe à propos de la courbe du guindant de la grandvoile. Haubans Hauteur hauban de tête = CSH hauteur du point de fixation de ce hauban sur le mât. Base hauban de tête = CSB distance de la cadène du hauban de tête à la ligne centrale du pont. Base bas hauban = LSB distance de la cadène du bas hauban à la ligne centrale du pont. Doit être inférieure ou égale à la base du hauban de tête. Barres de flèche Nombre de barres de flèche = SPNB peut être de 0 (pas de barre de flèche) à 3. Si il n'y a pas de barre de flèche alors la base du hauban de tête est égale à celle du bas hauban. Hauteur barre de flèche SPH mesurées depuis le plan horizontal de référence, elles doivent être entrées dans l'ordre ascendant, 1 etant la barre la plus basse. Longeur barre de flèche SPW mesurée depuis la ligne centrale du mât. Vérifier et Valider les données Utilisez le bouton Vérifier pour afficher les données auxilliaires et vérifier que les données entrées sont cohérentes avec une géometrie raisonable du gréement. En cas d'anomalie dans les données, la couleur ds caractères douteux vous indique le type d'anomalie. Rouge indique une valeur trop forte, mauve une valeur trop faible et bleu indique les données en relation avec l'anomalie et qui doivent être vérifiées. Une fois que vous avez entré le données, cliquer sur le bouton OK pour fermer l'écran dimensions et afficher le dessin. L'écran dimensions ne se fermera qu'une fois toutes les anomalies de dimensions corrigées. Courbe de guindant de la Grandvoile Dans certains cas, vous aurez dessiné des voiles indépendemment du gréement et défini la courbe du guindant à partir d'observations de celle ci sur un bateau. Il se peut aussi que vous vouliez définir une grand voile qui se monte sur un gréement dont les dimensions sont entrées dans le module gréement de Sailcut. Le cadre Grandvoile permet de calculer la position exacte du point d'amure de la grandvoile, de la têtière, la quête du guidant et sa courbe correspondant au mât. Ces données sont à entrer dans le module voile ou peuvent être utilisées pour vérifier si une voile correspond à un mât. Les seules données à entrer sont hauteur amure = BAD et hauteur têtière = HAD. Sailcut CAD calcule les autres valeurs.
Créer une coque Veuillez noter que ce module n'est pas complètement opérationel, seul un bouchain apparaitra pour toutes les coques. Ce module permet de dessiner un coque à bouchains vifs. On y accède avec l'entrée Coque du menu principal Fichier Nouveau. ContrУДle des vues Le contrУДle des vues est identiques à celui de l'écran graphique des voiles. Vous pouvez faire tourner la coque avec les curseurs situés au bord de la fenêtre graphique, faire un zoom avec la roulette de la souris, recentrer la vue avec un clic gauche sur un point, afficher la coque en surfaces colorées ou vue fil de fer. Sauvegarder et Charger un fichier de coque L'entrée Sauvegarder du menu Fichier est utilisée pour sauvegarder les données d'une coque. Toute coque qui est sauvegardée peut ensuite être chargée en utilisant l'entrée Ouvrir du menu Fichier et peut être utilisé comme élément constitutif d'un bateau. Dimensions d'une coque Vous pouvez accéder aux dimensions de la coque avec l'onglet Pont et Fond (entrée Dimensions du menu Vue). L'écran est divisé en cadres correspondant au diverses dimensions de la coque. La coque est construite en partant du fond et en montant vers le pont. La ligne la plus importante est le bouchain qui défini le bord extérieur du fond. Les hauteurs sont prises par rapport à un plan horizontal arbitraire souvent placé au point le plus bas du fond. Les angles sont mesurés en degrés par rapport à ce plan horizontal. Coque ID Un texte identifiant ou décrivant la coque est entré dans ce cadre. Pont Hauteur avant Hauteur arrière Fond Longeur Inclinaison de l'étrave Inclinaison du tableau Hauteur avant Angle du bouchain Hauteur arrière Bau maximum Position du bau max Largeur arrière Forme avant Forme arrière Inclinaison du fond Angulation longitudinale du fond Bordé Nombre de bordés Bordage automatique Inclinaison du bordé haut Inclinaison du bordé bas Vérifier et Valider les données Utilisez le bouton Vérifier pour afficher les données auxilliaires et vérifier que les données entrées sont cohérentes avec une géometrie raisonable de la coque. En cas d'anomalie dans les données, la couleur ds caractères douteux vous indique le type d'anomalie. Rouge indique une valeur trop forte, mauve une valeur trop faible et bleu indique les données en relation avec l'anomalie et qui doivent être vérifiées. Une fois que vous avez entré le données, cliquer sur le bouton OK pour fermer l'écran dimensions et afficher le dessin. L'écran dimensions ne se fermera qu'une fois toutes les anomalies de dimensions corrigées. Ajustement des bordés Les bordés peuvent être ajustés individuellement en cliquant l'onglet Bordés de l'écran Dimensions entry of the View menu. L'écran bordés est divisé en zones dans lesquelles les diverses dimensions sont entrées. Hauteur avant Hauteur arrière Inclinaison du bordé Angulation longitudinale Angle du bouchain Créer un bateau Ce module permet d'assembler un bateau virtuel à partir de fichiers de coque, mât et voiles. On y accède avec l'entrée Bateau du menu principal Fichier Nouveau. ContrУДle des vues Le contrУДle des vues est identiques à celui de l'écran graphique des voiles. Vous pouvez faire tourner le bateau avec les curseurs situés au bord de la fenêtre graphique, faire un zoom avec la roulette de la souris, recentrer la vue avec un clic gauche sur un point, afficher le bateau en surfaces colorées ou vue fil de fer. Ajouter et enlever les éléments d'un bateau L'affichage graphique est initialement noir et on ajoute les fichiers des éléments avec l'entrée Ajouter du menu principal Fichier. Un nouvel onglet apparaitra pour chaque élément ajouté avec les détails du fichier chargé et le texte d'identification donné au moment de la création du fichier (Voile ID, Grément ID, Coque ID). Un élément de bateau peut être enlevé en choisissant l'onglet correspondant et en suite en cliquant sur le bouton Enlever. Sauvegarder et charger un bateau L'entrée Sauvegarder du menu principal Fichier est utilisé pour sauvegarder les données d'un bateau constitué de n'importe quelle combinaison de coque, mât et voiles. Un bateau sauvegarder peut ensuite être chargé avec l'entrée Ouvrir du menu principal Fichier. Déplacer un élément du bateau Chaque élément constitutif sera affiché initialement à la position donnée au moment de la création du fichier correspondant. Veuillez vous souvenir que le point origine des coordonnées X=0, Y=0, Z=0 est placé à l'éxtrémité avant du pont de la coque (étrave). Les éléments peuvent être individuellement déplacés en X, Y or Z en ajustant les spinbox des onglets correspondant, puis en cliquant sur le bouton Mise à jour. A tout instant, un clique sur le bouton Recharger replacera l'élément correspondant à sa position initiale. Modélisation de la surface des voiles dans Sailcut Papier présenté par Robert Lainé au 2ème Workshop Science Voile IRENAV à Brest, France, le 21 mai 2004. Historique Le logiciel de coupe de voile Sailcut a été développé initialement en 1978 en Basic sur un calculateur disposant d'un écran avec une ligne de texte, une petite imprimante à 32 colonnes et seulement 1.6 ko de mémoire vive. D'oУЙ la nécessité de faire simple pour modéliser la surface des voiles que je fabriquais et utilisais sur mon ТМ ton IOR. Ce cycle court "conception=>fabrication=>utilisation=>correction" sans contrainte commerciale d'adaptation aux habitudes de travail des voileries m'a permis de converger rapidement sur une modélisation compacte et robuste de la surface des voiles. Plus tard l'utilisation de Sailcut par des voileries a contribué à l'ajout d'interfaces graphiques au noyau Sailcut mais ceci est une autre histoire... Depuis 1993 la version Visual Basic de Sailcut est disponible sur Internet à et depuis 2003, le code source de Sailcut récrit en C++ est disponible à . Pour des raisons de protection de la propriété intellectuelle, le nom Sailcut est déposé mais l'auteur maintient l'accès libre et gratuit au logiciel Sailcut. Problématique de la définition de la surface d'une voile Une voile est une surface complexe que les voileries définissaient historiquement par des notions telles que le creux à différentes hauteurs et la position du creux maximum sur la corde locale. Cette manière de définir la voile par des points de contrУДle permet de faire facilement une corrélation visuelle entre le modèle et la voile réelle sur le bateau. Malheureusement par quelques points peuvent passer un grand nombre de surfaces plus ou moins bosselées. Ensuite des notions telles que la pente au bord d'attaque et au bord de fuite furent introduites pour améliorer le contrУДle du maУЎtre voilier sur la forme du profil de la voile. Ces méthodes menaient à des calculs d'interpolation assez lourds pour trouver le creux en tous points d'une voile, calculs dépassant la capacité des calculateurs personnels d'antan. Dès le début de mes activités sportives en voile, je me suis intéressé à l'aérodynamique de la voile. La lecture du livre Theory of wings sections m'a convaincu que ce qui comptait le plus dans la qualité d'un profil était la répartition de la courbure le long du profil. La définition d'un profil par son creux maximum, la position du creux et des segments de fonctions quadratiques ou cubiques me semblait suspecte. PlutУДt que de chercher à reproduire des voiles existantes, j'ai cherché à produire une loi de courbure raisonnablement aérodynamique sur toute la surface de la voile. La première approche a été de modéliser directement la courbure mais cela nécessitait de traiter simultanément les dérivées premières et secondes en tous points et donc trop de calculs pour mon petit ordinateur. Navigant à l'époque en mer du Nord dans des conditions assez musclées pour mon ТМ ton, un de mes objectifs était d'obtenir une forme de profil ayant un pic de pression avancé pour combattre la tendance du creux à reculer quand le vent augmente. J'ai finalement choisi une équation définissant la dérivée seconde du profil et me donnant une évolution continue de celle-ci et contrУДlée par seulement deux paramètres. Le système de coordonnées choisi est tel que le plan X-Y contient le point d'amure, le point d'écoute et la tête du guindant. L'axe X est horizontal du point d'amure vers le point d'écoute, l'axe Y est vertical vers le haut et l'axe Z transverse au plan X-Y. Les profils sont définis comme l'intersection de la surface de la voile avec un plan horizontal Y-Z. Le Z d'un point d'un profil donné est donc une fonction de l'abscisse X normalisée par rapport à la longueur de la corde locale comme montré dans .
Système de coordonnées de Sailcut
L'équation retenue pour décrire la dérivée seconde du profil est: Z'' = K * ( -A * (1 - X)^AV - AR * X) Ce qui donne par intégration la pente du profil : Z' = K * ( A * (1 - X)^(AV + 1) / (AV +1) - AR/2 * X^2 + C ) Et enfin le profil après une seconde intégration : Z = K * ( -A * (1 - X)^(AV + 2) / (( AV + 2) * (AV +1)) - AR/6 * X^3 + C * X + B ) Pour satisfaire les conditions (X=0, Z=0) et (X=1, Z=0) on prend : B = A / ((AV + 2) * (AV + 1)) C = AR / 6 - B Le maximum de Z est trouvé quand Z' = 0, ce qui permet ensuite de calculer K pour que ce Z maximum soit celui souhaité (creux du profil). Les coefficients AV et AR donnent une mesure de la courbure au bord d'attaque et au bord de fuite. Avec le creux maximum, ces deux coefficients suffisent pour décrire le profil de la voile à toutes les hauteurs. Le coefficient A définit différentes familles de profils avec un bord d'attaque plus ou moins rond. En pratique A = 1 donne de bons profils pour toutes les voiles navigant dans des conditions de vent moyen ou faible. Personnellement je préfère avoir un bord d'attaque plus plein et j'utilise A = 1 + AV / 4. Ce coefficient est celui utilisé dans le code de Sailcut et il donne des voiles polyvalentes. Le tableau ci dessous donne un exemple de profil obtenu avec la formulation ci dessus. AV = 5.00 AR = 0.02 K = 2.94 A = 2.25 B = 0.054 C =-0.050 curvature = z" / (1+ z'*z')^3/2 xz" z' z curvature 0.0 -6.615 0.955 0.00 -2.503 0.1 -3.912 0.438 0.0674 -3.007 0.2 -2.179 0.140 0.0949 -2.117 0.3 -1.129 -0.021 0.100 -1.129 0.4 -0.538 -0.101 0.0934 -0.530 0.5 -0.236 -0.138 0.0812 -0.230 0.6 -0.103 -0.154 0.0665 -0.099 0.7 -0.057 -0.161 0.0507 -0.055 0.8 -0.049 -0.166 0.0343 -0.047 0.9 -0.053 -0.172 0.0174 -0.051 1.0 -0.059 -0.177 0.00 -0.056 Ayant défini une formulation simple pour les profils, il suffit de faire varier les valeurs du creux et des coefficients AV et AR en fonction de la hauteur du profil dans la voile. Pour la bordure qui est un arc de cercle, les coefficients AV et AR sont nuls et seul le creux est défini par l'utilisateur. Un profil dit de creux maximum est positionné autour de la ТН hauteur de la voile et les valeurs de AV et AR sont ajustées par l'utilisateur pour obtenir la forme désirée. Le profil haut de la voile est défini de la même manière. Pour tout autre profil intermédiaire la valeur du creux est interpolée par une fonction parabolique et la valeur des coefficients AV et AR est interpolée linéairement entre celles des profils de référence. Au total on utilise 3 valeurs de creux, la position verticale du creux maximum, et 2 paires de coefficients (AV,AR) pour définir le moule de la voile. Notez que dans le logiciel Sailcut, la valeur affichée pour le coefficiend de forme du guidant est directement le coefficient AV alors que pour la chute la valeur affichée est 50 fois le coefficient AV des équations ci-dessus, ceci afin que les utilisateurs travaillent avec des chiffres plus simples que des valeurs à la deuxième ou troisième décimales. Autres aspects de la modélisation Le moule ci dessus ne suffit pas pour faire une vraie voile. En effet les bords d'une voile sont rarement droits et de plus la voile présente un certain vrillage des profils entre le haut et le bas. Pour définir la forme des bords j'utilise maintenant une formulation avec un point représentant le rond maximum du bord, c'est à dire l'écart maximum du bord réel par rapport à la ligne droite joignant les coins adjacents, et deux arcs de parabole qui joignent le point de rond maximum aux coins de la voile. Les profils s'appuient sur ces bords de la voile. Le vrillage de la voile est obtenu par une rotation des profils autour de leur extrémité coté guindant. L'angle de rotation est proportionnel à la hauteur du profil. Il est à noter que cette méthode de modélisation de la surface des voiles permet de construire une voile ayant une forme sans bosses ou méplats, ni possibilité d'inversion de cambrure des profils, ceci avec peu de paramètres et des calculs simples. La méthode est applicable aussi bien aux voiles triangulaires qu'aux voiles à quatre cotés et Sailcut est utilisé régulièrement pour des vieux gréements.
Plus d'informations sur Sailcut CAD TODO Formats de fichiers de Sailcut CAD Text representation of developed sail TODO Text representation of 3D sail TODO XML representation of a sail Copyright Copyright (C) 1993-2007 Robert & Jeremy Lainé. Sailcut est une marque déposée par Robert Lainé. Ce logiciel est libre; vous pouvez le redistribuer et le modifier selon les termes de la licence GNU General Public Licence telle que publiée par la Free Software Fondation version 2 ou autre version plus récente. Voyez pour les termes de cette licence. Ce logiciel est distribué avec l'éspoir qu'il vous soit utile mais SANS AUCUNE GARANTIE même implicite quand son utilisation. Voyez les termes de la licence GNU pour plus de détail. Vous devriez avoir une copie de la licence GNU General Public Licence avec ce logiciel, si ce n'est pas le cas demandez la à Free Software Fondation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Les auteurs apprécieraient que les publications sur des voiles conçues avec Sailcut comportent une reconnaissance de leur travail. Merci par avance.
sailcut-1.3.5/doc/fr/develop_panel_drawing.fig0000644000175000007640000000724210510643102021274 0ustar sharkyjerryweb#FIG 3.2 Produced by xfig version 3.2.5-alpha5 Landscape Center Metric A4 100.00 Single -2 1200 2 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 3 6705 3510 7155 5040 7245 6615 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 3 1215 6750 1620 5085 2565 3375 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 3 900 6930 1350 5085 2430 3105 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 3 6885 3285 7425 5040 7515 6975 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 1 3 0 0 1.00 120.00 240.00 0 0 1.00 120.00 240.00 900 1350 900 7290 9900 7290 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1710 2385 2565 3375 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 4230 2655 3960 3285 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 6390 2745 6120 3600 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 7965 2385 6705 3510 2 1 0 1 9 7 50 -1 -1 0.000 0 0 -1 1 1 3 0 0 1.00 90.00 180.00 0 0 1.00 90.00 180.00 1170 4500 1215 6750 8595 6570 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 2880 7785 3240 7020 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 900 8100 1215 6750 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 6525 6525 6165 7875 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 7245 6615 7605 8055 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1575 6345 1215 6750 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 3 0 0 1.00 90.00 180.00 0 0 1.00 90.00 180.00 2610 1530 2565 3375 8955 3600 2 2 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 5 900 7290 7515 7290 7515 2970 900 2970 900 7290 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 2790 2745 2565 3375 2610 3375 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 900 7290 810 7380 3 2 0 2 1 7 50 -1 -1 0.000 0 0 0 4 1215 6750 3735 7020 6075 6570 7245 6615 0.000 -1.000 -1.000 0.000 3 2 0 2 1 7 50 -1 -1 0.000 0 0 0 4 2565 3375 4185 3285 6030 3555 6705 3510 0.000 -1.000 -1.000 0.000 3 2 0 2 4 7 50 -1 -1 0.000 0 0 0 4 900 6930 3690 7290 6030 6840 7515 6975 0.000 -1.000 -1.000 0.000 3 2 0 2 4 7 50 -1 -1 0.000 0 0 0 4 2430 3105 4185 3015 6030 3285 6885 3285 0.000 -1.000 -1.000 0.000 4 0 0 50 -1 0 12 0.0000 4 135 705 2115 8055 dY = -10\001 4 0 0 50 -1 0 12 0.0000 4 135 750 2115 7830 dX = 321\001 4 0 1 50 -1 0 12 0.0000 4 135 540 1665 6210 dX = 0\001 4 0 1 50 -1 0 12 0.0000 4 135 540 1665 6435 dY = 0\001 4 0 0 50 -1 0 12 0.0000 4 135 750 7785 2025 X = 1789\001 4 0 0 50 -1 0 12 0.0000 4 135 645 7785 2295 Y = 678\001 4 0 0 50 -1 0 12 0.0000 4 135 645 1395 2070 X = 234 \001 4 0 0 50 -1 0 12 0.0000 4 135 645 1395 2340 Y = 789\001 4 0 0 50 -1 0 12 0.0000 4 135 540 5265 8145 dY = 2\001 4 0 0 50 -1 0 12 0.0000 4 135 855 5265 7875 dX = 1345\001 4 0 9 50 -1 0 12 0.0000 4 135 240 1215 4500 dY\001 4 0 0 50 -1 0 12 0.0000 4 135 750 7740 7965 X = 1890\001 4 0 0 50 -1 0 12 0.0000 4 135 540 7740 8235 Y = 35\001 4 0 0 50 -1 0 12 0.0000 4 135 750 4050 2340 dX = 345\001 4 0 0 50 -1 0 12 0.0000 4 135 540 4050 2565 dY = 5\001 4 0 0 50 -1 0 12 0.0000 4 135 600 6075 2700 dY = -2\001 4 0 0 50 -1 0 12 0.0000 4 135 855 6075 2475 dX = 1234\001 4 0 1 50 -1 0 12 0.0000 4 135 540 2835 2520 dX = 0\001 4 0 1 50 -1 0 12 0.0000 4 135 540 2835 2700 dY = 0\001 4 0 1 50 -1 0 12 0.0000 4 180 1455 8145 3420 dX bord sup\351rieur\001 4 0 9 50 -1 0 12 0.0000 4 135 1395 8145 6435 dX bord inf\351rieur\001 4 0 1 50 -1 0 12 0.0000 4 180 1455 2745 1710 dY bord sup\351rieur\001 4 0 4 50 -1 0 12 0.0000 4 135 435 315 7335 X = 0\001 4 0 4 50 -1 0 12 0.0000 4 135 435 315 7560 Y = 0\001 4 0 4 50 -1 0 18 0.0000 4 195 210 9540 7155 Y\001 4 0 4 50 -1 0 18 0.0000 4 195 210 585 1845 X\001 4 0 0 50 -1 0 12 0.0000 4 135 540 270 8145 X = 15\001 4 0 0 50 -1 0 12 0.0000 4 135 540 270 8370 Y = 25\001 4 0 0 50 -1 0 18 0.0000 4 195 1005 3105 4320 Panneau\001 4 0 1 90 -1 0 12 0.0000 4 180 2550 4365 4995 Ligne de trac\351 (DRAW) en bleu\001 4 0 4 50 -1 0 12 0.0000 4 180 2565 4365 5400 Ligne de coupe (CUT) en rouge\001 sailcut-1.3.5/doc/fr/sailplan.fig0000644000175000007640000000746011112616675016567 0ustar sharkyjerryweb#FIG 3.2 Produced by xfig version 3.2.5-alpha5 Landscape Center Metric A4 100.00 Single -2 1200 2 5 1 0 2 1 7 50 -1 -1 0.000 0 0 1 1 4980.000 1860.000 5175 720 5625 900 5940 1215 0 0 2.00 60.00 120.00 0 0 2.00 60.00 120.00 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 1350 7920 8955 7920 8865 8280 1575 8280 1350 7920 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1350 7920 4590 3150 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 4140 7290 4140 8955 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 1350 7920 315 7920 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 1530 7695 675 7695 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 4140 7245 3285 7245 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 5 4140 7245 4923 2028 6840 630 8685 7110 4113 7248 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 3 1 1.00 60.00 120.00 3150 4005 4275 3555 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 3960 7920 4905 1575 4815 1575 3870 7920 3960 7920 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 3 1 1.00 60.00 120.00 5220 6255 4230 7155 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 3 1 1.00 60.00 120.00 4995 2070 5486 2479 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 3 1 1.00 60.00 120.00 8550 7020 7335 6300 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 3 1 1.00 60.00 120.00 7020 720 7875 1485 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 4590 3195 360 3195 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 1530 7695 4185 3780 3645 7605 1530 7695 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 3420 7245 3420 6705 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 3420 7920 3420 8190 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 3 1 1.00 60.00 120.00 4230 1710 4669 2140 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 3 1 2.00 60.00 120.00 3 1 2.00 60.00 120.00 1350 8775 4140 8775 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 3 1 2.00 60.00 120.00 3 1 2.00 60.00 120.00 4140 8775 4950 8775 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 1 2 3 1 2.00 60.00 120.00 3 1 2.00 60.00 120.00 1350 9135 4545 9135 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 4545 3195 4545 9135 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 1350 7740 1350 9135 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 4905 2070 5130 720 5130 675 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 1 2 3 1 1.00 60.00 120.00 3 1 1.00 60.00 120.00 405 7920 405 3195 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 4950 2025 4950 8910 3 2 0 2 4 7 50 -1 -1 0.000 0 0 1 2 3 1 2.00 60.00 120.00 720 7695 720 6840 0.000 0.000 3 2 0 2 4 7 50 -1 -1 0.000 0 0 1 2 3 1 2.00 60.00 120.00 720 7920 720 8280 0.000 0.000 4 0 1 50 -1 0 16 0.0000 4 195 915 6390 7110 Bordure\001 4 0 4 50 -1 0 14 0.0000 4 210 1605 540 5490 triangle avant = I\001 4 0 0 50 -1 0 16 0.0000 4 195 810 5310 6165 Amure\001 4 0 0 50 -1 0 16 0.0000 4 195 765 7110 6210 Ecoute\001 4 0 4 50 -1 0 18 0.0000 4 195 420 3195 5985 Foc\001 4 0 0 50 -1 0 18 0.0000 4 195 480 3600 1665 Mat\001 4 0 1 50 -1 0 16 0.0000 4 195 1065 4635 4680 Guindant\001 4 0 1 50 -1 0 14 0.0000 4 150 2550 1485 8685 Distance \351trave-amure GV\001 4 0 4 50 -1 0 14 0.0000 4 210 2145 1935 9045 Base triangle avant = J\001 4 0 1 50 -1 0 16 0.0000 4 195 630 6075 765 Gaffe\001 4 0 4 50 -1 0 14 0.0000 4 150 600 810 7020 du foc\001 4 0 0 50 -1 0 16 0.0000 4 195 555 2565 4005 Etais\001 4 0 4 50 -1 0 14 0.0000 4 150 1425 675 6705 Hauteur amure\001 4 0 1 50 -1 0 14 0.0000 4 150 1365 2340 6975 hauteur amure\001 4 0 1 50 -1 0 14 0.0000 4 165 1125 2340 7470 Grand voile\001 4 0 1 50 -1 0 18 0.0000 4 195 1350 5940 4275 Grand voile\001 4 0 1 50 -1 0 16 0.0000 4 195 675 7785 3375 Chute\001 4 0 4 50 -1 0 14 0.0000 4 150 1065 540 5265 Hauteur du\001 4 0 0 50 -1 0 16 0.0000 4 195 510 5625 2700 T\352te\001 4 0 0 50 -1 0 16 0.0000 4 195 345 7920 1755 Pic\001 4 0 1 50 -1 0 14 0.0000 4 210 2010 3285 585 Angle gaffe/guindant\001 4 0 0 50 -1 0 14 0.0000 4 225 2385 6255 7830 longueur du pont = LOA\001 4 0 1 50 -1 0 14 0.0000 4 195 1755 5040 8730 Quete du guindant\001 sailcut-1.3.5/doc/CMakeLists.txt0000644000175000007640000000143211454306020016404 0ustar sharkyjerrywebset(docfiles) if(XSLTPROC AND FIG2DEV) foreach(language en es fr) file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${language}) transform_figs(pngs ${language}/coordinates_system.fig ${language}/sailplan.fig ${language}/sail_seams.fig ${language}/sail_edges.fig ${language}/develop_panel_drawing.fig ${language}/head_gores_definition.fig ${language}/rigplan.fig) transform_docbook(html sailcut-html.xsl ${language}/index.docbook) list(APPEND docfiles ${html} ${pngs}) install(FILES ${docfiles} DESTINATION ${SAILCUT_DOC_DIR}/${language}) endforeach() install(FILES sailcut-handbook.css DESTINATION ${SAILCUT_DOC_DIR}) else(XSLTPROC AND FIG2DEV) message(STATUS "Not generating documentation") endif(XSLTPROC AND FIG2DEV) add_custom_target(documentation DEPENDS ${docfiles}) sailcut-1.3.5/doc/es/0000755000175000007640000000000011457411327014265 5ustar sharkyjerrywebsailcut-1.3.5/doc/es/rigplan.fig0000644000175000007640000001342210700004326016375 0ustar sharkyjerryweb#FIG 3.2 Produced by xfig version 3.2.5-alpha5 Landscape Center Metric A4 100.00 Single -2 1200 2 1 3 0 1 1 7 50 -1 -1 0.000 1 0.0000 8145 8145 45 45 8145 8145 8190 8145 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 2655 5490 1890 7650 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 1710 7650 1710 8865 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 1800 5445 1395 5445 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 1890 4095 1080 4095 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 2070 2745 765 2745 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 540 1350 540 7650 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 855 2745 855 7650 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 1170 4095 1170 7650 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 1485 5445 1485 7650 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 180 7650 3600 7650 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 3690 765 2835 765 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 2655 7650 2655 8100 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 2835 7650 2835 8100 2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 2652 765 2835 765 2835 7650 2652 7650 2652 765 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 6 2655 1350 2070 2745 1890 4050 1800 5400 1710 7650 1710 7605 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 3555 765 3555 7650 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 1.00 60.00 120.00 1710 8775 2745 8775 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 1.00 60.00 120.00 1890 8370 2745 8370 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 2430 8055 2655 8055 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 1.00 60.00 120.00 2835 8055 3285 8055 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 1890 7650 1890 8460 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 1440 4905 1800 5445 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 2395 4898 2755 5438 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 1485 4995 2430 4995 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 1720 2198 2080 2738 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 1620 3645 2430 3645 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 1800 2295 2430 2295 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 2371 2184 2731 2724 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 2395 3548 2755 4088 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 1540 3548 1900 4088 2 1 3 1 1 7 50 -1 -1 10.000 0 0 -1 0 0 2 2745 9000 2745 405 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 2655 1350 495 1350 2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 2070 2745 2655 2745 2655 2790 2070 2790 2070 2745 2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 1890 4095 2655 4095 2655 4140 1890 4140 1890 4095 2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 1800 5445 2655 5445 2655 5490 1800 5490 1800 5445 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 4545 7650 8010 1125 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 8010 1170 8010 8775 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 4545 7650 4545 8910 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 7650 7650 7650 8370 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 8145 7650 8145 8370 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 8505 765 8505 8235 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 8010 8685 4545 8685 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 7650 8145 8145 8145 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 8145 8145 8505 8145 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 1.00 60.00 120.00 7650 8145 7020 8145 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 1.00 60.00 120.00 8505 8145 9045 8145 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 7650 8325 4545 8325 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 7155 5670 7740 6030 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 4140 7650 10710 7650 2 3 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 6 8013 765 8508 765 8148 7650 7653 7650 8013 900 8013 765 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 8010 1170 4275 1170 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 4455 1170 4455 7650 2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 0 0 2 8415 2070 9180 2070 2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 9045 2070 9045 7650 2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 1 2 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 9585 6525 9585 7650 2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 0 0 2 8235 6525 9720 6525 2 1 0 2 18 7 50 -1 -1 0.000 0 0 -1 0 0 4 8415 2070 10035 495 11655 6165 8235 6525 4 0 1 50 -1 0 12 1.5708 4 180 1455 3510 4905 mast height = MH\001 4 0 1 50 -1 0 12 1.5708 4 180 2070 810 5535 Spreader 3 height = SPH3\001 4 0 0 50 -1 0 12 0.0000 4 135 405 6705 5670 Mast\001 4 0 4 50 -1 0 12 1.5708 4 180 1695 4365 5040 fore triangle hoist = I\001 4 0 1 50 -1 0 12 0.0000 4 135 1290 5220 8235 mast base = MB\001 4 0 4 50 -1 0 12 0.0000 4 180 1665 5220 8640 fore triangle base = J\001 4 0 1 50 -1 0 12 0.0000 4 135 315 7110 8055 MC\001 4 0 1 50 -1 0 12 0.0000 4 135 360 3015 7965 MW\001 4 0 1 50 -1 0 12 0.0000 4 135 360 2160 8325 LSB\001 4 0 1 50 -1 0 12 0.0000 4 135 375 2025 8730 CSB\001 4 0 1 50 -1 0 12 0.0000 4 135 495 1755 3555 SPW2\001 4 0 1 50 -1 0 12 0.0000 4 135 495 1755 2205 SPW3\001 4 0 1 50 -1 0 12 0.0000 4 135 495 1710 4950 SPW1\001 4 0 1 50 -1 0 12 1.5708 4 180 2070 495 4500 Cap shroud height = CSH\001 4 0 1 50 -1 0 12 1.5708 4 180 1650 1440 7380 Spreader 1 h = SPH1\001 4 0 1 50 -1 0 12 1.5708 4 180 2070 1125 6615 Spreader 2 height = SPH2\001 4 0 1 50 -1 0 12 0.0000 4 135 315 8640 8055 MR\001 4 0 18 50 -1 0 12 0.0000 4 180 1635 9090 4455 Head height = HAD \001 4 0 18 50 -1 0 14 0.0000 4 165 810 9450 3285 Mainsail\001 4 0 18 50 -1 0 12 0.0000 4 180 1575 9630 7065 Tack height = BAD\001 sailcut-1.3.5/doc/es/coordinates_system.fig0000644000175000007640000000304410510643102020656 0ustar sharkyjerryweb#FIG 3.2 Produced by xfig version 3.2.5-alpha5 Landscape Center Metric A4 100.00 Single -2 1200 2 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 1 3 0 0 1.00 60.00 120.00 0 0 1.00 60.00 120.00 630 9000 1755 8055 8235 8055 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 1755 8055 1755 1080 2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 6 2250 7560 4095 1845 5355 1350 6660 7200 2205 7560 2250 7560 2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 6390 4275 5805 5040 2070 5040 2925 4275 6390 4275 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 3330 4275 2880 4815 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 6390 4275 6660 4275 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 4284 4282 3956 4676 3 2 0 1 4 7 50 -1 -1 0.000 0 0 0 3 3330 4275 4005 4680 6030 4275 0.000 -1.000 0.000 3 2 0 1 0 7 50 -1 -1 0.000 0 0 0 3 3915 2520 4635 2700 5580 2475 0.000 -1.000 0.000 3 2 0 1 0 7 50 -1 -1 0.000 0 0 0 3 2745 6030 3510 6345 6390 5940 0.000 -1.000 0.000 4 0 0 50 -1 0 12 0.0000 4 150 510 1035 1035 Y axis\001 4 0 0 50 -1 0 12 0.0000 4 150 495 900 9135 Z axis\001 4 0 0 50 -1 0 12 0.0000 4 150 510 7875 8370 X axis\001 4 0 0 50 -1 0 12 0.0000 4 90 105 6570 4185 x\001 4 0 0 50 -1 0 12 0.0000 4 150 330 4095 7590 foot\001 4 0 0 50 -1 0 12 0.0000 4 150 285 3195 3465 luff\001 4 0 0 50 -1 0 12 0.0000 4 150 435 5985 3510 leech\001 4 0 0 50 -1 0 12 0.0000 4 195 1050 3780 4860 profile depth\001 4 0 0 50 -1 0 12 0.0000 4 195 1395 4005 4185 profile local cord\001 4 0 0 50 -1 0 12 0.0000 4 90 90 2745 4860 z\001 sailcut-1.3.5/doc/es/sail_seams.fig0000644000175000007640000001205411112611300017053 0ustar sharkyjerryweb#FIG 3.2 Produced by xfig version 3.2.5-alpha5 Landscape Center Metric A4 100.00 Single -2 1200 2 5 1 0 1 0 7 50 -1 -1 0.000 0 1 1 0 5120.579 -4210.354 2655 3015 5985 3375 8460 2655 0 0 2.00 60.00 120.00 5 1 0 1 0 7 50 -1 -1 0.000 0 0 1 0 3867.387 6515.855 1755 2700 3645 2160 5715 2565 0 0 2.00 60.00 120.00 5 1 0 1 0 7 50 -1 -1 0.000 0 1 1 0 4720.387 5318.285 1260 5490 1755 7110 2655 8100 0 0 2.00 60.00 120.00 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 5 485 5869 1101 1770 2112 530 3880 5869 464 5871 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1016 5869 3597 4985 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1051 2086 2289 5869 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1581 1202 3077 5866 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 591 5197 3348 4239 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 6 5752 1148 5292 1700 5246 2068 6488 5886 7270 5886 5752 1148 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 6 5715 1035 5175 1665 5130 2025 6435 5985 7290 5985 5715 1035 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 5 8370 315 7650 1215 9180 5940 10215 5940 8370 315 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 5 8300 534 7760 1209 9245 5844 10055 5844 8300 534 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 6 4770 7110 1845 8100 1755 8820 2205 8820 5040 7875 4770 7110 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 6 4635 7200 1890 8145 1800 8775 2340 8775 4905 7920 4635 7200 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 9495 3690 9720 3600 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 9138 3833 9363 3743 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 8547 3637 8772 3547 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 8232 3772 8457 3682 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 5898 4058 6123 3968 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 5583 4193 5808 4103 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 4542 7642 4767 7552 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 4893 7484 5118 7394 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 1.00 60.00 120.00 2070 8775 2070 8550 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 2070 9045 2070 8820 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 6840 5895 6840 5670 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 9675 5850 9675 5625 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 8055 855 8235 1035 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 7785 585 7965 765 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 5310 1125 5490 1305 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 5580 1395 5760 1575 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 5266 1883 5536 1928 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 4906 1838 5176 1883 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 3150 7335 3240 7605 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 3285 7695 3375 7965 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 1887 8347 2247 8392 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 1438 8297 1798 8342 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 6840 6210 6840 5985 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 9675 6165 9675 5940 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 9675 2205 8955 2520 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 1.00 60.00 120.00 9627 1523 8907 1838 4 0 0 50 -1 0 14 0.0000 4 150 435 1800 6165 Foot\001 4 0 0 50 -1 0 14 0.0000 4 150 435 1170 1035 Gaff\001 4 0 0 50 -1 0 14 0.0000 4 150 585 2745 2070 Leech\001 4 0 0 50 -1 0 14 0.0000 4 165 975 5220 7380 leech hem\001 4 0 0 50 -1 0 14 0.0000 4 150 960 4545 1035 other hem\001 4 0 0 50 -1 0 14 0.0000 4 150 855 2205 9135 foot hem\001 4 0 0 50 -1 0 14 0.0000 4 150 960 720 8145 other hem\001 4 0 0 50 -1 0 17 0.0000 4 195 150 2745 8235 1\001 4 0 0 50 -1 0 16 0.0000 4 195 135 1665 2970 2\001 4 0 0 50 -1 0 16 0.0000 4 195 135 2430 2925 3\001 4 0 0 50 -1 0 17 0.0000 4 195 150 8505 2565 3\001 4 0 0 50 -1 0 14 0.0000 4 165 975 9765 3510 leech hem\001 4 0 1 50 -1 0 14 0.0000 4 210 1500 9765 2205 draw line (blue)\001 4 0 4 50 -1 0 14 0.0000 4 210 1200 9720 1485 cut line (red)\001 4 0 0 50 -1 0 16 0.0000 4 195 1950 8415 8595 Draw line in blue \001 4 0 0 50 -1 0 16 0.0000 4 195 1590 8415 8910 Cut line in red\001 4 0 0 69 -1 0 16 0.0000 4 195 135 1305 5355 1\001 4 0 0 50 -1 0 17 0.0000 4 195 150 5805 2700 2\001 4 0 0 50 -1 0 17 0.0000 4 270 1860 3825 8685 Cross cut layout\001 4 0 0 50 -1 0 14 0.0000 4 150 420 405 3240 Luff\001 4 0 0 50 -1 0 14 0.0000 4 150 1095 4590 4050 seam width\001 4 0 0 50 -1 0 14 0.0000 4 150 1095 7245 3645 seam width\001 4 0 0 50 -1 0 14 0.0000 4 150 855 6930 6300 foot hem\001 4 0 0 50 -1 0 14 0.0000 4 150 855 9765 6255 foot hem\001 4 0 0 50 -1 0 14 0.0000 4 150 960 4095 1755 other hem\001 4 0 0 50 -1 0 14 0.0000 4 150 960 6750 585 other hem\001 4 0 0 50 -1 0 17 0.0000 4 270 2100 7695 6840 Vertical cut layout\001 4 0 0 50 -1 0 14 0.0000 4 150 1095 2565 7290 seam width\001 sailcut-1.3.5/doc/es/sail_edges.fig0000644000175000007640000001163110510643102017040 0ustar sharkyjerryweb#FIG 3.2 Produced by xfig version 3.2.5-alpha5 Landscape Center Metric A4 100.00 Single -2 1200 2 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 3 1 1.00 60.00 120.00 4815 1935 4185 1710 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 3 1 1.00 60.00 120.00 7020 405 7965 630 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 3 1 1.00 60.00 120.00 8730 7155 9225 7695 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 3 1 1.00 60.00 120.00 4005 8100 4140 7290 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 3 1 1.00 60.00 120.00 3060 7290 3015 8460 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 3 1 1.00 60.00 120.00 450 8460 270 7335 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 3 1 1.00 60.00 120.00 2835 1890 2160 1665 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 270 7245 2970 1935 3060 7155 270 7245 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 945 4455 1530 4725 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 1755 4860 1980 4950 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 1620 6705 1620 7200 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 1620 7380 1620 7785 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 3960 3960 4410 4050 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 4590 4095 5355 4230 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 6300 6750 6300 7155 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 6300 7425 6300 7830 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 5445 630 5760 990 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 5895 1170 6165 1485 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 4950 4185 4484 7243 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 8685 7065 9315 6885 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 8015 3301 8600 3121 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 7251 3531 7701 3396 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 8271 3242 9216 6887 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 2520 4590 2835 4590 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 4905 2025 5130 2295 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 0 0 2.00 60.00 120.00 5106 2230 6096 1375 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 4135 7199 4912 1989 6874 366 8674 7071 4135 7199 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 3015 4590 3735 4590 3 2 0 2 1 7 50 -1 -1 0.000 0 0 0 3 4909 1981 4365 4050 4140 7200 0.000 -1.000 0.000 3 2 0 2 1 7 50 -1 -1 0.000 0 0 0 3 4905 1980 5760 990 6885 360 0.000 -1.000 0.000 3 2 0 2 1 7 50 -1 -1 0.000 0 0 0 3 4140 7200 6300 7425 8685 7065 0.000 -1.000 0.000 3 2 0 2 4 7 50 -1 -1 0.000 0 0 0 3 270 7245 1665 7380 3060 7155 0.000 -1.000 0.000 3 2 0 2 4 7 50 -1 -1 0.000 0 0 0 3 2970 1935 2835 4590 3060 7155 0.000 -1.000 0.000 3 2 0 2 1 7 50 -1 -1 0.000 0 0 0 3 6885 360 8010 3285 8685 7065 0.000 -1.000 0.000 3 2 0 2 4 7 50 -1 -1 0.000 0 0 0 3 2970 1935 1800 4725 270 7245 0.000 -1.000 0.000 4 0 0 50 -1 0 14 0.0000 4 150 1305 765 1620 Pu\361o de driza\001 4 0 4 50 -1 0 12 0.0000 4 180 1305 270 4365 (valor negativo)\001 4 0 4 50 -1 0 14 0.0000 4 210 1785 90 4095 Alunamiento gr\341til\001 4 0 0 50 -1 0 14 0.0000 4 150 1305 3465 1575 Pu\361o de driza\001 4 0 0 50 -1 0 14 0.0000 4 150 1155 405 8685 Pu\361o amura\001 4 0 0 50 -1 0 14 0.0000 4 150 1140 2385 8685 Pu\361o escota\001 4 0 0 50 -1 0 14 0.0000 4 150 1140 8955 8010 Pu\361o escota\001 4 0 4 50 -1 0 14 0.0000 4 225 2130 630 7965 Alunamiento pujamen\001 4 0 4 50 -1 0 12 0.0000 4 180 1260 1035 8190 (valor positivo)\001 4 0 0 50 -1 0 14 0.0000 4 150 1155 4050 8280 Pu\361o amura\001 4 0 4 50 -1 0 12 0.0000 4 180 1305 270 4365 (valor negativo)\001 4 0 1 50 -1 0 12 0.0000 4 180 1260 4095 810 (valor positivo)\001 4 0 4 50 -1 0 14 0.0000 4 165 1245 2970 4230 Alunamiento\001 4 0 4 50 -1 0 14 0.0000 4 165 705 2970 4455 baluma\001 4 0 4 50 -1 0 12 0.0000 4 180 1305 2925 4815 (valor negativo)\001 4 0 1 50 -1 0 12 0.0000 4 180 1260 8640 3330 (valor positivo)\001 4 0 1 50 -1 0 14 0.0000 4 165 2010 8280 2970 Alunamiento baluma\001 4 0 0 50 -1 0 14 0.0000 4 210 1290 8055 720 Pu\361o de pena\001 4 0 1 50 -1 0 18 0.0000 4 195 1080 5625 3195 MAYOR\001 4 0 1 50 -1 0 12 0.0000 4 180 1260 5445 4500 (valor positivo)\001 4 0 1 50 -1 0 14 0.0000 4 210 1785 5445 4230 Alunamiento gr\341til\001 4 0 1 50 -1 0 14 0.0000 4 225 2130 5850 8010 Alunamiento pujamen\001 4 0 1 50 -1 0 12 0.0000 4 180 1260 6120 8235 (valor positivo)\001 4 0 0 50 -1 0 14 0.0000 4 150 810 8730 4770 Posici\363n\001 4 0 0 50 -1 0 14 0.0000 4 165 1170 8910 5040 alunamiento\001 4 0 0 50 -1 0 14 0.0000 4 150 810 5805 1890 Posici\363n\001 4 0 0 50 -1 0 14 0.0000 4 165 1170 5670 2115 alunamiento\001 4 0 0 50 -1 0 14 0.0000 4 150 810 4905 5355 Posici\363n\001 4 0 0 50 -1 0 14 0.0000 4 165 1170 4860 5625 alunamiento\001 4 0 1 50 -1 0 14 0.0000 4 225 1935 3870 540 Alunamiento percha\001 4 0 4 50 -1 0 18 0.0000 4 255 975 1575 5985 FOQUE\001 sailcut-1.3.5/doc/es/head_gores_definition.fig0000644000175000007640000000344110510643102021251 0ustar sharkyjerryweb#FIG 3.2 Produced by xfig version 3.2.5-alpha5 Landscape Center Metric A4 100.00 Single -2 1200 2 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 1350 8685 3555 7245 6075 8595 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 3690 3735 4230 5985 6075 8595 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 4 3510 675 3105 3735 2430 6030 1350 8685 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 3690 675 4230 3735 4905 5985 6075 8595 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 2610 3735 4905 3735 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 4 3600 675 3566 3738 2981 6033 1350 8685 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 2025 6005 5535 5985 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 3602 5985 3510 8730 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 1350 8685 3600 5985 6075 8595 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 3420 675 3825 675 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 3420 675 1350 8685 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 2 1 1.00 60.00 120.00 5175 2700 4590 2700 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 2 1 1.00 60.00 120.00 2295 2700 2880 2700 3 0 0 1 0 7 50 -1 -1 0.000 0 0 0 3 1350 8685 3510 8820 6075 8595 0.000 1.000 0.000 3 0 0 1 0 7 50 -1 -1 0.000 0 0 0 4 3825 675 4950 3735 5535 5940 6075 8595 0.000 1.000 1.000 0.000 4 0 0 50 -1 0 16 0.0000 4 195 570 2700 810 Head\001 4 0 0 50 -1 0 14 0.0000 4 210 2070 4860 2520 4 Radial gores in total\001 4 0 1 50 -1 0 14 0.0000 4 165 1815 855 2925 from Head to Tack\001 4 0 1 50 -1 0 14 0.0000 4 195 1470 990 2610 2 Luff gores go\001 4 0 0 50 -1 0 16 0.0000 4 195 555 810 8955 Tack\001 4 0 0 50 -1 0 16 0.0000 4 195 555 6165 8820 Clew\001 4 0 0 50 -1 0 14 0.0000 4 150 435 3330 9045 Foot\001 4 0 0 50 -1 0 14 0.0000 4 150 585 5760 6435 Leech\001 4 0 1 50 -1 0 14 0.0000 4 150 480 1440 6300 Luff \001 4 0 0 50 -1 0 14 0.0000 4 165 2160 5400 4590 This sail has 3 sections\001 sailcut-1.3.5/doc/es/index.docbook0000644000175000007640000005231511112612647016740 0ustar sharkyjerryweb
Manual de Usuario del Sailcut CAD RobertLainУЉ JeremyLainУЉ JoanGelpiTranslation Sailcut CAD 1.3.3 - 24 November 2008 IntroducciУГn Sobre el Sailcut CAD Sailcut es un software para el diseУБo de velas desarrollado para paУБos planos. El Sailcut se puede usar tanto para velas de cuatro lados tipo cangreja como para mayores y foques Marconi de tres lados. La primera versiУГn del Sailcut fue desarrollada en 1978 y usada por Robert LainУЉ para fabricar las velas de su barco "Flying Sheep III", un ТМ Ton IOR. Sailcut ha estado disponible en la web desde 1994 y es utilizado por muchos fabricantes de velas, tanto amateurs como profesionales, para cruceros, regatas y recientemente para barcos de radiocontrol. Sailcut se basa en una УКnica definiciУГn matemУЁtica para la superfУ­cie vУЉlica que asegura un perfil aerodinУЁmico y uniforme. ТПCУГmo obtener el Sailcut CAD? Se puede descargar la УКltima versiУГn del Sailcut CAD desde la pУЁgina principal en . TambiУЉn estУЁ disponible en binario (compilado) y en cУГdigo fuente. InformaciУГn tУЉcnica sobre el programa Sailcut CAD se ha escrito con la intenciУГn que sea transportable. El programa fuente es el C++ utilizando la librerУ­a Qt de Trolltech para los grУЁficos y el OpenGL para la visualizaciУГn en 3D de las velas. Sailcut CAD se puede compilar y funcionar bajo GNU/Linux, Microsoft Windows y MacOSX. Usando el Sailcut CAD Уšltimas notas Al igual que la versiУГn 0.6.5, el Sailcut CAD usa diferentes extensiones para cada tipo de archivo instalado en lugar de los finales con extensiУГn ".xml". Si deseamos abrir nuestras velas creadas con la versiУГn anterior del Sailcut CAD debemos renombrar el archivo de definiciУГn de vela asУ­ como las extensiones con ".saildef". Al abrir el archivo resultante, todos los archivos se conservarУЁn excepto los datos para el molde. Preferencias de usuario Preferencias de archivo Las preferencias se almacenan en un archivo llamado .sailcutrc. Bajo UNIX este archivo se localiza en el directorio raУ­z y en Windows estУЁ en Documents and Settings\USUARIO. InternacionalizaciУГn Como en la versiУГn 0.5.5, el Sailcut CAD tiene soporte para la internacionalizaciУГn. Al arrancar el programa, podemos seleccionar el idioma que nos interese en el menu Ver->Idioma. Crear una vela Cuando iniciamos Sailcut CAD, se presenta una vela por defecto y en la parte superior de la ventana encontraremos menУКs desplegables. El menУК ARCHIVO se usa para cargar una vela existente, GUARDAR los parУЁmetros de la vela y EXPORTAR los paneles desarrollados. Se puede modificar las dimensiones de la vela utilizando el menУК Ver->Dimensiones. Con el menУК Ver->Molde podremos modificar el perfil de la vela. Y en el menУК Ver->Aparejo visualizaremos varias velas con diferentes aparejos. Pantalla Dimensiones (menУК Ver->Dimensiones) El programa permite diseУБar tanto una vela triangular como cuadrangular. La clУЁsica vela Marconi se diseУБa esencialmente igual que una Cangreja pero con un pequeУБo puУБo de driza. La superficie de la vela se genera desde unas sencillas ecuaciones que definen el perfil en todas las alturas. Dichos perfiles se basan en los extremos de las velas que han sido definidos por la longitud y alunamiento en cada lado y por el twist de la vela. En la ventana "DimensiУГn" hallaremos los parУЁmetros que definen la vela. Al pulsar el botУГn "Calcular" el programa evalУКa y visualiza los datos auxiliares. Estos datos aparecen en pestaУБas de color y que pueden modificarse. Si el color es rojo, significa que el valor excede del lУ­mite superior; si es amarillo indica que estУЁ por debajo del lУ­mite aceptable y debe cambiarse. Una vez finalizada la entrada de datos de dimensiones, pulsamos OK para visualizar la vela en formato 3D. PestaУБa "GeometrУ­a del Aparejo" El primer paso es seleccionar el tipo de vela con la que vamos a trabajar y entrar los datos que definen la geometrУ­a del aparejo y el plano vУЉlico (ver la Figura 1.) Seleccionar el tipo de vela marcando bulУГn deseado: FOQUE para cualquier vela de proa, MAYOR para cualquier vela envergada en el mУЁstil, ALA para cualquier tipo de cometa simУЉtrica. The rig data are used for displaying the sails in their proper relative position with the "rig viewer".
Sailcut plan definition
PestaУБa "Dimensiones de la vela" AquУ­ es donde se introducen las dimensiones de la vela. En una vela mayor, el valor mУ­nimo para la longitud de la percha (galleta del puУБo de driza) es de 5mm. Cualquier valor inferior darУЁ siempre por defecto 5mm. El УЁngulo de percha viene definido como el УЁngulo entre el mУЁstil y la baluma que puede ser hasta 90 grados. El alunamiento del pujamen, la baluma y la percha extiende la vela mУЁs allУЁ de su lУ­nea recta. El alunamiento negativo equivaldrУЁ a un hueco en la parte exterior de la vela. La posiciУГn del alunamiento se expresa en porcentaje en el correspondiente lado de la vela calculado desde la parte mУЁs baja o mУЁs externa del lado.
Sailcut edges definition
Dimensions and angles defining the sail plan are expressed in millimetre and degrees. Length of the sail sides and diagonal are the 3D straight line distance between the corners of the sail. The actual length on the finished sail lais on the floor can be slightly longer depending on the shape of the sail. For example, the foot length entered in the screen below is 3600 mm. If the foot camber is null then that will be the actual distance between clew and tack (straight foot) of the finished sail. If a 10% camber is entered for the foot depth, then the actual foot will be the length of the arc which has 10% camber, that is 2.7% longer than the straight line foot length. Having entered the sail main dimensions you can press on the "Compute" button to obtain additional informations on the sail, like the X-Y coordinates of the corners of the sail, the perpendicular length LP measured from the clew to the luff as well as IRC racing rules width. The X-Y coordinates of the sail corners are usefull to quickly adjust the data entered. For example if you find that the clew height (Y) is way below or above the height of the tack when you would like it to be leveled, then you can substract or add the difference to the leech length.
"Layout" box Click on the radio button corresponding to the desired layout of the sail. The layout of the panels does not affect the shape of the sail which is defined by its dimensions and its mould. Except for the Radial cut layout, the number of panels is determined by the cloth width and seam width entered in the "Cloth" box. The most commonly used layout is the "Crosscut". The panels are laid perpendicular to the straight line joining the peak to the clew of the sail. The "Twist foot" layout is similar to the cross cut except that the lower panels are rotated such that they do not intersect the foot of the sail. The "Horizontal cut" layout lay the seams in the horizontal plane. This option can be used to visualise the profile of the sail at various levels and to output files with the 3D coordinates of the sails for use by CFD tools. The "Vertical cut" layout places the panels parrallel to the straight line joining the peak to the clew of the sail. This is the favorite layout for the old timer's main sail. The "Mitre cut" layout is the favorite for the old timer's genoa. The sail is divided in two parts by a line joining the clew to the mid point on the luff and the panels organised to be perpendicular to the foot in the lower part of the sail and perpendicular to the leech in its upper part. The "Radial cut" is used mostly for competition as the cloth is mostly aligned with the directions of maximum strain. When using the Radial cut option it is important to understand the definition of the number of sections, number of radial gores and number of luff gores (see figure below).
Radial cut gores definition
"Sail shape" box You enter there the depth of the sail at 3 levels, near the foot, in the middle of the sail(the exact position being defined in the mould screen) and near the top of the sail. The twist angle is the angle expressed in degrees by which the top of the sail is rotated with respect to the foot. The twist is globally determined by the amount by which the apparent wind at the top of the mast is rotated with respect to the apparent wind at deck level. For a jib the twist is sometime driven by the need to have the upper part of the leech sufficiently open to clear the spreaders. For a mainsail the twist is also driven by the ability of the rig to carry the tension in the leech, in particular a gaff rig will have more twist in its main sail than a Bermuda rig. It is important that the twist angle entered in Sailcut reflects the reality of the shape of the leech when sailing in an average wind. The sheeting angle value is the actual sheeting angle measured from the boat centerline when the sail is set on the boat. For a jib the minimum value is 5 degrees. The value is of importance to ensure that the sail is properly positioned when displayed in the "rig viewer". You can then visualise for example the slot between a jib and the main sail as set when sailing. "Cloth" box Enter there the width of cloth used, the width of the seams between adjacent panels, the width of material to be added to the leech to make the leech hem and the width of material for the foot hem and the other edges hems. The figure below describes de location of the various hems and seam width. Sailcut will compute the panels such that they fit within the declared cloth width including the seam and hems width as appropriate. Note that when using the radial layout, the seam width between horizontal sections will be twice the width of the seams between adjacent panels of the same section.
Sailcut seams and hems definition
Mould dialog screen (View->Mould menu) The depth of the sail can be entered at three levels located at the bottom (foot) the middle (maximum depth level) and near the top. The vertical position of the maximum depth profile is controlled by the vertical slide bar to the right of the left vertical frame. The luff shape and the leech shape can be adjusted for the Top profile and Middle profile only. The foot profile is always an arc of circle. In order to avoid that the leech makes a hook in the upper part of the sail when the wind increases it is recommended that the Top profile luff shape value be higher than that of the middle profile and that the leech shape value at the top be lower than the middle value. Rig viewer (View->Rig menu) This viewer is used to display several sails on the same rig. The File->Add sail menu entry is used to purge the viewer. The File->Add sail menu entry is used to add sails already created and saved with Sailcut. Once a sail is added to the rig viewer the sail information frame appears below and it is possible to translate the sail in the 3 directions by adding X-Y-Z displacement values. If you have misplaced a sail use the Reload button to recover the initial sail. You can also use the Remove button to eliminate a sail. 2 slides allows you to ratate the rig in azimuth and elevation and view the ig from any vantage point. The File->Save menu entry is used to save a rig with a combination of sails. Rigs which have been saved can be later opened as an entity with File->Open menu entry. Note that the rig viewer window must be closed to allow you to return to the main screen of Sailcut. View controls It is possible to zoom, pan and rotate the sail in the view window: rotation : you can control the rotation that is applied to the sail by using the elevation and azimuth sliders. pan : click on a point with the left mouse to center the view on that point. zoom : to zoom in press CTRL and + and to zoom out press CTRL and -. You can also use the zoom buttons in the view controls or your mouse wheel to zoom in and out. Sail panels development The developed sail is display by clicking on the "Development" tab from Sailcut CAD's main window. This presents you with a view of the developed (flat) panels of the sail. The view controls are the same as those of the main window. The blue line represents the edge of the finished panel (draw line) and the red line represents the outer edge taking into account the seam and hems width allowance (cut line). You can export the points which define the edges of the developed panels with the draw and cut lines to the following file formats: Carlson Design plotter (.sp4) using File->Export development->to Carlson plotter AutoCAD DXF using File->Export development->to DXF XML dump of the points using File->Export development->to XML sail (see for file format details) plain text dump of the points using File->Export development->to TXT sail (see for file format details) Loading / saving sails Once you have customised you sail, you can save it to a file (File->Save or File->Save As) and load it (File->Open) next time you want to work on it. Both the sail's dimensions and the parameters of the mould are saved. Sailcut CAD uses XML files to store the sail data. These files are plain text so they can easily be viewed using your favourite text editor. Exporting 3D sails In addition to Sailcut CAD's native file format, it is possible to export all the 3D points located on the edges and seams of the panels that make up a sail. You can export the three dimensional sail to the following file formats from the Export 3D sail submenu of the File menu: AutoCAD DXF file using the to DXF menu entry. XML dump of the points using the to XML sail menu entry (see for file format details). Plain ASCII text dump of the points using the to TXT sail menu entry (see for file format details). SVG (Scalable Vector Graphics) file using the to SVG menu entry. Printing data and drawings The File menu offers various printout possibilities: File->Print->data, will print the data of the sail, File->Print->drawing, will print a drawing of the complete sail, File->Print->develop, will print all the developed panels with key points coordinates (1 panel per page). The definition of the developed panel key points coordinates is given in the figure below. The X,Y coordinates are absolute coordinates referenced to the lower left corner of the box enveloping the contour of the CUT line of the panel (edge of cloth). The dX,dY coordinates are relative to the straight line joining the end of the corresponding edge and it should be remembered that the origin of dX is at the left end of the edge and positive value of dY indicate that the point is left of the straight line joining the origin to the end points of the edge. The printout scaling is such that the sail drawing and the largest developed panel automatically fit in one page. For printing panels to a precise scale it is preferable to export the developed sail in a DXF file and use a CAD package to print the panels.
Developed panels drawing
Sails surface formulation in Sailcut TODO Where can I find more information about Sailcut CAD? TODO File formats used by Sailcut CAD Text representation of developed sail TODO Text representation of 3D sail TODO XML representation of a sail TODO Copyright Copyright (C) 1993-2006 Robert & Jeremy LainУЉ. Sailcut is a Registered Trademark of Robert LainУЉ. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See for the licence terms and details. 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., 675 Mass Ave, Cambridge, MA 02139, USA. The authors would appreciate that publications on sails designed with Sailcut include some acknowledgement of their work.
sailcut-1.3.5/doc/es/develop_panel_drawing.fig0000644000175000007640000000716310510643102021276 0ustar sharkyjerryweb#FIG 3.2 Produced by xfig version 3.2.5-alpha5 Landscape Center Metric A4 100.00 Single -2 1200 2 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 3 6705 3510 7155 5040 7245 6615 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 3 1215 6750 1620 5085 2565 3375 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 3 900 6930 1350 5085 2430 3105 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 3 6885 3285 7425 5040 7515 6975 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 1 3 0 0 1.00 120.00 240.00 0 0 1.00 120.00 240.00 900 1350 900 7290 9900 7290 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1710 2385 2565 3375 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 4230 2655 3960 3285 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 6390 2745 6120 3600 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 7965 2385 6705 3510 2 1 0 1 9 7 50 -1 -1 0.000 0 0 -1 1 1 3 0 0 1.00 90.00 180.00 0 0 1.00 90.00 180.00 1170 4500 1215 6750 8595 6570 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 2880 7785 3240 7020 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 900 8100 1215 6750 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 6525 6525 6165 7875 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 7245 6615 7605 8055 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1575 6345 1215 6750 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 1 1 3 0 0 1.00 90.00 180.00 0 0 1.00 90.00 180.00 2610 1530 2565 3375 8955 3600 2 2 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 5 900 7290 7515 7290 7515 2970 900 2970 900 7290 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 2790 2745 2565 3375 2610 3375 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 900 7290 810 7380 3 2 0 2 1 7 50 -1 -1 0.000 0 0 0 4 1215 6750 3735 7020 6075 6570 7245 6615 0.000 -1.000 -1.000 0.000 3 2 0 2 1 7 50 -1 -1 0.000 0 0 0 4 2565 3375 4185 3285 6030 3555 6705 3510 0.000 -1.000 -1.000 0.000 3 2 0 2 4 7 50 -1 -1 0.000 0 0 0 4 900 6930 3690 7290 6030 6840 7515 6975 0.000 -1.000 -1.000 0.000 3 2 0 2 4 7 50 -1 -1 0.000 0 0 0 4 2430 3105 4185 3015 6030 3285 6885 3285 0.000 -1.000 -1.000 0.000 4 0 0 50 -1 0 12 0.0000 4 135 705 2115 8055 dY = -10\001 4 0 0 50 -1 0 12 0.0000 4 135 750 2115 7830 dX = 321\001 4 0 1 50 -1 0 12 0.0000 4 135 540 1665 6210 dX = 0\001 4 0 1 50 -1 0 12 0.0000 4 135 540 1665 6435 dY = 0\001 4 0 0 50 -1 0 12 0.0000 4 135 750 7785 2025 X = 1789\001 4 0 0 50 -1 0 12 0.0000 4 135 645 7785 2295 Y = 678\001 4 0 0 50 -1 0 12 0.0000 4 135 645 1395 2070 X = 234 \001 4 0 0 50 -1 0 12 0.0000 4 135 645 1395 2340 Y = 789\001 4 0 0 50 -1 0 12 0.0000 4 135 540 5265 8145 dY = 2\001 4 0 0 50 -1 0 12 0.0000 4 135 855 5265 7875 dX = 1345\001 4 0 9 50 -1 0 12 0.0000 4 135 240 1215 4500 dY\001 4 0 0 50 -1 0 12 0.0000 4 135 750 7740 7965 X = 1890\001 4 0 0 50 -1 0 12 0.0000 4 135 540 7740 8235 Y = 35\001 4 0 0 50 -1 0 18 0.0000 4 195 645 3600 5040 Panel\001 4 0 0 50 -1 0 12 0.0000 4 135 750 4050 2340 dX = 345\001 4 0 0 50 -1 0 12 0.0000 4 135 540 4050 2565 dY = 5\001 4 0 0 50 -1 0 12 0.0000 4 135 600 6075 2700 dY = -2\001 4 0 0 50 -1 0 12 0.0000 4 135 855 6075 2475 dX = 1234\001 4 0 1 50 -1 0 12 0.0000 4 135 540 2835 2520 dX = 0\001 4 0 1 50 -1 0 12 0.0000 4 135 540 2835 2700 dY = 0\001 4 0 1 50 -1 0 12 0.0000 4 180 1185 8145 3420 dX upper edge\001 4 0 9 50 -1 0 12 0.0000 4 180 1170 8145 6435 dX lower edge\001 4 0 1 90 -1 0 12 0.0000 4 135 1740 5130 5040 DRAW line is in blue\001 4 0 1 50 -1 0 12 0.0000 4 180 1185 2745 1710 dY upper edge\001 4 0 4 50 -1 0 12 0.0000 4 135 435 315 7335 X = 0\001 4 0 4 50 -1 0 12 0.0000 4 135 435 315 7560 Y = 0\001 4 0 4 50 -1 0 18 0.0000 4 195 210 9540 7155 Y\001 4 0 4 50 -1 0 18 0.0000 4 195 210 585 1845 X\001 4 0 0 50 -1 0 12 0.0000 4 135 540 270 8145 X = 15\001 4 0 0 50 -1 0 12 0.0000 4 135 540 270 8370 Y = 25\001 4 0 4 50 -1 0 12 0.0000 4 135 1440 5445 5445 CUT line is in red\001 sailcut-1.3.5/doc/es/sailplan.fig0000644000175000007640000000744711112616675016574 0ustar sharkyjerryweb#FIG 3.2 Produced by xfig version 3.2.5-alpha5 Landscape Center Metric A4 100.00 Single -2 1200 2 5 1 0 2 1 7 50 -1 -1 0.000 0 0 1 1 4980.000 1860.000 5175 720 5625 900 5940 1215 0 0 2.00 60.00 120.00 0 0 2.00 60.00 120.00 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 1350 7920 9000 7920 8910 8280 1575 8280 1350 7920 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 1350 7920 4590 3150 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 4140 7290 4140 8955 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 1350 7920 315 7920 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 1530 7695 675 7695 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 4140 7245 3285 7245 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 5 4140 7245 4923 2028 6840 630 8685 7110 4113 7248 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 3 1 1.00 60.00 120.00 3150 4005 4275 3555 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 3960 7920 4905 1575 4815 1575 3870 7920 3960 7920 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 3 1 1.00 60.00 120.00 5265 5985 4230 7155 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 3 1 1.00 60.00 120.00 4995 2070 5486 2479 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 3 1 1.00 60.00 120.00 8550 7020 7335 6300 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 4590 3195 360 3195 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 1530 7695 4185 3780 3645 7605 1530 7695 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 3420 7245 3420 6705 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 1 2 0 0 2.00 60.00 120.00 3420 7920 3420 8190 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 3 1 1.00 60.00 120.00 4230 1710 4669 2140 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 3 1 2.00 60.00 120.00 3 1 2.00 60.00 120.00 1350 8775 4140 8775 2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 1 1 2 3 1 2.00 60.00 120.00 3 1 2.00 60.00 120.00 4140 8775 4950 8775 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 1 2 3 1 2.00 60.00 120.00 3 1 2.00 60.00 120.00 1350 9135 4545 9135 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 4545 3195 4545 9135 2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 1350 7740 1350 9135 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 4905 2070 5130 720 5130 675 2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 4950 2025 4950 8910 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 1 2 3 1 1.00 60.00 120.00 3 1 1.00 60.00 120.00 405 7920 405 3195 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 3 1 1.00 60.00 120.00 6975 720 7560 1125 3 2 0 2 4 7 50 -1 -1 0.000 0 0 1 2 3 1 2.00 60.00 120.00 720 7695 720 6840 0.000 0.000 3 2 0 2 4 7 50 -1 -1 0.000 0 0 1 2 3 1 2.00 60.00 120.00 720 7920 720 8280 0.000 0.000 4 0 1 50 -1 0 16 0.0000 4 255 975 6390 7110 Pujamen\001 4 0 1 50 -1 0 16 0.0000 4 195 855 7785 3375 Baluma\001 4 0 4 50 -1 0 14 0.0000 4 150 1230 1935 9045 Distancia = J\001 4 0 1 50 -1 0 14 0.0000 4 210 1770 1935 8685 Pu\361o amura - proa\001 4 0 4 50 -1 0 14 0.0000 4 225 1140 720 6660 Altura pu\361o\001 4 0 4 50 -1 0 14 0.0000 4 210 1200 810 6930 amura foque\001 4 0 4 50 -1 0 14 0.0000 4 210 1365 540 5535 Altura stay = I\001 4 0 0 50 -1 0 16 0.0000 4 195 1695 6705 6210 Pu\361o\240 de escota\001 4 0 0 50 -1 0 16 0.0000 4 195 1710 5040 5850 Pu\361o\240 de amura\001 4 0 1 50 -1 0 14 0.0000 4 150 1275 2340 7425 amura mayor\001 4 0 1 50 -1 0 14 0.0000 4 225 1140 2205 7200 Altura pu\361o\001 4 0 4 50 -1 0 18 0.0000 4 255 705 2970 6030 Foque\001 4 0 0 50 -1 0 16 0.0000 4 255 480 2160 4005 Stay\001 4 0 1 50 -1 0 16 0.0000 4 195 690 4680 4365 Gr\341til\001 4 0 1 50 -1 0 18 0.0000 4 255 765 6120 4095 Mayor\001 4 0 0 50 -1 0 18 0.0000 4 195 1080 3600 1665 MASTIL\001 4 0 0 50 -1 0 16 0.0000 4 195 1485 7740 1215 Pu\361o de Pena\001 4 0 1 50 -1 0 16 0.0000 4 195 765 5805 810 Percha\001 4 0 0 50 -1 0 16 0.0000 4 195 1560 5445 2790 Pu\361o de Driza\001 4 0 1 50 -1 0 14 0.0000 4 210 1095 4995 8730 Ca\355da gr\341til\001 4 0 0 50 -1 0 14 0.0000 4 165 2265 6030 7830 Eslora de cubierta LOA\001 4 0 1 50 -1 0 14 0.0000 4 255 1965 3015 720 \301ngulo percha-gr\341til\001 sailcut-1.3.5/doc/sailcut-html.xsl0000644000175000007640000000065310512704353017013 0ustar sharkyjerryweb sailcut-1.3.5/doc/sailcut-handbook.css0000644000175000007640000000101510512667476017625 0ustar sharkyjerrywebbody { background: white none; color: black; font-family: sans-serif; } .guimenu, .guimenuitem, .guisubmenu { font-weight: bold; border: 1px rgb(96,152,255); border-style: none none dotted none; } .guilabel { font-weight: bold; } .guibutton { font-weight: bold; background-color: rgb(232,232,232); color: inherit; padding-left: 0.2em; padding-right: 0.2em; border: 1px solid; } .programlisting { border: 1px solid rgb(64,128,144); background-color: rgb(240,248,255); padding: 10px; } sailcut-1.3.5/COPYING0000644000175000007640000004313110511132630014131 0ustar sharkyjerryweb GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. sailcut-1.3.5/src/0000755000175000007640000000000011457411327013700 5ustar sharkyjerrywebsailcut-1.3.5/src/formhull.cpp0000644000175000007640000000457011177775326016255 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "formhull.h" #include "formhulldef.h" #include "sailcpp/hullworker.h" /** * Constructs a window to display a hull. * * @param myPrefs the user preferences * @param parent the parent widget */ CFormHull::CFormHull(CPrefs *myPrefs, QWidget *parent) : CFormDocumentTmpl (myPrefs, parent) { setMinimumSize( QSize( 300, 220 ) ); // create menu bar setupMenuBar(); // create main widget QGridLayout *layout = new QGridLayout(this); tabs = new CSailViewerTabs(this); layout->addWidget(tabs); // set language languageChange(); // set initial definition setDef(def); } /** * Sets the strings of the subwidgets using the current * language. */ void CFormHull::languageChange() { setWindowTitle( tr("hull") ); actionViewDef->setText( tr("&Dimensions") ); tabs->languageChange(); } /** * Replaces the current sail definition. * * @param newdef */ void CFormHull::setDef(const CHullDef& newdef) { def = newdef; tabs->setObject(CHullWorker(def).makeHull()); } /** * Creates the menu bar */ void CFormHull::setupMenuBar() { // view actions actionViewDef = new QAction(this); connect( actionViewDef, SIGNAL( triggered() ), this, SLOT( slotDef() ) ); extraViewActions.push_back(actionViewDef); } /** * Displays the sail CFormHullDef sail definition dialog. */ void CFormHull::slotDef() { CHullDef defcopy = def; if ( CFormHullDef(this, &defcopy).exec() ) { // we returned from the dialog with an 'OK', setDef(defcopy); } } sailcut-1.3.5/src/saildispgl.cpp0000644000175000007640000001212411251537451016536 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifdef HAVE_QTOPENGL #include #include #include "saildispgl.h" /** Construct an OpenGL view area. * * @param parent the parent widget */ CSailDispGL::CSailDispGL( QWidget * parent ) : QGLWidget( parent ), wasResized(true) { if ( !QGLFormat::hasOpenGL() ) throw runtime_error("This system has no OpenGL support."); } /** Clear the display. */ void CSailDispGL::clear() { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); } /** Draw a panel of a sail. * * @param panel */ void CSailDispGL::draw( const CPanel &panel ) { CPoint3d pt; unsigned int i; glBegin(GL_TRIANGLE_STRIP); for (i =0; i < panel.top.size(); i++) { pt = panel.top[i]; glVertex3d(pt.x(),pt.y(),pt.z()); pt = panel.bottom[i]; glVertex3d(pt.x(),pt.y(),pt.z()); } glEnd(); glBegin(GL_TRIANGLE_FAN); pt = (panel.left[0]+panel.left[panel.left.size()-1])*0.5; glVertex3d(pt.x(),pt.y(),pt.z()); for (i =0; i < panel.left.size(); i++) { pt = panel.left[i]; glVertex3d(pt.x(),pt.y(),pt.z()); } glEnd(); glBegin(GL_TRIANGLE_FAN); pt = (panel.right[0]+panel.right[panel.right.size()-1])*0.5; glVertex3d(pt.x(),pt.y(),pt.z()); for (i =0; i < panel.right.size(); i++) { pt = panel.right[i]; glVertex3d(pt.x(),pt.y(),pt.z()); } glEnd(); } /** Draw a complete sail. * * @param sail */ void CSailDispGL::draw( const CPanelGroup &sail ) { unsigned int i; for (i = 0; i < sail.size(); i++) { if ( sail.type == HULL ) { /** Hull GL color dark green (.1, .3, .2) color lighter green (.1, .5, .2) */ glColor3f(.1, .5, .2); } else if ( sail.type == RIG ) { /** Rig GL color dark red (.5, .1, .1) */ glColor3f(.5, .1, .1); } else { /** Sail GL color alternate dark yellow / yellow panels / white */ glColor3f( .8, .7 + 0.05*(i % 3), 0.4 + 0.2*(i % 3)); } draw( sail[i] ); } for (i = 0; i < sail.child.size(); i++) draw( sail.child[i] ); } /** Force a redraw of the view area. */ void CSailDispGL::redraw() { updateGL(); } /** Initialize the OpenGL subsystem. */ void CSailDispGL::initializeGL() { // Set up the rendering context, define display lists etc.: glClearColor( 0.0f, 0.0f, 0.0f, 0.5f ); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHTING); glClearDepth(1.0f); // lighting GLfloat LightAmbient[]= { 0.1f, 0.1f, 0.1f, 1.0f }; GLfloat LightDiffuse[]= { 0.00015f, 0.00015f, 0.00015f, 1.0f }; GLfloat LightPosition[]= { 1.0f, 1.0f, 1.0f, 1.0f }; // Setup the ambient & diffuse lamps glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); glLightfv(GL_LIGHT1, GL_POSITION,LightPosition); // Enable lighting glEnable(GL_LIGHT1); } /** We received a mouse click. * * @param event */ void CSailDispGL::mousePressEvent ( QMouseEvent *event ) { if (event->button() == Qt::LeftButton) { setCenter(screenToLogical(event->pos().x(),event->pos().y())); redraw(); } } /** Perform OpenGL painting. */ void CSailDispGL::paintGL() { clear(); if ( wasResized ) { glViewport( 0, 0, (GLint)resizeW, (GLint)resizeH ); setViewRect( CRect3d(CPoint3d(0,0,0), CPoint3d(resizeW,resizeH,0)) ); wasResized = 0; } // set coordinate system to match the logical viewport glLoadIdentity(); CRect3d lRect = getLogicalRect(); real zs = real(2) / sqrt(lRect.width()*lRect.width() + lRect.height()*lRect.height()); glScaled(real(2) / lRect.width(),real(2) / lRect.height(),zs); glTranslated(-center.x(),-center.y(),-center.z()); draw( dispObject ); } /** The draw area has been resized. * * @param w the new width * @param h the new height */ void CSailDispGL::resizeGL( int w, int h ) { resizeW = w; resizeH = h; wasResized = 1; } /** We received a mouse wheel movement. * * @param event */ void CSailDispGL::wheelEvent( QWheelEvent *event) { if (event->delta()>0) zoomIn(); else zoomOut(); redraw(); } #endif sailcut-1.3.5/src/widgetprofilevert.h0000644000175000007640000000452611177775326017640 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef WIDGETPROFILEVERT_H #define WIDGETPROFILEVERT_H #include #include #include class QLabel; class QSpinBox; class QGroupBox; class QSlider; class QResizeEvent; class CSailMould; class CLabelProfileVert; class CRect3d; /** Drawing area for the vertical repartition. */ class CLabelProfileVert : public QLabel { public: CLabelProfileVert(QWidget *, CSailMould *); protected: void paintEvent( QPaintEvent *); void resizeEvent( QResizeEvent * ); private: /** The CSailMould we are displaying */ CSailMould *mould; /** The logical viewport */ CRect3d m_lRect; /** Has the area been resized since last redraw */ bool wasResized; }; /** Widget for displaying vertical repartition. * * @see CProfile * @see CLabelProfile * @see CLabelProfileVert */ class CWidgetProfileVert : public QWidget { Q_OBJECT public: CWidgetProfileVert( QWidget*, CSailMould*, QString ); /** redraw the vertical repartion drawing */ void updateLabel() { lblDrawVert->update(); } protected slots: virtual void slotSliderVert(); // member variables protected: /** the CSailMould */ CSailMould *sailmould; /** groupbox for vertical repartition */ QGroupBox* grpVertical; /** label for the vertical repartition */ QLabel* lblVertical; /** slider for the vertical repartition */ QSlider* sliderVertical; /** the vertical repartition drawing area */ CLabelProfileVert * lblDrawVert; }; #endif // WIDGETPROFILEVERT_H sailcut-1.3.5/src/sailtreemodel.cpp0000644000175000007640000000617111177775326017255 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include "sailtreemodel.h" CSailTreeModel::~CSailTreeModel() { delete rootItem; } int CSailTreeModel::columnCount(const QModelIndex &parent) const { if (parent.isValid()) return static_cast(parent.internalPointer())->columnCount(); else return rootItem->columnCount(); } QVariant CSailTreeModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); CSailTreeItem *item = static_cast(index.internalPointer()); switch (role) { case Qt::DisplayRole: return item->data(index.column()); case Qt::DecorationRole: if (index.column() == 0) return item->icon(); break; default: break; } return QVariant(); } Qt::ItemFlags CSailTreeModel::flags(const QModelIndex &index) const { if (!index.isValid()) return Qt::ItemIsEnabled; return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } QVariant CSailTreeModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal && role == Qt::DisplayRole) return rootItem->data(section); return QVariant(); } QModelIndex CSailTreeModel::index(int row, int column, const QModelIndex &parent) const { CSailTreeItem *parentItem; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast(parent.internalPointer()); CSailTreeItem *childItem = parentItem->child(row); if (childItem) return createIndex(row, column, childItem); else return QModelIndex(); } QModelIndex CSailTreeModel::parent(const QModelIndex &index) const { if (!index.isValid()) return QModelIndex(); CSailTreeItem *childItem = static_cast(index.internalPointer()); CSailTreeItem *parentItem = childItem->parent(); if (parentItem == rootItem) return QModelIndex(); return createIndex(parentItem->row(), 0, parentItem); } int CSailTreeModel::rowCount(const QModelIndex &parent) const { CSailTreeItem *parentItem; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast(parent.internalPointer()); return parentItem->childCount(); } sailcut-1.3.5/src/sailwriter-carlson.h0000644000175000007640000000314711177775326017715 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SAILWRITER_CARLSON_H #define SAILWRITER_CARLSON_H #include "filewriter.h" #include "sailcpp/panelgroup.h" #include /** A class for writing to Carlson plotter files. * * @ingroup FileIo */ class CSailCarlsonWriter : public CFileWriter { public: /** The constructor. */ CSailCarlsonWriter() : CFileWriter(".sp4","Carlson plotter files") {} ; void write(const CPanelGroup &sail, const QString &filename) const; void writePanel(ofstream &out, const CPanel &panel) const; void writePanelHeader(ofstream &out, const CPanel &panel) const; void writeDraw(ofstream &out, unsigned int ct) const; void writeCut(ofstream &out, unsigned int ct) const; void writePoint(ofstream &out, CPoint3d p0) const; }; #endif sailcut-1.3.5/src/sailwriter-svg.h0000644000175000007640000000240411177775326017046 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SAILWRITER_SVG_H #define SAILWRITER_SVG_H #include "filewriter.h" #include "sailcpp/panelgroup.h" /** A class used to output a CPanelGroup to an SVG file. * * @ingroup FileIo */ class CSailSvgWriter : public CFileWriter { public: /** The constructor. */ CSailSvgWriter() : CFileWriter(".svg", "SVG files") {} ; void write(const CPanelGroup &sail, const QString &filename) const; }; #endif sailcut-1.3.5/src/formmould.h0000644000175000007640000000315611177775326016075 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef FORMMOULD_H #define FORMMOULD_H #include class QPushButton; class QGroupBox; class QLabel; class QSlider; class CWidgetProfile; class CWidgetProfileVert; class CSailMould; /** The sail mould definition dialog. */ class CFormMould : public QDialog { Q_OBJECT public: CFormMould( QWidget* , CSailMould* ); protected: /** the CSailMould */ CSailMould *sailmould; /** OK button */ QPushButton* buttonOk; /** Cancel button */ QPushButton* buttonCancel; /** the vertical repartition widget */ CWidgetProfileVert * widgetVert; /** the top CWidgetProfile */ CWidgetProfile * prfTop; /** the middle CWidgetProfile */ CWidgetProfile * prfMiddle; /** the bottom CWidgetProfile */ CWidgetProfile * prfBottom; }; #endif // FORMMOULD_H sailcut-1.3.5/src/formmain.cpp0000644000175000007640000004023411200002660016175 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "formmain.h" #include "formsail.h" #include "formhull.h" #include "formrig.h" #include "formpanelgroup.h" #include "formboat.h" #include "sailcutqt.h" #include "sailcut.xpm" #include #include #include #include #include /** * Constructs Sailcut CAD's main window. * * @param myApp the Sailcut application * @param parent the parent widget */ CFormMain::CFormMain(CSailApp *myApp, QWidget *parent) : QMainWindow(parent), app(myApp), prefs(&myApp->prefs) { setMinimumSize( QSize( 300, 220 ) ); // locate Handbook app->loadTranslation(prefs->language); handbook = app->findHandbook(prefs->language); #ifdef DEBUG cout << "handbook : " << (const char*)handbook.toString().toLocal8Bit() << endl; #endif // create main widget setupMainWidget(); // create status bar statusbar = new QStatusBar(this); setStatusBar(statusbar); // create menu bar setupMenuBar(); // set language languageChange(); // set icon setWindowIcon( QPixmap( (const char **)sailcut_xpm ) ); // update document-specific menus slotUpdateDocumentMenus(); // resize to prefered size resize( QSize(prefs->mainWindowWidth,prefs->mainWindowHeight).expandedTo(minimumSizeHint()) ); } /** * Add a document window and show it. */ void CFormMain::addChild(CFormDocument *child) { bool max = ((activeChild() == NULL) || activeChild()->isMaximized()); workspace->addWindow(child); if (max) child->showMaximized(); else child->show(); } /** * Returns the active document window. */ CFormDocument* CFormMain::activeChild() { return qobject_cast(workspace->activeWindow()); } /** * This event is received when the user closes the dialog. */ void CFormMain::closeEvent(QCloseEvent *e) { prefs->mainWindowHeight = height(); prefs->mainWindowWidth = width(); QMainWindow::closeEvent(e); } /** * Sets the strings of the subwidgets using the current * language. */ void CFormMain::languageChange() { setWindowTitle( "Sailcut CAD" ); menuFile->setTitle( tr("&File") ); menuFileNew->setTitle( tr("&New") ); actionNewSail->setText( tr("sail") ); actionNewHull->setText( tr("hull") ); actionNewRig->setText( tr("rig") ); actionNewBoat->setText( tr("boat") ); actionOpen->setText( tr("&Open") ); menuRecent->setTitle( tr("Open &recent") ); actionSave->setText( tr("&Save") ); actionSaveAs->setText( tr("Save &As") ); actionQuit->setText( tr("&Quit") ); // View menu menuView->setTitle( tr("&View") ); menuLanguage->setTitle( tr("Language") ); // Window menu menuWindow->setTitle( tr("&Window") ); actionClose->setText( tr("&Close") ); actionCloseAll->setText( tr("Close &All") ); actionTile->setText( tr("&Tile") ); actionCascade->setText( tr("&Cascade") ); // Help menu menuHelp->setTitle( tr("&Help") ); actionHandbook->setText( tr("Sailcut CAD &Handbook") ); actionAboutQt->setText( tr("About &Qt") ); actionAbout->setText( tr("About &Sailcut CAD") ); } /** * Creates the "Open Recent" menu from the Most Recently Used files list. */ void CFormMain::makeMenuMru() { menuRecent->clear(); for (unsigned int i = 0; i < prefs->mruDocuments.size(); i++) { menuRecent->addAction( prefs->mruDocuments[i], this, SLOT( slotOpenRecent() ) )->setData(i); } } /** * Opens the specified document. * * @param filename */ void CFormMain::open(QString filename) { CFormDocument *wnd; if (CSailDefXmlWriter().isDocument(filename)) { wnd = new CFormSail(prefs, this); } else if (CHullDefXmlWriter().isDocument(filename)) { wnd = new CFormHull(prefs, this); } else if (CBoatDefXmlWriter().isDocument(filename)) { wnd = new CFormBoat(prefs, this); } else if (CRigDefXmlWriter().isDocument(filename)) { wnd = new CFormRig(prefs, this); } else if (CPanelGroupXmlWriter().isDocument(filename)) { wnd = new CFormPanelGroup(prefs, this); } else { statusbar->showMessage( tr("unknown document type '%1'").arg(filename) ); return; } if (wnd->open(filename)) { addChild(wnd); prefs->mruDocuments.touchEntry(filename); statusbar->showMessage(tr("loaded '%1'").arg(filename)); } else { prefs->mruDocuments.removeEntry(filename); statusbar->showMessage( tr("error loading '%1'").arg(filename) ); wnd->deleteLater(); } makeMenuMru(); } /** * Creates the main widget */ void CFormMain::setupMainWidget() { workspace = new QWorkspace(); setCentralWidget(workspace); connect(workspace, SIGNAL(windowActivated(QWidget *)), this, SLOT(slotUpdateDocumentMenus())); windowMapper = new QSignalMapper(this); connect(windowMapper, SIGNAL(mapped(QWidget *)), workspace, SLOT(setActiveWindow(QWidget *))); } /** * Creates the menu bar */ void CFormMain::setupMenuBar() { // File menu menuFile = menuBar()->addMenu(""); menuFileNew = menuFile->addMenu(""); actionNewSail = menuFileNew->addAction("", this, SLOT( slotNew() ) ); actionNewHull = menuFileNew->addAction("", this, SLOT( slotNew() ) ); actionNewRig = menuFileNew->addAction("", this, SLOT( slotNew() ) ); actionNewBoat = menuFileNew->addAction("", this, SLOT( slotNew() ) ); actionOpen = menuFile->addAction("", this, SLOT( slotOpen() ) ); menuRecent = menuFile->addMenu(""); menuFile->addSeparator(); actionSave = menuFile->addAction("", this, SLOT( slotSave() ) ); actionSaveAs = menuFile->addAction("", this, SLOT( slotSaveAs() ) ); actionFileSep = menuFile->addSeparator(); actionQuit = menuFile->addAction( "", this, SLOT( close() ) ); // View menu menuView = menuBar()->addMenu(""); menuLanguage = menuView->addMenu(""); // Window menu menuWindow = menuBar()->addMenu(""); actionClose = new QAction(this); connect(actionClose, SIGNAL( triggered() ), workspace, SLOT( closeActiveWindow() ) ); actionCloseAll = new QAction(this); connect(actionCloseAll, SIGNAL( triggered() ), workspace, SLOT( closeAllWindows() ) ); actionTile = new QAction(this); connect(actionTile, SIGNAL( triggered() ), workspace, SLOT( tile() ) ); actionCascade = new QAction(this); connect(actionCascade, SIGNAL( triggered() ), workspace, SLOT( cascade() ) ); actionWindowSep = new QAction(this); actionWindowSep->setSeparator(true); connect(menuWindow, SIGNAL( aboutToShow() ), this, SLOT( slotUpdateWindowMenu() ) ); // language text is not to be translated menuLanguage->addAction( "English", this, SLOT( slotLanguage() ) )->setData("en"); menuLanguage->addAction( QString::fromUtf8("FranУЇais"), this, SLOT( slotLanguage() ) )->setData("fr"); menuLanguage->addAction( "Nederlands", this, SLOT( slotLanguage() ) )->setData("nl"); menuLanguage->addAction( "Deutsch", this, SLOT( slotLanguage() ) )->setData("de"); menuLanguage->addAction( "Italiano", this, SLOT( slotLanguage() ) )->setData("it"); menuLanguage->addAction( "Norsk", this, SLOT( slotLanguage() ) )->setData("no"); menuLanguage->addAction( "Dansk", this, SLOT( slotLanguage() ) )->setData("dk"); // menuLanguage->addAction( "Svenska", this, SLOT( slotLanguage() ) )->setData("sv"); menuLanguage->addAction( QString::fromUtf8("PortugУЊs"), this, SLOT( slotLanguage() ) )->setData("pt"); // menuLanguage->addAction( QString::fromUtf8("EspaУБol"), this, SLOT( slotLanguage() ) )->setData("es"); menuLanguage->addAction( "Russian", this, SLOT( slotLanguage() ) )->setData("ru"); //menuLanguage->addAction( "Polish", this, SLOT( slotLanguage() ) )->setData("pl"); // Help menu menuHelp = menuBar()->addMenu(""); actionHandbook = menuHelp->addAction( "", this, SLOT( slotHandbook() ) ); actionAboutQt = menuHelp->addAction( "", this, SLOT( slotAboutQt() ) ); actionAbout = menuHelp->addAction( "", this, SLOT( slotAbout() ) ); } /** * Opens a given sail file */ void CFormMain::show(const QString filename) { // load preferences makeMenuMru(); // show main window QMainWindow::show(); // load specified file or create empty sail if ( !filename.isNull() ) { open(filename); } else { CFormSail *wnd = new CFormSail(prefs, this); addChild(wnd); } } /** * Displays the "About Sailcut CAD" dialog box */ void CFormMain::slotAbout() { QMessageBox::about( this, tr("About Sailcut CAD"), "

Sailcut CAD " SAILCUT_VERSION "

" "

Sailcut is a software for designing boat sails
" "(C) 1993-2009 Robert & Jeremy Laine" "

For more information, visit the project's page at http://sailcut.sourceforge.net/.

" "

Sailcut is a trademark registered by Robert Laine

" "
" "This program is free software; you can redistribute it and/or modify " "it under the terms of the GNU General Public License as published by " "the Free Software Foundation; either version 2 of the License, or " "(at your option) any later version.

" "This program is distributed in the hope that it will be useful, " "but WITHOUT ANY WARRANTY; without even the implied warranty of " "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public License for more details.

" "You should have received a copy of the GNU General Public License " "along with this program; if not, write to the Free Software " "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA" "
" ); } /** * Displays the "About Qt" dialog box */ void CFormMain::slotAboutQt() { QMessageBox::aboutQt( this ); } /** * Display the Sailcut handbook. */ void CFormMain::slotHandbook() { if ( !handbook.isEmpty() ) QDesktopServices::openUrl(handbook); } /** * Switches the current language. */ void CFormMain::slotLanguage() { QString locale; QAction *a = qobject_cast(sender()); if ( !a ) return; locale = a->data().toString(); prefs->language = locale; app->loadTranslation(locale); // try to locate handbook handbook = app->findHandbook(locale); languageChange(); } /** * Creates a new document */ void CFormMain::slotNew() { CFormDocument *wnd; QAction *a = qobject_cast(sender()); if (a == actionNewSail) { wnd = new CFormSail(prefs, this); } else if (a == actionNewBoat) { wnd = new CFormBoat(prefs, this); } else if (a == actionNewRig) { wnd = new CFormRig(prefs, this); } else if (a == actionNewHull) { wnd = new CFormHull(prefs, this); } else { return; } addChild(wnd); } /** * Displays a dialog box to open an XML sail definition. */ void CFormMain::slotOpen() { QString filter = "Sailcut CAD files ("; filter += QString("*") + CSailDefXmlWriter().getExtension(); filter += QString(" *") + CHullDefXmlWriter().getExtension(); filter += QString(" *") + CRigDefXmlWriter().getExtension(); filter += QString(" *") + CBoatDefXmlWriter().getExtension(); filter += QString(" *") + CPanelGroupXmlWriter().getExtension(); filter += ")"; QString newfile = QFileDialog::getOpenFileName(0, tr("Open"), "", filter); if ( !newfile.isNull() ) open(newfile); } /** * Opens a recently used sail definition. */ void CFormMain::slotOpenRecent() { // retrieve the index of the MRU entry QAction *a = qobject_cast(sender()); if ( !a ) return; int index = a->data().toInt(); open(prefs->mruDocuments[index]); } /** * Saves the current sail definition to an XML file. */ void CFormMain::slotSave() { if (activeChild()->save()) { QString filename = activeChild()->filename; statusbar->showMessage(tr("wrote '%1'").arg(filename)); prefs->mruDocuments.touchEntry(filename); makeMenuMru(); } } /** * Opens a dialog to select the XML to which the sail definition should be saved. */ void CFormMain::slotSaveAs() { if (activeChild()->saveAs()) { QString filename = activeChild()->filename; statusbar->showMessage(tr("wrote '%1'").arg(filename)); prefs->mruDocuments.touchEntry(filename); makeMenuMru(); } } /** * Refresh the document-specific menus. */ void CFormMain::slotUpdateDocumentMenus() { bool hasChild = (activeChild() != 0); actionSave->setEnabled(hasChild); actionSaveAs->setEnabled(hasChild); // remove old extra menu entries unsigned int i; for (i = 0; i < childFileActions.size(); i++) menuFile->removeAction(childFileActions[i]); childFileActions.clear(); for (i = 0; i < childViewActions.size(); i++) menuView->removeAction(childViewActions[i]); childViewActions.clear(); // add new extra menu entries if (hasChild) { vector menus = activeChild()->extraFileMenus; if (menus.size() > 0) { childFileActions.push_back(menuFile->insertSeparator(actionFileSep)); for (i = 0; i < menus.size(); i++) childFileActions.push_back(menuFile->insertMenu(actionFileSep, menus[i])); } vector actions = activeChild()->extraViewActions; if (actions.size() > 0) { for (i = 0; i < actions.size(); i++) { childViewActions.push_back(actions[i]); menuView->insertAction(menuLanguage->menuAction(), actions[i]); } childViewActions.push_back(menuView->insertSeparator(menuLanguage->menuAction())); } } } /** * Refresh the "window" menu. */ void CFormMain::slotUpdateWindowMenu() { menuWindow->clear(); menuWindow->addAction(actionClose); menuWindow->addAction(actionCloseAll); menuWindow->addAction(actionTile); menuWindow->addAction(actionCascade); menuWindow->addAction(actionWindowSep); QList windows = workspace->windowList(); actionWindowSep->setVisible(!windows.isEmpty()); actionClose->setEnabled(!windows.isEmpty()); actionCloseAll->setEnabled(!windows.isEmpty()); actionTile->setEnabled(!windows.isEmpty()); actionCascade->setEnabled(!windows.isEmpty()); for (int i = 0; i < windows.size(); ++i) { CFormDocument *child = qobject_cast(windows.at(i)); QString text = QString("%1 %2").arg(i + 1).arg(child->windowTitle()); if (!child->filename.isNull()) text.append(QString(" - %1").arg(QFileInfo(child->filename).fileName())); QAction *action = menuWindow->addAction(text); action->setCheckable(true); action->setChecked(child == activeChild()); connect(action, SIGNAL(triggered()), windowMapper, SLOT(map())); windowMapper->setMapping(action, child); } } sailcut-1.3.5/src/sailviewer-tabs.cpp0000644000175000007640000000375411177775326017531 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "sailviewer-panel.h" #include "sailviewer-tabs.h" /** * Constructs a tabbed widget to hold sail viewers. * * @param parent the parent widget */ CSailViewerTabs::CSailViewerTabs(QWidget *parent) : QTabWidget(parent) { #ifdef HAVE_QTOPENGL addViewer(new CSailViewerPanel(NULL, SHADED, true)); #endif addViewer(new CSailViewerPanel(NULL, WIREFRAME, true)); } /** * Adds a tab with a new sail viewer. */ void CSailViewerTabs::addViewer(CSailViewerPanel *viewer) { // add viewer panel.push_back(viewer); // add tab addTab(viewer,""); } /** * Sets the strings of the subwidgets using the current * language. */ void CSailViewerTabs::languageChange() { int tabidx = 0; for (unsigned int i = 0; i < panel.size(); i++) panel[i]->languageChange(); #ifdef HAVE_QTOPENGL setTabText(tabidx++, tr("shaded view")); #endif setTabText(tabidx++, tr("wireframe view")); } /** * Change the displayed object. * * @param obj the new object to display */ void CSailViewerTabs::setObject(const CPanelGroup &obj) { int tabidx = 0; #ifdef HAVE_QTOPENGL panel[tabidx++]->setObject(obj); #endif panel[tabidx++]->setObject(obj); } sailcut-1.3.5/src/formrigdef.h0000644000175000007640000000256111177775326016214 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef FORMRIGDEF_H #define FORMRIGDEF_H #include "ui_formrigdefbase.h" #include "sailcpp/rigdef.h" /** The rig definition dialog, where the user enters * the parameters of the rig. * * @see CRigDef default values */ class CFormRigDef : public QDialog, private Ui::CFormRigDefBase { Q_OBJECT public: CFormRigDef( QWidget *, CRigDef* ); bool check(); virtual void accept(); protected slots: virtual void languageChange(); void slotChanged(); protected: /** a pointer to the rig definion */ CRigDef *rigdef; }; #endif sailcut-1.3.5/src/filewriter.h0000644000175000007640000001075211177775326016245 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef FILEWRITER_H #define FILEWRITER_H #ifdef WIN32 #define CRLF endl #else #define CRLF "\r\n" #endif #include #include #include #include using namespace std; class read_error : public runtime_error { public: read_error(const string &message) : runtime_error(message) { cout << what() << endl; } }; class write_error : public runtime_error { public: write_error(const string &message) : runtime_error(message) { cout << what() << endl; } }; /** This is a generic class used as the base for various file * input and output modules. */ template class CFileWriter : public QObject { public: /** The constructor. * * @param ext the file extension * @param desc description of the file type */ CFileWriter(const QString &ext, const QString &desc) : _ext(ext), _desc(desc) {} ; /** Perform the actual reading operation, may be overriden * to provide this functionality. */ virtual const objtype read(const QString &) const { throw logic_error("Reading is not supported for this file type."); }; /** Display a dialog then read file. * * @param dest the object we read to * @param filename initial file name */ QString readDialog(objtype &dest, const QString &filename = "") const { QString newfilename = QFileDialog::getOpenFileName(0, tr("Open"), QFileInfo(filename).absolutePath(), _desc + " (*" + _ext + ")"); if (!newfilename.isNull()) { try { dest = read(newfilename); } catch (read_error e) { readErrorMessage(); newfilename = QString::null; } } return newfilename; }; /** Show an error message indicating that reading failed. */ static void readErrorMessage() { QMessageBox::information(0, tr("error"), tr("There was an error reading from the selected file.")); }; /** Perform the actual writing operation, must be overriden. */ virtual void write(const objtype &, const QString &) const = 0; /** Opens of a dialog to ask for a filename * then writes to a file. * * @param obj The object to write. * @param filename The filename to start off with (default = "") */ QString writeDialog(const objtype &obj, const QString &filename = QString::null) const { QString newfilename = QFileDialog::getSaveFileName(0, tr("Save"), filename, _desc + " (*" + _ext + ")"); if (newfilename.isNull()) return newfilename; if (newfilename.right(_ext.length()).toLower() != _ext) newfilename += _ext; try { write(obj, newfilename); } catch (write_error e) { writeErrorMessage(); newfilename = QString::null; } return newfilename; }; /** Show an error message indicating that writing failed. */ static void writeErrorMessage() { QMessageBox::information(0, tr("error"), tr("There was an error writing to the selected file.")); }; /** Return the file extension associated with this CFileWriter. */ QString getExtension() const { return _ext; }; /** * Returns whether the given file is associated with this CFileWriter. */ bool isDocument(QString filename) const { return (filename.right(_ext.length()).toLower() == _ext); }; protected: /** file extension */ QString _ext; /** description of the file type */ QString _desc; }; #endif sailcut-1.3.5/src/saildoc.cpp0000644000175000007640000007064711177775326016053 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "saildoc.h" #include /** This contains all the input and output functions * to read and write the sail, hull, rig, boat data to file. */ /************************************************************************** construction / destruction **************************************************************************/ /** Constructs an empty CSailDoc object. */ CSailDoc::CSailDoc() : QDomDocument("Sailcut") { top = createElement("CSailDoc"); appendChild(top); } /** Constructs a CSailDoc from a given XML file. * * @param filename */ CSailDoc::CSailDoc( const QString &filename ) { QFile f( filename ); if ( !f.open(QIODevice::ReadOnly) ) throw read_error("CSailDoc::CSailDoc : cannot open file for read access!"); if ( !setContent( &f ) ) { f.close(); throw read_error("CSailDoc::CSailDoc : cannot set XML content from file!"); } f.close(); top = documentElement(); } /** Creates an element with the given name and type. * * @param type a string containing the type of the element * @param name a string containing the name of the element */ QDomElement CSailDoc::createElement(const QString &type, const QString &name) { QDomElement e = createElement(type); e.setAttribute("name", name); return e; } /** Creates an element with the given name, type and value. * * @param type a string containing the type of the element * @param name a string containing the name of the element * @param value a string containing the name of the element */ QDomElement CSailDoc::createElement(const QString &type, const QString &name, const QString &value) { QDomElement e = createElement(type,name); e.setAttribute("value", value); return e; } /** Looks for an element with a given name and type in the current XML document. * * @param parent the parent node * @param type a string containing the type of the element * @param name a string containing the name of the element */ QDomElement CSailDoc::findElement(const QDomNode &parent, const QString &type, const QString &name) { QDomNamedNodeMap attr; QDomNode n = parent.firstChild(); while ( !n.isNull() ) { if (n.nodeName() == type) { attr = n.toElement().attributes(); if (attr.namedItem("name").nodeValue() == name) return n.toElement(); } n = n.nextSibling(); } // we didn't find the element, throw an exception throw doc_element_error(QString("CSailDoc::findElement(" + type + "," + name + ") : did not find requested element").toStdString()); n.clear(); return n.toElement(); } /************************************************************************** Input **************************************************************************/ /** Reads an integer value from an XML document. * * @param parent the parent node * @param i the integer * @param name the name of the value */ void CSailDoc::get ( const QDomNode &parent, int &i, const QString &name ) { QDomElement e = findElement( parent, "int", name); QDomNamedNodeMap attr = e.attributes(); i = attr.namedItem("value").nodeValue().toInt(); } /** Reads an unsigned integer value from an XML document. * * @param parent the parent node * @param i the unsigned integer * @param name the name of the value */ void CSailDoc::get ( const QDomNode &parent, unsigned int &i, const QString &name ) { int temp; get(parent, temp, name); i = temp; } /** Reads a real value from an XML document. * * @param parent the parent node * @param r the real value * @param name the name of the value */ void CSailDoc::get ( const QDomNode &parent, real &r, const QString &name ) { QDomElement e = findElement( parent, "real", name); QDomNamedNodeMap attr = e.attributes(); r = attr.namedItem("value").nodeValue().toDouble(); } /** Reads a std::string value from an XML document. * * @param parent the parent node * @param s the string * @param name the name of the string */ void CSailDoc::get ( const QDomNode &parent, string &s, const QString &name ) { QDomElement e = findElement( parent, "string", name); QDomNamedNodeMap attr = e.attributes(); s = attr.namedItem("value").nodeValue().toStdString(); } /** Reads a QString string value from an XML document. * * @param parent the parent node * @param s the string * @param name the name of the string */ void CSailDoc::get ( const QDomNode &parent, QString &s, const QString &name ) { QDomElement e = findElement( parent, "string", name); QDomNamedNodeMap attr = e.attributes(); s = attr.namedItem("value").nodeValue(); } /** Reads a CPoint3D point with x,y,z coordinates from an XML document. * * @param parent the parent node * @param p the 3D point * @param name the name of the 3D point */ void CSailDoc::get ( const QDomNode &parent, CPoint3d &p, const QString &name ) { QDomElement e = findElement( parent, "CPoint3d", name); get (e, p.x(), "x"); get (e, p.y(), "y"); get (e, p.z(), "z"); } /** Reads an enumPanelGroupType enumerated Panel Group Type from an XML document. * * @param parent the parent node * @param t the enumPanelGroupType * @param name the name of the value */ void CSailDoc::get ( const QDomNode &parent, enumPanelGroupType &t, const QString &name ) { QDomElement e = findElement( parent, "enumPanelGroupType", name); QString s = e.attributes().namedItem("value").nodeValue(); if (!s.compare("SAIL")) { t = SAIL; } else if (!s.compare("RIG")) { t = RIG; } else if (!s.compare("HULL")) { t = HULL; } else { throw invalid_argument("CSailDoc::get : unknown panel group type"); } } /** Reads an enumSailCut enumerated Sail Cut type from an XML document. * * @param parent the parent node * @param c the enumSailCut * @param name the name of the value */ void CSailDoc::get ( const QDomNode &parent, enumSailCut &c, const QString &name ) { QDomElement e = findElement( parent, "enumSailCut", name); QString s = e.attributes().namedItem("value").nodeValue(); if (!s.compare("CROSS")) c = CROSS; if (!s.compare("TWIST")) c = TWIST; if (!s.compare("HORIZONTAL")) c = HORIZONTAL; if (!s.compare("VERTICAL")) c = VERTICAL; if (!s.compare("RADIAL")) c = RADIAL; if (!s.compare("MITRE")) c = MITRE; if (!s.compare("MITRE2")) c = MITRE2; } /** Reads an enumSailType enumerated Sail Type from an XML document. * * @param parent the parent node * @param t the enumSailType * @param name the name of the value */ void CSailDoc::get ( const QDomNode &parent, enumSailType &t, const QString &name ) { QDomElement e = findElement( parent, "enumSailType", name); QString s = e.attributes().namedItem("value").nodeValue(); if (!s.compare("MAINSAIL")) t = MAINSAIL; if (!s.compare("JIB")) t = JIB; if (!s.compare("WING")) t = WING; } /** Reads an enumBoatElementType enumerated Boat Element Type from an XML document. * * @param parent the parent node * @param t the enumBoatElementType * @param name the name of the value */ void CSailDoc::get ( const QDomNode &parent, enumBoatElementType &t, const QString &name ) { QDomElement e = findElement( parent, "enumBoatElementType", name); QString s = e.attributes().namedItem("value").nodeValue(); if (!s.compare("HULLDEF")) t = HULLDEF; if (!s.compare("SAILDEF")) t = SAILDEF; if (!s.compare("RIGDEF")) t = RIGDEF; if (!s.compare("PANELGROUP")) t = PANELGROUP; } /** Reads a CHullDef hull definition from an XML document. * * @param parent the parent node * @param d the hull definition * @param name the name of the hull definition */ void CSailDoc::get ( const QDomNode &parent, CHullDef &d, const QString &name ) { QDomElement e = findElement( parent, "CHullDef", name); get(e, d.hullID, "hullID"); /** read hull bottom data */ get(e, d.BLWL, "BLWL"); get(e, d.BfwdHeight, "BfwdHeight"); get(e, d.BaftHeight, "BaftHeight"); get(e, d.BSlopeA, "BSlopeA"); get(e, d.BBW, "BBW"); get(e, d.BBWPos, "BBWPos"); get(e, d.BaftW, "BaftW"); get(e, d.BDeadriseA, "BDeadriseA"); get(e, d.BSweepA, "BSweepA"); get(e, d.BfwdShape, "BfwdShape"); get(e, d.BaftShape, "BaftShape"); /** read hull deck data */ get(e, d.DfwdHeight, "DfwdHeight"); get(e, d.DaftHeight, "DaftHeight"); get(e, d.DSlopeA, "DSlopeA"); /** read hull stem angle */ get(e, d.StemA, "StemA"); /** read hull transom angle */ get(e, d.TransomA, "TransomA"); /** read hull side planks data */ get(e, d.NBPlank, "NBPlank"); get(e, d.TopPlankA, "TopPlankA"); get(e, d.LowPlankA, "lowPlankA"); // get(e, d.AutoPlank, "AutoPlank"); // } /** Reads a CSailDef sail definition from an XML document. * NEW members are added at the end of the list * See also CSailDoc::put(QDomNode &parent, const CSailDef &d, const QString &name ) * * @param parent the parent node * @param d the sail definition * @param name the name of the sail definition */ void CSailDoc::get ( const QDomNode &parent, CSailDef &d, const QString &name ) { QDomElement e = findElement( parent, "CSailDef", name); /** read sail cut layout and type */ get(e, d.sailCut, "sailCut"); get(e, d.sailType, "sailType"); /** read sail boat data */ get(e, d.LOA, "LOA"); get(e, d.foreI, "foreI"); get(e, d.foreJ, "foreJ"); get(e, d.tackX, "tackX"); get(e, d.tackY, "tackY"); /** read sail sides */ get(e, d.luffL, "luffL"); get(e, d.rake, "rake"); get(e, d.gaffDeg, "gaffDeg"); get(e, d.gaffL, "gaffL"); get(e, d.footL, "footL"); get(e, d.leechL, "leechL"); /** read sail shape of sides */ get(e, d.luffR, "luffR"); get(e, d.gaffR, "gaffR"); get(e, d.leechR, "leechR"); get(e, d.footR, "footR"); get(e, d.luffRP, "luffRP"); get(e, d.gaffRP, "gaffRP"); get(e, d.leechRP, "leechRP"); get(e, d.footRP, "footRP"); /** read sail cloth width, seam and hems width */ get(e, d.clothW, "clothW"); get(e, d.seamW, "seamW"); get(e, d.leechHemW, "leechHemW"); get(e, d.hemsW, "hemsW"); /** read sail twist */ get(e, d.twistDeg, "twistDeg"); /** read sail mould */ get(e, d.mould, "mould"); /** read sail sheeting angle */ get(e, d.sheetDeg, "sheetDeg"); /** NOTE : we maintain backward file format compatibility by adding below * all new members in the order they are introduced in CSailDoc::put */ try { /** read Sail ID */ get(e, d.sailID, "sailID"); /** read Radial sections */ get(e, d.nbSections, "nbSections"); /** read Radial gores */ get(e, d.nbGores, "nbGores"); /** read Luff gores */ get(e, d.nbLuffGores, "nbLuffGores"); /** read Wing dihedral angle */ get(e, d.dihedralDeg, "dihedralDeg"); /** read Foot hem width */ get(e, d.footHemW, "footHemW"); } catch (doc_element_error e) { /** catch read error to avoid killing the program */ } } /** Reads a CSide sail side from an XML document. * * @param parent the parent node * @param s the sail side * @param name the name of the sail side */ void CSailDoc::get ( const QDomNode &parent, CSide &s, const QString &name ) { QDomElement e = findElement( parent, "CSide", name); get_vector(e, s, "point"); } /** Reads a CPanel sail panel from an XML document. * * @param parent the parent node * @param p the panel * @param name the name of the panel */ void CSailDoc::get ( const QDomNode &parent, CPanel &p, const QString &name ) { QDomElement e = findElement( parent, "CPanel", name); get(e, p.top, "top"); get(e, p.bottom, "bottom"); get(e, p.left, "left"); get(e, p.right, "right"); int temp; get(e, temp, "hasHems"); p.hasHems = (temp != 0); if (p.hasHems) { get(e, p.cutTop, "cutTop"); get(e, p.cutBottom, "cutBottom"); get(e, p.cutLeft, "cutLeft"); get(e, p.cutRight, "cutRight"); } } /** Reads a CPanelGroup from an XML document. * * @param parent the parent node * @param g the panel group * @param name the name of the panel group */ void CSailDoc::get ( const QDomNode &parent, CPanelGroup &g, const QString &name ) { QDomElement e = findElement( parent, "CPanelGroup", name); get_vector(e, g, "panel"); get(e, g.title, "title"); get_vector(e, g.child, "child"); /* NOTE : we maintain backward file format compatibility * by adding below all new members in the order they were introduced */ try { get(e, g.type, "type"); } catch (doc_element_error e) { // to avoid killing the program } } /** Reads a CProfile sail profile from an XML document. * * @param parent the parent node * @param p the profile * @param name the name of the profile */ void CSailDoc::get ( const QDomNode &parent, CProfile &p, const QString &name ) { QDomElement e = findElement( parent, "CProfile", name); real depth=0,kluff=0,kleech=0; get(e, depth, "depth"); get(e, kleech, "kleech"); get(e, kluff, "kluff"); p = CProfile(depth,kleech,kluff); } /** Reads a CBoatDef boat definition from an XML document. * * @param parent the parent node * @param d the boat definition * @param name the name of the boat definition */ void CSailDoc::get ( const QDomNode &parent, CBoatDef &d, const QString &name ) { QDomElement e = findElement( parent, "CBoatDef", name); get_vector(e, d, "element"); } /** Reads a CBoatElement from an XML document. * * @param parent the parent node * @param s the boat element * @param name the name of the boat element */ void CSailDoc::get ( const QDomNode &parent, CBoatElement &s, const QString &name ) { QDomElement e = findElement( parent, "CBoatElement", name); get(e, (CPanelGroup&)s, "panelgroup"); get(e, s.type, "type"); get(e, s.filename, "filename"); get(e, s.origin, "origin"); } /** Reads a CSailMould sail mould from an XML document. * * @param parent the parent node * @param m the mould * @param name the name of the mould */ void CSailDoc::get ( const QDomNode &parent, CSailMould &m, const QString &name ) { QDomElement e = findElement( parent, "CSailMould", name); get(e, m.vertpos, "vertpos"); get_vector(e, m.profile, "profile"); } /** Reads a CPrefs set of preferences from an XML document. * * @param parent the parent node * @param p the preferences * @param name the name of the preferences */ void CSailDoc::get ( const QDomNode &parent, CPrefs &p, const QString &name ) { QDomElement e = findElement( parent, "CPrefs", name); try { get(e, p.language, "language"); get_vector(e, p.mruDocuments, "mruDocuments"); get(e, p.helpWindowHeight, "helpWindowHeight"); get(e, p.helpWindowWidth, "helpWindowWidth"); get(e, p.mainWindowHeight, "mainWindowHeight"); get(e, p.mainWindowWidth, "mainWindowWidth"); } catch (doc_element_error e) { // we do not let this kill the program } } /** Reads a CRigDef rig definition from an XML document. * * @param parent the parent node * @param d the rig definition * @param name the name of the rig definition */ void CSailDoc::get ( const QDomNode &parent, CRigDef &d, const QString &name ) { QDomElement e = findElement( parent, "CRigDef", name); get(e, d.rigID, "rigID"); /** read fore triangle data */ get(e, d.foreI, "foreI"); get(e, d.foreJ, "foreJ"); /** read mast data */ get(e, d.MHeight, "MHeight"); get(e, d.MCord, "MCord"); get(e, d.MWidth, "MWidth"); get(e, d.MRakeM, "MRakeM"); get(e, d.MRakeD, "MRakeD"); get(e, d.MBase, "MBase"); get(e, d.MRnd, "MRnd"); get(e, d.MRndPos, "MRndPos"); /** read shrouds data */ get(e, d.CSH, "CSH"); get(e, d.CSB, "CSB"); get(e, d.LSB, "LSB"); /** read spreaders data */ get(e, d.SPNB, "SPNB"); get(e, d.SPH[0], "SPH0"); get(e, d.SPH[1], "SPH1"); get(e, d.SPH[2], "SPH2"); get(e, d.SPH[3], "SPH3"); get(e, d.SPW[0], "SPW0"); get(e, d.SPW[1], "SPW1"); get(e, d.SPW[2], "SPW2"); get(e, d.SPW[3], "SPW3"); /** read mainsail data */ get(e, d.BAD, "BAD"); get(e, d.HAD, "HAD"); // } /************************************************************************** Output **************************************************************************/ /** Puts an integer value to an XML document. */ void CSailDoc::put(QDomNode &parent, const int &i, const QString &name ) { QDomElement e = createElement("int",name,QString::number(i)); parent.appendChild(e); } /** Puts an unsigned integer value to an XML document. */ void CSailDoc::put(QDomNode &parent, const unsigned int &i, const QString &name ) { put(parent, int(i), name); } /** Puts a real value to an XML document. */ void CSailDoc::put(QDomNode &parent, const real &r, const QString &name ) { QDomElement e = createElement("real",name, QString::number(r)); parent.appendChild(e); } /** Puts a std::string value to an XML document. */ void CSailDoc::put(QDomNode &parent, const string &s, const QString &name ) { QDomElement e = createElement("string", name, QString::fromStdString(s)); parent.appendChild(e); } /** Puts a QString value to an XML document. */ void CSailDoc::put(QDomNode &parent, const QString &s, const QString &name ) { QDomElement e = createElement("string", name, s); parent.appendChild(e); } /** Puts a CPoint3d to an XML document. */ void CSailDoc::put(QDomNode &parent, const CPoint3d &p, const QString &name ) { QDomElement e = createElement("CPoint3d",name); parent.appendChild(e); put(e, p.x(), "x"); put(e, p.y(), "y"); put(e, p.z(), "z"); } /** Puts an enumBoatElementType enumerated Boat Element Type to an XML document. */ void CSailDoc::put(QDomNode &parent, const enumBoatElementType &t, const QString &name ) { QString value; switch (t) { case HULLDEF: value = "HULLDEF"; break; case SAILDEF: value = "SAILDEF"; break; case RIGDEF: value = "RIGDEF"; break; case PANELGROUP: value = "PANELGROUP"; break; } QDomElement e = createElement("enumBoatElementType",name,value); parent.appendChild(e); } /** Puts an enumPanelGroupType enumerated Panel Group Type to an XML document. */ void CSailDoc::put(QDomNode &parent, const enumPanelGroupType &t, const QString &name ) { QString value; switch (t) { case SAIL: value = "SAIL"; break; case RIG: value = "RIG"; break; case HULL: value = "HULL"; break; } QDomElement e = createElement("enumPanelGroupType",name,value); parent.appendChild(e); } /** Puts an enumSailCut enumerated Sail Cut Type to an XML document. */ void CSailDoc::put(QDomNode &parent, const enumSailCut &c, const QString &name ) { QString value; switch (c) { case CROSS: value = "CROSS"; break; case TWIST: value = "TWIST"; break; case HORIZONTAL: value = "HORIZONTAL"; break; case VERTICAL: value = "VERTICAL"; break; case RADIAL: value = "RADIAL"; break; case MITRE: value = "MITRE"; break; case MITRE2: value = "MITRE2"; break; } QDomElement e = createElement("enumSailCut",name,value); parent.appendChild(e); } /** Puts an enumSailType enumerated Sailf Type to an XML document. */ void CSailDoc::put(QDomNode &parent, const enumSailType &t, const QString &name ) { QString value; switch (t) { case MAINSAIL: value = "MAINSAIL"; break; case JIB: value = "JIB"; break; case WING: value = "WING"; break; } QDomElement e = createElement("enumSailType",name,value); parent.appendChild(e); } /** Puts a CHullDef hull definition to an XML document. */ void CSailDoc::put(QDomNode &parent, const CHullDef &d, const QString &name ) { QDomElement e = createElement("CHullDef",name); parent.appendChild(e); put(e, d.hullID, "hullID"); /** write hull bottom data */ put(e, d.BLWL, "BLWL"); put(e, d.BfwdHeight, "BfwdHeight"); put(e, d.BaftHeight, "BaftHeight"); put(e, d.BSlopeA, "BSlopeA"); put(e, d.BBW, "BBW"); put(e, d.BBWPos, "BBWPos"); put(e, d.BaftW, "BaftW"); put(e, d.BDeadriseA, "BDeadriseA"); put(e, d.BSweepA, "BSweepA"); put(e, d.BfwdShape, "BfwdShape"); put(e, d.BaftShape, "BaftShape"); /** write hull deck data */ put(e, d.DfwdHeight, "DfwdHeight"); put(e, d.DaftHeight, "DaftHeight"); put(e, d.DSlopeA, "DSlopeA"); /** write hull stem angle */ put(e, d.StemA, "StemA"); /** write hull transom angle */ put(e, d.TransomA, "TransomA"); /** write hull side planks data */ put(e, d.NBPlank, "NBPlank"); put(e, d.TopPlankA, "TopPlankA"); put(e, d.LowPlankA, "lowPlankA"); // put(e, d.AutoPlank, "AutoPlank"); // } /** Puts a CSailDef sail definition to an XML document. * NEW members shall be added at THE END OF THE LIST in order * to maintain backward comaptibility of files. * * See also CSailDoc::get(QDomNode &parent, const CSailDef &d, const QString &name ) */ void CSailDoc::put(QDomNode &parent, const CSailDef &d, const QString &name ) { QDomElement e = createElement("CSailDef",name); parent.appendChild(e); /** write Sail cut and Sail type */ put(e, d.sailCut, "sailCut"); put(e, d.sailType, "sailType"); /** write Sail Boat data */ put(e, d.LOA, "LOA"); put(e, d.foreI, "foreI"); put(e, d.foreJ, "foreJ"); put(e, d.tackX, "tackX"); put(e, d.tackY, "tackY"); /** write Sides of the sail */ put(e, d.luffL, "luffL"); put(e, d.rake, "rake"); put(e, d.gaffDeg, "gaffDeg"); put(e, d.gaffL, "gaffL"); put(e, d.footL, "footL"); put(e, d.leechL, "leechL"); /** write Shape of sail sides */ put(e, d.luffR, "luffR"); put(e, d.gaffR, "gaffR"); put(e, d.leechR, "leechR"); put(e, d.footR, "footR"); put(e, d.luffRP, "luffRP"); put(e, d.gaffRP, "gaffRP"); put(e, d.leechRP, "leechRP"); put(e, d.footRP, "footRP"); /** write sail Cloth width, Seam and Hems width */ put(e, d.clothW, "clothW"); put(e, d.seamW, "seamW"); put(e, d.leechHemW, "leechHemW"); put(e, d.hemsW, "hemsW"); /** write sail Twist angle*/ put(e, d.twistDeg, "twistDeg"); /** write sail Sheeting angle*/ put(e, d.sheetDeg, "sheetDeg"); /** write sail Mould */ put(e, d.mould, "mould"); //** NOTE: this is the point at which sail data evolutions start */ /** write sail ID */ put(e, d.sailID, "sailID"); /** write sail Radial sections */ put(e, d.nbSections, "nbSections"); /** write sail Radial gores */ put(e, d.nbGores, "nbGores"); /** write sail Luff gores */ put(e, d.nbLuffGores, "nbLuffGores"); /** write sail Wing dihedral angle */ put(e, d.dihedralDeg, "dihedralDeg"); /** write sail Foot hem width */ put(e, d.footHemW, "footHemW"); /** NOTE: write here below future new elements of sail */ // } /** Puts a CSide sail side to an XML document. */ void CSailDoc::put(QDomNode &parent, const CSide &s, const QString &name ) { QDomElement e = createElement("CSide",name); parent.appendChild(e); put_vector(e, s, "point"); } /** Puts a CPanel sail panel to an XML document. */ void CSailDoc::put(QDomNode &parent, const CPanel &p, const QString &name ) { QDomElement e = createElement("CPanel",name); parent.appendChild(e); put(e, p.left, "left"); put(e, p.top, "top"); put(e, p.right, "right"); put(e, p.bottom, "bottom"); put(e, p.hasHems, "hasHems"); if (p.hasHems) { put(e, p.cutLeft, "cutLeft"); put(e, p.cutTop, "cutTop"); put(e, p.cutRight, "cutRight"); put(e, p.cutBottom, "cutBottom"); } } /** Puts a CPanelGroup to an XML document. */ void CSailDoc::put(QDomNode &parent, const CPanelGroup &g, const QString &name ) { QDomElement e = createElement("CPanelGroup",name); parent.appendChild(e); put_vector(e, g, "panel"); put(e, g.title, "title"); put_vector(e, g.child, "child"); put(e, g.type, "type"); } /** Puts a CProfile sail profile to an XML document. */ void CSailDoc::put(QDomNode &parent, const CProfile &p, const QString &name ) { QDomElement e = createElement("CProfile",name); parent.appendChild(e); put(e, p.getDepth(), "depth"); put(e, p.getLeech(), "kleech"); put(e, p.getLuff(), "kluff"); } /** Puts a CSailMould sail mould to an XML document. */ void CSailDoc::put(QDomNode &parent, const CSailMould &m, const QString &name ) { QDomElement e = createElement("CSailMould",name); parent.appendChild(e); put(e, m.vertpos, "vertpos"); put_vector(e, m.profile, "profile"); } /** Put a CBoatDef boat definition to an XML document. */ void CSailDoc::put(QDomNode &parent, const CBoatDef &d, const QString &name ) { QDomElement e = createElement("CBoatDef",name); parent.appendChild(e); put_vector(e, d, "element"); } /** Put a CBoatElement elements of a boat (sail, hull, rig) to an XML document. */ void CSailDoc::put(QDomNode &parent, const CBoatElement &s, const QString &name ) { QDomElement e = createElement("CBoatElement",name); parent.appendChild(e); put(e, s.filename, "filename"); put(e, s.type, "type"); put(e, s.origin, "origin"); put(e, (CPanelGroup&)s, "panelgroup"); } /** Puts a CPrefs preferences to an XML document. */ void CSailDoc::put(QDomNode &parent, const CPrefs& p, const QString& name) { QDomElement e = createElement("CPrefs",name); parent.appendChild(e); put(e, p.language, "language"); put_vector(e, p.mruDocuments, "mruDocuments"); put(e, p.helpWindowHeight, "helpWindowHeight"); put(e, p.helpWindowWidth, "helpWindowWidth"); put(e, p.mainWindowHeight, "mainWindowHeight"); put(e, p.mainWindowWidth, "mainWindowWidth"); } /** Puts a CRigDef rig definition to an XML document. */ void CSailDoc::put(QDomNode &parent, const CRigDef &d, const QString &name ) { QDomElement e = createElement("CRigDef",name); parent.appendChild(e); put(e, d.rigID, "rigID"); /** write rig fore triangle */ put(e, d.foreI, "foreI"); put(e, d.foreJ, "foreJ"); /** write rig mast data*/ put(e, d.MHeight, "MHeight"); put(e, d.MCord, "MCord"); put(e, d.MWidth, "MWidth"); put(e, d.MRakeM, "MRakeM"); put(e, d.MRakeD, "MRakeD"); put(e, d.MBase, "MBase"); put(e, d.MRnd, "MRnd"); put(e, d.MRndPos, "MRndPos"); /** write rig shrouds data */ put(e, d.CSH, "CSH"); put(e, d.CSB, "CSB"); put(e, d.LSB, "LSB"); /** write rig spreaders data */ put(e, d.SPNB, "SPNB"); put(e, d.SPH[0], "SPH0"); put(e, d.SPH[1], "SPH1"); put(e, d.SPH[2], "SPH2"); put(e, d.SPH[3], "SPH3"); put(e, d.SPW[0], "SPW0"); put(e, d.SPW[1], "SPW1"); put(e, d.SPW[2], "SPW2"); put(e, d.SPW[3], "SPW3"); /** write rig mainsail data */ put(e, d.BAD, "BAD"); put(e, d.HAD, "HAD"); // } /** Writes the CSailDoc document to file. * * @throws an exception if writing failed. */ void CSailDoc::toFile(const QString &filename) { QFile f( filename ); if ( !f.open(QIODevice::WriteOnly) ) throw write_error("CSailDoc::toFile : cannot open file for write access!"); f.write(toByteArray()); f.close(); } sailcut-1.3.5/src/formsaildef.h0000644000175000007640000000337311177775326016365 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef FORMSAILDEF_H #define FORMSAILDEF_H #include "ui_formsaildefbase.h" #include "sailcpp/saildef.h" /** This class is for sail definition dialog where, * The user enters the parameters of the sail * Checking the input data * Computing and displaying ancillary data. * * @see also CsailDef for definition and default values */ class CFormSailDef : public QDialog, private Ui::CFormSailDefBase { Q_OBJECT public: CFormSailDef( QWidget *, CSailDef* ); bool check(); void compute(); void displayData(QString &txt0, QString &txt1, QString &txt2, QString &txt3, QString &txt4); enumSailCut getSailCut(); enumSailType getSailType(); void setSailCut( enumSailCut ); void setSailType( enumSailType ); virtual void accept(); protected slots: void slotSailCut(); void slotSailType(); void slotCompute(); protected: /** A pointer to the sail definion */ CSailDef *saildef; }; #endif sailcut-1.3.5/src/sailviewer.cpp0000644000175000007640000001073011177775326016572 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "sailviewer.h" #include "saildisplabel.h" #ifdef HAVE_QTOPENGL #include "saildispgl.h" #endif #include #include #include /** Constructs a CSailViewer object. */ CSailViewer::CSailViewer( QWidget *parent, enumViewMode viewMode, bool show_sliders ) : QWidget(parent) { sailDispLayout = new QGridLayout( this ); int xpos = 0, ypos = 0; if (show_sliders) { sliderElevation = new QSlider( this ); sliderElevation->setMinimum( -180 ); sliderElevation->setMaximum( 180 ); sliderElevation->setOrientation( Qt::Vertical ); sliderElevation->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); sailDispLayout->addWidget( sliderElevation, 0, 0 ); xpos++; sliderAzimuth = new QSlider( this ); sliderAzimuth->setMinimum( -180 ); sliderAzimuth->setMaximum( 180 ); sliderAzimuth->setOrientation( Qt::Horizontal ); sliderAzimuth->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); sailDispLayout->addWidget( sliderAzimuth, 1, 1 ); ypos++; } else { sliderElevation = NULL; sliderAzimuth = NULL; } /* create the drawing area */ switch (viewMode) { #ifdef HAVE_QTOPENGL case SHADED: lblDraw = new CSailDispGL( this ); sailDispLayout->addWidget( (CSailDispGL*)(lblDraw), 0, xpos ); break; #endif case WIREFRAME: default: lblDraw = new CSailDispLabel( this ); sailDispLayout->addWidget( (CSailDispLabel*)(lblDraw), 0, xpos ); break; } //((QWidget*)lblDraw)->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); // signals and slots connections if (sliderElevation) connect( sliderElevation, SIGNAL( valueChanged(int) ), this, SLOT( slotSlider() ) ); if (sliderAzimuth) connect( sliderAzimuth, SIGNAL( valueChanged(int) ), this, SLOT( slotSlider() ) ); } /** We received a keypress. This is used to zoom in and out. */ void CSailViewer::keyPressEvent ( QKeyEvent * e ) { // zoom in/out by keyboard shortcut if (e->modifiers() & Qt::ControlModifier) { if (e->text()=="+") slotZoomIn(); if (e->text()=="=") slotZoomIn(); if (e->text()=="-") slotZoomOut(); } } /** Changes the displayed object. * * @param obj the new object to be displayed */ void CSailViewer::setObject(const CPanelGroup &obj) { lblDraw->setObject(obj); lblDraw->redraw(); } /** Draws the panel labels */ void CSailViewer::slotLabeling() { // invert the drawLabels flag, then ask for a redraw lblDraw->drawLabels = ! lblDraw->drawLabels; lblDraw->redraw(); } /** Resets the angle and center of the CSailDisp to their default values. */ void CSailViewer::slotResetView() { if (sliderElevation) sliderElevation->setValue(0); if (sliderAzimuth) sliderAzimuth->setValue(0); lblDraw->resetZoomCenter(); lblDraw->redraw(); } /** This event occurs when the user moves one of the view sliders. */ void CSailViewer::slotSlider() { real azimuth= sliderAzimuth ? sliderAzimuth->value() : 0; real elevation = sliderElevation ? sliderElevation->value() : 0; elevationChanged(elevation); azimuthChanged(azimuth); lblDraw->setAngle(azimuth, elevation); lblDraw->redraw(); } /** This event occurs when the user presses the "zoom in" button. */ void CSailViewer::slotZoomIn() { lblDraw->zoomIn(); lblDraw->redraw(); } /** This event occurs when the user presses the "zoom out" button. */ void CSailViewer::slotZoomOut() { lblDraw->zoomOut(); lblDraw->redraw(); } sailcut-1.3.5/src/sailwriter-hand.cpp0000644000175000007640000000434211177775326017517 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "sailwriter-hand.h" #include #include /** Write sail to TXT "hand" format. * * @param sail the panel group to write * @param filename the file to write to */ void CSailHandWriter::write(const CPanelGroup &sail, const QString &filename) const { // open the output file ofstream myOut; myOut.open(QFile::encodeName(filename), ios::out); if (!myOut.is_open()) throw write_error("CSailWriter::write : unable to write to specified file"); // write the name of the sail myOut << sail.title << endl; // TODO : modify code to write actual hand output // // sail is the sail, loop over its panels for (unsigned int i=0; i < sail.size(); i++) { myOut << "===== CPanel : " << i << " ====" << endl; myOut << sail[i].label; myOut << "== CSide : left ==" << endl << sail[i].left; myOut << "== CSide : top ==" << endl << sail[i].top; myOut << "== CSide : right ==" << endl << sail[i].right; myOut << "== CSide : bottom ==" << endl << sail[i].bottom; if (sail[i].hasHems) { myOut << "== CSide : cutLeft ==" << endl << sail[i].cutLeft; myOut << "== CSide : cutTop ==" << endl << sail[i].cutTop; myOut << "== CSide : cutRight ==" << endl << sail[i].cutRight; myOut << "== CSide : cutBottom ==" << endl << sail[i].cutBottom; } } myOut.close(); } sailcut-1.3.5/src/sailwriter-carlson.cpp0000644000175000007640000001134611177775326020250 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "sailwriter-carlson.h" #include #include #include /** Write the draw message * * @param out the output stream * @param ct number of points to be written */ void CSailCarlsonWriter::writeDraw(ofstream &out, unsigned int ct) const { out.setf(ios::left, ios::adjustfield); out<< setw(16) <<"draw"<< ct << CRLF; } /** Write the cut message * * @param out the output stream * @param ct number of points to be written */ void CSailCarlsonWriter::writeCut(ofstream &out, unsigned int ct) const { out.setf(ios::left, ios::adjustfield); out<< setw(16) <<"cut"<< ct << CRLF; } /** Write a point * * @param out the output stream * @param p0 3d point to be written */ void CSailCarlsonWriter::writePoint(ofstream &out, CPoint3d p0) const { real x=0, y=0; x= p0.x(); y= p0.y(); out.setf(ios::left, ios::adjustfield); out << setw(16) << x << y << CRLF; } /** Write panel header to Carlson plotter format * * @param out the output stream * @param panel the number of the panel to write * */ void CSailCarlsonWriter::writePanelHeader(ofstream &out, const CPanel &panel) const { //char identity; //identity = panel.label.name; unsigned int pencolor = panel.label.color; unsigned int htx = panel.label.height; // text height in mm real xoff =0 , yoff = 0, rtx=0; // position and text rotation from x axis. xoff= panel.label.origin.x(); yoff= panel.label.origin.y(); //rtx = atn2( xoff= panel.label.direction.y(), xoff= _sail[panel].label.direction.x()); out << "panel, "<< panel.label.name <<", "< -1; j--) { writePoint( out, right[j] ); } //// panel bottom edge for (j = btm.size() -1; j > -1; j--) { writePoint( out, btm[j] ); } //// header for cut line writeCut ( out, left.size()+top.size()+right.size()+btm.size() ); // left edge for (i = 0; i < left.size(); i++) { writePoint( out, cleft[i] ); } // panel top edge for (i = 0; i < top.size(); i++) { writePoint( out, ctop[i] ); } // panel right edge for (j = right.size() -1; j > - 1; j--) { writePoint( out, cright[j] ); } // panel bottom edge for (j = btm.size() -1; j > -1; j--) { writePoint( out, cbtm[j] ); } } sailcut-1.3.5/src/sailpainter.cpp0000644000175000007640000003104711177775326016737 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include "sailpainter.h" #include "sailcpp/sailcalc.h" #include "sailcpp/panelgroup.h" #define MIN_DISTANCE 5 QPolygonF& operator<<(QPolygonF &poly, const CPoint3d &p) { poly << QPointF(p.x(), - p.y()); return poly; } /** Draws a single panel of a sail. */ void CSailPainter::draw(const CPanel &panel) { CSide::const_iterator iter; CSide::const_reverse_iterator riter; QPolygonF poly; for (iter = panel.bottom.begin(); iter != panel.bottom.end(); iter++) poly << *iter; for (iter = panel.right.begin(); iter != panel.right.end(); iter++) poly << *iter; for (riter = panel.top.rbegin(); riter != panel.top.rend(); riter++) poly << *riter; for (riter = panel.left.rbegin(); riter != panel.left.rend(); riter++) poly << *riter; drawPolyline(poly); if (panel.hasHems) { // switch pen to red QPen oldpen = pen(); setPen(Qt::red); poly = QPolygonF(); for (iter = panel.cutBottom.begin(); iter != panel.cutBottom.end(); iter++) poly << *iter; for (iter = panel.cutRight.begin(); iter != panel.cutRight.end(); iter++) poly << *iter; for (riter = panel.cutTop.rbegin(); riter != panel.cutTop.rend(); riter++) poly << *riter; for (riter = panel.cutLeft.rbegin(); riter != panel.cutLeft.rend(); riter++) poly << *riter; drawPolyline(poly); // reset pen color setPen(oldpen); } } /** Draws the label of a panel. */ void CSailPainter::drawLabels(const CPanel &panel) { drawTextCentered(panel.label.origin, QStringList(QString::fromStdString(panel.label.name))); } /** Draws a complete sail. */ void CSailPainter::draw(const CPanelGroup &sail) { unsigned int i; // set pen color QPen oldpen = pen(); if ( sail.type == HULL ) setPen(Qt::darkGreen); else if ( sail.type == RIG ) setPen(Qt::darkRed); else setPen(Qt::blue); for (i = 0; i < sail.size(); i++) draw(sail[i]); for (i = 0; i < sail.child.size(); i++) draw(sail.child[i]); // reset pen color setPen(oldpen); } /** Print a label with a line to a point. * * @param pDisp the display point coordinates * @param lst a list of lines of text to print * @param angle */ void CSailPainter::drawArrowLabel(const CPoint3d &pDisp, const QStringList &lst, const real angle) { CVector3d textDim = textSize(lst); CPoint3d arrowStart; CPoint3d arrowEnd; CVector3d v = CMatrix::rot3d(2, angle) * CVector3d(1, 0, 0); if (fabs(angle) > .1*PI) arrowEnd = pDisp + real( 2 * fontMetrics().height()) * v; else arrowEnd = pDisp + real( 1.3 * fontMetrics().height()) * v; CVector3d v1 = CMatrix::rot3d(2, PI/6) * v; arrowStart = pDisp + real(.3 * fontMetrics().height()) * v1; // the distance from the arrow end to the center of the text box real dist; if (fabs(v.x() * textDim.y()) < fabs(textDim.x() * v.y())) { // the arrow touches the text box on the top or bottom sides dist = fabs(textDim.y() / (2.0 * sin(angle))); } else { // the arrow touches the text box on the left or right sides dist = fabs(textDim.x() / (2.0 * cos(angle))); } CPoint3d textCenter = arrowEnd + 1.2 * dist * v; drawLine(int(pDisp.x()), -int(pDisp.y()), int(arrowStart.x()), -int(arrowStart.y())); drawLine(int(pDisp.x()), -int(pDisp.y()), int(arrowEnd.x()), -int(arrowEnd.y())); drawTextCentered(textCenter, lst); } /** Draw a label representing a point's coordinates. * * @param point * @param angle */ void CSailPainter::drawCoord(const CPoint3d &point, const real angle) { // build list of lines to print QStringList lst; lst.append(QString("X=") + QString::number(point.x(), 'f', 1)); lst.append(QString("Y=") + QString::number(point.y(), 'f', 1)); drawArrowLabel(point, lst, angle); } /** Draw a label representing a distance. * * @param pDisp the display point coordinates * @param vValue the distances * @param angle */ void CSailPainter::drawDelta(const CPoint3d &pDisp, const CVector3d &vValue, real angle) { // build list of lines to print QStringList lst; lst.append(QString("dX=") + QString::number(vValue.x(), 'f', 1)); lst.append(QString("dY=") + QString::number(vValue.y(), 'f', 1)); drawArrowLabel(pDisp, lst, angle); } /** Draws a cross at a given Point position. */ void CSailPainter::drawCross(const CPoint3d &p, const real size) { drawLine(int(p.x()), -int(p.y()+ .5 * size), int(p.x()), -int(p.y() -.5 * size)); drawLine(int(p.x() + .5 * size), -int(p.y()), int(p.x() - .5 * size), -int(p.y())); } /** Draw text centered at the given position. */ void CSailPainter::drawTextCentered(const CPoint3d &p, const QString &str) { drawTextCentered(p, QStringList(str)); } /** Draw text centered at the given position. */ void CSailPainter::drawTextCentered(const CPoint3d &p, const QStringList &lst) { CVector3d dim = textSize(lst); int i; real xPos = p.x() - 0.5 * dim.x(); real yPos = -p.y() + 0.75 * fontMetrics().height() - 0.5 * dim.y(); for (i = 0; i < lst.size(); i++) { drawText(int(xPos), int(yPos), lst.at(i)); yPos += fontMetrics().height(); } } /** Draw all the sail's panel labels. */ void CSailPainter::drawLabels(const CPanelGroup &sail) { unsigned int i; for (i = 0; i < sail.size(); i++) drawLabels(sail[i]); for (i = 0; i < sail.child.size(); i++) drawLabels(sail.child[i]); } /** Draw the markers for a panel. * * @param currentPanel */ void CSailPainter::drawMarkers(const CPanel ¤tPanel) { unsigned int npt = 0; real dx=0, dy=0; // top fwd corners drawCoord(currentPanel.top.front(), .6*PI); // top middle npt = int ( (currentPanel.top.size() -1) /2 ); if ( CVector3d(currentPanel.top[npt] - currentPanel.top.front()).norm() > MIN_DISTANCE ) { dx = CVector3d( currentPanel.top[npt] - currentPanel.top.front() ) * CVector3d( currentPanel.top.back() - currentPanel.top.front() ).unit(); dy = Distance3d(currentPanel.top[npt] , currentPanel.top.front() , currentPanel.top.back() ); drawDelta(currentPanel.top[npt], CVector3d(dx, dy, 0), .45*PI); } // top aft corner if ( CVector3d(currentPanel.top.back() - currentPanel.top.front()).norm() > MIN_DISTANCE ) drawCoord(currentPanel.top.back(), .25*PI); // right middle npt = (currentPanel.right.size() -1)/2; drawCoord(currentPanel.right[npt], 0.05*PI); // left side if ( CVector3d(currentPanel.left.back() - currentPanel.left.front()).norm() > MIN_DISTANCE ) { // left bottom drawCoord(currentPanel.left.front(), -.7*PI); // left middle npt = (currentPanel.left.size() -1)/2; drawCoord(currentPanel.left[npt], .95*PI); // left upper middle if ( CVector3d(currentPanel.left[npt+1] - currentPanel.left[npt]).norm() > MIN_DISTANCE ) drawCoord(currentPanel.left[npt+1], .8*PI); } // bottom intermediate fwd npt = int ( (currentPanel.bottom.size() -1) /5 ); if ( CVector3d(currentPanel.bottom[npt] - currentPanel.bottom.front()).norm() > MIN_DISTANCE ) { dx = CVector3d( currentPanel.bottom[npt] - currentPanel.bottom.front() ) * CVector3d( currentPanel.bottom.back() - currentPanel.bottom.front() ).unit(); dy = Distance3d( currentPanel.bottom[npt] , currentPanel.bottom.front() , currentPanel.bottom.back() ); drawDelta(currentPanel.bottom[npt], CVector3d(dx, dy, 0), -.65*PI); } // bottom intermediate middle npt = int ( (currentPanel.bottom.size() -1) /2 ); dx = CVector3d( currentPanel.bottom[npt] - currentPanel.bottom.front() ) * CVector3d( currentPanel.bottom.back() - currentPanel.bottom.front() ).unit(); dy = Distance3d( currentPanel.bottom[npt] , currentPanel.bottom.front() , currentPanel.bottom.back() ); drawDelta(currentPanel.bottom[npt], CVector3d(dx, dy, 0), -.55*PI); // bottom intermediate aft npt = int ( (currentPanel.bottom.size() -1) *4/5 ); if ( CVector3d(currentPanel.bottom[npt] - currentPanel.bottom.back()).norm() > MIN_DISTANCE ) { dx = CVector3d( currentPanel.bottom[npt] - currentPanel.bottom.front() ) * CVector3d( currentPanel.bottom.back() - currentPanel.bottom.front() ).unit(); dy = Distance3d( currentPanel.bottom[npt] , currentPanel.bottom.front(), currentPanel.bottom.back() ); drawDelta(currentPanel.bottom[npt], CVector3d(dx, dy, 0), -.4*PI ); } // bottom aft corner drawCoord(currentPanel.bottom.back(), -.25*PI); } /** Draw the markers for a full sail. * * @param sail */ void CSailPainter::drawMarkers(const CPanelGroup &sail) { for (unsigned int i = 0; i < sail.size(); i++) drawMarkers(sail[i]); } /** Set the font size. * * @param size * @param zoom */ void CSailPainter::setFontSize(const real size, const real zoom) { // set the font size for labeling function of zoom QFont myfont = font(); myfont.setPointSizeF(real(zoom * size * window().height()) / device()->height()); setFont(myfont); } /** Set coordinate system to match the logical viewport. * * @param lRect the logical viewport rectangle */ void CSailPainter::setWindow(const CRect3d& lRect) { QPainter::setWindow( int(lRect.min.x()), int(-lRect.max.y()), int(lRect.width()), int(lRect.height()) ); } /** Return text size vector. */ CVector3d CSailPainter::textSize(const QStringList &lst) { CVector3d v(0, 0, 0); int i; // calculate text height and width by scanning the list of lines for (i = 0; i < lst.size(); i++) { real lineWidth = fontMetrics().width(lst.at(i)); if (lineWidth > v.x()) v.x() = lineWidth; v.y() += fontMetrics().height(); } return v; } /** Return the viewport rectangle. */ CRect3d CSailPainter::viewRect() const { return CRect3d(CPoint3d(0,0,0), CPoint3d(viewport().width(), viewport().height())); } /** Construct a new CTextPainter. */ CTextPainter::CTextPainter(QPaintDevice *pd) : CSailPainter(pd) { } /** Reset the text cursors to its initial position. */ void CTextPainter::printReset() { QFontMetrics fm(font()); xPos = fm.width("X") * 4; yPos = fm.height() * 2; } /** Print a header banner (used at the top of a for example). * * @param title the title to print */ void CTextPainter::printHeader(const QString title) { QFontMetrics fm(font()); QString btitle = " " + title + " "; drawText(int(xPos), int(yPos), btitle); // draw box around header drawRect(int(xPos), int(yPos - fm.height()), fm.width(btitle), int(1.5*fm.height())); yPos += 1.5 * fm.height(); } /** Print a data section title. * * @param title the title of the section */ void CTextPainter::printDataSection(const QString title) { QFontMetrics fm(font()); yPos += 0.5 * fm.height(); drawText(int(xPos), int(yPos), title); yPos += 1 * fm.height(); } /** Print a line of data. * * @param title the title for the current line of data * @param data0 first value * @param data1 second value * @param data2 third value */ void CTextPainter::printDataLine(const QString title, const QString data0, const QString data1, const QString data2) { QFontMetrics fm(font()); unsigned int x1 = int(xPos + 2 * fm.width("X")); unsigned int x2 = int(x1 + 26 * fm.width("X")); unsigned int x3 = int(x2 + 13 * fm.width("X")); unsigned int x4 = int(x3 + 13 * fm.width("X")); drawText(x1, int(yPos), title); drawText(x2, int(yPos), data0); drawText(x3, int(yPos), data1); drawText(x4, int(yPos), data2); yPos += .8 * fm.height(); } sailcut-1.3.5/src/formsaildefbase.ui0000644000175000007640000014253111114031150017351 0ustar sharkyjerryweb CFormSailDefBase 0 0 740 550 0 0 740 550 Sail definition 4 5 0 0 Sail dimensions 4 5 QFrame::HLine QFrame::Sunken 2 1 Qt::Horizontal Qt::Horizontal QSizePolicy::MinimumExpanding 20 20 mm Qt::Horizontal QSizePolicy::MinimumExpanding 20 20 Round position mm mm 0 0 0 20 Luff length 0 0 0 20 Foot length mm 0 0 0 20 Leech length mm mm Round position 0 0 0 20 Gaff length Leech round Luff round Foot round % 60 18 Qt::AlignHCenter 60 18 Qt::AlignHCenter 60 18 Qt::AlignHCenter Qt::AlignHCenter Qt::AlignHCenter Qt::AlignHCenter deg % Qt::AlignHCenter Qt::AlignHCenter Gaff round Gaff angle from luff mm mm Qt::AlignHCenter 60 18 Qt::AlignHCenter Qt::AlignHCenter 60 18 QFrame::Box QFrame::Raised Qt::AlignCenter mm 0 20 Diagonal Sail area QFrame::Box QFrame::Raised Qt::AlignCenter m2 0 0 50 false Sail identifier Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 4 5 360 18 Qt::AlignLeading 60 20 Sail name Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 Rig geometry Qt::AlignLeading 4 5 0 0 100 0 Main sail Dihedral angle 0 0 40 0 Jib 0 0 Wing deg Fore triangle hoist I Tack height Luff rake 0 0 0 18 Fore triangle base J 0 0 0 18 Boat length LOA mm mm mm 60 0 Qt::AlignHCenter 0 0 Qt::AlignHCenter Qt::AlignHCenter mm Qt::Horizontal QSizePolicy::MinimumExpanding 20 20 0 0 Qt::AlignHCenter mm 60 0 Qt::AlignHCenter Qt::AlignHCenter mm 0 0 0 18 Distance tack to stem QFrame::VLine QFrame::Sunken Qt::Vertical 0 0 35 18 75 true Cancel 75 true Qt::StrongFocus OK 75 true Compute Layout 4 5 0 0 100 20 Cross cut 0 0 100 20 Twist foot 0 0 100 20 Number of sections 1 28 18 40 25 Qt::AlignHCenter 28 18 40 25 Qt::AlignHCenter 0 0 0 20 Number of radial gores 1 0 0 0 20 Number of luff gores 1 0 0 100 20 Horizontal cut 0 0 100 20 Vertical cut QFrame::VLine QFrame::Sunken 2 Qt::Vertical 100 20 Radial cut 28 18 40 25 Qt::AlignHCenter 0 0 100 20 Mitre cut 0 0 100 20 Mitre cut 2 Qt::Vertical 20 20 0 0 Sail shape 4 5 % % 28 18 40 25 Qt::AlignHCenter 28 18 40 25 Qt::AlignHCenter % 28 18 40 25 Qt::AlignHCenter 0 0 0 20 Top depth 1 0 0 0 20 Mid depth 1 0 0 0 20 Foot depth 1 28 18 40 25 Qt::AlignHCenter 28 18 40 25 Qt::AlignHCenter 0 0 0 20 Twist angle 1 0 0 0 20 Sheeting angle 1 deg deg Cloth 4 5 60 18 80 25 Qt::AlignHCenter 60 18 80 25 Qt::AlignHCenter 0 0 Other hems 1 0 0 Foot hem 1 mm mm mm 60 18 80 25 Qt::AlignHCenter 0 0 0 20 Cloth width 1 0 0 Leech hem 1 0 0 Seam width 1 60 18 80 25 Qt::AlignHCenter 60 18 80 25 Qt::AlignHCenter mm mm Qt::Horizontal QSizePolicy::Expanding 441 27 qPixmapFromMimeSource radioMainSail radioJib txtLOA txtTriangBase txtTriangHoist txtTackDist txtTackHeight txtRake txtSailID txtLuffLen txtFootLen txtLeechLen txtGaffLen txtLuffRound txtFootRound txtLeechRound txtGaffRound txtLuffRoundPos txtLeechRoundPos txtGaffAngle btnCompute radioCross radioTwist radioHorizontal radioVertical radioMitre radioRadial txtSections txtGores txtLuffGores txtTopDepth txtMidDepth txtFootDepth txtTwistAngle txtSheetAngle txtClothWidth txtSeamWidth txtLeechHemWidth txtHemsWidth btnOK btnCancel sailcut-1.3.5/src/formpanelgroup.h0000644000175000007640000000256311177775326017132 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef FORMPANELGROUP_H #define FORMPANELGROUP_H #include "formdocument.h" #include "sailwriter-xml.h" // forward definitions class QTreeView; /** Dialog holding a sail. */ class CFormPanelGroup : public CFormDocumentTmpl { Q_OBJECT public: CFormPanelGroup(CPrefs *myPrefs, QWidget *parent); protected: T_KEYPRESS void setDef(const CPanelGroup& newdef); void setupMainWidget(); protected slots: virtual void languageChange(); protected: /** the tree view */ QTreeView *treeview; }; #endif sailcut-1.3.5/src/sailprinter.cpp0000644000175000007640000002174511200374322016736 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "sailprinter.h" #include #include #include "sailcpp/sailcalc.h" #include "sailcpp/saildef.h" #include "sailcpp/panelgroup.h" #include "sailcpp/sailcalc.h" /** Print the current sail data sheet. * * @param painter * @param fontsize */ void CSailDataPrinter::print(CTextPainter *painter, int, real scale, real fontsize) const { QString text2=" ", text3=" "; painter->setFontSize(fontsize, 1); painter->printReset(); // text of page header QString sailID = QString::fromStdString(saildef.sailID); painter->printHeader(tr("Sailcut CAD data sheet") + (( sailID.length() > 0 ) ? " - " + sailID : " ")); // sail cut and type switch (saildef.sailType ) { case MAINSAIL: text2 = tr("Mainsail"); break; case JIB: text2 = tr("Jib"); break; case WING: text2 = tr("Wing")+" @ " + QString::number(saildef.dihedralDeg) + tr("deg"); break; } painter->printDataLine(tr("Sail type"), text2, " "); text3 = " "; switch ( saildef.sailCut ) { case CROSS: text2 = tr("Cross Cut"); break; case HORIZONTAL: text2 = tr("Horizontal Cut"); break; case RADIAL: text2 = tr("Radial Cut"); text3 = QString::number(saildef.nbSections) + " " + tr("sections") + ", "; text3 += QString::number(saildef.nbGores) + " " + tr("head gores") + ", "; text3 += QString::number(saildef.nbLuffGores) + " " + tr("luff gores") + "."; break; case TWIST: text2 = tr("Twist Foot Cut"); break; case VERTICAL: text2 = tr("Vertical Cut"); break; case MITRE: text2 = tr("Mitre Cut"); break; case MITRE2: text2 = tr("Mitre Cut 2"); break; } painter->printDataLine(tr("Sail layout"), text2, text3); // boat data painter->printDataSection(tr("Rig")); painter->printDataLine(tr("Boat LOA"), QString::number(saildef.LOA), "mm"); painter->printDataLine(tr("Luff rake"), QString::number(saildef.rake), "mm"); painter->printDataLine(tr("Tack position X"), QString::number(saildef.tackX), "mm"); painter->printDataLine(tr("Tack height Y"), QString::number(saildef.tackY), "mm"); painter->printDataLine(tr("Fore triangle hoist I"), QString::number(saildef.foreI), "mm"); painter->printDataLine(tr("Fore triangle base J"), QString::number(saildef.foreJ), "mm"); // sides of the sail painter->printDataSection(tr("Sail dimensions")); painter->printDataLine(tr("Luff length"), QString::number(saildef.luffL), "mm"); painter->printDataLine(tr("Foot length"), QString::number(saildef.footL), "mm"); painter->printDataLine(tr("Leech length"), QString::number(saildef.leechL), "mm"); painter->printDataLine(tr("Gaff length"), QString::number(saildef.gaffL), "mm"); painter->printDataLine(tr("Gaff angle wrt luff"), QString::number(saildef.gaffDeg), "deg"); // shape of sides painter->printDataSection(tr("Shape of edges")); painter->printDataLine(tr("Luff round"), QString::number(saildef.luffR), "mm"); painter->printDataLine(tr("Luff round position"), QString::number(saildef.footRP), "%"); painter->printDataLine(tr("Foot round"), QString::number(saildef.footR), "mm"); painter->printDataLine(tr("Foot round position"), QString::number(saildef.footRP), "%"); painter->printDataLine(tr("Leech round"), QString::number(saildef.leechR), "mm"); painter->printDataLine(tr("Leech round position"), QString::number(saildef.leechRP), "%"); painter->printDataLine(tr("Gaff round"), QString::number(saildef.gaffR), "mm"); painter->printDataLine(tr("Gaff round position"), QString::number(saildef.gaffRP), "%"); // sail setting painter->printDataSection(tr("Sail settings")); painter->printDataLine(tr("Twist angle"), QString::number(saildef.twistDeg), "deg"); painter->printDataLine(tr("Sheeting angle"), QString::number(saildef.sheetDeg), "deg"); // cloth width, seam and hems width painter->printDataSection(tr("Cloth seams and hems")); painter->printDataLine(tr("Cloth width"), QString::number(saildef.clothW), "mm"); painter->printDataLine(tr("Seams width"), QString::number(saildef.seamW), "mm"); painter->printDataLine(tr("Leech hem width"), QString::number(saildef.leechHemW), "mm"); painter->printDataLine(tr("Foot hem width"), QString::number(saildef.footHemW), "mm"); painter->printDataLine(tr("Other hems width"), QString::number(saildef.hemsW), "mm"); // sail mould painter->printDataSection(tr("Sail mould")); painter->printDataLine("", tr("Luff factor"), tr("Depth"), tr("Leech factor")); painter->printDataLine( tr("Top profile"), QString::number( saildef.mould.profile[2].getLuff() ), QString::number( saildef.mould.profile[2].getDepth()*100 )+ "%", QString::number( saildef.mould.profile[2].getLeech()*50)); painter->printDataLine( tr("Mid profile at h = ") + QString::number( saildef.mould.vertpos ) + "%", QString::number( saildef.mould.profile[1].getLuff() ), QString::number( saildef.mould.profile[1].getDepth()*100 )+"%", QString::number( saildef.mould.profile[1].getLeech()*50)); painter->printDataLine( tr("Bottom profile"), QString::number( saildef.mould.profile[0].getLuff() ), QString::number( saildef.mould.profile[0].getDepth()*100 )+"%", QString::number( saildef.mould.profile[0].getLeech()*50)); } /** Print a developed sail panel by panel. * * @param painter * @param page * @param scale * @param fontsize */ void CSailDevelPrinter::print(CTextPainter *painter, int page, real scale, real fontsize) const { // set scale CRect3d logicalRect = CRect3d(CPoint3d(0, 0, 0), CPoint3d(painter->device()->widthMM(), painter->device()->heightMM(), 0)) * (1/scale); // center view logicalRect = logicalRect + (sail.boundingRect().center() - logicalRect.center()); // set coordinate system to match the logical viewport painter->setWindow(logicalRect); painter->setFontSize(fontsize, 1); painter->draw(sail[page]); if (showLabels) painter->drawLabels(sail[page]); painter->drawMarkers(sail[page]); // mark corners of cloth rectangle QPen oldpen = painter->pen(); painter->setPen(Qt::green); CRect3d rp = sail[page].boundingRect(); painter->drawCross(rp.min, painter->fontMetrics().height() ); painter->drawCoord(rp.min, PI ); painter->setPen(oldpen); /* NOTE scale factor on preview screen is not same value as in spinbox * However the correct value equal to spinbox value will be printed */ QString txt = tr("Scale")+" = %1"; txt = txt.arg(scale, 0, 'f', 3); CPoint3d pt = logicalRect.center()+ CVector3d(0,1,0)*0.47*logicalRect.height(); painter->drawTextCentered(pt, txt); } /** Print the drawing of a complete sail. * * @param painter * @param scale * @param fontsize */ void CSailDrawingPrinter::print(CTextPainter *painter, int, real scale, real fontsize) const { // set scale CRect3d logicalRect = CRect3d(CPoint3d(0, 0, 0), CPoint3d(painter->device()->widthMM(), painter->device()->heightMM(), 0)) * (1/scale); // center view logicalRect = logicalRect + (sail.boundingRect().center() - logicalRect.center()); // set coordinate system to match the logical viewport painter->setWindow(logicalRect); painter->setFontSize(fontsize, 1); painter->draw(sail); if (showLabels) painter->drawLabels(sail); /* NOTE scale factor on preview screen is not same value as in spinbox * However the correct value equal to spinbox value will be printed */ QString txt = tr("Scale")+" = %1"; txt = txt.arg(scale, 0, 'f', 3); CPoint3d pt = logicalRect.center()+ CVector3d(0,1,0)*0.47*logicalRect.height(); painter->drawTextCentered(pt, txt); } /** Return the scale needed to fit the developed sail in the given device. * * @param device */ double CSailDrawingPrinter::scaleToFit(QPaintDevice* device) const { Q_ASSERT(device->widthMM() > 0 && device->heightMM() > 0); const real w = device->widthMM(); const real h = device->heightMM(); return 0.8 * w / sail.boundingRect().expandToRatio(w / h).width(); }sailcut-1.3.5/src/sailcpp/0000755000175000007640000000000011457411327015333 5ustar sharkyjerrywebsailcut-1.3.5/src/sailcpp/hulldef.cpp0000644000175000007640000000625211177775326017502 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "hulldef.h" /** Constructs a CHullDef object from the default hull parameters * */ CHullDef::CHullDef() { // default values for hull member variables are set here hullID = "Test hull 1"; DLOA = 7500; // Deck length in millimetre DfwdHeight = 1000; // Deck height forward DaftHeight = 850; // Deck height aft DSlopeA = 6; // Deck side slope in degree from horizontal DBW = 2500; // Deck max beam width DBWPos = 50; // percent of deck length DaftW = 2000; // Deck aft width StemA = 65; // Stem inclination in degree from horizontal TransomA = 80; // Transom inclination BLWL = 7000; // Bottom length in millimetre BfwdHeight = 100; // Bottom chine forward height BaftHeight = 200; // Bottom chine aft height BSlopeA = 12; // Bottom chine plane side slope in degree from horizontal BBW = 2500; // Bottom max beam width BBWPos = 50; // Bottom chine max width position percent of deck length BaftW = 2000; // Bottom aft width BDeadriseA = 12; // Bottom plank dead rise from horizontal BSweepA = 30; // Bottom plank sweep angle in degree BfwdShape = 2; // forward coefficient power of X BaftShape = 3; // aft coefficient power of X NBPlank = 3; AutoPlank = true; TopPlankA = 75; // inclination in degree from horizontal LowPlankA = 30; } /** Assignment operator. * * @param copy the hull definition to copy from * @return CHullDef& */ CHullDef & CHullDef::operator=( const CHullDef © ) { if (© == this) return *this; // else new data to be copied hullID = copy.hullID; DLOA = copy.DLOA; DfwdHeight = copy.DfwdHeight; DaftHeight = copy.DaftHeight; DSlopeA = copy.DSlopeA; DBW = copy.DBW; DBWPos = copy.DBWPos; DaftW = copy.DaftW; StemA = copy.StemA; TransomA = copy.TransomA; BLWL = copy.BLWL; BfwdHeight = copy.BfwdHeight; BaftHeight = copy.BaftHeight; BSlopeA = copy.BSlopeA; BBW = copy.BBW; BBWPos = copy.BBWPos; BaftW = copy.BaftW; BDeadriseA = copy.BDeadriseA; BSweepA = copy.BSweepA; BfwdShape = copy.BfwdShape; BaftShape = copy.BaftShape; NBPlank = copy.NBPlank; AutoPlank = copy.AutoPlank; TopPlankA = copy.TopPlankA; LowPlankA = copy.LowPlankA; return *this; } sailcut-1.3.5/src/sailcpp/saildef.cpp0000644000175000007640000000766511177775326017477 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "saildef.h" /************************************************************************** construction / destruction **************************************************************************/ /** Constructs a CSailDef object from the default sail parameters. * */ CSailDef::CSailDef() { // default values for member variables are set here sailType = MAINSAIL; sailCut = CROSS; sailID = "Test sail 1"; LOA = 7000; // length of hull in millimetre foreJ = 2000; // base of fore triangle foreI = 6500; // height of fore triangle tackX = 1972; // longitudinal distance of main sail tack from stem in millimetre tackY = 750; // height of sail tack above stem in millimetre luffL = 6250; // in millimetre rake = 161; // in millimetre gaffDeg= 45; // in degree gaffL = 2500; // in millimetre leechL = 8220; // in millimetre footL = 4100; // in millimetre luffR = 67; // in millimetre // NOTE: Positive value for mast bend Negative for headstay sag luffRP = 50; // in percent of luff length gaffR = 150; // in millimetre gaffRP = 50; // in percent leechR = -120; // in millimetre // NOTE: Negative value for hollow leech leechRP= 55; // in percent footR = 150; // in millimetre // NOTE: Positive value for foot roach footRP = 50; // in percent clothW = 900; // in millimetre seamW = 13; // in millimetre leechHemW = 40; // in millimetre footHemW = 30; hemsW = 10; // in millimetre twistDeg = 18; // in degree sheetDeg = 0; dihedralDeg = 168; // in degree nbSections = 5; // radial sections nbGores = 5; // radial gores nbLuffGores = 2; // luff gores } /************************************************************************** operators **************************************************************************/ /** Assignment operator * @param copy the sail definition to copy from * @return CSailDef& */ CSailDef & CSailDef::operator=( const CSailDef © ) { if (© == this) return *this; // else sailID = copy.sailID; sailCut = copy.sailCut; sailType = copy.sailType; footL = copy.footL; footR = copy.footR; footRP = copy.footRP; foreI = copy.foreI; foreJ = copy.foreJ; gaffDeg = copy.gaffDeg; gaffL = copy.gaffL; gaffR = copy.gaffR; gaffRP = copy.gaffRP; leechL = copy.leechL; leechR = copy.leechR; leechRP = copy.leechRP; LOA = copy.LOA; luffL = copy.luffL; luffR = copy.luffR; luffRP = copy.luffRP; mould = copy.mould; rake = copy.rake; clothW = copy.clothW; seamW = copy.seamW; leechHemW = copy.leechHemW; footHemW = copy.footHemW; hemsW = copy.hemsW; tackX = copy.tackX; tackY = copy.tackY; twistDeg = copy.twistDeg; sheetDeg = copy.sheetDeg; dihedralDeg = copy.dihedralDeg; nbSections = copy.nbSections; nbGores = copy.nbGores; nbLuffGores = copy.nbLuffGores; return *this; } sailcut-1.3.5/src/sailcpp/boatdef.cpp0000644000175000007640000000221311177775326017454 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "boatdef.h" /** The constructor. */ CBoatDef::CBoatDef() {} /** Produce the combined panel group made up of all the panels */ CPanelGroup CBoatDef::makePanelGroup() const { CPanelGroup output; for (unsigned int i = 0; i < size(); i++) output.child.push_back(at(i) + at(i).origin); return output; } sailcut-1.3.5/src/sailcpp/sailmould.h0000644000175000007640000000532311177775326017513 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SAILMOULD_H #define SAILMOULD_H #include #include using namespace std; /** Class used to work on sail profiles. * * @ingroup SailCpp * @see CSailMould */ class CProfile { public: CProfile( real rDepth=0.05, real rLeech=0.02, real rLuff=1 ); CProfile& operator=( const CProfile & ); real z( real dX ); real slope( real dX ); real camber( real dX ); /** Accessor for the depth */ real getDepth() const { return depth; } /** Accessor for the leech */ real getLeech() const { return kleech; } /** Accessor for the luff */ real getLuff() const { return kluff; } /** Accessor for xmax */ real getMaxPos() const { return xmax; } /** Accessor for zmax */ real getMaxDepth() const { return zmax; } /** Set the depth */ void setDepth( real ndepth ) { *this=CProfile( ndepth, kleech, kluff ); } /** Set the leech */ void setLeech( real nkleech ) { *this=CProfile( depth, nkleech, kluff ); } /** Set the luff */ void setLuff( real nkluff ) { *this=CProfile( depth, kleech, nkluff ); } protected: void calcMax(); // member variables /** depth */ real depth; /** leech coefficient */ real kleech; /** luff coefficient */ real kluff; /** x location of maximum z */ real xmax; /** maximum depth z */ real zmax; }; /** Class used to store the profile for a sail. * * see CFormMould, CProfile */ class CSailMould { public: CSailMould(); CSailMould & operator=( const CSailMould & ); CProfile interpol( const real h ) const; /** the mould's profiles ( top, middle, bottom ) */ // CProfile profile[3]; vector profile; /** vertical position of profile[1] in percent */ int vertpos; }; #endif sailcut-1.3.5/src/sailcpp/boatdef.h0000644000175000007640000000322111177775326017121 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef BOATDEF_H #define BOATDEF_H #include "panelgroup.h" typedef enum { SAILDEF, HULLDEF, RIGDEF, PANELGROUP } enumBoatElementType; /** * A boat element. This class extends a CPanelGroup with information * about how to integrate it into a boat. * * @ingroup SailCpp * @see CBoatDef, CPanelGroup */ class CBoatElement : public CPanelGroup { public: /** the type of file this element was read from (sail, hull definition or 3D panels) */ enumBoatElementType type; /** the name of the file this element was read from */ string filename; /** the origin of the element */ CPoint3d origin; }; /** * A boat definition, which consists of a collection of boat elements. * * @see CBoatElement */ class CBoatDef : public vector { public: CBoatDef(); CPanelGroup makePanelGroup() const; }; #endif sailcut-1.3.5/src/sailcpp/rigdef.cpp0000644000175000007640000000537311177775326017322 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include "rigdef.h" /** Constructs a CRigDef object from the default rig parameters. * */ CRigDef::CRigDef() { // default values for member variables are set here rigID = "Test rig 1"; foreI = 6500; // height of fore triangle foreJ = 2000; // base of fore triangle MHeight = 8000; // mast height MCord = 140; MWidth = 70; MRakeM = 220; MRakeD = atan2(MRakeM, MHeight) * (180 / PI); MBase = foreJ - MRakeM * (foreI/MHeight); MRnd = 110; MRndPos = 50; CSH = 7000; // cap shroud height CSB = 500; LSB = 400; SPNB = 3; // number of spreaders SPH[0] = 0; SPW[0] = CSB; SPH[1] = 1800; SPW[1] = CSB; SPH[2] = 3600; SPW[2] = CSB -50; SPH[3] = 5400; SPW[3] = CSB -200; BAD = 750; // height of boom //MStack = CVector3d(2100, 750 , 0); HAD = 7000; //MShead = CVector3d(2200, 7000, 0); } /** Assignment operator. * * @param copy the rig definition to copy from * @return CRigDef& */ CRigDef & CRigDef::operator=( const CRigDef © ) { if (© == this) return *this; rigID = copy.rigID; foreI = copy.foreI; // height of fore triangle foreJ = copy.foreJ; // base of fore triangle MHeight = copy.MHeight; // mast height MCord = copy.MCord; MWidth = copy.MWidth; MRakeM = copy.MRakeM; MRakeD = copy.MRakeD; MBase = copy.MBase; MRnd = copy.MRnd; // mast round MRndPos = copy.MRndPos; BAD = copy.BAD; HAD = copy.HAD; //MStack = copy.MStack; //MShead = copy.MShead; CSH = copy.CSH; // outer shroud height CSB = copy.CSB; LSB = copy.LSB; SPNB = copy.SPNB; // number of spreaders SPH[0] = copy.SPH[0]; SPH[1] = copy.SPH[1]; SPH[2] = copy.SPH[2]; SPH[3] = copy.SPH[3]; SPW[0] = copy.SPW[0]; SPW[1] = copy.SPW[1]; SPW[2] = copy.SPW[2]; SPW[3] = copy.SPW[3]; // return *this; } sailcut-1.3.5/src/sailcpp/panel.cpp0000644000175000007640000007617711177775326017173 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include "panel.h" #include "sailcalc.h" /***************************************************************************** CPanelLabel class *****************************************************************************/ /** Default constructor */ CPanelLabel::CPanelLabel() : name("new panel"), height(5), color(1), origin(CPoint3d(0,0,0)), direction(CVector3d(0,0,0)) {} /** Copy constructor. */ CPanelLabel::CPanelLabel( const CPanelLabel &lb ) : name(lb.name), height(lb.height), color(lb.color), origin(lb.origin), direction(lb.direction) {} /** Rotates a label around a point. */ CPanelLabel CPanelLabel::rotate( const CPoint3d &p , const CMatrix &m ) const { CPanelLabel lb; lb.name = name; lb.height = height; lb.color = color; lb.origin = p + m*(origin-p); lb.direction = m*direction; return lb; } // operators /** Performs a 3D translation of a label by a given vector. */ CPanelLabel CPanelLabel::operator+ ( const CVector3d &transl ) const { CPanelLabel lb; lb.name = name; lb.height = height; lb.color = color; lb.origin = origin + transl; lb.direction = direction; return lb; } /** Performs an assignment. */ CPanelLabel& CPanelLabel::operator= (const CPanelLabel &lb) { if (&lb == this) return *this; name = lb.name; height = lb.height; color = lb.color; origin = lb.origin; direction = lb.direction; return *this; } /***************************************************************************** CPanel class *****************************************************************************/ /** Default constructor */ CPanel::CPanel() : left(7), right(7), top(21), bottom(21), cutLeft(7), cutRight(7), cutTop(21), cutBottom(21), hasHems(false) {} /** Copy constructor. */ CPanel::CPanel( const CPanel &p ) : label(p.label), left(p.left), right(p.right), top(p.top), bottom(p.bottom), cutLeft(p.cutLeft), cutRight(p.cutRight), cutTop(p.cutTop), cutBottom(p.cutBottom), hasHems(p.hasHems) {} /** This routine returns the smallest 3D box that contains the panel. */ CRect3d CPanel::boundingRect() const { CRect3d rect; const CSide * sarray[4]; if (hasHems) { sarray[0]= &cutTop; sarray[1] = &cutBottom; sarray[2] = &cutLeft; sarray[3] = &cutRight; ; } else { sarray[0]= ⊤ sarray[1] = ⊥ sarray[2] = &left; sarray[3] = &right; ; } rect.min = rect.max = top[0]; for (unsigned int s = 0 ; s < 4 ; s++) { for (unsigned int i = 0 ; i < sarray[s]->size() ; i++) { CPoint3d curPoint = (*sarray[s])[i]; for (unsigned int j = 0 ; j < 3 ; j++) { if ( curPoint[j] < rect.min[j] ) rect.min[j] = curPoint[j]; if ( curPoint[j] > rect.max[j] ) rect.max[j] = curPoint[j]; } } } return rect; } /** This routine returns the arithmetic average of all the edge points of a panel. */ CPoint3d CPanel::centroid() const { const CSide * sarray[4] = { &top, &bottom, &left, &right }; CPoint3d p, prev, sum; unsigned int nbDiffPoints = 0; for (unsigned int s = 0; s < 4; s++) { for (unsigned int i = 0 ; i < sarray[s]->size() ; i++) { p = (*sarray[s])[i]; if (( nbDiffPoints == 0) || ( p != prev ) ) { // count only distinct points prev = p; sum = sum + p; nbDiffPoints++; } } } if ( nbDiffPoints > 0 ) { real coeff = 1.0 / real(nbDiffPoints); sum = sum * coeff; } return sum; } /** This routine returns the development of the panel. * The developed panel will be horizontal with its upper or lower edge * aligned to X axis depending on parameter "align"=ALIGN_TOP or ALIGN_BOTTOM * * @author Robert Laine alias Sailcuter */ CPanel CPanel::develop(enumDevelopAlign align) const { CPanel flatpanel; unsigned int npl = left.size(); // number of right/left points unsigned int npb = bottom.size(); // number of top/bottom points unsigned int i; real a = 0, b = 0, c = 0; // sides of triangle real CC = 0; // angle opposite to side c of triangle CVector3d v; CPoint3d p1, p2, p3, p4; // points for 2 triangular elements of panel to be developed CPoint3d d3(0,0,0); // point after development /** establish origine at bottom point 0 */ flatpanel.bottom[0] = d3; /** establish the baseline as (top point1 - bottom point1) */ p1= bottom[1]; p2 = top[1]; p3 = bottom[0]; a = CVector3d( p2 - p1 ).norm(); // vertical side at point 1 b = CVector3d( p3 - p1 ).norm(); // lower side of triangle c = CVector3d( p2 - p3 ).norm(); CC = Atriangle( a , b , c ); // angle of bottom left corner = opposite to side a d3.x() = b; // set base of first triangle on X axis flatpanel.bottom[1] = d3; // set point at top of baseline d3 = flatpanel.bottom[0] + CMatrix::rot3d( 2 , CC ) * CVector3d( 1 , 0 , 0 ) * c; flatpanel.top[1] = d3; // set baseline vector v = CVector3d( flatpanel.bottom[1] - flatpanel.top[1] ); /** develop left side of panel by triangulation */ for (i = 0 ; i < npl ; i++) { p3 = left[i]; b = CVector3d( p3 - p1 ).norm(); // lower side of triangle c = CVector3d( p3 - p2 ).norm(); // upper side of triangle CC = Atriangle( c , a , b ); // angle of bottom corner = opposite to upper side // transpose corner of triangle in development plane d3 = flatpanel.bottom[1] + CMatrix::rot3d( 2 , -PI+CC ) * v * ( b/v.norm() ); flatpanel.left[i] = d3; } // copy lower left point to bottom[0] to close the corner flatpanel.bottom[0] = flatpanel.left[0]; // copy upper left point to top[0] flatpanel.top[0] = flatpanel.left[npl-1]; /** develop body of panel by zig-zag triangulation */ // reset baseline vector for lower right point v = CVector3d( flatpanel.bottom[1] - flatpanel.top[1] ); c = v.norm(); for (i = 1 ; i < npb-2 ; i++) { // define the 4 points corners of 2 adjacent triangles p1 = bottom[i]; p2 = top[i]; p3 = bottom[i+1]; p4 = top[i+1]; // first triangle = lower right p1-p2-p3 a = c; b = CVector3d( p3 - p1 ).norm(); c = CVector3d( p3 - p2 ).norm(); CC = Atriangle( c , b , a ); // transpose corner of triangle in development plane d3 = flatpanel.bottom[i] + CMatrix::rot3d( 2 , PI-CC )* v * ( b/v.norm() ); flatpanel.bottom[i+1] = d3; // set baseline vector for upper right point v = CVector3d( flatpanel.top[i] - flatpanel.bottom[i+1] ); // second triangle = upper right a = c; b = CVector3d( p4 - p2 ).norm(); c = CVector3d( p4 - p3 ).norm(); CC = Atriangle( c, b, a ); // transpose corner of triangle in development plane d3 = flatpanel.top[i] + CMatrix::rot3d( 2 , -PI+CC )* v * ( b/v.norm() ); flatpanel.top[i+1] = d3; // set next baseline vector v = CVector3d( flatpanel.bottom[i+1] - flatpanel.top[i+1] ); } /** develop right side of panel */ a= c; // set baseline on last 2 points for (i = 0 ; i < npl ; i++) { p1 = right[i]; b = CVector3d(p3-p1).norm(); // lower side of triangle c = CVector3d(p4-p1).norm(); // upper side of triangle CC = Atriangle(c,a,b); // angle of bottom corner = opposite to upper side // transpose corner of triangle in development plane d3 = flatpanel.bottom[npb-2] + CMatrix::rot3d(2,PI-CC)* v *(b/v.norm()); flatpanel.right[i]= d3; } // copy lower right point to bottom end to close the corner flatpanel.bottom[npb-1]= flatpanel.right[0]; // copy upper right point to top end flatpanel.top[npb-1]= flatpanel.right[npl-1]; /** re-align panel with top or bottom edge along X axis */ CC = 0; if (align == ALIGN_TOP) { // align on top edge p1 = flatpanel.top[0]; p2 = flatpanel.top[npb-1]; CC = atan2( (p2.y()-p1.y()) , (p2.x()-p1.x()) ); } else { // align on bottom edge p1 = flatpanel.bottom[0]; p2 = flatpanel.bottom[npb-1]; CC = atan2( (p2.y()-p1.y()) , (p2.x()-p1.x()) ); } // align panel flatpanel = flatpanel.rotate(CPoint3d(0,0,0), CMatrix::rot3d(2,-CC) ); flatpanel.hasHems = false; /** frame the developed panel to be X>0 and Y>0 */ flatpanel = flatpanel.reframe(LOW_LEFT); return flatpanel; } /** Place the label at the center of the panel */ void CPanel::placeLabel() { label.origin = centroid(); } /** Reframe a panel such that the most left/right/top/bottom * point is at coordinate X or Y =0 */ CPanel CPanel::reframe(enumAlign align) const { unsigned int npl = left.size(); // number of right/left points unsigned int npb = bottom.size(); // number of top/bottom points unsigned int i; real xm=11111, ym=11111; switch ( align ) { case LEFT: if ( hasHems == true ) { for (i = 0 ; i < npl ; i++) { if ( cutRight[i].x() > xm ) xm = cutRight[i].x(); } } else { for (i = 0 ; i < npl ; i++) { if ( right[i].x() > xm ) xm = right[i].x(); } } case BOTTOM: if ( hasHems == true ) { for (i = 0 ; i < npb ; i++) { if ( cutBottom[i].y() < ym ) ym = cutBottom[i].y(); } } else { for (i = 0; i < npb; i++) { if ( bottom[i].y() < ym ) ym = bottom[i].y(); } } case LOW_LEFT: if ( hasHems == true ) { for (i = 0; i < npl; i++) { if ( cutLeft[i].x() < xm ) xm = cutLeft[i].x(); } for (i = 0; i < npb; i++) { if ( cutBottom[i].y() < ym ) ym = cutBottom[i].y(); } } else { for (i = 0; i < npl; i++) { if ( left[i].x() < xm ) xm = left[i].x(); } for (i = 0; i < npb; i++) { if ( bottom[i].y() < ym ) ym = bottom[i].y(); } } } return (*this + CVector3d( -xm , -ym , 0 )); } /** Add the cloth for stitching to the 4 edges of the panel. * This create the panel to be cut (outside the basic panel) * lw = width to be added on left side * tw = width to be added on top side * rw = width to be added on right side * bw = width to be added on bottom side * * @author Robert Laine alias Sailcuter */ void CPanel::addHems( const real &lw, const real &tw, const real &rw, const real &bw ) { add6Hems( lw, lw, tw, rw, rw, bw ); } /** Add the cloth for stitching to the 6 edges of the panel. * This create the panel to be cut (outside the basic panel) * lolW, hilW = width to be added on lo-hi left side * topW = width to be added on top side * lorW, hirW = width to be added on lo-hi right side * botW = width to be added on bottom side * * @author Robert Laine alias Sailcuter */ void CPanel::add6Hems( const real &lolW, const real &hilW, const real &topW, const real &hirW, const real &lorW, const real &botW ) { hasHems = true; CPoint3d pt(0,0,0); CVector3d v(1,0,0); CVector3d v0(1,0,0); CSubSpace Line1, Line2; // two lines real minSize = 0.1; // used to avoid computation near zero width side unsigned int i = 0; unsigned int npl = left.size(), npb = bottom.size(); ///* compute basic edges vectors */ CVector3d v1 = CVector3d( left[npl/2] - left[0] ); // if ( v1.norm() == 0 ) cout << "CPanel::add6Hems v1=0 " << endl; CVector3d v2 = CVector3d( left[npl-1] - left[npl/2] ); // if ( v2.norm() == 0 ) cout << "CPanel::add6Hems v2=0 " << endl; CVector3d v3 = CVector3d( right[npl/2] - right[0] ); // if ( v3.norm() == 0 ) cout << "CPanel::add6Hems v3=0 " << endl; CVector3d v4 = CVector3d( right[npl-1] - right[npl/2] ); // if ( v4.norm() == 0 ) cout << "CPanel::add6Hems v4=0 " << endl; CVector3d v5 = CVector3d( bottom[npb-1] - bottom[0] ); // if ( v5.norm() == 0 ) cout << "CPanel::add6Hems v5=0 " << endl; CVector3d v6 = CVector3d( bottom[npb-1] - bottom[npb-2] ); // if ( v6.norm() == 0 ) cout << "CPanel::add6Hems v6=0 " << endl; CVector3d v7 = CVector3d( top[npb-1] - top[0] ); // if ( v7.norm() == 0 ) cout << "CPanel::add6Hems v7=0 " << endl; CVector3d v8 = CVector3d( top[npb-1] - top[npb-2] ); // if ( v8.norm() == 0 ) cout << "CPanel::add6Hems v8=0 " << endl <= EPS ) { // width of material is not too small for (i = 0 ; i < npb ; i++) { if ( i == 0 ) v = CVector3d( bottom[1] - bottom[0] ); else v = CVector3d( bottom[i] - bottom[i-1] ); if ( v.norm() <= EPS ) v = v5; cutBottom[i] = bottom[i] + CMatrix::rot3d(2,-PI/2) * v.unit() *botW; } } ///* Move the basic top edge points to the cut line */ if ( topW >= EPS ) { // width of material is not too small for (i = 0 ; i < npb ; i++) { if ( i == 0 ) v = CVector3d( top[1] - top[0] ); else v = CVector3d( top[i] - top[i-1] ); if ( v.norm() <= minSize ) v = v7; cutTop[i] = top[i] + CMatrix::rot3d(2,PI/2) * v.unit() *topW; } } ///* Move the basic left edge points to the cut line */ if ( v1.norm() >= minSize ) { // lower left side is not a point for (i = 0 ; i < npl/2 ; i++) { if ( i == 0 ) v = CVector3d( left[1] - left[0] ); else v = CVector3d( left[i] - left[i-1] ); cutLeft[i] = left[i] + CMatrix::rot3d( 2 , PI/2) * v.unit() * lolW; } v0 = CVector3d( left[npl/2] - left[npl/2 -1] ); Line1 = CSubSpace3d::line( cutLeft[npl/2 -1] , v0 ); if ( v2.norm() >= minSize ) { // upper left side is not a point for (i = npl/2 +1 ; i < npl ; i++) { v2 = CVector3d( left[i] - left[i-1] ); cutLeft[i] = left[i] + CMatrix::rot3d( 2 , PI/2) * v2.unit() * hilW; if ( i == npl/2 +1 ) { // compute mid side break point Line2 = CSubSpace3d::line( cutLeft[i] , v2 ); if ( Line1.intersect(Line2).getdim() == 0 ) cutLeft[npl/2] = Line1.intersect(Line2).getp(); // else cout << "CPanel::add6Hems = no mid left side intersection point" << endl; // check adjacent points relative to mid side point if ( (CVector3d(cutLeft[npl/2] - cutLeft[npl/2 -1]) * v0) <= 0 ) cutLeft[npl/2 -1] = cutLeft[npl/2 -2]; if ( (CVector3d(cutLeft[npl/2 +1] - cutLeft[npl/2]) * v0) <= 0 ) cutLeft[npl/2 +1] = cutLeft[npl/2 +2]; } else { // compute other uppr lft points cutLeft[i] = left[i] + CMatrix::rot3d( 2 , PI/2) * v2.unit() * hilW; // check position relative to mid side point if ( (CVector3d(cutLeft[i] - cutLeft[npl/2]) * v0) <= 0 ) cutLeft[npl/2 +1] = cutLeft[npl/2]; } } } else { // upper left side is a point but not lower side v2 = CVector3d( left[npl/2] - left[npl/2 -1] ); for (i = npl/2 +1 ; i < npl ; i++) cutLeft[i] = left[i] + CMatrix::rot3d( 2 , PI/2) * v2.unit() * hilW; } } else if ( v2.norm() >= minSize ) { // only lower left side is a point v1 = CVector3d( left[npl/2 +1] - left[npl/2] ); for (i = 0 ; i < npl/2 ; i++) cutLeft[i] = left[i] + CMatrix::rot3d( 2 , PI/2) * v1.unit() * lolW; for (i = npl/2 +1 ; i < npl -1 ; i++) { v2 = CVector3d( left[i] - left[i-1] ); cutLeft[i] = left[i] + CMatrix::rot3d( 2 , PI/2) * v2.unit() * hilW; } } else { // complete left side is a point if ( botW == 0 ) v = -v5; // extend the bottom edge else v = -( v5.unit() + v7.unit() ); // extend in bissectrice top-bottom for (i = 0 ; i< npl ; i++) cutLeft[i] = left[i] + v.unit() * lolW; // if (v.norm() == 0) cout << "CPanel::add6Hems 10 v=0 v5="<< v5.norm()<< " v7="<< v7.norm()<< endl; v1 = CMatrix::rot3d(2,-PI/2) * v.unit(); v2 = v1; } ///* Move the basic right edge points to the cut line */ if ( v3.norm() >= minSize ) { // lower right side is not a point for (i = 0 ; i < npl/2 ; i++) { if ( i == 0 ) { if ( right[i+1] != right[i] ) v = CVector3d( right[i+1] - right[i] ); else if ( right[i+2] != right[i] ) v = CVector3d( right[i+2] - right[i] ); else if ( right[i+3] != right[i] ) v = CVector3d( right[i+3] - right[i] ); else if ( right[i+4] != right[i] ) v = CVector3d( right[i+4] - right[i] ); } else { if ( right[i] != right[i-1] ) v = CVector3d( right[i] - right[i-1] ); else if ( right[i+1] != right[i] ) v = CVector3d( right[i+1] - right[i] ); else if ( right[i+2] != right[i] ) v = CVector3d( right[i+2] - right[i] ); } cutRight[i] = right[i] + CMatrix::rot3d( 2 , -PI/2) * v.unit() * lorW; } v0 = CVector3d( right[npl/2] - right[npl/2 -1] ); Line1 = CSubSpace3d::line( cutRight[npl/2 -1] , v0 ); if ( v4.norm() >= minSize ) { // upper right side is not a point for (i = npl/2 +1 ; i < npl ; i++) { v4 = CVector3d( right[i] - right[i-1] ); cutRight[i] = right[i] + CMatrix::rot3d( 2 , -PI/2) * v4.unit() * hirW; if ( i == npl/2 +1 ) { // compute mid side break point Line2 = CSubSpace3d::line( cutRight[i] , v4 ); if (Line1.intersect(Line2).getdim() == 0) cutRight[npl/2] = Line1.intersect(Line2).getp(); // else cout << "CPanel::add6Hems = no mid right side intersection point" << endl; // check adjacent points relative to mid side point if ( (CVector3d(cutRight[npl/2] - cutRight[npl/2 -1]) * v0) <= 0 ) cutRight[npl/2 -1] = cutRight[npl/2 -2]; if ( (CVector3d(cutRight[npl/2 +1] - cutRight[npl/2]) * v0) <= 0 ) cutRight[npl/2 +1] = cutRight[npl/2 +2]; } else { // compute other points cutRight[i] = right[i] + CMatrix::rot3d( 2 , -PI/2) * v4.unit() * hirW; } } } else { // upper right side is a point but not lower side v4 = CVector3d( right[npl-1] - right[npl-2] ); for (i = npl/2 +1 ; i < npl ; i++) cutRight[i] = right[i] + CMatrix::rot3d( 2 , -PI/2) * v4.unit() * hirW; } } else if ( v4.norm() >= minSize ) { // only lower right side is a point v3 = v4; //v3 = CVector3d( right[npl-2] - right[npl/2] ); /* if (v3.norm() == 0) { cout << "AddHems v3=0 : about to crash 13" << endl; for (i = 0 ; i < npl ; i++) cout << "pt " << i << " xyz= " << right[i] << endl; } */ for (i = 0 ; i < npl/2 ; i++) cutRight[i] = right[i] + CMatrix::rot3d( 2 , -PI/2) * v4.unit() * lorW; for (i = npl/2 +1 ; i < npl ; i++) { cutRight[i] = right[i] + CMatrix::rot3d( 2 , -PI/2) * v4.unit() * hirW; } v4 = CVector3d( right[npl-1] - right[npl-2] ); // if (v4.norm() == 0) cout << "AddHems v4=0 about to crash 13" << endl; } else { // complete right side is a point if ( botW == 0 ) v = v6; else v = ( v6 + v8 ); if (v.norm() == 0) cout << "CPanel::add6Hems v=v6=0 or v=v6+v8=0 about to crash 14" << endl; for (i = 0 ; i< npl ; i++) cutRight[i] = right[i] + v.unit() * lorW; v3 = CMatrix::rot3d(2 , PI/2) * v.unit(); v4 = v3; } ///* Rejoining the 4 corners of the cut panel */ // cout << "Rejoining 4 corners" << endl; /// lower left if (v5.norm() == 0) cout << "CPanel::add6Hems v5=0 about to crash 15" << endl; Line1 = CSubSpace3d::line( cutBottom[0] , v5 ); if (v6.norm() == 0) cout << "CPanel::add6Hems v6=0 about to crash 16" << endl; Line2 = CSubSpace3d::line( cutLeft[0] , v1 ); if (Line1.intersect(Line2).getdim() == 0) pt = Line1.intersect(Line2).getp(); else throw panel_error("CPanel::add6Hems = in rejoining lower corner, no left intersection point"); /* Adjust the lower left point [0] to be at intersection */ cutBottom[0] = pt; cutLeft[0] = pt; /* Scan the first few points of the cut edges to make sure * that they are not on the wrong side of the point pt */ for (i = 0 ; i < npl/2 ; i++) { if ( (CVector3d( cutLeft[i] - pt) * v1 ) <= 0 ) cutLeft[i] = pt; if ( (CVector3d( cutBottom[i] - pt) * v5 ) <= 0 ) cutBottom[i] = pt; } /// lower right Line1 = CSubSpace3d::line( cutBottom[npb-1] , v6 ); Line2 = CSubSpace3d::line( cutRight[0] , v3 ); if (Line1.intersect(Line2).getdim() == 0) pt = Line1.intersect(Line2).getp(); else throw panel_error("CPanel::add6Hems = in rejoining lower corner, no right intersection point"); /* Adjust the lower left point [0] to be at intersection */ cutBottom[npb-1] = pt; cutRight[0] = pt; /* Scan the first few points of the cut edges to make sure * that they are not on the wrong side of the point pt */ for (i = 1 ; i < npl/2 ; i++) { if ( (CVector3d( cutRight[i] - pt) * v3 ) <= 0 ) cutRight[i] = pt; if ( (CVector3d( cutBottom[npb-1-i] - pt) * v6 ) >= 0 ) cutBottom[npb-1-i] = pt; } /// upper left Line1 = CSubSpace3d::line( cutTop[0] , v7 ); Line2 = CSubSpace3d::line( cutLeft[npl-1] , v2 ); if (Line1.intersect(Line2).getdim() == 0) pt = Line1.intersect(Line2).getp(); else throw panel_error("Cpanel.add6Hems = in rejoining upper corner, no left intersection point"); /* Adjust the upper left point to be at intersection */ cutTop[0] = pt; cutLeft[npl-1] = pt; /* Scan the first few points of the cut edges to make sure * that they are not on the wrong side of the intersect point pt */ for (i = 0 ; i < npl/2 ; i++) { if ( (CVector3d( cutLeft[npl -1 -i] - pt) * v2 ) >= 0 ) cutLeft[npl-1-i] = pt; if ( (CVector3d( cutTop[i] - pt) * v7 ) <= 0 ) cutTop[i] = pt; } /// upper right Line1 = CSubSpace3d::line( cutTop[npb-1] , v8 ); Line2 = CSubSpace3d::line( cutRight[npl-1] , v4 ); if (Line1.intersect(Line2).getdim() == 0) pt = Line1.intersect(Line2).getp(); else throw panel_error ("Cpanel.add6Hems = in rejoining upper corner, no right intersection point"); /* Adjust the upper right point to be at intersection */ cutTop[npb-1] = pt; cutRight[npl-1] = pt; /* Scan the first few points of the cut edges to make sure * that they are not on the wrong side of the intersect point pt */ // cout << "CPanel::add6Hems scan for overlap " << endl; for (i = 1 ; i < npl/2 ; i++) { if ( (CVector3d( cutRight[npl-1-i] - pt) * v4 ) >= 0 ) cutRight[npl-1-i] = pt; if ( (CVector3d(cutTop[npb-1-i] - pt) * v6) >= 0 ) cutTop[npb-1-i] = pt; } // cout << "End CPanel::add6Hems" << endl << endl; } /// end add6Hems //////////////////////////////////////// /** Rotates a panel around a point. * p = centre of rotation * m = rotation matrix */ CPanel CPanel::rotate( const CPoint3d &p, const CMatrix &m ) const { CPanel panel; panel.hasHems = hasHems; panel.label = label.rotate( p , m ); panel.left = left.rotate( p , m ); panel.right = right.rotate( p , m ); panel.top = top.rotate( p , m ); panel.bottom = bottom.rotate( p , m ); panel.cutLeft = cutLeft.rotate( p , m ); panel.cutRight = cutRight.rotate( p , m ); panel.cutTop = cutTop.rotate( p , m ); panel.cutBottom = cutBottom.rotate( p , m ); return panel; } // operators /** Performs a 3D translation of the panel by a given vector. */ CPanel CPanel::operator+ (const CVector3d &transl) const { CPanel ret; ret.hasHems = hasHems; ret.label = label+transl; ret.left = left + transl; ret.right = right + transl; ret.top = top + transl; ret.bottom = bottom + transl; ret.cutLeft = cutLeft + transl; ret.cutRight = cutRight + transl; ret.cutTop = cutTop + transl; ret.cutBottom = cutBottom + transl; return ret; } /** Performs an assignment. */ CPanel& CPanel::operator= (const CPanel &p) { if (&p == this) return *this; label = p.label; left = p.left; right = p.right; top = p.top; bottom = p.bottom; cutLeft = p.cutLeft; cutRight = p.cutRight; cutTop = p.cutTop; cutBottom = p.cutBottom; hasHems = p.hasHems; return *this; } /***************************************************************************** CSide class *****************************************************************************/ /** Constructs a side with a given number of points. */ CSide::CSide( unsigned int nbpoints /* = 1 */) { resize(nbpoints); } /** Makes the side a straight line between two points. */ void CSide::fill( const CPoint3d &p1 , const CPoint3d &p2 ) { switch ( size() ) { case 0: return; case 1: at(0) = p1; return; } for (unsigned int i = 0 ; i < size() ; i++) at(i) = p1 + ( p2 - p1 ) * ( real(i) / (size() -1) ); } /** Makes the side a two-segment line between three points. */ void CSide::fill( const CPoint3d &p1 , const CPoint3d &p2 , const CPoint3d &p3 ) { switch ( size() ) { case 0: return; case 1: at(0) = p1; return; case 2: at(0) = p1; at(1) = p3; return; } unsigned int n1 = int( size() ) / 2; for (unsigned int i = 0 ; i < size() ; i++) { if ( i <= n1 ) at(i) = p1 + (p2 - p1) * (real(i) / n1); else at(i) = p2 + (p3 - p2) * (real(i - n1) / (size() -n1 -1) ); } } /** Rotates a CSide around a point. */ CSide CSide::rotate( const CPoint3d &p, const CMatrix &m ) const { CSide s( size() ); for (unsigned int i = 0 ; i < size() ; i++) s[i] = p + m * (at(i) - p); return s; } // operators /** Performs a 3D translation of the side by a given vector. */ CSide CSide::operator+ (const CVector3d &transl) const { CSide ret( size() ); for (unsigned int i = 0 ; i < size() ; i++) ret[i] = transl + at(i); return ret; } /********************************************* Global functions *********************************************/ /** Outputs a CPanel to a stream. * exemple: cout << panel[i]; */ ostream& operator<<(ostream& o , const CPanel &p) { o << p.label; o << "== CSide : left ==" << endl << p.left; o << "== CSide : top ==" << endl << p.top; o << "== CSide : right ==" << endl << p.right; o << "== CSide : bottom ==" << endl << p.bottom; if ( p.hasHems ) { o << "== CSide : cutLeft ==" << endl << p.cutLeft; o << "== CSide : cutTop ==" << endl << p.cutTop; o << "== CSide : cutRight ==" << endl << p.cutRight; o << "== CSide : cutBottom ==" << endl << p.cutBottom; } return o; } /** Outputs a CPanelLabel to a stream. * exemple: cout << panel[i].label; */ ostream& operator<< (ostream &o , const CPanelLabel &lb) { o << "== CPanelLabel : name ==" << endl << lb.name << endl; o << "== CPanelLabel : height ==" << endl << lb.height << endl; o << "== CPanelLabel : color ==" << endl << lb.color << endl; o << "== CPanelLabel : origin ==" << endl << lb.origin << endl; o << "== CPanelLabel : direction ==" << endl << lb.direction << endl; return o; } /** Outputs a CSide to a stream. * exemple: cout << panel[i].left; */ ostream& operator<< (ostream &out, const CSide &s) { for (unsigned int i = 0 ; i < s.size() ; i++) { out << "#" << i << "\t" << s[i] << endl; } return out; } sailcut-1.3.5/src/sailcpp/rigworker.cpp0000644000175000007640000002144311177775326020071 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include "rigworker.h" #include "sailcalc.h" /** The constructor does some preliminary calculations to set * internal variables. */ CRigWorker::CRigWorker(const CRigDef &d) : CRigDef(d) { } /** Creates the rig. * * @return CPanelGroup */ CPanelGroup CRigWorker::makeRig() const { CPoint3d p0, p1, p2; CVector3d v1(1, 0, 0), vm(0, 1, 0); CPanel mast1, mast2; // half mast section unsigned int i = 0, j = 0; //unsigned int npl = mast1.left.size(); // number of right/left points unsigned int npb = mast1.bottom.size(); // number of bottom/top points real h = 0, cord; CPanelGroup rig; rig.type = RIG; // used for color scheme in saildispgl rig.title = rigID; // add mast // cord = MCord / 2; vm = CVector3d(MRakeM, MHeight, 0); //straight mast cord vector // base section of mast h = 0; p0 = mastCenter ( h ); for (j = 0 ; j < npb ; j++) { v1 = CVector3d(cos(PI * real(j) /(npb-1)), 0, sin(PI * real(j) /(npb-1) ) ); v1.z() = v1.z() * MWidth / MCord; mast1.top[j] = p0 + cord * v1; mast2.top[j] = p0 - cord *v1; } // all other sections of mast for (i = 1; i <= 20; i++) { // top of current section h = real(i) * MHeight / 20; p2 = mastCenter ( h ); for (j = 0 ; j < npb ; j++) { v1 = CVector3d(cos(PI * real(j) /(npb-1)), 0, sin(PI * real(j) /(npb-1) ) ); v1.z() = v1.z() * MWidth / MCord; mast1.bottom[j] = mast1.top[j]; mast2.bottom[j] = mast2.top[j]; mast1.top[j] = p2 + cord *v1; mast2.top[j] = p2 - cord * v1; } mast1.left.fill(mast1.bottom[0],mast1.top[0]); mast1.right.fill(mast1.bottom[npb-1],mast1.top[npb-1]); mast2.left.fill(mast2.bottom[0],mast2.top[0]); mast2.right.fill(mast2.bottom[npb-1],mast2.top[npb-1]); // add mast panel to rig rig.push_back(mast1); rig.push_back(mast2); } // add spreaders // cord = MCord / 6; for (i = 1; i <= SPNB; i++) { p2 = mastCenter ( SPH[i] ); //printf ("P2 x= %f, y= %f \n", p2.x(), p2.y()); for (j = 0 ; j < npb ; j++) { v1 = CVector3d(cos(PI * real(j) /(npb-1)), sin(PI * real(j) /(npb-1) ), 0 ); v1.y() = v1.y() / 2; mast1.bottom[j] = p2 + cord * v1; mast1.bottom[j] = mast1.bottom[j] + CVector3d(0 , 0 , -SPW[i]); mast1.top[j] = mast1.bottom[j] + CVector3d(0 , 0 , 2*SPW[i]); } mast1.left.fill(mast1.bottom[0],mast1.top[0]); mast1.right.fill(mast1.bottom[npb-1],mast1.top[npb-1]); rig.push_back(mast1); // make symetrical by rotation mast1 = mast1.rotate(p2 , CMatrix::rot3d(2, PI) ); rig.push_back(mast1); } // add shrouds // cord = MCord /12; // half width of shroud p1 = p0; // mast base centre if (SPNB >= 1) // add inner shroud if at least one spreader { for (i = 1; i <= SPNB; i++) { p2 = mastCenter( SPH[i] ); // make +Z shroud mast1.bottom[0] = p1 + cord * CVector3d (1,0,0) + CVector3d(0,0,SPW[i-1]); mast1.top[0] = p1 - cord * CVector3d(1,0,0) + CVector3d(0,0,SPW[i-1]); mast1.bottom[npb-1] = p2 + cord * CVector3d (1,0,0) + CVector3d(0,0,MWidth/2); mast1.top[npb-1] = p2 - cord * CVector3d(1,0,0) + CVector3d(0,0,MWidth/2); mast1.bottom.fill(mast1.bottom[0],mast1.bottom[npb-1]); mast1.top.fill(mast1.top[0],mast1.top[npb-1]); mast1.left.fill(mast1.bottom[0],mast1.top[0]); mast1.right.fill(mast1.bottom[npb-1],mast1.top[npb-1]); // make -Z symetrical mast2.bottom[0] = p1 + cord * CVector3d (1,0,0) - CVector3d(0,0,SPW[i-1]); mast2.top[0] = p1 - cord * CVector3d(1,0,0) - CVector3d(0,0,SPW[i-1]); mast2.bottom[npb-1] = p2 + cord * CVector3d (1,0,0) - CVector3d(0,0,MWidth/2); mast2.top[npb-1] = p2 - cord * CVector3d(1,0,0) - CVector3d(0,0,MWidth/2); mast2.bottom.fill(mast2.bottom[0],mast2.bottom[npb-1]); mast2.top.fill(mast2.top[0],mast2.top[npb-1]); mast2.left.fill(mast2.bottom[0],mast2.top[0]); mast2.right.fill(mast2.bottom[npb-1],mast2.top[npb-1]); // add inner shrouds to rig rig.push_back(mast1); rig.push_back(mast2); // add outer shroud to tip of spreaders // make +Z shroud mast1.bottom[0] = p1 + cord * CVector3d (1,0,0) + CVector3d(0,0,SPW[i-1]); mast1.top[0] = p1 - cord * CVector3d(1,0,0) + CVector3d(0,0,SPW[i-1]); mast1.bottom[npb-1] = p2 + cord * CVector3d (1,0,0) + CVector3d(0,0,SPW[i]); mast1.top[npb-1] = p2 - cord * CVector3d(1,0,0) + CVector3d(0,0,SPW[i]); mast1.bottom.fill(mast1.bottom[0],mast1.bottom[npb-1]); mast1.top.fill(mast1.top[0],mast1.top[npb-1]); mast1.left.fill(mast1.bottom[0],mast1.top[0]); mast1.right.fill(mast1.bottom[npb-1],mast1.top[npb-1]); // make -Z symetrical mast2.bottom[0] = p1 + cord * CVector3d (1,0,0) - CVector3d(0,0,SPW[i-1]); mast2.top[0] = p1 - cord * CVector3d(1,0,0) - CVector3d(0,0,SPW[i-1]); mast2.bottom[npb-1] = p2 + cord * CVector3d (1,0,0) - CVector3d(0,0,SPW[i]); mast2.top[npb-1] = p2 - cord * CVector3d(1,0,0) - CVector3d(0,0,SPW[i]); mast2.bottom.fill(mast2.bottom[0],mast2.bottom[npb-1]); mast2.top.fill(mast2.top[0],mast2.top[npb-1]); mast2.left.fill(mast2.bottom[0],mast2.top[0]); mast2.right.fill(mast2.bottom[npb-1],mast2.top[npb-1]); // add outer shroud to rig rig.push_back(mast1); rig.push_back(mast2); p1 = p2; } } // add cap shroud bit which is also the only shroud if n==0 p2 = mastCenter( CSH ); // make +Z mast1.bottom[0] = p1 + cord * CVector3d (1,0,0) + CVector3d(0,0,SPW[i-1]); mast1.top[0] = p1 - cord * CVector3d(1,0,0) + CVector3d(0,0,SPW[i-1]); mast1.bottom[npb-1] = p2 + cord * CVector3d (1,0,0) + CVector3d(0,0,MWidth/2); mast1.top[npb-1] = p2 - cord * CVector3d(1,0,0) + CVector3d(0,0,MWidth/2); mast1.bottom.fill(mast1.bottom[0],mast1.bottom[npb-1]); mast1.top.fill(mast1.top[0],mast1.top[npb-1]); mast1.left.fill(mast1.bottom[0],mast1.top[0]); mast1.right.fill(mast1.bottom[npb-1],mast1.top[npb-1]); // make -Z symetrical mast2.bottom[0] = p1 + cord * CVector3d (1,0,0) - CVector3d(0,0,SPW[i-1]); mast2.top[0] = p1 - cord * CVector3d(1,0,0) - CVector3d(0,0,SPW[i-1]); mast2.bottom[npb-1] = p2 + cord * CVector3d (1,0,0) - CVector3d(0,0,MWidth/2); mast2.top[npb-1] = p2 - cord * CVector3d(1,0,0) - CVector3d(0,0,MWidth/2); mast2.bottom.fill(mast2.bottom[0],mast2.bottom[npb-1]); mast2.top.fill(mast2.top[0],mast2.top[npb-1]); mast2.left.fill(mast2.bottom[0],mast2.top[0]); mast2.right.fill(mast2.bottom[npb-1],mast2.top[npb-1]); // add cap shroud to rig rig.push_back(mast1); rig.push_back(mast2); // return rig; } /** Routine for computing the 3D point at center of mast * at a given height * * @author Robert Laine */ CPoint3d CRigWorker::mastCenter( const real &HM ) const { CPoint3d p0, p1; CVector3d vm; real cord = MCord / 2; //straight mast cord vector vm = CVector3d(MRakeM, MHeight, 0); // upright mast base centre point p0 = CPoint3d (foreJ + cord , 0 , 0); // base centre point offset by rake p0 = p0 + CVector3d(-(MRakeM * foreI / MHeight), 0, 0); real h = HM / MHeight; if ( h < 0 ) h = 0; if ( h > 1 ) h = 1; // round real round = MRnd * RoundP( h, MRndPos ); // printf ("i= %d, MRnd = %f \n", i, round); // straight mast section center point p1 = p0 + HM * vm.unit(); // displace center point of section by round p1 = p1 + CMatrix::rot3d( 2, PI/2 ) * vm.unit() * round; // return p1; } sailcut-1.3.5/src/sailcpp/sailtest.cpp0000644000175000007640000000476511177775326017716 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include "hullworker.h" #include "sailworker.h" static struct timeval start_time; static void tic() { gettimeofday(&start_time, NULL); } static double toc() { struct timeval end; gettimeofday(&end, NULL); return (end.tv_sec - start_time.tv_sec) + (double)(end.tv_usec - start_time.tv_usec) / 1000000; } int main() { const size_t iters = 100; CMatrix rot = CMatrix::rot3d(1, PI/3); // output CPanelGroup output, output2; CRect3d rect; printf("Running %i iterations for each operation\n", int(iters)); // SAIL OPERATIONS CSailDef saildef; CSailWorker sailworker(saildef); // sail creation tic(); for (size_t i = 0; i < iters; i++) output = sailworker.makeSail(); printf("Sail creation: %lf iterations/sec\n", double(iters) / toc()); // sail rotation tic(); for (size_t i = 0; i < iters; i++) output2 = output.rotate(1, rot); printf("Sail rotation: %lf iterations/sec\n", double(iters) / toc()); // bounding rectangle calculation tic(); for (size_t i = 0; i < iters; i++) rect = output2.boundingRect(); printf("Sail bounding rect: %lf iterations/sec\n", double(iters) / toc()); // HULL OPERATIONS CHullDef hulldef; CHullWorker hullworker(hulldef); // hull creation tic(); for (size_t i = 0; i < iters; i++) output = hullworker.makeHull(); printf("Hull creation: %lf iterations/sec\n", double(iters) / toc()); // hull rotation tic(); for (size_t i = 0; i < iters; i++) output2 = output.rotate(1, rot); printf("Hull rotation: %lf iterations/sec\n", double(iters) / toc()); return 0; } sailcut-1.3.5/src/sailcpp/sailcalc.h0000644000175000007640000000334511177775326017277 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SAILCALC_H #define SAILCALC_H #include /** @defgroup SailCpp Sail computations library * * SailCpp is the library that performs all the plotting calculations. * It provides classes for generating sails, hulls, rigs and boats from * their definitions. */ /* computation of parabolic edge round */ real RoundP( const real &x, const int &p ); /* computation of angle of triangle defined by 3 sides */ real Atriangle( const real &a, const real &b, const real &c ); /* computation of angle of triangle defined by 3 points */ real Atriangle3d ( const CPoint3d &pta, const CPoint3d &ptb, const CPoint3d &ptc ); /* computation of distance of a point to a line defined by 2 points */ real Distance3d(const CPoint3d &pta, const CPoint3d &ptb, const CPoint3d &ptc); /* logical viewport calculation */ CRect3d calcLRect(const CRect3d &viewRect, const CRect3d &objRect, const CPoint3d center, real zoom ); #endif sailcut-1.3.5/src/sailcpp/hulldef.h0000644000175000007640000000550411177775326017146 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef HULLDEF_H #define HULLDEF_H #include #include /** This class holds the parameters that define a hull * and their default values. * * @ingroup SailCpp * @see CHullWorker */ class CHullDef { public: CHullDef(); CHullDef & operator=( const CHullDef & ); /** hull ID name */ string hullID; //deck /** deck Length in millimeter */ real DLOA; /** deck forward height in millimeter */ real DfwdHeight; /** deck aft height in millimeter */ real DaftHeight; /** deck side slope angle in degree from horizontal */ int DSlopeA; /** deck max beam width in millimeter */ real DBW; /** deck aft width in millimeter */ real DaftW; /** deck max beam width position in percent of deck length */ int DBWPos; /** stem angle in degree from horizontal */ int StemA; /** transom angle in degree from horizontal */ int TransomA; // bottom data /** bottom chine Length in millimeter */ real BLWL; /** bottom forward height in millimeter */ real BfwdHeight; /** bottom aft height in millimeter */ real BaftHeight; /** bottom chine side slope angle in degree from horizontal */ int BSlopeA; /** bottom chine max beam width in millimeter */ real BBW; /** bottom chine aft width in millimeter */ real BaftW; /** bottom chine max beam width position in percent of deck length */ int BBWPos; /** bottom plank dead rise angle in degree from horizontal */ int BDeadriseA; /** bottom sweep angle in degree forward of transverse axis */ int BSweepA; /** Lower chine forward shape */ int BfwdShape; //* Lower chine aft shape */ int BaftShape; //planking data /** Number of side planks */ int NBPlank; /** auto planking chech box */ bool AutoPlank; /** top plank angle in degree from horizontal */ int TopPlankA; /** lower plank angle in degree from horizontal */ int LowPlankA; // }; #endif sailcut-1.3.5/src/sailcpp/CMakeLists.txt0000644000175000007640000000047311160512024020062 0ustar sharkyjerrywebinclude_directories(${CMAKE_SOURCE_DIR}/src) add_library(sailcpp STATIC boatdef.cpp hulldef.cpp hullworker.cpp panel.cpp panelgroup.cpp rigdef.cpp rigworker.cpp sailcalc.cpp saildef.cpp sailmould.cpp sailworker.cpp) add_executable(sailtest sailtest.cpp) target_link_libraries(sailtest sailcpp geocpp) sailcut-1.3.5/src/sailcpp/hullworker.cpp0000644000175000007640000002257111177775326020257 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include "hullworker.h" /** The constructor does some preliminary calculations * to set internal variables, compute chine and deck plane, * and compute lower chine plane panel. * * @author Robert Laine */ CHullWorker::CHullWorker(const CHullDef &d) : CHullDef(d) { ptFwdChine = CPoint3d( 0 , BfwdHeight , 0 ); ptAftChine = CPoint3d( BLWL , BaftHeight , BaftW/2 ); // transom end of lower chine xBmax = real(DBWPos) * BLWL / 100; ptFwdDeck = CPoint3d( 0 , DfwdHeight , 0 ); CPoint3d p1, p2; /** compute the vertical central plane */ CVector3d v1 = CVector3d( 1 , 0 , 0 ); CVector3d v2 = CVector3d( 0 , 1 , 0 ); planeCentral = CSubSpace3d::plane( ptFwdChine , v1 , v2 ); /** compute the lower Chine plane */ // vector v1 is sideway tilt of chine v1 = CVector3d( 0 , -sin(real(BSlopeA)*PI/180) , cos(real(BSlopeA)*PI/180) ); // vector v2 is fore-aft slope of chine v2 = CVector3d( ptAftChine - ptFwdChine ); planeLowChine = CSubSpace3d::plane( ptFwdChine , v1 , v2 ); /** compute the Deck plane */ // vector v1 is sideway tilt of deck v1 = CVector3d( 0 , -sin(real(DSlopeA)*PI/180) , cos(real(DSlopeA)*PI/180) ); // vector v2 is fore-aft slope of deck v2 = CVector3d( BLWL , DaftHeight-DfwdHeight , 0 ); planeDeck = CSubSpace3d::plane( ptFwdDeck , v1 , v2 ); /** compute the transom plane */ // vector v1 is parallel to Z axis = perpendicular to central plane v1 = CVector3d( 0 , 0 , 1 ); // vector v2 is in inclined transom plane v2 = CVector3d( cos(real(TransomA) * PI/180) , sin(real(TransomA) * PI/180) , 0 ); planeTransom = CSubSpace3d::plane( ptAftChine , v1 , v2 ); // compute intersection line between lower chine plane and transom CSubSpace Line1 = planeLowChine.intersect(planeTransom); // compute intersection point of line1 with central plane located at aft width if (Line1.getdim() == 1) { CSubSpace Intersection2 = Line1.intersect(planeCentral); if (Intersection2.getdim() == 0) ptCentreChine = Intersection2.getp(); else throw "ERROR in hullworker constructor = no low chine aft point"; } else throw "ERROR in hullworker constructor = intersection chine plane and transom is not a line"; /** lay lower chine plane decking panel */ unsigned int j; //unsigned int npl = deck.right.size(); // number of right/left points unsigned int npb = chine.bottom.size(); // number of bottom/top points chine.top.fill( ptFwdChine , ptCentreChine ); // top edge at centre line chine.bottom.fill( ptFwdChine , ptAftChine ); // bottom edge at chine chine.left.fill( ptFwdChine , ptFwdChine ); // stem is left edge chine.right.fill( ptAftChine , ptCentreChine ); // transom is right edge for (j=0 ; j < npb ; j++) { // move bottom point to chine p1 = chine.bottom[j]; p2 = ptLowChine( p1.x() ); chine.bottom[j] = p2; } } /** Return the 3D point at the Lower chine edge function of x * x is the absisse of the point along the centre line * The chine edge curve is a power curve on either side of the maximum beam point * * @author Robert Laine */ CPoint3d CHullWorker::ptLowChine( const real &x ) { real x1 = 0 , y = 0 , z = 0; /* compute width z function of x */ if (x > xBmax) { // aft part of chine x1 = (x - xBmax) / (ptAftChine.x() - xBmax); z = (.5 * BBW) + .5* (BaftW - BBW)* pow(x1 , BaftShape); } else { // fwd part of chine x1 = 1 - ( x / xBmax ); z = (.5 * BBW) * (1- pow(x1 , BfwdShape) ); } /* create point with x input, y=0 and z computed */ CPoint3d pt = CPoint3d ( x , y , z ); /* compute y by projecting pt vertically on the chine plane */ CSubSpace Intersection1 = planeLowChine.intersect(CSubSpace3d::line(pt, CVector3d(0, 1, 0) ) ); if (Intersection1.getdim() == 0 ) pt = Intersection1.getp(); else throw "ERROR in CHullWorker::ptLowChine intersection is not a point"; return pt; } /** Return the 3D point at the keel line function of x * x is the absisse of the corresponding point on the lower chine * * @author Robert Laine */ CPoint3d CHullWorker::ptKeel( const real &x ) { CPoint3d pt; CVector3d v1; // create point with x input and y, z computed pt = ptLowChine ( x ); /* Ruling vector with deadrise and sweep. */ v1 = CVector3d( tan( real(BSweepA) * PI/180) , tan( real(BDeadriseA) * PI/180) , 1 ); /* Project pt on central plane, get intersection with the ruling line passing through point pt. */ CSubSpace Intersection1 = planeCentral.intersect( CSubSpace3d::line(pt, v1)); if (Intersection1.getdim() == 0 ) pt = Intersection1.getp(); else throw "ERROR in CHullWorker::ptKeel intersection is not a point"; return pt; } /** Creates the basic hull with bottom, deck * and only one top side plank. * * @return CPanelGroup * @author Robert Laine */ CPanelGroup CHullWorker::makeHull() //const { CPanel deck1, deck2, plank1, plank2; unsigned int j; real x; CPoint3d pt , pt0 , p1 , p2 , p3 , p4; CVector3d v1 , v2 , v3 , vg; // create the hull type CPanelGroup hull; hull.type = HULL; // used for color scheme in saildispgl hull.title = hullID; /** NOTE: the code will have to be changed to build the full hull from the lower chine */ unsigned int npl = chine.right.size(); // number of right/left points unsigned int npb = chine.bottom.size(); // number of bottom/top points deck1 = chine; plank1 = chine; /** Lay the two bottom panels with top edge at centre plane */ for (j = 0 ; j < npb ; j++) { plank1.bottom[j] = chine.bottom[j]; x = chine.bottom[j].x(); plank1.top[j] = ptKeel( x ); } plank1.left.fill( plank1.bottom[0] , plank1.top[0] ); // NOTE: bottom right edge incomplete until code is added to cope with sweep plank1.right.fill( plank1.bottom[npb-1] , plank1.top[npb-1] ); plank2 = plank1; for (j = 0 ; j < npb ; j++) { // mirror points plank2.top[j].z() = -plank1.top[j].z(); plank2.bottom[j].z() = -plank1.bottom[j].z(); } for (j = 0 ; j < npl ; j++) { // mirror points plank2.left[j].z() = -plank1.left[j].z(); plank2.right[j].z() = -plank1.right[j].z(); } // add the bottom planks to the hull hull.push_back(plank1); hull.push_back(plank2); /** Lay a single top side plank on each side with bottom at chine */ v1 = CVector3d( -cos(real(StemA) * PI/180) , sin(real(TopPlankA) * PI/180) , cos(real(TopPlankA) * PI/180) ); for (j = 0 ; j < npb ; j++) { plank1.bottom[j] = chine.bottom[j]; CSubSpace Intersection1 = planeDeck.intersect( CSubSpace3d::line(plank1.bottom[j], v1)); if (Intersection1.getdim() == 0) { // compute the vector vg which generate the side surface p1 = Intersection1.getp(); vg = CVector3d(p1 - pt); } else throw "ERROR in CHullWorker::makeHull() Intersection 1 top side is not a point" ; plank1.top[j] = p1; } plank1.left.fill( plank1.bottom[0] , plank1.top[0] ); plank1.right.fill( plank1.bottom[npb-1] , plank1.top[npb-1] ); plank2 = plank1; for (j = 0 ; j < npb ; j++) { // mirror points plank2.top[j].z() = -plank1.top[j].z(); plank2.bottom[j].z() = -plank1.bottom[j].z(); } for (j = 0 ; j < npl ; j++) { // mirror points plank2.left[j].z() = -plank1.left[j].z(); plank2.right[j].z() = -plank1.right[j].z(); } // add the top side planks to the hull hull.push_back(plank1); hull.push_back(plank2); /** Lay the two deck planks */ for (j = 0 ; j < npb ; j++) { deck1.bottom[j] = plank1.top[j]; deck1.top[j] = deck1.bottom[j]; deck1.top[j].z() = 0; deck1.left.fill(deck1.bottom[0] , deck1.top[0]); deck1.right.fill(deck1.bottom[npb-1] , deck1.top[npb-1]); deck2.bottom[j] = plank2.top[j]; deck2.top[j] = deck2.bottom[j]; deck2.top[j].z() = 0; deck2.left.fill(deck2.bottom[0] , deck2.top[0]); deck2.right.fill(deck2.bottom[npb-1] , deck2.top[npb-1]); } // add the deck planks to the hull hull.push_back(deck1); hull.push_back(deck2); // translate the hull such that stem is at x=O, y=0, z=0 /// j = hull.size() -1; pt0 = hull[j].top[0]; for (j = 0 ; j < hull.size() ; j++) { hull[j] = hull[j] + CVector3d(-pt0); } return hull; } sailcut-1.3.5/src/sailcpp/rigdef.h0000644000175000007640000000416111177775326016761 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef RIGDEF_H #define RIGDEF_H #include #include /** This class holds the parameters that define a rig * and the default parameters. * * @ingroup SailCpp * @see CRigWorker */ class CRigDef { public: CRigDef(); CRigDef & operator=( const CRigDef & ); /** rig ID name */ string rigID; /** fore triangle hoist*/ real foreI; /** fore triangle base*/ real foreJ; ////// mast ///// /** mast height */ real MHeight; /** mast cord */ real MCord; /** mast width */ real MWidth; /** mast rake */ real MRakeM; /** mast rake angle in degree */ real MRakeD; /** mast base distance to stem */ real MBase; /** mast round */ real MRnd; /** mast round position */ int MRndPos; /** Boom height above deck */ real BAD; /** mainsail tack */ CVector3d MStack; /** mainsail head height above deck */ real HAD; /** mainsail head point */ CVector3d MShead; ////// spreaders and shrouds ///// /** cap shroud height */ real CSH; /** cap shroud base */ real CSB; /** lower shroud base */ real LSB; /** number of spreaders */ unsigned int SPNB; /** spreader height */ real SPH[4]; /** spreader width */ real SPW[4]; }; #endif sailcut-1.3.5/src/sailcpp/hullworker.h0000644000175000007640000000436211177775326017722 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef HULLWORKER_H #define HULLWORKER_H #include "panelgroup.h" #include "hulldef.h" /** The CHullWorker class does all the hull-related calculations. * It is used to create the hull from its definition. * * @ingroup SailCpp * @see CHullDef, CPanelGroup */ class CHullWorker : public CHullDef { public: CHullWorker(const CHullDef &d); CPanelGroup makeHull(); protected: /** abciss of Bmax point on chine */ real xBmax; /** function compute a point on Deck edge */ CPoint3d ptDeck( const real &x ); /** function compute a point on Keel line */ CPoint3d ptKeel( const real &x); /** function compute a point on chine n */ CPoint3d ptChine(const int &n, const real &x ); /** function compute a point on lower Chine */ CPoint3d ptLowChine( const real &x ); /** central plane longitudinal X-Y */ CSubSpace planeCentral; /** deck plane */ CSubSpace planeDeck; /** transom plane */ CSubSpace planeTransom; /** chine plane */ CSubSpace planeChine[5]; CSubSpace planeLowChine; /** Lower Chine point at stem/centre line */ CPoint3d ptFwdChine; /** Lower Chine point at transom/edge */ CPoint3d ptAftChine; /** Lower Chine point at transom/centre line */ CPoint3d ptCentreChine; /** Deck Forward Point */ CPoint3d ptFwdDeck; /** basic panels */ CPanel deck; CPanel plank; CPanel chine; }; #endif sailcut-1.3.5/src/sailcpp/sailcalc.cpp0000644000175000007640000001171411212305567017613 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include "sailcalc.h" /** Compute the normalised roach or round of a sail side * Return the value of the normalised round at position X * X is the relative position of the point along the straight edge * P is the position of the maximum round in percent of the edge length * The curve is a parabola on either side of the point P * * @author Robert Laine alias Sailcuter */ real RoundP( const real &x, const int &p ) { /* X (0..1) is the relative position of the point along the edge P is the integer position of the maximum round in percent of the edge length The curve is a parabola on either side of the point P Return Y (0..1) is the value of the normalised round at position X */ real p1 = .5, x1 = 0 , y = 0; p1 = real(p) / 100; // limit the position of maximum round of side if (p1 < 0.01) p1=0.01; if (p1 > 0.99) p1=0.99; // limit the computation of the domain 0..1 if ( x <= 0 ) y = 0; else if ( x >= 1 ) y = 0; else if ( x > p1 ) { x1 = (x - p1) / (1 - p1); y = 1 - x1 * x1; } else { x1 = 1 - x / p1; y = 1 - (x1 * x1); } // return y; } /** Compute the angle of a 2D triangle from its 3 sides length * a, b and c are the length of the sides of the triangle * Return the angle in radian opposite to side a of the triangle * * @author Robert Laine alias Sailcuter */ real Atriangle( const real &a, real const &b, const real &c ) { real per = 0, AA = 0; per = (a + b + c) / 2; if ( per <= EPS ) AA = PI /3; else if ( fabs(per-a) <= EPS ) AA = PI; else AA = 2 * atan (sqrt ((per-b) * (per-c) / (per * (per-a)) ) ) ; // return AA; } /** Compute the angle of a 3D triangle. * The triangle is defined by 3d points pta, ptb, ptc * Return the angle AA in radian at point pta of the triangle * * @author Robert Laine alias Sailcuter */ real Atriangle3d ( const CPoint3d &pta, const CPoint3d &ptb, const CPoint3d &ptc ) { real AA=0, a=0, b=0, c=0, per=0; a = sqrt( (ptc.x()-ptb.x()) * (ptc.x()-ptb.x()) +(ptc.y()-ptb.y()) * (ptc.y()-ptb.y()) +(ptc.z()-ptb.z()) * (ptc.z()-ptb.z()) ); b = sqrt( (pta.x()-ptc.x()) * (pta.x()-ptc.x()) +(pta.y()-ptc.y()) * (pta.y()-ptc.y()) +(pta.z()-ptc.z()) * (pta.z()-ptc.z()) ); c = sqrt( (ptb.x()-pta.x()) * (ptb.x()-pta.x()) +(ptb.y()-pta.y()) * (ptb.y()-pta.y()) +(ptb.z()-pta.z()) * (ptb.z()-pta.z()) ); per =(a + b + c)/2; if ( per <= EPS ) AA = PI /3; else if ( fabs(per-a) <= EPS ) AA = PI; else AA = 2 * atan (sqrt ((per-b) * (per-c) / (per * (per-a)) ) ) ; // return AA; } /** Compute the distance from a point pta * to the line defined by the 2 points ptb and ptc * The two points ptb and ptc defining the baseline also define * its positive direction from point ptb toward point ptc. * It is assumed that the 3 points pta, ptb, ptc define a plane * not far from the X-Y plane. * The sign of d is positive if the point pta * is left of the line ptb=>ptc * The sign of d is negative if pta is right of the line. * * @author Robert Laine alias Sailcuter */ real Distance3d(const CPoint3d &pta, const CPoint3d &ptb, const CPoint3d &ptc) { real d; CVector3d Va = CVector3d( pta - ptb ); CVector3d Vb = CVector3d( ptc - ptb).unit(); CVector3d Vd = Vb.cross(Va); d = Vd.norm(); if ( Vd.z() < 0 ) d = -d; // return d; } /** Calculates logical viewport rectangle to match * the ratio of the device viewport. */ CRect3d calcLRect(const CRect3d& viewRect, const CRect3d& objRect, const CPoint3d center, real zoom ) { CRect3d lRect; // avoid division by zero errors if ((viewRect.height() == 0) || (viewRect.width() == 0)) { lRect.min = center; lRect.max = center; return lRect; } // set correct aspect ratio lRect = objRect.expandToRatio(viewRect.width() / viewRect.height()); // recenter view return (lRect + (center - lRect.center())) * (1/zoom); } sailcut-1.3.5/src/sailcpp/panelgroup.cpp0000644000175000007640000001017411177775326020231 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include "panelgroup.h" /** Constructs a panel group with the specified number of panels. */ CPanelGroup::CPanelGroup( unsigned int nbpanels /* = 0 */) { resize(nbpanels); type = SAIL; } /** Copy constructor. */ CPanelGroup::CPanelGroup( const CPanelGroup& s ) : vector(s) { title = s.title; child = s.child; type = s.type; } /** Construct a panel group from a single panel. */ CPanelGroup::CPanelGroup( const CPanel& p ) { resize(1); at(0) = p; } /** Returns the smallest 3D box that contains all the panels. */ CRect3d CPanelGroup::boundingRect() const { CRect3d rect; bool rect_filled = 0; unsigned int i; if ( size() > 0 ) { rect = at(0).boundingRect(); for (i = 1; i < size(); i++) rect = rect.join( at(i).boundingRect() ); rect_filled = 1; } if ( child.size() > 0 ) { if (rect_filled) rect = rect.join( child[0].boundingRect() ); else rect = child[0].boundingRect(); for (i = 1; i < child.size(); i++) rect = rect.join( child[i].boundingRect() ); } return rect; } /** Positions each of the display Sail's panels' label. The font size is defined in void CSailDispLabel::drawLabels() */ void CPanelGroup::placeLabels() { for (unsigned int i = 0; i < size(); i++) { char buffer[32]; sprintf(buffer, "%i", i); at(i).label.name = buffer; at(i).placeLabel(); } } /** Positions each of the plotted Sail's panels' label. The font size is default 5 mm */ void CPanelGroup::plotLabels() { for (unsigned int i = 0; i < size(); i++) { char buffer[32]; sprintf(buffer, "%i", i); at(i).label.name = buffer; at(i).label.height = 5; // position the label and orientate it at(i).label.origin = at(i).bottom[2]; at(i).label.direction = CVector3d( at(i).bottom[3]- at(i).bottom[2]); } } /** Rotates a sail around a point. */ CPanelGroup CPanelGroup::rotate( const CPoint3d &p, const CMatrix &m ) const { unsigned int i; CPanelGroup ret = *this; for (i = 0; i < size(); i++) ret[i] = at(i).rotate(p,m); for (i = 0; i < child.size(); i++) ret.child[i] = child[i].rotate(p,m); return ret; } /** Performs an assignment. */ CPanelGroup& CPanelGroup::operator=(const CPanelGroup& s) { if (&s == this) return *this; this->vector::operator=(s); title = s.title; child = s.child; type = s.type; return *this; } /** Performs a 3D translation of the sail by a given vector. */ CPanelGroup CPanelGroup::operator+(const CVector3d& transl) const { unsigned int i; CPanelGroup ret = *this; for (i = 0; i < size(); i++) ret[i] = ret[i] + transl; for (i = 0; i < child.size(); i++) ret.child[i] = ret.child[i] + transl; return ret; } /** Outputs a CPanelGroup to a stream. */ ostream& operator<<(ostream &o, const CPanelGroup &s) { unsigned int i; for (i = 0; i < s.size(); i++) { o << "===== CPanel : " << i << " ====" << endl; o << s[i] << endl; } for (i = 0; i < s.child.size(); i++) { o << "===== child CPanelGroup : " << i << " ====" << endl; o << s.child[i] << endl; } return o; } sailcut-1.3.5/src/sailcpp/panelgroup.h0000644000175000007640000000405211177775326017674 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef PANELGROUP_H #define PANELGROUP_H #include "panel.h" enum enumPanelGroupType { SAIL, RIG, HULL }; /** This class holds a collection of panels, for instance to represent * a 3D or a developed sail. * * @ingroup SailCpp */ class CPanelGroup : public vector { public: CPanelGroup( unsigned int = 0 ); CPanelGroup( const CPanelGroup& ); CPanelGroup( const CPanel& ); /** title of this panel group */ string title; /** children of this group */ vector child; /** type of boat object */ enumPanelGroupType type; // member functions public: /** rectangle containing all panels */ CRect3d boundingRect() const; /** function to place the labels on a displayed panel group */ void placeLabels(); /** function to place the labels on a plotted panel group */ void plotLabels(); /** function for rotating all panels */ CPanelGroup rotate( const CPoint3d &, const CMatrix & ) const; // operators CPanelGroup& operator=( const CPanelGroup &); CPanelGroup operator+ (const CVector3d &) const; friend ostream& operator<< (ostream &, const CPanelGroup &); }; // global functions ostream& operator<< (ostream &, const CPanelGroup &); #endif sailcut-1.3.5/src/sailcpp/sailmould.cpp0000644000175000007640000002511111177775326020043 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include "sailmould.h" using namespace std; /************************************************************************** CProfile class *************************************************************************** construction / destruction **************************************************************************/ /** The constructor. * * @param rDepth * @param rLeech * @param rLuff */ CProfile::CProfile( real rDepth, real rLeech, real rLuff) : depth(rDepth), kleech(rLeech), kluff(rLuff) { calcMax(); } /************************************************************************** operators **************************************************************************/ /** Assignment operator. */ CProfile& CProfile::operator=( const CProfile © ) { if (© == this) return *this; depth = copy.depth; kleech = copy.kleech; kluff = copy.kluff; xmax = copy.xmax; zmax = copy.zmax; return *this; } /************************************************************************** member functions **************************************************************************/ /** Compute the depth of the profile at a point located at dX along the cord @author Robert Laine */ real CProfile::z( real dX ) { /* dX = absiss 0 to 1 along the cord of the profile kluff = luff shape factor kleech = leech shape factor depth = depth of the profile profile function is obtained by integrating twice the equation d2z/dx2 = kd * (-a*(1-X)^kluff - kleech * X) giving first the slope of the profile dz/dx = kd * (a*(1-X)^(kluff+1)/(kluff+1) - kleech/2 * X^2 + c) and finally the depth of the profile z = kd * (-a*(1-X)^(kluff+2)/((kluff+1)*(kluff+2)) - kleech/6 * X^3 +c * X + b) b and c are such that z=0 for X=0 AND X=1 kd is such that the value of z at dX=xmax (max depth) is equal to depth */ real a=1, b=0, c=0, kd=1, z=.1 ; a = 1 + kluff/4 ;// specific to family of profile b = a / ((kluff+2)*(kluff+1)); c = kleech/6 - b; if (dX <= 0) /* point is outside profile range */ z = 0; else if (dX >= 1) /* point is outside profile range */ z = 0; else { /* point is inside profile range */ /* compute depth normalisation coefficient */ kd = depth / zmax; /* compute real depth z at point dX */ z = kd * (-a*pow(1-dX,kluff+2)/((kluff+1)*(kluff+2)) - kleech/6 * pow(dX,3) + c * dX + b ); } return z; } /** Compute the slope of the profile at a point located at dX along the cord @author Robert Laine */ real CProfile::slope( real dX ) { /* dX = absiss 0 to 1 along the cord of the profile kluff = luff shape factor kleech = leech shape factor depth = depth of the profile profile function is obtained by integrating twice the equation d2z/dx2 = kd * (-a*(1-X)^kluff - kleech * X) giving first the slope of the profile dz/dx = kd * (a*(1-X)^(kluff+1)/(kluff+1) - kleech/2 * X^2 + c) and finally the depth of the profile z = kd * (-a*(1-X)^(kluff+2)/((kluff+1)*(kluff+2)) - kleech/6 * X^3 +c * X + b) b and c are such that z=0 for X=0 AND X=1 kd is such that the value of z at dX=xmax (max depth) is equal to depth */ real a=1, b=0, c=0, kd=1, dz=.1 , x=0; a = 1 + kluff/4 ;// specific to family of profile b = a / ((kluff+2)*(kluff+1)); c = kleech/6 - b; x = dX; if (x <= 0) /* point is outside profile range */ x = 0; else if (x >= 1) /* point is outside profile range */ x = 1; /* compute depth normalisation coefficient */ kd = depth / zmax; /* compute real slope dz at point dX */ dz = kd * ( a * pow(1-x,kluff+1) / (kluff+1) - kleech/2 * pow(x,2) + c ); return dz; } /** Compute the camber of the profile at a point located at dX along the cord @author Robert Laine */ real CProfile::camber( real dX ) { /* dX = absiss 0 to 1 along the cord of the profile kluff = luff shape factor kleech = leech shape factor depth = depth of the profile profile function is obtained by integrating twice the equation d2z/dx2 = kd * (-a*(1-X)^kluff - kleech * X) giving first the slope of the profile dz/dx = kd * (a*(1-X)^(kluff+1)/(kluff+1) - kleech/2 * X^2 + c) and finally the depth of the profile z = kd * (-a*(1-X)^(kluff+2)/((kluff+1)*(kluff+2)) - kleech/6 * X^3 +c * X + b) b and c are such that z=0 for X=0 AND X=1 kd is such that the value of z at dX=xmax (max depth) is equal to depth */ real a=1, b=0, c=0, kd=1, dz=.1 , d2z=.1, camb=.1, x=0; a = 1 + kluff/4 ;// specific to family of profile b = a / ((kluff+2)*(kluff+1)); c = kleech/6 - b; x = dX; if (x <= 0) /* point is outside profile range */ x = 0; else if (x >= 1) /* point is outside profile range */ x = 1; /* compute depth normalisation coefficient */ kd = depth / zmax; /* compute real slope dz at point dX */ dz = kd * ( a * pow(1-x,kluff+1) / (kluff+1) - kleech/2 * pow(x,2) + c ); /* compute real d2z at point dX */ d2z = kd * ( -a * pow(1-x,kluff) - kleech * x ); /* compute real camber at point dX */ camb = d2z / pow((1 + pow(dz,2)),1.5); return camb; } /** Compute the absiss x of the point of maximum depth of a profile * * @author Robert Laine */ void CProfile::calcMax() { /* kluff = luff shape factor kleech = leech shape factor Profile function is defined by integrating twice the equation d2z/dx2 = kd * (-a*(1-x)^kluff - kleech * x) dz/dx = kd * (a*(1-x)^(kluff+1)/(kluff+1) - kleech/2 * x^2 + c) z = kd * (-a*(1-x)^(kluff+2)/((kluff+1)*(kluff+2)) - kleech/6 * x^3 +c * x + b) b and c are such that z=0 for x=0 AND x=1 */ real a=1, b=0, c=0; a = 1 + kluff/4; b = a / ((kluff+2)*(kluff+1)); c = kleech/6 - b; /* scan from 16% point until slope become <= 0 */ real x=.16, dz=.1, dz1=.1; int n=16, step=8; while ((dz>0) && (n<60)) { dz1 = dz; // memorise previous value of dz>0 x = real(n)/100; dz = a*pow( 1-x, kluff+1)/(kluff+1) - kleech/2 * (x * x) + c; while ((dz<=0) && (step>1)) { /* too big a step, go back halfway*/ /* switch to fine stepping */ step = step/2; if (step<2) { step = 2; } n = n - step; x = real(n)/100; dz = a*pow( 1-x, kluff+1)/(kluff+1) - kleech/2 * (x * x) + c; if (dz>0) { step = 1; } } n = n + step; } // we store xmax and zmax xmax = x; zmax = -a*pow(1-xmax,kluff+2)/ ((kluff+1)*(kluff+2)) - kleech/6 * pow(xmax,3) + c * xmax +b; } /************************************************************************** CSailMould class *************************************************************************** construction / destruction **************************************************************************/ /** Set the default vertical position of max depth * and the 3 profiles factors [depth, kleech, kluff] */ CSailMould::CSailMould() { vertpos = 40; profile.resize(3); profile[0] = CProfile( 0.02, 0.00, 0 ); profile[1] = CProfile( 0.08, 0.04, 3 ); profile[2] = CProfile( 0.06, 0.03, 5 ); } /************************************************************************** operators **************************************************************************/ /** Assignment operator. */ CSailMould & CSailMould::operator=( const CSailMould © ) { if (© == this) return *this; profile = copy.profile; vertpos = copy.vertpos; return *this; } /************************************************************************** member functions **************************************************************************/ /** Interpolate the depth and coefficients of the profile at height h @author Robert Laine */ CProfile CSailMould::interpol ( const real h ) const { if ( profile.size() < 3) cout << "profile < 3 !!" << endl; CProfile p; real pv = real(vertpos) / 100; real dpth = 0; real hr; if ( h <= 0 ) // at or below lower profile { /*p = profile[0];*/ hr = h / pv; dpth = profile[0].getDepth() + (profile[1].getDepth()-profile[0].getDepth()) * hr; if ( dpth < 0 ) dpth = 0; p = CProfile( dpth, profile[0].getLeech() , profile[0].getLuff() ); } else if ( h < pv ) // below max depth { hr = h / pv; dpth = profile[0].getDepth() + (profile[1].getDepth()-profile[0].getDepth()) * (1-(1-hr)*(1-hr)); if ( dpth < 0 ) dpth = 0; p = CProfile( dpth , profile[0].getLeech() + (profile[1].getLeech()-profile[0].getLeech()) * hr, profile[0].getLuff() + (profile[1].getLuff()-profile[0].getLuff()) * hr ); } else if ( h < 1 ) // above max depth and below peak { hr = (h-pv) / (1-pv); dpth = profile[1].getDepth() + (profile[2].getDepth()-profile[1].getDepth()) * hr*hr; if ( dpth < 0 ) dpth = 0; p = CProfile( dpth , profile[1].getLeech() + (profile[2].getLeech()-profile[1].getLeech()) * hr, profile[1].getLuff() + (profile[2].getLuff()-profile[1].getLuff()) * hr ); } else // peak and above { p = profile[2]; } return p; } sailcut-1.3.5/src/sailcpp/rigworker.h0000644000175000007640000000244011177775326017532 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef RIGWORKER_H #define RIGWORKER_H #include "panelgroup.h" #include "rigdef.h" /** The CRigWorker class does all the rig-related calculations. * It is used to create the rig from its definition. * * @ingroup SailCpp * @see CRigDef, CPanelGroup */ class CRigWorker : public CRigDef { public: CRigWorker(const CRigDef &d); CPanelGroup makeRig() const; // point of mast center at given height CPoint3d mastCenter( const real &h ) const; }; #endif sailcut-1.3.5/src/sailcpp/saildef.h0000644000175000007640000000615311177775326017133 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SAILDEF_H #define SAILDEF_H #include #include "sailmould.h" // enumerated types enum enumSailType { MAINSAIL, JIB, WING }; enum enumSailCut { CROSS, TWIST, HORIZONTAL, VERTICAL, RADIAL, MITRE , MITRE2}; /** The CSailDef class holds the parameters that define a sail * and its default values. * * @ingroup SailCpp * @see CFormSailDef for data input and checking * @see CSailWorker */ class CSailDef { public: CSailDef(); CSailDef & operator=( const CSailDef & ); // member variables /** The Sail ID name */ string sailID; /** The type of cut layout */ enumSailCut sailCut; /** The type of sail */ enumSailType sailType; /** The boat deck Length in mm */ real LOA; /** The Fore triangle hoist in mm */ real foreI; /** The Fore triangle base in mm */ real foreJ; /** The distance from tack to stem */ real tackX; /** The Tack height above deck in mm */ real tackY; /** The straight line luff length in mm */ real luffL; /** The rake of Luff in mm */ real rake; /** The gaff angle from Luff line in degree */ real gaffDeg; /** The straight line Gaff length in mm */ real gaffL; /** The straight line Foot length in mm */ real footL; /** The straight line Leech length in mm */ real leechL; /** The value of round of sides */ real luffR, gaffR, leechR, footR; /** The position of round of sides in percent of its length*/ int luffRP, gaffRP, leechRP, footRP; /** The cloth width */ real clothW; /** The seam width between panels in mm */ real seamW; /** The leech seam width in mm */ real leechHemW; /** The foot seam width in mm */ real footHemW; /** The other seams width in mm */ real hemsW; /** The Inner guideline width in mm */ real innerW; /** The Sail twist between foot and head in degrees */ real twistDeg; /** The sail sheeting angle in degrees */ real sheetDeg; /** The Wing diedral angle in degrees */ real dihedralDeg; /** The number of radial sections */ unsigned int nbSections; /** The number of radial head gores */ unsigned int nbGores; /** The number of luff gores */ unsigned int nbLuffGores; /** The sail mould */ CSailMould mould; }; #endif sailcut-1.3.5/src/sailcpp/panel.h0000644000175000007640000001215411177775326016621 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef PANEL_H #define PANEL_H #include #include #include enum enumPointType { LUFF, FOOT, LEECH, GAFF }; enum enumAlign {LEFT, LOW_LEFT, BOTTOM}; enum enumDevelopAlign {ALIGN_TOP,ALIGN_BOTTOM }; class panel_error : public runtime_error { public: panel_error(const string &message) : runtime_error(message) { cout << "in panel: " << what() << endl; } }; /***************************************************************************** CPanelLabel class *****************************************************************************/ /** This class describe a label for a panel */ class CPanelLabel { public: CPanelLabel(); CPanelLabel( const CPanelLabel& ); /** label name of the panel */ string name; /** label text height (default : 5) */ int height; /** label text color (default : 1) */ int color; /** origin of the label */ CPoint3d origin; /** direction for writing the label */ CVector3d direction; /** function for rotating a label. */ CPanelLabel rotate( const CPoint3d &, const CMatrix & ) const; /** operator to translate a label */ CPanelLabel operator+ (const CVector3d &) const; /** operator to copy a label */ CPanelLabel& operator=( const CPanelLabel &); friend ostream& operator<< (ostream &, const CPanelLabel &); }; /***************************************************************************** CSide class *****************************************************************************/ /** The CSide class describes a side of a panel. It is a collection of points. * * @ingroup SailCpp */ class CSide : public vector { public: CSide( unsigned int = 1 ); public: void fill( const CPoint3d &, const CPoint3d & ); void fill( const CPoint3d &, const CPoint3d &, const CPoint3d & ); /** function for rotating a side. */ CSide rotate( const CPoint3d &, const CMatrix &) const; // operators CSide operator+ (const CVector3d &) const; friend ostream& operator<< (ostream &, const CSide &); }; /** This class describes a seam of a sail. * * @see CSide */ class CSeam : public CSide { public: /** Constructor */ CSeam( unsigned int i = 1 ) : CSide( i ) {} ; /** type of the left point */ enumPointType leftPoint; /** type of the right point */ enumPointType rightPoint; }; /***************************************************************************** Panel class *****************************************************************************/ /** The CPanel describes a sail panel. * * A panel has at least four sides: top, bottom, left and right. * A developed panel also has four additional sides representing * the edge of the cloth taking into account seam width and hems width. * * @ingroup SailCpp */ class CPanel { public: CPanel(); CPanel( const CPanel &p ); /** panel's label */ CPanelLabel label; /** panel's left side */ CSide left; /** panel's right side */ CSide right; /** panel's top side */ CSide top; /** panel's bottom side */ CSide bottom; /** panel's cut left side */ CSide cutLeft; /** panel's cut right side */ CSide cutRight; /** panel's cut top side */ CSide cutTop; /** panel's cut bottom side */ CSide cutBottom; /** do we have hems added to the panel edges? */ bool hasHems; // member functions CRect3d boundingRect() const; CPoint3d centroid() const; // centroid of a panel void addHems( const real &, const real &, const real &, const real &); void add6Hems( const real &, const real &, const real &, const real &, const real &, const real & ); CPanel develop(enumDevelopAlign align) const; void placeLabel(); // place a label at the center of a panel CPanel reframe(enumAlign align) const; CPanel rotate( const CPoint3d &, const CMatrix &) const; CPanel operator+ (const CVector3d &) const; CPanel& operator= (const CPanel &); friend ostream& operator<< (ostream &, const CPanel &); }; // global functions ostream& operator<< (ostream &, const CPanel &); ostream& operator<< (ostream &, const CSide &); ostream& operator<< (ostream &, const CPanelLabel &); #endif sailcut-1.3.5/src/sailcpp/sailworker.cpp0000644000175000007640000044212211452116530020217 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include "sailworker.h" #include "sailcalc.h" #define MAX_PANELS 210 /* To enable debugging */ // #define DEBUG 1 /** * The constructor does some preliminary calculations to set * internal variables. */ CSailWorker::CSailWorker(const CSailDef &s) : CSailDef(s) { /* First compute the coordinates of the corner of the sail */ CVector3d v, v1; real x = 0, headstay = 0; /* Then Compute the coordinates of the 4 corners of the sail */ switch ( sailType ) { case JIB: x = tackY * foreJ / foreI; headstay = sqrt(foreI * foreI + foreJ * foreJ); rake = foreJ * luffL / headstay; tack = CPoint3d( x , tackY , 0 ); //gaffL = 1; gaffR = 0; gaffRP = 50; // imposed value for short gaff gaffDeg = atan2( foreI , foreJ ) * 180/PI - 10; break; default: tack = CPoint3d( tackX, tackY, 0 ); break; } /** VC++ 6 pre-SP3 bug if we pass the result of a square root directly, see : MS knowledgebase 217164). */ real stupid_hack = sqrt(luffL*luffL - rake*rake); head = tack + CVector3d(rake, stupid_hack, 0); v = CVector3d(0, gaffL, 0); // initial vector gaff set on vertical peak = head + CMatrix::rot3d( 2 , (-asin(rake / luffL) - gaffDeg * PI / 180) ) * v; if ( fabs(peak.y() - head.y()) < 1 ) peak.y() = head.y() + 1; // to avoid case with gaff horizontal /* Compute triangle tack-peak-clew. */ real aa, b, bb; bb = atan2( peak.y() - tack.y() , peak.x() - tack.x() ); b = CVector3d(peak - tack).norm(); aa = Atriangle( leechL , b , footL ); v1 = CVector3d( footL, 0, 0 ); // initial foot vector set on horizontal if (sailType == WING) clew = tack + v1; else clew = tack + CMatrix::rot3d( 2 , bb-aa ) * v1; /* end of computation of corners of the sail */ /** Define foot vector of sail edge. */ footV = CVector3d( clew - tack ); /** Define gaff vector of sail edge. */ gaffV = CVector3d( peak - head ); /** Define fleech vector of sail edge. */ leechV = CVector3d( peak - clew ); /** Define luff vector of sail edge. */ luffV = CVector3d( head - tack ); /** Define mitre vector bisecting foot-leech angle. */ mitreV = CVector3d( tack - clew ).unit() + leechV.unit(); /** Define the unitary vectors perpendicular to foot edge, rotated anti-clockwise. */ footVP = CMatrix::rot3d(2, PI/2) * footV.unit(); /** Define the unitary vectors perpendicular to gaff edge, rotated anti-clockwise. */ gaffVP = CMatrix::rot3d(2, PI/2) * gaffV.unit(); /** Define the unitary vectors perpendicular to leech edge, rotated anti-clockwise. */ leechVP = CMatrix::rot3d(2, PI/2) * leechV.unit(); /** Define the unitary vectors perpendicular to luff edge, rotated anti-clockwise. */ luffVP = CMatrix::rot3d(2, PI/2) * luffV.unit(); /** Define useful straight lines of edges and mitre. */ footLine = CSubSpace3d::line(tack , footV); gaffLine = CSubSpace3d::line(head , gaffV); leechLine = CSubSpace3d::line(clew , leechV); luffLine = CSubSpace3d::line(tack , luffV); mitreLine = CSubSpace3d::line(clew , mitreV); /** Define point at intersection of mitre and luff. */ mitreLuffPt = EdgeIntersect( LUFF_EDGE, clew , mitreV ); } /** * Make a Sail from its definition. */ CPanelGroup CSailWorker::makeSail() const { CPanelGroup flatsail, dispsail; return makeSail(flatsail,dispsail); } /** * Make a Sail from its definition. * This is the main routine of all the sail layout work * The output is a 3D sail, its display and development versions. */ CPanelGroup CSailWorker::makeSail( CPanelGroup &flatsail , CPanelGroup &dispsail) const { CPanelGroup output; switch ( sailType ) { case WING: output = LayoutWing(flatsail , dispsail); break; default: switch ( sailCut ) { case CROSS: output = Layout0(flatsail , dispsail); break; case TWIST: output = LayoutTwist(flatsail , dispsail); break; case HORIZONTAL: output = Layout0(flatsail , dispsail); break; case VERTICAL: output = LayoutVertical(flatsail , dispsail); break; case RADIAL: output = LayoutRadial(flatsail , dispsail); break; case MITRE: output = LayoutMitre(flatsail , dispsail); break; case MITRE2: output = LayoutMitre2(flatsail , dispsail); break; default: throw layout_error("CSailWorker::makeSail : unknown sail cut layout!"); } } // place the labels at the centre of each panel output.placeLabels(); dispsail.placeLabels(); flatsail.plotLabels(); // assign the sail names output.title = sailID + " (3D)"; dispsail.title = sailID + " (3D)"; flatsail.title = sailID + " (flat)"; return output; } /** * Creates a Cross cut or horizontal cut sail. * * @param flatsail the CPanelGroup object that will hold the developed sail * @param dispsail the CPanelGroup object that will hold the display * version of the developed sail * @return CPanelGroup * * @author Robert Laine alias Sailcuter */ CPanelGroup CSailWorker::Layout0( CPanelGroup &flatsail, CPanelGroup &dispsail ) const { /* First create arrays p1 and p2 of points at the end of each seams * located on the straight edge of the sail (no round) * p1[] are on the luff side and p2[] are on the leech side */ CPoint3d p1[MAX_PANELS], p2[MAX_PANELS]; /* Create two temporary sails lay and the corresponding dev */ CPanelGroup lay(MAX_PANELS); // 3D sail CPanelGroup dev(MAX_PANELS); // developed sail /* create number of panels */ unsigned int npanel = 1; unsigned int npl = lay[0].right.size(); // number of right/left points unsigned int npb = lay[0].bottom.size(); // number of bottom/top points unsigned int j = 0, k = 0, cnt = 0; bool flag = false; // to check if top of sail is reached /* create arrays t1 and t2 of type of intersection of upper seam * respectively at points p1 on luff side and p2 on leech side * t=1 seam intersect foot at point p1 * t=2 seam intersect luff * t=3 seam intersect gaff * t=4 seam intersect leech */ int t1[MAX_PANELS], t2[MAX_PANELS]; /* define point ip for intersections */ CPoint3d ip; CVector3d seamV; // seam Vector CSubSpace seamL; // seam Line if ( sailCut == HORIZONTAL ) seamV = CVector3d(-1, 0, 0); // horizontal seam orientation for Horizontal cut else // define seamV as the vector perpendicular to the leech vector (peak-clew) seamV = leechVP; // for classical cross cut /* create variables for the development and edge corrections */ CPoint3d top(0, 0, 0); CPoint3d bot(0, 0, 0); CVector3d v(0, 0, 0); CVector3d vb(0, 0, 0); CVector3d vk(0, 0, 0); /* create variable for edge correction */ vector deviation; deviation.resize(npb); vector deviaPrev; deviaPrev.resize(npb); /* Other edge hem width */ real luffHemW = hemsW; // real luffInnerHemW, footInnerHemW; real CC = 0, x = 0, y = 0; /* seam 0 is on the foot of the sail ending at the clew */ p1[0] = tack; // initialise seam forward end at tack point p2[0] = clew; // initialise seam aft end at clew point t1[0] = 1; t2[0] = 4; // type=4=leech intersection /** Lay the panels starting from the foot, going upward to the peak */ for (npanel = 1 ; npanel < MAX_PANELS -1 ; npanel++) { real exc = 0; // current excess of width real exb = 0; // total correction cnt = 0; // counter of iterations do /* Loop for optimising the seam position to fit cloth width */ { cnt++; p2[npanel] = p2[npanel-1] + (clothW - seamW - exb) * leechV.unit(); t2[npanel] = 4; // type2 = 4 = leech intersection for all horizontally cut panels seamL = CSubSpace3d::line( p2[npanel] , seamV ); if ( CVector3d( p2[npanel] - peak ) * leechV > 0 ) { // we are above peak, stop this is last panel flag = true; p2[npanel] = peak; // check on which side of the sail the previous point p1 is located if ( t1[npanel-1] < 2 ) { // previous seam on foot p1[npanel] = head; t1[npanel] = 2; // set on luff // left points on foot-tack-luff lay[npanel-1].left.fill(p1[npanel-1], tack, p1[npanel]); for (k = 0 ; k < npl / 2 ; k++) lay[npanel-1].left[k] = EdgeIntersect( FOOT_EDGE, lay[npanel-1].left[k] , seamV); for (k = npl / 2 +1 ; k < npl ; k++) lay[npanel-1].left[k] = EdgeIntersect( LUFF_EDGE, lay[npanel-1].left[k] , seamV); } else if ( t1[npanel-1] == 2 ) { // left points on luff p1[npanel] = head; t1[npanel] = 2; lay[npanel-1].left.fill(p1[npanel-1], p1[npanel]); for (k = 0 ; k < npl ; k++) lay[npanel-1].left[k] = EdgeIntersect( LUFF_EDGE, lay[npanel-1].left[k], seamV); } else { // left points on gaff p1[npanel] = p1[npanel-1]; t1[npanel] = 3; lay[npanel-1].left.fill(p1[npanel-1], p1[npanel]); for (k = 0 ; k < npl ; k++) lay[npanel-1].left[k] = EdgeIntersect( GAFF_EDGE, lay[npanel-1].left[k], seamV); } // fill right points on leech lay[npanel-1].right.fill(p2[npanel-1],p2[npanel]); for (k = 0 ; k < npl ; k++) lay[npanel-1].right[k]=EdgeIntersect( LEECH_EDGE, lay[npanel-1].right[k], seamV); // fill bottom points lay[npanel-1].bottom.fill(lay[npanel-1].left[0], lay[npanel-1].right[0]); // fill top points lay[npanel-1].top.fill(lay[npanel-1].left[npl-1], lay[npanel-1].right[npl-1]); // move all top points of top panel to gaff curve for (k = 1 ; k < npb -1 ; k++) lay[npanel -1].top[k] = EdgeIntersect( GAFF_EDGE, lay[npanel-1].top[k], CVector3d (head.y()-peak.y(),peak.x()-head.x(),0)); // end peak panel // } else // normal panel below peak ////// { /* find position of luff/seam intersection relative to tack and head */ if ( seamL.intersect(luffLine).getdim() == 0 ) ip = seamL.intersect(luffLine).getp(); else throw layout_error("CSailWorker::Layout0 -1 : intersection of seam and luff is not a point!"); if ( CVector3d( ip - tack ) * luffV <= 0 ) { // seam intersects foot if ( seamL.intersect(footLine).getdim() == 0 ) p1[npanel] = seamL.intersect(footLine).getp(); else throw layout_error("CSailWorker::Layout0 -2 : intersection of seam and foot is not a point!"); t1[npanel] =1; // type1=1 = foot type of intersection if ( npanel == 1 ) { // set lower edge to start at same point p1 p1[0] = p1[npanel]; t1[0] = 1; } } else if ( CVector3d(ip- head) * luffV > 0 ) { // seam intersects gaff if ( seamL.intersect(gaffLine).getdim() == 0 ) p1[npanel] = seamL.intersect(gaffLine).getp(); else throw layout_error("CSailWorker::Layout0 -3 : intersection of seam and foot is not a point!"); t1[npanel] = 3; // 3 = gaff type of intersection } else { // seam intersects luff p1[npanel] = ip; t1[npanel] = 2; // 2 = luff if ( npanel == 1 ) { // force seam 0 to start at the tack p1[0] = tack; t1[0] = 2; } } /* We now add the intermediate points on all sides of the normal panel */ /* Below is the code for the left side depending * on t1 for the top side and bottom side */ if ( t1[npanel-1] == 1 && t1[npanel] == 1 ) { // full foot lay[npanel-1].left.fill(p1[npanel-1] , p1[npanel]); for (k = 0 ; k < npl ; k++) lay[npanel-1].left[k] = EdgeIntersect( FOOT_EDGE, lay[npanel-1].left[k], seamV); } else if ( t1[npanel-1] == 2 && t1[npanel] == 2 ) { // full luff lay[npanel-1].left.fill(p1[npanel-1] , p1[npanel]); for (k = 0 ; k < npl ; k++) lay[npanel-1].left[k] = EdgeIntersect( LUFF_EDGE, lay[npanel-1].left[k] , seamV); } else if ( t1[npanel-1] == 3 && t1[npanel] == 3 ) { // full gaff lay[npanel-1].left.fill(p1[npanel-1] , p1[npanel]); for (k = 0 ; k < npl ; k++) lay[npanel-1].left[k] = EdgeIntersect( GAFF_EDGE, lay[npanel-1].left[k] , seamV); } else if ( (t1[npanel-1] == 1) && (t1[npanel] == 2) ) { // foot-tack-luff lay[npanel-1].left.fill(p1[npanel-1], tack, p1[npanel]); for (k = 0 ; k < npl / 2 ; k++) lay[npanel-1].left[k] = EdgeIntersect( FOOT_EDGE, lay[npanel-1].left[k], seamV); for (k = npl / 2 +1 ; k < npl ; k++) lay[npanel-1].left[k] = EdgeIntersect( LUFF_EDGE, lay[npanel-1].left[k], seamV); } else if ( (t1[npanel-1] == 2) && (t1[npanel] == 3) ) { // luff-head-gaff lay[npanel-1].left.fill(p1[npanel-1], head, p1[npanel]); for (k = 0 ; k < npl/2 ; k++) lay[npanel-1].left[k] = EdgeIntersect( LUFF_EDGE, lay[npanel-1].left[k], seamV); for (k = npl / 2 +1 ; k < npl ; k++) lay[npanel-1].left[k] = EdgeIntersect( GAFF_EDGE, lay[npanel-1].left[k], seamV); } // end IF ELSE for left side /* Below is the code for the intermediate points of the right side * which are all on the leech for a crosscut layout. */ // first check if upper point is not below lower point if ( CVector3d( p2[npanel] - p2[npanel-1] ) * leechV < 0) p2[npanel] = p2[npanel-1]; lay[npanel-1].right.fill(p2[npanel-1] , p2[npanel]); for (k = 0 ; k < npl ; k++) lay[npanel-1].right[k] = EdgeIntersect( LEECH_EDGE, lay[npanel-1].right[k], seamV); /* Below is the code for the intermediate points of the top and bottom sides. * The first point is identical to the last point of the left side * The last point is identical to the last point of the right side */ lay[npanel-1].top.fill( lay[npanel-1].left[npl-1] , lay[npanel-1].right[npl-1] ); lay[npanel-1].bottom.fill( lay[npanel-1].left[0] , lay[npanel-1].right[0] ); /* Below is the code for the intermediate points of the bottom side of first panel */ if ( npanel == 1 ) { // move bottom side of first panel to foot curve for (k = 1 ; k < npb -1 ; k++) { lay[0].bottom[k] = EdgeIntersect( FOOT_EDGE, lay[0].bottom[k], CVector3d(0,-1,0)); } } #ifdef DEBUG if ( npanel == 1 ) { cout << "CSailWorker::Layout0 Crosscut foot after adding curve" << endl; for (k = 0 ; k < npb ; k++) cout << "pt="<< k << " xyz=" << lay[0].bottom[k] << endl; } #endif } /* end else normal panel */ /** Go over all the points of current panel and calculate their Z */ lay[npanel-1] = Zpanel(lay[npanel-1]); #ifdef DEBUG if ( npanel == 1 ) { // move bottom side of first panel to foot curve cout << "CSailWorker::Layout0 Crosscut foot after Z " << endl; for (k = 0 ; k < npb ; k++) cout << "pt="<< k << " xyz=" << lay[0].bottom[k] << endl; cout << "---end Z foot---- DO LOOP=" << cnt << endl; } #endif /** Develop the current panel */ if ( npanel == 1 ) { dev[npanel-1] = lay[npanel-1].develop(ALIGN_TOP); } else { dev[npanel-1] = lay[npanel-1].develop(ALIGN_BOTTOM); // add deviation of previous panel top edge to bottom edge for (k = 1; k < npb-1; k ++) dev[npanel-1].bottom[k] = dev[npanel-1].bottom[k] + deviaPrev[k]; } /** Compute and store the deviation of top edge of * the developed panel and straighten this top edge * except if this is the top panel */ if ( flag == false ) { vb= CMatrix::rot3d(2,PI/2) * CVector3d(dev[npanel-1].top[npb-1] - dev[npanel-1].top[0]).unit(); for (k = 1 ; k < npb -1 ; k ++) { vk= CVector3d (dev[npanel-1].top[k] - dev[npanel-1].top[0]); v= vb * -(vk*vb); deviation[k] = v; dev[npanel-1].top[k] = dev[npanel-1].top[k] + deviation[k]; } } /** Add the seam and hems allowance */ if ( npanel == 1 ) { dev[npanel-1].add6Hems( hemsW, hemsW, seamW, leechHemW, leechHemW, footHemW ); } else if ( flag == true ) { dev[npanel-1].add6Hems( hemsW, hemsW, hemsW, leechHemW, leechHemW, 0 ); } else { if ( t1[npanel-1] == 1 && t1[npanel] == 2 ) dev[npanel-1].add6Hems( footHemW, luffHemW, seamW, leechHemW, leechHemW, 0 ); else dev[npanel-1].add6Hems( hemsW, hemsW, seamW, leechHemW, leechHemW, 0 ); } /* Check the width of developed panel and store the excess */ exc = dev[npanel-1].boundingRect().height() - clothW; /* Sum previous correction + 80% of current excess of width + 1mm */ exb += 0.8 * exc + 1; } while ( exc > 0 && cnt < 9 ); /* loop as long the excess of width is positive AND counter < 9 */ deviaPrev = deviation; /** Reposition the developed panel such that the * lowest point is Y=0 AND most left point is X=0. */ dev[npanel-1] = dev[npanel-1].reframe(LOW_LEFT); /* check if peak has been reached to break off */ if ( flag == true ) break; } /** Loop FOR next panel */ if ( npanel == MAX_PANELS-1 ) throw layout_error("CSailWorker::Layout0 : MAX_PANELS without reaching head, do increase cloth width "); /* Copy the sails for 3D display */ CPanelGroup sail(npanel); for (j = 0 ; j < npanel ; j ++) sail[j] = lay[j]; /** Create the displays version of the developed sail */ /* Copy the developed sail */ flatsail = CPanelGroup(npanel); for (j = 0 ; j < npanel ; j++) { flatsail[j] = dev[j]; } /* Re-position the developed panels in a clean stack */ dispsail = flatsail; for (j = 1 ; j < npanel ; j++) { top = dispsail[j-1].top[0]; bot = dispsail[j].bottom[0]; // rotation to align bottom of panel to top of previous panel x = dispsail[j-1].top[npb-1].x() - top.x(); y = dispsail[j-1].top[npb-1].y() - top.y(); CC = atan2(y , x); dispsail[j] = dispsail[j].rotate(bot,CMatrix::rot3d(2,CC)); // translation v to align panel bottom edge origin to previous panel upper edge origin v = CVector3d ( top - CPoint3d(0,0,0) ); v.x() = v.x() - bot.x(); v.y() = v.y() + 2 * seamW +20; // adding offset to separate panels vertically dispsail[j] = dispsail[j] + v; } return sail; } /* end layout0 = cross cut or horizontal //////////////// */ /** Creates a twist foot cut sail. * * @param flatsail the CPanelGroup object that will hold the developed sail * @param dispsail the CPanelGroup object that will hold the display * version of the developed sail * @return CPanelGroup * @author Robert Laine alias Sailcuter */ CPanelGroup CSailWorker::LayoutTwist( CPanelGroup &flatsail, CPanelGroup &dispsail ) const { /* First create arrays p1 and p2 of points at the end of each seams * located on the straight edge of the sail (no round) */ CPoint3d p1[MAX_PANELS], p2[MAX_PANELS]; /* Create two temporary sails lay and the corresponding dev */ CPanelGroup lay(MAX_PANELS); // 3D sail CPanelGroup dev(MAX_PANELS); // developed sail /* create number of panels */ unsigned int npanel = 1; unsigned int npl = lay[0].right.size(); // number of right/left points unsigned int npb = lay[0].bottom.size(); // number of bottom/top points unsigned int j = 0, k = 0, cnt = 0; bool flag = false; /* create arrays t1 and t2 of type of intersection * respectively at points p1 on luff side and p2 on leech side * t=1 seam intersect foot at point p1 * t=2 seam intersect luff * t=3 seam intersect gaff * t=4 seam intersect leech */ int t1[MAX_PANELS], t2[MAX_PANELS]; /* define point ip for intersections */ CPoint3d ip; /* define the seamV as the vector perpendicular to the leech vector (peak-clew)*/ CVector3d seamV = leechVP; CSubSpace seamL; // seam line CVector3d seamVT; // seam vector twisted CSubSpace seamLT; // seam line twisted /* create variables for the development and edge corrections */ CPoint3d top(0, 0, 0); CPoint3d bot(0, 0, 0); CVector3d v(0, 0, 0); CVector3d vb(0, 0, 0); CVector3d vk(0, 0, 0); /* create variable for edge correction */ vector deviation; deviation.resize(npb); vector deviaPrev; deviaPrev.resize(npb); /* create variable to monitor excess over cloth width */ real CC=0, x=0, y=0; /* seam 0 is on the foot of the sail ending at the clew */ p1[0] = tack; // initialised at tack point p2[0] = clew; t1[0] = 2; t2[0] = 4; // type=4=leech intersection /* Other edge hem width */ real luffHemW = hemsW; // real luffInnerHemW, footInnerHemW; /** Start laying the panels from foot upward to the peak */ for (npanel = 1; npanel < MAX_PANELS-1; npanel++) { real exb = 0; // total correction real exc = 0; // current excess of width cnt = 0; /* Loop for optimising the seam position to fit cloth width */ do { cnt++; p2[npanel] = p2[npanel-1] + leechV.unit() * (clothW - seamW - exb); t2[npanel] = 4; // type2=4=leech intersection for all horizontally cut panels seamL = CSubSpace3d::line( p2[npanel] , seamV ); if ( CVector3d(p2[npanel]-peak) * leechV > 0 ) { // we are above peak, stop this is last panel flag=true; p2[npanel] = peak; // check where previous point p1 is if (t1[npanel-1] <= 2) { // left points on luff p1[npanel] = head; t1[npanel] = 2; lay[npanel-1].left.fill(p1[npanel-1] , p1[npanel]); for (k = 0; k < npl; k++) lay[npanel-1].left[k] = EdgeIntersect( LUFF_EDGE, lay[npanel-1].left[k], seamV); } else { // left points on gaff p1[npanel] = p1[npanel-1]; t1[npanel] = 3; lay[npanel-1].left.fill(p1[npanel-1] , p1[npanel]); for (k = 0; k < npl; k++) lay[npanel-1].left[k] = EdgeIntersect( GAFF_EDGE, lay[npanel-1].left[k], seamV); } // fill right points on leech lay[npanel-1].right.fill(p2[npanel-1] , p2[npanel]); for (k = 0; k < npl; k++) lay[npanel-1].right[k] = EdgeIntersect( LEECH_EDGE, lay[npanel-1].right[k], seamV); // fill bottom points lay[npanel-1].bottom.fill(lay[npanel-1].left[0], lay[npanel-1].right[0]); // fill top points lay[npanel-1].top.fill(lay[npanel-1].left[npl-1], lay[npanel-1].right[npl-1]); // move all top points to gaff curve for (k=1; k < npb-1; k++) lay[npanel-1].top[k] = EdgeIntersect( GAFF_EDGE, lay[npanel-1].top[k], CVector3d (head.y()-peak.y() , peak.x()-head.x() , 0)); // end peak panel ////// } else // normal panel { /* find nominal position of luff/seam intersection relative to tack and head */ if ( seamL.intersect(luffLine).getdim() == 0 ) ip = seamL.intersect(luffLine).getp(); else throw layout_error("CSailWorker::LayoutTwist -1 : twist intersection of seam and luff is not a point!"); if ( CVector3d( (ip - luffV.unit() * (seamW + clothW/5) ) - p1[npanel-1] ) * luffV < 0 ) { // seam intersects luff below previous panel luff point + 1/5 clothW p1[npanel] = p1[npanel-1] + luffV.unit() * (seamW + clothW/5); t1[npanel] = 2; // 2=luff type of intersection seamVT = CVector3d( p1[npanel] - p2[npanel] ).unit(); seamLT = CSubSpace3d::line(p2[npanel] , seamVT); ip = seamLT.intersect(luffLine).getp(); #ifdef DEBUG cout << "CSailWorker::LayoutTwist Seam 1 LUFF CORRECTION DO LOOP = " << cnt << endl; cout << " ip = " << ip << endl; cout << "p1[0] " << p1[0] << " p2[0] " << p2[0] << " type "<< t1[0] << t2[0] << endl; cout << "p1[1] " << p1[1] << " p2[1] " << p2[1] << " type "<< t1[1] << t2[1] << endl; cout << "seam VT = " << seamVT << endl; cout << "--- " << endl; #endif } else if (CVector3d(ip - head) * luffV > 0) { // seam intersects gaff if ( seamL.intersect(gaffLine).getdim() == 0 ) p1[npanel] = seamL.intersect(gaffLine).getp(); else throw layout_error("CSailWorker::LayoutTwist -2 : intersection of seam and foot is not a point!"); t1[npanel] = 3; // 3=gaff type of intersection seamVT = seamV; } else { // seam intersects luff normally p1[npanel] = ip; t1[npanel] = 2; // luff seamVT = seamV; } /* We now add the intermediate points on all sides of the panel */ /* Below is the code for the left side depending * on t1 for the top side and bottom side */ if (t1[npanel-1] == 2 && t1[npanel] == 2) { // full luff lay[npanel-1].left.fill(p1[npanel-1], p1[npanel]); for (k = 0; k < npl; k++) lay[npanel-1].left[k] = EdgeIntersect( LUFF_EDGE, lay[npanel-1].left[k], seamVT); } else if (t1[npanel-1] == 3 && t1[npanel] == 3) { // full gaff lay[npanel-1].left.fill(p1[npanel-1] , p1[npanel]); for (k = 0; k < npl; k++) lay[npanel-1].left[k] = EdgeIntersect( GAFF_EDGE, lay[npanel-1].left[k], seamV); } else if ((t1[npanel-1] ==2 ) && (t1[npanel] == 3)) { // luff-head-gaff lay[npanel-1].left.fill(p1[npanel-1] , head, p1[npanel]); for (k = 0; k < npl/2; k++) lay[npanel-1].left[k] = EdgeIntersect( LUFF_EDGE, lay[npanel-1].left[k], seamV); for (k = npl/2 +1; k < npl; k++) lay[npanel-1].left[k] = EdgeIntersect( GAFF_EDGE, lay[npanel-1].left[k], seamV); } // end IF ELSE for left side /* Compute the intermediate points of the right side * which are all on the leech for a twist cut layout. */ // first check if upper point is not below lower point if ( CVector3d( p2[npanel] - p2[npanel-1] ) * leechV < 0 ) p2[npanel] = p2[npanel-1]; lay[npanel-1].right.fill(p2[npanel-1] , p2[npanel]); for (k = 0; k < npl; k++) lay[npanel-1].right[k] = EdgeIntersect( LEECH_EDGE, lay[npanel-1].right[k], seamV); /* Compute the intermediate points of the top and bottom sides. * The first point is identical to the last point of the left side * The last point is identical to the last point of the right side */ lay[npanel-1].top.fill(lay[npanel-1].left[npl-1], lay[npanel-1].right[npl-1]); lay[npanel-1].bottom.fill(lay[npanel-1].left[0], lay[npanel-1].right[0]); #ifdef DEBUG if ( npanel == 1 ) { cout << "CSailWorker::LaoutTwist foot straight - LOOP= "<< cnt << endl; for (k = 0 ; k < npb ; k++) cout << "pt="<< k << " Bottom xyz= " << lay[0].bottom[k] << " Top xyz= " << lay[0].top[k] << endl; } #endif /* Move the intermediate points of the bottom side of first panel */ if ( npanel == 1 ) { // move bottom side of first panel to foot curve for (k = 1 ; k < npb-1 ; k++) lay[0].bottom[k] = EdgeIntersect( FOOT_EDGE, lay[0].bottom[k] , footVP ); } } /* end else normal panel //////// */ /* Now we go over all the points and calculate their Z */ lay[npanel-1] = Zpanel(lay[npanel-1]); /* Develop the current panel */ if ( npanel == 1 ) dev[npanel-1] = lay[npanel-1].develop(ALIGN_TOP); else { dev[npanel-1] = lay[npanel-1].develop(ALIGN_BOTTOM); // add deviation of previous panel top edge to this bottom edge for (k = 1 ; k < npb-1 ; k++) dev[npanel-1].bottom[k] = dev[npanel-1].bottom[k] + deviaPrev[k]; } /* Compute and store the deviation of top edge of developed panel * and straighten this top edge Except if this is the top panel. */ if (flag == false) { vb= CMatrix::rot3d(2,PI/2) * CVector3d(dev[npanel-1].top[npb-1] - dev[npanel-1].top[0]).unit(); for (k = 1 ; k < npb-1 ; k++) { vk= CVector3d (dev[npanel-1].top[k] - dev[npanel-1].top[0]); v= vb * -(vk * vb); deviation[k] = v; dev[npanel-1].top[k] = dev[npanel-1].top[k] + deviation[k]; } } /* Add the seam and hems allowance */ if (npanel == 1) dev[npanel-1].add6Hems( luffHemW, luffHemW, seamW, leechHemW, leechHemW, footHemW ); else if (flag == true) dev[npanel-1].add6Hems( hemsW, hemsW, hemsW, leechHemW, leechHemW, 0 ); else if ((t1[npanel-1] ==2 ) && (t1[npanel] == 2)) dev[npanel-1].add6Hems( luffHemW, luffHemW, seamW, leechHemW, leechHemW, 0 ); else if ((t1[npanel-1] ==2 ) && (t1[npanel] == 3)) dev[npanel-1].add6Hems( luffHemW, hemsW, seamW, leechHemW, leechHemW, 0 ); else dev[npanel-1].add6Hems( hemsW, hemsW, seamW, leechHemW, leechHemW, 0 ); #ifdef DEBUG if ( npanel == 1 ) { // move bottom side of first panel to foot curve cout << "CSailWorker::LayoutTwist foot after adding seams " << endl; for (k = 0 ; k < npb ; k++) cout << "pt="<< k << " xyz=" << dev[0].bottom[k] << endl; cout << "------END LOOP="<< cnt << endl; } #endif /* Check the width of developed panel */ exc = dev[npanel-1].boundingRect().height() - clothW; /* Sum previous correction + 80% of current excess of width + 1mm */ exb += 0.8 * exc + 1; } while ( exc > 0 && cnt < 9 ); /* loop as long the excess of width is positive AND counter < 9 */ deviaPrev = deviation; /* Now we reposition the developed panel such that * bottom minimum is Y=0 AND most left point is X=0 */ dev[npanel-1] = dev[npanel-1].reframe(LOW_LEFT); /* check if peak has been reached to break off */ if ( flag == true ) break; } /* loop FOR next seam */ if (npanel == MAX_PANELS-1) throw layout_error("CSailWorker::LayoutTwist -5 : MAX_PANELS without reaching head, do increase cloth width "); /* Copy the sails for display */ CPanelGroup sail(npanel); for (j = 0; j < npanel; j++) sail[j] = lay[j]; /* Copy the developed sail */ flatsail = CPanelGroup(npanel); for (j = 0; j < npanel; j++) flatsail[j] = dev[j]; /* Prepare the displays version of the developed sail */ dispsail = flatsail; for (j = 1; j < npanel; j++) { top = dispsail[j-1].top[0]; bot = dispsail[j].bottom[0]; // rotation to align bottom of panel to top of previous panel x = dispsail[j-1].top[npb-1].x() - top.x(); y = dispsail[j-1].top[npb-1].y() - top.y(); CC = atan2(y,x); dispsail[j] = dispsail[j].rotate(bot,CMatrix::rot3d(2,CC)); // translation v to align panel bottom edge origin to previous panel upper edge origin v = top; v.x() -= bot.x(); v.y() += 2 * seamW +20; // adding offset to separate panels vertically dispsail[j] = dispsail[j] + v; } return sail; } /* end layout twist foot //////////// */ /** Creates a VERTICAL cut sail. * * @param flatsail the CPanelGroup object that will hold the developed sail * @param dispsail the CPanelGroup object that will hold the display * version of the developed sail * @return CPanelGroup * @author Robert Laine alias Sailcuter */ CPanelGroup CSailWorker::LayoutVertical( CPanelGroup &flatsail, CPanelGroup &dispsail ) const { /* First create arrays p1 and p2 of points at the end of each seams * located on the straight edge of the sail (no round) */ CPoint3d p1[MAX_PANELS], p2[MAX_PANELS]; /* Create two temporary sails lay and the corresponding dev */ CPanelGroup lay(MAX_PANELS); // 3D sail CPanelGroup dev(MAX_PANELS); // developed sail /* create number of panels */ unsigned int npanel = 1; unsigned int npl = lay[0].right.size(); // number of right/left points unsigned int npb = lay[0].bottom.size(); // number of bottom/top points unsigned int j=0, k=0, cnt=0; bool flag=false; /* create arrays t1 and t2 of type of intersection * respectively at points p1 on luff side and p2 on leech side * t=1 seam intersect foot at point p1 * t=2 seam intersect luff * t=3 seam intersect gaff * t=4 seam intersect leech */ int t1[MAX_PANELS], t2[MAX_PANELS]; /* define point ip for intersections */ CPoint3d ip; /* define seamV as the vector parrallel to the leech vector (peak-clew)*/ CVector3d seamV = leechV.unit(); CSubSpace seamL; // seam Line /* create variables for the development and edge corrections */ CPoint3d pt(0, 0, 0); // test point CPoint3d top(0, 0, 0); CPoint3d bot(0, 0, 0); CVector3d v(0, 0, 0); CVector3d vb(0, 0, 0); CVector3d vk(0, 0, 0); /* create variable for panel width correction */ vector deviation; deviation.resize(npb); vector deviaPrev; deviaPrev.resize(npb); /* Other edge hem width */ real luffHemW = hemsW; // real luffInnerHemW, footInnerHemW; /* seam 0 is on the leech of the sail ending at the peak */ p1[0] = clew; // initialised at tack point p2[0] = peak; t1[0] = 1; t2[0] = 3; // type=4=leech intersection /** Lay the panels parallel to the leech, from the leech toward the tack */ for (npanel = 1; npanel < MAX_PANELS-1; npanel++) { real exb = 0; // total correction real exc = 0; // current excess of width cnt = 0; //if (npanel==3) flag=true; /* Loop for optimising the seam position to fit cloth width */ do { cnt++; pt = p1[npanel-1] + (clothW -seamW -exb) * leechVP; seamL = CSubSpace3d::line(pt, seamV); if ( seamL.intersect(footLine).getdim() == 0 ) p1[npanel] = seamL.intersect(footLine).getp(); else throw layout_error("CSailWorker::LayoutVertical -1 : intersection of seam and foot is not a point!"); t1[npanel] = 1; // type1=1= foot intersection vertically cut panels if ( p1[npanel].x() <= tack.x() ) { // last panel p1[npanel] = tack; t1[npanel] = 1; p2[npanel] = tack; t2[npanel] = 2; flag = true; // set the FLAG to get out of FOR } else { // normal panel if ( seamL.intersect(gaffLine).getdim() == 0 ) p2[npanel] = seamL.intersect(gaffLine).getp(); else throw layout_error("CSailWorker::LayoutVertical -2 : intersection of seam and gaff is not a point!"); if ( CVector3d(p2[npanel]-head) * gaffV > 0 ) t2[npanel] = 3; else { if ( seamL.intersect(luffLine).getdim() == 0 ) p2[npanel] = seamL.intersect(luffLine).getp(); else throw layout_error("LayoutVertical -3 : intersection of seam and luff is not a point!"); t2[npanel] = 2; } } // fill right side points if ( t2[npanel-1] == 2 && t2[npanel] == 2 ) { // printf ("full luff \n"); lay[npanel-1].right.fill(p2[npanel-1], p2[npanel]); for (k = 0; k < npl; k++) lay[npanel-1].right[k] = EdgeIntersect( LUFF_EDGE, lay[npanel-1].right[k], seamV); } else if ( t2[npanel-1] == 3 && t2[npanel] == 2 ) { // printf ("gaff-head-luff \n"); lay[npanel-1].right.fill(p2[npanel-1], head, p2[npanel]); for (k = 0; k < npl/2; k++) lay[npanel-1].right[k] = EdgeIntersect( GAFF_EDGE, lay[npanel-1].right[k], seamV); for (k = npl/2+1; k < npl; k++) lay[npanel-1].right[k] = EdgeIntersect( LUFF_EDGE, lay[npanel-1].right[k], seamV); } else { // printf ("full gaff \n"); lay[npanel-1].right.fill(p2[npanel-1], p2[npanel]); for (k = 0; k < npl; k++) lay[npanel-1].right[k] = EdgeIntersect( GAFF_EDGE, lay[npanel-1].right[k], seamV); } // fill left side points which are all on foot lay[npanel-1].left.fill(p1[npanel-1], p1[npanel]); for (k = 0; k < npl; k++) lay[npanel-1].left[k] = EdgeIntersect( FOOT_EDGE, lay[npanel-1].left[k], leechV); // fill bottom points lay[npanel-1].bottom.fill(lay[npanel-1].left[0], lay[npanel-1].right[0]); if ( npanel == 1 ) { // bottom is on the leech for (k = 0; k < npb; k++) lay[npanel-1].bottom[k] = EdgeIntersect( LEECH_EDGE, lay[npanel-1].bottom[k], leechVP); } /* fill top side points on seam */ lay[npanel-1].top.fill(lay[npanel-1].left[npl-1], lay[npanel-1].right[npl-1]); /* Go over all the points and calculate their z */ lay[npanel-1] = Zpanel(lay[npanel-1]); /* Develop the current panel */ if ( npanel == 1 ) dev[npanel-1] = lay[npanel-1].develop(ALIGN_TOP); else { dev[npanel-1] = lay[npanel-1].develop(ALIGN_BOTTOM); // add deviation of previous panel top edge to bottom edge for (k = 1; k < npb-1; k ++) dev[npanel-1].bottom[k] = dev[npanel-1].bottom[k] + deviaPrev[k]; } /* Now we compute the deviation of top edge of developed panel * and straighten this top edge except if this is the top panel */ if ( flag == false ) { vb = CMatrix::rot3d(2 , PI/2)*CVector3d(dev[npanel-1].top[npb-1] -dev[npanel-1].top[0]).unit(); for (k = 1; k < npb-1; k ++) { vk = CVector3d (dev[npanel-1].top[k] - dev[npanel-1].top[0]); v = vb * -(vk*vb); deviation[k] = v; dev[npanel-1].top[k] = dev[npanel-1].top[k] + deviation[k]; } } /* Add the seam and hems allowance */ if ( npanel == 1 ) dev[npanel-1].add6Hems( footHemW, footHemW, seamW, hemsW, hemsW, leechHemW ); else if ( flag == true ) dev[npanel-1].add6Hems( footHemW, footHemW, luffHemW, luffHemW, luffHemW, 0 ); else if ( t2[npanel-1] == 3 && t2[npanel] == 3 ) dev[npanel-1].add6Hems( footHemW, footHemW, seamW, hemsW, hemsW, 0 ); else if ( t2[npanel-1] == 3 && t2[npanel] == 2 ) dev[npanel-1].add6Hems( footHemW, footHemW, seamW, luffHemW, hemsW, 0 ); else dev[npanel-1].add6Hems( footHemW, footHemW, seamW, luffHemW, luffHemW, 0 ); /* Check the width of developed panel and store excess */ exc = dev[npanel-1].boundingRect().height() - clothW; /* Sum previous correction + 80% of current excess of width + 1mm */ exb += 0.8 * exc + 1; } while ( exc > 0 && cnt < 9 ); /* loop as long the excess of width is positive AND counter < 9 */ deviaPrev = deviation; /* Now we reposition the developed panel such that bottom left is X=0 Y=0 */ dev[npanel-1] = dev[npanel-1].reframe(LOW_LEFT); /* check if peak has been reached to break off */ if ( flag == true ) break; } /* Loop FOR next seam */ if ( npanel == MAX_PANELS-1 ) throw layout_error("CSailWorker::LayoutVertical -4 : MAX_PANELS without reaching tack, do increase cloth width "); /* Copy the sails for display */ CPanelGroup sail( npanel ); for (j = 0; j < npanel; j++) sail[j] = lay[j]; /* Copy the developed sail into flatsail */ flatsail = CPanelGroup( npanel ); for (j = 0; j < npanel; j++) flatsail[j] = dev[j]; /* Prepare the displays version of the developed sail */ dispsail = flatsail; for (j = 1; j < npanel; j++) { top = dispsail[j-1].top[0]; bot = dispsail[j].bottom[0]; // translation v to align panel bottom edge origin to previous panel upper edge origin v = top; v.x() -= bot.x(); v.y() += 2 * seamW +10; // adding offset to separate panels vertically dispsail[j] = dispsail[j] + v; } return sail; } /* end layout vertical cut //////// */ /** Creates a WING with horizontal cut layout. * The panels are layed parrallel to the central line of the wing (horizontal cut) * @param flatsail the CPanelGroup object that will hold the developed sail * @param dispsail the CPanelGroup object that will hold the display * version of the developed sail * @return CPanelGroup * @author Robert Laine alias Sailcuter */ CPanelGroup CSailWorker::LayoutWing( CPanelGroup &flatsail, CPanelGroup &dispsail ) const { /* First create arrays p1 and p2 of points at the end of each seams * located on the straight edge of the sail (no round) */ CPoint3d p1[MAX_PANELS], p2[MAX_PANELS]; /* Create two temporary sails lay and the corresponding dev */ CPanelGroup lay(MAX_PANELS); // 3D sail CPanelGroup dev(MAX_PANELS); // developed sail /* Create number of panels */ unsigned int npanel=1, np=1; unsigned int npl= lay[0].right.size(); // number of right/left points unsigned int npb= lay[0].bottom.size(); // number of bottom/top points /* Angle of the half wing from X-Y plane */ real alfa = (180 - dihedralDeg) * PI/360; unsigned int j=0, k=0; bool flag=false; // to check if top of sail is reached /* create arrays t1 and t2 of type of intersection * respectively at points p1 on luff side and p2 on leech side * t=1 seam intersect foot at point p1 * t=2 seam intersect luff * t=3 seam intersect gaff * t=4 seam intersect leech */ int t1[MAX_PANELS], t2[MAX_PANELS]; /* define point ip for intersections */ CPoint3d ip; /* define seamV as the horizontal vector*/ CVector3d seamV(-1,0,0); CSubSpace seamL; /* create variables for the development and edge corrections */ CPoint3d top(0, 0, 0); CPoint3d bot(0, 0, 0); CVector3d v(0, 0, 0); CVector3d vb(0, 0, 0); CVector3d vk(0, 0, 0); /* create variable for edge correction */ vector deviation; deviation.resize(npb); vector deviaPrev; deviaPrev.resize(npb); /* Other edge hem width */ real luffHemW = hemsW; // real luffInnerHemW, footInnerHemW; /* create variable to monitor excess over cloth width */ real CC=0, x=0, y=0; /* seam 0 is on the foot of the sail ending at the clew */ p1[0] = tack; // initialised at tack point p2[0] = clew; t1[0] = 1; t2[0] = 4; // type=4=leech intersection /** Position the seams starting from the centre of the wing (foot) */ for (npanel = 1; npanel < MAX_PANELS-1; npanel++) { p2[npanel] = p2[npanel-1] + (clothW-seamW)/(seamV*leechVP) * leechV.unit(); t2[npanel] = 4; // type2=4=leech intersection for all horizontally cut panels seamL = CSubSpace3d::line(p2[npanel], seamV); if (CVector3d(p2[npanel]-peak)*leechV > 0) // we are above peak, stop last panel { flag = true; p2[npanel] = peak; // check on which side of the sail the previous point p1 is located if ( t1[npanel-1] < 2 ) { // previous seam on foot p1[npanel] = head; t1[npanel] = 2; // set on luff // left points on foot-tack-luff lay[npanel-1].left.fill(p1[npanel-1], tack, p1[npanel]); for (k = 0; k < npl/2; k++) lay[npanel-1].left[k] = EdgeIntersect( FOOT_EDGE, lay[npanel-1].left[k], seamV); for (k = npl/2 +1; k < npl; k++) lay[npanel-1].left[k] = EdgeIntersect( LUFF_EDGE, lay[npanel-1].left[k], seamV); } else if (t1[npanel-1] == 2) { // left points on luff p1[npanel] = head; t1[npanel] = 2; lay[npanel-1].left.fill(p1[npanel-1], p1[npanel]); for (k = 0; k < npl; k++) lay[npanel-1].left[k] = EdgeIntersect( LUFF_EDGE, lay[npanel-1].left[k], seamV); } else { // left points on gaff p1[npanel] = p1[npanel-1]; t1[npanel] = 3; lay[npanel-1].left.fill(p1[npanel-1], p1[npanel]); for (k = 0; k < npl; k++) lay[npanel-1].left[k] = EdgeIntersect( GAFF_EDGE, lay[npanel-1].left[k], seamV); } // fill right points on leech lay[npanel-1].right.fill(p2[npanel-1],p2[npanel]); for (k = 0; k < npl; k++) lay[npanel-1].right[k] = EdgeIntersect( LEECH_EDGE, lay[npanel-1].right[k], seamV); // fill bottom points lay[npanel-1].bottom.fill(lay[npanel-1].left[0], lay[npanel-1].right[0]); // fill top points lay[npanel-1].top.fill(lay[npanel-1].left[npl-1], lay[npanel-1].right[npl-1]); // move all top points of top panel to gaff curve for (k = 1; k < npb-1; k++) lay[npanel-1].top[k] = EdgeIntersect( GAFF_EDGE, lay[npanel-1].top[k], CVector3d (head.y()-peak.y(),peak.x()-head.x(),0)); // end peak panel } else // normal panel { /* find position of luff/seam intersection relative to tack and head */ if ( seamL.intersect(luffLine).getdim() == 0 ) ip = seamL.intersect(luffLine).getp(); else throw layout_error("CSailWorker::LayoutWing -1 : intersection of seam and luff is not a point!"); if ( CVector3d( ip - tack ) * luffV <= 0 ) { // seam intersects foot if ( seamL.intersect(footLine).getdim() == 0 ) p1[npanel] = seamL.intersect(footLine).getp(); else throw layout_error("CSailWorker::LayoutWing -2 : intersection of seam and foot is not a point!"); t1[npanel] = 1; // 1=foot type of intersection if ( npanel == 1 ) { // set lower edge to start at same point p1 p1[0] = p1[npanel]; t1[0] = 1; } } else if ( CVector3d(ip - head) * luffV > 0 ) { // seam intersects gaff if ( seamL.intersect(gaffLine).getdim() == 0 ) p1[npanel] = seamL.intersect(gaffLine).getp(); else throw layout_error("CSailWorker::LayoutWing -3 : intersection of seam and foot is not a point!"); t1[npanel] = 3; // 3=gaff type of intersection } else { // seam intersects luff p1[npanel] = ip; t1[npanel] = 2; // luff if ( npanel == 1 ) { // force seam 0 to start at the tack p1[0] = tack; t1[0] = 2; } } /* We now add the intermediate points on all sides of the normal panel */ /* Below is the code for the left side depending * on t1 for the top side and bottom side */ if ( t1[npanel-1] == 1 && t1[npanel] == 1 ) { // full foot lay[npanel-1].left.fill(p1[npanel-1], p1[npanel]); for (k = 0; k < npl; k++) lay[npanel-1].left[k] = EdgeIntersect( FOOT_EDGE, lay[npanel-1].left[k], seamV); } else if ( t1[npanel-1] == 2 && t1[npanel] == 2 ) { // full luff lay[npanel-1].left.fill(p1[npanel-1], p1[npanel]); for (k = 0; k < npl; k++) lay[npanel-1].left[k] = EdgeIntersect( LUFF_EDGE, lay[npanel-1].left[k], seamV); } else if ( t1[npanel-1] == 3 && t1[npanel] == 3 ) { // full gaff lay[npanel-1].left.fill(p1[npanel-1], p1[npanel]); for (k = 0; k < npl; k++) lay[npanel-1].left[k] = EdgeIntersect( GAFF_EDGE, lay[npanel-1].left[k], seamV); } else if ( t1[npanel-1] == 1 && t1[npanel] == 2 ) { // foot-tack-luff lay[npanel-1].left.fill(p1[npanel-1], tack, p1[npanel]); for (k = 0; k < npl/2; k++) lay[npanel-1].left[k] = EdgeIntersect( FOOT_EDGE, lay[npanel-1].left[k], seamV); for (k = npl/2 +1; k < npl; k++) lay[npanel-1].left[k] = EdgeIntersect( LUFF_EDGE, lay[npanel-1].left[k], seamV); } else if ( t1[npanel-1] == 2 && t1[npanel] == 3 ) { // luff-head-gaff lay[npanel-1].left.fill(p1[npanel-1], head, p1[npanel]); for (k = 0; k < npl / 2; k++) lay[npanel-1].left[k] = EdgeIntersect( LUFF_EDGE, lay[npanel-1].left[k], seamV); for (k = npl/2 +1; k < npl; k++) lay[npanel-1].left[k] = EdgeIntersect( GAFF_EDGE, lay[npanel-1].left[k], seamV); } // end IF ELSE for left side /* Below is the code for the intermediate points of the right side * which are all on the leech for a crosscut layout. */ lay[npanel-1].right.fill(p2[npanel-1],p2[npanel]); for (k = 0; k < npl; k++) lay[npanel-1].right[k] = EdgeIntersect( LEECH_EDGE, lay[npanel-1].right[k], seamV); /* Below is the code for the intermediate points of the top and bottom sides. * The first point is identical to the last point of the left side * The last point is identical to the last point of the right side */ lay[npanel-1].top.fill(lay[npanel-1].left[npl-1], lay[npanel-1].right[npl-1]); lay[npanel-1].bottom.fill(lay[npanel-1].left[0], lay[npanel-1].right[0]); /* Below is the code for the intermediate points of the bottom side of first panel */ if ( npanel == 1 ) { // move bottom side of first panel to foot curve for (k = 1; k < npb -1; k++) lay[0].bottom[k] = EdgeIntersect( FOOT_EDGE, lay[0].bottom[k], CVector3d(0,-1,0)); } } // end else normal panel ///////////////// */ /* Go over all the points and calculate their z */ lay[npanel-1] = Zpanel(lay[npanel-1]); /* Rotate the panel by the dihedral angle */ lay[npanel-1] = lay[npanel-1].rotate(tack , CMatrix::rot3d(0 , alfa) ); /* If it is the first panel, then cut the foot to tack level */ if ( npanel == 1 ) { for (k=0; k < npb-1; k++) lay[0].bottom[k].y() = tack.y(); lay[0].left[0].y() = tack.y(); lay[0].right[0].y() = tack.y(); } /* Develop the current panel */ if ( npanel == 1 ) { dev[npanel-1] = lay[npanel-1].develop(ALIGN_TOP); } else { dev[npanel-1] = lay[npanel-1].develop(ALIGN_BOTTOM); // add deviation of previous panel top edge to bottom edge for (k = 1; k < npb-1; k ++) dev[npanel-1].bottom[k] = dev[npanel-1].bottom[k] + deviaPrev[k]; } /* Now we compute and store the deviation of top edge of * the developed panel and straighten this top edge * except if this is the top panel */ if ( flag == false ) { vb= CMatrix::rot3d(2,PI/2)*CVector3d(dev[npanel-1].top[npb-1] -dev[npanel-1].top[0]).unit(); for (k = 1; k < npb-1; k ++) { vk= CVector3d (dev[npanel-1].top[k] - dev[npanel-1].top[0]); v= vb * -(vk*vb); deviation[k] = v; dev[npanel-1].top[k] = dev[npanel-1].top[k] + deviation[k]; } } /* Add the seam and hems allowance to wing horizontal layout */ if ( npanel == 1 ) dev[npanel-1].add6Hems( luffHemW, luffHemW, seamW, leechHemW, leechHemW, footHemW ); else if ( flag == true ) dev[npanel-1].add6Hems( hemsW, hemsW, hemsW, leechHemW, leechHemW, 0 ); else if ( t1[npanel-1] == 3 && t1[npanel] == 3 ) dev[npanel-1].add6Hems( hemsW, hemsW, seamW, leechHemW, leechHemW, 0 ); else if ( t1[npanel-1] == 2 && t1[npanel] == 3 ) dev[npanel-1].add6Hems( luffHemW, hemsW, seamW, leechHemW, leechHemW, 0 ); else dev[npanel-1].add6Hems( luffHemW, luffHemW, seamW, leechHemW, leechHemW, 0 ); /* Reset the previous panel deviation to the current panel */ deviaPrev = deviation; /* Reposition the developed panel such that * bottom minimum is Y=0 AND most left is X=0 */ dev[npanel-1] = dev[npanel-1].reframe(LOW_LEFT); /* check if peak has been reached to break off */ if ( flag == true ) break; } /* loop FOR next seam ///////////// */ if ( npanel == (MAX_PANELS/2 -1) ) throw layout_error("CSailWorker::LayoutWing -4 : got to MAX_PANELS without reaching head, do increase cloth width "); /** Create the symetrical panels */ np = npanel; for (j = 0; j < np +1; j++) { npanel++; lay[npanel] = lay[j]; dev[npanel] = dev[j]; for (k = 0 ; k < npb ; k++) { lay[npanel].top[k].y() = -lay[npanel].top[k].y(); lay[npanel].bottom[k].y() = -lay[npanel].bottom[k].y(); } for (k = 0 ; k < npl ; k++) { lay[npanel].left[k].y() = -lay[npanel].left[k].y(); lay[npanel].right[k].y() = -lay[npanel].right[k].y(); } } /* Copy the sails for display */ CPanelGroup sail( 2 * npanel +1 ); for (j = 0; j < npanel; j++) sail[j] = lay[j]; /* Copy the developed sail */ flatsail = CPanelGroup( 2 * npanel +1); for (j = 0; j < npanel; j++) { flatsail[j] = dev[j]; } /** Prepare the displays version of the developed sail */ dispsail = flatsail; for (j = 1; j < npanel; j++) { top = dispsail[j-1].top[0]; bot = dispsail[j].bottom[0]; // rotation to align bottom of panel to top of previous panel x = dispsail[j-1].top[npb-1].x()-top.x(); y = dispsail[j-1].top[npb-1].y()-top.y(); CC= atan2(y,x); dispsail[j] = dispsail[j].rotate(bot,CMatrix::rot3d(2,CC)); // translation v to align panel bottom edge origin to previous panel upper edge origin v = CVector3d ( top - CPoint3d(0,0,0) ); v.x() = v.x() - bot.x(); v.y() = v.y() + 2*seamW + 25; // adding offset to separate panels vertically dispsail[j] = dispsail[j] + v; } return sail; } /* end layoutWing = cross cut or horizontal //////////////////// */ /** Creates a radial cut sail. * * @param flatsail the CPanelGroup object that will hold the developed sail * @param dispsail the CPanelGroup object that will hold the display * version of the developed sail * @return CPanelGroup * @author Robert Laine alias Sailcuter */ CPanelGroup CSailWorker::LayoutRadial( CPanelGroup &flatsail, CPanelGroup &dispsail ) const { unsigned int h = 0, j = 0, k = 0, a = 1, b = 1; unsigned int ngLuff = nbLuffGores; // limit of luff gores unsigned int ng1 = 0; // number of central panels //bool flag=false; real x = 0, xm = 0, xp = 0, ym = 0; CPoint3d pt0, pt1, pt2, pt3, pt4, ptCentre, ptFoot; // points /* Create two temporary sails lay and the corresponding dev */ CPanelGroup lay(MAX_PANELS); // 3D sail CPanelGroup dev(MAX_PANELS); // developed sail /* create number of panels */ unsigned int npanel = 1; unsigned int npl = lay[0].right.size(); // number of right/left points unsigned int npb = lay[0].bottom.size(); // number of bottom/top points unsigned int nps[10]; // number of panels per sections /* create arrays t1 and t2 of type of intersection * respectively at points p1 on luff side and p2 on leech side * t=1 seam intersect foot at point p1 * t=2 seam intersect luff * t=3 seam intersect gaff * t=4 seam intersect leech */ // int t1[MAX_PANELS], t2[MAX_PANELS]; /* create variables for the development and edge corrections */ CPoint3d top(0, 0, 0); CPoint3d bot(0, 0, 0); CVector3d v(0, 0, 0); CVector3d vb(0, 0, 0); CVector3d vk(0, 0, 0); /* create variable for edge correction */ vector deviation; deviation.resize(npb); /* Other edge hem width */ // real footHemW = hemsW; // real luffHemW = hemsW; // real luffInnerHemW, footInnerHemW; /* Create arrays of points at horizontal seams ends (10 maximum) */ CPoint3d luffH[10]; // point at the luff end of the horizontal seam CPoint3d leechH[10]; // point at the leech end of the horizontal seam CSubSpace seamH[10]; // corresponding seam lines CSubSpace seamL; // a seam line h = 0; luffH[h] = tack; leechH[h] = clew; seamH[h] = footLine; for (h = 1; h < nbSections; h++) { pt1 = tack + luffV * (real(h) / nbSections ); pt2 = clew + leechV * (real(h) / nbSections ); luffH[h] = EdgeIntersect( LUFF_EDGE, pt1, CVector3d( pt1 - pt2 ) ); leechH[h] = EdgeIntersect( LEECH_EDGE, pt2, CVector3d( pt2 - pt1) ); seamH[h] = CSubSpace3d::line(luffH[h], CVector3d( leechH[h] - luffH[h] )); } h = nbSections; // one more horizontal line than nbSections luffH[h] = head; leechH[h] = peak; seamH[h] = gaffLine; /* Create arrays of points on luff and leech catenaries * Luff and leech catenaries are the lines going from each side * of the middle panel of the gaff to the tack and clew. * They separate the surface of the sail in 3 zones: * the luff zone, the central zone and the leech zone. * The luff and leech zone have the same number of radial * panels from top to bottom while in the central zone * the number of panels increase by one at each section. */ CPoint3d luffCatenary[11] , leechCatenary[11]; // top point on luff catenary pt0 = head + gaffV * ( real(ngLuff) / real(nbGores) ); luffCatenary[nbSections] = pt0; // top point on leech catenary pt0 = head + gaffV * ( real(ngLuff+1) / real(nbGores) ); leechCatenary[nbSections] = pt0; // top of leech catenary // other points on both catenaries for (h = nbSections-1 ; h > 0 ; h--) { pt0 = tack + footV*(real(h) / real(nbSections))*(real(ngLuff) / real(nbGores)); seamL = CSubSpace3d::line(luffCatenary[h+1], CVector3d(pt0 - luffCatenary[h+1])); luffCatenary[h] = seamH[h].intersect(seamL).getp(); pt0 = clew - footV*(real(h) / real(nbSections))*(real(nbGores-ngLuff) / real(nbGores)); seamL = CSubSpace3d::line(leechCatenary[h+1], CVector3d(pt0 - leechCatenary[h+1])); leechCatenary[h] = seamH[h].intersect(seamL).getp(); } h = 0; luffCatenary[h] = tack; leechCatenary[h] = clew; /* Now we cut the radial panels * Panels are oriented with lower and upper edges on vertical catenary * Bottom side is on luff side and top side is on leech side * Left side is at the top of each section * p1 p2 are the end point of bottom side with * p1 = top of horizontal section, p2 = bottom of horizontal section * The seams between sections are twice the normal seam width */ npanel = 0; ng1 = 0; // initialise number of central panels /** Lay the panels from the top section downward to the foot section. */ for (h = nbSections; h > 0; h--) { nps[h] = 0; // counter of panels in current section /* Cutting the luff side panels * which are left of the catenary separating the vertical zones */ for (j = 1; j <= ngLuff; j++) { if ( j == 1 ) { // place bottom end points on luff catenary pt1 = luffH[h]; pt2 = luffH[h-1]; lay[npanel].bottom.fill( pt1, pt2 ); for (k = 1 ; k < npb -1 ; k++) lay[npanel].bottom[k] = EdgeIntersect( LUFF_EDGE, lay[npanel].bottom[k] , CVector3d( luffH[h-1] - leechH[h-1] ) ); } else { // copy previous points pt1 = pt3; pt2= pt4; lay[npanel].bottom.fill( pt1, pt2 ); } // we compute the top end points pt3 = luffH[h] + CVector3d( luffCatenary[h] - luffH[h] ) * (real(j) / ngLuff); if ( h == nbSections ) pt3 = EdgeIntersect( GAFF_EDGE, pt3, gaffVP ); pt4 = luffH[h-1] + CVector3d( luffCatenary[h-1] - luffH[h-1] ) * (real(j) / ngLuff); // we fill the other edges lay[npanel].top.fill( pt3 , pt4 ); lay[npanel].left.fill( pt1 , pt3 ); lay[npanel].right.fill( pt2 , pt4 ); if ( h == nbSections ) { for (k = 1; k < npl -1; k++) lay[npanel].left[k] = EdgeIntersect( GAFF_EDGE, lay[npanel].left[k] , gaffVP ); } // We compute Z lay[npanel] = Zpanel(lay[npanel]); // We develop the current panel dev[npanel] = lay[npanel].develop(ALIGN_TOP); // We add the seams and hems allowance if ( h == nbSections ) { if ( j == 1 ) dev[npanel].addHems(hemsW, seamW, 0, hemsW); else dev[npanel].addHems(hemsW, seamW, 0, 0); } else if ( j == 1 ) dev[npanel].addHems(2*seamW, seamW, 0, hemsW); else dev[npanel].addHems(2*seamW, seamW, 0, 0); nps[h]++; npanel++; } /* Cut the middle panels which are between the * vertical catenaries luff and leech sides. */ if ( h > 1 ) { ng1++; // we add one more central panel than section above a = int(floor(real(ng1) / 2) ); b = int(ceil(real(ng1) / 2) ); // we initialise the bottom end points pt3 = luffCatenary[h]; if ( h == nbSections ) pt3 = EdgeIntersect( GAFF_EDGE, pt3 , gaffVP ); pt4 = luffCatenary[h-1]; // we now compute the other points for (j = 1; j <= ng1; j++) { pt1 = pt3; pt2 = pt4; pt4 = luffCatenary[h-1] + CVector3d( leechCatenary[h-1] - luffCatenary[h-1] ) * (real(j) / ng1); if ( ng1 < 4 ) { pt3 = luffCatenary[h] + CVector3d( leechCatenary[h] - luffCatenary[h] ) * (real(j) / ng1); if ( h == nbSections ) pt3 = EdgeIntersect( GAFF_EDGE, pt3 , gaffVP ); } else { if ( j < a ) // before middle point { pt3 = luffCatenary[h] + CVector3d( leechCatenary[h] - luffCatenary[h] ) * (real(j) / (ng1-1)); } else if ( j > b ) // after middle point { pt3 = luffCatenary[h] + CVector3d( leechCatenary[h] - luffCatenary[h] ) * (real(j-1) / (ng1-1)); } else { pt3 = luffCatenary[h] + CVector3d( leechCatenary[h] - luffCatenary[h] ) * (real(j) / ng1); } } // we fill the 4 edges lay[npanel].left.fill( pt1 , pt3 ); lay[npanel].right.fill( pt2 , pt4 ); lay[npanel].bottom.fill( pt1 , pt2 ); lay[npanel].top.fill( pt3 , pt4 ); if ( h == nbSections ) { for (k = 1; k < npl-1; k++) lay[npanel].left[k] = EdgeIntersect( GAFF_EDGE, lay[npanel].left[k] , gaffVP ); } // Now we go over all the points and calculate their z lay[npanel] = Zpanel(lay[npanel]); // We develop the current panel dev[npanel] = lay[npanel].develop(ALIGN_TOP); // We add the seams and hems allowance if ( h == nbSections ) dev[npanel].addHems(hemsW, seamW, 0, 0); else dev[npanel].addHems(2*seamW, seamW, 0, 0); nps[h]++; npanel++; } } else // h = 1 middle panels of bottom section { // luff side central for (j = 1; j <= (ng1 / 2); j++) { pt1 = luffCatenary[h] + CVector3d( leechCatenary[h] - luffCatenary[h] ) * (real(j-1) / ng1); pt2 = tack; pt3 = luffCatenary[h] + CVector3d( leechCatenary[h] - luffCatenary[h] ) * (real(j) / ng1); pt4 = pt2; ptCentre = pt3; // memorise last point on horizontal seam 1 lay[npanel].left.fill(pt1 , pt3); lay[npanel].right.fill(pt2 , pt4); lay[npanel].bottom.fill(pt1 , pt2); lay[npanel].top.fill(pt3 , pt4); // compute Z lay[npanel] = Zpanel(lay[npanel]); // We develop the current panel dev[npanel] = lay[npanel].develop(ALIGN_TOP); // We add the seams allowance dev[npanel].addHems(2*seamW, seamW, 0, 0); nps[h]++; npanel++; } // luff side lower central pt0 = ( luffCatenary[nbSections] + leechCatenary[nbSections] ) * 0.5; ptFoot = EdgeIntersect( FOOT_EDGE, ptCentre , CVector3d(ptCentre - pt0) ); a = int( (CVector3d (ptFoot - ptCentre).norm()) / (clothW) ); if (a < 2) a = 2; for (j = 1 ; j <= a ; j++) { // from center to foot pt1 = ptCentre + CVector3d (ptFoot - ptCentre) * (real(j-1) / a); pt2 = tack; pt3 = ptCentre + CVector3d (ptFoot - ptCentre) * (real(j) / a); pt4 = pt2; lay[npanel].left.fill( pt1 , pt3 ); lay[npanel].right.fill( pt2 , pt4 ); lay[npanel].bottom.fill( pt1 , pt2 ); lay[npanel].top.fill( pt3 , pt4 ); if ( j == a ) { for (k = 0; k < lay[npanel].top.size(); k++) lay[npanel].top[k] = EdgeIntersect(FOOT_EDGE, lay[npanel].top[k], CVector3d(ptFoot - ptCentre)); } // compute Z lay[npanel] = Zpanel(lay[npanel]); // We develop the current panel dev[npanel] = lay[npanel].develop(ALIGN_TOP); // We add the seams and hems allowance if ( j == a ) dev[npanel].addHems(seamW, footHemW, 0, 0); else dev[npanel].addHems(seamW, seamW, 0, 0); nps[h]++; npanel++; } // leech side lower central for (j = 1; j <= a; j++) { // from foot to center pt1 = ptFoot + CVector3d ( ptCentre - ptFoot ) * (real(j-1) / a ); pt2 = clew; pt3 = ptFoot + CVector3d ( ptCentre - ptFoot ) * (real(j) / a); pt4 = pt2; lay[npanel].left.fill( pt1, pt3 ); lay[npanel].right.fill( pt2, pt4 ); lay[npanel].bottom.fill( pt1, pt2 ); lay[npanel].top.fill( pt3, pt4 ); if ( j == 1 ) { for (k = 0; k < lay[npanel].bottom.size(); k++) lay[npanel].bottom[k] = EdgeIntersect(FOOT_EDGE, lay[npanel].bottom[k], CVector3d(ptFoot - ptCentre)); } // compute Z lay[npanel] = Zpanel(lay[npanel]); // We develop the current panel dev[npanel] = lay[npanel].develop(ALIGN_TOP); // We add the seams and hems allowance if ( j == 1 ) dev[npanel].addHems(0, seamW, 0, footHemW); else dev[npanel].addHems(0, seamW, 0, 0); nps[h]++; npanel++; } // leech side central for (j = ng1/2 +1 ; j <= ng1 ; j++) { pt1 = luffCatenary[h] + CVector3d( leechCatenary[h] - luffCatenary[h] ) * (real(j-1) / ng1); pt2 = clew ; pt3 = luffCatenary[h] + CVector3d( leechCatenary[h] - luffCatenary[h] ) * (real(j) / ng1); pt4 = pt2; lay[npanel].left.fill( pt1, pt3 ); lay[npanel].right.fill( pt2, pt4 ); lay[npanel].bottom.fill( pt1, pt2 ); lay[npanel].top.fill( pt3, pt4 ); // compute Z lay[npanel] = Zpanel(lay[npanel]); // We develop the current panel dev[npanel] = lay[npanel].develop(ALIGN_TOP); // We add the seams allowance dev[npanel].addHems(2*seamW, seamW, 0, 0); nps[h]++; npanel++; } } /* Cut the leech side panels */ for (j = 1; j < (nbGores - ngLuff); j++) { pt1 = leechCatenary[h] + CVector3d( leechH[h] - leechCatenary[h] ) * (real(j-1) / (nbGores - ngLuff -1) ); if ( h == nbSections ) pt1 = EdgeIntersect( GAFF_EDGE, pt1, gaffVP ); pt2 = leechCatenary[h-1] + CVector3d( leechH[h-1] - leechCatenary[h-1] ) * (real(j-1) / (nbGores - ngLuff -1) ); pt3 = leechCatenary[h] + CVector3d( leechH[h] - leechCatenary[h] ) * (real(j) / (nbGores - ngLuff -1) ); if ( h == nbSections ) pt3 = EdgeIntersect( GAFF_EDGE, pt3, gaffVP ); pt4 = leechCatenary[h-1] + CVector3d( leechH[h-1] - leechCatenary[h-1] ) * (real(j) / (nbGores - ngLuff -1) ); lay[npanel].bottom.fill( pt1, pt2 ); lay[npanel].top.fill( pt3, pt4 ); lay[npanel].left.fill( pt1, pt3 ); lay[npanel].right.fill( pt2, pt4 ); if ( h == nbSections ) { for (k = 1; k < npl -1; k++) lay[npanel].left[k] = EdgeIntersect( GAFF_EDGE, lay[npanel].left[k] , gaffVP ); } if ( j == nbGores - ngLuff -1) { for (k = 1; k < npb -1; k++) lay[npanel].top[k] = EdgeIntersect( LEECH_EDGE, lay[npanel].top[k] , CVector3d(luffH[h-1]-leechH[h-1]) ); } // we compute Z lay[npanel] = Zpanel(lay[npanel]); // We develop the current panel dev[npanel] = lay[npanel].develop(ALIGN_TOP); // We add the seams and hems allowance if ( h == nbSections ) { if ( j == nbGores - ngLuff -1 ) dev[npanel].addHems(hemsW, leechHemW, 0, 0); else dev[npanel].addHems(hemsW, seamW, 0, 0); } else if (j == nbGores - ngLuff -1) dev[npanel].addHems(2*seamW, leechHemW, 0, 0); else dev[npanel].addHems(2*seamW, seamW, 0, 0); nps[h]++; npanel++; } } /* Copy 3d lay into 3d sail */ CPanelGroup sail(npanel); for (j = 0 ; j < npanel ; j ++) sail[j] = lay[j]; /* Copy from temporary developed sail into flatsail */ flatsail = CPanelGroup(npanel); for (j = 0; j < npanel; j++) flatsail[j] = dev[j]; /* Prepare the displays version of the developed sail */ dispsail = flatsail; j = 0, h = nbSections, k = 0; v = CVector3d(0,0,0); xp = 0; xm = 0; ym = 0; for (j = 0; j < npanel; j++) { if ( k == nps[h] ) { // decrement section and offset x h--; k = 0; xp = xm + 2*seamW +20; // offset for next section v.x() = xp; v.y() = 0; } // translation v to stack panel above previous panel dispsail[j] = dispsail[j] + v; CRect3d pRect = dispsail[j].boundingRect(); ym = pRect.height(); v.y() += ym + 2*seamW +20; // adding offset to separate next panel vertically x = pRect.max.x(); if ( x > xm ) xm = x; k++; } return sail; } /* end layout radial cut ///////////// */ /** Creates a triradial cut sail. //// NOT USED //// * * @param flatsail the CPanelGroup object that will hold the developed sail * @param dispsail the CPanelGroup object that will hold the display * version of the developed sail * @return CPanelGroup * @author Robert Laine alias Sailcuter */ CPanelGroup CSailWorker::LayoutTriRadial( CPanelGroup &flatsail, CPanelGroup &dispsail ) const { unsigned int h=0, j=0, k=0, a=1, b=1; unsigned int ngLuff = nbGores/2; // limit of luff gores unsigned int ng1=0; // number of central panels //bool flag=false; real x=0, xm=0, xp=0, ym=0; CPoint3d pt0, pt1, pt2, pt3, pt4, ptCentre, ptFoot; // points /* Create two temporary sails lay and the corresponding dev */ CPanelGroup lay(MAX_PANELS); // 3D sail CPanelGroup dev(MAX_PANELS); // developed sail /* create number of panels */ unsigned int npanel=1; unsigned int npl= lay[0].right.size(); // number of right/left points unsigned int npb= lay[0].bottom.size(); // number of bottom/top points unsigned int nps[10]; // number of panels per sections /* create arrays t1 and t2 of type of intersection * respectively at points p1 on luff side and p2 on leech side * t=1 seam intersect foot at point p1 * t=2 seam intersect luff * t=3 seam intersect gaff * t=4 seam intersect leech */ // int t1[MAX_PANELS], t2[MAX_PANELS]; /* create variables for the development and edge corrections */ CPoint3d top(0, 0, 0); CPoint3d bot(0, 0, 0); CVector3d v(0, 0, 0); CVector3d vb(0, 0, 0); CVector3d vk(0, 0, 0); /* create variable for edge correction */ vector deviation; deviation.resize(npb); /* Create arrays of points at horizontal seams ends 10 maximum */ CPoint3d luffH[10]; // point at the luff end of the horizontal seam CPoint3d leechH[10]; // point at the leech end of the horizontal seam CSubSpace seamH[10]; // corresponding seam lines CSubSpace seamL; // a seam line for (h=0; h 0; h--) { pt0 = tack + footV*(real(h) / real(2* nbSections)); seamL = CSubSpace3d::line(luffCatenary[h+1], CVector3d(pt0 - luffCatenary[h+1])); luffCatenary[h] = seamH[h].intersect(seamL).getp(); pt0 = clew - footV*(real(h) / real(2* nbSections)); seamL = CSubSpace3d::line(leechCatenary[h+1], CVector3d(pt0 - leechCatenary[h+1])); leechCatenary[h] = seamH[h].intersect(seamL).getp(); } h = 0; luffCatenary[h] = tack; leechCatenary[h] = clew; /* Now cutting the radial panels. * Panels are oriented with lower edge vertical toward luff * and left side at the top of each section */ npanel = 0; ng1 = 0; // initialise number of central panels for (h = nbSections; h>0; h--) { /** Lay the panels from top section downward */ nps[h]=0; // counter of panels in current section /* cutting the luff side panels */ for (j=1; j<=ngLuff; j++) { if (j == 1) { pt1 = luffH[h]; pt2 = luffH[h-1]; lay[npanel].bottom.fill(pt1 , pt2); for (k=1; k 1 ) { ng1++; // add one more central panel than section above a = int(floor(real(ng1)/2)); b = int(ceil(real(ng1)/2)); pt3 = luffCatenary[h]; if (h == nbSections) pt3 = EdgeIntersect( GAFF_EDGE, pt3, gaffVP ); pt4 = luffCatenary[h-1]; for (j=1; j<=ng1; j++) { pt1 = pt3; pt2 = pt4; pt4 = luffCatenary[h-1] + CVector3d(leechCatenary[h-1]-luffCatenary[h-1])*(real(j)/ng1); if (ng1 < 4) { pt3 = luffCatenary[h] + CVector3d(leechCatenary[h]-luffCatenary[h])*(real(j)/ng1); if (h == nbSections) pt3 = EdgeIntersect( GAFF_EDGE, pt3, gaffVP ); } else { if (j < a) { pt3 = luffCatenary[h] + CVector3d(leechCatenary[h]-luffCatenary[h])*(real(j)/(ng1-1)); } else if (j > b ) { pt3 = luffCatenary[h] + CVector3d(leechCatenary[h]-luffCatenary[h])*(real(j-1)/(ng1-1)); } else { pt3 = luffCatenary[h] + CVector3d(leechCatenary[h]-luffCatenary[h])*(real(j)/ng1); } } lay[npanel].left.fill(pt1 , pt3); lay[npanel].right.fill(pt2 , pt4); lay[npanel].bottom.fill(pt1 , pt2); lay[npanel].top.fill(pt3 , pt4); if (h == nbSections) { for (k=1; k xm) xm = x; k++; } return sail; } /* end LayoutTriRadial cut ///////// NOT USED /////////// */ /** Creates a mitre cut sail with panels perpendicular to Leech and Foot. * * @param flatsail the CPanelGroup object that will hold the developed sail * @param dispsail the CPanelGroup object that will hold the display * version of the developed sail * @return CPanelGroup * @author Robert Laine alias Sailcuter */ CPanelGroup CSailWorker::LayoutMitre( CPanelGroup &flatsail, CPanelGroup &dispsail ) const { /* First create arrays p1 and p2 of points at the end of each seams * located on the straight edge of the sail (no round) */ CPoint3d p1[MAX_PANELS], p2[MAX_PANELS]; /* Create two temporary sails lay and the corresponding dev */ CPanelGroup lay(MAX_PANELS); // 3D sail CPanelGroup dev(MAX_PANELS); // developed sail /* create number of panels */ unsigned int npanelFoot = 1, npanel = 1; unsigned int npl= lay[0].right.size(); // number of right/left points unsigned int npb= lay[0].bottom.size(); // number of bottom/top points unsigned int j = 0, k = 0, cnt = 0; bool flag = false; /* create arrays t1 and t2 of type of intersection * respectively at points p1 on luff side and p2 on leech side * t=1 seam intersect foot at point p1 * t=2 seam intersect luff * t=3 seam intersect gaff * t=4 seam intersect leech * t=5 seam intersect mitre */ int t1[MAX_PANELS], t2[MAX_PANELS]; /* define point ip for intersections */ CPoint3d ip; /* seam Line */ CSubSpace seamL; /* create variables for the development and edge corrections */ CPoint3d pt(0, 0, 0); // test point CPoint3d top(0, 0, 0); CPoint3d bot(0, 0, 0); CVector3d v(0, 0, 0); CVector3d vb(0, 0, 0); CVector3d vk(0, 0, 0); /* create variable for edge correction */ vector deviation; deviation.resize(npb); vector deviaPrev; deviaPrev.resize(npb); /** Mitre Hem Width is set at twice the Seam Width. */ real mitreHemW = 2 * seamW; /* Other edge hem width */ real luffHemW = hemsW; // real luffInnerHemW, footInnerHemW; /* seam 0 is on the foot of the sail ending at the clew */ p1[0] = clew; // initialised at clew point p2[0] = clew; t1[0] = 1; t2[0] = 5; // type=5=mitre intersection /** First Cut the foot panels perpendicular to the foot, * starting at the clew and moving toward the tack. */ for ( npanel = 1 ; npanel < (MAX_PANELS / 2) -1 ; npanel++ ) { real exb = 0; // total correction real exc = 0; // current excess of width cnt = 0; /* Loop for optimising the seam position to fit cloth width */ do { cnt++; // move base point along the foot pt = p1[npanel-1] - (clothW - seamW - exb) * footV.unit(); seamL = CSubSpace3d::line( pt , footVP ); p1[npanel] = seamL.intersect(footLine).getp(); t1[npanel] = 1; // type 1=foot intersection if ( p1[npanel].x() <= tack.x() ) { // last panel p1[npanel] = tack; if ( t2[npanel-1] == 5 ) { p2[npanel] = mitreLuffPt; t2[npanel] = 5; } else { p2[npanel] = tack; t2[npanel] = 2; } flag = true; // set to get out of FOR } else { // normal panel p2[npanel] = seamL.intersect(mitreLine).getp(); if ( CVector3d(p2[npanel] - mitreLuffPt) * mitreV > EPS ) { t2[npanel] = 2; p2[npanel] = seamL.intersect(luffLine).getp(); } else { t2[npanel] = 5; } } // fill right side points if ( t2[npanel-1] == 2 && t2[npanel] == 2 ) { lay[npanel-1].right.fill(p2[npanel-1] , p2[npanel]); for (k=0; k 0 && cnt < 9 ); /* loop as long the excess of width is positive AND counter < 9 */ deviaPrev = deviation; /* Now we reposition the developed panel such that bottom left is X=0 Y=0 */ dev[npanel-1] = dev[npanel-1].reframe(LOW_LEFT); /* check if peak has been reached to break off */ if ( flag == true ) break; } /* Loop FOR next foot panel seam /////////// */ /* Store the number of panels in foot */ npanelFoot = npanel; if (npanel == MAX_PANELS/2 -1) throw layout_error("CSailWorker::LayoutMitre -5 : Foot got to MAX_PANELS/2 without reaching tack, do increase cloth width."); p1[npanel] = clew; // re-initialising at clew point p2[npanel] = clew; t1[npanel] = 5; // type=5=mitre intersection t2[npanel] = 4; // type=4=leech intersection /** Then lay the leech panels perpendicular to the leech, * starting from clew and moving upwards to the peak. */ flag = false; for ( npanel = npanel +1 ; npanel < MAX_PANELS -1 ; npanel++ ) { real exb = 0; // total correction real exc = 0; // current excess of width cnt = 0; // reset counter of iterations /* Loop for optimising the seam position to fit cloth width */ do { cnt++; p2[npanel] = p2[npanel-1] + (clothW -seamW -exb) * leechV.unit(); t2[npanel] = 4; // type2=4=leech intersection for all horizontally cut panels seamL = CSubSpace3d::line(p2[npanel] , leechVP); if (CVector3d(p2[npanel]-peak) * leechV >= 0) { // we are above peak, stop last panel flag = true; p2[npanel] = peak; // check on which side of the sail the previous point p1 is located if ( t1[npanel-1] == 5 ) { // previous seam on mitre p1[npanel] = head; t1[npanel] = 2; // set on luff // left points on mitrePt-head lay[npanel-1].left.fill(p1[npanel-1] , mitreLuffPt , p1[npanel]); for (k = npl/2 +1 ; k < npl ; k++) lay[npanel-1].left[k] = EdgeIntersect( LUFF_EDGE, lay[npanel-1].left[k], leechVP); } else if ( t1[npanel-1] == 2 ) { // left points on luff p1[npanel] = head; t1[npanel] = 2; lay[npanel-1].left.fill(p1[npanel-1], p1[npanel]); for (k=0; k 0 ) { // seam intersects gaff p1[npanel] = seamL.intersect(gaffLine).getp(); t1[npanel] = 3; // gaff type of intersection } else { // seam intersects luff p1[npanel] = ip; t1[npanel] = 2; // luff } } /* We now add intermediate points on all sides of the normal panel */ /* Below is the code for the left side depending * on t1 for the top side and bottom side */ if ( t1[npanel-1] == 2 && t1[npanel] == 2 ) { // full luff lay[npanel-1].left.fill(p1[npanel-1] , p1[npanel]); for (k = 0 ; k < npl ; k++) lay[npanel-1].left[k] = EdgeIntersect( LUFF_EDGE, lay[npanel-1].left[k], leechVP); } else if ( t1[npanel-1] == 3 && t1[npanel] == 3 ) { // full gaff lay[npanel-1].left.fill(p1[npanel-1] , p1[npanel]); for (k = 0 ; k < npl ; k++) lay[npanel-1].left[k] = EdgeIntersect( GAFF_EDGE, lay[npanel-1].left[k] , leechVP); } else if ( (t1[npanel-1] == 2) && (t1[npanel] == 3) ) { // luff-head-gaff lay[npanel-1].left.fill(p1[npanel-1] , head , p1[npanel]); for (k = 0 ; k < npl/2 ; k++) lay[npanel-1].left[k] = EdgeIntersect( LUFF_EDGE, lay[npanel-1].left[k] , leechVP); for (k = npl/2 +1 ; k < npl ; k++) lay[npanel-1].left[k] = EdgeIntersect( GAFF_EDGE, lay[npanel-1].left[k] , leechVP); } else if ( (t1[npanel-1] == 5) && (t1[npanel] == 2) ) { // mitre-luff lay[npanel-1].left.fill(p1[npanel-1] , mitreLuffPt , p1[npanel]); for (k = 0 ; k < npl/2 ; k++) lay[npanel-1].left[k] = MitreIntersect(lay[npanel-1].left[k] , leechVP); for (k=npl/2+1; k 0 && cnt < 9 ); /* loop as long the excess of width is positive AND counter < 9 */ for (k = 0 ; k < npb ; k++) deviaPrev[k] = deviation[k]; /* Now we reposition the developed panel such that bottom left is X=0 Y=0 */ dev[npanel-1] = dev[npanel-1].reframe(LOW_LEFT); /* check if peak has been reached to break off */ if ( flag == true ) break; } /* loop FOR next seam of leech panels */ if ( npanel == MAX_PANELS-1 ) throw layout_error("CSailWorker::LayoutMitre -3 : Leech got to MAX_PANELS without reaching head, you need to increase cloth width "); /* Copy the sails for display */ CPanelGroup sail(npanel); for (j = 0; j < npanel; j++) sail[j] = lay[j]; /* Copy the developed sail into flatsail */ flatsail = CPanelGroup(npanel); for (j = 0 ; j < npanel ; j++) flatsail[j] = dev[j]; /* Prepare the displays version of the developed sail */ dispsail = flatsail; for (j = 1 ; j < npanel ; j++) { top = dispsail[j-1].top[0]; bot = dispsail[j].bottom[0]; // translation v to align panel bottom edge origin to previous panel upper edge origin v = top; v.x() -= bot.x(); v.y() += 2 * seamW +10; // adding offset to separate panels vertically dispsail[j] = dispsail[j] + v; } return sail; } /* end layoutMitre cut //////////////////// */ /** Creates a Mitre 2 cut sail with panels Parallel to Leech & Foot. * * @param flatsail the CPanelGroup object that will hold * the developed sail * @param dispsail the CPanelGroup object that will hold * the display version of the developed sail * @return CPanelGroup * @author Robert Laine alias Sailcuter * Adapted by Peter G. Meuse */ CPanelGroup CSailWorker::LayoutMitre2( CPanelGroup &flatsail, CPanelGroup &dispsail ) const { /* First create arrays p1 and p2 of points at the end of each seams * located on the straight edge of the sail (no round) */ CPoint3d p1[MAX_PANELS], p2[MAX_PANELS]; /* Create two temporary sails lay and the corresponding dev */ CPanelGroup lay(MAX_PANELS); // 3D sail CPanelGroup dev(MAX_PANELS); // developed sail /* create number of panels */ unsigned int npanelFoot = 1, npanel = 1; unsigned int npl = lay[0].right.size(); // number of right/left points unsigned int npb = lay[0].bottom.size(); // number of bottom/top points unsigned int j = 0, k = 0, cnt = 0, cntMax = 9; bool flag = false; /* create arrays t1 and t2 of type of intersection * respectively at points p1 on luff side and p2 on leech side * t=1 seam intersect foot at point p1 * t=2 seam intersect luff * t=3 seam intersect gaff * t=4 seam intersect leech * t=5 seam intersect mitre */ int t1[MAX_PANELS], t2[MAX_PANELS]; /* define point ip for intersections */ CPoint3d ip; /* define seam line */ CSubSpace seamL; /* create variables for the development and edge corrections */ CPoint3d pt(0, 0, 0); // test point CPoint3d top(0, 0, 0); CPoint3d bot(0, 0, 0); CVector3d v(0, 0, 0); CVector3d vb(0, 0, 0); CVector3d vk(0, 0, 0); /* create variable for edge correction */ vector deviation; deviation.resize(npb); vector deviaPrev; deviaPrev.resize(npb); /* create variable to monitor excess over cloth width */ real exb = 0, exc = 0; /** Mitre Hem Width is set at twice the Seam Width. */ real mitreHemW = 2 * seamW; /* Other edge hem */ real luffHemW = hemsW; // real luffInnerHemW, footInnerHemW; /** Start by laying the foot panels parallel to the foot, * from the foot upward toward the mitre */ p1[0] = tack; // initialised at clew point p2[0] = clew; // initialised at tack point t1[0] = 2; // type 2=luff intersection. t2[0] = 5; // type 5=mitre intersection for ( npanel = 1; npanel < MAX_PANELS/2-1; npanel++ ) { // cout << " ----- FOR LOOP foot npanel = " << npanel << endl; exb = 0; exc = 0; cnt = 0; // reset counter /* begin the loop for optimising the seam position to fit cloth width */ do { cnt++; // move base point perpendicular to foot pt = p1[npanel-1] + (clothW -seamW -exb) * footVP.unit(); seamL = CSubSpace3d::line( pt, footV ); // find intersection on luff and mitre if ( seamL.intersect(luffLine).getdim() == 0 ) { p1[npanel] = seamL.intersect(luffLine).getp(); t1[npanel] = 2; } else throw layout_error("CSailWorker::LayoutMitre2 foot-a : intersection of seam and luff is not a point!"); // the case when the intersection is not a point needs to be handled if ( seamL.intersect(mitreLine).getdim() == 0 ) { p2[npanel] = seamL.intersect(mitreLine).getp(); t1[npanel] = 5; } else throw layout_error("CSailWorker::LayoutMitre2 foot-b : intersection of seam and mitre is not a point!"); // the case when the intersection is not a point needs to be handled // check if top seam is past luff mitre point if ( CVector3d(p2[npanel] - mitreLuffPt) * mitreV > EPS ) { // last foot panel is meeting Mitre luff point p1[npanel] = mitreLuffPt; p2[npanel] = p2[npanel-1]; // new top edge on mitre // old code p2[npanel] = mitreLuffPt; t2[npanel] = 2; flag = true; // set to get out of FOR loop } // fill right side points which are all on mitre lay[npanel-1].right.fill( p2[npanel-1], p2[npanel] ); for ( k = 0; k < npl; k++ ) lay[npanel-1].right[k] = MitreIntersect( lay[npanel-1].right[k], footV ); // fill left side points which are all on luff lay[npanel-1].left.fill( p1[npanel-1], p1[npanel] ); for ( k = 0; k < npl; k++ ) lay[npanel-1].left[k] = EdgeIntersect( LUFF_EDGE, lay[npanel-1].left[k], footV ); // fill bottom points lay[npanel-1].bottom.fill( lay[npanel-1].left[0], lay[npanel-1].right[0] ); if ( npanel == 1 ) { // bottom is on the foot for ( k = 0; k < npb; k++ ) lay[npanel-1].bottom[k] = EdgeIntersect( FOOT_EDGE,lay[npanel-1].bottom[k], footVP ); } // fill top side points on seam lay[npanel-1].top.fill( lay[npanel-1].left[npl-1], lay[npanel-1].right[npl-1] ); /* Now we go over all the points and calculate their Z */ lay[npanel-1] = Zpanel(lay[npanel-1]); /* Now we develop the current panel */ if ( npanel == 1 ) dev[npanel-1] = lay[npanel-1].develop(ALIGN_TOP); else { dev[npanel-1] = lay[npanel-1].develop(ALIGN_BOTTOM); // add deviation of previous panel top edge to bottom edge for( k = 1; k < npb-1; k ++) dev[npanel-1].bottom[k] = dev[npanel-1].bottom[k] + deviaPrev[k]; } /* Now we compute the deviation of top edge of developed panel * and straighten this top edge except if this is the top panel */ if ( flag == false ) { vb = CMatrix::rot3d(2, PI/2) * CVector3d(dev[npanel-1].top[npb-1] -dev[npanel-1].top[0]).unit(); for( k = 1; k < npb-1; k ++) { vk= CVector3d (dev[npanel-1].top[k] - dev[npanel-1].top[0]); v = vb * -(vk*vb); deviation[k] = v; dev[npanel-1].top[k] = dev[npanel-1].top[k] + deviation[k]; } } /* Now we add the seam and hems allowance to the foot panels */ if ( npanel == 1 ) // Foot panel dev[npanel-1].add6Hems( luffHemW, luffHemW, seamW, mitreHemW, mitreHemW, footHemW ); else if ( flag == true ) // last foot section panel dev[npanel-1].add6Hems( luffHemW, luffHemW, mitreHemW, mitreHemW, 1.5*mitreHemW, 0 ); else // Normal Panel dev[npanel-1].add6Hems( luffHemW, luffHemW, seamW, mitreHemW, mitreHemW, 0 ); /* Now we check the width of developed panel */ exc = dev[npanel-1].boundingRect().height() - clothW; // current excess of width exb = exb + (0.8 * exc) +1; // sum previous correction + 80% of current excess of width +1mm if (cnt == cntMax) cout << "CSailcorker::LayoutMitre2 Foot panel " << npanel << " may be wider than cloth by " << exc << "mm." << endl; } while ( exc > 0 && cnt < cntMax ); /* Loop DO as long as the excess of width is positive AND counter <9 */ deviaPrev = deviation; /* Reposition the developed panel such that bottom left is X=0 Y=0 */ dev[npanel-1] = dev[npanel-1].reframe(LOW_LEFT); /* Check if peak has been reached to break off */ if ( flag == true ) break; } /* Loop FOR next seam */ /* Store the number of panels in the foot area */ npanelFoot = npanel; if ( npanelFoot == MAX_PANELS/2 -1 ) throw layout_error("CSailWorker::LayoutMitre2 : Foot got to MAX_PANELS/2 without reaching Mitre intersection at Luff. Please increase cloth width."); /** Continue by laying the leech panels parallel to the leech, * from the leech toward the luff intersection with the mitre. */ p1[npanel] = clew; // re-initialising at clew point. p2[npanel] = peak; // initialise at the peak. t1[npanel] = 5; // type=5=mitre intersection. t2[npanel] = 3; // type=3=gaff intersection. flag = false; for (npanel = npanelFoot+1; npanel < MAX_PANELS-1; npanel++) { // printf(" ----- FOR panel = %d \n" , npanel); exb = 0; exc = 0; cnt = 0; // reset loop counter /* begin the loop for optimising the seam position to fit cloth width */ do { cnt++; /* Determine width of Panel Perpendicular to Leech side. */ pt = p1[npanel-1] + (clothW -seamW -exb) * leechVP.unit(); seamL = CSubSpace3d::line(pt, leechV); // find intersection on mitre if ( seamL.intersect(mitreLine).getdim() == 0 ) { p1[npanel] = seamL.intersect(mitreLine).getp(); if ( p1[npanel].x() >= clew.x() ) // point beyong clew p1[npanel] = clew; t1[npanel] = 5; // type1=5= mitre intersection vertically cut panels } else throw layout_error("CSailWorker::LayoutMitre2 leech -c : intersection of seam and mitre is not a point!"); // the case when the intersection is not a point needs to be handled // check if top seam is passed luff mitre point if ( CVector3d(p1[npanel] - mitreLuffPt) * mitreV > EPS) { // last leech panel p1[npanel] = p1[npanel-1]; // new top edge on mitre // old code p1[npanel] = mitreLuffPt; t1[npanel] = 5; // Type=5=Mitre instersection. p2[npanel] = mitreLuffPt; t2[npanel] = 2; // Type=2=Luff intersection. flag=true; // to get out of FOR } else { // printf ("normal panel \n"); if ( seamL.intersect(gaffLine).getdim() == 0 ) p2[npanel] = seamL.intersect(gaffLine).getp(); else throw layout_error("CSailWorker::LayoutMitre2 leech -d : intersection of seam and gaff is not a point!"); /* the case when the intersection is not a point needs to be handled */ if ( CVector3d(p2[npanel]-head)*gaffV > EPS ) t2[npanel] = 3; // Intersect is on the Gaff. else { if ( seamL.intersect(luffLine).getdim() == 0 ) p2[npanel] = seamL.intersect(luffLine).getp(); else throw layout_error ("CSailWorker::LayoutMitre2 leech -e : intersection of seam and luff is not a point!"); /* the case when the intersection is not a point needs to be handled */ t2[npanel] = 2; // Intersect is on the Luff } } // fill right side points if ( t2[npanel-1] == 2 && t2[npanel] == 2 ) { // cout << "CSailWorker::LayoutMitre2 full luff" << endl; lay[npanel-1].right.fill(p2[npanel-1], p2[npanel]); for ( k = 0; k < npl; k++ ) lay[npanel-1].right[k]=EdgeIntersect( LUFF_EDGE, lay[npanel-1].right[k], leechV); } else if ( t2[npanel-1] == 3 && t2[npanel] == 2 ) { // cout << "CSailWorker::LayoutMitre2 gaff-head-luff" << endl; lay[npanel-1].right.fill(p2[npanel-1], head, p2[npanel]); for ( k = 0; k < npl/2; k++ ) lay[npanel-1].right[k] = EdgeIntersect( GAFF_EDGE,lay[npanel-1].right[k], leechV); for ( k = npl/2+1; k < npl; k++ ) lay[npanel-1].right[k] = EdgeIntersect( LUFF_EDGE,lay[npanel-1].right[k], leechV); } else { // cout << "CSailWorker::LayoutMitre2 full gaff << endl; lay[npanel-1].right.fill(p2[npanel-1], p2[npanel]); for ( k = 0; k < npl; k++ ) lay[npanel-1].right[k] = EdgeIntersect( GAFF_EDGE,lay[npanel-1].right[k], leechV); } // fill left side points which are all on the mitre lay[npanel-1].left.fill(p1[npanel-1], p1[npanel]); if (p1[npanel-1] == p1[npanel]) { // clew limit for ( k = 0; k < npl; k++ ) lay[npanel-1].left[k] = lay[npanel-1].left[k]; } else for ( k = 0; k < npl; k++ ) lay[npanel-1].left[k] = MitreIntersect(lay[npanel-1].left[k], leechV); // fill bottom points lay[npanel-1].bottom.fill(lay[npanel-1].left[0], lay[npanel-1].right[0]); if ( npanel == npanelFoot +1 ) { // bottom is on the leech for ( k = 0; k < npb; k++ ) lay[npanel-1].bottom[k] = EdgeIntersect( LEECH_EDGE,lay[npanel-1].bottom[k], leechVP); } // fill top side points on seam lay[npanel-1].top.fill(lay[npanel-1].left[npl-1], lay[npanel-1].right[npl-1]); /* Now we go over all the points and calculate their z */ lay[npanel-1] = Zpanel(lay[npanel-1]); /* Now we develop the current panel */ if ( npanel == npanelFoot +1 ) dev[npanel-1] = lay[npanel-1].develop(ALIGN_TOP); else { dev[npanel-1] = lay[npanel-1].develop(ALIGN_BOTTOM); // add deviation of previous panel top edge to bottom edge for( k = 1; k < npb-1; k ++) dev[npanel-1].bottom[k] = dev[npanel-1].bottom[k] + deviaPrev[k]; } /* Now we compute the deviation of top edge of developed panel * and straighten this top edge except if this is the top panel */ if ( flag == false ) { vb = CMatrix::rot3d(2,PI/2) * CVector3d(dev[npanel-1].top[npb-1] -dev[npanel-1].top[0]).unit(); for( k = 1; k < npb-1; k++ ) { vk = CVector3d (dev[npanel-1].top[k] - dev[npanel-1].top[0]); v = vb * -(vk*vb); deviation[k] = v; dev[npanel-1].top[k] = dev[npanel-1].top[k] + deviation[k]; } } /* Now we add the seam and hems allowance to the leech panels*/ if ( npanel == npanelFoot +1 ) dev[npanel-1].add6Hems( 0, 0, seamW, hemsW, hemsW, leechHemW ); else if( flag == true ) dev[npanel-1].add6Hems( 0, 0, 0, luffHemW, luffHemW, 0 ); // old code dev[npanel-1].add6Hems( 0, 0, luffHemW, hemsW, hemsW, 0 ); else dev[npanel-1].add6Hems( 0, 0, seamW, hemsW, hemsW, 0 ); /* Now we check the width of developed panel and correct for the next loop */ exc = dev[npanel-1].boundingRect().height() - clothW; exb = exb + (0.8 * exc) + 1; // sum previous correction + 80% of current excess of width +1mm if (cnt == cntMax) cout << "CSailWorker::LayoutMitre2 Leech panel " << npanel << " may be wider than cloth by " << exc << "mm." << endl; } while ( exc > 0 && cnt < cntMax ); /* loop DO as long as the excess of width is positive AND counter <9 */ deviaPrev = deviation; /* Now we reposition the developed panel such that bottom left is X=0 Y=0 */ dev[npanel-1] = dev[npanel-1].reframe(LOW_LEFT); /* check if peak has been reached to break off */ if ( flag == true ) break; } /* Loop FOR next seam */ if ( npanel == MAX_PANELS -1 ) throw layout_error("CSailWorker::LayoutMitre2 -f : MAX_PANELS without reaching Miter Intersect Point at Luff. Please increase cloth width."); /* Copy the sails for display */ CPanelGroup sail(npanel); for( j = 0; j < npanel; j++ ) sail[j] = lay[j]; /* Copy the developed sail into flatsail */ flatsail = CPanelGroup(npanel); for ( j = 0; j < npanel; j++ ) flatsail[j] = dev[j]; /* Prepare the displays version of the developed sail */ dispsail = flatsail; for ( j = 1; j < npanel; j++ ) { top = dispsail[j-1].top[0]; bot = dispsail[j].bottom[0]; // translation v to align panel bottom edge origin to previous panel upper edge origin v = top; v.x() -= bot.x(); v.y() += 2*seamW +10; // adding offset to separate panels vertically dispsail[j] = dispsail[j] + v; } return sail; } /* end LayoutMitre2 ////////////////// */ /** Routine used for computing the cord of the profiles. * Return a 3d point which is the aft intersection of * the horizontal line passing by p1 with the leech. * If the point p1 is above or below the leech segment then * the aft intersection is forced to be on the vertical of the * corresponding peak or clew. * * @author Robert Laine alias Sailcuter */ CPoint3d CSailWorker::AftIntersect( const CPoint3d& pt1 ) const { // real x=0, y=0, z=0; // for debugging only CPoint3d pAft = pt1; // aft intersection point is initialised at p1 CVector3d vH = CVector3d( 1, 0, 0 ); if ( pt1.y() >= peak.y() ) { // rear point above the peak, set output on vertical above peak pAft.x() = peak.x(); } else if ( pt1.y() <= clew.y() ) { // rear point on or below the clew, set output on vertical below clew pAft.x() = clew.x(); } else { // move point on leech which is not straight pAft = EdgeIntersect( LEECH_EDGE, pt1, vH ); } // ensure that Z=0 pAft.z() = 0; // return pAft; } /** * Routine for computing the area of the sail taking * into account the luff and leech round. * * @author Robert Laine alias Sailcuter */ real CSailWorker::Area() { real surface = luffV.cross(footV).norm() / 2; surface = surface + leechV.cross(gaffV).norm() / 2; surface = surface + .75*(luffL*luffR + footL*footR + leechL*leechR + gaffL*gaffR); return ( .01 * floor(surface /10000) ); } /** * Routine for computing the diagonal length from head to clew. * * @author Robert Laine alias Sailcuter */ real CSailWorker::Diagonal() { return floor( CVector3d(head-clew).norm() ); } /** * Routine for computing the width of the sail at a given * relative height on the leech in accordance with IRC rule. * * @author Robert Laine alias Sailcuter */ real CSailWorker::IRCwidth( const real &HL ) { unsigned int i, imax=10; real h1=0, h2=0, LL=0, l1=0, w=0; CPoint3d p, p1, p2, p3; //printf ("IRC height = %f \n", HL); /// compute the leech edge length LL h1 = 1; LL = LeechLength( h1 ); //printf ("IRC leech length = %f \n", LL); /* compute the point on leech for relative length HL */ h2 = HL; //do { h1 = h2; l1 = LeechLength(h1); h2 = h1 * (1-(l1 - LL*HL)/(LL*HL)); //printf (" HL=%f l1=%f h1=%f - h2=%f \n", HL, l1, h1, h2); h1 = h2; l1 = LeechLength(h1); h2 = h1 * (1-(l1 - LL*HL)/(LL*HL)); //printf (" HL=%f l1=%f h1=%f - h2=%f \n", HL, l1, h1, h2); } //while ( fabs(h1-h2)>.001 ); /* compute the shortest distance to the real luff */ p1 = clew + leechV*h2; p2 = Zpoint(EdgeIntersect( LEECH_EDGE, p1, leechVP)); p1 = Zpoint(EdgeIntersect( LUFF_EDGE, p2, luffVP)); w = 0; p3 = p1; for (i = 1; i <= imax; i++) { h1 = real(i) / imax; p = Zpoint(p1 +CVector3d(p2 - p1) * h1); w = w + CVector3d(p - p3).norm(); p3 = p; } return ( w ); } /** * Routine for computing the width of the sail at a given * relative height on the luff and the leech. * * @author Robert Laine alias Sailcuter */ real CSailWorker::SailWidth( const real &HL ) { unsigned int i, imax=10; real h=0, h1=0, h2=0, LeL=0, LuL=0, l1=0, w=0; CPoint3d p, p1, p2, p3; //printf ("IRC height = %f \n", HL); // compute the leech edge length LeL h = 1; LeL = LeechLength( h ); //printf ("IOR leech length = %f \n", LeL); /* compute the height of point on leech for relative length HL */ h2 = HL; //do { h = h2; l1 = LeechLength( h ); h2 = h * (1-(l1 - LeL*HL) / (LeL*HL)); //printf (" HL=%f l1=%f h1=%f - h2=%f \n", HL, l1, h, h2); h = h2; l1 = LeechLength(h); h2 = h * (1-(l1 - LeL*HL) / (LeL*HL)); //printf (" HL=%f l1=%f h=%f - h1=%f \n", HL, l1, h, h2); } //while ( fabs(h1-h2)>.001 ); /* compute the luff edge length LuL */ h = 1; LuL = LuffLength( h ); //printf ("IOR luff length = %f \n", LuL); /* compute the height of point on luff for relative length HL */ h1 = HL; //do { h = h1; l1 = LuffLength( h ); h1 = h * (1 - (l1 - LuL*HL) / (LuL*HL) ); //printf (" HL=%f l1=%f h1=%f - h2=%f \n", HL, l1, h, h1); h = h1; l1 = LuffLength( h ); h1 = h * (1 - (l1 - LuL*HL) / (LuL*HL) ); //printf (" HL=%f l1=%f h=%f - h1=%f \n", HL, l1, h, h1); } //while ( fabs(h1-h2)>.001 ); /* compute the shortest distance real leech to the real luff */ p = clew + leechV * h2; p2 = Zpoint(EdgeIntersect( LEECH_EDGE, p , leechVP) ); p = tack + luffV * h1; p1 = Zpoint(EdgeIntersect( LUFF_EDGE, p , luffVP) ); w = 0; p3 = p1; for (i = 1; i <= imax; i++) { h1 = real(i) / imax; p = Zpoint( p1 + CVector3d(p2 - p1) * h1 ); w = w + CVector3d(p - p3).norm(); p3 = p; } return ( w ); } /** * Routine for computing the perpendicular width of the sail * from clew to luff, measured perpendicular to the luff. * * @author Robert Laine alias Sailcuter */ real CSailWorker::SailLP( ) { unsigned int i, imax=10; real h1=0, w=0; CPoint3d p, p1, p2, p3; CVector3d v; p1 = Zpoint( EdgeIntersect( LUFF_EDGE, clew , luffVP) ); v = CVector3d(clew - p1); p2 = p1; // compute the distance from the real luff to clew for (i = 1 ; i <= imax ; i++) { h1 = real(i) / imax; p = p1 + v * h1 ; p.z() = 0; p3 = Zpoint( p ); w = w + CVector3d(p3 - p2).norm(); p2 = p3; } // return ( w ); } /** * Routine for computing the actual length of the leech edge * up to a given relative heigth on straight leech line. * * @author Robert Laine alias Sailcuter */ real CSailWorker::LeechLength( const real &h ) { unsigned int i=0, imax=20; CPoint3d p1, p2, p3; real l=0, h1=0; p1 = clew; for (i = 1; i <= imax; i++) { h1= real(i) / imax; p2 = clew + leechV * (h * h1); p3 = Zpoint( EdgeIntersect( LEECH_EDGE, p2 , leechVP) ); l = l + CVector3d(p3 - p1).norm(); // printf ("step = %f - p2.y = %f - leech length = %f \n", h1, p2.y(), l); p1 = p3; } return ( l ); } /** * Routine for computing the actual length of the luff edge * up to a given relative heigth on straight luff line. * * @author Robert Laine alias Sailcuter */ real CSailWorker::LuffLength( const real &h ) { unsigned int i=0, imax=20; CPoint3d p1=tack, p2, p3; real l=0, h1=0; for (i = 1 ; i < imax ; i++) { h1= real(i) / imax; p2 = tack + luffV * (h * h1); p3 = Zpoint( EdgeIntersect( LUFF_EDGE, p2 , luffVP ) ); l = l + CVector3d(p3 - p1).norm(); p1 = p3; } return ( l ); } /** * Routine used for computing the forward end of the cord of the profile. * Return a 3d point which is the forward intersection of * the horizontal line passing by p1 with either foot, luff or gaff. * * @author Robert Laine alias Sailcuter */ CPoint3d CSailWorker::FwdIntersect( const CPoint3d &pt1 ) const { CPoint3d pFwd = pt1; // forward intersection point initialised at p1 CVector3d vH = CVector3d( 1, 0, 0 ); if ( pt1.y() <= tack.y() ) // point is at or below tack { pFwd.x() = tack.x(); // set forward point on vertical below tack // pFwd.z() = tack.z(); } else if ( pt1.y() < head.y() ) // forward point is on luff curve { pFwd = EdgeIntersect( LUFF_EDGE, pt1, vH ); } else if ( pt1.y() == head.y() ) // point exactly at head height { pFwd.x() = head.x(); // pFwd.z() = head.z(); } else if ( pt1.y() < peak.y() ) { // forward point is on gaff pFwd = EdgeIntersect( GAFF_EDGE, pt1, vH ); } else { // point is above peak pFwd.x() = peak.x(); // set forward point on vertical above peak //pFwd.z() = peak.z(); // } // Ensure Z = 0 pFwd.z() = 0; // return pFwd; } /* end FwdIntersect //////////////// */ /** * Routine used for computing the point position on a sail curved edge. * Return a 3D point which is the intersection of the vector v1 * passing by pt1 point inside sail area with the Edge curve. * * @author Robert Laine alias Sailcuter */ CPoint3d CSailWorker::EdgeIntersect( const enumEdgeType &Edge, const CPoint3d &pt1, const CVector3d &v1 ) const { if ( v1.norm() <= EPS ) throw layout_error("CSailWorker::EdgeIntersect : input vector is nul"); // Input line CSubSpace InputLine = CSubSpace3d::line( pt1 , v1 ); // Edge end points CPoint3d pEnd1, pEnd2; // Edge Vector CVector3d vEdge; // Edge perpendicular vector toward outside of sail CVector3d vpEdge; // Edge round real EdgeR = 0; // Edge round position from end1 toward end2 int EdgeRP; switch ( Edge ) { case LUFF_EDGE: pEnd1 = tack; pEnd2 = head; EdgeR = luffR; EdgeRP = luffRP; vEdge = CVector3d( pEnd2 - pEnd1 ); vpEdge = CMatrix::rot3d(2 , PI/2) * vEdge.unit(); break; case GAFF_EDGE: pEnd1 = head; pEnd2 = peak; EdgeR = gaffR; EdgeRP = gaffRP; vEdge = CVector3d( pEnd2 - pEnd1 ); vpEdge = CMatrix::rot3d(2 , PI/2) * vEdge.unit(); break; case FOOT_EDGE: pEnd1 = tack; pEnd2 = clew; EdgeR = footR; EdgeRP = footRP; vEdge = CVector3d( pEnd2 - pEnd1 ); vpEdge = CMatrix::rot3d(2 , -PI/2) * vEdge.unit(); break; case LEECH_EDGE: pEnd1 = clew; pEnd2 = peak; EdgeR = leechR; EdgeRP = leechRP; vEdge = CVector3d( pEnd2 - pEnd1 ); vpEdge = CMatrix::rot3d(2 , -PI/2) * vEdge.unit(); break; } // Edge line CSubSpace Line2 = CSubSpace3d::line( pEnd1, vEdge ); real h1=0, h2=0, d1=0, d2=0; CPoint3d p0 , p1 , p2 , p3; CVector3d v; // find point p0 at intersection of straight edge with input line if ( InputLine.intersect( Line2 ).getdim() == 0 ) { p0 = InputLine.intersect( Line2 ).getp(); p2 = p0; // default output } else throw layout_error("CSailWorker::EdgeIntersect -1 : intersection with edge is not a point!"); if ( CVector3d(p0 - pEnd1) * vEdge <= 0 ) p2 = pEnd1; // intersection left of edge else if ( CVector3d(p0 - pEnd2) * vEdge >= 0 ) p2 = pEnd2; // intersection right of edge else if ( fabs(EdgeR) > 1 ) { // intersection is on curved edge h1 = CVector3d(p0 - pEnd1).norm() / (vEdge.norm() + EPS); // relative height d1 = EdgeR * RoundP(h1 , EdgeRP); // local depth of edge curve p1 = p0 + vpEdge * d1; // define a line parrallel to edge at distance d1 Line2 = CSubSpace3d::line( p1 , vEdge ); // point2 at intersection of input line with parrallel to edge is always valid p2 = InputLine.intersect( Line2 ).getp(); v = CVector3d( p2 - p1); if ( v.norm() >= EPS ) { // translate point0 on straight edge p3 = p0 + v; // check if p3 is inside edge if ( CVector3d(p3 - pEnd1) * vEdge <= 0 ) // p3 outside left of edge end p2 = pEnd1; else if ( CVector3d(p3 - pEnd2) * vEdge >= 0 ) // p3 outside right of edge end p2 = pEnd2; else { // point is on edge curve h2 = CVector3d(p3 - pEnd1).norm() / (vEdge.norm() + EPS); d2 = EdgeR * RoundP( h2 , EdgeRP ); // local depth of edge curve p2 = p3 + vpEdge * d2; } v = CVector3d ( p2 - p1 ); if ( v.norm() <= EPS ) // keep p1 which is strictly on input line p2 = p1; else { // displaced point 2 and p1 are used for Line2 Line2 = CSubSpace3d::line( p1 , v ); // compute final intersection point p2 p2 = InputLine.intersect( Line2 ).getp(); } } } // return p2; } /* end EdgeIntersect //////////////////// */ /** * Routine used for computing the intersection with mitre line. * Return a 3d point which is the intersection of the vector v1 * passing by pt1 point with the mitre line. * * @author: Robert Laine alias Sailcuter */ CPoint3d CSailWorker::MitreIntersect( const CPoint3d &pt1, const CVector3d &v1 ) const { if ( v1.norm() <= EPS ) throw layout_error("CSailWorker::MitreIntersect : input vector is nul"); // real x=0, y=0, z=0; // for debugging only /* straight line passing through input point */ CSubSpace ptv1 = CSubSpace3d::line(pt1 , v1); CPoint3d p2 = pt1; if ( CVector3d(p2 - clew).norm() <= EPS ) p2 = clew; else { /* point at intersection of input vector and mitre ckecking if it is inside segment or not is in LayoutMitre */ if ( ptv1.intersect(mitreLine).getdim() == 0 ) p2 = ptv1.intersect(mitreLine).getp(); else throw layout_error("CSailWorker::MitreIntersect -1 : intersection with mitre is not a point!"); } return p2; } /** * Routine used for computing the Z of a point of the sail. * Return a 3D point which is the input point p1 with its Z modified. * * @author Robert Laine alias Sailcuter */ CPoint3d CSailWorker::Zpoint( const CPoint3d &p1 ) const { CPoint3d p2 = p1; // p2 will be the returned point with Z added to p1 real x=0, z=0, twist=0, pivotX=0, pos=0, cord=1; CPoint3d pFwd = FwdIntersect( p1 ); // forward end of the cord CPoint3d pAft = AftIntersect( p1 ); // rear end of the cord /* computing local cord of the profile */ cord = CVector3d( pAft - pFwd ).norm(); /* computing Z from normalised position on profile */ if ( cord < 1 ) // to avoid division by cord = zero { pos = 0 ; z = 0; } else // position on profile { pos = ( CVector3d( p1 - pFwd ).norm() ) / cord; /* computing the relative height on the sail */ real h1 = (p1.y() - tack.y()) / (peak.y() - tack.y()); // for mould /* Now computing actual Z including twist and sheeting angle * kluff, kleech, depth coefficient used in z1=f(pos, h1) of the * sailmould are interpolated between the respective profile[0..2]. * The position of profile[1] is driven by vertpos which is * the vertical position of the middle profile entered in the * left vertical pane of formmouldbase. */ z = cord * mould.interpol( h1 ).z(pos); } /* computing the twist from the relative height on straight leech */ real h2 = ( p1.y() - clew.y() ) / leechV.y(); if ( h2 >= 1 ) // above peak h2 = 1; else if ( h2 <= 0 ) // below clew h2 = 0; twist = ( h2 * twistDeg + sheetDeg ) * PI / 180; if ( p1.y() >= head.y() ) // on gaff pivotX = head.x(); else if ( p1.y() <= tack.y() ) // below tack pivotX = tack.x(); else // on luff pivotX = pFwd.x(); x = p1.x() - pivotX; /* applying the twist by rotating the profile around pivotX */ p2.x() = pivotX + x * cos(twist) - z * sin(twist); p2.z() = x * sin(twist) + z * cos(twist); return p2; } /* end Zpoint ///////////////// */ /** * Routine used for computing the Z of all the points of a panel. * Returns a CPanel with all its points Z's modified. * * @author Robert Laine alias Sailcuter */ CPanel CSailWorker::Zpanel( const CPanel &p1 ) const { CPanel ret = p1; unsigned int k; for (k = 0; k < ret.left.size(); k++) ret.left[k] = Zpoint(ret.left[k]); for (k = 0; k < ret.right.size(); k++) ret.right[k] = Zpoint(ret.right[k]); for (k = 0; k < ret.top.size(); k++) ret.top[k] = Zpoint(ret.top[k]); for (k = 0; k < ret.bottom.size(); k++) ret.bottom[k] = Zpoint(ret.bottom[k]); return ret; } sailcut-1.3.5/src/sailcpp/sailworker.h0000644000175000007640000001243211177775326017703 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SAILWORKER_H #define SAILWORKER_H #include "panelgroup.h" #include "saildef.h" // forward declarations class CPanelGroup; class CSeam; enum enumEdgeType { LUFF_EDGE, GAFF_EDGE, FOOT_EDGE, LEECH_EDGE }; class layout_error : public runtime_error { public: layout_error(const string &message) : runtime_error(message) { cout << "in sailworker:" << what() << endl; } }; /** The CSailWorker class does all the sail-related calculations like laying the panels. * It is used to create the sail from a CSailDef definition. * * @ingroup SailCpp * @see CSailDef, CPanelGroup */ class CSailWorker : public CSailDef { public: CSailWorker(const CSailDef &s); /** The area of the sail. */ real Area(); /** The head to clew diagonal length. */ real Diagonal(); /** The computation of the width as per IRC rule. */ real IRCwidth( const real &h ); /** The computation of the sail width at any height. */ real SailWidth( const real &h ); /** The length of the leech measured along its curved edge. */ real LeechLength( const real &h ); /** The length of the luff measured along its curved edge. */ real LuffLength( const real &h ); /** The maximum width of the sail perpendicular to the luff. */ real SailLP( ); CPanelGroup makeSail() const; CPanelGroup makeSail(CPanelGroup &flatsail, CPanelGroup &dispsail) const; /** The Tack 3D point. */ CPoint3d tack; /** The Head 3D point. */ CPoint3d head; /** The Peak 3D point. */ CPoint3d peak; /** The Clew 3D point. */ CPoint3d clew; protected: /** The Cross cut and Horizontal cut layout of sail's panels. */ CPanelGroup Layout0( CPanelGroup &flatsail, CPanelGroup &dispsail ) const; /** The Twist cut layout of sail's panels. */ CPanelGroup LayoutTwist( CPanelGroup &flatsail, CPanelGroup &dispsail ) const; /** The Vertical cut layout of sail's panels. */ CPanelGroup LayoutVertical( CPanelGroup &flatsail, CPanelGroup &dispsail ) const; /** The Radial cut layout of sail's panels. */ CPanelGroup LayoutRadial( CPanelGroup &flatsail, CPanelGroup &dispsail ) const; /** The Mitre cut layout of sail's panels perpendicular to leech and foot. */ CPanelGroup LayoutMitre( CPanelGroup &flatsail, CPanelGroup &dispsail ) const; /** The Mitre 2 cut layout of sail's panels parralel to foot and leech. */ CPanelGroup LayoutMitre2( CPanelGroup &flatsail, CPanelGroup &dispsail ) const; /** The Tri Radial cut layout of sail's panels. */ CPanelGroup LayoutTriRadial( CPanelGroup &flatsail, CPanelGroup &dispsail ) const; /** The Wing cut layout of sail's panels. */ CPanelGroup LayoutWing( CPanelGroup &flatsail, CPanelGroup &dispsail ) const; /** The type of sail Edge for an intersection. */ enumEdgeType Edge; /** The intersection of a line defined by a point and a vector with an edge. */ CPoint3d EdgeIntersect( const enumEdgeType &Edge, const CPoint3d &pt1, const CVector3d &v1 ) const; /** The horizontal intersection with forward edge. */ CPoint3d FwdIntersect( const CPoint3d &pt1 ) const; /** The horizontal intersection with aft edge. */ CPoint3d AftIntersect( const CPoint3d &pt1 ) const; /** The intersection of a line defined by a point and a vector with the mitre line. */ CPoint3d MitreIntersect( const CPoint3d &pt1, const CVector3d &v1 ) const; /** The mitre intersection point with luff. */ CPoint3d mitreLuffPt; /** The depth of the sail at a point. */ CPoint3d Zpoint( const CPoint3d &p1 ) const; /** The depth of the sail at all points of a panel. */ CPanel Zpanel( const CPanel &p1 ) const; /** Foot vector. */ CVector3d footV; /** Unitary vector perpendicular to foot. */ CVector3d footVP; /** Gaff vector. */ CVector3d gaffV; /** Unitary vector perpendicular to gaff. */ CVector3d gaffVP; /** Leech vector. */ CVector3d leechV; /** Unitary vector perpendicular to leech. */ CVector3d leechVP; /** Luff vector. */ CVector3d luffV; /** Unitary vector perpendicular to luff. */ CVector3d luffVP; /** Mitre vector. */ CVector3d mitreV; /** The foot straight 3D line. */ CSubSpace footLine; /** The gaff straight 3D line. */ CSubSpace gaffLine; /** The leech straight 3D line. */ CSubSpace leechLine; /** The luff straight 3D line. */ CSubSpace luffLine; /** The mitre straight 3D line. */ CSubSpace mitreLine; }; #endif sailcut-1.3.5/src/formhulldef.h0000644000175000007640000000252011177775326016372 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef FORMHULLDEF_H #define FORMHULLDEF_H #include "ui_formhulldefbase.h" #include "sailcpp/hulldef.h" /** The hull definition dialog, where the user enters * the parameters of the hull. */ class CFormHullDef : public QDialog, private Ui::CFormHullDefBase { Q_OBJECT public: CFormHullDef( QWidget *, CHullDef* ); bool check(); virtual void accept(); protected slots: void slotAutoPlank(); void slotCheck(); protected: /** a pointer to the hull definion */ CHullDef *hulldef; }; #endif sailcut-1.3.5/src/widgetprofile.cpp0000644000175000007640000002162111177775326017265 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include "widgetprofile.h" #include "widgetprofilevert.h" #include "sailcpp/sailmould.h" /************************************************************************** CLabelProfile class **************************************************************************/ /** The constructor. * * @param parent the parent dialog * @param ptr pointer to the CProfile */ CLabelProfile::CLabelProfile( QWidget *parent, CProfile *ptr) : QLabel(parent), profile(ptr), wasResized(true) { // set the background to white QPalette pal = palette(); pal.setColor( QPalette::Background, Qt::white ); setPalette( pal ); setMinimumSize( QSize( 300, 100 ) ); } /** Display the CProfile in the drawing area. */ void CLabelProfile::paintEvent( QPaintEvent *) { QPainter painter( this ); QRect vRect = painter.viewport(); painter.eraseRect(vRect); CRect3d objRect; objRect.max = CPoint3d(1, 0.22); if ( wasResized ) { CRect3d viewRect; viewRect.max = CPoint3d(vRect.width() , vRect.height()); lRect = calcLRect(viewRect , objRect, objRect.center(), 0.8); wasResized = 0; } QPoint prev, next; unsigned int nbpoints = 32; real x, z; real scale = vRect.height() / lRect.height(); // do a translation to have from z=0 to z=scale centered painter.translate( (lRect.width() / 2 - objRect.center().x()) * scale, vRect.height() + (objRect.center().y() - lRect.height()/2) * scale ); // flip coordinate system to have the z axis pointing up painter.scale(1,-1); prev = QPoint( 0 , int(scale * profile->z(0) ) ); for (unsigned i = 1; i < nbpoints; i++) { x = real(i) / (nbpoints -1); z = profile->z(x); next = QPoint( int(x * scale) , int(z * scale) ); painter.drawLine(prev , next); prev = next; } } /** The draw area has been resized. */ void CLabelProfile::resizeEvent( QResizeEvent * ) { wasResized = 1; } /************************************************************************** CWidgetProfile class **************************************************************************/ /** The constructor. * * @param parent the parent dialog * @param ptr a pointer to the profile we are displaying / editing * @param caption caption for the profile view (e.g. top,middle..) QLabel* lblLeech; * @param vert the vertical repartition widget */ CWidgetProfile::CWidgetProfile( QWidget *parent, CProfile *ptr, QString caption , CWidgetProfileVert *vert) : QWidget(parent), widgetVert(vert) { // store the pointer profile = ptr; QHBoxLayout *layout = new QHBoxLayout( this ); QGroupBox *grpProfile = new QGroupBox( this ); // grpProfile->setAlignment( int( QGroupBox::AlignCenter | QGroupBox::AlignRight | QGroupBox::AlignLeft ) ); // grpProfile->setColumnLayout(0, Qt::Vertical ); QGridLayout *grpProfileLayout = new QGridLayout( grpProfile ); grpProfileLayout->setAlignment( Qt::AlignTop ); grpProfile->setTitle(caption); //// add the spin boxes for changing profile QHBoxLayout *spinBoxesLayout = new QHBoxLayout(); // luff factor lblLuff = new QLabel( grpProfile ); lblLuff->setAlignment( Qt::AlignVCenter | Qt::AlignRight ); spinBoxesLayout->addWidget( lblLuff ); spinLuff = new QSpinBox( grpProfile ); spinLuff->setMaximum( 18 ); spinLuff->setMinimum( 1 ); spinLuff->setValue( 1 ); spinBoxesLayout->addWidget( spinLuff ); QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::MinimumExpanding, QSizePolicy::Minimum ); spinBoxesLayout->addItem( spacer ); // depth lblDepth = new QLabel( grpProfile ); lblDepth->setAlignment( Qt::AlignVCenter | Qt::AlignRight ); spinBoxesLayout->addWidget( lblDepth ); spinDepth = new QSpinBox( grpProfile ); spinDepth->setMaximum( 22 ); spinDepth->setMinimum( 1 ); spinDepth->setValue( 10 ); spinBoxesLayout->addWidget( spinDepth ); lblPercent = new QLabel( grpProfile ); spinBoxesLayout->addWidget( lblPercent ); QSpacerItem* spacer_2 = new QSpacerItem( 20, 20, QSizePolicy::MinimumExpanding, QSizePolicy::Minimum ); spinBoxesLayout->addItem( spacer_2 ); // leech factor lblLeech = new QLabel( grpProfile ); spinBoxesLayout->addWidget( lblLeech ); spinLeech = new QSpinBox( grpProfile ); spinLeech->setMinimum( -4 ); spinLeech->setMaximum( 20 ); spinBoxesLayout->addWidget( spinLeech ); grpProfileLayout->addLayout( spinBoxesLayout, 1, 0 ); QSpacerItem* spacer_3 = new QSpacerItem( 20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding ); grpProfileLayout->addItem( spacer_3, 0, 0 ); //// add the additional data labels QHBoxLayout *dataBoxesLayout = new QHBoxLayout(); lblLuffSlopeValue = new QLabel(grpProfile); dataBoxesLayout->addWidget (lblLuffSlopeValue); lblLuffSlopeDegrees = new QLabel(grpProfile); dataBoxesLayout->addWidget (lblLuffSlopeDegrees); QSpacerItem* spacer_5 = new QSpacerItem( 20, 20, QSizePolicy::MinimumExpanding, QSizePolicy::Minimum ); dataBoxesLayout->addItem( spacer_5 ); lblMaxPosValue = new QLabel(grpProfile); dataBoxesLayout->addWidget (lblMaxPosValue); lblMaxPosCord = new QLabel(grpProfile); dataBoxesLayout->addWidget (lblMaxPosCord); QSpacerItem* spacer_6 = new QSpacerItem( 20, 20, QSizePolicy::MinimumExpanding, QSizePolicy::Minimum ); dataBoxesLayout->addItem( spacer_6 ); lblLeechSlopeValue = new QLabel(grpProfile); dataBoxesLayout->addWidget (lblLeechSlopeValue); lblLeechSlopeDegrees = new QLabel(grpProfile); dataBoxesLayout->addWidget (lblLeechSlopeDegrees); grpProfileLayout->addLayout( dataBoxesLayout, 2, 0 ); /// create the drawing area lblDraw = new CLabelProfile( grpProfile, profile ); grpProfileLayout->addWidget( lblDraw, 0, 0 ); // add the group box that contains all the above elements layout->addWidget( grpProfile ); // we set the "active" flag to false so that we can set the initial // values without slotChanged being triggered active = false; spinLeech->setValue( int(round(profile->getLeech() * 50) ) ); spinLuff->setValue( int(round(profile->getLuff() ) ) ); spinDepth->setValue( int(round(profile->getDepth() * 100) ) ); active = true; // signals and slots connections connect( spinLuff, SIGNAL( valueChanged(int) ), this, SLOT( slotChanged() ) ); connect( spinDepth, SIGNAL( valueChanged(int) ), this, SLOT( slotChanged() ) ); connect( spinLeech, SIGNAL( valueChanged(int) ), this, SLOT( slotChanged() ) ); // set translations and trigger update // NOTE : all the widgets need to be created before doing this languageChange(); // trigger the computation of profile to update the ancillary data labels slotChanged(); } /** Sets the strings of the subwidgets using the current * language. */ void CWidgetProfile::languageChange() { lblLuff->setText( tr( "Luff shape" ) ); lblDepth->setText( tr( "Depth" ) ); lblPercent->setText( tr( "%" ) ); lblLeech->setText( tr( "Leech shape" ) ); // ancillary data labels lblLuffSlopeDegrees->setText( tr( "degrees" ) ); lblMaxPosCord->setText( tr( "cord") ); lblLeechSlopeDegrees->setText( tr( "degrees" ) ); } /** Called when one of the spinboxes changes value. */ void CWidgetProfile::slotChanged() { if ( active == false ) return; // store the new values *profile = CProfile( real(spinDepth->value())/100, real(spinLeech->value())/50, spinLuff->value() ); // update profile view lblDraw->update(); // display the position of the maximum depth lblLuffSlopeValue->setText( QString::number ( int( 57.29579 * atan(profile->slope(0.0)) ) )); lblMaxPosValue->setText( QString::number (profile->getMaxPos() ) ); lblLeechSlopeValue->setText( QString::number ( int( 57.29579 * atan(profile->slope(1.0)) ) ) ); // update the vertical repartition view widgetVert->updateLabel(); } sailcut-1.3.5/src/formrigdef.cpp0000644000175000007640000004626111177775326016554 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include "formrigdef.h" #include "sailcpp/rigworker.h" /** The constructor. * * @param parent the parent window * @param rigptr pointer to the CRigDef */ CFormRigDef::CFormRigDef( QWidget* parent, CRigDef * rigptr ) : QDialog(parent) { setupUi(this); setModal(true); /* we store the pointer to the CRigDef so we can update it when the user clicks OK */ rigdef = rigptr; connect( btnOK, SIGNAL( clicked() ), this, SLOT( accept() ) ); connect( btnCancel, SIGNAL( clicked() ), this, SLOT( reject() ) ); connect( btnCheck, SIGNAL( clicked() ), this, SLOT( slotChanged() ) ); connect( txt_foreI, SIGNAL( lostFocus() ), this, SLOT( slotChanged() ) ); connect( txt_foreJ, SIGNAL( lostFocus() ), this, SLOT( slotChanged() ) ); connect( txt_CSH, SIGNAL( lostFocus() ), this, SLOT( slotChanged() ) ); connect( txt_CSB, SIGNAL( lostFocus() ), this, SLOT( slotChanged() ) ); connect( txt_LSB, SIGNAL( lostFocus() ), this, SLOT( slotChanged() ) ); connect( txt_MH, SIGNAL( lostFocus() ), this, SLOT( slotChanged() ) ); connect( txt_MRnd, SIGNAL( lostFocus() ), this, SLOT( slotChanged() ) ); connect( txt_MRkM, SIGNAL( lostFocus() ), this, SLOT( slotChanged() ) ); connect( txt_MC, SIGNAL( lostFocus() ), this, SLOT( slotChanged() ) ); connect( txt_MW, SIGNAL( lostFocus() ), this, SLOT( slotChanged() ) ); connect( spinBox_MRndPos, SIGNAL( valueChanged(int) ), this, SLOT( slotChanged() ) ); connect( spinBox_SPNB, SIGNAL( valueChanged(int) ), this, SLOT( slotChanged() ) ); connect( txt_HAD, SIGNAL( lostFocus() ), this, SLOT( slotChanged() ) ); connect( txt_BAD, SIGNAL( textChanged(const QString&) ), this, SLOT( slotChanged() ) ); txt_RigID->setText(QString::fromStdString(rigdef->rigID) ); txt_foreI->setText(QString::number(rigdef->foreI) ); txt_foreJ->setText(QString::number(rigdef->foreJ) ); txt_MH->setText(QString::number(rigdef->MHeight) ); txt_MC->setText(QString::number(rigdef->MCord) ); txt_MW->setText(QString::number(rigdef->MWidth) ); txt_MRnd->setText(QString::number(rigdef->MRnd) ); txt_MRkM->setText(QString::number(rigdef->MRakeM) ); spinBox_MRndPos->setValue(rigdef->MRndPos); txt_CSH->setText(QString::number(rigdef->CSH) ); txt_CSB->setText(QString::number(rigdef->CSB) ); txt_LSB->setText(QString::number(rigdef->LSB) ); txt_SPH1->setText(QString::number(rigdef->SPH[1]) ); txt_SPH2->setText(QString::number(rigdef->SPH[2]) ); txt_SPH3->setText(QString::number(rigdef->SPH[3]) ); txt_SPW1->setText(QString::number(rigdef->SPW[1]) ); txt_SPW2->setText(QString::number(rigdef->SPW[2]) ); txt_SPW3->setText(QString::number(rigdef->SPW[3]) ); // display lbl_MRkD->setText(QString::number(rigdef->MRakeD) ); spinBox_SPNB->setValue(rigdef->SPNB); // variable changes triggering a check txt_HAD->setText(QString::number(rigdef->HAD) ); txt_BAD->setText(QString::number(rigdef->BAD) ); } /** Save the parameters entered by the user in the CRigDef. * slot connected to OK button */ void CFormRigDef::accept() { // return data if everything is OK if (check() ==true) QDialog::accept(); } /** Sets the strings of the subwidgets using the current * language. */ void CFormRigDef::languageChange() { /* FIXME use proper labels lbl_RigID->setText( tr("Rig identification") ); lbl_foreJ->setText( tr("Fore triangle base") ); lbl_foreI->setText( tr("Fore triangle height") ); lbl_MastWidth->setText( tr("Mast width") ); lbl_MastCord->setText( tr("Mast cord") ); lbl_MastRakeAngle->setText( tr("Mast rake angle") ); lbl_MastRake->setText( tr("Mast rake") ); lbl_MastHeight->setText( tr("Mast height") ); lbl_MastRound->setText( tr("Mast round") ); lbl_MastRoundPos->setText( tr("Mast round position") ); lbl_CapShroudHeight->setText( tr("Cap shroud height") ); lbl_CapShroudBase->setText( tr("Cap shroud base width") ); lbl_LowerShroudBase->setText( tr("Lower shroud base width") ); lbl_SpreaderHeight1->setText( tr("Spreader height") ); lbl_SpreaderHeight2->setText( tr("Spreader height") ); lbl_SpreaderHeight3->setText( tr("Spreader height") ); lbl_SpreaderWidth1->setText( tr("Spreader width") ); lbl_SpreaderWidth2->setText( tr("Spreader width") ); lbl_SpreaderWidth3->setText( tr("Spreader width") ); label_SpreaderNumber->setText( tr("Number of spreaders") ); lbl_BAD->setText( tr("Mainsail tack height") ); lbl_HAD->setText( tr("Mainsail head height") ); lbl_Luff_Round->setText( tr("Luff round") ); lbl_Luff->setText( tr("Luff length") ); */ } /** Called when one of the values changes. * it triggers a check of all data */ void CFormRigDef::slotChanged() { /* if ( active == false ) return; */ check(); } /** Check all dimensions entered in order to * make sure that the rig is possible and reasonable. * This will also trigger ancillary data computation * for mainsail luff parameters. */ bool CFormRigDef::check() { long I = 1, J = 1, L1 = 1, L2 = 1; bool flag = true; unsigned int j, n; QString txt; /// create four palettes QPalette palStd, palHi, palLo, palRel; palStd = txt_RigID->palette(); palLo = palHi = palRel = palStd; palLo.setColor( QPalette::Text, Qt::magenta); // too low value palHi.setColor( QPalette::Text, Qt::red ); // too high value palRel.setColor( QPalette::Text, Qt::blue ); // related value to be checked // start collecting data /// check the rig ID text txt = txt_RigID->text(); txt = txt.simplified(); if (txt.length() > 40) { txt.truncate(40); flag = false; txt_RigID->setPalette(palHi); txt_RigID->setText(QString(txt)); } else { txt_RigID->setPalette(palStd); txt_RigID->setText(QString(txt)); } rigdef->rigID = txt.toStdString(); /// checking fore triangle rigdef->foreI = txt_foreI->text().toDouble(); if (rigdef->foreI < 100) // height too small { flag = false; rigdef->foreI = 100; txt_foreI->setPalette(palLo); txt_foreI->setText(QString::number(rigdef->foreI)); return flag; } else { txt_foreI->setPalette(palStd); txt_foreI->setText(QString::number(rigdef->foreI)); } rigdef->foreJ = txt_foreJ->text().toDouble(); I = (long)(rigdef->foreI); J = (long)(rigdef->foreJ); if (( I / J )> 10) { flag = false; txt_foreI->setPalette(palHi); txt_foreJ->setPalette(palLo); txt_foreI->setText(QString::number(rigdef->foreI)); txt_foreJ->setText(QString::number(rigdef->foreJ)); return flag; } else if (( J / I )> 2) { flag = false; txt_foreJ->setPalette(palHi); txt_foreI->setPalette(palLo); txt_foreI->setText(QString::number(rigdef->foreI)); txt_foreJ->setText(QString::number(rigdef->foreJ)); return flag; } else { txt_foreJ->setPalette(palStd); txt_foreI->setPalette(palStd); txt_foreI->setText(QString::number(rigdef->foreI)); txt_foreJ->setText(QString::number(rigdef->foreJ)); } /// checking mast height rigdef->MHeight = txt_MH->text().toDouble(); L1 = (long)(rigdef->MHeight); if ( L1 < I ) { flag = false; txt_foreI->setPalette(palRel); txt_MH->setPalette(palLo); rigdef->MHeight = I; return flag; } else if ( L1 > (1.8 * I)) { flag = false; txt_foreI->setPalette(palRel); txt_MH->setPalette(palHi); rigdef->MHeight = ceil (1.8 * I); return flag; } else { txt_foreI->setPalette(palStd); txt_MH->setPalette(palStd); } txt_MH->setText(QString::number(rigdef->MHeight)); L1 = (long)(rigdef->MHeight); /// checking mast cord rigdef->MCord = txt_MC->text().toDouble(); if (rigdef->MCord > (L1 / 10)) { flag = false; txt_MC->setPalette(palHi); rigdef->MCord = floor(L1 / 10); } else if (rigdef->MCord < (L1 / 200)) { flag = false; txt_MC->setPalette(palLo); rigdef->MCord = ceil(L1 / 200); } else { txt_MC->setPalette(palStd); } txt_MC->setText(QString::number(rigdef->MCord)); /// checking mast width rigdef->MWidth = txt_MW->text().toDouble(); if (rigdef->MWidth > rigdef->MCord) { flag = false; txt_MC->setPalette(palRel); txt_MW->setPalette(palHi); rigdef->MWidth = rigdef->MCord; } else if (rigdef->MWidth < (rigdef->MCord /5)) { flag = false; txt_MC->setPalette(palRel); txt_MW->setPalette(palLo); rigdef->MWidth = ceil(rigdef->MCord /5); } else { txt_MC->setPalette(palStd); txt_MW->setPalette(palStd); } txt_MW->setText(QString::number(rigdef->MWidth)); /// checking mast rake rigdef->MRakeM = txt_MRkM->text().toDouble(); if ( rigdef->MRakeM > L1 / 5) { flag = false; rigdef->MRakeM = floor( L1 / 5 ); txt_MH->setPalette(palRel); txt_MRkM->setPalette(palHi); } else if ( rigdef->MRakeM < -L1 / 5) { flag = false; rigdef->MRakeM = -floor( L1 / 5 ); txt_MH->setPalette(palRel); txt_MRkM->setPalette(palLo); } else { txt_MH->setPalette(palStd); txt_MRkM->setPalette(palStd); } txt_MRkM->setText(QString::number(rigdef->MRakeM)); /// computing mast rake in degree rigdef->MRakeD = atan2(rigdef->MRakeM ,rigdef->MHeight) * (180 / PI); lbl_MRkD->setText(QString::number(rigdef->MRakeD)); /// computing mast base distance to stem rigdef->MBase = rigdef->foreJ - rigdef->MRakeM * (rigdef->foreI / rigdef->MHeight); /// checking mast round rigdef->MRnd = txt_MRnd->text().toDouble(); rigdef->MRndPos = spinBox_MRndPos->value(); if ( rigdef->MRnd > L1/10 ) { flag = false; rigdef->MRnd = floor( L1/10 ); txt_MRnd->setPalette(palHi); txt_MRnd->setPalette(palHi); } else { txt_MH->setPalette(palStd); txt_MRnd->setPalette(palStd); } txt_MRnd->setText(QString::number(rigdef->MRnd)); /// checking mainsail tack height rigdef->BAD = txt_BAD->text().toDouble(); if (rigdef->BAD < 0 ) { flag = false; rigdef->BAD = 0; txt_BAD->setPalette(palLo); } else if ( rigdef->BAD > L1 / 2 ) { flag = false; rigdef->BAD = int(L1 / 2); txt_BAD->setPalette(palHi); txt_MH->setPalette(palRel); } else { txt_BAD->setPalette(palStd); txt_MH->setPalette(palStd); } txt_BAD->setText(QString::number(rigdef->BAD)); /// checking mainsail head height rigdef->HAD = txt_HAD->text().toDouble(); if (rigdef->HAD < rigdef->BAD +10 ) { flag = false; rigdef->HAD = rigdef->BAD +10; txt_HAD->setPalette(palLo); txt_BAD->setPalette(palRel); } else if ( rigdef->HAD > L1 ) { flag = false; rigdef->HAD = L1; txt_HAD->setPalette(palHi); txt_MH->setPalette(palRel); } else { txt_HAD->setPalette(palStd); txt_BAD->setPalette(palStd); txt_MH->setPalette(palStd); } txt_HAD->setText(QString::number(rigdef->HAD)); ///computing and display main sail tack and luff data CRigWorker worker(*rigdef); rigdef->MStack = worker.mastCenter( rigdef->BAD ) + CVector3d(rigdef->MCord /2, 0, 0); rigdef->MShead = worker.mastCenter( rigdef->HAD ) + CVector3d(rigdef->MCord /2, 0, 0); CVector3d MSluff = CVector3d(rigdef->MShead - rigdef->MStack); // compute mainsail luff round and its position CPoint3d p1, p2; real h=0, rd1 = 0, rd2 = 0; unsigned int rdPos = 49; j = 5; do { j++; p1 = rigdef->MStack + MSluff*(real( j ) / 50); h = p1.y(); p2 = worker.mastCenter( h ) + CVector3d(rigdef->MCord /2, 0, 0); rd2 = CVector3d(p1-p2).x(); if (fabs(rd2) < fabs(rd1) ) rdPos = (j - 1) * 2; else rd1 = rd2; } while ( rd1 == rd2 && j < 45); // display mainsail data lbl_MS_TackX->setText( QString::number( int(round(rigdef->MStack.x()) ) ) ); lbl_MS_TackY->setText( QString::number( int(rigdef->MStack.y()) )); lbl_MS_LuffL->setText( QString::number( int(round(MSluff.norm()) ) ) ); lbl_MS_Rake->setText( QString::number( int(round(MSluff.x()) ) ) ); lbl_MS_LuffR->setText( QString::number( round(rd1) ) ); lbl_MS_LuffRP->setText( QString::number( rdPos ) +" %" ); /// reading number of spreaders rigdef->SPNB = spinBox_SPNB->value(); n = rigdef->SPNB; /// checking shrouds height and shroud base width rigdef->CSH = txt_CSH->text().toDouble(); if ( rigdef->CSH > L1) // cap shroud above mast head { flag = false; txt_CSH->setPalette(palHi); txt_MH->setPalette(palRel); rigdef->CSH = L1; return flag; } else if ( rigdef->CSH < (0.75 * I)) { flag = false; txt_CSH->setPalette(palLo); txt_foreI->setPalette(palRel); rigdef->CSH = ceil(0.75 * I); return flag; } else { txt_MH->setPalette(palStd); txt_foreI->setPalette(palStd); txt_CSH->setPalette(palStd); } txt_CSH->setText( QString::number(rigdef->CSH) ); rigdef->LSB = txt_LSB->text().toDouble(); if ( rigdef->LSB < rigdef->CSH / ( 10 * (1 + real(n)) ) ) { flag = false; txt_LSB->setPalette(palLo); txt_CSH->setPalette(palRel); rigdef->LSB = ceil( rigdef->CSH / ( 10 * (1 + real(n)) ) ); } else if ( rigdef->LSB > rigdef->CSH / (2 + real(n)) ) { flag = false; txt_LSB->setPalette(palHi); txt_CSH->setPalette(palRel); rigdef->LSB = floor( rigdef->CSH / (2 + real(n)) ); } else { txt_CSH->setPalette(palStd); txt_LSB->setPalette(palStd); } txt_LSB->setText( QString::number(rigdef->LSB) ); rigdef->CSB = txt_CSB->text().toDouble(); if ( n == 0 ) { rigdef->CSB = rigdef->LSB; } else if (rigdef->CSB < rigdef->LSB ) { flag = false; txt_CSB->setPalette(palLo); txt_LSB->setPalette(palRel); rigdef->CSB = ceil( rigdef->LSB ); } else if (rigdef->CSB > (2 * rigdef->LSB)) { flag = false; txt_CSB->setPalette(palHi); txt_LSB->setPalette(palRel); rigdef->CSB = floor(2 * rigdef->LSB); } else { txt_CSB->setPalette(palStd); txt_LSB->setPalette(palStd); } txt_CSB->setText( QString::number(rigdef->CSB) ); /// checking spreaders rigdef->SPH[0] = 0; rigdef->SPW[0] = rigdef->LSB; rigdef->SPH[1] = txt_SPH1->text().toDouble(); rigdef->SPH[2] = txt_SPH2->text().toDouble(); rigdef->SPH[3] = txt_SPH3->text().toDouble(); rigdef->SPW[1] = txt_SPW1->text().toDouble(); rigdef->SPW[2] = txt_SPW2->text().toDouble(); rigdef->SPW[3] = txt_SPW3->text().toDouble(); if ( n < 1 ) { // no spreaders then reset to base of shrouds for (j = 1; j < 4; j++) { rigdef->SPH[j] = rigdef->SPH[0]; rigdef->SPW[j] = rigdef->SPW[0]; } txt_SPH1->setText( QString::number(rigdef->SPH[1]) ); txt_SPH2->setText( QString::number(rigdef->SPH[2]) ); txt_SPH3->setText( QString::number(rigdef->SPH[3]) ); txt_SPW1->setText( QString::number(rigdef->SPW[1]) ); txt_SPW2->setText( QString::number(rigdef->SPW[2]) ); txt_SPW3->setText( QString::number(rigdef->SPW[3]) ); } else { if ( rigdef->SPH[1] < rigdef->CSH / (2 + real(n)) ) { flag = false; txt_CSH->setPalette(palRel); txt_SPH1->setPalette(palLo); rigdef->SPH[1] = ceil( rigdef->CSH / (2 + real(n)) ); } else if ( rigdef->SPH[1] > ( rigdef->CSH / (0.5 + real(n)) ) ) { flag = false; txt_CSH->setPalette(palRel); txt_SPH1->setPalette(palHi); rigdef->SPH[1] = floor( rigdef->CSH / (0.5 + real(n)) ); } else { txt_CSH->setPalette(palStd); txt_SPH1->setPalette(palStd); } txt_SPH1->setText( QString::number(rigdef->SPH[1]) ); L2 = (long) (rigdef->CSH - rigdef->SPH[1]); if ( n > 1 ) { if ( rigdef->SPH[2] < ( rigdef->SPH[1] + L2 / (1 + real(n)) ) ) { flag = false; txt_SPH1->setPalette(palRel); txt_SPH2->setPalette(palLo); rigdef->SPH[2] = ceil( rigdef->SPH[1] + L2 /(1 + real(n) ) ); } else if ( rigdef->SPNB>1 && rigdef->SPH[2] > (rigdef->SPH[1] + L2 / (real(n) -.5)) ) { flag = false; txt_SPH1->setPalette(palRel); txt_SPH2->setPalette(palHi); rigdef->SPH[2] = floor(rigdef->SPH[1] + L2 /(real(n) -.5) ); } else { txt_SPH1->setPalette(palStd); txt_SPH2->setPalette(palStd); } txt_SPH2->setText( QString::number(rigdef->SPH[2]) ); L2 = (long)(rigdef->CSH - rigdef->SPH[2]); if ( n > 2 ) { if ( rigdef->SPH[3] < ( rigdef->SPH[2] + L2 / real(n) ) ) { flag = false; txt_SPH2->setPalette(palRel); txt_SPH3->setPalette(palLo); rigdef->SPH[3] = ceil( rigdef->SPH[2] + L2 / real(n) ); } else if ( rigdef->SPH[3] > ( rigdef->CSH + L2 / (real(n) -1.5) ) ) { flag = false; txt_SPH2->setPalette(palRel); txt_SPH3->setPalette(palHi); rigdef->SPH[3] = floor( rigdef->CSH + L2/(real(n) -1.5) ); } else { txt_SPH2->setPalette(palStd); txt_SPH3->setPalette(palStd); } txt_SPH3->setText( QString::number(rigdef->SPH[3]) ); } } } // return flag = true IF everything is OK return flag; } sailcut-1.3.5/src/sailviewer.h0000644000175000007640000000403711177775326016242 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SAILVIEWER_H #define SAILVIEWER_H #include #include "sailcpp/panelgroup.h" class QSlider; class QLabel; class CPanelGroup; class CSailDisp; class QGridLayout; // enumerated types enum enumViewMode { WIREFRAME, SHADED }; /** This class is used to display a sail. It has a display * area as well as an elevation and an azimuth slider. */ class CSailViewer : public QWidget { Q_OBJECT public: CSailViewer(QWidget *parent, enumViewMode viewMode, bool show_sliders = true); void setObject( const CPanelGroup &obj ); void keyPressEvent ( QKeyEvent * e ); protected slots: void slotLabeling(); void slotSlider(); void slotZoomIn(); void slotZoomOut(); public slots: void slotResetView(); signals: /** Signals that the azimuth has changed. */ void azimuthChanged(real azimuth); /** Signals that the elevation has changed. */ void elevationChanged(real elevation); protected: /** The drawing area */ CSailDisp *lblDraw; /** The slider that controls the viewing elevation */ QSlider *sliderElevation; /** The slider that controls the viewing azimuth */ QSlider *sliderAzimuth; /** The widget's layout */ QGridLayout* sailDispLayout; }; #endif sailcut-1.3.5/src/formsail.h0000644000175000007640000000734511177775326015711 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef FORMSAIL_H #define FORMSAIL_H #include "formdocument.h" #include "sailwriter-xml.h" /** Dialog holding a sail. * * @see CFormSailDef for data input and checking, CSailWorker, CSailDef */ class CFormSail : public CFormDocumentTmpl { Q_OBJECT public: // construction, destruction CFormSail(CPrefs *myPrefs, QWidget *parent); protected: T_KEYPRESS void setDef(const CSailDef& newdef); void setupMenuBar(); void setupMainWidget(); // slots protected slots: virtual void languageChange(); virtual void slotDef(); virtual void slotExportDXF(); virtual void slotExportDXFSplit(); virtual void slotExportSVG(); virtual void slotExportTXT(); virtual void slotExportXML(); virtual void slotExportFlatCarlson(); virtual void slotExportFlatDXF(); virtual void slotExportFlatDXFSplit(); virtual void slotExportFlatDXFBlocks(); virtual void slotExportFlatHand(); virtual void slotExportFlatSVG(); virtual void slotExportFlatTXT(); virtual void slotExportFlatXML(); virtual void slotMould(); virtual void slotPrintData(); virtual void slotPrintDwg(); virtual void slotPrintDev(); // member variables protected: /** The sail */ CPanelGroup sail; /** The developed sail */ CPanelGroup flatsail; /** The display version of the flat sail */ CPanelGroup dispsail; // menus and action /** The Print submenu */ QMenu *menuPrint; /** Export 3d submenu */ QMenu *menuExport3d; /** Export flat panels submenu */ QMenu *menuExportFlat; /** Export 3D sail to DXF */ QAction *actionExport3dDXF; /** Export 3D sail to DXF (one file per file) */ QAction *actionExport3dDXFSplit; /** Export 3D sail to SVG (2D reduction) */ QAction *actionExport3dSVG; /** Export 3D sail to text */ QAction *actionExport3dTXT; /** Export 3D sail to XML */ QAction *actionExport3dXML; /** Export flat sail to Carlson plotter format */ QAction *actionExportFlatCarlson; /** Export flat sail to hand format */ QAction *actionExportFlatHand; /** Export flat sail to DXF */ QAction *actionExportFlatDXF; /** Export flat sail to DXF (one file per file) */ QAction *actionExportFlatDXFSplit; /** Export flat sail to DXF blocks */ QAction *actionExportFlatDXFBlocks; /** Export flat sail to SVG */ QAction *actionExportFlatSVG; /** Export flat sail to TXT */ QAction *actionExportFlatTXT; /** Export flat sail to XML */ QAction *actionExportFlatXML; /** Print sail data */ QAction *actionPrintData; /** Print sail development */ QAction *actionPrintDev; /** Print sail drawing */ QAction *actionPrintDwg; /** View sail definition */ QAction *actionViewDef; /** View sail mould */ QAction *actionViewMould; /** View sail definition */ QAction *actionViewPatch; }; #endif sailcut-1.3.5/src/saildisplabel.h0000644000175000007640000000261611177775326016701 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SAILDISPLABEL_H #define SAILDISPLABEL_H #include #include "saildisp.h" class QGridLayout; /** A wireframe display area for a sail, based on a QLabel. * * @see CSailDispGL */ class CSailDispLabel : public QLabel, public CSailDisp { public: CSailDispLabel(QWidget *parent); void redraw(); protected: void mousePressEvent ( QMouseEvent * ); void paintEvent( QPaintEvent * ); void resizeEvent( QResizeEvent * ); void wheelEvent( QWheelEvent *event); private: /** Has the area been resized since last redraw */ bool wasResized; }; #endif sailcut-1.3.5/src/sailwriter-txt.h0000644000175000007640000000240311177775326017065 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef TXTWRITER_H #define TXTWRITER_H #include "filewriter.h" #include "sailcpp/panelgroup.h" /** A class used to output a CPanelGroup to a TXT file. * * @ingroup FileIo */ class CSailTxtWriter : public CFileWriter { public: /** The constructor. */ CSailTxtWriter() : CFileWriter(".txt","Text files") {} ; virtual void write(const CPanelGroup &sail, const QString &filename) const; }; #endif sailcut-1.3.5/src/boatdef-panel.cpp0000644000175000007640000001765411177775326017135 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "boatdef-panel.h" #include "sailwriter-xml.h" #include "sailcpp/hullworker.h" #include "sailcpp/rigworker.h" #include "sailcpp/sailworker.h" #include #include #include #include #include #include #include /** The constructor for a CVector3dWidget. * * @param parent the parent widget */ CVector3dWidget::CVector3dWidget(QWidget *parent) : QWidget(parent) { for (int i = 0; i < 3; i++) { QSpinBox *spin = new QSpinBox(this); spin->setRange(-10000, 10000); spin->setSingleStep(10); spinBox.push_back(spin); } QLabel *lblStaticX = new QLabel(this); lblStaticX->setText("x"); QLabel *lblStaticY = new QLabel(this); lblStaticY->setText("y"); QLabel *lblStaticZ = new QLabel(this); lblStaticZ->setText("z"); QHBoxLayout* layout = new QHBoxLayout(this); layout->addWidget(lblStaticX); layout->addWidget(spinBox[0], 1); layout->addWidget(lblStaticY); layout->addWidget(spinBox[1], 1); layout->addWidget(lblStaticZ); layout->addWidget(spinBox[2], 1); } /** Returns the vector corresponding to the user's input. */ CVector3d CVector3dWidget::getVector() { CVector3d v; for (int i = 0; i < 3; i++) v[i] = spinBox[i]->value(); return v; } /** Set the input boxes from a given vector. * * @param v the new vector to display */ void CVector3dWidget::setVector(const CVector3d &v) { for (unsigned int i = 0; i < 3; i++) spinBox[i]->setValue(int(v[i])); } /** The constructor. * * @param parent the parent widget */ CBoatElementWidget::CBoatElementWidget(QWidget *parent) : QWidget(parent) { grpInfo = new QGroupBox( 0 ); QGridLayout* iLayout = new QGridLayout( grpInfo ); lblFileStatic = new QLabel( grpInfo ); iLayout->addWidget( lblFileStatic, 0, 0 ); lblFile = new QLabel( grpInfo ); iLayout->addWidget( lblFile, 0, 1 ); lblNameStatic = new QLabel( grpInfo ); iLayout->addWidget( lblNameStatic, 1, 0 ); txtName = new QLineEdit( grpInfo ); iLayout->addWidget( txtName, 1, 1 ); btnReload = new QPushButton(grpInfo); iLayout->addWidget( btnReload, 2, 1); wdgOrigin = new CVector3dWidget(grpInfo); iLayout->addWidget(wdgOrigin, 3, 0, 1, 3); //iLayout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding ), 4, 1 ); // add button below frame btnUpdate = new QPushButton(this); btnRemove = new QPushButton(this); QGridLayout* layout = new QGridLayout(this); layout->addWidget(grpInfo, 0, 0, 1, 3); layout->addWidget(btnRemove, 1, 0); layout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ), 1, 1 ); layout->addWidget(btnUpdate, 1, 2); // pack everything upward layout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding ), 2, 0 ); languageChange(); /* connect signals */ connect( btnUpdate, SIGNAL( clicked() ), this, SLOT(slotUpdate()) ); connect( btnReload, SIGNAL( clicked() ), this, SLOT(slotReload()) ); connect( btnRemove, SIGNAL( clicked() ), this, SLOT(slotRemove()) ); } /** * Sets the strings of the subwidgets using the current language. */ void CBoatElementWidget::languageChange() { grpInfo->setTitle( tr( "Element information" ) ); lblFileStatic->setText( tr("file") ); lblNameStatic->setText( tr("name") ); btnReload->setText( tr("Reload") ); btnRemove->setText( tr("Remove") ); btnUpdate->setText( tr("Update") ); } /** * The boat element changed, update widgets. * * @param newelement The new value of the boat element */ void CBoatElementWidget::setElement(const CBoatElement& newelement) { element = newelement; lblFile->setText( QString::fromStdString(element.filename) ); txtName->setText( QString::fromStdString(element.title) ); wdgOrigin->setVector( element.origin ); } /** * The "reload" button was pressed, fire signalUpdate. */ void CBoatElementWidget::slotReload() { QString filename = QString::fromStdString(element.filename); try { switch (element.type) { case SAILDEF: (CPanelGroup&)element = CSailWorker(CSailDefXmlWriter().read(filename)).makeSail(); break; case HULLDEF: (CPanelGroup&)element = CHullWorker(CHullDefXmlWriter().read(filename)).makeHull(); break; case RIGDEF: (CPanelGroup&)element = CRigWorker(CRigDefXmlWriter().read(filename)).makeRig(); break; case PANELGROUP: (CPanelGroup&)element = CPanelGroupXmlWriter().read(filename); break; } signalUpdate(element); } catch (read_error e) { CSailDefXmlWriter::readErrorMessage(); } } /** * The "remove" button was pressed, fire signalRemove. */ void CBoatElementWidget::slotRemove() { signalRemove(); } /** * The "update" button was pressed, fire signalUpdate. */ void CBoatElementWidget::slotUpdate() { element.title = txtName->text().toStdString(); element.origin = wdgOrigin->getVector(); signalUpdate(element); } /** * The constructor. * * @param parent the parent widget */ CBoatDefPanel::CBoatDefPanel(QWidget *parent) : QWidget(parent) { QGridLayout *layout = new QGridLayout( this ); tabs = new QTabWidget(this); layout->addWidget( tabs, 0, 0); } /** * Sets the strings of the subwidgets using the current language. */ void CBoatDefPanel::languageChange() { for (unsigned int i = 0; i < elementwidget.size(); i++) elementwidget[i]->languageChange(); } /** * We were passed a new boat definition, update the widgets. * * @param newdef The new boat definition */ void CBoatDefPanel::setDef(const CBoatDef& newdef) { unsigned int i; for (i = 0; i < elementwidget.size(); i++) { tabs->removeTab(i); delete elementwidget[i]; } def = newdef; elementwidget.resize(def.size()); for (i = 0; i < def.size(); i++) { elementwidget[i] = new CBoatElementWidget(0); elementwidget[i]->setElement(def[i]); connect(elementwidget[i], SIGNAL(signalRemove()), this, SLOT(slotRemove())); connect(elementwidget[i], SIGNAL(signalUpdate(const CBoatElement&)), this, SLOT(slotUpdate(const CBoatElement&))); tabs->addTab(elementwidget[i], QString::fromStdString(def[i].title)); } if (elementwidget.size() > 0) tabs->setCurrentIndex(0); } /** * The user requested the removal of the current boat element. */ void CBoatDefPanel::slotRemove() { int tabIndex = tabs->currentIndex(); tabs->removeTab(tabIndex); delete elementwidget[tabIndex]; elementwidget.erase(elementwidget.begin()+tabIndex); def.erase(def.begin()+tabIndex); signalUpdate(def); } /** * The user updated the current boat element. * * @param newelement The new boat element */ void CBoatDefPanel::slotUpdate(const CBoatElement& newelement) { int tabIndex = tabs->currentIndex(); def[tabIndex] = newelement; tabs->setTabText(tabIndex, QString::fromStdString(def[tabIndex].title)); signalUpdate(def); } sailcut-1.3.5/src/sailviewer-panel.cpp0000644000175000007640000001271211177775326017671 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "sailviewer-panel.h" #include "sailcpp/panelgroup.h" #include #include #include #include /** * Constructs a CSailViewerPanel object. * * @param parent The parent widget * @param viewMode The viewing mode (shaded or wireframe) * @param show_sliders Should the elevation and azimuth sliders be displayed? * @param show_labeling Should the "Labeling" button be displayed? */ CSailViewerPanel::CSailViewerPanel(QWidget *parent, enumViewMode viewMode, bool show_sliders, bool show_labeling) : QWidget(parent), showSliders(show_sliders) { /* parameters groupbox */ if (showSliders) { /* display parameters groupbox */ grpParams = new QGroupBox( this ); QGridLayout* grpParamsLayout = new QGridLayout( grpParams ); lblAzimuthStatic = new QLabel( grpParams ); grpParamsLayout->addWidget( lblAzimuthStatic, 0, 0 ); lblAzimuth = new QLabel( grpParams ); grpParamsLayout->addWidget( lblAzimuth, 0, 1 ); lblElevationStatic = new QLabel( grpParams ); grpParamsLayout->addWidget( lblElevationStatic, 1, 0 ); lblElevation = new QLabel( grpParams ); grpParamsLayout->addWidget( lblElevation, 1, 1 ); } else { grpParams = NULL; lblAzimuthStatic = NULL; lblAzimuth = NULL; lblElevationStatic = NULL; lblElevation = NULL; } /* the drawing area */ sailDisp = new CSailViewer(this, viewMode, showSliders); sailDisp->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); /* controls groupbox */ grpControls = new QGroupBox( this ); QVBoxLayout *grpControlsLayout = new QVBoxLayout( grpControls ); btnResetView = new QPushButton( grpControls ); grpControlsLayout->addWidget( btnResetView ); btnZoomIn = new QPushButton( grpControls ); grpControlsLayout->addWidget( btnZoomIn ); btnZoomOut = new QPushButton( grpControls ); grpControlsLayout->addWidget( btnZoomOut ); if (viewMode == WIREFRAME && show_labeling) { btnLabeling = new QPushButton( grpControls ); grpControlsLayout->addWidget( btnLabeling ); } else { btnLabeling = NULL; } /* put it all together */ QHBoxLayout *layout = new QHBoxLayout( this ); layout->addWidget( sailDisp ); QVBoxLayout *vbox = new QVBoxLayout(); vbox->addWidget( grpControls ); vbox->addItem( new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding) ); if (showSliders) { vbox->addWidget( grpParams ); } layout->addLayout( vbox ); /* set language and size */ languageChange(); /* connect signals */ connect( sailDisp, SIGNAL( azimuthChanged(real) ), this, SLOT(slotAzimuth(real)) ); connect( sailDisp, SIGNAL( elevationChanged(real) ), this, SLOT(slotElevation(real)) ); if (btnLabeling) { connect( (QWidget*) btnLabeling, SIGNAL( clicked() ), sailDisp, SLOT( slotLabeling() )); } connect( (QWidget*) btnResetView, SIGNAL( clicked() ), sailDisp, SLOT( slotResetView() )); connect( (QWidget*) btnZoomIn, SIGNAL( clicked() ), sailDisp, SLOT( slotZoomIn() )); connect( (QWidget*) btnZoomOut, SIGNAL( clicked() ), sailDisp, SLOT( slotZoomOut() )); } /** * We received a keypress, we pass it down to the CSailViewer. */ void CSailViewerPanel::keyPressEvent ( QKeyEvent * e ) { sailDisp->keyPressEvent(e); } /** * Sets the strings of the subwidgets using the current language. */ void CSailViewerPanel::languageChange() { if (showSliders) { grpParams->setTitle( tr( "Display parameters" ) ); lblElevationStatic->setText( tr( "elevation" ) ); lblAzimuthStatic->setText( tr( "azimuth" ) ); } grpControls->setTitle( tr( "Controls" ) ); btnResetView->setText( tr( "Reset view" ) ); if (btnLabeling) { btnLabeling->setText( tr( "Labeling" ) ); } btnZoomIn->setText( tr( "Zoom in" ) ); btnZoomOut->setText( tr( "Zoom out" ) ); } /** * Change the displayed object. * * @param obj the new object to display */ void CSailViewerPanel::setObject(const CPanelGroup &obj) { sailDisp->setObject(obj); } /** * The azimuth was changed, update the corresponding label. * * @param azimuth */ void CSailViewerPanel::slotAzimuth(real azimuth) { if (lblAzimuth) { lblAzimuth->setText(QString::number(azimuth) + " " +tr("deg")); } } /** * The elevation changed, update the corresponding label. * * @param elevation */ void CSailViewerPanel::slotElevation(real elevation) { if (lblElevation) { lblElevation->setText(QString::number(elevation) + " " +tr("deg")); } } sailcut-1.3.5/src/formrigdefbase.ui0000644000175000007640000013373111114031150017204 0ustar sharkyjerryweb sailcuter CFormRigDefBase 0 0 700 550 0 0 700 550 Rig dimensions 4 4 Check 0 0 OK 0 0 Cancel Qt::Horizontal 321 31 0 0 Shrouds 4 4 0 0 155 22 Cap shroud base width 0 0 40 22 = CSH 0 0 155 22 Lower shroud base width 0 0 60 22 txt_LSB Qt::AlignHCenter 0 0 60 22 txt_CSH Qt::AlignHCenter 0 0 40 22 = CSB 0 0 155 22 Cap shroud height 0 0 60 22 txt_CSB Qt::AlignHCenter 0 0 40 22 = LSB 0 0 Spreaders 4 4 Qt::Horizontal 21 20 50 21 Qt::AlignHCenter 3 3 = SPNB Number of spreaders Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 Spreader height 6 6 0 0 0 22 txt_SPH2 Qt::AlignHCenter 0 0 0 22 txt_SPH1 Qt::AlignHCenter 0 0 70 22 txt_SPH3 Qt::AlignHCenter 30 22 SPH2 40 22 SPH3 30 22 SPH1 0 0 Spreader length 6 6 40 22 SPW3 70 22 txt_SPW3 Qt::AlignHCenter 0 22 SPW1 0 22 txt_SPW1 Qt::AlignHCenter 0 22 SPW2 0 22 txt_SPW2 Qt::AlignHCenter 0 0 0 0 Mainsail 4 4 0 0 60 22 QFrame::Box lbl_MS_LuffRP Qt::AlignCenter 0 0 20 22 @ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 60 22 QFrame::Box lbl_MS_LuffR Qt::AlignCenter 0 0 70 22 QFrame::Box lbl_MS_TackY Qt::AlignCenter 0 0 20 22 Y = Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 70 22 QFrame::Box lbl_MS_TackX Qt::AlignCenter 0 0 X = Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 Tack Qt::Horizontal QSizePolicy::Minimum 61 22 0 0 60 22 QFrame::Box lbl_MS_LuffL Qt::AlignCenter 0 0 = MSL 0 0 60 22 Luff length 0 0 0 22 Luff round 0 0 60 22 QFrame::Box lbl_MS_Rake Qt::AlignCenter 0 0 = MSR 0 0 60 22 Luff rake Qt::Horizontal QSizePolicy::Minimum 51 25 0 0 60 22 Tack height 0 0 60 0 txt_BAD Qt::AlignHCenter 0 0 0 0 = BAD Qt::Horizontal 0 0 Head height 0 0 = HAD 0 0 60 0 txt_HAD Qt::AlignHCenter Qt::Horizontal 40 20 0 0 Mast 4 4 Mast width = MW 70 0 txt_MW Qt::AlignHCenter 70 0 txt_MC Qt::AlignHCenter = MC Mast cord QFrame::Box lbl_MRkD Qt::AlignCenter = MRkD Mast rake angle 0 0 70 0 txt_MH Qt::AlignHCenter txt_MRnd Qt::AlignHCenter Qt::Horizontal QSizePolicy::Expanding 20 20 Mast rake = MRkM 0 0 70 0 txt_MRkM Qt::AlignHCenter 0 0 60 22 Mast height = MH = MRnd 0 0 60 22 Mast round = MRndPos 0 0 60 22 Mast round position Qt::Horizontal Qt::AlignHCenter 20 80 50 0 0 Fore triangle 4 4 Qt::Horizontal 40 20 0 0 70 0 txt_foreI Qt::AlignHCenter = I 0 0 70 0 txt_foreJ Qt::AlignHCenter = J Fore triangle base Fore triangle hoist 400 22 Description of rig 0 0 60 20 Rig name Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 600 24 650 160 10 75 true All dimensions are in millimeter and angles in degrees Qt::AlignHCenter|Qt::AlignTop 1 0 Qt::Horizontal 60 25 btnOK btnCancel txt_RigID txt_foreI txt_foreJ txt_CSH txt_CSB txt_LSB txt_MH txt_MRnd spinBox_MRndPos txt_MRkM txt_MC txt_MW txt_BAD spinBox_SPNB txt_SPH3 txt_SPW3 txt_SPH2 txt_SPW2 txt_SPH1 txt_SPW1 sailcut-1.3.5/src/formhulldef.cpp0000644000175000007640000002101011177775326016720 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include "formhulldef.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// /** The constructor. * * @param parent the parent window * @param hullptr pointer to the CHullDef */ CFormHullDef::CFormHullDef( QWidget* parent, CHullDef * hullptr ) : QDialog(parent) { setupUi(this); setModal(true); /* we store the pointer to the CHullDef so we can update it when the user clicks OK */ hulldef = hullptr; txt_HullID->setText(QString::fromStdString(hulldef->hullID)); /// deck parameters txt_BLWL->setText( QString::number(hulldef->BLWL) ); txt_DfwdHeight->setText( QString::number(hulldef->DfwdHeight) ); txt_DaftHeight->setText( QString::number(hulldef->DaftHeight) ); txt_BBW->setText( QString::number(hulldef->BBW) ); txt_BaftW->setText( QString::number(hulldef->BaftW) ); spinBox_BSlopeA->setValue(hulldef->BSlopeA); spinBox_BBWPos->setValue(hulldef->BBWPos); spinBox_StemA->setValue(hulldef->StemA); spinBox_TransomA->setValue(hulldef->TransomA); spinBox_BfwdShape->setValue(hulldef->BfwdShape); spinBox_BaftShape->setValue(hulldef->BaftShape); /// bottom parameters txt_BfwdHeight->setText( QString::number(hulldef->BfwdHeight) ); txt_BaftHeight->setText( QString::number(hulldef->BaftHeight) ); spinBox_BSlopeA->setValue(hulldef->BSlopeA); spinBox_BDeadriseA->setValue(hulldef->BDeadriseA); spinBox_BSweepA->setValue(hulldef->BSweepA); /// planking parameters spinBox_NBPlank->setValue(hulldef->NBPlank); spinBox_TopPlankA->setValue(hulldef->TopPlankA); spinBox_LowPlankA->setValue(hulldef->LowPlankA); checkBox_AutoPlank->setChecked(hulldef->AutoPlank); /// signal and slots connections connect( btnCheck, SIGNAL( clicked() ), this, SLOT( slotCheck() ) ); connect( btnOK, SIGNAL( clicked() ), this, SLOT( accept() ) ); connect( btnCancel, SIGNAL( clicked() ), this, SLOT( reject() ) ); } // Qt overrides /** Saves the parameters entered by the user in the CHullDef. * slot connected to OK button */ void CFormHullDef::accept() { // return data if everything is OK. ///////////////////////// if (check() == true) QDialog::accept(); } /** slot for dealing with automatic planking */ void CFormHullDef::slotAutoPlank() { if (checkBox_AutoPlank->isChecked() ) hulldef->AutoPlank = true; check(); } /** slot for dealing with check button */ void CFormHullDef::slotCheck() { check(); } /** Check all dimensions entered in order * to make sure that the hull is possible and reasonable */ bool CFormHullDef::check() { /// return true IF everything is OK long L1=1; // real A1=0, A2=0; bool flag = true; QString txt; /// create four palettes QPalette palStd, palHi, palLo, palRel; palStd = txt_HullID->palette(); palLo = palHi = palRel = palStd; palLo.setColor( QPalette::Text, Qt::magenta); // too low value palHi.setColor( QPalette::Text, Qt::red ); // too high value palRel.setColor( QPalette::Text, Qt::blue ); // related value to be checked /// check hull ID txt = txt_HullID->text(); txt = txt.simplified(); if (txt.length() > 40) { txt.truncate(40); flag = false; txt_HullID->setPalette(palHi); txt_HullID->setText(QString(txt)); } else { txt_HullID->setPalette(palStd); txt_HullID->setText(QString(txt)); } hulldef->hullID = txt.toStdString(); /// check bottom data hulldef->BLWL = txt_BLWL->text().toDouble(); // length waterline if (hulldef->BLWL < 100) { flag = false; txt_BLWL->setPalette(palLo); hulldef->BLWL = 100; } else if (hulldef->BLWL > 100000) { flag = false; txt_BLWL->setPalette(palHi); hulldef->BLWL = 100000; } else { txt_BLWL->setPalette(palStd); } txt_BLWL->setText(QString::number(hulldef->BLWL)); L1 = (long)(hulldef->BLWL); // lower chine height hulldef->BfwdHeight = txt_BfwdHeight->text().toDouble(); if (hulldef->BfwdHeight > L1/5) { flag = false; txt_BfwdHeight->setPalette(palHi); hulldef->BfwdHeight = floor(L1 / 5); } else { txt_BfwdHeight->setPalette(palStd); } txt_BfwdHeight->setText(QString::number(hulldef->BfwdHeight)); hulldef->BaftHeight = txt_BaftHeight->text().toDouble(); if (hulldef->BaftHeight > L1 / 5) { flag = false; txt_BaftHeight->setPalette(palHi); hulldef->BaftHeight = floor(L1 / 5); } else { txt_BaftHeight->setPalette(palStd); } txt_BaftHeight->setText(QString::number(hulldef->BaftHeight)); // bottom width hulldef->BBW = txt_BBW->text().toDouble(); if (hulldef->BBW < L1/20) { flag = false; txt_BBW->setPalette(palLo); hulldef->BBW = ceil(L1/20); } else if (hulldef->BBW > L1/2) { flag = false; txt_BBW->setPalette(palHi); hulldef->BBW = floor(L1/2); } else { txt_BBW->setPalette(palStd); } txt_BBW->setText(QString::number(hulldef->BBW)); hulldef->BaftW = txt_BaftW->text().toDouble(); if (hulldef->BaftW < 0) { flag = false; txt_BaftW->setPalette(palLo); hulldef->BaftW = 0; } else if (hulldef->BaftW > hulldef->BBW) { flag = false; txt_BaftW->setPalette(palHi); hulldef->BaftW = floor(hulldef->BBW); } else { txt_BaftW->setPalette(palStd); } txt_BaftW->setText(QString::number(hulldef->BaftW)); hulldef->BBWPos = spinBox_BBWPos->value(); // bottom shape hulldef->BfwdShape = spinBox_BfwdShape->value(); hulldef->BaftShape = spinBox_BaftShape->value(); hulldef->BSlopeA = spinBox_BSlopeA->value(); hulldef->BDeadriseA = spinBox_BDeadriseA->value(); hulldef->BSweepA = spinBox_BSweepA->value(); hulldef->StemA = spinBox_StemA->value(); hulldef->TransomA = spinBox_TransomA->value(); /// check deck data hulldef->DfwdHeight = txt_DfwdHeight->text().toDouble(); if (hulldef->DfwdHeight < (hulldef->BfwdHeight + L1 / 20) ) { flag = false; txt_DfwdHeight->setPalette(palLo); hulldef->DfwdHeight = ceil( hulldef->BfwdHeight + L1 / 20 ); } else if (hulldef->DfwdHeight > ( L1 / 4 ) ) { flag = false; txt_DfwdHeight->setPalette(palHi); hulldef->DfwdHeight = floor( L1 / 4 ); } else { txt_DfwdHeight->setPalette(palStd); } txt_DfwdHeight->setText(QString::number(hulldef->DfwdHeight)); hulldef->DaftHeight = txt_DaftHeight->text().toDouble(); if (hulldef->DaftHeight < (hulldef->BaftHeight + L1 / 20) ) { flag = false; txt_DaftHeight->setPalette(palLo); hulldef->DaftHeight = ceil( hulldef->BaftHeight + L1 / 20); } else if (hulldef->DaftHeight > ( L1 / 4 ) ) { flag = false; txt_DaftHeight->setPalette(palHi); hulldef->DaftHeight = floor( L1 / 4 ); } else { txt_DaftHeight->setPalette(palStd); } txt_DaftHeight->setText(QString::number(hulldef->DaftHeight)); /// planking parameters hulldef->NBPlank = spinBox_NBPlank->value(); hulldef->TopPlankA = spinBox_TopPlankA->value(); hulldef->LowPlankA = spinBox_LowPlankA->value(); /// check automatic planking if (checkBox_AutoPlank->isChecked() ) hulldef->AutoPlank = true; else hulldef->AutoPlank = false; /// return true IF everything is OK return flag; } sailcut-1.3.5/src/examples/0000755000175000007640000000000011457411327015516 5ustar sharkyjerrywebsailcut-1.3.5/src/examples/Star45-JIB.dxf0000644000175000007640000011250710510643102017676 0ustar sharkyjerryweb999 DXF created by Sailcut CAD 0 SECTION 2 HEADER 0 ENDSEC 0 SECTION 2 TABLES 0 TABLE 2 LAYER 70 6 0 LAYER 2 1 70 64 62 4 6 CONTINUOUS 0 LAYER 2 2 70 64 62 2 6 CONTINUOUS 0 LAYER 2 3 70 64 62 4 6 CONTINUOUS 0 LAYER 2 4 70 64 62 2 6 CONTINUOUS 0 LAYER 2 5 70 64 62 4 6 CONTINUOUS 0 ENDTAB 0 ENDSEC 0 SECTION 2 ENTITIES 0 3DFACE 8 1 10 227.296 20 162.802 30 1.25297e-10 11 196.667 21 60 31 0 12 206.816 22 94.2638 32 1.57692e-11 13 206.816 23 94.2638 33 1.57692e-11 0 3DFACE 8 1 10 227.296 20 162.802 30 1.25297e-10 11 206.816 21 94.2638 31 1.57692e-11 12 216.989 22 128.529 32 1.33438e-11 13 216.989 23 128.529 33 1.33438e-11 0 3DFACE 8 1 10 227.296 20 162.802 30 1.25297e-10 11 216.989 21 128.529 31 1.33438e-11 12 227.187 22 162.796 32 6.79915e-11 13 227.187 23 162.796 33 6.79915e-11 0 3DFACE 8 1 10 227.296 20 162.802 30 1.25297e-10 11 227.187 21 162.796 31 6.79915e-11 12 237.409 22 197.064 32 1.33544e-10 13 237.409 23 197.064 33 1.33544e-10 0 3DFACE 8 1 10 227.296 20 162.802 30 1.25297e-10 11 237.409 21 197.064 31 1.33544e-10 12 247.655 22 231.333 32 1.97649e-10 13 247.655 23 231.333 33 1.97649e-10 0 3DFACE 8 1 10 227.296 20 162.802 30 1.25297e-10 11 247.655 21 231.333 31 1.97649e-10 12 257.926 22 265.605 32 2.50594e-10 13 257.926 23 265.605 33 2.50594e-10 0 3DFACE 8 1 10 257.926 20 265.605 30 2.50594e-10 11 196.667 21 60 31 0 12 272.768 22 266.51 32 3.67824 13 272.768 23 266.51 33 3.67824 0 3DFACE 8 1 10 272.768 20 266.51 30 3.67824 11 214.868 21 60.8552 31 2.57587 12 196.667 22 60 32 0 13 196.667 23 60 33 0 0 3DFACE 8 1 10 272.768 20 266.51 30 3.67824 11 214.868 21 60.8552 31 2.57587 12 287.634 22 267.416 32 6.8339 13 287.634 23 267.416 33 6.8339 0 3DFACE 8 1 10 287.634 20 267.416 30 6.8339 11 233.07 21 61.9572 31 4.75575 12 214.868 22 60.8552 32 2.57587 13 214.868 23 60.8552 33 2.57587 0 3DFACE 8 1 10 287.634 20 267.416 30 6.8339 11 233.07 21 61.9572 31 4.75575 12 302.521 22 268.321 32 9.50799 13 302.521 23 268.321 33 9.50799 0 3DFACE 8 1 10 302.521 20 268.321 30 9.50799 11 251.272 21 63.3078 31 6.56238 12 233.07 22 61.9572 32 4.75575 13 233.07 23 61.9572 33 4.75575 0 3DFACE 8 1 10 302.521 20 268.321 30 9.50799 11 251.272 21 63.3078 31 6.56238 12 317.428 22 269.227 32 11.7409 13 317.428 23 269.227 33 11.7409 0 3DFACE 8 1 10 317.428 20 269.227 30 11.7409 11 269.473 21 64.9088 31 8.01779 12 251.272 22 63.3078 32 6.56238 13 251.272 23 63.3078 33 6.56238 0 3DFACE 8 1 10 317.428 20 269.227 30 11.7409 11 269.473 21 64.9088 31 8.01779 12 332.353 22 270.133 32 13.5723 13 332.353 23 270.133 33 13.5723 0 3DFACE 8 1 10 332.353 20 270.133 30 13.5723 11 287.675 21 66.7622 31 9.14343 12 269.473 22 64.9088 32 8.01779 13 269.473 23 64.9088 33 8.01779 0 3DFACE 8 1 10 332.353 20 270.133 30 13.5723 11 287.675 21 66.7622 31 9.14343 12 347.295 22 271.038 32 15.0409 13 347.295 23 271.038 33 15.0409 0 3DFACE 8 1 10 347.295 20 271.038 30 15.0409 11 305.876 21 68.8698 31 9.96018 12 287.675 22 66.7622 32 9.14343 13 287.675 23 66.7622 33 9.14343 0 3DFACE 8 1 10 347.295 20 271.038 30 15.0409 11 305.876 21 68.8698 31 9.96018 12 362.253 22 271.944 32 16.1844 13 362.253 23 271.944 33 16.1844 0 3DFACE 8 1 10 362.253 20 271.944 30 16.1844 11 324.078 21 71.2335 31 10.4885 12 305.876 22 68.8698 32 9.96018 13 305.876 23 68.8698 33 9.96018 0 3DFACE 8 1 10 362.253 20 271.944 30 16.1844 11 324.078 21 71.2335 31 10.4885 12 377.225 22 272.849 32 17.0393 13 377.225 23 272.849 33 17.0393 0 3DFACE 8 1 10 377.225 20 272.849 30 17.0393 11 342.28 21 73.8553 31 10.7483 12 324.078 22 71.2335 32 10.4885 13 324.078 23 71.2335 33 10.4885 0 3DFACE 8 1 10 377.225 20 272.849 30 17.0393 11 342.28 21 73.8553 31 10.7483 12 392.209 22 273.755 32 17.6405 13 392.209 23 273.755 33 17.6405 0 3DFACE 8 1 10 392.209 20 273.755 30 17.6405 11 360.481 21 76.737 31 10.7594 12 342.28 22 73.8553 32 10.7483 13 342.28 23 73.8553 33 10.7483 0 3DFACE 8 1 10 392.209 20 273.755 30 17.6405 11 360.481 21 76.737 31 10.7594 12 407.204 22 274.661 32 18.0215 13 407.204 23 274.661 33 18.0215 0 3DFACE 8 1 10 407.204 20 274.661 30 18.0215 11 378.683 21 79.8808 31 10.5413 12 360.481 22 76.737 32 10.7594 13 360.481 23 76.737 33 10.7594 0 3DFACE 8 1 10 407.204 20 274.661 30 18.0215 11 378.683 21 79.8808 31 10.5413 12 422.209 22 275.566 32 18.2139 13 422.209 23 275.566 33 18.2139 0 3DFACE 8 1 10 422.209 20 275.566 30 18.2139 11 396.885 21 83.2886 31 10.1131 12 378.683 22 79.8808 32 10.5413 13 378.683 23 79.8808 33 10.5413 0 3DFACE 8 1 10 422.209 20 275.566 30 18.2139 11 396.885 21 83.2886 31 10.1131 12 437.222 22 276.472 32 18.2475 13 437.222 23 276.472 33 18.2475 0 3DFACE 8 1 10 437.222 20 276.472 30 18.2475 11 415.086 21 86.9624 31 9.49399 12 396.885 22 83.2886 32 10.1131 13 396.885 23 83.2886 33 10.1131 0 3DFACE 8 1 10 437.222 20 276.472 30 18.2475 11 415.086 21 86.9624 31 9.49399 12 452.242 22 277.377 32 18.1495 13 452.242 23 277.377 33 18.1495 0 3DFACE 8 1 10 452.242 20 277.377 30 18.1495 11 433.288 21 90.9043 31 8.70317 12 415.086 22 86.9624 32 9.49399 13 415.086 23 86.9624 33 9.49399 0 3DFACE 8 1 10 452.242 20 277.377 30 18.1495 11 433.288 21 90.9043 31 8.70317 12 467.269 22 278.283 32 17.9451 13 467.269 23 278.283 33 17.9451 0 3DFACE 8 1 10 467.269 20 278.283 30 17.9451 11 451.489 21 95.1164 31 7.75979 12 433.288 22 90.9043 32 8.70317 13 433.288 23 90.9043 33 8.70317 0 3DFACE 8 1 10 467.269 20 278.283 30 17.9451 11 451.489 21 95.1164 31 7.75979 12 482.3 22 279.189 32 17.6568 13 482.3 23 279.189 33 17.6568 0 3DFACE 8 1 10 482.3 20 279.189 30 17.6568 11 469.691 21 99.6008 31 6.68319 12 451.489 22 95.1164 32 7.75979 13 451.489 23 95.1164 33 7.75979 0 3DFACE 8 1 10 482.3 20 279.189 30 17.6568 11 469.691 21 99.6008 31 6.68319 12 497.335 22 280.094 32 17.3041 13 497.335 23 280.094 33 17.3041 0 3DFACE 8 1 10 497.335 20 280.094 30 17.3041 11 487.893 21 104.36 31 5.49291 12 469.691 22 99.6008 32 6.68319 13 469.691 23 99.6008 33 6.68319 0 3DFACE 8 1 10 497.335 20 280.094 30 17.3041 11 487.893 21 104.36 31 5.49291 12 512.373 22 281 32 16.9036 13 512.373 23 281 33 16.9036 0 3DFACE 8 1 10 512.373 20 281 30 16.9036 11 506.094 21 109.395 31 4.20885 12 487.893 22 104.36 32 5.49291 13 487.893 23 104.36 33 5.49291 0 3DFACE 8 1 10 512.373 20 281 30 16.9036 11 506.094 21 109.395 31 4.20885 12 527.414 22 281.906 32 16.4685 13 527.414 23 281.906 33 16.4685 0 3DFACE 8 1 10 527.414 20 281.906 30 16.4685 11 524.296 21 114.709 31 2.85133 12 506.094 22 109.395 32 4.20885 13 506.094 23 109.395 33 4.20885 0 3DFACE 8 1 10 527.414 20 281.906 30 16.4685 11 524.296 21 114.709 31 2.85133 12 542.457 22 282.811 32 16.0084 13 542.457 23 282.811 33 16.0084 0 3DFACE 8 1 10 542.457 20 282.811 30 16.0084 11 542.498 21 120.305 31 1.44121 12 524.296 22 114.709 32 2.85133 13 524.296 23 114.709 33 2.85133 0 3DFACE 8 1 10 542.457 20 282.811 30 16.0084 11 542.498 21 120.305 31 1.44121 12 557.502 22 283.717 32 15.5288 13 557.502 23 283.717 33 15.5288 0 3DFACE 8 1 10 557.502 20 283.717 30 15.5288 11 560.699 21 126.183 31 -1.02926e-15 12 542.498 22 120.305 32 1.44121 13 542.498 23 120.305 33 1.44121 0 3DFACE 8 1 10 559.101 20 204.95 30 7.76442 11 560.699 21 126.183 31 -1.02926e-15 12 560.389 22 152.449 32 2.95745 13 560.389 23 152.449 33 2.95745 0 3DFACE 8 1 10 559.101 20 204.95 30 7.76442 11 560.389 21 152.449 31 2.95745 12 559.987 22 178.711 32 5.77017 13 559.987 23 178.711 33 5.77017 0 3DFACE 8 1 10 559.101 20 204.95 30 7.76442 11 559.987 21 178.711 31 5.77017 12 559.495 22 204.968 32 8.4359 13 559.495 23 204.968 33 8.4359 0 3DFACE 8 1 10 559.101 20 204.95 30 7.76442 11 559.495 21 204.968 31 8.4359 12 558.915 22 231.222 32 10.9524 13 558.915 23 231.222 33 10.9524 0 3DFACE 8 1 10 559.101 20 204.95 30 7.76442 11 558.915 21 231.222 31 10.9524 12 558.25 22 257.471 32 13.3174 13 558.25 23 257.471 33 13.3174 0 3DFACE 8 1 10 559.101 20 204.95 30 7.76442 11 558.25 21 257.471 31 13.3174 12 557.502 22 283.717 32 15.5288 13 557.502 23 283.717 33 15.5288 0 3DFACE 8 2 10 288.992 20 368.426 30 1.76695e-10 11 257.926 21 265.605 31 2.50594e-10 12 268.22 22 299.875 32 2.85186e-10 13 268.22 23 299.875 33 2.85186e-10 0 3DFACE 8 2 10 288.992 20 368.426 30 1.76695e-10 11 268.22 21 299.875 31 2.85186e-10 12 278.539 22 334.147 32 2.96349e-10 13 278.539 23 334.147 33 2.96349e-10 0 3DFACE 8 2 10 288.992 20 368.426 30 1.76695e-10 11 278.539 21 334.147 31 2.96349e-10 12 288.882 22 368.42 32 2.82186e-10 13 288.882 23 368.42 33 2.82186e-10 0 3DFACE 8 2 10 288.992 20 368.426 30 1.76695e-10 11 288.882 21 368.42 31 2.82186e-10 12 299.25 22 402.694 32 2.42515e-10 13 299.25 23 402.694 33 2.42515e-10 0 3DFACE 8 2 10 288.992 20 368.426 30 1.76695e-10 11 299.25 21 402.694 31 2.42515e-10 12 309.642 22 436.97 32 1.80982e-10 13 309.642 23 436.97 33 1.80982e-10 0 3DFACE 8 2 10 288.992 20 368.426 30 1.76695e-10 11 309.642 21 436.97 31 1.80982e-10 12 320.059 22 471.248 32 1.02796e-10 13 320.059 23 471.248 33 1.02796e-10 0 3DFACE 8 2 10 320.059 20 471.248 30 1.02796e-10 11 257.926 21 265.605 31 2.50594e-10 12 331.13 22 471.945 32 4.67389 13 331.13 23 471.945 33 4.67389 0 3DFACE 8 2 10 331.13 20 471.945 30 4.67389 11 272.768 21 266.51 31 3.67824 12 257.926 22 265.605 32 2.50594e-10 13 257.926 23 265.605 33 2.50594e-10 0 3DFACE 8 2 10 331.13 20 471.945 30 4.67389 11 272.768 21 266.51 31 3.67824 12 342.286 22 472.641 32 8.61202 13 342.286 23 472.641 33 8.61202 0 3DFACE 8 2 10 342.286 20 472.641 30 8.61202 11 287.634 21 267.416 31 6.8339 12 272.768 22 266.51 32 3.67824 13 272.768 23 266.51 33 3.67824 0 3DFACE 8 2 10 342.286 20 472.641 30 8.61202 11 287.634 21 267.416 31 6.8339 12 353.515 22 473.338 32 11.9109 13 353.515 23 473.338 33 11.9109 0 3DFACE 8 2 10 353.515 20 473.338 30 11.9109 11 302.521 21 268.321 31 9.50799 12 287.634 22 267.416 32 6.8339 13 287.634 23 267.416 33 6.8339 0 3DFACE 8 2 10 353.515 20 473.338 30 11.9109 11 302.521 21 268.321 31 9.50799 12 364.807 22 474.035 32 14.6588 13 364.807 23 474.035 33 14.6588 0 3DFACE 8 2 10 364.807 20 474.035 30 14.6588 11 317.428 21 269.227 31 11.7409 12 302.521 22 268.321 32 9.50799 13 302.521 23 268.321 33 9.50799 0 3DFACE 8 2 10 364.807 20 474.035 30 14.6588 11 317.428 21 269.227 31 11.7409 12 376.154 22 474.731 32 16.9361 13 376.154 23 474.731 33 16.9361 0 3DFACE 8 2 10 376.154 20 474.731 30 16.9361 11 332.353 21 270.133 31 13.5723 12 317.428 22 269.227 32 11.7409 13 317.428 23 269.227 33 11.7409 0 3DFACE 8 2 10 376.154 20 474.731 30 16.9361 11 332.353 21 270.133 31 13.5723 12 387.547 22 475.428 32 18.8151 13 387.547 23 475.428 33 18.8151 0 3DFACE 8 2 10 387.547 20 475.428 30 18.8151 11 347.295 21 271.038 31 15.0409 12 332.353 22 270.133 32 13.5723 13 332.353 23 270.133 33 13.5723 0 3DFACE 8 2 10 387.547 20 475.428 30 18.8151 11 347.295 21 271.038 31 15.0409 12 398.98 22 476.125 32 20.3605 13 398.98 23 476.125 33 20.3605 0 3DFACE 8 2 10 398.98 20 476.125 30 20.3605 11 362.253 21 271.944 31 16.1844 12 347.295 22 271.038 32 15.0409 13 347.295 23 271.038 33 15.0409 0 3DFACE 8 2 10 398.98 20 476.125 30 20.3605 11 362.253 21 271.944 31 16.1844 12 410.444 22 476.821 32 21.6292 13 410.444 23 476.821 33 21.6292 0 3DFACE 8 2 10 410.444 20 476.821 30 21.6292 11 377.225 21 272.849 31 17.0393 12 362.253 22 271.944 32 16.1844 13 362.253 23 271.944 33 16.1844 0 3DFACE 8 2 10 410.444 20 476.821 30 21.6292 11 377.225 21 272.849 31 17.0393 12 421.936 22 477.518 32 22.6712 13 421.936 23 477.518 33 22.6712 0 3DFACE 8 2 10 421.936 20 477.518 30 22.6712 11 392.209 21 273.755 31 17.6405 12 377.225 22 272.849 32 17.0393 13 377.225 23 272.849 33 17.0393 0 3DFACE 8 2 10 421.936 20 477.518 30 22.6712 11 392.209 21 273.755 31 17.6405 12 433.45 22 478.215 32 23.5291 13 433.45 23 478.215 33 23.5291 0 3DFACE 8 2 10 433.45 20 478.215 30 23.5291 11 407.204 21 274.661 31 18.0215 12 392.209 22 273.755 32 17.6405 13 392.209 23 273.755 33 17.6405 0 3DFACE 8 2 10 433.45 20 478.215 30 23.5291 11 407.204 21 274.661 31 18.0215 12 444.981 22 478.911 32 24.239 13 444.981 23 478.911 33 24.239 0 3DFACE 8 2 10 444.981 20 478.911 30 24.239 11 422.209 21 275.566 31 18.2139 12 407.204 22 274.661 32 18.0215 13 407.204 23 274.661 33 18.0215 0 3DFACE 8 2 10 444.981 20 478.911 30 24.239 11 422.209 21 275.566 31 18.2139 12 456.527 22 479.608 32 24.8308 13 456.527 23 479.608 33 24.8308 0 3DFACE 8 2 10 456.527 20 479.608 30 24.8308 11 437.222 21 276.472 31 18.2475 12 422.209 22 275.566 32 18.2139 13 422.209 23 275.566 33 18.2139 0 3DFACE 8 2 10 456.527 20 479.608 30 24.8308 11 437.222 21 276.472 31 18.2475 12 468.084 22 480.305 32 25.3283 13 468.084 23 480.305 33 25.3283 0 3DFACE 8 2 10 468.084 20 480.305 30 25.3283 11 452.242 21 277.377 31 18.1495 12 437.222 22 276.472 32 18.2475 13 437.222 23 276.472 33 18.2475 0 3DFACE 8 2 10 468.084 20 480.305 30 25.3283 11 452.242 21 277.377 31 18.1495 12 479.651 22 481.001 32 25.7499 13 479.651 23 481.001 33 25.7499 0 3DFACE 8 2 10 479.651 20 481.001 30 25.7499 11 467.269 21 278.283 31 17.9451 12 452.242 22 277.377 32 18.1495 13 452.242 23 277.377 33 18.1495 0 3DFACE 8 2 10 479.651 20 481.001 30 25.7499 11 467.269 21 278.283 31 17.9451 12 491.226 22 481.698 32 26.109 13 491.226 23 481.698 33 26.109 0 3DFACE 8 2 10 491.226 20 481.698 30 26.109 11 482.3 21 279.189 31 17.6568 12 467.269 22 278.283 32 17.9451 13 467.269 23 278.283 33 17.9451 0 3DFACE 8 2 10 491.226 20 481.698 30 26.109 11 482.3 21 279.189 31 17.6568 12 502.807 22 482.395 32 26.4147 13 502.807 23 482.395 33 26.4147 0 3DFACE 8 2 10 502.807 20 482.395 30 26.4147 11 497.335 21 280.094 31 17.3041 12 482.3 22 279.189 32 17.6568 13 482.3 23 279.189 33 17.6568 0 3DFACE 8 2 10 502.807 20 482.395 30 26.4147 11 497.335 21 280.094 31 17.3041 12 514.395 22 483.091 32 26.6721 13 514.395 23 483.091 33 26.6721 0 3DFACE 8 2 10 514.395 20 483.091 30 26.6721 11 512.373 21 281 31 16.9036 12 497.335 22 280.094 32 17.3041 13 497.335 23 280.094 33 17.3041 0 3DFACE 8 2 10 514.395 20 483.091 30 26.6721 11 512.373 21 281 31 16.9036 12 525.989 22 483.788 32 26.8834 13 525.989 23 483.788 33 26.8834 0 3DFACE 8 2 10 525.989 20 483.788 30 26.8834 11 527.414 21 281.906 31 16.4685 12 512.373 22 281 32 16.9036 13 512.373 23 281 33 16.9036 0 3DFACE 8 2 10 525.989 20 483.788 30 26.8834 11 527.414 21 281.906 31 16.4685 12 537.589 22 484.485 32 27.0479 13 537.589 23 484.485 33 27.0479 0 3DFACE 8 2 10 537.589 20 484.485 30 27.0479 11 542.457 21 282.811 31 16.0084 12 527.414 22 281.906 32 16.4685 13 527.414 23 281.906 33 16.4685 0 3DFACE 8 2 10 537.589 20 484.485 30 27.0479 11 542.457 21 282.811 31 16.0084 12 549.196 22 485.181 32 27.1635 13 549.196 23 485.181 33 27.1635 0 3DFACE 8 2 10 549.196 20 485.181 30 27.1635 11 557.502 21 283.717 31 15.5288 12 542.457 22 282.811 32 16.0084 13 542.457 23 282.811 33 16.0084 0 3DFACE 8 2 10 553.349 20 384.449 30 21.3462 11 557.502 21 283.717 31 15.5288 12 556.425 22 317.311 32 18.1322 13 556.425 23 317.311 33 18.1322 0 3DFACE 8 2 10 553.349 20 384.449 30 21.3462 11 556.425 21 317.311 31 18.1322 12 555.219 22 350.898 32 20.4756 13 555.219 23 350.898 33 20.4756 0 3DFACE 8 2 10 553.349 20 384.449 30 21.3462 11 555.219 21 350.898 31 20.4756 12 553.888 22 384.479 32 22.5548 13 553.888 23 384.479 33 22.5548 0 3DFACE 8 2 10 553.349 20 384.449 30 21.3462 11 553.888 21 384.479 31 22.5548 12 552.438 22 418.053 32 24.3653 13 552.438 23 418.053 33 24.3653 0 3DFACE 8 2 10 553.349 20 384.449 30 21.3462 11 552.438 21 418.053 31 24.3653 12 550.872 22 451.62 32 25.9029 13 550.872 23 451.62 33 25.9029 0 3DFACE 8 2 10 553.349 20 384.449 30 21.3462 11 550.872 21 451.62 31 25.9029 12 549.196 22 485.181 32 27.1635 13 549.196 23 485.181 33 27.1635 0 3DFACE 8 3 10 351.502 20 574.038 30 6.16085e-11 11 320.059 21 471.248 31 1.02796e-10 12 330.494 22 505.508 32 1.63442e-11 13 330.494 23 505.508 33 1.63442e-11 0 3DFACE 8 3 10 351.502 20 574.038 30 6.16085e-11 11 330.494 21 505.508 31 1.63442e-11 12 340.951 22 539.77 32 3.68686e-11 13 340.951 23 539.77 33 3.68686e-11 0 3DFACE 8 3 10 351.502 20 574.038 30 6.16085e-11 11 340.951 21 539.77 31 3.68686e-11 12 351.425 22 574.033 32 6.48391e-11 13 351.425 23 574.033 33 6.48391e-11 0 3DFACE 8 3 10 351.502 20 574.038 30 6.16085e-11 11 351.425 21 574.033 31 6.48391e-11 12 361.916 22 608.297 32 6.51159e-11 13 361.916 23 608.297 33 6.51159e-11 0 3DFACE 8 3 10 351.502 20 574.038 30 6.16085e-11 11 361.916 21 608.297 31 6.51159e-11 12 372.422 22 642.561 32 2.76955e-11 13 372.422 23 642.561 33 2.76955e-11 0 3DFACE 8 3 10 351.502 20 574.038 30 6.16085e-11 11 372.422 21 642.561 31 2.76955e-11 12 382.945 22 676.827 32 2.04214e-11 13 382.945 23 676.827 33 2.04214e-11 0 3DFACE 8 3 10 382.945 20 676.827 30 2.04214e-11 11 320.059 21 471.248 31 1.02796e-10 12 390.167 22 677.301 32 4.0311 13 390.167 23 677.301 33 4.0311 0 3DFACE 8 3 10 390.167 20 677.301 30 4.0311 11 331.13 21 471.945 31 4.67389 12 320.059 22 471.248 32 1.02796e-10 13 320.059 23 471.248 33 1.02796e-10 0 3DFACE 8 3 10 390.167 20 677.301 30 4.0311 11 331.13 21 471.945 31 4.67389 12 397.505 22 677.774 32 7.43747 13 397.505 23 677.774 33 7.43747 0 3DFACE 8 3 10 397.505 20 677.774 30 7.43747 11 342.286 21 472.641 31 8.61202 12 331.13 22 471.945 32 4.67389 13 331.13 23 471.945 33 4.67389 0 3DFACE 8 3 10 397.505 20 677.774 30 7.43747 11 342.286 21 472.641 31 8.61202 12 404.94 22 678.247 32 10.3154 13 404.94 23 678.247 33 10.3154 0 3DFACE 8 3 10 404.94 20 678.247 30 10.3154 11 353.515 21 473.338 31 11.9109 12 342.286 22 472.641 32 8.61202 13 342.286 23 472.641 33 8.61202 0 3DFACE 8 3 10 404.94 20 678.247 30 10.3154 11 353.515 21 473.338 31 11.9109 12 412.458 22 678.721 32 12.7503 13 412.458 23 678.721 33 12.7503 0 3DFACE 8 3 10 412.458 20 678.721 30 12.7503 11 364.807 21 474.035 31 14.6588 12 353.515 22 473.338 32 11.9109 13 353.515 23 473.338 33 11.9109 0 3DFACE 8 3 10 412.458 20 678.721 30 12.7503 11 364.807 21 474.035 31 14.6588 12 420.045 22 679.194 32 14.8173 13 420.045 23 679.194 33 14.8173 0 3DFACE 8 3 10 420.045 20 679.194 30 14.8173 11 376.154 21 474.731 31 16.9361 12 364.807 22 474.035 32 14.6588 13 364.807 23 474.035 33 14.6588 0 3DFACE 8 3 10 420.045 20 679.194 30 14.8173 11 376.154 21 474.731 31 16.9361 12 427.688 22 679.668 32 16.5817 13 427.688 23 679.668 33 16.5817 0 3DFACE 8 3 10 427.688 20 679.668 30 16.5817 11 387.547 21 475.428 31 18.8151 12 376.154 22 474.731 32 16.9361 13 376.154 23 474.731 33 16.9361 0 3DFACE 8 3 10 427.688 20 679.668 30 16.5817 11 387.547 21 475.428 31 18.8151 12 435.377 22 680.141 32 18.1 13 435.377 23 680.141 33 18.1 0 3DFACE 8 3 10 435.377 20 680.141 30 18.1 11 398.98 21 476.125 31 20.3605 12 387.547 22 475.428 32 18.8151 13 387.547 23 475.428 33 18.8151 0 3DFACE 8 3 10 435.377 20 680.141 30 18.1 11 398.98 21 476.125 31 20.3605 12 443.104 22 680.615 32 19.4202 13 443.104 23 680.615 33 19.4202 0 3DFACE 8 3 10 443.104 20 680.615 30 19.4202 11 410.444 21 476.821 31 21.6292 12 398.98 22 476.125 32 20.3605 13 398.98 23 476.125 33 20.3605 0 3DFACE 8 3 10 443.104 20 680.615 30 19.4202 11 410.444 21 476.821 31 21.6292 12 450.86 22 681.088 32 20.5824 13 450.86 23 681.088 33 20.5824 0 3DFACE 8 3 10 450.86 20 681.088 30 20.5824 11 421.936 21 477.518 31 22.6712 12 410.444 22 476.821 32 21.6292 13 410.444 23 476.821 33 21.6292 0 3DFACE 8 3 10 450.86 20 681.088 30 20.5824 11 421.936 21 477.518 31 22.6712 12 458.64 22 681.561 32 21.62 13 458.64 23 681.561 33 21.62 0 3DFACE 8 3 10 458.64 20 681.561 30 21.62 11 433.45 21 478.215 31 23.5291 12 421.936 22 477.518 32 22.6712 13 421.936 23 477.518 33 22.6712 0 3DFACE 8 3 10 458.64 20 681.561 30 21.62 11 433.45 21 478.215 31 23.5291 12 466.438 22 682.035 32 22.5595 13 466.438 23 682.035 33 22.5595 0 3DFACE 8 3 10 466.438 20 682.035 30 22.5595 11 444.981 21 478.911 31 24.239 12 433.45 22 478.215 32 23.5291 13 433.45 23 478.215 33 23.5291 0 3DFACE 8 3 10 466.438 20 682.035 30 22.5595 11 444.981 21 478.911 31 24.239 12 474.251 22 682.508 32 23.4221 13 474.251 23 682.508 33 23.4221 0 3DFACE 8 3 10 474.251 20 682.508 30 23.4221 11 456.527 21 479.608 31 24.8308 12 444.981 22 478.911 32 24.239 13 444.981 23 478.911 33 24.239 0 3DFACE 8 3 10 474.251 20 682.508 30 23.4221 11 456.527 21 479.608 31 24.8308 12 482.075 22 682.982 32 24.2237 13 482.075 23 682.982 33 24.2237 0 3DFACE 8 3 10 482.075 20 682.982 30 24.2237 11 468.084 21 480.305 31 25.3283 12 456.527 22 479.608 32 24.8308 13 456.527 23 479.608 33 24.8308 0 3DFACE 8 3 10 482.075 20 682.982 30 24.2237 11 468.084 21 480.305 31 25.3283 12 489.91 22 683.455 32 24.9757 13 489.91 23 683.455 33 24.9757 0 3DFACE 8 3 10 489.91 20 683.455 30 24.9757 11 479.651 21 481.001 31 25.7499 12 468.084 22 480.305 32 25.3283 13 468.084 23 480.305 33 25.3283 0 3DFACE 8 3 10 489.91 20 683.455 30 24.9757 11 479.651 21 481.001 31 25.7499 12 497.752 22 683.929 32 25.6859 13 497.752 23 683.929 33 25.6859 0 3DFACE 8 3 10 497.752 20 683.929 30 25.6859 11 491.226 21 481.698 31 26.109 12 479.651 22 481.001 32 25.7499 13 479.651 23 481.001 33 25.7499 0 3DFACE 8 3 10 497.752 20 683.929 30 25.6859 11 491.226 21 481.698 31 26.109 12 505.602 22 684.402 32 26.3588 13 505.602 23 684.402 33 26.3588 0 3DFACE 8 3 10 505.602 20 684.402 30 26.3588 11 502.807 21 482.395 31 26.4147 12 491.226 22 481.698 32 26.109 13 491.226 23 481.698 33 26.109 0 3DFACE 8 3 10 505.602 20 684.402 30 26.3588 11 502.807 21 482.395 31 26.4147 12 513.458 22 684.875 32 26.9967 13 513.458 23 684.875 33 26.9967 0 3DFACE 8 3 10 513.458 20 684.875 30 26.9967 11 514.395 21 483.091 31 26.6721 12 502.807 22 482.395 32 26.4147 13 502.807 23 482.395 33 26.4147 0 3DFACE 8 3 10 513.458 20 684.875 30 26.9967 11 514.395 21 483.091 31 26.6721 12 521.321 22 685.349 32 27.5996 13 521.321 23 685.349 33 27.5996 0 3DFACE 8 3 10 521.321 20 685.349 30 27.5996 11 525.989 21 483.788 31 26.8834 12 514.395 22 483.091 32 26.6721 13 514.395 23 483.091 33 26.6721 0 3DFACE 8 3 10 521.321 20 685.349 30 27.5996 11 525.989 21 483.788 31 26.8834 12 529.192 22 685.822 32 28.1664 13 529.192 23 685.822 33 28.1664 0 3DFACE 8 3 10 529.192 20 685.822 30 28.1664 11 537.589 21 484.485 31 27.0479 12 525.989 22 483.788 32 26.8834 13 525.989 23 483.788 33 26.8834 0 3DFACE 8 3 10 529.192 20 685.822 30 28.1664 11 537.589 21 484.485 31 27.0479 12 537.07 22 686.296 32 28.6954 13 537.07 23 686.296 33 28.6954 0 3DFACE 8 3 10 537.07 20 686.296 30 28.6954 11 549.196 21 485.181 31 27.1635 12 537.589 22 484.485 32 27.0479 13 537.589 23 484.485 33 27.0479 0 3DFACE 8 3 10 543.133 20 585.738 30 27.9294 11 549.196 21 485.181 31 27.1635 12 547.416 22 518.717 32 28.1423 13 547.416 23 518.717 33 28.1423 0 3DFACE 8 3 10 543.133 20 585.738 30 27.9294 11 547.416 21 518.717 31 28.1423 12 545.536 22 552.247 32 28.837 13 545.536 23 552.247 33 28.837 0 3DFACE 8 3 10 543.133 20 585.738 30 27.9294 11 545.536 21 552.247 31 28.837 12 543.56 22 585.77 32 29.244 13 543.56 23 585.77 33 29.244 0 3DFACE 8 3 10 543.133 20 585.738 30 27.9294 11 543.56 21 585.77 31 29.244 12 541.494 22 619.286 32 29.3598 13 541.494 23 619.286 33 29.3598 0 3DFACE 8 3 10 543.133 20 585.738 30 27.9294 11 541.494 21 619.286 31 29.3598 12 539.342 22 652.795 32 29.1805 13 539.342 23 652.795 33 29.1805 0 3DFACE 8 3 10 543.133 20 585.738 30 27.9294 11 539.342 21 652.795 31 29.1805 12 537.07 22 686.296 32 28.6954 13 537.07 23 686.296 33 28.6954 0 3DFACE 8 4 10 414.692 20 779.65 30 2.73739e-10 11 382.945 21 676.827 31 2.04214e-11 12 393.486 22 711.099 32 6.7514e-11 13 393.486 23 711.099 33 6.7514e-11 0 3DFACE 8 4 10 414.692 20 779.65 30 2.73739e-10 11 393.486 21 711.099 31 6.7514e-11 12 404.044 22 745.372 32 1.30896e-10 13 404.044 23 745.372 33 1.30896e-10 0 3DFACE 8 4 10 414.692 20 779.65 30 2.73739e-10 11 404.044 21 745.372 31 1.30896e-10 12 414.618 22 779.646 32 2.10185e-10 13 414.618 23 779.646 33 2.10185e-10 0 3DFACE 8 4 10 414.692 20 779.65 30 2.73739e-10 11 414.618 21 779.646 31 2.10185e-10 12 425.209 22 813.92 32 3.04089e-10 13 425.209 23 813.92 33 3.04089e-10 0 3DFACE 8 4 10 414.692 20 779.65 30 2.73739e-10 11 425.209 21 813.92 31 3.04089e-10 12 435.815 22 848.196 32 4.1062e-10 13 435.815 23 848.196 33 4.1062e-10 0 3DFACE 8 4 10 414.692 20 779.65 30 2.73739e-10 11 435.815 21 848.196 31 4.1062e-10 12 446.439 22 882.473 32 5.27056e-10 13 446.439 23 882.473 33 5.27056e-10 0 3DFACE 8 4 10 446.439 20 882.473 30 5.27056e-10 11 382.945 21 676.827 31 2.04214e-11 12 449.801 22 882.705 32 2.3599 13 449.801 23 882.705 33 2.3599 0 3DFACE 8 4 10 449.801 20 882.705 30 2.3599 11 390.167 21 677.301 31 4.0311 12 382.945 22 676.827 32 2.04214e-11 13 382.945 23 676.827 33 2.04214e-11 0 3DFACE 8 4 10 449.801 20 882.705 30 2.3599 11 390.167 21 677.301 31 4.0311 12 453.257 22 882.938 32 4.36106 13 453.257 23 882.938 33 4.36106 0 3DFACE 8 4 10 453.257 20 882.938 30 4.36106 11 397.505 21 677.774 31 7.43747 12 390.167 22 677.301 32 4.0311 13 390.167 23 677.301 33 4.0311 0 3DFACE 8 4 10 453.257 20 882.938 30 4.36106 11 397.505 21 677.774 31 7.43747 12 456.789 22 883.17 32 6.06452 13 456.789 23 883.17 33 6.06452 0 3DFACE 8 4 10 456.789 20 883.17 30 6.06452 11 404.94 21 678.247 31 10.3154 12 397.505 22 677.774 32 7.43747 13 397.505 23 677.774 33 7.43747 0 3DFACE 8 4 10 456.789 20 883.17 30 6.06452 11 404.94 21 678.247 31 10.3154 12 460.384 22 883.402 32 7.52334 13 460.384 23 883.402 33 7.52334 0 3DFACE 8 4 10 460.384 20 883.402 30 7.52334 11 412.458 21 678.721 31 12.7503 12 404.94 22 678.247 32 10.3154 13 404.94 23 678.247 33 10.3154 0 3DFACE 8 4 10 460.384 20 883.402 30 7.52334 11 412.458 21 678.721 31 12.7503 12 464.031 22 883.635 32 8.7832 13 464.031 23 883.635 33 8.7832 0 3DFACE 8 4 10 464.031 20 883.635 30 8.7832 11 420.045 21 679.194 31 14.8173 12 412.458 22 678.721 32 12.7503 13 412.458 23 678.721 33 12.7503 0 3DFACE 8 4 10 464.031 20 883.635 30 8.7832 11 420.045 21 679.194 31 14.8173 12 467.72 22 883.867 32 9.88305 13 467.72 23 883.867 33 9.88305 0 3DFACE 8 4 10 467.72 20 883.867 30 9.88305 11 427.688 21 679.668 31 16.5817 12 420.045 22 679.194 32 14.8173 13 420.045 23 679.194 33 14.8173 0 3DFACE 8 4 10 467.72 20 883.867 30 9.88305 11 427.688 21 679.668 31 16.5817 12 471.441 22 884.1 32 10.8557 13 471.441 23 884.1 33 10.8557 0 3DFACE 8 4 10 471.441 20 884.1 30 10.8557 11 435.377 21 680.141 31 18.1 12 427.688 22 679.668 32 16.5817 13 427.688 23 679.668 33 16.5817 0 3DFACE 8 4 10 471.441 20 884.1 30 10.8557 11 435.377 21 680.141 31 18.1 12 475.188 22 884.332 32 11.7282 13 475.188 23 884.332 33 11.7282 0 3DFACE 8 4 10 475.188 20 884.332 30 11.7282 11 443.104 21 680.615 31 19.4202 12 435.377 22 680.141 32 18.1 13 435.377 23 680.141 33 18.1 0 3DFACE 8 4 10 475.188 20 884.332 30 11.7282 11 443.104 21 680.615 31 19.4202 12 478.956 22 884.564 32 12.5229 13 478.956 23 884.564 33 12.5229 0 3DFACE 8 4 10 478.956 20 884.564 30 12.5229 11 450.86 21 681.088 31 20.5824 12 443.104 22 680.615 32 19.4202 13 443.104 23 680.615 33 19.4202 0 3DFACE 8 4 10 478.956 20 884.564 30 12.5229 11 450.86 21 681.088 31 20.5824 12 482.739 22 884.797 32 13.2574 13 482.739 23 884.797 33 13.2574 0 3DFACE 8 4 10 482.739 20 884.797 30 13.2574 11 458.64 21 681.561 31 21.62 12 450.86 22 681.088 32 20.5824 13 450.86 23 681.088 33 20.5824 0 3DFACE 8 4 10 482.739 20 884.797 30 13.2574 11 458.64 21 681.561 31 21.62 12 486.534 22 885.029 32 13.9457 13 486.534 23 885.029 33 13.9457 0 3DFACE 8 4 10 486.534 20 885.029 30 13.9457 11 466.438 21 682.035 31 22.5595 12 458.64 22 681.561 32 21.62 13 458.64 23 681.561 33 21.62 0 3DFACE 8 4 10 486.534 20 885.029 30 13.9457 11 466.438 21 682.035 31 22.5595 12 490.339 22 885.262 32 14.5981 13 490.339 23 885.262 33 14.5981 0 3DFACE 8 4 10 490.339 20 885.262 30 14.5981 11 474.251 21 682.508 31 23.4221 12 466.438 22 682.035 32 22.5595 13 466.438 23 682.035 33 22.5595 0 3DFACE 8 4 10 490.339 20 885.262 30 14.5981 11 474.251 21 682.508 31 23.4221 12 494.151 22 885.494 32 15.2222 13 494.151 23 885.494 33 15.2222 0 3DFACE 8 4 10 494.151 20 885.494 30 15.2222 11 482.075 21 682.982 31 24.2237 12 474.251 22 682.508 32 23.4221 13 474.251 23 682.508 33 23.4221 0 3DFACE 8 4 10 494.151 20 885.494 30 15.2222 11 482.075 21 682.982 31 24.2237 12 497.969 22 885.726 32 15.8232 13 497.969 23 885.726 33 15.8232 0 3DFACE 8 4 10 497.969 20 885.726 30 15.8232 11 489.91 21 683.455 31 24.9757 12 482.075 22 682.982 32 24.2237 13 482.075 23 682.982 33 24.2237 0 3DFACE 8 4 10 497.969 20 885.726 30 15.8232 11 489.91 21 683.455 31 24.9757 12 501.792 22 885.959 32 16.4044 13 501.792 23 885.959 33 16.4044 0 3DFACE 8 4 10 501.792 20 885.959 30 16.4044 11 497.752 21 683.929 31 25.6859 12 489.91 22 683.455 32 24.9757 13 489.91 23 683.455 33 24.9757 0 3DFACE 8 4 10 501.792 20 885.959 30 16.4044 11 497.752 21 683.929 31 25.6859 12 505.62 22 886.191 32 16.9673 13 505.62 23 886.191 33 16.9673 0 3DFACE 8 4 10 505.62 20 886.191 30 16.9673 11 505.602 21 684.402 31 26.3588 12 497.752 22 683.929 32 25.6859 13 497.752 23 683.929 33 25.6859 0 3DFACE 8 4 10 505.62 20 886.191 30 16.9673 11 505.602 21 684.402 31 26.3588 12 509.453 22 886.423 32 17.5127 13 509.453 23 886.423 33 17.5127 0 3DFACE 8 4 10 509.453 20 886.423 30 17.5127 11 513.458 21 684.875 31 26.9967 12 505.602 22 684.402 32 26.3588 13 505.602 23 684.402 33 26.3588 0 3DFACE 8 4 10 509.453 20 886.423 30 17.5127 11 513.458 21 684.875 31 26.9967 12 513.29 22 886.656 32 18.0401 13 513.29 23 886.656 33 18.0401 0 3DFACE 8 4 10 513.29 20 886.656 30 18.0401 11 521.321 21 685.349 31 27.5996 12 513.458 22 684.875 32 26.9967 13 513.458 23 684.875 33 26.9967 0 3DFACE 8 4 10 513.29 20 886.656 30 18.0401 11 521.321 21 685.349 31 27.5996 12 517.132 22 886.888 32 18.5488 13 517.132 23 886.888 33 18.5488 0 3DFACE 8 4 10 517.132 20 886.888 30 18.5488 11 529.192 21 685.822 31 28.1664 12 521.321 22 685.349 32 27.5996 13 521.321 23 685.349 33 27.5996 0 3DFACE 8 4 10 517.132 20 886.888 30 18.5488 11 529.192 21 685.822 31 28.1664 12 520.98 22 887.121 32 19.0377 13 520.98 23 887.121 33 19.0377 0 3DFACE 8 4 10 520.98 20 887.121 30 19.0377 11 537.07 21 686.296 31 28.6954 12 529.192 22 685.822 32 28.1664 13 529.192 23 685.822 33 28.1664 0 3DFACE 8 4 10 529.025 20 786.708 30 23.8666 11 537.07 21 686.296 31 28.6954 12 534.671 22 719.791 32 27.8971 13 534.671 23 719.791 33 27.8971 0 3DFACE 8 4 10 529.025 20 786.708 30 23.8666 11 534.671 21 719.791 31 27.8971 12 532.151 22 753.277 32 26.7807 13 532.151 23 753.277 33 26.7807 0 3DFACE 8 4 10 529.025 20 786.708 30 23.8666 11 532.151 21 753.277 31 26.7807 12 529.515 22 786.753 32 25.3412 13 529.515 23 786.753 33 25.3412 0 3DFACE 8 4 10 529.025 20 786.708 30 23.8666 11 529.515 21 786.753 31 25.3412 12 526.771 22 820.218 32 23.574 13 526.771 23 820.218 33 23.574 0 3DFACE 8 4 10 529.025 20 786.708 30 23.8666 11 526.771 21 820.218 31 23.574 12 523.924 22 853.675 32 21.4744 13 523.924 23 853.675 33 21.4744 0 3DFACE 8 4 10 529.025 20 786.708 30 23.8666 11 523.924 21 853.675 31 21.4744 12 520.98 22 887.121 32 19.0377 13 520.98 23 887.121 33 19.0377 0 3DFACE 8 5 10 474.751 20 973.387 30 2.63528e-10 11 446.439 21 882.473 31 5.27056e-10 12 455.844 22 912.776 32 6.34624e-10 13 455.844 23 912.776 33 6.34624e-10 0 3DFACE 8 5 10 474.751 20 973.387 30 2.63528e-10 11 455.844 21 912.776 31 6.34624e-10 12 465.262 22 943.079 32 7.44634e-10 13 465.262 23 943.079 33 7.44634e-10 0 3DFACE 8 5 10 474.751 20 973.387 30 2.63528e-10 11 465.262 21 943.079 31 7.44634e-10 12 474.693 22 973.384 32 8.5324e-10 13 474.693 23 973.384 33 8.5324e-10 0 3DFACE 8 5 10 474.751 20 973.387 30 2.63528e-10 11 474.693 21 973.384 31 8.5324e-10 12 484.137 22 1003.69 32 9.56672e-10 13 484.137 23 1003.69 33 9.56672e-10 0 3DFACE 8 5 10 474.751 20 973.387 30 2.63528e-10 11 484.137 21 1003.69 31 9.56672e-10 12 493.594 22 1033.99 32 1.05075e-09 13 493.594 23 1033.99 33 1.05075e-09 0 3DFACE 8 5 10 474.751 20 973.387 30 2.63528e-10 11 493.594 21 1033.99 31 1.05075e-09 12 503.064 22 1064.3 32 0 13 503.064 23 1064.3 33 0 0 3DFACE 8 5 10 503.064 20 1064.3 30 0 11 446.439 21 882.473 31 5.27056e-10 12 503.11 22 1064.31 32 0.0152135 13 503.11 23 1064.31 33 0.0152135 0 3DFACE 8 5 10 503.11 20 1064.31 30 0.0152135 11 449.801 21 882.705 31 2.3599 12 446.439 22 882.473 32 5.27056e-10 13 446.439 23 882.473 33 5.27056e-10 0 3DFACE 8 5 10 503.11 20 1064.31 30 0.0152135 11 449.801 21 882.705 31 2.3599 12 503.157 22 1064.32 32 0.0304273 13 503.157 23 1064.32 33 0.0304273 0 3DFACE 8 5 10 503.157 20 1064.32 30 0.0304273 11 453.257 21 882.938 31 4.36106 12 449.801 22 882.705 32 2.3599 13 449.801 23 882.705 33 2.3599 0 3DFACE 8 5 10 503.157 20 1064.32 30 0.0304273 11 453.257 21 882.938 31 4.36106 12 503.204 22 1064.33 32 0.0456414 13 503.204 23 1064.33 33 0.0456414 0 3DFACE 8 5 10 503.204 20 1064.33 30 0.0456414 11 456.789 21 883.17 31 6.06452 12 453.257 22 882.938 32 4.36106 13 453.257 23 882.938 33 4.36106 0 3DFACE 8 5 10 503.204 20 1064.33 30 0.0456414 11 456.789 21 883.17 31 6.06452 12 503.251 22 1064.34 32 0.0608558 13 503.251 23 1064.34 33 0.0608558 0 3DFACE 8 5 10 503.251 20 1064.34 30 0.0608558 11 460.384 21 883.402 31 7.52334 12 456.789 22 883.17 32 6.06452 13 456.789 23 883.17 33 6.06452 0 3DFACE 8 5 10 503.251 20 1064.34 30 0.0608558 11 460.384 21 883.402 31 7.52334 12 503.298 22 1064.34 32 0.0760704 13 503.298 23 1064.34 33 0.0760704 0 3DFACE 8 5 10 503.298 20 1064.34 30 0.0760704 11 464.031 21 883.635 31 8.7832 12 460.384 22 883.402 32 7.52334 13 460.384 23 883.402 33 7.52334 0 3DFACE 8 5 10 503.298 20 1064.34 30 0.0760704 11 464.031 21 883.635 31 8.7832 12 503.345 22 1064.35 32 0.0912853 13 503.345 23 1064.35 33 0.0912853 0 3DFACE 8 5 10 503.345 20 1064.35 30 0.0912853 11 467.72 21 883.867 31 9.88305 12 464.031 22 883.635 32 8.7832 13 464.031 23 883.635 33 8.7832 0 3DFACE 8 5 10 503.345 20 1064.35 30 0.0912853 11 467.72 21 883.867 31 9.88305 12 503.391 22 1064.36 32 0.1065 13 503.391 23 1064.36 33 0.1065 0 3DFACE 8 5 10 503.391 20 1064.36 30 0.1065 11 471.441 21 884.1 31 10.8557 12 467.72 22 883.867 32 9.88305 13 467.72 23 883.867 33 9.88305 0 3DFACE 8 5 10 503.391 20 1064.36 30 0.1065 11 471.441 21 884.1 31 10.8557 12 503.438 22 1064.37 32 0.121716 13 503.438 23 1064.37 33 0.121716 0 3DFACE 8 5 10 503.438 20 1064.37 30 0.121716 11 475.188 21 884.332 31 11.7282 12 471.441 22 884.1 32 10.8557 13 471.441 23 884.1 33 10.8557 0 3DFACE 8 5 10 503.438 20 1064.37 30 0.121716 11 475.188 21 884.332 31 11.7282 12 503.485 22 1064.38 32 0.136932 13 503.485 23 1064.38 33 0.136932 0 3DFACE 8 5 10 503.485 20 1064.38 30 0.136932 11 478.956 21 884.564 31 12.5229 12 475.188 22 884.332 32 11.7282 13 475.188 23 884.332 33 11.7282 0 3DFACE 8 5 10 503.485 20 1064.38 30 0.136932 11 478.956 21 884.564 31 12.5229 12 503.532 22 1064.39 32 0.152148 13 503.532 23 1064.39 33 0.152148 0 3DFACE 8 5 10 503.532 20 1064.39 30 0.152148 11 482.739 21 884.797 31 13.2574 12 478.956 22 884.564 32 12.5229 13 478.956 23 884.564 33 12.5229 0 3DFACE 8 5 10 503.532 20 1064.39 30 0.152148 11 482.739 21 884.797 31 13.2574 12 503.579 22 1064.4 32 0.167364 13 503.579 23 1064.4 33 0.167364 0 3DFACE 8 5 10 503.579 20 1064.4 30 0.167364 11 486.534 21 885.029 31 13.9457 12 482.739 22 884.797 32 13.2574 13 482.739 23 884.797 33 13.2574 0 3DFACE 8 5 10 503.579 20 1064.4 30 0.167364 11 486.534 21 885.029 31 13.9457 12 503.626 22 1064.41 32 0.18258 13 503.626 23 1064.41 33 0.18258 0 3DFACE 8 5 10 503.626 20 1064.41 30 0.18258 11 490.339 21 885.262 31 14.5981 12 486.534 22 885.029 32 13.9457 13 486.534 23 885.029 33 13.9457 0 3DFACE 8 5 10 503.626 20 1064.41 30 0.18258 11 490.339 21 885.262 31 14.5981 12 503.672 22 1064.41 32 0.197797 13 503.672 23 1064.41 33 0.197797 0 3DFACE 8 5 10 503.672 20 1064.41 30 0.197797 11 494.151 21 885.494 31 15.2222 12 490.339 22 885.262 32 14.5981 13 490.339 23 885.262 33 14.5981 0 3DFACE 8 5 10 503.672 20 1064.41 30 0.197797 11 494.151 21 885.494 31 15.2222 12 503.719 22 1064.42 32 0.213014 13 503.719 23 1064.42 33 0.213014 0 3DFACE 8 5 10 503.719 20 1064.42 30 0.213014 11 497.969 21 885.726 31 15.8232 12 494.151 22 885.494 32 15.2222 13 494.151 23 885.494 33 15.2222 0 3DFACE 8 5 10 503.719 20 1064.42 30 0.213014 11 497.969 21 885.726 31 15.8232 12 503.766 22 1064.43 32 0.228232 13 503.766 23 1064.43 33 0.228232 0 3DFACE 8 5 10 503.766 20 1064.43 30 0.228232 11 501.792 21 885.959 31 16.4044 12 497.969 22 885.726 32 15.8232 13 497.969 23 885.726 33 15.8232 0 3DFACE 8 5 10 503.766 20 1064.43 30 0.228232 11 501.792 21 885.959 31 16.4044 12 503.813 22 1064.44 32 0.243449 13 503.813 23 1064.44 33 0.243449 0 3DFACE 8 5 10 503.813 20 1064.44 30 0.243449 11 505.62 21 886.191 31 16.9673 12 501.792 22 885.959 32 16.4044 13 501.792 23 885.959 33 16.4044 0 3DFACE 8 5 10 503.813 20 1064.44 30 0.243449 11 505.62 21 886.191 31 16.9673 12 503.86 22 1064.45 32 0.258667 13 503.86 23 1064.45 33 0.258667 0 3DFACE 8 5 10 503.86 20 1064.45 30 0.258667 11 509.453 21 886.423 31 17.5127 12 505.62 22 886.191 32 16.9673 13 505.62 23 886.191 33 16.9673 0 3DFACE 8 5 10 503.86 20 1064.45 30 0.258667 11 509.453 21 886.423 31 17.5127 12 503.907 22 1064.46 32 0.273885 13 503.907 23 1064.46 33 0.273885 0 3DFACE 8 5 10 503.907 20 1064.46 30 0.273885 11 513.29 21 886.656 31 18.0401 12 509.453 22 886.423 32 17.5127 13 509.453 23 886.423 33 17.5127 0 3DFACE 8 5 10 503.907 20 1064.46 30 0.273885 11 513.29 21 886.656 31 18.0401 12 503.953 22 1064.47 32 0.289104 13 503.953 23 1064.47 33 0.289104 0 3DFACE 8 5 10 503.953 20 1064.47 30 0.289104 11 517.132 21 886.888 31 18.5488 12 513.29 22 886.656 32 18.0401 13 513.29 23 886.656 33 18.0401 0 3DFACE 8 5 10 503.953 20 1064.47 30 0.289104 11 517.132 21 886.888 31 18.5488 12 504 22 1064.47 32 0.304322 13 504 23 1064.47 33 0.304322 0 3DFACE 8 5 10 504 20 1064.47 30 0.304322 11 520.98 21 887.121 31 19.0377 12 517.132 22 886.888 32 18.5488 13 517.132 23 886.888 33 18.5488 0 3DFACE 8 5 10 512.49 20 975.798 30 9.67103 11 520.98 21 887.121 31 19.0377 12 518.3 22 916.699 32 16.5978 13 518.3 23 916.699 33 16.5978 0 3DFACE 8 5 10 512.49 20 975.798 30 9.67103 11 518.3 21 916.699 31 16.5978 12 515.555 22 946.27 32 13.8877 13 515.555 23 946.27 33 13.8877 0 3DFACE 8 5 10 512.49 20 975.798 30 9.67103 11 515.555 21 946.27 31 13.8877 12 512.747 22 975.833 32 10.9045 13 512.747 23 975.833 33 10.9045 0 3DFACE 8 5 10 512.49 20 975.798 30 9.67103 11 512.747 21 975.833 31 10.9045 12 509.883 22 1005.39 32 7.64521 13 509.883 23 1005.39 33 7.64521 0 3DFACE 8 5 10 512.49 20 975.798 30 9.67103 11 509.883 21 1005.39 31 7.64521 12 506.967 22 1034.94 32 4.10714 13 506.967 23 1034.94 33 4.10714 0 3DFACE 8 5 10 512.49 20 975.798 30 9.67103 11 506.967 21 1034.94 31 4.10714 12 504 22 1064.47 32 0.304322 13 504 23 1064.47 33 0.304322 0 ENDSEC 0 EOF sailcut-1.3.5/src/examples/Star45-JIB.xml0000644000175000007640000000274310510643102017715 0ustar sharkyjerryweb sailcut-1.3.5/src/examples/main.saildef0000644000175000007640000000357110510643102017764 0ustar sharkyjerryweb sailcut-1.3.5/src/formboat.h0000644000175000007640000000320711177775326015677 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef FORMBOAT_H #define FORMBOAT_H #include "formdocument.h" #include "sailwriter-xml.h" class CBoatDefPanel; /** A form allowing the user to assemble several elements into a boat. */ class CFormBoat : public CFormDocumentTmpl { Q_OBJECT public: CFormBoat(CPrefs *myPrefs, QWidget *parent); void add(const QString &newfile); protected: T_KEYPRESS void setDef(const CBoatDef &newdef); void setupMainWidget(); void setupMenuBar(); protected slots: virtual void languageChange(); virtual void slotAdd(); virtual void slotUpdate(const CBoatDef& newdef); protected: /** A panel with one tab per element in the current boat. */ CBoatDefPanel *defpanel; /** The Add menu. */ QMenu *menuAdd; /** add a file */ QAction *actionAddFile; }; #endif sailcut-1.3.5/src/sailwriter-hand.h0000644000175000007640000000235011177775326017161 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SAILWRITER_HAND_H #define SAILWRITER_HAND_H #include "sailwriter-txt.h" /** This class allows you to write a developed sail by using * the deviation of the edge from the straight line instead * of using absolute coordinates to a TXT file. * * @ingroup FileIo */ class CSailHandWriter : public CSailTxtWriter { public: virtual void write(const CPanelGroup &sail, const QString &filename) const; }; #endif sailcut-1.3.5/src/sailwriter-xml.h0000644000175000007640000000751711177775326017061 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SAILWRITER_XML_H #define SAILWRITER_XML_H #include "filewriter.h" #include "saildoc.h" /** This class allows you to write sailcut objects to * an XML file. * * @ingroup FileIo * @see CPanelGroupXmlWriter * @see CSailDefXmlWriter */ template class XmlWriterTempl : public CFileWriter { protected : /** the object's name */ QString _name; public: /** The constructor. * * @param name the object's name * @param ext the file extension to show (defaults to ".xml") * @param desc a description of the file type (defaults to "XML files") */ XmlWriterTempl(const QString &name, const QString ext = ".xml", const QString desc = "XML files") : CFileWriter(ext, desc), _name(name) {} ; /** Write object to XML format. * * @param obj the object to write * @param filename the file to write to */ virtual void write(const objtype &obj, const QString &filename) const { CSailDoc doc; doc.put(doc.top, obj, _name); doc.toFile(filename); }; /** Read object from an XML file. * * @param filename the file we read from */ const objtype read(const QString &filename) const { CSailDoc doc(filename); objtype obj; doc.get(doc.top, obj, _name); return obj; }; }; /** A class used to output a CPanelGroup to an XML file. */ class CPanelGroupXmlWriter : public XmlWriterTempl { public: /** The constructor. */ CPanelGroupXmlWriter() : XmlWriterTempl("panelgroup", ".panel3d", "3D sails or hulls") {} ; }; /** A class used to output a CHullDef to an XML file. */ class CHullDefXmlWriter : public XmlWriterTempl { public: /** The constructor. */ CHullDefXmlWriter() : XmlWriterTempl("hulldef", ".hulldef", "Hull definitions") {} ; }; /** A class used to output a CSailDef to an XML file. */ class CSailDefXmlWriter : public XmlWriterTempl { public: /** The constructor. */ CSailDefXmlWriter() : XmlWriterTempl("saildef", ".saildef", "Sail definitions") {} ; }; /** A class used to output a CBoatDef to an XML file. */ class CBoatDefXmlWriter : public XmlWriterTempl { public: /** The constructor. */ CBoatDefXmlWriter() : XmlWriterTempl("boatdef", ".boatdef", "Boat definitions") {} ; }; /** A class used to output a CRigDef to an XML file. */ class CRigDefXmlWriter : public XmlWriterTempl { public: /** The constructor. */ CRigDefXmlWriter() : XmlWriterTempl("rigdef", ".rigdef", "Rig definitions") {} ; }; /** A class used to output a CPrefs to an XML file. */ class CPrefsXmlWriter : public XmlWriterTempl { public: /** The constructor. */ CPrefsXmlWriter() : XmlWriterTempl("prefs") {} ; }; #endif sailcut-1.3.5/src/CMakeLists.txt0000644000175000007640000000507411457404323016444 0ustar sharkyjerrywebinclude_directories(${CMAKE_SOURCE_DIR}/icons ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) set(QT_USE_QTOPENGL 1) set(QT_USE_QTSVG 1) set(QT_USE_QTXML 1) include(${QT_USE_FILE}) relative_path(SAILCUT_DATA_PATH ${SAILCUT_RUNTIME_DIR} ${SAILCUT_DATA_DIR}) relative_path(SAILCUT_DOC_PATH ${SAILCUT_RUNTIME_DIR} ${SAILCUT_DOC_DIR}) add_definitions(-DSAILCUT_VERSION="${SAILCUT_VERSION}") add_definitions(-DSAILCUT_DATA_PATH="${SAILCUT_DATA_PATH}") add_definitions(-DSAILCUT_DOC_PATH="${SAILCUT_DOC_PATH}") if(QT_QTOPENGL_FOUND) add_definitions(-DHAVE_QTOPENGL) endif(QT_QTOPENGL_FOUND) set(sailcut_UIS formhulldefbase.ui formrigdefbase.ui formsaildefbase.ui) set(sailcut_MOC_HEADERS boatdef-panel.h formboat.h formdocument.h formhull.h formhulldef.h formmain.h formmould.h formpanelgroup.h formprint.h formrig.h formrigdef.h formsail.h formsaildef.h sailprinter.h sailtreemodel.h sailviewer.h sailviewer-panel.h sailviewer-tabs.h widgetprofile.h widgetprofilevert.h) set(sailcut_SOURCES boatdef-panel.cpp formboat.cpp formhull.cpp formhulldef.cpp formmain.cpp formmould.cpp formpanelgroup.cpp formrig.cpp formprint.cpp formrigdef.cpp formsail.cpp formsaildef.cpp main.cpp prefs.cpp sailcutqt.cpp saildisp.cpp saildispgl.cpp saildisplabel.cpp saildoc.cpp sailpainter.cpp sailprinter.cpp sailtreeitem.cpp sailtreemodel.cpp sailviewer.cpp sailviewer-panel.cpp sailviewer-tabs.cpp sailwriter-carlson.cpp sailwriter-dxf.cpp sailwriter-hand.cpp sailwriter-svg.cpp sailwriter-txt.cpp widgetprofile.cpp widgetprofilevert.cpp) if(WIN32) enable_language(RC) set(SAILCUT_VERSION_WIN32 "${SAILCUT_VERSION_MAJOR},${SAILCUT_VERSION_MINOR},${SAILCUT_VERSION_PATCH},0") configure_file(${CMAKE_SOURCE_DIR}/cmake/sailcut.rc.in ${CMAKE_CURRENT_BINARY_DIR}/sailcut.rc) set(sailcut_SOURCES ${sailcut_SOURCES} sailcut.rc) endif(WIN32) qt4_wrap_cpp(sailcut_MOC_SOURCES ${sailcut_MOC_HEADERS}) qt4_wrap_ui(sailcut_UI_SOURCES ${sailcut_UIS}) add_executable(sailcut ${sailcut_SOURCES} ${sailcut_MOC_SOURCES} ${sailcut_UI_SOURCES}) add_dependencies(sailcut documentation) add_dependencies(sailcut translations) if (WIN32) # FIXME: when cross-compiling for mingw32 FindQt4 fails to pick up # the dependencies for QtOpenGl set(QT_LIBRARIES ${QT_LIBRARIES} -lopengl32 -lglu32) set_target_properties(sailcut PROPERTIES LINK_FLAGS "-mwindows") endif(WIN32) target_link_libraries(sailcut sailcpp geocpp ${QT_LIBRARIES}) ship_depends(sailcut) install(TARGETS sailcut DESTINATION ${SAILCUT_RUNTIME_DIR}) add_subdirectory(geocpp) add_subdirectory(sailcpp) add_subdirectory(ts) sailcut-1.3.5/src/sailcutqt.cpp0000644000175000007640000000674311177775326016442 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "sailcutqt.h" #include #include #include #include #include "sailwriter-xml.h" using namespace std; /** * Creates an new Sailcut application. * * @param argc * @param argv */ CSailApp::CSailApp(int &argc, char** argv) : QApplication(argc, argv) { // create and install translators transApp = new QTranslator( this ); transQt = new QTranslator( this ); // the file containing the user's preferences prefsfile = QDir::home().filePath(".sailcutrc"); } /** * Tries to locate the Sailcut Handbook. */ QUrl CSailApp::findHandbook(const QString locale) { QStringList docdirs; QString handbook; QStringList locales(locale); if (locale != "en") locales.append("en"); // when run from the build location docdirs.append("../doc"); // when run from the installed location docdirs.append(SAILCUT_DOC_PATH); // look for handbook in different languages QDir appDir(applicationDirPath()); for (int i = 0; i < locales.size(); i++) { for (int d = 0; d < docdirs.size(); d++) { handbook = appDir.absoluteFilePath(docdirs.at(d) + QDir::separator() + locales.at(i) + QDir::separator() + "index.html"); if (QFile::exists(handbook)) return QUrl::fromLocalFile(QFileInfo(handbook).absoluteFilePath()); } } return QUrl(); } /** * Loads translation strings for a given language. */ void CSailApp::loadTranslation(const QString locale) { QStringList datadirs; // translation file for Qt transQt->load( QString( "qt_" ) + locale, "." ); installTranslator(transQt); // translation file for application strings QString qm = QString("sailcut_") + locale; // when run from the build location datadirs.append("ts"); // when run from the installed location datadirs.append(SAILCUT_DATA_PATH); int d = 0; QDir appDir(applicationDirPath()); while ((d < datadirs.size()) && (!transApp->load(qm, appDir.absoluteFilePath(datadirs.at(d))))) { d++; } installTranslator(transApp); } /** * Try to read the user's preferences */ void CSailApp::readPrefs() { try { if (QFile(prefsfile).exists()) prefs = CPrefsXmlWriter().read(prefsfile); } catch (read_error e) { cout << "CSailApp::readPrefs : could not read preferences" << endl; } } /** * Try to write the user's preferences. */ void CSailApp::writePrefs() { try { CPrefsXmlWriter().write(prefs, prefsfile); } catch (write_error e) { cout << "CSailApp::writePrefs : could not write preferences" << endl; } } sailcut-1.3.5/src/sailprinter.h0000644000175000007640000000662211200217006016373 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SAILPRINTER_H #define SAILPRINTER_H #include "sailcpp/saildef.h" #include "sailcpp/panelgroup.h" #include "sailpainter.h" /** This is the base class used for printing. */ class CPrinter : public QObject { public: /** Return the number of pages, must be overriden. */ virtual int pages() const = 0; /** Perform the actual printing operation, must be overriden. */ virtual void print(CTextPainter *painter, int page, real scale, real fontsize) const = 0; /** Return the scale needed to fit the developed sail in the given device. * * @param device */ virtual double scaleToFit(QPaintDevice* device) const { return -1; }; }; /** A class for printing sail data. * * All the data is printed on a single page. */ class CSailDataPrinter : public CPrinter { Q_OBJECT public: /** The constructor. * * @param obj the sail definition to print */ CSailDataPrinter(const CSailDef &obj) : saildef(obj) {}; int pages() const { return 1; }; void print(CTextPainter *painter, int, real size, real fontsize) const; protected: /** the sail definition to print */ const CSailDef saildef; }; /** A class for printing a sail. * * All the panels are printed on a single page. */ class CSailDrawingPrinter : public CPrinter { Q_OBJECT public: /** The constructor. * * @param obj the sail to print * @param show_labels should labels be printed? */ CSailDrawingPrinter(const CPanelGroup &obj, bool show_labels = true) : sail(obj), showLabels(show_labels) {}; int pages() const { return 1; }; void print(CTextPainter *painter, int, real scale, real fontsize) const; double scaleToFit(QPaintDevice *device) const; protected: /** the sail to print */ const CPanelGroup sail; /** should the labels be printed? */ bool showLabels; }; /** A class for printing developped sail panels. * * One panel is output per page. */ class CSailDevelPrinter : public CSailDrawingPrinter { Q_OBJECT public: /** The constructor. * * @param obj the developed sail to print * @param show_labels should labels be printed? */ /** The constructor. * * @param obj the sail to print * @param show_labels should labels be printed? */ CSailDevelPrinter(const CPanelGroup &obj, bool show_labels = true) : CSailDrawingPrinter(obj, show_labels) {}; int pages() const { return sail.size(); }; void print(CTextPainter *painter, int page, real scale, real fontsize) const; }; #endif sailcut-1.3.5/src/sailwriter-dxf.h0000644000175000007640000000602411177775326017032 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SAILWRITER_DXF_H #define SAILWRITER_DXF_H #include "filewriter.h" #include "sailcpp/panelgroup.h" #include #include /** An abstract class containing the methods needed for DXF writing. */ class CSailDxfWriter : public CFileWriter { public: /** The constructor. */ CSailDxfWriter() : CFileWriter(".dxf", "DXF files") {} ; void writeBegin(ofstream &out, const QString &filename) const; void writeEnd(ofstream &out) const; void writeAtom(ofstream &out, int code, const QString& content) const; void writeFace(ofstream &out, CPoint3d p0, CPoint3d p1, CPoint3d p2, unsigned int layer) const; void writeLayer(ofstream &out, unsigned int layer, const QString &color) const; void writePolyline(ofstream &out, unsigned int layer, const QString &color) const; void writeVertex(ofstream &out, CPoint3d p0, unsigned int layer) const; }; /** A class used to write a CPanelGroup to a 2D DXF file. * * @ingroup FileIo */ class CSailDxfWriter2d : public CSailDxfWriter { public: enum Dxf2dType { NORMAL, BLOCKS, SPLIT, }; CSailDxfWriter2d(enum Dxf2dType format) : type(format) {}; void write(const CPanelGroup &sail, const QString &filename) const; protected: void writePanel(ofstream &out, const CPanel &panel, unsigned int layer) const; void writeNormal(const CPanelGroup &sail, const QString &filename) const; void writeBlocks(const CPanelGroup &sail, const QString &filename) const; void writeSplit(const CPanelGroup &sail, const QString &filename) const; Dxf2dType type; }; /** A class used to write a CPanelGroup to a 3D DXF file. * * @ingroup FileIo */ class CSailDxfWriter3d : public CSailDxfWriter { public: enum Dxf3dType { NORMAL, SPLIT, }; CSailDxfWriter3d(enum Dxf3dType format) : type(format) {}; void write(const CPanelGroup &sail, const QString &filename) const; protected: void writePanel(ofstream &out, const CPanel &panel, unsigned int layer) const; void writeNormal(const CPanelGroup &sail, const QString &filename) const; void writeSplit(const CPanelGroup &sail, const QString &filename) const; Dxf3dType type; }; #endif sailcut-1.3.5/src/saildispgl.h0000644000175000007640000000320011177775326016212 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SAILDISPGL_H #define SAILDISPGL_H #include "saildisp.h" #include /** An OpenGL display area for a sail. This is only used if Sailcut is * compiled with OpenGL support enabled. * * @see CSailDispLabel */ class CSailDispGL : public QGLWidget, public CSailDisp { public: CSailDispGL( QWidget *parent ); void redraw(); protected: void clear(); void draw( const CPanel &panel ); void draw( const CPanelGroup &sail ); void initializeGL(); void mousePressEvent ( QMouseEvent * ); void paintGL(); void resizeGL( int w, int h ); void wheelEvent( QWheelEvent *event); private: /** Has the area been resized since last redraw */ bool wasResized; /** width of last resize event */ int resizeW; /** height of last resize event */ int resizeH; }; #endif sailcut-1.3.5/src/sailtreeitem.h0000644000175000007640000000443211177775326016556 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SAILTREEITEM_H #define SAILTREEITEM_H #include "sailcpp/panelgroup.h" #include #include class QIcon; class CSailTreeItem { public: CSailTreeItem(const QList &data, CSailTreeItem *parent = 0); CSailTreeItem(const CPanelGroup& data, QString name, CSailTreeItem *parent = 0); CSailTreeItem(const CPanel& data, QString name, CSailTreeItem *parent = 0); CSailTreeItem(const CPoint3d& data, QString name, CSailTreeItem *parent = 0); CSailTreeItem(const string& data, QString name, CSailTreeItem *parent = 0); /** Constructs a CSailTreeItem representing a vector of elements. * * @param v the vector * @param name the name of the vector * @param parent the parent node */ template CSailTreeItem(const vector& v, QString name, CSailTreeItem *parent) { parentItem = parent; itemData << name; itemIcon = NULL; for (unsigned int i = 0; i < v.size(); i++) appendChild(new CSailTreeItem(v[i], QString::number(i), this)); } ~CSailTreeItem(); void appendChild(CSailTreeItem *child); CSailTreeItem *child(int row); int childCount() const; int columnCount() const; QVariant data(int column) const; QIcon icon() const; int row() const; CSailTreeItem *parent(); private: QList childItems; QList itemData; const char **itemIcon; CSailTreeItem *parentItem; }; #endif sailcut-1.3.5/src/sailtreeitem.cpp0000644000175000007640000000612711177775326017114 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "sailtreeitem.h" #include "point.xpm" #include "panel.xpm" #include "panelgroup.xpm" #include #include CSailTreeItem::CSailTreeItem(const QList &data, CSailTreeItem *parent) { parentItem = parent; itemData = data; itemIcon = NULL; } CSailTreeItem::CSailTreeItem(const CPanelGroup &data, QString name, CSailTreeItem *parent) { parentItem = parent; itemData << name; itemIcon = panelgroup_xpm; appendChild(new CSailTreeItem(data.title, "title", this)); appendChild(new CSailTreeItem((vector)(data), "panel", this)); if (data.child.size() > 0) appendChild(new CSailTreeItem(data.child, "child", this)); } CSailTreeItem::CSailTreeItem(const CPanel &data, QString name, CSailTreeItem *parent) { parentItem = parent; itemData << name; itemIcon = panel_xpm; appendChild(new CSailTreeItem(data.left, "left", this)); appendChild(new CSailTreeItem(data.right, "right", this)); appendChild(new CSailTreeItem(data.top, "top", this)); appendChild(new CSailTreeItem(data.bottom, "bottom", this)); } CSailTreeItem::CSailTreeItem(const CPoint3d &data, QString name, CSailTreeItem *parent) { parentItem = parent; itemIcon = point_xpm; itemData << name << data.x() << data.y() << data.z(); } CSailTreeItem::CSailTreeItem(const string &data, QString name, CSailTreeItem *parent) { parentItem = parent; itemIcon = NULL; itemData << name << QString::fromStdString(data); } CSailTreeItem::~CSailTreeItem() { qDeleteAll(childItems); } void CSailTreeItem::appendChild(CSailTreeItem *item) { childItems.append(item); } CSailTreeItem *CSailTreeItem::child(int row) { return childItems.value(row); } int CSailTreeItem::childCount() const { return childItems.count(); } int CSailTreeItem::columnCount() const { return itemData.count(); } QVariant CSailTreeItem::data(int column) const { return itemData.value(column); } QIcon CSailTreeItem::icon() const { if (itemIcon != NULL) return QIcon(QPixmap(itemIcon)); else return QIcon(); } CSailTreeItem *CSailTreeItem::parent() { return parentItem; } int CSailTreeItem::row() const { if (parentItem) return parentItem->childItems.indexOf(const_cast(this)); return 0; } sailcut-1.3.5/src/sailcutqt.h0000644000175000007640000000312211177775326016073 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SAILCUTQT_H #define SAILCUTQT_H #include #include "prefs.h" #if QT_VERSION >= 0x040300 #define HAVE_QSVGGENERATOR #else #undef HAVE_QSVGGENERATOR #endif class QTranslator; class QUrl; /** * Class representing a Sailcut application. */ class CSailApp : public QApplication { public: CSailApp(int &argc, char** argv); static QUrl findHandbook(const QString locale); void loadTranslation(const QString locale); void readPrefs(); void writePrefs(); /** the user's preferences */ CPrefs prefs; protected: /** the file in which the preferences are stored */ QString prefsfile; /** translator for Qt's messages */ QTranslator *transQt; /** transator for Sailcut's messages */ QTranslator *transApp; }; #endif sailcut-1.3.5/src/sailwriter-txt.cpp0000644000175000007640000000252011177775326017420 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "sailwriter-txt.h" #include #include /** Write sail to TXT format. * * @param sail the panel group to write * @param filename the file to write to */ void CSailTxtWriter::write(const CPanelGroup &sail, const QString &filename) const { ofstream myOut; myOut.open(QFile::encodeName(filename), ios::out); if (!myOut.is_open()) throw write_error("CSailTxtWriter::write : unable to write to specified file"); myOut << sail.title << endl; myOut << sail; myOut.close(); } sailcut-1.3.5/src/sailwriter-svg.cpp0000644000175000007640000000262311177775326017404 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ // for HAVE_QSVGGENERATOR #include "sailcutqt.h" #include "sailwriter-svg.h" #include "sailprinter.h" #ifdef HAVE_QSVGGENERATOR #include #endif /** * Write a 3D sail to 2D SVG format. * * @param sail the sail to write * @param filename the file to write to */ void CSailSvgWriter::write(const CPanelGroup &sail, const QString &filename) const { #ifdef HAVE_QSVGGENERATOR // SVG generator QSvgGenerator generator; generator.setFileName(filename); CTextPainter painter(&generator); CSailDrawingPrinter(sail, false).print(&painter, 0, 1.0, 10); #endif } sailcut-1.3.5/src/ts/0000755000175000007640000000000011457411327014326 5ustar sharkyjerrywebsailcut-1.3.5/src/ts/sailcut_de.ts0000644000175000007640000024623711215262321017016 0ustar sharkyjerryweb CBoatElementWidget Sail information Information des Segels file Datei name Bezeichnung Reload neu laden Remove Entfernen Update Aktualisieren Element information Elementeinformationen CFileIO Open У–ffnen Save Speichern CFileWriter error Fehler There was an error writing to the selected file. Beim Schreiben in die gewУЄhlte Datei ist ein Fehler aufgetreten. Open У–ffnen There was an error reading from the selected file. Beim Lesen aus der gewУЄhlten Datei ist ein Fehler aufgetreten. Save Speichern CFormBoat boat Boot &Add &beitragen file Datei Open У–ffnen CFormHull hull Rumpf &Dimensions &Abmessungen CFormHullDefBase Dialog Dialog Deck and bottom Deck und Rumpf Planking Beplankung Automatic planking Automatische Beplankung lower plank angle Unterer Plankenwinkel top plank angle Oberer Plankenwinkel Number of planks Anzahl der Planken Bottom Boden Bottom sweep angle Unterer Anstellwinkel % % Max Width Max. Breite Forward shape Bug-Form Length LУЄnge Forward height Bug-HУЖhe Max Width position Position max. Breite Stem angle Vorsteven-Winkel Transom angle Heckspiegel-Winkel Aft height Heck-HУЖhe Aft width Heck-Breite Aft shape Heckform Hull name Rumpfname Deck Deck Forward height Bug-HУЖhe Plank 5 Planke 5 Chine angle Unterer Rumpf-Winkel?? Sweep angle Kiel-Winkel Plank angle Plankenwinkel Plank 4 Planke 4 Plank 3 Planke 3 Plank 2 Planke 2 Plank 1 Planke 1 Plank 6 Planke 6 Check PrУМfen OK OK Cancel Abbruch Dimensions are in millimeters and angles in degrees measured from horizontal Alle Massangaben sind in Millimeter und Grad zur Horizontalen Planks Planken txt_BBW txt_BfwdHeight txt_BLWL txt_BaftW txt_BaftHeight Dead rise angle txt_HullID txt_DaftHeight txt_DfwdHeight Side angle Seitenwinkel CFormMain to &DXF &DXF to &TXT sail &TXT Segel to &XML sail &XML Segel &New &Neu &Open У–&ffnen &Save &Speichern Save &As Speichern &unter &Quit Be&enden &Dimensions &Abmessungen &Mould &Form &Patches &VerstУЄrkungen &Rig &Rigg &File &Datei &View &Ansicht &Help &Hilfe About Sailcut CAD Уœber Sailcut CAD error Fehler There was an error writing to the selected file Beim Schreiben in die gewУЄhlte Datei ist ein Fehler aufgetreten About &Qt Уœber &Qt About &Sailcut CAD Уœber &Sailcut CAD Language Sprache Open &recent Zuletzt geУЖffnete P&rojekte E&xport 3D sail E&xport 3D-Segel to &Carlson plotter &Carlson Plotter Sailcut CAD &Handbook Sailcut CAD &Handbuch shaded view schattierte Ansicht wireframe view Ansicht als Drahtmodell development Entwicklung created new sail neu erstelltes Segel loaded '%1' geladen '%1' error loading '%1' Fehler beim Laden von '%1' wrote '%1' gespeichert '%1' There was a data printing error Beim Schreiben in die gewУЄhlte Datei ist ein Fehler aufgetreten There was a development printing error Fehler beim Drucken der Entwicklungsansicht There was a drawing printing error Fehler beim drucken der Zeichnung data Daten drawing Zeichnung &Print Dr&ucken Sail type Segeltyp Mainsail GroУŸsegel Jib Fock Sail layout Segelschnitt Cross Cut Kreuzschnitt Horizontal Cut Horizontalschnitt Radial Cut Radialschnitt Twist Foot Cut Twist-Foot Schnitt Vertical Cut Vertikalschnitt Mitre Cut Gehrungsschnitt sections, Segmente, Rig Rigg Boat LOA BootslУЄnge LУМA Fore triangle hoist I HУЖhe I des Vorsegeldreiecks Fore triangle base J Basis J des Vorsegeldreiecks Tack position X Segelhalsposition X Tack height Y SegelhalshУЖhe Y Sail dimensions Segelabmessungen Luff length LУЄnge des Vorlieks Gaff angle wrt luff Gaffelwinkel relativ zum Vorliek Gaff length LУЄnge der Gaffel Foot length LУЄnge des Unterlieks Leech length LУЄnge des Achterlieks Luff round Vorliek-Bogen Gaff round Gaffel-Bogen Leech round Achterliek-Bogen Foot round Unterliek-Bogen Luff round position Position des Vorliekbogens Gaff round position Position des Gaffelbogens Leech round position Position des Achterliekbogens Foot round position Position des Unterliekbogens Sail settings Eigenschaften des Segels Twist angle Verwindungswinkel Sheeting angle Winkel der Segelbahn Cloth seams and hems BahnennУЄhte und SУЄume Cloth width Bahnbreite Seams width Nahtbreite Leech hem width Breite des Achterlieksaumes Other hem width andere Saumbreiten Sail mould Segelform Luff factor Vorliegsfaktor Depth Tiefe Leech factor Achterlieksfaktor Top profile Oberes Profil Mid profile at h = Mittleres Profil bei HУЖhe h = Bottom profile Unteres Profil Mast/Luff rake Neigung der Mastspur head gores, Radialkeile im Kopfabschnitt Wing TragflУЄche luff gores. Radialkeile beginnend am Kopf und endend am Segelhals. deg ТА Export &development Export &Entwicklung to &Hand-plotting format ins &Hand-Plotterformat sail Segel hull Rumpf rig Rigg boat Boot &Window &Fenster &Close Be&enden Close &All Beenden &alles &Tile &Fliesen &Cascade &Kaskade unknown document type '%1' Fehler document type %1 Open У–ffnen CFormMould &Cancel &Abbrechen Vertical repartition Senkrechte Teilung Sail mould Segelform &Help &Hilfe &OK &OK Top profile Oberes Profil Middle profile Mittleres Profil Bottom profile Unteres Profil CFormPanelGroup panels Tafeln CFormPrint &Print Dr&ucken &Cancel &Abbrechen Scale Skala CFormRig Rig Rigg &New &Neu sail &definition &Definition des Segels 3D &sail 3D &Segel &Add sail neues Segel &hinzufУМgen &Open У–&ffnen Open &recent zuletzt geУЖffnete P&rojekte &Save &Speichern Save &As Speichern &unter &Close Be&enden &File &Datei error Fehler There was an error writing to the selected file Beim Schreiben in die gewУЄhlte Datei ist ein Fehler aufgetreten rig Rigg &Dimensions &Abmessungen CFormRigDefBase Rig dimensions Riggabmessungen Cancel Abbruch OK OK Spreaders Salinge = SPNB = SPNB Number of spreaders Anzahl der Sahlinge Spreader height Saling-HУЖhe txt_SPH2 txt_SPH1 txt_SPH3 SPH2 SPH3 SPH1 Spreader length Saling-LУЄnge SPW3 txt_SPW3 SPW1 txt_SPW1 SPW2 txt_SPW2 Shrouds Wanten Cap shroud base width Basisweite der Oberwanten = CSH = CSH Lower shroud base width Basisweite der Unterwanten txt_LSB txt_CSH = CSB = CSB Cap shroud height Oberwanten-HУЖhe txt_CSB = LSB = LSB Fore triangle Vorsegel-Dreieck txt_foreI = I = I txt_foreJ = J = J Fore triangle base Basis des Vorsegeldreiecks Fore triangle hoist HУЖhe des Vorsegeldreiecks Mast Mast Mast width Mastbreite = MW = MW txt_MW txt_MC = MC = MC Mast cord Mastschnur lbl_MRkD = MRkD = MRkD Mast rake angle Mastfallwinkel txt_MH txt_MRnd Mast rake Mastfall = MRkM = MRkM txt_MRkM Mast height MasthУЖhe = MH = MH = MRnd = MRnd Mast round Mast-Bogen = MRndPos = MRndPos Mast round position Position des mastbogens Mainsail GroУŸsegel lbl_MS_LuffRP @ @ lbl_MS_LuffR lbl_MS_TackY Y = Y = lbl_MS_TackX X = X = Tack Segelhals lbl_MS_LuffL = MSL = MSL Luff length LУЄnge des Vorlieks Luff round Vorliek-Bogen lbl_MS_Rake = MSR = MSR Luff rake Neigung der Vorliek Tack height SegelhalshУЖhe txt_BAD = BAD = BAD Head height HУЖhe des Segelkopfes = HAD = HAD txt_HAD Check PrУМfen All dimensions are in millimeter and angles in degrees Alle Massangaben sind in Millimeter und Grad Description of rig Beschreibung des Riggs Rig name Name des Riggs CFormSail sail Segel &Print Dr&ucken data Daten drawing Zeichnung development Entwicklung E&xport 3D sail E&xport 3D-Segel to &DXF &DXF to &TXT sail &TXT Segel to &XML sail &XML Segel Export &development Export &Entwicklung to &Carlson plotter &Carlson Plotter to &Hand-plotting format ins &Hand-Plotterformat &Dimensions &Abmessungen &Mould &Form &Patches &VerstУЄrkungen error Fehler There was a data printing error Beim Schreiben in die gewУЄhlte Datei ist ein Fehler aufgetreten There was a development printing error Fehler beim Drucken der Entwicklungsansicht There was a drawing printing error Fehler beim drucken der Zeichnung to &SVG &SVG to DXF (split) DXF (geteilt) CFormSailDef Sail corners coordinates Eckpunktkoordinaten des Segels tack Segelhals clew Schothorn head Kopf peak Nock IRC width measurements IRC - Breite Sail width measurements Segel breite CFormSailDefBase Sail definition Definition des Segels Sail dimensions Segelabmessungen mm mm Round position Position des Bogens Luff length LУЄnge des Vorlieks Foot length LУЄnge des Unterlieks Leech length LУЄnge des Achterlieks Gaff length LУЄnge der Gaffel Leech round Achterliek-Bogen Gaff round Gaffel-Bogen Luff round Vorliek-Bogen Foot round Unterliek-Bogen % % deg ТА Gaff angle from luff Gaffelwinkel relativ zum Vorliek Rig geometry Geometrie der Takelage Fore triangle base J Basis J des Vorsegeldreiecks Tack height SegelhalshУЖhe Distance tack to stem Abstand zwischen Segelhals und Vorsteven Main sail GroУŸsegel Jib Fock Fore triangle hoist I HУЖhe I des Vorsegeldreiecks Boat length LOA BootslУЄnge LУМA Mast / Luff rake Neigung der Mastspur Cloth Material Seam width Nahtbreite Cloth width Bahnbreite Layout Schnitt Mitre cut Gehrungsschnitt Cross cut Kreuzschnitt Twist foot Twist-Foot Schnitt Horizontal cut Horizontalschnitt Number of sections Anzahl der Segmente Number of radial gores Anzahl der Radialkeile Radial cut Radialschnitt Vertical cut Vertikalschnitt Sail shape Segelform Top depth Obere Segeltiefe Mid depth Mittlere Segeltiefe Foot depth Untere Segeltiefe Twist angle Verwindungswinkel OK OK Cancel Abbruch Leech hem Achterlieksaum Other hems Andere SУЄume Sheeting angle Winkel der Segelbahn mТВ mТВ Sail area SegelflУЄche Diagonal Diagonale Compute Berechnen Sail ID Segel ID Number of luff gores Anzahl der Radialkeile beginnend am Kopf und endend am Segelhals Dihedral angle У–ffnungswinkel Wing TragflУЄche Sail identifier Segelnummer m2 m2 Sail name Name von Segel Luff rake Neigung der Vorliek Mitre cut 2 Gehrungsschnitt 2 Foot hem Unterlieksaum CRigSailWidget Sail information Information des Segels file Datei name Bezeichnung Reload neu laden Remove Entfernen Update Aktualisieren error Fehler There was an error reading from the selected file. Beim Lesen aus der gewУЄhlten Datei ist ein Fehler aufgetreten. CSailDataPrinter Sailcut CAD data sheet Sailcut CAD Datenblatt Mainsail GroУŸsegel Jib Fock Wing TragflУЄche deg ТА Sail type Segeltyp Cross Cut Kreuzschnitt Horizontal Cut Horizontalschnitt Radial Cut Radialschnitt sections Segmente head gores Radialkeile im Kopfabschnitt luff gores Radialkeile beginnend am Kopf und endend am Segelhals Twist Foot Cut Twist-Foot Schnitt Vertical Cut Vertikalschnitt Mitre Cut Gehrungsschnitt Mitre Cut 2 Gehrungsschnitt 2 Sail layout Segelschnitt Rig Rigg Boat LOA BootslУЄnge LУМA Mast/Luff rake Neigung der Mastspur Tack position X Segelhalsposition X Tack height Y SegelhalshУЖhe Y Fore triangle hoist I HУЖhe I des Vorsegeldreiecks Fore triangle base J Basis J des Vorsegeldreiecks Sail dimensions Segelabmessungen Luff length LУЄnge des Vorlieks Foot length LУЄnge des Unterlieks Leech length LУЄnge des Achterlieks Gaff length LУЄnge der Gaffel Gaff angle wrt luff Gaffelwinkel relativ zum Vorliek Shape of edges Gestalt von RУЄndern Luff round Vorliek-Bogen Luff round position Position des Vorliekbogens Foot round Unterliek-Bogen Foot round position Position des Unterliekbogens Leech round Achterliek-Bogen Leech round position Position des Achterliekbogens Gaff round Gaffel-Bogen Gaff round position Position des Gaffelbogens Sail settings Eigenschaften des Segels Twist angle Verwindungswinkel Sheeting angle Winkel der Segelbahn Cloth seams and hems BahnennУЄhte und SУЄume Cloth width Bahnbreite Seams width Nahtbreite Leech hem width Breite des Achterlieksaumes Foot hem width Breite des Unterlieksaumes Other hems width andere Saumbreiten Sail mould Segelform Luff factor Vorliegsfaktor Depth Tiefe Leech factor Achterlieksfaktor Top profile Oberes Profil Mid profile at h = Mittleres Profil bei HУЖhe h = Bottom profile Unteres Profil Luff rake Neigung der Vorliek CSailDevelPrinter Scale Skala CSailDispGL This system has no OpenGL support. Dieses System hat keine OpenGL UnterstУМtzung. CSailDrawingPrinter Scale Skala CSailPrinter Sailcut CAD data sheet Sailcut CAD Datenblatt Mainsail GroУŸsegel Jib Fock Wing TragflУЄche deg ТА Sail type Segeltyp Cross Cut Kreuzschnitt Horizontal Cut Horizontalschnitt Radial Cut Radialschnitt sections Segmente head gores Radialkeile im Kopfabschnitt luff gores Radialkeile beginnend am Kopf und endend am Segelhals Twist Foot Cut Twist-Foot Schnitt Vertical Cut Vertikalschnitt Mitre Cut Gehrungsschnitt Sail layout Segelschnitt Rig Rigg Boat LOA BootslУЄnge LУМA Mast/Luff rake Neigung der Mastspur Tack position X Segelhalsposition X Tack height Y SegelhalshУЖhe Y Fore triangle hoist I HУЖhe I des Vorsegeldreiecks Fore triangle base J Basis J des Vorsegeldreiecks Sail dimensions Segelabmessungen Luff length LУЄnge des Vorlieks Foot length LУЄnge des Unterlieks Leech length LУЄnge des Achterlieks Gaff length LУЄnge der Gaffel Gaff angle wrt luff Gaffelwinkel relativ zum Vorliek Shape of edges Gestalt von RУЄndern Luff round Vorliek-Bogen Luff round position Position des Vorliekbogens Foot round Unterliek-Bogen Foot round position Position des Unterliekbogens Leech round Achterliek-Bogen Leech round position Position des Achterliekbogens Gaff round Gaffel-Bogen Gaff round position Position des Gaffelbogens Sail settings Eigenschaften des Segels Twist angle Verwindungswinkel Sheeting angle Winkel der Segelbahn Cloth seams and hems BahnennУЄhte und SУЄume Cloth width Bahnbreite Seams width Nahtbreite Leech hem width Breite des Achterlieksaumes Other hem width andere Saumbreiten Sail mould Segelform Luff factor Vorliegsfaktor Depth Tiefe Leech factor Achterlieksfaktor Top profile Oberes Profil Mid profile at h = Mittleres Profil bei HУЖhe h = Bottom profile Unteres Profil CSailViewerPanel Display parameters Anzeigeparameter elevation vertikal azimuth horizontal Controls Darstellung Reset view Ansicht zurУМcksetzen Labeling Segelzeichen Zoom in Einzoomen Zoom out Auszoomen deg ТА CSailViewerTabs shaded view schattierte Ansicht wireframe view Ansicht als Drahtmodell CWidgetProfile % % Luff shape Vorliekform Depth Tiefe Leech shape Achterliekform degrees ТА cord Schnur Dialog Dialog Dialog XmlReaderTempl error Fehler There was an error reading from the selected file. Beim Lesen aus der gewУЄhlten Datei ist ein Fehler aufgetreten. sailcut-1.3.5/src/ts/sailcut_dk.ts0000644000175000007640000026430511200372143017016 0ustar sharkyjerryweb CBoatElementWidget Sail information Sejl information file fil name navn Reload GenindlУІs Remove Fjern Update Opdater Element information CFileIO Open У…ben Save Gem CFileWriter error Fejl There was an error writing to the selected file. Det var ikke muligt at skrive til den УИnskede fil. Open У…ben There was an error reading from the selected file. Det var ikke muligt at lУІse den УИnskede fil. Save Gem CFormBoat boat bУЅden &Add &TilfУИj file fil Open У…ben CFormHull hull &Dimensions &Dimensionering CFormHullDefBase Dialog Deck and bottom Planking Automatic planking lower plank angle top plank angle Number of planks Bottom Bottom sweep angle % % Max Width Forward shape Length Forward height Max Width position Stem angle Transom angle Aft height Aft width Aft shape Hull name Deck Forward height Plank 5 Chine angle Sweep angle Plank angle Plank 4 Plank 3 Plank 2 Plank 1 Plank 6 Check OK OK Cancel Annuller Dimensions are in millimeters and angles in degrees measured from horizontal Planks txt_BBW txt_BfwdHeight txt_BLWL txt_BaftW txt_BaftHeight Dead rise angle txt_HullID txt_DaftHeight txt_DfwdHeight Side angle CFormMain &New &Ny &Open &У…ben Open &recent У…ben &seneste data data drawing tegning develop design &Print &Udskriv &Save &Gem Save &As Gem &Som to &DXF til &DXF format to &TXT sail til &TXT format to &XML sail til &XML format E&xport 3D sail E&ksporter 3D sejl to &Carlson plotter til C&arlson plotter Export &development Eksporter &design sУІt &Quit &Afslut &Dimensions &Dimensionering &Mould &Form &Patches &HjУИrnelapper &Rig &Rig Language Sprog Sailcut CAD &Handbook Sailcut CAD &HУЅndbog About &Qt Om &Qt About &Sailcut CAD Om &Sailcut CAD &File &Fil &View &VУІlg &Help &HjУІlp shaded view 3D visning wireframe view TrУЅdramme visning development Design sУІt loaded '%1' У…bnet '%1' created new sail udviklet nyt sejl About Sailcut CAD Om Sailcut CAD error loading '%1' Fejl i УЅbning '%1' Sail type Sejl type Mainsail Storsejl Jib Fok Sail layout Sejl layout Cross Cut Cross Cut Horizontal Cut Horisontal Cut Radial Cut Radial Cut Twist Foot Cut Twistet Foot Cut Vertical Cut Vertikal Cut Mitre Cut Mitre Cut sections, sektioner head gores, hoved kiler luff gore. forli kiler. Rig Rig Boat LOA BУЅdens LOA Fore triangle hoist I Forstags lУІngde I mУЅl Fore triangle base J Afstand fra forstУІvn til mast, J mУЅl Tack position X Halsbarm position X Tack height Y Halsbarm hУИjde Y Sail dimensions Sejl dimensioner Luff length Forli lУІngde Mast/Luff rake Maste/Forli hУІldning Gaff angle wrt luff Gaffel vinkel fra forli Gaff length Gaffel lУІngde Foot length Sejlfod lУІngde Leech length Bagli lУІngde Shape of edges Kanternes form Luff round Forli runding Gaff round Gaffel runding Leech round Bagli runding Foot round Sejlfod runding Luff round position Forli rundings position Gaff round position Position af Gaffel runding Leech round position Bagli rundings position Foot round position Sejlfods rundings position Sail settings Sejl egenskaber Twist angle Tvist vinkel Sheeting angle Lag vinkel Cloth seams and hems SУИmme og kantninger Cloth width Tekstil bredde Seams width SУИmbredde Leech hem width Bredde pУЅ bagli sУИm Other hem width Andre sУИm bredde Sail mould Sejl form Luff factor Forli faktor Depth Dybde Leech factor Bagli faktor Top profile Әverste profil Mid profile at h = Midter profil ved h = Bottom profile Nederste profil error fejl There was a data printing error Der var fejl ved udskrivning af data There was a development printing error Der var fejl ved udskrivning af design sУІt There was a drawing printing error Der var fejl ved udskrivning af tegning wrote '%1' skrevet '%1' There was an error writing to the selected file Det var ikke muligt at skrive til den valgte fil Wing Vinge luff gores. forli kiler. deg grd to &Hand-plotting format &HУЅndplotting format sail Sejl hull rig boat bУЅden &Window &Close &Luk Close &All &Tile &Cascade unknown document type '%1' Open У…ben CFormMould Top profile Әverste profil Middle profile Mellemste profil Bottom profile Nederste profil Sail mould Sejl form &Help &HjУІlp &OK &OK &Cancel &Annuller Vertical repartition Vertikal omopdeling CFormPanelGroup panels CFormPrint &Print &Udskriv &Cancel &Annuller Scale CFormRig Rig Rig &New &Ny sail &definition sejl &defination 3D &sail 3D &sejl &Add sail &TilfУИj sejl &Open &У…bne Open &recent У…bne &seneste &Save &Gem Save &As Gem &Som &Close &Luk &File &Fil error Fejl There was an error writing to the selected file Det var ikke muligt at skrive til den УИnskede fil rig Rig &Dimensions &Dimensionering CFormRigDefBase Rig dimensions Rig dimensioner Cancel Annuller OK OK Spreaders = SPNB Number of spreaders Spreader height txt_SPH2 txt_SPH1 txt_SPH3 SPH2 SPH3 SPH1 Spreader length SPW3 txt_SPW3 SPW1 txt_SPW1 SPW2 txt_SPW2 Shrouds Cap shroud base width = CSH Lower shroud base width txt_LSB txt_CSH = CSB Cap shroud height txt_CSB = LSB Fore triangle txt_foreI = I txt_foreJ = J Fore triangle base Fore triangle hoist Mast Mast width = MW txt_MW txt_MC = MC Mast cord lbl_MRkD = MRkD Mast rake angle txt_MH txt_MRnd Mast rake = MRkM txt_MRkM Mast height = MH = MRnd Mast round = MRndPos Mast round position Mainsail Storsejl lbl_MS_LuffRP @ lbl_MS_LuffR lbl_MS_TackY Y = lbl_MS_TackX X = Tack lbl_MS_LuffL = MSL Luff length Luff round Forli runding lbl_MS_Rake = MSR Luff rake Forli hУІldning Tack height txt_BAD = BAD Head height = HAD txt_HAD Check All dimensions are in millimeter and angles in degrees Description of rig Rig name CFormSail sail Sejl &Print &Udskriv data data drawing tegning development Design sУІt E&xport 3D sail E&ksporter 3D sejl to &DXF til &DXF format to &TXT sail til &TXT format to &XML sail til &XML format Export &development Eksporter &design sУІt to &Carlson plotter til C&arlson plotter to &Hand-plotting format &HУЅndplotting format &Dimensions &Dimensionering &Mould &Form &Patches &HjУИrnelapper error Fejl There was a data printing error Der var fejl ved udskrivning af data There was a development printing error Der var fejl ved udskrivning af design sУІt There was a drawing printing error Der var fejl ved udskrivning af tegning to &SVG &SVG to DXF (split) CFormSailDef Sail corners coordinates SejllhjУИrne koordinator tack halsbarm clew klampe head hoved peak top IRC width measurements IRC med mУЅlinger Sail width measurements Sejl med mУЅlinger CFormSailDefBase Sail definition Sejl defination Sail shape Sejl form % % Top depth Top dybde Mid depth Mellem dybde Foot depth Sejlfod dybde Twist angle Tvist vinkel Sheeting angle Lag vinkel deg grd Sail dimensions Sejl dimension mm mm Round position Rundings position Luff length Forli lУІngde Foot length Sejlfod lУІngde Leech length Bagli lУІngde Gaff length Gaffel lУІngde Leech round Bagli runding Luff round Forli runding Foot round Fodrunding Gaff round Gaffel runding Gaff angle from luff Gaffel vinkel fra forli Diagonal Diagonal Sail area Sejl areal mТВ mТВ Compute Beregn OK OK Cancel Annuller Layout Layout Mitre cut Mitre cut Cross cut Cross cut Twist foot Vridning ved fod Horizontal cut Horisontal cut Vertical cut Vertikal cut Number of luff gores Antal af forli kiler Number of radial gores Antal af radiale kiler Number of sections Antal af sektioner Radial cut Radial Cut Cloth Tekstil Cloth width Tekstil bredde Leech hem Bagli kantning Other hems Andre kantning Seam width SУИm bredde Rig geometry Rig geometri Fore triangle hoist I Forstags lУІngde L mУЅl Mast / Luff rake Mast/forli hУІldning Fore triangle base J Afstand fra forstУІvn til mast, J mУЅl Distance tack to stem Afstand fra halsbarm til for stУІvn Tack height Halsbarm hУИjde Boat length LOA BУЅdlУІngde LOA Sail ID Sejl ID Main sail Storsejl Jib Fok Dihedral angle Toplansvinkel Wing Vinge Sail identifier Sejl identifikation m2 m2 Sail name Luff rake Forli hУІldning Mitre cut 2 Mitre cut 2 Foot hem Sejlfod kantning CRigSailWidget Sail information Sejl information file fil name navn Reload GenindlУІs Remove Fjern Update Opdater error fejl There was an error reading from the selected file. Det var ikke muligt at lУІse den УИnskede fil. CSailDataPrinter Sailcut CAD data sheet Sailcut CAD data side Mainsail Storsejl Jib Fok Wing Vinge deg grd Sail type Sejl type Cross Cut Cross Cut Horizontal Cut Horisontal Cut Radial Cut Radial Cut sections sektioner head gores hoved kiler luff gores forli kiler Twist Foot Cut Twistet Foot Cut Vertical Cut Vertikal Cut Mitre Cut Mitre Cut Mitre Cut 2 Mitre cut 2 Sail layout Sejl layout Rig Rig Boat LOA BУЅdens LOA Mast/Luff rake Maste/Forli hУІldning Tack position X Halsbarm position X Tack height Y Halsbarm hУИjde Y Fore triangle hoist I Forstags lУІngde I mУЅl Fore triangle base J Afstand fra forstУІvn til mast, J mУЅl Sail dimensions Luff length Forli lУІngde Foot length Sejlfod lУІngde Leech length Bagli lУІngde Gaff length Gaffel lУІngde Gaff angle wrt luff Gaffel vinkel fra forli Shape of edges Kanternes form Luff round Forli runding Luff round position Forli rundings position Foot round Sejlfod runding Foot round position Sejlfods rundings position Leech round Bagli runding Leech round position Bagli rundings position Gaff round Gaffel runding Gaff round position Position af Gaffel runding Sail settings Sejl egenskaber Twist angle Tvist vinkel Sheeting angle Lag vinkel Cloth seams and hems SУИmme og kantninger Cloth width Tekstil bredde Seams width SУИmbredde Leech hem width Bredde pУЅ bagli sУИm Foot hem width Other hems width Andre sУИm bredde Sail mould Sejl form Luff factor Forli faktor Depth Dybde Leech factor Bagli faktor Top profile Әverste profil Mid profile at h = Midter profil ved h = Bottom profile Nederste profil Luff rake Forli hУІldning CSailDevelPrinter Scale CSailDispGL This system has no OpenGL support. Dette system understУИtter ikke OpenGL. CSailDrawingPrinter Scale CSailPrinter Sailcut CAD data sheet Sailcut CAD data side Mainsail Storsejl Jib Fok Wing Vinge deg grd Sail type Sejl type Cross Cut Cross Cut Horizontal Cut Horisontal Cut Radial Cut Radial Cut sections sektioner head gores hoved kiler luff gores forli kiler Twist Foot Cut Twistet Foot Cut Vertical Cut Vertikal Cut Mitre Cut Mitre Cut Sail layout Sejl layout Rig Rig Boat LOA BУЅdens LOA Mast/Luff rake Maste/Forli hУІldning Tack position X Halsbarm position X Tack height Y Halsbarm hУИjde Y Fore triangle hoist I Forstags lУІngde I mУЅl Fore triangle base J Afstand fra forstУІvn til mast, J mУЅl Sail dimensions Sejl dimension Luff length Forli lУІngde Foot length Sejlfod lУІngde Leech length Bagli lУІngde Gaff length Gaffel lУІngde Gaff angle wrt luff Gaffel vinkel fra forli Shape of edges Kanternes form Luff round Forli runding Luff round position Forli rundings position Foot round Fodrunding Foot round position Sejlfods rundings position Leech round Bagli runding Leech round position Bagli rundings position Gaff round Gaffel runding Gaff round position Position af Gaffel runding Sail settings Sejl egenskaber Twist angle Tvist vinkel Sheeting angle Lag vinkel Cloth seams and hems SУИmme og kantninger Cloth width Tekstil bredde Seams width SУИmbredde Leech hem width Bredde pУЅ bagli sУИm Other hem width Andre sУИm bredde Sail mould Sejl form Luff factor Forli faktor Depth Dybde Leech factor Bagli faktor Top profile Әverste profil Mid profile at h = Midter profil ved h = Bottom profile Nederste profil CSailViewerPanel Display parameters Vis parameter elevation hУИjde azimuth azimut Controls Kontroller Reset view Nulstil visning Labeling Bane nummerering Zoom in ForstУИr Zoom out Formindsk deg grd CSailViewerTabs shaded view 3D visning wireframe view TrУЅdramme visning CWidgetProfile Luff shape Forli form Depth Dybde % % Leech shape Bagli form degrees grader cord Dialog XmlReaderTempl error fejl There was an error reading from the selected file. Det var ikke muligt at lУІse den УИnskede fil. sailcut-1.3.5/src/ts/sailcut_it.ts0000644000175000007640000024664011200372143017036 0ustar sharkyjerryweb CBoatElementWidget Sail information Informazioni vela file file name nome Reload Ricarica Remove Cancella Update Aggiorna Element information Informazioni elemento CFileIO Open Aprire Save Salvare CFileWriter error errore There was an error writing to the selected file. Errore di scrittura sul file selezionato. Open Aprire There was an error reading from the selected file. Errore di lettura dal file selezionato. Save Salvare CFormBoat boat barca &Add &Aggiungi file file Open Aprire CFormHull hull buccia &Dimensions &Dimensioni CFormHullDefBase Dialog Dialogo Deck and bottom Ponte e fondo Planking Automatic planking lower plank angle top plank angle Number of planks Bottom Fondo Bottom sweep angle % % Max Width Forward shape Length Lunghezza Forward height Max Width position Stem angle Transom angle Aft height Aft width Aft shape Hull name Nome della buccia Deck Ponte Forward height Plank 5 Chine angle Sweep angle Plank angle Plank 4 Plank 3 Plank 2 Plank 1 Plank 6 Check Controllo OK OK Cancel Cancellare Dimensions are in millimeters and angles in degrees measured from horizontal Planks txt_BBW txt_BfwdHeight txt_BLWL txt_BaftW txt_BaftHeight Dead rise angle txt_HullID txt_DaftHeight txt_DfwdHeight Side angle CFormMain to &DXF &DXF to &TXT sail vela &TXT to &XML sail vela &XML &New &Nuovo &Open &Aprire &Save &Salvare Save &As Salvare &sotto &Quit &Uscire &Dimensions &Dimensioni &Mould &Profilo &Patches &Rinforzi &Rig &Attrezzatura &File &File &View &Vista &Help &Aiuto About Sailcut CAD A proposito di Sailcut CAD error errore There was an error writing to the selected file Errore di scrittura sul file selezionato About &Qt A proposito di &Qt About &Sailcut CAD A proposito di &Sailcut CAD Language Lingua Open &recent Apri &recente Export &3D sail Esporta &vela 3D to &Carlson plotter al plotter &Carlson Export &development Esporta &svilupppo Sailcut CAD &Handbook Manuale &Sailcut CAD shaded view vista in chiaroscuro wireframe view vista spigoli development sviluppo created new sail nuova vela creata loaded '%1' caricata '%1' error loading '%1' errore caricamento '%1' wrote '%1' ha scritto '%1' There was a data printing error Errore di stampa dati There was a development printing error Errore di stampa sviluppo There was a drawing printing error Errore di stampa disegno data dati drawing disegno develop sviluppa &Print &Stampa Sail type Tipo vela Main sail Randa Jib Fiocco Sail layout Taglio vela Cross Cut Taglio cross-cut Horizontal Cut Taglio orizzontale Radial Cut Taglio radiale Twist Foot Cut Taglio twist foot Vertical Cut Taglio verticale Mitre Cut Taglio a spina di pesce sections, sezioni, head gores. altezza pannelli. Rig Attrezzatura Boat LOA Lunghezza della barca Fore triangle hoist I Altezza I del triangolo di prua Fore triangle base J Base J del triangolo di prua Tack position X Posizione X del punto di mura Tack height Y Altezza Y del punto di mura Sail dimensions Dimensioni della vela Luff length Lunghezza del ghindante Gaff angle wrt luff Angolo tra picco e ghindante Gaff length Lunghezza del picco Foot length Lunghezza della base Leech length Lunghezza della balumina Shape of edges Forma dei bordi Luff round Allunamento del ghindante Gaff round Allunamento del picco Leech round Allunamento della balumina Foot round Allunamento della base Luff round position Posizione allunamento ghindante Gaff round position Posizione allunamento picco Leech round position Posizione allunamento balumina Foot round position Posizione allunamento base Sail settings Regolazioni vela Twist angle Angolo di svergolamento Sheeting angle Angolo caduta vela Cloth seams and hems Vivagni e vaine tessuto vela Cloth width Larghezza del tessuto vela Seams width Larghezza vivagni Leech hem width Larghezza vaina balumina Other hems width Larghezza altre vaine Sail mould Profilo della vela Luff factor Fattore ghindante Depth Profondita' Leech factor Fattore balumina Top profile Profilo superiore Mid profile at h = Profilo mediano ad "h" Bottom profile Profilo inferiore Mast/Luff rake Inclinazione albero/ghindante E&xport 3D sail Esporta &vela 3D Mainsail Randa deg deg sail vela hull buccia rig attrezzatura boat barca &Window &Finestra &Close &Chiudere Close &All Chiudere &Tutto &Tile &Piastrella &Cascade &Cascata unknown document type '%1' tipo di documento '%1' sconosciuto Open Aprire CFormMould &Cancel &Cancellare Vertical repartition Ripartizione verticale Sail mould Profilo della vela &Help &Aiuto &OK &OK Top profile Profilo superiore Middle profile Profilo mediano Bottom profile Profilo inferiore CFormPanelGroup panels pannelli CFormPrint &Print &Stampa &Cancel &Cancellare Scale Scala CFormRig Rig Attrezzatura &New &Nuovo sail &definition definizione &vela 3D &sail vela &3D &Add sail Aggiungi vela &Open &Aprire Open &recent Apri &recente &Save &Salvare Save &As Salvare &sotto &Close &Chiudere &File &File error errore There was an error writing to the selected file Errore di scrittura sul file selezionato rig attrezzatura &Dimensions &Dimensioni CFormRigDefBase Rig dimensions Dimensioni attrezzatura Cancel Cancellare OK OK Spreaders = SPNB Number of spreaders Spreader height txt_SPH2 txt_SPH1 txt_SPH3 SPH2 SPH3 SPH1 Spreader length SPW3 txt_SPW3 SPW1 txt_SPW1 SPW2 txt_SPW2 Shrouds Cap shroud base width = CSH Lower shroud base width txt_LSB txt_CSH = CSB Cap shroud height txt_CSB = LSB Fore triangle txt_foreI = I txt_foreJ = J Fore triangle base Base del triangolo di prua Fore triangle hoist Altezza del triangolo di prua Mast Albero Mast width = MW txt_MW txt_MC = MC Mast cord lbl_MRkD = MRkD Mast rake angle Angolo albero txt_MH txt_MRnd Mast rake Inclinazione albero = MRkM txt_MRkM Mast height = MH = MRnd Mast round Allunamento del albero = MRndPos Mast round position Posizione allunamento albero Mainsail Randa lbl_MS_LuffRP @ lbl_MS_LuffR lbl_MS_TackY Y = lbl_MS_TackX X = Tack lbl_MS_LuffL = MSL Luff length Lunghezza del ghindante Luff round Allunamento del ghindante lbl_MS_Rake = MSR Luff rake Inclinazione ghindante Tack height Altezza del punto di mura txt_BAD = BAD Head height = HAD txt_HAD Check Controllo All dimensions are in millimeter and angles in degrees Description of rig Descrizione di attrezzatura Rig name Nome attrezzatura CFormSail sail vela &Print &Stampa data dati drawing disegno development sviluppo E&xport 3D sail Esporta &vela 3D to &DXF &DXF to &TXT sail vela &TXT to &XML sail vela &XML Export &development Esporta &svilupppo to &Carlson plotter al plotter &Carlson to &Hand-plotting format &Dimensions &Dimensioni &Mould &Profilo &Patches &Rinforzi error errore There was a data printing error Errore di stampa dati There was a development printing error Errore di stampa sviluppo There was a drawing printing error Errore di stampa disegno to &SVG &SVG to DXF (split) CFormSailDef Sail corners coordinates Vela circonda coordinate tack chiodino clew indizio head testa peak vetta IRC width measurements IRC misure di ampiezza Sail width measurements Vela misure di ampiezza CFormSailDefBase Sail definition Definizione della vela Sail dimensions Dimensioni della vela mm mm Round position Posizione dell'allunamento Luff length Lunghezza del ghindante Foot length Lunghezza della base Leech length Lunghezza della balumina Gaff length Lunghezza del picco Leech round Allunamento della balumina Gaff round Allunamento del picco Luff round Allunamento del ghindante Foot round Allunamento della base % % deg deg Gaff angle from luff Angolo tra picco e ghindante Rig geometry Geometria dell'attrezzatura Fore triangle base J Base J del triangolo di prua Tack height Altezza del punto di mura Distance tack to stem Distanza prua-punto di mura Main sail Randa Jib Fiocco Fore triangle hoist I Altezza I del triangolo di prua Boat length LOA Lunghezza della barca Mast / Luff rake Inclinazione albero/ghindante Cloth Tessuto vela Seam width Larghezza vivagno Cloth width Larghezza del tessuto vela Layout Taglio Mitre cut Taglio a spina di pesce Cross cut Taglio cross-cut Twist foot Twist foot Horizontal cut Taglio orizzontale Number of sections Numero di sezioni Number of radial gores Numero di pannelli radiali Radial cut Taglio radiale Vertical cut Taglio verticale Sail shape Forma della vela Top depth Profondita' in alto Mid depth Profondita' al centro Foot depth Profondita' alla base Twist angle Angolo di svergolamento OK OK Cancel Cancellare Leech hem Vaina balumina Other hems Altre vaine Sheeting angle Angolo caduta vela mТВ mТВ Sail area Area della vela Diagonal Diagonale Compute Calcola Sail ID Nome della vela Number of luff gores Numero di ghindante pannelli radiali Fore triangle base J Base J del triangolo di prua Dihedral angle Wing Ala Sail identifier m2 m2 Sail name Nome della vela Luff rake Inclinazione ghindante Mitre cut 2 Taglio a spina di pesce 2 Foot hem Vaina alla base CRigSailWidget Sail information Informazioni vela file file name nome Reload Ricarica Remove Cancella Update Aggiorna error errore There was an error reading from the selected file. Errore di lettura dal file selezionato. CSailDataPrinter Sailcut CAD data sheet Scheda dati Sailcut CAD Mainsail Randa Jib Fiocco Wing Ala deg deg Sail type Tipo vela Cross Cut Taglio cross-cut Horizontal Cut Taglio orizzontale Radial Cut Taglio radiale sections sezioni head gores altezza pannelli luff gores ghindante pannelli Twist Foot Cut Taglio twist foot Vertical Cut Taglio verticale Mitre Cut Taglio a spina di pesce Mitre Cut 2 Taglio a spina di pesce 2 Sail layout Taglio vela Rig Attrezzatura Boat LOA Lunghezza della barca Mast/Luff rake Inclinazione albero/ghindante Tack position X Posizione X del punto di mura Tack height Y Altezza Y del punto di mura Fore triangle hoist I Altezza I del triangolo di prua Fore triangle base J Base J del triangolo di prua Sail dimensions Dimensioni della vela Luff length Lunghezza del ghindante Foot length Lunghezza della base Leech length Lunghezza della balumina Gaff length Lunghezza del picco Gaff angle wrt luff Angolo tra picco e ghindante Shape of edges Forma dei bordi Luff round Allunamento del ghindante Luff round position Posizione allunamento ghindante Foot round Allunamento della base Foot round position Posizione allunamento base Leech round Allunamento della balumina Leech round position Posizione allunamento balumina Gaff round Allunamento del picco Gaff round position Posizione allunamento picco Sail settings Regolazioni vela Twist angle Angolo di svergolamento Sheeting angle Angolo caduta vela Cloth seams and hems Vivagni e vaine tessuto vela Cloth width Larghezza del tessuto vela Seams width Larghezza vivagni Leech hem width Larghezza vaina balumina Foot hem width Larghezza vaina base Other hems width Larghezza altre vaine Sail mould Profilo della vela Luff factor Fattore ghindante Depth Profondita' Leech factor Fattore balumina Top profile Profilo superiore Mid profile at h = Profilo mediano ad "h" Bottom profile Profilo inferiore Luff rake Inclinazione ghindante CSailDevelPrinter Scale Scala CSailDispGL This system has no OpenGL support. Il supporto OpenGL non e' disponibile su questo sistema. CSailDrawingPrinter Scale Scala CSailPrinter Sailcut CAD data sheet Scheda dati Sailcut CAD Mainsail Randa Jib Fiocco deg deg Sail type Tipo vela Cross Cut Taglio cross-cut Horizontal Cut Taglio orizzontale Radial Cut Taglio radiale sections sezioni head gores altezza pannelli luff gores ghindante pannelli Twist Foot Cut Taglio twist foot Vertical Cut Taglio verticale Mitre Cut Taglio a spina di pesce Sail layout Taglio vela Rig Attrezzatura Boat LOA Lunghezza della barca Mast/Luff rake Inclinazione albero/ghindante Tack position X Posizione X del punto di mura Tack height Y Altezza Y del punto di mura Fore triangle hoist I Altezza I del triangolo di prua Fore triangle base J Base J del triangolo di prua Sail dimensions Dimensioni della vela Luff length Lunghezza del ghindante Foot length Lunghezza della base Leech length Lunghezza della balumina Gaff length Lunghezza del picco Gaff angle wrt luff Angolo tra picco e ghindante Shape of edges Forma dei bordi Luff round Allunamento del ghindante Luff round position Posizione allunamento ghindante Foot round Allunamento della base Foot round position Posizione allunamento base Leech round Allunamento della balumina Leech round position Posizione allunamento balumina Gaff round Allunamento del picco Gaff round position Posizione allunamento picco Sail settings Regolazioni vela Twist angle Angolo di svergolamento Sheeting angle Angolo caduta vela Cloth seams and hems Vivagni e vaine tessuto vela Cloth width Larghezza del tessuto vela Seams width Larghezza vivagni Leech hem width Larghezza vaina balumina Other hem width Larghezza altre vaine Sail mould Profilo della vela Luff factor Fattore ghindante Depth Profondita' Leech factor Fattore balumina Top profile Profilo superiore Mid profile at h = Profilo mediano ad "h" Bottom profile Profilo inferiore CSailViewerPanel Display parameters Parametri schermata elevation elevazione azimuth azimuth Controls Controlli Reset view Resettare la vista Labeling Etichette Zoom in Zoom avanti Zoom out Zoom indietro deg deg CSailViewerTabs shaded view vista in chiaroscuro wireframe view vista spigoli CWidgetProfile % % Luff shape Forma ghindante Depth Profondita' Leech shape Forma balumina degrees gradi cord corda Dialog Dialog Dialogo XmlReaderTempl error errore There was an error reading from the selected file. Errore di lettura dal file selezionato. sailcut-1.3.5/src/ts/template.ts0000644000175000007640000017414611200372143016512 0ustar sharkyjerryweb CBoatElementWidget file name Reload Remove Update Element information CFileWriter error There was an error writing to the selected file. Open There was an error reading from the selected file. Save CFormBoat boat &Add file Open CFormHull hull &Dimensions CFormHullDefBase Dialog Deck and bottom Planking Automatic planking lower plank angle top plank angle Number of planks Bottom Bottom sweep angle % Max Width Forward shape Length Forward height Max Width position Stem angle Transom angle Aft height Aft width Aft shape Hull name Deck Forward height Plank 5 Chine angle Sweep angle Plank angle Plank 4 Plank 3 Plank 2 Plank 1 Plank 6 Check OK Cancel Dimensions are in millimeters and angles in degrees measured from horizontal Planks txt_BBW txt_BfwdHeight txt_BLWL txt_BaftW txt_BaftHeight Dead rise angle txt_HullID txt_DaftHeight txt_DfwdHeight Side angle CFormMain &File &New &Open Open &recent &Save Save &As &Quit &View Language &Help Sailcut CAD &Handbook About &Qt About &Sailcut CAD loaded '%1' About Sailcut CAD error loading '%1' wrote '%1' sail hull rig boat &Window &Close Close &All &Tile &Cascade unknown document type '%1' Open CFormMould Sail mould &OK &Cancel Vertical repartition Top profile Middle profile Bottom profile CFormPanelGroup panels CFormPrint &Print &Cancel Scale CFormRig rig &Dimensions CFormRigDefBase Rig dimensions Cancel OK Spreaders = SPNB Number of spreaders Spreader height txt_SPH2 txt_SPH1 txt_SPH3 SPH2 SPH3 SPH1 Spreader length SPW3 txt_SPW3 SPW1 txt_SPW1 SPW2 txt_SPW2 Shrouds Cap shroud base width = CSH Lower shroud base width txt_LSB txt_CSH = CSB Cap shroud height txt_CSB = LSB Fore triangle txt_foreI = I txt_foreJ = J Fore triangle base Fore triangle hoist Mast Mast width = MW txt_MW txt_MC = MC Mast cord lbl_MRkD = MRkD Mast rake angle txt_MH txt_MRnd Mast rake = MRkM txt_MRkM Mast height = MH = MRnd Mast round = MRndPos Mast round position Mainsail lbl_MS_LuffRP @ lbl_MS_LuffR lbl_MS_TackY Y = lbl_MS_TackX X = Tack lbl_MS_LuffL = MSL Luff length Luff round lbl_MS_Rake = MSR Luff rake Tack height txt_BAD = BAD Head height = HAD txt_HAD Check All dimensions are in millimeter and angles in degrees Description of rig Rig name CFormSail sail &Print data drawing development E&xport 3D sail to &DXF to &TXT sail to &XML sail Export &development to &Carlson plotter to &Hand-plotting format &Dimensions &Mould &Patches to &SVG to DXF (split) CFormSailDef Sail corners coordinates tack clew head peak Sail width measurements CFormSailDefBase Sail definition OK Cancel Sail dimensions mm Round position Luff length Foot length Leech length Gaff length Leech round Luff round Foot round % deg Gaff round Gaff angle from luff Diagonal Sail area m2 Compute Layout Mitre cut Cross cut Twist foot Vertical cut Radial cut Number of sections Number of radial gores Number of luff gores Horizontal cut Sail shape Top depth Mid depth Foot depth Twist angle Sheeting angle Cloth Cloth width Leech hem Other hems Seam width Sail identifier Rig geometry Wing Jib Main sail Dihedral angle Boat length LOA Distance tack to stem Fore triangle base J Tack height Fore triangle hoist I Sail name Luff rake Mitre cut 2 Foot hem CSailDataPrinter Sailcut CAD data sheet Mainsail Jib Wing deg Sail type Cross Cut Horizontal Cut Radial Cut sections head gores luff gores Twist Foot Cut Vertical Cut Mitre Cut Mitre Cut 2 Sail layout Rig Boat LOA Tack position X Tack height Y Fore triangle hoist I Fore triangle base J Sail dimensions Luff length Foot length Leech length Gaff length Gaff angle wrt luff Shape of edges Luff round Luff round position Foot round Foot round position Leech round Leech round position Gaff round Gaff round position Sail settings Twist angle Sheeting angle Cloth seams and hems Cloth width Seams width Leech hem width Foot hem width Other hems width Sail mould Luff factor Depth Leech factor Top profile Mid profile at h = Bottom profile Luff rake CSailDevelPrinter Scale CSailDrawingPrinter Scale CSailViewerPanel Display parameters elevation azimuth Controls Reset view Labeling Zoom in Zoom out deg CSailViewerTabs shaded view wireframe view CWidgetProfile Luff shape Depth % Leech shape degrees cord Dialog sailcut-1.3.5/src/ts/sailcut_no.ts0000644000175000007640000026374111200372143017037 0ustar sharkyjerryweb CBoatElementWidget Sail information Seilinformasjon file fil name navn Reload Forny Remove Fjern Update Oppdater Element information CFileIO Open УЅpne Save Lagre CFileWriter error feil There was an error writing to the selected file. Feil ved utskrivning av valgte fil. Open УЅpne There was an error reading from the selected file. Feil ved lesning av valgte fil. Save Lagre CFormBoat boat bУЅten &Add &Legg file fil Open УЅpne CFormHull hull &Dimensions &Dimensjoner CFormHullDefBase Dialog Deck and bottom Planking Automatic planking lower plank angle top plank angle Number of planks Bottom Bottom sweep angle % % Max Width Forward shape Length Forward height Max Width position Stem angle Transom angle Aft height Aft width Aft shape Hull name Deck Forward height Plank 5 Chine angle Sweep angle Plank angle Plank 4 Plank 3 Plank 2 Plank 1 Plank 6 Check OK OK Cancel Annuler Dimensions are in millimeters and angles in degrees measured from horizontal Planks txt_BBW txt_BfwdHeight txt_BLWL txt_BaftW txt_BaftHeight Dead rise angle txt_HullID txt_DaftHeight txt_DfwdHeight Side angle CFormMain to &DXF &DXF to &TXT sail seil &TXT to &XML sail seil &XML &New &Ny &Open &УЅpne &Save &Lagre Save &As Lagre &som &Quit &Avslutt &Dimensions &Dimensjoner &Mould &Mal &Patches &Lapper &Rig &Rigg &File &Fil &View &Bilde &Help &Hjelp About Sailcut CAD Informasjon om Sailcut CAD error feil There was an error writing to the selected file Feil ved utskrivning av valgte fil. About &Qt Informasjon om &Qt About &Sailcut CAD Informasjon om &Sailcut CAD Language SprУЅk Open &recent У…pne &siste E&xport 3D sail &Eksporter 3D seil to &Carlson plotter til &Carlson plotter Export &development Eksporter &utvikling Sailcut CAD &Handbook Sailcut &HУЅndbok CAD shaded view visning i 3D wireframe view visning av omriss development utskytningsoversikt created new sail laget nytt seil loaded '%1' lastet inn '%1' error loading '%1' feil ved lasting av '%1' wrote '%1' skrev '%1' There was a data printing error Feil ved utskrift av data There was a development printing error Feil ved utskrift av paneler There was a drawing printing error Feil ved utskrift av tegning data data drawing tegning develop lag paneler &Print &Skriv ut Sail type Seiltype Mainsail Storseil Jib Fokke Sail layout Seil layout Cross Cut Kryss kutt Horizontal Cut Horisontalt kutt Radial Cut Radial kutt Twist Foot Cut Vridd underlik kutt Vertical Cut Vertikalt kutt Mitre Cut Mitre kutt sections, baner head gores. Antall paneler i topp. Rig Rigg Boat LOA BУЅtens LOA Fore triangle hoist I HУИyde I av framre trekant Fore triangle base J Foten J av framre trekant Tack position X Nedhalets posisjon X Tack height Y Nedhalets hУИyde Y Sail dimensions Seil dimensjoner Luff length Forlikets lengde Gaff angle wrt luff Gaffelens vinkel pУЅ forliket Gaff length Gaffel lengde Foot length Lengde underkant Leech length Akterlikets lengde Shape of edges Form pУЅ seilets lik Luff round Forlikets avrunding Gaff round Gaffel avrunding Leech round Akterlikets avrunding Foot round Underlikets avrunding Luff round position Plassering av forlikets avrunding Gaff round position Plassering av gaffelens avrunding Leech round position Plassering av akterlikets avrunding Foot round position Plassering av underlikets avrunding Sail settings Innstillinger for seil Twist angle Tvist vinkel Sheeting angle SkjУИtevinkel Cloth seams and hems Stoff sУИm og bretter Cloth width Stoff bredde Seams width SУИm bredde Leech hem width Bredde pУЅ akterlikets sУИm Other hem width Bredde pУЅ andre sУИmmer Sail mould Seil mal Luff factor Forlikets faktor Depth Dybde Leech factor Akterlikets faktor Top profile Topp profil Mid profile at h = Midtre profil h = Bottom profile Nedre profil Mast/Luff rake Mastelogg head gores, Antall paneler i topp, Wing Vinge luff gores. baner i forlik. deg grad sail seil hull rig rigg boat bУЅten &Window &Close &Lukk Close &All &Tile &Cascade unknown document type '%1' Open УЅpne CFormMould &Cancel &Annuler Vertical repartition Vertikal oppdeling Sail mould Seil mal &Help Hjelp &OK &OK Top profile Topp profil Middle profile Mitre profil Bottom profile Nedre profil CFormPanelGroup panels CFormPrint &Print &Skriv ut &Cancel &Annuler Scale CFormRig Rig Rigg &New &Ny sail &definition seil &definisjoner 3D &sail 3D &seil &Add sail &Legg til seil &Open &УЅpne Open &recent У…pne &siste &Save &Lagre Save &As Lagre &som &Close &Lukk &File &Fil error feil There was an error writing to the selected file Feil ved utskrivning av valgte fil rig rigg &Dimensions &Dimensjoner CFormRigDefBase Rig dimensions Rigg dimensjoner Cancel Annuler OK OK Spreaders = SPNB Number of spreaders Spreader height txt_SPH2 txt_SPH1 txt_SPH3 SPH2 SPH3 SPH1 Spreader length SPW3 txt_SPW3 SPW1 txt_SPW1 SPW2 txt_SPW2 Shrouds Cap shroud base width = CSH Lower shroud base width txt_LSB txt_CSH = CSB Cap shroud height txt_CSB = LSB Fore triangle txt_foreI = I txt_foreJ = J Fore triangle base Fore triangle hoist Mast Mast width = MW txt_MW txt_MC = MC Mast cord lbl_MRkD = MRkD Mast rake angle txt_MH txt_MRnd Mast rake = MRkM txt_MRkM Mast height = MH = MRnd Mast round = MRndPos Mast round position Mainsail Storseil lbl_MS_LuffRP @ lbl_MS_LuffR lbl_MS_TackY Y = lbl_MS_TackX X = Tack lbl_MS_LuffL = MSL Luff length Forlikets lengde Luff round Forlikets avrunding lbl_MS_Rake = MSR Luff rake Tack height txt_BAD = BAD Head height = HAD txt_HAD Check All dimensions are in millimeter and angles in degrees Description of rig Rig name CFormSail sail seil &Print &Skriv ut data data drawing tegning development utskytningsoversikt E&xport 3D sail &Eksporter 3D seil to &DXF &DXF to &TXT sail seil &TXT to &XML sail seil &XML Export &development Eksporter &utvikling to &Carlson plotter til &Carlson plotter to &Hand-plotting format &Dimensions &Dimensjoner &Mould &Mal &Patches &Lapper error feil There was a data printing error Feil ved utskrift av data There was a development printing error Feil ved utskrift av paneler There was a drawing printing error Feil ved utskrift av tegning to &SVG &SVG to DXF (split) CFormSailDef Sail corners coordinates tack hУИyde clew head topp peak Sail width measurements CFormSailDefBase Sail definition Definisjon av seilet Sail dimensions Seil dimensjoner mm mm Round position Posisjonen til avrundingen Luff length Forlikets lengde Foot length Lengde underkant Leech length Akterlikets lengde Gaff length Gaffel lengde Leech round Akterlikets avrunding Gaff round Gaffel avrunding Luff round Forlikets avrunding Foot round Underlikets avrunding % % deg grad Gaff angle from luff Gaffel vinkel/forlik Rig geometry Riggens MУЅl Fore triangle base J Foten J av framre trekant Tack height HУИyde pУЅ skjУИtefeste Distance tack to stem Avstand fra nedhal til skjУИtefeste Main sail Storseil Jib Fokke Fore triangle hoist I HУИyde I av framre trekant Boat length LOA Lengde pУЅ bУЅten Mast / Luff rake Mastelogg Cloth Stoff Seam width SУИm bredde Cloth width Stoff bredde Layout Layout Mitre cut Mitre kutt Cross cut Kryss kutt Twist foot Vridd underlik Horizontal cut Horisontalt kutt Number of sections Antall baner Number of radial gores Antall radial paneler Radial cut Radial kutt Vertical cut Vertikal kutt Sail shape Seilets form Top depth Dybde i toppen Mid depth Dybde pУЅ midten Foot depth Dybde ved underliket Twist angle Tvist vinkel OK OK Cancel Annuler Leech hem Bretten pУЅ akterliket Other hems Andre brett kanter Sheeting angle SkjУИtevinkel mТВ mТВ Sail area Seilets areal Diagonal Diagonal Compute Beregn Sail ID Seil ID Number of luff gores Antall baner i forlik Dihedral angle Vinkel Wing Vinge Sail identifier Seil ID m2 m2 Sail name Luff rake Mitre cut 2 Mitre kutt 2 Foot hem CRigSailWidget Sail information Seilinformasjon file fil name navn Reload Forny Remove Fjern Update Oppdater error feil There was an error reading from the selected file. Feil ved lesning av valgte fil. CSailDataPrinter Sailcut CAD data sheet Sailcut CAD kuttliste Mainsail Storseil Jib Fokke Wing Vinge deg grad Sail type Seiltype Cross Cut Kryss kutt Horizontal Cut Horisontalt kutt Radial Cut Radial kutt sections baner head gores topp baner luff gores forlik baner Twist Foot Cut Vridd underlik kutt Vertical Cut Vertikalt kutt Mitre Cut Mitre kutt Mitre Cut 2 Mitre kutt 2 Sail layout Seil layout Rig Rigg Boat LOA BУЅtens LOA Mast/Luff rake Mastelogg Tack position X Nedhalets posisjon X Tack height Y Nedhalets hУИyde Y Fore triangle hoist I HУИyde I av framre trekant Fore triangle base J Foten J av framre trekant Sail dimensions Seil dimensjoner Luff length Forlikets lengde Foot length Lengde underkant Leech length Akterlikets lengde Gaff length Gaffel lengde Gaff angle wrt luff Gaffelens vinkel pУЅ forliket Shape of edges Form pУЅ seilets lik Luff round Forlikets avrunding Luff round position Plassering av forlikets avrunding Foot round Underlikets avrunding Foot round position Plassering av underlikets avrunding Leech round Akterlikets avrunding Leech round position Plassering av akterlikets avrunding Gaff round Gaffel avrunding Gaff round position Plassering av gaffelens avrunding Sail settings Innstillinger for seil Twist angle Tvist vinkel Sheeting angle SkjУИtevinkel Cloth seams and hems Stoff sУИm og bretter Cloth width Stoff bredde Seams width SУИm bredde Leech hem width Bredde pУЅ akterlikets sУИm Foot hem width Other hems width Sail mould Seil mal Luff factor Forlikets faktor Depth Dybde Leech factor Akterlikets faktor Top profile Topp profil Mid profile at h = Midtre profil h = Bottom profile Nedre profil Luff rake CSailDevelPrinter Scale CSailDispGL This system has no OpenGL support. OpenGL er ikke tilgjengelig. CSailDrawingPrinter Scale CSailPrinter Sailcut CAD data sheet Sailcut CAD kuttliste Mainsail Storseil Jib Fokke Wing Vinge deg grad Sail type Seiltype Cross Cut Kryss kutt Horizontal Cut Horisontalt kutt Radial Cut Radial kutt sections baner head gores topp baner luff gores forlik baner Twist Foot Cut Vridd underlik kutt Vertical Cut Vertikalt kutt Mitre Cut Mitre kutt Sail layout Seil layout Rig Rigg Boat LOA BУЅtens LOA Mast/Luff rake Mastelogg Tack position X Nedhalets posisjon X Tack height Y Nedhalets hУИyde Y Fore triangle hoist I HУИyde I av framre trekant Fore triangle base J Foten J av framre trekant Sail dimensions Seil dimensjoner Luff length Forlikets lengde Foot length Lengde underkant Leech length Akterlikets lengde Gaff length Gaffel lengde Gaff angle wrt luff Gaffelens vinkel pУЅ forliket Shape of edges Form pУЅ seilets lik Luff round Forlikets avrunding Luff round position Plassering av forlikets avrunding Foot round Underlikets avrunding Foot round position Plassering av underlikets avrunding Leech round Akterlikets avrunding Leech round position Plassering av akterlikets avrunding Gaff round Gaffel avrunding Gaff round position Plassering av gaffelens avrunding Sail settings Innstillinger for seil Twist angle Tvist vinkel Sheeting angle SkjУИtevinkel Cloth seams and hems Stoff sУИm og bretter Cloth width Stoff bredde Seams width SУИm bredde Leech hem width Bredde pУЅ akterlikets sУИm Other hem width Bredde pУЅ andre sУИmmer Sail mould Seil mal Luff factor Forlikets faktor Depth Dybde Leech factor Akterlikets faktor Top profile Topp profil Mid profile at h = Midtre profil h = Bottom profile Nedre profil CSailViewerPanel Display parameters Vis parametrene elevation elevasjon azimuth azimuth Controls Kontroller Reset view Forny bildet Labeling Etiketter Zoom in Zoom in Zoom out Zoom ut deg grader CSailViewerTabs shaded view visning i 3D wireframe view visning av omriss CWidgetProfile % % Luff shape Forlikets form Depth Dybde Leech shape Akterlikets form degrees cord Dialog XmlReaderTempl error feil There was an error reading from the selected file. Feil ved lesning av valgte fil. sailcut-1.3.5/src/ts/sailcut_pt.ts0000644000175000007640000026721111200372143017042 0ustar sharkyjerryweb CBoatElementWidget Sail information InformaУЇУЃo da vela file ficheiro name nome Reload Recarregar Remove Remover Update Actualizar Element information CFileIO Open Abrir Save Salvar CFileWriter error erro There was an error writing to the selected file. Houve um erro ao escrever para o ficheiro seleccionado. Open Abrir There was an error reading from the selected file. Houve um erro ao ler do ficheiro seleccionado. Save Salvar CFormBoat boat barco &Add &Adicionar file ficheiro Open Abrir CFormHull hull &Dimensions &DimensУЕes CFormHullDefBase Dialog Deck and bottom Planking Automatic planking lower plank angle top plank angle Number of planks Bottom Bottom sweep angle % % Max Width Forward shape Length Forward height Max Width position Stem angle Transom angle Aft height Aft width Aft shape Hull name Deck Forward height Plank 5 Chine angle Sweep angle Plank angle Plank 4 Plank 3 Plank 2 Plank 1 Plank 6 Check OK OK Cancel Cancelar Dimensions are in millimeters and angles in degrees measured from horizontal Planks txt_BBW txt_BfwdHeight txt_BLWL txt_BaftW txt_BaftHeight Dead rise angle txt_HullID txt_DaftHeight txt_DfwdHeight Side angle CFormMain &New &Novo &Open &Abrir Open &recent Abrir &recente data dados drawing desenho develop desenvolvimento &Print &Imprimir &Save &Salvar Save &As Salvar &como to &DXF para &DXF to &TXT sail para vela &TXT to &XML sail para vela &XML E&xport 3D sail E&xportar vela 3D to &Carlson plotter para &Carlson plotter Export &development Exportar &desenvolvimento &Quit Sa&ir &Dimensions &DimensУЕes &Mould &Molde &Patches &ReforУЇos &Rig &Aparelho Language Linguagem Sailcut CAD &Handbook &Manual do Sailcut CAD About &Qt Acerca de &Qt About &Sailcut CAD Acerca de &Sailcut CAD &File &Ficheiro &View &Ver &Help &Ajuda shaded view Vista sombreada wireframe view vista em grelha development desenvolvimento loaded '%1' carregado '%1' created new sail criada nova vela About Sailcut CAD Acerca do Sailcut CAD error loading '%1' erro ao carregar '%1' Sail type Tipo de vela Mainsail Vela Grande Jib Vela de Estai Sail layout Formato da vela Cross Cut Corte Transversal Horizontal Cut Corte Horizontal Radial Cut Corte Radial Twist Foot Cut Corte "Twist foot" Vertical Cut Corte Vertical Mitre Cut Corte de Meia Esquadria sections, secУЇУЕes, head gores. paineis do topo. Rig Aparelho Boat LOA Comprimento do barco fora-a-fora - LOA Fore triangle hoist I Altura do triУЂngulo de vante - I Fore triangle base J Base do triУЂngulo de vante - J Tack position X PosiУЇУЃo do punho da amura X Tack height Y Altura do punho da amura Y Sail dimensions DimensУЕes da vela Luff length Comprimento da testa Mast rake Caimento do mastro Gaff angle wrt luff У‚gulo da gurutil wrt testa Gaff length Comprimento do gurutil Foot length Comprimento da esteira Leech length Comprimento da valuma Shape of edges Forma das extremidades Luff round Curva da testa Gaff round Curva da gurutil Leech round Curva da valuma Foot round Curva da esteira Luff round position PosiУЇУЃo da curva da testa Gaff round position PosiУЇУЃo da curva do gurutil Leech round position PosiУЇУЃo da curva da valuma Foot round position PosiУЇУЃo da curva da esteira Sail settings AfinaУЇУЕes da vela Twist angle У‚gulo de torУЇУЃo Sheeting angle У‚gulo de escota Cloth seams and hems Costuras e baУ­nhas do tecido Cloth width Largura do tecido Seams width Largura das costuras Leech hem width Largura da baУ­nha da valuma Other hem width Largura de outras baУ­nhas Sail mould Molde da vela Luff factor Factor da testa Depth Profundidade Leech factor Factor da valuma Top profile Perfil do topo Mid profile at h = Perfil do meio em h = Bottom profile Perfil da base error erro There was a data printing error Houve um erro na impressУЃo de dados There was a development printing error Houve um erro na impressУЃo do desenvolvimento There was a drawing printing error Houve um erro na impressУЃo do desenho wrote '%1' Escreveu '%1' There was an error writing to the selected file Houve um erro ao escrever para o ficheiro seleccionado head gores, Radiais da pena, Mast/Luff rake Caimento mastro/testa Wing Asa luff gores. Radiais da testa. deg graus to &Hand-plotting format para formato de TraУЇar У  &mУЃo sail vela hull rig aparelho boat barco &Window &Close &Fechar Close &All &Tile &Cascade unknown document type '%1' Open Abrir CFormMould Top profile Perfil do topo Middle profile Perfil do meio Bottom profile Perfil da base Sail mould Molde da vela &Help &Ajuda &OK &OK &Cancel &Cancelar Vertical repartition RepartiУЇУЃo vertical CFormPanelGroup panels CFormPrint &Print &Imprimir &Cancel &Cancelar Scale CFormRig Rig Aparelho &New &Novo sail &definition &DefiniУЇУЃo da vela 3D &sail &vela 3D &Add sail &Adicionar vela &Open A&brir Open &recent Abrir &recente &Save &Salvar Save &As Salvar &Como &Close &Fechar &File &Ficheiro error erro There was an error writing to the selected file Houve um erro ao escrever para o ficheiro seleccionado rig aparelho &Dimensions &DimensУЕes CFormRigDefBase Rig dimensions DimensУЕes do aparelho Cancel Cancelar OK OK Spreaders = SPNB Number of spreaders Spreader height txt_SPH2 txt_SPH1 txt_SPH3 SPH2 SPH3 SPH1 Spreader length SPW3 txt_SPW3 SPW1 txt_SPW1 SPW2 txt_SPW2 Shrouds Cap shroud base width = CSH Lower shroud base width txt_LSB txt_CSH = CSB Cap shroud height txt_CSB = LSB Fore triangle txt_foreI = I txt_foreJ = J Fore triangle base Base do triУЂngulo de vante Fore triangle hoist Altura do triУЂngulo de vante Mast Mastro Mast width = MW txt_MW txt_MC = MC Mast cord lbl_MRkD = MRkD Mast rake angle txt_MH txt_MRnd Mast rake Caimento do mastro = MRkM txt_MRkM Mast height = MH = MRnd Mast round = MRndPos Mast round position Mainsail Vela Grande lbl_MS_LuffRP @ lbl_MS_LuffR lbl_MS_TackY Y = lbl_MS_TackX X = Tack lbl_MS_LuffL = MSL Luff length Comprimento da testa Luff round Curva da testa lbl_MS_Rake = MSR Luff rake Caimento testa Tack height txt_BAD = BAD Head height = HAD txt_HAD Check All dimensions are in millimeter and angles in degrees Description of rig Rig name CFormSail sail vela &Print &Imprimir data dados drawing desenho development desenvolvimento E&xport 3D sail E&xportar vela 3D to &DXF para &DXF to &TXT sail para vela &TXT to &XML sail para vela &XML Export &development Exportar &desenvolvimento to &Carlson plotter para &Carlson plotter to &Hand-plotting format para formato de TraУЇar У  &mУЃo &Dimensions &DimensУЕes &Mould &Molde &Patches &ReforУЇos error erro There was a data printing error Houve um erro na impressУЃo de dados There was a development printing error Houve um erro na impressУЃo do desenvolvimento There was a drawing printing error Houve um erro na impressУЃo do desenho to &SVG para &SVG to DXF (split) CFormSailDef Sail corners coordinates Coordenadas dos punhos da vela tack amura clew escota head gurutil peak pena IRC width measurements Larguras IRC Sail width measurements Larguras da vela CFormSailDefBase Sail definition DefiniУЇУЃo da vela Sail shape Forma da vela % % Top depth Profundidade do topo Mid depth Profundidade do meio Foot depth Profundidade da esteira Twist angle У‚ngulo de torУЇУЃo Sheeting angle У‚ngulo de escota deg graus Sail dimensions DimensУЕes da vela mm mm Round position PosiУЇУЃo da curva Luff length Comprimento da testa Foot length Comprimento da esteira Leech length Comprimento da valuma Gaff length Comprimento do gurutil Leech round Curva da valuma Luff round Curva da testa Foot round Curva da esteira Gaff round Curva do gurutil Gaff angle from luff У‚gulo da testa com o gurutil Diagonal Diagonal Sail area Уrea vУЉlica mТВ mТВ Compute Calcular OK OK Cancel Cancelar Layout Formato Mitre cut Corte de meia esquadria Cross cut Corte transversal Twist foot Corte "twist foot" Horizontal cut Corte horizontal Number of sections NУКmero de secУЇУЕes Number of radial gores NУКmero de radiais Radial cut Corte radial Vertical cut Corte vertical Cloth Tecido Cloth width Largura do tecido Leech hem BaУ­nha da valuma Other hems Outras baУ­nhas Seam width Largura da costura Rig geometry Geometria do aparelho Fore triangle hoist I Altura do triУЂngulo de vante - I Mast / Luff rake Caimento do mastro/testa Fore triangle base J Base do triУЂngulo de vante - J Distance tack to stem DistУЂncia do punho da amura У  proa Tack height Altura do punho da amura Boat length LOA Comprimento do barco fora-a-fora - LOA Sail ID ID da vela Main sail Vela Grande Jib Vela de estai Number of luff gores NУКmero de radiais da testa Dihedral angle У‚ngulo diedro Wing Asa Sail identifier IdentificaУЇУЃo da vela m2 m2 Sail name Luff rake Caimento testa Mitre cut 2 Foot hem CRigSailWidget Sail information InformaУЇУЃo da vela file ficheiro name nome Reload Recarregar Remove Remover Update Actualizar error erro There was an error reading from the selected file. Houve um erro ao ler do ficheiro seleccionado. CSailDataPrinter Sailcut CAD data sheet Folha de dados do Sailcut CAD Mainsail Vela Grande Jib Vela de Estai Wing Asa deg graus Sail type Tipo de vela Cross Cut Corte Transversal Horizontal Cut Corte Horizontal Radial Cut Corte Radial sections secУЇУЕes head gores radiais do topo luff gores radiais da testa Twist Foot Cut Corte "Twist foot" Vertical Cut Corte Vertical Mitre Cut Corte de Meia Esquadria Mitre Cut 2 Corte de meia esquadria 2 Sail layout Formato da vela Rig Aparelho Boat LOA Comprimento do barco fora-a-fora - LOA Mast/Luff rake Caimento mastro/testa Tack position X PosiУЇУЃo do punho da amura X Tack height Y Altura do punho da amura Y Fore triangle hoist I Altura do triУЂngulo de vante - I Fore triangle base J Base do triУЂngulo de vante - J Sail dimensions DimensУЕes da vela Luff length Comprimento da testa Foot length Comprimento da esteira Leech length Comprimento da valuma Gaff length Comprimento do gurutil Gaff angle wrt luff У‚gulo da gurutil wrt testa Shape of edges Forma das extremidades Luff round Curva da testa Luff round position PosiУЇУЃo da curva da testa Foot round Curva da esteira Foot round position PosiУЇУЃo da curva da esteira Leech round Curva da valuma Leech round position PosiУЇУЃo da curva da valuma Gaff round Curva da gurutil Gaff round position PosiУЇУЃo da curva do gurutil Sail settings AfinaУЇУЕes da vela Twist angle У‚gulo de torУЇУЃo Sheeting angle У‚gulo de escota Cloth seams and hems Costuras e baУ­nhas do tecido Cloth width Largura do tecido Seams width Largura das costuras Leech hem width Largura da baУ­nha da valuma Foot hem width Other hems width Sail mould Molde da vela Luff factor Factor da testa Depth Profundidade Leech factor Factor da valuma Top profile Perfil do topo Mid profile at h = Perfil do meio em h = Bottom profile Perfil da base Luff rake Caimento testa CSailDevelPrinter Scale CSailDispGL This system has no OpenGL support. Este sistema nУЃo tem suporte OpenGL CSailDrawingPrinter Scale CSailPrinter Sailcut CAD data sheet Folha de dados do Sailcut CAD Mainsail Vela Grande Jib Vela de estai Wing Asa deg graus Sail type Tipo de vela Cross Cut Corte transversal Horizontal Cut Corte horizontal Radial Cut Corte radial sections secУЇУЕes head gores radiais do topo luff gores radiais da testa Twist Foot Cut Corte "Twist foot" Vertical Cut Corte Vertical Mitre Cut Corte de Meia Esquadria Sail layout Formato da vela Rig Aparelho Boat LOA Comprimento do barco fora-a-fora - LOA Mast/Luff rake Caimento mastro/testa Tack position X PosiУЇУЃo do punho da amura X Tack height Y Altura do punho da amura Y Fore triangle hoist I Altura do triУЂngulo de vante - I Fore triangle base J Base do triУЂngulo de vante - J Sail dimensions DimensУЕes da vela Luff length Comprimento da testa Foot length Comprimento da esteira Leech length Comprimento da valuma Gaff length Comprimento do gurutil Gaff angle wrt luff У‚gulo da gurutil wrt testa Shape of edges Forma das extremidades Luff round Curva da testa Luff round position PosiУЇУЃo da curva da testa Foot round Curva da esteira Foot round position PosiУЇУЃo da curva da esteira Leech round Curva da valuma Leech round position PosiУЇУЃo da curva da valuma Gaff round Curva da gurutil Gaff round position PosiУЇУЃo da curva do gurutil Sail settings AfinaУЇУЕes da vela Twist angle У‚ngulo de torУЇУЃo Sheeting angle У‚ngulo de escota Cloth seams and hems Costuras e baУ­nhas do tecido Cloth width Largura do tecido Seams width Largura das costuras Leech hem width Largura da baУ­nha da valuma Other hem width Largura de outras baУ­nhas Sail mould Molde da vela Luff factor Factor da testa Depth Profundidade Leech factor Factor da valuma Top profile Perfil do topo Mid profile at h = Perfil do meio em h = Bottom profile Perfil da base CSailViewerPanel Display parameters Mostrar parУЂmetros elevation elevaУЇУЃo azimuth azimute Controls Controlos Reset view Reiniciar vista Labeling Etiquetar Zoom in Aumentar zoom Zoom out Reduzir zoom deg graus CSailViewerTabs shaded view Vista sombreada wireframe view vista em grelha CWidgetProfile Luff shape Forma da testa Depth Profundidade % % Leech shape Forma da valuma degrees graus cord corda Dialog XmlReaderTempl error erro There was an error reading from the selected file. Houve um erro ao ler do ficheiro seleccionado. sailcut-1.3.5/src/ts/sailcut_nl.ts0000644000175000007640000024631711215262321017036 0ustar sharkyjerryweb CBoatElementWidget Sail information Zeil informatie file bestand name naam Reload Opnieuw laden Remove Verwijderen Update Verversen Element information Deel informatie CFileIO Open Openen Save Opslaan CFileWriter error fout There was an error writing to the selected file. Er is een fout opgetreden bij het opslaan van het bestand. Open Openen There was an error reading from the selected file. Er is een fout opgetreden bij het lezen van het bestand. Save Opslaan CFormBoat boat boot &Add &Toevoegen file bestand Open Openen CFormHull hull romp &Dimensions &Afmetingen CFormHullDefBase Dialog Dialoog Deck and bottom Dek en bodem Planking Panelen Automatic planking Automatische panelen lower plank angle Onderste paneel hoek top plank angle Bovenste paneel hoek Number of planks Aantal panelen Bottom Bodem Bottom sweep angle Bodem hoek % % Max Width Max Breedte Forward shape Boeg vorm Length Lengte Forward height Boeg hoogte Max Width position Max Breedte positie Stem angle Boeg hoek Transom angle Spiegel hoek Aft height Achtersteven hoogte Aft width Achtersteven breedte Aft shape Achtersteven vorm Hull name Romp naam Deck Dek Forward height Boeg hoogte Plank 5 Paneel 5 Chine angle Kim hoek Sweep angle Zeeg hoek Plank angle Paneel hoek Plank 4 Paneel 4 Plank 3 Paneel 3 Plank 2 Paneel 2 Plank 1 Paneel 1 Plank 6 Paneel 6 Check Controleren OK OK Cancel Opheffen Dimensions are in millimeters and angles in degrees measured from horizontal Afmetingen in millimeters en hoeken in graden t.o.v. horizontaal Planks Panelen txt_BBW txt_BfwdHeight txt_BLWL txt_BaftW txt_BaftHeight Dead rise angle Bodem hoek txt_HullID txt_DaftHeight txt_DfwdHeight Side angle Dolboord hoek CFormMain &New &Nieuw &Open &Openen &Save Op&slaan Save &As Opslaan &Als to &DXF naar &DXF to &TXT sail naar &TXT zeil to &XML sail naar &XML zeil &Quit &Afsluiten &Dimensions &Afmetingen &Mould &Vorm &Patches &Hoekverstevigingen &Rig &Tuigage Language Taal About &Qt Over &Qt About &Sailcut CAD Over &Sailcut CAD &File &Bestand &View Beel&d &Help &Help About Sailcut CAD Over Sailcut CAD error fout There was an error writing to the selected file Er is een fout opgetreden bij het opslaan van het bestand Open &recent Onlangs &geopend E&xport 3D sail 3D zeil e&xporteren to &Carlson plotter naar &Carlson plotter Export &development Zeil&banen exporteren Sailcut CAD &Handbook Sailcut CAD &Handboek shaded view 3D model wireframe view draadmodel development banen created new sail nieuw zeil gecreУЋerd loaded '%1' '%1' geladen error loading '%1' fout bij het laden van '%1' wrote '%1' '%1' opgeslagen There was a data printing error Er is een fout opgetreden bij het printen van de data There was a development printing error Er is een fout opgetreden bij het printen van banen There was a drawing printing error Er is een fout opgetreden bij het printen van het tekening data data drawing tekening develop banen &Print &Print Sail type Zeil type Mainsail Grootzeil Jib Fok Sail layout Zeilontwerp Cross Cut Schuin gesneden Horizontal Cut Horizontaal gesneden Radial Cut Radiaal gesneden Twist Foot Cut Gedraaid Onderlijk Vertical Cut Verticaal gesneden Mitre Cut Verstek gesneden sections, secties, head gores. top banen. Rig Tuigage Boat LOA Scheepslengte LOA Fore triangle hoist I Voordriehoek hoogte I Fore triangle base J Voordriehoek basis J Tack position X Halshoek positie X Tack height Y Halshoek hoogte Y Sail dimensions Zeil afmetingen Luff length Voorlijk lengte Mast rake Mast helling Gaff angle wrt luff Gaffel-mast hoek Gaff length Gaffel lengte Foot length Onderlijk lengte Leech length Achterlijk lengte Shape of edges Vorm van de randen Luff round Voorlijk ronding Gaff round Gaffel ronding Leech round Achterlijk ronding Foot round Onderlijk ronding Luff round position Voorlijk ronding positie Gaff round position Gaffel ronding positie Leech round position Achterlijk ronding positie Foot round position Onderlijk ronding positie Sail settings Zeil instellingen Twist angle Twist hoek Sheeting angle Schootlijn hoek Cloth seams and hems Doek naden en zomen Cloth width Baan breedte Seams width Naad breedte Leech hem width Achterlijk zoom breedte Other hem width Overige zoom breedte Sail mould Zeilvorm Luff factor Voorlijk factor Depth Diepte Leech factor Achterlijk factor Top profile Top profiel Mid profile at h = Midden profiel bij h = Bottom profile Onderlijk profiel Mast/Luff rake Mast/Voorlijk helling head gores, hoofd banen, luff gore. voorlijk baan. Wing Vleugel luff gores. voorlijk banen. deg gr to &Hand-plotting format naar &Handmatige plotgegevens sail Zeil hull romp rig tuigage boat boot &Window &Venster &Close &Sluiten Close &All &All vensters sluiten &Tile Rangschikken &Cascade Getrapt unknown document type '%1' Onbekend bestandstype '%1' Open Openen CFormMould Top profile Top profiel Middle profile Midden profiel Bottom profile Onderlijk profiel Sail mould Zeilvorm &Help &Help &OK &OK &Cancel Op&heffen Vertical repartition Verticale verdeling CFormPanelGroup panels Panelen CFormPrint &Print &Print &Cancel Op&heffen Scale Schaal CFormRig Rig Tuigage &New &Nieuw sail &definition zeil &definitie 3D &sail 3D &zeil &Add sail Zeil &toevoegen &Open &Openen Open &recent Onlangs &geopend &Save Op&slaan Save &As Opslaan &Als &Close &Sluiten &File &Bestand error fout There was an error writing to the selected file Er is een fout opgetreden bij het opslaan van het bestand rig tuigage &Dimensions &Afmetingen CFormRigDefBase Rig dimensions Tuigage afmetingen Cancel Opheffen OK OK Spreaders Zalingen = SPNB = SPNB Number of spreaders Aantal zalingen Spreader height Zaling hoogte txt_SPH2 txt_SPH1 txt_SPH3 SPH2 SPH3 SPH1 Spreader length Zaling lengte SPW3 txt_SPW3 SPW1 txt_SPW1 SPW2 txt_SPW2 Shrouds Stagen Cap shroud base width Topstagen basis breedte = CSH = CSH Lower shroud base width Onderstagen basis breedte txt_LSB txt_CSH = CSB = CSB Cap shroud height Topstagen hoogte txt_CSB = LSB = LSB Fore triangle Voordriehoek txt_foreI = I = I txt_foreJ = J = J Fore triangle base Voordriehoek basis Fore triangle hoist Voordriehoek hoogte Mast Mast Mast width Mastdikte = MW = MW txt_MW txt_MC = MC = MC Mast cord Mastbuiging lbl_MRkD = MRkD = MRkD Mast rake angle Mast helling hoek txt_MH txt_MRnd Mast rake Mast helling = MRkM = MRkM txt_MRkM Mast height Mast hoogte = MH = MH = MRnd = MRnd Mast round Mast buiging = MRndPos = MRndPos Mast round position Mast buiging positie Mainsail Grootzeil lbl_MS_LuffRP @ @ lbl_MS_LuffR lbl_MS_TackY Y = Y = lbl_MS_TackX X = X = Tack Halshoek lbl_MS_LuffL = MSL = MSL Luff length Voorlijk lengte Luff round Voorlijk ronding lbl_MS_Rake = MSR = MSR Luff rake Voorlijk helling Tack height Halshoek hoogte txt_BAD = BAD = BAD Head height Top hoogte = HAD = HAD txt_HAD Check Controleren All dimensions are in millimeter and angles in degrees All afmetingen in millimeters en hoeken in graden Rig ID Tuigage ID Description of rig Tuigage beschrijving Rig name Tuigage naam CFormSail sail Zeil &Print &Print data data drawing tekening development banen E&xport 3D sail 3D zeil e&xporteren to &DXF naar &DXF to &TXT sail naar &TXT zeil to &XML sail naar &XML zeil Export &development Zeil&banen exporteren to &Carlson plotter naar &Carlson plotter to &Hand-plotting format naar &Handmatige plotgegevens &Dimensions &Afmetingen &Mould &Vorm &Patches &Hoekverstevigingen error fout There was a data printing error Er is een fout opgetreden bij het printen There was a development printing error Er is een fout opgetreden bij het printen There was a drawing printing error Er is een fout opgetreden bij het printen to &SVG naar &SVG to DXF (split) naar DXF (split) CFormSailDef Sail corners coordinates Zeilhoek coУЖrdinaten tack halshoek clew halshoek head tophoek peak tophoek IRC width measurements IRC breedtematen Sail width measurements Zeilbreedte afmetingen CFormSailDefBase Sail definition Zeil definitie Sail dimensions Zeil afmetingen mm mm Round position Ronding positie Luff length Voorlijk lengte Foot length Onderlijk lengte Leech length Achterlijk lengte Gaff length Gaffel lengte Leech round Achterlijk ronding Gaff round Gaffel ronding Luff round Voorlijk ronding Foot round Onderlijk ronding % % deg gr Gaff angle from luff Gaffel-mast hoek Rig geometry Tuigage geometrie Fore triangle base J Voordriehoek basis J Tack height Halshoek hoogte Distance tack to stem Afstand halshoek-boeg Main sail Grootzeil Jib Fok Fore triangle hoist I Voordriehoek hoogte I Boat length LOA Scheepslengte LOA Mast / Luff rake Mast/Voorlijk helling Cloth Zeildoek Seam width Naad breedte Cloth width Baan breedte Layout Ontwerp Mitre cut Verstek gesneden Cross cut Schuin gesneden Twist foot Gedraaid Onderlijk Horizontal cut Horizontaal gesneden Number of sections Aantal secties Number of radial gores Aantal radiale banen Radial cut Radiaal gesneden Vertical cut Vertikaal gesneden Sail shape Zeilvorm Top depth Top bolling Mid depth Midden bolling Foot depth Onderlijk bolling Twist angle Twist hoek OK OK Cancel Opheffen Leech hem Achterlijk zoom Other hems Overige zomen Sheeting angle Schoothoek mТВ mТВ Sail area Zeil oppervlak Diagonal Diagonaal Compute Bereken Sail ID Zeil ID Number of luff gores Aantal voorlijk banen Dihedral angle Tweevlakshoek Wing Vleugel Sail identifier Zeil ID m2 m2 Sail name Zeil naam Luff rake Voorlijk helling Mitre cut 2 Verstek 2 gesneden Foot hem Onderlijk zoom CRigSailWidget Sail information Zeil informatie file bestand name naam Reload Opnieuw laden Remove Verwijderen Update Verversen error fout There was an error reading from the selected file. Er is een fout opgetreden bij het lezen van het bestand. CSailDataPrinter Sailcut CAD data sheet Sailcut CAD data sheet Mainsail Grootzeil Jib Fok Wing Vleugel deg gr Sail type Zeil type Cross Cut Schuin gesneden Horizontal Cut Horizontaal gesneden Radial Cut Radiaal gesneden sections secties head gores top banen luff gores voorlijk banen Twist Foot Cut Gedraaid Onderlijk Vertical Cut Verticaal gesneden Mitre Cut Verstek gesneden Mitre Cut 2 Verstek 2 gesneden Sail layout Zeilontwerp Rig Tuigage Boat LOA Scheepslengte LOA Mast/Luff rake Mast/Voorlijk helling Tack position X Halshoek positie X Tack height Y Halshoek hoogte Y Fore triangle hoist I Voordriehoek hoogte I Fore triangle base J Voordriehoek basis J Sail dimensions Zeil afmetingen Luff length Voorlijk lengte Foot length Onderlijk lengte Leech length Achterlijk lengte Gaff length Gaffel lengte Gaff angle wrt luff Gaffel-mast hoek Shape of edges Vorm van de randen Luff round Voorlijk ronding Luff round position Voorlijk ronding positie Foot round Onderlijk ronding Foot round position Onderlijk ronding positie Leech round Achterlijk ronding Leech round position Achterlijk ronding positie Gaff round Gaffel ronding Gaff round position Gaffel ronding positie Sail settings Zeil instellingen Twist angle Twist hoek Sheeting angle Cloth seams and hems Doek naden en zomen Cloth width Baan breedte Seams width Naad breedte Leech hem width Achterlijk zoom breedte Foot hem width Onderlijk zoom breedte Other hems width Overige zoom breedte Sail mould Zeilvorm Luff factor Voorlijk factor Depth Diepte Leech factor Achterlijk factor Top profile Top profiel Mid profile at h = Midden profiel bij h = Bottom profile Onderlijk profiel Luff rake Voorlijk helling CSailDevelPrinter Scale Schaal CSailDispGL This system has no OpenGL support. Dit systeem ondersteunt geen OpenGL. CSailDrawingPrinter Scale Schaal CSailPrinter Sailcut CAD data sheet Sailcut CAD data sheet Mainsail Grootzeil Jib Fok Wing Vleugel deg gr Sail type Zeil type Cross Cut Schuin gesneden Horizontal Cut Horizontaal gesneden Radial Cut Radiaal gesneden sections secties head gores top banen luff gores voorlijk banen Twist Foot Cut Gedraaid onderlijk Vertical Cut Verticaal gesneden Mitre Cut Verstek gesneden Sail layout Zeilontwerp Rig Tuigage Boat LOA Scheepslengte LOA Mast/Luff rake Mast/Voorlijk helling Tack position X Halshoek positie X Tack height Y Halshoek hoogte Y Fore triangle hoist I Voordriehoek hoogte I Fore triangle base J Voordriehoek basis J Sail dimensions Zeil afmetingen Luff length Voorlijk lengte Foot length Onderlijk lengte Leech length Achterlijk lengte Gaff length Gaffel lengte Gaff angle wrt luff Gaffel-mast hoek Shape of edges Vorm van de randen Luff round Voorlijk ronding Luff round position Voorlijk ronding positie Foot round Onderlijk ronding Foot round position Onderlijk ronding positie Leech round Achterlijk ronding Leech round position Achterlijk ronding positie Gaff round Gaffel ronding Gaff round position Gaffel ronding positie Sail settings Zeil instellingen Twist angle Twist hoek Sheeting angle Schoothoek Cloth seams and hems Doek naden en zomen Cloth width Baan breedte Seams width Naad breedte Leech hem width Achterlijk zoom breedte Other hem width Overige zoom breedte Sail mould Zeilvorm Luff factor Voorlijk factor Depth Diepte Leech factor Achterlijk factor Top profile Top profiel Mid profile at h = Midden profiel bij h = Bottom profile Onderlijk profiel CSailViewerPanel Display parameters Beeld parameters elevation hoogtehoek azimuth azimut Controls Controleer Reset view Beeld aanpassen Labeling Labels Zoom in Inzoomen Zoom out Uitzoomen deg gr CSailViewerTabs shaded view 3D model wireframe view draadmodel CWidgetProfile Luff shape Voorlijk vorm Depth Diepte % % Leech shape Achterlijk vorm degrees grad cord Koorde Dialog Dialog Dialoog XmlReaderTempl error fout There was an error reading from the selected file. Er is een fout opgetreden bij het lezen van het bestand. sailcut-1.3.5/src/ts/CMakeLists.txt0000644000175000007640000000037111160736754017074 0ustar sharkyjerrywebqt4_add_translation(QMS sailcut_de.ts sailcut_dk.ts sailcut_fr.ts sailcut_it.ts sailcut_nl.ts sailcut_no.ts sailcut_pt.ts sailcut_ru.ts) add_custom_target(translations DEPENDS ${QMS}) install(FILES ${QMS} DESTINATION ${SAILCUT_DATA_DIR}) sailcut-1.3.5/src/ts/sailcut_ru.ts0000644000175000007640000030443011200372143017040 0ustar sharkyjerryweb CBoatElementWidget Sail information а˜аНб„аОб€аМаАб†аИб аО аПаАб€бƒбаЕ file б„аАаЙаЛ name а˜аМб Reload аŸаЕб€аЕаЗаАаГб€бƒаЗаИб‚бŒ Remove аЃаДаАаЛаИб‚бŒ Update аžаБаНаОаВаИб‚бŒ Element information CFileIO Open аžб‚аКб€б‹б‚бŒ Save аЁаОб…б€аАаНаИб‚бŒ CFileWriter error аžбˆаИаБаКаА There was an error writing to the selected file. аžбˆаИаБаКаА аЗаАаПаИбаИ аВ аВб‹аБб€аАаНаНб‹аЙ б„аАаЙаЛ. Open аžб‚аКб€б‹б‚бŒ There was an error reading from the selected file. Save аЁаОб…б€аАаНаИб‚бŒ CFormBoat boat &Add file б„аАаЙаЛ Open аžб‚аКб€б‹б‚бŒ CFormHull hull &Dimensions а аАаЗаМаЕб€б‹ CFormHullDefBase Dialog Deck and bottom Planking Automatic planking lower plank angle top plank angle Number of planks Bottom Bottom sweep angle % Max Width Forward shape Length Forward height Max Width position Stem angle Transom angle Aft height Aft width Aft shape Hull name Deck Forward height Plank 5 Chine angle Sweep angle Plank angle Plank 4 Plank 3 Plank 2 Plank 1 Plank 6 Check OK аžаš Cancel аžб‚аМаЕаНаА Dimensions are in millimeters and angles in degrees measured from horizontal Planks txt_BBW txt_BfwdHeight txt_BLWL txt_BaftW txt_BaftHeight Dead rise angle txt_HullID txt_DaftHeight txt_DfwdHeight Side angle CFormMain &New ааОаВб‹аЙ &Open аžб‚аКб€б‹б‚бŒ Open &recent аžб‚аКб€б‹б‚бŒ аПб€аЕаДб‹аДбƒб‰аИаЙ data а”аАаНаНб‹аЕ drawing аŸаАаНаЕаЛаИ аВ баБаОб€аЕ develop аžб‚аДаЕаЛбŒаНб‹б… аПаАаНаЕаЛаЕаЙ &Print аŸаЕб‡аАб‚аАб‚бŒ &Save аЁаОб…б€аАаНаИб‚бŒ Save &As аЁаОб…б€аАаНаИб‚бŒ аКаАаК to &DXF аВ DXF б„аОб€аМаАб‚ to &TXT sail аВ TXT б„аОб€аМаАб‚ to &XML sail аВ XML б„аОб€аМаАб‚ E&xport 3D sail а­аКбаПаОб€б‚ 3D аПаАб€бƒбаА to &Carlson plotter аВ Carlson аПаЛаОб‚б‚аЕб€ Export &development а­аКбаПаОб€б‚ аПаАаНаЕаЛаЕаЙ &Quit а’б‹б…аОаД &Dimensions а аАаЗаМаЕб€б‹ &Mould аŸб€аОб„аИаЛаИ &Patches ааАаКаЛаАаДаКаИ &Rig аŸаАб€бƒбаНаОаЕ аВаОаОб€бƒаЖаЕаНаИаЕ Language аЏаЗб‹аК Sailcut CAD &Handbook аЁаПб€аАаВаОб‡аНаИаК аПаО Sailcut CAD About &Qt аž аПб€аОаГб€аАаМаМаЕ Qt About &Sailcut CAD аО аПб€аОаГб€аАаМаМаЕ Sailcut CAD &File аЄаАаЙаЛ &View аŸб€аОбаМаОб‚б€ &Help аŸаОаМаОб‰бŒ shaded view а’аНаЕбˆаНаИаЙ аВаИаД wireframe view а’ аКаОаНб‚бƒб€аАб… development а аАбаКб€аОаЙ аПаАаНаЕаЛаЕаЙ loaded '%1' а—аАаГб€бƒаЖаЕаН '%1' created new sail аЁаОаЗаДаАаН аНаОаВб‹аЙ аПаАб€бƒб About Sailcut CAD аž аПб€аОаГб€аАаМаМаЕ Sailcut CAD error loading '%1' аžбˆаИаБаКаА аЗаАаГб€бƒаЗаКаИ '%1' Sail type аЂаИаП аПаАб€бƒбаА Mainsail а“б€аОб‚ Jib аЁб‚аАаКбаЕаЛбŒ Wing аšб€б‹аЛаО Sail layout аœаАаКаЕб‚ аПаАб€бƒбаА Cross Cut аŸаОаПаЕб€аЕб‡аНб‹аЙ аКб€аОаЙ Horizontal Cut а“аОб€аИаЗаОаНб‚аАаЛбŒаНб‹аЙ аКб€аОаЙ Radial Cut а аАаДаИаАаЛбŒаНб‹аЙ аКб€аОаЙ Twist Foot Cut аŸаОаПаЕб€аЕб‡аНб‹аЙ аКб€аОаЙ , аПаАб€аАаЛаЛаЕаЛбŒаНб‹аЙ аКб€аАбŽ аНаИаЖаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Vertical Cut а’аЕб€б‚аИаКаАаЛбŒаНб‹аЙ аКб€аОаЙ Mitre Cut аšб€аОаЙ аПаОаД 45 аГб€аАаДбƒбаОаВ sections, аЁаЕаКб†аИаИ head gores, аšаЛаИаНбŒб аВаЕб€б…аНаЕаЙ б‡аАбб‚аИ аПаАб€бƒбаА luff gores. аšаЛаИаНбŒб аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Rig аŸаАб€бƒбаНаОаЕ аВаОаОб€бƒаЖаЕаНаИаЕ Boat LOA а“аАаБаАб€аИб‚аНб‹аЙ б€аАаЗаМаЕб€ аЛаОаДаКаИ Fore triangle hoist I а’б‹баОб‚аА аКб€аЕаПаЛаЕаНаИб бˆб‚аАаГаА аНаА аМаАб‡б‚аЕ аОб‚ аПаАаЛбƒаБб‹, аВаЕаЛаИб‡аИаНаА L Fore triangle base J аŸб€аОаЕаКб†аИб бˆб‚аАаГаА аНаА аПаАаЛбƒаБбƒ, аВаЕаЛаИб‡аИаНаА J Tack position X аŸаОаЛаОаЖаЕаНаИаЕ аГаАаЛбаОаВаОаГаО бƒаГаЛаА X Tack height Y а’б‹баОб‚аА аГаАаЛбаОаВаОаГаО бƒаГаЛаА Y Sail dimensions а аАаЗаМаЕб€б‹ аПаАб€бƒбаА Luff length а”аЛаИаНаА аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Mast/Luff rake ааАаКаЛаОаН аМаАб‡б‚б‹/бˆб‚аАаГаА Gaff angle wrt luff аЃаГаОаЛ аНаАаКаЛаОаНаА аВаЕб€б…аНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ аГаАб„аЕаЛб аОб‚аНаОбаИб‚аЕаЛбŒаНаО аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Gaff length а”аЛаИаНаА аВаЕб€б…аНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ аГаАб„аЕаЛб Foot length а”аЛаИаНаА аНаИаЖаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Leech length а”аЛаИаНаА аЗаАаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Shape of edges аЄаОб€аМаА аКб€аАаЕаВ Luff round а’б‹аПбƒаКаЛаОбб‚бŒ аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Gaff round а’б‹аПбƒаКаЛаОбб‚бŒ аВаЕб€б…аНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ аГаАб„аЕаЛб Leech round а’б‹аПбƒаКаЛаОбб‚бŒ аЗаАаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Foot round а’б‹аПбƒаКаЛаОбб‚бŒ аНаИаЖаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Luff round position аŸаОаЛаОаЖаЕаНаИаЕ аВб‹аПбƒаКаЛаОбб‚аИ аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Gaff round position аŸаОаЛаОаЖаЕаНаИаЕ аВб‹аПбƒаКаЛаОбб‚аИ аВаЕб€б…аНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ аГаАб„аЕаЛб Leech round position аŸаОаЛаОаЖаЕаНаИаЕ аВб‹аПбƒаКаЛаОбб‚аИ аЗаАаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Foot round position аŸаОаЛаОаЖаЕаНаИаЕ аВб‹аПбƒаКаЛаОбб‚аИ аНаИаЖаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Sail settings ааАбб‚б€аОаЙаКаИ аПаАб€бƒбаА Twist angle аЃаГаОаЛ б‚аВаИбб‚аА аОб‚аНаОбаИб‚аЕаЛбŒаНаО а”аŸ Sheeting angle аЃаГаОаЛ аМаЕаЖаДбƒ аДаИаАаМаЕб‚б€аАаЛбŒаНаОаЙ аПаЛаОбаКаОбб‚бŒбŽ аЛаОаДаКаИ аИ аЛаИаНаИаЕаЙ, баОаЕаДаИаНббŽб‰аЕаЙ аГаАаЛбаОаВб‹аЙ аИ бˆаКаОб‚аОаВб‹аЙ бƒаГаЛб‹ аПаАб€бƒбаА Cloth seams and hems аЈаИб€аИаНаА бˆаВаОаВ б‚аКаАаНаИ аИ аПаОаДаГаИаБаА Cloth width аЈаИб€аИаНаА б‚аКаАаНаИ Seams width аЈаИб€аИаНаА бˆаВаА Leech hem width аЈаИб€аИаНаА аПаОаДаГаИаБаА аЗаАаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Other hem width аЈаИб€аИаНаА аДб€бƒаГаИб… аПаОаДаГаИаБаОаВ Sail mould аŸб€аОб„аИаЛбŒ аПаАб€бƒбаА Luff factor аЄаАаКб‚аОб€ аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Depth а“аЛбƒаБаИаНаА Leech factor аЄаАаКб‚аОб€ аЗаАаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Top profile аПб€аОб„аИаЛбŒ аВаЕб€б…аНаЕаЙ б‡аАбб‚аИ Mid profile at h = аŸб€аОб„аИаЛбŒ бб€аЕаДаНаЕаЙ б‡аАбб‚аИ аНаА h= Bottom profile аŸб€аОб„аИаЛбŒ аНаИаЖаНаЕаЙ б‡аАбб‚аИ error аžбˆаИаБаКаА There was a data printing error аžбˆаИаБаКаА аПаЕб‡аАб‚аИ аДаАаНаНб‹б… There was a development printing error аОбˆаИаБаКаА аПаЕб‡аАб‚аИ аПаАаНаЕаЛаЕаЙ There was a drawing printing error аžбˆаИаБаКаА аПаЕб‡аАб‚аИ аПаАаНаЕаЛаЕаЙ аВ баБаОб€аЕ wrote '%1' а—аАаПаИбаАаН '%1' There was an error writing to the selected file аžбˆаИаБаКаА аЗаАаПаИбаИ аВ аВб‹аБб€аАаНаНб‹аЙ б„аАаЙаЛ deg аГб€аАаДбƒб to &Hand-plotting format аВ б„аОб€аМаАб‚аДаЛб б€бƒб‡аНаОаГаО б‡аЕб€б‡аЕаНаИб sail hull rig аŸаАб€бƒбаНаОаЕ аВаОаОб€бƒаЖаЕаНаИаЕ boat &Window &Close а—аАаКб€б‹б‚бŒ Close &All &Tile &Cascade unknown document type '%1' Open аžб‚аКб€б‹б‚бŒ CFormMould Top profile аŸб€аОб„аИаЛбŒ аВаЕб€б…аНаЕаЙ б‡аАбб‚аИ Middle profile аŸб€аОб„аИаЛбŒ бб€аЕаДаНаЕаЙ б‡аАбб‚аИ Bottom profile аŸб€аОб„аИаЛбŒ аНаИаЖаНаЕаЙ б‡аАбб‚аИ Sail mould аŸб€аОб„аИаЛбŒ аПаАб€бƒбаА &Help аŸаОаМаОб‰бŒ &OK аžаš &Cancel аžб‚аМаЕаНаА Vertical repartition а’аЕб€б‚аИаКаАаЛбŒаНб‹аЙ аПб€аОб„аИаЛбŒ CFormPanelGroup panels CFormPrint &Print аŸаЕб‡аАб‚аАб‚бŒ &Cancel аžб‚аМаЕаНаА Scale CFormRig Rig аŸаАб€бƒбаНаОаЕ аВаОаОб€бƒаЖаЕаНаИаЕ &New ааОаВб‹аЙ sail &definition аЅаАб€аАаКб‚аЕб€аИбб‚аИаКаА аПаАб€бƒбаА 3D &sail аŸаАб€бƒб аВ 3D &Add sail а”аОаБаАаВаИб‚бŒ аПаАб€бƒб &Open аžб‚аКб€б‹б‚бŒ Open &recent аžб‚аКб€б‹б‚бŒ аПб€аЕаДб‹аДбƒб‰аИаЙ &Save аЁаОб…б€аАаНаИб‚бŒ Save &As аЁаОб…б€аАаНаИб‚бŒ аКаАаК &Close а—аАаКб€б‹б‚бŒ &File аЄаАаЙаЛ error аžбˆаИаБаКаА There was an error writing to the selected file аžбˆаИаБаКаА аЗаАаПаИбаИ аВ аВб‹аБб€аАаНаНб‹аЙ б„аАаЙаЛ rig аŸаАб€бƒбаНаОаЕ аВаОаОб€бƒаЖаЕаНаИаЕ &Dimensions а аАаЗаМаЕб€б‹ CFormRigDefBase Rig dimensions Cancel аžб‚аМаЕаНаА OK аžаš Spreaders = SPNB Number of spreaders Spreader height txt_SPH2 txt_SPH1 txt_SPH3 SPH2 SPH3 SPH1 Spreader length SPW3 txt_SPW3 SPW1 txt_SPW1 SPW2 txt_SPW2 Shrouds Cap shroud base width = CSH Lower shroud base width txt_LSB txt_CSH = CSB Cap shroud height txt_CSB = LSB Fore triangle txt_foreI = I txt_foreJ = J Fore triangle base Fore triangle hoist Mast Mast width = MW txt_MW txt_MC = MC Mast cord lbl_MRkD = MRkD Mast rake angle txt_MH txt_MRnd Mast rake = MRkM txt_MRkM Mast height = MH = MRnd Mast round = MRndPos Mast round position Mainsail а“б€аОб‚ lbl_MS_LuffRP @ lbl_MS_LuffR lbl_MS_TackY Y = lbl_MS_TackX X = Tack lbl_MS_LuffL = MSL Luff length а”аЛаИаНаА аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Luff round а’б‹аПбƒаКаЛаОбб‚бŒ аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ lbl_MS_Rake = MSR Luff rake Tack height txt_BAD = BAD Head height = HAD txt_HAD Check All dimensions are in millimeter and angles in degrees Description of rig Rig name CFormSail sail &Print аŸаЕб‡аАб‚аАб‚бŒ data а”аАаНаНб‹аЕ drawing аŸаАаНаЕаЛаИ аВ баБаОб€аЕ development а аАбаКб€аОаЙ аПаАаНаЕаЛаЕаЙ E&xport 3D sail а­аКбаПаОб€б‚ 3D аПаАб€бƒбаА to &DXF аВ DXF б„аОб€аМаАб‚ to &TXT sail аВ TXT б„аОб€аМаАб‚ to &XML sail аВ XML б„аОб€аМаАб‚ Export &development а­аКбаПаОб€б‚ аПаАаНаЕаЛаЕаЙ to &Carlson plotter аВ Carlson аПаЛаОб‚б‚аЕб€ to &Hand-plotting format аВ б„аОб€аМаАб‚аДаЛб б€бƒб‡аНаОаГаО б‡аЕб€б‡аЕаНаИб &Dimensions а аАаЗаМаЕб€б‹ &Mould аŸб€аОб„аИаЛаИ &Patches ааАаКаЛаАаДаКаИ There was a data printing error аžбˆаИаБаКаА аПаЕб‡аАб‚аИ аДаАаНаНб‹б… There was a development printing error аОбˆаИаБаКаА аПаЕб‡аАб‚аИ аПаАаНаЕаЛаЕаЙ There was a drawing printing error аžбˆаИаБаКаА аПаЕб‡аАб‚аИ аПаАаНаЕаЛаЕаЙ аВ баБаОб€аЕ to &SVG to DXF (split) CFormSailDef Sail corners coordinates аšаОаОб€аДаИаНаАб‚б‹ бƒаГаЛаОаВ аПаАб€бƒбаА tack аГаАаЛбаОаВб‹аЙ бƒаГаОаЛ clew аЈаКаОб‚аОаВб‹аЙ бƒаГаОаЛ head б„аАаЛаОаВб‹аЙ бƒаГаОаЛ peak аЗаАаДаНаИаЙ аНаОаК-аБаЕаНаЗаЕаЛбŒаНб‹аЙ бƒаГаОаЛ Sail width measurements CFormSailDefBase Sail definition аЅаАб€аАаКб‚аЕб€аИбб‚аИаКаА аПаАб€бƒбаА OK аžаš Cancel аžб‚аМаЕаНаА Layout аœаАаКаЕб‚ Mitre cut аšб€аОаЙ аПаОаД бƒаГаЛаОаМ 45 аГб€аАаДбƒбаОаВ Cross cut аŸаОаПаЕб€аЕб‡аНб‹аЙ аКб€аОаЙ Twist foot а аАаЗаНаОаВаИаДаНаОбб‚бŒ аПаОаПаЕб€аЕб‡аНаОаГаО аКб€аОб б аНаИаЖаНаЕаЙ аПаАаНаЕаЛбŒбŽ, аПаАб€аАаЛаЛаЕаЛбŒаНаОаЙ аНаИаЖаНаЕаЙ бˆаКаАб‚аОб€аИаНаЕ Horizontal cut а“аОб€аИаЗаОаНб‚аАаЛбŒаНб‹аЙ аКб€аОаЙ Vertical cut а’аЕб€б‚аИаКаАаЛбŒаНб‹аЙ аКб€аОаЙ Number of luff gores аšаОаЛаИб‡аЕбб‚аВаО аКаЛаИаНбŒаЕаВ аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Number of radial gores аšаОаЛаИб‡аЕбб‚аВаО б€аАаДаИаАаЛбŒаНб‹б… аКаЛаИаНбŒаЕаВ Number of sections аšаОаЛаИб‡аЕбб‚аВаО баЕаКб†аИаЙ Radial cut а аАаДаИаАаЛбŒаНб‹аЙ аКб€аОаЙ Sail shape аЄаОб€аМаА аПаАб€бƒбаА % % (аПб€аОб†аЕаНб‚) Top depth а“аЛбƒаБаИаНаА аПаЕб€аЕаДаНаЕаЙ б‡аАбб‚аИаПб€аОб„аИаЛб аПаАб€бƒбаА Mid depth а“аЛбƒаБаИаНаА бб€аЕаДаНаЕаЙ б‡аАбб‚аИ аПб€аОб„аИаЛб аПаАб€бƒбаА Foot depth а“аЛбƒаБаИаНаА аЗаАаДаНаЕаЙ б‡аАбб‚аИ аПб€аОб„аИаЛб аПаАб€бƒбаА Twist angle бƒаГаОаЛ б‚аВаИбб‚аА Sheeting angle аЃаГаОаЛ аМаЕаЖаДбƒ а”аŸ аЛаОаДаКаИ аИ аЛаИаНаИаЕаЙ, баОаЕаДаИаНббŽб‰аЕаЙ аГаАаЛбаОаВб‹аЙ аИ бˆаКаОб‚аОаВб‹аЙ бƒаГаЛб‹ аПаАб€бƒбаА deg аГб€аАаДбƒбаОаВ Cloth б‚аКаАаНбŒ mm аМаМ Cloth width аЈаИб€аИаНаА б‚аКаАаНаИ Leech hem аŸаОаДаГаИаБ аЗаАаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Other hems аŸаОаДаГаИаБ аДб€бƒаГаИб… аКб€аОаМаОаК Seam width аЈаИб€аИаНаА бˆаВаА Sail-ID а˜аДаЕаНб‚аИб„аИаКаАб‚аОб€ ID Sail ID а˜аДаЕаНб‚аИб„аИаКаАб‚аОб€ ID б‚аЕаКбб‚аОаВаОаГаО аОаПаИбаАаНаИб аПаАб€бƒбаА Sail dimensions а аАаЗаМаЕб€аЕаНаИб аПаАб€бƒбаА Luff length а”аЛаИаНаА аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Foot length а”аЛаИаНаА аНаИаЖаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Leech length а”аЛаИаНаА аЗаАаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Gaff length а”аЛаИаНаА аГаАб„аЕаЛб Leech round а’б‹аПбƒаКаЛаОбб‚бŒ (аВаОаГаНбƒб‚аОбб‚бŒ) аЗаАаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Luff round а’б‹аПбƒаКаЛаОбб‚бŒ (аВаОаГаНбƒб‚аОбб‚бŒ) аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Gaff round а’б‹аПбƒаКаЛаОбб‚бŒ аВаЕб€б…аНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ аГаАб„аЕаЛб Gaff angle from luff аЃаГаОаЛ аМаЕаЖаДбƒ аГаАб„аЕаЛаЕаМ аИ аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНаОаЙ Diagonal а”аИаАаГаОаНаАаЛбŒ Sail area аŸаЛаОб‰аАаДбŒ аПаАб€бƒбаА mТВ аКаВ.аМ Compute а аАббб‡аИб‚аАб‚бŒ Round position аŸаОаЛаОаЖаЕаНаИаЕ аМаАаКб. аВб‹аПбƒаКаЛаОбб‚аИ ( аВаОаГаНбƒб‚аОбб‚аИ) Foot round а’б‹аПбƒаКаЛаОбб‚бŒ аНаИаЖаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Rig geometry а“аЕаОаМаЕб‚б€аИб аПаАб€бƒбаНаОаЙ аОбаНаАбб‚аКаИ Distance tack to stem аЃаДаАаЛаЕаНаИаЕ аГаАаЛбаОаВаОаГаО бƒаГаЛаА аОб‚ б„аОб€бˆб‚аЕаВаНб Main sail а“б€аОб‚ Jib аЁб‚аАаКбаЕаЛбŒ Dihedral angle а”аВбƒаГб€аАаНаНб‹аЙ бƒаГаОаЛ Wing аšб€б‹аЛаО Mast / Luff rake аœаАб‡б‚аА/аНаАаКаЛаОаН аМаАб‡б‚б‹ Tack height а’б‹баОб‚аА аГаАаЛбаОаВаОаГаО бƒаГаЛаА Fore triangle hoist I а’б‹баОб‚аА аКб€аЕаПаЛаЕаНаИб бˆб‚аАаГаА аНаА аМаАб‡б‚аЕ аОб‚ аПаАаЛбƒаБб‹ Fore triangle base J а аАббб‚аОбаНаИаЕ аКб€аЕаПаЛаЕаНаИб бˆб‚аАаГаА аНаА аПаАаЛбƒаБаЕ аДаО аМаАб‡б‚б‹ Boat length LOA а“аАаБаАб€аИб‚аНаАб аДаЛаИаНаА аКаОб€аПбƒбаА аЛаОаДаКаИ m2 аКаВ.аМ Sail identifier а˜аДаЕаНб‚аИб„аИаКаАб‚аОб€ аПаАб€бƒбаА Sail name Luff rake Mitre cut 2 Foot hem CRigSailWidget Sail information а˜аНб„аОб€аМаАб†аИб аО аПаАб€бƒбаЕ file б„аАаЙаЛ name а˜аМб Reload аŸаЕб€аЕаЗаАаГб€бƒаЗаИб‚бŒ Remove аЃаДаАаЛаИб‚бŒ Update аžаБаНаОаВаИб‚бŒ error аžбˆаИаБаКаА There was an error reading from the selected file. а‘б‹аЛаА аОаБаНаАб€бƒаЖаЕаНаА аОбˆаИаБаКаА б‡б‚аЕаНаИб аВб‹аБб€аАаНаНаОаГаО б„аАаЙаЛаА CSailDataPrinter Sailcut CAD data sheet аЂаАаБаЛаИб†аА аДаАаНаНб‹б… Sailcut CAD Mainsail а“б€аОб‚ Jib аЁб‚аАаКбаЕаЛбŒ Wing аšб€б‹аЛаО deg Sail type аЂаИаП аПаАб€бƒбаА Cross Cut аŸаОаПаЕб€аЕб‡аНб‹аЙ аКб€аОаЙ Horizontal Cut а“аОб€аИаЗаОаНб‚аАаЛбŒаНб‹аЙ аКб€аОаЙ Radial Cut а аАаДаИаАаЛбŒаНб‹аЙ аКб€аОаЙ sections аЁаЕаКб†аИаИ head gores аšаЛаИаНбŒб аВаЕб€б…аНаЕаЙ б‡аАбб‚аИ аПаАб€бƒбаА luff gores аšаЛаИаНбŒб аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Twist Foot Cut аŸаОаПаЕб€аЕб‡аНб‹аЙ аКб€аОаЙ , аПаАб€аАаЛаЛаЕаЛбŒаНб‹аЙ аКб€аАбŽ аНаИаЖаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Vertical Cut а’аЕб€б‚аИаКаАаЛбŒаНб‹аЙ аКб€аОаЙ Mitre Cut аšб€аОаЙ аПаОаД 45 аГб€аАаДбƒбаОаВ Mitre Cut 2 Sail layout аœаАаКаЕб‚ аПаАб€бƒбаА Rig аŸаАб€бƒбаНаОаЕ аВаОаОб€бƒаЖаЕаНаИаЕ Boat LOA а“аАаБаАб€аИб‚аНб‹аЙ б€аАаЗаМаЕб€ аЛаОаДаКаИ Mast/Luff rake ааАаКаЛаОаН аМаАб‡б‚б‹/бˆб‚аАаГаА Tack position X аŸаОаЛаОаЖаЕаНаИаЕ аГаАаЛбаОаВаОаГаО бƒаГаЛаА X Tack height Y а’б‹баОб‚аА аГаАаЛбаОаВаОаГаО бƒаГаЛаА Y Fore triangle hoist I а’б‹баОб‚аА аКб€аЕаПаЛаЕаНаИб бˆб‚аАаГаА аНаА аМаАб‡б‚аЕ аОб‚ аПаАаЛбƒаБб‹, аВаЕаЛаИб‡аИаНаА L Fore triangle base J аŸб€аОаЕаКб†аИб бˆб‚аАаГаА аНаА аПаАаЛбƒаБбƒ, аВаЕаЛаИб‡аИаНаА J Sail dimensions Luff length а”аЛаИаНаА аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Foot length а”аЛаИаНаА аНаИаЖаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Leech length а”аЛаИаНаА аЗаАаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Gaff length Gaff angle wrt luff аЃаГаОаЛ аНаАаКаЛаОаНаА аВаЕб€б…аНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ аГаАб„аЕаЛб аОб‚аНаОбаИб‚аЕаЛбŒаНаО аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Shape of edges аЄаОб€аМаА аКб€аАаЕаВ Luff round Luff round position аŸаОаЛаОаЖаЕаНаИаЕ аВб‹аПбƒаКаЛаОбб‚аИ аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Foot round а’б‹аПбƒаКаЛаОбб‚бŒ аНаИаЖаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Foot round position аŸаОаЛаОаЖаЕаНаИаЕ аВб‹аПбƒаКаЛаОбб‚аИ аНаИаЖаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Leech round Leech round position аŸаОаЛаОаЖаЕаНаИаЕ аВб‹аПбƒаКаЛаОбб‚аИ аЗаАаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Gaff round а’б‹аПбƒаКаЛаОбб‚бŒ аВаЕб€б…аНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ аГаАб„аЕаЛб Gaff round position аŸаОаЛаОаЖаЕаНаИаЕ аВб‹аПбƒаКаЛаОбб‚аИ аВаЕб€б…аНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ аГаАб„аЕаЛб Sail settings ааАбб‚б€аОаЙаКаИ аПаАб€бƒбаА Twist angle Sheeting angle Cloth seams and hems аЈаИб€аИаНаА бˆаВаОаВ б‚аКаАаНаИ аИ аПаОаДаГаИаБаА Cloth width аЈаИб€аИаНаА б‚аКаАаНаИ Seams width аЈаИб€аИаНаА бˆаВаА Leech hem width аЈаИб€аИаНаА аПаОаДаГаИаБаА аЗаАаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Foot hem width Other hems width Sail mould аŸб€аОб„аИаЛбŒ аПаАб€бƒбаА Luff factor аЄаАаКб‚аОб€ аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Depth а“аЛбƒаБаИаНаА Leech factor аЄаАаКб‚аОб€ аЗаАаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Top profile Mid profile at h = аŸб€аОб„аИаЛбŒ бб€аЕаДаНаЕаЙ б‡аАбб‚аИ аНаА h= Bottom profile аŸб€аОб„аИаЛбŒ аНаИаЖаНаЕаЙ б‡аАбб‚аИ Luff rake CSailDevelPrinter Scale CSailDispGL This system has no OpenGL support. а­б‚аА баИбб‚аЕаМаА аНаЕ аИаМаЕаЕб‚ аПаОаДаДаЕб€аЖаКаИ OpenGL CSailDrawingPrinter Scale CSailPrinter Sailcut CAD data sheet аЂаАаБаЛаИб†аА аДаАаНаНб‹б… Sailcut CAD Mainsail а“б€аОб‚ Jib аЁб‚аАаКбаЕаЛбŒ Wing аšб€б‹аЛаО deg аГб€аАаДбƒб Sail type аЂаИаП аПаАб€бƒбаА Cross Cut аŸаОаПаЕб€аЕб‡аНб‹аЙ аКб€аОаЙ Horizontal Cut а“аОб€аИаЗаОаНб‚аАаЛбŒаНб‹аЙ аКб€аОаЙ Radial Cut а аАаДаИаАаЛбŒаНб‹аЙ аКб€аОаЙ sections аЁаЕаКб†аИаИ head gores аšаЛаИаНбŒб аВаЕб€б…аНаЕаЙ б‡аАбб‚аИ аПаАб€бƒбаА luff gores аšаЛаИаНбŒб аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Twist Foot Cut аŸаОаПаЕб€аЕб‡аНб‹аЙ аКб€аОаЙ , аПаАб€аАаЛаЛаЕаЛбŒаНб‹аЙ аКб€аАбŽ аНаИаЖаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Vertical Cut а’аЕб€б‚аИаКаАаЛбŒаНб‹аЙ аКб€аОаЙ Mitre Cut аšб€аОаЙ аПаОаД 45 аГб€аАаДбƒбаОаВ Sail layout аœаАаКаЕб‚ аПаАб€бƒбаА Rig аŸаАб€бƒбаНаОаЕ аВаОаОб€бƒаЖаЕаНаИаЕ Boat LOA а“аАаБаАб€аИб‚аНб‹аЙ б€аАаЗаМаЕб€ аЛаОаДаКаИ Mast/Luff rake ааАаКаЛаОаН аМаАб‡б‚б‹/бˆб‚аАаГаА Tack position X аŸаОаЛаОаЖаЕаНаИаЕ аГаАаЛбаОаВаОаГаО бƒаГаЛаА X Tack height Y а’б‹баОб‚аА аГаАаЛбаОаВаОаГаО бƒаГаЛаА Y Fore triangle hoist I а’б‹баОб‚аА аКб€аЕаПаЛаЕаНаИб бˆб‚аАаГаА аНаА аМаАб‡б‚аЕ аОб‚ аПаАаЛбƒаБб‹, аВаЕаЛаИб‡аИаНаА L Fore triangle base J аŸб€аОаЕаКб†аИб бˆб‚аАаГаА аНаА аПаАаЛбƒаБбƒ, аВаЕаЛаИб‡аИаНаА J Sail dimensions а аАаЗаМаЕб€б‹ аПаАб€бƒбаА Luff length а”аЛаИаНаА аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Foot length а”аЛаИаНаА аНаИаЖаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Leech length а”аЛаИаНаА аЗаАаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Gaff length а”аЛаИаНаА аГаАб„аЕаЛб Gaff angle wrt luff аЃаГаОаЛ аНаАаКаЛаОаНаА аВаЕб€б…аНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ аГаАб„аЕаЛб аОб‚аНаОбаИб‚аЕаЛбŒаНаО аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Shape of edges аЄаОб€аМаА аКб€аАаЕаВ Luff round а’б‹аПбƒаКаЛаОбб‚бŒ аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Luff round position аŸаОаЛаОаЖаЕаНаИаЕ аВб‹аПбƒаКаЛаОбб‚аИ аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Foot round а’б‹аПбƒаКаЛаОбб‚бŒ аНаИаЖаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Foot round position аŸаОаЛаОаЖаЕаНаИаЕ аВб‹аПбƒаКаЛаОбб‚аИ аНаИаЖаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Leech round а’б‹аПбƒаКаЛаОбб‚бŒ аЗаАаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Leech round position аŸаОаЛаОаЖаЕаНаИаЕ аВб‹аПбƒаКаЛаОбб‚аИ аЗаАаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Gaff round а’б‹аПбƒаКаЛаОбб‚бŒ аВаЕб€б…аНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ аГаАб„аЕаЛб Gaff round position аŸаОаЛаОаЖаЕаНаИаЕ аВб‹аПбƒаКаЛаОбб‚аИ аВаЕб€б…аНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ аГаАб„аЕаЛб Sail settings ааАбб‚б€аОаЙаКаИ аПаАб€бƒбаА Twist angle бƒаГаОаЛ б‚аВаИбб‚аА Sheeting angle аЃаГаОаЛ аМаЕаЖаДбƒ аДаИаАаМаЕб‚б€аАаЛбŒаНаОаЙ аПаЛаОбаКаОбб‚бŒбŽ аЛаОаДаКаИ аИ аЛаИаНаИаЕаЙ, баОаЕаДаИаНббŽб‰аЕаЙ аГаАаЛбаОаВб‹аЙ аИ бˆаКаОб‚аОаВб‹аЙ бƒаГаЛб‹ аПаАб€бƒбаА Cloth seams and hems аЈаИб€аИаНаА бˆаВаОаВ б‚аКаАаНаИ аИ аПаОаДаГаИаБаА Cloth width аЈаИб€аИаНаА б‚аКаАаНаИ Seams width аЈаИб€аИаНаА бˆаВаА Leech hem width аЈаИб€аИаНаА аПаОаДаГаИаБаА аЗаАаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Other hem width аЈаИб€аИаНаА аДб€бƒаГаИб… аПаОаДаГаИаБаОаВ Sail mould аŸб€аОб„аИаЛбŒ аПаАб€бƒбаА Luff factor аЄаАаКб‚аОб€ аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Depth а“аЛбƒаБаИаНаА Leech factor аЄаАаКб‚аОб€ аЗаАаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Mid profile at h = аŸб€аОб„аИаЛбŒ бб€аЕаДаНаЕаЙ б‡аАбб‚аИ аНаА h= Bottom profile аŸб€аОб„аИаЛбŒ аНаИаЖаНаЕаЙ б‡аАбб‚аИ CSailViewerPanel Display parameters аŸаАб€аАаМаЕб‚б€б‹ аВаНаЕбˆаНаЕаГаО аВаИаДаА elevation аŸб€аОб„аИаЛбŒ azimuth ааЗаИаМбƒб‚ Controls аЃаПб€аАаВаЛаЕаНаИаЕ Reset view аš аИбб…аОаДаНаОаМбƒ аВаИаДбƒ Labeling аЃбб‚аАаНаОаВаКаА аМаЕб‚аОаК Zoom in аЃаВаЕаЛаИб‡аИб‚бŒ Zoom out аЃаМаЕаНбŒбˆаИб‚бŒ deg а“б€аАаДбƒбаОаВ CSailViewerTabs shaded view а’аНаЕбˆаНаИаЙ аВаИаД wireframe view а’ аКаОаНб‚бƒб€аАб… CWidgetProfile Luff shape аЄаОб€аМаА аПаЕб€аЕаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ Depth а“аЛбƒаБаИаНаА % % Leech shape аЄаОб€аМаА аЗаАаДаНаЕаЙ бˆаКаАб‚аОб€аИаНб‹ degrees cord Dialog XmlReaderTempl error аžбˆаИаБаКаА There was an error reading from the selected file. аžаБаНаАб€бƒаЖаЕаНаА аОбˆаИаБаКаА б‡б‚аЕаНаИб аВб‹аБб€аАаНаНаОаГаО б„аАаЙаЛаА sailcut-1.3.5/src/ts/sailcut_fr.ts0000644000175000007640000025205511215262321017030 0ustar sharkyjerryweb CBoatElementWidget Sail information Informations sur la voile file fichier name nom Reload Recharger Remove Retirer Update Mettre У  jour Element information Information sur l'УЉlУЉment CFileIO Open Ouvrir Save Enregistrer CFileWriter error erreur There was an error writing to the selected file. Une erreur s'est produite lors de l'УЉcriture du fichier. Open Ouvrir There was an error reading from the selected file. Il y a eu une erreur de lecture du fichier choisi. Save Enregistrer CFormBoat boat bateau &Add &Ajouter file fichier Open Ouvrir CFormHull hull coque &Dimensions &Dimensions CFormHullDefBase Dialog Dialogue Deck and bottom Pont et fond Planking BordУЉ Automatic planking Bordage automatique lower plank angle angle du bordУЉ infУЉrieur top plank angle angle du bordУЉ supУЉrieur Number of planks Nombre de bordУЉs Bottom Fond Bottom sweep angle Angle d'avance du fond % % Max Width Largeur maximum Bottom dead rise angle Angle du fond Forward shape Forme avant Length Longueur Forward height Hauteur avant Max Width position Position de la largeur maximum Side slope angle Inclinaison latУЉrale Stem angle Angle de l'УЉtrave Transom angle Angle du tableau Aft height Hauteur arriУЈre Aft width Largeur arriУЈre Aft shape Forme arriУЈre Hull name Nom de la coque Deck Pont Forward height Hauteur avant Side Planks BordУЉs Plank 5 BordУЉ 5 Chine angle angle du bouchain Sweep angle angle d'avance Plank angle angle du bordУЉ Plank 4 BordУЉ 4 Plank 3 BordУЉ 3 Plank 2 BordУЉ 2 Plank 1 BordУЉ 1 Plank 6 BordУЉ 6 Check VУЉrifier OK OK Cancel Annuler Dimensions are in millimeters and angles in degrees measured from horizontal Les dimensions sont en millimУЈtres et les angles en degrУЉs par rapport У  l'horizontale Planks BordУЉs txt_BBW txt_BfwdHeight txt_BLWL txt_BaftW txt_BaftHeight Dead rise angle Angle du fond txt_HullID txt_DaftHeight txt_DfwdHeight Side angle CFormMain to &DXF &DXF to &TXT sail voile &TXT to &XML sail voile &XML &New &Nouveau &Open &Ouvrir &Save &Enregistrer Save &As Enregistrer &sous &Quit &Quitter &Dimensions &Dimensions &Mould &Moule &Patches &Renforts &Rig &GrУЉement &File &Fichier &View &Vue &Help &Aide About Sailcut CAD A propos de Sailcut CAD error erreur There was an error writing to the selected file Une erreur s'est produite lors de l'УЉcriture du fichier About &Qt A propos de &Qt About &Sailcut CAD A propos de &Sailcut CAD to &Carlson plotter table traУЇante &Carlson shaded view vue rendu 3D wireframe view vue fil de fer development dУЉveloppement created new sail nouvelle voile crУЉУЉe E&xport 3D sail E&xport voile 3D Export &development Export &dУЉveloppement Sailcut CAD &Handbook &Manuel de Sailcut CAD Open &recent Ouvrir fichier &rУЉcent loaded '%1' chargУЉ '%1' error loading '%1' erreur de chargement '%1' wrote '%1' УЉcrit '%1' There was a data printing error Erreur lors de l'impression des donnУЉes There was a development printing error Erreur lors de l'impression du dУЉveloppement There was a drawing printing error Erreur lors de l'impression du dessin data donnУЉes drawing dessin develop dУЉveloppement &Print &Imprimer Sail type Type de voile Mainsail Grand-voile Jib Foc Sail layout Type de coupe Cross Cut Coupe transverse Horizontal Cut Coupe horizontale Radial Cut Coupe radiale Twist Foot Cut Coupe twist Foot Vertical Cut Coupe verticale Mitre Cut Coupe У  mitre sections, sections, head gores. fuseaux de tУЊte. Rig GrУЉement Boat LOA Longueur du bateau Fore triangle hoist I Hauteur I du triangle avant Fore triangle base J Base J du triangle avant Tack position X Position X de l'amure Tack height Y Hauteur Y de l'amure Sail dimensions Dimensions de la voile Luff length Longueur guindant Mast rake QuУЊte du mat Gaff angle wrt luff Angle vergue / guindant Gaff length Longueur vergue Foot length Longueur bordure Leech length Longueur chute Shape of edges Forme des bords Luff round Rond du guindant Gaff round Rond de la vergue Leech round Rond de la chute Foot round Rond de la bordure Luff round position Position du rond de guindant Gaff round position Position du rond de la gaffe Leech round position Position du rond de chute Foot round position Position du rond de bordure Sail settings RУЉglage de la voile Twist angle Angle de vrillage Sheeting angle Angle d'ouverture Cloth seams and hems Tissu, coutures et ourlets Cloth width Largeur du tissu Seams width Largeur des coutures Leech hem width Largeur pour ourlet chute Other hem width Largeur pour autres ourlets Sail mould Moule de voile Luff factor Forme guindant Depth Creux Leech factor Forme chute Top profile Profil supУЉrieur Mid profile at h = Profil mУЉdian У  h = Bottom profile Profil infУЉrieur Language Langue Mast/Luff rake QuУЊte du mУЂt / guidant head gores, fuseaux de tУЊte, luff gore. fuseau cotУЉ guindant. Wing Aile luff gores. fuseaux de guindant. E&xport &development E&xport dУЉveloppement to &hand-plotting format format coupe &manuelle deg deg to &Hand-plotting format pour traУЇage &manuel sail voile hull coque rig grУЉement boat bateau &Window F&enУЊtre &Close &Fermer Close &All &Tout fermer &Tile &Mosaic &Cascade &Cascade unknown document type '%1' Document inconnu type '%1' Open Ouvrir CFormMould &Cancel &Annuler Vertical repartition RУЉpartition verticale Sail mould Moule de voile &Help &Aide &OK &OK Top profile Profil supУЉrieur Middle profile Profil mУЉdian Bottom profile Profil infУЉrieur CFormPanelGroup panels panneau CFormPrint &Print &Imprimer &Cancel &Annuler Scale Echelle CFormRig &New &Nouveau sail &definition &dУЉfinition de voile 3D &sail &voile 3D &Add sail &Ajouter une voile &Open &Ouvrir &Save &Enregistrer Save &As Enregistrer &sous &Close &Fermer &File &Fichier error erreur There was an error writing to the selected file Une erreur s'est produite lors de l'УЉcriture du fichier Rig GrУЉement Open &recent Ouvrir fichier &rУЉcent rig grУЉement &Dimensions &Dimensions CFormRigDefBase Rig dimensions Dimension du grУЉement Cancel Annuler OK OK Spreaders Barres de flУЈche = SPNB = SPNB Number of spreaders Nombre de barres de flУЈche Spreader height Hauteur barre de flУЈche txt_SPH2 txt_SPH1 txt_SPH3 SPH2 SPH2 SPH3 SPH3 SPH1 SPH1 Spreader length Longueur barre de flУЈche SPW3 SPW3 txt_SPW3 SPW1 SPW1 txt_SPW1 SPW2 SPW2 txt_SPW2 Shrouds Hauban Cap shroud base width Base du hauban de tУЊte = CSH = CSH Lower shroud base width Base bas hauban txt_LSB txt_CSH = CSB = CSB Cap shroud height Hauteur hauban de tУЊte txt_CSB = LSB = LSB Fore triangle Triangle avant txt_foreI = I = I txt_foreJ = J = J Fore triangle base Base triangle avant Fore triangle hoist Hauteur triangle avant Mast MУЂt Mast width Largeur du mУЂt = MW = MW txt_MW txt_MC = MC = MC Mast cord Corde du mУЂt lbl_MRkD = MRkD = MRkD Mast rake angle Angle de quУЊte du mУЂt txt_MH txt_MRnd Mast rake QuУЊte du mУЂt = MRkM = MRkM txt_MRkM Mast height Hauteur du mУЂt = MH = MH = MRnd = MRnd Mast round Rond du mУЂt = MRndPos = MRndPos Mast round position Position du rond du mУЂt Mainsail Grand-voile lbl_MS_LuffRP @ @ lbl_MS_LuffR lbl_MS_TackY Y = Y = lbl_MS_TackX X = X = Tack Amure lbl_MS_LuffL = MSL = MSL Luff length Longueur du guindant Luff round Rond du guindant lbl_MS_Rake = MSR = MSR Luff rake Inclinaison du guindant Tack height Hauteur de l'amure txt_BAD = BAD = BAD Head height Hauteur de tУЊte = HAD = HAD txt_HAD Check VУЉrifier All dimensions are in millimeter and angles in degrees Toutes les dimensions sont en millimetre et les angles en degrУЉs Rig ID Identification du grУЉement Description of rig Description du grУЉement Rig name Nom du grУЉement CFormSail sail voile &Print &Imprimer data donnУЉes drawing dessin development dУЉveloppement E&xport 3D sail E&xport voile 3D to &DXF &DXF to &TXT sail voile &TXT to &XML sail voile &XML Export &development Export &dУЉveloppement to &Carlson plotter table traУЇante &Carlson to &Hand-plotting format pour traУЇage &manuel &Dimensions &Dimensions &Mould &Moule &Patches &Renforts error erreur There was a data printing error Erreur lors de l'impression des donnУЉes There was a development printing error Erreur lors de l'impression du dУЉveloppement There was a drawing printing error Erreur lors de l'impression du dessin to &SVG &SVG to DXF (split) DXF (divisУЉ) CFormSailDef Sail corners coordinates CoordonnУЉes des coins de la voile tack amure clew УЉcoute head tУЊte peak pic IRC width measurements Largeurs mesurУЉes IRC Sail width measurements Mesures de la largeur de la voile CFormSailDefBase Sail definition DУЉfinition de la voile Sail dimensions Dimensions de la voile mm mm Round position Position du rond Luff length Longueur guindant Foot length Longueur bordure Leech length Longueur chute Gaff length Longueur vergue Leech round Rond de la chute Gaff round Rond de la vergue Luff round Rond du guindant Foot round Rond de la bordure % % deg deg Gaff angle from luff Angle vergue / guindant Rig geometry GУЉomУЉtrie du grУЉement Fore triangle base J Base J du triangle avant Tack height Hauteur du point d'amure Distance tack to stem Distance УЉtrave-amure Main sail Grand-voile Jib Foc Fore triangle hoist I Hauteur I du triangle avant Boat length LOA Longueur du bateau Mast / Luff rake QuУЊte du mУЂt / guidant Cloth Tissus Seam width Largeur coutures Cloth width Largeur tissu Layout Coupe Mitre cut Coupe mУЎtre Cross cut Coupe transversale Twist foot Coupe twist Horizontal cut Coupe horizontale Number of sections Nbre de sections Number of radial gores Nbre de fuseaux radiaux Radial cut Coupe radiale Vertical cut Coupe verticale Sail shape Forme de voile Top depth Creux en haut Mid depth Creux au milieu Foot depth Creux de bordure Twist angle Angle de vrillage OK OK Cancel Annuler Leech hem Ourlet chute Other hems Ourlet autres Sheeting angle Ouverture de la voile mТВ mТВ Sail area Surface de la voile Diagonal Diagonale Compute Calculer Sail ID Identification de la voile Number of luff gores Nombre de fuseaux guindant Dihedral angle Angle de diУЈdre Wing Aile Sail identifier Identifiant de la voile m2 m2 Luff rake QuУЊte du guindant Mitre cut 2 Coupe mУЎtre 2 Foot hem Ourlet bordure Sail name Nom de la voile CRigSailWidget Sail information Informations sur la voile file fichier name nom Remove Retirer Update Mettre a jour Reload Recharger error erreur There was an error reading from the selected file. Une erreur s'est produite lors de la lecture du fichier sУЉlectionnУЉ. CSailDataPrinter Sailcut CAD data sheet DonnУЉes Sailcut CAD Mainsail Grand-voile Jib Foc Wing Aile deg deg Sail type Type de voile Cross Cut Coupe transverse Horizontal Cut Coupe horizontale Radial Cut Coupe radiale sections sections head gores fuseaux de tУЊte luff gores fuseaux de guindant Twist Foot Cut Coupe twist foot Vertical Cut Coupe verticale Mitre Cut Coupe У  mitre Mitre Cut 2 Coupe У  mУЎtre 2 Sail layout Type de coupe Rig GrУЉement Boat LOA Longueur du bateau Mast/Luff rake QuУЊte du mУЂt / guidant Tack position X Position X de l'amure Tack height Y Hauteur Y de l'amure Fore triangle hoist I Hauteur I du triangle avant Fore triangle base J Base J du triangle avant Sail dimensions Dimensions de la voile Luff length Longueur guindant Foot length Longueur bordure Leech length Longueur chute Gaff length Longueur vergue Gaff angle wrt luff Angle vergue / guindant Shape of edges Forme des bords Luff round Rond du guindant Luff round position Position du rond de guindant Foot round Rond de la bordure Foot round position Position du rond de bordure Leech round Rond de la chute Leech round position Position du rond de chute Gaff round Rond de la vergue Gaff round position Position du rond de la gaffe Sail settings RУЉglage de la voile Twist angle Angle de vrillage Sheeting angle Angle de tire Cloth seams and hems Tissu, coutures et ourlets Cloth width Largeur du tissu Seams width Largeur des coutures Leech hem width Largeur pour ourlet chute Foot hem width Largeur pour ourlet bordure Other hems width Largeur pour autres ourlets Sail mould Moule de voile Luff factor Forme guindant Depth Creux Leech factor Forme chute Top profile Profil supУЉrieur Mid profile at h = Profil mУЉdian У  h = Bottom profile Profil infУЉrieur Luff rake CSailDevelPrinter Scale Echelle CSailDispGL This system has no OpenGL support. OpenGL n'est pas disponible sur cette machine. CSailDrawingPrinter Scale Echelle CSailPrinter Sailcut CAD data sheet DonnУЉes Sailcut CAD Mainsail Grand-voile Jib Foc Wing Aile deg deg Sail type Type de voile Cross Cut Coupe transverse Horizontal Cut Coupe horizontale Radial Cut Coupe radiale sections sections head gores fuseaux de tУЊte luff gores fuseaux de guindant Twist Foot Cut Coupe twist foot Vertical Cut Coupe verticale Mitre Cut Coupe У  mitre Sail layout Type de coupe Rig GrУЉement Boat LOA Longueur du bateau Mast/Luff rake QuУЊte du mУЂt / guidant Tack position X Position X de l'amure Tack height Y Hauteur Y de l'amure Fore triangle hoist I Hauteur I du triangle avant Fore triangle base J Base J du triangle avant Sail dimensions Dimensions de la voile Luff length Longueur guindant Foot length Longueur bordure Leech length Longueur chute Gaff length Longueur vergue Gaff angle wrt luff Angle vergue / guindant Shape of edges Forme des bords Luff round Rond du guindant Luff round position Position du rond de guindant Foot round Rond de la bordure Foot round position Position du rond de bordure Leech round Rond de la chute Leech round position Position du rond de chute Gaff round Rond de la vergue Gaff round position Position du rond de la gaffe Sail settings RУЉglage de la voile Twist angle Angle de vrillage Sheeting angle Ouverture de la voile Cloth seams and hems Tissu, coutures et ourlets Cloth width Largeur du tissu Seams width Largeur des coutures Leech hem width Largeur pour ourlet chute Other hem width Largeur pour autres ourlets Sail mould Moule de voile Luff factor Forme guindant Depth Creux Leech factor Forme chute Top profile Profil supУЉrieur Mid profile at h = Profil mУЉdian У  h = Bottom profile Profil infУЉrieur CSailViewerPanel Display parameters ParamУЈtres d'affichage elevation УЉlУЉvation azimuth azimuth Controls Controles Reset view RУЉinitialiser la vue Labeling Etiquettes Zoom in Zoom avant Zoom out Zoom arriУЈre deg deg CSailViewerTabs shaded view vue rendu 3D wireframe view vue fil de fer CWidgetProfile % % Luff shape Forme guindant Depth Creux Leech shape Forme chute degrees degrУЉs cord corde Dialog Dialog Dialogue All panels in a single file Tous les panneaux dans un seul fichier One file per panel Un fichier par panneau XmlReaderTempl error erreur There was an error reading from the selected file. Une erreur s'est produite У  la lecture du fichier sУЉlectionnУЉ. sailcut-1.3.5/src/boatdef-panel.h0000644000175000007640000000644211177775326016573 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef BOATDEF_PANEL_H #define BOATDEF_PANEL_H #include "sailcpp/boatdef.h" #include class QGroupBox; class QTabWidget; class QLabel; class QLineEdit; class QPushButton; class QSpinBox; /** * A widget for displaying info about a CVector3d. */ class CVector3dWidget : public QWidget { Q_OBJECT public: CVector3dWidget(QWidget *parent); CVector3d getVector(); void setVector(const CVector3d &v); protected: /** The spin boxes. */ vectorspinBox; }; /** A widget for displaying information about a boat element. */ class CBoatElementWidget : public QWidget { Q_OBJECT public: CBoatElementWidget(QWidget *parent); void setElement(const CBoatElement &newelement); public slots: virtual void languageChange(); signals: /** Signals that the user hit the "Remove" button. */ void signalRemove(); /** Signals that the element was modified. */ void signalUpdate(const CBoatElement& newelement); protected slots: void slotReload(); void slotRemove(); void slotUpdate(); protected: /** the boat element we are operating on */ CBoatElement element; /** groupbox for the element info */ QGroupBox* grpInfo; /** label for the filename */ QLabel* lblFile; /** label for the element name */ QLineEdit* txtName; /** static label saying "file" */ QLabel* lblFileStatic; /** static label saying "name" */ QLabel* lblNameStatic; /** widget for the origin */ CVector3dWidget *wdgOrigin; /** button to accept changes to the CBoatElement */ QPushButton *btnUpdate; /** button to reload this element from file */ QPushButton *btnReload; /** button to remove this CBoatElement */ QPushButton *btnRemove; }; /** A panel displaying one tab per element of a given * boat definition. */ class CBoatDefPanel : public QWidget { Q_OBJECT public: CBoatDefPanel(QWidget *parent); void setDef(const CBoatDef &newdef); public slots: virtual void languageChange(); virtual void slotRemove(); virtual void slotUpdate(const CBoatElement& newelement); signals: /** Signals that the boat definition was modified. */ void signalUpdate(const CBoatDef& newdef); protected: /** the tabbed widget, with one tab per boat element */ QTabWidget *tabs; /** the widgets for the boat element parameters */ vector elementwidget; /** the boat definition we are operating one */ CBoatDef def; }; #endif sailcut-1.3.5/src/formpanelgroup.cpp0000644000175000007640000000440211177775326017457 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "formpanelgroup.h" #include "sailtreemodel.h" #include #include #include /** * Constructs a window to display a collection of panels. * * @param myPrefs the user preferences * @param parent the parent widget */ CFormPanelGroup::CFormPanelGroup(CPrefs *myPrefs, QWidget *parent) : CFormDocumentTmpl (myPrefs, parent) { setMinimumSize( QSize( 400, 400 ) ); // create main widget setupMainWidget(); // set language languageChange(); // set initial definition setDef(def); } /** * Sets the strings of the subwidgets using the current * language. */ void CFormPanelGroup::languageChange() { setWindowTitle( tr("panels") ); tabs->languageChange(); } /** * Replaces the current sail definition. * * @param newdef */ void CFormPanelGroup::setDef(const CPanelGroup& newdef) { def = newdef; tabs->setObject(def); treeview->setModel(new CSailTreeModel(def, "panelgroup")); #if QT_VERSION >= 0x040200 treeview->expandAll(); #endif // treeview->resizeColumnToContents(0); } /** * Creates the main widget */ void CFormPanelGroup::setupMainWidget() { tabs = new CSailViewerTabs(this); treeview = new QTreeView(this); QSplitter *splitter = new QSplitter(this); splitter->addWidget(tabs); splitter->addWidget(treeview); QHBoxLayout *layout = new QHBoxLayout(this); layout->addWidget(splitter); } sailcut-1.3.5/src/prefs.cpp0000644000175000007640000000313011177775326015533 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "prefs.h" /** * Removes an entry from the Most Recently Used files. * * @param oldEntry The entry to be removed */ void CPrefsMru::removeEntry( const QString& oldEntry ) { for (unsigned int i = 0; i < size(); i++) if ( at(i) == oldEntry ) erase(begin()+i); } /** * Puts an entry at the top of the Most Recently Used files. * * @param newEntry The entry to be added */ void CPrefsMru::touchEntry( const QString &newEntry ) { removeEntry(newEntry); insert(begin(),newEntry); // limit the number of entries if (size() > 9) resize(9); } /** * Constructs a class holding the user's preferences. */ CPrefs::CPrefs() : helpWindowWidth(800), helpWindowHeight(600), mainWindowWidth(800), mainWindowHeight(600) {} sailcut-1.3.5/src/formboat.cpp0000644000175000007640000001105311177775326016230 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "formboat.h" #include "sailcutqt.h" #include "boatdef-panel.h" #include "sailcpp/hullworker.h" #include "sailcpp/sailworker.h" #include "sailcpp/rigworker.h" #include "sailwriter-xml.h" #include #include #include #include /** * The constructor. * * @param myPrefs the user preferences * @param parent the parent widget */ CFormBoat::CFormBoat(CPrefs *myPrefs, QWidget *parent) : CFormDocumentTmpl(myPrefs, parent) { // create main widget setupMainWidget(); // create menu bar setupMenuBar(); // set language languageChange(); // set initial definition setDef(def); } /** * Adds a new element to the boat. * * @param newfile name of the file to add */ void CFormBoat::add(const QString &newfile) { CBoatElement element; if (CSailDefXmlWriter().isDocument(newfile)) { CSailDef saildef = CSailDefXmlWriter().read(newfile); (CPanelGroup&)element = CSailWorker(saildef).makeSail(); element.type = SAILDEF; } else if (CHullDefXmlWriter().isDocument(newfile)) { CHullDef hulldef = CHullDefXmlWriter().read(newfile); (CPanelGroup&)element = CHullWorker(hulldef).makeHull(); element.type = HULLDEF; } else if (CRigDefXmlWriter().isDocument(newfile)) { CRigDef rigdef = CRigDefXmlWriter().read(newfile); (CPanelGroup&)element = CRigWorker(rigdef).makeRig(); element.type = RIGDEF; } else if (CPanelGroupXmlWriter().isDocument(newfile)) { (CPanelGroup&)element = CPanelGroupXmlWriter().read(newfile); element.type = PANELGROUP; } else { throw invalid_argument("CFormBoat::add : unknown document type"); } element.filename = newfile.toStdString(); def.push_back(element); setDef(def); } /** * Sets the strings of the subwidgets using the current * language. */ void CFormBoat::languageChange() { setWindowTitle( tr("boat") ); menuAdd->setTitle( tr("&Add") ); actionAddFile->setText( tr("file") ); defpanel->languageChange(); tabs->languageChange(); } /** * We got a new boat definition, update widgets. * * @param newdef The new boat definition */ void CFormBoat::setDef(const CBoatDef &newdef) { def = newdef; defpanel->setDef(def); tabs->setObject(def.makePanelGroup()); } /** * Creates the main widget */ void CFormBoat::setupMainWidget() { tabs = new CSailViewerTabs(this); defpanel = new CBoatDefPanel(this); QSplitter *splitter = new QSplitter(Qt::Horizontal, this); splitter->addWidget(tabs); splitter->addWidget(defpanel); QHBoxLayout *layout = new QHBoxLayout(this); layout->addWidget(splitter); connect(defpanel, SIGNAL(signalUpdate(const CBoatDef& )), this, SLOT(slotUpdate(const CBoatDef& ))); } /** * Creates the menu bar */ void CFormBoat::setupMenuBar() { menuAdd = new QMenu(this); actionAddFile = menuAdd->addAction( "", this, SLOT( slotAdd() ) ); extraFileMenus.push_back(menuAdd); } /** * The file menu's "Add" item was clicked. */ void CFormBoat::slotAdd() { QString filter = "Sailcut CAD files ("; filter += QString("*") + CSailDefXmlWriter().getExtension(); filter += QString(" *") + CHullDefXmlWriter().getExtension(); filter += QString(" *") + CRigDefXmlWriter().getExtension(); filter += QString(" *") + CPanelGroupXmlWriter().getExtension(); filter += ")"; QString newfile = QFileDialog::getOpenFileName(0, tr("Open"), "", filter); if ( !newfile.isNull() ) add(newfile); } /** * The boat definition was modified by the user. * * @param newdef The new boat definition */ void CFormBoat::slotUpdate(const CBoatDef& newdef) { setDef(newdef); } sailcut-1.3.5/src/formhulldefbase.ui0000644000175000007640000016557611117553110017413 0ustar sharkyjerryweb Robert lainУЉ CFormHullDefBase 0 0 641 567 640 555 Dialog 5 5 4 10 Qt::Horizontal 381 31 Check OK Cancel 50 false 1 Deck and bottom 9 6 50 false Planking 9 6 Automatic planking true false Qt::Horizontal QSizePolicy::MinimumExpanding 31 20 60 22 Qt::AlignHCenter 45 30 40 lower plank angle 0 0 0 0 60 22 Qt::AlignHCenter 45 85 0 0 0 0 60 22 Qt::AlignHCenter 6 1 2 top plank angle Number of planks 0 0 0 0 Bottom 9 6 0 0 0 0 60 22 Qt::AlignHCenter 60 Qt::Horizontal 211 20 0 0 0 0 Bottom sweep angle 0 0 0 0 20 22 % 0 0 0 0 60 22 Qt::AlignHCenter 80 20 50 0 0 0 0 60 22 Qt::AlignHCenter 50 0 0 0 0 60 22 Qt::AlignHCenter 90 45 80 0 0 0 0 60 22 txt_BBW Max Width 0 0 0 0 60 22 txt_BfwdHeight 0 0 0 0 60 22 txt_BLWL 0 0 0 0 60 22 txt_BaftW 60 22 Qt::AlignHCenter 9 2 0 0 0 0 60 22 Qt::AlignHCenter 9 2 0 0 0 0 60 22 Qt::AlignHCenter 30 12 0 0 0 0 60 22 txt_BaftHeight 0 0 0 0 60 22 Qt::AlignHCenter 99 45 80 0 0 0 0 Dead rise angle Forward shape Length 0 0 0 0 Forward height Max Width position 0 0 0 0 Chine angle Stem angle Transom angle 0 0 0 0 Aft height Aft width Aft shape QFrame::StyledPanel QFrame::Plain 6 6 400 22 txt_HullID 0 0 0 0 60 20 Hull name Deck 9 6 0 0 0 0 60 22 Qt::AlignHCenter 24 0 12 0 0 0 0 60 22 txt_DaftHeight 0 0 0 0 60 22 txt_DfwdHeight Forward height Side angle Aft height Planks 9 6 Plank 6 3 5 Chine angle Sweep angle Plank angle Aft height Forward height 0 0 0 0 110 22 100 0 0 0 0 60 22 0 0 0 0 60 22 0 0 0 0 60 22 0 0 0 0 110 22 Plank 5 3 5 Chine angle Sweep angle Plank angle Aft height Forward height 0 0 0 0 110 22 100 0 0 0 0 60 22 0 0 0 0 60 22 0 0 0 0 60 22 0 0 0 0 110 22 Plank 4 3 5 Chine angle Sweep angle Plank angle Aft height Forward height 0 0 0 0 110 22 100 0 0 0 0 60 22 0 0 0 0 60 22 0 0 0 0 60 22 0 0 0 0 110 22 Plank 3 3 5 Chine angle Sweep angle Plank angle Aft height Forward height 0 0 0 0 110 22 100 0 0 0 0 60 22 0 0 0 0 60 22 0 0 0 0 60 22 0 0 0 0 110 22 Plank 1 3 5 Chine angle Sweep angle Plank angle Aft height Forward height 0 0 0 0 110 22 100 0 0 0 0 60 22 0 0 0 0 60 22 0 0 0 0 60 22 0 0 0 0 110 22 Plank 2 3 5 0 0 0 0 110 22 0 0 0 0 60 22 0 0 0 0 60 21 0 0 0 0 60 22 0 0 0 0 110 22 100 Forward height Aft height Plank angle Sweep angle Chine angle Qt::Vertical 20 20 0 0 0 0 620 25 75 true QFrame::StyledPanel QFrame::Raised Dimensions are in millimeters and angles in degrees measured from horizontal Qt::AlignCenter 4 tabWidget txt_HullID txt_BLWL txt_DfwdHeight txt_DaftHeight txt_BBW spinBox_BBWPos txt_BaftW spinBox_StemA txt_BfwdHeight txt_BaftHeight spinBox_BDeadriseA spinBox_BSweepA spinBox_NBPlank checkBox_AutoPlank spinBox_TopPlankA spinBox_LowPlankA btnOK btnCancel spinBox_1_1 spinBox_1_2 spinBox_1_3 spinBox_1_4 spinBox_1_5 spinBox_1_6 spinBox_1_10 spinBox_1_9 spinBox_1_8 spinBox_1_7 spinBox_1_11 spinBox_1_15 spinBox_1_14 spinBox_1_13 spinBox_1_12 spinBox_1_16 spinBox_1_20 spinBox_1_19 spinBox_1_18 spinBox_1_17 spinBox_1_21 spinBox_1_25 spinBox_1_24 spinBox_1_23 spinBox_1_22 spinBox_1_26 spinBox_1_30 spinBox_1_29 spinBox_1_28 spinBox_1_27 sailcut-1.3.5/src/sailviewer-tabs.h0000644000175000007640000000246611177775326017175 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SAILVIEWER_TABS_H #define SAILVIEWER_TABS_H #include #include "sailviewer-panel.h" /** Collection of tabs holding several CSailViewerPanel. */ class CSailViewerTabs : public QTabWidget { Q_OBJECT public: CSailViewerTabs(QWidget *parent); void addViewer(CSailViewerPanel *viewer); void setObject(const CPanelGroup &obj); public slots: virtual void languageChange(); public: /** the widgets of each view */ vector panel; }; #endif sailcut-1.3.5/src/prefs.h0000644000175000007640000000327211177775326015207 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef PREFS_H #define PREFS_H #include #include using namespace std; /** * A list of most recently used (MRU) files. */ class CPrefsMru : public vector { public: /** Construct a new list of Most Recently Used (MRU) files. */ CPrefsMru() {} ; void touchEntry(const QString& newentry); void removeEntry(const QString& oldentry); }; /** * A class used to store a user's preferences. */ class CPrefs { public: CPrefs(); /** The most recently used documents. */ CPrefsMru mruDocuments; /** The width of the help window */ int helpWindowWidth; /** The height of the help window */ int helpWindowHeight; /** The width of the main window */ int mainWindowWidth; /** The height of the main window */ int mainWindowHeight; /** The preferred language. */ QString language; }; #endif sailcut-1.3.5/src/sailpainter.h0000644000175000007640000000505411177775326016403 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SAILPAINTER_H #define SAILPAINTER_H #include #include class CSide; class CPanel; class CPanelLabel; class CPanelGroup; /** A sail painter. * * @see CSailDispLabel */ class CSailPainter : public QPainter { public: /** Construct a new sail painter. * * @param dev the paint device we are operating on */ CSailPainter(QPaintDevice *dev) : QPainter(dev) {}; void draw(const CPanel &panel); void draw(const CPanelGroup &sail); void drawArrowLabel(const CPoint3d &pDisp, const QStringList &lst, const real angle); void drawCoord(const CPoint3d &p, const real angle); void drawDelta(const CPoint3d &pDisp, const CVector3d &vValue, const real angle); void drawCross(const CPoint3d &p, const real size); void drawTextCentered(const CPoint3d &p, const QString &str); void drawTextCentered(const CPoint3d &p, const QStringList &lst); void drawLabels(const CPanel &panel); void drawLabels(const CPanelGroup &sail); void drawMarkers(const CPanel &panel); void drawMarkers(const CPanelGroup &sail); void setFontSize(const real size, const real zoom); void setWindow(const CRect3d& lRect); CVector3d textSize(const QStringList &lst); CRect3d viewRect() const; }; /** A text painter. */ class CTextPainter : public CSailPainter { public: CTextPainter(QPaintDevice *pd); void printReset(); void printHeader(const QString title); void printDataSection(const QString title); void printDataLine(const QString title, const QString data0 = "", const QString data1 = "", const QString data2 = ""); protected: /** current x offset for text output */ real xPos; /** current y offset for text output */ real yPos; }; #endif sailcut-1.3.5/src/formprint.cpp0000644000175000007640000001461711177775326016450 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "formprint.h" #include "sailpainter.h" #include "sailprinter.h" #include #include #include #include #include #include #include #include #include /** Construct a new print preview label. * * @param frm the parent print form */ CPrintLabel::CPrintLabel(CFormPrint *frm) : form(frm), resizing(false) { QPalette pal = palette(); pal.setColor( QPalette::Background, Qt::white ); setPalette( pal ); // set the initial size QRect print = form->printDevice.pageRect(); real rprint = real(print.width()) / real(print.height()); if (rprint > 1) { setMinimumSize( QSize( 375, 250 ) ); } else { setMinimumSize( QSize( 250, 375 ) ); } } /** Print the current page. */ void CPrintLabel::paintEvent(QPaintEvent *) { QRect print = form->printDevice.pageRect(); // erase viewport CTextPainter painter(this); QRect rect = painter.viewport(); painter.eraseRect(rect); // draw print preview real viewScale = real(heightMM()) / real(form->printDevice.heightMM()); form->printEngine->print(&painter, page, scale * viewScale, form->printFontSize * viewScale); } /** Receive a resize event. */ void CPrintLabel::resizeEvent (QResizeEvent *) { QRect print = form->printDevice.pageRect(); if (resizing || !print.width() || !print.height() || !widthMM() || !heightMM()) return; resizing = true; real rprint = real(print.width()) / real(print.height()); real rview = real(widthMM()) / real(heightMM()); if (rview > rprint) { resize(int(real(width()) / real(widthMM()) * real(heightMM()) * rprint), height()); } else { resize(width(), int(real(height()) / real(heightMM()) * real(widthMM()) / rprint)); } resizing = false; } /** Set the current page. * * @param p new the page */ void CPrintLabel::setPage(int p) { if ((p >= 0) && (p < form->printEngine->pages())) { page = p; update(); form->labelPage->setText(QString::number(p+1) + " / " + QString::number(form->printEngine->pages())); } } /** Display the previous page. */ void CPrintLabel::slotPagePrev() { setPage(page - 1); } /** Display the next page. */ void CPrintLabel::slotPageNext() { setPage(page + 1); } /** Set the printing scale. */ void CPrintLabel::slotScale(double value) { scale = value; update(); } /** Construct a new print preview dialog. * * @param engine * @param orientation */ CFormPrint::CFormPrint(const CPrinter *engine, enum QPrinter::Orientation orientation) : printEngine(engine), printFontSize(10) { // initialise printer printDevice.setOrientation(orientation); printDevice.setFullPage(FALSE); QVBoxLayout *layout = new QVBoxLayout(this); // create main widget label = new CPrintLabel(this); layout->addWidget(label); QHBoxLayout* buttons = new QHBoxLayout(); // add scale spinbox if applicable double scale = engine->scaleToFit(&printDevice); if (scale > 0) { labelScale = new QLabel(tr("Scale")); buttons->addWidget(labelScale); spinScale = new QDoubleSpinBox(); spinScale->setDecimals(3); spinScale->setSingleStep(0.001); buttons->addWidget(spinScale); connect( spinScale, SIGNAL( valueChanged(double) ), label, SLOT( slotScale(double) ) ); spinScale->setValue(scale); } // add the buttons buttonLeft = new QToolButton(); buttonLeft->setArrowType(Qt::LeftArrow); buttons->addWidget(buttonLeft); labelPage = new QLabel(); buttons->addWidget(labelPage); buttonRight = new QToolButton(); buttonRight->setArrowType(Qt::RightArrow); buttons->addWidget(buttonRight); buttons->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ) ); buttonOk = new QPushButton( tr("&Print"), this ); buttonOk->setDefault( TRUE ); buttons->addWidget( buttonOk ); buttonCancel = new QPushButton( tr("&Cancel"), this ); buttons->addWidget( buttonCancel ); layout->addLayout(buttons); // connect signals and slots connect( buttonLeft, SIGNAL( clicked() ), label, SLOT( slotPagePrev() ) ); connect( buttonRight, SIGNAL( clicked() ), label, SLOT( slotPageNext() ) ); connect( buttonOk, SIGNAL( clicked() ), this, SLOT( slotPrint() ) ); connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( reject() ) ); label->setPage(0); // resize resize( QSize(minimumSizeHint()) ); } /** Print out the current data. */ void CFormPrint::slotPrint() { QPrintDialog printDialog(&printDevice); printDialog.setMinMax(1, printEngine->pages()); if ( printDialog.exec() == QDialog::Accepted ) { // determine which pages need to be printed int minPage, maxPage; switch (printDialog.printRange()) { case QAbstractPrintDialog::PageRange: minPage = printDialog.fromPage(); maxPage = printDialog.toPage(); break; default: minPage = 1; maxPage = printEngine->pages(); break; } // print the requested pages CTextPainter painter(&printDevice); for (int i = minPage - 1; i < maxPage; i ++) { if ( i >= 0 && i < printEngine->pages()) { if ( i > minPage - 1 ) printDevice.newPage(); printEngine->print(&painter, i, label->getScale(), printFontSize); } } } accept(); } sailcut-1.3.5/src/sailviewer-panel.h0000644000175000007640000000426711177775326017344 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SAILVIEWER_PANEL_H #define SAILVIEWER_PANEL_H #include "sailviewer.h" // forward definitions class QGroupBox; class QLabel; class QPushButton; /** The main dialog of the Sailcut application. */ class CSailViewerPanel : public QWidget { Q_OBJECT public: CSailViewerPanel(QWidget *parent, const enumViewMode viewMode, bool show_sliders, bool show_labeling = true); void setObject(const CPanelGroup &obj); void keyPressEvent ( QKeyEvent * e ); // slots public slots: virtual void languageChange(); virtual void slotAzimuth(real azimuth); virtual void slotElevation(real azimuth); // member variables protected: /** groupbox for parameters */ QGroupBox* grpParams; /** label for current azimuth */ QLabel* lblAzimuth; /** label for current elevation */ QLabel* lblElevation; /** static label saying "elevation" */ QLabel* lblElevationStatic; /** static label saying "azimuth" */ QLabel* lblAzimuthStatic; /** groupbox for the view controls */ QGroupBox* grpControls; /** Reset View button */ QPushButton* btnResetView; /** Labeling button */ QPushButton* btnLabeling; /** Zoom In button */ QPushButton* btnZoomIn; /** Zoom Out button */ QPushButton* btnZoomOut; /** display area for the 3d sail */ CSailViewer *sailDisp; private: bool showSliders; }; #endif sailcut-1.3.5/src/saildoc.h0000644000175000007640000001501111177775326015500 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SAILDOC_H #define SAILDOC_H #include #include "filewriter.h" #include "sailcpp/panelgroup.h" #include "sailcpp/boatdef.h" #include "sailcpp/hulldef.h" #include "sailcpp/rigdef.h" #include "sailcpp/saildef.h" #include "prefs.h" class doc_element_error : public runtime_error { public: doc_element_error(const string &message) : runtime_error(message) { cout << what() << endl; } }; /** @defgroup FileIo File input and output */ /** This class handles all input and output to Sailcut XML documents. * * @ingroup FileIo */ class CSailDoc : protected QDomDocument { public: CSailDoc(); CSailDoc( const QString &filename ); /** Creates an element of the given type. */ QDomElement createElement(const QString &type) { return QDomDocument::createElement(type); }; QDomElement createElement(const QString &type, const QString &name); QDomElement createElement(const QString &type, const QString &name, const QString& value); QDomElement findElement(const QDomNode &parent, const QString &type, const QString &name); // input void get (const QDomNode &parent, int &i, const QString &name ); void get (const QDomNode &parent, unsigned int &i, const QString &name ); void get (const QDomNode &parent, real &r, const QString &name ); void get (const QDomNode &parent, string &s, const QString &name ); void get (const QDomNode &parent, QString &s, const QString &name ); void get (const QDomNode &parent, CPoint3d &p, const QString &name ); void get (const QDomNode &parent, enumBoatElementType &t, const QString &name ); void get (const QDomNode &parent, enumPanelGroupType &t, const QString &name ); void get (const QDomNode &parent, enumSailCut &c, const QString &name ); void get (const QDomNode &parent, enumSailType &t, const QString &name ); void get (const QDomNode &parent, CHullDef &d, const QString &name ); void get (const QDomNode &parent, CSailDef &d, const QString &name ); void get (const QDomNode &parent, CSide &s, const QString &name ); void get (const QDomNode &parent, CPanel &p, const QString &name ); void get (const QDomNode &parent, CBoatDef &d, const QString &name ); void get (const QDomNode &parent, CBoatElement &s, const QString &name ); void get (const QDomNode &parent, CPanelGroup &g, const QString &name ); void get (const QDomNode &parent, CProfile &p, const QString &name ); void get (const QDomNode &parent, CSailMould &m, const QString &name ); void get (const QDomNode &parent, CPrefs &p, const QString &name ); void get (const QDomNode &parent, CRigDef &d, const QString &name ); // output void put(QDomNode &parent, const int &i, const QString &name ="" ); void put(QDomNode &parent, const unsigned int &i, const QString &name ="" ); void put(QDomNode &parent, const real &r, const QString &name ="" ); void put(QDomNode &parent, const string &s, const QString &name="" ); void put(QDomNode &parent, const QString &s, const QString &name="" ); void put(QDomNode &parent, const CPoint3d &p, const QString &name="" ); void put(QDomNode &parent, const enumBoatElementType &t, const QString &name=""); void put(QDomNode &parent, const enumPanelGroupType &t, const QString &name="" ); void put(QDomNode &parent, const enumSailCut &c, const QString &name="" ); void put(QDomNode &parent, const enumSailType &t, const QString &name="" ); void put(QDomNode &parent, const CBoatDef &d, const QString &name="" ); void put(QDomNode &parent, const CBoatElement &s, const QString &name="" ); void put(QDomNode &parent, const CHullDef &d, const QString &name="" ); void put(QDomNode &parent, const CSailDef &d, const QString &name="" ); void put(QDomNode &parent, const CSide &s, const QString &name="" ); void put(QDomNode &parent, const CPanel &p, const QString &name="" ); void put(QDomNode &parent, const CPanelGroup &g, const QString &name="" ); void put(QDomNode &parent, const CProfile &p, const QString &name="" ); void put(QDomNode &parent, const CSailMould &m, const QString &name="" ); void put(QDomNode &parent, const CPrefs &p, const QString &name="" ); void put(QDomNode &parent, const CRigDef &d, const QString &name="" ); void toFile(const QString &filename); /** the toplevel element */ QDomElement top; protected: /** Reads a vector of elements from an XML document. * * @param parent the parent node * @param v the vector * @param name the name of the vector */ template void get_vector (QDomNode &parent, vector& v, const QString &name="") { QDomElement e = findElement( parent, "vector", name); if ( e.isNull() ) throw doc_element_error(QString("CSailDoc::get(vector, " + name + ") : did not find requested element").toStdString()); unsigned int size = e.attributes().namedItem("size").nodeValue().toInt(); v.resize(size); for ( unsigned int i = 0; i < size; i++) { get (e, v[i], QString::number(i)); } } /** Writes a vector of elements to an XML document. * * @param parent the parent node * @param v the vector * @param name the name of the vector */ template void put_vector(QDomNode &parent, const vector& v, const QString &name="") { QDomElement e = createElement("vector",name); e.setAttribute("size", (unsigned int)v.size()); parent.appendChild(e); for (unsigned int i =0; i #include #include "sailcutqt.h" #include "formmain.h" /** @mainpage * This is the documentation for Sailcut CAD's code. * * It is intended mainly for programmers, to learn more about Sailcut CAD * please visit http://sailcut.sourceforge.net/ */ /** * Sailcut CAD's main routine. * it calls CFormmain */ int main( int argc, char* argv[] ) { int retCode; CSailApp app( argc, argv ); app.readPrefs(); CFormMain *sailcut = new CFormMain(&app); if (argc > 1) sailcut->show(argv[1]); else sailcut->show(); retCode = app.exec(); app.writePrefs(); return retCode; } sailcut-1.3.5/src/geocpp/0000755000175000007640000000000011457411327015155 5ustar sharkyjerrywebsailcut-1.3.5/src/geocpp/geometry.cpp0000644000175000007640000001060211177775122017520 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include /*************************************** 3D box ***************************************/ /** Translate box by a vector. * * @param transl translation vector */ CRect3d CRect3d::operator+ (const CVector3d &transl) const { CRect3d ret; ret.min = min + transl; ret.max = max + transl; return ret; } /** Expand/shrink box by a coefficient, keeping the same center. * * @param r coefficient */ CRect3d CRect3d::operator* (const real r) const { CRect3d ret; CVector3d off = (r-1) * 0.5 * (max - min); ret.min = min - off; ret.max = max + off; return ret; } /** Return the minimum rectangle containing the current rectangle * with the given aspect ratio (width / height). */ CRect3d CRect3d::expandToRatio(const real ratio) const { CRect3d lRect(*this); const real w = width(); const real h = height(); if (!w || !h) return lRect; const real objAspect = w / h; if (objAspect > ratio) { const real extrah = 0.5 * h * (objAspect/ratio - 1); // we are limited by the width of the window, grow logical viewport's height lRect.min.y() -= extrah; lRect.max.y() += extrah; } else { real extraw = 0.5 * w * (ratio/objAspect - 1); // we are limited by the height of the window, grow logical viewport's width lRect.min.x() -= extraw; lRect.max.x() += extraw; } return lRect; } /** Return the minimum rectangle containing the current rectangle * and the one given as an argument. * * @param rect */ CRect3d CRect3d::join(const CRect3d& rect) const { CRect3d ret = *this; for (size_t j = 0; j < 3; j++) { if (rect.min[j] < ret.min[j]) ret.min[j] = rect.min[j]; if (rect.max[j] > ret.max[j]) ret.max[j] = rect.max[j]; } return ret; } /*************************************** 2D/3D subspaces ***************************************/ /** Create a CSubSpace representing a 2D line from a point and a vector. * * @param p a point of the line * @param v a vector along the line */ CSubSpace CSubSpace2d::line(const CPoint2d &p, const CVector2d &v) { if (!v.norm()) { cout << "CSubSpace2d::line : Crash point = " << p << endl; throw invalid_argument("CSubSpace2d::line : Input vector cannot be zero"); } return CSubSpace(p, v, GEOCPP_FROM_BASE); } /** Create a CSubSpace representing a 3D line from a point and a vector. * * @param p a point of the line * @param v a vector along the line */ CSubSpace CSubSpace3d::line(const CPoint3d &p, const CVector3d &v) { if (!v.norm()) { cout << "CSubSpace3d::line : Crash point = " << p << endl; throw invalid_argument("CSubSpace3d::line : Input vector cannot be zero point "); } return CSubSpace(p, v, GEOCPP_FROM_BASE); } /** Create a CSubSpace representing a 3D plane from a point and two vectors. * * @param p a point of the plane * @param v1 a vector in the plane * @param v2 a second vector in the plane, not colinear with v1 */ CSubSpace CSubSpace3d::plane(const CPoint3d &p, const CVector3d &v1, const CVector3d& v2) { if (!v1.cross(v2).norm()) { cout << "CSubSpace3d::plane : Crash point = " << p << endl; throw invalid_argument("CSubSpace3d::plane : 2 Vectors cannot be colinear"); } CMatrix m(3,2); for (int i = 0; i < 3; i++) { m(i, 0) = v1[i]; m(i, 1) = v2[i]; } return CSubSpace(p, m, GEOCPP_FROM_BASE); } sailcut-1.3.5/src/geocpp/matrix.h0000644000175000007640000001164511177775122016646 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef GEOCPP_MATRIX_H #define GEOCPP_MATRIX_H #include #include #include enum soltype_t { NONE, ONE, INF }; class CSubSpace; /** Class for describing matrices. * * @ingroup GeoCpp */ class CMatrix { protected: /** the matrix's data */ real* m_data; /** number of rows */ size_t m_nrow; /** number of columns */ size_t m_ncol; public: /** Constructs a CMatrix with the given number of rows and columns. */ CMatrix(const size_t &nrow = 0, const size_t &ncol = 0) : m_nrow(nrow), m_ncol(ncol) { if (!empty()) { m_data = new real[m_nrow * m_ncol]; memset(m_data, 0, sizeof(real) * m_nrow * m_ncol); } else { m_data = NULL; } }; /** Copy constructor. */ CMatrix(const CMatrix &m) : m_nrow(m.m_nrow), m_ncol(m.m_ncol) { if (!empty()) { m_data = new real[m_nrow * m_ncol]; memcpy(m_data, m.m_data, sizeof(real) * m_nrow * m_ncol); } else { m_data = NULL; } }; /** Returns the matrix corresponding to a vector */ CMatrix(const CVector &v) : m_nrow(v.size()), m_ncol(1) { if (m_nrow > 0) { m_data = new real[m_nrow]; for (size_t j = 0; j < m_nrow; j++) m_data[j] = v[j]; } else { m_data = NULL; } }; /** The destructor. */ ~CMatrix() { if (!empty()) delete [] m_data; }; public: // static functions static CMatrix id(const size_t&); static CMatrix rnd(const size_t&, const size_t&); static CMatrix rot3d(const size_t&, const real&); // member functions CVector col(const size_t&) const; CMatrix crop(const size_t& nr, const size_t& nc, const size_t& nrz=0, const size_t& ncz=0) const; real det(void) const; CMatrix dev(const size_t&, const size_t&) const; /** Diagonalises matrix. Currently this is implemented as * a full pivot Gauss-Jordan diagonalisation. */ CMatrix diag() const { return gaussjordan(); }; /** Accessor for the number of columns. */ size_t columns() const { return m_ncol; } /** Accessor for the number of rows. */ size_t rows() const { return m_nrow; } CMatrix img(void) const; CMatrix inv(void) const; /** Is the matrixan empty (0x0) matrix? */ bool empty() const { return ! (m_ncol && m_nrow); } CMatrix kern(const size_t& vsize) const; CVector row(size_t) const; CSubSpace solve(const CVector &) const; void swap_row(const size_t&, const size_t&); void swap_col(const size_t&, const size_t&); CMatrix transp(void) const; // operators real& operator() ( const size_t& row, const size_t& col ); real operator() ( const size_t& row, const size_t& col ) const; CMatrix& operator=(const CMatrix &); bool operator==(const CMatrix &) const; bool operator!=(const CMatrix &) const; CMatrix operator-() const; CMatrix operator*(const CMatrix &) const; CVector operator*(const CVector &) const; protected: CMatrix gaussjordan(bool *is_inv=NULL, CMatrix *inv=NULL, soltype_t *soltype=NULL, CVector *bb=NULL, CMatrix *tkern=NULL) const; }; // global functions ostream& operator<< (ostream &, const CMatrix &); // inlines /** Returns the selected element of the matrix. */ inline real& CMatrix::operator() (const size_t& row, const size_t& col) { #ifdef CHECK_DIMENSIONS if (row >= m_nrow || col >= m_ncol) throw range_error("CMatrix::operator() : index out of bounds"); #endif return m_data[m_ncol * row + col]; } /** Returns the selected element of the matrix. */ inline real CMatrix::operator() (const size_t& row, const size_t& col) const { #ifdef CHECK_DIMENSIONS if (row >= m_nrow || col >= m_ncol) throw range_error("CMatrix::operator() : index out of bounds"); #endif return m_data[m_ncol * row + col]; } #endif sailcut-1.3.5/src/geocpp/geometry.h0000644000175000007640000001110211177775122017161 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef GEOCPP_GEOMETRY_H #define GEOCPP_GEOMETRY_H #include class CMatrix; class CSubSpace; /** Generic two dimensional real-valued vector. */ class CVector2d : public CVector { public: /** Constructor. */ CVector2d(const real &x = 0, const real &y = 0) : CVector(2) { (*this)[0] = x; (*this)[1] = y; } /** Copy constructor. */ CVector2d(const CVector &v) : CVector(v) { resize(2); }; /** Returns the first coordinate. */ real &x(void) { return (*this)[0]; } /** Returns the second coordinate. */ real &y(void) { return (*this)[1]; } /** Assignment operator. */ CVector2d &operator=(const CVector2d &v) { (*this)[0] = v[0]; (*this)[1] = v[1]; return *this; } }; /** Generic three dimensional real-valued vector. * * @ingroup GeoCpp */ class CVector3d : public CVector { public: /** Constructor. */ CVector3d(const real &x = 0, const real &y = 0, const real &z = 0) : CVector(3) { (*this)[0] = x; (*this)[1] = y; (*this)[2] = z; } /** Copy constructor. */ CVector3d(const CVector &v) : CVector(v) { resize(3); }; // access to coords /** Returns the first coordinate. */ real &x(void) { return (*this)[0]; } real x(void) const { return (*this)[0]; } /** Returns the second coordinate. */ real &y(void) { return (*this)[1]; } real y(void) const { return (*this)[1]; } /** Returns the third coordinate. */ real &z(void) { return (*this)[2]; } real z(void) const { return (*this)[2]; } // 3D only! /** Cross product. Produces a vector orthogonal * to the two original vectors. */ CVector3d cross(const CVector3d &v) const { CVector3d ret; for (int i=0; i<3; i++) ret[i] = (*this)[(i+1)%3] * v[(i+2)%3] - (*this)[(i+2)%3] * v[(i+1)%3]; return ret; } /** Assignment. */ CVector3d &operator=(const CVector3d &v) { (*this)[0] = v[0]; (*this)[1] = v[1]; (*this)[2] = v[2]; return *this; } }; /** 2d real-valued point */ typedef CVector2d CPoint2d; /** 3d real-valued point * * @ingroup GeoCpp */ typedef CVector3d CPoint3d; /** Three dimensional box. * * @ingroup GeoCpp */ class CRect3d { public: /** Construct a new 3D box. */ CRect3d() {} ; /** Construct a new 3D box given its corners. * * @param pmin * @param pmax */ CRect3d(const CPoint3d &pmin, const CPoint3d &pmax) : min(pmin), max(pmax) {} ; // operators CRect3d operator+ (const CVector3d &transl) const; CRect3d operator* (const real r) const; /** Return the box's center. */ CPoint3d center() const { return 0.5 * (min + max); }; CRect3d expandToRatio(const real ratio) const; /** Return the box's width. */ real width() const { return max.x()-min.x(); }; /** Return the box's height. */ real height() const { return max.y()-min.y(); }; CRect3d join(const CRect3d& rect) const; /** lower-left corner */ CPoint3d min; /** top-right corner */ CPoint3d max; }; /** Helper class to create 2D lines. */ class CSubSpace2d { public: static CSubSpace line(const CPoint2d& p, const CVector2d& v); }; /** Helper class to create 3D subspaces (lines and planes) */ class CSubSpace3d { public: static CSubSpace line(const CPoint3d& p, const CVector3d& v); static CSubSpace plane(const CPoint3d& p, const CVector3d& v1, const CVector3d& v2); }; #endif sailcut-1.3.5/src/geocpp/CMakeLists.txt0000644000175000007640000000027411160512024017703 0ustar sharkyjerrywebinclude_directories(${CMAKE_SOURCE_DIR}/src) add_library(geocpp STATIC geometry.cpp matrix.cpp subspace.cpp) add_executable(geotest geotest.cpp) target_link_libraries(geotest geocpp) sailcut-1.3.5/src/geocpp/subspace.h0000644000175000007640000000373011177775122017143 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef GEOCPP_SUBSPACE_H #define GEOCPP_SUBSPACE_H #include enum subspaceflags_t { GEOCPP_FROM_BASE, GEOCPP_FROM_EQS }; /** Class for describing subspaces of an euclidian vector space, * for example the empty space, points, lines and planes. * * @ingroup GeoCpp */ class CSubSpace { private: CMatrix m; CVector p; public: CSubSpace(size_t dim_space = 3, size_t dim_sub = 0); CSubSpace(const CVector &pi, const CMatrix &mi, subspaceflags_t createflags = GEOCPP_FROM_EQS); /** Copy constructor */ CSubSpace(const CSubSpace &s) : m(s.m) , p(s.p) {} ; CSubSpace intersect(const CSubSpace &) const; bool contains(const CVector &) const; /** Return the subspace's dimension. */ int getdim() const { if (p.size() > 0) return p.size() - m.rows(); else return -1; } /** Accessor for the matrix. */ const CMatrix& getm() const { return m; } /** Accessor for the point. */ const CVector& getp() const { return p; } }; // global functions ostream& operator<< (ostream &, const CSubSpace &); #endif sailcut-1.3.5/src/geocpp/vector.h0000644000175000007640000001024711177775122016641 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef GEOCPP_VECTOR_H #define GEOCPP_VECTOR_H #include #include #include #ifdef CHECK_DIMENSIONS #include #endif using namespace std; // types and constants typedef double real; const real EPS = 1E-14; const real PI = 3.14159265358979323846; /** Real-valued vector */ class CVector : public vector { public: CVector(size_t size) : vector(size) {}; CVector(const CVector &v) : vector(v) {}; /** Returns the vector's norm ("length") */ real norm(void) const { real tot = 0; for (size_t i = 0; i < size(); i++) tot += (*this)[i]*(*this)[i]; return real(sqrt(tot)); }; /** Returns corresponding unit length vector for non-zero vectors * and zero vector otherwise. */ CVector unit(void) const { real n = norm(); if (n EPS) return false; return true; }; /** Tests vectors for non-equality. */ bool operator!=(const CVector &v) const { return !(*this == v); }; /** Binary '+' operator (addition) */ CVector operator+(const CVector& v2) const { #ifdef CHECK_DIMENSIONS if (size() != v2.size()) throw invalid_argument("CVector::operator+ : dimension mismatch!"); #endif CVector ret(*this); for (size_t i = 0; i < size(); i++) ret[i] += v2[i]; return ret; }; /** Unary '-' operator (return opposite) */ CVector operator- () const { CVector ret(size()); for (size_t i = 0; i < size(); i++) ret[i] = - (*this)[i]; return ret; }; /** Binary '-' operator (return difference) */ CVector operator- (const CVector &v2) const { #ifdef CHECK_DIMENSIONS if (size() != v2.size()) throw invalid_argument("CVector::operator- : dimension mismatch!"); #endif CVector ret(*this); for (size_t i = 0; i < size(); i++) ret[i] -= v2[i]; return ret; }; /** Binary '* (multiply a vector by a real) */ CVector operator*(const real& lambda) const { CVector ret(*this); for (size_t i = 0; i < size(); i++) ret[i] *= lambda; return ret; }; /** Dot (real) product. */ real operator*(const CVector &v2) const { #ifdef CHECK_DIMENSIONS if (size() != v2.size()) throw invalid_argument("CVector::operator*: dimension mismatch!"); #endif real ret = 0; for (size_t i = 0; i < size(); i++) ret += (*this)[i] * v2[i]; return ret; }; }; /** Outputs a CVector to a stream. */ inline ostream& operator<<(ostream &o, const CVector &v) { for (size_t i = 0; i < v.size(); i++) o << (i > 0 ? "\t" : "") << v[i]; return o; } /** Binary '*' (multiply a scalar by a vector) */ inline CVector operator*(const real& lambda, const CVector &v) { return v * lambda; } #endif sailcut-1.3.5/src/geocpp/geotest.cpp0000644000175000007640000001752311177775122017350 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #ifdef DEBUG #include #endif template void test_contain(const char *name, const CSubSpace &s, const T &p, bool expected) { bool res = s.contains(p); cout << "does " << name << " contain (" << p << ") : " << s.contains(p) << endl; if (res != expected) throw runtime_error("test failed"); } void test_point(void) { CPoint3d p3(1,0,0), q3(0,1,0); CPoint2d p2(1,0), q2(0,1); CPoint3d r3; cout << "----- Point operations -----" << endl; cout << "p3\t " << p3 << endl; cout << "q3\t " << q3 << endl; //cin >> r3; cout << "r3\t " << r3 << endl; cout << "p3 - q3\t " << p3-q3 << endl; cout << "|p3,q3|\t " << CVector3d(q3 - p3).norm() << endl; cout << "p2 - q2\t " << p2-q2 << endl; cout << " " << endl; } void test_rect(void) { CRect3d r(CPoint3d(-2, -2, -2), CPoint3d(1, 1, 1)); cout << "r.min\t " << r.min << endl; cout << "r.max\t " << r.max << endl; cout << "r.center()\t" << r.center() << endl; cout << "r2 = r * 3" << endl; CRect3d r2 = r * 3; cout << "r2.min\t " << r2.min << endl; cout << "r2.max\t " << r2.max << endl; cout << "r2.center()\t" << r2.center() << endl; if (r.center() != r2.center()) { cout << "ERROR : r.center() != r2.center()" << endl; } } void test_vect(void) { cout << "----- Vector operations -----" << endl; CVector3d u3(1,2,3),v3(5,8,9); //CVector2d w; //w=u; cout << "u3\t " << u3 << endl; cout << "u3.x()\t " << u3.x() << endl; u3.x()=5; cout << "u3\t " << u3 << endl; cout << "v3\t " << v3 << endl; cout << "-v3\t " << -v3 << endl; cout << "u3 + v3\t " << u3+v3 << endl; cout << "u3 - v3\t " << u3-v3 << endl; cout << "u3 * 2\t " << u3*real(2) << endl; cout << "2 * u3\t " << real(2)*u3 << endl; u3[2] = 456; cout << "u3[2]\t " << u3[2] << endl; cout << "u3*v3\t " << u3*v3 << endl; cout << " " << endl; } void test_matrix(void) { CVector3d v1(1,2,1),v2(4,7,9); cout << "----- Matrix operations -----" << endl; // 3x2 matrix CMatrix q(3,2); q(0,0) = 2; q(0,1) = 4; q(1,0) = 6; q(1,1) = 3; q(2,0) = 4; q(2,1) = -1; cout << "q" << endl << q << endl; CSubSpace h = q.solve(v1); cout << "q.solve(v1)" << endl << h << endl; if (h.getdim() != 0) throw runtime_error("intersection is not a point"); cout << "q * q.solve(v1).getp()" << endl << q * h.getp() << endl; // Singular 3x3 matrix CMatrix s(3,3); s(0,0) = 1; s(0,1) = 2; s(0,2) = 3; s(1,0) = 9; s(1,1) = 3; s(1,2) = 5; s(2,0) = 8; s(2,1) = 1; s(2,2) = 2; cout << "s" << endl << s << endl; cout << "s.diag()" << endl << s.diag() << endl; cout << "s.img()" << endl << s.img() << endl; cout << "s.kern(3)" << endl << s.kern(3) << endl; cout << "s*s.kern(3)" << endl << s*s.kern(3) << endl; cout << "s*v1" << endl << s*v1 << endl; CSubSpace h2 = s.solve(v1); cout << "s.solve(v1)" << endl << h2 << endl; if (h2.getdim() != 1) throw runtime_error("intersection is not a line"); CSubSpace h3 = s.solve(v2); cout << "s.solve(v2)" << endl << h3 << endl; if (h3.getdim() != -1) throw runtime_error("intersection is not empty"); // 3x4 matrix CMatrix t(3,4); t(0,0) = 1; t(0,1) = -1; t(0,2) = 3; t(0,3) = -7; t(1,0) = 9; t(1,1) = 3; t(1,2) = 5; t(1,3) = 0; t(2,0) = 8; t(2,1) = 4; t(2,2) = 2; t(2,3) = 7; cout << "t" << endl << t << endl; cout << "t.diag()" << endl << t.diag() << endl; //cout << "t.img()" << endl << t.img() << endl; cout << "t.kern(4)" << endl << t.kern(4) << endl; //cout << "t.diag()*t.kern()" << endl << t.diag()*t.kern() << endl; cout << "t*t.kern(4)" << endl << t*t.kern(4) << endl; cout << " " << endl; } void test_space2d(void) { cout << "----- 2D Subspace operations -----" << endl; CSubSpace L2 = CSubSpace2d::line(CPoint2d(0,0), CVector2d(1,1)); CPoint2d p2(2,2),q2(2,1); cout << "== L2 ==" << endl << L2 << endl; test_contain("L2", L2, p2, true); test_contain("L2", L2, q2, false); cout << endl; cout << " " << endl; } void test_space3d(void) { cout << "----- 3D Subspace operations -----" << endl; const CSubSpace L3A = CSubSpace3d::line(CPoint3d(0,0,1), CVector3d(1,1,0)); const CSubSpace L3B = CSubSpace3d::line(CPoint3d(0,0,0), CVector3d(1,1,1)); const CSubSpace P3A = CSubSpace3d::plane(CPoint3d(2,3,7), CVector3d(1,0,5), CVector3d(0,1,0)); const CSubSpace P3B = CSubSpace3d::plane(CPoint3d(4,-5,1), CVector3d(-3,0,1), CVector3d(0,1,0)); const CPoint3d p3(2,2,2),q3(2,1,2),r3(4,5,7),s3(2,2,1); CSubSpace h(3); cout << "== L3A ==" << endl << L3A << endl; test_contain("L3A", L3A, p3, false); test_contain("L3A", L3A, s3, true); cout << endl; cout << "== L3B ==" << endl << L3B << endl; test_contain("L3B", L3B, p3, true); test_contain("L3B", L3B, q3, false); cout << endl; cout << "== L3A.intersect(L3B) ==" << endl << (h=L3A.intersect(L3B)) << endl; if (h.getdim() != 0) throw runtime_error("intersection is not a point"); test_contain("L3A", L3A, h.getp(), true); test_contain("L3B", L3B, h.getp(), true); cout << endl; cout << "== P3A ==" << endl << P3A << endl; test_contain("P3A", P3A, p3, false); test_contain("P3A", P3A, r3, false); cout << endl; cout << "== P3B ==" << endl << P3B << endl; test_contain("P3B", P3B, p3, false); test_contain("P3B", P3B, r3, false); cout << endl; cout << "== P3A.intersect(P3B) ==" << endl << (h=P3A.intersect(P3B)) << endl; if (h.getdim() != 1) throw runtime_error("intersection is not a line"); test_contain("P3A", P3A, h.getp(), true); test_contain("P3B", P3B, h.getp(), true); cout << endl; cout << "== P3A.intersect(L3A) ==" << endl << (h=P3A.intersect(L3A)) << endl; if (h.getdim() != 0) throw runtime_error("intersection is not a point"); test_contain("P3A", P3A, h.getp(), true); test_contain("L3A", L3A, h.getp(), true); cout << endl; cout << "== L3A.intersect(P3A) ==" << endl << (h=L3A.intersect(P3A)) << endl; if (h.getdim() != 0) throw runtime_error("intersection is not a point"); test_contain("P3A", P3A, h.getp(), true); test_contain("L3A", L3A, h.getp(), true); cout << endl; cout << " " << endl; } int main() { #ifdef DEBUG mcheck(0); #endif srand ( time(NULL) ); cout << "--- Using GeoCpp library by Jeremy Laine ---" << endl; cout << "(see AUTHORS file for full list of contributors)" << endl; cout << " " << endl; test_rect(); test_point(); test_vect(); test_matrix(); test_space2d(); test_space3d(); cout << "----- " << endl; return 0; } sailcut-1.3.5/src/geocpp/geocpp.h0000644000175000007640000000217311177775122016613 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef GEOCPP_GEOCPP_H #define GEOCPP_GEOCPP_H /** @defgroup GeoCpp Linear algebra library * * GeoCpp is a small linear algebra library that can be used * as a basis for geometry computations. * * @relates SailCpp */ #include #include #include #endif sailcut-1.3.5/src/geocpp/subspace.cpp0000644000175000007640000001176511177775122017505 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include /******************************************************* Construction / destruction ********************************************************/ /** Constructs a CSubSpace of the specified dimension. * * @param dim_space dimension of the Euclidian vector space we are working in * @param dim_sub dimension of the subspace to be created */ CSubSpace::CSubSpace(size_t dim_space, size_t dim_sub) : p(dim_space) { m = CMatrix( dim_sub , p.size() ); } /** Constructs a CSubSpace from a point and either the equations or * a base of the subspace. * * @param pi a point in the subspace * @param mi a matrix containing the equations or the base of the subspace * @param createflags specifies whether we were given the equations or the base of the subspace */ CSubSpace::CSubSpace(const CVector &pi, const CMatrix &mi, subspaceflags_t createflags) : p(pi) { switch ( createflags ) { case GEOCPP_FROM_EQS: // equations are given in lines if ( (mi.rows() > 0) && (mi.columns() != pi.size()) ) throw invalid_argument("CSubSpace::CSubSpace(p,m,GEOCPP_FROM_EQS) : dimension mismatch between p and m"); m = mi; break; case GEOCPP_FROM_BASE: // base is given in column format if ( (mi.columns() > 0) && (mi.rows() != pi.size()) ) throw invalid_argument("CSubSpace::CSubSpace(p,m,GEOCPP_FROM_BASE) : dimension mismatch between p and m"); m = mi.transp().kern(pi.size()).transp(); break; default: throw invalid_argument("CSubSpace::CSubspace(p,m,createflags) : unknown creation flags"); } } /** Test whether the CSubSpace contains a given point. */ bool CSubSpace::contains(const CVector &point) const { CVector prod = m*(point-p); return ( prod.norm() < EPS ); } /** Performs the intersection of two CSubSpace objects. */ CSubSpace CSubSpace::intersect(const CSubSpace &h2) const { if ( (getdim() < 0) || (h2.getdim() < 0) ) return CSubSpace(0 , 0); if ( p.size() != h2.p.size() ) throw invalid_argument("CSubSpace::intersect : dimension mismatch on points"); CVector b1 = m*p; CVector b2 = h2.m*h2.p; CVector bb( m.rows() + h2.m.rows() ); CMatrix mm( m.rows() + h2.m.rows(), p.size() ); for (size_t i = 0 ; i < mm.rows() ; i++) { if ( i < m.rows() ) { for (size_t j = 0 ; j < mm.columns() ; j++) mm(i,j) = m(i,j); bb[i] = b1[i]; } else { for (size_t j = 0 ; j < mm.columns() ; j++) mm(i,j) = h2.m(i - m.rows(), j); bb[i] = b2[i - m.rows()]; } } //cout << "mm" << endl << mm << endl; //cout << "bb" << endl << bb << endl; return mm.solve(bb); } /******************************************************* Other functions ********************************************************/ /** Outputs a CMatrix to a stream. */ ostream& operator<< (ostream &o, const CMatrix &m) { o << "["; for (size_t i = 0 ; i < m.rows() ; i++) { o << m.row(i); if ( i != m.rows() - 1 ) o << endl; } o << "]"; return o; } /** Outputs the definition of a CSubSpace to a stream. */ ostream& operator<< (ostream &o, const CSubSpace &h) { o << "--------------------------------" << endl; o << " subspace : "; switch (h.getdim()) { case -1: o << "empty" << endl; break; case 0: o << "point" << endl; break; case 1: o << "line" << endl; break; case 2: o << "plane" << endl; break; default: o << "dim=" << h.getdim() << endl; } o << "--------------------------------" << endl; if ( h.getdim() >= 0 ) { o << "point:" << endl << h.getp() << endl; if (h.getdim()>0) { o << "------" << endl; o << "base vectors (in columns): " << endl << h.getm().kern(h.getp().size()) << endl << "------" << endl; o << "equations (coeffs in lines): " << endl << h.getm() << endl; } o << "--------------------------------" << endl; } return o; } sailcut-1.3.5/src/geocpp/matrix.cpp0000644000175000007640000003634311177775122017203 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include /******************************************************* Static functions ********************************************************/ /** Returns the (square) identity matrix for a given dimension. * * @param n the dimension of the identity matrix. */ CMatrix CMatrix::id(const size_t& n) { CMatrix m = CMatrix(n,n); for (size_t i = 0; i < n; i++) m(i,i) = 1; return m; } /** Returns a random matrix of specified dimension. * * @param nrow number of rows for the matrix * @param ncol number of columns for the matrix */ CMatrix CMatrix::rnd(const size_t& nrow, const size_t& ncol) { CMatrix m(nrow,ncol); for (size_t i=0; i < nrow; i++) { for (size_t j=0; j < ncol; j++) { m(i,j) = (100 * real(rand()) / RAND_MAX)-50; } } return m; } /** Return a rotation matrix about specified axis. * * @param axis the index (0,1,..) of the axis * @param angle rotation angle in radians */ CMatrix CMatrix::rot3d(const size_t& axis, const real& angle) { CMatrix m(3,3); // build rotation matrix around x axis m( axis, axis ) = 1; m( (axis+1)%3, (axis+1)%3 ) = cos(angle); m( (axis+2)%3, (axis+2)%3 ) = cos(angle); m( (axis+1)%3, (axis+2)%3 ) = -sin(angle); m( (axis+2)%3, (axis+1)%3 ) = sin(angle); return m; } /******************************************************* Member functions ********************************************************/ /** Extracts the vector for the specified column. * * @param index the index of the column to return */ CVector CMatrix::col(const size_t& index) const { if (index >= m_ncol) throw range_error("CMatrix::col : index out of bounds!"); CVector ret(m_nrow); for (size_t i = 0; i < m_nrow; i++) ret[i] = m_data[i*m_ncol + index]; return ret; } /** Extracts part of a CMatrix. * * @param nr row to start at * @param nc column to start at * @param nrz number of rows to extract * @param ncz number of columns to extract */ CMatrix CMatrix::crop(const size_t& nr, const size_t& nc, const size_t& nrz, const size_t& ncz) const { CMatrix ret(nr,nc); size_t nrm,ncm; if (nr < (m_nrow - nrz)) nrm = nr; else nrm = m_nrow - nrz; if (nc < (m_ncol - ncz)) ncm = nc; else ncm = m_ncol - ncz; for (size_t i=0; i < nrm; i++) for (size_t j=0; j < ncm; j++) ret(i,j) = (*this)(i,j+ncz); return ret; } /** Returns the determinant of a CMatrix. The matrix must be square! */ real CMatrix::det(void) const { if (m_nrow != m_ncol) throw invalid_argument("CMatrix::det : matrix is not square!"); real ret=0; // if we have a scalar matrix return its only coefficient if (m_nrow == 1) return (*this)(0,0); // develop relative to first row for (size_t j=0; j < m_ncol; j++) { if (j%2) ret -= (*this)(0,j) * dev(0,j).det(); else ret += (*this)(0,j) * dev(0,j).det(); } return ret; } /** Returns a square Matrix with the specified rows and lines removed. * The matrix must be square! * * @param i the index of the row to remove * @param j the index of the column to remove */ CMatrix CMatrix::dev(const size_t& i, const size_t& j) const { if ((i >= m_nrow) || (j >= m_ncol)) throw range_error("CMatrix::dev : index out of bounds"); if (m_nrow != m_ncol) throw invalid_argument("CMatrix::dev : matrix is not square!"); size_t dx=0,dy=0; if (empty()) return CMatrix(); CMatrix m(m_nrow - 1, m_ncol - 1); for (size_t x=0; x < m_nrow; x++) { if (x!=i) { dy = 0; for (size_t y=0; y < m_ncol; y++) { if (y!=j) { m(dx,dy) =(*this)(x,y); dy++; } } dx++; } } return m; } /** Diagonalises matrix by Gauss-Jordan method with full pivoting * optionally returns the inverse matrix. */ CMatrix CMatrix::gaussjordan(bool *is_inv, CMatrix *inv, soltype_t * soltype, CVector *bb, CMatrix *tkern) const { // check dimensions CMatrix b; if (bb!=NULL) { if (bb->size() != m_nrow) throw invalid_argument("CMatrix::solve : matrix <=> right-hand side dimensions incompatible"); b = *bb; } else { b = CMatrix(m_nrow, 1); } //cout << "b" << endl<< b << endl; //cout << "m" << endl<< *this << endl; real p_value; real p_avalue, avalue; size_t p_i, p_j; size_t i,j,k; size_t n; // copy over the matrix CMatrix m = *this; CMatrix t; // left-hand operations (row ops) CMatrix lops = CMatrix::id(m_nrow); // CMatrix rswap = CMatrix::id(getnrow()); // right-hand operations (col ops) CMatrix cswap = CMatrix::id(m_ncol); // determine minimum dimension if (m_ncol < m_nrow) n = m_ncol; else n = m_nrow; //////////////////////////////// // DIAGONALISATION // //////////////////////////////// for (k=0; k < n; k++) { // find pivot p_value = p_avalue = 0; p_i = p_j = 0; for (i = k; i < m_nrow; i++) { for (j = k; j < m_ncol; j++) { avalue = fabs(m(i,j)); if (avalue > p_avalue) { p_value = m(i,j); p_avalue = avalue; p_i = i; p_j = j; } } } // if pivot is smaller than epsillon we cannot continue diagonalisation if ( p_avalue < EPS ) break; // exchange rows k and p_i // swapping m.swap_row(k,p_i); lops.swap_row(k,p_i); //rswap.swap_row(k,p_i); b.swap_row(k,p_i); // swapping cols k and p_j m.swap_col(k,p_j); cswap.swap_col(k,p_j); // modify rows t = CMatrix::id(m_nrow); for (i =0; i < m_nrow; i++) { if ( i !=k ) t(i,k) = -m(i,k) / p_value; else t(k,k) = 1 / p_value; } m = t * m; b = t * b; lops = t * lops; } ///////////////////////////////////// // HANDLE REQUEST FOR INVERSION // ///////////////////////////////////// if ((is_inv != NULL) && (inv != NULL)) { if ((m_nrow == m_ncol)&&(m_ncol == k)) { // matrix is square and invertible *inv = cswap*lops; *is_inv = true; } } ///////////////////////////////////// // HANDLE REQUEST FOR SOLUTION // ///////////////////////////////////// if ((bb != NULL)&&(soltype != NULL)) { *soltype = ONE; for (i = k; i < b.m_nrow; i++) if (b(i,0) > EPS) { *soltype = NONE; break; } if (*soltype==NONE) { // incompatible system *bb = CVector(0); } else { // system compatible one or infinity of solutions *bb = (cswap * b.crop(m_ncol,1)).col(0); if (m_ncol == k) { // complete diagonalisation, one solution *soltype=ONE; } else { *soltype=INF; } } } ///////////////////////////////////// // HANDLE REQUEST FOR KERNEL // ///////////////////////////////////// if (tkern != NULL) { if (k < m_ncol) { /* cout << "has non-zero kernel" << endl; if ((getnrow()==k)) { // no redundant equations cout << "getnrow()==k==" << k << endl; } else { cout << "getnrow()==" << getnrow() << " k==" << k << endl; } */ CMatrix pk = - m.crop(m_ncol-k+1,m_ncol-k,0,k); pk = pk.crop(m_ncol,m_ncol-k); for (i=0; i + k < m_ncol; i++) pk(i+k,i) = 1; *tkern = cswap* pk; } else { // matrix is inversible //cout << "m_ncol==k" << endl; *tkern = CMatrix(); } } // clean matrix for (i = 0; i < m_nrow; i++) for (j = 0; j < m_ncol; j++) if (fabs(m(i,j)) < EPS) m(i,j) = 0; // return m; return m.crop(k,m_ncol); } /** Returns the image space of the linear application * associated with the matrix. */ CMatrix CMatrix::img(void) const { return transp().diag().transp(); } /** Inverts matrix by Gauss-Jordan method with full pivoting. */ CMatrix CMatrix::inv(void) const { if (m_nrow != m_ncol) throw invalid_argument("CMatrix:: inv : matrix is not square !"); // if matrix is empty, return empy matrix if (empty()) return CMatrix(); CMatrix ret; bool is_inv; gaussjordan(&is_inv,&ret); if (is_inv == false) throw invalid_argument("CMatrix::diag : matrix is singular !"); return ret; } /** Returns the kernel of the linear application. * associated with the matrix. */ CMatrix CMatrix::kern(const size_t& vsize) const { if (empty()) { cout << "REQUEST FOR KER(o)" << endl; return CMatrix::id(vsize); } CMatrix ret; gaussjordan(NULL,NULL,NULL,NULL,&ret); return ret; } /** Retrieves a row of the matrix in vector form. */ CVector CMatrix::row(size_t index) const { if (index >= m_nrow) throw range_error("CMatrix::row : index out of bounds!"); CVector ret(m_ncol); for (size_t i = 0; i < m_ncol; i++) ret[i] = m_data[index*m_ncol + i]; return ret; } /** Solves the linear equations system formed by the current matrix * and a given right-hand side vector. * * @param b the right-hand side values in the equation */ CSubSpace CMatrix::solve(const CVector &b) const { if (m_nrow != b.size()) throw invalid_argument("CMatrix::solve : dimension mismatch"); //cout << "[[ solver ]]" << endl; //cout << "m" << endl << *this << endl; //cout << "b" << endl << b << endl; soltype_t soltype=NONE; CVector s = b; CMatrix k; CSubSpace h(CVector(0),CMatrix()); gaussjordan(NULL,NULL,&soltype,&s,&k); switch (soltype) { case NONE: //cout << "CMatrix::solve : system has no solution" << endl; break; case ONE: //cout << "CMatrix::solve : system has unique solution" << endl; h = CSubSpace(s,CMatrix::id(s.size())); break; case INF: //cout << "CMatrix::solve : system has an infinity of solutions" << endl; h = CSubSpace(s,k,GEOCPP_FROM_BASE); break; } return h; } /** Swaps two rows of a matrix. */ void CMatrix::swap_row(const size_t& i1, const size_t& i2) { if ((i1>=m_nrow)||(i2>=m_nrow)) throw range_error("CMatrix:swap_row : index out of bounds"); if (i1==i2) return; real temp; size_t pos1 = i1 * m_ncol; size_t pos2 = i2 * m_ncol; for (size_t j = 0; j < m_ncol; j++) { temp = m_data[pos1+j]; m_data[pos1+j] = m_data[pos2+j]; m_data[pos2+j] = temp; } } /** Swap two columns of a matrix. */ void CMatrix::swap_col(const size_t& j1, const size_t& j2) { if ((j1>=m_ncol)||(j2>=m_ncol)) throw range_error("CMatrix:swap_col : index out of bounds"); if (j1==j2) return; real temp; size_t pos = 0; for (size_t i = 0; i < m_nrow; i++) { temp = m_data[pos+j1]; m_data[pos+j1] = m_data[pos+j2]; m_data[pos+j2] = temp; pos += m_ncol; } } /** Transposes ('tilts') matrix */ CMatrix CMatrix::transp(void) const { CMatrix ret(m_ncol,m_nrow); for (size_t i=0; i < m_ncol; i++) for (size_t j=0; j< m_nrow; j++) ret.m_data[i*ret.m_ncol + j] = m_data[j*m_ncol + i]; return ret; } /******************************************************* Operators ********************************************************/ /** Performs an assignment. */ CMatrix & CMatrix::operator=(const CMatrix &m) { if (&m == this) return *this; if ( (m_nrow != m.m_nrow) || (m_ncol != m.m_ncol) ) { if (m_data) delete [] m_data; m_nrow = m.m_nrow; m_ncol = m.m_ncol; if (m.m_data) m_data = new real[m_nrow * m_ncol]; else m_data = NULL; } if (m_data) memcpy(m_data, m.m_data, sizeof(real) * m_nrow * m_ncol); return *this; } /** Tests two matrices for equality. */ bool CMatrix::operator==(const CMatrix &m) const { if ( (m_nrow != m.m_nrow) || (m_ncol != m.m_ncol) ) return false; for (size_t i=0; i < m_nrow; i++) for (size_t j=0; j < m_ncol; j++) if ( (*this)(i,j) != m(i,j) ) return false; return true; } /** Tests two matrices for non-equality. */ bool CMatrix::operator!=(const CMatrix &m) const { return !(*this == m); } /** Return the opposite of a matrix. */ CMatrix CMatrix::operator-() const { CMatrix ret(m_nrow,m_ncol); for (size_t pos = 0; pos < m_nrow * m_ncol; pos++) ret.m_data[pos] = - m_data[pos]; return ret; } /** Matrix product */ CMatrix CMatrix::operator*(const CMatrix &m2) const { if (m_ncol != m2.m_nrow) throw invalid_argument("CMatrix::operator*: dimension mismatch!"); CMatrix p(m_nrow, m2.m_ncol); size_t pos = 0; for (size_t i = 0; i < p.m_nrow; i++) for (size_t j = 0; j < p.m_ncol; j++) { for (size_t k=0; k < m_ncol; k++) p.m_data[pos] += m2.m_data[m2.m_ncol * k + j] * m_data[m_ncol * i + k]; pos++; } return p; } /** Multiplies a matrix by a vector. */ CVector CMatrix::operator*(const CVector &v) const { if (m_ncol != v.size()) throw invalid_argument("CMatrix::operator*: dimension mismatch!"); // result is initialised to zero CVector p(m_nrow); size_t pos = 0; for (size_t i = 0; i < m_nrow; i++) { for (size_t k=0; k < m_ncol; k++) { p[i] += m_data[pos] * v[k]; pos++; } } return p; } sailcut-1.3.5/src/formdocument.h0000644000175000007640000000672311177775326016576 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef FORMDOCUMENT_H #define FORMDOCUMENT_H #include #include #include "filewriter.h" #include "sailviewer-tabs.h" using namespace std; // forward definitions class CPrefs; class QMenu; #define T_KEYPRESS \ void keyPressEvent(QKeyEvent * e) { \ tabs->panel[tabs->currentIndex()]->keyPressEvent(e); \ }; /** A dialog holding a Sailcut document. */ class CFormDocument : public QWidget { Q_OBJECT public: /** The constructor. */ CFormDocument(CPrefs *myPrefs, QWidget *parent) : QWidget(parent), prefs(myPrefs) {}; /** Open a file. */ virtual bool open(const QString &newfile) = 0; /** Save to the current file. */ virtual bool save() = 0; /** Save to a user-specified file. */ virtual bool saveAs() = 0; public: /** Extra submenus for the File menu */ vector extraFileMenus; /** Extra actions for the View menu */ vector extraViewActions; /** The current filename. */ QString filename; protected: /** The user preferences. */ CPrefs *prefs; /** An optional tabbed widget */ CSailViewerTabs *tabs; }; template class CFormDocumentTmpl : public CFormDocument { public: /** The constructor. * * @params myPrefs */ CFormDocumentTmpl(CPrefs *myPrefs, QWidget *parent) : CFormDocument(myPrefs, parent) {} ; /** * Reads the definition from an XML file. */ virtual bool open(const QString &newfile) { try { deftype newdef = writertype().read(newfile); setDef(newdef); filename = newfile; return true; } catch (read_error e) { writertype::readErrorMessage(); } return false; }; /** * Saves the definition to an XML file. */ virtual bool save() { if ( filename.isEmpty() ) return saveAs(); // try writing to file, catch exception try { writertype().write(def, filename); return true; } catch (write_error e) { writertype::writeErrorMessage(); } return false; }; /** * Opens a dialog to select the XML to which the definition should be saved. */ virtual bool saveAs() { QString newfile = writertype().writeDialog(def, filename); if ( !newfile.isNull() ) { filename = newfile; return true; } return false; }; protected: virtual void setDef(const deftype& newdef) = 0; protected: deftype def; }; #endif sailcut-1.3.5/src/widgetprofilevert.cpp0000644000175000007640000001241611177775326020170 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "widgetprofilevert.h" #include "sailcpp/sailcalc.h" #include "sailcpp/sailmould.h" #include #include #include #include /************************************************************************** CLabelProfileVert class **************************************************************************/ /** The constructor. * * @param parent the parent dialog * @param ptr pointer to the CSailMould */ CLabelProfileVert::CLabelProfileVert( QWidget *parent, CSailMould *ptr) : QLabel(parent), mould(ptr), wasResized(true) { // set the background to white QPalette pal = palette(); pal.setColor( QPalette::Background, Qt::white ); setPalette( pal ); setMinimumSize( QSize( 120, 400 ) ); } /** Display the vertical repartition in the drawing area. */ void CLabelProfileVert::paintEvent( QPaintEvent *) { QPainter painter( this ); QRect vRect = painter.viewport(); painter.eraseRect(vRect); CRect3d objRect; objRect.max = CPoint3d(0.22, 1); if ( wasResized ) { CRect3d viewRect; viewRect.max = CPoint3d(vRect.width(), vRect.height()); m_lRect = calcLRect(viewRect, objRect, objRect.center(), 0.8); wasResized = 0; } QPoint prev, next; unsigned int nbpoints = 32; real z, y; // z is horizontal and y is vertical upward real scale = vRect.height() / m_lRect.height(); // do a translation to have from z=0 to z=scale centered painter.translate( (m_lRect.width() / 2 - objRect.center().x()) * scale, vRect.height() + (objRect.center().y() - m_lRect.height()/2) * scale ); // flip coordinate system to have the y axis pointing up painter.scale(1,-1); prev = QPoint( int(scale * mould->interpol(0).getDepth()), 0 ); for (unsigned i = 1; i < nbpoints; i++) { y = real(i) / (nbpoints-1); z = mould->interpol(y).getDepth(); next = QPoint( int(scale * z) , int(scale * y)); painter.drawLine(prev, next); prev = next; } } /** The draw area has been resized. */ void CLabelProfileVert::resizeEvent( QResizeEvent * ) { wasResized = 1; } /************************************************************************** CWidgetProfileVert class **************************************************************************/ /** The constructor. * * @param parent the parent dialog * @param mouldptr pointer to the CSailMould * @param caption caption for the profile view (e.g. top,middle..) */ CWidgetProfileVert::CWidgetProfileVert(QWidget *parent, CSailMould *mouldptr, QString caption) : QWidget(parent), sailmould(mouldptr) { QHBoxLayout *layout = new QHBoxLayout( this ); grpVertical = new QGroupBox( this ); grpVertical->setTitle(caption); QVBoxLayout *grpVerticalLayout = new QVBoxLayout(grpVertical); //////////// QHBoxLayout *drawVerticalHBox = new QHBoxLayout(); // add depth vertical repartition draw area lblDrawVert = new CLabelProfileVert( grpVertical, sailmould ); drawVerticalHBox->addWidget( lblDrawVert ); // add vertical slider for mid depth position sliderVertical = new QSlider( grpVertical ); sliderVertical->setMinimum( 30 ); sliderVertical->setMaximum( 70 ); sliderVertical->setOrientation( Qt::Vertical ); sliderVertical->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); //sliderVertical->setValue( 100 - sailmould->vertpos ); sliderVertical->setValue( sailmould->vertpos ); drawVerticalHBox->addWidget( sliderVertical ); grpVerticalLayout->addItem( drawVerticalHBox ); ///////////// QHBoxLayout *lblVerticalHBox = new QHBoxLayout(); lblVertical = new QLabel( grpVertical ); lblVertical->setAlignment( Qt::AlignCenter ); lblVerticalHBox->addWidget( lblVertical ); grpVerticalLayout->addItem( lblVerticalHBox ); ///////////// layout->addWidget( grpVertical ); slotSliderVert(); connect( sliderVertical, SIGNAL( valueChanged(int) ), this, SLOT( slotSliderVert() ) ); } /** Trigered when the user moves the vertical repartition slider. */ void CWidgetProfileVert::slotSliderVert() { // store new value of vertical position of mid profile and update label //sailmould->vertpos = 100 - sliderVertical->value(); sailmould->vertpos = sliderVertical->value(); lblVertical->setText( QString::number(sailmould->vertpos) ); // update vertical profile view lblDrawVert->update(); } sailcut-1.3.5/src/sailwriter-dxf.cpp0000644000175000007640000004065411177775326017374 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "sailwriter-dxf.h" #include #define DXF_ENTITY 0 #define DXF_NAME 2 #define DXF_LINE 6 #define DXF_LAYER 8 #define DXF_X 10 #define DXF_Y 20 #define DXF_Z 30 #define DXF_COLOR 62 #define DXF_FLAG 70 #define DXF_COMMENT 999 #define DXF_BLACK "0" #define DXF_RED "1" #define DXF_YELLOW "2" #define DXF_GREEN "3" #define DXF_CYAN "4" #define DXF_BLUE "5" #define DXF_MAGENTA "6" #define DXF_WHITE "7" /*********************************** DXF components ***********************************/ /** Write a DXF atom to the file output stream. * * @param out the output stream * @param code atom code * @param content atom content */ void CSailDxfWriter::writeAtom(ofstream &out, int code, const QString& content) const { out << code << endl << string(content.toLocal8Bit()) << endl; } /** Open the given file, then write comment and header section. * * @param out the output stream * @param filename the output file name */ void CSailDxfWriter::writeBegin(ofstream &out, const QString &filename) const { out.open(QFile::encodeName(filename),ios::out); if (!out.is_open()) throw write_error("CSailDxfWriter::writeBegin : unable to write to specified file"); // write comment writeAtom(out, DXF_COMMENT, "DXF created by Sailcut CAD"); // write header section writeAtom(out, DXF_ENTITY, "SECTION"); writeAtom(out, DXF_NAME, "HEADER"); writeAtom(out, DXF_ENTITY, "ENDSEC"); } /** Write end of file then close file. * * @param out the output stream */ void CSailDxfWriter::writeEnd(ofstream &out) const { writeAtom(out, DXF_ENTITY, "EOF"); out.close(); } /** Write a triangular face to the file output stream. * * @param out the output stream * @param p0 first point * @param p1 second point * @param p2 third point * @param layer */ void CSailDxfWriter::writeFace(ofstream &out, CPoint3d p0, CPoint3d p1, CPoint3d p2, unsigned int layer) const { // skip empty face real area = CVector3d(p1 -p0).cross(p2 - p0).norm(); //cout << "area : " << area << endl; if ( area < EPS ) { cout << "CSailDxfWriter::writeFace : skipping empty face" << endl; return; } writeAtom(out, DXF_ENTITY, "3DFACE"); // set the layer writeAtom(out, DXF_LAYER, QString::number(layer)); // set the points writeAtom(out, DXF_X, QString::number(p0.x())); writeAtom(out, DXF_Y, QString::number(p0.y())); writeAtom(out, DXF_Z, QString::number(p0.z())); writeAtom(out, DXF_X + 1, QString::number(p1.x())); writeAtom(out, DXF_Y + 1, QString::number(p1.y())); writeAtom(out, DXF_Z + 1, QString::number(p1.z())); writeAtom(out, DXF_X + 2, QString::number(p2.x())); writeAtom(out, DXF_Y + 2, QString::number(p2.y())); writeAtom(out, DXF_Z + 2, QString::number(p2.z())); // duplicate last point for stupid AutoCAD writeAtom(out, DXF_X + 3, QString::number(p2.x())); writeAtom(out, DXF_Y + 3, QString::number(p2.y())); writeAtom(out, DXF_Z + 3, QString::number(p2.z())); } /** Write a DXF layer to the file output stream. * * @param out the output stream * @param layer * @param color the color */ void CSailDxfWriter::writeLayer(ofstream &out, unsigned int layer, const QString &color) const { writeAtom(out, DXF_ENTITY, "LAYER"); writeAtom(out, DXF_NAME, QString::number(layer)); writeAtom(out, DXF_FLAG, "64"); writeAtom(out, DXF_COLOR, color); writeAtom(out, DXF_LINE, "CONTINUOUS"); } /** Write a DXF Polyline header to the file output stream. * * @param out the output stream * @param layer * @param color the color */ void CSailDxfWriter::writePolyline(ofstream &out, unsigned int layer, const QString &color) const { writeAtom(out, DXF_ENTITY, "POLYLINE"); // set the layer writeAtom(out, DXF_LAYER, QString::number(layer)); // set color writeAtom(out, DXF_COLOR, color); // set vertice follows flag writeAtom(out, 66, "1"); // set line type writeAtom(out, DXF_LINE, "CONTINUOUS"); } /** Write a 2D DXF Vertex to the file output stream. * * @param out the output stream * @param pt point * @param layer */ void CSailDxfWriter::writeVertex(ofstream &out, CPoint3d pt, unsigned int layer) const { writeAtom(out, DXF_ENTITY, "VERTEX"); // set the layer writeAtom(out, DXF_LAYER, QString::number(layer)); // set 3D flag //writeAtom(out, DXF_FLAG, "32"); // flag 3D vertex // set the points writeAtom(out, DXF_X, QString::number(pt.x())); writeAtom(out, DXF_Y, QString::number(pt.y())); //writeAtom(out, DXF_Z, QString::number(pt.z())); // for 3D } /*********************************** 2D DXF export ***********************************/ /** Writes a CPanelGroup to a simple DXF file. * * @param sail the sail to write * @param filename the file to write to */ void CSailDxfWriter2d::write(const CPanelGroup &sail, const QString &filename) const { switch (type) { case NORMAL: writeNormal(sail, filename); break; case BLOCKS: writeBlocks(sail, filename); break; case SPLIT: writeSplit(sail, filename); break; } } /** Writes a CPanelGroup to a simple 2D DXF file, one panel per layer. * * @param sail the sail to write * @param filename the file to write to */ void CSailDxfWriter2d::writeNormal(const CPanelGroup &sail, const QString &filename) const { ofstream out; unsigned int pn; // open file, write comment and header writeBegin(out, filename); // write tables section writeAtom(out, DXF_ENTITY, "SECTION"); writeAtom(out, DXF_NAME, "TABLES"); writeAtom(out, DXF_ENTITY, "TABLE"); writeAtom(out, DXF_NAME, "LAYER"); writeAtom(out, DXF_FLAG, "6"); for (pn = 0; pn < sail.size(); pn++) writeLayer(out, pn+1, DXF_GREEN); writeAtom(out, DXF_ENTITY, "ENDTAB"); writeAtom(out, DXF_ENTITY, "ENDSEC"); // write entities section writeAtom(out, DXF_ENTITY, "SECTION"); writeAtom(out, DXF_NAME, "ENTITIES"); // loop over panels //////// for (pn = 0; pn < sail.size(); pn++) writePanel(out, sail[pn], pn+1); writeAtom(out, DXF_ENTITY, "ENDSEC"); // end of file writeEnd(out); } /** Writes a CPanelGroup to a 2D DXF file with one block per panel on different layer. * * @param sail the sail to write * @param filename the file to write to */ void CSailDxfWriter2d::writeBlocks(const CPanelGroup &sail, const QString &filename) const { ofstream out; unsigned int pn; // open file, write comment and header writeBegin(out, filename); // write tables section writeAtom(out, DXF_ENTITY, "SECTION"); writeAtom(out, DXF_NAME, "TABLES"); writeAtom(out, DXF_ENTITY, "TABLE"); writeAtom(out, DXF_NAME, "LAYER"); writeAtom(out, DXF_FLAG, "16"); for (pn = 0; pn < sail.size(); pn++) writeLayer(out, pn+1, DXF_GREEN); writeAtom(out, DXF_ENTITY, "ENDTAB"); writeAtom(out, DXF_ENTITY, "ENDSEC"); // write entities section writeAtom(out, DXF_ENTITY, "SECTION"); writeAtom(out, DXF_NAME, "BLOCKS"); for (pn = 0; pn < sail.size(); pn++) { writeAtom(out, DXF_ENTITY, "BLOCK"); writeAtom(out, 100, "AcDbEntity"); writeAtom(out, DXF_LAYER, QString::number(pn+1)); writeAtom(out, 100, "AcDbBlockBegin"); writeAtom(out, DXF_NAME, "panel "+QString::number(pn+1)); writeAtom(out, DXF_FLAG, "1"); writeAtom(out, DXF_X, "0"); writeAtom(out, DXF_Y, "0"); writeAtom(out, DXF_Z, "0"); writeAtom(out, 3, "panel "+QString::number(pn+1)); writePanel(out, sail[pn], pn+1); writeAtom(out, DXF_ENTITY, "ENDBLCK"); writeAtom(out, 100, "AcDbBlockEnd"); } writeAtom(out, DXF_ENTITY, "ENDSEC"); // end of BLOCKS section // end of file writeEnd(out); } /** Writes a CPanelGroup to a 2D DXF file with one file per panel. * * @param sail the sail to write * @param filename the file to write to */ void CSailDxfWriter2d::writeSplit(const CPanelGroup &sail, const QString &basename) const { //cout << "Not implemented yet" << endl; ofstream out; unsigned int pn; for (pn = 0; pn < sail.size(); pn++) { QString filename = basename; filename.replace(".dxf", QString("-%1.dxf").arg(pn)); // open file, write comment and header writeBegin(out, filename); // write tables section writeAtom(out, DXF_ENTITY, "SECTION"); writeAtom(out, DXF_NAME, "TABLES"); writeAtom(out, DXF_ENTITY, "TABLE"); writeAtom(out, DXF_NAME, "LAYER"); writeAtom(out, DXF_FLAG, "6"); writeLayer(out, 1, DXF_CYAN); writeAtom(out, DXF_ENTITY, "ENDTAB"); writeAtom(out, DXF_ENTITY, "ENDSEC"); // write entities section writeAtom(out, DXF_ENTITY, "SECTION"); writeAtom(out, DXF_NAME, "ENTITIES"); writePanel(out, sail[pn], 1); writeAtom(out, DXF_ENTITY, "ENDSEC"); // end of file writeEnd(out); } } /** Write a single 2D DXF developed panel draw and cut edges to the file output stream. * * @param out the output stream * @param panel the panel to be written * @param layer the layer on which the panel is written */ void CSailDxfWriter2d::writePanel(ofstream &out, const CPanel &panel, unsigned int layer) const { //writeAtom(out, DXF_COMMENT, panel.label.name); CSide top = panel.top; CSide btm = panel.bottom; CSide left = panel.left; CSide right = panel.right; CSide ctop = panel.cutTop; CSide cbtm = panel.cutBottom; CSide cleft = panel.cutLeft; CSide cright = panel.cutRight; CPoint3d pt; CVector3d V; unsigned int i=0; int j=0; //// polyline header for draw line writePolyline(out, layer, DXF_BLUE); // left edge pt = left[0]; writeVertex(out, pt, layer); for (i = 1; i < left.size(); i++) { V= left[i] - pt; if (V.norm()> EPS) { pt = left[i]; writeVertex(out, pt, layer); } } // panel top edge for (i = 0; i < top.size(); i++) { V = top[i] - pt; if (V.norm() > EPS) { pt = top[i]; writeVertex(out, pt, layer); } } // panel right edge for (j = right.size()-1; j > - 1; j--) { V = right[j] - pt; if (V.norm() > EPS) { pt = right[j]; writeVertex(out, pt, layer); } } // panel bottom edge for (j = btm.size()-1; j > -1; j--) { V = btm[j] - pt; if (V.norm() > EPS) { pt = btm[j]; writeVertex(out, pt, layer); } } // close the circuit to start point pt = left[0]; writeVertex(out, pt, layer); writeAtom(out, DXF_ENTITY, "SEQEND"); // end draw line //// polyline header for cut line writePolyline(out, layer, DXF_RED); // left edge pt = cleft[0]; writeVertex(out, pt, layer); for (i = 1; i < left.size(); i++) { V= cleft[i] - pt; if (V.norm()> EPS) { pt = cleft[i]; writeVertex(out, pt, layer); } } // panel top edge for (i = 0; i < top.size(); i++) { V = ctop[i] - pt; if (V.norm() > EPS) { pt = ctop[i]; writeVertex(out, pt, layer); } } // panel right edge for (j = right.size()-1; j > - 1; j--) { V = cright[j] - pt; if (V.norm() > EPS) { pt = cright[j]; writeVertex(out, pt, layer); } } // panel bottom edge for (j = btm.size()-1; j > -1; j--) { V = cbtm[j] - pt; if (V.norm() > EPS) { pt = cbtm[j]; writeVertex(out, pt, layer); } } // close the circuit to start point pt = cleft[0]; writeVertex(out, pt, layer); writeAtom(out, DXF_ENTITY, "SEQEND"); // end cut line } /*********************************** 3D DXF export ***********************************/ /** Writes a 3D CPanelGroup to a 3D DXF file. * * @param sail the sail to write * @param filename the file to write to */ void CSailDxfWriter3d::write(const CPanelGroup &sail, const QString &filename) const { switch (type) { case NORMAL: writeNormal(sail, filename); break; case SPLIT: writeSplit(sail, filename); break; } } /** Writes a 3D CPanelGroup to a 3D DXF file with one panel per layer. * * @param sail the sail to write * @param filename the file to write to */ void CSailDxfWriter3d::writeNormal(const CPanelGroup &sail, const QString &filename) const { ofstream out; unsigned int pn; // open file, write comment and header writeBegin(out, filename); // write tables section writeAtom(out, DXF_ENTITY, "SECTION"); writeAtom(out, DXF_NAME, "TABLES"); writeAtom(out, DXF_ENTITY, "TABLE"); writeAtom(out, DXF_NAME, "LAYER"); writeAtom(out, DXF_FLAG, "6"); for (pn = 0; pn < sail.size(); pn++) writeLayer(out, pn + 1, (pn % 2) ? DXF_YELLOW : DXF_CYAN); writeAtom(out, DXF_ENTITY, "ENDTAB"); writeAtom(out, DXF_ENTITY, "ENDSEC"); // write entities section writeAtom(out, DXF_ENTITY, "SECTION"); writeAtom(out, DXF_NAME, "ENTITIES"); for (pn = 0; pn < sail.size(); pn++) writePanel(out, sail[pn], pn + 1); writeAtom(out, DXF_ENTITY, "ENDSEC"); // end of file writeEnd(out); } /** Write a single 3D DXF panel to the file output stream. * * @param out the output stream * @param panel the number of the panel to be written * @param layer the layer on which the panel is written */ void CSailDxfWriter3d::writePanel(ofstream &out, const CPanel &panel, unsigned int layer) const { //writeAtom(out, DXF_COMMENT, panel.label.name); //writeAtom(out, DXF_COMMENT, QString("panel : ") + QString::number(panel)); CSide top = panel.top; CSide btm = panel.bottom; CSide left = panel.left; CSide right = panel.right; CPoint3d pt; unsigned int i=0; // left triangle fan pt = (left[0]+left[left.size()-1])*0.5; for (i = 1; i < left.size(); i++) writeFace(out, pt, left[i-1], left[i], layer); // panel triangle strip for (i = 1; i < top.size(); i++) { writeFace(out, top[i-1], btm[i-1], top[i], layer); writeFace(out, top[i], btm[i], btm[i-1], layer); } // right triangle fan pt = (right[0]+right[right.size()-1])*0.5; for (i = 1; i < right.size(); i++) writeFace(out, pt, right[i-1], right[i], layer); } /** Writes a 3D CPanelGroup to a 3D DXF file with one file per panel. * * @param sail the sail to write * @param filename the file to write to */ void CSailDxfWriter3d::writeSplit(const CPanelGroup &sail, const QString &basename) const { ofstream out; for (unsigned int pn = 0; pn < sail.size(); pn++) { QString filename = basename; filename.replace(".dxf", QString("-%1.dxf").arg(pn)); // open file, write comment and header writeBegin(out, filename); // write tables section writeAtom(out, DXF_ENTITY, "SECTION"); writeAtom(out, DXF_NAME, "TABLES"); writeAtom(out, DXF_ENTITY, "TABLE"); writeAtom(out, DXF_NAME, "LAYER"); writeAtom(out, DXF_FLAG, "6"); writeLayer(out, 1, DXF_CYAN); writeAtom(out, DXF_ENTITY, "ENDTAB"); writeAtom(out, DXF_ENTITY, "ENDSEC"); // write entities section writeAtom(out, DXF_ENTITY, "SECTION"); writeAtom(out, DXF_NAME, "ENTITIES"); writePanel(out, sail[pn], 1); writeAtom(out, DXF_ENTITY, "ENDSEC"); // end of file writeEnd(out); } } sailcut-1.3.5/src/formsail.cpp0000644000175000007640000002323411177775326016237 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "formprint.h" #include "formsail.h" #include "formsaildef.h" #include "formmould.h" // for HAVE_QSVGGENERATOR #include "sailcutqt.h" #include "sailprinter.h" #include "sailcpp/sailworker.h" #include "sailwriter-carlson.h" #include "sailwriter-dxf.h" #include "sailwriter-hand.h" #include "sailwriter-svg.h" #include "sailwriter-txt.h" #include #include #include #include #include /** * Constructs a window to display a sail. * * @param myPrefs the user preferences * @param parent the parent widget */ CFormSail::CFormSail(CPrefs *myPrefs, QWidget *parent) : CFormDocumentTmpl (myPrefs, parent) { setMinimumSize( QSize( 300, 220 ) ); // create menu bar setupMenuBar(); // create main widget setupMainWidget(); // set language languageChange(); // set initial definition setDef(def); } /** * Sets the strings of the subwidgets using the current * language. */ void CFormSail::languageChange() { setWindowTitle( tr("sail") ); // print submenu menuPrint->setTitle( tr("&Print") ); actionPrintData->setText( tr("data") ); actionPrintDwg->setText( tr("drawing") ); actionPrintDev->setText( tr("development") ); // export 3d submenu menuExport3d->setTitle( tr("E&xport 3D sail") ); actionExport3dDXF->setText( tr("to &DXF") ); actionExport3dDXFSplit->setText( tr("to DXF (split)") ); #ifdef HAVE_QSVGGENERATOR actionExport3dSVG->setText( tr("to &SVG") ); #endif actionExport3dTXT->setText( tr("to &TXT sail") ); actionExport3dXML->setText( tr("to &XML sail") ); // export flat submenu menuExportFlat->setTitle( tr("Export &development") ); actionExportFlatCarlson->setText( tr("to &Carlson plotter") ); actionExportFlatDXF->setText( tr("to &DXF") ); actionExportFlatDXFSplit->setText( tr("to DXF (split)") ); //actionExportFlatDXFBlocks->setText( tr("to &DXF-BLOCKS") ); actionExportFlatHand->setText( tr("to &Hand-plotting format") ); #ifdef HAVE_QSVGGENERATOR actionExportFlatSVG->setText( tr("to &SVG") ); #endif actionExportFlatTXT->setText( tr("to &TXT sail") ); actionExportFlatXML->setText( tr("to &XML sail") ); // view menu actionViewDef->setText( tr("&Dimensions") ); actionViewMould->setText( tr("&Mould") ); actionViewPatch->setText( tr("&Patches") ); // tabs tabs->languageChange(); tabs->setTabText(tabs->panel.size()-1, tr("development")); } /** * Replaces the current sail definition. * * @param newdef */ void CFormSail::setDef(const CSailDef& newdef) { def = newdef; sail = CSailWorker(def).makeSail(flatsail,dispsail); tabs->setObject(sail); tabs->panel[tabs->panel.size()-1]->setObject(dispsail); } /** * Creates the menu bar */ void CFormSail::setupMenuBar() { // File sub menus // // print submenu menuPrint = new QMenu(this); actionPrintData = menuPrint->addAction("", this, SLOT( slotPrintData() )); actionPrintDwg = menuPrint->addAction("", this, SLOT( slotPrintDwg() )); actionPrintDev = menuPrint->addAction("", this, SLOT( slotPrintDev() )); extraFileMenus.push_back(menuPrint); // export 3d submenu menuExport3d = new QMenu(this); actionExport3dDXF = menuExport3d->addAction("", this, SLOT( slotExportDXF() ) ); actionExport3dDXFSplit = menuExport3d->addAction("", this, SLOT( slotExportDXFSplit() ) ); #ifdef HAVE_QSVGGENERATOR actionExport3dSVG = menuExport3d->addAction("", this, SLOT( slotExportSVG() ) ); #endif actionExport3dTXT = menuExport3d->addAction("", this, SLOT( slotExportTXT() ) ); actionExport3dXML = menuExport3d->addAction("", this, SLOT( slotExportXML() ) ); extraFileMenus.push_back(menuExport3d); // export flat submenu menuExportFlat = new QMenu(this); //menuFile->addMenu(""); actionExportFlatCarlson = menuExportFlat->addAction("", this, SLOT( slotExportFlatCarlson() ) ); actionExportFlatDXF = menuExportFlat->addAction("", this, SLOT( slotExportFlatDXF() ) ); actionExportFlatDXFSplit = menuExportFlat->addAction("", this, SLOT( slotExportFlatDXFSplit() ) ); //actionExportFlatDXFBlocks = menuExportFlat->addAction("", this, SLOT( slotExportFlatDXFBlocks() ) ); actionExportFlatHand = menuExportFlat->addAction("", this, SLOT( slotExportFlatHand() ) ); #ifdef HAVE_QSVGGENERATOR actionExportFlatSVG = menuExportFlat->addAction("", this, SLOT( slotExportFlatSVG() ) ); #endif actionExportFlatTXT = menuExportFlat->addAction("", this, SLOT( slotExportFlatTXT() ) ); actionExportFlatXML = menuExportFlat->addAction("", this, SLOT( slotExportFlatXML() ) ); extraFileMenus.push_back(menuExportFlat); // View actions actionViewDef = new QAction(this); connect( actionViewDef, SIGNAL( triggered() ), this, SLOT( slotDef() ) ); extraViewActions.push_back(actionViewDef); actionViewMould = new QAction(this); connect( actionViewMould, SIGNAL( triggered() ), this, SLOT ( slotMould() ) ); extraViewActions.push_back(actionViewMould); // TODO : enable the following action when the patch viewer is ready actionViewPatch = new QAction(this); actionViewPatch->setEnabled(false); extraViewActions.push_back(actionViewPatch); } /** * Creates the main widget */ void CFormSail::setupMainWidget() { tabs = new CSailViewerTabs(this); tabs->addViewer(new CSailViewerPanel(NULL, WIREFRAME, false)); // create tabs QGridLayout *layout = new QGridLayout(this); layout->addWidget(tabs); } /** * Displays the sail CFormSailDef sail definition dialog. */ void CFormSail::slotDef() { // we pass the CFormSailDef a pointer to a copy of the sail definition so // that it can update it if necessary CSailDef defcopy = def; if ( CFormSailDef(this , &defcopy).exec() ) { // we returned from the dialog with an 'OK', setDef(defcopy); } } /** * Export the 3D sail to a DXF file. */ void CFormSail::slotExportDXF() { CSailDxfWriter3d(CSailDxfWriter3d::NORMAL).writeDialog(sail); } /** * Export the 3D sail to several DXF files (one per panel). */ void CFormSail::slotExportDXFSplit() { CSailDxfWriter3d(CSailDxfWriter3d::SPLIT).writeDialog(sail); } /** * Exports the 3D sail to an SVG file. */ void CFormSail::slotExportSVG() { #ifdef HAVE_QSVGGENERATOR CSailSvgWriter().writeDialog(sail); #endif } /** * Exports the 3D sail to a TXT file. */ void CFormSail::slotExportTXT() { CSailTxtWriter().writeDialog(sail); } /** * Exports the 3D sail to an XML file. */ void CFormSail::slotExportXML() { CPanelGroupXmlWriter().writeDialog(sail); } /** * Exports the flat sail to a Carlson plotter file */ void CFormSail::slotExportFlatCarlson() { CSailCarlsonWriter().writeDialog(flatsail); } /** * Exports the flat sail with panels staggered as displayed to a DXF file */ void CFormSail::slotExportFlatDXF() { CSailDxfWriter2d(CSailDxfWriter2d::NORMAL).writeDialog(dispsail); } /** * Export the flat sail to several DXF files (one per panel). */ void CFormSail::slotExportFlatDXFSplit() { CSailDxfWriter2d(CSailDxfWriter2d::SPLIT).writeDialog(flatsail); } /** * Exports the flat sail with panels superimposed to a DXF file with blocks */ void CFormSail::slotExportFlatDXFBlocks() { // FIXME: shouldn't this be BLOCKS ? CSailDxfWriter2d(CSailDxfWriter2d::NORMAL).writeDialog(flatsail); } /** * Exports the flat sail to a "hand" sail file. */ void CFormSail::slotExportFlatHand() { CSailHandWriter().writeDialog(flatsail); } /** * Exports the flat sail to an SVG file. */ void CFormSail::slotExportFlatSVG() { #ifdef HAVE_QSVGGENERATOR CSailSvgWriter().writeDialog(dispsail); #endif } /** * Exports the flat sail to a TXT sail file. */ void CFormSail::slotExportFlatTXT() { CSailTxtWriter().writeDialog(flatsail); } /** * Exports the flat sail to an XML sail file */ void CFormSail::slotExportFlatXML() { CPanelGroupXmlWriter().writeDialog(flatsail); } /** * Displays the CFormMould sail mould definition dialog. */ void CFormSail::slotMould() { // we pass the CFormMould a pointer to a copy of the sail mould so // that it can update it if necessary CSailDef defcopy = def; if ( CFormMould(this , &defcopy.mould).exec() ) { // we returned from the dialog with an 'OK' setDef(defcopy); } } /** * Print the current sail data. */ void CFormSail::slotPrintData() { CSailDataPrinter prt(def); CFormPrint(&prt, QPrinter::Portrait).exec(); } /** * Print the current developed sail drawings one panel per page * with coordinates of key points for handplotting. */ void CFormSail::slotPrintDev() { CSailDevelPrinter prt(flatsail); CFormPrint(&prt, QPrinter::Landscape).exec(); } /** * Print the current sail drawing. */ void CFormSail::slotPrintDwg() { CSailDrawingPrinter prt(sail); CFormPrint(&prt, QPrinter::Portrait).exec(); } sailcut-1.3.5/src/saildisplabel.cpp0000644000175000007640000000520211177775326017226 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "saildisplabel.h" #include "sailpainter.h" #include /** Constructs a QLabel based view area. */ CSailDispLabel::CSailDispLabel( QWidget * parent ) : QLabel( parent ), wasResized(true) { // set the background to white QPalette pal = palette(); pal.setColor( QPalette::Background, Qt::white ); setPalette( pal ); } /** Forces a redraw of the view area. */ void CSailDispLabel::redraw() { update(); } /** We received a mouse click. */ void CSailDispLabel::mousePressEvent ( QMouseEvent *event ) { if (event->button() == Qt::LeftButton) { setCenter(screenToLogical(event->pos().x(),event->pos().y())); redraw(); } } /** We received a request to paint the drawing area. */ void CSailDispLabel::paintEvent( QPaintEvent * ) { // erase viewport CSailPainter painter( this ); QRect rect = painter.viewport(); painter.eraseRect(rect); // check if the window was resized since last redraw if ( wasResized ) { setViewRect(painter.viewRect()); wasResized = 0; } // set coordinate system to match the logical viewport painter.setWindow(getLogicalRect()); // draw the sail painter.draw(dispObject); // optionally draw labels if (drawLabels) { painter.setFontSize(8, zoom); painter.drawLabels(dispObject); /*/ draw markers on edges for test purpose painter.setFontSize(10, zoom/10); painter.drawMarkers(dispObject); */ } // painter.end(); } /** The draw area has been resized. */ void CSailDispLabel::resizeEvent( QResizeEvent * ) { wasResized = 1; } /** We received a mouse wheel movement. */ void CSailDispLabel::wheelEvent( QWheelEvent *event) { if (event->delta()>0) zoomIn(); else zoomOut(); redraw(); } sailcut-1.3.5/src/formmould.cpp0000644000175000007640000000654411177775326016434 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "formmould.h" #include "widgetprofile.h" #include "widgetprofilevert.h" #include "sailcpp/sailmould.h" #include #include #include #include #include #include /** The constructor. * * @param parent the parent dialog * @param mouldptr pointer to the CSailMould */ CFormMould::CFormMould( QWidget *parent, CSailMould *mouldptr ) : QDialog(parent) { setModal(true); setWindowTitle( tr( "Sail mould" ) ); // we store the pointer to the CSailMould so we can update it when // the user clicks OK sailmould = mouldptr; setSizeGripEnabled( TRUE ); QGridLayout* CFormMouldLayout = new QGridLayout( this ); // Add the buttons at the bottom of the screen QHBoxLayout* buttonsLayout = new QHBoxLayout(); buttonsLayout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ) ); buttonOk = new QPushButton( tr("&OK"), this ); buttonOk->setDefault( TRUE ); buttonsLayout->addWidget( buttonOk ); buttonCancel = new QPushButton( tr("&Cancel"), this ); buttonsLayout->addWidget( buttonCancel ); CFormMouldLayout->addLayout( buttonsLayout, 1, 1 ); // add vertical repartition widgetVert = new CWidgetProfileVert( this, sailmould, tr("Vertical repartition") ); CFormMouldLayout->addWidget( widgetVert, 0, 0 ); // add 3 profile areas and bind them to their respective profiles QFrame* frmProfile = new QFrame( this ); frmProfile->setFrameShape( QFrame::NoFrame ); frmProfile->setFrameShadow( QFrame::Raised ); QGridLayout* frmProfileLayout = new QGridLayout( frmProfile ); CFormMouldLayout->addWidget( frmProfile, 0, 1 ); prfTop = new CWidgetProfile( frmProfile, &sailmould->profile[2], tr("Top profile"), widgetVert ); prfMiddle = new CWidgetProfile( frmProfile, &sailmould->profile[1], tr("Middle profile"), widgetVert ); prfBottom = new CWidgetProfile( frmProfile, &sailmould->profile[0], tr("Bottom profile"), widgetVert ); frmProfileLayout->addWidget( prfTop, 0, 0 ); frmProfileLayout->addWidget( prfMiddle, 1, 0 ); frmProfileLayout->addWidget( prfBottom, 2, 0 ); // init //languageChange(); resize( QSize(487, 555).expandedTo(minimumSizeHint()) ); // setting the range for profile spin boxes is done in widgetprofile.cpp prfBottom->spinDepth->setMinimum( 0 ); // signals and slots connections connect( buttonOk, SIGNAL( clicked() ), this, SLOT( accept() ) ); connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( reject() ) ); } sailcut-1.3.5/src/widgetprofile.h0000644000175000007640000000637211177775326016740 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef WIDGETPROFILE_H #define WIDGETPROFILE_H #include #include "sailcpp/sailcalc.h" class QSpinBox; class CProfile; class CWidgetProfileVert; /************************************************************************** CLabelProfile class **************************************************************************/ /** Drawing area fpr a CProfile. */ class CLabelProfile : public QLabel { public: CLabelProfile(QWidget *, CProfile *); protected: void paintEvent( QPaintEvent *); void resizeEvent( QResizeEvent * ); private: /** the CProfile we are displaying */ CProfile* profile; /** the logical viewport rectangle */ CRect3d lRect; /** Has the area been resized since last redraw */ bool wasResized; }; /************************************************************************** CWidgetProfile class **************************************************************************/ /** Widget for displaying a CProfile. It has a display area and 3 spinboxes. * * @see CProfile * @see CLabelProfile * @see CWidgetProfileVert */ class CWidgetProfile : public QWidget { Q_OBJECT public: CWidgetProfile( QWidget*, CProfile*, QString, CWidgetProfileVert* ); protected slots: virtual void languageChange(); void slotChanged(); // member variables public: /** label for luff */ QLabel* lblLuff; /** label for depth */ QLabel* lblDepth; /** label for percent */ QLabel* lblPercent; /** label for leech */ QLabel* lblLeech; /** label for Luff slope value */ QLabel* lblLuffSlopeValue; /** label for Luff slope 'degrees' */ QLabel* lblLuffSlopeDegrees; /** label for max depth position */ QLabel* lblMaxPosValue; /** label for max depth 'cord' */ QLabel* lblMaxPosCord; /** label for leech slope value */ QLabel* lblLeechSlopeValue; /** label for leech slope 'degrees' */ QLabel* lblLeechSlopeDegrees; /** spinbox for luff */ QSpinBox* spinLuff; /** spinbox for depth */ QSpinBox* spinDepth; /** spinbox for leech */ QSpinBox* spinLeech; protected: /** drawing area for the profile */ CLabelProfile* lblDraw; /** widget for the vertical repartition */ CWidgetProfileVert *widgetVert; /** the profile we are displaying */ CProfile* profile; /** active flag to disable slotChanged */ bool active; }; #endif // WIDGETPROFILE_H sailcut-1.3.5/src/formhull.h0000644000175000007640000000251411177775326015716 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef FORMHULL_H #define FORMHULL_H #include "formdocument.h" #include "sailwriter-xml.h" /** Dialog holding a hull. */ class CFormHull : public CFormDocumentTmpl { Q_OBJECT public: CFormHull(CPrefs *myPrefs, QWidget *parent); protected: T_KEYPRESS void setDef(const CHullDef& newdef); void setupMenuBar(); protected slots: virtual void languageChange(); virtual void slotDef(); protected: /** view hull definition */ QAction *actionViewDef; }; #endif sailcut-1.3.5/src/formprint.h0000644000175000007640000000476511177775326016120 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef FORMPRINT_H #define FORMPRINT_H #include #include #include class CFormPrint; class CPrinter; class QDoubleSpinBox; class QToolButton; /** A print preview label. */ class CPrintLabel : public QLabel { Q_OBJECT public: CPrintLabel(CFormPrint *form); /** Get the current page. */ int getPage() { return page; }; double getScale() { return scale; }; void setPage(int page); public slots: void slotPagePrev(); void slotPageNext(); void slotScale(double scale); protected: void resizeEvent(QResizeEvent * event); void paintEvent(QPaintEvent *event); /** scale */ double scale; /** the current page number */ int page; /** the print preview form */ CFormPrint *form; /** is the label currently being resized? */ bool resizing; }; /** A print preview dialog. */ class CFormPrint : public QDialog { Q_OBJECT public: CFormPrint(const CPrinter *printer, enum QPrinter::Orientation orientation); public slots: void slotPrint(); protected: /** display label */ CPrintLabel *label; /** scale label */ QLabel *labelScale; /** scale edit */ QDoubleSpinBox *spinScale; /** left button */ QToolButton *buttonLeft; /** page label */ QLabel *labelPage; /** right button */ QToolButton *buttonRight; /** OK button */ QPushButton *buttonOk; /** Cancel button */ QPushButton *buttonCancel; /** the printer device */ QPrinter printDevice; /** the print engine */ const CPrinter *printEngine; /** the print font size */ int printFontSize; friend class CPrintLabel; }; #endif sailcut-1.3.5/src/formmain.h0000644000175000007640000001036211177775326015676 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef FORMMAIN_H #define FORMMAIN_H #include #include #include #include #include "formdocument.h" // forward definitions class QAction; class QMenu; class QMenuBar; class QStatusBar; class QWorkspace; class QSignalMapper; class CPrefs; class CSailApp; /** The main dialog of the Sailcut application. */ class CFormMain : public QMainWindow { Q_OBJECT public: // construction, destruction CFormMain(CSailApp *myApp, QWidget *parent = 0); void show(const QString newname = QString::null); protected: void closeEvent( QCloseEvent * e); void makeMenuMru(); void open(QString filename); private: void addChild(CFormDocument *child); void setupMenuBar(); void setupMainWidget(); CFormDocument *activeChild(); protected slots: virtual void languageChange(); virtual void slotAbout(); virtual void slotAboutQt(); virtual void slotNew(); virtual void slotOpen(); virtual void slotOpenRecent(); virtual void slotSave(); virtual void slotSaveAs(); virtual void slotHandbook(); virtual void slotLanguage(); virtual void slotUpdateDocumentMenus(); virtual void slotUpdateWindowMenu(); protected: /** The workspace */ QWorkspace *workspace; /** The signal mapper */ QSignalMapper *windowMapper; /** The location of the Sailcut CAD Handbook */ QUrl handbook; /** The application */ CSailApp *app; /** The user preferences */ CPrefs *prefs; /** The status bar */ QStatusBar* statusbar; /** The File menu */ QMenu *menuFile; /** The New submenu */ QMenu *menuFileNew; /** The Help menu */ QMenu *menuHelp; /** The View menu */ QMenu *menuView; /** The Window menu */ QMenu *menuWindow; /** The Language menu */ QMenu *menuLanguage; /** The Most Recently Used files menu */ QMenu *menuRecent; /** Display information about sailcut */ QAction *actionAbout; /** Display information about Qt */ QAction *actionAboutQt; /** Close the active document */ QAction *actionClose; /** Close all documents */ QAction *actionCloseAll; /** Tile document windows */ QAction *actionTile; /** Cascade document windows */ QAction *actionCascade; /** Display the handbook */ QAction *actionHandbook; /** Create a new boat */ QAction *actionNewBoat; /** Create a new hull */ QAction *actionNewHull; /** Create a new rig */ QAction *actionNewRig; /** Create a new sail */ QAction *actionNewSail; /** Open an existing sail definition */ QAction *actionOpen; /** Save the sail definition to a file */ QAction *actionSave; /** Prompt for a filename then write the sail definition to a file */ QAction *actionSaveAs; /** Final separator in the 'File' menu before 'Quit' */ QAction *actionFileSep; /** View the sail definition */ QAction *actionViewDef; /** View the sail mould */ QAction *actionViewMould; /** View the sail patches definition */ QAction *actionViewPatch; /** View the sail rig */ QAction *actionViewRig; /** Separator in the 'Window' menu */ QAction *actionWindowSep; /** Quit */ QAction *actionQuit; /** Extra actions for the file menu */ vector childFileActions; /** Extra actions for the view menu */ vector childViewActions; }; #endif sailcut-1.3.5/src/saildisp.cpp0000644000175000007640000000701211177775326016227 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "saildisp.h" /***************************************************************************** CSailDisp class *****************************************************************************/ /** Constructs a generic view area for a sail. */ CSailDisp::CSailDisp() { // initialise data m = CMatrix::id(3); drawLabels = false; zoom = 0.8; } /** Rotates local copy of the object by a given azimuth and elevation. */ void CSailDisp::calcDispObject() { dispObject = baseObject.rotate( baseRect.center(), m ); } /** Resets display zoom and center to their default values. */ void CSailDisp::resetZoomCenter() { center = baseRect.center(); zoom = 0.8; logicalRect = calcLRect(viewRect, baseRect, center, zoom); } /** Converts screen coordinates to logical coordinates. */ CPoint3d CSailDisp::screenToLogical( const int x, const int y ) const { // avoid division by zero if ((viewRect.width()==0)||(viewRect.height()==0)) return center; return center + CVector3d( logicalRect.width() * ( real(x) / viewRect.width() - 0.5 ), logicalRect.height() * ( 0.5 - real(y) / viewRect.height() ), 0); } /** Sets the azimuth and elevation view angles. * * @param azimuth azimuth in degrees * @param elevation elevation in degrees */ void CSailDisp::setAngle( real azimuth, real elevation ) { m = CMatrix::rot3d(0, PI/180*elevation) * CMatrix::rot3d(1, PI/180*azimuth); calcDispObject(); } /** Sets the center of the display. * * @param newCenter the new center */ void CSailDisp::setCenter( CPoint3d newCenter ) { center = newCenter; logicalRect = calcLRect(viewRect, baseRect, center, zoom); } /** Sets the object that is to be displayed * and center the view. */ void CSailDisp::setObject( const CPanelGroup &obj ) { baseObject = obj; baseRect = baseObject.boundingRect(); // handle case where the bounding rectangle is flat if (baseRect.height() == 0) baseRect.max.y() += 1; if (baseRect.width() == 0) baseRect.max.x() += 1; center = baseRect.center(); calcDispObject(); logicalRect = calcLRect(viewRect, baseRect, center, zoom); } /** Set the size of the viewing rectangle. */ void CSailDisp::setViewRect( const CRect3d &rect ) { viewRect = rect; logicalRect = calcLRect(viewRect, baseRect, center, zoom); } /** Sets the zoom factor * * @param newZoom */ void CSailDisp::setZoom(real newZoom) { zoom = newZoom; logicalRect = calcLRect(viewRect, baseRect, center, zoom); } /** Zooms IN by a factor 2. */ void CSailDisp::zoomIn() { setZoom(zoom * 2); } /** Zooms OUT by a factor 2. */ void CSailDisp::zoomOut() { setZoom(zoom / 2); } sailcut-1.3.5/src/formsaildef.cpp0000644000175000007640000010323711340573526016706 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include "formsaildef.h" #include "sailcpp/sailworker.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// /** The constructor. * * @param parent the parent window * @param sailptr pointer to the CSailDef */ CFormSailDef::CFormSailDef( QWidget* parent, CSailDef * sailptr ) : QDialog(parent) { setupUi(this); setModal(true); /* we store the pointer to the CSailDef so we can update it when the user clicks OK */ saildef = sailptr; /** Write all the sail data to the screen dimensions of sail. */ setSailCut( saildef->sailCut ); setSailType( saildef->sailType ); txtSailID->setText(QString::fromStdString(saildef->sailID)); txtLOA->setText( QString::number(saildef->LOA ) ); txtTriangBase->setText( QString::number(saildef->foreJ ) ); txtTriangHoist->setText( QString::number(saildef->foreI ) ); txtClothWidth->setText( QString::number( saildef->clothW ) ); txtSeamWidth->setText( QString::number( saildef->seamW ) ); txtLeechHemWidth->setText( QString::number( saildef->leechHemW ) ); txtFootHemWidth->setText( QString::number( saildef->footHemW ) ); txtHemsWidth->setText( QString::number( saildef->hemsW ) ); txtTackDist->setText( QString::number( saildef->tackX ) ); txtTackHeight->setText( QString::number( saildef->tackY ) ); txtRake->setText( QString::number( saildef->rake ) ); txtLuffLen->setText( QString::number( saildef->luffL ) ); txtLuffRound->setText( QString::number( saildef->luffR ) ); txtLuffRoundPos->setText( QString::number( saildef->luffRP ) ); txtGaffAngle->setText( QString::number( saildef->gaffDeg ) ); txtGaffLen->setText( QString::number( saildef->gaffL ) ); txtGaffRound->setText( QString::number( saildef->gaffR ) ); txtLeechLen->setText( QString::number( saildef->leechL ) ); txtLeechRound->setText( QString::number( saildef->leechR ) ); txtLeechRoundPos->setText( QString::number( saildef->leechRP ) ); txtFootLen->setText( QString::number( saildef->footL ) ); txtFootRound->setText( QString::number( saildef->footR ) ); txtTopDepth->setText ( QString::number( saildef->mould.profile[2].getDepth()*100 ) ); txtMidDepth->setText ( QString::number( saildef->mould.profile[1].getDepth()*100 ) ); txtFootDepth->setText ( QString::number( saildef->mould.profile[0].getDepth()*100 ) ); txtTwistAngle->setText ( QString::number( saildef->twistDeg ) ); txtSheetAngle->setText ( QString::number( saildef->sheetDeg ) ); txtSections->setText ( QString::number( saildef->nbSections ) ); txtGores->setText ( QString::number( saildef->nbGores ) ); txtLuffGores->setText (QString::number( saildef->nbLuffGores ) ); txtDihedral->setText ( QString::number( saildef->dihedralDeg ) ); /** Create button group for sail type. */ QButtonGroup *bgrpSailType = new QButtonGroup( this ); bgrpSailType->addButton( radioMainSail ); bgrpSailType->addButton( radioJib ); bgrpSailType->addButton( radioWing ); /** Create button group for sail cut. */ QButtonGroup *bgrpSailCut = new QButtonGroup( this ); bgrpSailCut->addButton( radioCross ); bgrpSailCut->addButton( radioTwist ); bgrpSailCut->addButton( radioHorizontal ); bgrpSailCut->addButton( radioVertical ); bgrpSailCut->addButton( radioMitre ); bgrpSailCut->addButton( radioMitre2 ); bgrpSailCut->addButton( radioRadial ); /** Set signals and slots connections */ connect( btnOK, SIGNAL( clicked() ), this, SLOT( accept() ) ); connect( btnCancel, SIGNAL( clicked() ), this, SLOT( reject() ) ); connect( btnCompute, SIGNAL( pressed() ), this, SLOT( slotCompute() ) ); connect( bgrpSailType, SIGNAL( buttonClicked(QAbstractButton *) ), this, SLOT( slotSailType() ) ); connect( bgrpSailCut, SIGNAL( buttonClicked(QAbstractButton *) ), this, SLOT( slotSailCut() ) ); /** Activate "compute" to calculate sail area and diagonal and display them. */ compute(); } // member functions /** * Compute and Display ancillary data of the sail computation */ void CFormSailDef::compute() { CSailWorker worker(*saildef); lblSailArea->setText ( QString::number( worker.Area() ) ); lblDiagonal->setText ( QString::number( worker.Diagonal() ) ); } /** * Returns the sail cut layout from the form. */ enumSailCut CFormSailDef::getSailCut() { if ( radioHorizontal->isChecked() ) return HORIZONTAL; else if ( radioMitre->isChecked() ) return MITRE; else if ( radioMitre2->isChecked() ) return MITRE2; else if ( radioRadial->isChecked() ) return RADIAL; else if ( radioTwist->isChecked() ) return TWIST; else if ( radioVertical->isChecked() ) return VERTICAL; else /* default */ return CROSS; } /** * Returns the sail type from the form. */ enumSailType CFormSailDef::getSailType() { if ( radioJib->isChecked() ) return JIB; else if ( radioWing->isChecked() ) return WING; else /* default */ return MAINSAIL; } /** * Enables or disables appropriate controls depending * on the sail cut. */ void CFormSailDef::setSailCut( enumSailCut cut ) { switch ( cut ) { case CROSS: radioCross->setChecked( true ); break; case HORIZONTAL: radioHorizontal->setChecked( true ); break; case RADIAL: radioRadial->setChecked( true ); break; case TWIST: radioTwist->setChecked( true ); break; case VERTICAL: radioVertical->setChecked( true ); break; case MITRE: radioMitre->setChecked( true ); break; case MITRE2: radioMitre2->setChecked( true ); break; } } /** * Enables or disables appropriate controls depending * on the sail type. */ void CFormSailDef::setSailType( enumSailType type ) { switch ( type ) { case MAINSAIL: #ifdef DEBUG cout << "setSailType( MAINSAIL )" << endl; #endif radioMainSail->setChecked( true ); txtTackDist->setEnabled( true ); txtTackHeight->setEnabled( true ); txtRake->setEnabled( true ); txtTriangBase->setEnabled( true ); txtTriangHoist->setEnabled( true ); txtGaffLen->setEnabled( true ); txtGaffRound->setEnabled( true ); txtGaffAngle->setEnabled( true ); txtDihedral->setEnabled( false ); radioCross->setEnabled( true ); radioHorizontal->setEnabled( true ); radioRadial->setEnabled( true ); radioTwist->setEnabled( true ); radioVertical->setEnabled( true ); radioMitre->setEnabled( true ); radioMitre2->setEnabled( true ); break; case JIB: #ifdef DEBUG cout << "setSailType( JIB )" << endl; #endif radioJib->setChecked( true ); txtTackDist->setEnabled( false ); txtTackHeight->setEnabled( true ); txtRake->setEnabled( false ); txtTriangBase->setEnabled( true ); txtTriangHoist->setEnabled( true ); txtGaffLen->setEnabled( true ); txtGaffRound->setEnabled( true ); txtGaffAngle->setEnabled( true ); txtDihedral->setEnabled( false ); radioCross->setEnabled( true ); radioHorizontal->setEnabled( true ); radioRadial->setEnabled( true ); radioTwist->setEnabled( true ); radioVertical->setEnabled( true ); radioMitre->setEnabled( true ); radioMitre2->setEnabled( true ); break; case WING: #ifdef DEBUG cout << "setSailType( WING )" << endl; #endif radioWing->setChecked( true ); txtTackDist->setEnabled( true ); txtTackHeight->setEnabled( true ); txtRake->setEnabled( true ); txtTriangBase->setEnabled( true ); txtTriangHoist->setEnabled( true ); txtGaffLen->setEnabled( false ); txtGaffRound->setEnabled( false ); txtGaffAngle->setEnabled( false ); txtDihedral->setEnabled( true ); radioHorizontal->setChecked( true ); radioCross->setEnabled( false ); //radioHorizontal->setEnabled( true ); radioRadial->setEnabled( false ); radioTwist->setEnabled( false ); radioVertical->setEnabled( false ); radioMitre->setEnabled( false ); radioMitre2->setEnabled( false ); break; } } // Qt overrides /** * Saves the parameters entered by the user in the CSailDef. * Slot connected to OK button */ void CFormSailDef::accept() { /** Return data if everything is OK. */ if (check() == true) QDialog::accept(); } /** * Check all dimensions entered in order to make * sure that the sail is possible and reasonable */ bool CFormSailDef::check() { long L1=1, L2=1; real A1=0, A2=0; bool flag = true; QString txt; /** Create four palettes for levels of warning. */ QPalette palStd, palHi, palLo, palRel; palStd = txtLuffLen->palette(); palLo = palHi = palRel = palStd; palLo.setColor( QPalette::Text, Qt::magenta); // too low value palHi.setColor( QPalette::Text, Qt::red ); // too high value palRel.setColor( QPalette::Text, Qt::blue ); // related value to be checked /** Get sail type and cut. */ saildef->sailCut = getSailCut(); saildef->sailType = getSailType(); /** Get and the sail ID text length. */ txt = txtSailID->text(); txt = txt.simplified(); if (txt.length() > 40) { txt.truncate(40); flag = false; txtSailID->setPalette(palHi); txtSailID->setText(QString(txt)); } else { txtSailID->setPalette(palStd); txtSailID->setText(QString(txt)); } saildef->sailID = txt.toStdString(); /** Get and check length of boat. */ saildef->LOA = txtLOA->text().toDouble(); if (saildef->LOA < 100) { flag = false; txtLOA->setPalette(palLo); saildef->LOA = 100; } else if (saildef->LOA > 100000) { flag = false; txtLOA->setPalette(palHi); saildef->LOA = 100000; } else { txtLOA->setPalette(palStd); } txtLOA->setText(QString::number(saildef->LOA)); L1 = (long)(saildef->LOA); /** Get and check foretriangle base against boat length. */ saildef->foreJ = txtTriangBase->text().toDouble(); if (saildef->foreJ > 0.9* L1) { flag = false; txtTriangBase->setPalette(palHi); txtLOA->setPalette(palRel); saildef->foreJ = floor(0.9*L1); } else if (saildef->foreJ < 0.05* L1) { flag = false; txtTriangBase->setPalette(palLo); txtLOA->setPalette(palRel); saildef->foreJ = ceil(0.05*L1); } else { txtTriangBase->setPalette(palStd); txtLOA->setPalette(palStd); } txtTriangBase->setText(QString::number(saildef->foreJ)); /** Get and check foretriangle hoist against boat length */ saildef->foreI = txtTriangHoist->text().toDouble(); if (saildef->foreI > 4*L1) { flag = false; txtTriangHoist->setPalette(palHi); txtLOA->setPalette(palRel); saildef->foreI = 4*L1; } else if (saildef->foreI < 0.1*L1) { flag = false; txtTriangHoist->setPalette(palLo); txtLOA->setPalette(palRel); saildef->foreI = ceil( 0.1*L1); } else { txtTriangBase->setPalette(palStd); txtLOA->setPalette(palStd); } txtTriangHoist->setText(QString::number(saildef->foreI)); /** Check tack position function of boat length. */ L1 = (long)(saildef->LOA); saildef->tackX = txtTackDist->text().toDouble(); if (saildef->tackX > 0.9*L1) { flag = false; txtTackDist->setPalette(palHi); txtLOA->setPalette(palRel); saildef->tackX = floor(0.9*L1); } else { txtTackDist->setPalette(palStd); txtLOA->setPalette(palStd); } txtTackDist->setText(QString::number(saildef->tackX)); saildef->tackY = txtTackHeight->text().toDouble(); L1 = (long)(saildef->foreI); saildef->tackY = txtTackHeight->text().toDouble(); if (saildef->tackY > 0.5*L1) { flag = false; txtTackHeight->setPalette(palHi); txtTriangHoist->setPalette(palRel); saildef->tackY = floor(0.5*L1); } else { txtTackHeight->setPalette(palStd); txtTriangHoist->setPalette(palStd); } txtTackHeight->setText(QString::number(saildef->tackY)); /** Get length and round data of the 4 sides of sail. */ saildef->luffL = txtLuffLen->text().toDouble(); saildef->luffR = txtLuffRound->text().toDouble(); saildef->luffRP = txtLuffRoundPos->text().toInt(); saildef->gaffDeg = txtGaffAngle->text().toDouble(); saildef->gaffL = txtGaffLen->text().toDouble(); saildef->gaffR = txtGaffRound->text().toDouble(); saildef->leechL = txtLeechLen->text().toDouble(); saildef->leechR = txtLeechRound->text().toDouble(); saildef->leechRP = txtLeechRoundPos->text().toInt(); saildef->footL = txtFootLen->text().toDouble(); saildef->footR = txtFootRound->text().toDouble(); saildef->footRP = 50; // imposed value /** Check rake. */ saildef->rake = txtRake->text().toDouble(); switch (saildef->sailType ) { case WING: L1 = (long)(saildef->luffL); if (saildef->rake > L1) { flag = false; txtRake->setPalette(palHi); saildef->rake =L1 - 1; } else if (saildef->rake < 0) { flag = false; txtRake->setPalette(palHi); saildef->rake =0; } else { txtRake->setPalette(palStd); } txtRake->setText(QString::number(saildef->rake)); break; default: L1 = (long)(saildef->foreI); if (saildef->rake > 0.3*L1) { flag = false; txtRake->setPalette(palHi); txtTriangHoist->setPalette(palRel); saildef->rake = floor(0.3*L1 - 1); } else if (saildef->rake < -0.3*L1) { flag = false; txtRake->setPalette(palHi); txtTriangHoist->setPalette(palRel); saildef->rake =-floor(0.3*L1); } else { txtRake->setPalette(palStd); txtTriangHoist->setPalette(palStd); } txtRake->setText(QString::number(saildef->rake)); break; } /** Check luff length and round, gaff length. */ L1 = (long)(saildef->LOA); switch (saildef->sailType ) { case MAINSAIL: L1 = (long) (saildef->foreI); if (saildef->luffL > 3*L1) { flag=false; txtTriangHoist->setPalette(palRel); txtLuffLen->setPalette(palHi); saildef->luffL = 3*L1; } else if (saildef->luffL < 0.1*L1) { flag=false; txtTriangHoist->setPalette(palRel); txtLuffLen->setPalette(palLo); saildef->luffL = 1 + 0.1*L1; } else { txtTriangHoist->setPalette(palStd); txtLuffLen->setPalette(palStd); } txtLuffLen->setText(QString::number(saildef->luffL)); L2 =(long) ((saildef->luffL ) / 10); // luff round limit if (saildef->luffR > L2) { flag=false; txtLuffRound->setPalette(palHi); saildef->luffR = L2; } else if (saildef->luffR <- L2 ) { flag=false; txtLuffRound->setPalette(palLo); saildef->luffR = - L2 ; } else { txtLuffRound->setPalette(palStd); } txtLuffRound->setText(QString::number(saildef->luffR) ); /** Check main sail gaff length. */ L1 =(long) (5); L2 =(long) (6 * saildef->luffL); if (saildef->gaffL < L1) { txtGaffLen->setPalette(palLo); saildef->gaffL= L1; flag = false; } else if (saildef->gaffL > L2) { txtGaffLen->setPalette(palHi); saildef->gaffL= L2; flag = false; } else { txtGaffLen->setPalette(palStd); } txtGaffLen->setText(QString::number(saildef->gaffL) ); /** Check main sail gaff round. */ L1 = (long) ((saildef->gaffL )/ 8); if (saildef->gaffR > L1) { flag=false; txtGaffRound->setPalette(palHi); saildef->gaffR = L1; } else if (saildef->gaffR <0) { flag=false; txtGaffRound->setPalette(palLo); saildef->gaffR = 0; } else { txtGaffRound->setPalette(palStd); } txtGaffRound->setText(QString::number(saildef->gaffR) ); break; case JIB: L1 =( long) (sqrt(((saildef->foreI - saildef->tackY) * (saildef->foreI - saildef->tackY)) + (saildef->foreJ * saildef->foreJ ))-1); if (saildef->luffL > L1) { flag=false; txtTriangHoist->setPalette(palRel); txtTackHeight->setPalette(palRel); txtLuffLen->setPalette(palHi); saildef->luffL = int (L1); } else if (saildef->luffL < (L1 / 10) ) { flag=false; txtLuffLen->setPalette(palLo); saildef->luffL = int(1 + real(L1) / 10); } else { txtTriangHoist->setPalette(palStd); txtTackHeight->setPalette(palStd); txtLuffLen->setPalette(palStd); } txtLuffLen->setText(QString::number(saildef->luffL) ); L2 = (long) ((saildef->luffL )/ 10); // round limit /** To acommodate code zero jib the positive luff round limit is twice negative round limit */ if (saildef->luffR > 2*L2) { flag=false; txtLuffRound->setPalette(palHi); saildef->luffR = 2*L2; } else if (saildef->luffR <-L2) { flag=false; txtLuffRound->setPalette(palLo); saildef->luffR = -L2; } else { txtLuffRound->setPalette(palStd); } txtLuffRound->setText(QString::number(saildef->luffR) ); /** Check jib gaff length. */ L1 =(long) (1); L2 =(long) (100); if (saildef->gaffL < L1) { txtGaffLen->setPalette(palLo); saildef->gaffL = L1; flag = false; } else if (saildef->gaffL > L2) { txtGaffLen->setPalette(palHi); saildef->gaffL = L2; flag = false; } else { txtGaffLen->setPalette(palStd); } txtGaffLen->setText(QString::number(saildef->gaffL) ); // reset gaff round txtGaffRound->setPalette(palStd); txtGaffRound->setText(QString::number(0) ); break; case WING: /** For a wing set gaff length to minimum. */ saildef->gaffL = 2; txtGaffLen->setText(QString::number(saildef->gaffL) ); saildef->gaffR = 0; txtGaffRound->setText(QString::number(saildef->gaffR) ); // check gaff angle and set it to be horizontal A1 = saildef->rake / saildef->luffL; saildef->gaffDeg = acos (A1) * 180/PI; txtGaffAngle->setText(QString::number(floor(saildef->gaffDeg)) ); // adjust leech length such that foot is horizontal A1 = saildef->rake + saildef->gaffL - saildef->footL; A2 = saildef->luffL * sin(saildef->gaffDeg * PI/180); saildef->leechL = floor(sqrt( A1*A1 + A2*A2 ) ); txtLeechLen->setText(QString::number(saildef->leechL) ); L2 =(long) ((saildef->luffL )/ 4); // wing luff round limit if (saildef->luffR > L2) { flag=false; txtLuffRound->setPalette(palHi); saildef->luffR = L2; } else if (saildef->luffR <0) { flag=false; txtLuffRound->setPalette(palLo); saildef->luffR = 0; } else { txtLuffRound->setPalette(palStd); } txtLuffRound->setText(QString::number(saildef->luffR) ); break; } /** Check leech length. */ L1 = (long) saildef->luffL; L1 = L1 + (long) saildef->gaffL; if (saildef->leechL > 1.5*L1) { flag = false; txtLuffLen->setPalette(palRel); txtLeechLen->setPalette(palHi); saildef->leechL = 1.5*L1 -1; } else if (saildef->leechL < 0.5*L1) { flag = false; txtLuffLen->setPalette(palRel); txtLeechLen->setPalette(palLo); saildef->leechL = 0.5*L1 +1; } else { txtLuffLen->setPalette(palStd); txtLeechLen->setPalette(palStd); } txtLeechLen->setText(QString::number(saildef->leechL)); /** Check leech round. */ L1 = (long) (saildef->leechL / 10); if (saildef->leechR > 3*L1) { flag = false; txtLeechRound->setPalette(palHi); txtLeechRound->setText(QString::number(3*L1) ); } else if (saildef->leechR <-L1) { flag = false; txtLeechRound->setPalette(palLo); txtLeechRound->setText(QString::number(-L1) ); } else txtLeechRound->setPalette(palStd); /** Check foot length. */ switch (saildef->sailType ) { case MAINSAIL: L2 = (long)(saildef->luffL + saildef->gaffL - saildef->leechL); if (L2 < (long)(0.1*(saildef->luffL))) L2=(long)(0.1*(saildef->luffL)); break; case JIB: L2 = (long)(saildef->luffL - saildef->leechL); if (L2 < (long)(0.1*(saildef->luffL))) L2=(long)(0.1*(saildef->luffL)); break; case WING: L2 = (long)(saildef->luffL - saildef->leechL); if (L2 < (long)(0.1*(saildef->luffL))) L2=(long)(0.1*(saildef->luffL)); break; } if (saildef->footL > 1.5*(saildef->leechL) ) { flag=false; txtLeechLen->setPalette( palRel ); txtFootLen->setPalette( palHi ); saildef->footL = 1.5*(saildef->leechL) -1; } else if (saildef->footL < L2) { flag=false; txtLeechLen->setPalette( palRel ); txtFootLen->setPalette( palLo ); saildef->footL = L2 +1; } else { txtLeechLen->setPalette( palStd ); txtFootLen->setPalette( palStd ); } txtFootLen->setText( QString::number( saildef->footL ) ); /** Check foot round value. */ L1 = (long)(saildef->footL / 5); switch (saildef->sailType) { case WING: saildef->footR = 0; txtFootRound->setText(QString::number(saildef->footR)); break; default: if (saildef->footR > L1) { flag=false; txtFootLen->setPalette( palRel ); txtFootRound->setPalette(palHi); saildef->footR = L1; } else if (saildef->footR <-L1) { flag=false; txtFootLen->setPalette( palRel ); txtFootRound->setPalette(palLo); saildef->footR = 1-L1; } else { txtFootLen->setPalette( palStd ); txtFootRound->setPalette(palStd ); } txtFootRound->setText(QString::number(saildef->footR)); break; } /** Get cloth, seams and hems width. */ saildef->clothW = txtClothWidth->text().toDouble(); saildef->seamW = txtSeamWidth->text().toDouble(); saildef->leechHemW = txtLeechHemWidth->text().toDouble(); saildef->footHemW = txtFootHemWidth->text().toDouble(); saildef->hemsW = txtHemsWidth->text().toDouble(); /** Check cloth width. */ if (saildef->clothW < saildef->leechL /100) { saildef->clothW = saildef->leechL /100 +1; flag = false; txtClothWidth->setPalette(palLo); } else if (saildef->clothW > saildef->leechL /3) { saildef->clothW = saildef->leechL /3; flag = false; txtClothWidth->setPalette(palHi); } txtClothWidth->setText( QString::number(saildef->clothW)); L1 = (long)(5+ saildef->clothW / 10); /** Check seams width function of cloth width. */ if (saildef->seamW > L1) { flag=false; txtSeamWidth->setPalette( palHi); saildef->seamW = L1; } else if (saildef->seamW < 0) { flag=false; txtSeamWidth->setPalette( palLo); saildef->seamW = 0; } else { txtSeamWidth->setPalette( palStd); } txtSeamWidth->setText( QString::number(saildef->seamW)); /** Check leech hem width function of cloth width. */ if (saildef->leechHemW > L1*2) { flag=false; txtLeechHemWidth->setPalette( palHi); saildef->leechHemW = L1*2; } else if (saildef->leechHemW < 0) { flag=false; txtLeechHemWidth->setPalette( palLo); saildef->leechHemW = 0; } else { txtLeechHemWidth->setPalette( palStd); } txtLeechHemWidth->setText( QString::number(saildef->leechHemW)); /** Check foot hem width function of cloth width. */ if (saildef->footHemW > L1*2) { flag=false; txtFootHemWidth->setPalette( palHi); saildef->footHemW = L1*2; } else if (saildef->footHemW < 0) { flag=false; txtFootHemWidth->setPalette( palLo); saildef->footHemW = 0; } else { txtFootHemWidth->setPalette( palStd); } txtFootHemWidth->setText( QString::number(saildef->footHemW)); /** Check other luff and gaff hem width function of cloth width. */ if (saildef->hemsW > L1) { flag=false; txtHemsWidth->setPalette( palHi); saildef->hemsW = L1; } else if (saildef->hemsW < 0) { flag=false; txtHemsWidth->setPalette( palLo); saildef->hemsW = 0; } else { txtHemsWidth->setPalette( palStd); } txtHemsWidth->setText( QString::number(saildef->hemsW)); /** Get the mould data. */ saildef->mould.profile[2].setDepth( real(txtTopDepth->text().toInt())/100 ); saildef->mould.profile[1].setDepth( real(txtMidDepth->text().toInt())/100 ); saildef->mould.profile[0].setDepth( real(txtFootDepth->text().toInt())/100 ); /** Get and check dihedral angle for a wing. */ saildef->dihedralDeg = txtDihedral->text().toInt(); if (saildef->dihedralDeg<90) { flag = false; txtDihedral->setPalette( palLo ); saildef->dihedralDeg = 90; } else if (saildef->dihedralDeg > 180) { flag = false; txtDihedral->setPalette( palHi ); saildef->dihedralDeg = 180; } else { txtDihedral->setPalette( palStd ); } txtDihedral->setText(QString::number(saildef->dihedralDeg)); /** Get and check twist of the sail. */ saildef->twistDeg = txtTwistAngle->text().toInt(); if (saildef->twistDeg > 45) { flag = false; txtTwistAngle->setPalette( palHi ); saildef->twistDeg = 45; } else if (saildef->twistDeg < 0) { flag = false; txtTwistAngle->setPalette( palLo ); saildef->twistDeg = 0; } else { txtTwistAngle->setPalette( palStd ); } txtTwistAngle->setText(QString::number(saildef->twistDeg)); /** Get and check sheeting angle of the sail. */ saildef->sheetDeg = txtSheetAngle->text().toInt(); if (saildef->sheetDeg > 45) { flag=false; txtSheetAngle->setPalette( palHi); saildef->sheetDeg = 45; } else { txtSheetAngle->setPalette( palStd); } switch (saildef->sailType ) // set lower limit for sheeting main or jib { case MAINSAIL: L2 = 0; break; case JIB: L2 = 5; break; case WING: L2 = 0; break; } if (saildef->sheetDeg < L2) { flag=false; txtSheetAngle->setPalette( palLo); saildef->sheetDeg = L2; } else { txtSheetAngle->setPalette( palStd); } txtSheetAngle->setText(QString::number(saildef->sheetDeg)); /** Get and check radial sections and gores number. */ if (saildef->sailCut == RADIAL) { saildef->nbGores = txtGores->text().toInt(); if (saildef->nbGores < 3) { flag=false; txtGores->setPalette( palLo); txtGores->setText(QString::number(3)); } else if (saildef->nbGores > 12) { flag=false; txtGores->setPalette( palHi); txtGores->setText(QString::number(12)); } else { txtGores->setPalette( palStd); } saildef->nbGores = txtGores->text().toInt(); saildef->nbSections = txtSections->text().toInt(); if (saildef->nbSections < 3) { flag=false; txtSections->setPalette( palLo); txtSections->setText(QString::number(3)); } else if (saildef->nbSections > 8) { flag=false; txtSections->setPalette( palHi); txtSections->setText(QString::number(8)); } else { txtSections->setPalette( palStd); } saildef->nbSections = txtSections->text().toInt(); saildef->nbLuffGores = txtLuffGores->text().toInt(); if (saildef->nbLuffGores < 1) { flag=false; txtLuffGores->setPalette( palLo); txtLuffGores->setText(QString::number(1)); } else if (saildef->nbLuffGores > saildef->nbGores -2) { flag=false; txtLuffGores->setPalette( palHi); txtLuffGores->setText(QString::number(saildef->nbGores -2)); } else { txtLuffGores->setPalette( palStd); } saildef->nbLuffGores = txtLuffGores->text().toInt(); } // return true IF everything is OK return flag; } /** * Enable/disable appropriate controls when the user * changes the sail cut. **/ void CFormSailDef::slotSailCut() { setSailCut( getSailCut() ); } /** * Saves the parameters entered by the user in the CSailDef. * compute and display ancillary sail data * * slot connected to Compute button */ void CFormSailDef::slotCompute() { // ckeck data check(); // calculate sail area and diagonal compute(); // display ancillary data real h=0, w=0, w1=0; QString txta, txtb, txtc, txtd, txte; CSailWorker worker(*saildef); txta = tr("Sail corners coordinates"); txta = txta+"\n "+tr("tack")+" \t x = "+QString::number(int(worker.tack.x())) +"\n\t y = "+QString::number(int(worker.tack.y())) +" mm" ; txta = txta+"\n "+tr("clew")+" \t x = "+QString::number(int(worker.clew.x())) +"\n\t y = "+QString::number(int(worker.clew.y())) +" mm"; txta = txta+"\n "+tr("head")+" \t x = "+QString::number(int(worker.head.x())) +"\n\t y = "+QString::number(int(worker.head.y())) +" mm"; txta = txta+"\n "+tr("peak")+" \t x = "+QString::number(int(worker.peak.x())) +"\n\t y = "+QString::number(int(worker.peak.y())) +" mm "; w = worker.SailLP(); txtb = "\nLP = " +QString::number(int(w)) +" mm "; txtc = "\n" + tr("Sail width measurements "); h=0.875; w = worker.IRCwidth(h); w1 = worker.SailWidth(h); // printf ("h=%f IRC width=%f IOR width=%f \n", h, w, w1); txtc = txtc +"\n h= " +QString::number(h)+"\t IRC w= " +QString::number(int(w)) +" mm \t IOR w= " +QString::number(int(w1)) +" mm"; h=0.75; w = worker.IRCwidth(h); w1 = worker.SailWidth(h); // printf ("h=%f IRC width=%f IOR width=%f \n", h, w, w1); txtc = txtc+ "\n h= " +QString::number(h)+"\t IRC w= " +QString::number(int(w)) +" mm \t IOR w= " +QString::number(int(w1)) +" mm"; h=0.5; w = worker.IRCwidth(h); w1 = worker.SailWidth(h); txtc = txtc + "\n h= "+QString::number(h)+"\t IRC w= "+QString::number(int(w)) +" mm \t IOR w= " +QString::number(int(w1)) +" mm"; h=0.25; w = worker.IRCwidth(h); w1 = worker.SailWidth(h); txtc = txtc + "\n h= "+QString::number(h)+"\t IRC w= "+QString::number(int(w)) +" mm \t IOR w= " +QString::number(int(w1)) +" mm"; displayData( txta, txtb, txtc, txtd, txte ); } /** * Display ancillary data in a message box */ void CFormSailDef::displayData(QString &txt0, QString &txt1, QString &txt2, QString &txt3, QString &txt4 ) { QMessageBox* mb = new QMessageBox(); mb->setIcon(QMessageBox::NoIcon); mb->setWindowTitle("Sailcut"); mb->setText (QString(txt0+"\n" +txt1+"\n" +txt2+"\n" +txt3+"\n" +txt4)); mb->setButtonText (0, "OK"); mb->exec(); delete mb; } /** * Enable/disable appropriate controls when the user * changes the sail type. **/ void CFormSailDef::slotSailType() { setSailType( getSailType() ); } sailcut-1.3.5/src/sailtreemodel.h0000644000175000007640000000376111177775326016724 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SAILTREEMODEL_H #define SAILTREEMODEL_H #include #include #include #include "sailtreeitem.h" class CSailTreeModel : public QAbstractItemModel { Q_OBJECT public: template CSailTreeModel(const myType &data, QString name, QObject *parent = 0) : QAbstractItemModel(parent) { QList rootData; rootData << "Name" << "x" << "y" << "z"; rootItem = new CSailTreeItem(rootData); rootItem->appendChild(new CSailTreeItem(data, name, rootItem)); } ~CSailTreeModel(); QVariant data(const QModelIndex &index, int role) const; Qt::ItemFlags flags(const QModelIndex &index) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; QModelIndex parent(const QModelIndex &index) const; int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; private: CSailTreeItem *rootItem; }; #endif sailcut-1.3.5/src/saildisp.h0000644000175000007640000000464611177775326015706 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SAILDISP_H #define SAILDISP_H #include "sailcpp/panelgroup.h" #include "sailcpp/sailcalc.h" /** A generic display area for a panel group. * * @see CSailDispLabel * @see CSailDispGL */ class CSailDisp { public: CSailDisp(); /** The destructor. */ virtual ~CSailDisp() {} ; /** Acessor for the logical viewport rectangle */ virtual const CRect3d& getLogicalRect() const { return logicalRect; }; /** Redraw the view. */ virtual void redraw() {} ; virtual void resetZoomCenter( void ); virtual CPoint3d screenToLogical( const int x, const int y ) const; virtual void setAngle( real azimuth, real elevation ); virtual void setCenter( CPoint3d newCenter ); virtual void setObject( const CPanelGroup &objs ); virtual void setViewRect( const CRect3d &rect ); virtual void setZoom(real newZoom); virtual void zoomIn(); virtual void zoomOut(); /** Should labels be drawn ? */ bool drawLabels; private: void calcDispObject(); protected: /** Rotated copy of the objects */ CPanelGroup dispObject; /** The center of the viewing area, in logical coordinates */ CPoint3d center; /** The zoom factor for the view */ real zoom; private: /** Rotation matrix for the view */ CMatrix m; /** Viewport rectangle, in logical coordinates */ CRect3d logicalRect; /** Viewport rectangle, in device coordinates */ CRect3d viewRect; /** Bounding rectangle of the unrotated object */ CRect3d baseRect; /** Unrotated copy of the object */ CPanelGroup baseObject; }; #endif sailcut-1.3.5/src/formrig.cpp0000644000175000007640000000456311177775326016074 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "formrig.h" #include "formrigdef.h" #include "sailcpp/rigworker.h" #include /** * Constructs a window to display a rig. * * @param myPrefs the user preferences * @param parent the parent widget */ CFormRig::CFormRig(CPrefs *myPrefs, QWidget *parent) : CFormDocumentTmpl (myPrefs, parent) { setMinimumSize( QSize( 300, 220 ) ); // create menu bar setupMenuBar(); // create main widget QGridLayout *layout = new QGridLayout(this); tabs = new CSailViewerTabs(this); layout->addWidget(tabs); // set language languageChange(); // set initial definition setDef(def); } /** * Sets the strings of the subwidgets using the current * language. */ void CFormRig::languageChange() { setWindowTitle( tr("rig") ); actionViewDef->setText( tr("&Dimensions") ); tabs->languageChange(); } /** * Replaces the current sail definition. * * @param newdef */ void CFormRig::setDef(const CRigDef& newdef) { def = newdef; tabs->setObject(CRigWorker(def).makeRig()); } /** * Creates the menu bar */ void CFormRig::setupMenuBar() { // view actions actionViewDef = new QAction(this); connect( actionViewDef, SIGNAL( triggered() ), this, SLOT( slotDef() ) ); extraViewActions.push_back(actionViewDef); } /** * Displays the CFormRigDef rig definition dialog. */ void CFormRig::slotDef() { CRigDef defcopy = def; if ( CFormRigDef(this, &defcopy).exec() ) { // we returned from the dialog with an 'OK', setDef(defcopy); } } sailcut-1.3.5/src/formrig.h0000644000175000007640000000261211177775326015532 0ustar sharkyjerryweb/* * Copyright (C) 1993-2009 Robert & Jeremy Laine * See AUTHORS file for a full list of contributors. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef FORMRIG_H #define FORMRIG_H #include "formdocument.h" #include "sailwriter-xml.h" /** Dialog holding a rig. */ class CFormRig : public CFormDocumentTmpl { Q_OBJECT public: // construction, destruction CFormRig(CPrefs *myPrefs, QWidget *parent); protected: T_KEYPRESS void setDef(const CRigDef& newdef); void setupMenuBar(); // slots protected slots: virtual void languageChange(); virtual void slotDef(); // member variables protected: /** view hull definition */ QAction *actionViewDef; }; #endif sailcut-1.3.5/sailcut.kdevelop0000644000175000007640000001173011161006300016271 0ustar sharkyjerryweb Robert and Jeremy Laine info@sailcut.com 1 KDevCustomProject C++ sailcut . false executable debug/src/sailcut false false false false false *.h *.cpp CMakeLists.txt debug make debug 0 default false 0 0 false default true false false false false true 10 false true true 250 400 250 false 0 true true false std=_GLIBCXX_STD;__gnu_cxx=std true false false false false true true false .; set m_,_ theValue true true false true Vertical false 3 3 /usr/share/qt3 EmbeddedKDevDesigner /usr/bin/qmake-qt3 /usr/bin/designer .h .cpp false false *.o,*.lo,CVS false sailcut-1.3.5/icons/0000755000175000007640000000000011457411327014224 5ustar sharkyjerrywebsailcut-1.3.5/icons/sailcut-file.ico0000644000175000007640000003535611160645556017321 0ustar sharkyjerryweb00Ј%6 Јо%h†6(0` $џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™31ЂEюЋX.чЋX.чЋX.чЋX.чЋX.чЋX-чЋX-чЋX-чЋX-чЋX-чЋX-чЋW-чЋW-чЋW-чЋW-чЋW-чЋW,чЋW,чЋW,чЋW,чЊW,чЊW,чЊW,чЊW,чЊW,чЊW,чЊV,чЊV+чЊV+чЊV+чЊV+чЊV+чЊV+чЊV+чЊV+чž>ыџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™3@ЦŽqяѓыуџѓыуџѓътџѓътџѓъсџђъсџђщрџђщрџђщпџђшпџёшоџёшоџёчоџёчнџёчнџ№цмџ№цмџ№цлџ№хлџ№хкџ№хкџяфкџяфйџяфйџяфиџяуиџюузџюузџютжџютжџютеџюсеџэсеџэсдџэрдџЊV+чџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™3@Цqяѓьфџѓыуџѓыуџѓытџѓътџѓъсџђъсџђщрџђщрџђщрџђшпџёшпџёшоџёчоџёчнџёчнџёцмџ№цмџ№цлџ№цлџ№хлџ№хкџяхкџяфйџяфйџяфиџяуиџяузџюузџютзџютжџютжџюсеџэсеџэсдџЊV+чџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™3@Цrяєьфџєьфџѓыуџѓыуџѓытџѓътџѓъсџђъсџђщсџђщрџђщрџђшпџђшпџёшоџёшоџёчнџёчнџёчнџ№цмџ№цмџ№цлџ№хлџ№хкџяхкџяфйџяфйџяфиџяуиџяуиџюузџютзџютжџютжџюсеџэсеџЊV+чq""^l3f џџџџџџџџџџџџџџџџџџџџџ™3@Цrяєьхџєьфџєьфџѓыуџѓыуџѓытџѓътџѓътџђъсџђъсџђщрџђщрџђщпџђшпџёшоџёшоџёчоџёчнџёчнџ№цмџ№цмџ№цлџ№хлџ№хкџ№хкџяфйџяфйџяфйџяуиџяуиџюузџюузџютжџютжџютеџЊV+чy99’“€€§llшŠaaЮˆYYЕ„NNš~<<€s Ifџџџ™3@Цrяєэхџєьхџєьфџєьфџѓьфџѓыуџѓыуџѓытџѓътџѓъсџђъсџђщрџђщрџђщпџђшпџёшпџёшоџёчоџёчнџёчнџёцмџ№цмџ№цлџ№хлџ№хлџ№хкџяхкџяфйџяфйџяфиџяуиџюузџюузџютжџютжџЊV+чf„SSРЂЂЂџЄЄЄџІІІџЈЈЈџЋЋЋџІ§•qqмŽ^^А‡?6ЁЕw`ѓєэцџєэхџєэхџєьхџєьфџєьфџѓыуџѓыуџѓытџѓътџѓъсџђъсџђщрџђщрџђщрџђшпџёшпџёшоџёчоџёчнџёчнџёчмџ№цмџ№цмџ№цлџ№хлџ№хкџяхкџяфйџяфйџяфиџяуиџяузџюузџютзџЊV+чџџџs$$+“vvтІІІџЈЈЈџЋЋЋџ­­­џЏЏЏџБББџДДДџЖЖЖџЌœœџЉˆ‡џДџтЯЩџєэхџєьхџєьфџєьфџѓыуџѓыуџрЬФџымеџѓътџђъсџђщсџђщрџђщрџђщпџђшпџёшоџёшоџёчнџёчнџёчнџ№цмџ№цмџ№цлџ№хлџ№хкџ№хкџяфйџяфйџяфйџяуиџяуиџюузџЊV,чџџџџџџ|99kЁ——њЊЊЊџ­­­џЏЏЏџБББџГГГџЖЖЖџИИИџКККџМММџПППџБš™џЕŽŒџфвЫџєьхџєьфџєьфџѓыуџеНЖџfeџЊˆ…џРŸšџэсиџђъсџђщрџђщрџђщпџђшпџёшпџёшоџёчоџёчнџёчнџ№цмџ№цмџ№цлџ№хлџ№хкџ№хкџяфкџяфйџяфйџяфиџяуиџЊW,чџџџџџџџџџ„KKЉ­ЌЌџЏЏЏџБББџГГГџЖЖЖџИИИџКККџМММџПППџСССџУУУџХХХџДššџЗџцеЯџєьхџєьфџѓьфџЂ}{џЅЅЅџЇЄЄџЁ„ƒџЏ‹ˆџзПИџђщрџђщрџђщрџђшпџёшпџёшоџёчоџёчнџёчнџёцмџ№цмџ№цмџ№цлџ№хлџ№хкџяхкџяфйџяфйџяфиџЊW,чџџџџџџџџџk ŠWW̘vvуЈšš§ЖЕЕџИИИџКККџМММџПППџСССџУУУџХХХџШШШџЪЪЪџЬЬܟƘ—џжМЖџєьхџєьфџМ˜“џЇЄЄџ­­­џАААџДДДџЌš™џАЇџлХПџђщрџђщрџђшпџђшпџёшоџёшоџёчнџёчнџёчнџ№цмџ№цмџ№цлџ№хлџ№хкџ№хкџяфйџяфйџЊW,чџџџџџџџџџџџџl!js3< c #0000AD", ", c #00002F", "< c #00005D", "1 c #000088", "2 c #000049", "3 c #000035", "4 c #0000CD", "5 c #000010", "6 c #0000E7", "7 c #000013", "8 c #00003E", "9 c #0000FE", "0 c #000016", "q c #000041", "w c #000044", "e c #0000DC", "r c #FFFFFF", "t c #000089", "y c #00004A", "u c #00008C", "i c #000078", "p c #000025", "a c #000050", "s c #00003C", "d c #0000BD", "f c #0000E8", "g c #0000FF", "h c None", /* pixels */ "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh", "h$i111111111111111111ggggggggggggggggggXhhhhh", "hhhhhhhh#gggggggggggggggggg:+hhh", "hhhhhhhhhtgggggggggggggggggge2hh", "hhhhhhhhhh&9gggggggggggggggggfah", "hhhhhhhhhhh+yyyyyyyyyyyyyyyyyywh", "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh" }; sailcut-1.3.5/icons/sailcut-file.svg0000644000175000007640000001261410510643102017315 0ustar sharkyjerryweb sailcut-1.3.5/icons/sailcut.icns0000644000175000007640000011141311161746657016560 0ustar sharkyjerrywebicns“ it32RћФџљџјџЩaїџаџ‰їџ‚џџЌіџєџџЬіџ’€џэѕџљџ ѕџŸ‚џѓџ§‚џ@ѓџЎƒџfђџ)„џђџЛ„џЏёџ6…џа№џШ…џ№№џE‡џ юџд‡џ"юџTˆџDэџоˆџlэџ c‰џ’ ьџч‰џГьџsŠџгыџюŠџоыџ‚‹џ–ъџє‹џ<ъџ‘‹џѓ щџљ‹џ­ъџŸŒџGчџ§‹џЩ€џџуџЌў‹џ 3џџсџ)ќ§ў‰џ Гџ$џПрџИќќ§ў‡џ і sџџЬоџ5њћќќ§ў…џўLџQџџџЋмџ Уњњћќќ§ў„џ xеЂџџ €џƒлџ Dјљњњћќќ§ў‚џ ЂџUџЖџџ ў€џWкџ Эјјљњњћќќ§ў€џ –џоџЩџџѕ€џљ3 йџQіїјјљњњћќќ§ўћfџџ cџџнџџщџьзџеѕіїјјљњњћќќы9џџ"ѓџџ№џџн‚џзжџ `єѕѕіїјјљ€њš €џоџ џџвƒџЛдџмѓєѕѕіїјјљЩ,€џР‚џџЦ„џ–гџ mђѓѓєѕііїд[џ œƒџџЙ…џkвџ сёђѓѓєѕНDџЕ„џ/џЎў„џ§%бџ {№ёёђп)‚џ аўўƒџDџЁ§ў„џ*џЮџ хяс•5 ƒџ;хќ§ўў‚џ[џ –ќ§ўƒџџЭџ{™= ƒџ Їњћќќ§ўўџtџ‰њћќ§‚џ џЫџ „џ jьљљњћќќ§ўў€џŒџ{љњћќ§ўџџъџrЬџ…џ' bзїјјљљњћќќ§ўўџџŸџtјљњћќ§ўџЋџ+§Dвџ+yуѕѕіїјјљљњћќќ§ўўџlџ€їјљњћќ§ўbџTџђ"Юџ/UЉыѓѓєѕѕіїјјљљњћќќ§ўњџ‹ѕіїјљћќћџ˜џџоЪџ-fЗэ№ёёђѓѓєѕѕіїјјљљњћќќ§Аџџ•єѕіїјљњЌџџд€џСЧџ/!vУээюяя№ёёђѓѓєѕѕіїјјљњњћќќEџџžѓєѕіїјљ0џ%ўџ˜Хџ0 ъыыьээюяя№ёёђѓѓєѕѕіїјјљњњћш ЈђѓєѕіїЌџџЎў‚џgХџDщщъыыьээюяя№ёёђѓѓєѕѕіїјјљњњŽ€В№ёђѓєчџ%ћ§ўџќ: Уџ4бшщщъыыьээюяя№ёёђѓѓєѕѕіїјјљњ# Мя№ёђ№E џџЋњћќ§ў€џяТџ5‰ччшщщъыыьээюяя№ёёђѓѓєѕѕіїјјМџХюя№№Rџ%їљњћќ§ў€џй Рџ;.фцччшщщъыыьээюяя№ёёђѓѓєѕѕіїяEЮьюя\џРїјљњћќ§ўџџќ Рџ? Сххцччшщщъыыьээюяя№ёёђѓѓєѕѕіgџzFиыьeџЄѕіїјљњћќ§ўџуџНџ@qуфххцччшщщъыыьээюяя№ёёђѓѓєѕН вF сш_џ„ђѓєѕіїјљњќ§ўЦџЛџBотуфххцччшщщъыыьээюяя№ёёђѓѓьџ \љHсEџb№ёђѓєѕіїјљњћќЇџ&ЙџDЏсттуфххцччшщщъыыьээюяя№ёёђѓi џшјJ.џMья№ёђѓєѕіїјљњћ‡џ{ИџD Xррсттуфххцччшщщъыыьээюяя№ёё џЁїїK џџfъьэюяёђѓєѕіїјљњ;џ œўD ЗџFгпррсттуфххцччшщщъыыьээюяя№Žџ:ѕіїLџџƒщъыьэюя№ёђєѕіїјц џГџёЕџH›оопррсттуфххцччшщщъыыьээюя€џеѕѕіMџџчшщъыьэюя№ёђѓєѕі”џџеўџиДџIAмноопррстууфххцччшщщъыыьээoџ–ѓєѕѕOџџ yхцчшщъыьэюя№ёђѓєѕ2џќ§ўџВВџKЦммноопррстууфххцччшщщъыыщ_џђѓѓєѕOџџІуфхцчщъыьэюя№ёђѓж џnњћќ§џ~БџK‚клммноопррстууфххцччшщщъК#џŒёёђѓѓєQџџЮтуфхцчшщъыэюя№ёђDџџУљњћќ§§GАџM,икклммноопррстууфххцччшл\џџ‰я№ёёђѓѓRџрстуфхцчшщъыьэюя­џіјљњћќ§ё ЎџO Зийкклммноопррстууфххцч– џџ„юяя№ёёђѓTџ/прстуфхцчшщъыьэшџџŠіїјљњћќ§й­џOjзиийкклммноопррстууффЉ2џџ Ћээюяя№ёёђUџ]нопртуфхцчшщъыьhџџяєѕіјљњћќ§ЇЌџвжзиийкклммноопррсте€џ3Lмыьээюяя№ёёUџ‰мнопрстуфхцчщъ…џџЌђѓєѕіїјљњћžЋџЅежжзиийкклммноопрЕQ €џ7 щъыыьээюяя№ёWџЎлмнопрстуфхцч›џџ :№ёђѓєѕіїјљњQџЉџ Tддежжзиийкклммл­i€џ: Bвшщщъыыьээюяяхџ вклмнопрстуфхЌ џџгя№ёђѓєѕіїјљџЇџЧгддежжзиийкЫFџ= EЛцччшщщъыыьээюя` џзийклнопрсту’ џџКьэюя№ёѓєѕіїаџЅџ ’ввгддежЮЉ€N ‚џ? OСфххцччшщщъыыьээК џ>жзийклмноппh џџšъыьэюя№ёђѓєѕŽџ6Ѕџ=абвХžtD  ƒџC YЧтууфххцччшщщъыыьшџџkежзийклмнд>џџxшщъыьэюя№ёђѓєCџeњC Ѓџ k:  …џG >–ирсстууфххцччшщщъыыuџџ’дежзийклЇ џџ ˆхцчщъыьэюя№ёђщ џ •њьЂџ ‡џ, 8ŽгноппрсстууфххцччшщщъЦ џЕвгдезиб\€џ Ÿуфхцчшщъыьюя№ё|џџСјљЬ­џ/HˆЬллмнноппрсстууфххцччшщш,џ Ябвгдеž€џБстуфхцчшщъыьэюпџѕїјљšЇџ2 P‹Пзиийкллмнноппрсстууфххцччшˆџ "ЯабвЗ<€џ:Ьпрстуфхцчшщъыьэl џџŽѕіїјљ\Ёџ7>i‘УддежжзиййкллмнноппрсстууфххцчРcLЮЯЧa €џ! €лмнопртуфхцчшщъыжџшєѕіїјђ(Ÿџ6=fŠ­ЬаабввгддежжзиййкллмнноппрсстууфххФџ={ uЫƒ€џ##Жйклмнопрстуфхчшщъ^ џџ hёђѓєѕіјxžџ5 ЋЬЬЭЮЮЯаабввгддежжзиййкллмнноппрсстууфШџСWo$€џ%ƒдзийклмнопрстуфхцчЖџг№ёђѓєѕѓžџ3qЪЫЬЬЭЮЮЯаабввгддежжзиййкллмнноппрсстуЪџџ Oш4 €џ&dЩгдежийклмнопрстуфхЪџюя№ёђѓєЉžџ0-ШЪЪЫЬЬЭЮЮЯаабввгддежжзиййкллмнноппрссЮџџ лш€€џ'DЙабвгдежзийклнопрстузџџ Eьэюя№ёђѓ9џ1 БШЩЪЪЫЬЬЭЮЮЯаабввгддежжзиййкллмнноппра џџЬцч џ)'ЃЭЮЯабвгдежзийклмнопрп8 џџйъыьэюя№вœџ2}ЧШШЩЪЪЫЬЬЭЮЮЯаабввгддежжзиййкллмннопб# џџЖхцб€џ)ˆЩЪЫЬЮЯабвгдежзийклмнопXџџЏшщъыьэюяm џ29ЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгддежззиййкллмннЗџџ›ффхД€џ) wЧШЩЪЫЬЭЮЯабгдежзийклмкZџ†цчшщъыьэшœџ3ЕХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгддежззиййкллм| џџzтуфф—€џ(ЋЦЧШЩЪЫЬЭЮЯабвгдежийкЭ3 џ†уфцчшщъыьŽœџ` ŠФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгддежззиййкЧ7џџ^сттуфxџџФХЦЧШЩЪЫЬЭЮЯабвгдежзИ џџ†стуфхцчщъеœџ& HТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгддежззийš €џ5 …ррсттуUџџ@ТУФХЧШЩЪЫЬЭЮЯабвгдеœџџ†прстуфхцчшB œџ&ИТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгддежзаW €џ6Ќопррстт3џџ zСТУФХЦЧШЩЪЬЭЮЯабвЬ^ џџ ˆнопрстуфхц››џ` “РСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгддвŠ џџ'ЦноопррстџџЋРСТУФХЦЧШЩЪЫЬЭЮа™ џџ Љклнопрстуфеœџ$ VПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабвва„€џ7Pжммноопррс џџОПРСТУФХЦЧШЩЪЫЬОF џџ4ЧийклмнопрстN œџ#КОПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯааЬ}€џ9 кклммноопрЭџџFМНОПРТУФХЦЧШЩШ~ џџ kджзийклмнопрЁ›џ" šНООПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЩwџ9 SЧийкклммноопБџџ|ЛМНОПРСТУФХЧˆџџ œгдежзийклмноБœџ bММНООПРРСТТУФФХЦЦЧШШЩЪЪЫЬЫžTџ$1Бжзиийкклммноо”џ ВКЛМНОПРСТУ€џ LРабвгджзийклмЕœџ$ЙЛММНООПРРСТТУФФХЦЦЧШШЩЪ Vџ$–дежжзиийкклммноTџ;ИЙКЛМНОПР’%€џžЭЮЯабвгдежзийЙœџ  ККЛММНООПРРСТТУФФХЦЦЧЂ[‚џ$ uЮгддежжзиийкклммЄ џƒЖЗИЙКЛМ‚!џ mЧЫЬЭЮЯабвгдежзНџ mИЙККЛММНООПРРСТТУУЁq7 ‚џ%!ЩбввгддежжзиийкклЯџ ВЕЖЗИДrџ 8АЧЩЪЫЬЭЮЯабвгдеРџ .ЗИИЙККЛММНООПРОl3  ƒџ% JЅЮЯаабввгддежжзиийккI џџKГДЕЋ`џ %”ФХЦЧШЩЪЫЬЭЮЯбвгБџ ЄЖЗИИЙККЛМВ“qI# „џ&rПЬЭЮЮЯаабввгддежжзиий€џџ ŽВЁO џ‹СТУФХЦЧШЩЪЫЬЭЮЯа… џ xЕЕЖЗЗ|X0  €…џ'K–ЪЪЫЬЬЭЮЮЯаабввгддежжзиš џџ”> џ‚ОПРСТУФХЦЧШЩЪЫЬЭШN žџ <Ѕ†f>€‡џ! `žЦШШЩЪЪЫЬЬЭЮЮЯаабввгддежжЏ €џ џyЙЛМНОПРСТФХЦЧШЩЪЫБ žџ €ˆџ€! /tЏФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгддеЗџ€џ (‚ЖИЙКЛМНОПРСТУФХЧШЩŠ ЁџŠџ' O…ЙТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгдЁ†џ =“ДЕЖЗИЙКЛМНОПРСТУФХЋ6 Ќџ+ 8i“ЙОПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабвв‡ …џ RŸАБВГДЖЗИЙКЛМНОПРСТИV Їџ€-  &T€ЉКЛММНООПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабg †џ UЇ­ЎЏАБВГДЕЖЗИЙЛМНОПОt Єџ4 2Vt‘­ЖЗИИЙККЛММНООПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯЫG†џ ЇЋЌ­ЎЏАБВГДЕЖЗИЙКЛМŽЅџ4bšАВВГДДЕЖЖЗИИЙККЛММНООПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮР+ ‡џLЉЊЋЌ­ЎЏАБВГДЕЖЗИИ" Іџ3 ŒЎЏААБВВГДДЕЖЖЗИИЙККЛММНООПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЁ ˆџ ЇЈЉЊЋЌ­ЎАБВГДЕЏjЈџ2 _­ЎЎЏААБВВГДДЕЖЖЗИИЙККЛММНООПРРСТТУФФХЦЦЧШШЩЪЪКI ‰џ$ЅІЇЈЉЊЋЌ­ЎЏАБЂU Љџ2+ЋЌ­ЎЎЏААБВВГДДЕЖЖЗИИЙККЛММНООПРРСТТУФФХЦЦЧШШЧs Šџ mЄЅІЇЈЉЊЋЌ­Ћ~: Њџ1œЋЌЌ­ЎЎЏААБВВГДДЕЖЖЗИИЙККЛММНООПРРСТТУФФХЦЦЧ™‹џ žЃЄЅІЇЈЉЈ}> Ћџ0 }ЊЊЋЌЌ­ЎЎЏААБВВГДДЕЖЖЗИИЙККЛММНООПРРСТТУФФХГB џ H ЁЂЃЄЅ~@ Ўџ/ LЈЉЊЊЋЌЌ­ЎЎЏААБВВГДДЕЖЖЗИИЙККЛММНООПРРСТТУЏ] џ ‰Ÿ  }A Аџ.ЄЈЈЉЊЊЋЌЌ­ЎЎЏААБВВГДДЕЖЖЗИИЙККЛММНООПРРС”9 џ#}C Вџ- ‘ІЇЈЈЉЊЊЋЌЌ­ЎЏЏААБВВГДДЕЖЖЗИИЙККЛММНООИs‘џ ! Дџ+ lЅІІЇЈЈЉЊЊЋЌЌ­ЎЏЏААБВВГДДЕЖЖЗИИЙККЛММЄR “џЗџ) :ЄЅЅІІЇЈЈЉЊЊЋЌЌ­ЎЏЏААБВВГДДЕЖЖЗИИЙКІn* вџ(œЃЄЅЅІІЇЈЈЉЊЊЋЌЌ­ЎЏЏААБВВГДДЕЖЖЗ•[ гџ% ƒЂЂЃЄЅЅІІЇЈЈЉЊЊЋЌЌ­ЎЏЏААБВВГДАƒGзџ" Z ЁЂЂЃЄЅЅІІЇЈЈЉЊЋЋЌЌ­ЎЏЏААЋˆ_/ йџ *Ÿ ЁЁЂЂЃЄЅЅІІЇЈЈЉЊЋЋЌЌ­˜rF лџ ’ŸŸ ЁЁЂЂЃЄЅЅІІЇ€Ј—[-  пџ tžŸŸ ЁЁЂЂЃЄ•}fJ- уџ HœœžŸ’|eK. чџ xdL0  юџ ѕџФџљџјџЩaїџаџ‰їџ‚џџЌіџєџџЬіџ’€џэѕџљџ ѕџŸ‚џѓџ§‚џ@ѓџЎƒџfђџ)„џђџЛ„џЏёџ6…џа№џШ…џ№№џE‡џ юџд‡џ"юџTˆџDэџоˆџlэџ c‰џ’ ьџч‰џГьџsŠџгыџюŠџоыџ‚‹џ–ъџє‹џ<ъџ‘‹џѓ щџљ‹џ­ъџŸŒџGчџ§‹џЩ€џџуџЌў‹џ 3џџсџ)ќ§ў‰џ Гџ$џПрџИќќ§ў‡џ і sџџЬоџ5њћќќ§ў…џўLџQџџџЋмџ Уњњћќќ§ў„џ xеЂџџ €џƒлџ Dјљњњћќќ§ў‚џ ЂџUџЖџџ ў€џWкџ Эјјљњњћќќ§ў€џ –џоџЩџџѕ€џљ3 йџQіїјјљњњћќќ§ўћfџџ cџџнџџщџьзџеѕіїјјљњњћќќы9џџ"ѓџџ№џџн‚џзжџ `єѕѕіїјјљ€њš €џоџ џџвƒџЛдџмѓєѕѕіїјјљЩ,€џР‚џџЦ„џ–гџ mђѓѓєѕііїд[џ œƒџџЙ…џkвџ сёђѓѓєѕНDџЕ„џ/џЎў„џ§%бџ {№ёёђп)‚џ аўўƒџDџЁ§ў„џ*џЮџ хяс•5 ƒџ;хќ§ўў‚џ[џ –ќ§ўƒџџЭџ{™= ƒџ Їњћќќ§ўўџtџ‰њћќ§‚џ џЫџ „џ jьљљњћќќ§ўў€џŒџ{љњћќ§ўџџъџrЬџ…џ' bзїјјљљњћќќ§ўўџџŸџtјљњћќ§ўџЋџ+§Dвџ+yуѕѕіїјјљљњћќќ§ўўџlџ€їјљњћќ§ўbџTџђ"Юџ/UЉыѓѓєѕѕіїјјљљњћќќ§ўњџ‹ѕіїјљћќћџ˜џџоЪџ-fЗэ№ёёђѓѓєѕѕіїјјљљњћќќ§Аџџ•єѕіїјљњЌџџд€џСЧџ/!vУээюяя№ёёђѓѓєѕѕіїјјљњњћќќEџџžѓєѕіїјљ0џ%ўџ˜Хџ0 ъыыьээюяя№ёёђѓѓєѕѕіїјјљњњћш ЈђѓєѕіїЌџџЎў‚џgХџDщщъыыьээюяя№ёёђѓѓєѕѕіїјјљњњŽ€В№ёђѓєчџ%ћ§ўџќ: Уџ4бшщщъыыьээюяя№ёёђѓѓєѕѕіїјјљњ# Мя№ёђ№E џџЋњћќ§ў€џяТџ5‰ччшщщъыыьээюяя№ёёђѓѓєѕѕіїјјМџХюя№№Rџ%їљњћќ§ў€џй Рџ;.фцччшщщъыыьээюяя№ёёђѓѓєѕѕіїяEЮьюя\џРїјљњћќ§ўџџќ Рџ? Сххцччшщщъыыьээюяя№ёёђѓѓєѕѕіgџzFиыьeџЄѕіїјљњћќ§ўџуџНџ@qуфххцччшщщъыыьээюяя№ёёђѓѓєѕН вF сш_џ„ђѓєѕіїјљњќ§ўЦџЛџBотуфххцччшщщъыыьээюяя№ёёђѓѓьџ \љHсEџb№ёђѓєѕіїјљњћќЇџ&ЙџDЏсттуфххцччшщщъыыьээюяя№ёёђѓi џшјJ.џMья№ёђѓєѕіїјљњћ‡џ{ИџD Xррсттуфххцччшщщъыыьээюяя№ёё џЁїїK џџfъьэюяёђѓєѕіїјљњ;џ œўD ЗџFгпррсттуфххцччшщщъыыьээюяя№Žџ:ѕіїLџџƒщъыьэюя№ёђєѕіїјц џГџёЕџH›оопррсттуфххцччшщщъыыьээюя€џеѕѕіMџџчшщъыьэюя№ёђѓєѕі”џџеўџиДџIAмноопррстууфххцччшщщъыыьээoџ–ѓєѕѕOџџ yхцчшщъыьэюя№ёђѓєѕ2џќ§ўџВВџKЦммноопррстууфххцччшщщъыыщ_џђѓѓєѕOџџІуфхцчщъыьэюя№ёђѓж џnњћќ§џ~БџK‚клммноопррстууфххцччшщщъК#џŒёёђѓѓєQџџЮтуфхцчшщъыэюя№ёђDџџУљњћќ§§GАџM,икклммноопррстууфххцччшл\џџ‰я№ёёђѓѓRџрстуфхцчшщъыьэюя­џіјљњћќ§ё ЎџO Зийкклммноопррстууфххцч– џџ„юяя№ёёђѓTџ/прстуфхцчшщъыьэшџџŠіїјљњћќ§й­џOjзиийкклммноопррстууффЉ2џџ Ћээюяя№ёёђUџ]нопртуфхцчшщъыьhџџяєѕіјљњћќ§ЇЌџвжзиийкклммноопррсте€џ3Lмыьээюяя№ёёUџ‰мнопрстуфхцчщъ…џџЌђѓєѕіїјљњћžЋџЅежжзиийкклммноопрЕQ €џ7 щъыыьээюяя№ёWџЎлмнопрстуфхцч›џџ :№ёђѓєѕіїјљњQџЉџ Tддежжзиийкклммл­i€џ: Bвшщщъыыьээюяяхџ вклмнопрстуфхЌ џџгя№ёђѓєѕіїјљџЇџЧгддежжзиийкЫFџ= EЛцччшщщъыыьээюя` џзийклнопрсту’ џџКьэюя№ёѓєѕіїаџЅџ ’ввгддежЮЉ€N ‚џ? OСфххцччшщщъыыьээК џ>жзийклмноппh џџšъыьэюя№ёђѓєѕŽџ6Ѕџ=абвХžtD  ƒџC YЧтууфххцччшщщъыыьшџџkежзийклмнд>џџxшщъыьэюя№ёђѓєCџeњC Ѓџ k:  …џG >–ирсстууфххцччшщщъыыuџџ’дежзийклЇ џџ ˆхцчщъыьэюя№ёђщ џ •њьЂџ ‡џ, 8ŽгноппрсстууфххцччшщщъЦ џЕвгдезиб\€џ Ÿуфхцчшщъыьюя№ё|џџСјљЬ­џ/HˆЬллмнноппрсстууфххцччшщш,џ Ябвгдеž€џБстуфхцчшщъыьэюпџѕїјљšЇџ2 P‹Пзиийкллмнноппрсстууфххцччшˆџ "ЯабвЗ<€џ:Ьпрстуфхцчшщъыьэl џџŽѕіїјљ\Ёџ7>i‘УддежжзиййкллмнноппрсстууфххцчРcLЮЯЧa €џ! €лмнопртуфхцчшщъыжџшєѕіїјђ(Ÿџ6=fŠ­ЬаабввгддежжзиййкллмнноппрсстууфххФџ={ uЫƒ€џ##Жйклмнопрстуфхчшщъ^ џџ hёђѓєѕіјxžџ5 ЋЬЬЭЮЮЯаабввгддежжзиййкллмнноппрсстууфШџСWo$€џ%ƒдзийклмнопрстуфхцчЖџг№ёђѓєѕѓžџ3qЪЫЬЬЭЮЮЯаабввгддежжзиййкллмнноппрсстуЪџџ Oш4 €џ&dЩгдежийклмнопрстуфхЪџюя№ёђѓєЉžџ0-ШЪЪЫЬЬЭЮЮЯаабввгддежжзиййкллмнноппрссЮџџ лш€€џ'DЙабвгдежзийклнопрстузџџ Eьэюя№ёђѓ9џ1 БШЩЪЪЫЬЬЭЮЮЯаабввгддежжзиййкллмнноппра џџЬцч џ)'ЃЭЮЯабвгдежзийклмнопрп8 џџйъыьэюя№вœџ2}ЧШШЩЪЪЫЬЬЭЮЮЯаабввгддежжзиййкллмннопб# џџЖхцб€џ)ˆЩЪЫЬЮЯабвгдежзийклмнопXџџЏшщъыьэюяm џ29ЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгддежззиййкллмннЗџџ›ффхД€џ) wЧШЩЪЫЬЭЮЯабгдежзийклмкZџ†цчшщъыьэшœџ3ЕХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгддежззиййкллм| џџzтуфф—€џ(ЋЦЧШЩЪЫЬЭЮЯабвгдежийкЭ3 џ†уфцчшщъыьŽœџ` ŠФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгддежззиййкЧ7џџ^сттуфxџџФХЦЧШЩЪЫЬЭЮЯабвгдежзИ џџ†стуфхцчщъеœџ& HТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгддежззийš €џ5 …ррсттуUџџ@ТУФХЧШЩЪЫЬЭЮЯабвгдеœџџ†прстуфхцчшB œџ&ИТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгддежзаW €џ6Ќопррстт3џџ zСТУФХЦЧШЩЪЬЭЮЯабвЬ^ џџ ˆнопрстуфхц››џ` “РСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгддвŠ џџ'ЦноопррстџџЋРСТУФХЦЧШЩЪЫЬЭЮа™ џџ Љклнопрстуфеœџ$ VПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабвва„€џ7Pжммноопррс џџОПРСТУФХЦЧШЩЪЫЬОF џџ4ЧийклмнопрстN œџ#КОПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯааЬ}€џ9 кклммноопрЭџџFМНОПРТУФХЦЧШЩШ~ џџ kджзийклмнопрЁ›џ" šНООПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЩwџ9 SЧийкклммноопБџџ|ЛМНОПРСТУФХЧˆџџ œгдежзийклмноБœџ bММНООПРРСТТУФФХЦЦЧШШЩЪЪЫЬЫžTџ$1Бжзиийкклммноо”џ ВКЛМНОПРСТУ€џ LРабвгджзийклмЕœџ$ЙЛММНООПРРСТТУФФХЦЦЧШШЩЪ Vџ$–дежжзиийкклммноTџ;ИЙКЛМНОПР’%€џžЭЮЯабвгдежзийЙœџ  ККЛММНООПРРСТТУФФХЦЦЧЂ[‚џ$ uЮгддежжзиийкклммЄ џƒЖЗИЙКЛМ‚!џ mЧЫЬЭЮЯабвгдежзНџ mИЙККЛММНООПРРСТТУУЁq7 ‚џ%!ЩбввгддежжзиийкклЯџ ВЕЖЗИДrџ 8АЧЩЪЫЬЭЮЯабвгдеРџ .ЗИИЙККЛММНООПРОl3  ƒџ% JЅЮЯаабввгддежжзиийккI џџKГДЕЋ`џ %”ФХЦЧШЩЪЫЬЭЮЯбвгБџ ЄЖЗИИЙККЛМВ“qI# „џ&rПЬЭЮЮЯаабввгддежжзиий€џџ ŽВЁO џ‹СТУФХЦЧШЩЪЫЬЭЮЯа… џ xЕЕЖЗЗ|X0  €…џ'K–ЪЪЫЬЬЭЮЮЯаабввгддежжзиš џџ”> џ‚ОПРСТУФХЦЧШЩЪЫЬЭШN žџ <Ѕ†f>€‡џ! `žЦШШЩЪЪЫЬЬЭЮЮЯаабввгддежжЏ €џ џyЙЛМНОПРСТФХЦЧШЩЪЫБ žџ €ˆџ€! /tЏФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгддеЗџ€џ (‚ЖИЙКЛМНОПРСТУФХЧШЩŠ ЁџŠџ' O…ЙТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгдЁ†џ =“ДЕЖЗИЙКЛМНОПРСТУФХЋ6 Ќџ+ 8i“ЙОПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабвв‡ …џ RŸАБВГДЖЗИЙКЛМНОПРСТИV Їџ€-  &T€ЉКЛММНООПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабg †џ UЇ­ЎЏАБВГДЕЖЗИЙЛМНОПОt Єџ4 2Vt‘­ЖЗИИЙККЛММНООПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯЫG†џ ЇЋЌ­ЎЏАБВГДЕЖЗИЙКЛМŽЅџ4bšАВВГДДЕЖЖЗИИЙККЛММНООПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮР+ ‡џLЉЊЋЌ­ЎЏАБВГДЕЖЗИИ" Іџ3 ŒЎЏААБВВГДДЕЖЖЗИИЙККЛММНООПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЁ ˆџ ЇЈЉЊЋЌ­ЎАБВГДЕЏjЈџ2 _­ЎЎЏААБВВГДДЕЖЖЗИИЙККЛММНООПРРСТТУФФХЦЦЧШШЩЪЪКI ‰џ$ЅІЇЈЉЊЋЌ­ЎЏАБЂU Љџ2+ЋЌ­ЎЎЏААБВВГДДЕЖЖЗИИЙККЛММНООПРРСТТУФФХЦЦЧШШЧs Šџ mЄЅІЇЈЉЊЋЌ­Ћ~: Њџ1œЋЌЌ­ЎЎЏААБВВГДДЕЖЖЗИИЙККЛММНООПРРСТТУФФХЦЦЧ™‹џ žЃЄЅІЇЈЉЈ}> Ћџ0 }ЊЊЋЌЌ­ЎЎЏААБВВГДДЕЖЖЗИИЙККЛММНООПРРСТТУФФХГB џ H ЁЂЃЄЅ~@ Ўџ/ LЈЉЊЊЋЌЌ­ЎЎЏААБВВГДДЕЖЖЗИИЙККЛММНООПРРСТТУЏ] џ ‰Ÿ  }A Аџ.ЄЈЈЉЊЊЋЌЌ­ЎЎЏААБВВГДДЕЖЖЗИИЙККЛММНООПРРС”9 џ#}C Вџ- ‘ІЇЈЈЉЊЊЋЌЌ­ЎЏЏААБВВГДДЕЖЖЗИИЙККЛММНООИs‘џ ! Дџ+ lЅІІЇЈЈЉЊЊЋЌЌ­ЎЏЏААБВВГДДЕЖЖЗИИЙККЛММЄR “џЗџ) :ЄЅЅІІЇЈЈЉЊЊЋЌЌ­ЎЏЏААБВВГДДЕЖЖЗИИЙКІn* вџ(œЃЄЅЅІІЇЈЈЉЊЊЋЌЌ­ЎЏЏААБВВГДДЕЖЖЗ•[ гџ% ƒЂЂЃЄЅЅІІЇЈЈЉЊЊЋЌЌ­ЎЏЏААБВВГДАƒGзџ" Z ЁЂЂЃЄЅЅІІЇЈЈЉЊЋЋЌЌ­ЎЏЏААЋˆ_/ йџ *Ÿ ЁЁЂЂЃЄЅЅІІЇЈЈЉЊЋЋЌЌ­˜rF лџ ’ŸŸ ЁЁЂЂЃЄЅЅІІЇ€Ј—[-  пџ tžŸŸ ЁЁЂЂЃЄ•}fJ- уџ HœœžŸ’|eK. чџ xdL0  юџ ѕџФџfnfљџfpwfјџfqп fїџfoуџИgїџpДџџЭqіџfqјџџрtіџqН€џєpѕџftћџmѕџqЦ‚џxfѓџfxў‚џŒfѓџqЮƒџЃfђџf„џМiђџqж„џЯsёџf‡…џуt№џfpо…џіp№џh‡џnfюџfoх‡џ{fюџj™ˆџfэџfnыˆџЇfэџlЂ‰џОlьџfoё‰џбtьџnЋŠџхtыџfoѕŠџыrыџpД‹џРoъџfqј‹џŠfъџqН‹џјnfщџftћ‹џЮrъџqЦŒџ‘fkbчџfxў‹џпpefeџџmgуџqЭў‹џ „fhfgџџihjсџf~ќ§ў‰џ бqџr{gџ€oйsgрџpгќќ§ў‡џ њxfjnЊgџfsџрojоџf…њћќќ§ў…џў”nџg—МgџnџџЭojмџ foйњњћќќ§ў„џ Ўpf€oцЧoџџm€џДp€лџ gŽјљњњћќќ§ў‚џ Чofџi™џгrџџmў€џšpкџ foпјјљњњћќќ§ў€џ Рofџ`nыџпtџџoљ€џћ„lйџi•іїјјљњњћќќ§ў§ЃpfџџlЂџџыqџџqђџєvfзџfnтѕіїјјљњњћќќђˆpfџџg{јџџіoџџsы‚џчqgжџ lžєѕѕіїјјљ€њТqm€џfqыџlџџtфƒџжoaдџfnцѓєѕѕіїјјљн€qf€џdnй‚џnfџuн„џСpmгџ mЅђѓѓєѕііїуœofџinФƒџvjџuе…џІpвџ fnшёђѓѓєѕеŽpifџfoв„џ‚eџsЮў„џў|fбџ nЌ№ёёђчЙ~qff‚џjtтўўƒџŽeџrЦ§ў„џ€iџeЮџ fpщячМ…mnfƒџgqŠюќ§ўў‚џeџnПќ§ўƒџt`џhhЭџoЌН‰moffƒџ fnrШњћќќ§ўўџЋfџhЗњћќ§‚џlџfhqUЫџfgkpff„џ fknЄёљљњћќќ§ўў€џКgџgЏљњћќ§ўџџђoџfwЋqЬџff…џ'jmnŸфїјјљљњћќќ§ўўџџХpџgЊјљњћќ§ўџЭqџf€ўnвџ+jfrp­ъѕѕіїјјљљњћќќ§ўўџІjџfБїјљњћќ§ўЁeџf˜џї{gЮџ/diso˜Шюѓѓєѕѕіїјјљљњћќќ§ўќpfџlЗѕіїјљћќќtdџoСџџыrfЪџ-gips Яю№ёёђѓѓєѕѕіїјјљљњћќќ§аrџџoМєѕіїјљњЬqџџsх€џкpcЧџ/dnyЉеээюяя№ёёђѓѓєѕѕіїјјљњњћќќfџџrТѓєѕіїјљ‚gџf|ўџТp€Хџ0oРъыыьээюяя№ёёђѓѓєѕѕіїјјљњњћ№mfmgrЧђѓєѕіїЬpџџsЮў‚џЄrХџ1iŒщщъыыьээюяя№ёёђѓѓєѕѕіїјјљњњКodfhsЬ№ёђѓєэrdџe|ћ§ўџ§ˆnУџ4hmлшщщъыыьээюяя№ёёђѓѓєѕѕіїјјљњ{hjffsбя№ёђёŽnџџsЫњћќ§ў€џѕxhТџ5nГччшщщъыыьээюяя№ёёђѓѓєѕѕіїјјеpџqydqжюя№№–nџd{їљњћќ§ў€џшl€Рџ;e€хцччшщщъыыьээюяя№ёёђѓѓєѕѕіїѓugdwgpльюя›oUџfoжїјљњћќ§ўџџ§lРџ?fnбххцччшщщъыыьээюяя№ёёђѓѓєѕѕіЃnџkЎeoрыь nfџfoХѕіїјљњћќ§ўџюpџceНџ@nЄуфххцччшщщъыыьээюяя№ёёђѓѓєѕдnqUoтglфщ›o`џfqВђѓєѕіїјљњќ§ўнtџdicЛџBfvртуфххцччшщщъыыьээюяя№ёёђѓѓ№ufџmœљ‘gkфnUџqŸ№ёђѓєѕіїјљњћќЩqџg}ojЙџDUmХсттуфххцччшщщъыыьээюяя№ёёђѓЃmџgpюј’fj€nџUo’эя№ёђѓєѕіїјљњћЖiџfДАpИџDl•ррсттуфххцччшщщъыыьээюяя№ёёРmfџpХїї“ffnџџ`o ъьэюяёђѓєѕіїјљњ‰fџmФўmЗџFdqипррсттуфххцччшщщъыыьээюяя№Иnfџhˆѕії“geџџjoЏщъыьэюя№ёђєѕіїјюm€џtбџїyfЕџHnЙоопррсттуфххцччшщщъыыьээюяЏocџhnтѕѕі“eџџgnНчшщъыьэюя№ёђѓєѕіНoџџqхўџшogДџIjˆмноопррстууфххцччшщщъыыьээІpjџfoНѓєѕѕ”eџџlЊхцчшщъыьэюя№ёђѓєѕ„hџdtќ§ўџаnbВџKbnаммноопррстууфххцччшщщъыыъo`џknЙђѓѓєѕ•gџџsСуфхцчщъыьэюя№ёђѓуnџkЇњћќ§џВpБџKnЋклммноопррстууфххцччшщщъЯzq€џcnЗёёђѓѓє–fџџoжтуфхцчшщъыэюя№ёђŽhџџsйљњћќ§§nАџMh}йкклммноопррстууфххцччшсšnfџџcoЕя№ёёђѓѓ•eџ`nрстуфхцчшщъыьэюяЪoџhrіјљњћќ§іzgЎџOmmЧийкклммноопррстууфххцчКpkUџџhnБюяя№ёёђѓ–gџf€прстуфхцчшщъыьэыugџџpЖіїјљњћќ§шpe­џOnžзиийкклммноопррстууфхФ‚ogџџUmqЧээюяя№ёёђ˜gџe˜нопртуфхцчшщъыьЁnџџgvёєѕіјљњћќ§ЪqЌџeuджзиийкклммноопррстлЌtoe€џ3io‘уыьээюяя№ёё˜eџoЏмнопрстуфхцчщъБnqџџpЩђѓєѕіїјљњћФrЋџUmМежжзиийкклммноопрЩ’lle€џ7€joПщъыыьээюяя№ё™gџqУлмнопрстуфхцчМniџџlˆ№ёђѓєѕіїјљњ–eџgЉџ k‘ддежжзиийккл€мФŸwnif€џ:fgn‹лшщщъыыьээюяяъrfџkеклмнопрстуфхЦmdџџfrпя№ёђѓєѕіїјљpfџifЇџfoЬгддежжзиийквГŒnphiџ=`imŒЮцччшщщъыыьээюяžnџdqзийклнопрстуЖmgџџcnЯьэюя№ёѓєѕіїсrџ]jojЅџmБввгддежвПЊwlogf‚џ?bil’афххцччшщщъыыьээаn`џg†жзийклмнопрŸmfџџbnМъыьэюя№ёђѓєѕЙoџd…ГpЅџj…абвЫИЃ‰skpmecƒџCUgom–гтууфххцччшщщъыыьъweџџhžежзийклмниˆoqџџdnЉшщъыьэюя№ёђѓєfџgЂњŽlЃџ fkЇœ„pmpkff…џG€hnm‡ИлрсстууфххцччшщщъыыЈnџfџpБдежзийклПsmџџelВхцчщъыьэюя№ёђэnfџmОњђvhЂџhlpjgf‡џ,kgol„ВзноппрсстууфххцччшщщъжnffhџnУвгдезие—nh€џgmНуфхцчшщъыьюя№ё­oџџrзјљпod­џ/jfpnpŒЎгллмнноппрсстууфххцччшщш~fџpp€kабвгдеЙsmm€џjpЦстуфхцчшщъыьэюцohџiuѕїјљТpUЇџ2hffplsЏЪзиийкллмнноппрсстууфххцччшГoџflsgwЯабвФ…nh€џdm…дпрстуфхцчшщъыьэЄmџџpИѕіїјљqЁџ7jggqoks…œБЫддежжзиййкллмнноппрсстууфххцчбmjfožqeŒЮЯۘmi€џ!gmЊлмнопртуфхцчшщъыпnmџ`oьєѕіїјѕ~hŸџ6jm„šЌНЭаабввгддежжзиййкллмнноппрсстууфххгqeџgˆЋhk ЬЈonj€џ#dpxЦйклмнопрстуфхчшщъ›kџџkЂёђѓєѕіјЌožџ5dlЛЬЬЭЮЮЯаабввгддежжзиййкллмнноппрсстууфеqgџfnв—fpxni€џ%]npЊезийклмнопрстуфхцчЬnmџfnп№ёђѓєѕєrjžџ3mžЪЫЬЬЭЮЮЯаабввгддежжзиййкллмнноппрсстуеsiџџm’шƒfjle€џ&€im™ЭгдежийклмнопрстуфхжqhџpИюя№ёђѓєЩsžџ3j|ЩЪЪЫЬЬЭЮЮЯаабввгддежжзиййкллмнноппрссзujџџixршsjf€€џ'gn‰ФабвгдежзийклнопрстунxhџџmŽьэюя№ёђѓˆgџ1hlНШЩЪЪЫЬЬЭЮЮЯаабввгддежжзиййкллмннопприwmџџfpзцчlџ)fnzИЭЮЯабвгдежзийклмнопрс…lџџhrръыьэюя№пoœџ2€lЃЧШШЩЪЪЫЬЬЭЮЮЯаабввгддежжзиййкллмннопзylџџfnЫхцкp€џ)hoЉЩЪЫЬЮЯабвгдежзийклмноп–nџџcnШшщъыьэюяЅkџ2k‚ЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгддежззиййкллмннЩvmџџfmМффхЪr€џ)j ЧШЩЪЫЬЭЮЯабгдежзийклмм—mUџcnЏцчшщъыьэыpfœџ3hnНХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгддежззиййкллмЉmiџџfnЉтуффКp€џ(mИЦЧШЩЪЫЬЭЮЯабвгдежийкд‚mmџkmЏуфцчшщъыьЗqœџ`flЈФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгддежззиййкаƒnaџџfn™сттуфЈgџџfmФХЦЧШЩЪЫЬЭЮЯабвгдежзЧskџџfnЏстуфхцчщъоofœџ&lˆТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгддежззийИnl€џ5fmЎррстту•fџџe„ТУФХЧШЩЪЫЬЭЮЯабвгдеИnfџџamЏпрстуфхцчш‹jœџ&goНТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгддежзг“md€џ6jpУопррстт‚fџџlŸСТУФХЦЧШЩЪЬЭЮЯабвЯ—ldџџemЏнопрстуфхцМo›џ]lЋРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввг€д=ЎsmUџџfn{аноопррстsfџџlЖРСТУФХЦЧШЩЪЫЬЭЮаДqljџџkqРклнопрстуфмpgœџ$lПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввбЊqoh€џ7fnиммноопррсlџџhoОПРСТУФХЦЧШЩЪЫЬХ‰ldџџboЯийклмнопрст‘mœџ#grМОПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯааЮІpnd€џ9flnЊкклммноопреoџџe†МНОПРТУФХЦЧШЩЩЅmjUџџdlежзийклмнопрОnU›џ"ikЌНООПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЬЃoneџ9gm’ЯийкклммноопЦqџџlžЛМНОПРСТУФХЧЉrnjџџmkoЖгдежзийклмноЦmgœџ l“ММНООПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЖnmfџ$fnУжзиийкклммнооЖnџqjЖКЛМНОПРСТУЊumf€џhlШабвгджзийклмШndœџgvЙЛММНООПРРСТТУФФХЦЦЧШШЩЪЕ‘noimџ$fmrДдежжзиийкклммно“gџg€ИЙКЛМНОПРЋwlh€џfntЕЭЮЯабвгдежзийШoeœџbjЎККЛММНООПРРСТТУФФХЦЦЧЖ“onfk‚џ$fnmЂагддежжзиийкклммОmfџlŸЖЗИЙКЛНЂumeџilœШЫЬЭЮЯабвгдежзЪphџk—ИЙККЛММНООПРРСТТУФГlnif‚џ%fgmwЈЬбввгддежжзиийкклеpfџakГЕЖЗИЗ™omdџflЛЧЩЪЫЬЭЮЯабвгдеЫrkџkzЗИИЙККЛММНООПРПА™~kojgfƒџ%fmk‹ЙЮЯаабввгддежжзиийккlџџh†ГДЕБmliџflxЌФХЦЧШЩЪЫЬЭЮЯбвгТrgџckЎЖЗИИЙККЛМИЊ›ˆvjmkgm„џ&ffnqŸЦЬЭЮЮЯаабввгддежжзиийЊnfџџkЂВЋˆkljџgluЇСТУФХЦЧШЩЪЫЬЭЮЯаЊmgџUk›ЕЕЖЗЗЌžŽ{mjmieff…џ'finm‹АЪЪЫЬЬЭЮЮЯаабввгддежжзиЗmfџџgnЄ€kibџelqЂОПРСТУФХЦЧШЩЪЫЬЭЫŽmbžџ i€­ ’qjmlgec‡џ!fflls•ГЧШШЩЪЪЫЬЬЭЮЮЯаабввгддежжТmf€џjjkhUџglpКЛМНОПРСТФХЦЧШЩЪЫОvl€žџbgikmgecˆџ€f!nk|КФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгддеЦpfџgg€џUgkwŸЗИЙКЛМНОПРСТУФХЧШЩЊleЁџifŠџ'ffjmit‹ЄНТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввгдКng†џfik€ЅДЕЖЗИЙКЛМНОПРСТУФХЙlhЌџ€f(mkm€–ЊМОПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯаабввЌmf…џfjk‡ЈАБВГДЖЗИЙКЛМНОПРСТОkhЇџ€f-kmjkwŒ ВКЛММНООПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯааб›mf†џk‰Њ­ЎЏАБВГДЕЖЗИЙЛМНОППœmjjЄџ4fhllio|‹˜ЅВЖЗИИЙККЛММНООПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЮЯЮŠmf†џjjЉЋЌ­ЎЏАБВГДЕЖЗИЙКЛМЇsldЅџ4fm›ЇАВВГДДЕЖЖЗИИЙККЛММНООПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЭЮЧ|mf‡џh„ЉЊЋЌ­ЎЏАБВГДЕЖЗИИŸukfІџ3fj ЎЏААБВВГДДЕЖЖЗИИЙККЛММНООПРРСТТУФФХЦЦЧШШЩЪЪЫЬЬЗrkˆџjЇЈЉЊЋЌ­ЎАБВГДЕГ•olfЈџ2kŒ­ЎЎЏААБВВГДДЕЖЖЗИИЙККЛММНООПРРСТТУФФХЦЦЧШШЩЪЪУŠlf‰џfsЅІЇЈЉЊЋЌ­ЎЏАБЋ‹kmgЉџ+iwЌЌ­ЎЎЏААБВВГДДЕЖЖЗИИЙККЛММНООПРРСТТУФФХЦЦЧ€ШŸljfŠџkЄЅІЇЈЉЊЋЌ­­š~jjkЊџ1fkЄЋЌЌ­ЎЎЏААБВВГДДЕЖЖЗИИЙККЛММНООПРРСТТУФФХЦЦЧБtmf‹џdj ЃЄЅІЇЈЉЉ™jle`Ћџ0fj—ЊЊЋЌЌ­ЎЎЏААБВВГДДЕЖЖЗИИЙККЛММНООПРРСТТУФФХН†lfџ i€ ЁЂЃЄЅ—€klgjЎџ/j„ЈЉЊЊЋЌЌ­ЎЎЏААБВВГДДЕЖЖЗИИЙККЛММНООПРРСТТУК’ljfџ j—Ÿ Ё”~kkgmАџ.gqІЈЈЉЊЊЋЌЌ­ЎЎЏААБВВГДДЕЖЖЗИИЙККЛММНООПРРСЌkkfџgr’~kjg`Вџ-fjžІЇЈЈЉЊЊЋЌЌ­ЎЏЏААБВВГДДЕЖЖЗИИЙККЛММНООМœrmff‘џjqjkfcДџ+fjЅІІЇЈЈЉЊЊЋЌЌ­ЎЏЏААБВВГДДЕЖЖЗИИЙККЛММБŒklf“џagffЗџ)i|ЄЅЅІІЇЈЈЉЊЊЋЌЌ­ЎЏЏААБВВГДДЕЖЖЗИИЙКБ˜ykifвџ(fm ЃЄЅЅІІЇЈЈЉЊЊЋЌЌ­ЎЏЏААБВВГДДЕЖЖЗЉŽrlkffгџ%fi–ЂЂЃЄЅЅІІЇЈЈЉЊЊЋЌЌ­ЎЏЏААБВВГДВŸ…lmhfзџ"j‡ ЁЂЂЃЄЅЅІІЇЈЈЉЊЋЋЌЌ­ЎЏЏААЎ zjmffйџ huŸ ЁЁЂЂЃЄЅЅІІЇЈЈЉЊЋЋЌЌ­Ѕ–ƒqjmhffлџfkšŸŸ ЁЁЂЂЃЄЅЅІІЇЈЈЉЂ™‹yklkffпџfiŽžŸŸ ЁЁЂЂЃЄŸ–ƒwnhklhffуџjœœžŸš“‹wnhjkifчџ gmˆ€wnhjkifюџiijifѕџt8mk@/Щ4яѕ3:№џяT№џџќušљџџџЁђџџџџЧЊќџџџџх(ђџџџџџѓЙ§џџџџџю3ёџџџџџџь7ЦџџџџџџџђX?ёџџџџџџџў{дџџџџџџџџџЇL№џџџџџџџџџЬпџџџџџџџџџџщ[ёџџџџџџџџџџєчџџџџџџџџџџџюjђџџџџџџџџџџџэ; ьџџџџџџџџџџџџѕ\yєџџџџџџџџџџџџџяџџџџџџџџџџџџџџ­‰їџџџџџџџџџџџџџџаёџџџџџџџџџџџџџџџо™љџџџџџџџџџџџџџџ§•ђџџџџџџџџџџџџџџџю>Јћџџџџџџџџџџџџџџџё'ёџџџџџџџџџџџџџџџџАЗ§џџџџџџџџџџџџџџџ№P| 2ёџџџџџџџџџџџџџџџџо#џ+fХўџџџџџџџџџџџџџџџ№Hnџ>h§T>№џџџџџџџџџџџџџџџџЫЩљRцџ№4гџџџџџџџџџџџџџџџџё3 єїf №џџъK№џџџџџџџџџџџџџџџѓ^№ў|ѓџџќм оџџџџџџџџџџџџџџџїКхџџ–ѓџџџјРZёџџџџџџџџџџџџџџќк hёџџАёџџџџѓ™цџџџџџџџџџџџџџџћцьџџџЦъџџџџџђmhђџџџџџџџџџџџџџѕЯ†єџџџксџџџџџџђFыџџџџџџџџџџџџџђЇOёџџџџъзџџџџџџџ№*xєџџџџџџџџџџџ§ђt-№џџџџџєЬџџџџџџџџчяџџџџџџџџџџџђО шџџџџџџєРџџџџџџџџћгˆіџџџџџџџџџєчJ'хњџџџџџџяГџџџџџџџџџїБёџџџџџџџџ№фfAяўџџџџџџџэ+Іџџџџџџџџџџё7—љџџџџџ§ягNgђџџџџџџџџџэ?–џџџџџџџџџџь'&ёџџџўюэ—4%Цёџџџџџџџџџџ№S†џџџџџџџџџџ№лІћџя№Ё> ёўџџџџџџџџџџџїgvџџџџџџџџџџѕ§в§єЌF nъѕџџџџџџџџџџџџџў|hћџџџџџџџџџч№ѕЊ<Šяєџџџџџџџџџџџџџџџџ˜cљџџџџџџџџџЇ#юџёy UЕђјџџџџџџџџџџџџџџџџџіqnўџџџџџџџџёXKёџџ№JfЦђђџџџџџџџџџџџџџџџџџџџџѓ}џџџџџџџџџ№Žџџџџю(%yж№ѕџџџџџџџџџџџџџџџџџџџџџџџОŽџџџџџџџџџОдџџџџџф)сюљџџџџџџџџџџџџџџџџџџџџџџџџџ№Pџџџџџџџџ№>2ёџџџџџњЪвўџџџџџџџџџџџџџџџџџџџџџџџџџџџ№Ћ/ЌџџџџџџџўгУџџџџџџџєŸmёџџџџџџџџџџџџџџџџџџџџџџџџџџџќšў@Кџџџџџџџё)5ёџџџџџџџџёm№џџџџџџџџџџџџџџџџџџџџџџџџџџџџ№1vџAЦџџџџџџѓ}Цџџџџџџџџџџ№@ЛћџџџџџџџџџџџџџџџџџџџџџџџџџџџџлкїBвџџџџџѓЉ=ђџџџџџџџџџџџ№S№џџџџџџџџџџџџџџџџџџџџџџџџџџџџё9!№юCмџџџџєДэџџџџџџџџџџџџєыџџџџџџџџџџџџџџџџџџџџџџџџџџџџє”|љюDхџџџіРсўџџџџџџџџџџџџсIЂїџџџџџџџџџџџџџџџџџџџџџџџџџџџџф цџяEюџџѕШЬћџџџџџџџџџџџџџФ8ѓ$<№џџџџџџџџџџџџџџџџџџџџџџџџџџџџё<ƒѓџюEєџѓВЎіџџџџџџџџџџџџџџЂRљп сџџџџџџџџџџџџџџџџџџџџџџџџџџџџє˜%ёџџюFјђ•Гѓџџџџџџџџџџџџџџ§zkњїИ‡єџџџџџџџџџџџџџџџџџџџџџџџџџџџќт Щ§џџюJўtЭіџџџџџџџџџџџџџџџюAŒџџђ)№џџџџџџџџџџџџџџџџџџџџџџџџџџџњо]№џџџюOVпњџџџџџџџџџџџџџџџџюЌџџџёKбўџџџџџџџџџџџџџџџџџџџџџџџџџџјжэџџџџяI%ъўџџџџџџџџџџџџџџџџўœкџџџџя%lёџџџџџџџџџџџџџџџџџџџџџџџџџџіЫ нњџџџџюI€ўџџџџџџџџџџџџџџџџџю;ёџџџџўр яџџџџџџџџџџџџџџџџџџџџџџџџџџєОмњџџџџџюJЛџџџџџџџџџџџџџџџџџџыnїџџџџџїККћџџџџџџџџџџџџџџџџџџџџџџџџџёЅмњџџџџџџюKцџџџџџџџџџџџџџџџџџёeЯџџџџџџџђ„Q№џџџџџџџџџџџџџџџџџџџџџџџџєфAлњџџџџџџџяLєџџџџџџџџџџџџџџџџџгђџџџџџџџџёMыџџџџџџџџџџџџџџџџџџџџџџџ§ё…1сњџџџџџџџџяM2юџџџџџџџџџџџџџџџџ№/­ћџџџџџџџџџя& їџџџџџџџџџџџџџџџџџџџџџџ№Ш%ƒђџџџџџџџџџџяM`їџџџџџџџџџџџџџџџі™4ђџџџџџџџџџџўЧ:№џџџџџџџџџџџџџџџџџџџџћ№ЪN'жєџџџџџџџџџџџяNšџџџџџџџџџџџџџџџљб вџџџџџџџџџџџџ›рџџџџџџџџџџџџџџџџџџџђё™&tђўџџџџџџџџџџџџяOЮџџџџџџџџџџџџџџќпcђџџџџџџџџџџџёN%…єџџџџџџџџџџџџџџџџїюнf aфђџџџџџџџџџџџџџџё(ђџџџџџџџџџџџџџџщ7ђџџџџџџџџџџџџѓи((ёџџџџџџџџџџџџџџяёЩn"mъёџџџџџџџџџџџџџџџєŽёџџџџџџџџџџџџќщ*эџџџџџџџџџџџџџл њп аўџџџџџџџџџўёюьЃM zюђџџџџџџџџџџџџџџџџџфE№џџџџџџџџџџџіз оўџџџџџџџџџџџџў‘3эїДjёџџџџџў№№№ШŠQEЈяєџџџџџџџџџџџџџџџџџџё?vќџџџџџџџџџџђД ијџџџџџџџџџџџџџ№F\єџёtєџ§№ђэСƒK@ЄююџџџџџџџџџџџџџџџџџџџџїЃБџџџџџџџџџџ№&чћџџџџџџџџџџџџџџє Œџџџ№;VщЛ{EOŸююџџџџџџџџџџџџџџџџџџџџџџџы2япџџџџџџџџѕп19яўџџџџџџџџџџџџџџњœЬџџџџъZЄфё№џџџџџџџџџџџџџџџџџџџџџџџџџ№PЩтіџџџџџџџё‘oђџџџџџџџџџџџџџџџџђ'ёџџџџћЭFsВь№єџџџџџџџџџџџџџџџџџџџџџџџџџџџџњИCќФ*яџџџџџђи6ТёџџџџџџџџџџџџџџџџїŠ ќџџџџџє“ErЊиє№яћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџюкџXєџџџїьaMэњџџџџџџџџџџџџџџџџџяђџџџџџџџёSRє№ќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№?Wё§rџџўё АёџџџџџџџџџџџџџџџџџџѕwyїџџџџџџџњяџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёHцџђPЦџёО" ‹№§џџџџџџџџџџџџџџџџџџџчяџџџџџџџџђРќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђPƒѓџэ0ътDfьїџџџџџџџџџџџџџџџџџџџџ№1ЩќџџџџџџџџЛgѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђ[Wђџџ№lCнђџџџџџџџџџџџџџџџџџџџџџёQzѓџџџџџџџџ№C ёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓe7ёџџџѓ(Сяџџџџџџџџџџџџџџџџџџџџџџђ}1ёџџџџџџџџџчЯўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓqьџџџџс;яўџџџџџџџџџџџџџџџџџџџџџџѕЊуџџџџџџџџџїyzєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓ|пўџџџџУŽўџџџџџџџџџџџџџџџџџџџџџџѕЫкњџџџџџџџџџђ,ђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњэIЦјџџџџџкџџџџџџџџџџџџџџџџџџџџџџђЋлњџџџџџџџџџ§ВмџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђРЬєџџџџџќr№џџџџџџџџџџџџџџџџџџџџџёyнћџџџџџџџџџџёŽѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўёm2шћџџџџџџ№QNяџџџџџџџџџџџџџџџџџџџўяKоћџџџџџџџџџџѓo9ѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєл)`ёџџџџџџџџы1šџџџџџџџџџџџџџџџџџџџіх)5щћџџџџџџџџџџўЯ цџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџў№”šђџџџџџџџџџятџџџџџџџџџџџџџџџџџџё™ rђџџџџџџџџџџџџё%Ёїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§ёЖ,Ьєџџџџџџџџџџђ№џџџџџџџџџџџџџџџџђл3 ЖѓџџџџџџџџџџџџѓzHђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§ђВ)y№ћџџџџџџџџџџџсXђџџџџџџџџџџџџџџќ№v.фљџџџџџџџџџџџџџзьџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќђЎ&TчєџџџџџџџџџџџџџТЎџџџџџџџџџџџџџўёК†ђџџџџџџџџџџџџџџ№*ДњџџџџџџџџџџџџџџџџџџџџџџџџџџџєёЉ#4аёџџџџџџџџџџџџџџџ› ђџџџџџџџџџџџџ№Ф2@фѕџџџџџџџџџџџџџџё8YђџџџџџџџџџџџџџџџџџџџџџџџџџѕёШ_ЎёџџџџџџџџџџџџџџџџєiWђџџџџџџџџџџ№Ю;Ќђџџџџџџџџџџџџџџџё?№џџџџџџџџџџџџџџџџџџџџџџџїёаi7ЎѓћџџџџџџџџџџџџџџџџџнФџџџџџџџџџ№вDdяњџџџџџџџџџџџџџџџђGХќџџџџџџџџџџџџџџџџџџџ§яѓеr eм№ўџџџџџџџџџџџџџџџџџџё/ѓџџџџџџ§ёО8FйёџџџџџџџџџџџџџџџџђOnђџџџџџџџџџџџџџџџџќэђв‰C 'šёѓџџџџџџџџџџџџџџџџџџџџѓ~nіџџџџњёЈ'<а№џџџџџџџџџџџџџџџџџёY$ђџџџџџџџџџџџџўђьѓЭ>XЬёќџџџџџџџџџџџџџџџџџџџџџћЯйџџџі№4Ц№џџџџџџџџџџџџџџџџџќэCдўџџџџџџџјьёюЧ[-$sЯёђџџџџџџџџџџџџџџџџџџџџџџџўц%ёџѓьy +Нёџџџџџџџџџџџџџџџџџџѓаєџџ§яэєиЇm?=“хяљџџџџџџџџџџџџџџџџџџџџџџџџџџя&‡ћуbCФ№ўџџџџџџџџџџџџџџџџџџ№’ њїшМƒQ$,dГёюўџџџџџџџџџџџџџџџџџџџџџџџџџџџџђ?ЄMaпюџџџџџџџџџџџџџџџџџџџ§юN' LŠЭѕяіџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№Iƒэёџџџџџџџџџџџџџџџџџџџџ№г 5mГщђяўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќщ-Ѓёїџџџџџџџџџџџџџџџџџџџџіь`CkЫэѓьїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїкМќџџџџџџџџџџџџџџџџџџџџ§ђŽ @€ГмєюэјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєП ѓџџџџџџџџџџџџџџџџџџџџёК!=№§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёœїџџџџџџџџџџџџџџџџџџ№иAщџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёtъџџџџџџџџџџџџџџџџ§ђП<КљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєхDFяџџџџџџџџџџџџџџјђЂ%mёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќђ|Кџџџџџџџџџџџџџёю„,№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёГѓџџџџџџџџџџёђЛV пџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѓп>~їџџџџџџџђёПY Ѓіџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљ№qшџџџџџђёУ\TёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёэƒEяџџѓ№Чaяџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§№вVЙњ№Ыdб§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіђЇ/ОiŠѓџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§эщy?ёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјюф:ъџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџђёбu$ОњџџџџџџџџџџџџџџџџџџџџџџџџџџџќэёЙ[qђџџџџџџџџџџџџџџџџџџџџџџџџѓэяСz>.ёџџџџџџџџџџџџџџџџџџџџћэђлžY тџџџџџџџџџџџџџџџѕьюѕсЛw;ЇїџџџџџџџџїэюѕфР’f@XѕџџљээѕцФ–iDРщШ›lG"sailcut-1.3.5/icons/panelgroup.svg0000644000175000007640000000341410517406075017123 0ustar sharkyjerryweb sailcut-1.3.5/icons/panel.svg0000644000175000007640000000137210517406075016047 0ustar sharkyjerryweb sailcut-1.3.5/icons/sailcut.xpm0000644000175000007640000002002211077643071016413 0ustar sharkyjerryweb/* XPM */ static const char *sailcut_xpm[] = { /* width height ncolors chars_per_pixel */ "32 32 369 2", /* colors */ " c #000000", " . c #7E7EAA", " X c #DFDFE8", " o c #ADADAD", " O c #8A8AB9", " + c #383883", " @ c #9D9DC5", " # c #B8B8C5", " $ c #7B7B9D", " % c #8888B7", " & c #8B8BB0", " * c #9B9BC3", " = c #9E9EBC", " - c #AEAECF", " ; c #4C4C86", " : c #7474A0", " > c #9C9CBA", " , c #4A4A84", " < c #A5A5A5", " 1 c #B0B0BD", " 2 c #40408E", " 3 c #6B6BA1", " 4 c #59598C", " 5 c #CCCCDF", " 6 c #7A7AA9", " 7 c #0D0D73", " 8 c #4D4D94", " 9 c #F2F2F7", " 0 c #9090AE", " q c #6B6B8D", " w c #7878A7", " e c #ABABAE", " r c #363684", " t c #B1B1CB", " y c #B4B4C4", " u c #43438A", " i c #2E2E7C", " p c #9393BE", " a c #6E6E9D", " s c #2C2C7A", " d c #7C7CAE", " f c #8F8FBA", " g c #525292", " h c #9292B3", " j c #55558B", " k c #C8C8DE", " l c #474791", " z c #B5B5BE", " x c #EAEAF2", " c c #ADADCA", " v c #73739B", " b c #5B5B94", " n c #ACACBF", " m c #5A5A89", " M c #6767A3", " N c #F7F7F8", " B c #A5A5C2", " V c #63639F", " C c #7E7E9F", " Z c #7676AB", " A c #9E9EC5", " S c #5F5F9B", " D c #8686AA", " F c #71719C", " G c #E4E4EF", " H c #BDBDCC", " J c #2B2B75", " K c #ABABB7", " L c #7979A7", " P c #6161A0", " I c #9797A0", " U c #4C4C92", " Y c #DFDFE0", " T c #A8A8AA", " R c #333380", " E c #5B5B9A", " W c #B6B6BB", " Q c #595998", " ! c #D9D9DA", " ~ c #C1C1D3", " ^ c #7F7FB0", " / c #D2D2DD", " ( c #707094", " ) c #7D7DAE", " _ c #404086", " ` c #D0D0DB", " ' c #B8B8D4", " ] c #3C3C82", " [ c #272774", " { c #6A6A8E", " } c #62629A", " | c #7575A6", ". c #202077", ".. c #EDEDF4", ".X c #333383", ".o c #CBCBCC", ".O c #7373A4", ".+ c #B3B3C5", ".@ c #5E5E96", ".# c #9999BC", ".$ c #FEFEFE", ".% c #C1C1D6", ".& c #ACACC8", ".* c #FCFCFC", ".= c #FAFAFA", ".- c #8080AA", ".; c #535395", ".: c #F8F8F8", ".> c #7B7BAF", "., c #F6F6F6", ".< c #828298", ".1 c #F4F4F4", ".2 c #9F9FC5", ".3 c #DFDFE6", ".4 c #9595A4", ".5 c #8D8DB0", ".6 c #F2F2F2", ".7 c #B8B8C3", ".8 c #3B3B7A", ".9 c #36367F", ".0 c #D6D6E7", ".q c #D9D9E0", ".w c #9C9CB8", ".e c #ECECEC", ".r c #EAEAEA", ".t c #484880", ".y c #8080AD", ".u c #E8E8E8", ".i c #E6E6E6", ".p c #E4E4E4", ".a c #B7B7CF", ".s c #E2E2E2", ".d c #7878A5", ".f c #F0F0F3", ".g c #A9A9AA", ".h c #DEDEDE", ".j c #9999C2", ".k c #DCDCDC", ".l c #6F6FA6", ".z c #9797C0", ".x c #DADADA", ".c c #D8D8D8", ".v c #ABABC3", ".b c #BBBBD6", ".n c #9696B5", ".m c #59598D", ".M c #44447F", ".N c #D4D4D4", ".B c #6A6A97", ".V c #CFCFD9", ".C c #525290", ".Z c #D2D2D2", ".A c #CACADE", ".S c #D0D0D0", ".D c #CECECE", ".F c #8989B2", ".G c #C9C9D3", ".H c #CCCCCC", ".J c #47478F", ".K c #C7C7D1", ".L c #6F6FA9", ".P c #CACACA", ".I c #B5B5BC", ".U c #C8C8C8", ".Y c #C6C6C6", ".T c #6E6E9E", ".R c #565697", ".E c #7E7EB1", ".W c #C4C4C4", ".Q c #545495", ".! c #9494B6", ".~ c #7C7CAF", ".^ c #C2C2C2", "./ c #A5A5C0", ".( c #C0C0C0", ".) c #D0D0D3", "._ c #63639D", ".` c #9E9EC3", ".' c #BCBCBC", ".] c #BABABA", ".[ c #626292", ".{ c #35357D", ".} c #454590", ".| c #B8B8B8", "X c #484889", "X. c #7070A3", "XX c #C4C4C7", "Xo c #6F6F98", "XO c #B2B2B2", "X+ c #D2D2D8", "X@ c #B0B0B0", "X# c #AEAEAE", "X$ c #646497", "X% c #8F8FAA", "X& c #AAAAAA", "X* c #9F9FBD", "X= c #A8A8A8", "X- c #9D9DBB", "X; c #48488C", "X: c #ADADCE", "X> c #31317C", "X, c #A2A2A2", "X< c #B2B2B5", "X1 c #9A9AAE", "X2 c #2D2D78", "X3 c #A3A3C4", "X4 c #7E7EA3", "X5 c #292974", "X6 c #393987", "X7 c #4C4C93", "X8 c #0A0A70", "X9 c #7272AB", "X0 c #5D5D9D", "Xq c #DDDDDF", "Xw c #5B5B9B", "Xe c #1C1C71", "Xr c #8181B3", "Xt c #7F7FB1", "Xy c #5A5A90", "Xu c #BFBFD2", "Xi c #D5D5D7", "Xp c #000066", "Xa c #404087", "Xs c #73738E", "Xd c #C0C0C9", "Xf c #B9B9CC", "Xg c #4F4F8F", "Xh c #4A4A94", "Xj c #656594", "Xk c #A5A5B5", "Xl c #DADAE9", "Xz c #7878A0", "Xx c #0E0E63", "Xc c #7373A5", "Xv c #9999BD", "Xb c #57579A", "Xn c #000069", "Xm c #9B9BAB", "XM c #29297A", "XN c #F6F6F7", "XB c #F4F4F5", "XV c #000055", "XC c #7878A3", "XZ c #000080", "XA c #7C7C93", "XS c #EEEEEF", "XD c #B4B4C0", "XF c #C1C1DA", "XG c #454588", "XH c #00006C", "XJ c #9898B5", "XK c #BBBBD4", "XL c #6666A5", "XP c #9999AC", "XI c #A6A6C6", "XU c #9191B8", "XY c #6C6C97", "XT c #545490", "XR c #27277B", "XE c #4F4F95", "XW c #8F8FB6", "XQ c #E2E2E3", "X! c #50508C", "X~ c #9090AD", "X^ c #9E9EBE", "X/ c #C4C4D6", "X( c #5A5A99", "X) c #9595BF", "X_ c #585897", "X` c #6E6E9C", "X' c #B1B1B6", "X] c #9191BB", "X[ c #D2D2D3", "X{ c #DDDDEB", "X} c #B8B8CA", "X| c #8B8BB5", "o c #CECECF", "o. c #DCDCE0", "oX c #626290", "oo c #5A5A9C", "oO c #FFFFFF", "o+ c #FDFDFD", "o@ c #6B6BA6", "o# c #FBFBFB", "o$ c #F9F9F9", "o% c #F7F7F7", "o& c #7A7AAE", "o* c #7D7DA7", "o= c #686899", "o- c #F5F5F5", "o; c #515189", "o: c #9191AA", "o> c #61619C", "o, c #F1F1F1", "o< c #8F8FA8", "o1 c #373780", "o2 c #EFEFEF", "o3 c #8D8DA6", "o4 c #787898", "o5 c #202070", "o6 c #EDEDED", "o7 c #33337C", "o8 c #EBEBEB", "o9 c #9696BC", "o0 c #595994", "oq c #E9E9E9", "ow c #E7E7E7", "oe c #6A6A9E", "or c #525297", "ot c #E5E5E5", "oy c #E3E3E3", "ou c #A6A6BB", "oi c #E1E1E1", "op c #242477", "oa c #0F0F69", "os c #5F5F9D", "od c #DFDFDF", "of c #BABABE", "og c #DDDDDD", "oh c #DBDBDB", "oj c #D9D9D9", "ok c #8181B1", "ol c #5F5F89", "oz c #9494BD", "ox c #171774", "oc c #D7D7D7", "ov c #A7A7C9", "ob c #2D2D79", "on c #D5D5D5", "om c #D0D0DA", "oM c #696996", "oN c #848496", "oB c #A4A4BC", "oV c #F1F1F7", "oC c #CFCFCF", "oZ c #626299", "oA c #CACAD4", "oS c #CDCDCD", "oD c #7575A5", "oF c #5D5D9E", "oG c #484890", "oH c #CBCBCB", "oJ c #8E8EA3", "oK c #C9C9C9", "oL c #8181B4", "oP c #C7C7C7", "oI c #8A8A9F", "oU c #E7E7ED", "oY c #C5C5C5", "oT c #C0C0CA", "oR c #7B7BAE", "oE c #C1C1C1", "oW c #7C7CA5", "oQ c #BFBFBF", "o! c #4F4F90", "o~ c #7D7D9C", "o^ c #BDBDBD", "o/ c #B0B0CE", "o( c #4C4C83", "o) c #B7B7B7", "o_ c #D4D4E4", "o` c #D7D7DD", "o' c #B5B5B5", "o] c #555599", "o[ c #B3B3B3", "o{ c #6E6E97", "o} c #16166F", "o| c #BBBBD2", "O c None", /* pixels */ "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 O O O O ", "O O O O O O O O O O O O O O O O O .0O 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 O .zoO.2O 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 X{oOX: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 *oOoO '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 GoOoO.bO 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 AoOoOoOX)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 xoOoO..orO 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#.$ 9.>.jO GO O O O O O O O O O O ", "O O O O O O O O O O O O O oU.:.AO ^oV 8oOo_O O O O O O O O O O ", "O O O O O O O O O O O O o9 cO O .~ 9oOXb.$oOovO O O O O O O O O ", "O O O O O O O O O O O O O O O o/ N.*oOoFo$o+ @o@O O O O O O O O ", "O O O O O O O O O O O O Xv.aXS.1o%o$ 5O .1.fO k -O O O O O O O ", "O O O O O O O O O O O X^oq.eo2o,.1o%Xtoro2 f )o#oO pO O O O O O ", "O O O O O O O O O O .OXQowoq.eo2o,.%o& Z.FO .3.,.=.2.}O O O O O ", "O O O O O O O O O O Hoi.powoq.eX/O XKokO .qo6o,o-O XFO O O O O ", "O O O O O O O O O &.k.hoi.pow BO t.6X].!.p.u.eo|O XNXlO O O O ", "O O O O O O O O O .)oj.koAX-O O ~o6o2X| >odoy `O XI.1.: OO O O ", "O O O O O O O O DXJ.5 LO O X*o.ow.rXuO y.x.vO .yo8o2 XO %O O ", "O O O O O O O O O O o* h.+ogod.sotomO uXd.-O =.s.i.rX3O XBXrO ", "O O O O O O O X$.7oC.Z.Noc.xogodXq 3.#X;O aoTojogoi.VO .&.6ozO ", "O O O O O O O z.P.HoC.Z.Noc.xX+ |O o`O XzoH.S.N.c.KO XWoq /O O ", "O O O O O O o:.WoP.P.HoC.Z.N.wO oD.GXfO .I.YoHoC nO . Y.pXUO O ", "O O O O O XYoQ.^.WoP.P.oou.TO .n !og./O o^oEXkX`O XJocohX}O O O ", "O O O O O X'.'oQofX%X4O O oW #on.cXi wo~XmoMO X`XD.D.ZoBO O O O ", "O O O O .m $XoO O O FX~XXoS.S.ZX[.dO ;O .BXPoEoYoK 0O O O O O ", "O O O O O O o{ Co< W.^oY.U.PoSo XCO O O .4o[o).'X1o=O O O O O O ", "O O O ( eXOo'.|.]o^.(.^oY.U 1 :O O O . image/svg+xml sailcut-1.3.5/icons/sailcut.ico0000644000175000007640000003535611160645556016404 0ustar sharkyjerryweb00Ј%6 Јо%h†6(0` $q ПƒUUХLL­}@@”w..zqDfџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџn(ŠggоŸŸŸџЁЁЁџЂЁЁџœџ“vv№bbй‹[[С…LL›x--efџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџu++h™ŠŠіЂЂЂџЄЄЄџІІІџЈЈЈџЊЊЊџЋЋЋџ­­­џЌЇЇџ›}}ъbbР‡KK”x((Vf џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ{::ЅЃЁЁџІІІџЈЈЈџЊЊЊџЋЋЋџ­­­џЏЏЏџБББџВВВџДДДџЖЖЖџВЊЊџž||у“ccЙ€99wf џџџџџџџџџџџџџџџџџџџџџџџџkџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџf ‡UUЭЈЈЈџЊЊЊџЋЋЋџ­­­џЏЏЏџБББџВВВџДДДџЖЖЖџИИИџКККџЛЛЛџНННџМИИџžvvл‰II™t$џџџџџџџџџџџџџџџџџџs##…‚PPШ|99Žk+џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџu&&=—{{щЋЋЋџ­­­џЏЏЏџБББџВВВџДДДџЖЖЖџИИИџКККџЛЛЛџНННџПППџСССџТТТџФФФџЉ‹‹ч‡CC‘f џџџџџџџџџџџџ`llтЃЃЃџ˜‚‚є‰ZZУ€==Šr&џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ|77€ЇќЏЏЏџБББџВВВџДДДџЖЖЖџИИИџКККџЛЛЛџНННџПППџСССџТТТџФФФџЦЦЦџШШШџЧФФџooаƒ::XџџџџџџџџџџџџHHЂІІІџЉЉЉџЌЌЌџЎ­­џ ††ёˆQQЎt 7џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџAA—ccЦ—ssфЈ˜˜§ЕЕЕџИИИџКККџЛЛЛџНННџПППџСССџТТТџФФФџЦЦЦџШШШџЪЪЪџЫЫЫџЭЭЭџКІІ№‰DD€џџџџџџџџџrAŸїЌЌЌџЏЏЏџВВВџДДДџЗЗЗџЈ’’№ŒQQЉu 0џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџffq9~66z‰NN›’``К™nnйЉѕОЛЛџТТТџФФФџЦЦЦџШШШџЪЪЪџЫЫЫџЭЭЭџЯЯЯџбббџЦККњŒJJ fџџџџџџ~99Š“llлАЎЎџЕЕЕџИИИџКККџНННџРРРџЎ••ьRRЅx$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџpB‚AAоaaОŠRRŸ99sI`џџџi‚<<|•ccМЌ‘‘яЧЦЦџЪЪЪџЫЫЫџЭЭЭџЯЯЯџбббџвввџдддџаЫЫџMM–џџџu''˜{22pc€::ˆ–kkжИДДџОООџРРРџУУУџЦЦЦџЩЩЩџЅе€-->џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ;;—ДЏЏџЙЙЙџКККџГЇЇџЂ‚‚щ–hhЬ‹PP |**a] qŠHH‡žppУКЇЇѕЯЯЯџбббџвввџдддџжжжџиииџШЗЗѕˆ@@c~99yЌЄЄџ’eeб€::ƒa::€šmmбПЙЙџЧЧЧџЩЩЩџЬЬЬџЯЯЯџГ••р„<џќ€€ў0 ?џ џџ€„џРD‡џр&ƒџр€Cџќ@#џѓР 0'џ№8џјџјџќD?џў&џўџџƒџџџ€Сџџџ€Cџџџрџџџќ/џџџЧ/џџџС„?џџџрФџџџр$џџџ№џџџџ№џџџџјџџџџјџџџџќџџџџўџџџџўџџџџџџџџџџџџџџџџџџџџџџџџџЯџџџџџџџџ( @ z;;ЊŽssНkk ‰__ƒƒLLhx--Gf џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџt))“||нЂЂЂџЅЅЅџЈЈЈџЊЈЈџŸŠŠч˜xxЕbb‚}55GfџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDDV ——јЈЈЈџЊЊЊџ­­­џАААџВВВџЕЕЕџЕВВџІп›ssЁ‚<<2џџџџџџџџџџџџџџџt''Ooџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‰ZZ’ЊЉЉџ­­­џАААџВВВџЕЕЕџИИИџКККџНННџРРРџЗЋЋѓ xxЃ†@@1џџџџџџџџџ€HHx–„„юŽjjА„JJncџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџf”ppФЎЋЋџВВВџЕЕЕџИИИџКККџНННџРРРџТТТџХХХџШШШџНААѓ ttœfџџџi˜‚‚чЊЊЊџЎЎЎџЃŽŽц’bbŒz))џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџi|33S‹UU{—nnŸ~~РЈуЛЖЖўТТТџХХХџШШШџЪЪЪџЭЭЭџЯЮЮџЃxxЅfџџџŒYY~Є••ьГГГџЗЗЗџМММџЎššф™hh‰p џџџџџџџџџџџџџџџџџџџџџџџџqYYЫ{{Șoo•ZZq|..B66Cœqq“­иЧФФџЭЭЭџаааџвввџгввџЅxx˜p †LLЄ|11D—jjЌ™™чСССџХХХџЩЩЩџЎЧ‡@@ џџџџџџџџџџџџџџџџџџџџџџџџ‰QQaЖББќМММџПППџОККўЊжЃ~~žTTfˆEEcЅ||ЅХИИєеееџиииџзееџЇxxŠœ}}МЋ››я–ii™y--9œnnРДДѓЮЮЮџвввџМЄЄе—XX1џџџџџџџџџџџџџџџџџџџџџџџџ—llІПППџТТТџФФФџЧЧЧџЪЪЪџЬЫЫџЛІІыžnn‹OOJЕ––ЬкййџнннџРЅЅн”ee~НННџСССџЕЅЅыœnn•ŒHHYؘЮзззџлллџЪИИс‰HH'џџџџџџџџџџџџџџџџџџџџџz,,Њ‘‘йФФФџЧЧЧџЪЪЪџЬЬЬџЯЯЯџвввџдддџИœœг’RRbЅuuгЩЩѓЬЙЙєw$$?МЕЕњЦЦЦџЫЫЫџЯЯЯџПЌЌч”YYpЊ~~ЂрппџфффџИ‘‘џџџџџџџџџџџџџџџџџџџџџџџџŒPPYОЕЕњЪЪЪџЬЬЬџЯЯЯџвввџдддџзззџкккџиввќІuuЃЃppzнззџ„66< xxПЫЫЫџаааџдддџиииџбЧЧѕšbbmЖБщщщџнввђGG2џџџџџџџџџџџџџџџџџџџџџџџџ—dd УИИ§ЯЯЯџвввџдддџзззџкккџнннџпппџпннџЁkk‚М™™ЙŒHHЁRRWnn’ЪРРѕйййџнннџсссџйЯЯіœaagШЌЌЫђђђџН””Ѕџџџџџџџџџџџџџџџџџџџџџџџџu++{''F”[[kЇ}}‘Г’’ИХГГынннџпппџтттџхххџкаає›[[oŠCCЈЩРРљЊ€€œOOTМžžЭтттџцццџъъъџФЃЃСЎ||{ѕєєџГџџџџџџџџџџџџџџџџџџџџџџџџ€77Њ††пؘеАЏЇyy…ƒ88GЅss|НŸŸЪрммўчччџъъъџвППп€33@ФДДїкккџУЋЋи–^^_­€€ЄыыыџяяяџшппњŽ@@cЗˆˆОUџџџџџџџџџџџџџџџџџџџџџџџџџџџ™bbkгааџйййџмммџдЪЪњЛФЉzz—VVcгССтэээџяяяџЕ‹‹•Кœœжпппџуууџлааѕ™ZZUЦІІЩєєєџјјјџЙŠŠ–qџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџА‹‹ЕмммџоооџсссџфффџчччџТЅЅЪ•TTYЫББЮђђђџЛ‘‘–Ж””ГфффџшшшџьььџвЛЛи’LLeїііџщккёŸccPџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџHH.ЬННысссџфффџчччџщщщџьььџжФФчccmдЛЛкБ žjjgрййїэээџёёёџѕѕѕџЅffnкССюЋrryџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЄssуттџчччџщщщџьььџяяяџёёёџжССчЎzzЋvvИВ‰‰­ІoosцппјіііџњњњџХŸŸ•EEˆџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ€ОžžЧщщщџьььџяяяџёёёџєєєџїїїџБ–—RRКяяяџК­Ў}}‹ћћћџџџџџО““™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџš[[5Н™™ЂЯЗЗряююџєєєџїїїџљљљџпЬЬц“LLrєєєџѓ№№ў›__kоШШшЯЎЎУt џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџƒ33%•SSdl ЃggfЮААЬјїїџќќќџџџџџž]]Ёљљљџ§§§џХŸІkkК”JJ&џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџfМ––ШЪ­­аЎ{{|w Џ||†їђђќџџџџšWW›ўўўџџџџџЩЇЇГs џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ__Zэчч§јјјџоЪЪхБ~~yА…їёёў”MMџџџџфддц˜YY9џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџУžžМћћћџўўўџїђђћЏ{{€Т™™в‘GGzяффѓІkkVџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ]]Lђъъњџџџџџџџџєээј—RRЅ‡99CЉoowџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХžžГџџџџџџџџџџџџП••šџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџœZZ>яффїџџџџџџџџжЛЛеџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџУ››ЉџџџџџџџџдИИФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™UU2ыннѓџџџџЮ­­ЋџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџР——ŸџџџџХŸŸ’џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ•OO&чжжюЙŠŠzџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџДo aaZџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ€џџРџџРчџррџќp?ёР(јј‡ќCўP#ўџР" џ  џƒ‡џ€€OџРH_џРџр?џ№џўџџѓџџјƒџџјџџќџџќџџўџџўџџџџџџџџџПџџџџџ(  ‡]]š—ƒƒГ—~~‡’llZ€>>)џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‚LLЁ••п­­­џВВВџЖГГџБЂЂлЋ‘‘rƒ;; џџџ…XXp‡VV4џџџџџџџџџџџџџџџџџџ”ooCІ––ЖЏЅЅюНННџТТТџШШШџСЕЕкЂuu0“ttbЋЅЅјЉ––ЙŸ{{\fџџџџџџџџџm$$›wwАЊ’’ЈЂ}}›ЊŒŒЂЙІІОЯЭЭћЮХХо•kk~~~”БŸŸТЩЩЩџЙЂЂВŒGGџџџџџџџџџ•jj5МЗЗєЧЧЧџЬЫЫџРААи­‡‡‰ЯУУйВŽŽ›РННўНЏЏлЌ‰‰ŸбЩЩтЩВВЊџџџџџџџџџџџџЉˆˆ|ЫЪЪџвввџзззџлккџИ””žВ‰‰ А–– бЯЯ§йзз§Мšš‘сззюК>џџџџџџџџџv;; І{{’Ж––—ЩИИПлееїфтт§ЅqqˆХЖЖсГŽлббурееэУžžЁЛŽŽ+џџџџџџџџџџџџК  ŒлййџаССнПžžŸдУУМлЪЪРЭООрхттќК’’є№№ћБzz@џџџџџџџџџџџџџџџ€@@ вУУечччџьььџгММЧЕ……ЏПžž–яээўоШШЕЛџџџџџџџџџџџџџџџџџџџџџЖIоддхёёёџїїїџЎzzžсеехнШШДлУУšџџџџџџџџџџџџџџџџџџџџџџџџvИŠЦЃЃ|ыррйЯААЙўўўџО’’€Ÿ``џџџџџџџџџџџџџџџџџџџџџџџџџџџбЗЗƒѓээјЧЁЁ“М‘‘ЇщннШŸ``џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџž__№хххћјјўЇnnhД€€"џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџвДДzџџџџиННtџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ”MM ыоооЬЊЊWџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЪІІgЏzz6џџџџџџџџџџџџџџџџџџџƒџРЯРCр№№№јќ§ќўџџџџsailcut-1.3.5/icons/point.xpm0000644000175000007640000000345211077643071016110 0ustar sharkyjerryweb/* XPM */ static const char *point_xpm[] = { /* width height ncolors chars_per_pixel */ "32 32 37 1", /* colors */ " c #000000", ". c #00BAF7", "X c #001217", "o c #001017", "O c #000D10", "+ c #001F2A", "@ c #0085B1", "# c #00B9F6", "$ c #001116", "% c #002C3A", "& c #000C0F", "* c #002936", "= c #00090B", "- c #001F28", "; c #001D28", ": c #0085B2", "> c #00080A", ", c #002A38", "< c #001117", "1 c #00B2ED", "2 c #0087B5", "3 c #000A0D", "4 c #007297", "5 c #00749A", "6 c #00202A", "7 c #001016", "8 c #00090C", "9 c #00ACE5", "0 c #00141C", "q c #FFFFFF", "w c #000608", "e c #00C0FF", "r c #000F15", "t c #00506A", "y c #00749B", "u c #00070A", "i c None", /* pixels */ "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii", "iiiiiii iiiiiiiiiiiiiii iiiiiiii", "iiiiiiii iiiiiiiiiiiii iiiiiiiii", "iiiiiiiii iiiiiiiiiii iiiiiiiiii", "iiiiiiiiii iiiiiiiii iiiiiiiiiii", "iiiiiiiiiii iii-,#:$ iiiiiiiiiiiii", "iiiiiiiiiiiii*#ee@7iiiiiiiiiiiii", "iiiiiiiiiiii%.eeee29eeeeeet8iiiiiiiiiii", "iiiiiiiiiiii61eeeeyXiiiiiiiiiiii", "iiiiiiiiiiiii;1ee4riiiiiiiiiiiii", "iiiiiiiiiiii i+15o iiiiiiiiiiiii", "iiiiiiiiiii iii0$ii iiiiiiiiiiii", "iiiiiiiiii iiiiiiiii iiiiiiiiiii", "iiiiiiiii iiiiiiiiiii iiiiiiiiii", "iiiiiiii iiiiiiiiiiiii iiiiiiiii", "iiiiiii iiiiiiiiiiiiiii iiiiiiii", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii" }; sailcut-1.3.5/icons/sailcut.svg0000644000175000007640000001104110510643102016371 0ustar sharkyjerryweb sailcut-1.3.5/icons/panelgroup.xpm0000644000175000007640000000505411077643071017133 0ustar sharkyjerryweb/* XPM */ static const char *panelgroup_xpm[] = { /* width height ncolors chars_per_pixel */ "32 32 88 1", /* colors */ " c #000000", ". c #006687", "X c #00002B", "o c #003445", "O c #000017", "+ c #000042", "@ c #00006D", "# c #0000EE", "$ c #009CCF", "% c #002F3E", "& c #00161D", "* c #003141", "= c #000034", "- c #00005F", "; c #003A4E", ": c #003344", "> c #0003D6", ", c #001A23", "< c #00000C", "1 c #0000CC", "2 c #006789", "3 c #0000F7", "4 c #0082AD", "5 c #00698C", "6 c #00255E", "7 c #00AFE8", "8 c #005B78", "9 c #008FBD", "0 c #00006B", "q c #006688", "w c #009ACD", "e c #002D3C", "r c #001992", "t c #000046", "y c #0000DB", "u c #00AEE7", "i c #000032", "p c #002835", "a c #00005D", "s c #000088", "d c #00759B", "f c #00212B", "g c #003142", "h c #00009F", "j c #000035", "k c #00779E", "l c #00004C", "z c #000C10", "x c #00007A", "c c #005976", "v c #00003B", "b c #0000FB", "n c #00A6DC", "m c #000E13", "M c #0000E7", "N c #00007D", "B c #0000FE", "V c #005A9A", "C c #002937", "Z c #00002A", "A c #000055", "S c #001897", "D c #00002D", "F c #000A86", "G c #0000F0", "H c #00384A", "J c #00001C", "K c #FFFFFF", "L c #00C0FF", "P c #00004A", "I c #0090C0", "U c #0000F6", "Y c #003C50", "T c #00008C", "R c #00232F", "E c #000039", "W c #00A4DA", "Q c #00008F", "! c #000185", "~ c #003749", "^ c #0000E5", "/ c #000011", "( c #0084AF", ") c #00BFFE", "_ c #0000FC", "` c #000053", "' c #0000FF", "] c None", /* pixels */ "]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]", "]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]", "]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]", "]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]", "]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]", "]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]", "]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]", "]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]", "]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]", "]DPPPPPPPPPPPPPPPPPPP]]]]]]]]]]]", "]]h''''''''''''''''''1+]]]]]]]]]", "]]]T''''''''''''''''''yt]]]]]]]]", "]]]]xB'''''''''''''''''Ml]]]]]]]", "]]]]]0b'''''''''''''''''GA]]]]]]", "]]]]]]aU'''''''''''''''''3-]]]]]", "]]]]]]]`#'''''''''''''''''_@]]]]", "]]]]]]]]P^''''''''''''''''''N]]]", "]&8qqqqq.6>''''''''''''''''''Q]]", "]];uLLLLLLVrSSSSSSSSSSF!ssssss=]", "]]]~WLLLLLLLLLLLLLLLLLL5]]]]]]]]", "]]]]:wLLLLLLLLLLLLLLLLLLk]]]]]]]", "]]]]]]9LLLLLLLLLLLLLLLLLL(]]]]]]", "]]]]]]]4LLLLLLLLLLLLLLLLLLI]]]]]", "]]]]]]]]dLLLLLLLLLLLLLLLLLL$o]]]", "]]]]]]]]]2LLLLLLLLLLLLLLLLLLn~]]", "]]]]]]]]]]c)LLLLLLLLLLLLLLLLL7Y]", "]]]]]]]]]]]oHHHHHHHHHHHHHHHHHH:]", "]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]", "]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]", "]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]", "]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]", "]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]" };