pax_global_header00006660000000000000000000000064133457064150014522gustar00rootroot0000000000000052 comment=3891b1a016cacb41bb32413b20034e0333bb497f aravis-ARAVIS_0_6_0/000077500000000000000000000000001334570641500142215ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/.gitignore000066400000000000000000000010401334570641500162040ustar00rootroot00000000000000cov-int/ .deps .libs *.o *.swp *.lo *.la *.gir *.typelib *.stamp *.bak *.gcno *.gcda *~ Makefile Makefile.in Makecache aclocal.m4 aravis*.pc config.guess config.log config.status config.sub configure depcomp install-sh intltool* libtool ltmain.sh missing mkinstalldirs stamp* autom4te* manugen* tmp-introspect* make*.out genicam.xml test.png test-report.* perf-report.* gtk-doc.make gtk-doc.m4 massif.out.* messages.mo aravis-*.tar.bz2 aravis-*.tar.gz aravis-*.tar.xz test-driver INSTALL compile aravis-*/ core.* tags .buildconfig .exrc build/ aravis-ARAVIS_0_6_0/.travis.yml000066400000000000000000000044471334570641500163430ustar00rootroot00000000000000os: - linux env: global: # The next declaration is the encrypted COVERITY_SCAN_TOKEN, created # via the "travis encrypt" command using the project repo's public key - secure: "g4G6rJ7YbfzdndkAiV6esu9cjvKqLJ8GrKRoMMMb9cSMvCeI59dogkzv2xMeVfbWDffZytCnn5YmOmHFtsCj6So+lLF76mrcn4lMUQ3dHDOT4ghxSvtq5XmlOuYg9DBC1eZnM0lMzv6U7SnyLtA517f+zkSr7G5OLmRORTGkDVzymI8G0Ab5vJtlH3NOvTQNLRYfRs0P5ajK/e+L1osj535Ap1m11nH70nhrzKADHLtsBlFwULdRtZVRcoD4p8inDlZeQ2KvlA9UZG6koNpfKq9VVqxbpMvZhX6kixmLHrg36ZpEV1f3lJ1fI6eQBTv7+IZW7miurE400vpvXAA2F0BIY5D05j5lbppI50n8CMpZpXibMEruWdX5KFevBpKbggJaNZXDZrweEnJr9Y6ZgQMP6XDU/cSKzKpmguAW0TJp7bdl5xsfpf7LS5A8fgUYqAls7lX91MUtXeOb3ZCQP9FQi5xTnOo0M1vGP5FFf+EIVdhsuZyDesG981Na13cwMvzz++QTwL/YauATxYTmnqa6q9pQyp2TMgwKc/fJyf24vTefjXo8XkDSlaACqYru07/HjkhYKS3xp1dLmF60UOavnefofrb7pnpZxyxnW15OrF68Ib+GB0b+lt17HHUGEwc4BNSOiJXV6K5AYrmXrOd2NBw2ZOjmJN3iZZfhskY=" addons: apt: packages: - libxml2-dev - libglib2.0-dev - intltool - gtk-doc-tools - libusb-1.0-0-dev coverity_scan: project: name: "AravisProject/aravis" description: "Build submitted via Travis CI" notification_email: emmanuel@gnome.org build_command_prepend: "./autogen.sh ; ./configure --enable-usb --disable-packet-socket --enable-cpp-test --disable-viewer --disable-gst-plugin ; make clean" build_command: "make -j 4" branch_pattern: coverity_scan language: C compiler: - clang - gcc before_install: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install libxml2 glib gettext intltool gtk-doc libusb ; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew link --force gettext ; fi - if [[ "$TRAVIS_OS_NAME" != "osx" ]]; then echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca- ; fi before_script: ./autogen.sh script: - if [ "${COVERITY_SCAN_BRANCH}" != 1 ]; then ./configure --disable-usb --disable-viewer --disable-packet-socket --disable-gst-plugin --disable-cpp-test && make clean && make && make test ; fi - if [ "${COVERITY_SCAN_BRANCH}" != 1 ]; then ./configure --enable-usb --disable-packet-socket --enable-cpp-test --disable-viewer --disable-gst-plugin && make clean && make && make test ; fi aravis-ARAVIS_0_6_0/AUTHORS000066400000000000000000000000451334570641500152700ustar00rootroot00000000000000Emmanuel Pacaud aravis-ARAVIS_0_6_0/COPYING000066400000000000000000000613361334570641500152650ustar00rootroot00000000000000 GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 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. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! aravis-ARAVIS_0_6_0/ChangeLog000066400000000000000000000000001334570641500157610ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/Makefile.am000066400000000000000000000017121334570641500162560ustar00rootroot00000000000000EXTRA_DIST = include $(top_srcdir)/Makefile.decl ACLOCAL_AMFLAGS = -I m4 DISTCHECK_CONFIGURE_FLAGS = --enable-introspection --enable-gtk-doc --enable-gst-plugin --enable-gst-0.10-plugin --enable-viewer --enable-cpp-test --enable-appstream-util SUBDIRS = src man if ARAVIS_BUILD_VIEWER SUBDIRS += viewer endif if ARAVIS_BUILD_GST_PLUGIN SUBDIRS += gst endif if ARAVIS_BUILD_GST_0_10_PLUGIN SUBDIRS += gst-0.10 endif SUBDIRS += tests po docs aravisdocdir = ${docdir}/aravis-@ARAVIS_API_VERSION@ aravisdoc_DATA = \ README.md \ COPYING \ ChangeLog \ AUTHORS \ NEWS EXTRA_DIST += m4/introspection.m4 README.md # Copy all the spec files. Of cource, only one is actually used. dist-hook: for specfile in *.spec; do \ if test -f $$specfile; then \ cp -p $$specfile $(distdir); \ fi \ done pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = aravis-@ARAVIS_API_VERSION@.pc CLEANFILES = $(pkgconfig_DATA) %-@ARAVIS_API_VERSION@.pc: %.pc cp $< $@ aravis-ARAVIS_0_6_0/Makefile.decl000066400000000000000000000041151334570641500165700ustar00rootroot00000000000000# GLIB - Library of useful C routines GTESTER = gtester GTESTER_REPORT = gtester-report # initialize variables for unconditional += appending TEST_PROGS = ### testing rules # test: run all tests in cwd and subdirs test: ${TEST_PROGS} @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} @ for subdir in $(SUBDIRS) . ; do \ test "$$subdir" = "." -o "$$subdir" = "po" || \ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ done # test-report: run tests in subdirs and generate report # perf-report: run tests in subdirs with -m perf and generate report # full-report: like test-report: with -m perf and -m slow test-report perf-report full-report: ${TEST_PROGS} @test -z "${TEST_PROGS}" || { \ case $@ in \ test-report) test_options="-k";; \ perf-report) test_options="-k -m=perf";; \ full-report) test_options="-k -m=perf -m=slow";; \ esac ; \ if test -z "$$GTESTER_LOGDIR" ; then \ ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ elif test -n "${TEST_PROGS}" ; then \ ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ fi ; \ } @ ignore_logdir=true ; \ if test -z "$$GTESTER_LOGDIR" ; then \ GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ ignore_logdir=false ; \ fi ; \ for subdir in $(SUBDIRS) . ; do \ test "$$subdir" = "." -o "$$subdir" = "po" || \ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ done ; \ $$ignore_logdir || { \ echo '' > $@.xml ; \ echo '' >> $@.xml ; \ for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ done ; \ echo >> $@.xml ; \ echo '' >> $@.xml ; \ rm -rf "$$GTESTER_LOGDIR"/ ; \ ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ } .PHONY: test test-report perf-report full-report # run make test as part of make check check-local: test aravis-ARAVIS_0_6_0/NEWS000066400000000000000000000363271334570641500147330ustar00rootroot00000000000000Release 0.6.0 ============= Stable release. * camera: avoid clashes in device id generation * genicam: signedness and endianness related fix Release 0.5.13 ============== * usb3vision: chunk data support (Emmanuel) * camera: matrix vision device support (Nils) * camera: PointGrey / FLIR renaming support (Nils) * i18n: czech and slovak translations (Multiflexi) * build: remove libcap-ng dependency (Nils) Release 0.5.12 ============== * gigevision: disable GVSP extended id mode * genicam: fix for signedness of register nodes * genicam: add support for optional ROUND parameter (Aleksandr) * add man page (Chiara) Release 0.5.11 ============== * camera: ensure binning feature is present before using it (thecaptury) * viewer: don't overwrite buffers still used by gstreamer (Tim) * usb3vision: improve streaming reliability (Tim, Emmanuel) * buid instruction update (Raphie, Rehno) * translation updates (Rafael) Release 0.5.10 ============== * camera: fix for PointGrey cmeras using AcquisitionFrameRateEnabled (Emmanuel) * genicam: correctly implement integer mode of IntSwissKnife (Emmanuel) * genicam: implementtion of pIndex, ValueIndexed, ValueDefault (Emmanuel) * genicam: add Expression and Constant support to Converter and IntConverter (Emmanuel) * evaluator: implement ROUND function (Emmanuel) * evaluator: fix '~' precedence and associativity (Emmanuel) * gigevision: protocol fixes (Emmanuel) * gigevision: improve connection stability under high pressure (Michael) * gigevision: avoid using the same port twice (Emmanuel) * gvdevice: implement packet-resend-ration limit (Emmanuel) * usb3vision: transfer size configuration fixes (Konstantin) * build: improve OSX and Windows support (Emmanuel) * build: improve build outside of source directory (Janito) * viewer: improve Pixel format to GstCaps conversion (Emmanuel) * viewer: disable gtkglsink for now to avoid a crash when switching views (Emmanuel) * QA: extended code coverage (Emmanuel) * QA: make travis build on OSX (Emmanuel) Release 0.5.9 ============= * gige/usb3vision: device detection fixes (Nils) * stream: allow to handle circular buffer from callback (Nils) * build: OSX documentation fix (Mark) * viewer: latency improvements (Emmanuel) * viewer: show protocol in camera list view (Emmanuel) * gigevision: faster connection to devices (Emmanuel) * gigevision: PENDING ACK support (Emmanuel) * gige/usb3vision: use vendor aliases for default device id (Emmanuel) Release 0.5.8 ============= * buffer: save local system time in buffer metadate (Konstantin) * usb3vision: better handling of unexpected answers (Emmanuel) * stream: fix for self joining receiving thread issue (Michael) * fake: new class for instantiation of fake cameras (Emmanuel) * tests: new fakegv test that exercizes GigEVision protocol (Emmanuel * build system update (code-coverage, address sanitizer and valgrind support) (Emmanuel) * miscellaneous fixes for bug discovered vie the update build system (Emmanuel) Release 0.5.7 ============= * usb3vision: Ximea camera support (Steve) * usb3vision: TheImagingSource camera support (emmanuel) * usb3vision: Bandwith control (Steve) * usb3vision: USB endpoint detection improvments (Steve, Emmanuel) * fake_camera: miscellaneous fixes (Michael) * genicam: raw data support (Steve) * camera: multiframe acquisition mode (Lee) * camera: extension of the trigger API (Steve) * gigevision: instantiation by IP address or hostname (Blaz, Arkadius) * build: fix compilation with old glib (Blaz) * build: intructions and compilation fix for OSX (Christoffer, Fernando) * build: Travis and Coverity support on github (Emmanuel) Release 0.5.6 ============= * genicam: implement Expression and Constant nodes for [Int]SwissKnife * API: add ARAVIS_CHECK_VERSION macro * API: forbid direct inclusion of headers other than arv.h * usb3vision: PENDING_ACK support Release 0.5.5 ============= * build: fix library detection needed for packet socket support (Hubert) * gigevision: new API for automatic stream packet size (Emmanuel) Release 0.5.4 ============= * gigevision: support of packet socket in stream thread (Emmanuel) Release 0.5.3 ============= * usb3vision: fix USB3 device scan (Emmanuel) Release 0.5.2 ============= * viewer: only show compatbile pixel format in selector * viewer: fix binning setting on some cameras * viewer: add a fallback to autovideosink if gtk[gl]sink are not available * viewer: fix video position issue * usb3vision: avoid unnecessary memory during video data transfer * usb3vision: better handling of device disconnection * gigevision: compile time selection of fast heartbeat mode (Michele) * camera: helper function for single image acquisition Release 0.5.1 ============= * viewer: new design with support for region settings * usb3vision improvements * camera: improve Basler support for exposure and frame rate * camera: add support for x/y_offset and binning bounds * interface: add vendor, model and serial getters * genicam: implement min/max support for Converter elements Release 0.5.0 ============= * usb3vision initial support Release 0.4.0 ============= * buffer: add a timestamp setter * interface: don't touch device list on open device * viewer: fix appdata file Release 0.3.8 ============= * genicam: add bigendian support (Emmanuel) * camera: RICOH camera support (Anil) * build fixes (Emmanuel) * dox fixes (Jarek, Emmanuel) * translation updates (Jordi, Jiri, Anders, Μύρων, Pedro, Cédric, Samir, Necdet) Release 0.3.7 ============= * genicam: fix accuracy of division of integers (Emmanuel) * new arv_make_high_priority and arv_make_realtime API (Emmanuel) * viewer: make stream thread realtime if possible (Emmanuel) * camera: add GigEVision specific API for packet delay, packet size and stream selection (Emmanuel) * gst_pugins: add a number of buffers property (Patrick) * build fixes (Patrick) * translation updates (Tiago, Muhammet) Release 0.3.6 ============= * build: add missing test commands in configure.ac (Adrian) * camera: new abort_acquisition function (Davide) * gv_stream: missing frame detection fix (Davide) * buffer: user_data and frame_id accessors * chunk_parser: bug fixes * viewer: prevent use of broken coglsink from autovideosink * translations: updates (Matej, Balázs, Andika, Daniel, Rafael) Release 0.3.5 ============= * chunk_parser: new API for chunk data support * buffer: make internal data private and add accessors Release 0.3.4 ============= * viewer: add an appdata file * misc: compilation warning fixes Release 0.3.3 ============= * genicam: improve loading of genicam data from local files (Peter) * build: dependency check improvements * build: miscellaneous compilation fixes (Patrick) * gst_pugins_1.0: bayer format fix (Steve) Release 0.3.2 ============= * gst_plugin: new plugin based on gstreamer 1.0, in addition to the existing 0.10 version. * gst_plugin: add packet-resend property. * viewer: port to gstreamer 1.0, and drop support for gtk+ 2.0. * viewer: fix video output for camera with buggy time stamping. * camera: fix frame rate setting for Point Grey devices. Release 0.3.1 ============= * gv_interface: fix device discovery by using 255.255.255.255 as broadcast address (Csaba). * gv_interface: don't crash if there is no INET interface (Toby). * camera: make ArvCamera introspection friendly (John). * evaluator: fix comparison when one of the operand is a double. * python: don't crash on access to buffer data. * build: zlib check. * build: make configure pass even if gobject introspection is not available. * updated translations (Yuri). Release 0.3.0 ============= * updated translations (Marek, Matej, Martin, Daniel, Joe, Kenneth, Rūdolfs, Andika, Balázs, Piotr, Christian, Мирослав) * make framerate work for The Imaging Source cameras (Edgar) * fix exposure setting on Point Grey Blackfly cameras * added frame rate support for The Imaging Source(TIS) cameras (Edgar) * gv_interface: strip control character from device id (Csaba) * gst_plugin: make the plugin more useful for a use inside an application (Edgar) * gst_plugin: honor do-timestamp property (Csaba) * arv-tool: fix IntReg display and don't display min/max if they are no specified * gv_device: don't send packet resend requests when this feature is not available * gv_device: implement register workaround for schema < 1.1.0 * python: crash fixes (Olivier) * viewer: fix an issue when aravis buffer row stride is not a multiple of 4 * viewer: improve framerate entry * viewer: translation update * compilation warning suppression * suppress glib deprecation warnings * add a define for BAYER_GR_12_PACKED pixel format Release 0.2.0 ============= Stable release. * camera: add support for BAYER_GB_8 images used by ImageingSource DFK 23G445 cameras (Matthias) * camera: fix consistency of order of pixel format display names (Jure) * GV: fix parsing of hexadecimal address/length with 0x prefix in Genicam file URL * build: fix parallel compilation (make -j) Release 0.1.15 ============== * library: don't distribute arvconfig.h (Nial bug report) * viewer: desktop file and application icon * viewer: rotate and flip button * viewer: file save notification * viewer: use autovideosink instead of xvimagesink, for systems without XV extension * camera: pixel format API improvments (Jure) * system: disable the fake camera by default (Kai bug report) * genicam: fix "remaining operands" issue in evaluator (Tom bug report) * genicam: fix unzipping of genicam data on not supporting unaligned memory access (Nial) * GV stream: use machine time for buffer timestamp if GevTimestampTickFrequency register does not exist * gstreamer plugin: add auto gain, auto exposure, x and y offset properties (Philipp) Release 0.1.14 ============== API breaks: arv_stream_timed_pop_buffer is now arv_stream_timeout_pop_buffer arv_camera_(get/set)_gain use a double value for gain arv_camera_get_gain_bounds also use doubles Changes: * genicam: preliminary error handling * viewer: internationalization support * viewer: widget are now insensitive if feature is not available * viewer: fix gtk requirement * viewer: add optional support for gtk3 * viewer: fix flicker on window resize * camera: use Gain feature instead of GainRaw when available * genicam: fix formula evaluation when they contain entities * Release 0.1.13 ============== This release hopefufly adds support for cameras depending on IntSwissKnife for the computation of register addresses, like JAI cameras. It also allows to manually tweak the PacketSize parameter. * genicam: add support for SwissKnife in register address. * GV device: don't force the packet size. * GV device: export interface and device IP addresses (Luca). * tests: more unit tests. * build: don't require a C++ compiler by default. Release 0.1.12 ============== API warning: arv_stream_pop_buffer is now blocking. Use arv_stream_try_pop_buffer for non blocking behaviour. * genicam: support for StructReg StructEntry * stream: new pop_buffer / try_pop_buffer functions, consistent with glib async_queue API. * camera: new get/set_trigger_source functions. * tool: support for wildcard in camera name. * tool: ability to perform the same command on several cameras. * interface: new get_device_physical_id function. * genicam: rewrite on top of a DOM API. Release 0.1.11 ============== * viewer: add a snapshot button. * documentation: more information on GigE Vision protocol. * all: memory leak fixes. Release 0.1.10 ============== This release should fix the lost of connection, at least better than the last release. It also allows to instantiate a GigE Vision device using its MAC address. * device: new "control-lost" signal. * GV device: allow use of MAC address for device instantiation. * GV device: retry gvcp command if wrong packet is received. * GV device: try harder to get control register value in heartbeat thread. * GVCP: don't use 0 for packet counter value. Release 0.1.9 ============= This release fixes the lost of the connection to the device after about 65600 seconds. * GV device: don't compare guint32 and guint16. Release 0.1.8 ============= In this release, arv-show-devices is renamed to arv-tool, and gain the capability to read/write and list device features. * Build: fix headers for C++ compatibility (Andre Gaschler) * Genicam: partly implement isAvailable and isImplemented. Release 0.1.7 ============= More work on GV stream reception thread. * GV Stream: handle error GVSP packets. * GV Stream: always set packet size. * GV Stream: check for control access before creating stream object. * GV Stream: check the number of available stream channels. * GVCP: more sanity checks on ack packets. * GV Device: reliably check for control access. * Fake GV Camera: make it work with viewer. * Debug: allow different debug levels for each debug category. Release 0.1.6 ============= Work on GV stream reception reliability, with improved packet resend mechanism. * Camera: software trigger support * GV Stream: rewrite of the receiving thread * Introspection: annotation fixes * Build: make stable release parallel installable Release 0.1.5 ============= Release mostly focused on color support improvements. * GstAravis: switch to negociated width, height, framerate and pixel format * Evaluator: fix support of variable name containing digits * Buffer: add a per buffer user data * Stream: add a timed buffer pop function * Stream: switch to gobject properties for packet resend and socket buffer size * Camera: more bounds functions Release 0.1.4 ============= * Viewer: support for some color pixel formats * Viewer: support for auto gain and auto exposure * Utils: Genicam xml data dump capability added to arv-show-devices * Camera API: Fix exposure setting for Ace Basler cameras * Genicam: Fix caching of registers on read Release 0.1.3 ============= * Simple viewer based on ArvCamera API (requires gtk and gstreamer) * Add a "new-buffer" signal to ArvStream * Fix stream IP address setting for JAI Pulnix cameras (Tom Cobb) * Fix use or Aravis from a C++ application (Tom Cobb) * Fix division of integers in ArvEvaluator when asked for float result (Tom Cobb) * Add an API for retrieving the genicam data (Tom Cobb) * Fix minimum offset of ROI (Tom Cobb) * Fake camera can now simulate gain and exposure setting Release 0.1.2 ============= * Add exposure and gain settings to the gstreamer source element * fix exposure setting in ArvCamera for Basler cameras * gather running statistics for the GV devices * fix GV stream fixed buffer size * add a new arv-show-devices utility * make API more consistent with the Genicam standard Release 0.1.1 ============= * Basic ethernet camera simulator * Allow detection of ethernet cameras on lo, for the GV camera simulator * Fix in gvcp support code * More unit tests * Add support for GENICAM element * Memory leak fixes * Record statistics on buffer reception times * Improve compilation on 64 bit platforms Release 0.1.0 ============= Initial release. aravis-ARAVIS_0_6_0/README.md000066400000000000000000000152011334570641500154770ustar00rootroot00000000000000[![Build Status](https://travis-ci.org/AravisProject/aravis.svg?branch=master)](https://travis-ci.org/AravisProject/aravis) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/fa7d9c88e5594d709ab44e8bad01a569)](https://www.codacy.com/app/EmmanuelP/aravis?utm_source=github.com&utm_medium=referral&utm_content=AravisProject/aravis&utm_campaign=Badge_Grade) [![Coverity Scan Build Status](https://scan.coverity.com/projects/aravisproject-aravis/badge.svg)](https://scan.coverity.com/projects/aravisproject-aravis) # ![](viewer/icons/gnome/256x256/apps/aravis.png) Aravis ### What is Aravis ? Aravis is a glib/gobject based library for video acquisition using Genicam cameras. It currently implements the gigabit ethernet and USB3 protocols used by industrial cameras. It also provides a basic ethernet camera simulator and a simple video viewer. # ![](viewer/data/aravis.png) # ![](viewer/data/aravis-video.png) Aravis is released under the LGPL v2+. ### Installing Aravis Aravis uses the standard GNU build system, using autoconf for package configuration and resolving portability issues, automake for building makefiles that comply with the GNU Coding Standards, and libtool for building shared libraries on multiple platforms. The recommended way to get the sources is to download the release tarballs from http://ftp.gnome.org/pub/GNOME/sources/aravis. ``` ./configure make make install ``` Compilation options may be passed to the configure script. Please run `./configure --help` for information about the available options. On some platforms (like Ubuntu), you may have to configure the dynamic linker (ld) to let it know where the aravis libraries are installed, and run ldconfig as root in order to update ld cache. If you want to use a clone of the git repository on github, instead of the release tarballs, you may have to create the configure script by running: ``` ./autogen.sh ``` #### Building on Mac OS X Using the GNU build system on Mac OS X is not directly supported, but can be mimicked by augmenting the install procedure above with some environment settings: ``` brew install gettext intltool gtk-doc automake libxml2 brew link --force gettext brew link --force libxml2 aclocal autoconf autoheader gtkdocize intltoolize glibtoolize --copy automake --add-missing ./configure make make install ``` ### Ethernet Device Performance #### Stream Packet Size One way to increase streaming performance is to increase the stream packet size. arv_camera_gv_set_packet_size() and arv_camera_gv_auto_packet_size() allow you to change this parameter. By default, the network adapter of your machine will probably not let you receive packet bigger than 1500 bytes, which is the default Maximum Transfer Unit (MTU). It means if you want to use big packets, you also have to increase the network adapter MTU to a greater walue (8192 bytes being a recommended value). The exact procedure to change the MTU depends on the distribution you are using. Please refer to the administrator manual of your distribution. On Fedora, MTU can be changed using the network setting panel. Edit the wired network settings. MTU parameter is in the Identity page. Please note if your device is not connected directly to the machine, you may also have to tweak the active devices on your network. #### Packet Socket Support Aravis can use packet sockets for the video receiving thread. But this mode requires extended capabilities. If you want to allow your application to use packet socket, you must set the `cap_net_raw` capability using `setcap`. For example, the following command gives this capability to the Aravis viewer (You should do this on the installed arv-viewer executable, has the one in the source tree is just a wrapper shell script): ``` sudo setcap cap_net_raw+ep arv-viewer ``` ### USB Permissions By default, USB devices permissions may not be sufficient to allow any user to access the USB3 cameras. This permissions can be changed by using an udev rule file. There is a file example in Aravis sources, aravis.rules. This file must be placed in /etc/udev/rules.d directory (The exact location may depend on the distribution you are using). This file only contains declarations for a couple of vendors. If you want to add an entry with the vendor of your camera, the output of `lsusb` command will give you the vendor id, which is the first 4 digits of the ID field. ### Dependencies The Aravis library depends on libxml2 and glib2, with an optional USB support depending on libusb1, and an optional packet socket support depending on libaudit. The GStreamer plugin depends on GStreamer1 in addition to the Aravis library dependencies. The simple viewer depends on GStreamer1, Gtk+3, libnotify and the Aravis library dependencies. The required versions are specified in the [configure.ac](https://github.com/AravisProject/aravis/blob/master/configure.ac#L67) file in Aravis sources. It is perfectly possible to only build the library, reducing the dependencies to the bare minimum. ### Contributions As an open source and free software project, we welcome any contributions to the aravis project: code, bug reports, testing... However, contributions to both Gigabit Ethernet and USB3 protocol code (files `src/arvuv*.[ch]` `src/arvgv*.[ch]`) must not be based on the corresponding specification documents published by the [AIA](http://http://www.visiononline.org/), as this organisation forbids the use of their documents for the development of an open source implementation of the specifications. So, if you want to contribute to this part of Aravis, don't use the AIA documents and state clearly in the pull request your work is not based on them. #### Unit tests Aravis has a set of unit tests that helps to catch regressions and memory leaks during the development. The test suite is run using the following commands: ``` cd tests make check make check-valgrind-memcheck ``` `make check-valgrind-hellgrind`, `make check-valgrind-sgcheck` and `make check-valgrind-drd` are known to not pass. Any help to understand what fails and why would be nice. All the code is not covered yet by the tests. Code coverage can be obtained using: ``` cd tests make check-code-coverage ``` The report is published in `tests/aravis-{VERSION}-coverage/index.html`. Code coverage improvment is welcomed as well. ### Downloads * 0.6.x stable releases: http://ftp.gnome.org/pub/GNOME/sources/aravis/0.6/ ### Links * Github repository: https://github.com/AravisProject/aravis * Mailing list: aravis@freelists.org ( http://www.freelists.org/list/aravis ) * Aravis 0.6 documentation: https://aravisproject.github.io/docs/aravis-0.6/ * Blog: http://blogs.gnome.org/emmanuel/category/aravis/ * Genicam standard : http://www.genicam.org aravis-ARAVIS_0_6_0/RELEASING000066400000000000000000000062361334570641500154640ustar00rootroot00000000000000Here are the steps to follow to create a new aravis release: * Ensure that there are no local, uncommitted/unpushed modifications. You're probably in a good state if both "git diff HEAD" and "git log master..origin/master" give no output. * Fill out an entry in the NEWS file Sift through the logs since the last release. This is most easily done with a command such as: git log --stat X.Y.Z.. where X.Y.Z is the previous release version. Summarize major changes briefly in a style similar to other entries in NEWS. Take special care to note any additions in the API. These should be easy to find by noting modifications to .h files in the log command above. * Verify that the code passes "make distcheck" First, make sure you have 'nm' and 'readelf' commands in PATH. this should be OK with any Linux distro. Running "make distcheck" should result in no warnings or errors and end with a message of the form: ============================================= aravis-X.Y.Z archives ready for distribution: aravis-X.Y.Z.tar.gz ============================================= (But the tar file isn't actually ready yet, as we still have some more steps to follow). * Tag the release; This will allow you to make a branch later if you so desire but for now, at least it make it easy to see what was included in a particular release. The commit message for the tag will be included in a changes file in the release directory. $ git tag -a ARAVIS_X_Y_Z (from whatever branch you're releasing) $ git push origin ARAVIS_X_Y_Z If that fails because someone has pushed since you last updated, then you'll need to repeat the entire process. Well, update, add a new NEWS entry, and make distcheck again. * Upload the tarball to ftp.gnome.org, by scp-ing it to master.gnome.org. All module maintainers who wish to be able to upload tarballs should request a shell account at master.gnome.org for this purpose -- see AccountPolicy. Ask someone else to do it for you if you are waiting for an account. For example: $ scp aravis-0.1.3.tar.gz (user)@master.gnome.org: Then ssh into master.gnome.org and call ftp-admin. There are no extra steps required for new modules. For example: $ ftpadmin install aravis-0.1.3.tar.gz This will move the tarball to the appropriate directory, do some additional administrative stuff, and send an email to the ftp-release mailing list so that the release-team will know about it. * Increment the version number in configure.ac, and push the change. * Send a message to aravis@freelists.org to announce the new release adding the excerpt from NEWS, your signature, followed by the standard "What is aravis" and "Where to get more information about aravis" blurbs from README, and finally the shortlog of all changes since last release, generated by: git shortlog ARAVIS_X_Y_Z... where ARAVIS_X_Y_Z is the last released version. * Edit the aravis wiki to add the announcement to the NEWS page and the front page. (just the parts before your signature). (This release procedure is an adaptation of the RELEASING file found in cairo, and of what can be found here: http://live.gnome.org/MaintainersCorner/Releasing). aravis-ARAVIS_0_6_0/TODO000066400000000000000000000013411334570641500147100ustar00rootroot00000000000000Viewer: - add a feature tree and editor - add a device list refresh button (or event better, asynchronously check for new/removed device) GigE Vision: - improve support of device creation by IP address. As we have to find the interface with which we reach the device, we need to extend the discovery code in order to send the discover packet to a given IP address, instead of a broadcast one. - test and integration of PENDING_ACK packets - MTU check using GevSCPSFireTestPacket feature Tests: - add GigE Vision test (launch an instance of the camera simulator and connect to it) and: - improve Genicam feature coverage - improve developper documentation - improve GigE Vision protocol documentation - add more unit tests aravis-ARAVIS_0_6_0/aravis.doap000066400000000000000000000017061334570641500163570ustar00rootroot00000000000000 Aravis Acquisition library for industrial cameras Emmanuel Pacaud aravis-ARAVIS_0_6_0/aravis.pc.in000066400000000000000000000005231334570641500164370ustar00rootroot00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: Aravis Description: Camera control and image acquisition library Version: @VERSION@ Requires: glib-2.0 gobject-2.0 gio-2.0 libxml-2.0 gthread-2.0 Libs: -L${libdir} -laravis-@ARAVIS_API_VERSION@ -lm Cflags: -I${includedir}/aravis-@ARAVIS_API_VERSION@ aravis-ARAVIS_0_6_0/aravis.rules000066400000000000000000000004771334570641500165720ustar00rootroot00000000000000# Basler SUBSYSTEM=="usb", ATTRS{idVendor}=="2676", MODE:="0666", TAG+="uaccess", TAG+="udev-acl" # The Imaging Source SUBSYSTEM=="usb", ATTRS{idVendor}=="199e", MODE:="0666", TAG+="uaccess", TAG+="udev-acl" # Point Grey Research SUBSYSTEM=="usb", ATTRS{idVendor}=="1e10", MODE:="0666", TAG+="uaccess", TAG+="udev-acl" aravis-ARAVIS_0_6_0/arvconfig.h.in000066400000000000000000000003121334570641500167510ustar00rootroot00000000000000#mesondefine VERSION #mesondefine PACKAGE_VERSION #mesondefine PACKAGE #mesondefine PACKAGE_NAME #mesondefine ARAVIS_BUILD_PACKET_SOCKET #mesondefine ARAVIS_BUILD_USB #mesondefine ARAVIS_FAST_HEARTBEAT aravis-ARAVIS_0_6_0/autogen.sh000077500000000000000000000021151334570641500162210ustar00rootroot00000000000000#!/bin/sh # Run this to generate all the initial makefiles, etc. test -n "$srcdir" || srcdir=$(dirname "$0") test -n "$srcdir" || srcdir=. olddir=$(pwd) cd $srcdir (test -f configure.ac) || { echo "*** ERROR: Directory '$srcdir' does not look like the top-level project directory ***" exit 1 } # shellcheck disable=SC2016 PKG_NAME=$(autoconf --trace 'AC_INIT:$1' configure.ac) if [ "$#" = 0 -a "x$NOCONFIGURE" = "x" ]; then echo "*** WARNING: I am going to run 'configure' with no arguments." >&2 echo "*** If you wish to pass any to it, please specify them on the" >&2 echo "*** '$0' command line." >&2 echo "" >&2 fi aclocal --install -I m4 || exit 1 intltoolize --force --copy --automake || exit 1 gtkdocize --copy || exit 1 autoreconf --verbose --force --install || exit 1 cd "$olddir" if [ "$NOCONFIGURE" = "" ]; then $srcdir/configure "$@" || exit 1 if [ "$1" = "--help" ]; then exit 0 else echo "Now type 'make' to compile $PKG_NAME" || exit 1 fi else echo "Skipping configure process." fi aravis-ARAVIS_0_6_0/configure.ac000066400000000000000000000240121334570641500165060ustar00rootroot00000000000000AC_PREREQ(2.63.0) m4_define([aravis_version_major], [0]) m4_define([aravis_version_minor], [6]) m4_define([aravis_version_micro], [0]) m4_define([aravis_version], [aravis_version_major.aravis_version_minor.aravis_version_micro]) AC_INIT([aravis],[aravis_version],[http://bugzilla.gnome.org/enter_bug.cgi?product=aravis],[aravis]) AM_INIT_AUTOMAKE([-Wno-portability dist-bzip2 dist-xz foreign]) AM_MAINTAINER_MODE AC_CONFIG_HEADERS([src/arvconfig.h]) AC_CONFIG_MACRO_DIR([m4]) m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) AC_SUBST([ARAVIS_API_VERSION], [0.6]) AC_SUBST([ARAVIS_API_VERSION_U],[AS_TR_SH([$ARAVIS_API_VERSION])]) ARAVIS_MAJOR_VERSION=aravis_version_major ARAVIS_MINOR_VERSION=aravis_version_minor ARAVIS_MICRO_VERSION=aravis_version_micro ARAVIS_VERSION=aravis_version AC_SUBST(ARAVIS_MAJOR_VERSION) AC_SUBST(ARAVIS_MINOR_VERSION) AC_SUBST(ARAVIS_MICRO_VERSION) AC_SUBST(ARAVIS_VERSION) AC_SEARCH_LIBS([strerror],[cposix]) AC_PROG_CC AC_PROG_CXX AC_HEADER_STDC AC_SUBST(GETTEXT_PACKAGE, aravis-${ARAVIS_API_VERSION}) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [GETTEXT package name]) AM_GLIB_GNU_GETTEXT IT_PROG_INTLTOOL([0.31.2]) LT_INIT() AX_VALGRIND_CHECK() AX_CODE_COVERAGE() AC_ARG_ENABLE(usb, [AS_HELP_STRING([--enable-usb], [build with USB support [default=auto]])], [enable_usb=$enableval], [enable_usb=auto]) AC_ARG_ENABLE(packet_socket, [AS_HELP_STRING([--enable-packet-socket], [build with packet socket support [default=auto]])], [enable_packet_socket=$enableval], [enable_packet_socket=auto]) AC_ARG_ENABLE(viewer, [AS_HELP_STRING([--enable-viewer], [build viewer [default=auto]])], [enable_viewer=$enableval], [enable_viewer=auto]) AC_ARG_ENABLE(gst_plugin, [AS_HELP_STRING([--enable-gst-plugin], [build gstreamer plugin [default=auto]])], [enable_gst_plugin=$enableval], [enable_gst_plugin=auto]) AC_ARG_ENABLE(gst_0_10_plugin, [AS_HELP_STRING([--enable-gst-0.10-plugin], [build gstreamer-0.10 plugin [default=auto]])], [enable_gst_0_10_plugin=$enableval], [enable_gst_0_10_plugin=auto]) AC_ARG_ENABLE(cpp_test, [AS_HELP_STRING([--enable-cpp-test], [build c++ test [default=no]])], [enable_cpp_test=$enableval], [enable_cpp_test=no]) AC_ARG_ENABLE(zlib_pc, [AS_HELP_STRING([--enable-zlib-pc], [use pkg-config for zlib dependency [default=yes]])], [enable_zlib_pc=$enableval], [enable_zlib_pc=yes]) AC_ARG_ENABLE(fast_heartbeat, [AS_HELP_STRING([--enable-fast-heartbeat], [build with extremely fast heartbeat [default=no]])], [enable_fast_heartbeat=$enableval], [enable_fast_heartbeat=no]) AC_ARG_ENABLE(asan, [AC_HELP_STRING([--enable-asan], [build with address sanitizer [default=no]])], [enable_asan=$enableval], [enable_asan=no]) PKG_PROG_PKG_CONFIG([0.14]) ARAVIS_REQUIREMENTS="glib-2.0 >= 2.32 gobject-2.0 gio-2.0 libxml-2.0 gthread-2.0" ARAVIS_USB_REQUIREMENTS="libusb-1.0" ARAVIS_PACKET_SOCKET_REQUIREMENTS="audit" ARAVIS_GSTREAMER_REQUIREMENTS="gstreamer-base-1.0 gstreamer-app-1.0" ARAVIS_GSTREAMER_0_10_REQUIREMENTS="gstreamer-base-0.10 gstreamer-app-0.10" ARAVIS_VIEWER_REQUIREMENTS="$ARAVIS_GSTREAMER_REQUIREMENTS gstreamer-video-1.0 gtk+-3.0 >= 3.12 libnotify" # Conditional use of zlib.pc, as it doesn't exist on old setup if test "x$enable_zlib_pc" = "xyes"; then ARAVIS_REQUIREMENTS="${ARAVIS_REQUIREMENTS} zlib" ARAVIS_ADDITIONAL_LIBS="-lm" else ARAVIS_ADDITIONAL_LIBS="-lm -lz" fi # USB support # =========== build_usb=no if test "x$enable_usb" = "xyes" || test "x$enable_usb" = "xauto"; then PKG_CHECK_MODULES([ARAVIS_USB], [$ARAVIS_USB_REQUIREMENTS], [AC_DEFINE([ARAVIS_BUILD_USB], [1], [Build USB support]) build_usb=yes], [AS_IF([test "x$enable_usb" = "xyes"], AC_MSG_ERROR([${ARAVIS_USB_PKG_ERRORS} - Can not build USB support]))]); fi AM_CONDITIONAL(ARAVIS_BUILD_USB, test "x$build_usb" = "xyes") if test "x$build_usb" = "xyes"; then ARAVIS_REQUIREMENTS="${ARAVIS_REQUIREMENTS} ${ARAVIS_USB_REQUIREMENTS}" AC_SUBST([ARAVIS_HAS_USB],[1]) else AC_SUBST([ARAVIS_HAS_USB],[0]) fi # Packet socket support # =================== build_packet_socket=no if test "x$enable_packet_socket" = "xyes" || test "x$enable_packet_socket" = "xauto"; then PKG_CHECK_MODULES([ARAVIS_PACKET_SOCKET], [$ARAVIS_PACKET_SOCKET_REQUIREMENTS], [AC_DEFINE([ARAVIS_BUILD_PACKET_SOCKET], [1], [Build packet socket support]) build_packet_socket=yes], [AS_IF([test "x$enable_packet_socket" = "xyes"], AC_MSG_ERROR([${ARAVIS_PACKET_SOCKET_PKG_ERRORS} - Can not build packet socket support]))]); fi AM_CONDITIONAL(ARAVIS_BUILD_PACKET_SOCKET, test "x$build_packet_socket" = "xyes") if test "x$build_packet_socket" = "xyes"; then ARAVIS_REQUIREMENTS="${ARAVIS_REQUIREMENTS} ${ARAVIS_PACKET_SOCKET_REQUIREMENTS}" AC_SUBST([ARAVIS_HAS_PACKET_SOCKET],[1]) else AC_SUBST([ARAVIS_HAS_PACKET_SOCKET],[0]) fi PKG_CHECK_MODULES(ARAVIS, [$ARAVIS_REQUIREMENTS]) # Standard math library doesn't come with a pkgconfig file. ARAVIS_LIBS="${ARAVIS_ADDITIONAL_LIBS} ${ARAVIS_LIBS}" AC_SUBST(ARAVIS_CFLAGS) AC_SUBST(ARAVIS_LIBS) AC_SUBST(aravis_datadir, '$(datadir)/aravis-$(ARAVIS_API_VERSION)') # Viewer # ====== build_viewer=no if test "x$enable_viewer" = "xyes" || test "x$enable_viewer" = "xauto"; then PKG_CHECK_MODULES([ARAVIS_VIEWER], [$ARAVIS_VIEWER_REQUIREMENTS], [AC_DEFINE([ARAVIS_BUILD_VIEWER], [1], [Build viewer]) build_viewer=yes], [AS_IF([test "x$enable_viewer" = "xyes"], AC_MSG_ERROR([${ARAVIS_VIEWER_PKG_ERRORS} - Can not build viewer]))]); fi AM_CONDITIONAL(ARAVIS_BUILD_VIEWER, test "x$build_viewer" = "xyes") # Standard math library doesn't come with a pkgconfig file. ARAVIS_VIEWER_LIBS="${ARAVIS_ADDITIONAL_LIBS} ${ARAVIS_VIEWER_LIBS}" AC_SUBST(ARAVIS_VIEWER_CFLAGS) AC_SUBST(ARAVIS_VIEWER_LIBS) # GStreamer plugin # ================ build_gst_plugin=no if test "x$enable_gst_plugin" = "xyes" || test "x$enable_gst_plugin" = "xauto"; then PKG_CHECK_MODULES([ARAVIS_GST_PLUGIN], [$ARAVIS_GSTREAMER_REQUIREMENTS], [AC_DEFINE([ARAVIS_BUILD_GST_PLUGIN], [1], [Build gstreamer plugin]) build_gst_plugin=yes], [AS_IF([test "x$enable_gst_plugin" = "xyes"], AC_MSG_ERROR([${ARAVIS_GST_PLUGIN_PKG_ERRORS} - Can not build gstreamer plugin]))]); fi AM_CONDITIONAL(ARAVIS_BUILD_GST_PLUGIN, test "x$build_gst_plugin" = "xyes") # Standard math library doesn't come with a pkgconfig file. ARAVIS_GST_PLUGIN_LIBS="${ARAVIS_ADDITIONAL_LIBS} ${ARAVIS_GST_PLUGIN_LIBS}" AC_SUBST(ARAVIS_GST_PLUGIN_CFLAGS) AC_SUBST(ARAVIS_GST_PLUGIN_LIBS) if test "x${prefix}" = "x$HOME"; then gstplugindir="$HOME/.gstreamer-1.0/plugins" else gstplugindir="\$(libdir)/gstreamer-1.0" fi AC_SUBST(gstplugindir) GST_PLUGIN_LDFLAGS='-module -avoid-version -export-symbols-regex [_]*\(gst_\|Gst\|GST_\).*' AC_SUBST(GST_PLUGIN_LDFLAGS) # GStreamer-0.10 plugin # ===================== build_gst_0_10_plugin=no if test "x$enable_gst_0_10_plugin" = "xyes" || test "x$enable_gst_0_10_plugin" = "xauto"; then PKG_CHECK_MODULES([ARAVIS_GST_0_10_PLUGIN], [$ARAVIS_GSTREAMER_0_10_REQUIREMENTS], [AC_DEFINE([ARAVIS_BUILD_GST_0_10_PLUGIN], [1], [Build gstreamer-0.10 plugin]) build_gst_0_10_plugin=yes], [AS_IF([test "x$enable_gst_0_10_plugin" = "xyes"], AC_MSG_ERROR([${ARAVIS_GST_0_10_PLUGIN_PKG_ERRORS} - Can not build gstreamer plugin]))]); fi AM_CONDITIONAL(ARAVIS_BUILD_GST_0_10_PLUGIN, test "x$build_gst_0_10_plugin" = "xyes") # Standard math library doesn't come with a pkgconfig file. ARAVIS_GST_0_10_PLUGIN_LIBS="${ARAVIS_ADDITIONAL_LIBS} ${ARAVIS_GST_0_10_PLUGIN_LIBS}" AC_SUBST(ARAVIS_GST_0_10_PLUGIN_CFLAGS) AC_SUBST(ARAVIS_GST_0_10_PLUGIN_LIBS) if test "x${prefix}" = "x$HOME"; then gst010plugindir="$HOME/.gstreamer-0.10/plugins" else gst010plugindir="\$(libdir)/gstreamer-0.10" fi AC_SUBST(gst010plugindir) GST_0_10_PLUGIN_LDFLAGS='-module -avoid-version -export-symbols-regex [_]*\(gst_\|Gst\|GST_\).*' AC_SUBST(GST_0_10_PLUGIN_LDFLAGS) # Fast heartbeat # ============= build_fast_heartbeat=no if test "x$enable_fast_heartbeat" = "xyes" ; then build_fast_heartbeat=yes AC_DEFINE([ARAVIS_FAST_HEARTBEAT], [], [Build with a much fast heartbeat rate]) fi AM_CONDITIONAL(ARAVIS_FAST_HEARTBEAT, test "x$build_fast_heartbeat" = "xyes") # C++ test # ======== AM_CONDITIONAL(ARAVIS_BUILD_CPP_TEST, test "x$enable_cpp_test" = "xyes") # Address sanatizer # ================= AC_MSG_CHECKING([for asan flags]) if test "x$enable_asan" = "xyes"; then CFLAGS="$CFLAGS -fsanitize=address -O1 -fno-omit-frame-pointer -g" build_with_asan="yes" else build_with_asan="no" fi AM_CONDITIONAL(ARAVIS_WITH_ASAN, test "x$enable_asan" = "xyes") AC_MSG_RESULT($build_with_asan) AC_PATH_PROG(GLIB_MKENUMS, glib-mkenums) m4_ifdef([GOBJECT_INTROSPECTION_CHECK], [ GOBJECT_INTROSPECTION_CHECK([0.10.0]) ], [ AM_CONDITIONAL([HAVE_INTROSPECTION], [false]) enable_introspection=no]) GTK_DOC_CHECK([1.14],[--flavour no-tmpl]) AM_CONDITIONAL([BUILD_GTK_DOC], [test "x$enable_gtk_doc" = "xyes" || test ! -f "autogen.sh"]) APPSTREAM_XML AC_CONFIG_FILES([ Makefile src/Makefile src/arvfeatures.h src/arvversion.h viewer/Makefile viewer/data/Makefile viewer/data/arv-viewer.desktop.in viewer/data/arv-viewer.appdata.xml gst/Makefile gst-0.10/Makefile tests/Makefile po/Makefile.in man/Makefile docs/Makefile docs/reference/Makefile docs/reference/aravis/Makefile aravis.pc ]) AC_OUTPUT echo "" echo "Configuration:" echo "" echo " Compiler: ${CC}" echo " Compiler flags: ${ARAVIS_CFLAGS}" echo " Linker flags: ${ARAVIS_LIBS}" echo "" echo " Build USB support: $build_usb" echo " Build packet socket support: $build_packet_socket" echo " Build viewer: $build_viewer" echo " Build gstreamer plugin: $build_gst_plugin" echo " Build gstreamer-0.10 plugin: $build_gst_0_10_plugin" echo " Build with fast heartbeat: $build_fast_heartbeat" echo " Build with address sanatizer: $build_with_asan" echo "" aravis-ARAVIS_0_6_0/docs/000077500000000000000000000000001334570641500151515ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/docs/.gitignore000066400000000000000000000002261334570641500171410ustar00rootroot00000000000000*-undocumented.txt *-unused.txt *-overrides.txt *-undeclared.txt *-decl.txt *-decl-list.txt *.args *.hierarchy *.interfaces *.prerequisites *.signals aravis-ARAVIS_0_6_0/docs/Makefile.am000066400000000000000000000001661334570641500172100ustar00rootroot00000000000000include $(top_srcdir)/Makefile.decl SUBDIRS = if BUILD_GTK_DOC SUBDIRS += reference endif DIST_SUBDIRS = reference aravis-ARAVIS_0_6_0/docs/meson.build000066400000000000000000000000001334570641500173010ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/docs/reference/000077500000000000000000000000001334570641500171075ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/docs/reference/Makefile.am000066400000000000000000000000661334570641500211450ustar00rootroot00000000000000include $(top_srcdir)/Makefile.decl SUBDIRS = aravis aravis-ARAVIS_0_6_0/docs/reference/aravis/000077500000000000000000000000001334570641500203745ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/docs/reference/aravis/.gitignore000066400000000000000000000000131334570641500223560ustar00rootroot00000000000000html/ xml/ aravis-ARAVIS_0_6_0/docs/reference/aravis/Makefile.am000066400000000000000000000075001334570641500224320ustar00rootroot00000000000000include $(top_srcdir)/Makefile.decl ## Process this file with automake to produce Makefile.in # We require automake 1.6 at least. AUTOMAKE_OPTIONS = 1.6 # This is a blank Makefile.am for using gtk-doc. # Copy this to your project's API docs directory and modify the variables to # suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples # of using the various options. # The name of the module, e.g. 'glib'. DOC_MODULE=aravis # Uncomment for versioned docs and specify the version of the module, e.g. '2'. DOC_MODULE_VERSION=@ARAVIS_API_VERSION@ # The top-level SGML file. You can change this if you want to. DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.xml # Directories containing the source code, relative to $(srcdir). # gtk-doc will search all .c and .h files beneath these paths # for inline comments documenting functions and macros. # e.g. DOC_SOURCE_DIR=../../../gtk ../../../gdk DOC_SOURCE_DIR=../../../src # Extra options to pass to gtkdoc-scangobj. Not normally needed. SCANGOBJ_OPTIONS= # Extra options to supply to gtkdoc-scan. # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" SCAN_OPTIONS= # Extra options to supply to gtkdoc-mkdb. # e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml MKDB_OPTIONS=--sgml-mode --output-format=xml # Extra options to supply to gtkdoc-mktmpl # e.g. MKTMPL_OPTIONS=--only-section-tmpl MKTMPL_OPTIONS= # Extra options to supply to gtkdoc-mkhtml MKHTML_OPTIONS= # Extra options to supply to gtkdoc-fixref. Not normally needed. # e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html FIXXREF_OPTIONS= # Used for dependencies. The docs will be rebuilt if any of these change. # e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h # e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c HFILE_GLOB=$(top_srcdir)/src/*.h CFILE_GLOB=$(top_srcdir)/src/*.c # Extra header to include when scanning, which are not under DOC_SOURCE_DIR # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h EXTRA_HFILES= # Header files to ignore when scanning. Use base file name, no paths # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h IGNORE_HFILES=\ arvenumtypes.h \ arvconfig.h \ arvbufferprivate.h \ arvchunkparserprivate.h \ arvinterfaceprivate.h \ arvdeviceprivate.h \ arvstreamprivate.h \ arvgvstreamprivate.h \ arvgvinterfaceprivate.h \ arvgvdeviceprivate.h \ arvvvstreamprivate.h \ arvuvinterfaceprivate.h \ arvuvdeviceprivate.h \ arvuvstreamprivate.h \ arvfakeinterfaceprivate.h \ arvfakedeviceprivate.h \ arvfakestreamprivate.h \ arvrealtimeprivate.h \ arv.h # Images to copy into HTML directory. # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png HTML_IMAGES= # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.sgml building.sgml changes-2.0.sgml content_files= \ aravis-overview.xml \ aravis-gv.xml # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded # These files must be listed here *and* in content_files # e.g. expand_content_files=running.sgml expand_content_files= \ aravis-overview.xml \ aravis-gv.xml # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. # Only needed if you are using gtkdoc-scangobj to dynamically query widget # signals and properties. # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) GTKDOC_CFLAGS=-I$(top_srcdir)/src $(ARAVIS_CFLAGS) GTKDOC_LIBS=$(top_builddir)/src/libaravis-@ARAVIS_API_VERSION@.la $(ARAVIS_LIBS) # This includes the standard gtk-doc make rules, copied by gtkdocize. include $(top_srcdir)/gtk-doc.make # Other files to distribute # e.g. EXTRA_DIST += version.xml.in EXTRA_DIST += # Files not to distribute # for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types # for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt aravis-ARAVIS_0_6_0/docs/reference/aravis/aravis-docs.xml000066400000000000000000000124761334570641500233430ustar00rootroot00000000000000 ]> Aravis Reference Manual For Aravis 0.6. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You may obtain a copy of the GNU Free Documentation License from the Free Software Foundation by visiting their Web site or by writing to:
The Free Software Foundation, Inc., 59 Temple Place - Fifth Floor, Boston, MA 02110-1301, USA
Aravis API reference Base Genicam Ethernet cameras USB cameras Fake cameras DOM Utils Object Hierarchy Index Index of new symbols in 0.2 Index of new symbols in 0.4 Index of new symbols in 0.6
aravis-ARAVIS_0_6_0/docs/reference/aravis/aravis-gv.xml000066400000000000000000000250371334570641500230240ustar00rootroot00000000000000 Ethernet protocol (GV) Introduction This part contains a description of the protocol implemented by Aravis for the control of the gigabit ethenet cameras. This protocol is a standard used by many video cameras manufacturers for their products. It is a closed standard which should not be confused by what is used on 'IP cameras'. In the case of 'IP cameras' the video stream is a compressed stream (jpeg, h264...) send over HTTP or RTSP, whereas in Aravis, the video stream is a raw stream, mainly targeted to industrial applications (though the protocol supports non raw payload, it is not yet implemented in Aravis). The protocol implemented by Aravis library is based on UDP packets transmited over an ethernet link. Two different types of packets are used: GVCP packets and GVSP packets. GVCP packets are used for the control of the devices, and GVSP for the transmission of the data stream. This documentation is the result of a reverse engineering, which means it is far from complete. A more complete description of the ethernet protocol can be found in the GVSP and GVCP dissectors found in Wireshark sources. GVCP packets Devices are waiting for GVCP packets listening to the GVCP port (3956). When the client sends a command GVCP packet to the device, the device sends back an acknowledge packets in return. Each command/acknowledge pair is identified by a 16 bit value, which allows to check if an acknowledge packet corresponds to the previsoulsy sent command. 0 is an error value for this identifier. If an acknowledge is not received after a given timeout period, another command packet is sent, until a maximum number of retries is reached. The ArvGvcp API offers a set of function for handling of GVCP packets. The content of a GVCP packet is composed by a 64 bit headers, followed or not by a data byte array, depending on the GVCP packet type. Multibyte values are in big endian encoding. GVCP packet 0 15 16 31 32 47 48 63 #ArvGvcpPacketType #ArvGvcpCommand Data size Packet id Optional data ...
Discovery A device discovery mechanism is implemented using a discovery GVCP packet, broadcasted by the client to the GVCP port. Each available device responds to this discovery packet with an acknowledge packet, containing a description of the device (device name, model name, manufacturer name, MAC Address...). In the discovery command packet, data size is set to 0 and packet id is equal to 0xffff. Discovery acknowledge packet Address 0 15 16 31 0x0000 0x0003 0x00f8 0xffff 0x0000 Version major Version minor 0x0004 Endianness Character set 0x0008 MAC address high 0x000c MAC address low 0x0010 Supported IP configuration 0x0014 Current IP configuration 0x0018 0x001c0x0020 0x0024 Current IP address 0x0028 0x002c0x0030 0x0034 Current subnet mask 0x0038 0x003c0x0040 0x0044 Current gateway 0x0048 Manufacturer name 0x004c0x00500x00540x00580x005c0x00600x0064 0x0068 Model name 0x006c0x00700x00740x00780x007c0x00800x0084 0x0088 Device version 0x008c0x00900x00940x00980x009c0x00a00x00a4 0x00a8 Manufacturer informations 0x00ac0x00b00x00b40x00b80x00bc0x00c00x00c00x00c40x00cc0x00d00x00d4 0x00d8 User defined name 0x00dc0x00e00x00e40x00e80x00ec0x00f00x00f4
Read and write register These packets are used for the read and write of 32 bit registers, accessed using 32 bit adresses. For the read command, a list of addresses is sent ot the client, which returns a list of 32 bit values. For the write command, a list of address/value pairs is sent to the client, which returns a list of 32 bit values. Address and data are encoded in the packet as big endian values. Read and write memory Write memory packet data area consists in a 32 bit address, followed by the data to write. Client returns an acknowledge packet with the target address. For read memory command, an address/size pair is sent to the device, which returns the content of the given memory area.
GVSP packets GVSP packets are sent by the device for the video stream transmission. Depending on the device, it is possible to have more than one stream simultaneously, each directed to a different client port. Stream is splitted in frames. For each frame, identified by a frame id, three different packets are used: a leader packet, one or more data packets, and a trailer packet. Each packet in a frame is identified by a packet id, starting from 0. The ArvGvsp API offers a set of function for handling of GVSP packets. Structure of a GVSP is described in #ArvGvspPacket structure documentation. Content of leader and trailer packets in #ArvGvspDataLeader and #ArvGvspDataTrailer. In the video stream reception code, client must take care to check if all frame packets are present, and ask for packet resend for missing ones, using a GVCP packet resend command.
aravis-ARAVIS_0_6_0/docs/reference/aravis/aravis-overview.xml000066400000000000000000000104311334570641500242460ustar00rootroot00000000000000 Overview Introduction Aravis is a GObject based library for the control and the video stream acquisition of digital cameras. While using GenICam xml files for the description of the camera registers, it does not try to be a complete implementation of the Genicam API as described in the GenAPI GenICam document. Nevertheless, a good knowledge of the GenICam standard should help the user to understand how Aravis operates. Aravis currently provides an implementation of a gigabit ethernet UDP based protocol, found in a lot of ethernet industrial cameras. #ArvCamera is a simple API for easy access of standard camera features. #ArvDevice and #ArvGc are more low level APIs, which enable the full control of the cameras, allowing the use of the features specific to each model. Thread Safety Aravis is not thread safe, which means one can not use the same object simultaneously from different threads, without using mutexes. But it is perfectly fine to use different aravis objects in different threads. A possible trap is that glib signal callbacks are called from the thread that emitted the corresponding signal. For example, the "new-buffer" callback is emitted from the stream packet receiving thread, which is an internal thread created by ArvGvStream. It is not safe to use ArvDevice and some ArvStream functions from this callback without using mutexes. The exceptions are #arv_stream_push_buffer, #arv_stream_pop_buffer, #arv_stream_try_pop_buffer and #arv_stream_timeout_pop_buffer. Building and Debugging Aravis On UNIX, Aravis uses the standard GNU build system, using autoconf for package configuration and resolving portability issues, automake for building makefiles that comply with the GNU Coding Standards, and libtool for building shared libraries on multiple platforms. The normal sequence for compiling and installing the Aravis library is thus: ./configure make make install The standard options provided by GNU autoconf may be passed to the configure script. Please see the autoconf documentation or run ./configure --help for information about the standard options. In addition to the standard options, there is a number of options to activate or deactivate features. --enable-gst-plugin enables the compilation of the aravissrc gstreamer element --enable-viewer makes the build system compile the viewer The ARV_DEBUG environment variable can be set to a comma separated list of debugging categories, which will make Aravis print out different types of debugging informations to the console. A debug level can also be specified, using a number from 0 (none) to 3 (log) separated from the category name by a colon. For example, the following command before running an Aravis based application will make Aravis print out all stream and device related informations: export ARV_DEBUG=stream:3,device:3 Available categories are: all interface device chunk stream stream-thread cp sp genicam evaluator dom misc aravis-ARAVIS_0_6_0/docs/reference/aravis/aravis-sections.txt000066400000000000000000001273411334570641500242570ustar00rootroot00000000000000
arvcamera ArvCamera ARAVIS_CHECK_VERSION ARAVIS_MAJOR_VERSION ARAVIS_MICRO_VERSION ARAVIS_MINOR_VERSION ARAVIS_HAS_PACKET_SOCKET ARAVIS_HAS_USB ArvAuto arv_auto_from_string arv_auto_to_string ArvCamera arv_camera_new arv_camera_create_stream arv_camera_get_device arv_camera_get_vendor_name arv_camera_get_model_name arv_camera_get_device_id arv_camera_get_sensor_size arv_camera_set_region arv_camera_get_region arv_camera_get_x_offset_bounds arv_camera_get_y_offset_bounds arv_camera_get_height_bounds arv_camera_get_width_bounds arv_camera_set_binning arv_camera_get_binning arv_camera_get_x_binning_bounds arv_camera_get_y_binning_bounds arv_camera_is_binning_available arv_camera_set_pixel_format arv_camera_get_pixel_format arv_camera_get_pixel_format_as_string arv_camera_set_pixel_format_from_string arv_camera_get_available_pixel_formats arv_camera_get_available_pixel_formats_as_display_names arv_camera_get_available_pixel_formats_as_strings arv_camera_start_acquisition arv_camera_stop_acquisition arv_camera_abort_acquisition arv_camera_acquisition arv_camera_set_acquisition_mode arv_camera_get_acquisition_mode arv_camera_set_frame_count arv_camera_get_frame_count arv_camera_get_frame_count_bounds arv_camera_is_frame_rate_available arv_camera_set_frame_rate arv_camera_get_frame_rate arv_camera_get_frame_rate_bounds arv_camera_set_trigger arv_camera_set_trigger_source arv_camera_get_trigger_source arv_camera_get_available_trigger_sources arv_camera_get_available_triggers arv_camera_clear_triggers arv_camera_software_trigger arv_camera_is_exposure_time_available arv_camera_is_exposure_auto_available arv_camera_set_exposure_time arv_camera_get_exposure_time arv_camera_get_exposure_time_bounds arv_camera_set_exposure_time_auto arv_camera_get_exposure_time_auto arv_camera_is_gain_available arv_camera_is_gain_auto_available arv_camera_set_gain arv_camera_get_gain arv_camera_get_gain_bounds arv_camera_set_gain_auto arv_camera_get_gain_auto arv_camera_get_payload arv_camera_is_gv_device arv_camera_gv_get_n_stream_channels arv_camera_gv_select_stream_channel arv_camera_gv_get_current_stream_channel arv_camera_gv_get_packet_delay arv_camera_gv_set_packet_delay arv_camera_gv_get_packet_size arv_camera_gv_set_packet_size arv_camera_gv_auto_packet_size arv_camera_gv_set_stream_options arv_camera_is_uv_device arv_camera_uv_get_bandwidth arv_camera_uv_get_bandwidth_bounds arv_camera_uv_is_bandwidth_control_available arv_camera_uv_set_bandwidth arv_camera_get_chunk_mode arv_camera_get_chunk_state arv_camera_set_chunk_mode arv_camera_set_chunk_state arv_camera_set_chunks arv_camera_create_chunk_parser ArvAcquisitionMode arv_acquisition_mode_to_string arv_acquisition_mode_from_string ARV_CAMERA ARV_IS_CAMERA ARV_TYPE_CAMERA arv_camera_get_type ARV_CAMERA_CLASS ARV_IS_CAMERA_CLASS ARV_CAMERA_GET_CLASS ArvCameraPrivate ArvCameraClass
arvbuffer ArvBuffer ArvFrameCallback ArvBufferStatus ArvBuffer ArvBufferPayloadType ArvPixelFormat arv_buffer_new arv_buffer_new_full arv_buffer_new_allocate arv_buffer_get_user_data arv_buffer_get_data arv_buffer_get_chunk_data arv_buffer_get_timestamp arv_buffer_set_timestamp arv_buffer_get_system_timestamp arv_buffer_set_system_timestamp arv_buffer_get_frame_id arv_buffer_get_payload_type arv_buffer_get_status arv_buffer_get_image_height arv_buffer_get_image_pixel_format arv_buffer_get_image_region arv_buffer_get_image_width arv_buffer_get_image_x arv_buffer_get_image_y ARV_PIXEL_FORMAT_BIT_PER_PIXEL ARV_PIXEL_FORMAT_BAYER_BG_10 ARV_PIXEL_FORMAT_BAYER_BG_12 ARV_PIXEL_FORMAT_BAYER_GR_12_PACKED ARV_PIXEL_FORMAT_BAYER_GB_12_PACKED ARV_PIXEL_FORMAT_BAYER_RG_12_PACKED ARV_PIXEL_FORMAT_BAYER_BG_12_PACKED ARV_PIXEL_FORMAT_BAYER_BG_8 ARV_PIXEL_FORMAT_BAYER_GB_10 ARV_PIXEL_FORMAT_BAYER_GB_12 ARV_PIXEL_FORMAT_BAYER_GB_8 ARV_PIXEL_FORMAT_BAYER_GR_10 ARV_PIXEL_FORMAT_BAYER_GR_12 ARV_PIXEL_FORMAT_BAYER_GR_8 ARV_PIXEL_FORMAT_BAYER_RG_10 ARV_PIXEL_FORMAT_BAYER_RG_12 ARV_PIXEL_FORMAT_BAYER_RG_8 ARV_PIXEL_FORMAT_BAYER_BG_16 ARV_PIXEL_FORMAT_BAYER_GB_16 ARV_PIXEL_FORMAT_BAYER_GR_16 ARV_PIXEL_FORMAT_BAYER_RG_16 ARV_PIXEL_FORMAT_BGRA_8_PACKED ARV_PIXEL_FORMAT_BGR_10_PACKED ARV_PIXEL_FORMAT_BGR_12_PACKED ARV_PIXEL_FORMAT_BGR_8_PACKED ARV_PIXEL_FORMAT_CUSTOM_BAYER_BG_12_PACKED ARV_PIXEL_FORMAT_CUSTOM_BAYER_BG_16 ARV_PIXEL_FORMAT_CUSTOM_BAYER_GB_12_PACKED ARV_PIXEL_FORMAT_CUSTOM_BAYER_GB_16 ARV_PIXEL_FORMAT_CUSTOM_BAYER_GR_12_PACKED ARV_PIXEL_FORMAT_CUSTOM_BAYER_GR_16 ARV_PIXEL_FORMAT_CUSTOM_BAYER_RG_12_PACKED ARV_PIXEL_FORMAT_CUSTOM_BAYER_RG_16 ARV_PIXEL_FORMAT_CUSTOM_YUV_422_YUYV_PACKED ARV_PIXEL_FORMAT_MONO_10 ARV_PIXEL_FORMAT_MONO_10_PACKED ARV_PIXEL_FORMAT_MONO_12 ARV_PIXEL_FORMAT_MONO_12_PACKED ARV_PIXEL_FORMAT_MONO_14 ARV_PIXEL_FORMAT_MONO_16 ARV_PIXEL_FORMAT_MONO_8 ARV_PIXEL_FORMAT_MONO_8_SIGNED ARV_PIXEL_FORMAT_RGBA_8_PACKED ARV_PIXEL_FORMAT_RGB_10_PACKED ARV_PIXEL_FORMAT_RGB_10_PLANAR ARV_PIXEL_FORMAT_RGB_12_PACKED ARV_PIXEL_FORMAT_RGB_12_PLANAR ARV_PIXEL_FORMAT_RGB_16_PLANAR ARV_PIXEL_FORMAT_RGB_8_PACKED ARV_PIXEL_FORMAT_RGB_8_PLANAR ARV_PIXEL_FORMAT_YUV_411_PACKED ARV_PIXEL_FORMAT_YUV_422_PACKED ARV_PIXEL_FORMAT_YUV_422_YUYV_PACKED ARV_PIXEL_FORMAT_YUV_444_PACKED ARV_BUFFER ARV_IS_BUFFER ARV_TYPE_BUFFER arv_buffer_get_type ARV_BUFFER_CLASS ARV_IS_BUFFER_CLASS ARV_BUFFER_GET_CLASS ArvBufferClass ArvBufferPrivate
arv Arv arv_update_device_list arv_get_n_devices arv_get_device_id arv_get_device_physical_id arv_get_device_model arv_get_device_serial_nbr arv_get_device_vendor arv_get_device_address arv_get_device_protocol arv_open_device arv_get_n_interfaces arv_get_interface_id arv_disable_interface arv_enable_interface arv_shutdown
arvinterface ArvInterface arv_interface_get_device_address arv_interface_get_device_id arv_interface_get_device_model arv_interface_get_device_physical_id arv_interface_get_device_serial_nbr arv_interface_get_device_vendor arv_interface_get_device_protocol arv_interface_get_n_devices arv_interface_open_device arv_interface_update_device_list ARV_INTERFACE ARV_INTERFACE_CLASS ARV_INTERFACE_GET_CLASS ARV_IS_INTERFACE ARV_IS_INTERFACE_CLASS ARV_TYPE_INTERFACE arv_interface_get_type ArvInterfaceDeviceIds ArvInterfacePrivate arv_vendor_alias_lookup
arvdevice ArvDevice ArvDevice ArvDeviceStatus arv_device_create_stream arv_device_create_chunk_parser arv_device_read_memory arv_device_write_memory arv_device_read_register arv_device_write_register arv_device_get_genicam_xml arv_device_get_genicam arv_device_get_feature arv_device_get_status arv_device_execute_command arv_device_get_boolean_feature_value arv_device_set_boolean_feature_value arv_device_set_string_feature_value arv_device_get_string_feature_value arv_device_set_integer_feature_value arv_device_get_integer_feature_value arv_device_get_integer_feature_bounds arv_device_set_float_feature_value arv_device_get_float_feature_value arv_device_get_float_feature_bounds arv_device_get_available_enumeration_feature_values arv_device_get_available_enumeration_feature_values_as_strings ARV_DEVICE ARV_IS_DEVICE ARV_TYPE_DEVICE arv_device_get_type ARV_DEVICE_CLASS ARV_IS_DEVICE_CLASS ARV_DEVICE_GET_CLASS ArvDeviceClass ArvDevicePrivate ARV_DEVICE_NAME_ILLEGAL_CHARACTERS ARV_DEVICE_NAME_REPLACEMENT_CHARACTER
arvfakeinterface ArvFakeInterface ArvFakeInterface arv_fake_interface_get_instance ARV_FAKE_INTERFACE ARV_IS_FAKE_INTERFACE ARV_TYPE_FAKE_INTERFACE arv_fake_interface_get_type ARV_FAKE_INTERFACE_CLASS ARV_IS_FAKE_INTERFACE_CLASS ARV_FAKE_INTERFACE_GET_CLASS ArvFakeInterfacePrivate ArvFakeInterfaceClass arv_fake_interface_destroy_instance ARV_FAKE_INTERFACE_DISCOVERY_TIMEOUT_MS ARV_FAKE_INTERFACE_SOCKET_BUFFER_SIZE
arvuvinterface ArvUvInterface ArvUvInterface arv_uv_interface_get_instance ARV_IS_UV_INTERFACE ARV_IS_UV_INTERFACE_CLASS ARV_TYPE_UV_INTERFACE ARV_UV_INTERFACE ARV_UV_INTERFACE_CLASS ARV_UV_INTERFACE_GET_CLASS ArvUvInterfaceClass ArvUvInterfacePrivate arv_uv_interface_get_type arv_uv_interface_destroy_instance
arvuvdevice ArvUvDevice ArvUvDevice ARV_IS_UV_DEVICE ARV_IS_UV_DEVICE_CLASS ARV_TYPE_UV_DEVICE ARV_UV_DEVICE ARV_UV_DEVICE_CLASS ARV_UV_DEVICE_GET_CLASS ArvUvDeviceClass ArvUvDevicePrivate arv_uv_device_get_type arv_uv_device_new arv_uv_device_bulk_transfer
arvuvstream ArvUvStream ArvUvStream ARV_IS_UV_STREAM ARV_IS_UV_STREAM_CLASS ARV_TYPE_UV_STREAM ARV_UV_STREAM ARV_UV_STREAM_CLASS ARV_UV_STREAM_GET_CLASS ArvUvStreamClass ArvUvStreamPrivate arv_uv_stream_get_type arv_uv_stream_new
arvgcport ArvGcPort ArvGcPort arv_gc_port_new arv_gc_port_read arv_gc_port_write arv_gc_set_default_node_data ARV_GC_PORT ARV_IS_GC_PORT ARV_TYPE_GC_PORT arv_gc_port_get_type ARV_GC_PORT_CLASS ARV_IS_GC_PORT_CLASS ARV_GC_PORT_GET_CLASS ArvGcPortPrivate ArvGcPortClass
arvchunkparser ArvChunkParser ArvChunkParser arv_chunk_parser_new arv_chunk_parser_get_float_value arv_chunk_parser_get_integer_value arv_chunk_parser_get_string_value arv_chunk_parser_get_type ARV_CHUNK_PARSER ARV_CHUNK_PARSER_CLASS ARV_CHUNK_PARSER_GET_CLASS ARV_IS_CHUNK_PARSER ARV_IS_CHUNK_PARSER_CLASS ARV_TYPE_CHUNK_PARSER ArvChunkParserStatus ArvChunkParserPrivate ARV_CHUNK_PARSER_ERROR
arvgcnode ArvGcNode ArvGcNode arv_gc_node_get_genicam ARV_GC_NODE ARV_IS_GC_NODE ARV_TYPE_GC_NODE arv_gc_node_get_type ARV_GC_NODE_CLASS ARV_IS_GC_NODE_CLASS ARV_GC_NODE_GET_CLASS ArvGcNodePrivate ArvGcNodeClass ARV_GC_ERROR ArvGcError arv_gc_error_quark
arvgcpropertynode ArvGcPropertyNode ArvGcPropertyNode arv_gc_property_node_new_access_mode arv_gc_property_node_new_address arv_gc_property_node_new_bit arv_gc_property_node_new_cachable arv_gc_property_node_new_command_value arv_gc_property_node_new_constant arv_gc_property_node_new_description arv_gc_property_node_new_display_name arv_gc_property_node_new_endianess arv_gc_property_node_new_expression arv_gc_property_node_new_formula arv_gc_property_node_new_formula_from arv_gc_property_node_new_formula_to arv_gc_property_node_new_increment arv_gc_property_node_new_length arv_gc_property_node_new_lsb arv_gc_property_node_new_maximum arv_gc_property_node_new_minimum arv_gc_property_node_new_msb arv_gc_property_node_new_off_value arv_gc_property_node_new_on_value arv_gc_property_node_new_chunk_id arv_gc_property_node_new_p_address arv_gc_property_node_new_p_command_value arv_gc_property_node_new_p_feature arv_gc_property_node_new_p_increment arv_gc_property_node_new_p_is_available arv_gc_property_node_new_p_is_implemented arv_gc_property_node_new_p_is_locked arv_gc_property_node_new_p_length arv_gc_property_node_new_p_maximum arv_gc_property_node_new_p_minimum arv_gc_property_node_new_p_port arv_gc_property_node_new_p_value arv_gc_property_node_new_p_variable arv_gc_property_node_new_polling_time arv_gc_property_node_new_sign arv_gc_property_node_new_tooltip arv_gc_property_node_new_unit arv_gc_property_node_new_p_value_default arv_gc_property_node_new_value_default arv_gc_property_node_new_value arv_gc_property_node_get_name arv_gc_property_node_get_node_type arv_gc_property_node_get_linked_node arv_gc_property_node_get_double arv_gc_property_node_get_int64 arv_gc_property_node_get_string arv_gc_property_node_set_double arv_gc_property_node_set_int64 arv_gc_property_node_set_string arv_gc_property_node_get_type ARV_GC_PROPERTY_NODE ARV_GC_PROPERTY_NODE_CLASS ARV_GC_PROPERTY_NODE_GET_CLASS ARV_IS_GC_PROPERTY_NODE ARV_IS_GC_PROPERTY_NODE_CLASS ARV_TYPE_GC_PROPERTY_NODE ArvGcPropertyNodePrivate ArvGcPropertyNodeType
arvgcindexnode ArvGcIndexNode ArvGcIndexNode arv_gc_index_node_new arv_gc_index_node_get_index arv_gc_index_node_get_type ARV_GC_INDEX_NODE ARV_GC_INDEX_NODE_CLASS ARV_GC_INDEX_NODE_GET_CLASS ARV_IS_GC_INDEX_NODE ARV_IS_GC_INDEX_NODE_CLASS ARV_TYPE_GC_INDEX_NODE
arvgcvalueindexednode ArvGcValueIndexedNode arv_gc_p_value_indexed_node_new arv_gc_value_indexed_node_get_index arv_gc_value_indexed_node_get_type arv_gc_value_indexed_node_new ArvGcValueIndexedNode ARV_GC_VALUE_INDEXED_NODE ARV_GC_VALUE_INDEXED_NODE_CLASS ARV_GC_VALUE_INDEXED_NODE_GET_CLASS ARV_IS_GC_VALUE_INDEXED_NODE ARV_IS_GC_VALUE_INDEXED_NODE_CLASS ARV_TYPE_GC_VALUE_INDEXED_NODE
arvgcinvalidatornode ArvGcInvalidatorNode ArvGcInvalidatorNode arv_gc_invalidator_node_new arv_gc_invalidator_node_get_modification_count arv_gc_invalidator_node_set_modification_count arv_gc_invalidator_node_get_type ARV_GC_INVALIDATOR_NODE ARV_GC_INVALIDATOR_NODE_CLASS ARV_GC_INVALIDATOR_NODE_GET_CLASS ARV_IS_GC_INVALIDATOR_NODE ARV_IS_GC_INVALIDATOR_NODE_CLASS ARV_TYPE_GC_INVALIDATOR_NODE
arvgcfeaturenode ArvGcFeatureNode ArvGcFeatureNode arv_gc_feature_node_new arv_gc_feature_node_get_value_type arv_gc_feature_node_get_value_as_string arv_gc_feature_node_set_value_from_string arv_gc_feature_node_get_name arv_gc_feature_node_get_display_name arv_gc_feature_node_get_tooltip arv_gc_feature_node_get_description arv_gc_feature_node_is_available arv_gc_feature_node_inc_modification_count arv_gc_feature_node_get_modification_count arv_gc_feature_node_is_implemented arv_gc_feature_node_is_locked ARV_GC_FEATURE_NODE ARV_IS_GC_FEATURE_NODE ARV_TYPE_GC_FEATURE_NODE arv_gc_feature_node_get_type ARV_GC_FEATURE_NODE_CLASS ARV_IS_GC_FEATURE_NODE_CLASS ARV_GC_FEATURE_NODE_GET_CLASS ArvGcFeatureNodePrivate ArvGcFeatureNodeClass
arvgcgroupnode ArvGcGroupNode ArvGcGroupNode arv_gc_group_node_get_type arv_gc_group_node_new ARV_GC_GROUP_NODE ARV_GC_GROUP_NODE_CLASS ARV_GC_GROUP_NODE_GET_CLASS ARV_IS_GC_GROUP_NODE ARV_IS_GC_GROUP_NODE_CLASS ARV_TYPE_GC_GROUP_NODE
arvgcregisterdescriptionnode ArvGcRegisterDescriptionNode ArvGcRegisterDescriptionNode arv_gc_register_description_node_new arv_gc_register_description_node_compare_schema_version arv_gc_register_description_node_check_schema_version arv_gc_register_feature_node arv_gc_register_description_node_get_type ARV_GC_REGISTER_DESCRIPTION_NODE ARV_GC_REGISTER_DESCRIPTION_NODE_CLASS ARV_GC_REGISTER_DESCRIPTION_NODE_GET_CLASS ARV_IS_GC_REGISTER_DESCRIPTION_NODE ARV_IS_GC_REGISTER_DESCRIPTION_NODE_CLASS ARV_TYPE_GC_REGISTER_DESCRIPTION_NODE
arvgcintegernode ArvGcIntegerNode ArvGcIntegerNode arv_gc_integer_node_new ARV_GC_INTEGER_NODE ARV_IS_GC_INTEGER_NODE ARV_TYPE_GC_INTEGER_NODE arv_gc_integer_node_get_type ARV_GC_INTEGER_NODE_CLASS ARV_IS_GC_INTEGER_NODE_CLASS ARV_GC_INTEGER_NODE_GET_CLASS ArvGcIntegerNodeClass
arvgcenumeration ArvGcEnumeration ArvGcEnumeration arv_gc_enumeration_new arv_gc_enumeration_get_string_value arv_gc_enumeration_set_string_value arv_gc_enumeration_get_int_value arv_gc_enumeration_set_int_value arv_gc_enumeration_get_entries arv_gc_enumeration_get_available_int_values arv_gc_enumeration_get_available_string_values ARV_GC_ENUMERATION ARV_IS_GC_ENUMERATION ARV_TYPE_GC_ENUMERATION arv_gc_enumeration_get_type ARV_GC_ENUMERATION_CLASS ARV_IS_GC_ENUMERATION_CLASS ARV_GC_ENUMERATION_GET_CLASS ArvGcEnumerationClass
arvevaluator ArvEvaluator ArvEvaluator arv_evaluator_new arv_evaluator_set_expression arv_evaluator_get_expression arv_evaluator_get_constant arv_evaluator_get_sub_expression arv_evaluator_set_constant arv_evaluator_set_sub_expression arv_evaluator_evaluate_as_double arv_evaluator_evaluate_as_int64 arv_evaluator_set_double_variable arv_evaluator_set_int64_variable ARV_EVALUATOR ARV_IS_EVALUATOR ARV_TYPE_EVALUATOR arv_evaluator_get_type ARV_EVALUATOR_CLASS ARV_IS_EVALUATOR_CLASS ARV_EVALUATOR_GET_CLASS ArvEvaluatorPrivate ArvEvaluatorClass
arvgcinteger ArvGcInteger ArvGcInteger arv_gc_integer_get_value arv_gc_integer_set_value arv_gc_integer_get_min arv_gc_integer_get_max arv_gc_integer_get_inc arv_gc_integer_get_unit arv_gc_integer_impose_min arv_gc_integer_impose_max ARV_GC_INTEGER ARV_IS_GC_INTEGER ARV_TYPE_GC_INTEGER arv_gc_integer_get_type ARV_GC_INTEGER_GET_INTERFACE ArvGcIntegerInterface
arvgcregister ArvGcRegister ArvGcRegister arv_gc_register_get arv_gc_register_get_address arv_gc_register_get_length arv_gc_register_get_type arv_gc_register_set ARV_GC_REGISTER ARV_GC_REGISTER_GET_CLASS ARV_GC_REGISTER_GET_INTERFACE ARV_IS_GC_REGISTER ARV_TYPE_GC_REGISTER ArvGcRegisterInterface ArvGcRegisterType
arvgcconverter ArvGcConverter ArvGcConverter arv_gc_converter_new arv_gc_converter_new_integer ARV_GC_CONVERTER ARV_IS_GC_CONVERTER ARV_TYPE_GC_CONVERTER arv_gc_converter_get_type ARV_GC_CONVERTER_CLASS ARV_IS_GC_CONVERTER_CLASS ARV_GC_CONVERTER_GET_CLASS ArvGcConverterClass
arvstream ArvStream ArvStreamCallbackType ArvStreamCallback ArvStream arv_stream_push_buffer arv_stream_pop_buffer arv_stream_try_pop_buffer arv_stream_timeout_pop_buffer arv_stream_get_n_buffers arv_stream_get_statistics arv_stream_get_emit_signals arv_stream_set_emit_signals arv_make_thread_realtime arv_make_thread_high_priority ARV_STREAM ARV_IS_STREAM ARV_TYPE_STREAM arv_stream_get_type ARV_STREAM_CLASS ARV_IS_STREAM_CLASS ARV_STREAM_GET_CLASS ArvStreamPrivate arv_stream_pop_input_buffer arv_stream_push_output_buffer ArvStreamClass
arvfakedevice ArvFakeDevice ArvFakeDevice arv_fake_device_new ARV_FAKE_DEVICE ARV_IS_FAKE_DEVICE ARV_TYPE_FAKE_DEVICE arv_fake_device_get_type ARV_FAKE_DEVICE_CLASS ARV_IS_FAKE_DEVICE_CLASS ARV_FAKE_DEVICE_GET_CLASS ArvFakeDeviceClass ArvFakeDevicePrivate
arvgc ArvGc ArvGc arv_gc_new arv_gc_get_node arv_gc_get_device arv_gc_get_buffer arv_gc_set_buffer ARV_GC ARV_IS_GC ARV_TYPE_GC arv_gc_get_type ARV_GC_CLASS ARV_IS_GC_CLASS ARV_GC_GET_CLASS ArvGcPrivate ArvGcClass ArvGcNameSpace ArvGcAccessMode ArvGcCachable ArvGcSignedness arv_gc_get_int64_from_value arv_gc_set_int64_to_value arv_gc_get_double_from_value arv_gc_set_double_to_value
arvgvinterface ArvGvInterface ArvGvInterface arv_gv_interface_get_instance ARV_GV_INTERFACE ARV_IS_GV_INTERFACE ARV_TYPE_GV_INTERFACE arv_gv_interface_get_type ARV_GV_INTERFACE_CLASS ARV_IS_GV_INTERFACE_CLASS ARV_GV_INTERFACE_GET_CLASS ARV_GV_INTERFACE_DISCOVERY_TIMEOUT_MS ARV_GV_INTERFACE_SOCKET_BUFFER_SIZE arv_gv_interface_destroy_instance ArvGvInterfacePrivate ArvGvInterfaceClass
arvgvdevice ArvGvDevice ArvGvDevice arv_gv_device_new arv_gv_device_get_timestamp_tick_frequency arv_gv_device_get_device_address arv_gv_device_get_interface_address arv_gv_device_get_packet_size arv_gv_device_set_packet_size arv_gv_device_get_stream_options arv_gv_device_set_stream_options arv_gv_device_auto_packet_size ARV_GV_DEVICE ARV_IS_GV_DEVICE ARV_TYPE_GV_DEVICE arv_gv_device_get_type ARV_GV_DEVICE_CLASS ARV_IS_GV_DEVICE_CLASS ARV_GV_DEVICE_GET_CLASS ARV_GV_DEVICE_GVCP_N_RETRIES_DEFAULT ARV_GV_DEVICE_GVCP_TIMEOUT_MS_DEFAULT ARV_GV_DEVICE_GVSP_PACKET_SIZE_DEFAULT ARV_GV_DEVICE_HEARTBEAT_PERIOD_US ARV_GV_DEVICE_HEARTBEAT_RETRY_DELAY_US ARV_GV_DEVICE_HEARTBEAT_RETRY_TIMEOUT_S ARV_GV_DEVICE_BUFFER_SIZE ArvGvDeviceClass ArvGvDevicePrivate arv_gv_device_get_url_regex
arvgvfakecamera ArvGvFakeCamera arv_gv_fake_camera_new arv_gv_fake_camera_start arv_gv_fake_camera_stop ArvGvFakeCamera ArvGvFakeCameraClass ArvGvFakeCameraPrivate arv_gv_fake_camera_get_type ARV_GV_FAKE_CAMERA ARV_GV_FAKE_CAMERA_CLASS ARV_GV_FAKE_CAMERA_GET_CLASS ARV_IS_GV_FAKE_CAMERA ARV_IS_GV_FAKE_CAMERA_CLASS ARV_TYPE_GV_FAKE_CAMERA
arvgcenumentry ArvGcEnumEntry ArvGcEnumEntry arv_gc_enum_entry_new arv_gc_enum_entry_get_value ARV_GC_ENUM_ENTRY ARV_IS_GC_ENUM_ENTRY ARV_TYPE_GC_ENUM_ENTRY arv_gc_enum_entry_get_type ARV_GC_ENUM_ENTRY_CLASS ARV_IS_GC_ENUM_ENTRY_CLASS ARV_GC_ENUM_ENTRY_GET_CLASS ArvGcEnumEntryClass
arvfakestream ArvFakeStream ArvFakeStream ARV_FAKE_STREAM ARV_IS_FAKE_STREAM ARV_TYPE_FAKE_STREAM arv_fake_stream_get_type ARV_FAKE_STREAM_CLASS ARV_IS_FAKE_STREAM_CLASS ARV_FAKE_STREAM_GET_CLASS ArvFakeStreamPrivate ArvFakeStreamClass arv_fake_stream_new
arvgcboolean ArvGcBoolean ArvGcBoolean arv_gc_boolean_new arv_gc_boolean_get_value arv_gc_boolean_set_value ARV_GC_BOOLEAN ARV_IS_GC_BOOLEAN ARV_TYPE_GC_BOOLEAN arv_gc_boolean_get_type ARV_GC_BOOLEAN_CLASS ARV_IS_GC_BOOLEAN_CLASS ARV_GC_BOOLEAN_GET_CLASS ArvGcBooleanClass
arvgccategory ArvGcCategory ArvGcCategory arv_gc_category_new arv_gc_category_get_features ARV_GC_CATEGORY ARV_IS_GC_CATEGORY ARV_TYPE_GC_CATEGORY arv_gc_category_get_type ARV_GC_CATEGORY_CLASS ARV_IS_GC_CATEGORY_CLASS ARV_GC_CATEGORY_GET_CLASS ArvGcCategoryClass
arvgcfloat ArvGcFloat ArvGcFloat arv_gc_float_get_value arv_gc_float_set_value arv_gc_float_get_min arv_gc_float_get_max arv_gc_float_get_inc arv_gc_float_get_unit arv_gc_float_impose_min arv_gc_float_impose_max ARV_GC_FLOAT ARV_IS_GC_FLOAT ARV_TYPE_GC_FLOAT arv_gc_float_get_type ARV_GC_FLOAT_GET_INTERFACE ArvGcFloatInterface
arvgcswissknife ArvGcSwissKnife ArvGcSwissKnife arv_gc_swiss_knife_new arv_gc_swiss_knife_new_integer ARV_GC_SWISS_KNIFE ARV_IS_GC_SWISS_KNIFE ARV_TYPE_GC_SWISS_KNIFE arv_gc_swiss_knife_get_type ARV_GC_SWISS_KNIFE_CLASS ARV_IS_GC_SWISS_KNIFE_CLASS ARV_GC_SWISS_KNIFE_GET_CLASS ArvGcSwissKnifeClass
arvfakecamera ArvFakeCamera ArvFakeCamera arv_fake_camera_new arv_fake_camera_read_memory arv_fake_camera_write_memory arv_fake_camera_read_register arv_fake_camera_write_register arv_fake_camera_wait_for_next_frame arv_fake_camera_get_sleep_time_for_next_frame arv_fake_camera_fill_buffer arv_fake_camera_set_inet_address arv_fake_camera_get_acquisition_status arv_fake_camera_get_control_channel_privilege arv_fake_camera_get_heartbeat_timeout arv_fake_camera_get_payload arv_fake_camera_get_stream_address arv_fake_camera_set_control_channel_privilege arv_fake_camera_set_fill_pattern arv_fake_camera_set_trigger_frequency arv_fake_device_get_fake_camera arv_set_fake_camera_genicam_filename arv_get_fake_camera_genicam_xml ARV_FAKE_CAMERA ARV_IS_FAKE_CAMERA ARV_TYPE_FAKE_CAMERA arv_fake_camera_get_type ARV_FAKE_CAMERA_CLASS ARV_IS_FAKE_CAMERA_CLASS ARV_FAKE_CAMERA_GET_CLASS ARV_FAKE_CAMERA_MEMORY_SIZE ARV_FAKE_CAMERA_REGISTER_SENSOR_WIDTH ARV_FAKE_CAMERA_REGISTER_SENSOR_HEIGHT ARV_FAKE_CAMERA_REGISTER_WIDTH ARV_FAKE_CAMERA_REGISTER_HEIGHT ARV_FAKE_CAMERA_REGISTER_X_OFFSET ARV_FAKE_CAMERA_REGISTER_Y_OFFSET ARV_FAKE_CAMERA_REGISTER_BINNING_HORIZONTAL ARV_FAKE_CAMERA_REGISTER_BINNING_VERTICAL ARV_FAKE_CAMERA_REGISTER_PIXEL_FORMAT ARV_FAKE_CAMERA_SENSOR_WIDTH ARV_FAKE_CAMERA_SENSOR_HEIGHT ARV_FAKE_CAMERA_WIDTH_DEFAULT ARV_FAKE_CAMERA_HEIGHT_DEFAULT ARV_FAKE_CAMERA_BINNING_HORIZONTAL_DEFAULT ARV_FAKE_CAMERA_BINNING_VERTICAL_DEFAULT ARV_FAKE_CAMERA_PIXEL_FORMAT_DEFAULT ARV_FAKE_CAMERA_REGISTER_ACQUISITION_MODE ARV_FAKE_CAMERA_REGISTER_ACQUISITION_FRAME_PERIOD_US ARV_FAKE_CAMERA_REGISTER_FRAME_START_OFFSET ARV_FAKE_CAMERA_REGISTER_ACQUISITION_START_OFFSET ARV_FAKE_CAMERA_REGISTER_TRIGGER_MODE ARV_FAKE_CAMERA_REGISTER_TRIGGER_SOURCE ARV_FAKE_CAMERA_REGISTER_TRIGGER_ACTIVATION ARV_FAKE_CAMERA_REGISTER_ACQUISITION ARV_FAKE_CAMERA_REGISTER_EXPOSURE_TIME_US ARV_FAKE_CAMERA_ACQUISITION_FRAME_RATE_DEFAULT ARV_FAKE_CAMERA_EXPOSURE_TIME_US_DEFAULT ARV_FAKE_CAMERA_REGISTER_GAIN_RAW ARV_FAKE_CAMERA_REGISTER_GAIN_MODE ARV_FAKE_CAMERA_REGISTER_TEST ARV_FAKE_CAMERA_TEST_REGISTER_DEFAULT ArvFakeCameraClass ArvFakeCameraPrivate ArvFakeCameraFillPattern
arvgcstructentrynode ArvGcStructEntryNode ArvGcStructEntryNode arv_gc_struct_entry_node_new ARV_GC_STRUCT_ENTRY_NODE ARV_GC_STRUCT_ENTRY_NODE_CLASS ARV_GC_STRUCT_ENTRY_NODE_GET_CLASS ARV_IS_GC_STRUCT_ENTRY_NODE ARV_IS_GC_STRUCT_ENTRY_NODE_CLASS ARV_TYPE_GC_STRUCT_ENTRY_NODE arv_gc_struct_entry_node_get_type
arvgcregisternode ArvGcRegisterNode ArvGcSign ArvGcRegisterNode ArvGcRegisterNodeType arv_gc_register_node_new arv_gc_register_node_new_integer arv_gc_register_node_new_masked_integer arv_gc_register_node_new_float arv_gc_register_node_new_string arv_gc_register_node_new_struct_register arv_gc_register_node_get_masked_integer_value arv_gc_register_node_set_masked_integer_value ARV_GC_REGISTER_NODE ARV_IS_GC_REGISTER_NODE ARV_TYPE_GC_REGISTER_NODE arv_gc_register_node_get_type ARV_GC_REGISTER_NODE_CLASS ARV_IS_GC_REGISTER_NODE_CLASS ARV_GC_REGISTER_NODE_GET_CLASS ArvGcRegisterNodeClass
arvgcstring ArvGcString ArvGcString arv_gc_string_get_value arv_gc_string_set_value arv_gc_string_get_max_length ARV_GC_STRING ARV_IS_GC_STRING ARV_TYPE_GC_STRING arv_gc_string_get_type ARV_GC_STRING_GET_INTERFACE ArvGcStringInterface
arvgvstream ArvGvStream ArvGvStreamOption ArvGvStreamSocketBuffer ArvGvStreamPacketResend ArvGvStream arv_gv_stream_get_port arv_gv_stream_get_statistics ARV_GV_STREAM ARV_IS_GV_STREAM ARV_TYPE_GV_STREAM arv_gv_stream_get_type ARV_GV_STREAM_CLASS ARV_IS_GV_STREAM_CLASS ARV_GV_STREAM_GET_CLASS ArvGvStreamClass ArvGvStreamPrivate arv_gv_stream_new
arvgcfloatnode ArvGcFloatNode ArvGcFloatNode arv_gc_float_node_new ARV_GC_FLOAT_NODE ARV_IS_GC_FLOAT_NODE ARV_TYPE_GC_FLOAT_NODE arv_gc_float_node_get_type ARV_GC_FLOAT_NODE_CLASS ARV_IS_GC_FLOAT_NODE_CLASS ARV_GC_FLOAT_NODE_GET_CLASS ArvGcFloatNodeClass
arvgccommand ArvGcCommand ArvGcCommand arv_gc_command_new arv_gc_command_execute ARV_GC_COMMAND ARV_IS_GC_COMMAND ARV_TYPE_GC_COMMAND arv_gc_command_get_type ARV_GC_COMMAND_CLASS ARV_IS_GC_COMMAND_CLASS ARV_GC_COMMAND_GET_CLASS ArvGcCommandClass
arvstatistic ArvStatistic ArvStatistic arv_statistic_new arv_statistic_free arv_statistic_reset arv_statistic_fill arv_statistic_set_name arv_statistic_to_string
arvstr ArvStr arv_str_strip arv_str_is_uri arv_str_to_uri arv_str_parse_double arv_str_parse_double_list arv_str_skip_char arv_str_skip_colon_and_spaces arv_str_skip_comma_and_spaces arv_str_skip_semicolon_and_spaces arv_str_skip_spaces
arvvalue ArvValue arv_value_new_double arv_value_new_int64 arv_value_free arv_value_copy arv_value_set_int64 arv_value_set_double arv_value_get_int64 arv_value_get_double arv_value_holds_int64 arv_value_holds_double ARV_TYPE_VALUE arv_value_get_type ArvValue arv_copy_memory_with_endianess arv_decompress G_DEFINE_INTERFACE G_DEFINE_INTERFACE_WITH_CODE G_IMPLEMENT_INTERFACE arv_g_type_init ARV_DEFINE_STATIC_MUTEX arv_g_mutex_lock arv_g_mutex_unlock arv_g_thread_init arv_g_thread_new g_clear_pointer
arvgst ArvGst arv_pixel_format_to_gst_caps_string arv_pixel_format_from_gst_caps arv_pixel_format_to_gst_0_10_caps_string arv_pixel_format_from_gst_0_10_caps
arvgvcp ArvGvcp ARV_GVCP_PORT ArvGvcpPacketType ArvGvcpCommand ArvGvcpHeader ArvGvcpPacket arv_gvcp_packet_free arv_gvcp_packet_get_packet_type arv_gvcp_packet_get_command arv_gvcp_packet_get_packet_id arv_gvcp_packet_get_read_memory_ack_data arv_gvcp_packet_get_read_memory_ack_size arv_gvcp_packet_get_read_memory_cmd_infos arv_gvcp_packet_get_read_register_ack_value arv_gvcp_packet_get_read_register_cmd_infos arv_gvcp_packet_get_write_memory_ack_size arv_gvcp_packet_get_write_memory_cmd_data arv_gvcp_packet_get_write_memory_cmd_infos arv_gvcp_packet_get_write_register_cmd_infos arv_gvcp_packet_get_pending_ack_timeout arv_gvcp_packet_set_packet_id arv_gvcp_packet_new_read_memory_cmd arv_gvcp_packet_new_read_memory_ack arv_gvcp_packet_new_write_memory_cmd arv_gvcp_packet_new_write_memory_ack arv_gvcp_packet_new_read_register_cmd arv_gvcp_packet_new_read_register_ack arv_gvcp_packet_new_write_register_cmd arv_gvcp_packet_new_write_register_ack arv_gvcp_packet_new_discovery_cmd arv_gvcp_packet_new_discovery_ack arv_gvcp_packet_new_packet_resend_cmd arv_gvcp_packet_to_string arv_gvcp_packet_debug arv_gvcp_next_packet_id ARV_GVBS_CONTROL_CHANNEL_PRIVILEGE_CONTROL ARV_GVBS_CONTROL_CHANNEL_PRIVILEGE_EXCLUSIVE ARV_GVBS_CONTROL_CHANNEL_PRIVILEGE_OFFSET ARV_GVBS_CURRENT_GATEWAY_OFFSET ARV_GVBS_CURRENT_IP_ADDRESS_OFFSET ARV_GVBS_CURRENT_IP_CONFIGURATION_OFFSET ARV_GVBS_CURRENT_SUBNET_MASK_OFFSET ARV_GVBS_DEVICE_LINK_SPEED_0_OFFSET ARV_GVBS_DEVICE_MAC_ADDRESS_HIGH_OFFSET ARV_GVBS_DEVICE_MAC_ADDRESS_LOW_OFFSET ARV_GVBS_DEVICE_MODE_CHARACTER_SET_MASK ARV_GVBS_DEVICE_MODE_CHARACTER_SET_POS ARV_GVBS_DEVICE_MODE_BIG_ENDIAN ARV_GVBS_DEVICE_MODE_OFFSET ARV_GVBS_DEVICE_VERSION_OFFSET ARV_GVBS_GVCP_CAPABILITY_CONCATENATION ARV_GVBS_GVCP_CAPABILITY_EVENT ARV_GVBS_GVCP_CAPABILITY_EVENT_DATA ARV_GVBS_GVCP_CAPABILITY_NAME_REGISTER ARV_GVBS_GVCP_CAPABILITY_OFFSET ARV_GVBS_GVCP_CAPABILITY_PACKET_RESEND ARV_GVBS_GVCP_CAPABILITY_SERIAL_NUMBER ARV_GVBS_GVCP_CAPABILITY_WRITE_MEMORY ARV_GVBS_GVCP_CAPABILITY_ACTION ARV_GVBS_GVCP_CAPABILITY_CCP_APPLICATION_SOCKET ARV_GVBS_GVCP_CAPABILITY_DISCOVERY_ACK_DELAY ARV_GVBS_GVCP_CAPABILITY_DISCOVERY_ACK_DELAY_WRITABLE ARV_GVBS_GVCP_CAPABILITY_EXTENDED_STATUS_CODES ARV_GVBS_GVCP_CAPABILITY_HEARTBEAT_DISABLE ARV_GVBS_GVCP_CAPABILITY_LINK_SPEED ARV_GVBS_GVCP_CAPABILITY_MANIFEST_TABLE ARV_GVBS_GVCP_CAPABILITY_PENDING_ACK ARV_GVBS_GVCP_CAPABILITY_PRIMARY_APPLICATION_SWITCHOVER ARV_GVBS_GVCP_CAPABILITY_TEST_DATA ARV_GVBS_HEARTBEAT_TIMEOUT_OFFSET ARV_GVBS_IP_CONFIGURATION_DHCP ARV_GVBS_IP_CONFIGURATION_LLA ARV_GVBS_IP_CONFIGURATION_PERSISTENT ARV_GVBS_MANUFACTURER_INFORMATIONS_OFFSET ARV_GVBS_MANUFACTURER_INFORMATIONS_SIZE ARV_GVBS_MANUFACTURER_NAME_OFFSET ARV_GVBS_MODEL_NAME_OFFSET ARV_GVBS_N_MESSAGE_CHANNELS_OFFSET ARV_GVBS_N_NETWORK_INTERFACES_OFFSET ARV_GVBS_N_STREAM_CHANNELS_OFFSET ARV_GVBS_PERSISTENT_GATEWAY_0_OFFSET ARV_GVBS_PERSISTENT_IP_ADDRESS_0_OFFSET ARV_GVBS_PERSISTENT_SUBNET_MASK_0_OFFSET ARV_GVBS_SERIAL_NUMBER_OFFSET ARV_GVBS_STREAM_CHANNEL_0_ASSIGNED_BANDWIDTH_OFFSET ARV_GVBS_STREAM_CHANNEL_0_BANDWITDH_RESERVE_ACCUMULATION_MAX_OFFSET ARV_GVBS_STREAM_CHANNEL_0_BANDWITDH_RESERVE_ACCUMULATION_MIN_OFFSET ARV_GVBS_STREAM_CHANNEL_0_BANDWITDH_RESERVE_ACCUMULATION_OFFSET ARV_GVBS_STREAM_CHANNEL_0_BANDWITDH_RESERVE_MAX_OFFSET ARV_GVBS_STREAM_CHANNEL_0_BANDWITDH_RESERVE_MIN_OFFSET ARV_GVBS_STREAM_CHANNEL_0_BANDWITDH_RESERVE_OFFSET ARV_GVBS_STREAM_CHANNEL_0_CURRENT_THOURGHPUT_OFFSET ARV_GVBS_STREAM_CHANNEL_0_FRAME_JITTER_MAX_OFFSET ARV_GVBS_STREAM_CHANNEL_0_FRAME_TRANSMISSION_DELAY_MAX_OFFSET ARV_GVBS_STREAM_CHANNEL_0_FRAME_TRANSMISSION_DELAY_MIN_OFFSET ARV_GVBS_STREAM_CHANNEL_0_FRAME_TRANSMISSION_DELAY_OFFSET ARV_GVBS_STREAM_CHANNEL_0_IP_ADDRESS_OFFSET ARV_GVBS_STREAM_CHANNEL_0_PACKET_BIG_ENDIAN ARV_GVBS_STREAM_CHANNEL_0_PACKET_DELAY_MAX_OFFSET ARV_GVBS_STREAM_CHANNEL_0_PACKET_DELAY_MIN_OFFSET ARV_GVBS_STREAM_CHANNEL_0_PACKET_DELAY_OFFSET ARV_GVBS_STREAM_CHANNEL_0_PACKET_DO_NOT_FRAGMENT ARV_GVBS_STREAM_CHANNEL_0_PACKET_SIZE_FIRE_TEST ARV_GVBS_STREAM_CHANNEL_0_PACKET_SIZE_MASK ARV_GVBS_STREAM_CHANNEL_0_PACKET_SIZE_MAX_OFFSET ARV_GVBS_STREAM_CHANNEL_0_PACKET_SIZE_MIN_OFFSET ARV_GVBS_STREAM_CHANNEL_0_PACKET_SIZE_OFFSET ARV_GVBS_STREAM_CHANNEL_0_PACKET_SIZE_POS ARV_GVBS_STREAM_CHANNEL_0_PORT_OFFSET ARV_GVBS_STREAM_CHANNEL_0_THROUGHPUT_MAX_OFFSET ARV_GVBS_SUPPORTED_IP_CONFIGURATION_OFFSET ARV_GVBS_TIMESTAMP_CONTROL_OFFSET ARV_GVBS_TIMESTAMP_LATCHED_VALUE_HIGH_OFFSET ARV_GVBS_TIMESTAMP_LATCHED_VALUE_LOW_OFFSET ARV_GVBS_TIMESTAMP_TICK_FREQUENCY_HIGH_OFFSET ARV_GVBS_TIMESTAMP_TICK_FREQUENCY_LOW_OFFSET ARV_GVBS_USER_DEFINED_NAME_OFFSET ARV_GVBS_VERSION_MAJOR_MASK ARV_GVBS_VERSION_MAJOR_POS ARV_GVBS_VERSION_MINOR_MASK ARV_GVBS_VERSION_MINOR_POS ARV_GVBS_VERSION_OFFSET ARV_GVBS_XML_URL_0_OFFSET ARV_GVBS_XML_URL_1_OFFSET ARV_GVBS_DEVICE_VERSION_SIZE ARV_GVBS_DISCOVERY_DATA_SIZE ARV_GVBS_MANUFACTURER_NAME_SIZE ARV_GVBS_MODEL_NAME_SIZE ARV_GVBS_SERIAL_NUMBER_SIZE ARV_GVBS_USER_DEFINED_NAME_SIZE ARV_GVBS_XML_URL_SIZE ARV_GVCP_DATA_SIZE_MAX g_ntohl g_ntohs sizeof ARAVIS_PACKED_STRUCTURE
arvuvcp ArvUvcp ArvUvcpCommand ArvUvcpPacket ArvUvcpPacketType arv_uvcp_packet_new_read_memory_cmd arv_uvcp_packet_new_write_memory_cmd arv_uvcp_packet_free arv_uvcp_packet_get_command arv_uvcp_packet_get_packet_id arv_uvcp_packet_set_packet_id arv_uvcp_packet_get_packet_type arv_uvcp_packet_get_pending_ack_timeout arv_uvcp_packet_get_read_memory_ack_data arv_uvcp_packet_get_read_memory_ack_size arv_uvcp_packet_get_write_memory_ack_size arv_uvcp_packet_get_write_memory_cmd_data arv_uvcp_next_packet_id arv_uvcp_packet_debug arv_uvcp_packet_to_string arv_uvcp_command_to_string arv_uvcp_packet_type_to_string ArvUvcpManifestSchemaType arv_uvcp_manifest_entry_get_schema_type ARV_UVCP_MAGIC ARV_UVCP_DEFAULT_RESPONSE_TIME_MS ArvUvcpHeader ArvUvcpManifestEntry ArvUvcpReadMemoryCmd ArvUvcpReadMemoryCmdInfos ArvUvcpWriteMemoryAck ArvUvcpWriteMemoryAckInfos ArvUvcpWriteMemoryCmd ArvUvcpWriteMemoryCmdInfos ArvUvcpPendingAck ArvUvcpPendingAckInfos ARV_ABRM_ACCESS_PRIVILEGE ARV_ABRM_DEVICE_CAPABILITY ARV_ABRM_DEVICE_CONFIGURATION ARV_ABRM_DEVICE_VERSION ARV_ABRM_FAMILY_NAME ARV_ABRM_GENCP_VERSION ARV_ABRM_HEARTBEAT_TIMEOUT ARV_ABRM_IMPLEMENTATION_ENDIANESS ARV_ABRM_MANIFEST_TABLE_ADDRESS ARV_ABRM_MANUFACTURER_INFO ARV_ABRM_MANUFACTURER_NAME ARV_ABRM_MAX_DEVICE_RESPONSE_TIME ARV_ABRM_MESSAGE_CHANNEL_ID ARV_ABRM_MODEL_NAME ARV_ABRM_PROTOCOL_ENDIANESS ARV_ABRM_RESERVED ARV_ABRM_SBRM_ADDRESS ARV_ABRM_SERIAL_NUMBER ARV_ABRM_TIMESTAMP ARV_ABRM_TIMESTAMP_INCREMENT ARV_ABRM_TIMESTAMP_LATCH ARV_ABRM_USER_DEFINED_NAME ARV_SBRM_CURRENT_SPEED ARV_SBRM_EIRM_ADDRESS ARV_SBRM_EIRM_LENGTH ARV_SBRM_IIDC2_ADDRESS ARV_SBRM_MAX_ACK_TRANSFER ARV_SBRM_MAX_CMD_TRANSFER ARV_SBRM_NUM_STREAM_CHANNELS ARV_SBRM_RESERVED ARV_SBRM_SIRM_ADDRESS ARV_SBRM_SIRM_LENGTH ARV_SBRM_U3VCP_CAPABILITY ARV_SBRM_U3VCP_CONFIGURATION ARV_SBRM_U3V_VERSION ARV_SI_CONTROL ARV_SI_INFO ARV_SI_INFO_ALIGNMENT_MASK ARV_SI_INFO_ALIGNMENT_SHIFT ARV_SI_MAX_LEADER_SIZE ARV_SI_MAX_TRAILER_SIZE ARV_SI_PAYLOAD_COUNT ARV_SI_PAYLOAD_SIZE ARV_SI_REQ_LEADER_SIZE ARV_SI_REQ_PAYLOAD_SIZE ARV_SI_REQ_TRAILER_SIZE ARV_SI_TRANSFER1_SIZE ARV_SI_TRANSFER2_SIZE
arvdomtext ArvDomText arv_dom_text_new ArvDomText ArvDomTextClass ARV_DOM_TEXT ARV_IS_DOM_TEXT ARV_TYPE_DOM_TEXT arv_dom_text_get_type ARV_DOM_TEXT_CLASS ARV_IS_DOM_TEXT_CLASS ARV_DOM_TEXT_GET_CLASS
arvdomnode ArvDomNode ArvDomNode arv_dom_node_get_node_name arv_dom_node_get_node_value arv_dom_node_set_node_value arv_dom_node_get_node_type arv_dom_node_get_parent_node arv_dom_node_get_child_nodes arv_dom_node_get_first_child arv_dom_node_get_last_child arv_dom_node_get_previous_sibling arv_dom_node_get_next_sibling arv_dom_node_get_attributes arv_dom_node_insert_before arv_dom_node_replace_child arv_dom_node_append_child arv_dom_node_remove_child arv_dom_node_has_child_nodes arv_dom_node_changed arv_dom_node_get_owner_document ArvDomNodeType ArvDomNodeClass ARV_DOM_NODE ARV_IS_DOM_NODE ARV_TYPE_DOM_NODE arv_dom_node_get_type ARV_DOM_NODE_CLASS ARV_IS_DOM_NODE_CLASS ARV_DOM_NODE_GET_CLASS arv_dom_node_write_to_stream
arvdomnodelist ArvDomNodeList arv_dom_node_list_get_item arv_dom_node_list_get_length arv_dom_node_list_get_type ArvDomNodeList ArvDomNodeListClass ARV_DOM_NODE_LIST ARV_DOM_NODE_LIST_CLASS ARV_DOM_NODE_LIST_GET_CLASS ARV_IS_DOM_NODE_LIST ARV_IS_DOM_NODE_LIST_CLASS ARV_TYPE_DOM_NODE_LIST
arvdomnamednodemap ArvDomNamedNodeMap arv_dom_named_node_map_get_item arv_dom_named_node_map_get_length arv_dom_named_node_map_get_named_item arv_dom_named_node_map_set_named_item arv_dom_named_node_map_remove_named_item ARV_DOM_NAMED_NODE_MAP ARV_DOM_NAMED_NODE_MAP_CLASS ARV_DOM_NAMED_NODE_MAP_GET_CLASS ARV_IS_DOM_NAMED_NODE_MAP ARV_IS_DOM_NAMED_NODE_MAP_CLASS ARV_TYPE_DOM_NAMED_NODE_MAP ArvDomNamedNodeMap ArvDomNamedNodeMapClass arv_dom_named_node_map_get_type
arvdomdocument ArvDomDocument ArvDomDocument ArvDomDocumentCreateFunction arv_dom_implementation_create_document arv_dom_implementation_add_document_type arv_dom_implementation_cleanup arv_dom_document_append_from_memory arv_dom_document_new_from_memory arv_dom_document_new_from_path arv_dom_document_new_from_url arv_dom_document_save_to_stream arv_dom_document_save_to_memory arv_dom_document_save_to_path arv_dom_document_save_to_url arv_dom_document_get_document_element arv_dom_document_create_element arv_dom_document_create_text_node arv_dom_document_get_url arv_dom_document_set_url arv_dom_document_set_path arv_dom_document_get_href_data ArvDomDocumentClass ARV_DOM_DOCUMENT ARV_IS_DOM_DOCUMENT ARV_TYPE_DOM_DOCUMENT arv_dom_document_get_type ARV_DOM_DOCUMENT_CLASS ARV_IS_DOM_DOCUMENT_CLASS ARV_DOM_DOCUMENT_GET_CLASS ArvDomDocumentError
arvdomdocumentfragment ArvDomDocumentFragment arv_dom_document_fragment_new ARV_DOM_DOCUMENT_FRAGMENT ARV_DOM_DOCUMENT_FRAGMENT_CLASS ARV_DOM_DOCUMENT_FRAGMENT_GET_CLASS ARV_IS_DOM_DOCUMENT_FRAGMENT ARV_IS_DOM_DOCUMENT_FRAGMENT_CLASS ARV_TYPE_DOM_DOCUMENT_FRAGMENT ArvDomDocumentFragment ArvDomDocumentFragmentClass arv_dom_document_fragment_get_type
arvdomelement ArvDomElement ArvDomElement arv_dom_element_get_tag_name arv_dom_element_get_attribute arv_dom_element_set_attribute ArvDomElementClass ARV_DOM_ELEMENT ARV_IS_DOM_ELEMENT ARV_TYPE_DOM_ELEMENT arv_dom_element_get_type ARV_DOM_ELEMENT_CLASS ARV_IS_DOM_ELEMENT_CLASS ARV_DOM_ELEMENT_GET_CLASS
arvdomcharacterdata ArvDomCharacterData arv_dom_character_data_get_data arv_dom_character_data_set_data ArvDomCharacterData ArvDomCharacterDataClass ARV_DOM_CHARACTER_DATA ARV_IS_DOM_CHARACTER_DATA ARV_TYPE_DOM_CHARACTER_DATA arv_dom_character_data_get_type ARV_DOM_CHARACTER_DATA_CLASS ARV_IS_DOM_CHARACTER_DATA_CLASS ARV_DOM_CHARACTER_DATA_GET_CLASS
arvdebug ArvDebug arv_debug arv_debug_check arv_debug_enable arv_debug_shutdown ArvDebugLevel ArvDebugCategory arv_debug_category_device arv_debug_category_dom arv_debug_category_evaluator arv_debug_category_genicam arv_debug_category_cp arv_debug_category_sp arv_debug_category_interface arv_debug_category_misc arv_debug_category_stream arv_debug_category_stream_thread arv_debug_category_viewer arv_debug_device arv_debug_dom arv_debug_evaluator arv_debug_genicam arv_debug_cp arv_debug_sp arv_debug_interface arv_debug_misc arv_debug_stream arv_debug_stream_thread arv_debug_viewer arv_log arv_log_device arv_log_dom arv_log_evaluator arv_log_genicam arv_log_cp arv_log_sp arv_log_interface arv_log_misc arv_log_stream arv_log_stream_thread arv_log_viewer arv_warning arv_warning_device arv_warning_dom arv_warning_evaluator arv_warning_genicam arv_warning_cp arv_warning_sp arv_warning_interface arv_warning_misc arv_warning_stream arv_warning_stream_thread arv_warning_viewer arv_g_string_append_hex_dump arv_debug_category_chunk arv_debug_chunk arv_log_chunk arv_warning_chunk
arvgvsp ArvGvsp ArvGvspPayloadType ArvGvspPacketType ArvGvspContentType ArvGvspDataLeader ArvGvspDataTrailer ArvGvspHeader ArvGvspPacket arv_gvsp_packet_to_string arv_gvsp_packet_get_data_size arv_gvsp_packet_get_frame_id arv_gvsp_packet_get_height arv_gvsp_packet_get_packet_id arv_gvsp_packet_get_packet_type arv_gvsp_packet_get_content_type arv_gvsp_packet_get_buffer_payload_type arv_gvsp_packet_get_pixel_format arv_gvsp_packet_get_timestamp arv_gvsp_packet_get_width arv_gvsp_packet_get_x_offset arv_gvsp_packet_get_y_offset arv_gvsp_packet_debug arv_gvsp_packet_new_data_block arv_gvsp_packet_new_data_leader arv_gvsp_packet_new_data_trailer ARV_GVSP_PACKET_INFOS_ID_MASK ARV_GVSP_PACKET_INFOS_CONTENT_TYPE_MASK ARV_GVSP_PACKET_INFOS_CONTENT_TYPE_POS ARV_GVSP_PACKET_PROTOCOL_OVERHEAD
arvuvsp ArvUvsp arv_uvsp_packet_get_frame_id arv_uvsp_packet_get_packet_type arv_uvsp_packet_get_pixel_format arv_uvsp_packet_get_region arv_uvsp_packet_get_timestamp arv_uvsp_packet_debug arv_uvsp_packet_to_string arv_uvsp_packet_get_buffer_payload_type ARV_UVSP_LEADER_MAGIC ARV_UVSP_TRAILER_MAGIC ArvUvspHeader ArvUvspLeader ArvUvspLeaderInfos ArvUvspPacket ArvUvspPacketType ArvUvspPayloadType ArvUvspTrailer ArvUvspTrailerInfos
arvzip ArvZip ArvZip arv_zip_new arv_zip_free arv_zip_get_file arv_zip_get_file_list arv_zip_file_get_name arv_zip_file_get_uncompressed_size ARV_GUINT16_FROM_LE_PTR ARV_GUINT32_FROM_LE_PTR arv_guint16_from_unaligned_le_ptr arv_guint32_from_unaligned_le_ptr ArvZipFile
arvxmlschema ArvXmlSchema arv_xml_schema_new_from_file arv_xml_schema_new_from_path arv_xml_schema_validate arv_xml_schema_get_type ArvXmlSchema ARV_IS_XML_SCHEMA ARV_IS_XML_SCHEMA_CLASS ARV_TYPE_XML_SCHEMA ARV_XML_SCHEMA ARV_XML_SCHEMA_CLASS ARV_XML_SCHEMA_GET_CLASS ArvXmlSchemaError ArvXmlSchemaPrivate
aravis-ARAVIS_0_6_0/docs/reference/aravis/aravis.types000066400000000000000000000020011334570641500227400ustar00rootroot00000000000000arv_buffer_get_type arv_camera_get_type arv_device_get_type arv_chunk_parser_get_type arv_evaluator_get_type arv_fake_camera_get_type arv_fake_device_get_type arv_fake_interface_get_type arv_fake_stream_get_type arv_gc_node_get_type arv_gc_property_node_get_type arv_gc_index_node_get_type arv_gc_invalidator_node_get_type arv_gc_enum_entry_get_type arv_gc_feature_node_get_type arv_gc_register_description_node_get_type arv_gc_group_node_get_type arv_gc_boolean_get_type arv_gc_category_get_type arv_gc_command_get_type arv_gc_converter_get_type arv_gc_enum_entry_get_type arv_gc_enumeration_get_type arv_gc_float_get_type arv_gc_float_node_get_type arv_gc_get_type arv_gc_integer_get_type arv_gc_integer_node_get_type arv_gc_feature_node_get_type arv_gc_port_get_type arv_gc_register_get_type arv_gc_register_node_get_type arv_gc_struct_entry_node_get_type arv_gc_string_get_type arv_gc_swiss_knife_get_type arv_gv_device_get_type arv_gv_interface_get_type arv_gv_stream_get_type arv_interface_get_type arv_stream_get_type aravis-ARAVIS_0_6_0/docs/reference/aravis/meson.build000066400000000000000000000021141334570641500225340ustar00rootroot00000000000000doc_private_headers = [ 'arvenumtypes.h', 'arvconfig.h', 'arvbufferprivate.h', 'arvchunkparserprivate.h', 'arvinterfaceprivate.h', 'arvdeviceprivate.h', 'arvstreamprivate.h', 'arvgvstreamprivate.h', 'arvgvinterfaceprivate.h', 'arvgvdeviceprivate.h', 'arvvvstreamprivate.h', 'arvuvinterfaceprivate.h', 'arvuvdeviceprivate.h', 'arvuvstreamprivate.h', 'arvfakeinterfaceprivate.h', 'arvfakedeviceprivate.h', 'arvfakestreamprivate.h', 'arvrealtimeprivate.h', 'arv.h' ] gnome.gtkdoc ('aravis', main_xml: 'aravis-docs.xml', src_dir: [join_paths (meson.source_root (), 'src'), join_paths (meson.build_root (), 'src')], gobject_typesfile: 'aravis.types', dependencies: [aravis_library_dependencies], scan_args: ['--ignore-headers=' + ' '.join (doc_private_headers), '--rebuild-types'], content_files: ['aravis-overview.xml', 'aravis-gv.xml', '../../../tests/arvexample.c', '../../../tests/arvchunkparsertest.c'], install_dir: 'aravis-@0@'.format (aravis_api_version), install: true) aravis-ARAVIS_0_6_0/gst-0.10/000077500000000000000000000000001334570641500153725ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/gst-0.10/.gitignore000066400000000000000000000000001334570641500173500ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/gst-0.10/Makefile.am000066400000000000000000000016221334570641500174270ustar00rootroot00000000000000include $(top_srcdir)/Makefile.decl AM_CPPFLAGS = \ -I$(top_srcdir)/src/ \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ -DPACKAGE_SRC_DIR=\""$(srcdir)"\" \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" $(ARAVIS_GST_0_10_PLUGIN_CFLAGS) \ -DG_LOG_DOMAIN=\"Aravis\" AM_CFLAGS = -Wall gst010plugin_LTLIBRARIES = libgstaravis.@ARAVIS_API_VERSION@.la libgstaravis_@ARAVIS_API_VERSION@_la_SOURCES = gstaravis.c gstaravis.h libgstaravis_@ARAVIS_API_VERSION@_la_CFLAGS = $(ARAVIS_GST_0_10_PLUGIN_CFLAGS) libgstaravis_@ARAVIS_API_VERSION@_la_LIBADD = \ $(ARAVIS_GST_0_10_PLUGIN_LIBS) \ $(top_builddir)/src/libaravis-@ARAVIS_API_VERSION@.la libgstaravis_@ARAVIS_API_VERSION@_la_LDFLAGS = $(GST_0_10_PLUGIN_LDFLAGS) libgstaravis_@ARAVIS_API_VERSION@_la_LIBTOOLFLAGS = --tag=disable-static libgstaravis_@ARAVIS_API_VERSION@_ladir = $(includedir)/aravis-@ARAVIS_API_VERSION@ noinst_HEADERS = gstaravis.h aravis-ARAVIS_0_6_0/gst-0.10/gst-aravis-inspect000077500000000000000000000002231334570641500210400ustar00rootroot00000000000000#!/bin/sh exec_prefix=`pwd` export PATH=${exec_prefix}/bin:${PATH} gst-inspect-0.10 --gst-plugin-load=../gst-0.10/.libs/libgstaravis.0.6.so $* aravis-ARAVIS_0_6_0/gst-0.10/gst-aravis-launch000077500000000000000000000003201334570641500206430ustar00rootroot00000000000000#!/bin/sh prefix=/home/pacaud/Sources/INSTALL exec_prefix=/home/pacaud/Sources/INSTALL export PATH=${exec_prefix}/bin:${PATH} gst-launch-0.10 --gst-plugin-load=../gst-0.10/.libs/libgstaravis.0.6.so -v $* aravis-ARAVIS_0_6_0/gst-0.10/gstaravis.c000066400000000000000000000564451334570641500175570ustar00rootroot00000000000000/* * Copyright © 2006 Eric Jonas * Copyright © 2006 Antoine Tremblay * Copyright © 2010 United States Government, Joshua M. Doe * Copyright © 2010-2011 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /** * SECTION:element-aravissrc * * Source using the Aravis vision library * * * Example launch line * |[ * gst-launch -v aravissrc ! video/x-raw-yuv,width=512,height=512,framerate=25/1 ! autovideosink * ]| * */ #include #include #include #include #define GST_ARAVIS_DEFAULT_N_BUFFERS 50 #define GST_ARAVIS_BUFFER_TIMEOUT_DEFAULT 2000000 GST_DEBUG_CATEGORY_STATIC (aravis_debug); #define GST_CAT_DEFAULT aravis_debug enum { PROP_0, PROP_CAMERA_NAME, PROP_CAMERA, PROP_GAIN, PROP_GAIN_AUTO, PROP_EXPOSURE, PROP_EXPOSURE_AUTO, PROP_H_BINNING, PROP_V_BINNING, PROP_OFFSET_X, PROP_OFFSET_Y, PROP_PACKET_RESEND, PROP_NUM_BUFFERS }; GST_BOILERPLATE (GstAravis, gst_aravis, GstPushSrc, GST_TYPE_PUSH_SRC); static GstStaticPadTemplate aravis_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("ANY")); static GstCaps * gst_aravis_get_all_camera_caps (GstAravis *gst_aravis) { GstCaps *caps; gint64 *pixel_formats; double min_frame_rate, max_frame_rate; int min_height, min_width; int max_height, max_width; unsigned int n_pixel_formats, i; g_return_val_if_fail (GST_IS_ARAVIS (gst_aravis), NULL); if (!ARV_IS_CAMERA (gst_aravis->camera)) return NULL; GST_LOG_OBJECT (gst_aravis, "Get all camera caps"); arv_camera_get_width_bounds (gst_aravis->camera, &min_width, &max_width); arv_camera_get_height_bounds (gst_aravis->camera, &min_height, &max_height); pixel_formats = arv_camera_get_available_pixel_formats (gst_aravis->camera, &n_pixel_formats); arv_camera_get_frame_rate_bounds (gst_aravis->camera, &min_frame_rate, &max_frame_rate); int min_frame_rate_numerator; int min_frame_rate_denominator; gst_util_double_to_fraction (min_frame_rate, &min_frame_rate_numerator, &min_frame_rate_denominator); int max_frame_rate_numerator; int max_frame_rate_denominator; gst_util_double_to_fraction (max_frame_rate, &max_frame_rate_numerator, &max_frame_rate_denominator); caps = gst_caps_new_empty (); for (i = 0; i < n_pixel_formats; i++) { const char *caps_string; caps_string = arv_pixel_format_to_gst_0_10_caps_string (pixel_formats[i]); if (caps_string != NULL) { GstStructure *structure; structure = gst_structure_from_string (caps_string, NULL); gst_structure_set (structure, "width", GST_TYPE_INT_RANGE, min_width, max_width, "height", GST_TYPE_INT_RANGE, min_height, max_height, "framerate", GST_TYPE_FRACTION_RANGE, min_frame_rate_numerator, min_frame_rate_denominator, max_frame_rate_numerator, max_frame_rate_denominator, NULL); gst_caps_append_structure (caps, structure); } } g_free (pixel_formats); return caps; } static GstCaps * gst_aravis_get_caps (GstBaseSrc * src) { GstAravis* gst_aravis = GST_ARAVIS(src); GstCaps *caps; if (gst_aravis->all_caps != NULL) caps = gst_caps_copy (gst_aravis->all_caps); else caps = gst_caps_new_any (); GST_LOG_OBJECT (gst_aravis, "Available caps = %" GST_PTR_FORMAT, caps); return caps; } static gboolean gst_aravis_set_caps (GstBaseSrc *src, GstCaps *caps) { GstAravis* gst_aravis = GST_ARAVIS(src); GstStructure *structure; ArvPixelFormat pixel_format; int height, width; int bpp = 0, depth = 0; const GValue *frame_rate; const char *caps_string; unsigned int i; guint32 fourcc = 0; GST_LOG_OBJECT (gst_aravis, "Requested caps = %" GST_PTR_FORMAT, caps); arv_camera_stop_acquisition (gst_aravis->camera); if (gst_aravis->stream != NULL) g_object_unref (gst_aravis->stream); structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "width", &width); gst_structure_get_int (structure, "height", &height); frame_rate = gst_structure_get_value (structure, "framerate"); gst_structure_get_int (structure, "bpp", &bpp); gst_structure_get_int (structure, "depth", &depth); if (gst_structure_get_field_type (structure, "format") == G_TYPE_STRING) { const char *string; string = gst_structure_get_string (structure, "format"); fourcc = GST_STR_FOURCC (string); } else if (gst_structure_get_field_type (structure, "format") == GST_TYPE_FOURCC) { gst_structure_get_fourcc (structure, "format", &fourcc); } else fourcc = 0; pixel_format = arv_pixel_format_from_gst_0_10_caps (gst_structure_get_name (structure), bpp, depth, fourcc); arv_camera_set_region (gst_aravis->camera, gst_aravis->offset_x, gst_aravis->offset_y, width, height); arv_camera_set_binning (gst_aravis->camera, gst_aravis->h_binning, gst_aravis->v_binning); arv_camera_set_pixel_format (gst_aravis->camera, pixel_format); if (frame_rate != NULL) { double dbl_frame_rate; dbl_frame_rate = (double) gst_value_get_fraction_numerator (frame_rate) / (double) gst_value_get_fraction_denominator (frame_rate); GST_DEBUG_OBJECT (gst_aravis, "Frame rate = %g Hz", dbl_frame_rate); arv_camera_set_frame_rate (gst_aravis->camera, dbl_frame_rate); if (dbl_frame_rate > 0.0) gst_aravis->buffer_timeout_us = MAX (GST_ARAVIS_BUFFER_TIMEOUT_DEFAULT, 3e6 / dbl_frame_rate); else gst_aravis->buffer_timeout_us = GST_ARAVIS_BUFFER_TIMEOUT_DEFAULT; } else gst_aravis->buffer_timeout_us = GST_ARAVIS_BUFFER_TIMEOUT_DEFAULT; GST_DEBUG_OBJECT (gst_aravis, "Buffer timeout = %" G_GUINT64_FORMAT " µs", gst_aravis->buffer_timeout_us); GST_DEBUG_OBJECT (gst_aravis, "Actual frame rate = %g Hz", arv_camera_get_frame_rate (gst_aravis->camera)); if(gst_aravis->gain_auto) { arv_camera_set_gain_auto (gst_aravis->camera, ARV_AUTO_CONTINUOUS); GST_DEBUG_OBJECT (gst_aravis, "Auto Gain = continuous"); } else { if (gst_aravis->gain >= 0) { GST_DEBUG_OBJECT (gst_aravis, "Gain = %g", gst_aravis->gain); arv_camera_set_gain_auto (gst_aravis->camera, ARV_AUTO_OFF); arv_camera_set_gain (gst_aravis->camera, gst_aravis->gain); } GST_DEBUG_OBJECT (gst_aravis, "Actual gain = %g", arv_camera_get_gain (gst_aravis->camera)); } if(gst_aravis->exposure_auto) { arv_camera_set_exposure_time_auto (gst_aravis->camera, ARV_AUTO_CONTINUOUS); GST_DEBUG_OBJECT (gst_aravis, "Auto Exposure = continuous"); } else { if (gst_aravis->exposure_time_us > 0.0) { GST_DEBUG_OBJECT (gst_aravis, "Exposure = %g µs", gst_aravis->exposure_time_us); arv_camera_set_exposure_time_auto (gst_aravis->camera, ARV_AUTO_OFF); arv_camera_set_exposure_time (gst_aravis->camera, gst_aravis->exposure_time_us); } GST_DEBUG_OBJECT (gst_aravis, "Actual exposure = %g µs", arv_camera_get_exposure_time (gst_aravis->camera)); } if (gst_aravis->fixed_caps != NULL) gst_caps_unref (gst_aravis->fixed_caps); caps_string = arv_pixel_format_to_gst_0_10_caps_string (pixel_format); if (caps_string != NULL) { GstStructure *structure; GstCaps *caps; caps = gst_caps_new_empty (); structure = gst_structure_from_string (caps_string, NULL); gst_structure_set (structure, "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL); if (frame_rate != NULL) gst_structure_set_value (structure, "framerate", frame_rate); gst_caps_append_structure (caps, structure); gst_aravis->fixed_caps = caps; } else gst_aravis->fixed_caps = NULL; gst_aravis->payload = arv_camera_get_payload (gst_aravis->camera); gst_aravis->stream = arv_camera_create_stream (gst_aravis->camera, NULL, NULL); if (ARV_IS_GV_STREAM (gst_aravis->stream) && gst_aravis->packet_resend) g_object_set (gst_aravis->stream, "packet-resend", ARV_GV_STREAM_PACKET_RESEND_ALWAYS, NULL); else g_object_set (gst_aravis->stream, "packet-resend", ARV_GV_STREAM_PACKET_RESEND_NEVER, NULL); for (i = 0; i < gst_aravis->num_buffers; i++) arv_stream_push_buffer (gst_aravis->stream, arv_buffer_new (gst_aravis->payload, NULL)); GST_LOG_OBJECT (gst_aravis, "Start acquisition"); arv_camera_start_acquisition (gst_aravis->camera); gst_aravis->timestamp_offset = 0; gst_aravis->last_timestamp = 0; return TRUE; } void gst_aravis_init_camera (GstAravis *gst_aravis) { if (gst_aravis->camera != NULL) g_object_unref (gst_aravis->camera); gst_aravis->camera = arv_camera_new (gst_aravis->camera_name); gst_aravis->gain = arv_camera_get_gain(gst_aravis->camera); gst_aravis->gain_auto = arv_camera_is_gain_available(gst_aravis->camera); gst_aravis->exposure_time_us = arv_camera_get_exposure_time(gst_aravis->camera); if (arv_camera_get_exposure_time_auto(gst_aravis->camera) == ARV_AUTO_OFF) gst_aravis->exposure_auto = FALSE; else gst_aravis->exposure_auto = TRUE; arv_camera_get_region (gst_aravis->camera, &gst_aravis->offset_x, &gst_aravis->offset_y, NULL, NULL); arv_camera_get_binning (gst_aravis->camera, &gst_aravis->h_binning, &gst_aravis->v_binning); gst_aravis->payload = 0; } static gboolean gst_aravis_start (GstBaseSrc *src) { GstAravis* gst_aravis = GST_ARAVIS(src); GST_LOG_OBJECT (gst_aravis, "Open camera '%s'", gst_aravis->camera_name); if (gst_aravis->camera == NULL) gst_aravis_init_camera (gst_aravis); gst_aravis->all_caps = gst_aravis_get_all_camera_caps (gst_aravis); return TRUE; } gboolean gst_aravis_stop( GstBaseSrc * src ) { GstAravis* gst_aravis = GST_ARAVIS(src); arv_camera_stop_acquisition (gst_aravis->camera); if (gst_aravis->stream != NULL) { g_object_unref (gst_aravis->stream); gst_aravis->stream = NULL; } if (gst_aravis->all_caps != NULL) { gst_caps_unref (gst_aravis->all_caps); gst_aravis->all_caps = NULL; } GST_DEBUG_OBJECT (gst_aravis, "Stop acquisition"); return TRUE; } static void gst_aravis_get_times (GstBaseSrc * basesrc, GstBuffer * buffer, GstClockTime * start, GstClockTime * end) { if (gst_base_src_is_live (basesrc)) { GstClockTime timestamp = GST_BUFFER_TIMESTAMP (buffer); if (GST_CLOCK_TIME_IS_VALID (timestamp)) { GstClockTime duration = GST_BUFFER_DURATION (buffer); if (GST_CLOCK_TIME_IS_VALID (duration)) { *end = timestamp + duration; } *start = timestamp; } } else { *start = -1; *end = -1; } } static GstFlowReturn gst_aravis_create (GstPushSrc * push_src, GstBuffer ** buffer) { GstAravis *gst_aravis; ArvBuffer *arv_buffer; int arv_row_stride; int width, height; char *buffer_data; size_t buffer_size; guint64 timestamp_ns; gst_aravis = GST_ARAVIS (push_src); do { arv_buffer = arv_stream_timeout_pop_buffer (gst_aravis->stream, gst_aravis->buffer_timeout_us); if (arv_buffer != NULL && arv_buffer_get_status (arv_buffer) != ARV_BUFFER_STATUS_SUCCESS) arv_stream_push_buffer (gst_aravis->stream, arv_buffer); } while (arv_buffer != NULL && arv_buffer_get_status (arv_buffer) != ARV_BUFFER_STATUS_SUCCESS); if (arv_buffer == NULL) return GST_FLOW_ERROR; *buffer = gst_buffer_new (); buffer_data = (char *) arv_buffer_get_data (arv_buffer, &buffer_size); arv_buffer_get_image_region (arv_buffer, NULL, NULL, &width, &height); arv_row_stride = width * ARV_PIXEL_FORMAT_BIT_PER_PIXEL (arv_buffer_get_image_pixel_format (arv_buffer)) / 8; timestamp_ns = arv_buffer_get_timestamp (arv_buffer); /* Gstreamer requires row stride to be a multiple of 4 */ if ((arv_row_stride & 0x3) != 0) { int gst_row_stride; size_t size; void *data; int i; gst_row_stride = (arv_row_stride & ~(0x3)) + 4; size = height * gst_row_stride; data = g_malloc (size); for (i = 0; i < height; i++) memcpy (((char *) data) + i * gst_row_stride, buffer_data + i * arv_row_stride, arv_row_stride); GST_BUFFER_DATA (buffer) = data; GST_BUFFER_MALLOCDATA (buffer) = data; GST_BUFFER_SIZE (buffer) = size; } else { GST_BUFFER_DATA (*buffer) = (guint8 *) buffer_data; GST_BUFFER_MALLOCDATA (*buffer) = NULL; GST_BUFFER_SIZE (*buffer) = buffer_size; } if (!gst_base_src_get_do_timestamp(GST_BASE_SRC(push_src))) { if (gst_aravis->timestamp_offset == 0) { gst_aravis->timestamp_offset = timestamp_ns; gst_aravis->last_timestamp = timestamp_ns; } GST_BUFFER_TIMESTAMP (*buffer) = timestamp_ns - gst_aravis->timestamp_offset; GST_BUFFER_DURATION (*buffer) = timestamp_ns - gst_aravis->last_timestamp; gst_aravis->last_timestamp = timestamp_ns; } arv_stream_push_buffer (gst_aravis->stream, arv_buffer); gst_buffer_set_caps (*buffer, gst_aravis->fixed_caps); return GST_FLOW_OK; } static void gst_aravis_fixate_caps (GstPad * pad, GstCaps * caps) { GstAravis *gst_aravis = GST_ARAVIS (gst_pad_get_parent_element (pad)); GstStructure *structure; gint width; gint height; double frame_rate; arv_camera_get_region (gst_aravis->camera, NULL, NULL, &width, &height); frame_rate = arv_camera_get_frame_rate (gst_aravis->camera); structure = gst_caps_get_structure (caps, 0); gst_structure_fixate_field_nearest_int (structure, "width", width); gst_structure_fixate_field_nearest_int (structure, "height", height); gst_structure_fixate_field_nearest_fraction (structure, "framerate", (double) (0.5 + frame_rate), 1); GST_LOG_OBJECT (gst_aravis, "Fixate caps"); g_object_unref (gst_aravis); } static void gst_aravis_init (GstAravis *gst_aravis, GstAravisClass *g_class) { GstPad *pad = GST_BASE_SRC_PAD (gst_aravis); gst_pad_set_fixatecaps_function (pad, gst_aravis_fixate_caps); gst_base_src_set_live (GST_BASE_SRC (gst_aravis), TRUE); gst_base_src_set_format (GST_BASE_SRC (gst_aravis), GST_FORMAT_TIME); gst_aravis->camera_name = NULL; gst_aravis->gain = -1; gst_aravis->gain_auto = FALSE; gst_aravis->exposure_time_us = -1; gst_aravis->exposure_auto = FALSE; gst_aravis->offset_x = 0; gst_aravis->offset_y = 0; gst_aravis->h_binning = -1; gst_aravis->v_binning = -1; gst_aravis->packet_resend = TRUE; gst_aravis->num_buffers = GST_ARAVIS_DEFAULT_N_BUFFERS; gst_aravis->payload = 0; gst_aravis->buffer_timeout_us = GST_ARAVIS_BUFFER_TIMEOUT_DEFAULT; gst_aravis->camera = NULL; gst_aravis->stream = NULL; gst_aravis->all_caps = NULL; gst_aravis->fixed_caps = NULL; } static void gst_aravis_finalize (GObject * object) { GstAravis *gst_aravis = GST_ARAVIS (object); if (gst_aravis->camera != NULL) { g_object_unref (gst_aravis->camera); gst_aravis->camera = NULL; } if (gst_aravis->stream != NULL) { g_object_unref (gst_aravis->stream); gst_aravis->stream = NULL; } if (gst_aravis->all_caps != NULL) { gst_caps_unref (gst_aravis->all_caps); gst_aravis->all_caps = NULL; } if (gst_aravis->fixed_caps != NULL) { gst_caps_unref (gst_aravis->fixed_caps); gst_aravis->fixed_caps = NULL; } g_free (gst_aravis->camera_name); gst_aravis->camera_name = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_aravis_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAravis *gst_aravis = GST_ARAVIS (object); switch (prop_id) { case PROP_CAMERA_NAME: g_free (gst_aravis->camera_name); /* check if we are currently active prevent setting camera and other values to something not representing the active camera */ if (gst_aravis->stream == NULL) { gst_aravis->camera_name = g_strdup (g_value_get_string (value)); gst_aravis_init_camera (gst_aravis); } GST_LOG_OBJECT (gst_aravis, "Set camera name to %s", gst_aravis->camera_name); break; case PROP_GAIN: gst_aravis->gain = g_value_get_double (value); if (gst_aravis->camera != NULL) arv_camera_set_gain (gst_aravis->camera, gst_aravis->gain); break; case PROP_GAIN_AUTO: gst_aravis->gain_auto = g_value_get_boolean (value); if (gst_aravis->camera != NULL) arv_camera_set_gain_auto (gst_aravis->camera, gst_aravis->gain_auto); break; case PROP_EXPOSURE: gst_aravis->exposure_time_us = g_value_get_double (value); if (gst_aravis->camera != NULL) arv_camera_set_exposure_time (gst_aravis->camera, gst_aravis->exposure_time_us); break; case PROP_EXPOSURE_AUTO: gst_aravis->exposure_auto = g_value_get_boolean (value); if (gst_aravis->camera != NULL) arv_camera_set_exposure_time_auto (gst_aravis->camera, gst_aravis->exposure_auto); break; case PROP_OFFSET_X: gst_aravis->offset_x = g_value_get_int (value); break; case PROP_OFFSET_Y: gst_aravis->offset_y = g_value_get_int (value); break; case PROP_H_BINNING: gst_aravis->h_binning = g_value_get_int (value); break; case PROP_V_BINNING: gst_aravis->v_binning = g_value_get_int (value); break; case PROP_PACKET_RESEND: gst_aravis->packet_resend = g_value_get_boolean (value); break; case PROP_NUM_BUFFERS: gst_aravis->num_buffers = g_value_get_int (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_aravis_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAravis *gst_aravis = GST_ARAVIS (object); switch (prop_id) { case PROP_CAMERA_NAME: g_value_set_string (value, gst_aravis->camera_name); break; case PROP_CAMERA: g_value_set_object (value, gst_aravis->camera); break; case PROP_GAIN: g_value_set_double (value, gst_aravis->gain); break; case PROP_GAIN_AUTO: g_value_set_boolean (value, gst_aravis->gain_auto); break; case PROP_EXPOSURE: g_value_set_double (value, gst_aravis->exposure_time_us); break; case PROP_EXPOSURE_AUTO: g_value_set_boolean (value, gst_aravis->exposure_auto); break; case PROP_OFFSET_X: g_value_set_int (value, gst_aravis->offset_x); break; case PROP_OFFSET_Y: g_value_set_int (value, gst_aravis->offset_y); break; case PROP_H_BINNING: g_value_set_int (value, gst_aravis->h_binning); break; case PROP_V_BINNING: g_value_set_int (value, gst_aravis->v_binning); break; case PROP_PACKET_RESEND: g_value_set_boolean (value, gst_aravis->packet_resend); break; case PROP_NUM_BUFFERS: g_value_set_int (value, gst_aravis->num_buffers); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_aravis_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_set_details_simple (element_class, "Aravis Video Source", "Source/Video", "Aravis based source", "Emmanuel Pacaud "); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&aravis_src_template)); } static void gst_aravis_class_init (GstAravisClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstBaseSrcClass *gstbasesrc_class = GST_BASE_SRC_CLASS (klass); GstPushSrcClass *gstpushsrc_class = GST_PUSH_SRC_CLASS (klass); gobject_class->finalize = gst_aravis_finalize; gobject_class->set_property = gst_aravis_set_property; gobject_class->get_property = gst_aravis_get_property; g_object_class_install_property (gobject_class, PROP_CAMERA_NAME, g_param_spec_string ("camera-name", "Camera name", "Name of the camera", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_CAMERA, g_param_spec_object ("camera", "Camera Object", "Camera instance to retrieve additional information", ARV_TYPE_CAMERA, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_GAIN, g_param_spec_double ("gain", "Gain", "Gain (dB)", -1.0, 500.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_GAIN_AUTO, g_param_spec_boolean ("gain-auto", "Auto Gain", "Auto Gain Mode", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_EXPOSURE, g_param_spec_double ("exposure", "Exposure", "Exposure time (µs)", -1, 100000000.0, 500.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_EXPOSURE_AUTO, g_param_spec_boolean ("exposure-auto", "Auto Exposure", "Auto Exposure Mode", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_OFFSET_X, g_param_spec_int ("offset-x", "x Offset", "Offset in x direction", 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_OFFSET_Y, g_param_spec_int ("offset-y", "y Offset", "Offset in y direction", 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_H_BINNING, g_param_spec_int ("h-binning", "Horizontal binning", "CCD horizontal binning", 1, G_MAXINT, 1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_V_BINNING, g_param_spec_int ("v-binning", "Vertical binning", "CCD vertical binning", 1, G_MAXINT, 1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_PACKET_RESEND, g_param_spec_boolean ("packet-resend", "Packet Resend", "Request dropped packets to be reissued by the camera", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_NUM_BUFFERS, g_param_spec_int ("num-buffers", "Number of Buffers", "Number of video buffers to allocate for video frames", 1, G_MAXINT, GST_ARAVIS_DEFAULT_N_BUFFERS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); GST_DEBUG_CATEGORY_INIT (aravis_debug, "aravissrc", 0, "Aravis interface"); gstbasesrc_class->get_caps = gst_aravis_get_caps; gstbasesrc_class->set_caps = gst_aravis_set_caps; gstbasesrc_class->start = gst_aravis_start; gstbasesrc_class->stop = gst_aravis_stop; gstbasesrc_class->get_times = gst_aravis_get_times; gstpushsrc_class->create = gst_aravis_create; } static gboolean plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "aravissrc", GST_RANK_NONE, GST_TYPE_ARAVIS); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "aravis", "Aravis Video Source", plugin_init, VERSION, "LGPL", PACKAGE_NAME, "http://blogs.gnome.org/emmanuel") aravis-ARAVIS_0_6_0/gst-0.10/gstaravis.h000066400000000000000000000042051334570641500175470ustar00rootroot00000000000000/* * Copyright © 2006 Eric Jonas * Copyright © 2006 Antoine Tremblay * Copyright © 2010 United States Government, Joshua M. Doe * Copyright © 2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef ARV_GST_H #define ARV_GST_H #include #include #include G_BEGIN_DECLS #define GST_TYPE_ARAVIS (gst_aravis_get_type()) #define GST_ARAVIS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ARAVIS,GstAravis)) #define GST_ARAVIS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ARAVIS,GstAravis)) #define GST_IS_ARAVIS(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ARAVIS)) #define GST_IS_ARAVIS_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ARAVIS)) typedef struct _GstAravis GstAravis; typedef struct _GstAravisClass GstAravisClass; struct _GstAravis { GstPushSrc element; char *camera_name; double gain; gboolean gain_auto; double exposure_time_us; gboolean exposure_auto; gint offset_x; gint offset_y; gint h_binning; gint v_binning; gboolean packet_resend; gint num_buffers; gint payload; guint64 buffer_timeout_us; ArvCamera *camera; ArvStream *stream; GstCaps *all_caps; GstCaps *fixed_caps; guint64 timestamp_offset; guint64 last_timestamp; }; struct _GstAravisClass { GstPushSrcClass parent_class; }; GType gst_aravis_get_type (void); G_END_DECLS #endif aravis-ARAVIS_0_6_0/gst/000077500000000000000000000000001334570641500150165ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/gst/.gitignore000066400000000000000000000000001334570641500167740ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/gst/Makefile.am000066400000000000000000000015731334570641500170600ustar00rootroot00000000000000include $(top_srcdir)/Makefile.decl AM_CPPFLAGS = \ -I$(top_srcdir)/src/ \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ -DPACKAGE_SRC_DIR=\""$(srcdir)"\" \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" $(ARAVIS_GST_PLUGIN_CFLAGS) \ -DG_LOG_DOMAIN=\"Aravis\" AM_CFLAGS = -Wall gstplugin_LTLIBRARIES = libgstaravis.@ARAVIS_API_VERSION@.la libgstaravis_@ARAVIS_API_VERSION@_la_SOURCES = gstaravis.c gstaravis.h libgstaravis_@ARAVIS_API_VERSION@_la_CFLAGS = $(ARAVIS_GST_PLUGIN_CFLAGS) libgstaravis_@ARAVIS_API_VERSION@_la_LIBADD = \ $(ARAVIS_GST_PLUGIN_LIBS) \ $(top_builddir)/src/libaravis-@ARAVIS_API_VERSION@.la libgstaravis_@ARAVIS_API_VERSION@_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstaravis_@ARAVIS_API_VERSION@_la_LIBTOOLFLAGS = --tag=disable-static libgstaravis_@ARAVIS_API_VERSION@_ladir = $(includedir)/aravis-@ARAVIS_API_VERSION@ noinst_HEADERS = gstaravis.h aravis-ARAVIS_0_6_0/gst/gst-aravis-inspect000077500000000000000000000002151334570641500204650ustar00rootroot00000000000000#!/bin/sh exec_prefix=`pwd` export PATH=${exec_prefix}/bin:${PATH} gst-inspect-1.0 --gst-plugin-load=../gst/.libs/libgstaravis.0.6.so $* aravis-ARAVIS_0_6_0/gst/gst-aravis-launch000077500000000000000000000003121334570641500202700ustar00rootroot00000000000000#!/bin/sh prefix=/home/pacaud/Sources/INSTALL exec_prefix=/home/pacaud/Sources/INSTALL export PATH=${exec_prefix}/bin:${PATH} gst-launch-1.0 --gst-plugin-load=../gst/.libs/libgstaravis.0.6.so -v $* aravis-ARAVIS_0_6_0/gst/gstaravis.c000066400000000000000000000556501334570641500172000ustar00rootroot00000000000000/* * Copyright © 2006 Eric Jonas * Copyright © 2006 Antoine Tremblay * Copyright © 2010 United States Government, Joshua M. Doe * Copyright © 2010-2011 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ /** * SECTION:element-aravissrc * * Source using the Aravis vision library * * * Example launch line * |[ * gst-launch -v aravissrc ! video/x-raw,format=UYVY,width=512,height=512,framerate=25/1 ! autovideosink * ]| * */ #include #include #include #include #define GST_ARAVIS_DEFAULT_N_BUFFERS 50 #define GST_ARAVIS_BUFFER_TIMEOUT_DEFAULT 2000000 GST_DEBUG_CATEGORY_STATIC (aravis_debug); #define GST_CAT_DEFAULT aravis_debug enum { PROP_0, PROP_CAMERA_NAME, PROP_CAMERA, PROP_GAIN, PROP_GAIN_AUTO, PROP_EXPOSURE, PROP_EXPOSURE_AUTO, PROP_H_BINNING, PROP_V_BINNING, PROP_OFFSET_X, PROP_OFFSET_Y, PROP_PACKET_RESEND, PROP_NUM_BUFFERS }; G_DEFINE_TYPE (GstAravis, gst_aravis, GST_TYPE_PUSH_SRC); static GstStaticPadTemplate aravis_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("ANY")); static GstCaps * gst_aravis_get_all_camera_caps (GstAravis *gst_aravis) { GstCaps *caps; gint64 *pixel_formats; double min_frame_rate, max_frame_rate; int min_height, min_width; int max_height, max_width; unsigned int n_pixel_formats, i; g_return_val_if_fail (GST_IS_ARAVIS (gst_aravis), NULL); if (!ARV_IS_CAMERA (gst_aravis->camera)) return NULL; GST_LOG_OBJECT (gst_aravis, "Get all camera caps"); arv_camera_get_width_bounds (gst_aravis->camera, &min_width, &max_width); arv_camera_get_height_bounds (gst_aravis->camera, &min_height, &max_height); pixel_formats = arv_camera_get_available_pixel_formats (gst_aravis->camera, &n_pixel_formats); arv_camera_get_frame_rate_bounds (gst_aravis->camera, &min_frame_rate, &max_frame_rate); int min_frame_rate_numerator; int min_frame_rate_denominator; gst_util_double_to_fraction (min_frame_rate, &min_frame_rate_numerator, &min_frame_rate_denominator); int max_frame_rate_numerator; int max_frame_rate_denominator; gst_util_double_to_fraction (max_frame_rate, &max_frame_rate_numerator, &max_frame_rate_denominator); caps = gst_caps_new_empty (); for (i = 0; i < n_pixel_formats; i++) { const char *caps_string; caps_string = arv_pixel_format_to_gst_caps_string (pixel_formats[i]); if (caps_string != NULL) { GstStructure *structure; structure = gst_structure_from_string (caps_string, NULL); gst_structure_set (structure, "width", GST_TYPE_INT_RANGE, min_width, max_width, "height", GST_TYPE_INT_RANGE, min_height, max_height, "framerate", GST_TYPE_FRACTION_RANGE, min_frame_rate_numerator, min_frame_rate_denominator, max_frame_rate_numerator, max_frame_rate_denominator, NULL); gst_caps_append_structure (caps, structure); } } g_free (pixel_formats); return caps; } static GstCaps * gst_aravis_get_caps (GstBaseSrc * src, GstCaps * filter) { GstAravis* gst_aravis = GST_ARAVIS(src); GstCaps *caps; if (gst_aravis->all_caps != NULL) caps = gst_caps_copy (gst_aravis->all_caps); else caps = gst_caps_new_any (); GST_LOG_OBJECT (gst_aravis, "Available caps = %" GST_PTR_FORMAT, caps); return caps; } static gboolean gst_aravis_set_caps (GstBaseSrc *src, GstCaps *caps) { GstAravis* gst_aravis = GST_ARAVIS(src); GstStructure *structure; ArvPixelFormat pixel_format; int height, width; int depth = 0, bpp = 0; const GValue *frame_rate; const char *caps_string; const char *format_string; unsigned int i; GST_LOG_OBJECT (gst_aravis, "Requested caps = %" GST_PTR_FORMAT, caps); arv_camera_stop_acquisition (gst_aravis->camera); if (gst_aravis->stream != NULL) g_object_unref (gst_aravis->stream); structure = gst_caps_get_structure (caps, 0); arv_camera_get_region (gst_aravis->camera, NULL, NULL, &width, &height); gst_structure_get_int (structure, "width", &width); gst_structure_get_int (structure, "height", &height); gst_structure_get_int (structure, "depth", &depth); gst_structure_get_int (structure, "bpp", &bpp); frame_rate = gst_structure_get_value (structure, "framerate"); format_string = gst_structure_get_string (structure, "format"); pixel_format = arv_pixel_format_from_gst_caps (gst_structure_get_name (structure), format_string, bpp, depth); arv_camera_set_region (gst_aravis->camera, gst_aravis->offset_x, gst_aravis->offset_y, width, height); arv_camera_set_binning (gst_aravis->camera, gst_aravis->h_binning, gst_aravis->v_binning); arv_camera_set_pixel_format (gst_aravis->camera, pixel_format); if (frame_rate != NULL) { double dbl_frame_rate; dbl_frame_rate = (double) gst_value_get_fraction_numerator (frame_rate) / (double) gst_value_get_fraction_denominator (frame_rate); GST_DEBUG_OBJECT (gst_aravis, "Frame rate = %g Hz", dbl_frame_rate); arv_camera_set_frame_rate (gst_aravis->camera, dbl_frame_rate); if (dbl_frame_rate > 0.0) gst_aravis->buffer_timeout_us = MAX (GST_ARAVIS_BUFFER_TIMEOUT_DEFAULT, 3e6 / dbl_frame_rate); else gst_aravis->buffer_timeout_us = GST_ARAVIS_BUFFER_TIMEOUT_DEFAULT; } else gst_aravis->buffer_timeout_us = GST_ARAVIS_BUFFER_TIMEOUT_DEFAULT; GST_DEBUG_OBJECT (gst_aravis, "Buffer timeout = %" G_GUINT64_FORMAT " µs", gst_aravis->buffer_timeout_us); GST_DEBUG_OBJECT (gst_aravis, "Actual frame rate = %g Hz", arv_camera_get_frame_rate (gst_aravis->camera)); if(gst_aravis->gain_auto) { arv_camera_set_gain_auto (gst_aravis->camera, ARV_AUTO_CONTINUOUS); GST_DEBUG_OBJECT (gst_aravis, "Auto Gain = continuous"); } else { if (gst_aravis->gain >= 0) { GST_DEBUG_OBJECT (gst_aravis, "Gain = %g", gst_aravis->gain); arv_camera_set_gain_auto (gst_aravis->camera, ARV_AUTO_OFF); arv_camera_set_gain (gst_aravis->camera, gst_aravis->gain); } GST_DEBUG_OBJECT (gst_aravis, "Actual gain = %g", arv_camera_get_gain (gst_aravis->camera)); } if(gst_aravis->exposure_auto) { arv_camera_set_exposure_time_auto (gst_aravis->camera, ARV_AUTO_CONTINUOUS); GST_DEBUG_OBJECT (gst_aravis, "Auto Exposure = continuous"); } else { if (gst_aravis->exposure_time_us > 0.0) { GST_DEBUG_OBJECT (gst_aravis, "Exposure = %g µs", gst_aravis->exposure_time_us); arv_camera_set_exposure_time_auto (gst_aravis->camera, ARV_AUTO_OFF); arv_camera_set_exposure_time (gst_aravis->camera, gst_aravis->exposure_time_us); } GST_DEBUG_OBJECT (gst_aravis, "Actual exposure = %g µs", arv_camera_get_exposure_time (gst_aravis->camera)); } if (gst_aravis->fixed_caps != NULL) gst_caps_unref (gst_aravis->fixed_caps); caps_string = arv_pixel_format_to_gst_caps_string (pixel_format); if (caps_string != NULL) { GstStructure *structure; GstCaps *caps; caps = gst_caps_new_empty (); structure = gst_structure_from_string (caps_string, NULL); gst_structure_set (structure, "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL); if (frame_rate != NULL) gst_structure_set_value (structure, "framerate", frame_rate); gst_caps_append_structure (caps, structure); gst_aravis->fixed_caps = caps; } else gst_aravis->fixed_caps = NULL; gst_aravis->payload = arv_camera_get_payload (gst_aravis->camera); gst_aravis->stream = arv_camera_create_stream (gst_aravis->camera, NULL, NULL); if (ARV_IS_GV_STREAM (gst_aravis->stream) && gst_aravis->packet_resend) g_object_set (gst_aravis->stream, "packet-resend", ARV_GV_STREAM_PACKET_RESEND_ALWAYS, NULL); else g_object_set (gst_aravis->stream, "packet-resend", ARV_GV_STREAM_PACKET_RESEND_NEVER, NULL); for (i = 0; i < gst_aravis->num_buffers; i++) arv_stream_push_buffer (gst_aravis->stream, arv_buffer_new (gst_aravis->payload, NULL)); GST_LOG_OBJECT (gst_aravis, "Start acquisition"); arv_camera_start_acquisition (gst_aravis->camera); gst_aravis->timestamp_offset = 0; gst_aravis->last_timestamp = 0; return TRUE; } void gst_aravis_init_camera (GstAravis *gst_aravis) { if (gst_aravis->camera != NULL) g_object_unref (gst_aravis->camera); gst_aravis->camera = arv_camera_new (gst_aravis->camera_name); gst_aravis->gain = arv_camera_get_gain(gst_aravis->camera); gst_aravis->gain_auto = arv_camera_is_gain_available(gst_aravis->camera); gst_aravis->exposure_time_us = arv_camera_get_exposure_time(gst_aravis->camera); if (arv_camera_get_exposure_time_auto(gst_aravis->camera) == ARV_AUTO_OFF) gst_aravis->exposure_auto = FALSE; else gst_aravis->exposure_auto = TRUE; arv_camera_get_region (gst_aravis->camera, &gst_aravis->offset_x, &gst_aravis->offset_y, NULL, NULL); arv_camera_get_binning (gst_aravis->camera, &gst_aravis->h_binning, &gst_aravis->v_binning); gst_aravis->payload = 0; } static gboolean gst_aravis_start (GstBaseSrc *src) { GstAravis* gst_aravis = GST_ARAVIS(src); GST_LOG_OBJECT (gst_aravis, "Open camera '%s'", gst_aravis->camera_name); if (gst_aravis->camera == NULL) gst_aravis_init_camera (gst_aravis); gst_aravis->all_caps = gst_aravis_get_all_camera_caps (gst_aravis); return TRUE; } gboolean gst_aravis_stop( GstBaseSrc * src ) { GstAravis* gst_aravis = GST_ARAVIS(src); arv_camera_stop_acquisition (gst_aravis->camera); if (gst_aravis->stream != NULL) { g_object_unref (gst_aravis->stream); gst_aravis->stream = NULL; } if (gst_aravis->all_caps != NULL) { gst_caps_unref (gst_aravis->all_caps); gst_aravis->all_caps = NULL; } GST_DEBUG_OBJECT (gst_aravis, "Stop acquisition"); return TRUE; } static void gst_aravis_get_times (GstBaseSrc * basesrc, GstBuffer * buffer, GstClockTime * start, GstClockTime * end) { if (gst_base_src_is_live (basesrc)) { GstClockTime timestamp = GST_BUFFER_PTS (buffer); if (GST_CLOCK_TIME_IS_VALID (timestamp)) { GstClockTime duration = GST_BUFFER_DURATION (buffer); if (GST_CLOCK_TIME_IS_VALID (duration)) { *end = timestamp + duration; } *start = timestamp; } } else { *start = -1; *end = -1; } } static GstFlowReturn gst_aravis_create (GstPushSrc * push_src, GstBuffer ** buffer) { GstAravis *gst_aravis; ArvBuffer *arv_buffer; int arv_row_stride; int width, height; char *buffer_data; size_t buffer_size; guint64 timestamp_ns; gst_aravis = GST_ARAVIS (push_src); do { arv_buffer = arv_stream_timeout_pop_buffer (gst_aravis->stream, gst_aravis->buffer_timeout_us); if (arv_buffer != NULL && arv_buffer_get_status (arv_buffer) != ARV_BUFFER_STATUS_SUCCESS) arv_stream_push_buffer (gst_aravis->stream, arv_buffer); } while (arv_buffer != NULL && arv_buffer_get_status (arv_buffer) != ARV_BUFFER_STATUS_SUCCESS); if (arv_buffer == NULL) return GST_FLOW_ERROR; buffer_data = (char *) arv_buffer_get_data (arv_buffer, &buffer_size); arv_buffer_get_image_region (arv_buffer, NULL, NULL, &width, &height); arv_row_stride = width * ARV_PIXEL_FORMAT_BIT_PER_PIXEL (arv_buffer_get_image_pixel_format (arv_buffer)) / 8; timestamp_ns = arv_buffer_get_timestamp (arv_buffer); /* Gstreamer requires row stride to be a multiple of 4 */ if ((arv_row_stride & 0x3) != 0) { int gst_row_stride; size_t size; void *data; int i; gst_row_stride = (arv_row_stride & ~(0x3)) + 4; size = height * gst_row_stride; data = g_malloc (size); for (i = 0; i < height; i++) memcpy (((char *) data) + i * gst_row_stride, buffer_data + i * arv_row_stride, arv_row_stride); *buffer = gst_buffer_new_wrapped (data, size); } else { *buffer = gst_buffer_new_wrapped_full (0, buffer_data, buffer_size, 0, buffer_size, NULL, NULL); } if (!gst_base_src_get_do_timestamp(GST_BASE_SRC(push_src))) { if (gst_aravis->timestamp_offset == 0) { gst_aravis->timestamp_offset = timestamp_ns; gst_aravis->last_timestamp = timestamp_ns; } GST_BUFFER_PTS (*buffer) = timestamp_ns - gst_aravis->timestamp_offset; GST_BUFFER_DURATION (*buffer) = timestamp_ns - gst_aravis->last_timestamp; gst_aravis->last_timestamp = timestamp_ns; } arv_stream_push_buffer (gst_aravis->stream, arv_buffer); return GST_FLOW_OK; } static GstCaps * gst_aravis_fixate_caps (GstBaseSrc * bsrc, GstCaps * caps) { GstAravis *gst_aravis = GST_ARAVIS (bsrc); GstStructure *structure; gint width; gint height; double frame_rate; arv_camera_get_region (gst_aravis->camera, NULL, NULL, &width, &height); frame_rate = arv_camera_get_frame_rate (gst_aravis->camera); structure = gst_caps_get_structure (caps, 0); gst_structure_fixate_field_nearest_int (structure, "width", width); gst_structure_fixate_field_nearest_int (structure, "height", height); gst_structure_fixate_field_nearest_fraction (structure, "framerate", (double) (0.5 + frame_rate), 1); GST_LOG_OBJECT (gst_aravis, "Fixate caps"); return GST_BASE_SRC_CLASS(gst_aravis_parent_class)->fixate(bsrc, caps); } static void gst_aravis_init (GstAravis *gst_aravis) { gst_base_src_set_live (GST_BASE_SRC (gst_aravis), TRUE); gst_base_src_set_format (GST_BASE_SRC (gst_aravis), GST_FORMAT_TIME); gst_aravis->camera_name = NULL; gst_aravis->gain = -1; gst_aravis->gain_auto = FALSE; gst_aravis->exposure_time_us = -1; gst_aravis->exposure_auto = FALSE; gst_aravis->offset_x = 0; gst_aravis->offset_y = 0; gst_aravis->h_binning = -1; gst_aravis->v_binning = -1; gst_aravis->packet_resend = TRUE; gst_aravis->num_buffers = GST_ARAVIS_DEFAULT_N_BUFFERS; gst_aravis->payload = 0; gst_aravis->buffer_timeout_us = GST_ARAVIS_BUFFER_TIMEOUT_DEFAULT; gst_aravis->camera = NULL; gst_aravis->stream = NULL; gst_aravis->all_caps = NULL; gst_aravis->fixed_caps = NULL; } static void gst_aravis_finalize (GObject * object) { GstAravis *gst_aravis = GST_ARAVIS (object); if (gst_aravis->camera != NULL) { g_object_unref (gst_aravis->camera); gst_aravis->camera = NULL; } if (gst_aravis->stream != NULL) { g_object_unref (gst_aravis->stream); gst_aravis->stream = NULL; } if (gst_aravis->all_caps != NULL) { gst_caps_unref (gst_aravis->all_caps); gst_aravis->all_caps = NULL; } if (gst_aravis->fixed_caps != NULL) { gst_caps_unref (gst_aravis->fixed_caps); gst_aravis->fixed_caps = NULL; } g_free (gst_aravis->camera_name); gst_aravis->camera_name = NULL; G_OBJECT_CLASS (gst_aravis_parent_class)->finalize (object); } static void gst_aravis_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstAravis *gst_aravis = GST_ARAVIS (object); switch (prop_id) { case PROP_CAMERA_NAME: g_free (gst_aravis->camera_name); /* check if we are currently active prevent setting camera and other values to something not representing the active camera */ if (gst_aravis->stream == NULL) { gst_aravis->camera_name = g_strdup (g_value_get_string (value)); gst_aravis_init_camera (gst_aravis); } GST_LOG_OBJECT (gst_aravis, "Set camera name to %s", gst_aravis->camera_name); break; case PROP_GAIN: gst_aravis->gain = g_value_get_double (value); if (gst_aravis->camera != NULL) arv_camera_set_gain (gst_aravis->camera, gst_aravis->gain); break; case PROP_GAIN_AUTO: gst_aravis->gain_auto = g_value_get_boolean (value); if (gst_aravis->camera != NULL) arv_camera_set_gain_auto (gst_aravis->camera, gst_aravis->gain_auto); break; case PROP_EXPOSURE: gst_aravis->exposure_time_us = g_value_get_double (value); if (gst_aravis->camera != NULL) arv_camera_set_exposure_time (gst_aravis->camera, gst_aravis->exposure_time_us); break; case PROP_EXPOSURE_AUTO: gst_aravis->exposure_auto = g_value_get_boolean (value); if (gst_aravis->camera != NULL) arv_camera_set_exposure_time_auto (gst_aravis->camera, gst_aravis->exposure_auto); break; case PROP_OFFSET_X: gst_aravis->offset_x = g_value_get_int (value); break; case PROP_OFFSET_Y: gst_aravis->offset_y = g_value_get_int (value); break; case PROP_H_BINNING: gst_aravis->h_binning = g_value_get_int (value); break; case PROP_V_BINNING: gst_aravis->v_binning = g_value_get_int (value); break; case PROP_PACKET_RESEND: gst_aravis->packet_resend = g_value_get_boolean (value); break; case PROP_NUM_BUFFERS: gst_aravis->num_buffers = g_value_get_int (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_aravis_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstAravis *gst_aravis = GST_ARAVIS (object); switch (prop_id) { case PROP_CAMERA_NAME: g_value_set_string (value, gst_aravis->camera_name); break; case PROP_CAMERA: g_value_set_object (value, gst_aravis->camera); break; case PROP_GAIN: g_value_set_double (value, gst_aravis->gain); break; case PROP_GAIN_AUTO: g_value_set_boolean (value, gst_aravis->gain_auto); break; case PROP_EXPOSURE: g_value_set_double (value, gst_aravis->exposure_time_us); break; case PROP_EXPOSURE_AUTO: g_value_set_boolean (value, gst_aravis->exposure_auto); break; case PROP_OFFSET_X: g_value_set_int (value, gst_aravis->offset_x); break; case PROP_OFFSET_Y: g_value_set_int (value, gst_aravis->offset_y); break; case PROP_H_BINNING: g_value_set_int (value, gst_aravis->h_binning); break; case PROP_V_BINNING: g_value_set_int (value, gst_aravis->v_binning); break; case PROP_PACKET_RESEND: g_value_set_boolean (value, gst_aravis->packet_resend); break; case PROP_NUM_BUFFERS: g_value_set_int (value, gst_aravis->num_buffers); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_aravis_class_init (GstAravisClass * klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstBaseSrcClass *gstbasesrc_class = GST_BASE_SRC_CLASS (klass); GstPushSrcClass *gstpushsrc_class = GST_PUSH_SRC_CLASS (klass); gobject_class->finalize = gst_aravis_finalize; gobject_class->set_property = gst_aravis_set_property; gobject_class->get_property = gst_aravis_get_property; g_object_class_install_property (gobject_class, PROP_CAMERA_NAME, g_param_spec_string ("camera-name", "Camera name", "Name of the camera", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_CAMERA, g_param_spec_object ("camera", "Camera Object", "Camera instance to retrieve additional information", ARV_TYPE_CAMERA, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_GAIN, g_param_spec_double ("gain", "Gain", "Gain (dB)", -1.0, 500.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_GAIN_AUTO, g_param_spec_boolean ("gain-auto", "Auto Gain", "Auto Gain Mode", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_EXPOSURE, g_param_spec_double ("exposure", "Exposure", "Exposure time (µs)", -1, 100000000.0, 500.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_EXPOSURE_AUTO, g_param_spec_boolean ("exposure-auto", "Auto Exposure", "Auto Exposure Mode", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_OFFSET_X, g_param_spec_int ("offset-x", "x Offset", "Offset in x direction", 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_OFFSET_Y, g_param_spec_int ("offset-y", "y Offset", "Offset in y direction", 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_H_BINNING, g_param_spec_int ("h-binning", "Horizontal binning", "CCD horizontal binning", 1, G_MAXINT, 1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_V_BINNING, g_param_spec_int ("v-binning", "Vertical binning", "CCD vertical binning", 1, G_MAXINT, 1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_PACKET_RESEND, g_param_spec_boolean ("packet-resend", "Packet Resend", "Request dropped packets to be reissued by the camera", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_NUM_BUFFERS, g_param_spec_int ("num-buffers", "Number of Buffers", "Number of video buffers to allocate for video frames", 1, G_MAXINT, GST_ARAVIS_DEFAULT_N_BUFFERS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); GST_DEBUG_CATEGORY_INIT (aravis_debug, "aravissrc", 0, "Aravis interface"); gst_element_class_set_details_simple (element_class, "Aravis Video Source", "Source/Video", "Aravis based source", "Emmanuel Pacaud "); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&aravis_src_template)); gstbasesrc_class->get_caps = gst_aravis_get_caps; gstbasesrc_class->set_caps = gst_aravis_set_caps; gstbasesrc_class->fixate = gst_aravis_fixate_caps; gstbasesrc_class->start = gst_aravis_start; gstbasesrc_class->stop = gst_aravis_stop; gstbasesrc_class->get_times = gst_aravis_get_times; gstpushsrc_class->create = gst_aravis_create; } static gboolean plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "aravissrc", GST_RANK_NONE, GST_TYPE_ARAVIS); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, aravis, "Aravis Video Source", plugin_init, VERSION, "LGPL", PACKAGE_NAME, "http://blogs.gnome.org/emmanuel") aravis-ARAVIS_0_6_0/gst/gstaravis.h000066400000000000000000000042141334570641500171730ustar00rootroot00000000000000/* * Copyright © 2006 Eric Jonas * Copyright © 2006 Antoine Tremblay * Copyright © 2010 United States Government, Joshua M. Doe * Copyright © 2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef ARV_GST_H #define ARV_GST_H #include #include #include G_BEGIN_DECLS #define GST_TYPE_ARAVIS (gst_aravis_get_type()) #define GST_ARAVIS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ARAVIS,GstAravis)) #define GST_ARAVIS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ARAVIS,GstAravis)) #define GST_IS_ARAVIS(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ARAVIS)) #define GST_IS_ARAVIS_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ARAVIS)) typedef struct _GstAravis GstAravis; typedef struct _GstAravisClass GstAravisClass; struct _GstAravis { GstPushSrc element; char *camera_name; double gain; gboolean gain_auto; double exposure_time_us; gboolean exposure_auto; gint offset_x; gint offset_y; gint h_binning; gint v_binning; gboolean packet_resend; gint num_buffers; gint payload; guint64 buffer_timeout_us; ArvCamera *camera; ArvStream *stream; GstCaps *all_caps; GstCaps *fixed_caps; guint64 timestamp_offset; guint64 last_timestamp; }; struct _GstAravisClass { GstPushSrcClass parent_class; }; GType gst_aravis_get_type (void); G_END_DECLS #endif aravis-ARAVIS_0_6_0/gst/meson.build000066400000000000000000000006451334570641500171650ustar00rootroot00000000000000gst_sources = [ 'gstaravis.c' ] gst_headers = [ 'gstaravis.h' ] gst_c_args = [ '-DPACKAGE_LOCALE_DIR=@0@'.format(get_option ('prefix')), '-DG_LOG_DOMAIN="Aravis"' ] gst_plugin = shared_library ('gstplugin', gst_sources, gst_headers, link_with: aravis_library, c_args: gst_c_args, include_directories: [configuration_inc, library_inc], dependencies: gst_plugin_dependencies) aravis-ARAVIS_0_6_0/gst/pipelines.md000066400000000000000000000003131334570641500173250ustar00rootroot00000000000000Simple ====== ./gst-aravis-launch aravissrc ! videoconvert ! xvimagesink Format filter ============= ./gst-aravis-launch aravissrc ! video/x-raw,format=GRAY16_LE,depth=12 ! videoconvert ! xvimagesink aravis-ARAVIS_0_6_0/m4/000077500000000000000000000000001334570641500145415ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/m4/.gitignore000066400000000000000000000000001334570641500165170ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/m4/appstream-xml.m4000066400000000000000000000057031334570641500176020ustar00rootroot00000000000000# appstream-xml.m4 # # serial 6 dnl APPSTREAM_XML dnl Installs and validates AppData XML files. dnl dnl Call APPSTREAM_XML in configure.ac to check for the appstream-util tool. dnl Add @APPSTREAM_XML_RULES@ to a Makefile.am to substitute the make rules. Add dnl .appdata.xml files to appstream_XML in Makefile.am and they will be validated dnl at make check time, if appstream-util is installed, as well as installed dnl to the correct location automatically. Add --enable-appstream-util to dnl AM_DISTCHECK_CONFIGURE_FLAGS in Makefile.am to require valid AppData XML when dnl doing a distcheck. dnl dnl Adding files to appstream_XML does not distribute them automatically. AC_DEFUN([APPSTREAM_XML], [ m4_pattern_allow([AM_V_GEN]) AC_ARG_ENABLE([appstream-util], [AS_HELP_STRING([--disable-appstream-util], [Disable validating AppData XML files during check phase])]) AS_IF([test "x$enable_appstream_validate" != "xno"], [AC_PATH_PROG([APPSTREAM_UTIL], [appstream-util]) AS_IF([test "x$APPSTREAM_UTIL" = "x"], [have_appstream_validate=no], [have_appstream_validate=yes AC_SUBST([APPSTREAM_UTIL])])], [have_appstream_validate=no]) AS_IF([test "x$have_appstream_validate" != "xno"], [appstream_validate=yes], [appstream_validate=no AS_IF([test "x$enable_appstream_validate" = "xyes"], [AC_MSG_ERROR([AppData validation was requested but appstream-util was not found])])]) AC_SUBST([appstreamxmldir], [${datadir}/appdata]) APPSTREAM_XML_RULES=' .PHONY : uninstall-appstream-xml install-appstream-xml clean-appstream-xml mostlyclean-am: clean-appstream-xml %.appdata.valid: %.appdata.xml $(AM_V_GEN) if test -f "$<"; then d=; else d="$(srcdir)/"; fi; \ if test -n "$(APPSTREAM_UTIL)"; \ then $(APPSTREAM_UTIL) --nonet validate $${d}$<; fi \ && touch [$]@ check-am: $(appstream_XML:.appdata.xml=.appdata.valid) uninstall-am: uninstall-appstream-xml install-data-am: install-appstream-xml .SECONDARY: $(appstream_XML) install-appstream-xml: $(appstream_XML) @$(NORMAL_INSTALL) if test -n "$^"; then \ test -z "$(appstreamxmldir)" || $(MKDIR_P) "$(DESTDIR)$(appstreamxmldir)"; \ $(INSTALL_DATA) $^ "$(DESTDIR)$(appstreamxmldir)"; \ fi uninstall-appstream-xml: @$(NORMAL_UNINSTALL) @list='\''$(appstream_XML)'\''; test -n "$(appstreamxmldir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e '\''s|^.*/||'\''`; \ test -n "$$files" || exit 0; \ echo " ( cd '\''$(DESTDIR)$(appstreamxmldir)'\'' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(appstreamxmldir)" && rm -f $$files clean-appstream-xml: rm -f $(appstream_XML:.appdata.xml=.appdata.valid) ' _APPSTREAM_XML_SUBST(APPSTREAM_XML_RULES) ]) dnl _APPSTREAM_XML_SUBST(VARIABLE) dnl Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST AC_DEFUN([_APPSTREAM_XML_SUBST], [ AC_SUBST([$1]) m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])]) ] ) aravis-ARAVIS_0_6_0/m4/ax_code_coverage.m4000066400000000000000000000270751334570641500202730ustar00rootroot00000000000000# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_code_coverage.html # =========================================================================== # # SYNOPSIS # # AX_CODE_COVERAGE() # # DESCRIPTION # # Defines CODE_COVERAGE_CPPFLAGS, CODE_COVERAGE_CFLAGS, # CODE_COVERAGE_CXXFLAGS and CODE_COVERAGE_LIBS which should be included # in the CPPFLAGS, CFLAGS CXXFLAGS and LIBS/LIBADD variables of every # build target (program or library) which should be built with code # coverage support. Also defines CODE_COVERAGE_RULES which should be # substituted in your Makefile; and $enable_code_coverage which can be # used in subsequent configure output. CODE_COVERAGE_ENABLED is defined # and substituted, and corresponds to the value of the # --enable-code-coverage option, which defaults to being disabled. # # Test also for gcov program and create GCOV variable that could be # substituted. # # Note that all optimisation flags in CFLAGS must be disabled when code # coverage is enabled. # # Usage example: # # configure.ac: # # AX_CODE_COVERAGE # # Makefile.am: # # @CODE_COVERAGE_RULES@ # my_program_LIBS = ... $(CODE_COVERAGE_LIBS) ... # my_program_CPPFLAGS = ... $(CODE_COVERAGE_CPPFLAGS) ... # my_program_CFLAGS = ... $(CODE_COVERAGE_CFLAGS) ... # my_program_CXXFLAGS = ... $(CODE_COVERAGE_CXXFLAGS) ... # # This results in a "check-code-coverage" rule being added to any # Makefile.am which includes "@CODE_COVERAGE_RULES@" (assuming the module # has been configured with --enable-code-coverage). Running `make # check-code-coverage` in that directory will run the module's test suite # (`make check`) and build a code coverage report detailing the code which # was touched, then print the URI for the report. # # In earlier versions of this macro, CODE_COVERAGE_LDFLAGS was defined # instead of CODE_COVERAGE_LIBS. They are both still defined, but use of # CODE_COVERAGE_LIBS is preferred for clarity; CODE_COVERAGE_LDFLAGS is # deprecated. They have the same value. # # This code was derived from Makefile.decl in GLib, originally licenced # under LGPLv2.1+. # # LICENSE # # Copyright (c) 2012, 2016 Philip Withnall # Copyright (c) 2012 Xan Lopez # Copyright (c) 2012 Christian Persch # Copyright (c) 2012 Paolo Borelli # Copyright (c) 2012 Dan Winship # Copyright (c) 2015 Bastien ROUCARIES # # This library is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # This library is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . #serial 21 AC_DEFUN([AX_CODE_COVERAGE],[ dnl Check for --enable-code-coverage AC_REQUIRE([AC_PROG_SED]) # allow to override gcov location AC_ARG_WITH([gcov], [AS_HELP_STRING([--with-gcov[=GCOV]], [use given GCOV for coverage (GCOV=gcov).])], [_AX_CODE_COVERAGE_GCOV_PROG_WITH=$with_gcov], [_AX_CODE_COVERAGE_GCOV_PROG_WITH=gcov]) AC_MSG_CHECKING([whether to build with code coverage support]) AC_ARG_ENABLE([code-coverage], AS_HELP_STRING([--enable-code-coverage], [Whether to enable code coverage support]),, enable_code_coverage=no) AM_CONDITIONAL([CODE_COVERAGE_ENABLED], [test x$enable_code_coverage = xyes]) AC_SUBST([CODE_COVERAGE_ENABLED], [$enable_code_coverage]) AC_MSG_RESULT($enable_code_coverage) AS_IF([ test "$enable_code_coverage" = "yes" ], [ # check for gcov AC_CHECK_TOOL([GCOV], [$_AX_CODE_COVERAGE_GCOV_PROG_WITH], [:]) AS_IF([test "X$GCOV" = "X:"], [AC_MSG_ERROR([gcov is needed to do coverage])]) AC_SUBST([GCOV]) dnl Check if gcc is being used AS_IF([ test "$GCC" = "no" ], [ AC_MSG_ERROR([not compiling with gcc, which is required for gcov code coverage]) ]) AC_CHECK_PROG([LCOV], [lcov], [lcov]) AC_CHECK_PROG([GENHTML], [genhtml], [genhtml]) AS_IF([ test -z "$LCOV" ], [ AC_MSG_ERROR([To enable code coverage reporting you must have lcov installed]) ]) AS_IF([ test -z "$GENHTML" ], [ AC_MSG_ERROR([Could not find genhtml from the lcov package]) ]) dnl Build the code coverage flags dnl Define CODE_COVERAGE_LDFLAGS for backwards compatibility CODE_COVERAGE_CPPFLAGS="-DNDEBUG" CODE_COVERAGE_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" CODE_COVERAGE_CXXFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" CODE_COVERAGE_LIBS="-lgcov" CODE_COVERAGE_LDFLAGS="$CODE_COVERAGE_LIBS" AC_SUBST([CODE_COVERAGE_CPPFLAGS]) AC_SUBST([CODE_COVERAGE_CFLAGS]) AC_SUBST([CODE_COVERAGE_CXXFLAGS]) AC_SUBST([CODE_COVERAGE_LIBS]) AC_SUBST([CODE_COVERAGE_LDFLAGS]) [CODE_COVERAGE_RULES_CHECK=' -$(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) -k check $(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) code-coverage-capture '] [CODE_COVERAGE_RULES_CAPTURE=' $(code_coverage_v_lcov_cap)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --capture --output-file "$(CODE_COVERAGE_OUTPUT_FILE).tmp" --test-name "$(call code_coverage_sanitize,$(PACKAGE_NAME)-$(PACKAGE_VERSION))" --no-checksum --compat-libtool $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_OPTIONS) $(code_coverage_v_lcov_ign)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --remove "$(CODE_COVERAGE_OUTPUT_FILE).tmp" "/tmp/*" $(CODE_COVERAGE_IGNORE_PATTERN) --output-file "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_RMOPTS) -@rm -f $(CODE_COVERAGE_OUTPUT_FILE).tmp $(code_coverage_v_genhtml)LANG=C $(GENHTML) $(code_coverage_quiet) $(addprefix --prefix ,$(CODE_COVERAGE_DIRECTORY)) --output-directory "$(CODE_COVERAGE_OUTPUT_DIRECTORY)" --title "$(PACKAGE_NAME)-$(PACKAGE_VERSION) Code Coverage" --legend --show-details "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_GENHTML_OPTIONS) @echo "file://$(abs_builddir)/$(CODE_COVERAGE_OUTPUT_DIRECTORY)/index.html" '] [CODE_COVERAGE_RULES_CLEAN=' clean: code-coverage-clean distclean: code-coverage-clean code-coverage-clean: -$(LCOV) --directory $(top_builddir) -z -rm -rf $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_FILE).tmp $(CODE_COVERAGE_OUTPUT_DIRECTORY) -find . \( -name "*.gcda" -o -name "*.gcno" -o -name "*.gcov" \) -delete '] ], [ [CODE_COVERAGE_RULES_CHECK=' @echo "Need to reconfigure with --enable-code-coverage" '] CODE_COVERAGE_RULES_CAPTURE="$CODE_COVERAGE_RULES_CHECK" CODE_COVERAGE_RULES_CLEAN='' ]) [CODE_COVERAGE_RULES=' # Code coverage # # Optional: # - CODE_COVERAGE_DIRECTORY: Top-level directory for code coverage reporting. # Multiple directories may be specified, separated by whitespace. # (Default: $(top_builddir)) # - CODE_COVERAGE_OUTPUT_FILE: Filename and path for the .info file generated # by lcov for code coverage. (Default: # $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info) # - CODE_COVERAGE_OUTPUT_DIRECTORY: Directory for generated code coverage # reports to be created. (Default: # $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage) # - CODE_COVERAGE_BRANCH_COVERAGE: Set to 1 to enforce branch coverage, # set to 0 to disable it and leave empty to stay with the default. # (Default: empty) # - CODE_COVERAGE_LCOV_SHOPTS_DEFAULT: Extra options shared between both lcov # instances. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE) # - CODE_COVERAGE_LCOV_SHOPTS: Extra options to shared between both lcov # instances. (Default: $CODE_COVERAGE_LCOV_SHOPTS_DEFAULT) # - CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH: --gcov-tool pathtogcov # - CODE_COVERAGE_LCOV_OPTIONS_DEFAULT: Extra options to pass to the # collecting lcov instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH) # - CODE_COVERAGE_LCOV_OPTIONS: Extra options to pass to the collecting lcov # instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_DEFAULT) # - CODE_COVERAGE_LCOV_RMOPTS_DEFAULT: Extra options to pass to the filtering # lcov instance. (Default: empty) # - CODE_COVERAGE_LCOV_RMOPTS: Extra options to pass to the filtering lcov # instance. (Default: $CODE_COVERAGE_LCOV_RMOPTS_DEFAULT) # - CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT: Extra options to pass to the # genhtml instance. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE) # - CODE_COVERAGE_GENHTML_OPTIONS: Extra options to pass to the genhtml # instance. (Default: $CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT) # - CODE_COVERAGE_IGNORE_PATTERN: Extra glob pattern of files to ignore # # The generated report will be titled using the $(PACKAGE_NAME) and # $(PACKAGE_VERSION). In order to add the current git hash to the title, # use the git-version-gen script, available online. # Optional variables CODE_COVERAGE_DIRECTORY ?= $(top_builddir) CODE_COVERAGE_OUTPUT_FILE ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info CODE_COVERAGE_OUTPUT_DIRECTORY ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage CODE_COVERAGE_BRANCH_COVERAGE ?= CODE_COVERAGE_LCOV_SHOPTS_DEFAULT ?= $(if $(CODE_COVERAGE_BRANCH_COVERAGE),\ --rc lcov_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE)) CODE_COVERAGE_LCOV_SHOPTS ?= $(CODE_COVERAGE_LCOV_SHOPTS_DEFAULT) CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH ?= --gcov-tool "$(GCOV)" CODE_COVERAGE_LCOV_OPTIONS_DEFAULT ?= $(CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH) CODE_COVERAGE_LCOV_OPTIONS ?= $(CODE_COVERAGE_LCOV_OPTIONS_DEFAULT) CODE_COVERAGE_LCOV_RMOPTS_DEFAULT ?= CODE_COVERAGE_LCOV_RMOPTS ?= $(CODE_COVERAGE_LCOV_RMOPTS_DEFAULT) CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT ?=\ $(if $(CODE_COVERAGE_BRANCH_COVERAGE),\ --rc genhtml_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE)) CODE_COVERAGE_GENHTML_OPTIONS ?= $(CODE_COVERAGE_GENHTML_OPTIONS_DEFAULTS) CODE_COVERAGE_IGNORE_PATTERN ?= code_coverage_v_lcov_cap = $(code_coverage_v_lcov_cap_$(V)) code_coverage_v_lcov_cap_ = $(code_coverage_v_lcov_cap_$(AM_DEFAULT_VERBOSITY)) code_coverage_v_lcov_cap_0 = @echo " LCOV --capture"\ $(CODE_COVERAGE_OUTPUT_FILE); code_coverage_v_lcov_ign = $(code_coverage_v_lcov_ign_$(V)) code_coverage_v_lcov_ign_ = $(code_coverage_v_lcov_ign_$(AM_DEFAULT_VERBOSITY)) code_coverage_v_lcov_ign_0 = @echo " LCOV --remove /tmp/*"\ $(CODE_COVERAGE_IGNORE_PATTERN); code_coverage_v_genhtml = $(code_coverage_v_genhtml_$(V)) code_coverage_v_genhtml_ = $(code_coverage_v_genhtml_$(AM_DEFAULT_VERBOSITY)) code_coverage_v_genhtml_0 = @echo " GEN " $(CODE_COVERAGE_OUTPUT_DIRECTORY); code_coverage_quiet = $(code_coverage_quiet_$(V)) code_coverage_quiet_ = $(code_coverage_quiet_$(AM_DEFAULT_VERBOSITY)) code_coverage_quiet_0 = --quiet # sanitizes the test-name: replaces with underscores: dashes and dots code_coverage_sanitize = $(subst -,_,$(subst .,_,$(1))) # Use recursive makes in order to ignore errors during check check-code-coverage:'"$CODE_COVERAGE_RULES_CHECK"' # Capture code coverage data code-coverage-capture: code-coverage-capture-hook'"$CODE_COVERAGE_RULES_CAPTURE"' # Hook rule executed before code-coverage-capture, overridable by the user code-coverage-capture-hook: '"$CODE_COVERAGE_RULES_CLEAN"' GITIGNOREFILES ?= GITIGNOREFILES += $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_DIRECTORY) A''M_DISTCHECK_CONFIGURE_FLAGS ?= A''M_DISTCHECK_CONFIGURE_FLAGS += --disable-code-coverage .PHONY: check-code-coverage code-coverage-capture code-coverage-capture-hook code-coverage-clean '] AC_SUBST([CODE_COVERAGE_RULES]) m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([CODE_COVERAGE_RULES])]) ]) aravis-ARAVIS_0_6_0/m4/ax_valgrind_check.m4000066400000000000000000000212241334570641500204370ustar00rootroot00000000000000# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_valgrind_check.html # =========================================================================== # # SYNOPSIS # # AX_VALGRIND_DFLT(memcheck|helgrind|drd|sgcheck, on|off) # AX_VALGRIND_CHECK() # # DESCRIPTION # # AX_VALGRIND_CHECK checks whether Valgrind is present and, if so, allows # running `make check` under a variety of Valgrind tools to check for # memory and threading errors. # # Defines VALGRIND_CHECK_RULES which should be substituted in your # Makefile; and $enable_valgrind which can be used in subsequent configure # output. VALGRIND_ENABLED is defined and substituted, and corresponds to # the value of the --enable-valgrind option, which defaults to being # enabled if Valgrind is installed and disabled otherwise. Individual # Valgrind tools can be disabled via --disable-valgrind-, the # default is configurable via the AX_VALGRIND_DFLT command or is to use # all commands not disabled via AX_VALGRIND_DFLT. All AX_VALGRIND_DFLT # calls must be made before the call to AX_VALGRIND_CHECK. # # If unit tests are written using a shell script and automake's # LOG_COMPILER system, the $(VALGRIND) variable can be used within the # shell scripts to enable Valgrind, as described here: # # https://www.gnu.org/software/gnulib/manual/html_node/Running-self_002dtests-under-valgrind.html # # Usage example: # # configure.ac: # # AX_VALGRIND_DFLT([sgcheck], [off]) # AX_VALGRIND_CHECK # # Makefile.am: # # @VALGRIND_CHECK_RULES@ # VALGRIND_SUPPRESSIONS_FILES = my-project.supp # EXTRA_DIST = my-project.supp # # This results in a "check-valgrind" rule being added to any Makefile.am # which includes "@VALGRIND_CHECK_RULES@" (assuming the module has been # configured with --enable-valgrind). Running `make check-valgrind` in # that directory will run the module's test suite (`make check`) once for # each of the available Valgrind tools (out of memcheck, helgrind and drd) # while the sgcheck will be skipped unless enabled again on the # commandline with --enable-valgrind-sgcheck. The results for each check # will be output to test-suite-$toolname.log. The target will succeed if # there are zero errors and fail otherwise. # # Alternatively, a "check-valgrind-$TOOL" rule will be added, for $TOOL in # memcheck, helgrind, drd and sgcheck. These are useful because often only # some of those tools can be ran cleanly on a codebase. # # The macro supports running with and without libtool. # # LICENSE # # Copyright (c) 2014, 2015, 2016 Philip Withnall # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 15 dnl Configured tools m4_define([valgrind_tool_list], [[memcheck], [helgrind], [drd], [sgcheck]]) m4_set_add_all([valgrind_exp_tool_set], [sgcheck]) m4_foreach([vgtool], [valgrind_tool_list], [m4_define([en_dflt_valgrind_]vgtool, [on])]) AC_DEFUN([AX_VALGRIND_DFLT],[ m4_define([en_dflt_valgrind_$1], [$2]) ])dnl AC_DEFUN([AX_VALGRIND_CHECK],[ dnl Check for --enable-valgrind AC_ARG_ENABLE([valgrind], [AS_HELP_STRING([--enable-valgrind], [Whether to enable Valgrind on the unit tests])], [enable_valgrind=$enableval],[enable_valgrind=]) AS_IF([test "$enable_valgrind" != "no"],[ # Check for Valgrind. AC_CHECK_PROG([VALGRIND],[valgrind],[valgrind]) AS_IF([test "$VALGRIND" = ""],[ AS_IF([test "$enable_valgrind" = "yes"],[ AC_MSG_ERROR([Could not find valgrind; either install it or reconfigure with --disable-valgrind]) ],[ enable_valgrind=no ]) ],[ enable_valgrind=yes ]) ]) AM_CONDITIONAL([VALGRIND_ENABLED],[test "$enable_valgrind" = "yes"]) AC_SUBST([VALGRIND_ENABLED],[$enable_valgrind]) # Check for Valgrind tools we care about. [valgrind_enabled_tools=] m4_foreach([vgtool],[valgrind_tool_list],[ AC_ARG_ENABLE([valgrind-]vgtool, m4_if(m4_defn([en_dflt_valgrind_]vgtool),[off],dnl [AS_HELP_STRING([--enable-valgrind-]vgtool, [Whether to use ]vgtool[ during the Valgrind tests])],dnl [AS_HELP_STRING([--disable-valgrind-]vgtool, [Whether to skip ]vgtool[ during the Valgrind tests])]), [enable_valgrind_]vgtool[=$enableval], [enable_valgrind_]vgtool[=]) AS_IF([test "$enable_valgrind" = "no"],[ enable_valgrind_]vgtool[=no], [test "$enable_valgrind_]vgtool[" ]dnl m4_if(m4_defn([en_dflt_valgrind_]vgtool), [off], [= "yes"], [!= "no"]),[ AC_CACHE_CHECK([for Valgrind tool ]vgtool, [ax_cv_valgrind_tool_]vgtool,[ ax_cv_valgrind_tool_]vgtool[=no m4_set_contains([valgrind_exp_tool_set],vgtool, [m4_define([vgtoolx],[exp-]vgtool)], [m4_define([vgtoolx],vgtool)]) AS_IF([`$VALGRIND --tool=]vgtoolx[ --help >/dev/null 2>&1`],[ ax_cv_valgrind_tool_]vgtool[=yes ]) ]) AS_IF([test "$ax_cv_valgrind_tool_]vgtool[" = "no"],[ AS_IF([test "$enable_valgrind_]vgtool[" = "yes"],[ AC_MSG_ERROR([Valgrind does not support ]vgtool[; reconfigure with --disable-valgrind-]vgtool) ],[ enable_valgrind_]vgtool[=no ]) ],[ enable_valgrind_]vgtool[=yes ]) ]) AS_IF([test "$enable_valgrind_]vgtool[" = "yes"],[ valgrind_enabled_tools="$valgrind_enabled_tools ]m4_bpatsubst(vgtool,[^exp-])[" ]) AC_SUBST([ENABLE_VALGRIND_]vgtool,[$enable_valgrind_]vgtool) ]) AC_SUBST([valgrind_tools],["]m4_join([ ], valgrind_tool_list)["]) AC_SUBST([valgrind_enabled_tools],[$valgrind_enabled_tools]) [VALGRIND_CHECK_RULES=' # Valgrind check # # Optional: # - VALGRIND_SUPPRESSIONS_FILES: Space-separated list of Valgrind suppressions # files to load. (Default: empty) # - VALGRIND_FLAGS: General flags to pass to all Valgrind tools. # (Default: --num-callers=30) # - VALGRIND_$toolname_FLAGS: Flags to pass to Valgrind $toolname (one of: # memcheck, helgrind, drd, sgcheck). (Default: various) # Optional variables VALGRIND_SUPPRESSIONS ?= $(addprefix --suppressions=,$(VALGRIND_SUPPRESSIONS_FILES)) VALGRIND_FLAGS ?= --num-callers=30 VALGRIND_memcheck_FLAGS ?= --leak-check=full --show-reachable=no VALGRIND_helgrind_FLAGS ?= --history-level=approx VALGRIND_drd_FLAGS ?= VALGRIND_sgcheck_FLAGS ?= # Internal use valgrind_log_files = $(addprefix test-suite-,$(addsuffix .log,$(valgrind_tools))) valgrind_memcheck_flags = --tool=memcheck $(VALGRIND_memcheck_FLAGS) valgrind_helgrind_flags = --tool=helgrind $(VALGRIND_helgrind_FLAGS) valgrind_drd_flags = --tool=drd $(VALGRIND_drd_FLAGS) valgrind_sgcheck_flags = --tool=exp-sgcheck $(VALGRIND_sgcheck_FLAGS) valgrind_quiet = $(valgrind_quiet_$(V)) valgrind_quiet_ = $(valgrind_quiet_$(AM_DEFAULT_VERBOSITY)) valgrind_quiet_0 = --quiet valgrind_v_use = $(valgrind_v_use_$(V)) valgrind_v_use_ = $(valgrind_v_use_$(AM_DEFAULT_VERBOSITY)) valgrind_v_use_0 = @echo " USE " $(patsubst check-valgrind-%,%,$''@):; # Support running with and without libtool. ifneq ($(LIBTOOL),) valgrind_lt = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=execute else valgrind_lt = endif # Use recursive makes in order to ignore errors during check check-valgrind: ifeq ($(VALGRIND_ENABLED),yes) $(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) -k \ $(foreach tool, $(valgrind_enabled_tools), check-valgrind-$(tool)) else @echo "Need to reconfigure with --enable-valgrind" endif # Valgrind running VALGRIND_TESTS_ENVIRONMENT = \ $(TESTS_ENVIRONMENT) \ env VALGRIND=$(VALGRIND) \ G_SLICE=always-malloc,debug-blocks \ G_DEBUG=fatal-warnings,fatal-criticals,gc-friendly VALGRIND_LOG_COMPILER = \ $(valgrind_lt) \ $(VALGRIND) $(VALGRIND_SUPPRESSIONS) --error-exitcode=1 $(VALGRIND_FLAGS) define valgrind_tool_rule = check-valgrind-$(1): ifeq ($$(VALGRIND_ENABLED)-$$(ENABLE_VALGRIND_$(1)),yes-yes) $$(valgrind_v_use)$$(MAKE) check-TESTS \ TESTS_ENVIRONMENT="$$(VALGRIND_TESTS_ENVIRONMENT)" \ LOG_COMPILER="$$(VALGRIND_LOG_COMPILER)" \ LOG_FLAGS="$$(valgrind_$(1)_flags)" \ TEST_SUITE_LOG=test-suite-$(1).log else ifeq ($$(VALGRIND_ENABLED),yes) @echo "Need to reconfigure with --enable-valgrind-$(1)" else @echo "Need to reconfigure with --enable-valgrind" endif endef $(foreach tool,$(valgrind_tools),$(eval $(call valgrind_tool_rule,$(tool)))) A''M_DISTCHECK_CONFIGURE_FLAGS ?= A''M_DISTCHECK_CONFIGURE_FLAGS += --disable-valgrind MOSTLYCLEANFILES ?= MOSTLYCLEANFILES += $(valgrind_log_files) .PHONY: check-valgrind $(add-prefix check-valgrind-,$(valgrind_tools)) '] AC_SUBST([VALGRIND_CHECK_RULES]) m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([VALGRIND_CHECK_RULES])]) ]) aravis-ARAVIS_0_6_0/m4/glib-gettext.m4000066400000000000000000000366001334570641500174070ustar00rootroot00000000000000# Copyright (C) 1995-2002 Free Software Foundation, Inc. # Copyright (C) 2001-2003,2004 Red Hat, Inc. # # This file is free software, distributed under the terms of the GNU # General Public License. As a special exception to the GNU General # Public License, this file may be distributed as part of a program # that contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # # Macro to add for using GNU gettext. # Ulrich Drepper , 1995, 1996 # # Modified to never use included libintl. # Owen Taylor , 12/15/1998 # # Major rework to remove unused code # Owen Taylor , 12/11/2002 # # Added better handling of ALL_LINGUAS from GNU gettext version # written by Bruno Haible, Owen Taylor 5/30/3002 # # Modified to require ngettext # Matthias Clasen 08/06/2004 # Increment this whenever this file is changed. #serial 1 # We need this here as well, since someone might use autoconf-2.5x # to configure GLib then an older version to configure a package # using AM_GLIB_GNU_GETTEXT AC_PREREQ(2.53) dnl dnl We go to great lengths to make sure that aclocal won't dnl try to pull in the installed version of these macros dnl when running aclocal in the glib directory. dnl m4_copy([AC_DEFUN],[glib_DEFUN]) m4_copy([AC_REQUIRE],[glib_REQUIRE]) dnl dnl At the end, if we're not within glib, we'll define the public dnl definitions in terms of our private definitions. dnl # GLIB_LC_MESSAGES #-------------------- glib_DEFUN([GLIB_LC_MESSAGES], [AC_CHECK_HEADERS([locale.h]) if test $ac_cv_header_locale_h = yes; then AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) if test $am_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi fi]) # GLIB_PATH_PROG_WITH_TEST #---------------------------- dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) glib_DEFUN([GLIB_PATH_PROG_WITH_TEST], [# Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in /*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in ifelse([$5], , $PATH, [$5]); do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) dnl Checks for special options needed on Mac OS X. dnl Defines INTL_MACOSX_LIBS. dnl dnl Copied from intlmacosx.m4 in gettext, GPL. dnl Copyright (C) 2004-2013 Free Software Foundation, Inc. glib_DEFUN([glib_gt_INTL_MACOSX], [ dnl Check for API introduced in Mac OS X 10.2. AC_CACHE_CHECK([for CFPreferencesCopyAppValue], [gt_cv_func_CFPreferencesCopyAppValue], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[CFPreferencesCopyAppValue(NULL, NULL)]])], [gt_cv_func_CFPreferencesCopyAppValue=yes], [gt_cv_func_CFPreferencesCopyAppValue=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1], [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) fi dnl Check for API introduced in Mac OS X 10.3. AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[CFLocaleCopyCurrent();]])], [gt_cv_func_CFLocaleCopyCurrent=yes], [gt_cv_func_CFLocaleCopyCurrent=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFLocaleCopyCurrent = yes; then AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1], [Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi AC_SUBST([INTL_MACOSX_LIBS]) ]) # GLIB_WITH_NLS #----------------- glib_DEFUN([GLIB_WITH_NLS], dnl NLS is obligatory [USE_NLS=yes AC_SUBST(USE_NLS) gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= glib_gt_INTL_MACOSX AC_CHECK_HEADER(libintl.h, [gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc, [AC_TRY_LINK([ #include ], [return !ngettext ("","", 1)], gt_cv_func_ngettext_libc=yes, gt_cv_func_ngettext_libc=no) ]) if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc, [AC_TRY_LINK([ #include ], [return !dgettext ("","")], gt_cv_func_dgettext_libc=yes, gt_cv_func_dgettext_libc=no) ]) fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CHECK_FUNCS(bind_textdomain_codeset) fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then AC_CHECK_LIB(intl, bindtextdomain, [AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dgettext, gt_cv_func_dgettext_libintl=yes)])]) if test "$gt_cv_func_dgettext_libintl" != "yes" ; then AC_MSG_CHECKING([if -liconv is needed to use gettext]) AC_MSG_RESULT([]) AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dcgettext, [gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv], :,-liconv)], :,-liconv) fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset AC_CHECK_FUNCS(bind_textdomain_codeset) LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs $INTL_MACOSX_LIBS" fi if test "$gt_cv_have_gettext" = "yes"; then AC_DEFINE(HAVE_GETTEXT,1, [Define if the GNU gettext() function is already present or preinstalled.]) GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" AC_CHECK_FUNCS(dcgettext) MSGFMT_OPTS= AC_MSG_CHECKING([if msgfmt accepts -c]) GLIB_RUN_PROG([$MSGFMT -c -o /dev/null],[ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: test 1.0\n" "PO-Revision-Date: 2007-02-15 12:01+0100\n" "Last-Translator: test \n" "Language-Team: C \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" ], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])]) AC_SUBST(MSGFMT_OPTS) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr], [CATOBJEXT=.gmo DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share and dnl and CATOBJEXT=.gmo in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [CATOBJEXT=.gmo DATADIRNAME=share], [CATOBJEXT=.mo DATADIRNAME=lib]) ;; *-*-openbsd*) CATOBJEXT=.mo DATADIRNAME=share ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac]) LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi ]) if test "$gt_cv_have_gettext" = "yes" ; then AC_DEFINE(ENABLE_NLS, 1, [always defined to indicate that i18n is enabled]) fi dnl Test whether we really found GNU xgettext. if test "$XGETTEXT" != ":"; then dnl If it is not GNU xgettext we define it as : so that the dnl Makefiles still can work. if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else AC_MSG_RESULT( [found xgettext program is not GNU xgettext; ignore it]) XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po AC_OUTPUT_COMMANDS( [case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac]) dnl These rules are solely for the distribution goal. While doing this dnl we only have to keep exactly one list of the available catalogs dnl in configure.ac. for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done dnl Make all variables we use known to autoconf. AC_SUBST(CATALOGS) AC_SUBST(CATOBJEXT) AC_SUBST(DATADIRNAME) AC_SUBST(GMOFILES) AC_SUBST(INSTOBJEXT) AC_SUBST(INTLLIBS) AC_SUBST(PO_IN_DATADIR_TRUE) AC_SUBST(PO_IN_DATADIR_FALSE) AC_SUBST(POFILES) AC_SUBST(POSUB) ]) # AM_GLIB_GNU_GETTEXT # ------------------- # Do checks necessary for use of gettext. If a suitable implementation # of gettext is found in either in libintl or in the C library, # it will set INTLLIBS to the libraries needed for use of gettext # and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable # gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST() # on various variables needed by the Makefile.in.in installed by # glib-gettextize. dnl AU_DEFUN([GLIB_GNU_GETTEXT], [AC_REQUIRE([AC_PROG_CC])dnl GLIB_LC_MESSAGES GLIB_WITH_NLS if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else AC_MSG_CHECKING(for catalogs to be installed) NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS AC_MSG_RESULT($LINGUAS) fi dnl Construct list of names of catalog files to be constructed. if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly dnl find the mkinstalldirs script in another subdir but ($top_srcdir). dnl Try to locate is. MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi AC_SUBST(MKINSTALLDIRS) dnl Generate list of files to be processed by xgettext which will dnl be included in po/Makefile. test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES ], [[$0: This macro is deprecated. You should use upstream gettext instead.]]) # AM_GLIB_DEFINE_LOCALEDIR(VARIABLE) # ------------------------------- # Define VARIABLE to the location where catalog files will # be installed by po/Makefile. glib_DEFUN([GLIB_DEFINE_LOCALEDIR], [glib_REQUIRE([GLIB_GNU_GETTEXT])dnl glib_save_prefix="$prefix" glib_save_exec_prefix="$exec_prefix" glib_save_datarootdir="$datarootdir" test "x$prefix" = xNONE && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix=$prefix datarootdir=`eval echo "${datarootdir}"` if test "x$CATOBJEXT" = "x.mo" ; then localedir=`eval echo "${libdir}/locale"` else localedir=`eval echo "${datadir}/locale"` fi prefix="$glib_save_prefix" exec_prefix="$glib_save_exec_prefix" datarootdir="$glib_save_datarootdir" AC_DEFINE_UNQUOTED($1, "$localedir", [Define the location where the catalogs will be installed]) ]) dnl dnl Now the definitions that aclocal will find dnl ifdef(glib_configure_ac,[],[ AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)]) AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)]) ])dnl # GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL]) # # Create a temporary file with TEST-FILE as its contents and pass the # file name to PROGRAM. Perform ACTION-IF-PASS if PROGRAM exits with # 0 and perform ACTION-IF-FAIL for any other exit status. AC_DEFUN([GLIB_RUN_PROG], [cat >conftest.foo <<_ACEOF $2 _ACEOF if AC_RUN_LOG([$1 conftest.foo]); then m4_ifval([$3], [$3], [:]) m4_ifvaln([$4], [else $4])dnl echo "$as_me: failed input was:" >&AS_MESSAGE_LOG_FD sed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD fi]) aravis-ARAVIS_0_6_0/m4/introspection.m4000066400000000000000000000067361334570641500177170ustar00rootroot00000000000000dnl -*- mode: autoconf -*- dnl Copyright 2009 Johan Dahlin dnl dnl This file is free software; the author(s) gives unlimited dnl permission to copy and/or distribute it, with or without dnl modifications, as long as this notice is preserved. dnl # serial 1 m4_define([_GOBJECT_INTROSPECTION_CHECK_INTERNAL], [ AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first AC_BEFORE([LT_INIT],[$0])dnl setup libtool first dnl enable/disable introspection m4_if([$2], [require], [dnl enable_introspection=yes ],[dnl AC_ARG_ENABLE(introspection, AS_HELP_STRING([--enable-introspection[=@<:@no/auto/yes@:>@]], [Enable introspection for this build]),, [enable_introspection=auto]) ])dnl AC_MSG_CHECKING([for gobject-introspection]) dnl presence/version checking AS_CASE([$enable_introspection], [no], [dnl found_introspection="no (disabled, use --enable-introspection to enable)" ],dnl [yes],[dnl PKG_CHECK_EXISTS([gobject-introspection-1.0],, AC_MSG_ERROR([gobject-introspection-1.0 is not installed])) PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1], found_introspection=yes, AC_MSG_ERROR([You need to have gobject-introspection >= $1 installed to build AC_PACKAGE_NAME])) ],dnl [auto],[dnl PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1], found_introspection=yes, found_introspection=no) dnl Canonicalize enable_introspection enable_introspection=$found_introspection ],dnl [dnl AC_MSG_ERROR([invalid argument passed to --enable-introspection, should be one of @<:@no/auto/yes@:>@]) ])dnl AC_MSG_RESULT([$found_introspection]) INTROSPECTION_SCANNER= INTROSPECTION_COMPILER= INTROSPECTION_GENERATE= INTROSPECTION_GIRDIR= INTROSPECTION_TYPELIBDIR= if test "x$found_introspection" = "xyes"; then INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0` INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0` INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0` INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0` INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)" INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0` INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0` INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection fi AC_SUBST(INTROSPECTION_SCANNER) AC_SUBST(INTROSPECTION_COMPILER) AC_SUBST(INTROSPECTION_GENERATE) AC_SUBST(INTROSPECTION_GIRDIR) AC_SUBST(INTROSPECTION_TYPELIBDIR) AC_SUBST(INTROSPECTION_CFLAGS) AC_SUBST(INTROSPECTION_LIBS) AC_SUBST(INTROSPECTION_MAKEFILE) AM_CONDITIONAL(HAVE_INTROSPECTION, test "x$found_introspection" = "xyes") ]) dnl Usage: dnl GOBJECT_INTROSPECTION_CHECK([minimum-g-i-version]) AC_DEFUN([GOBJECT_INTROSPECTION_CHECK], [ _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1]) ]) dnl Usage: dnl GOBJECT_INTROSPECTION_REQUIRE([minimum-g-i-version]) AC_DEFUN([GOBJECT_INTROSPECTION_REQUIRE], [ _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1], [require]) ]) aravis-ARAVIS_0_6_0/m4/libtool.m4000066400000000000000000011253061334570641500164570ustar00rootroot00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 2014 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . ]) # serial 58 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_PREPARE_CC_BASENAME # ----------------------- m4_defun([_LT_PREPARE_CC_BASENAME], [ # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in @S|@*""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } ])# _LT_PREPARE_CC_BASENAME # _LT_CC_BASENAME(CC) # ------------------- # It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, # but that macro is also expanded into generated libtool script, which # arranges for $SED and $ECHO to be set by different means. m4_defun([_LT_CC_BASENAME], [m4_require([_LT_PREPARE_CC_BASENAME])dnl AC_REQUIRE([_LT_DECL_SED])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl func_cc_basename $1 cc_basename=$func_cc_basename_result ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl m4_require([_LT_CMD_TRUNCATE])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from 'configure', and 'config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # 'config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain=$ac_aux_dir/ltmain.sh ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the 'libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to 'config.status' so that its # declaration there will have the same value as in 'configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags='_LT_TAGS'dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into 'config.status', and then the shell code to quote escape them in # for loops in 'config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # '#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test 0 = "$lt_write_fail" && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ '$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test 0 != $[#] do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try '$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try '$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test yes = "$silent" && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 _LT_COPYING _LT_LIBTOOL_TAGS # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE _LT_PREPARE_MUNGE_PATH_LIST _LT_PREPARE_CC_BASENAME # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS=$save_LDFLAGS ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[[012]][[,.]]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test yes = "$lt_cv_ld_force_load"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" m4_if([$1], [CXX], [ if test yes != "$lt_cv_apple_cc_single_mod"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script that will find a shell with a builtin # printf (that we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case $ECHO in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], [Search for dependent libraries within DIR (or the compiler's sysroot if not specified).])], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([$with_sysroot]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and where our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test yes = "[$]$2"; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ]) if test yes = "[$]$2"; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n "$lt_cv_sys_max_cmd_len"; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes = "$cross_compiling"; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen=shl_load], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen=dlopen], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) ]) ]) ]) ]) ]) ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links=nottested if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test no = "$hard_links"; then AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", [Define to the sub-directory where libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then # We can hardcode non-existent directories. if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_PREPARE_MUNGE_PATH_LIST # --------------------------- # Make sure func_munge_path_list() is defined correctly. m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], [[# func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x@S|@2 in x) ;; *:) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" ;; x:*) eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; *::*) eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" ;; *) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; esac } ]])# _LT_PREPARE_PATH_LIST # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown AC_ARG_VAR([LT_SYS_LIBRARY_PATH], [User-defined run-time library search path.]) case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a[(]lib.so.V[)]' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], [Detected run-time system search path for libraries]) _LT_DECL([], [configure_time_lt_sys_library_path], [2], [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program that can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$1"; then lt_cv_path_MAGIC_CMD=$ac_dir/"$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac]) MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program that can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test no = "$withval" || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], [if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi]) rm -f conftest.i conftest2.i conftest.out]) ])# _LT_PATH_DD # _LT_CMD_TRUNCATE # ---------------- # find command to truncate a binary pipe m4_defun([_LT_CMD_TRUNCATE], [m4_require([_LT_PATH_DD]) AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], [printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) _LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], [Command to truncate a binary pipe]) ])# _LT_CMD_TRUNCATE # _LT_CHECK_MAGIC_METHOD # ---------------------- # how to check for library dependencies # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_MAGIC_METHOD], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) AC_CACHE_CHECK([how to recognize dependent libraries], lt_cv_deplibs_check_method, [lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[[4-9]]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[[45]]*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi]) if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # _LT_DLL_DEF_P([FILE]) # --------------------- # True iff FILE is a Windows DLL '.def' file. # Keep in sync with func_dll_def_p in the libtool script AC_DEFUN([_LT_DLL_DEF_P], [dnl test DEF = "`$SED -n dnl -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl -e q dnl Only consider the first "real" line $1`" dnl ])# _LT_DLL_DEF_P # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM=-lm) ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test yes = "$GCC"; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], [Transform the output of nm into a list of symbols to manually relocate]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([nm_interface], [lt_cv_nm_interface], [1], [The name lister interface]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test yes = "$GCC"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS=$save_LDFLAGS]) if test yes = "$lt_cv_irix_exported_symbol"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; osf3*) if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test yes = "$GCC"; then wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test yes,yes = "$GCC,$enable_shared"; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting $shlibpath_var if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC=$CC AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report what library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC=$lt_save_CC ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(GCC, $1)=$GXX _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case @S|@2 in .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test x-L = "$p" || test x-R = "$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)=$prev$p else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)=$p else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)=$p else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test no = "$F77"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_F77"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$G77 _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_F77" AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test no = "$FC"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_FC"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_FC" AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code=$lt_simple_compile_test_code # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f "$lt_ac_sed" && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test 10 -lt "$lt_ac_count" && break lt_ac_count=`expr $lt_ac_count + 1` if test "$lt_ac_count" -gt "$lt_ac_max"; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine what file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS aravis-ARAVIS_0_6_0/m4/ltoptions.m4000066400000000000000000000342621334570641500170450ustar00rootroot00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 8 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option '$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl 'shared' nor 'disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], [_LT_WITH_AIX_SONAME([aix])]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the 'shared' and # 'disable-shared' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the 'static' and # 'disable-static' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the 'fast-install' # and 'disable-fast-install' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_AIX_SONAME([DEFAULT]) # ---------------------------------- # implement the --with-aix-soname flag, and support the `aix-soname=aix' # and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT # is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. m4_define([_LT_WITH_AIX_SONAME], [m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[[5-9]]*,yes) AC_MSG_CHECKING([which variant of shared library versioning to provide]) AC_ARG_WITH([aix-soname], [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], [case $withval in aix|svr4|both) ;; *) AC_MSG_ERROR([Unknown argument to --with-aix-soname]) ;; esac lt_cv_with_aix_soname=$with_aix_soname], [AC_CACHE_VAL([lt_cv_with_aix_soname], [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) with_aix_soname=$lt_cv_with_aix_soname]) AC_MSG_RESULT([$with_aix_soname]) if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac _LT_DECL([], [shared_archive_member_spec], [0], [Shared archive member basename, for filename based shared library versioning on AIX])dnl ])# _LT_WITH_AIX_SONAME LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the 'pic-only' and 'no-pic' # LT_INIT options. # MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac], [pic_mode=m4_default([$1], [default])]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) aravis-ARAVIS_0_6_0/m4/ltsugar.m4000066400000000000000000000104401334570641500164630ustar00rootroot00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59, which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) aravis-ARAVIS_0_6_0/m4/ltversion.m4000066400000000000000000000012731334570641500170330ustar00rootroot00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 4179 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.6]) m4_define([LT_PACKAGE_REVISION], [2.4.6]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.6' macro_revision='2.4.6' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) aravis-ARAVIS_0_6_0/m4/lt~obsolete.m4000066400000000000000000000137741334570641500173710ustar00rootroot00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software # Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) aravis-ARAVIS_0_6_0/m4/nls.m4000066400000000000000000000023071334570641500156010ustar00rootroot00000000000000# nls.m4 serial 5 (gettext-0.18) dnl Copyright (C) 1995-2003, 2005-2006, 2008-2014, 2016 Free Software dnl Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.50]) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE([nls], [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT([$USE_NLS]) AC_SUBST([USE_NLS]) ]) aravis-ARAVIS_0_6_0/m4/pkg.m4000066400000000000000000000305761334570641500155770ustar00rootroot00000000000000# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 11 (pkg-config-0.29.1) dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a dnl configuration script generated by Autoconf, you may include it under dnl the same distribution terms that you use for the rest of that dnl program. dnl PKG_PREREQ(MIN-VERSION) dnl ----------------------- dnl Since: 0.29 dnl dnl Verify that the version of the pkg-config macros are at least dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's dnl installed version of pkg-config, this checks the developer's version dnl of pkg.m4 when generating configure. dnl dnl To ensure that this macro is defined, also add: dnl m4_ifndef([PKG_PREREQ], dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], [m4_define([PKG_MACROS_VERSION], [0.29.1]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) dnl ---------------------------------- dnl Since: 0.16 dnl dnl Search for the pkg-config tool and set the PKG_CONFIG variable to dnl first found in the path. Checks that the version of pkg-config found dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is dnl used since that's the first version where most current features of dnl pkg-config existed. AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])dnl PKG_PROG_PKG_CONFIG dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------------------------------- dnl Since: 0.18 dnl dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) dnl only at the first occurence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl have to call PKG_CHECK_EXISTS manually AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) dnl --------------------------------------------- dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting dnl pkg_failed based on the result. m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])dnl _PKG_CONFIG dnl _PKG_SHORT_ERRORS_SUPPORTED dnl --------------------------- dnl Internal check to see if pkg-config supports short errors. AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])dnl _PKG_SHORT_ERRORS_SUPPORTED dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl -------------------------------------------------------------- dnl Since: 0.4.0 dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES might not happen, you should be sure to include an dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])dnl PKG_CHECK_MODULES dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl --------------------------------------------------------------------- dnl Since: 0.29 dnl dnl Checks for existence of MODULES and gathers its build flags with dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags dnl and VARIABLE-PREFIX_LIBS from --libs. dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to dnl include an explicit call to PKG_PROG_PKG_CONFIG in your dnl configure.ac. AC_DEFUN([PKG_CHECK_MODULES_STATIC], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl _save_PKG_CONFIG=$PKG_CONFIG PKG_CONFIG="$PKG_CONFIG --static" PKG_CHECK_MODULES($@) PKG_CONFIG=$_save_PKG_CONFIG[]dnl ])dnl PKG_CHECK_MODULES_STATIC dnl PKG_INSTALLDIR([DIRECTORY]) dnl ------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable pkgconfigdir as the location where a module dnl should install pkg-config .pc files. By default the directory is dnl $libdir/pkgconfig, but the default can be changed by passing dnl DIRECTORY. The user can override through the --with-pkgconfigdir dnl parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_INSTALLDIR dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) dnl -------------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable noarch_pkgconfigdir as the location where a dnl module should install arch-independent pkg-config .pc files. By dnl default the directory is $datadir/pkgconfig, but the default can be dnl changed by passing DIRECTORY. The user can override through the dnl --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_NOARCH_INSTALLDIR dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------- dnl Since: 0.28 dnl dnl Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------ dnl dnl Prepare a "--with-" configure option using the lowercase dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and dnl PKG_CHECK_MODULES in a single macro. AC_DEFUN([PKG_WITH_MODULES], [ m4_pushdef([with_arg], m4_tolower([$1])) m4_pushdef([description], [m4_default([$5], [build with ]with_arg[ support])]) m4_pushdef([def_arg], [m4_default([$6], [auto])]) m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) m4_case(def_arg, [yes],[m4_pushdef([with_without], [--without-]with_arg)], [m4_pushdef([with_without],[--with-]with_arg)]) AC_ARG_WITH(with_arg, AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, [AS_TR_SH([with_]with_arg)=def_arg]) AS_CASE([$AS_TR_SH([with_]with_arg)], [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], [auto],[PKG_CHECK_MODULES([$1],[$2], [m4_n([def_action_if_found]) $3], [m4_n([def_action_if_not_found]) $4])]) m4_popdef([with_arg]) m4_popdef([description]) m4_popdef([def_arg]) ])dnl PKG_WITH_MODULES dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ----------------------------------------------- dnl dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES dnl check._[VARIABLE-PREFIX] is exported as make variable. AC_DEFUN([PKG_HAVE_WITH_MODULES], [ PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) AM_CONDITIONAL([HAVE_][$1], [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) ])dnl PKG_HAVE_WITH_MODULES dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------------------ dnl dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make dnl and preprocessor variable. AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], [ PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) ])dnl PKG_HAVE_DEFINE_WITH_MODULES aravis-ARAVIS_0_6_0/man/000077500000000000000000000000001334570641500147745ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/man/Makefile.am000066400000000000000000000001211334570641500170220ustar00rootroot00000000000000include $(top_srcdir)/Makefile.decl dist_man_MANS = arv-viewer.1 arv-tool-0.6.1 aravis-ARAVIS_0_6_0/man/arv-tool-0.6.1000066400000000000000000000027551334570641500171330ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.5. .TH ARV-TOOL-0.6 "1" "March 2018" "User Commands" .SH NAME arv\-tool\-0.6 \- Small utility for basic control of a Genicam device. .SH DESCRIPTION .SS "Usage:" .TP arv\-tool\-0.6 [OPTIONS] command .PP Small utility for basic control of a Genicam device. .SS "Help Options:" .TP \fB\-h\fR, \fB\-\-help\fR Show help options .SS "Application Options:" .HP \fB\-n\fR, \fB\-\-name=\fR .HP \fB\-a\fR, \fB\-\-address=\fR .HP \fB\-d\fR, \fB\-\-debug=\fR[:][,...] .PP Command may be one of the following possibilities: .TP genicam: dump the content of the Genicam xml data .TP features: list all availale features .TP description [] ...: show the full feature description .TP control [=] ...: read/write device features .PP If no command is given, this utility will list all the available devices. For the control command, direct access to device registers is provided using a R[address] syntax in place of a feature name. .SH EXAMPLES arv\-tool\-0.6 control Width=128 Height=128 Gain R[0x10000]=0x10 arv\-tool\-0.6 features arv\-tool\-0.6 description Width Height arv\-tool\-0.6 \-n Basler\-210ab4 genicam .SH "SEE ALSO" The full documentation for .B arv\-tool\-0.6 is maintained as a Texinfo manual. If the .B info and .B arv\-tool\-0.6 programs are properly installed at your site, the command .IP .B info arv\-tool\-0.6 .PP should give you access to the complete manual. aravis-ARAVIS_0_6_0/man/arv-viewer.1000066400000000000000000000020731334570641500171470ustar00rootroot00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.5. .TH ARV-VIEWER "1" "March 2018" "User Commands" .SH NAME arv\-viewer \- Basic viewer for aravis compatible cameras .SH DESCRIPTION .SS "Usage:" .IP arv\-viewer [OPTIONS] .SS "Help Options:" .TP \fB\-h\fR, \fB\-\-help\fR Show help options .TP \fB\-\-help\-all\fR Show all help options .TP \fB\-\-help\-gtk\fR Show GTK+ Options .TP \fB\-\-help\-gst\fR Show GStreamer Options .SS "Application Options:" .TP \fB\-a\fR, \fB\-\-auto\-buffer\-size\fR Auto socket buffer size .TP \fB\-r\fR, \fB\-\-no\-packet\-resend\fR No packet resend .TP \fB\-p\fR, \fB\-\-packet\-timeout\fR Packet timeout (ms) .TP \fB\-m\fR, \fB\-\-frame\-retention\fR Frame retention (ms) .TP \fB\-d\fR, \fB\-\-debug\fR Debug domains .TP \fB\-\-display\fR=\fI\,DISPLAY\/\fR X display to use .SH "SEE ALSO" The full documentation for .B arv\-viewer is maintained as a Texinfo manual. If the .B info and .B arv\-viewer programs are properly installed at your site, the command .IP .B info arv\-viewer .PP should give you access to the complete manual. aravis-ARAVIS_0_6_0/meson.build000066400000000000000000000057451334570641500163760ustar00rootroot00000000000000project ('aravis', 'c', 'cpp', version: '0.6.0', meson_version: '>=0.45.0') gnome = import('gnome') i18n = import ('i18n') pkg = import ('pkgconfig') aravis_version = meson.project_version () aravis_api_version = '0.6' versions = aravis_version.split ('.') aravis_major_version = versions[0].to_int () aravis_minor_version = versions[1].to_int () aravis_micro_version = versions[2].to_int () aravis_desktop_dir = join_paths (get_option ('datadir'), 'applications') aravis_data_dir = join_paths (get_option ('datadir'), 'aravis-@0@'.format (aravis_api_version)) aravis_icon_dir = join_paths (aravis_data_dir, 'icons', 'hicolor') cc = meson.get_compiler ('c') cxx = meson.get_compiler ('cpp') glib_dep = dependency ('glib-2.0', version: '>=2.32', required: true) gobject_dep = dependency ('gobject-2.0', required: true) gio_dep = dependency ('gio-2.0', required: true) xml2_dep = dependency ('libxml-2.0', required: true) libz_dep = dependency ('zlib', required: true) libm = cc.find_library ('m', required: true) aravis_dependencies = [glib_dep, gobject_dep, gio_dep, xml2_dep, libz_dep, libm] aravis_dependency_str = 'glib-2.0 gobject-2.0 gio-2.0' aravis_private_dependency_str = 'libxml-2.0 zlib' enable_packet_socket = get_option ('packet-socket') if enable_packet_socket aravis_dependencies += dependency ('audit', required: true) aravis_private_dependency_str += ' audit' endif enable_usb = get_option ('usb') if enable_usb aravis_dependencies += dependency ('libusb-1.0', required: true) aravis_private_dependency_str += ' libusb-1.0' endif config_data = configuration_data () config_data.set_quoted ('PACKAGE_NAME', 'aravis') config_data.set_quoted ('PACKAGE_VERSION', aravis_version) config_data.set_quoted ('PACKAGE', 'aravis') config_data.set_quoted ('VERSION', aravis_version) config_data.set ('ARAVIS_BUILD_PACKET_SOCKET', enable_packet_socket) config_data.set ('ARAVIS_BUILD_USB', enable_usb) config_data.set ('ARAVIS_FAST_HEARTBEAT', get_option ('fast-heartbeat')) configure_file (input: 'arvconfig.h.in', output: 'arvconfig.h', configuration: config_data) configuration_inc = include_directories ('.') subdir ('po') subdir ('src') subdir ('tests') if get_option ('viewer') gtk_dep = dependency ('gtk+-3.0', version: '>=3.12', required: true) gstreamer_base_dep = dependency ('gstreamer-base-1.0', required: true) gstreamer_app_dep = dependency ('gstreamer-app-1.0', required: true) gstreamer_video_dep = dependency ('gstreamer-video-1.0', required: true) notify_dep = dependency ('libnotify', required: true) aravis_viewer_dependencies = [aravis_dependencies, gtk_dep, gstreamer_base_dep, gstreamer_app_dep, gstreamer_video_dep, notify_dep] subdir ('viewer') endif if get_option ('gst-plugin') gstreamer_base_dep = dependency ('gstreamer-base-1.0', required: true) gstreamer_app_dep = dependency ('gstreamer-app-1.0', required: true) gst_plugin_dependencies = [aravis_dependencies, gstreamer_base_dep] subdir ('gst') endif if get_option ('documentation') subdir ('docs/reference/aravis') endif aravis-ARAVIS_0_6_0/meson_options.txt000066400000000000000000000014001334570641500176510ustar00rootroot00000000000000# Features option('viewer', type: 'boolean', value: true, description : 'Build simple viewer') option('gst-plugin', type: 'boolean', value: true, description : 'Build GStreamer plugin') option('packet-socket', type: 'boolean', value: true, description : 'Enable packet socket support') option('usb', type: 'boolean', value: true, description : 'Enable USB support') option('fast-heartbeat', type: 'boolean', value: false, description: 'Enable faster heartbeat rate') # Documentation and introspection option('documentation', type: 'boolean', value: true, description: 'Build API reference (requires gtk-doc and xlstproc)') option('introspection', type: 'boolean', value: true, description: 'Build introspection data (requires gobject-introspection)') aravis-ARAVIS_0_6_0/module/000077500000000000000000000000001334570641500155065ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/module/.gitignore000066400000000000000000000001001334570641500174650ustar00rootroot00000000000000.*.cmd .tmp_versions/ Module.symvers modules.order *.ko *.mod.c aravis-ARAVIS_0_6_0/module/Makefile000066400000000000000000000022501334570641500171450ustar00rootroot00000000000000ifneq ($(KERNELRELEASE),) obj-m := aravis-module.o else ifeq ($(PREFIX),) PREFIX := /usr/local endif MODULE := aravis-module KDIR := /lib/modules/$(shell uname -r)/build INCLUDE := -isystem $(KDIR)/include MODCFLAGS := -DMODULE -D__KERNEL__ -Wall $(INCLUDE) KMAKE := $(MAKE) -C $(KDIR) SUBDIRS=$$PWD modules: $(MODULE).o insert_module: install modprobe -r aravis-module modprobe aravis-module ifneq ($(shell (uname -r | grep 2.6) > /dev/null ; echo -n $$?),0) echo A 2.6 kernel is required; exit 1 endif # build module $(MODULE).o: $(MODULE).c $(MODULE).h $(KMAKE) modules # Automake rules, as per "Third-Party Makefiles" in the automake manual all: $(MODULE).o distdir: cp aravis-module.c $(distdir) cp aravis-module.h $(distdir) cp Makefile $(distdir) install: $(KMAKE) modules_install [ -e /sbin/depmod ] && /sbin/depmod install-data: install-exec: uninstall: install-info: installdirs: check: installcheck: mostlyclean: clean: rm -f aravis-module.ko rm -f aravis-module.o rm -f aravis-module.mod.o rm -f aravis-module.mod.c rm -f modules.order rm -f Module.symvers distclean: clean maintainer-clean: dvi: pdf: info: html: tags: ctags: endif aravis-ARAVIS_0_6_0/module/aravis-module.c000066400000000000000000000004031334570641500204170ustar00rootroot00000000000000#include MODULE_LICENSE("GPL"); MODULE_AUTHOR("Emmanuel Pacaud "); int init_module(void) { printk (KERN_ALERT "aravis: loaded\n"); return 0; } void cleanup_module(void) { printk (KERN_ALERT "aravis: unloaded\n"); } aravis-ARAVIS_0_6_0/module/aravis-module.h000066400000000000000000000000001334570641500204150ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/po/000077500000000000000000000000001334570641500146375ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/po/.gitignore000066400000000000000000000000701334570641500166240ustar00rootroot00000000000000POTFILES *.gmo notexist *.pot .intltool* Makefile.in.in aravis-ARAVIS_0_6_0/po/LINGUAS000066400000000000000000000002041334570641500156600ustar00rootroot00000000000000# please keep this list sorted alphabetically # bs ca cs da de el es eu fi fr hu id lv oc pl pt pt_BR ru sl sr sr@latin sv tr zh_CN aravis-ARAVIS_0_6_0/po/POTFILES.in000066400000000000000000000002551334570641500164160ustar00rootroot00000000000000# List of source files containing translatable strings. [type: gettext/glade]viewer/arv-viewer.ui viewer/data/arv-viewer.desktop.in.in viewer/data/arv-viewer.appdata.xml.in aravis-ARAVIS_0_6_0/po/POTFILES.skip000066400000000000000000000002661334570641500167600ustar00rootroot00000000000000viewer/data/arv-viewer.desktop.in viewer/data/arv-viewer.appdata.xml # Workaround intltool bug https://bugs.launchpad.net/intltool/+bug/1117944 sub/viewer/data/arv-viewer.desktop.in aravis-ARAVIS_0_6_0/po/bs.po000066400000000000000000000051751334570641500156130ustar00rootroot00000000000000# Bosnian translation for bosnianuniversetranslation # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the bosnianuniversetranslation package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: bosnianuniversetranslation\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=aravis&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-02-27 03:48+0000\n" "PO-Revision-Date: 2015-02-19 17:15+0100\n" "Last-Translator: Samir Ribic \n" "Language-Team: Bosnian \n" "Language: bs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-10-23 07:21+0000\n" "X-Generator: Launchpad (build 17203)\n" #: ../viewer/arv-viewer.ui.h:1 ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer.ui.h:2 msgid "Frame rate:" msgstr "Protok kadrova:" #: ../viewer/arv-viewer.ui.h:3 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer.ui.h:4 msgid "Auto" msgstr "Automatsko" #: ../viewer/arv-viewer.ui.h:5 msgid "Exposure:" msgstr "Ekspozicija:" #: ../viewer/arv-viewer.ui.h:6 msgid "Gain:" msgstr "Pojačanje:" #: ../viewer/arv-viewer.ui.h:7 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer.ui.h:8 msgid "Settings" msgstr "Postavke" #: ../viewer/arv-viewer.ui.h:9 msgid "Save a snapshot into image folder" msgstr "Snimi snimak ekrana u direktorij s slikama" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Aravis prosti preglednik" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Prikaži video tok iz kamera" #: ../viewer/data/arv-viewer.appdata.xml.in.h:1 msgid "Aravis Viewer" msgstr "Aravis preglednik" #: ../viewer/data/arv-viewer.appdata.xml.in.h:2 msgid "Simple viewer of video stream acquired using Aravis" msgstr "Prosti preglednik video tokova dobijenih programom Aravis" #: ../viewer/data/arv-viewer.appdata.xml.in.h:3 msgid "" "Aravis Viewer is a simple viewer used to display video streams from GENICAM-" "based Ethernet industrial cameras." msgstr "" "Aravis Viewer je prosti preglednik za prikaz video tokova iz GENICAM-" "baziranih Ethernet industrijskih kamera." #: ../viewer/data/arv-viewer.appdata.xml.in.h:4 msgid "" "It allows to control basic acquisition parameters, i.e. framerate, exposure " "and gain, and to save raw still images." msgstr "" "Dopušta kontrolu osnovnih parametara dohvatanja, tj. broja kadrova, " "ekspozicije i pojačanja i mogućnost snimanja sirovih sporih slika" aravis-ARAVIS_0_6_0/po/ca.po000066400000000000000000000033071334570641500155650ustar00rootroot00000000000000# Catalan translation for aravis. # Copyright (C) 2015 aravis's COPYRIGHT HOLDER # This file is distributed under the same license as the aravis package. # Robert Antoni Buj Gelonch , 2015. # msgid "" msgstr "" "Project-Id-Version: aravis master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=aravis&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-11-29 15:53+0000\n" "PO-Revision-Date: 2015-11-30 00:20+0100\n" "Last-Translator: Robert Antoni Buj Gelonch \n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.6\n" #: ../viewer/arv-viewer.ui.h:1 ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer.ui.h:2 msgid "Frame rate:" msgstr "Velocitat dels fotogrames:" #: ../viewer/arv-viewer.ui.h:3 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer.ui.h:4 msgid "Auto" msgstr "Automàtic" #: ../viewer/arv-viewer.ui.h:5 msgid "Exposure:" msgstr "Exposició:" #: ../viewer/arv-viewer.ui.h:6 msgid "Gain:" msgstr "Guany:" #: ../viewer/arv-viewer.ui.h:7 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer.ui.h:8 msgid "Settings" msgstr "Configuració" #: ../viewer/arv-viewer.ui.h:9 msgid "Save a snapshot into image folder" msgstr "Desa una instantània a la carpeta d'imatges" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Visor simple Aravis" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Visualitzeu el flux de vídeo de les vostres càmeres" aravis-ARAVIS_0_6_0/po/cs.po000066400000000000000000000052401334570641500156050ustar00rootroot00000000000000# Czech translation for aravis. # Copyright (C) 2013 aravis's COPYRIGHT HOLDER # This file is distributed under the same license as the aravis package. # Marek Černocký , 2013, 2014. # msgid "" msgstr "" "Project-Id-Version: aravis master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=aravis&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2014-08-15 19:58+0000\n" "PO-Revision-Date: 2018-05-05 20:39+0200\n" "Last-Translator: Jaroslav Svoboda \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Gtranslator 2.91.6\n" #: ../viewer/arv-viewer.ui.h:1 ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer.ui.h:2 msgid "Frame rate:" msgstr "Snímková frekvence :" #: ../viewer/arv-viewer.ui.h:3 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer.ui.h:4 msgid "Auto" msgstr "Automat" #: ../viewer/arv-viewer.ui.h:5 msgid "Exposure:" msgstr "Expozice:" #: ../viewer/arv-viewer.ui.h:6 msgid "Gain:" msgstr "Zisk:" #: ../viewer/arv-viewer.ui.h:7 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer.ui.h:8 msgid "Settings" msgstr "Nastavení" #: ../viewer/arv-viewer.ui.h:9 msgid "Save a snapshot into image folder" msgstr "Uložit snímek do složky obrázků" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Jednoduchý prohlížeč Aravis" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Zobrazit video stream z vašich kamer" #: ../viewer/data/arv-viewer.appdata.xml.in.h:1 msgid "Aravis Viewer" msgstr "Prohlížeč Aravis" #: ../viewer/data/arv-viewer.appdata.xml.in.h:2 msgid "Simple viewer of video stream acquired using Aravis" msgstr "Jednoduchý prohlížeč video streamů získaných pomocí Aravis" #: ../viewer/data/arv-viewer.appdata.xml.in.h:3 msgid "" "Aravis Viewer is a simple viewer used to display video streams from GENICAM-" "based Ethernet industrial cameras." msgstr "" "Prohlížeč Aravis je jednoduchý prohlížeč sloužící k zobrazení video " "streamů z průmyslových kamer typu GENICAM připojených přes Ethernet." #: ../viewer/data/arv-viewer.appdata.xml.in.h:4 msgid "" "It allows to control basic acquisition parameters, i.e. framerate, exposure " "and gain, and to save raw still images." msgstr "" "Umožňuje nastavit základní parametry snímání, tj. snímkovou frekvenci, expozici " "a zisk a také ukládat jednotlivé RAW snímky." aravis-ARAVIS_0_6_0/po/da.po000066400000000000000000000034731334570641500155720ustar00rootroot00000000000000# Danish translation for aravis. # Copyright (C) 2013 aravis's COPYRIGHT HOLDER # This file is distributed under the same license as the aravis package. # Joe Hansen , 2013. # msgid "" msgstr "" "Project-Id-Version: aravis master\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-10-15 18:45+0200\n" "PO-Revision-Date: 2013-09-10 08:39+0000\n" "Last-Translator: Joe Hansen \n" "Language-Team: Danish \n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../viewer/arv-viewer-2.ui.h:1 ../viewer/arv-viewer-3.ui.h:1 #: ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer-2.ui.h:2 ../viewer/arv-viewer-3.ui.h:2 msgid "Frame rate:" msgstr "Billedhastighed:" #: ../viewer/arv-viewer-2.ui.h:3 ../viewer/arv-viewer-3.ui.h:5 msgid "Exposure:" msgstr "Belysning:" #: ../viewer/arv-viewer-2.ui.h:4 ../viewer/arv-viewer-3.ui.h:6 msgid "Gain:" msgstr "Forstærkning:" #: ../viewer/arv-viewer-2.ui.h:5 ../viewer/arv-viewer-3.ui.h:3 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer-2.ui.h:6 ../viewer/arv-viewer-3.ui.h:7 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer-2.ui.h:7 ../viewer/arv-viewer-3.ui.h:4 msgid "Auto" msgstr "Auto" #: ../viewer/arv-viewer-2.ui.h:8 ../viewer/arv-viewer-3.ui.h:8 msgid "Settings" msgstr "Indstillinger" #: ../viewer/arv-viewer-3.ui.h:9 msgid "Save a snapshot into image folder" msgstr "Gem et øjebliksbillede i en billedmappe" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Aravis - simpel fremviser" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Vis videostrømmen fra dine kameraer" aravis-ARAVIS_0_6_0/po/de.po000066400000000000000000000037461334570641500156010ustar00rootroot00000000000000# German translation for aravis. # Copyright (C) 2013 aravis's COPYRIGHT HOLDER # This file is distributed under the same license as the aravis package. # Christian Kirbach , 2013. # msgid "" msgstr "" "Project-Id-Version: aravis aravis-0-2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=aravis&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2013-06-09 21:12+0000\n" "PO-Revision-Date: 2013-06-14 08:14+0100\n" "Last-Translator: Christian Kirbach \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.5.5\n" #: ../viewer/arv-viewer-2.ui.h:1 ../viewer/arv-viewer-3.ui.h:1 #: ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer-2.ui.h:2 ../viewer/arv-viewer-3.ui.h:2 msgid "Frame rate:" msgstr "Bildrate:" #: ../viewer/arv-viewer-2.ui.h:3 ../viewer/arv-viewer-3.ui.h:5 msgid "Exposure:" msgstr "Belichtung:" #: ../viewer/arv-viewer-2.ui.h:4 ../viewer/arv-viewer-3.ui.h:6 msgid "Gain:" msgstr "Verstärkungsgrad:" #: ../viewer/arv-viewer-2.ui.h:5 ../viewer/arv-viewer-3.ui.h:3 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer-2.ui.h:6 ../viewer/arv-viewer-3.ui.h:7 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer-2.ui.h:7 ../viewer/arv-viewer-3.ui.h:4 msgid "Auto" msgstr "Automatisch" #: ../viewer/arv-viewer-2.ui.h:8 ../viewer/arv-viewer-3.ui.h:8 msgid "Settings" msgstr "Einstellungen" #: ../viewer/arv-viewer-3.ui.h:9 msgid "Save a snapshot into image folder" msgstr "Einen Schnappschuss in einen Bilderordner speichern" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Aravis Bildbetrachter" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Den Videostrom von Ihren Kameras anzeigen" aravis-ARAVIS_0_6_0/po/el.po000066400000000000000000000061661334570641500156100ustar00rootroot00000000000000# Greek translation for aravis. # Copyright (C) 2013 aravis's COPYRIGHT HOLDER # This file is distributed under the same license as the aravis package. # Dimitris Spingos , 2013. # Dimitris Spingos (Δημήτρης Σπίγγος) , 2013. msgid "" msgstr "" "Project-Id-Version: aravis master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=aravis&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-03-12 15:48+0000\n" "PO-Revision-Date: 2015-08-30 13:08+0300\n" "Last-Translator: Tom Tryfonidis \n" "Language-Team: team@gnome.gr\n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.4\n" "X-Project-Style: gnome\n" #: ../viewer/arv-viewer.ui.h:1 ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer.ui.h:2 msgid "Frame rate:" msgstr "Ρυθμός καρέ:" #: ../viewer/arv-viewer.ui.h:3 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer.ui.h:4 msgid "Auto" msgstr "Αυτόματα" #: ../viewer/arv-viewer.ui.h:5 msgid "Exposure:" msgstr "Έκθεση:" #: ../viewer/arv-viewer.ui.h:6 msgid "Gain:" msgstr "Κέρδος:" #: ../viewer/arv-viewer.ui.h:7 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer.ui.h:8 msgid "Settings" msgstr "Ρυθμίσεις" #: ../viewer/arv-viewer.ui.h:9 msgid "Save a snapshot into image folder" msgstr "Αποθήκευση ενός στιγμιοτύπου στον φάκελο εικόνας" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Απλό πρόγραμμα προβολής Aravis" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Εμφανίστε τα βίντεο από τις κάμερές σας" #: ../viewer/data/arv-viewer.appdata.xml.in.h:1 msgid "Aravis Viewer" msgstr "Πρόγραμμα προβολής Aravis" #: ../viewer/data/arv-viewer.appdata.xml.in.h:2 msgid "Simple viewer of video stream acquired using Aravis" msgstr "" "Απλός προβολέας ροής βίντεο που έχει αποκτηθεί χρησιμοποιώντας το Aravis" #: ../viewer/data/arv-viewer.appdata.xml.in.h:3 msgid "" "Aravis Viewer is a simple viewer used to display video streams from GENICAM-" "based Ethernet industrial cameras." msgstr "" "Ο Προβολέας Aravis είναι ένας απλός προβολέας ο οποίος χρησιμοποιείται για " "να απεικονίζει ροές βίντεο βασισμένα σε βιομηχανικές κάμερες GENICAM" #: ../viewer/data/arv-viewer.appdata.xml.in.h:4 msgid "" "It allows to control basic acquisition parameters, i.e. framerate, exposure " "and gain, and to save raw still images." msgstr "" "Επιτρέπει τον έλεγχο βασικό παραμέτρων λήψης, π.χ. τον ρυθμό καρέ, έκθεσης, " "κέρδους και της αποθήκευσης μη συμπιεσμένων εικόνων." aravis-ARAVIS_0_6_0/po/es.po000066400000000000000000000053011334570641500156050ustar00rootroot00000000000000# Spanish translation for aravis. # Copyright (C) 2013 aravis's COPYRIGHT HOLDER # This file is distributed under the same license as the aravis package. # Daniel Mustieles , 2013, 2014. # msgid "" msgstr "" "Project-Id-Version: aravis master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=aravis&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2014-08-15 19:58+0000\n" "PO-Revision-Date: 2014-08-26 17:50+0200\n" "Last-Translator: Daniel Mustieles \n" "Language-Team: Español; Castellano \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 2.91.6\n" #: ../viewer/arv-viewer.ui.h:1 ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer.ui.h:2 msgid "Frame rate:" msgstr "Tasa de fotogramas:" #: ../viewer/arv-viewer.ui.h:3 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer.ui.h:4 msgid "Auto" msgstr "Automático" #: ../viewer/arv-viewer.ui.h:5 msgid "Exposure:" msgstr "Exposición:" #: ../viewer/arv-viewer.ui.h:6 msgid "Gain:" msgstr "Ganancia:" #: ../viewer/arv-viewer.ui.h:7 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer.ui.h:8 msgid "Settings" msgstr "Configuración" #: ../viewer/arv-viewer.ui.h:9 msgid "Save a snapshot into image folder" msgstr "Guardar una captura en la carpeta de imágenes" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Visor simple Aravis" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Mostrar el flujo de vídeo de sus cámaras" #: ../viewer/data/arv-viewer.appdata.xml.in.h:1 #| msgid "Aravis Simple Viewer" msgid "Aravis Viewer" msgstr "Visor Aravis" #: ../viewer/data/arv-viewer.appdata.xml.in.h:2 msgid "Simple viewer of video stream acquired using Aravis" msgstr "Sencillo visor de flujos de vídeos adquiridos usando Aravis" #: ../viewer/data/arv-viewer.appdata.xml.in.h:3 msgid "" "Aravis Viewer is a simple viewer used to display video streams from GENICAM-" "based Ethernet industrial cameras." msgstr "" "El visor Aravis es un sencillo visor usado para mostrar flujos de vídeo de " "cámaras industriales basadas en Ethernet GENICAM." #: ../viewer/data/arv-viewer.appdata.xml.in.h:4 msgid "" "It allows to control basic acquisition parameters, i.e. framerate, exposure " "and gain, and to save raw still images." msgstr "" "Permite controlar los parámetros básicos de adquisición, como pueden ser la " "tasa de marcos, exposición y ganancia y guardar imágenes en formato RAW." aravis-ARAVIS_0_6_0/po/eu.po000066400000000000000000000033461334570641500156160ustar00rootroot00000000000000# Basque translation for aravis # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Iñaki Larrañaga Murgoitio , 2014. msgid "" msgstr "" "Project-Id-Version: aravis master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=aravis&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2014-05-01 12:09+0200\n" "PO-Revision-Date: 2014-05-01 12:12+0200\n" "Last-Translator: Iñaki Larrañaga Murgoitio \n" "Language-Team: Basque \n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Lokalize 1.4\n" #: ../viewer/arv-viewer-3.ui.h:1 ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer-3.ui.h:2 msgid "Frame rate:" msgstr "Fotograma-emaria:" #: ../viewer/arv-viewer-3.ui.h:3 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer-3.ui.h:4 msgid "Auto" msgstr "Automatikoa" #: ../viewer/arv-viewer-3.ui.h:5 msgid "Exposure:" msgstr "Esposizioa:" #: ../viewer/arv-viewer-3.ui.h:6 msgid "Gain:" msgstr "Irabazia:" #: ../viewer/arv-viewer-3.ui.h:7 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer-3.ui.h:8 msgid "Settings" msgstr "Ezarpenak" #: ../viewer/arv-viewer-3.ui.h:9 msgid "Save a snapshot into image folder" msgstr "Gorde pantaila-argazkia irudien karpetan" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Aravis ikustaile xumea" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Bistaratu bideo-korronteak kameretatik" aravis-ARAVIS_0_6_0/po/fi.po000066400000000000000000000046751334570641500156110ustar00rootroot00000000000000# Finnish translation for aravis. # Copyright (C) 2015 aravis's COPYRIGHT HOLDER # This file is distributed under the same license as the aravis package. # Jiri Grönroos , 2015. # msgid "" msgstr "" "Project-Id-Version: aravis master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=aravis&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-10-07 14:55+0000\n" "PO-Revision-Date: 2015-10-07 19:10+0300\n" "Last-Translator: Jiri Grönroos \n" "Language-Team: suomi \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 2.91.6\n" #: ../viewer/arv-viewer.ui.h:1 ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer.ui.h:2 msgid "Frame rate:" msgstr "Kuvanopeus:" #: ../viewer/arv-viewer.ui.h:3 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer.ui.h:4 msgid "Auto" msgstr "Automaattinen" #: ../viewer/arv-viewer.ui.h:5 msgid "Exposure:" msgstr "Valotus:" #: ../viewer/arv-viewer.ui.h:6 msgid "Gain:" msgstr "" #: ../viewer/arv-viewer.ui.h:7 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer.ui.h:8 msgid "Settings" msgstr "Asetukset" #: ../viewer/arv-viewer.ui.h:9 msgid "Save a snapshot into image folder" msgstr "Tallenna tilannekuva kuvakansioon" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Katsele videovirtaa kameroista" #: ../viewer/data/arv-viewer.appdata.xml.in.h:1 msgid "Aravis Viewer" msgstr "Aravis-katselin" #: ../viewer/data/arv-viewer.appdata.xml.in.h:2 msgid "Simple viewer of video stream acquired using Aravis" msgstr "Yksinkertainen katselin Aravis-videovirtoihin" #: ../viewer/data/arv-viewer.appdata.xml.in.h:3 msgid "" "Aravis Viewer is a simple viewer used to display video streams from GENICAM-" "based Ethernet industrial cameras." msgstr "" "Aravis-katselin on yksinkertainen katselin, jonka avulla voi katsella " "videovirtoja GENICAM-pohjaisista Ethernet-liitännäisistä " "teollisuuskameroista." #: ../viewer/data/arv-viewer.appdata.xml.in.h:4 msgid "" "It allows to control basic acquisition parameters, i.e. framerate, exposure " "and gain, and to save raw still images." msgstr "" aravis-ARAVIS_0_6_0/po/fr.po000066400000000000000000000034411334570641500156100ustar00rootroot00000000000000# French translation for aravis # Copyright (C) 2010 Emmanuel Pacaud # This file is distributed under the same license as the aravis package. # msgid "" msgstr "" "Project-Id-Version: aravis master\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-01-09 13:46+0100\n" "PO-Revision-Date: 2010-12-04 22:56+0100\n" "Last-Translator: Emmanuel Pacaud \n" "Language-Team: Emmanuel Pacaud \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: ../viewer/arv-viewer-2.ui.h:1 ../viewer/arv-viewer-3.ui.h:1 #: ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer-2.ui.h:2 ../viewer/arv-viewer-3.ui.h:2 msgid "Frame rate:" msgstr "Fréquence" #: ../viewer/arv-viewer-2.ui.h:3 ../viewer/arv-viewer-3.ui.h:5 msgid "Exposure:" msgstr "Exposition" #: ../viewer/arv-viewer-2.ui.h:4 ../viewer/arv-viewer-3.ui.h:6 msgid "Gain:" msgstr "Gain" #: ../viewer/arv-viewer-2.ui.h:5 ../viewer/arv-viewer-3.ui.h:3 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer-2.ui.h:6 ../viewer/arv-viewer-3.ui.h:7 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer-2.ui.h:7 ../viewer/arv-viewer-3.ui.h:4 msgid "Auto" msgstr "Auto" #: ../viewer/arv-viewer-2.ui.h:8 ../viewer/arv-viewer-3.ui.h:8 msgid "Settings" msgstr "Paramètres" #: ../viewer/arv-viewer-3.ui.h:9 msgid "Save a snapshot into image folder" msgstr "Sauvegarde d'une capture dans le dossier images" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Visualisateur de vidéo Aravis" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Affiche le flux vidéo de caméras Genicam" aravis-ARAVIS_0_6_0/po/hu.po000066400000000000000000000065541334570641500156250ustar00rootroot00000000000000# Hungarian translation for aravis. # Copyright (C) 2013, 2014, 2016 Free Software Foundation, Inc. # This file is distributed under the same license as the aravis package. # # Balázs Úr , 2013, 2014. # Balázs Meskó , 2016. msgid "" msgstr "" "Project-Id-Version: aravis master\n" "Report-Msgid-Bugs-To: https://github.com/AravisProject/aravis/issues\n" "POT-Creation-Date: 2016-08-30 02:24+0000\n" "PO-Revision-Date: 2016-08-30 16:10+0200\n" "Last-Translator: Meskó Balázs \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.8\n" #: ../viewer/arv-viewer.ui.h:1 msgid "Frame rate:" msgstr "Képkockasebesség:" #: ../viewer/arv-viewer.ui.h:2 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer.ui.h:3 msgid "Auto" msgstr "Automatikus" #: ../viewer/arv-viewer.ui.h:4 msgid "Exposure:" msgstr "Expozíció:" #: ../viewer/arv-viewer.ui.h:5 msgid "Gain:" msgstr "Nyereség:" #: ../viewer/arv-viewer.ui.h:6 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer.ui.h:7 msgid "dB" msgstr "dB" #: ../viewer/arv-viewer.ui.h:8 msgid "Id" msgstr "Azonosító" #: ../viewer/arv-viewer.ui.h:9 msgid "Manufacturer" msgstr "Gyártó" #: ../viewer/arv-viewer.ui.h:10 msgid "Model" msgstr "Modell" #: ../viewer/arv-viewer.ui.h:11 msgid "Serial" msgstr "Soros" #: ../viewer/arv-viewer.ui.h:12 msgid "Refresh camera list" msgstr "Kameralista frissítése" #: ../viewer/arv-viewer.ui.h:13 msgid "__glade_unnamed_23" msgstr "__glade_unnamed_23" #: ../viewer/arv-viewer.ui.h:14 msgid "Start video acquisition" msgstr "Videovétel indítása" #: ../viewer/arv-viewer.ui.h:15 msgid "__glade_unnamed_24" msgstr "__glade_unnamed_24" #: ../viewer/arv-viewer.ui.h:16 msgid "Pixel format:" msgstr "Képpontformátum:" #: ../viewer/arv-viewer.ui.h:17 msgid "Region size:" msgstr "Terület mérete:" #: ../viewer/arv-viewer.ui.h:18 msgid "x" msgstr "x" #: ../viewer/arv-viewer.ui.h:19 msgid "pixels" msgstr "képpont" #: ../viewer/arv-viewer.ui.h:20 msgid "Region position:" msgstr "Terület pozíciója:" #: ../viewer/arv-viewer.ui.h:21 msgid "Binning:" msgstr "Csoportokra osztás:" #: ../viewer/arv-viewer.ui.h:22 msgid "page0" msgstr "oldal0" #: ../viewer/arv-viewer.ui.h:23 msgid "page1" msgstr "oldal1" #: ../viewer/arv-viewer.ui.h:24 msgid "Return to camera list" msgstr "Vissza a kameralistához" #: ../viewer/arv-viewer.ui.h:25 msgid "Save a snapshot into image folder" msgstr "Pillanatkép mentése a képmappába" #: ../viewer/arv-viewer.ui.h:26 msgid "Rotate image to the right" msgstr "A kép elforgatása jobbra" #: ../viewer/arv-viewer.ui.h:27 msgid "Flip image horizontally" msgstr "A kép vízszintes tükrözése" #: ../viewer/arv-viewer.ui.h:28 msgid "Flip image vertically" msgstr "A kép függőleges tükrözése" #: ../viewer/arv-viewer.ui.h:29 msgid "Acquisition settings" msgstr "Vételi beállítások" #: ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Aravis egyszerű megjelenítő" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "A videofolyam megjelenítése a kamerákról" aravis-ARAVIS_0_6_0/po/id.po000066400000000000000000000050641334570641500156000ustar00rootroot00000000000000# Indonesian translation for aravis. # Copyright (C) 2013 aravis's COPYRIGHT HOLDER # This file is distributed under the same license as the aravis package. # Andika Triwidada , 2013. # msgid "" msgstr "" "Project-Id-Version: aravis aravis-0-2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=aravis&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2014-08-15 19:58+0000\n" "PO-Revision-Date: 2014-09-05 20:17+0700\n" "Last-Translator: Andika Triwidada \n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.6.9\n" #: ../viewer/arv-viewer.ui.h:1 ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer.ui.h:2 msgid "Frame rate:" msgstr "Laju frame" #: ../viewer/arv-viewer.ui.h:3 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer.ui.h:4 msgid "Auto" msgstr "Otomatis" #: ../viewer/arv-viewer.ui.h:5 msgid "Exposure:" msgstr "Eksposur:" #: ../viewer/arv-viewer.ui.h:6 msgid "Gain:" msgstr "Penguatan:" #: ../viewer/arv-viewer.ui.h:7 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer.ui.h:8 msgid "Settings" msgstr "Pengaturan" #: ../viewer/arv-viewer.ui.h:9 msgid "Save a snapshot into image folder" msgstr "Simpan snapshot ke folder gambar" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Aravis Peninjau Sederhana" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Menampilkan stream video dari kamera Anda" #: ../viewer/data/arv-viewer.appdata.xml.in.h:1 msgid "Aravis Viewer" msgstr "Aravis Penampil" #: ../viewer/data/arv-viewer.appdata.xml.in.h:2 msgid "Simple viewer of video stream acquired using Aravis" msgstr "Penampil stream video sederhana yang diperoleh memakai Aravis" #: ../viewer/data/arv-viewer.appdata.xml.in.h:3 msgid "" "Aravis Viewer is a simple viewer used to display video streams from GENICAM-" "based Ethernet industrial cameras." msgstr "" "Penampil Aravis adalah sebuah penampil sederhana yang dipakai untuk " "menyajikan stream vide dari kamera industrial Ethernet berbasis GENICAM." #: ../viewer/data/arv-viewer.appdata.xml.in.h:4 msgid "" "It allows to control basic acquisition parameters, i.e. framerate, exposure " "and gain, and to save raw still images." msgstr "" "Ini memungkinkan untuk mengendalikan parameter akuisisi dasar, mis., laju " "rangka, pencahayaan dan penguatan, dan untuk menyimpan citra diam mentah." aravis-ARAVIS_0_6_0/po/lv.po000066400000000000000000000036611334570641500156260ustar00rootroot00000000000000# This file is distributed under the same license as the aravis package. # # Rūdolfs Mazurs , 2013. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=aravis&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2013-09-28 08:58+0000\n" "PO-Revision-Date: 2013-10-03 15:44+0300\n" "Last-Translator: Rūdolfs Mazurs \n" "Language-Team: Latvian \n" "Language: lv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " "2);\n" "X-Generator: Lokalize 1.5\n" #: ../viewer/arv-viewer-2.ui.h:1 ../viewer/arv-viewer-3.ui.h:1 #: ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer-2.ui.h:2 ../viewer/arv-viewer-3.ui.h:2 msgid "Frame rate:" msgstr "Kadru nomaiņas ātrums:" #: ../viewer/arv-viewer-2.ui.h:3 ../viewer/arv-viewer-3.ui.h:5 msgid "Exposure:" msgstr "Ekspozīcija:" #: ../viewer/arv-viewer-2.ui.h:4 ../viewer/arv-viewer-3.ui.h:6 msgid "Gain:" msgstr "Pieaugums:" #: ../viewer/arv-viewer-2.ui.h:5 ../viewer/arv-viewer-3.ui.h:3 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer-2.ui.h:6 ../viewer/arv-viewer-3.ui.h:7 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer-2.ui.h:7 ../viewer/arv-viewer-3.ui.h:4 msgid "Auto" msgstr "Automātiski" #: ../viewer/arv-viewer-2.ui.h:8 ../viewer/arv-viewer-3.ui.h:8 msgid "Settings" msgstr "Iestatījumi" #: ../viewer/arv-viewer-3.ui.h:9 msgid "Save a snapshot into image folder" msgstr "Saglabāt momentuzņēmumu attēla mapē" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Aravis vienkāršais skatītājs" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Rāda video straumes no jūsu kamerām" aravis-ARAVIS_0_6_0/po/meson.build000066400000000000000000000003161334570641500170010ustar00rootroot00000000000000add_project_arguments('-DGETTEXT_PACKAGE="aravis-@0@"'.format (aravis_api_version), language:'c') i18n.gettext ('aravis-@0@'.format (aravis_api_version), args: '--directory=' + meson.source_root()) aravis-ARAVIS_0_6_0/po/oc.po000066400000000000000000000047201334570641500156030ustar00rootroot00000000000000# Occitan translation for aravis # Copyright (C) 2010 Emmanuel Pacaud # This file is distributed under the same license as the aravis package. # Cédric Valmary (totenoc.org) , 2013. # Cédric Valmary (Tot en òc) , 2015. # Cédric Valmary (totenoc.eu) , 2015. msgid "" msgstr "" "Project-Id-Version: aravis master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=aravis" "&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-05-20 16:18+0000\n" "PO-Revision-Date: 2015-06-07 15:47+0200\n" "Last-Translator: Cédric Valmary (totenoc.eu) \n" "Language-Team: Tot En Òc\n" "Language: oc\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Virtaal 0.7.1\n" "X-Project-Style: gnome\n" #: ../viewer/arv-viewer.ui.h:1 ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer.ui.h:2 msgid "Frame rate:" msgstr "Frequéncia" #: ../viewer/arv-viewer.ui.h:3 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer.ui.h:4 msgid "Auto" msgstr "Auto" #: ../viewer/arv-viewer.ui.h:5 msgid "Exposure:" msgstr "Exposicion" #: ../viewer/arv-viewer.ui.h:6 msgid "Gain:" msgstr "Ganh" #: ../viewer/arv-viewer.ui.h:7 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer.ui.h:8 msgid "Settings" msgstr "Paramètres" #: ../viewer/arv-viewer.ui.h:9 msgid "Save a snapshot into image folder" msgstr "Salvament d'una captura dins lo dorsièr imatges" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Visualizador de vidèo Aravis" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Aficha lo flux vidèo de camèras Genicam" #: ../viewer/data/arv-viewer.appdata.xml.in.h:1 #| msgid "Aravis Simple Viewer" msgid "Aravis Viewer" msgstr "Visualizador de vidèo Aravis" #: ../viewer/data/arv-viewer.appdata.xml.in.h:2 msgid "Simple viewer of video stream acquired using Aravis" msgstr "" #: ../viewer/data/arv-viewer.appdata.xml.in.h:3 msgid "" "Aravis Viewer is a simple viewer used to display video streams from GENICAM-" "based Ethernet industrial cameras." msgstr "" #: ../viewer/data/arv-viewer.appdata.xml.in.h:4 msgid "" "It allows to control basic acquisition parameters, i.e. framerate, exposure " "and gain, and to save raw still images." msgstr "" aravis-ARAVIS_0_6_0/po/pl.po000066400000000000000000000054311334570641500156150ustar00rootroot00000000000000# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- # Aviary.pl # Jeśli masz jakiekolwiek uwagi odnoszące się do tłumaczenia lub chcesz # pomóc w jego rozwijaniu i pielęgnowaniu, napisz do nas: # gnomepl@aviary.pl # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- # Piotr Drąg , 2013-2014. # Aviary.pl , 2013-2014. msgid "" msgstr "" "Project-Id-Version: aravis\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-08-15 21:53+0200\n" "PO-Revision-Date: 2014-08-15 21:57+0200\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" "X-Poedit-Language: Polish\n" "X-Poedit-Country: Poland\n" #: ../viewer/arv-viewer.ui.h:1 ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer.ui.h:2 msgid "Frame rate:" msgstr "Liczba klatek na sekundę:" #: ../viewer/arv-viewer.ui.h:3 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer.ui.h:4 msgid "Auto" msgstr "Automatycznie" #: ../viewer/arv-viewer.ui.h:5 msgid "Exposure:" msgstr "Naświetlenie:" #: ../viewer/arv-viewer.ui.h:6 msgid "Gain:" msgstr "Wzmocnienie:" #: ../viewer/arv-viewer.ui.h:7 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer.ui.h:8 msgid "Settings" msgstr "Ustawienia" #: ../viewer/arv-viewer.ui.h:9 msgid "Save a snapshot into image folder" msgstr "Zapis migawki do katalogu obrazów" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Prosta przeglądarka Aravis" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Wyświetlanie strumienia wideo z kamery" #: ../viewer/data/arv-viewer.appdata.xml.in.h:1 msgid "Aravis Viewer" msgstr "Przeglądarka Aravis" #: ../viewer/data/arv-viewer.appdata.xml.in.h:2 msgid "Simple viewer of video stream acquired using Aravis" msgstr "Prosta przeglądarka strumieni wideo uzyskanych używając Aravis" #: ../viewer/data/arv-viewer.appdata.xml.in.h:3 msgid "" "Aravis Viewer is a simple viewer used to display video streams from GENICAM-" "based Ethernet industrial cameras." msgstr "" "Prosta przeglądarka Aravis może być używana do wyświetlania strumieni wideo " "z przemysłowych kamer ethernetowych opartych o GENICAM." #: ../viewer/data/arv-viewer.appdata.xml.in.h:4 msgid "" "It allows to control basic acquisition parameters, i.e. framerate, exposure " "and gain, and to save raw still images." msgstr "" "Umożliwia kontrolowanie podstawowych parametrów, tzn. liczby klatek na " "sekundę, naświetlenia i wzmocnienia, a także zapisywanie surowych obrazów." aravis-ARAVIS_0_6_0/po/pt.po000066400000000000000000000053451334570641500156310ustar00rootroot00000000000000# Portuguese translation for aravis. # Copyright (C) 2014 aravis's COPYRIGHT HOLDER # This file is distributed under the same license as the aravis package. # Tiagosdot , 2014. # Pedro Albuquerque , 2015. # msgid "" msgstr "" "Project-Id-Version: aravis master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=aravis&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-08-13 14:51+0000\n" "PO-Revision-Date: 2015-08-13 19:46+0100\n" "Last-Translator: Pedro Albuquerque \n" "Language-Team: Português \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 2.91.6\n" "X-Project-Style: gnome\n" #: ../viewer/arv-viewer.ui.h:1 ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer.ui.h:2 msgid "Frame rate:" msgstr "Taxa de molduras" #: ../viewer/arv-viewer.ui.h:3 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer.ui.h:4 msgid "Auto" msgstr "Auto" #: ../viewer/arv-viewer.ui.h:5 msgid "Exposure:" msgstr "Exposição:" #: ../viewer/arv-viewer.ui.h:6 msgid "Gain:" msgstr "Ganho:" #: ../viewer/arv-viewer.ui.h:7 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer.ui.h:8 msgid "Settings" msgstr "Definições" #: ../viewer/arv-viewer.ui.h:9 msgid "Save a snapshot into image folder" msgstr "Gravar um instantâneo na pasta de imagens" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Visualizador simples Aravis" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Mostrar o fluxo de vídeo das suas câmaras" #: ../viewer/data/arv-viewer.appdata.xml.in.h:1 #| msgid "Aravis Simple Viewer" msgid "Aravis Viewer" msgstr "Visualizador Aravis" #: ../viewer/data/arv-viewer.appdata.xml.in.h:2 msgid "Simple viewer of video stream acquired using Aravis" msgstr "Visualizador simples de fluxos vídeo adquiridos com o Aravis" #: ../viewer/data/arv-viewer.appdata.xml.in.h:3 msgid "" "Aravis Viewer is a simple viewer used to display video streams from GENICAM-" "based Ethernet industrial cameras." msgstr "" "O Aravis é um visualizador simples usado para mostrar fluxos de vídeo de " "câmaras industriais Ethernet baseadas em GENICAM." #: ../viewer/data/arv-viewer.appdata.xml.in.h:4 msgid "" "It allows to control basic acquisition parameters, i.e. framerate, exposure " "and gain, and to save raw still images." msgstr "" "Permite controlar parâmetros básicos de aquisição, por exemplo, taxa de " "molduras, exposição, ganho e gravar imagens raw fixas." aravis-ARAVIS_0_6_0/po/pt_BR.po000066400000000000000000000076331334570641500162160ustar00rootroot00000000000000# Brazilian Portuguese translation for aravis. # Copyright (C) 2017 aravis's COPYRIGHT HOLDER # This file is distributed under the same license as the aravis package. # Rafael Fontenelle , 2013, 2014, 2017. msgid "" msgstr "" "Project-Id-Version: aravis master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=aravis&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2017-10-02 04:14-0300\n" "PO-Revision-Date: 2017-10-02 04:16-0200\n" "Last-Translator: Rafael Fontenelle \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Virtaal 1.0.0-beta1\n" #: ../viewer/arv-viewer.ui.h:1 msgid "Frame rate:" msgstr "Taxa de quadros:" #: ../viewer/arv-viewer.ui.h:2 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer.ui.h:3 msgid "Auto" msgstr "Auto" #: ../viewer/arv-viewer.ui.h:4 msgid "Exposure:" msgstr "Exposição:" #: ../viewer/arv-viewer.ui.h:5 msgid "Gain:" msgstr "Ganho:" #: ../viewer/arv-viewer.ui.h:6 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer.ui.h:7 msgid "dB" msgstr "dB" #: ../viewer/arv-viewer.ui.h:8 msgid "Id" msgstr "Id" #: ../viewer/arv-viewer.ui.h:9 msgid "Manufacturer" msgstr "Fabricante" #: ../viewer/arv-viewer.ui.h:10 msgid "Model" msgstr "Modelo" #: ../viewer/arv-viewer.ui.h:11 msgid "Serial" msgstr "Serial" #: ../viewer/arv-viewer.ui.h:12 msgid "Refresh camera list" msgstr "Atualizar lista de câmeras" #: ../viewer/arv-viewer.ui.h:13 msgid "Start video acquisition" msgstr "Iniciar aquisição de vídeo" #: ../viewer/arv-viewer.ui.h:14 msgid "Pixel format:" msgstr "Formato de pixels:" #: ../viewer/arv-viewer.ui.h:15 msgid "Region size:" msgstr "Tamanho da região:" #: ../viewer/arv-viewer.ui.h:16 msgid "x" msgstr "x" #: ../viewer/arv-viewer.ui.h:17 msgid "pixels" msgstr "pixels" #: ../viewer/arv-viewer.ui.h:18 msgid "Region position:" msgstr "Posição da região:" #: ../viewer/arv-viewer.ui.h:19 msgid "Binning:" msgstr "Agrupamento:" #: ../viewer/arv-viewer.ui.h:20 msgid "Return to camera list" msgstr "Retornar à lista de câmeras" #: ../viewer/arv-viewer.ui.h:21 msgid "Save a snapshot into image folder" msgstr "Salvar uma foto na pasta de imagens" #: ../viewer/arv-viewer.ui.h:22 msgid "Rotate image to the right" msgstr "Girar imagem para a direita" #: ../viewer/arv-viewer.ui.h:23 msgid "Flip image horizontally" msgstr "Virar imagem horizontalmente" #: ../viewer/arv-viewer.ui.h:24 msgid "Flip image vertically" msgstr "Virar imagem verticalmente" #: ../viewer/arv-viewer.ui.h:25 msgid "Acquisition settings" msgstr "Configurações de aquisição" #: ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Visualizador simples Aravis" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Exiba o fluxo de vídeo de suas câmeras" #~ msgid "Settings" #~ msgstr "Configurações" #~ msgid "Aravis Viewer" #~ msgstr "Visualizador Aravis" #~ msgid "Simple viewer of video stream acquired using Aravis" #~ msgstr "Visualizador simples de fluxo de vídeo obtido usando Aravis" #~ msgid "" #~ "Aravis Viewer is a simple viewer used to display video streams from " #~ "GENICAM-based Ethernet industrial cameras." #~ msgstr "" #~ "Visualizador Aravis é um visualizar simples usado para exibir fluxos de " #~ "vídeos de câmeras industriais Ethernet baseadas em GENICAM." #~ msgid "" #~ "It allows to control basic acquisition parameters, i.e. framerate, " #~ "exposure and gain, and to save raw still images." #~ msgstr "" #~ "Ele permite que você controle parâmetros básicos de aquisição, i.e taxa " #~ "de quadros, exposição e ganho, e para salvar imagens não tradadas (raw)." aravis-ARAVIS_0_6_0/po/ru.po000066400000000000000000000042021334570641500156230ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: aravis-0-2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=aravis&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2013-11-28 22:26+0000\n" "PO-Revision-Date: 2013-12-18 22:38+0400\n" "Last-Translator: Yuri Myasoedov \n" "Language-Team: LANGUAGE \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 1.5.7\n" #: ../viewer/arv-viewer-2.ui.h:1 ../viewer/arv-viewer-3.ui.h:1 #: ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer-2.ui.h:2 ../viewer/arv-viewer-3.ui.h:2 msgid "Frame rate:" msgstr "Частота кадров:" #: ../viewer/arv-viewer-2.ui.h:3 ../viewer/arv-viewer-3.ui.h:5 msgid "Exposure:" msgstr "Экспозиция:" #: ../viewer/arv-viewer-2.ui.h:4 ../viewer/arv-viewer-3.ui.h:6 msgid "Gain:" msgstr "Усиление:" #: ../viewer/arv-viewer-2.ui.h:5 ../viewer/arv-viewer-3.ui.h:3 msgid "Hz" msgstr "Гц" #: ../viewer/arv-viewer-2.ui.h:6 ../viewer/arv-viewer-3.ui.h:7 msgid "µs" msgstr "мкс" #: ../viewer/arv-viewer-2.ui.h:7 ../viewer/arv-viewer-3.ui.h:4 msgid "Auto" msgstr "Авто" #: ../viewer/arv-viewer-2.ui.h:8 ../viewer/arv-viewer-3.ui.h:8 msgid "Settings" msgstr "Настройки" #: ../viewer/arv-viewer-3.ui.h:9 msgid "Save a snapshot into image folder" msgstr "Сохранить снимок в папку изображений" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Приложение для просмотра видеопотоков" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Показать видеопоток с ваших камер" aravis-ARAVIS_0_6_0/po/sk.po000066400000000000000000000051071334570641500156170ustar00rootroot00000000000000# Slovak translation for aravis. # Copyright (C) 2013 aravis's COPYRIGHT HOLDER # This file is distributed under the same license as the aravis package. # Jaroslav Svoboda , 2018. # msgid "" msgstr "" "Project-Id-Version: aravis master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=aravis&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2018-05-05 20:26+0000\n" "Last-Translator: Jaroslav Svoboda \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Gtranslator 2.91.6\n" #: ../viewer/arv-viewer.ui.h:1 ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer.ui.h:2 msgid "Frame rate:" msgstr "Snímková frekvencia:" #: ../viewer/arv-viewer.ui.h:3 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer.ui.h:4 msgid "Auto" msgstr "Automat" #: ../viewer/arv-viewer.ui.h:5 msgid "Exposure:" msgstr "Expozícia:" #: ../viewer/arv-viewer.ui.h:6 msgid "Gain:" msgstr "Zisk:" #: ../viewer/arv-viewer.ui.h:7 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer.ui.h:8 msgid "Settings" msgstr "Nastavenia" #: ../viewer/arv-viewer.ui.h:9 msgid "Save a snapshot into image folder" msgstr "Uložiť snímku do priečinka s obrázkami" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Jednoduchý prehliadač Aravis" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Zobrazit video stream z vašich kamier" #: ../viewer/data/arv-viewer.appdata.xml.in.h:1 msgid "Aravis Viewer" msgstr "Prehliadač Aravis" #: ../viewer/data/arv-viewer.appdata.xml.in.h:2 msgid "Simple viewer of video stream acquired using Aravis" msgstr "Jednoduchý prehliadač video streamu získaného pomocou Aravis" #: ../viewer/data/arv-viewer.appdata.xml.in.h:3 msgid "" "Aravis Viewer is a simple viewer used to display video streams from GENICAM-" "based Ethernet industrial cameras." msgstr "" "Prehliadač Aravis je jednoduchý prehliadač slúžiaci na zobrazenie video " "streamov z priemyselných kamier typu GENICAM pripojených cez Ethernet." #: ../viewer/data/arv-viewer.appdata.xml.in.h:4 msgid "" "It allows to control basic acquisition parameters, i.e. framerate, exposure " "and gain, and to save raw still images." msgstr "" "Umožňuje nastaviť základné parametre snímania, tj. snímkovú frekvenciu, expozíciu " "a zisk a tiež ukladať jednotlivé RAW snímky." aravis-ARAVIS_0_6_0/po/sl.po000066400000000000000000000052101334570641500156130ustar00rootroot00000000000000# Slovenian translation for aravis. # Copyright (C) 2013 aravis's COPYRIGHT HOLDER # This file is distributed under the same license as the aravis package. # # Martin Srebotnjak , 2013-2014. # msgid "" msgstr "" "Project-Id-Version: aravis master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=aravis&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2014-09-16 14:45+0000\n" "PO-Revision-Date: 2014-09-16 17:33+0100\n" "Last-Translator: Matej Urbančič \n" "Language-Team: Slovenian \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" "%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 1.5.4\n" #: ../viewer/arv-viewer.ui.h:1 ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer.ui.h:2 msgid "Frame rate:" msgstr "Hitrost:" #: ../viewer/arv-viewer.ui.h:3 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer.ui.h:4 msgid "Auto" msgstr "Samodejno" #: ../viewer/arv-viewer.ui.h:5 msgid "Exposure:" msgstr "Osvetlitev:" #: ../viewer/arv-viewer.ui.h:6 msgid "Gain:" msgstr "Ojačitev:" #: ../viewer/arv-viewer.ui.h:7 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer.ui.h:8 msgid "Settings" msgstr "Nastavitve" #: ../viewer/arv-viewer.ui.h:9 msgid "Save a snapshot into image folder" msgstr "Shrani zajeti fotogram v mapo slik" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Enostavni ogledovalnik Aravis" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Prikazovanje pretoka videa preko kamere" #: ../viewer/data/arv-viewer.appdata.xml.in.h:1 msgid "Aravis Viewer" msgstr "Pregledovalnik Aravis" #: ../viewer/data/arv-viewer.appdata.xml.in.h:2 msgid "Simple viewer of video stream acquired using Aravis" msgstr "Enostaven pregledovalnik video pretokov z uporabo protokola Aravis" #: ../viewer/data/arv-viewer.appdata.xml.in.h:3 msgid "" "Aravis Viewer is a simple viewer used to display video streams from GENICAM-" "based Ethernet industrial cameras." msgstr "" "Aravis je enostaven pregledovalnik video vsebin preko industrijskih eternet " "kamer GENICAM." #: ../viewer/data/arv-viewer.appdata.xml.in.h:4 msgid "" "It allows to control basic acquisition parameters, i.e. framerate, exposure " "and gain, and to save raw still images." msgstr "" "Omogoča nadzor osnovnih parametrov, kot so: hitrost predvajanja, osvetlitev " "in shranjevanje zaslonskih sličic." aravis-ARAVIS_0_6_0/po/sr.po000066400000000000000000000116711334570641500156310ustar00rootroot00000000000000# Serbian translation for aravis. # Copyright (C) 2014 aravis's COPYRIGHT HOLDER # This file is distributed under the same license as the aravis package. # Мирослав Николић , 2013—2016. msgid "" msgstr "" "Project-Id-Version: aravis master\n" "Report-Msgid-Bugs-To: https://github.com/AravisProject/aravis/issues\n" "POT-Creation-Date: 2016-09-04 02:24+0000\n" "PO-Revision-Date: 2016-09-04 10:57+0200\n" "Last-Translator: Мирослав Николић \n" "Language-Team: српски \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : " "n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Project-Style: gnome\n" #: ../viewer/arv-viewer.ui.h:1 msgid "Frame rate:" msgstr "Проток кадрова:" #: ../viewer/arv-viewer.ui.h:2 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer.ui.h:3 msgid "Auto" msgstr "Самостално" #: ../viewer/arv-viewer.ui.h:4 msgid "Exposure:" msgstr "Изложеност:" #: ../viewer/arv-viewer.ui.h:5 msgid "Gain:" msgstr "Појачање:" #: ../viewer/arv-viewer.ui.h:6 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer.ui.h:7 msgid "dB" msgstr "dB" #: ../viewer/arv-viewer.ui.h:8 msgid "Id" msgstr "Ид" #: ../viewer/arv-viewer.ui.h:9 msgid "Manufacturer" msgstr "Произвођач" #: ../viewer/arv-viewer.ui.h:10 msgid "Model" msgstr "Модел" #: ../viewer/arv-viewer.ui.h:11 msgid "Serial" msgstr "Серија" #: ../viewer/arv-viewer.ui.h:12 msgid "Refresh camera list" msgstr "Освежи списак камера" #: ../viewer/arv-viewer.ui.h:13 msgid "__glade_unnamed_23" msgstr "__глејд_неименовано_23" #: ../viewer/arv-viewer.ui.h:14 msgid "Start video acquisition" msgstr "Започни снимање" #: ../viewer/arv-viewer.ui.h:15 msgid "__glade_unnamed_24" msgstr "__глејд_неименовано_24" #: ../viewer/arv-viewer.ui.h:16 msgid "Pixel format:" msgstr "Формат пиксела:" #: ../viewer/arv-viewer.ui.h:17 msgid "Region size:" msgstr "Величина области:" #: ../viewer/arv-viewer.ui.h:18 msgid "x" msgstr "x" #: ../viewer/arv-viewer.ui.h:19 msgid "pixels" msgstr "пиксела" #: ../viewer/arv-viewer.ui.h:20 msgid "Region position:" msgstr "Положај области:" #: ../viewer/arv-viewer.ui.h:21 msgid "Binning:" msgstr "Смештање:" #: ../viewer/arv-viewer.ui.h:22 msgid "page0" msgstr "страница0" #: ../viewer/arv-viewer.ui.h:23 msgid "page1" msgstr "страница1" #: ../viewer/arv-viewer.ui.h:24 msgid "Return to camera list" msgstr "Врати се на списак камера" #: ../viewer/arv-viewer.ui.h:25 msgid "Save a snapshot into image folder" msgstr "Сачувај снимак екрана у фасциклу са сликама" #: ../viewer/arv-viewer.ui.h:26 msgid "Rotate image to the right" msgstr "Закрени слику на десно" #: ../viewer/arv-viewer.ui.h:27 msgid "Flip image horizontally" msgstr "Изврните слику водоравно" #: ../viewer/arv-viewer.ui.h:28 msgid "Flip image vertically" msgstr "Изврните слику усправно" #: ../viewer/arv-viewer.ui.h:29 msgid "Acquisition settings" msgstr "Подешавања снимања" #: ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Аравис" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Прегледач узорка Аравис" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Прикажите видео ток са ваше камере" #~ msgid "Settings" #~ msgstr "Подешавања" #~| msgid "Aravis Simple Viewer" #~ msgid "Aravis Viewer" #~ msgstr "Прегледач Аравис" #~ msgid "Simple viewer of video stream acquired using Aravis" #~ msgstr "Једноставан прегледач видео токова направљених коришћењем Арависа" #~ msgid "" #~ "Aravis Viewer is a simple viewer used to display video streams from " #~ "GENICAM-based Ethernet industrial cameras." #~ msgstr "" #~ "Прегледач Аравис је једноставан прегледач који се користи за приказивање " #~ "видео токова са етернет индустријских фото-апарата заснованих на ГЕНИКАМ-" #~ "у." #~ msgid "" #~ "It allows to control basic acquisition parameters, i.e. framerate, " #~ "exposure and gain, and to save raw still images." #~ msgstr "" #~ "Омогућава управљање основним параметрима снимања, тј. протоком кадрова, " #~ "изложеношћу и појачањем, као и чуватње сирових фотографија." aravis-ARAVIS_0_6_0/po/sr@latin.po000066400000000000000000000054321334570641500167570ustar00rootroot00000000000000# Serbian translation for aravis. # Copyright (C) 2014 aravis's COPYRIGHT HOLDER # This file is distributed under the same license as the aravis package. # Miroslav Nikolić , 2013—2014. msgid "" msgstr "" "Project-Id-Version: aravis master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=aravis&" "keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2014-08-15 19:58+0000\n" "PO-Revision-Date: 2014-10-25 08:58+0200\n" "Last-Translator: Miroslav Nikolić \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : " "n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Project-Style: gnome\n" #: ../viewer/arv-viewer.ui.h:1 ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer.ui.h:2 msgid "Frame rate:" msgstr "Protok kadrova:" #: ../viewer/arv-viewer.ui.h:3 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer.ui.h:4 msgid "Auto" msgstr "Samostalno" #: ../viewer/arv-viewer.ui.h:5 msgid "Exposure:" msgstr "Izloženost:" #: ../viewer/arv-viewer.ui.h:6 msgid "Gain:" msgstr "Pojačanje:" #: ../viewer/arv-viewer.ui.h:7 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer.ui.h:8 msgid "Settings" msgstr "Podešavanja" #: ../viewer/arv-viewer.ui.h:9 msgid "Save a snapshot into image folder" msgstr "Sačuvaj snimak ekrana u fasciklu sa slikama" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Pregledač uzorka Aravis" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Prikažite video tok sa vašeg foto-aparata" #: ../viewer/data/arv-viewer.appdata.xml.in.h:1 #| msgid "Aravis Simple Viewer" msgid "Aravis Viewer" msgstr "Pregledač Aravis" #: ../viewer/data/arv-viewer.appdata.xml.in.h:2 msgid "Simple viewer of video stream acquired using Aravis" msgstr "Jednostavan pregledač video tokova napravljenih korišćenjem Aravisa" #: ../viewer/data/arv-viewer.appdata.xml.in.h:3 msgid "" "Aravis Viewer is a simple viewer used to display video streams from GENICAM-" "based Ethernet industrial cameras." msgstr "" "Pregledač Aravis je jednostavan pregledač koji se koristi za prikazivanje " "video tokova sa eternet industrijskih foto-aparata zasnovanih na GENIKAM-u." #: ../viewer/data/arv-viewer.appdata.xml.in.h:4 msgid "" "It allows to control basic acquisition parameters, i.e. framerate, exposure " "and gain, and to save raw still images." msgstr "" "Omogućava upravljanje osnovnim parametrima snimanja, tj. protokom kadrova, " "izloženošću i pojačanjem, kao i čuvatnje sirovih fotografija." aravis-ARAVIS_0_6_0/po/sv.po000066400000000000000000000051651334570641500156360ustar00rootroot00000000000000# Swedish translation for aravis. # Copyright © 2014 aravis's COPYRIGHT HOLDER # This file is distributed under the same license as the aravis package. # Kristoffer Grundström , 2014. # msgid "" msgstr "" "Project-Id-Version: aravis aravis-0-2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=aravis&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-08-23 02:51+0000\n" "PO-Revision-Date: 2015-08-22 08:49+0100\n" "Last-Translator: Josef Andersson \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.7.5\n" #: ../viewer/arv-viewer.ui.h:1 ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer.ui.h:2 msgid "Frame rate:" msgstr "Bildfrekvens:" #: ../viewer/arv-viewer.ui.h:3 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer.ui.h:4 msgid "Auto" msgstr "Automatiskt" #: ../viewer/arv-viewer.ui.h:5 msgid "Exposure:" msgstr "Exponering:" #: ../viewer/arv-viewer.ui.h:6 msgid "Gain:" msgstr "Ökning:" #: ../viewer/arv-viewer.ui.h:7 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer.ui.h:8 msgid "Settings" msgstr "Inställningar" #: ../viewer/arv-viewer.ui.h:9 msgid "Save a snapshot into image folder" msgstr "Spara en ögonblicksbild i mappen för bilder" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Aravis enkel visare" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Visa upp videoströmmen från dina kameror" #: ../viewer/data/arv-viewer.appdata.xml.in.h:1 msgid "Aravis Viewer" msgstr "Aravis visare" #: ../viewer/data/arv-viewer.appdata.xml.in.h:2 msgid "Simple viewer of video stream acquired using Aravis" msgstr "Enkel visare av videoströmmar inhämtade med Aravis" #: ../viewer/data/arv-viewer.appdata.xml.in.h:3 msgid "" "Aravis Viewer is a simple viewer used to display video streams from GENICAM-" "based Ethernet industrial cameras." msgstr "" "Aravis visare är en enkel visare för att visa videoströmmar från trådbundna " "GENICAM-baserade industrikameror." #: ../viewer/data/arv-viewer.appdata.xml.in.h:4 msgid "" "It allows to control basic acquisition parameters, i.e. framerate, exposure " "and gain, and to save raw still images." msgstr "" "Det erbjuder kontroll av grundläggande anskaffningsparametrar, det vill säga " "bildfrekvens, exponering och ökning, samt att spara råa stillbilder." aravis-ARAVIS_0_6_0/po/tr.po000066400000000000000000000053651334570641500156350ustar00rootroot00000000000000# Turkish translation for aravis. # Copyright (C) 2014 aravis's COPYRIGHT HOLDER # This file is distributed under the same license as the aravis package. # Muhammet Kara , 2014. # İşbaran Akçayır , 2015. # msgid "" msgstr "" "Project-Id-Version: aravis master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=aravis&" "keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2015-01-12 03:47+0000\n" "PO-Revision-Date: 2015-02-18 08:20+0000\n" "Last-Translator: İşbaran Akçayır \n" "Language-Team: Türkçe \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Pootle 2.5.1.1\n" "X-POOTLE-MTIME: 1424247649.000000\n" #: ../viewer/arv-viewer.ui.h:1 ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer.ui.h:2 msgid "Frame rate:" msgstr "Kare hızı:" #: ../viewer/arv-viewer.ui.h:3 msgid "Hz" msgstr "Hz" #: ../viewer/arv-viewer.ui.h:4 msgid "Auto" msgstr "Otomatik" #: ../viewer/arv-viewer.ui.h:5 msgid "Exposure:" msgstr "Pozlandırma:" #: ../viewer/arv-viewer.ui.h:6 msgid "Gain:" msgstr "Kazanç:" #: ../viewer/arv-viewer.ui.h:7 msgid "µs" msgstr "µs" #: ../viewer/arv-viewer.ui.h:8 msgid "Settings" msgstr "Ayarlar" #: ../viewer/arv-viewer.ui.h:9 msgid "Save a snapshot into image folder" msgstr "Resim klasörüne bir ekran görüntüsü kaydet" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Aravis Basit Görüntüleyici" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "Kameralarınızdan gelen video akışını görüntüleyin" #: ../viewer/data/arv-viewer.appdata.xml.in.h:1 msgid "Aravis Viewer" msgstr "Aravis Görüntüleyici" #: ../viewer/data/arv-viewer.appdata.xml.in.h:2 msgid "Simple viewer of video stream acquired using Aravis" msgstr "" "Aravis kullanılarak elde edilen video akışı için basit bir görüntüleyici" #: ../viewer/data/arv-viewer.appdata.xml.in.h:3 msgid "" "Aravis Viewer is a simple viewer used to display video streams from GENICAM-" "based Ethernet industrial cameras." msgstr "" "Aravis Görüntüleyici GENICAM-temelli Eternet endüstriyel kameralardan video " "akışlarını görüntülemeye yarayan basit bir görüntüleyicidir." #: ../viewer/data/arv-viewer.appdata.xml.in.h:4 msgid "" "It allows to control basic acquisition parameters, i.e. framerate, exposure " "and gain, and to save raw still images." msgstr "" "Temel edinim parametrelerini kontrol etmeye yarar, örn. çerçevehızı, poz ve " "kazanç, ayrıca ham durağan resimleri kaydetmeye." aravis-ARAVIS_0_6_0/po/zh_CN.po000066400000000000000000000035431334570641500162050ustar00rootroot00000000000000# Chinese (China) translation for aravis. # Copyright (C) 2014 aravis's COPYRIGHT HOLDER # This file is distributed under the same license as the aravis package. # Wylmer Wang , 2014. # msgid "" msgstr "" "Project-Id-Version: aravis master\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "product=aravis&keywords=I18N+L10N&component=general\n" "POT-Creation-Date: 2014-01-09 09:29+0000\n" "PO-Revision-Date: 2014-01-12 20:05+0800\n" "Last-Translator: Wylmer Wang \n" "Language-Team: Chinese (China) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../viewer/arv-viewer-2.ui.h:1 ../viewer/arv-viewer-3.ui.h:1 #: ../viewer/data/arv-viewer.desktop.in.in.h:1 msgid "Aravis" msgstr "Aravis" #: ../viewer/arv-viewer-2.ui.h:2 ../viewer/arv-viewer-3.ui.h:2 msgid "Frame rate:" msgstr "帧率:" #: ../viewer/arv-viewer-2.ui.h:3 ../viewer/arv-viewer-3.ui.h:5 msgid "Exposure:" msgstr "曝光:" #: ../viewer/arv-viewer-2.ui.h:4 ../viewer/arv-viewer-3.ui.h:6 msgid "Gain:" msgstr "增益:" #: ../viewer/arv-viewer-2.ui.h:5 ../viewer/arv-viewer-3.ui.h:3 msgid "Hz" msgstr "赫兹" #: ../viewer/arv-viewer-2.ui.h:6 ../viewer/arv-viewer-3.ui.h:7 msgid "µs" msgstr "微秒" #: ../viewer/arv-viewer-2.ui.h:7 ../viewer/arv-viewer-3.ui.h:4 msgid "Auto" msgstr "自动" #: ../viewer/arv-viewer-2.ui.h:8 ../viewer/arv-viewer-3.ui.h:8 msgid "Settings" msgstr "设置" #: ../viewer/arv-viewer-3.ui.h:9 msgid "Save a snapshot into image folder" msgstr "保存截屏到图片文件夹" #: ../viewer/data/arv-viewer.desktop.in.in.h:2 msgid "Aravis Simple Viewer" msgstr "Aravis 简章查看器" #: ../viewer/data/arv-viewer.desktop.in.in.h:3 msgid "Display the video stream from your cameras" msgstr "显示摄像头视频流" aravis-ARAVIS_0_6_0/src/000077500000000000000000000000001334570641500150105ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/src/.gitignore000066400000000000000000000002051334570641500167750ustar00rootroot00000000000000arv-fake-gv-camera-*.* arv-tool-*.* arv-test-*.* arvenumtypes.c arvenumtypes.h arvconfig.h arvconfig.h.in arvfeatures.h arvversion.h aravis-ARAVIS_0_6_0/src/GenApiSchema_Version_1_0.xsd000066400000000000000000001143221334570641500221630ustar00rootroot00000000000000 Cache on write and write into register Write w/o cache, read updates cache Do not perform caching aravis-ARAVIS_0_6_0/src/GenApiSchema_Version_1_1.xsd000066400000000000000000001651011334570641500221650ustar00rootroot00000000000000 The outer element of a device description file. It contains a set of nodes which are connected via pointers and which describe a mapping from features (like Gain) to a register space defined in terms of address and length. List of all possible node tpyes. Used for structuring device descripition files. Groups can be nested in any depth. They have no meaning with respect to the device functionaliy and are stripped off the device description file in a pre-processing step. Lists the elements which are common to (nearly) all nodes. Lists the attributes which are common to all nodes. Lists the elements which are common to all register nodes with a pLength element The simple node with no functionality. Contins references to features which are exposed to the user via API or GUI. Can be nested in any depth. Integer node which can be used to collect Value, Min, Max, and Inc or be used as Multiplexer or be used as Replicator. Maps to a register of Integer type. Maps to a subset (bit range) of a register of Integer type. Describes a collection of subsets (bit ranges) on the same integer register Describes a one subset (bit range) of a StructReg A node for issuing commands. A node for issuing boolean values based on an integer node Float node which can be used to collect Value, Min, and Max, or be used as Multiplexer. Bi-directional Float swiss knife. Bi-directional Integer swiss knife. Maps to a Float register. Enumeration mapping to an Integer. Possible value of an Enumeration node String node String mapping to a register Register exposed as byte array. Uno-directional formula interpreter Uno-directional formula interpreter Node mapping to a port accessing the device's registers. Accesses a IEEE1212 configuration ROM address block Accesses a Text entry in a IEEE1212 configuration ROM address block Accesses an Integer entry in a IEEE1212 configuration ROM address block Gets the address of a DCAM smart feature Gets the address of a smart feature Content to custom extend a device description file. The extension entries are stripped away during pre-processing of the device description file. Cache on write and write into register Write w/o cache, read updates cache Do not perform caching aravis-ARAVIS_0_6_0/src/Makefile.am000066400000000000000000000154451334570641500170550ustar00rootroot00000000000000EXTRA_DIST = include $(top_srcdir)/Makefile.decl @CODE_COVERAGE_RULES@ AM_CPPFLAGS = \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ -DPACKAGE_SRC_DIR=\""$(srcdir)"\" \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" $(ARAVIS_CFLAGS) \ -DARAVIS_DATA_DIR=\""$(aravis_datadir)"\" \ -DARAVIS_API_VERSION=\""$(ARAVIS_API_VERSION)"\" \ -DG_LOG_DOMAIN=\"Aravis\" \ -DARAVIS_COMPILATION AM_CFLAGS = -Wall $(CODE_COVERAGE_CFLAGS) lib_LTLIBRARIES = libaravis-@ARAVIS_API_VERSION@.la BUILT_SOURCES = arvenumtypes.h arvenumtypes.c arvfeatures.h arvversion.h EXTRA_DIST += arvenumtypes.h.template \ arvenumtypes.c.template libaravis_@ARAVIS_API_VERSION@_la_LIBADD = \ $(ARAVIS_LIBS) $(CODE_COVERAGE_LIBS) ARAVIS_SRCS = \ arvenums.c \ arvdebug.c \ arvsystem.c \ arvevaluator.c \ arvdomnode.c \ arvdomnodelist.c \ arvdomnamednodemap.c \ arvdomdocument.c \ arvdomdocumentfragment.c \ arvdomelement.c \ arvdomcharacterdata.c \ arvdomtext.c \ arvdomparser.c \ arvdomimplementation.c \ arvcamera.c \ arvgc.c \ arvgcnode.c \ arvgcpropertynode.c \ arvgcindexnode.c \ arvgcvalueindexednode.c \ arvgcinvalidatornode.c \ arvgcfeaturenode.c \ arvgcregisterdescriptionnode.c \ arvgcgroupnode.c \ arvgccategory.c \ arvgcboolean.c \ arvgcenumeration.c \ arvgcenumentry.c \ arvgcintegernode.c \ arvgcfloatnode.c \ arvgcregisternode.c \ arvgcstructentrynode.c \ arvgccommand.c \ arvgcswissknife.c \ arvgcconverter.c \ arvgcport.c \ arvgcregister.c \ arvgcinteger.c \ arvgcstring.c \ arvgcfloat.c \ arvinterface.c \ arvdevice.c \ arvstream.c \ arvbuffer.c \ arvchunkparser.c \ arvgvinterface.c \ arvgvdevice.c \ arvgvstream.c \ arvfakeinterface.c \ arvfakedevice.c \ arvfakestream.c \ arvfakecamera.c \ arvgvfakecamera.c \ arvrealtime.c \ arvxmlschema.c ARAVIS_SRCS_NO_INTRO = \ arvmisc.c \ arvzip.c \ arvstr.c \ arvgvcp.c \ arvgvsp.c ARAVIS_HDRS = \ arv.h \ arvtypes.h \ arvenums.h \ arvdebug.h \ arvsystem.h \ arvevaluator.h \ arvdomnode.h \ arvdomnodelist.h \ arvdomnamednodemap.h \ arvdomdocument.h \ arvdomdocumentfragment.h \ arvdomelement.h \ arvdomcharacterdata.h \ arvdomtext.h \ arvdomparser.h \ arvdomimplementation.h \ arvcamera.h \ arvgc.h \ arvgcnode.h \ arvgcpropertynode.h \ arvgcindexnode.h \ arvgcvalueindexednode.h \ arvgcinvalidatornode.h \ arvgcfeaturenode.h \ arvgcregisterdescriptionnode.h \ arvgcgroupnode.h \ arvgccategory.h \ arvgcboolean.h \ arvgcenumeration.h \ arvgcenumentry.h \ arvgcintegernode.h \ arvgcfloatnode.h \ arvgcregisternode.h \ arvgcstructentrynode.h \ arvgccommand.h \ arvgcswissknife.h \ arvgcconverter.h \ arvgcport.h \ arvgcregister.h \ arvgcinteger.h \ arvgcstring.h \ arvgcfloat.h \ arvinterface.h \ arvdevice.h \ arvstream.h \ arvbuffer.h \ arvchunkparser.h \ arvgvinterface.h \ arvgvdevice.h \ arvgvstream.h \ arvfakeinterface.h \ arvfakedevice.h \ arvfakestream.h \ arvfakecamera.h \ arvgvfakecamera.h \ arvrealtime.h \ arvxmlschema.h ARAVIS_HDRS_NO_INTRO = \ arvmisc.h \ arvzip.h \ arvstr.h \ arvgvcp.h \ arvgvsp.h noinst_HEADERS = \ arvbufferprivate.h \ arvchunkparserprivate.h \ arvinterfaceprivate.h \ arvdeviceprivate.h \ arvstreamprivate.h \ arvgvinterfaceprivate.h \ arvgvdeviceprivate.h \ arvgvstreamprivate.h \ arvuvinterfaceprivate.h \ arvuvdeviceprivate.h \ arvuvstreamprivate.h \ arvfakeinterfaceprivate.h \ arvfakedeviceprivate.h \ arvfakestreamprivate.h \ arvrealtimeprivate.h if ARAVIS_BUILD_USB ARAVIS_SRCS += \ arvuvinterface.c \ arvuvdevice.c \ arvuvstream.c ARAVIS_SRCS_NO_INTRO += \ arvuvcp.c \ arvuvsp.c ARAVIS_HDRS += \ arvuvinterface.h \ arvuvdevice.h \ arvuvstream.h ARAVIS_HDRS_NO_INTRO += \ arvuvcp.h \ arvuvsp.h endif arv_fake_cameradir = $(aravis_datadir) arv_fake_camera_DATA = arv-fake-camera.xml EXTRA_DIST += arv-fake-camera.xml libaravis_@ARAVIS_API_VERSION@_la_SOURCES = $(ARAVIS_SRCS) $(ARAVIS_SRCS_NO_INTRO) libaravis_@ARAVIS_API_VERSION@_la_SOURCES += arvenumtypes.c libaravis_@ARAVIS_API_VERSION@_ladir = $(includedir)/aravis-@ARAVIS_API_VERSION@ libaravis_@ARAVIS_API_VERSION@_la_HEADERS = $(ARAVIS_HDRS) $(ARAVIS_HDRS_NO_INTRO) libaravis_@ARAVIS_API_VERSION@_la_HEADERS += arvenumtypes.h nodist_libaravis_@ARAVIS_API_VERSION@_la_HEADERS = arvfeatures.h arvversion.h arvenumtypes.h: arvenumtypes.h.template $(ARAVIS_HDRS) $(ARAVIS_HDRS_NO_INTRO) $(GLIB_MKENUMS) $(AM_V_GEN) (cd $(srcdir) && $(GLIB_MKENUMS) --template arvenumtypes.h.template $(libaravis_@ARAVIS_API_VERSION@_la_HEADERS)) > $@ arvenumtypes.c: arvenumtypes.c.template $(ARAVIS_HDRS) $(ARAVIS_HDRS_NO_INTRO) $(GLIB_MKENUMS) $(AM_V_GEN) (cd $(srcdir) && $(GLIB_MKENUMS) --template arvenumtypes.c.template $(libaravis_@ARAVIS_API_VERSION@_la_HEADERS)) > $@ bin_PROGRAMS = \ arv-fake-gv-camera-@ARAVIS_API_VERSION@ \ arv-tool-@ARAVIS_API_VERSION@ \ arv-test-@ARAVIS_API_VERSION@ arv_fake_gv_camera_@ARAVIS_API_VERSION@_SOURCES = arvfakegvcamera.c arv_fake_gv_camera_@ARAVIS_API_VERSION@_LDADD = $(ARAVIS_LIBS) libaravis-@ARAVIS_API_VERSION@.la arv_tool_@ARAVIS_API_VERSION@_SOURCES = arvtool.c arv_tool_@ARAVIS_API_VERSION@_LDADD = $(ARAVIS_LIBS) libaravis-@ARAVIS_API_VERSION@.la arv_test_@ARAVIS_API_VERSION@_SOURCES = arvtest.c arv_test_@ARAVIS_API_VERSION@_LDADD = $(ARAVIS_LIBS) libaravis-@ARAVIS_API_VERSION@.la CLEANFILES = $(BUILT_SOURCES) -include $(INTROSPECTION_MAKEFILE) INTROSPECTION_GIRS = INTROSPECTION_SCANNER_ARGS = --add-include-path=$(srcdir) INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir) if HAVE_INTROSPECTION introspection_files = $(ARAVIS_SRCS) \ $(ARAVIS_HDRS) introspection_generated_files = \ arvenumtypes.c \ arvenumtypes.h Aravis-@ARAVIS_API_VERSION@.gir: $(INTROSPECTION_SCANNER) libaravis-@ARAVIS_API_VERSION@.la Makefile Aravis_@ARAVIS_API_VERSION_U@_gir_INCLUDES = GObject-2.0 Gio-2.0 Aravis_@ARAVIS_API_VERSION_U@_gir_SCANNERFLAGS = --identifier-prefix=Arv --warn-all Aravis_@ARAVIS_API_VERSION_U@_gir_CFLAGS = $(INCLUDES) -I$(top_srcdir)/src -DARAVIS_COMPILATION Aravis_@ARAVIS_API_VERSION_U@_gir_LIBS = libaravis-@ARAVIS_API_VERSION@.la Aravis_@ARAVIS_API_VERSION_U@_gir_FILES = $(addprefix $(srcdir)/,$(introspection_files)) \ $(addprefix $(builddir)/,$(introspection_generated_files)) INTROSPECTION_GIRS += Aravis-@ARAVIS_API_VERSION@.gir girdir = $(datadir)/gir-1.0 gir_DATA = $(INTROSPECTION_GIRS) typelibdir = $(libdir)/girepository-1.0 typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib) CLEANFILES += $(gir_DATA) $(typelib_DATA) endif aravis-ARAVIS_0_6_0/src/arv-fake-camera.xml000066400000000000000000000335531334570641500204650ustar00rootroot00000000000000 DeviceControl ImageFormatControl AcquisitionControl TransportLayerControl Debug DeviceVendorName DeviceModelName DeviceManufacturerInfo DeviceID DeviceVersion Vendor Name
0x48
32 RO Device
Model Name
0x68
32 RO Device
Manufacturer Info
0xa8
48 RO Device
Device ID
0xd8
16 RO Device
Device Version
0x88
32 RO Device
SensorHeight SensorWidth OffsetX OffsetY Width Height BinningHorizontal BinningVertical PixelFormat Full height of image sensor. SensorHeightRegister
0x118
4 RO Device Unsigned BigEndian
Full height of image sensor. SensorWidthRegister
0x11c
4 RO Device Unsigned BigEndian
X offset of image, in pixels. OffsetXRegister 0 SensorWidth 1
0x130
4 RW Device Unsigned BigEndian
Y offset of image, in pixels. OffsetYRegister 0 SensorHeight 1
0x134
4 RW Device Unsigned BigEndian
Width of image, in pixels. WidthRegister 1 SensorWidth 1
0x100
4 RW Device Unsigned BigEndian
Height of image, in pixels. HeightRegister 1 SensorHeight 1
0x104
4 RW Device Unsigned BigEndian
Binning in horizontal direction. BinningHorizontalRegister 1 16
0x108
4 RW Device Unsigned BigEndian
Binning in vertical direction. BinningVerticalRegister 1 16
0x10c
4 RW Device Unsigned BigEndian
Pixel format 17301505 PixelFormatRegister
0x128
4 RW Device Unsigned BigEndian
AcquisitionMode AcquisitionStart AcquisitionStop ExposureTimeAbs Start acquisition. AcquisitionCommandRegister 1 Stop acquisition. AcquisitionCommandRegister 0
0x124
4 WO Device Unsigned BigEndian
Acquisition mode 1 2 3 AcquisitionModeRegister
0x12c
4 RW Device Unsigned BigEndian
Frame rate, in frames per second. (1000000 / FROM) (1000000 / TO) AcquisitionFramePeriodRegister
0x138
4 RW Device Unsigned BigEndian
0 1 TriggerSelectorInteger 0 Trigger mode 0 1 TriggerModeRegister
0x300
TriggerSelectorInteger 4 RW Device Unsigned BigEndian
Trigger source 0 TriggerSourceRegister
0x304
TriggerSelectorInteger 4 RW Device Unsigned BigEndian
Trigger activation 0 TriggerActivationRegister
0x308
TriggerSelectorInteger 4 RW Device Unsigned BigEndian
Exposure duration, in microseconds. ExposureTimeAbsConverter 10.0 10000000.0 FROM TO ExposureTimeAbsRegister
0x120
4 RW Device Unsigned BigEndian
GainRaw GainAuto Raw gain. GainRawRegister 0 10
0x110
4 RW Device Unsigned BigEndian
Automatic gain mode. 1 3 2 GainAutoRegister
0x114
4 RW Device Unsigned BigEndian
PayloadSize Width Height WIDTH * HEIGHT Indicates whether a live grab is under way Invisible 0 0 1 TestRegister TestRegister 321 123
0x1f0
4 RW Device Unsigned BigEndian
0x1f0
4 RW Device BigEndian 31 16 Signed 15 0 Unsigned 15
0x200
32 RW Device
aravis-ARAVIS_0_6_0/src/arv-gev-bootstrap.xml000066400000000000000000000256211334570641500211220ustar00rootroot00000000000000 Major version of the specification. Major version GevVersionMajorRegister
0x0
4 RO Device 15 0 Unsigned BigEndian
Minor version of the specification. Minor version GevVersionMinorRegister
0x0
4 RO Device 31 16 Unsigned BigEndian
Endianess of the device registers. Device mode is big endian GevDeviceModeIsBigEndianRegister
0x4
4 RO Device 0 0 Unsigned BigEndian
Character set used by all the strings of the bootstrap registers. Character Set GevDeviceModeCharacterSetRegister
0x4
4 RO Device 31 24 Unsigned BigEndian
MAC address of the network interface. MAC Address GevMACAddressFormula GevMACAddressHighRegister GevMACAddressLowRegister (HIGH << 32) | LOW
0x8
4 RO Device 31 16 Unsigned BigEndian
0xc
4 RO Device 31 0 Unsigned BigEndian
Reports the IP address for the given network interface. Current IP Address GevCurrentIPAddressRegister
0x24
4 RO Device 31 0 Unsigned BigEndian
Provides the subnet mask of the given interface. Current Subnet Mask GevCurrentSubnetMaskRegister
0x34
4 RO Device 31 0 Unsigned BigEndian
Vendor Name
0x48
32 RO Device
Model Name
0x68
32 RO Device
Device Version
0x88
32 RO Device
Manufacturer Info
0xa8
48 RO Device
Device ID
0xd8
16 RO Device
Indicates the number of physical network interfaces supported by this device. Number of Interfaces GevNumberOfInterfacesRegister Indicates the number of message channels supported by this device. Message Channel Count GevMessageChannelCountRegister
0x900
4 RO Device 31 0 Unsigned BigEndian
Indicates the number of stream channels supported by this device. Stream Channel Count GevStreamChannelCountRegister
0x904
4 RO Device 31 0 Unsigned BigEndian
Indicates the current heartbeat timeout in milliseconds. Heartbeat Timeout GevHeartbeatTimeoutRegister
0x938
4 RW Device 31 0 Unsigned BigEndian
Indicates the number of timestamp ticks during 1 second (frequency in Hz). Timestamp Tick Frequency GevTimestampTickFrequencySwissknife 0 4294967295 GevTimestampTickFrequencyHighRegister GevTimestampTickFrequencyLowRegister (HIGH << 32) | LOW
0x93c
4 RO Device 31 0 Unsigned BigEndian
0x940
4 RO Device 31 0 Unsigned BigEndian
Resets the Timestamp counter to 0. Timestamp Reset GevTimestampControlRegister 1 Latches current timestamp counter into GevTimestampValue. Timestamp Control Latch GevTimestampControlRegister 2
0x944
4 WO Device NoCache Unsigned BigEndian
Timestamp Value Guru GevTimestampValueSwissKnife PureNumber GevTimestampValueHighRegister GevTimestampValueLowRegister (HIGH << 32) | LOW
0x948
4 RO Device 31 0 Unsigned BigEndian
0x94c
4 RO Device 31 0 Unsigned BigEndian
Controls the device access privilege of an application. Control Channel Privilege CCP open access 1 CCP exclusive access 2 CCP control access Control 3 GevCCPRegister
0xa00
4 RW Device 31 0 Unsigned BigEndian
aravis-ARAVIS_0_6_0/src/arv.h000066400000000000000000000047071334570641500157610ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_H #define ARV_H #define ARV_H_INSIDE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if ARAVIS_HAS_USB #include #include #include #include #include #endif #include #include #include #include #include #include #include #undef ARV_H_INSIDE #endif aravis-ARAVIS_0_6_0/src/arvbuffer.c000066400000000000000000000327571334570641500171540ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvbuffer * @short_description: Buffer for storage of video frames * * #ArvBuffer provides a class for the instantiation of buffers used for the * storage of the separate images of the video stream. The actual data space * may either be allocated by #ArvBuffer during an object instatiation, of * preallocated. #ArvBuffer also allows the transmission of image metadata, * such as offsets and size of the transmitted region of interrest, pixel * format and time stamp. */ #include static GObjectClass *parent_class = NULL; /** * arv_buffer_new_full: * @size: payload size * @preallocated: (transfer none): preallocated memory buffer * @user_data: (transfer none): a pointer to user data associated to this buffer * @user_data_destroy_func: an optional user data destroy callback * * Creates a new buffer for the storage of the video stream images. * The data space can be either preallocated, and the caller is responsible * for it's deallocation, or allocated by this function. If it is the case, * data memory will be freed when the buffer is destroyed. * * If @user_data_destroy_func is non NULL, it will be called in order to destroy * user_data when the buffer is destroyed. * * Returns: a new #ArvBuffer object * * Since: 0.2.0 */ ArvBuffer * arv_buffer_new_full (size_t size, void *preallocated, void *user_data, GDestroyNotify user_data_destroy_func) { ArvBuffer *buffer; buffer = g_object_new (ARV_TYPE_BUFFER, NULL); buffer->priv->size = size; buffer->priv->user_data = user_data; buffer->priv->user_data_destroy_func = user_data_destroy_func; buffer->priv->chunk_endianness = G_BIG_ENDIAN; buffer->priv->payload_type = ARV_BUFFER_PAYLOAD_TYPE_UNKNOWN; if (preallocated != NULL) { buffer->priv->is_preallocated = TRUE; buffer->priv->data = preallocated; } else { buffer->priv->is_preallocated = FALSE; buffer->priv->data = g_malloc (size); } return buffer; } /** * arv_buffer_new: * @size: payload size * @preallocated: (transfer none): preallocated memory buffer * * Creates a new buffer for the storage of the video stream images. * The data space can be either preallocated, and the caller is responsible * for it's deallocation, or allocated by this function. If it is the case, * data memory will be freed when the buffer is destroyed. * * Returns: a new #ArvBuffer object * * Since: 0.2.0 */ ArvBuffer * arv_buffer_new (size_t size, void *preallocated) { return arv_buffer_new_full (size, preallocated, NULL, NULL); } /** * arv_buffer_new_allocate: * @size: payload size * * Creates a new buffer for the storage of the video stream images. * The data space is allocated by this function, and will * be freed when the buffer is destroyed. * * Returns: a new #ArvBuffer object * * Since: 0.2.3 */ ArvBuffer * arv_buffer_new_allocate (size_t size) { return arv_buffer_new_full (size, NULL, NULL, NULL); } /** * arv_buffer_get_data: * @buffer: a #ArvBuffer * @size: (allow-none): location to store data size, or %NULL * * Buffer data accessor. * * Returns: (array length=size) (element-type guint8): a pointer to the buffer data. * * Since: 0.4.0 **/ const void * arv_buffer_get_data (ArvBuffer *buffer, size_t *size) { g_return_val_if_fail (ARV_IS_BUFFER (buffer), NULL); if (size != NULL) *size = buffer->priv->size; return buffer->priv->data; } typedef struct ARAVIS_PACKED_STRUCTURE { guint32 id; guint32 size; } ArvChunkInfos; /** * arv_buffer_get_chunk_data: * @buffer: a #ArvBuffer * @chunk_id: chunk id * @size: (allow-none): location to store chunk data size, or %NULL * * Chunk data accessor. * * Returns: (array length=size) (element-type guint8): a pointer to the chunk data. * * Since: 0.4.0 **/ const void * arv_buffer_get_chunk_data (ArvBuffer *buffer, guint64 chunk_id, size_t *size) { ArvChunkInfos *infos; char *data; ptrdiff_t offset; if (size != NULL) *size = 0; g_return_val_if_fail (ARV_IS_BUFFER (buffer), NULL); g_return_val_if_fail (buffer->priv->data != NULL, NULL); g_return_val_if_fail (buffer->priv->payload_type == ARV_BUFFER_PAYLOAD_TYPE_CHUNK_DATA || buffer->priv->payload_type == ARV_BUFFER_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA, NULL); if (buffer->priv->status != ARV_BUFFER_STATUS_SUCCESS) return NULL; data = buffer->priv->data; offset = buffer->priv->size - sizeof (ArvChunkInfos); while (offset > 0) { guint32 id; guint32 chunk_size; infos = (ArvChunkInfos *) &data[offset]; if (buffer->priv->chunk_endianness == G_BIG_ENDIAN) { id = GUINT32_FROM_BE (infos->id); chunk_size = GUINT32_FROM_BE (infos->size); } else { id = GUINT32_FROM_LE (infos->id); chunk_size = GUINT32_FROM_LE (infos->size); } if (id == chunk_id) { ptrdiff_t data_offset; data_offset = offset - chunk_size; if (data_offset >= 0) { if (size != NULL) *size = chunk_size; return &data[data_offset]; } else return NULL; } if (chunk_size > 0) offset = offset - chunk_size - sizeof (ArvChunkInfos); else offset = 0; }; return NULL; } /** * arv_buffer_get_user_data: * @buffer: a #ArvBuffer * * Gets a pointer to user data set by arv_buffer_new_full. * * Returns: user data, or NULL if not set. * * Since: 0.4.0 */ const void * arv_buffer_get_user_data (ArvBuffer *buffer) { g_return_val_if_fail (ARV_IS_BUFFER (buffer), NULL); return buffer->priv->user_data; } /** * arv_buffer_get_status: * @buffer: a #ArvBuffer * * Gets the buffer acquisition status. * * Returns: buffer acquisition status. * * Since: 0.4.0 */ ArvBufferStatus arv_buffer_get_status (ArvBuffer *buffer) { g_return_val_if_fail (ARV_IS_BUFFER (buffer), ARV_BUFFER_STATUS_UNKNOWN); return buffer->priv->status; } /** * arv_buffer_get_payload_type: * @buffer: a #ArvBuffer * * Gets the buffer payload type. * * Returns: payload type. * * Since: 0.4.0 */ ArvBufferPayloadType arv_buffer_get_payload_type (ArvBuffer *buffer) { g_return_val_if_fail (ARV_IS_BUFFER (buffer), -1); return buffer->priv->payload_type; } /** * arv_buffer_get_timestamp: * @buffer: a #ArvBuffer * * Gets the buffer camera timestamp, expressed as nanoseconds. Not all devices * provide reliable timestamp, which means sometimes its better to rely on the * buffer completion host local time, or to use * arv_buffer_get_system_timestamp(). * * Returns: buffer timestamp, in nanoseconds. * * Since: 0.4.0 */ guint64 arv_buffer_get_timestamp (ArvBuffer *buffer) { g_return_val_if_fail (ARV_IS_BUFFER (buffer), 0); return buffer->priv->timestamp_ns; } /** * arv_buffer_set_timestamp: * @buffer: a #ArvBuffer * @timestamp_ns: a timestamp, expressed as nanoseconds * * Sets the buffer timestamp, which allows to override the timpestamp set by * the camera, which in some case is incorrect. * * Since: 0.4.0 */ void arv_buffer_set_timestamp (ArvBuffer *buffer, guint64 timestamp_ns) { g_return_if_fail (ARV_IS_BUFFER (buffer)); buffer->priv->timestamp_ns = timestamp_ns; } /** * arv_buffer_get_system_timestamp: * @buffer: a #ArvBuffer * * Gets the system timestamp for when the frame was received. Expressed in * nanoseconds. * * Returns: buffer system timestamp, in nanoseconds. * * Since: 0.6.0 */ guint64 arv_buffer_get_system_timestamp (ArvBuffer *buffer) { g_return_val_if_fail (ARV_IS_BUFFER (buffer), 0); return buffer->priv->system_timestamp_ns; } /** * arv_buffer_set_system_timestamp: * @buffer: a #ArvBuffer * @timestamp_ns: a timestamp, expressed as nanoseconds * * Sets the system timestamp for when the frame was received. Expressed in * nanoseconds. * * Since: 0.6.0 */ void arv_buffer_set_system_timestamp (ArvBuffer *buffer, guint64 timestamp_ns) { g_return_if_fail (ARV_IS_BUFFER (buffer)); buffer->priv->system_timestamp_ns = timestamp_ns; } /** * arv_buffer_get_frame_id: * @buffer: a #ArvBuffer * * Gets the buffer frame id. For GigEVision devices, valid values are in the * 1..65535 range. * * Returns: frame id, 0 on error. * * Since: 0.4.0 */ guint32 arv_buffer_get_frame_id (ArvBuffer *buffer) { g_return_val_if_fail (ARV_IS_BUFFER (buffer), 0); return buffer->priv->frame_id; } /** * arv_buffer_get_image_region: * @buffer: a #ArvBuffer * @x: (allow-none): image x offset placeholder * @y: (allow-none): image y offset placeholder * @width: (allow-none): image width placholder * @height: (allow-none): image height placeholder * * Gets the image region. This function must only be called on buffer containing a @ARV_BUFFER_PAYLOAD_TYPE_IMAGE payload. * * Since: 0.4.0 */ void arv_buffer_get_image_region (ArvBuffer *buffer, gint *x, gint *y, gint *width, gint *height) { g_return_if_fail (ARV_IS_BUFFER (buffer)); g_return_if_fail (buffer->priv->payload_type == ARV_BUFFER_PAYLOAD_TYPE_IMAGE || buffer->priv->payload_type == ARV_BUFFER_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA); if (x != NULL) *x = buffer->priv->x_offset; if (y != NULL) *y = buffer->priv->y_offset; if (width != NULL) *width = buffer->priv->width; if (height != NULL) *height = buffer->priv->height; } /** * arv_buffer_get_image_width: * @buffer: a #ArvBuffer * * Gets the image width. This function must only be called on buffer containing a @ARV_BUFFER_PAYLOAD_TYPE_IMAGE payload. * * Returns: image width, in pixels. * * Since: 0.4.0 */ gint arv_buffer_get_image_width (ArvBuffer *buffer) { g_return_val_if_fail (ARV_IS_BUFFER (buffer), 0); g_return_val_if_fail (buffer->priv->payload_type == ARV_BUFFER_PAYLOAD_TYPE_IMAGE || buffer->priv->payload_type == ARV_BUFFER_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA, 0); return buffer->priv->width; } /** * arv_buffer_get_image_height: * @buffer: a #ArvBuffer * * Gets the image width. This function must only be called on buffer containing a @ARV_BUFFER_PAYLOAD_TYPE_IMAGE payload. * * Returns: image height, in pixels. * * Since: 0.4.0 */ gint arv_buffer_get_image_height (ArvBuffer *buffer) { g_return_val_if_fail (ARV_IS_BUFFER (buffer), 0); g_return_val_if_fail (buffer->priv->payload_type == ARV_BUFFER_PAYLOAD_TYPE_IMAGE || buffer->priv->payload_type == ARV_BUFFER_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA, 0); return buffer->priv->height; } /** * arv_buffer_get_image_x: * @buffer: a #ArvBuffer * * Gets the image x offset. This function must only be called on buffer containing a @ARV_BUFFER_PAYLOAD_TYPE_IMAGE payload. * * Returns: image x offset, in pixels. * * Since: 0.4.0 */ gint arv_buffer_get_image_x (ArvBuffer *buffer) { g_return_val_if_fail (ARV_IS_BUFFER (buffer), 0); g_return_val_if_fail (buffer->priv->payload_type == ARV_BUFFER_PAYLOAD_TYPE_IMAGE || buffer->priv->payload_type == ARV_BUFFER_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA, 0); return buffer->priv->x_offset; } /** * arv_buffer_get_image_y: * @buffer: a #ArvBuffer * * Gets the image y offset. This function must only be called on buffer containing a @ARV_BUFFER_PAYLOAD_TYPE_IMAGE payload. * * Returns: image y offset, in pixels. * * Since: 0.4.0 */ gint arv_buffer_get_image_y (ArvBuffer *buffer) { g_return_val_if_fail (ARV_IS_BUFFER (buffer), 0); g_return_val_if_fail (buffer->priv->payload_type == ARV_BUFFER_PAYLOAD_TYPE_IMAGE || buffer->priv->payload_type == ARV_BUFFER_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA, 0); return buffer->priv->y_offset; } /** * arv_buffer_get_image_pixel_format: * @buffer: a #ArvBuffer * * Gets the image pixel format. This function must only be called on buffer containing a @ARV_BUFFER_PAYLOAD_TYPE_IMAGE payload. * * Returns: image pixel format. * * Since: 0.4.0 */ ArvPixelFormat arv_buffer_get_image_pixel_format (ArvBuffer *buffer) { g_return_val_if_fail (ARV_IS_BUFFER (buffer), 0); g_return_val_if_fail (buffer->priv->payload_type == ARV_BUFFER_PAYLOAD_TYPE_IMAGE || buffer->priv->payload_type == ARV_BUFFER_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA, 0); return buffer->priv->pixel_format; } static void arv_buffer_init (ArvBuffer *buffer) { buffer->priv = G_TYPE_INSTANCE_GET_PRIVATE (buffer, ARV_TYPE_BUFFER, ArvBufferPrivate); buffer->priv->status = ARV_BUFFER_STATUS_CLEARED; } static void arv_buffer_finalize (GObject *object) { ArvBuffer *buffer = ARV_BUFFER (object); if (!buffer->priv->is_preallocated) { g_free (buffer->priv->data); buffer->priv->data = NULL; buffer->priv->size = 0; } if (buffer->priv->user_data && buffer->priv->user_data_destroy_func) buffer->priv->user_data_destroy_func (buffer->priv->user_data); parent_class->finalize (object); } static void arv_buffer_class_init (ArvBufferClass *this_class) { GObjectClass *object_class = G_OBJECT_CLASS (this_class); g_type_class_add_private (this_class, sizeof (ArvBufferPrivate)); parent_class = g_type_class_peek_parent (this_class); object_class->finalize = arv_buffer_finalize; } G_DEFINE_TYPE (ArvBuffer, arv_buffer, G_TYPE_OBJECT) aravis-ARAVIS_0_6_0/src/arvbuffer.h000066400000000000000000000123111334570641500171410ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_BUFFER_H #define ARV_BUFFER_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef void (*ArvFrameCallback) (ArvBuffer *buffer); /** * ArvBufferStatus: * @ARV_BUFFER_STATUS_UNKNOWN: unknown status * @ARV_BUFFER_STATUS_SUCCESS: the buffer contains a valid image * @ARV_BUFFER_STATUS_CLEARED: the buffer is cleared * @ARV_BUFFER_STATUS_TIMEOUT: timeout was reached before all packets are received * @ARV_BUFFER_STATUS_MISSING_PACKETS: stream has missing packets * @ARV_BUFFER_STATUS_WRONG_PACKET_ID: stream has packet with wrong id * @ARV_BUFFER_STATUS_SIZE_MISMATCH: the received image didn't fit in the buffer data space * @ARV_BUFFER_STATUS_FILLING: the image is currently being filled * @ARV_BUFFER_STATUS_ABORTED: the filling was aborted before completion */ typedef enum { ARV_BUFFER_STATUS_UNKNOWN = -1, ARV_BUFFER_STATUS_SUCCESS = 0, ARV_BUFFER_STATUS_CLEARED, ARV_BUFFER_STATUS_TIMEOUT, ARV_BUFFER_STATUS_MISSING_PACKETS, ARV_BUFFER_STATUS_WRONG_PACKET_ID, ARV_BUFFER_STATUS_SIZE_MISMATCH, ARV_BUFFER_STATUS_FILLING, ARV_BUFFER_STATUS_ABORTED } ArvBufferStatus; /** * ArvBufferPayloadType: * @ARV_BUFFER_PAYLOAD_TYPE_UNKNOWN: unknown payload type * @ARV_BUFFER_PAYLOAD_TYPE_IMAGE: image data * @ARV_BUFFER_PAYLOAD_TYPE_RAWDATA: raw data * @ARV_BUFFER_PAYLOAD_TYPE_FILE: file * @ARV_BUFFER_PAYLOAD_TYPE_CHUNK_DATA: chunk data * @ARV_BUFFER_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA: extended chunk data * @ARV_BUFFER_PAYLOAD_TYPE_JPEG: JPEG data * @ARV_BUFFER_PAYLOAD_TYPE_JPEG2000: JPEG2000 data * @ARV_BUFFER_PAYLOAD_TYPE_H264: h264 data * @ARV_BUFFER_PAYLOAD_TYPE_MULTIZONE_IMAGE: multizone image */ typedef enum { ARV_BUFFER_PAYLOAD_TYPE_UNKNOWN = -1, ARV_BUFFER_PAYLOAD_TYPE_IMAGE = 0x0001, ARV_BUFFER_PAYLOAD_TYPE_RAWDATA = 0x0002, ARV_BUFFER_PAYLOAD_TYPE_FILE = 0x0003, ARV_BUFFER_PAYLOAD_TYPE_CHUNK_DATA = 0x0004, ARV_BUFFER_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA = 0x0005, /* Deprecated */ ARV_BUFFER_PAYLOAD_TYPE_JPEG = 0x0006, ARV_BUFFER_PAYLOAD_TYPE_JPEG2000 = 0x0007, ARV_BUFFER_PAYLOAD_TYPE_H264 = 0x0008, ARV_BUFFER_PAYLOAD_TYPE_MULTIZONE_IMAGE = 0x0009 } ArvBufferPayloadType; #define ARV_TYPE_BUFFER (arv_buffer_get_type ()) #define ARV_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_BUFFER, ArvBuffer)) #define ARV_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_BUFFER, ArvBufferClass)) #define ARV_IS_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_BUFFER)) #define ARV_IS_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_BUFFER)) #define ARV_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_BUFFER, ArvBufferClass)) typedef struct _ArvBufferPrivate ArvBufferPrivate; typedef struct _ArvBufferClass ArvBufferClass; struct _ArvBuffer { GObject object; ArvBufferPrivate *priv; }; struct _ArvBufferClass { GObjectClass parent_class; }; GType arv_buffer_get_type (void); ArvBuffer * arv_buffer_new_allocate (size_t size); ArvBuffer * arv_buffer_new (size_t size, void *preallocated); ArvBuffer * arv_buffer_new_full (size_t size, void *preallocated, void *user_data, GDestroyNotify user_data_destroy_func); ArvBufferStatus arv_buffer_get_status (ArvBuffer *buffer); const void * arv_buffer_get_user_data (ArvBuffer *buffer); ArvBufferPayloadType arv_buffer_get_payload_type (ArvBuffer *buffer); guint64 arv_buffer_get_timestamp (ArvBuffer *buffer); void arv_buffer_set_timestamp (ArvBuffer *buffer, guint64 timestamp_ns); guint64 arv_buffer_get_system_timestamp (ArvBuffer *buffer); void arv_buffer_set_system_timestamp (ArvBuffer *buffer, guint64 timestamp_ns); guint32 arv_buffer_get_frame_id (ArvBuffer *buffer); const void * arv_buffer_get_data (ArvBuffer *buffer, size_t *size); void arv_buffer_get_image_region (ArvBuffer *buffer, gint *x, gint *y, gint *width, gint *height); gint arv_buffer_get_image_width (ArvBuffer *buffer); gint arv_buffer_get_image_height (ArvBuffer *buffer); gint arv_buffer_get_image_x (ArvBuffer *buffer); gint arv_buffer_get_image_y (ArvBuffer *buffer); ArvPixelFormat arv_buffer_get_image_pixel_format (ArvBuffer *buffer); const void * arv_buffer_get_chunk_data (ArvBuffer *buffer, guint64 chunk_id, size_t *size); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvbufferprivate.h000066400000000000000000000030141334570641500205340ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_BUFFER_PRIVATE_H #define ARV_BUFFER_PRIVATE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS struct _ArvBufferPrivate { size_t size; gboolean is_preallocated; void *data; void *user_data; GDestroyNotify user_data_destroy_func; ArvBufferStatus status; ArvBufferPayloadType payload_type; guint32 chunk_endianness; guint32 frame_id; guint64 timestamp_ns; guint64 system_timestamp_ns; guint32 x_offset; guint32 y_offset; guint32 width; guint32 height; ArvPixelFormat pixel_format; }; G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvcamera.c000066400000000000000000001657171334570641500171360ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION:arvcamera * @short_description: Class for generic camera control * * #ArvCamera is a class for the generic control of cameras. It hides the * complexity of the genicam interface by providing a simple API, with the * drawback of not exposing all the available features. See #ArvDevice and * #ArvGc for a more advanced use of the Aravis library. * * Example use of the ArvCamera API * * * FIXME: MISSING XINCLUDE CONTENT * * * */ #include #include #include #include #include #include #include #include #include #include #include #include #ifdef ARAVIS_BUILD_USB #include #endif #include #include /** * ArvCameraVendor: * @ARV_CAMERA_VENDOR_UNKNOWN: unknown camera vendor * @ARV_CAMERA_VENDOR_BASLER: Basler * @ARV_CAMERA_VENDOR_PROSILICA: Prosilica * @ARV_CAMERA_VENDOR_TIS: The Imaging Source * @ARV_CAMERA_VENDOR_POINT_GREY_FLIR: PointGrey / FLIR * @ARV_CAMERA_VENDOR_XIMEA: XIMEA GmbH * @ARV_CAMERA_VENDOR_MATRIX_VISION: Matrix Vision GmbH */ typedef enum { ARV_CAMERA_VENDOR_UNKNOWN, ARV_CAMERA_VENDOR_BASLER, ARV_CAMERA_VENDOR_DALSA, ARV_CAMERA_VENDOR_PROSILICA, ARV_CAMERA_VENDOR_TIS, ARV_CAMERA_VENDOR_POINT_GREY_FLIR, ARV_CAMERA_VENDOR_RICOH, ARV_CAMERA_VENDOR_XIMEA, ARV_CAMERA_VENDOR_MATRIX_VISION } ArvCameraVendor; typedef enum { ARV_CAMERA_SERIES_UNKNOWN, ARV_CAMERA_SERIES_BASLER_ACE, ARV_CAMERA_SERIES_BASLER_SCOUT, ARV_CAMERA_SERIES_BASLER_OTHER, ARV_CAMERA_SERIES_DALSA, ARV_CAMERA_SERIES_PROSILICA, ARV_CAMERA_SERIES_TIS, ARV_CAMERA_SERIES_POINT_GREY_FLIR, ARV_CAMERA_SERIES_RICOH, ARV_CAMERA_SERIES_XIMEA, ARV_CAMERA_SERIES_MATRIX_VISION } ArvCameraSeries; static GObjectClass *parent_class = NULL; struct _ArvCameraPrivate { ArvDevice *device; ArvGc *genicam; ArvCameraVendor vendor; ArvCameraSeries series; gboolean has_gain; gboolean has_exposure_time; gboolean has_acquisition_frame_rate; gboolean has_acquisition_frame_rate_enabled; }; enum { PROP_0, PROP_CAMERA_DEVICE }; /** * arv_camera_create_stream: * @camera: a #ArvCamera * @callback: (scope call) (allow-none): a frame processing callback * @user_data: (closure) (allow-none): user data for @callback * * Creates a new #ArvStream for video stream handling. See * #ArvStreamCallback for details regarding the callback function. * * Returns: (transfer full): a new #ArvStream. * * Since: 0.2.0 */ ArvStream * arv_camera_create_stream (ArvCamera *camera, ArvStreamCallback callback, gpointer user_data) { g_return_val_if_fail (ARV_IS_CAMERA (camera), NULL); return arv_device_create_stream (camera->priv->device, callback, user_data); } /* Device control */ /** * arv_camera_get_vendor_name: * @camera: a #ArvCamera * * Returns: the camera vendor name. * * Since: 0.2.0 */ const char * arv_camera_get_vendor_name (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), NULL); return arv_device_get_string_feature_value (camera->priv->device, "DeviceVendorName"); } /** * arv_camera_get_model_name: * @camera: a #ArvCamera * * Returns: the camera model name. * * Since: 0.2.0 */ const char * arv_camera_get_model_name (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), NULL); return arv_device_get_string_feature_value (camera->priv->device, "DeviceModelName"); } /** * arv_camera_get_device_id: * @camera: a #ArvCamera * * Returns: the camera device ID. * * Since: 0.2.0 */ const char * arv_camera_get_device_id (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), NULL); return arv_device_get_string_feature_value (camera->priv->device, "DeviceID"); } /* Image format control */ /** * arv_camera_get_sensor_size: * @camera: a #ArvCamera * @width: (out): camera sensor width * @height: (out): camera sensor height * * Since: 0.2.0 */ void arv_camera_get_sensor_size (ArvCamera *camera, gint *width, gint *height) { g_return_if_fail (ARV_IS_CAMERA (camera)); if (width != NULL) *width = arv_device_get_integer_feature_value (camera->priv->device, "SensorWidth"); if (height != NULL) *height = arv_device_get_integer_feature_value (camera->priv->device, "SensorHeight"); } /** * arv_camera_set_region: * @camera: a #ArvCamera * @x: x offset * @y: y_offset * @width: region width * @height: region height * * Defines the region of interest which will be transmitted in the video * stream. * * Since: 0.2.0 */ void arv_camera_set_region (ArvCamera *camera, gint x, gint y, gint width, gint height) { g_return_if_fail (ARV_IS_CAMERA (camera)); if (x >= 0) arv_device_set_integer_feature_value (camera->priv->device, "OffsetX", x); if (y >= 0) arv_device_set_integer_feature_value (camera->priv->device, "OffsetY", y); if (width > 0) arv_device_set_integer_feature_value (camera->priv->device, "Width", width); if (height > 0) arv_device_set_integer_feature_value (camera->priv->device, "Height", height); } /** * arv_camera_get_region: * @camera: a #ArvCamera * @x: (out): x offset * @y: (out): y_offset * @width: (out): region width * @height: (out): region height * * Retrieves the current region of interest. * * Since: 0.2.0 */ void arv_camera_get_region (ArvCamera *camera, gint *x, gint *y, gint *width, gint *height) { g_return_if_fail (ARV_IS_CAMERA (camera)); if (x != NULL) *x = arv_device_get_integer_feature_value (camera->priv->device, "OffsetX"); if (y != NULL) *y = arv_device_get_integer_feature_value (camera->priv->device, "OffsetY"); if (width != NULL) *width = arv_device_get_integer_feature_value (camera->priv->device, "Width"); if (height != NULL) *height = arv_device_get_integer_feature_value (camera->priv->device, "Height"); } /** * arv_camera_get_x_offset_bounds: * @camera: a #ArvCamera * @min: (out): minimum offset * @max: (out): maximum offset * * Retrieves the valid range for image horizontal offset. * * Since: 0.6.0 */ void arv_camera_get_x_offset_bounds (ArvCamera *camera, gint *min, gint *max) { gint64 min64, max64; g_return_if_fail (ARV_IS_CAMERA (camera)); arv_device_get_integer_feature_bounds (camera->priv->device, "OffsetX", &min64, &max64); if (min != NULL) *min = min64; if (max != NULL) *max = max64; } /** * arv_camera_get_y_offset_bounds: * @camera: a #ArvCamera * @min: (out): minimum offset * @max: (out): maximum offset * * Retrieves the valid range for image vertical offset. * * Since: 0.6.0 */ void arv_camera_get_y_offset_bounds (ArvCamera *camera, gint *min, gint *max) { gint64 min64, max64; g_return_if_fail (ARV_IS_CAMERA (camera)); arv_device_get_integer_feature_bounds (camera->priv->device, "OffsetY", &min64, &max64); if (min != NULL) *min = min64; if (max != NULL) *max = max64; } /** * arv_camera_get_x_binning_bounds: * @camera: a #ArvCamera * @min: (out): minimum binning * @max: (out): maximum binning * * Retrieves the valid range for image horizontal binning. * * Since: 0.6.0 */ void arv_camera_get_x_binning_bounds (ArvCamera *camera, gint *min, gint *max) { gint64 min64, max64; g_return_if_fail (ARV_IS_CAMERA (camera)); arv_device_get_integer_feature_bounds (camera->priv->device, "BinningHorizontal", &min64, &max64); if (min != NULL) *min = min64; if (max != NULL) *max = max64; } /** * arv_camera_get_y_binning_bounds: * @camera: a #ArvCamera * @min: (out): minimum binning * @max: (out): maximum binning * * Retrieves the valid range for image vertical binning. * * Since: 0.6.0 */ void arv_camera_get_y_binning_bounds (ArvCamera *camera, gint *min, gint *max) { gint64 min64, max64; g_return_if_fail (ARV_IS_CAMERA (camera)); arv_device_get_integer_feature_bounds (camera->priv->device, "BinningVertical", &min64, &max64); if (min != NULL) *min = min64; if (max != NULL) *max = max64; } /** * arv_camera_get_width_bounds: * @camera: a #ArvCamera * @min: (out): minimum width * @max: (out): maximum width * * Retrieves the valid range for image width. * * Since: 0.6.0 */ void arv_camera_get_width_bounds (ArvCamera *camera, gint *min, gint *max) { gint64 min64, max64; g_return_if_fail (ARV_IS_CAMERA (camera)); arv_device_get_integer_feature_bounds (camera->priv->device, "Width", &min64, &max64); if (min != NULL) *min = min64; if (max != NULL) *max = max64; } /** * arv_camera_get_height_bounds: * @camera: a #ArvCamera * @min: (out): minimum height * @max: (out): maximum height * * Retrieves the valid range for image height. * * Since: 0.6.0 */ void arv_camera_get_height_bounds (ArvCamera *camera, gint *min, gint *max) { gint64 min64, max64; g_return_if_fail (ARV_IS_CAMERA (camera)); arv_device_get_integer_feature_bounds (camera->priv->device, "Height", &min64, &max64); if (min != NULL) *min = min64; if (max != NULL) *max = max64; } /** * arv_camera_set_binning: * @camera: a #ArvCamera * @dx: horizontal binning * @dy: vertical binning * * Defines binning in both directions. Not all cameras support this * feature. * * Since: 0.6.0 */ void arv_camera_set_binning (ArvCamera *camera, gint dx, gint dy) { g_return_if_fail (ARV_IS_CAMERA (camera)); if (dx > 0) arv_device_set_integer_feature_value (camera->priv->device, "BinningHorizontal", dx); if (dy > 0) arv_device_set_integer_feature_value (camera->priv->device, "BinningVertical", dy); } /** * arv_camera_get_binning: * @camera: a #ArvCamera * @dx: (out): horizontal binning placeholder * @dy: (out): vertical binning placeholder * * Retrieves binning in both directions. * * Since: 0.2.0 */ void arv_camera_get_binning (ArvCamera *camera, gint *dx, gint *dy) { g_return_if_fail (ARV_IS_CAMERA (camera)); if (dx != NULL) *dx = arv_device_get_integer_feature_value (camera->priv->device, "BinningHorizontal"); if (dy != NULL) *dy = arv_device_get_integer_feature_value (camera->priv->device, "BinningVertical"); } /** * arv_camera_set_pixel_format: * @camera: a #ArvCamera * @format: pixel format * * Defines pixel format. * * Since: 0.2.0 */ void arv_camera_set_pixel_format (ArvCamera *camera, ArvPixelFormat format) { g_return_if_fail (ARV_IS_CAMERA (camera)); arv_device_set_integer_feature_value (camera->priv->device, "PixelFormat", format); } /** * arv_camera_set_pixel_format_from_string: * @camera: a #ArvCamera * @format: pixel format * * Defines pixel format described by a string. * * Since: 0.2.0 */ void arv_camera_set_pixel_format_from_string (ArvCamera *camera, const char * format) { g_return_if_fail (ARV_IS_CAMERA (camera)); arv_device_set_string_feature_value (camera->priv->device, "PixelFormat", format); } /** * arv_camera_get_pixel_format: * @camera: a #ArvCamera * * Returns: pixel format. * * Since: 0.2.0 */ ArvPixelFormat arv_camera_get_pixel_format (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), 0); return arv_device_get_integer_feature_value (camera->priv->device, "PixelFormat"); } /** * arv_camera_get_pixel_format_as_string: * @camera: a #ArvCamera * * Retuns: pixel format as string, NULL on error. * * Since: 0.2.0 */ const char * arv_camera_get_pixel_format_as_string (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), NULL); return arv_device_get_string_feature_value (camera->priv->device, "PixelFormat"); } /** * arv_camera_get_available_pixel_formats: * @camera: a #ArvCamera * @n_pixel_formats: (out): number of different pixel formats * * Retrieves the list of all available pixel formats. * * Returns: (array length=n_pixel_formats) (transfer container): a newly allocated array of #ArvPixelFormat * * Since: 0.2.0 */ gint64 * arv_camera_get_available_pixel_formats (ArvCamera *camera, guint *n_pixel_formats) { g_return_val_if_fail (ARV_IS_CAMERA (camera), NULL); return arv_device_get_available_enumeration_feature_values (camera->priv->device, "PixelFormat", n_pixel_formats); } /** * arv_camera_get_available_pixel_formats_as_strings: * @camera: a #ArvCamera * @n_pixel_formats: (out): number of different pixel formats * * Retrieves the list of all available pixel formats as strings. * * Returns: (array length=n_pixel_formats) (transfer container): a newly allocated array of strings. * * Since: 0.2.0 */ const char ** arv_camera_get_available_pixel_formats_as_strings (ArvCamera *camera, guint *n_pixel_formats) { g_return_val_if_fail (ARV_IS_CAMERA (camera), NULL); return arv_device_get_available_enumeration_feature_values_as_strings (camera->priv->device, "PixelFormat", n_pixel_formats); } /** * arv_camera_get_available_pixel_formats_as_display_names: * @camera: a #ArvCamera * @n_pixel_formats: (out): number of different pixel formats * * Retrieves the list of all available pixel formats as display names. * In general, these human-readable strings cannot be used as settings. * * Returns: (array length=n_pixel_formats) (transfer container): a newly allocated array of string constants. * * Since: 0.2.0 */ const char ** arv_camera_get_available_pixel_formats_as_display_names (ArvCamera *camera, guint *n_pixel_formats) { ArvGcNode *node; const GSList *entries, *iter; GSList *available_entries = NULL; const char **strings; const char *string = NULL; gboolean is_available, is_implemented; int i; g_return_val_if_fail (n_pixel_formats != NULL, NULL); *n_pixel_formats = 0; g_return_val_if_fail (ARV_IS_CAMERA (camera), NULL); node = arv_device_get_feature (camera->priv->device, "PixelFormat"); if (ARV_IS_GC_ENUMERATION (node)) entries = arv_gc_enumeration_get_entries (ARV_GC_ENUMERATION (node)); else return NULL; for (i = 0, iter = entries; iter != NULL; iter = iter->next) { is_available = arv_gc_feature_node_is_available (iter->data, NULL); is_implemented = arv_gc_feature_node_is_implemented (iter->data, NULL); if (is_available && is_implemented) { string = arv_gc_feature_node_get_display_name (iter->data, NULL); if (string == NULL) string = arv_gc_feature_node_get_name (iter->data); if (string == NULL) { g_slist_free (available_entries); return NULL; } available_entries = g_slist_prepend (available_entries, (gpointer)string); i++; } } strings = g_new (const char *, i); for (i = 0, iter = available_entries; iter != NULL; iter = iter->next, i++) strings[i] = iter->data; *n_pixel_formats = i; return strings; } /* Acquisition control */ /** * arv_camera_start_acquisition: * @camera: a #ArvCamera * * Starts video stream acquisition. * * Since: 0.2.0 */ void arv_camera_start_acquisition (ArvCamera *camera) { g_return_if_fail (ARV_IS_CAMERA (camera)); arv_device_execute_command (camera->priv->device, "AcquisitionStart"); } /** * arv_camera_stop_acquisition: * @camera: a #ArvCamera * * Stops video stream acquisition. * * Since: 0.2.0 */ void arv_camera_stop_acquisition (ArvCamera *camera) { g_return_if_fail (ARV_IS_CAMERA (camera)); arv_device_execute_command (camera->priv->device, "AcquisitionStop"); } /** * arv_camera_abort_acquisition: * @camera: a #ArvCamera * * Aborts video stream acquisition. * * Since: 0.4.0 */ void arv_camera_abort_acquisition (ArvCamera *camera) { g_return_if_fail (ARV_IS_CAMERA (camera)); arv_device_execute_command (camera->priv->device, "AcquisitionAbort"); } /** * arv_camera_acquisition: * @camera: a #ArvCamera * @timeout: acquisition timeout * * Acquire one image buffer. * * Returns: (transfer full): A new #ArvBuffer, NULL on error. The returned buffer must be freed using g_object_unref(). * * Since: 0.6.0 */ ArvBuffer * arv_camera_acquisition (ArvCamera *camera, guint64 timeout) { ArvStream *stream; ArvBuffer *buffer; gint payload; g_return_val_if_fail (ARV_IS_CAMERA (camera), NULL); stream = arv_camera_create_stream (camera, NULL, NULL); payload = arv_camera_get_payload (camera); arv_stream_push_buffer (stream, arv_buffer_new (payload, NULL)); arv_camera_set_acquisition_mode (camera, ARV_ACQUISITION_MODE_SINGLE_FRAME); arv_camera_start_acquisition (camera); if (timeout > 0) buffer = arv_stream_timeout_pop_buffer (stream, timeout); else buffer = arv_stream_pop_buffer (stream); arv_camera_stop_acquisition (camera); g_object_unref (stream); return buffer; } /* * arv_camera_set_acquisition_mode: * @camera: a #ArvCamera * @acquisition_mode: acquisition mode * * Defines acquisition mode. * * Since: 0.2.0 */ void arv_camera_set_acquisition_mode (ArvCamera *camera, ArvAcquisitionMode acquisition_mode) { g_return_if_fail (ARV_IS_CAMERA (camera)); arv_device_set_string_feature_value (camera->priv->device, "AcquisitionMode", arv_acquisition_mode_to_string (acquisition_mode)); } /** * arv_camera_get_acquisition_mode: * @camera: a #ArvCamera * * Returns: acquisition mode. * * Since: 0.2.0 */ ArvAcquisitionMode arv_camera_get_acquisition_mode (ArvCamera *camera) { const char *string; g_return_val_if_fail (ARV_IS_CAMERA (camera), 0); string = arv_device_get_string_feature_value (camera->priv->device, "AcquisitionMode"); return arv_acquisition_mode_from_string (string); } /** * arv_camera_set_frame_count: * @camera: a #ArvCamera * @frame_count: number of frames to capture in MultiFrame mode * * Sets the number of frames to capture in MultiFrame mode. * * Since: 0.6.0 */ void arv_camera_set_frame_count (ArvCamera *camera, gint64 frame_count) { gint64 minimum; gint64 maximum; g_return_if_fail (ARV_IS_CAMERA (camera)); if (frame_count <= 0) return; arv_camera_get_frame_count_bounds(camera, &minimum, &maximum); if (frame_count < minimum) frame_count = minimum; if (frame_count > maximum) frame_count = maximum; arv_device_set_integer_feature_value (camera->priv->device, "AcquisitionFrameCount", frame_count); } /** * arv_camera_get_frame_count: * @camera: a #ArvCamera * * Returns: number of frames to capture in MultiFrame mode. * * Since: 0.6.0 */ gint64 arv_camera_get_frame_count (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), 0); return arv_device_get_integer_feature_value (camera->priv->device, "AcquisitionFrameCount"); } /** * arv_camera_get_frame_count_bounds: * @camera: a #ArvCamera * @min: (out): minimal possible frame count * @max: (out): maximum possible frame count * * Retrieves allowed range for frame count. * * Since: 0.6.0 */ void arv_camera_get_frame_count_bounds (ArvCamera *camera, gint64 *min, gint64 *max) { if (min != NULL) *min = G_MININT64; if (max != NULL) *max = G_MAXINT64; g_return_if_fail (ARV_IS_CAMERA (camera)); arv_device_get_integer_feature_bounds (camera->priv->device, "AcquisitionFrameCount", min, max); } /** * arv_camera_set_frame_rate: * @camera: a #ArvCamera * @frame_rate: frame rate, in Hz * * Configures a fixed frame rate mode. Once acquisition start is triggered, the * video stream will be acquired with the given frame rate. * * Since: 0.2.0 */ void arv_camera_set_frame_rate (ArvCamera *camera, double frame_rate) { ArvGcNode *feature; double minimum; double maximum; g_return_if_fail (ARV_IS_CAMERA (camera)); if (frame_rate <= 0.0) return; arv_camera_get_frame_rate_bounds(camera, &minimum, &maximum); if (frame_rate < minimum) frame_rate = minimum; if (frame_rate > maximum) frame_rate = maximum; switch (camera->priv->vendor) { case ARV_CAMERA_VENDOR_BASLER: arv_device_set_string_feature_value (camera->priv->device, "TriggerSelector", "AcquisitionStart"); arv_device_set_string_feature_value (camera->priv->device, "TriggerMode", "Off"); arv_device_set_string_feature_value (camera->priv->device, "TriggerSelector", "FrameStart"); arv_device_set_string_feature_value (camera->priv->device, "TriggerMode", "Off"); arv_device_set_integer_feature_value (camera->priv->device, "AcquisitionFrameRateEnable", 1); arv_device_set_float_feature_value (camera->priv->device, camera->priv->has_acquisition_frame_rate ? "AcquisitionFrameRate": "AcquisitionFrameRateAbs", frame_rate); break; case ARV_CAMERA_VENDOR_PROSILICA: arv_device_set_string_feature_value (camera->priv->device, "TriggerSelector", "FrameStart"); arv_device_set_string_feature_value (camera->priv->device, "TriggerMode", "Off"); arv_device_set_float_feature_value (camera->priv->device, "AcquisitionFrameRateAbs", frame_rate); break; case ARV_CAMERA_VENDOR_TIS: arv_device_set_string_feature_value (camera->priv->device, "TriggerSelector", "FrameStart"); arv_device_set_string_feature_value (camera->priv->device, "TriggerMode", "Off"); feature = arv_device_get_feature (camera->priv->device, "FPS"); if (ARV_IS_GC_FEATURE_NODE (feature) && g_strcmp0 (arv_dom_node_get_node_name (ARV_DOM_NODE (feature)), "Enumeration") == 0) { gint64 *values; guint n_values; guint i; values = arv_gc_enumeration_get_available_int_values (ARV_GC_ENUMERATION (feature), &n_values, NULL); for (i = 0; i < n_values; i++) { if (values[i] > 0) { double e; e = (int)((10000000/(double) values[i]) * 100 + 0.5) / 100.0; if (e == frame_rate) { arv_gc_enumeration_set_int_value (ARV_GC_ENUMERATION (feature), values[i], NULL); break; } } } g_free (values); } else arv_device_set_float_feature_value (camera->priv->device, "FPS", frame_rate); break; case ARV_CAMERA_VENDOR_POINT_GREY_FLIR: arv_device_set_string_feature_value (camera->priv->device, "TriggerSelector", "FrameStart"); arv_device_set_string_feature_value (camera->priv->device, "TriggerMode", "Off"); if (camera->priv->has_acquisition_frame_rate_enabled) arv_device_set_integer_feature_value (camera->priv->device, "AcquisitionFrameRateEnabled", 1); else arv_device_set_integer_feature_value (camera->priv->device, "AcquisitionFrameRateEnable", 1); arv_device_set_string_feature_value (camera->priv->device, "AcquisitionFrameRateAuto", "Off"); arv_device_set_float_feature_value (camera->priv->device, "AcquisitionFrameRate", frame_rate); break; case ARV_CAMERA_VENDOR_DALSA: case ARV_CAMERA_VENDOR_RICOH: case ARV_CAMERA_VENDOR_XIMEA: case ARV_CAMERA_VENDOR_MATRIX_VISION: case ARV_CAMERA_VENDOR_UNKNOWN: arv_device_set_string_feature_value (camera->priv->device, "TriggerSelector", "FrameStart"); arv_device_set_string_feature_value (camera->priv->device, "TriggerMode", "Off"); arv_device_set_float_feature_value (camera->priv->device, camera->priv->has_acquisition_frame_rate ? "AcquisitionFrameRate": "AcquisitionFrameRateAbs", frame_rate); break; } } /** * arv_camera_get_frame_rate: * @camera: a #ArvCamera * * Returns: actual frame rate, in Hz. * * Since: 0.2.0 */ double arv_camera_get_frame_rate (ArvCamera *camera) { ArvGcNode *feature; g_return_val_if_fail (ARV_IS_CAMERA (camera), -1.0); switch (camera->priv->vendor) { case ARV_CAMERA_VENDOR_PROSILICA: return arv_device_get_float_feature_value (camera->priv->device, "AcquisitionFrameRateAbs"); case ARV_CAMERA_VENDOR_TIS: feature = arv_device_get_feature (camera->priv->device, "FPS"); if (ARV_IS_GC_FEATURE_NODE (feature) && g_strcmp0 (arv_dom_node_get_node_name (ARV_DOM_NODE (feature)), "Enumeration") == 0) { gint64 i; i = arv_gc_enumeration_get_int_value (ARV_GC_ENUMERATION (feature), NULL); if (i > 0) return (int)((10000000/(double) i) * 100 + 0.5) / 100.0; else return 0; } else return arv_device_get_float_feature_value (camera->priv->device, "FPS"); case ARV_CAMERA_VENDOR_POINT_GREY_FLIR: case ARV_CAMERA_VENDOR_DALSA: case ARV_CAMERA_VENDOR_RICOH: case ARV_CAMERA_VENDOR_BASLER: case ARV_CAMERA_VENDOR_XIMEA: case ARV_CAMERA_VENDOR_MATRIX_VISION: case ARV_CAMERA_VENDOR_UNKNOWN: return arv_device_get_float_feature_value (camera->priv->device, camera->priv->has_acquisition_frame_rate ? "AcquisitionFrameRate": "AcquisitionFrameRateAbs"); } return -1.0; } /** * arv_camera_get_frame_rate_bounds: * @camera: a #ArvCamera * @min: (out): minimal possible framerate * @max: (out): maximum possible framerate * * Retrieves allowed range for framerate. * * Since 0.2.2 */ void arv_camera_get_frame_rate_bounds (ArvCamera *camera, double *min, double *max) { ArvGcNode *feature; if (min != NULL) *min = G_MINDOUBLE; if (max != NULL) *max = G_MAXDOUBLE; g_return_if_fail (ARV_IS_CAMERA (camera)); switch (camera->priv->vendor) { case ARV_CAMERA_VENDOR_TIS: feature = arv_device_get_feature (camera->priv->device, "FPS"); if (ARV_IS_GC_FEATURE_NODE (feature) && g_strcmp0 (arv_dom_node_get_node_name (ARV_DOM_NODE (feature)), "Enumeration") == 0) { gint64 *values; guint n_values; guint i; values = arv_gc_enumeration_get_available_int_values (ARV_GC_ENUMERATION (feature), &n_values, NULL); for (i = 0; i < n_values; i++) { if (values[i] > 0) { double s; s = (int)((10000000/(double) values[i]) * 100 + 0.5) / 100.0; if (max != NULL && s > *max) *max = s; if (min != NULL && (*min == 0 || *min > s)) *min = s; } } g_free (values); } else arv_device_get_float_feature_bounds (camera->priv->device, "FPS", min, max); break; case ARV_CAMERA_VENDOR_PROSILICA: arv_device_get_float_feature_bounds (camera->priv->device, "AcquisitionFrameRateAbs", min, max); break; case ARV_CAMERA_VENDOR_POINT_GREY_FLIR: case ARV_CAMERA_VENDOR_DALSA: case ARV_CAMERA_VENDOR_RICOH: case ARV_CAMERA_VENDOR_BASLER: case ARV_CAMERA_VENDOR_XIMEA: case ARV_CAMERA_VENDOR_MATRIX_VISION: case ARV_CAMERA_VENDOR_UNKNOWN: arv_device_get_float_feature_bounds (camera->priv->device, camera->priv->has_acquisition_frame_rate ? "AcquisitionFrameRate": "AcquisitionFrameRateAbs", min, max); break; } } /** * arv_camera_set_trigger: * @camera: a #ArvCamera * @source: trigger source as string * * Configures the camera in trigger mode. Typical values for source are "Line1" * or "Line2". See the camera documentation for the allowed values. * Activation is set to rising edge. It can be changed by accessing the * underlying device object. * * Source can also be "Software". In this case, an acquisition is triggered * by a call to arv_camera_software_trigger(). * * Since: 0.2.0 */ void arv_camera_set_trigger (ArvCamera *camera, const char *source) { g_return_if_fail (ARV_IS_CAMERA (camera)); g_return_if_fail (source != NULL); if (camera->priv->vendor == ARV_CAMERA_VENDOR_BASLER) arv_device_set_integer_feature_value (camera->priv->device, "AcquisitionFrameRateEnable", 0); arv_device_set_string_feature_value (camera->priv->device, "TriggerSelector", "AcquisitionStart"); arv_device_set_string_feature_value (camera->priv->device, "TriggerMode", "Off"); arv_device_set_string_feature_value (camera->priv->device, "TriggerSelector", "FrameStart"); arv_device_set_string_feature_value (camera->priv->device, "TriggerMode", "On"); arv_device_set_string_feature_value (camera->priv->device, "TriggerActivation", "RisingEdge"); arv_device_set_string_feature_value (camera->priv->device, "TriggerSource", source); } /** * arv_camera_set_trigger_source: * @camera: a #ArvCamera * @source: source name * * Sets the trigger source. This function doesn't check if the camera is configured * to actually use this source as a trigger. * * Since: 0.2.0 */ void arv_camera_set_trigger_source (ArvCamera *camera, const char *source) { g_return_if_fail (ARV_IS_CAMERA (camera)); g_return_if_fail (source != NULL); arv_device_set_string_feature_value (camera->priv->device, "TriggerSource", source); } /** * arv_camera_get_trigger_source: * @camera: a #ArvCamera * * Gets the trigger source. This function doesn't check if the camera is configured * to actually use this source as a trigger. * * Returns: a string containing the trigger source name, NULL on error. * * Since: 0.2.0 */ const char * arv_camera_get_trigger_source (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), NULL); return arv_device_get_string_feature_value (camera->priv->device, "TriggerSource"); } /** * arv_camera_get_available_trigger_sources: * @camera: a #ArvCamera * @n_sources: (out): number of sources * * Gets the list of all available trigger sources. * * Returns: (array length=n_sources) (transfer container): a newly allocated array of strings, which must be freed using g_free(). * * Since: 0.6.0 */ const char ** arv_camera_get_available_trigger_sources (ArvCamera *camera, guint *n_sources) { g_return_val_if_fail (ARV_IS_CAMERA (camera), NULL); return arv_device_get_available_enumeration_feature_values_as_strings (camera->priv->device, "TriggerSource", n_sources); } /** * arv_camera_get_available_triggers: * @camera: a #ArvCamera * @n_triggers: (out): number of available triggers * * Gets a list of all available triggers: FrameStart, ExposureActive, etc... * * Returns: (array length=n_triggers) (transfer container): a newly allocated array of strings, which must be freed using g_free(). * * Since: 0.6.0 */ const char ** arv_camera_get_available_triggers (ArvCamera *camera, guint *n_triggers) { g_return_val_if_fail (ARV_IS_CAMERA (camera), NULL); return arv_device_get_available_enumeration_feature_values_as_strings (camera->priv->device, "TriggerSelector", n_triggers); } /** * arv_camera_clear_triggers: * @camera: a #ArvCamera * * Disables all triggers. * * Since: 0.6.0 */ void arv_camera_clear_triggers (ArvCamera* camera) { const char **triggers; guint n_triggers; unsigned i; g_return_if_fail (ARV_IS_CAMERA (camera)); triggers = arv_device_get_available_enumeration_feature_values_as_strings(camera->priv->device, "TriggerSelector", &n_triggers); for (i = 0; i< n_triggers; i++) { arv_device_set_string_feature_value (camera->priv->device, "TriggerSelector", triggers[i]); arv_device_set_string_feature_value (camera->priv->device, "TriggerMode", "Off"); } } /** * arv_camera_software_trigger: * @camera: a #ArvCamera * * Sends a software trigger command to @camera. The camera must be previously * configured to use a software trigger, using @arv_camera_set_trigger(). * * Since: 0.2.0 */ void arv_camera_software_trigger (ArvCamera *camera) { g_return_if_fail (ARV_IS_CAMERA (camera)); arv_device_execute_command (camera->priv->device, "TriggerSoftware"); } /** * arv_camera_set_exposure_time: * @camera: a #ArvCamera * @exposure_time_us: exposure time, in µs * * Sets exposure time. User should take care to set a value compatible with * the desired frame rate. * * Since: 0.2.0 */ void arv_camera_set_exposure_time (ArvCamera *camera, double exposure_time_us) { g_return_if_fail (ARV_IS_CAMERA (camera)); if (exposure_time_us <= 0) return; switch (camera->priv->series) { case ARV_CAMERA_SERIES_BASLER_SCOUT: arv_device_set_float_feature_value (camera->priv->device, "ExposureTimeBaseAbs", exposure_time_us); arv_device_set_integer_feature_value (camera->priv->device, "ExposureTimeRaw", 1); break; case ARV_CAMERA_SERIES_RICOH: arv_device_set_integer_feature_value (camera->priv->device, "ExposureTimeRaw", exposure_time_us); break; case ARV_CAMERA_SERIES_XIMEA: arv_device_set_integer_feature_value (camera->priv->device, "ExposureTime", exposure_time_us); break; case ARV_CAMERA_SERIES_MATRIX_VISION: arv_device_set_string_feature_value (camera->priv->device, "ExposureMode", "Timed"); arv_device_set_float_feature_value (camera->priv->device, "ExposureTime", exposure_time_us); break; case ARV_CAMERA_SERIES_BASLER_ACE: default: arv_device_set_float_feature_value (camera->priv->device, camera->priv->has_exposure_time ? "ExposureTime" : "ExposureTimeAbs", exposure_time_us); break; } } /** * arv_camera_get_exposure_time: * @camera: a #ArvCamera * * Returns: current exposure time, in µs. * * Since: 0.2.0 */ double arv_camera_get_exposure_time (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), 0.0); switch (camera->priv->series) { case ARV_CAMERA_SERIES_XIMEA: return arv_device_get_integer_feature_value (camera->priv->device,"ExposureTime"); case ARV_CAMERA_SERIES_RICOH: return arv_device_get_integer_feature_value (camera->priv->device,"ExposureTimeRaw"); default: return arv_device_get_float_feature_value (camera->priv->device, camera->priv->has_exposure_time ? "ExposureTime" : "ExposureTimeAbs"); } } /** * arv_camera_get_exposure_time_bounds: * @camera: a #ArvCamera * @min: (out): minimum exposure time * @max: (out): maximum exposure time * * Retrieves exposure time bounds, in µs. * * Since: 0.2.0 */ void arv_camera_get_exposure_time_bounds (ArvCamera *camera, double *min, double *max) { gint64 int_min, int_max; g_return_if_fail (ARV_IS_CAMERA (camera)); switch (camera->priv->series) { case ARV_CAMERA_SERIES_BASLER_SCOUT: arv_device_get_float_feature_bounds (camera->priv->device, camera->priv->has_exposure_time ? "ExposureTime" : "ExposureTimeBaseAbs", min, max); break; case ARV_CAMERA_SERIES_BASLER_ACE: if (camera->priv->has_exposure_time) { arv_device_get_float_feature_bounds (camera->priv->device, "ExposureTime", min, max); } else { arv_device_get_integer_feature_bounds (camera->priv->device, "ExposureTimeRaw", &int_min, &int_max); if (min != NULL) *min = int_min; if (max != NULL) *max = int_max; } break; case ARV_CAMERA_SERIES_XIMEA: arv_device_get_integer_feature_bounds (camera->priv->device, "ExposureTime", &int_min, &int_max); if (min != NULL) *min = int_min; if (max != NULL) *max = int_max; break; case ARV_CAMERA_SERIES_RICOH: arv_device_get_integer_feature_bounds (camera->priv->device, "ExposureTimeRaw", &int_min, &int_max); if (min != NULL) *min = int_min; if (max != NULL) *max = int_max; break; default: arv_device_get_float_feature_bounds (camera->priv->device, camera->priv->has_exposure_time ? "ExposureTime" : "ExposureTimeAbs", min, max); break; } } /** * arv_camera_set_exposure_time_auto: * @camera: a #ArvCamera * @auto_mode: auto exposure mode selection * * Configures automatic exposure feature. * * Since: 0.2.0 */ void arv_camera_set_exposure_time_auto (ArvCamera *camera, ArvAuto auto_mode) { g_return_if_fail (ARV_IS_CAMERA (camera)); arv_device_set_string_feature_value (camera->priv->device, "ExposureAuto", arv_auto_to_string (auto_mode)); } /** * arv_camera_get_exposure_time_auto: * @camera: a #ArvCamera * * Returns: auto exposure mode selection * * Since: 0.2.0 */ ArvAuto arv_camera_get_exposure_time_auto (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), ARV_AUTO_OFF); return arv_auto_from_string (arv_device_get_string_feature_value (camera->priv->device, "ExposureAuto")); } /* Analog control */ /** * arv_camera_set_gain: * @camera: a #ArvCamera * @gain: gain value * * Sets the gain of the ADC converter. * * Since: 0.2.0 */ void arv_camera_set_gain (ArvCamera *camera, double gain) { g_return_if_fail (ARV_IS_CAMERA (camera)); if (gain < 0) return; if (camera->priv->has_gain) arv_device_set_float_feature_value (camera->priv->device, "Gain", gain); else arv_device_set_integer_feature_value (camera->priv->device, "GainRaw", gain); } /** * arv_camera_get_gain: * @camera: a #ArvCamera * * Returns: the current gain setting. * * Since: 0.2.0 */ double arv_camera_get_gain (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), 0.0); if (camera->priv->has_gain) return arv_device_get_float_feature_value (camera->priv->device, "Gain"); return arv_device_get_integer_feature_value (camera->priv->device, "GainRaw"); } /** * arv_camera_get_gain_bounds: * @camera: a #ArvCamera * @min: (out): minimum gain * @max: (out): maximum gain * * Retrieves gain bounds. * * Since: 0.2.0 */ void arv_camera_get_gain_bounds (ArvCamera *camera, double *min, double *max) { gint64 min64, max64; g_return_if_fail (ARV_IS_CAMERA (camera)); if (camera->priv->has_gain) { arv_device_get_float_feature_bounds (camera->priv->device, "Gain", min, max); return; } arv_device_get_integer_feature_bounds (camera->priv->device, "GainRaw", &min64, &max64); if (min != NULL) *min = min64; if (max != NULL) *max = max64; return; } /** * arv_camera_set_gain_auto: * @camera: a #ArvCamera * @auto_mode: auto gain mode selection * * Configures automatic gain feature. * * Since: 0.2.0 **/ void arv_camera_set_gain_auto (ArvCamera *camera, ArvAuto auto_mode) { g_return_if_fail (ARV_IS_CAMERA (camera)); arv_device_set_string_feature_value (camera->priv->device, "GainAuto", arv_auto_to_string (auto_mode)); } /** * arv_camera_get_gain_auto: * @camera: a #ArvCamera * * Returns: auto gain mode selection * * Since: 0.2.0 **/ ArvAuto arv_camera_get_gain_auto (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), ARV_AUTO_OFF); return arv_auto_from_string (arv_device_get_string_feature_value (camera->priv->device, "GainAuto")); } /* Transport layer control */ /** * arv_camera_get_payload: * @camera: a #ArvCamera * * Retrieves the size needed for the storage of an image. This value is used * for the creation of the stream buffers. * * Returns: frame storage size, in bytes. * * Since: 0.2.0 */ guint arv_camera_get_payload (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), 0); return arv_device_get_integer_feature_value (camera->priv->device, "PayloadSize"); } /** * arv_camera_get_device: * @camera: a #ArvCamera * * Retrieves the #ArvDevice object for more complete access to camera features. * * Returns: (transfer none): underlying device object. * * Since: 0.2.0 */ ArvDevice * arv_camera_get_device (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), NULL); return camera->priv->device; } /** * arv_camera_is_frame_rate_available: * @camera: a #ArvCamera * * Returns: %TRUE if FrameRate feature is available * * Since: 0.2.0 */ gboolean arv_camera_is_frame_rate_available (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), FALSE); switch (camera->priv->vendor) { case ARV_CAMERA_VENDOR_PROSILICA: return arv_device_get_feature (camera->priv->device, "AcquisitionFrameRateAbs") != NULL; case ARV_CAMERA_VENDOR_TIS: return arv_device_get_feature (camera->priv->device, "FPS") != NULL; case ARV_CAMERA_VENDOR_POINT_GREY_FLIR: case ARV_CAMERA_VENDOR_DALSA: case ARV_CAMERA_VENDOR_RICOH: case ARV_CAMERA_VENDOR_BASLER: case ARV_CAMERA_VENDOR_XIMEA: case ARV_CAMERA_VENDOR_MATRIX_VISION: case ARV_CAMERA_VENDOR_UNKNOWN: return arv_device_get_feature (camera->priv->device, camera->priv->has_acquisition_frame_rate ? "AcquisitionFrameRate": "AcquisitionFrameRateAbs") != NULL; } return FALSE; } /** * arv_camera_is_exposure_time_available: * @camera: a #ArvCamera * * Returns: %TRUE if Exposure Time feature is available. * * Since: 0.2.0 */ gboolean arv_camera_is_exposure_time_available (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), FALSE); switch (camera->priv->vendor) { case ARV_CAMERA_VENDOR_XIMEA: return arv_device_get_feature (camera->priv->device, "ExposureTime") != NULL; case ARV_CAMERA_VENDOR_RICOH: return arv_device_get_feature (camera->priv->device, "ExposureTimeRaw") != NULL; default: return arv_device_get_feature (camera->priv->device, camera->priv->has_exposure_time ? "ExposureTime" : "ExposureTimeAbs") != NULL; } } /** * arv_camera_is_exposure_auto_available: * @camera: a #ArvCamera * * Returns: %TRUE if Exposure Auto feature is available. * * Since: 0.2.0 */ gboolean arv_camera_is_exposure_auto_available (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), FALSE); return arv_device_get_feature (camera->priv->device, "ExposureAuto") != NULL; } /** * arv_camera_is_gain_available: * @camera: a #ArvCamera * * Returns: %TRUE if Gain feature is available. * * Since: 0.2.0 */ gboolean arv_camera_is_gain_available (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), FALSE); if (camera->priv->has_gain) return arv_device_get_feature (camera->priv->device, "Gain") != NULL; return arv_device_get_feature (camera->priv->device, "GainRaw") != NULL; } /** * arv_camera_is_gain_auto_available: * @camera: a #ArvCamera * * Returns: %TRUE if Gain feature is available. * * Since: 0.2.0 */ gboolean arv_camera_is_gain_auto_available (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), FALSE); return arv_device_get_feature (camera->priv->device, "GainAuto") != NULL; } /** * arv_camera_is_binning_available: * @camera: a #ArvCamera * * Returns: %TRUE if Binning feature is available. * * Since: 0.6.0 */ gboolean arv_camera_is_binning_available (ArvCamera *camera) { ArvGcNode* node; g_return_val_if_fail (ARV_IS_CAMERA (camera), FALSE); node = arv_device_get_feature (camera->priv->device, "BinningHorizontal"); if (!ARV_IS_GC_FEATURE_NODE (node)) return FALSE; if (!arv_gc_feature_node_is_available (ARV_GC_FEATURE_NODE (node), NULL)) return FALSE; node = arv_device_get_feature (camera->priv->device, "BinningVertical"); if (!ARV_IS_GC_FEATURE_NODE (node)) return FALSE; if (!arv_gc_feature_node_is_available (ARV_GC_FEATURE_NODE (node), NULL)) return FALSE; return TRUE; } /** * arv_camera_is_gv_device: * @camera: a #ArvCamera * * Returns: %TRUE if @camera is a GigEVision device. * * Since: 0.4.0 */ gboolean arv_camera_is_gv_device (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), FALSE); return ARV_IS_GV_DEVICE (camera->priv->device); } /** * arv_camera_gv_get_n_stream_channels: * @camera: a #ArvCamera * * Returns: the number of supported stream channels. * * Since: 0.4.0 */ gint arv_camera_gv_get_n_stream_channels (ArvCamera *camera) { g_return_val_if_fail (arv_camera_is_gv_device (camera), 0); return arv_device_get_integer_feature_value (camera->priv->device, "GevStreamChannelCount"); } /** * arv_camera_gv_select_stream_channel: * @camera: a #ArvCamera * @channel_id: id of the channel to select * * Select the current stream channel. * * Since: 0.4.0 */ void arv_camera_gv_select_stream_channel (ArvCamera *camera, gint channel_id) { if (channel_id < 0) return; g_return_if_fail (arv_camera_is_gv_device (camera)); arv_device_set_integer_feature_value (camera->priv->device, "GevStreamChannelSelector", channel_id); } /** * arv_camera_gv_get_current_stream_channel: * @camera: a #ArvCamera * * Returns: The current stream channel id. * * Since: 0.4.0 */ int arv_camera_gv_get_current_stream_channel (ArvCamera *camera) { g_return_val_if_fail (arv_camera_is_gv_device (camera), 0); return arv_device_get_integer_feature_value (camera->priv->device, "GevStreamChannelSelector"); } /** * arv_camera_gv_set_packet_delay: * @camera: a #ArvCamera * @delay_ns: inter packet delay, in nanoseconds * * Configure the inter packet delay to insert between each packet for the current stream * channel. This can be used as a crude flow-control mechanism if the application or the network * infrastructure cannot keep up with the packets coming from the device. * * Since: 0.4.0 */ void arv_camera_gv_set_packet_delay (ArvCamera *camera, gint64 delay_ns) { gint64 tick_frequency; gint64 value; if (delay_ns < 0) return; g_return_if_fail (arv_camera_is_gv_device (camera)); tick_frequency = arv_device_get_integer_feature_value (camera->priv->device, "GevTimestampTickFrequency"); if (tick_frequency <= 0) return; value = tick_frequency * delay_ns / 1000000000LL; arv_device_set_integer_feature_value (camera->priv->device, "GevSCPD", value); } /** * arv_camera_gv_get_packet_delay: * @camera: a #ArvCamera * * Returns: The inter packet delay, in nanoseconds. * * Since: 0.4.0 */ gint64 arv_camera_gv_get_packet_delay (ArvCamera *camera) { gint64 tick_frequency; gint64 value; g_return_val_if_fail (arv_camera_is_gv_device (camera), 0); tick_frequency = arv_device_get_integer_feature_value (camera->priv->device, "GevTimestampTickFrequency"); if (tick_frequency <= 0) return 0; value = arv_device_get_integer_feature_value (camera->priv->device, "GevSCPD"); return value * 1000000000LL / tick_frequency; } /** * arv_camera_gv_set_packet_size: * @camera: a #ArvCamera * @packet_size: packet size, in bytes * * Specifies the stream packet size, in bytes, to send on the selected channel for a GVSP transmitter * or specifies the maximum packet size supported by a GVSP receiver. * * This does not include data leader and data trailer and the last data packet which might be of * smaller size (since packet size is not necessarily a multiple of block size for stream channel). * * Since: 0.4.0 */ void arv_camera_gv_set_packet_size (ArvCamera *camera, gint packet_size) { if (packet_size <= 0) return; g_return_if_fail (arv_camera_is_gv_device (camera)); arv_gv_device_set_packet_size (ARV_GV_DEVICE (camera->priv->device), packet_size); } /** * arv_camera_gv_get_packet_size: * @camera: a #ArvCamera * * Returns: The stream packet size, in bytes. * * Since: 0.4.0 */ guint arv_camera_gv_get_packet_size (ArvCamera *camera) { g_return_val_if_fail (arv_camera_is_gv_device (camera), 0); return arv_gv_device_get_packet_size (ARV_GV_DEVICE (camera->priv->device)); } /** * arv_camera_gv_auto_packet_size: * @camera: a #ArvCamera * * Automatically determine the biggest packet size that can be used data * streaming, and set GevSCPSPacketSize value accordingly. This function relies * on the GevSCPSFireTestPacket feature. If this feature is not available, the * packet size will be set to a default value (1500 bytes). * * Returns: The packet size, in bytes. * * Since: 0.6.0 */ guint arv_camera_gv_auto_packet_size (ArvCamera *camera) { g_return_val_if_fail (arv_camera_is_gv_device (camera), 0); return arv_gv_device_auto_packet_size (ARV_GV_DEVICE (camera->priv->device)); } /** * arv_camera_gv_set_stream_options: * @camera: a #ArvCamera * @options: option for stream creation * * Sets the options used during stream object creation. These options mus be * set before the call to arv_camera_create_stream(). * * Since: 0.6.0 */ void arv_camera_gv_set_stream_options (ArvCamera *camera, ArvGvStreamOption options) { g_return_if_fail (arv_camera_is_gv_device (camera)); arv_gv_device_set_stream_options (ARV_GV_DEVICE (camera->priv->device), options); } /** * arv_camera_is_uv_device: * @camera: a #ArvCamera * * Returns: %TRUE if @camera is a USB3Vision device. * * Since: 0.6.0 */ gboolean arv_camera_is_uv_device (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), FALSE); #ifdef ARAVIS_BUILD_USB return ARV_IS_UV_DEVICE (camera->priv->device); #else return FALSE; #endif } /** * arv_camera_uv_is_bandwidth_control_available: * @camera: a #ArvCamera * * Returns: wether bandwidth limits are available on this camera * * Since: 0.6.0 */ gboolean arv_camera_uv_is_bandwidth_control_available (ArvCamera *camera) { g_return_val_if_fail (arv_camera_is_uv_device (camera), FALSE); switch (camera->priv->vendor) { case ARV_CAMERA_VENDOR_XIMEA: return arv_device_get_feature(camera->priv->device, "DeviceLinkThroughputLimit") != NULL; default: return FALSE; } } /** * arv_camera_uv_set_bandwidth: * @camera: a #ArvCamera * @bandwidth: Desired bandwith limit in megabits/sec. Set to 0 to disable limit mode. * * Since: 0.6.0 */ void arv_camera_uv_set_bandwidth (ArvCamera *camera, guint bandwidth) { g_return_if_fail (arv_camera_is_uv_device (camera)); if (bandwidth > 0) { arv_device_set_integer_feature_value (camera->priv->device, "DeviceLinkThroughputLimit", bandwidth); arv_device_set_integer_feature_value (camera->priv->device, "DeviceLinkThroughputLimitMode", 1); } else { arv_device_set_integer_feature_value (camera->priv->device, "DeviceLinkThroughputLimitMode", 0); } } /** * arv_camera_uv_get_bandwidth: * @camera: a #ArvCamera * * Returns: the current bandwidth limit * * Since: 0.6.0 */ guint arv_camera_uv_get_bandwidth (ArvCamera *camera) { g_return_val_if_fail (arv_camera_is_uv_device (camera), 0); return arv_device_get_integer_feature_value (camera->priv->device, "DeviceLinkThroughputLimit"); } /** * arv_camera_uv_get_bandwidth_bounds: * @camera: a #ArvCamera * @min: (out): minimum bandwidth * @max: (out): maximum bandwidth * * Since: 0.6.0 */ void arv_camera_uv_get_bandwidth_bounds (ArvCamera *camera, guint *min, guint *max) { gint64 min64, max64; g_return_if_fail (arv_camera_is_uv_device (camera)); arv_device_get_integer_feature_bounds (camera->priv->device, "DeviceLinkThroughputLimit", &min64, &max64); if (min != NULL) *min = min64; if (max != NULL) *max = max64; } /** * arv_camera_set_chunk_mode: * @camera: a #ArvCamera * @is_active: wether to enable chunk data mode * * Controls wether chunk data mode is active. When active, chunk data * are appended to image data in #ArvBuffer. A #ArvChunkParser must be used in * order to extract chunk data. * * Since: 0.4.0 **/ void arv_camera_set_chunk_mode (ArvCamera *camera, gboolean is_active) { g_return_if_fail (ARV_IS_CAMERA (camera)); arv_device_set_integer_feature_value (camera->priv->device, "ChunkModeActive", is_active ? 1 : 0); } /** * arv_camera_get_chunk_mode: * @camera: a #ArvCamera * * Check wether chunk data mode is active. Please see arv_camera_set_chunk_mode(). * * Returns: %TRUE if chunk data mode is active. * * Since: 0.4.0 **/ gboolean arv_camera_get_chunk_mode (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), FALSE); return arv_device_get_integer_feature_value (camera->priv->device, "ChunkModeActive"); } /** * arv_camera_set_chunk_state: * @camera: a #ArvCamera * @chunk: chunk data name * @is_enabled: wether to enable this chunk * * Sets state of a chunk data. Chunk data are be embedded in #ArvBuffer only * if chunk mode is active. Please see arv_camera_set_chunk_mode(). * * Since: 0.4.0 **/ void arv_camera_set_chunk_state (ArvCamera *camera, const char *chunk, gboolean is_enabled) { g_return_if_fail (ARV_IS_CAMERA (camera)); g_return_if_fail (chunk != NULL && chunk[0] != '\0'); arv_device_set_string_feature_value (camera->priv->device, "ChunkSelector", chunk); arv_device_set_integer_feature_value (camera->priv->device, "ChunkEnable", is_enabled ? 1 : 0); } /** * arv_camera_get_chunk_state: * @camera: a #ArvCamera * @chunk: chunk data name * * Gets state of chunk data. Chunk data are be embedded in #ArvBuffer only * if chunk mode is active. Please see arv_camera_set_chunk_mode(). * * Returns: %TRUE if @chunk is enabled. * * Since: 0.4.0 */ gboolean arv_camera_get_chunk_state (ArvCamera *camera, const char *chunk) { g_return_val_if_fail (ARV_IS_CAMERA (camera), FALSE); g_return_val_if_fail (chunk != NULL && chunk[0] != '\0', FALSE); arv_device_set_string_feature_value (camera->priv->device, "ChunkSelector", chunk); return arv_device_get_integer_feature_value (camera->priv->device, "ChunkEnable"); } /** * arv_camera_set_chunks: * @camera: a #ArvCamera * @chunk_list: chunk data names, as a comma or space separated list * * Convenience function for enabling a set of chunk data. Chunk mode is activated, or deactivated * if @chunk_list is %NULL or empty. All chunk data not listed are disabled. * * Since: 0.4.0 */ void arv_camera_set_chunks (ArvCamera *camera, const char *chunk_list) { const char **available_chunks; char **chunks; char *striped_chunk_list; gboolean enable_chunk_data = FALSE; guint i; guint n_values; g_return_if_fail (ARV_IS_CAMERA (camera)); if (chunk_list == NULL) { arv_camera_set_chunk_mode (camera, FALSE); return; } available_chunks = arv_device_get_available_enumeration_feature_values_as_strings (camera->priv->device, "ChunkSelector", &n_values); for (i = 0; i < n_values; i++) { arv_camera_set_chunk_state (camera, available_chunks[i], FALSE); } g_free (available_chunks); striped_chunk_list = g_strdup (chunk_list); arv_str_strip (striped_chunk_list, " ,:;", ','); chunks = g_strsplit_set (striped_chunk_list, " ,:;", -1); g_free (striped_chunk_list); for (i = 0; chunks[i] != NULL; i++) { arv_camera_set_chunk_state (camera, chunks[i], TRUE); enable_chunk_data = TRUE; } g_strfreev (chunks); arv_camera_set_chunk_mode (camera, enable_chunk_data); } /** * arv_camera_create_chunk_parser: * @camera: a #ArvCamera * * Creates a new #ArvChunkParser object, used for the extraction of chunk data from #ArvBuffer. * * Returns: (transfer full): a new #ArvChunkParser. * * Since: 0.4.0 */ ArvChunkParser * arv_camera_create_chunk_parser (ArvCamera *camera) { g_return_val_if_fail (ARV_IS_CAMERA (camera), NULL); return arv_device_create_chunk_parser (camera->priv->device); } /** * arv_camera_new: * @name: (allow-none): name of the camera. * * Creates a new #ArvCamera. If @name is null, it will instantiate the * first available camera. * * Returns: a new #ArvCamera. * * Since: 0.2.0 */ ArvCamera * arv_camera_new (const char *name) { ArvCamera *camera; ArvDevice *device; device = arv_open_device (name); if (!ARV_IS_DEVICE (device)) return NULL; camera = g_object_new (ARV_TYPE_CAMERA, "device", device, NULL); /* if you need to apply or test for fixups based on the camera model please do so in arv_camera_constructor and not here, as this breaks objects created with g_object_new, which includes but is not limited to introspection users */ return camera; } static void arv_camera_init (ArvCamera *camera) { camera->priv = G_TYPE_INSTANCE_GET_PRIVATE (camera, ARV_TYPE_CAMERA, ArvCameraPrivate); } static void arv_camera_finalize (GObject *object) { ArvCamera *camera = ARV_CAMERA (object); g_object_unref (camera->priv->device); parent_class->finalize (object); } static GObject * arv_camera_constructor (GType gtype, guint n_properties, GObjectConstructParam *properties) { GObject *object; ArvCamera *camera; ArvCameraVendor vendor; ArvCameraSeries series; const char *vendor_name; const char *model_name; /* always call parent constructor */ object = parent_class->constructor(gtype, n_properties, properties); camera = ARV_CAMERA (object); if (!camera->priv->device) camera->priv->device = arv_open_device (NULL); if (!ARV_IS_DEVICE (camera->priv->device)) return NULL; camera->priv->genicam = arv_device_get_genicam (camera->priv->device); vendor_name = arv_camera_get_vendor_name (camera); model_name = arv_camera_get_model_name (camera); if (g_strcmp0 (vendor_name, "Basler") == 0) { vendor = ARV_CAMERA_VENDOR_BASLER; if (g_str_has_prefix (model_name, "acA")) series = ARV_CAMERA_SERIES_BASLER_ACE; else if (g_str_has_prefix (model_name, "scA")) series = ARV_CAMERA_SERIES_BASLER_SCOUT; else series = ARV_CAMERA_SERIES_BASLER_OTHER; } else if (g_strcmp0 (vendor_name, "Prosilica") == 0) { vendor = ARV_CAMERA_VENDOR_PROSILICA; series = ARV_CAMERA_SERIES_PROSILICA; } else if (g_strcmp0 (vendor_name, "The Imaging Source Europe GmbH") == 0) { vendor = ARV_CAMERA_VENDOR_TIS; series = ARV_CAMERA_SERIES_TIS; } else if (g_strcmp0 (vendor_name, "DALSA") == 0) { vendor = ARV_CAMERA_VENDOR_DALSA; series = ARV_CAMERA_SERIES_DALSA; } else if (g_strcmp0 (vendor_name, "Point Grey Research") == 0 || g_strcmp0 (vendor_name, "FLIR") == 0) { vendor = ARV_CAMERA_VENDOR_POINT_GREY_FLIR; series = ARV_CAMERA_SERIES_POINT_GREY_FLIR; } else if (g_strcmp0 (vendor_name, "Ricoh Company, Ltd.") == 0) { vendor = ARV_CAMERA_VENDOR_RICOH; series = ARV_CAMERA_SERIES_RICOH; } else if (g_strcmp0 (vendor_name, "XIMEA GmbH") == 0) { vendor = ARV_CAMERA_VENDOR_XIMEA; series = ARV_CAMERA_SERIES_XIMEA; } else if (g_strcmp0 (vendor_name, "MATRIX VISION GmbH") == 0) { vendor = ARV_CAMERA_VENDOR_MATRIX_VISION; series = ARV_CAMERA_SERIES_MATRIX_VISION; } else { vendor = ARV_CAMERA_VENDOR_UNKNOWN; series = ARV_CAMERA_SERIES_UNKNOWN; } camera->priv->vendor = vendor; camera->priv->series = series; camera->priv->has_gain = ARV_IS_GC_FLOAT (arv_device_get_feature (camera->priv->device, "Gain")); camera->priv->has_exposure_time = ARV_IS_GC_FLOAT (arv_device_get_feature (camera->priv->device, "ExposureTime")); camera->priv->has_acquisition_frame_rate = ARV_IS_GC_FLOAT (arv_device_get_feature (camera->priv->device, "AcquisitionFrameRate")); camera->priv->has_acquisition_frame_rate_enabled = ARV_IS_GC_INTEGER (arv_device_get_feature (camera->priv->device, "AcquisitionFrameRateEnabled")); return object; } static void arv_camera_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { ArvCamera *camera = ARV_CAMERA (object); switch (prop_id) { case PROP_CAMERA_DEVICE: camera->priv->device = g_value_get_object (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void arv_camera_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { ArvCamera *camera = ARV_CAMERA (object); switch (prop_id) { case PROP_CAMERA_DEVICE: g_value_set_object (value, camera->priv->device); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void arv_camera_class_init (ArvCameraClass *camera_class) { GObjectClass *object_class = G_OBJECT_CLASS (camera_class); g_type_class_add_private (camera_class, sizeof (ArvCameraPrivate)); parent_class = g_type_class_peek_parent (camera_class); object_class->finalize = arv_camera_finalize; object_class->constructor = arv_camera_constructor; object_class->set_property = arv_camera_set_property; object_class->get_property = arv_camera_get_property; g_object_class_install_property (object_class, PROP_CAMERA_DEVICE, g_param_spec_object ("device", "device", "the device associated with this camera", ARV_TYPE_DEVICE, G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); } G_DEFINE_TYPE (ArvCamera, arv_camera, G_TYPE_OBJECT) aravis-ARAVIS_0_6_0/src/arvcamera.h000066400000000000000000000200221334570641500171160ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_CAMERA_H #define ARV_CAMERA_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS #define ARV_TYPE_CAMERA (arv_camera_get_type ()) #define ARV_CAMERA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_CAMERA, ArvCamera)) #define ARV_CAMERA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_CAMERA, ArvCameraClass)) #define ARV_IS_CAMERA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_CAMERA)) #define ARV_IS_CAMERA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_CAMERA)) #define ARV_CAMERA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_CAMERA, ArvCameraClass)) typedef struct _ArvCameraPrivate ArvCameraPrivate; typedef struct _ArvCameraClass ArvCameraClass; struct _ArvCamera { GObject object; ArvCameraPrivate *priv; }; struct _ArvCameraClass { GObjectClass parent_class; }; GType arv_camera_get_type (void); ArvCamera * arv_camera_new (const char *name); ArvDevice * arv_camera_get_device (ArvCamera *camera); ArvStream * arv_camera_create_stream (ArvCamera *camera, ArvStreamCallback callback, void *user_data); /* Device control */ const char * arv_camera_get_vendor_name (ArvCamera *camera); const char * arv_camera_get_model_name (ArvCamera *camera); const char * arv_camera_get_device_id (ArvCamera *camera); /* Image format control */ void arv_camera_get_sensor_size (ArvCamera *camera, gint *width, gint *height); void arv_camera_set_region (ArvCamera *camera, gint x, gint y, gint width, gint height); void arv_camera_get_region (ArvCamera *camera, gint *x, gint *y, gint *width, gint *height); void arv_camera_get_x_offset_bounds (ArvCamera *camera, gint *min, gint *max); void arv_camera_get_y_offset_bounds (ArvCamera *camera, gint *min, gint *max); void arv_camera_get_width_bounds (ArvCamera *camera, gint *min, gint *max); void arv_camera_get_height_bounds (ArvCamera *camera, gint *min, gint *max); void arv_camera_set_binning (ArvCamera *camera, gint dx, gint dy); void arv_camera_get_binning (ArvCamera *camera, gint *dx, gint *dy); void arv_camera_get_x_binning_bounds (ArvCamera *camera, gint *min, gint *max); void arv_camera_get_y_binning_bounds (ArvCamera *camera, gint *min, gint *max); gboolean arv_camera_is_binning_available (ArvCamera *camera); void arv_camera_set_pixel_format (ArvCamera *camera, ArvPixelFormat format); void arv_camera_set_pixel_format_from_string (ArvCamera *camera, const char * format); ArvPixelFormat arv_camera_get_pixel_format (ArvCamera *camera); const char * arv_camera_get_pixel_format_as_string (ArvCamera *camera); gint64 * arv_camera_get_available_pixel_formats (ArvCamera *camera, guint *n_pixel_formats); const char ** arv_camera_get_available_pixel_formats_as_strings (ArvCamera *camera, guint *n_pixel_formats); const char ** arv_camera_get_available_pixel_formats_as_display_names (ArvCamera *camera, guint *n_pixel_formats); /* Acquisition control */ void arv_camera_start_acquisition (ArvCamera *camera); void arv_camera_stop_acquisition (ArvCamera *camera); void arv_camera_abort_acquisition (ArvCamera *camera); ArvBuffer * arv_camera_acquisition (ArvCamera *camera, guint64 timeout); void arv_camera_set_acquisition_mode (ArvCamera *camera, ArvAcquisitionMode value); ArvAcquisitionMode arv_camera_get_acquisition_mode (ArvCamera *camera); void arv_camera_set_frame_count (ArvCamera *camera, gint64 frame_count); gint64 arv_camera_get_frame_count (ArvCamera *camera); void arv_camera_get_frame_count_bounds (ArvCamera *camera, gint64 *min, gint64 *max); gboolean arv_camera_is_frame_rate_available (ArvCamera *camera); void arv_camera_set_frame_rate (ArvCamera *camera, double frame_rate); double arv_camera_get_frame_rate (ArvCamera *camera); void arv_camera_get_frame_rate_bounds (ArvCamera *camera, double *min, double *max); void arv_camera_set_trigger (ArvCamera *camera, const char *source); void arv_camera_set_trigger_source (ArvCamera *camera, const char *source); const char * arv_camera_get_trigger_source (ArvCamera *camera); const char ** arv_camera_get_available_trigger_sources(ArvCamera *camera, guint *n_sources); const char** arv_camera_get_available_triggers (ArvCamera *camera, guint *n_triggers); void arv_camera_clear_triggers (ArvCamera* camera); void arv_camera_software_trigger (ArvCamera *camera); gboolean arv_camera_is_exposure_time_available (ArvCamera *camera); gboolean arv_camera_is_exposure_auto_available (ArvCamera *camera); void arv_camera_set_exposure_time (ArvCamera *camera, double exposure_time_us); double arv_camera_get_exposure_time (ArvCamera *camera); void arv_camera_get_exposure_time_bounds (ArvCamera *camera, double *min, double *max); void arv_camera_set_exposure_time_auto (ArvCamera *camera, ArvAuto auto_mode); ArvAuto arv_camera_get_exposure_time_auto (ArvCamera *camera); /* Analog control */ gboolean arv_camera_is_gain_available (ArvCamera *camera); gboolean arv_camera_is_gain_auto_available (ArvCamera *camera); void arv_camera_set_gain (ArvCamera *camera, double gain); double arv_camera_get_gain (ArvCamera *camera); void arv_camera_get_gain_bounds (ArvCamera *camera, double *min, double *max); void arv_camera_set_gain_auto (ArvCamera *camera, ArvAuto auto_mode); ArvAuto arv_camera_get_gain_auto (ArvCamera *camera); /* Transport layer control */ guint arv_camera_get_payload (ArvCamera *camera); /* GigEVision specific API */ gboolean arv_camera_is_gv_device (ArvCamera *camera); gint arv_camera_gv_get_n_stream_channels (ArvCamera *camera); void arv_camera_gv_select_stream_channel (ArvCamera *camera, gint channel_id); int arv_camera_gv_get_current_stream_channel(ArvCamera *camera); void arv_camera_gv_set_packet_delay (ArvCamera *camera, gint64 delay_ns); gint64 arv_camera_gv_get_packet_delay (ArvCamera *camera); void arv_camera_gv_set_packet_size (ArvCamera *camera, gint packet_size); guint arv_camera_gv_get_packet_size (ArvCamera *camera); guint arv_camera_gv_auto_packet_size (ArvCamera *camera); void arv_camera_gv_set_stream_options (ArvCamera *camera, ArvGvStreamOption options); /* USB3Vision specific API */ gboolean arv_camera_is_uv_device (ArvCamera *camera); gboolean arv_camera_uv_is_bandwidth_control_available (ArvCamera *camera); void arv_camera_uv_set_bandwidth (ArvCamera *camera, guint bandwidth); guint arv_camera_uv_get_bandwidth (ArvCamera *camera); void arv_camera_uv_get_bandwidth_bounds (ArvCamera *camera, guint* min, guint* max); /* Chunk data */ void arv_camera_set_chunk_mode (ArvCamera *camera, gboolean is_active); gboolean arv_camera_get_chunk_mode (ArvCamera *camera); void arv_camera_set_chunk_state (ArvCamera *camera, const char *chunk, gboolean is_enabled); gboolean arv_camera_get_chunk_state (ArvCamera *camera, const char *chunk); void arv_camera_set_chunks (ArvCamera *camera, const char *chunk_list); ArvChunkParser * arv_camera_create_chunk_parser (ArvCamera *camera); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvchunkparser.c000066400000000000000000000172651334570641500202250ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2014 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvchunkparser * @short_description: Parser for extraction of chunk data from buffers * * #ArvChunkParser provides a class for the instantiation of chunk parsers used * for the extraction of chunk data stored in the stream payload. * * Chunks are tagged blocks of data stored in a #ArvBuffer containing * a #ARV_BUFFER_PAYLOAD_TYPE_CHUNK_DATA payload. The tags allow a chunk * parser to dissect the data payload into its elements and to identify the content. * * Chunk data are enabled using either arv_camera_set_chunks() or * arv_camera_set_chunk_mode(). Both functions are simple convenience wrappers * that handle the setting of ChunkModeActive, ChunkSelector and ChunkEnable * GENICAM features. * * Example use of the ArvChunkParser API * * * FIXME: MISSING XINCLUDE CONTENT * * * */ #include #include #include #include #include #include enum { ARV_CHUNK_PARSER_PROPERTY_0, ARV_CHUNK_PARSER_PROPERTY_GENICAM, ARV_CHUNK_PARSER_PROPERTY_LAST } ArvChunkParserProperties; static GObjectClass *parent_class = NULL; GQuark arv_chunk_parser_error_quark (void) { return g_quark_from_static_string ("arv-chunk-parser-error-quark"); } struct _ArvChunkParserPrivate { ArvGc *genicam; }; /** * arv_chunk_parser_get_string_value: * @parser: a #ArvChunkParser * @buffer: a #ArvBuffer with a #ARV_BUFFER_PAYLOAD_TYPE_CHUNK_DATA payload * @chunk: chunk data name * * Gets the value of chunk data as a string. * * Returns: the chunk data string value. */ const char * arv_chunk_parser_get_string_value (ArvChunkParser *parser, ArvBuffer *buffer, const char *chunk) { ArvGcNode *node; const char *string = NULL; g_return_val_if_fail (ARV_IS_CHUNK_PARSER (parser), NULL); g_return_val_if_fail (ARV_IS_BUFFER (buffer), NULL); node = arv_gc_get_node (parser->priv->genicam, chunk); arv_gc_set_buffer (parser->priv->genicam, buffer); if (ARV_IS_GC_STRING (node)) { GError *error = NULL; string = arv_gc_string_get_value (ARV_GC_STRING (node), NULL); if (error != NULL) { arv_warning_chunk ("%s", error->message); g_clear_error (&error); } } else arv_warning_device ("[ArvChunkParser::get_string_value] Node '%s' is not a string", chunk); return string; } /** * arv_chunk_parser_get_integer_value: * @parser: a #ArvChunkParser * @buffer: a #ArvBuffer with a #ARV_BUFFER_PAYLOAD_TYPE_CHUNK_DATA payload * @chunk: chunk data name * * Gets the value of chunk data as an integer. * * Returns: the chunk data integer value. */ gint64 arv_chunk_parser_get_integer_value (ArvChunkParser *parser, ArvBuffer *buffer, const char *chunk) { ArvGcNode *node; gint64 value = 0; g_return_val_if_fail (ARV_IS_CHUNK_PARSER (parser), 0.0); g_return_val_if_fail (ARV_IS_BUFFER (buffer), 0.0); node = arv_gc_get_node (parser->priv->genicam, chunk); arv_gc_set_buffer (parser->priv->genicam, buffer); if (ARV_IS_GC_INTEGER (node)) { GError *error = NULL; value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), &error); if (error != NULL) { arv_warning_chunk ("%s", error->message); g_clear_error (&error); } } else arv_warning_device ("[ArvChunkParser::get_integer_value] Node '%s' is not an integer", chunk); return value; } /** * arv_chunk_parser_get_float_value: * @parser: a #ArvChunkParser * @buffer: a #ArvBuffer with a #ARV_BUFFER_PAYLOAD_TYPE_CHUNK_DATA payload * @chunk: chunk data name * * Gets the value of chunk data as a float. * * Returns: the chunk data float value. */ double arv_chunk_parser_get_float_value (ArvChunkParser *parser, ArvBuffer *buffer, const char *chunk) { ArvGcNode *node; double value = 0.0; g_return_val_if_fail (ARV_IS_CHUNK_PARSER (parser), 0.0); g_return_val_if_fail (ARV_IS_BUFFER (buffer), 0.0); node = arv_gc_get_node (parser->priv->genicam, chunk); arv_gc_set_buffer (parser->priv->genicam, buffer); if (ARV_IS_GC_FLOAT (node)) { GError *error = NULL; value = arv_gc_float_get_value (ARV_GC_FLOAT (node), NULL); if (error != NULL) { arv_warning_chunk ("%s", error->message); g_clear_error (&error); } } else arv_warning_chunk ("[ArvChunkParser::get_float_value] Node '%s' is not a float", chunk); return value; } /** * arv_chunk_parser_new: * @xml: XML genicam data * @size: genicam data size, -1 if NULL terminated * * Creates a new chunk_parser. * * Returns: a new #ArvChunkParser object * * Since: 0.4.0 */ ArvChunkParser * arv_chunk_parser_new (const char *xml, gsize size) { ArvChunkParser *chunk_parser; ArvGc *genicam; genicam = arv_gc_new (NULL, xml, size); g_return_val_if_fail (ARV_IS_GC (genicam), NULL); chunk_parser = g_object_new (ARV_TYPE_CHUNK_PARSER, "genicam", genicam, NULL); g_object_unref (genicam); return chunk_parser; } static void _set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { ArvChunkParser *parser = ARV_CHUNK_PARSER (object); switch (prop_id) { case ARV_CHUNK_PARSER_PROPERTY_GENICAM: g_clear_object (&parser->priv->genicam); parser->priv->genicam = g_object_ref (g_value_get_object (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void _get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { ArvChunkParser *parser = ARV_CHUNK_PARSER (object); switch (prop_id) { case ARV_CHUNK_PARSER_PROPERTY_GENICAM: g_value_set_object (value, parser->priv->genicam); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void arv_chunk_parser_init (ArvChunkParser *chunk_parser) { chunk_parser->priv = G_TYPE_INSTANCE_GET_PRIVATE (chunk_parser, ARV_TYPE_CHUNK_PARSER, ArvChunkParserPrivate); } static void _finalize (GObject *object) { ArvChunkParser *chunk_parser = ARV_CHUNK_PARSER (object); g_clear_object (&chunk_parser->priv->genicam); parent_class->finalize (object); } static void arv_chunk_parser_class_init (ArvChunkParserClass *node_class) { GObjectClass *object_class = G_OBJECT_CLASS (node_class); g_type_class_add_private (node_class, sizeof (ArvChunkParserPrivate)); parent_class = g_type_class_peek_parent (node_class); object_class->finalize = _finalize; object_class->set_property = _set_property; object_class->get_property = _get_property; g_object_class_install_property ( object_class, ARV_CHUNK_PARSER_PROPERTY_GENICAM, g_param_spec_object ("genicam", "genicam", "Genicam instance", ARV_TYPE_GC, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY) ); } G_DEFINE_TYPE (ArvChunkParser, arv_chunk_parser, G_TYPE_OBJECT) aravis-ARAVIS_0_6_0/src/arvchunkparser.h000066400000000000000000000056711334570641500202300ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2014 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_CHUNK_PARSER_H #define ARV_CHUNK_PARSER_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS /** * ArvChunkParserStatus: * @ARV_CHUNK_PARSER_STATUS_UNKNOWN: unknown status * @ARV_CHUNK_PARSER_STATUS_SUCCESS: no error has occured * @ARV_CHUNK_PARSER_STATUS_BUFFER_NOT_FOUND: buffer not found * @ARV_CHUNK_PARSER_STATUS_CHUNK_NOT_FOUND: chunk not found */ typedef enum { /* < private> */ ARV_CHUNK_PARSER_STATUS_UNKNOWN = -1, ARV_CHUNK_PARSER_STATUS_SUCCESS = 0, ARV_CHUNK_PARSER_STATUS_BUFFER_NOT_FOUND, ARV_CHUNK_PARSER_STATUS_CHUNK_NOT_FOUND, ARV_CHUNK_PARSER_STATUS_INVALID_FEATURE_NAME } ArvChunkParserStatus; #define ARV_TYPE_CHUNK_PARSER (arv_chunk_parser_get_type ()) #define ARV_CHUNK_PARSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_CHUNK_PARSER, ArvChunkParser)) #define ARV_CHUNK_PARSER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_CHUNK_PARSER, ArvChunkParserClass)) #define ARV_IS_CHUNK_PARSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_CHUNK_PARSER)) #define ARV_IS_CHUNK_PARSER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_CHUNK_PARSER)) #define ARV_CHUNK_PARSER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_CHUNK_PARSER, ArvChunkParserClass)) typedef struct _ArvChunkParserPrivate ArvChunkParserPrivate; typedef struct _ArvChunkParserClass ArvChunkParserClass; struct _ArvChunkParser { GObject object; ArvChunkParserPrivate *priv; }; struct _ArvChunkParserClass { GObjectClass parent_class; }; GType arv_chunk_parser_get_type (void); ArvChunkParser * arv_chunk_parser_new (const char *xml, gsize size); const char * arv_chunk_parser_get_string_value (ArvChunkParser *parser, ArvBuffer *buffer, const char *chunk); gint64 arv_chunk_parser_get_integer_value (ArvChunkParser *parser, ArvBuffer *buffer, const char *chunk); double arv_chunk_parser_get_float_value (ArvChunkParser *parser, ArvBuffer *buffer, const char *chunk); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvchunkparserprivate.h000066400000000000000000000023361334570641500216160ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2014 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_CHUNK_PARSER_PRIVATE_H #define ARV_CHUNK_PARSER_PRIVATE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS #define ARV_CHUNK_PARSER_ERROR arv_chunk_parser_error_quark() GQuark arv_chunk_parser_error_quark (void); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvdebug.c000066400000000000000000000124021334570641500167520ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvdebug * @short_description: Debugging tools */ #include #include #include ArvDebugCategory arv_debug_category_interface = { .name = "interface", .level = -1 }; ArvDebugCategory arv_debug_category_device = { .name = "device", .level = -1 }; ArvDebugCategory arv_debug_category_chunk = { .name = "chunk", .level = -1 }; ArvDebugCategory arv_debug_category_stream = { .name = "stream", .level = -1 }; ArvDebugCategory arv_debug_category_stream_thread = { .name = "stream-thread", .level = -1 }; ArvDebugCategory arv_debug_category_cp = { .name = "cp", .level = -1 }; ArvDebugCategory arv_debug_category_sp = { .name = "sp", .level = -1 }; ArvDebugCategory arv_debug_category_genicam = { .name = "genicam", .level = -1 }; ArvDebugCategory arv_debug_category_evaluator = { .name = "evaluator", .level = -1 }; ArvDebugCategory arv_debug_category_misc = { .name = "misc", .level = -1 }; ArvDebugCategory arv_debug_category_viewer = { .name = "viewer", .level = -1 }; static GHashTable *arv_debug_categories = NULL; static void arv_debug_category_free (ArvDebugCategory *category) { if (category != NULL) { g_free (category->name); g_free (category); } } static void arv_debug_initialize (const char *debug_var) { if (arv_debug_categories != NULL) return; arv_debug_categories = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) arv_debug_category_free); if (debug_var != NULL) { char **categories; int i; categories = g_strsplit (debug_var, ",", -1); for (i = 0; categories[i] != NULL; i++) { ArvDebugCategory *category; char **infos; category = g_new0 (ArvDebugCategory, 1); infos = g_strsplit (categories[i], ":", -1); if (infos[0] != NULL) { category->name = g_strdup (infos[0]); if (infos[1] != NULL) category->level = atoi (infos[1]); else category->level = ARV_DEBUG_LEVEL_DEBUG; g_hash_table_insert (arv_debug_categories, category->name, category); } else g_free (category); g_strfreev (infos); } g_strfreev (categories); } } gboolean arv_debug_check (ArvDebugCategory *category, ArvDebugLevel level) { ArvDebugCategory *configured_category; if (category == NULL) return FALSE; if ((int) level <= (int) category->level) return TRUE; if ((int) category->level >= 0) return FALSE; arv_debug_initialize (g_getenv ("ARV_DEBUG")); configured_category = g_hash_table_lookup (arv_debug_categories, category->name); if (configured_category == NULL) configured_category = g_hash_table_lookup (arv_debug_categories, "all"); if (configured_category != NULL) category->level = configured_category->level; else category->level = 0; return (int) level <= (int) category->level; } static void arv_debug_with_level (ArvDebugCategory *category, ArvDebugLevel level, const char *format, va_list args) { if (!arv_debug_check (category, level)) return; g_vprintf (format, args); g_printf ("\n"); } void arv_warning (ArvDebugCategory *category, const char *format, ...) { va_list args; va_start (args, format); arv_debug_with_level (category, ARV_DEBUG_LEVEL_WARNING, format, args); va_end (args); } void arv_debug (ArvDebugCategory *category, const char *format, ...) { va_list args; va_start (args, format); arv_debug_with_level (category, ARV_DEBUG_LEVEL_DEBUG, format, args); va_end (args); } void arv_log (ArvDebugCategory *category, const char *format, ...) { va_list args; va_start (args, format); arv_debug_with_level (category, ARV_DEBUG_LEVEL_LOG, format, args); va_end (args); } /** * arv_debug_enable: * @category_selection: debug category configuration string * * Configures the debug output using a configuration string consisting of a comma separated list of debug categories or category/debug level pair. This function overwrites the configuration done by ARV_DEBUG environment variable. * For example, enabling debug level 3 of the gvcp category and default debug level of category genicam is done using: * * * arv_debug_enable ("gvcp:3,genicam"); * */ void arv_debug_enable (const char *category_selection) { arv_debug_initialize (category_selection); } void arv_debug_shutdown (void) { GHashTable *debug_categories = arv_debug_categories; arv_debug_categories = NULL; if (debug_categories != NULL) g_hash_table_unref (debug_categories); } aravis-ARAVIS_0_6_0/src/arvdebug.h000066400000000000000000000123521334570641500167630ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2011 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_DEBUG_H #define ARV_DEBUG_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef enum { ARV_DEBUG_LEVEL_NONE, ARV_DEBUG_LEVEL_WARNING, ARV_DEBUG_LEVEL_DEBUG, ARV_DEBUG_LEVEL_LOG, ARV_DEBUG_LEVEL_COUNT } ArvDebugLevel; typedef struct { char *name; ArvDebugLevel level; } ArvDebugCategory; extern ArvDebugCategory arv_debug_category_dom; extern ArvDebugCategory arv_debug_category_interface; extern ArvDebugCategory arv_debug_category_device; extern ArvDebugCategory arv_debug_category_chunk; extern ArvDebugCategory arv_debug_category_stream; extern ArvDebugCategory arv_debug_category_stream_thread; extern ArvDebugCategory arv_debug_category_cp; extern ArvDebugCategory arv_debug_category_sp; extern ArvDebugCategory arv_debug_category_genicam; extern ArvDebugCategory arv_debug_category_evaluator; extern ArvDebugCategory arv_debug_category_misc; extern ArvDebugCategory arv_debug_category_viewer; #define arv_debug_dom(...) arv_debug (&arv_debug_category_interface, __VA_ARGS__) #define arv_log_dom(...) arv_log (&arv_debug_category_interface, __VA_ARGS__) #define arv_warning_dom(...) arv_warning (&arv_debug_category_interface, __VA_ARGS__) #define arv_debug_interface(...) arv_debug (&arv_debug_category_interface, __VA_ARGS__) #define arv_log_interface(...) arv_log (&arv_debug_category_interface, __VA_ARGS__) #define arv_warning_interface(...) arv_warning (&arv_debug_category_interface, __VA_ARGS__) #define arv_debug_device(...) arv_debug (&arv_debug_category_device, __VA_ARGS__) #define arv_log_device(...) arv_log (&arv_debug_category_device, __VA_ARGS__) #define arv_warning_device(...) arv_warning (&arv_debug_category_device, __VA_ARGS__) #define arv_debug_chunk(...) arv_debug (&arv_debug_category_chunk, __VA_ARGS__) #define arv_log_chunk(...) arv_log (&arv_debug_category_chunk, __VA_ARGS__) #define arv_warning_chunk(...) arv_warning (&arv_debug_category_chunk, __VA_ARGS__) #define arv_debug_stream(...) arv_debug (&arv_debug_category_stream, __VA_ARGS__) #define arv_log_stream(...) arv_log (&arv_debug_category_stream, __VA_ARGS__) #define arv_warning_stream(...) arv_warning (&arv_debug_category_stream, __VA_ARGS__) #define arv_debug_stream_thread(...) arv_debug (&arv_debug_category_stream_thread, __VA_ARGS__) #define arv_log_stream_thread(...) arv_log (&arv_debug_category_stream_thread, __VA_ARGS__) #define arv_warning_stream_thread(...) arv_warning (&arv_debug_category_stream_thread, __VA_ARGS__) #define arv_debug_cp(...) arv_debug (&arv_debug_category_cp, __VA_ARGS__) #define arv_log_cp(...) arv_log (&arv_debug_category_cp, __VA_ARGS__) #define arv_warning_cp(...) arv_warning (&arv_debug_category_cp, __VA_ARGS__) #define arv_debug_sp(...) arv_debug (&arv_debug_category_sp, __VA_ARGS__) #define arv_log_sp(...) arv_log (&arv_debug_category_sp, __VA_ARGS__) #define arv_warning_sp(...) arv_warning (&arv_debug_category_sp, __VA_ARGS__) #define arv_debug_genicam(...) arv_debug (&arv_debug_category_genicam, __VA_ARGS__) #define arv_log_genicam(...) arv_log (&arv_debug_category_genicam, __VA_ARGS__) #define arv_warning_genicam(...) arv_warning (&arv_debug_category_genicam, __VA_ARGS__) #define arv_debug_evaluator(...) arv_debug (&arv_debug_category_evaluator, __VA_ARGS__) #define arv_log_evaluator(...) arv_log (&arv_debug_category_evaluator, __VA_ARGS__) #define arv_warning_evaluator(...) arv_warning (&arv_debug_category_evaluator, __VA_ARGS__) #define arv_debug_misc(...) arv_debug (&arv_debug_category_misc, __VA_ARGS__) #define arv_log_misc(...) arv_log (&arv_debug_category_misc, __VA_ARGS__) #define arv_warning_misc(...) arv_warning (&arv_debug_category_misc, __VA_ARGS__) #define arv_debug_viewer(...) arv_debug (&arv_debug_category_viewer, __VA_ARGS__) #define arv_log_viewer(...) arv_log (&arv_debug_category_viewer, __VA_ARGS__) #define arv_warning_viewer(...) arv_warning (&arv_debug_category_viewer, __VA_ARGS__) void arv_warning (ArvDebugCategory *category, const char *format, ...); void arv_debug (ArvDebugCategory *category, const char *format, ...); void arv_log (ArvDebugCategory *category, const char *format, ...); gboolean arv_debug_check (ArvDebugCategory *category, ArvDebugLevel level); void arv_debug_enable (const char *category_selection); void arv_debug_shutdown (void); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvdevice.c000066400000000000000000000463301334570641500171320ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvdevice * @short_description: Abstract base class for device handling * * #ArvDevice is an abstract base class for the control of cameras. It provides * an easy access to the camera settings, and to its genicam interface for more * advanced uses. */ #include #include #include #include #include #include #include #include #include #include enum { ARV_DEVICE_SIGNAL_CONTROL_LOST, ARV_DEVICE_SIGNAL_LAST } ArvDeviceSignals; static guint arv_device_signals[ARV_DEVICE_SIGNAL_LAST] = {0}; static GObjectClass *parent_class = NULL; struct _ArvDevicePrivate { ArvDeviceStatus status; char *status_message; }; GQuark arv_device_error_quark (void) { return g_quark_from_static_string ("arv-device-error-quark"); } /** * arv_device_create_stream: * @device: a #ArvDevice * @callback: (scope call): a frame processing callback * @user_data: (allow-none) (closure): user data for @callback * * Creates a new #ArvStream for video stream handling. See * @ArvStreamCallback for details regarding the callback function. * * Return value: (transfer full): a new #ArvStream. * * Since: 0.2.0 */ ArvStream * arv_device_create_stream (ArvDevice *device, ArvStreamCallback callback, void *user_data) { g_return_val_if_fail (ARV_IS_DEVICE (device), NULL); return ARV_DEVICE_GET_CLASS (device)->create_stream (device, callback, user_data); } /** * arv_device_read_memory: * @device: a #ArvDevice * @address: memory address * @size: number of bytes to read * @buffer: a buffer for the storage of the read data * @error: (out) (allow-none): a #GError placeholder * * Reads @size bytes from the device memory. * * Return value: (skip): TRUE on success. * * Since: 0.2.0 **/ gboolean arv_device_read_memory (ArvDevice *device, guint64 address, guint32 size, void *buffer, GError **error) { g_return_val_if_fail (ARV_IS_DEVICE (device), FALSE); g_return_val_if_fail (buffer != NULL, FALSE); g_return_val_if_fail (size > 0, FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); return ARV_DEVICE_GET_CLASS (device)->read_memory (device, address, size, buffer, error); } /** * arv_device_write_memory: * @device: a #ArvDevice * @address: memory address * @size: size of the returned buffer * @buffer: (transfer full): the buffer read from memory * @error: (out) (allow-none): a #GError placeholder * * Writes @size bytes to the device memory. * * Return value: (skip): TRUE on success. * * Since: 0.2.0 **/ gboolean arv_device_write_memory (ArvDevice *device, guint64 address, guint32 size, void *buffer, GError **error) { g_return_val_if_fail (ARV_IS_DEVICE (device), FALSE); g_return_val_if_fail (buffer != NULL, FALSE); g_return_val_if_fail (size > 0, FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); return ARV_DEVICE_GET_CLASS (device)->write_memory (device, address, size, buffer, error); } /** * arv_device_read_register: * @device: a #ArvDevice * @address: register address * @value: (out): a placeholder for the read value * @error: (out) (allow-none): a #GError placeholder * * Reads the value of a device register. * * Return value: (skip): TRUE on success. * * Since: 0.2.0 **/ gboolean arv_device_read_register (ArvDevice *device, guint64 address, guint32 *value, GError **error) { g_return_val_if_fail (ARV_IS_DEVICE (device), FALSE); g_return_val_if_fail (value != NULL, FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); return ARV_DEVICE_GET_CLASS (device)->read_register (device, address, value, error); } /** * arv_device_write_register: * @device: a #ArvDevice * @address: the register address * @value: value to write * @error: (out) (allow-none): a #GError placeholder * * Writes @value to a device register. * * Return value: (skip): TRUE on success. * * Since: 0.2.0 **/ gboolean arv_device_write_register (ArvDevice *device, guint64 address, guint32 value, GError **error) { g_return_val_if_fail (ARV_IS_DEVICE (device), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); return ARV_DEVICE_GET_CLASS (device)->write_register (device, address, value, error); } /** * arv_device_get_genicam: * @device: a #ArvDevice * * Retrieves the genicam interface of the given device. * * Return value: (transfer none): the genicam interface. * * Since: 0.2.0 */ ArvGc * arv_device_get_genicam (ArvDevice *device) { g_return_val_if_fail (ARV_IS_DEVICE (device), NULL); return ARV_DEVICE_GET_CLASS (device)->get_genicam (device); } /** * arv_device_get_genicam_xml: * @device: a #ArvDevice * @size: (out) (allow-none): placeholder for the returned data size (bytes) // BUG: (skip) seems ignored * * Gets the Genicam XML data stored in the device memory. * * Returns: (transfer none): a pointer to the Genicam XML data, owned by the device. * * Since: 0.2.0 **/ const char * arv_device_get_genicam_xml (ArvDevice *device, size_t *size) { g_return_val_if_fail (ARV_IS_DEVICE (device), NULL); g_return_val_if_fail (size != NULL, NULL); if (ARV_DEVICE_GET_CLASS (device)->get_genicam_xml != NULL) return ARV_DEVICE_GET_CLASS (device)->get_genicam_xml (device, size); *size = 0; return NULL; } /** * arv_device_create_chunk_parser: * @device: a #ArvDevice * * Create a #ArvChunkParser object, to be used for chunk data extraction from #ArvBuffer. * * Returns: (transfer full): a new #ArvChunkParser object, NULL on error. * * Since: 0.4.0 **/ ArvChunkParser * arv_device_create_chunk_parser (ArvDevice *device) { const char *xml = NULL; gsize size = 0; g_return_val_if_fail (ARV_IS_DEVICE (device), NULL); xml = arv_device_get_genicam_xml (device, &size); return arv_chunk_parser_new (xml, size); } /** * arv_device_get_feature: * @device: a #ArvDevice * @feature: feature name * * Return value: (transfer none): the genicam node corresponding to the feature name, NULL if not found. * * Since: 0.2.0 */ ArvGcNode * arv_device_get_feature (ArvDevice *device, const char *feature) { ArvGc *genicam; genicam = arv_device_get_genicam (device); g_return_val_if_fail (ARV_IS_GC (genicam), NULL); return arv_gc_get_node (genicam, feature); } static void _set_status (ArvDevice *device, ArvDeviceStatus status, const char *message) { if (device->priv->status == ARV_DEVICE_STATUS_SUCCESS) return; arv_warning_device ("[ArvDevice::set_status] Status changed ('%s')", message); g_free (device->priv->status_message); device->priv->status = status; device->priv->status_message = g_strdup (message); } /** * arv_device_execute_command: * @device: a #ArvDevice * @feature: feature name * * Execute a genicam command. If an error occur, this function change the device status. * * Since: 0.2.0 */ void arv_device_execute_command (ArvDevice *device, const char *feature) { ArvGcNode *node; g_return_if_fail (ARV_IS_DEVICE (device)); node = arv_device_get_feature (device, feature); if (ARV_IS_GC_COMMAND (node)) { GError *error = NULL; arv_gc_command_execute (ARV_GC_COMMAND (node), &error); if (error != NULL) { _set_status (device, error->code, error->message); g_error_free (error); } } else arv_warning_device ("[ArvDevice::execute_command] Node '%s' is not a command", feature); } /** * arv_device_set_boolean_feature_value: * @device: a #ArvDevice * @feature: feature name * @value: feature value * * Set the value of a boolean feature. * If this operation fails, the device status returned by arv_device_get_status() will be changed. * * Since: 0.6.0 */ void arv_device_set_boolean_feature_value (ArvDevice *device, const char *feature, gboolean value) { ArvGcNode *node; GError *error = NULL; g_return_if_fail (ARV_IS_DEVICE (device)); node = arv_device_get_feature (device, feature); if (ARV_IS_GC_BOOLEAN (node)) arv_gc_boolean_set_value (ARV_GC_BOOLEAN (node), value, &error); else arv_warning_device ("[ArvDevice::set_boolean_feature_value] Node '%s' is not a boolean", feature); if (error != NULL) { _set_status (device, error->code, error->message); g_error_free (error); } } /** * arv_device_get_boolean_feature_value: * @device: a #ArvDevice * @feature: feature name * * Returns: the feature value. * * If this operation fails, the device status returned by arv_device_get_status() will be changed. * * Since: 0.6.0 */ gboolean arv_device_get_boolean_feature_value (ArvDevice *device, const char *feature) { ArvGcNode *node; GError *error = NULL; gboolean value = 0; g_return_val_if_fail (ARV_IS_DEVICE (device), 0); node = arv_device_get_feature (device, feature); if (ARV_IS_GC_BOOLEAN (node)) value = arv_gc_boolean_get_value (ARV_GC_BOOLEAN (node), &error); else arv_warning_device ("[ArvDevice::get_boolean_feature_value] Node '%s' is not an boolean", feature); if (error != NULL) { _set_status (device, error->code, error->message); g_error_free (error); return 0; } return value; } void arv_device_set_string_feature_value (ArvDevice *device, const char *feature, const char *value) { ArvGcNode *node; GError *error = NULL; g_return_if_fail (ARV_IS_DEVICE (device)); node = arv_device_get_feature (device, feature); if (ARV_IS_GC_STRING (node)) arv_gc_string_set_value (ARV_GC_STRING (node), value, &error); else arv_warning_device ("[ArvDevice::set_string_feature_value] Node '%s' is not a string", feature); if (error != NULL) { _set_status (device, error->code, error->message); g_error_free (error); } } const char * arv_device_get_string_feature_value (ArvDevice *device, const char *feature) { ArvGcNode *node; GError *error = NULL; const char *string = NULL; g_return_val_if_fail (ARV_IS_DEVICE (device), NULL); node = arv_device_get_feature (device, feature); if (ARV_IS_GC_STRING (node)) string = arv_gc_string_get_value (ARV_GC_STRING (node), &error); else { arv_warning_device ("[ArvDevice::get_string_feature_value] Node '%s' is not a string", feature); } if (error != NULL) { _set_status (device, error->code, error->message); g_error_free (error); return NULL; } return string; } void arv_device_set_integer_feature_value (ArvDevice *device, const char *feature, gint64 value) { ArvGcNode *node; GError *error = NULL; g_return_if_fail (ARV_IS_DEVICE (device)); node = arv_device_get_feature (device, feature); if (ARV_IS_GC_INTEGER (node)) arv_gc_integer_set_value (ARV_GC_INTEGER (node), value, &error); else arv_warning_device ("[ArvDevice::set_integer_feature_value] Node '%s' is not an integer", feature); if (error != NULL) { _set_status (device, error->code, error->message); g_error_free (error); } } gint64 arv_device_get_integer_feature_value (ArvDevice *device, const char *feature) { ArvGcNode *node; GError *error = NULL; gint64 value = 0; g_return_val_if_fail (ARV_IS_DEVICE (device), 0); node = arv_device_get_feature (device, feature); if (ARV_IS_GC_INTEGER (node)) value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), &error); else arv_warning_device ("[ArvDevice::get_integer_feature_value] Node '%s' is not an integer", feature); if (error != NULL) { _set_status (device, error->code, error->message); g_error_free (error); return 0; } return value; } /** * arv_device_get_integer_feature_bounds: * @device: a #ArvDevice * @feature: feature name * @min: (out): minimum feature value * @max: (out): maximum feature value * * Retrieves feature bounds. */ void arv_device_get_integer_feature_bounds (ArvDevice *device, const char *feature, gint64 *min, gint64 *max) { ArvGcNode *node; GError *error = NULL; if (min != NULL) *min = -G_MAXINT64; if (max != NULL) *max = G_MAXINT64; g_return_if_fail (ARV_IS_DEVICE (device)); node = arv_device_get_feature (device, feature); if (ARV_IS_GC_INTEGER (node)) { gint64 minimum; gint64 maximum; minimum = arv_gc_integer_get_min (ARV_GC_INTEGER (node), &error); if (error != NULL) { _set_status (device, error->code, error->message); g_error_free (error); return; } maximum = arv_gc_integer_get_max (ARV_GC_INTEGER (node), &error); if (error != NULL) { _set_status (device, error->code, error->message); g_error_free (error); return; } if (min != NULL) *min = minimum; if (max != NULL) *max = maximum; } else arv_warning_device ("[ArvDevice::get_integer_feature_bounds] Node '%s' is not an integer", feature); } void arv_device_set_float_feature_value (ArvDevice *device, const char *feature, double value) { ArvGcNode *node; GError *error = NULL; g_return_if_fail (ARV_IS_DEVICE (device)); node = arv_device_get_feature (device, feature); if (ARV_IS_GC_FLOAT (node)) arv_gc_float_set_value (ARV_GC_FLOAT (node), value, &error); else arv_warning_device ("[ArvDevice::set_float_feature_value] Node '%s' is not a float", feature); if (error != NULL) { _set_status (device, error->code, error->message); g_error_free (error); } } double arv_device_get_float_feature_value (ArvDevice *device, const char *feature) { ArvGcNode *node; GError *error = NULL; double value = 0.0; g_return_val_if_fail (ARV_IS_DEVICE (device), 0.0); node = arv_device_get_feature (device, feature); if (ARV_IS_GC_FLOAT (node)) value = arv_gc_float_get_value (ARV_GC_FLOAT (node), &error); else arv_warning_device ("[ArvDevice::get_float_feature_value] Node '%s' is not a float", feature); if (error != NULL) { _set_status (device, error->code, error->message); g_error_free (error); return 0.0; } return value; } /** * arv_device_get_float_feature_bounds: * @device: a #ArvDevice * @feature: feature name * @min: (out): minimum feature value * @max: (out): maximum feature value * * Retrieves feature bounds. */ void arv_device_get_float_feature_bounds (ArvDevice *device, const char *feature, double *min, double *max) { ArvGcNode *node; GError *error = NULL; if (min != NULL) *min = G_MINDOUBLE; if (max != NULL) *max = G_MAXDOUBLE; g_return_if_fail (ARV_IS_DEVICE (device)); node = arv_device_get_feature (device, feature); if (ARV_IS_GC_FLOAT (node)) { double minimum; double maximum; minimum = arv_gc_float_get_min (ARV_GC_FLOAT (node), &error); if (error != NULL) { _set_status (device, error->code, error->message); g_error_free (error); return; } maximum = arv_gc_float_get_max (ARV_GC_FLOAT (node), &error); if (error != NULL) { _set_status (device, error->code, error->message); g_error_free (error); return; } if (min != NULL) *min = minimum; if (max != NULL) *max = maximum; } else arv_warning_device ("[ArvDevice::get_float_feature_bounds] Node '%s' is not a float", feature); } gint64 * arv_device_get_available_enumeration_feature_values (ArvDevice *device, const char *feature, guint *n_values) { ArvGcNode *node; GError *error = NULL; gint64 *values = NULL; if (n_values != NULL) *n_values = 0; g_return_val_if_fail (ARV_IS_DEVICE (device), NULL); node = arv_device_get_feature (device, feature); if (ARV_IS_GC_ENUMERATION (node)) values = arv_gc_enumeration_get_available_int_values (ARV_GC_ENUMERATION (node), n_values, &error); else arv_warning_device ("[ArvDevice::get_enumeration_feature_available_values] Node '%s' is not an enumeration", feature); if (error != NULL) { _set_status (device, error->code, error->message); g_error_free (error); return NULL; } return values; } /** * arv_device_get_available_enumeration_feature_values_as_strings: * @device: an #ArvDevice * @feature: feature name * @n_values: placeholder for the number of returned values * * Get all the available values of @feature, as strings. * * Returns: (array length=n_values) (transfer container): a newly created array of const strings, which must freed after use using g_free. * * Since: 0.2.0 */ const char ** arv_device_get_available_enumeration_feature_values_as_strings (ArvDevice *device, const char *feature, guint *n_values) { ArvGcNode *node; GError *error = NULL; const char ** strings = NULL; if (n_values != NULL) *n_values = 0; g_return_val_if_fail (ARV_IS_DEVICE (device), NULL); node = arv_device_get_feature (device, feature); if (ARV_IS_GC_ENUMERATION (node)) strings = arv_gc_enumeration_get_available_string_values (ARV_GC_ENUMERATION (node), n_values, &error); else arv_warning_device ("[ArvDevice::get_enumeration_feature_available_strings] Node '%s' is not an enumeration", feature); if (error != NULL) { _set_status (device, error->code, error->message); g_error_free (error); return NULL; } return strings; } ArvDeviceStatus arv_device_get_status (ArvDevice *device) { ArvDeviceStatus status; g_return_val_if_fail (ARV_IS_DEVICE (device), ARV_DEVICE_STATUS_UNKNOWN); status = device->priv->status; g_free (device->priv->status_message); device->priv->status = ARV_DEVICE_STATUS_SUCCESS; device->priv->status_message = NULL; return status; } void arv_device_emit_control_lost_signal (ArvDevice *device) { g_return_if_fail (ARV_IS_DEVICE (device)); g_signal_emit (device, arv_device_signals[ARV_DEVICE_SIGNAL_CONTROL_LOST], 0); } static void arv_device_init (ArvDevice *device) { device->priv = G_TYPE_INSTANCE_GET_PRIVATE (device, ARV_TYPE_DEVICE, ArvDevicePrivate); device->priv->status = ARV_DEVICE_STATUS_SUCCESS; device->priv->status_message = NULL; } static void arv_device_finalize (GObject *object) { ArvDevice *device = ARV_DEVICE (object); g_free (device->priv->status_message); parent_class->finalize (object); } static void arv_device_class_init (ArvDeviceClass *device_class) { GObjectClass *object_class = G_OBJECT_CLASS (device_class); g_type_class_add_private (device_class, sizeof (ArvDevicePrivate)); parent_class = g_type_class_peek_parent (device_class); object_class->finalize = arv_device_finalize; /** * ArvDevice::control-lost: * @device:a #ArvDevice * * Signal that the control of the device is lost. * * This signal may be emited from a thread different than the main one, * so please take care to shared data access from the callback. * * Since: 0.2.0 */ arv_device_signals[ARV_DEVICE_SIGNAL_CONTROL_LOST] = g_signal_new ("control-lost", G_TYPE_FROM_CLASS (device_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (ArvDeviceClass, control_lost), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); } G_DEFINE_ABSTRACT_TYPE (ArvDevice, arv_device, G_TYPE_OBJECT) aravis-ARAVIS_0_6_0/src/arvdevice.h000066400000000000000000000126221334570641500171340ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_DEVICE_H #define ARV_DEVICE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS /** * ArvDeviceStatus: * @ARV_DEVICE_STATUS_UNKNOWN: unknown status * @ARV_DEVICE_STATUS_SUCCESS: no error has occured * @ARV_DEVICE_STATUS_TIMEOUT: action failed on a timeout * @ARV_DEVICE_STATUS_WRITE_ERROR: write on a read only node * @ARV_DEVICE_STATUS_TRANSFER_ERROR: error during data transfer * @ARV_DEVICE_STATUS_NOT_CONNECTED: device not connected */ typedef enum { ARV_DEVICE_STATUS_UNKNOWN = -1, ARV_DEVICE_STATUS_SUCCESS = 0, ARV_DEVICE_STATUS_TIMEOUT, ARV_DEVICE_STATUS_WRITE_ERROR, ARV_DEVICE_STATUS_TRANSFER_ERROR, ARV_DEVICE_STATUS_NOT_CONNECTED } ArvDeviceStatus; #define ARV_TYPE_DEVICE (arv_device_get_type ()) #define ARV_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_DEVICE, ArvDevice)) #define ARV_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_DEVICE, ArvDeviceClass)) #define ARV_IS_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_DEVICE)) #define ARV_IS_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_DEVICE)) #define ARV_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_DEVICE, ArvDeviceClass)) typedef struct _ArvDevicePrivate ArvDevicePrivate; typedef struct _ArvDeviceClass ArvDeviceClass; struct _ArvDevice { GObject object; ArvDevicePrivate *priv; }; struct _ArvDeviceClass { GObjectClass parent_class; ArvStream * (*create_stream) (ArvDevice *device, ArvStreamCallback callback, void *user_data); const char * (*get_genicam_xml) (ArvDevice *device, size_t *size); ArvGc * (*get_genicam) (ArvDevice *device); gboolean (*read_memory) (ArvDevice *device, guint64 address, guint32 size, void *buffer, GError **error); gboolean (*write_memory) (ArvDevice *device, guint64 address, guint32 size, void *buffer, GError **error); gboolean (*read_register) (ArvDevice *device, guint64 address, guint32 *value, GError **error); gboolean (*write_register) (ArvDevice *device, guint64 address, guint32 value, GError **error); /* signals */ void (*control_lost) (ArvDevice *device); }; GType arv_device_get_type (void); ArvStream * arv_device_create_stream (ArvDevice *device, ArvStreamCallback callback, void *user_data); gboolean arv_device_read_memory (ArvDevice *device, guint64 address, guint32 size, void *buffer, GError **error); gboolean arv_device_write_memory (ArvDevice *device, guint64 address, guint32 size, void *buffer, GError **error); gboolean arv_device_read_register (ArvDevice *device, guint64 address, guint32 *value, GError **error); gboolean arv_device_write_register (ArvDevice *device, guint64 address, guint32 value, GError **error); const char * arv_device_get_genicam_xml (ArvDevice *device, size_t *size); ArvGc * arv_device_get_genicam (ArvDevice *device); ArvGcNode * arv_device_get_feature (ArvDevice *device, const char *feature); ArvChunkParser *arv_device_create_chunk_parser (ArvDevice *device); /* This functions may change the device status */ void arv_device_execute_command (ArvDevice *device, const char *feature); void arv_device_set_boolean_feature_value (ArvDevice *device, const char *feature, gboolean value); gboolean arv_device_get_boolean_feature_value (ArvDevice *device, const char *feature); void arv_device_set_string_feature_value (ArvDevice *device, const char *feature, const char *value); const char * arv_device_get_string_feature_value (ArvDevice *device, const char *feature); void arv_device_set_integer_feature_value (ArvDevice *device, const char *feature, gint64 value); gint64 arv_device_get_integer_feature_value (ArvDevice *device, const char *feature); void arv_device_get_integer_feature_bounds (ArvDevice *device, const char *feature, gint64 *min, gint64 *max); void arv_device_set_float_feature_value (ArvDevice *device, const char *feature, double value); double arv_device_get_float_feature_value (ArvDevice *device, const char *feature); void arv_device_get_float_feature_bounds (ArvDevice *device, const char *feature, double *min, double *max); gint64 * arv_device_get_available_enumeration_feature_values (ArvDevice *device, const char *feature, guint *n_values); const char ** arv_device_get_available_enumeration_feature_values_as_strings (ArvDevice *device, const char *feature, guint *n_values); ArvDeviceStatus arv_device_get_status (ArvDevice *device); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvdeviceprivate.h000066400000000000000000000023741334570641500205320ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2014 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_DEVICE_PRIVATE_H #define ARV_DEVICE_PRIVATE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS #define ARV_DEVICE_ERROR arv_device_error_quark() GQuark arv_device_error_quark (void); void arv_device_emit_control_lost_signal (ArvDevice *device); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvdomcharacterdata.c000066400000000000000000000063221334570641500211560ustar00rootroot00000000000000/* Aravis * * Copyright © 2007-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ /** * SECTION:arvdomcharacterdata * @short_description: Base class for DOM character data nodes */ #include #include #include static GObjectClass *parent_class = NULL; /* ArvDomNode implementation */ static void arv_dom_character_data_write_to_stream (ArvDomNode *self, GOutputStream *stream, GError **error) { ArvDomCharacterData *character_data = ARV_DOM_CHARACTER_DATA (self); if (character_data->data != NULL) g_output_stream_write (stream, character_data->data, strlen (character_data->data), NULL, error); } static const char * arv_dom_character_data_get_node_value (ArvDomNode* self) { return arv_dom_character_data_get_data (ARV_DOM_CHARACTER_DATA (self)); } static void arv_dom_character_data_set_node_value (ArvDomNode* self, const char *value) { arv_dom_character_data_set_data (ARV_DOM_CHARACTER_DATA (self), value); } /* ArvDomCharacterData implementation */ const char * arv_dom_character_data_get_data (ArvDomCharacterData* self) { g_return_val_if_fail (ARV_IS_DOM_CHARACTER_DATA (self), NULL); return self->data; } void arv_dom_character_data_set_data (ArvDomCharacterData* self, const char * value) { g_return_if_fail (ARV_IS_DOM_CHARACTER_DATA (self)); g_return_if_fail (value != NULL); g_free (self->data); self->data = g_strdup (value); arv_log_dom ("[ArvDomCharacterData::set_data] Value = '%s'", value); arv_dom_node_changed (ARV_DOM_NODE (self)); } static void arv_dom_character_data_init (ArvDomCharacterData *character_data) { } static void arv_dom_character_data_finalize (GObject *object) { ArvDomCharacterData *self = ARV_DOM_CHARACTER_DATA (object); g_free (self->data); parent_class->finalize (object); } /* ArvDomCharacterData class */ static void arv_dom_character_data_class_init (ArvDomCharacterDataClass *character_data_class) { GObjectClass *object_class = G_OBJECT_CLASS (character_data_class); ArvDomNodeClass *node_class = ARV_DOM_NODE_CLASS (character_data_class); parent_class = g_type_class_peek_parent (character_data_class); object_class->finalize = arv_dom_character_data_finalize; node_class->write_to_stream = arv_dom_character_data_write_to_stream; node_class->set_node_value = arv_dom_character_data_set_node_value; node_class->get_node_value = arv_dom_character_data_get_node_value; } G_DEFINE_ABSTRACT_TYPE (ArvDomCharacterData, arv_dom_character_data, ARV_TYPE_DOM_NODE) aravis-ARAVIS_0_6_0/src/arvdomcharacterdata.h000066400000000000000000000042751334570641500211700ustar00rootroot00000000000000/* Aravis * * Copyright © 2007-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ #ifndef ARV_DOM_CHARACTER_DATA_H #define ARV_DOM_CHARACTER_DATA_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS #define ARV_TYPE_DOM_CHARACTER_DATA (arv_dom_character_data_get_type ()) #define ARV_DOM_CHARACTER_DATA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_DOM_CHARACTER_DATA, ArvDomCharacterData)) #define ARV_DOM_CHARACTER_DATA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_DOM_CHARACTER_DATA, ArvDomNodeClass)) #define ARV_IS_DOM_CHARACTER_DATA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_DOM_CHARACTER_DATA)) #define ARV_IS_DOM_CHARACTER_DATA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_DOM_CHARACTER_DATA)) #define ARV_DOM_CHARACTER_DATA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_DOM_CHARACTER_DATA, ArvDomCharacterDataClass)) typedef struct _ArvDomCharacterDataClass ArvDomCharacterDataClass; struct _ArvDomCharacterData { ArvDomNode node; char *data; }; struct _ArvDomCharacterDataClass { ArvDomNodeClass parent_class; }; GType arv_dom_character_data_get_type (void); const char * arv_dom_character_data_get_data (ArvDomCharacterData* self); void arv_dom_character_data_set_data (ArvDomCharacterData* self, const char* value); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvdomdocument.c000066400000000000000000000126671334570641500202170ustar00rootroot00000000000000/* Aravis * * Copyright © 2007-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ /** * SECTION:arvdomdocument * @short_description: Base class for DOM document nodes */ #include #include #include #include #include #include #include static GObjectClass *parent_class; /* ArvDomNode implementation */ static const char * arv_dom_document_get_node_name (ArvDomNode *node) { return "#document"; } static ArvDomNodeType arv_dom_document_get_node_type (ArvDomNode *node) { return ARV_DOM_NODE_TYPE_DOCUMENT_NODE; } /* ArvDomDocument implementation */ /** * arv_dom_document_get_document_element: * @self: a #ArvDomDocument * * Returns: (transfer none): the top element of @self. */ ArvDomElement * arv_dom_document_get_document_element (ArvDomDocument *self) { g_return_val_if_fail (ARV_IS_DOM_DOCUMENT (self), NULL); return ARV_DOM_ELEMENT (arv_dom_node_get_first_child (ARV_DOM_NODE (self))); } /** * arv_dom_document_create_element: * @self: a #ArvDomDocument * @tag_name: node name of the element to create * * Create a new element. * * Returns: (transfer full): a new orphan #ArvDomElement, NULL on error. */ ArvDomElement * arv_dom_document_create_element (ArvDomDocument *self, const char *tag_name) { ArvDomDocumentClass *document_class; g_return_val_if_fail (ARV_IS_DOM_DOCUMENT (self), NULL); document_class = ARV_DOM_DOCUMENT_GET_CLASS (self); if (document_class->create_element != NULL) return document_class->create_element (self, tag_name); return NULL; } static ArvDomText * arv_dom_document_create_text_node_base (ArvDomDocument *document, const char *data) { return ARV_DOM_TEXT (arv_dom_text_new (data)); } /** * arv_dom_document_create_text_node: * @self: a #ArvDomDocument * @data: initial content * * Create a new text element. * * Returns: (transfer full): a new orphan #ArvDomText, NULL on error. */ ArvDomText * arv_dom_document_create_text_node (ArvDomDocument *self, const char *data) { g_return_val_if_fail (ARV_IS_DOM_DOCUMENT (self), NULL); return ARV_DOM_DOCUMENT_GET_CLASS (self)->create_text_node (self, data); } const char * arv_dom_document_get_url (ArvDomDocument *self) { g_return_val_if_fail (ARV_IS_DOM_DOCUMENT (self), NULL); return self->url; } void arv_dom_document_set_path (ArvDomDocument *self, const char *path) { g_return_if_fail (ARV_IS_DOM_DOCUMENT (self)); g_free (self->url); if (path == NULL) { self->url = NULL; return; } self->url = arv_str_to_uri (path); } void arv_dom_document_set_url (ArvDomDocument *self, const char *url) { g_return_if_fail (ARV_IS_DOM_DOCUMENT (self)); g_return_if_fail (url == NULL || arv_str_is_uri (url)); g_free (self->url); self->url = g_strdup (url); } /** * arv_dom_document_get_href_data: * @self: a #ArvDomDocument * @href: document reference * @size: data size placeholder * * Load the content referenced by @href. * * Returns: (transfer full): a newly allocated data buffer. */ void * arv_dom_document_get_href_data (ArvDomDocument *self, const char *href, gsize *size) { GFile *file; char *data = NULL; g_return_val_if_fail (ARV_IS_DOM_DOCUMENT (self), NULL); g_return_val_if_fail (href != NULL, NULL); if (strncmp (href, "data:", 5) == 0) { while (*href != '\0' && *href != ',') href++; return g_base64_decode (href, size); } file = g_file_new_for_uri (href); if (!g_file_load_contents (file, NULL, &data, size, NULL, NULL) && self->url != NULL) { GFile *document_file; GFile *parent_file; g_object_unref (file); document_file = g_file_new_for_uri (self->url); parent_file = g_file_get_parent (document_file); file = g_file_resolve_relative_path (parent_file, href); g_object_unref (document_file); g_object_unref (parent_file); g_file_load_contents (file, NULL, &data, size, NULL, NULL); } g_object_unref (file); return data; } static void arv_dom_document_init (ArvDomDocument *document) { } static void arv_dom_document_finalize (GObject *object) { ArvDomDocument *document = ARV_DOM_DOCUMENT (object); g_free (document->url); parent_class->finalize (object); } /* ArvDomDocument class */ static void arv_dom_document_class_init (ArvDomDocumentClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); ArvDomNodeClass *node_class = ARV_DOM_NODE_CLASS (klass); parent_class = g_type_class_peek_parent (klass); object_class->finalize = arv_dom_document_finalize; node_class->get_node_name = arv_dom_document_get_node_name; node_class->get_node_type = arv_dom_document_get_node_type; klass->create_text_node = arv_dom_document_create_text_node_base; } G_DEFINE_ABSTRACT_TYPE (ArvDomDocument, arv_dom_document, ARV_TYPE_DOM_NODE) aravis-ARAVIS_0_6_0/src/arvdomdocument.h000066400000000000000000000053401334570641500202120ustar00rootroot00000000000000/* Aravis * * Copyright © 2007-2008 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ #ifndef ARV_DOM_DOCUMENT_H #define ARV_DOM_DOCUMENT_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS #define ARV_TYPE_DOM_DOCUMENT (arv_dom_document_get_type ()) #define ARV_DOM_DOCUMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_DOM_DOCUMENT, ArvDomDocument)) #define ARV_DOM_DOCUMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_DOM_DOCUMENT, ArvDomDocumentClass)) #define ARV_IS_DOM_DOCUMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_DOM_DOCUMENT)) #define ARV_IS_DOM_DOCUMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_DOM_DOCUMENT)) #define ARV_DOM_DOCUMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_DOM_DOCUMENT, ArvDomDocumentClass)) typedef struct _ArvDomDocumentClass ArvDomDocumentClass; struct _ArvDomDocument { ArvDomNode node; char * url; }; struct _ArvDomDocumentClass { ArvDomNodeClass parent_class; ArvDomElement * (*get_document_element) (ArvDomDocument* self); ArvDomElement * (*create_element) (ArvDomDocument* self, const char *tag_name); ArvDomText * (*create_text_node) (ArvDomDocument* self, const char *data); }; GType arv_dom_document_get_type (void); ArvDomElement* arv_dom_document_get_document_element (ArvDomDocument* self); ArvDomElement* arv_dom_document_create_element (ArvDomDocument* self, const char *tag_name); ArvDomText* arv_dom_document_create_text_node (ArvDomDocument* self, const char *data); const char * arv_dom_document_get_url (ArvDomDocument *self); void arv_dom_document_set_url (ArvDomDocument *self, const char *url); void arv_dom_document_set_path (ArvDomDocument *self, const char *path); void * arv_dom_document_get_href_data (ArvDomDocument *self, const char *href, gsize *size); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvdomdocumentfragment.c000066400000000000000000000043121334570641500217270ustar00rootroot00000000000000/* Aravis * * Copyright © 2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ /** * SECTION:arvdomdocumentfragment * @short_description: Base class for DOM document fragments */ #include #include static GObjectClass *parent_class = NULL; /* ArvDomNode implementation */ static const char * arv_dom_document_fragment_get_node_name (ArvDomNode *node) { return "#document-fragment"; } static const char * arv_dom_document_fragment_get_node_value (ArvDomNode *node) { return NULL; } static ArvDomNodeType arv_dom_document_fragment_get_node_type (ArvDomNode *node) { return ARV_DOM_NODE_TYPE_DOCUMENT_FRAGMENT_NODE; } /* ArvDomDocumentFragment implementation */ ArvDomDocumentFragment * arv_dom_document_fragment_new (void) { return g_object_new (ARV_TYPE_DOM_DOCUMENT_FRAGMENT, NULL); } static void arv_dom_document_fragment_init (ArvDomDocumentFragment *document_fragment) { } /* ArvDomDocumentFragment class */ static void arv_dom_document_fragment_class_init (ArvDomDocumentFragmentClass *klass) { ArvDomNodeClass *node_class = ARV_DOM_NODE_CLASS (klass); parent_class = g_type_class_peek_parent (klass); node_class->get_node_name = arv_dom_document_fragment_get_node_name; node_class->get_node_value = arv_dom_document_fragment_get_node_value; node_class->get_node_type = arv_dom_document_fragment_get_node_type; } G_DEFINE_ABSTRACT_TYPE (ArvDomDocumentFragment, arv_dom_document_fragment, ARV_TYPE_DOM_NODE) aravis-ARAVIS_0_6_0/src/arvdomdocumentfragment.h000066400000000000000000000042501334570641500217350ustar00rootroot00000000000000/* Aravis * * Copyright © 2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ #ifndef ARV_DOM_DOCUMENT_FRAGMENT_H #define ARV_DOM_DOCUMENT_FRAGMENT_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS #define ARV_TYPE_DOM_DOCUMENT_FRAGMENT (arv_dom_document_fragment_get_type ()) #define ARV_DOM_DOCUMENT_FRAGMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_DOM_DOCUMENT_FRAGMENT, ArvDomDocumentFragment)) #define ARV_DOM_DOCUMENT_FRAGMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_DOM_DOCUMENT_FRAGMENT, ArvDomDocumentFragmentClass)) #define ARV_IS_DOM_DOCUMENT_FRAGMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_DOM_DOCUMENT_FRAGMENT)) #define ARV_IS_DOM_DOCUMENT_FRAGMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_DOM_DOCUMENT_FRAGMENT)) #define ARV_DOM_DOCUMENT_FRAGMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_DOM_DOCUMENT_FRAGMENT, ArvDomDocumentFragmentClass)) typedef struct _ArvDomDocumentFragmentClass ArvDomDocumentFragmentClass; struct _ArvDomDocumentFragment { ArvDomNode node; }; struct _ArvDomDocumentFragmentClass { ArvDomNodeClass parent_class; }; GType arv_dom_document_fragment_get_type (void); ArvDomDocumentFragment * arv_dom_document_fragment_new (void); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvdomelement.c000066400000000000000000000067101334570641500200220ustar00rootroot00000000000000/* Aravis * * Copyright © 2007-2008 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ /** * SECTION:arvdomelement * @short_description: Base class for DOM element nodes */ #include #include static GObjectClass *parent_class = NULL; /* ArvDomNode implementation */ static const char * arv_dom_element_get_node_value (ArvDomNode *node) { return NULL; } static ArvDomNodeType arv_dom_element_get_node_type (ArvDomNode *node) { return ARV_DOM_NODE_TYPE_ELEMENT_NODE; } static void arv_dom_element_write_to_stream (ArvDomNode *self, GOutputStream *stream, GError **error) { ArvDomElementClass *element_class; char *string; char *attributes = NULL; element_class = ARV_DOM_ELEMENT_GET_CLASS (self); if (element_class->get_serialized_attributes != NULL) attributes = element_class->get_serialized_attributes (ARV_DOM_ELEMENT (self)); if (attributes != NULL) string = g_strdup_printf ("<%s %s>", arv_dom_node_get_node_name (self), attributes); else string = g_strdup_printf ("<%s>", arv_dom_node_get_node_name (self)); g_output_stream_write (stream, string, strlen (string), NULL, error); g_free (string); g_free (attributes); ARV_DOM_NODE_CLASS (parent_class)->write_to_stream (self, stream, error); string = g_strdup_printf ("\n", arv_dom_node_get_node_name (self)); g_output_stream_write (stream, string, strlen (string), NULL, error); g_free (string); } /* ArvDomElement implementation */ const char * arv_dom_element_get_attribute (ArvDomElement* self, const char* name) { g_return_val_if_fail (ARV_IS_DOM_ELEMENT (self), NULL); g_return_val_if_fail (name != NULL, NULL); return ARV_DOM_ELEMENT_GET_CLASS (self)->get_attribute (self, name); } void arv_dom_element_set_attribute (ArvDomElement* self, const char* name, const char* attribute_value) { g_return_if_fail (ARV_IS_DOM_ELEMENT (self)); g_return_if_fail (name != NULL); ARV_DOM_ELEMENT_GET_CLASS (self)->set_attribute (self, name, attribute_value); arv_dom_node_changed (ARV_DOM_NODE (self)); } const char * arv_dom_element_get_tag_name (ArvDomElement *self) { g_return_val_if_fail (ARV_IS_DOM_ELEMENT (self), NULL); return arv_dom_node_get_node_name (ARV_DOM_NODE (self)); } static void arv_dom_element_init (ArvDomElement *element) { } /* ArvDomElement class */ static void arv_dom_element_class_init (ArvDomElementClass *klass) { ArvDomNodeClass *node_class = ARV_DOM_NODE_CLASS (klass); parent_class = g_type_class_peek_parent (klass); node_class->get_node_value = arv_dom_element_get_node_value; node_class->get_node_type = arv_dom_element_get_node_type; node_class->write_to_stream = arv_dom_element_write_to_stream; } G_DEFINE_ABSTRACT_TYPE (ArvDomElement, arv_dom_element, ARV_TYPE_DOM_NODE) aravis-ARAVIS_0_6_0/src/arvdomelement.h000066400000000000000000000045521334570641500200310ustar00rootroot00000000000000/* Aravis * * Copyright © 2007-2008 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ #ifndef ARV_DOM_ELEMENT_H #define ARV_DOM_ELEMENT_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS #define ARV_TYPE_DOM_ELEMENT (arv_dom_element_get_type ()) #define ARV_DOM_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_DOM_ELEMENT, ArvDomElement)) #define ARV_DOM_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_DOM_ELEMENT, ArvDomElementClass)) #define ARV_IS_DOM_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_DOM_ELEMENT)) #define ARV_IS_DOM_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_DOM_ELEMENT)) #define ARV_DOM_ELEMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_DOM_ELEMENT, ArvDomElementClass)) typedef struct _ArvDomElementClass ArvDomElementClass; struct _ArvDomElement { ArvDomNode node; }; struct _ArvDomElementClass { ArvDomNodeClass parent_class; const char* (*get_attribute) (ArvDomElement *self, const char *name); void (*set_attribute) (ArvDomElement *self, const char *name, const char *attribute_value); char * (*get_serialized_attributes) (ArvDomElement *self); }; GType arv_dom_element_get_type (void); const char * arv_dom_element_get_tag_name (ArvDomElement *self); const char* arv_dom_element_get_attribute (ArvDomElement* self, const char* name); void arv_dom_element_set_attribute (ArvDomElement* self, const char* name, const char* attribute_value); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvdomimplementation.c000066400000000000000000000045631334570641500214220ustar00rootroot00000000000000/* Aravis * * Copyright © 2007-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ #include #include #include #include static GHashTable *document_types = NULL; void arv_dom_implementation_add_document_type (const char *qualified_name, GType document_type) { GType *document_type_ptr; if (document_types == NULL) document_types = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); document_type_ptr = g_new (GType, 1); *document_type_ptr = document_type; g_hash_table_insert (document_types, g_strdup (qualified_name), document_type_ptr); } /** * arv_dom_implementation_create_document: * @namespace_uri: namespace URI * @qualified_name: qualified name * * Create a new DOM document. Currently, only @qualified_name is used. * * Returns: (transfer full): a new #ArvDomDocument, NULL on error: */ ArvDomDocument * arv_dom_implementation_create_document (const char *namespace_uri, const char *qualified_name) { GType *document_type; g_return_val_if_fail (qualified_name != NULL, NULL); if (document_types == NULL) { arv_dom_implementation_add_document_type ("RegisterDescription", ARV_TYPE_GC); } document_type = g_hash_table_lookup (document_types, qualified_name); if (document_type == NULL) { arv_debug_dom ("[ArvDomImplementation::create_document] Unknow document type (%s)", qualified_name); return NULL; } return g_object_new (*document_type, NULL); } void arv_dom_implementation_cleanup (void) { if (document_types == NULL) return; g_hash_table_unref (document_types); document_types = NULL; } aravis-ARAVIS_0_6_0/src/arvdomimplementation.h000066400000000000000000000027211334570641500214210ustar00rootroot00000000000000/* Aravis * * Copyright © 2007-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ #ifndef ARV_DOM_IMPLEMENTATION_H #define ARV_DOM_IMPLEMENTATION_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS typedef ArvDomDocument * (*ArvDomDocumentCreateFunction) (void); ArvDomDocument * arv_dom_implementation_create_document (const char *namespace_uri, const char *qualified_name); void arv_dom_implementation_add_document_type (const char *qualified_name, GType document_type); void arv_dom_implementation_cleanup (void); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvdomnamednodemap.c000066400000000000000000000057341334570641500210260ustar00rootroot00000000000000/* Aravis * * Copyright © 2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ #include #include /* ArvDomNamedNodeMap implementation */ /** * arv_dom_named_node_map_get_named_item: * @map: a #ArvDomNamedNodeMap * @name: name of the element to look for. * * Returns: (transfer none): a #ArvDomElement. */ ArvDomNode * arv_dom_named_node_map_get_named_item (ArvDomNamedNodeMap *map, const char *name) { g_return_val_if_fail (ARV_IS_DOM_NAMED_NODE_MAP (map), NULL); return ARV_DOM_NAMED_NODE_MAP_GET_CLASS (map)->get (map, name); } /** * arv_dom_named_node_map_set_named_item: * @map: a #ArvDomNamedNodeMap * @item: a node to insert * * Returns: (transfer none): same as @node on success. */ ArvDomNode * arv_dom_named_node_map_set_named_item (ArvDomNamedNodeMap *map, ArvDomNode *item) { g_return_val_if_fail (ARV_IS_DOM_NAMED_NODE_MAP (map), NULL); return ARV_DOM_NAMED_NODE_MAP_GET_CLASS (map)->set (map, item); } /** * arv_dom_named_node_map_remove_named_item: * @map: a #ArvDomNamedNodeMap * @name: name of the node to remove * * Returns: (transfer none): the removed node. */ ArvDomNode * arv_dom_named_node_map_remove_named_item (ArvDomNamedNodeMap *map, const char *name) { g_return_val_if_fail (ARV_IS_DOM_NAMED_NODE_MAP (map), NULL); return ARV_DOM_NAMED_NODE_MAP_GET_CLASS (map)->remove (map, name); } /** * arv_dom_named_node_map_get_item: * @map: a #ArvDomNamedNodeMap * @index: an index * * Returns: (transfer none): the @ArvDomNode corresponding to @index. */ ArvDomNode * arv_dom_named_node_map_get_item (ArvDomNamedNodeMap *map, unsigned int index) { g_return_val_if_fail (ARV_IS_DOM_NAMED_NODE_MAP (map), NULL); return ARV_DOM_NAMED_NODE_MAP_GET_CLASS (map)->get_item (map, index); } unsigned int arv_dom_named_node_map_get_length (ArvDomNamedNodeMap *map) { g_return_val_if_fail (ARV_IS_DOM_NAMED_NODE_MAP (map), 0); return ARV_DOM_NAMED_NODE_MAP_GET_CLASS (map)->get_length (map); } static void arv_dom_named_node_map_init (ArvDomNamedNodeMap *map) { } /* ArvDomNamedNodeMap class */ static void arv_dom_named_node_map_class_init (ArvDomNamedNodeMapClass *klass) { } G_DEFINE_ABSTRACT_TYPE (ArvDomNamedNodeMap, arv_dom_named_node_map, G_TYPE_OBJECT) aravis-ARAVIS_0_6_0/src/arvdomnamednodemap.h000066400000000000000000000054531334570641500210310ustar00rootroot00000000000000/* Aravis * * Copyright © 2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ #ifndef ARV_DOM_NAMED_NODE_MAP_H #define ARV_DOM_NAMED_NODE_MAP_H #include #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif G_BEGIN_DECLS #define ARV_TYPE_DOM_NAMED_NODE_MAP (arv_dom_named_node_map_get_type ()) #define ARV_DOM_NAMED_NODE_MAP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_DOM_NAMED_NODE_MAP, ArvDomNamedNodeMap)) #define ARV_DOM_NAMED_NODE_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_DOM_NAMED_NODE_MAP, ArvDomNamedNodeMapClass)) #define ARV_IS_DOM_NAMED_NODE_MAP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_DOM_NAMED_NODE_MAP)) #define ARV_IS_DOM_NAMED_NODE_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_DOM_NAMED_NODE_MAP)) #define ARV_DOM_NAMED_NODE_MAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_DOM_NAMED_NODE_MAP, ArvDomNamedNodeMapClass)) typedef struct _ArvDomNamedNodeMapClass ArvDomNamedNodeMapClass; struct _ArvDomNamedNodeMap { GObject object; }; struct _ArvDomNamedNodeMapClass { GObjectClass parent_class; ArvDomNode * (*get) (ArvDomNamedNodeMap *map, const char *name); ArvDomNode * (*set) (ArvDomNamedNodeMap *map, ArvDomNode *node); ArvDomNode * (*remove) (ArvDomNamedNodeMap *map, const char *name); ArvDomNode * (*get_item) (ArvDomNamedNodeMap *map, unsigned int index); unsigned int (*get_length) (ArvDomNamedNodeMap *map); }; GType arv_dom_named_node_map_get_type (void); ArvDomNode * arv_dom_named_node_map_get_named_item (ArvDomNamedNodeMap *map, const char *name); ArvDomNode * arv_dom_named_node_map_set_named_item (ArvDomNamedNodeMap *map, ArvDomNode *item); ArvDomNode * arv_dom_named_node_map_remove_named_item (ArvDomNamedNodeMap *map, const char *name); ArvDomNode * arv_dom_named_node_map_get_item (ArvDomNamedNodeMap *map, unsigned int index); unsigned int arv_dom_named_node_map_get_length (ArvDomNamedNodeMap *map); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvdomnode.c000066400000000000000000000427131334570641500173210ustar00rootroot00000000000000/* Aravis * * Copyright © 2007-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ /** * SECTION:arvdomnode * @short_description: Base class for DOM nodes */ #include #include #include #include #include #include /* ArvDomNodeChildList */ #define ARV_TYPE_DOM_NODE_CHILD_LIST (arv_dom_node_child_list_get_type ()) #define ARV_DOM_NODE_CHILD_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_DOM_NODE_CHILD_LIST, ArvDomNodeChildList)) #define ARV_DOM_NODE_CHILD_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_DOM_NODE_CHILD_LIST, ArvDomNodeChildListClass)) #define ARV_IS_DOM_NODE_CHILD_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_DOM_NODE_CHILD_LIST)) #define ARV_IS_DOM_NODE_CHILD_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_DOM_NODE_CHILD_LIST)) #define ARV_DOM_NODE_CHILD_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_DOM_NODE_CHILD_LIST, ArvDomNodeChildListClass)) typedef struct _ArvDomNodeChildListClass ArvDomNodeChildListClass; typedef struct { ArvDomNodeList base; ArvDomNode *parent_node; } ArvDomNodeChildList; struct _ArvDomNodeChildListClass { ArvDomNodeListClass parent_class; }; GType arv_dom_node_child_list_get_type (void); static GObjectClass *child_list_parent_class = NULL; static void arv_dom_node_child_list_weak_notify_cb (void *user_data, GObject *object) { ArvDomNodeChildList *list = user_data; list->parent_node = NULL; } static ArvDomNode * arv_dom_node_child_list_get_item (ArvDomNodeList *list, unsigned int index) { ArvDomNodeChildList *child_list = ARV_DOM_NODE_CHILD_LIST (list); ArvDomNode *iter; unsigned int i = 0; if (child_list->parent_node == NULL) return NULL; for (iter = child_list->parent_node->first_child; iter != NULL; iter = iter->next_sibling) { if (i == index) return iter; i++; } return NULL; } static unsigned int arv_dom_node_child_list_get_length (ArvDomNodeList *list) { ArvDomNodeChildList *child_list = ARV_DOM_NODE_CHILD_LIST (list); ArvDomNode *iter; unsigned int length = 0; if (child_list->parent_node == NULL) return 0; for (iter = child_list->parent_node->first_child; iter != NULL; iter = iter->next_sibling) length++; return length; } ArvDomNodeList * arv_dom_node_child_list_new (ArvDomNode *parent_node) { ArvDomNodeChildList *list; g_return_val_if_fail (ARV_IS_DOM_NODE (parent_node), NULL); list = g_object_new (ARV_TYPE_DOM_NODE_CHILD_LIST, NULL); list->parent_node = parent_node; g_object_weak_ref (G_OBJECT (parent_node), arv_dom_node_child_list_weak_notify_cb, list); return ARV_DOM_NODE_LIST (list); } static void arv_dom_node_child_list_init (ArvDomNodeChildList *list) { } static void arv_dom_node_child_list_finalize (GObject *object) { ArvDomNodeChildList *list = ARV_DOM_NODE_CHILD_LIST (object); if (list->parent_node != NULL) { g_object_weak_unref (G_OBJECT (list->parent_node), arv_dom_node_child_list_weak_notify_cb, list); list->parent_node = NULL; } child_list_parent_class->finalize (object); } static void arv_dom_node_child_list_class_init (ArvDomNodeChildListClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); ArvDomNodeListClass *node_list_class = ARV_DOM_NODE_LIST_CLASS (klass); child_list_parent_class = g_type_class_peek_parent (klass); object_class->finalize = arv_dom_node_child_list_finalize; node_list_class->get_item = arv_dom_node_child_list_get_item; node_list_class->get_length = arv_dom_node_child_list_get_length; } G_DEFINE_TYPE (ArvDomNodeChildList, arv_dom_node_child_list, ARV_TYPE_DOM_NODE_LIST) static GObjectClass *parent_class = NULL; /* ArvDomNode implementation */ /** * arv_dom_node_get_node_name: * @self: a #ArvDomNode * * Gets the node name. * * Return value: the node name. */ const char* arv_dom_node_get_node_name (ArvDomNode* self) { ArvDomNodeClass *node_class = ARV_DOM_NODE_GET_CLASS (self); g_return_val_if_fail (node_class != NULL, NULL); if (node_class->get_node_name) return node_class->get_node_name (self); return NULL; } /** * arv_dom_node_get_node_value: * @self: a #ArvDomNode * * Gets the node value. * * Return value: the node value. */ const char* arv_dom_node_get_node_value (ArvDomNode* self) { ArvDomNodeClass *node_class = ARV_DOM_NODE_GET_CLASS (self); g_return_val_if_fail (node_class != NULL, NULL); if (node_class->get_node_value) return node_class->get_node_value (self); return NULL; } void arv_dom_node_set_node_value (ArvDomNode* self, const char* new_value) { ArvDomNodeClass *node_class = ARV_DOM_NODE_GET_CLASS (self); g_return_if_fail (node_class != NULL); g_return_if_fail (new_value != NULL); if (node_class->set_node_value) node_class->set_node_value (self, new_value); } ArvDomNodeType arv_dom_node_get_node_type (ArvDomNode* self) { ArvDomNodeClass *node_class = ARV_DOM_NODE_GET_CLASS (self); g_return_val_if_fail (node_class != NULL, 0); if (node_class->get_node_type) return node_class->get_node_type (self); return 0; } /** * arv_dom_node_get_parent_node: * @self: a #ArvDomNode * * Get the parent node of @self. * * Returns: (transfer none): @self parent. */ ArvDomNode* arv_dom_node_get_parent_node (ArvDomNode* self) { g_return_val_if_fail (ARV_IS_DOM_NODE (self), NULL); return self->parent_node; } /** * arv_dom_node_get_child_nodes: * @self: a #ArvDomNode * * Returns: (transfer none): a #ArvDomNodeList, NULL on error. */ ArvDomNodeList* arv_dom_node_get_child_nodes (ArvDomNode* self) { ArvDomNodeList *list; g_return_val_if_fail (ARV_IS_DOM_NODE (self), NULL); list = g_object_get_data (G_OBJECT (self), "child-nodes"); if (list == NULL) { list = arv_dom_node_child_list_new (self); g_object_set_data_full (G_OBJECT (self), "child-nodes", list, g_object_unref); } return list; } /** * arv_dom_node_get_first_child: * @self: a #ArvDomNode * * Returns: (transfer none): @self first child. */ ArvDomNode* arv_dom_node_get_first_child (ArvDomNode* self) { g_return_val_if_fail (ARV_IS_DOM_NODE (self), NULL); return self->first_child; } /** * arv_dom_node_get_last_child: * @self: a #ArvDomNode * * Returns: (transfer none): @self last child. */ ArvDomNode* arv_dom_node_get_last_child (ArvDomNode* self) { g_return_val_if_fail (ARV_IS_DOM_NODE (self), NULL); return self->last_child; } /** * arv_dom_node_get_previous_sibling: * @self: a #ArvDomNode * * Returns: (transfer none): @self previous sibling. */ ArvDomNode* arv_dom_node_get_previous_sibling (ArvDomNode* self) { g_return_val_if_fail (ARV_IS_DOM_NODE (self), NULL); return self->previous_sibling; } /** * arv_dom_node_get_next_sibling: * @self: a #ArvDomNode * * Returns: (transfer none): @self next sibling. */ ArvDomNode* arv_dom_node_get_next_sibling (ArvDomNode* self) { g_return_val_if_fail (ARV_IS_DOM_NODE (self), NULL); return self->next_sibling; } /*ArvDomNamedNodeMap**/ /*arv_dom_node_get_attributes (ArvDomNode* self)*/ /*{*/ /* return ARV_DOM_NODE_GET_CLASS (self)->get_attributes (self);*/ /*}*/ /** * arv_dom_node_get_owner_document: * @self: a #ArvDomNode * * Returns: (transfer none): @self owner document. */ ArvDomDocument* arv_dom_node_get_owner_document (ArvDomNode* self) { ArvDomNode *parent; g_return_val_if_fail (ARV_IS_DOM_NODE (self), NULL); for (parent = self; parent != NULL && !ARV_IS_DOM_DOCUMENT (parent); parent = parent->parent_node); return ARV_DOM_DOCUMENT (parent); } /** * arv_dom_node_insert_before: * @self: a #ArvDomNode * @new_child: (transfer full): node to insert * @ref_child: (transfer none): reference node, i.e., the node before which the new node must be inserted. * * Inserts the node @new_child before the existing child node @ref_child. If * @ref_child is null, insert @new_child at the end of the list of children. * If the @new_child is already in the tree, it is first removed. * * Returns: (transfer none): the inserted node. */ /* TODO: * If @new_child is a #LsmDocumentFragment object, all of its children are inserted, * in the same order, before @ref_child. * Check if new_child is an ancestor of self. */ ArvDomNode* arv_dom_node_insert_before (ArvDomNode* self, ArvDomNode* new_child, ArvDomNode* ref_child) { ArvDomNodeClass *node_class; if (ref_child == NULL) arv_dom_node_append_child (self, new_child); g_return_val_if_fail (ARV_IS_DOM_NODE (new_child), NULL); if (new_child->parent_node != NULL) arv_dom_node_remove_child (self, new_child); if (!ARV_IS_DOM_NODE (self)) { g_critical ("%s: self is not a ArvDomNode", G_STRFUNC); g_object_unref (new_child); return NULL; } if (!ARV_IS_DOM_NODE (ref_child)) { g_critical ("%s: ref_child is not a ArvDomNode", G_STRFUNC); g_object_unref (new_child); return NULL; } if (ref_child->parent_node != self) { arv_debug_dom ("[ArvDomNode::insert_before] Ref child '%s' doesn't belong to '%s'", arv_dom_node_get_node_name (ref_child), arv_dom_node_get_node_name (self)); g_object_unref (new_child); return NULL; } if (!ARV_DOM_NODE_GET_CLASS (self)->can_append_child (self, new_child)) { arv_log_dom ("[ArvDomNode::insert_before] Can't append '%s' to '%s'", arv_dom_node_get_node_name (new_child), arv_dom_node_get_node_name (self)); g_object_unref (new_child); return NULL; } new_child->parent_node = self; new_child->next_sibling = ref_child; new_child->previous_sibling = ref_child->previous_sibling; if (ref_child->previous_sibling == NULL) self->first_child = new_child; else ref_child->previous_sibling->next_sibling = new_child; ref_child->previous_sibling = new_child; node_class = ARV_DOM_NODE_GET_CLASS (self); if (node_class->post_new_child) node_class->post_new_child (self, new_child); arv_dom_node_changed (self); return new_child; } /** * arv_dom_node_replace_child: * @self: a #ArvDomNode * @new_child: (transfer full): a replacement node * @old_child: (transfer none): node to replace * * Replaces the child node @old_child with @new_child in the list of children, * and returns the @old_child node. * If the @new_child is already in the tree, it is first removed. * * Returns: (transfer full): the replaced node. */ /* TODO: * Check if new_child is an ancestor of self. */ ArvDomNode* arv_dom_node_replace_child (ArvDomNode* self, ArvDomNode* new_child, ArvDomNode* old_child) { ArvDomNode *next_sibling; ArvDomNode *node; if (new_child == NULL) return arv_dom_node_remove_child (self, old_child); if (!ARV_IS_DOM_NODE (new_child)) { g_critical ("%s: new_child is not a ArvDomNode", G_STRFUNC); if (ARV_IS_DOM_NODE (old_child)) g_object_unref (old_child); return NULL; } if (new_child->parent_node != NULL) arv_dom_node_remove_child (self, new_child); if (old_child == NULL) { arv_debug_dom ("[ArvDomNode::replace_child] old_child == NULL)"); g_object_unref (new_child); return NULL; } if (!ARV_IS_DOM_NODE (old_child)) { g_critical ("%s: old_child is not a ArvDomNode", G_STRFUNC); g_object_unref (new_child); return NULL; } if (!ARV_IS_DOM_NODE (self)) { g_critical ("%s: self is not a ArvDomNode", G_STRFUNC); g_object_unref (new_child); g_object_unref (old_child); return NULL; } if (old_child->parent_node != self) { g_object_unref (new_child); g_object_unref (old_child); return NULL; } next_sibling = old_child->next_sibling; node = arv_dom_node_remove_child (self, old_child); if (node != old_child) { g_object_unref (new_child); g_object_unref (old_child); return NULL; } if (next_sibling == NULL) arv_dom_node_append_child (self, new_child); else arv_dom_node_insert_before (self, new_child, next_sibling); return old_child; } /** * arv_dom_node_remove_child: * @self: a #ArvDomNode * @old_child: (transfer none): node to remove. * * Removes the child node indicated by @old_child from the list of children, and returns it. * * Returns: (transfer full): the removed node. */ ArvDomNode* arv_dom_node_remove_child (ArvDomNode* self, ArvDomNode* old_child) { ArvDomNode *node; ArvDomNodeClass *node_class; g_return_val_if_fail (ARV_IS_DOM_NODE (self), NULL); if (old_child == NULL) return NULL; g_return_val_if_fail (ARV_IS_DOM_NODE (old_child), NULL); for (node = self->first_child; node != NULL && node != old_child; node = node->next_sibling); if (node == NULL) return NULL; node_class = ARV_DOM_NODE_GET_CLASS (self); if (node_class->pre_remove_child) node_class->pre_remove_child (self, old_child); if (self->first_child == old_child) self->first_child = old_child->next_sibling; if (self->last_child == old_child) self->last_child = old_child->previous_sibling; if (old_child->next_sibling != NULL) old_child->next_sibling->previous_sibling = old_child->previous_sibling; if (old_child->previous_sibling != NULL) old_child->previous_sibling->next_sibling = old_child->next_sibling; old_child->parent_node = NULL; old_child->next_sibling = NULL; old_child->previous_sibling = NULL; arv_dom_node_changed (self); return old_child; } /** * arv_dom_node_append_child: * @self: a #ArvDomNode * @new_child: (transfer full): node to append * * Adds the node @new_child to the end of the list of children of this node. * If the @new_child is already in the tree, it is first removed. * * Returns: (transfer none): the added node. */ ArvDomNode * arv_dom_node_append_child (ArvDomNode* self, ArvDomNode* new_child) { ArvDomNodeClass *node_class; if (new_child == NULL) return NULL; g_return_val_if_fail (ARV_IS_DOM_NODE (new_child), NULL); if (!ARV_IS_DOM_NODE (self)) { g_critical ("%s: self is not a ArvDomNode", G_STRFUNC); g_object_unref (new_child); return NULL; } if (new_child->parent_node != NULL) arv_dom_node_remove_child (self, new_child); if (!ARV_DOM_NODE_GET_CLASS (self)->can_append_child (self, new_child)) { arv_log_dom ("[ArvDomNode::append_child] Can't append '%s' to '%s'", arv_dom_node_get_node_name (new_child), arv_dom_node_get_node_name (self)); g_object_unref (new_child); return NULL; } if (self->first_child == NULL) self->first_child = new_child; if (self->last_child != NULL) self->last_child->next_sibling = new_child; new_child->parent_node = self; new_child->next_sibling = NULL; new_child->previous_sibling = self->last_child; self->last_child = new_child; node_class = ARV_DOM_NODE_GET_CLASS (self); if (node_class->post_new_child) node_class->post_new_child (self, new_child); arv_dom_node_changed (self); return new_child; } static gboolean arv_dom_node_can_append_child_default (ArvDomNode *self, ArvDomNode* new_child) { return FALSE; } void arv_dom_node_changed (ArvDomNode *self) { ArvDomNode *parent_node; ArvDomNode *child_node; ArvDomNodeClass *node_class; g_return_if_fail (ARV_IS_DOM_NODE (self)); node_class = ARV_DOM_NODE_GET_CLASS (self); if (node_class->changed) node_class->changed (self); child_node = self; for (parent_node = self->parent_node; parent_node != NULL; parent_node = parent_node->parent_node) { node_class = ARV_DOM_NODE_GET_CLASS (parent_node); if (node_class->child_changed == NULL || !node_class->child_changed (parent_node, child_node)) break; child_node = parent_node; } } gboolean arv_dom_node_has_child_nodes (ArvDomNode* self) { g_return_val_if_fail (ARV_IS_DOM_NODE (self), FALSE); return self->first_child != NULL; } static void arv_dom_node_write_to_stream_default (ArvDomNode *self, GOutputStream *stream, GError **error) { ArvDomNode *child; for (child = self->first_child; child != NULL; child = child->next_sibling) arv_dom_node_write_to_stream (child, stream, error); } void arv_dom_node_write_to_stream (ArvDomNode *self, GOutputStream *stream, GError **error) { ArvDomNodeClass *node_class; g_return_if_fail (ARV_IS_DOM_NODE (self)); g_return_if_fail (G_IS_OUTPUT_STREAM (stream)); node_class = ARV_DOM_NODE_GET_CLASS (self); if (node_class->write_to_stream != NULL) node_class->write_to_stream (self, stream, error); } static void arv_dom_node_init (ArvDomNode *node) { } static void arv_dom_node_finalize (GObject *object) { ArvDomNode *node = ARV_DOM_NODE (object); ArvDomNode *child, *next_child; child = node->first_child; while (child != NULL) { next_child = child->next_sibling; g_object_unref (child); child = next_child; } parent_class->finalize (object); } /* ArvDomNode class */ static void arv_dom_node_class_init (ArvDomNodeClass *node_class) { GObjectClass *object_class = G_OBJECT_CLASS (node_class); parent_class = g_type_class_peek_parent (node_class); object_class->finalize = arv_dom_node_finalize; node_class->can_append_child = arv_dom_node_can_append_child_default; node_class->write_to_stream = arv_dom_node_write_to_stream_default; } G_DEFINE_ABSTRACT_TYPE (ArvDomNode, arv_dom_node, G_TYPE_OBJECT) aravis-ARAVIS_0_6_0/src/arvdomnode.h000066400000000000000000000110651334570641500173220ustar00rootroot00000000000000/* Aravis * * Copyright © 2007-2008 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ #ifndef ARV_DOM_NODE_H #define ARV_DOM_NODE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS typedef enum { ARV_DOM_NODE_TYPE_ELEMENT_NODE = 1, ARV_DOM_NODE_TYPE_ATTRIBUTE_NODE, ARV_DOM_NODE_TYPE_TEXT_NODE, ARV_DOM_NODE_TYPE_CDATA_SECTION_NODE, ARV_DOM_NODE_TYPE_ENTITY_REFERENCE_NODE, ARV_DOM_NODE_TYPE_ENTITY_NODE, ARV_DOM_NODE_TYPE_PROCESSING_INSTRUCTION_NODE, ARV_DOM_NODE_TYPE_COMMENT_NODE, ARV_DOM_NODE_TYPE_DOCUMENT_NODE, ARV_DOM_NODE_TYPE_DOCUMENT_TYPE_NODE, ARV_DOM_NODE_TYPE_DOCUMENT_FRAGMENT_NODE, ARV_DOM_NODE_TYPE_NOTATION_NODE } ArvDomNodeType; #define ARV_TYPE_DOM_NODE (arv_dom_node_get_type ()) #define ARV_DOM_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_DOM_NODE, ArvDomNode)) #define ARV_DOM_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_DOM_NODE, ArvDomNodeClass)) #define ARV_IS_DOM_NODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_DOM_NODE)) #define ARV_IS_DOM_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_DOM_NODE)) #define ARV_DOM_NODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_DOM_NODE, ArvDomNodeClass)) typedef struct _ArvDomNodeClass ArvDomNodeClass; struct _ArvDomNode { GObject object; ArvDomNode *next_sibling; ArvDomNode *previous_sibling; ArvDomNode *parent_node; ArvDomNode *first_child; ArvDomNode *last_child; }; struct _ArvDomNodeClass { GObjectClass parent_class; /* DOM node virtuals */ const char* (*get_node_name) (ArvDomNode* self); const char* (*get_node_value) (ArvDomNode* self); void (*set_node_value) (ArvDomNode* self, const char* new_value); ArvDomNodeType (*get_node_type) (ArvDomNode* self); /* Validation virtuals */ gboolean (*can_append_child) (ArvDomNode *self, ArvDomNode *new_child); /* Implementation virtuals */ void (*post_new_child) (ArvDomNode *parent, ArvDomNode *child); void (*pre_remove_child) (ArvDomNode *parent, ArvDomNode *child); void (*changed) (ArvDomNode *self); gboolean (*child_changed) (ArvDomNode *self, ArvDomNode *child); void (*write_to_stream) (ArvDomNode *self, GOutputStream *stream, GError **error); }; GType arv_dom_node_get_type (void); const char * arv_dom_node_get_node_name (ArvDomNode* self); const char * arv_dom_node_get_node_value (ArvDomNode* self); void arv_dom_node_set_node_value (ArvDomNode* self, const char* new_value); ArvDomNodeType arv_dom_node_get_node_type (ArvDomNode* self); ArvDomNode * arv_dom_node_get_parent_node (ArvDomNode* self); ArvDomNodeList * arv_dom_node_get_child_nodes (ArvDomNode* self); ArvDomNode * arv_dom_node_get_first_child (ArvDomNode* self); ArvDomNode * arv_dom_node_get_last_child (ArvDomNode* self); ArvDomNode * arv_dom_node_get_previous_sibling (ArvDomNode* self); ArvDomNode * arv_dom_node_get_next_sibling (ArvDomNode* self); #if 0 ArvDomNamedNodeMap * arv_dom_node_get_attributes (ArvDomNode* self); #endif ArvDomNode * arv_dom_node_insert_before (ArvDomNode* self, ArvDomNode* new_child, ArvDomNode* ref_child); ArvDomNode * arv_dom_node_replace_child (ArvDomNode* self, ArvDomNode* new_child, ArvDomNode* old_child); ArvDomNode * arv_dom_node_append_child (ArvDomNode* self, ArvDomNode* new_child); ArvDomNode * arv_dom_node_remove_child (ArvDomNode* self, ArvDomNode* old_child); gboolean arv_dom_node_has_child_nodes (ArvDomNode* self); void arv_dom_node_changed (ArvDomNode *self); ArvDomDocument * arv_dom_node_get_owner_document (ArvDomNode* self); void arv_dom_node_write_to_stream (ArvDomNode *self, GOutputStream *stream, GError **error); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvdomnodelist.c000066400000000000000000000034011334570641500202040ustar00rootroot00000000000000/* Aravis * * Copyright © 2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ #include #include /* ArvDomNodeList implementation */ /** * arv_dom_node_list_get_item: * @list: a #ArvDomNodeList * @index: item index * * Get one of the item of @list. * * Returns: (transfer none): item corresponding to index, NULL on error. */ ArvDomNode * arv_dom_node_list_get_item (ArvDomNodeList *list, unsigned int index) { g_return_val_if_fail (ARV_IS_DOM_NODE_LIST (list), NULL); return ARV_DOM_NODE_LIST_GET_CLASS (list)->get_item (list, index); } unsigned int arv_dom_node_list_get_length (ArvDomNodeList *list) { g_return_val_if_fail (ARV_IS_DOM_NODE_LIST (list), 0); return ARV_DOM_NODE_LIST_GET_CLASS (list)->get_length (list); } static void arv_dom_node_list_init (ArvDomNodeList *list) { } /* ArvDomNodeList class */ static void arv_dom_node_list_class_init (ArvDomNodeListClass *klass) { } G_DEFINE_ABSTRACT_TYPE (ArvDomNodeList, arv_dom_node_list, G_TYPE_OBJECT) aravis-ARAVIS_0_6_0/src/arvdomnodelist.h000066400000000000000000000042631334570641500202200ustar00rootroot00000000000000/* Aravis * * Copyright © 2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ #ifndef ARV_DOM_NODE_LIST_H #define ARV_DOM_NODE_LIST_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS #define ARV_TYPE_DOM_NODE_LIST (arv_dom_node_list_get_type ()) #define ARV_DOM_NODE_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_DOM_NODE_LIST, ArvDomNodeList)) #define ARV_DOM_NODE_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_DOM_NODE_LIST, ArvDomNodeListClass)) #define ARV_IS_DOM_NODE_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_DOM_NODE_LIST)) #define ARV_IS_DOM_NODE_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_DOM_NODE_LIST)) #define ARV_DOM_NODE_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_DOM_NODE_LIST, ArvDomNodeListClass)) typedef struct _ArvDomNodeListClass ArvDomNodeListClass; struct _ArvDomNodeList { GObject object; }; struct _ArvDomNodeListClass { GObjectClass parent_class; ArvDomNode * (*get_item) (ArvDomNodeList *list, unsigned int index); unsigned int (*get_length) (ArvDomNodeList *list); }; GType arv_dom_node_list_get_type (void); ArvDomNode * arv_dom_node_list_get_item (ArvDomNodeList *list, unsigned int index); unsigned int arv_dom_node_list_get_length (ArvDomNodeList *list); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvdomparser.c000066400000000000000000000233051334570641500176640ustar00rootroot00000000000000/* Aravis * * Copyright © 2007-2009 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ #include #include #include #include #include #include #include #include #include typedef enum { STATE } ArvDomSaxParserStateEnum; typedef struct { ArvDomSaxParserStateEnum state; ArvDomDocument *document; ArvDomNode *current_node; gboolean is_error; int error_depth; GHashTable *entities; } ArvDomSaxParserState; static void _free_entity (void *data) { xmlEntity *entity = data; xmlFree ((xmlChar *) entity->name); xmlFree ((xmlChar *) entity->ExternalID); xmlFree ((xmlChar *) entity->SystemID); xmlFree (entity->content); xmlFree (entity->orig); g_free (entity); } static void arv_dom_parser_start_document (void *user_data) { ArvDomSaxParserState *state = user_data; state->state = STATE; state->is_error = FALSE; state->error_depth = 0; state->entities = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, _free_entity); } static void arv_dom_parser_end_document (void *user_data) { ArvDomSaxParserState *state = user_data; g_hash_table_unref (state->entities); } static void arv_dom_parser_start_element(void *user_data, const xmlChar *name, const xmlChar **attrs) { ArvDomSaxParserState *state = user_data; ArvDomNode *node; int i; if (state->is_error) { state->error_depth++; return; } if (state->document == NULL) { state->document = arv_dom_implementation_create_document (NULL, (char *) name); state->current_node = ARV_DOM_NODE (state->document); g_return_if_fail (ARV_IS_DOM_DOCUMENT (state->document)); } node = ARV_DOM_NODE (arv_dom_document_create_element (ARV_DOM_DOCUMENT (state->document), (char *) name)); if (ARV_IS_DOM_NODE (node) && arv_dom_node_append_child (state->current_node, node) != NULL) { if (attrs != NULL) for (i = 0; attrs[i] != NULL && attrs[i+1] != NULL; i += 2) arv_dom_element_set_attribute (ARV_DOM_ELEMENT (node), (char *) attrs[i], (char *) attrs[i+1]); state->current_node = node; state->is_error = FALSE; state->error_depth = 0; } else { state->is_error = TRUE; state->error_depth = 1; } } static void arv_dom_parser_end_element (void *user_data, const xmlChar *name) { ArvDomSaxParserState *state = user_data; if (state->is_error) { state->error_depth--; if (state->error_depth > 0) { return; } state->is_error = FALSE; return; } state->current_node = arv_dom_node_get_parent_node (state->current_node); } static void arv_dom_parser_characters (void *user_data, const xmlChar *ch, int len) { ArvDomSaxParserState *state = user_data; if (!state->is_error) { ArvDomNode *node; char *text; text = g_strndup ((char *) ch, len); node = ARV_DOM_NODE (arv_dom_document_create_text_node (ARV_DOM_DOCUMENT (state->document), text)); arv_dom_node_append_child (state->current_node, node); g_free (text); } } #if 1 static void arv_dom_parser_warning (void *user_data, const char *msg, ...) { va_list args; va_start(args, msg); g_logv("XML", G_LOG_LEVEL_WARNING, msg, args); va_end(args); } static void arv_dom_parser_error (void *user_data, const char *msg, ...) { va_list args; va_start(args, msg); g_logv("XML", G_LOG_LEVEL_CRITICAL, msg, args); va_end(args); } static void arv_dom_parser_fatal_error (void *user_data, const char *msg, ...) { va_list args; va_start(args, msg); g_logv("XML", G_LOG_LEVEL_ERROR, msg, args); va_end(args); } #endif static xmlSAXHandler sax_handler = { #if 1 .warning = arv_dom_parser_warning, .error = arv_dom_parser_error, .fatalError = arv_dom_parser_fatal_error, #endif .startDocument = arv_dom_parser_start_document, .endDocument = arv_dom_parser_end_document, .startElement = arv_dom_parser_start_element, .endElement = arv_dom_parser_end_element, .characters = arv_dom_parser_characters }; static GQuark arv_dom_document_error_quark (void) { static GQuark q = 0; if (q == 0) { q = g_quark_from_static_string ("lsm-dom-error-quark"); } return q; } #define ARV_DOM_DOCUMENT_ERROR arv_dom_document_error_quark () typedef enum { ARV_DOM_DOCUMENT_ERROR_INVALID_XML } ArvDomDocumentError; static ArvDomDocument * _parse_memory (ArvDomDocument *document, ArvDomNode *node, const void *buffer, int size, GError **error) { static ArvDomSaxParserState state; state.document = document; if (node != NULL) state.current_node = node; else state.current_node = ARV_DOM_NODE (document); if (size < 0) size = strlen (buffer); if (xmlSAXUserParseMemory (&sax_handler, &state, buffer, size) < 0) { if (state.document != NULL) g_object_unref (state.document); state.document = NULL; arv_warning_dom ("[ArvDomParser::from_memory] Invalid document"); g_set_error (error, ARV_DOM_DOCUMENT_ERROR, ARV_DOM_DOCUMENT_ERROR_INVALID_XML, "Invalid document."); } return state.document; } /** * arv_dom_document_append_from_memory: * @document: a #ArvDomDocument * @node: a #ArvDomNode * @buffer: a memory buffer holding xml data * @size: size of the xml data, in bytes * @error: an error placeholder * * Append a chunk of xml tree to an existing document. The resulting nodes will be appended to * @node, or to @document if @node == NULL. * * Size set to a negative value indicated an unknow xml data size. */ void arv_dom_document_append_from_memory (ArvDomDocument *document, ArvDomNode *node, const void *buffer, int size, GError **error) { g_return_if_fail (ARV_IS_DOM_DOCUMENT (document)); g_return_if_fail (ARV_IS_DOM_NODE (node) || node == NULL); g_return_if_fail (buffer != NULL); _parse_memory (document, node, buffer, size, error); } ArvDomDocument * arv_dom_document_new_from_memory (const void *buffer, int size, GError **error) { g_return_val_if_fail (buffer != NULL, NULL); return _parse_memory (NULL, NULL, buffer, size, error); } static ArvDomDocument * arv_dom_document_new_from_file (GFile *file, GError **error) { ArvDomDocument *document; gsize size = 0; char *contents = NULL; if (!g_file_load_contents (file, NULL, &contents, &size, NULL, error)) return NULL; document = arv_dom_document_new_from_memory (contents, size, error); g_free (contents); return document; } ArvDomDocument * arv_dom_document_new_from_path (const char *path, GError **error) { ArvDomDocument *document; GFile *file; g_return_val_if_fail (path != NULL, NULL); file = g_file_new_for_path (path); document = arv_dom_document_new_from_file (file, error); g_object_unref (file); if (document != NULL) arv_dom_document_set_path (document, path); return document; } ArvDomDocument * arv_dom_document_new_from_url (const char *url, GError **error) { ArvDomDocument *document; GFile *file; g_return_val_if_fail (url != NULL, NULL); file = g_file_new_for_uri (url); document = arv_dom_document_new_from_file (file, error); g_object_unref (file); if (document != NULL) arv_dom_document_set_url (document, url); return document; } void arv_dom_document_save_to_stream (ArvDomDocument *document, GOutputStream *stream, GError **error) { g_return_if_fail (ARV_IS_DOM_DOCUMENT (document)); g_return_if_fail (G_IS_OUTPUT_STREAM (stream)); arv_dom_node_write_to_stream (ARV_DOM_NODE (document), stream, error); } void arv_dom_document_save_to_memory (ArvDomDocument *document, void **buffer, int *size, GError **error) { GOutputStream *stream; if (buffer != NULL) *buffer = NULL; if (size != NULL) *size = 0; g_return_if_fail (document != NULL); g_return_if_fail (buffer != NULL); stream = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); if (stream == NULL) { *buffer = NULL; if (size != NULL) *size = 0; return; } arv_dom_document_save_to_stream (document, G_OUTPUT_STREAM (stream), error); g_output_stream_close (G_OUTPUT_STREAM (stream), NULL, error); if (size != NULL) *size = g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (stream)); *buffer = g_memory_output_stream_steal_data (G_MEMORY_OUTPUT_STREAM (stream)); g_object_unref (stream); } void arv_dom_document_save_to_path (ArvDomDocument *document, const char *path, GError **error) { GFile *file; GFileOutputStream *stream; g_return_if_fail (path != NULL); file = g_file_new_for_path (path); stream = g_file_create (file, G_FILE_CREATE_REPLACE_DESTINATION, NULL, error); if (stream != NULL) { arv_dom_document_save_to_stream (document, G_OUTPUT_STREAM (stream), error); g_object_unref (stream); } g_object_unref (file); } void arv_dom_document_save_to_url (ArvDomDocument *document, const char *path, GError **error) { GFile *file; GFileOutputStream *stream; g_return_if_fail (path != NULL); file = g_file_new_for_uri (path); stream = g_file_create (file, G_FILE_CREATE_REPLACE_DESTINATION, NULL, error); if (stream != NULL) { arv_dom_document_save_to_stream (document, G_OUTPUT_STREAM (stream), error); g_object_unref (stream); } g_object_unref (file); } aravis-ARAVIS_0_6_0/src/arvdomparser.h000066400000000000000000000037621334570641500176760ustar00rootroot00000000000000/* Aravis * * Copyright © 2007-2009 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ #ifndef ARV_DOM_PARSER_H #define ARV_DOM_PARSER_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS void arv_dom_document_append_from_memory (ArvDomDocument *document, ArvDomNode *node, const void *buffer, int size, GError **error); ArvDomDocument * arv_dom_document_new_from_memory (const void *buffer, int size, GError **error); ArvDomDocument * arv_dom_document_new_from_path (const char *path, GError **error); ArvDomDocument * arv_dom_document_new_from_url (const char *url, GError **error); void arv_dom_document_save_to_stream (ArvDomDocument *document, GOutputStream *stream, GError **error); void arv_dom_document_save_to_memory (ArvDomDocument *documennt, void **buffer, int *size, GError **error); void arv_dom_document_save_to_path (ArvDomDocument *documennt, const char *path, GError **error); void arv_dom_document_save_to_url (ArvDomDocument *documennt, const char *path, GError **error); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvdomtext.c000066400000000000000000000037341334570641500173600ustar00rootroot00000000000000/* Aravis * * Copyright © 2007-2008 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ /** * SECTION:arvdomtext * @short_description: Base class for DOM text nodes */ #include /* ArvDomNode implementation */ static const char * arv_dom_text_get_node_name (ArvDomNode *node) { return "#text"; } static const char * arv_dom_text_get_node_value (ArvDomNode *node) { return ARV_DOM_CHARACTER_DATA (node)->data; } static ArvDomNodeType arv_dom_text_get_node_type (ArvDomNode *node) { return ARV_DOM_NODE_TYPE_TEXT_NODE; } /* ArvDomText implementation */ ArvDomNode * arv_dom_text_new (const char *data) { ArvDomNode *node; node = g_object_new (ARV_TYPE_DOM_TEXT, NULL); arv_dom_character_data_set_data (ARV_DOM_CHARACTER_DATA (node), data); return node; } static void arv_dom_text_init (ArvDomText *text_node) { } /* ArvDomText class */ static void arv_dom_text_class_init (ArvDomTextClass *klass) { ArvDomNodeClass *node_class = ARV_DOM_NODE_CLASS (klass); node_class->get_node_name = arv_dom_text_get_node_name; node_class->get_node_value = arv_dom_text_get_node_value; node_class->get_node_type = arv_dom_text_get_node_type; } G_DEFINE_TYPE (ArvDomText, arv_dom_text, ARV_TYPE_DOM_CHARACTER_DATA) aravis-ARAVIS_0_6_0/src/arvdomtext.h000066400000000000000000000036311334570641500173610ustar00rootroot00000000000000/* Aravis * * Copyright © 2007-2008 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ #ifndef ARV_DOM_TEXT_H #define ARV_DOM_TEXT_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS #define ARV_TYPE_DOM_TEXT (arv_dom_text_get_type ()) #define ARV_DOM_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_DOM_TEXT, ArvDomText)) #define ARV_DOM_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_DOM_TEXT, ArvDomTextClass)) #define ARV_IS_DOM_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_DOM_TEXT)) #define ARV_IS_DOM_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_DOM_TEXT)) #define ARV_DOM_TEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_DOM_TEXT, ArvDomTextClass)) typedef struct _ArvDomTextClass ArvDomTextClass; struct _ArvDomText { ArvDomCharacterData character_data; }; struct _ArvDomTextClass { ArvDomCharacterDataClass parent_class; }; GType arv_dom_text_get_type (void); ArvDomNode *arv_dom_text_new (const char *data); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvenums.c000066400000000000000000000036521334570641500170220ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #include static unsigned int _from_string (const char *string, const char **strings, unsigned int n_strings) { unsigned int i; if (string == NULL) return 0; for (i = 0; i < n_strings; i++) if (g_strcmp0 (string, strings[i]) == 0) return i; return 0; } static const char *arv_auto_strings[] = { "Off", "Once", "Continuous" }; const char * arv_auto_to_string (ArvAuto value) { return arv_auto_strings[CLAMP (value, 0, ARV_AUTO_CONTINUOUS)]; } ArvAuto arv_auto_from_string (const char *string) { return _from_string (string, arv_auto_strings, G_N_ELEMENTS (arv_auto_strings)); } static const char *arv_acquisition_mode_strings[] = { "Continuous", "SingleFrame", "MultiFrame" }; const char * arv_acquisition_mode_to_string (ArvAcquisitionMode value) { return arv_acquisition_mode_strings[CLAMP (value, 0, ARV_ACQUISITION_MODE_MULTI_FRAME)]; } ArvAcquisitionMode arv_acquisition_mode_from_string (const char *string) { return _from_string (string, arv_acquisition_mode_strings, G_N_ELEMENTS (arv_acquisition_mode_strings)); } aravis-ARAVIS_0_6_0/src/arvenums.h000066400000000000000000000124431334570641500170250ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_ENUMS_H #define ARV_ENUMS_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef enum { ARV_GC_NAME_SPACE_STANDARD, ARV_GC_NAME_SPACE_CUSTOM } ArvGcNameSpace; typedef enum { ARV_GC_ACCESS_MODE_RO, ARV_GC_ACCESS_MODE_WO, ARV_GC_ACCESS_MODE_RW } ArvGcAccessMode; typedef enum { ARV_GC_CACHABLE_NO_CACHE, ARV_GC_CACHABLE_WRITE_TRHOUGH, ARV_GC_CACHABLE_WRITE_AROUND } ArvGcCachable; typedef enum { ARV_GC_SIGNEDNESS_SIGNED, ARV_GC_SIGNEDNESS_UNSIGNED } ArvGcSignedness; /** * ArvAuto: * @ARV_AUTO_OFF: manual setting * @ARV_AUTO_ONCE: automatic setting done once, then returns to manual * @ARV_AUTO_CONTINUOUS: setting is adjusted continuously */ typedef enum { ARV_AUTO_OFF, ARV_AUTO_ONCE, ARV_AUTO_CONTINUOUS } ArvAuto; const char * arv_auto_to_string (ArvAuto value); ArvAuto arv_auto_from_string (const char *string); /** * ArvAcquisitionMode: * @ARV_ACQUISITION_MODE_CONTINUOUS: continuous acquisition * @ARV_ACQUISITION_MODE_SINGLE_FRAME: only one frame will be acquired * @ARV_ACQUISITION_MODE_MULTI_FRAME: multiple frames will be acquired */ typedef enum { ARV_ACQUISITION_MODE_CONTINUOUS, ARV_ACQUISITION_MODE_SINGLE_FRAME, ARV_ACQUISITION_MODE_MULTI_FRAME } ArvAcquisitionMode; const char * arv_acquisition_mode_to_string (ArvAcquisitionMode value); ArvAcquisitionMode arv_acquisition_mode_from_string (const char *string); typedef guint32 ArvPixelFormat; #define ARV_PIXEL_FORMAT_BIT_PER_PIXEL(pixel_format) (((pixel_format) >> 16) & 0xff) /* Grey pixel formats */ #define ARV_PIXEL_FORMAT_MONO_8 0x01080001 #define ARV_PIXEL_FORMAT_MONO_8_SIGNED 0x01080002 #define ARV_PIXEL_FORMAT_MONO_10 0x01100003 #define ARV_PIXEL_FORMAT_MONO_10_PACKED 0x010c0004 #define ARV_PIXEL_FORMAT_MONO_12 0x01100005 #define ARV_PIXEL_FORMAT_MONO_12_PACKED 0x010c0006 #define ARV_PIXEL_FORMAT_MONO_14 0x01100025 /* https://bugzilla.gnome.org/show_bug.cgi?id=655131 */ #define ARV_PIXEL_FORMAT_MONO_16 0x01100007 #define ARV_PIXEL_FORMAT_BAYER_GR_8 0x01080008 #define ARV_PIXEL_FORMAT_BAYER_RG_8 0x01080009 #define ARV_PIXEL_FORMAT_BAYER_GB_8 0x0108000a #define ARV_PIXEL_FORMAT_BAYER_BG_8 0x0108000b #define ARV_PIXEL_FORMAT_BAYER_GR_10 0x0110000c #define ARV_PIXEL_FORMAT_BAYER_RG_10 0x0110000d #define ARV_PIXEL_FORMAT_BAYER_GB_10 0x0110000e #define ARV_PIXEL_FORMAT_BAYER_BG_10 0x0110000f #define ARV_PIXEL_FORMAT_BAYER_GR_12 0x01100010 #define ARV_PIXEL_FORMAT_BAYER_RG_12 0x01100011 #define ARV_PIXEL_FORMAT_BAYER_GB_12 0x01100012 #define ARV_PIXEL_FORMAT_BAYER_BG_12 0x01100013 #define ARV_PIXEL_FORMAT_BAYER_GR_12_PACKED 0x010c002a #define ARV_PIXEL_FORMAT_BAYER_RG_12_PACKED 0x010c002b #define ARV_PIXEL_FORMAT_BAYER_GB_12_PACKED 0x010c002c #define ARV_PIXEL_FORMAT_BAYER_BG_12_PACKED 0x010c002d #define ARV_PIXEL_FORMAT_BAYER_GR_16 0x0110002e #define ARV_PIXEL_FORMAT_BAYER_RG_16 0x0110002f #define ARV_PIXEL_FORMAT_BAYER_GB_16 0x01100030 #define ARV_PIXEL_FORMAT_BAYER_BG_16 0x01100031 /* Color pixel formats */ #define ARV_PIXEL_FORMAT_RGB_8_PACKED 0x02180014 #define ARV_PIXEL_FORMAT_BGR_8_PACKED 0x02180015 #define ARV_PIXEL_FORMAT_RGBA_8_PACKED 0x02200016 #define ARV_PIXEL_FORMAT_BGRA_8_PACKED 0x02200017 #define ARV_PIXEL_FORMAT_RGB_10_PACKED 0x02300018 #define ARV_PIXEL_FORMAT_BGR_10_PACKED 0x02300019 #define ARV_PIXEL_FORMAT_RGB_12_PACKED 0x0230001a #define ARV_PIXEL_FORMAT_BGR_12_PACKED 0x0230001b #define ARV_PIXEL_FORMAT_YUV_411_PACKED 0x020c001e #define ARV_PIXEL_FORMAT_YUV_422_PACKED 0x0210001f #define ARV_PIXEL_FORMAT_YUV_444_PACKED 0x02180020 #define ARV_PIXEL_FORMAT_RGB_8_PLANAR 0x02180021 #define ARV_PIXEL_FORMAT_RGB_10_PLANAR 0x02300022 #define ARV_PIXEL_FORMAT_RGB_12_PLANAR 0x02300023 #define ARV_PIXEL_FORMAT_RGB_16_PLANAR 0x02300024 #define ARV_PIXEL_FORMAT_YUV_422_YUYV_PACKED 0x02100032 /* Custom */ #define ARV_PIXEL_FORMAT_CUSTOM_BAYER_GR_12_PACKED 0x810c0001 #define ARV_PIXEL_FORMAT_CUSTOM_BAYER_RG_12_PACKED 0x810c0002 #define ARV_PIXEL_FORMAT_CUSTOM_BAYER_GB_12_PACKED 0x810c0003 #define ARV_PIXEL_FORMAT_CUSTOM_BAYER_BG_12_PACKED 0x810c0004 #define ARV_PIXEL_FORMAT_CUSTOM_YUV_422_YUYV_PACKED 0x82100005 #define ARV_PIXEL_FORMAT_CUSTOM_BAYER_GR_16 0x81100006 #define ARV_PIXEL_FORMAT_CUSTOM_BAYER_RG_16 0x81100007 #define ARV_PIXEL_FORMAT_CUSTOM_BAYER_GB_16 0x81100008 #define ARV_PIXEL_FORMAT_CUSTOM_BAYER_BG_16 0x81100009 G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvenumtypes.c.template000066400000000000000000000012441334570641500215310ustar00rootroot00000000000000/*** BEGIN file-header ***/ #include "arvenumtypes.h" /*** END file-header ***/ /*** BEGIN file-production ***/ #include "@filename@" /*** END file-production ***/ /*** BEGIN value-header ***/ GType @enum_name@_get_type (void) { static GType the_type = 0; if (the_type == 0) { static const G@Type@Value values[] = { /*** END value-header ***/ /*** BEGIN value-production ***/ { @VALUENAME@, "@VALUENAME@", "@valuenick@" }, /*** END value-production ***/ /*** BEGIN value-tail ***/ { 0, NULL, NULL } }; the_type = g_@type@_register_static ( g_intern_static_string ("@EnumName@"), values); } return the_type; } /*** END value-tail ***/ aravis-ARAVIS_0_6_0/src/arvenumtypes.h.template000066400000000000000000000011761334570641500215420ustar00rootroot00000000000000/*** BEGIN file-header ***/ #ifndef ARV_ENUM_TYPES_H #define ARV_ENUM_TYPES_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS /*** END file-header ***/ /*** BEGIN file-production ***/ /* Enumerations from "@filename@" */ /*** END file-production ***/ /*** BEGIN enumeration-production ***/ #define ARV_TYPE_@ENUMSHORT@ (@enum_name@_get_type()) GType @enum_name@_get_type (void) G_GNUC_CONST; /*** END enumeration-production ***/ /*** BEGIN file-tail ***/ G_END_DECLS #endif /* ARV_ENUM_TYPES_H */ /*** END file-tail ***/ aravis-ARAVIS_0_6_0/src/arvevaluator.c000066400000000000000000001503651334570641500177010ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvevaluator * @short_description: A math expression evaluator with Genicam syntax */ #include #include #include #include #include #include #define ARV_EVALUATOR_STACK_SIZE 128 static GObjectClass *parent_class = NULL; typedef enum { ARV_EVALUATOR_STATUS_SUCCESS, ARV_EVALUATOR_STATUS_NOT_PARSED, ARV_EVALUATOR_STATUS_EMPTY_EXPRESSION, ARV_EVALUATOR_STATUS_PARENTHESES_MISMATCH, ARV_EVALUATOR_STATUS_SYNTAX_ERROR, ARV_EVALUATOR_STATUS_UNKNOWN_OPERATOR, ARV_EVALUATOR_STATUS_UNKNOWN_VARIABLE, ARV_EVALUATOR_STATUS_UNKNOWN_SUB_EXPRESSION, ARV_EVALUATOR_STATUS_UNKNOWN_CONSTANT, ARV_EVALUATOR_STATUS_MISSING_ARGUMENTS, ARV_EVALUATOR_STATUS_REMAINING_OPERANDS, ARV_EVALUATOR_STATUS_DIVISION_BY_ZERO, ARV_EVALUATOR_STATUS_STACK_OVERFLOW, ARV_EVALUATOR_STATUS_INVALID_DOUBLE_FUNCTION, ARV_EVALUATOR_STATUS_FORBIDDEN_RECUSRION } ArvEvaluatorStatus; static const char *arv_evaluator_status_strings[] = { "success", "not parsed", "empty expression", "parentheses mismatch", "syntax error", "unknown operator", "unknown variable", "unknown subexpression", "unknown constant", "missing arguments", "remaining operands", "division by zero", "stack overflow", "invalid double function", "forbidden recursion" }; struct _ArvEvaluatorPrivate { char *expression; GSList *rpn_stack; ArvEvaluatorStatus parsing_status; GHashTable *variables; GHashTable *sub_expressions; GHashTable *constants; }; typedef enum { ARV_EVALUATOR_TOKEN_UNKNOWN, ARV_EVALUATOR_TOKEN_COMMA, ARV_EVALUATOR_TOKEN_TERNARY_QUESTION_MARK, ARV_EVALUATOR_TOKEN_TERNARY_COLON, ARV_EVALUATOR_TOKEN_LOGICAL_OR, ARV_EVALUATOR_TOKEN_LOGICAL_AND, ARV_EVALUATOR_TOKEN_BITWISE_OR, ARV_EVALUATOR_TOKEN_BITWISE_XOR, ARV_EVALUATOR_TOKEN_BITWISE_AND, ARV_EVALUATOR_TOKEN_EQUAL, ARV_EVALUATOR_TOKEN_NOT_EQUAL, ARV_EVALUATOR_TOKEN_LESS_OR_EQUAL, ARV_EVALUATOR_TOKEN_GREATER_OR_EQUAL, ARV_EVALUATOR_TOKEN_LESS, ARV_EVALUATOR_TOKEN_GREATER, ARV_EVALUATOR_TOKEN_SHIFT_RIGHT, ARV_EVALUATOR_TOKEN_SHIFT_LEFT, ARV_EVALUATOR_TOKEN_SUBSTRACTION, ARV_EVALUATOR_TOKEN_ADDITION, ARV_EVALUATOR_TOKEN_REMAINDER, ARV_EVALUATOR_TOKEN_DIVISION, ARV_EVALUATOR_TOKEN_MULTIPLICATION, ARV_EVALUATOR_TOKEN_POWER, ARV_EVALUATOR_TOKEN_MINUS, ARV_EVALUATOR_TOKEN_PLUS, ARV_EVALUATOR_TOKEN_BITWISE_NOT, ARV_EVALUATOR_TOKEN_FUNCTION_SIN, ARV_EVALUATOR_TOKEN_FUNCTION_COS, ARV_EVALUATOR_TOKEN_FUNCTION_SGN, ARV_EVALUATOR_TOKEN_FUNCTION_NEG, ARV_EVALUATOR_TOKEN_FUNCTION_ATAN, ARV_EVALUATOR_TOKEN_FUNCTION_TAN, ARV_EVALUATOR_TOKEN_FUNCTION_ABS, ARV_EVALUATOR_TOKEN_FUNCTION_EXP, ARV_EVALUATOR_TOKEN_FUNCTION_LN, ARV_EVALUATOR_TOKEN_FUNCTION_LG, ARV_EVALUATOR_TOKEN_FUNCTION_SQRT, ARV_EVALUATOR_TOKEN_FUNCTION_TRUNC, ARV_EVALUATOR_TOKEN_FUNCTION_ROUND, ARV_EVALUATOR_TOKEN_FUNCTION_FLOOR, ARV_EVALUATOR_TOKEN_FUNCTION_CEIL, ARV_EVALUATOR_TOKEN_FUNCTION_ASIN, ARV_EVALUATOR_TOKEN_FUNCTION_ACOS, ARV_EVALUATOR_TOKEN_RIGHT_PARENTHESIS, ARV_EVALUATOR_TOKEN_LEFT_PARENTHESIS, ARV_EVALUATOR_TOKEN_CONSTANT_INT64, ARV_EVALUATOR_TOKEN_CONSTANT_DOUBLE, ARV_EVALUATOR_TOKEN_VARIABLE } ArvEvaluatorTokenId; typedef enum { ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_LEFT_TO_RIGHT, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_RIGHT_TO_LEFT } ArvEvaluatorTokenAssociativity; typedef struct { const char * tag; int precedence; gboolean double_only; int n_args; ArvEvaluatorTokenAssociativity associativity; } ArvEvaluatorTokenInfos; static ArvEvaluatorTokenInfos arv_evaluator_token_infos[] = { {"", 0, FALSE, 1, 0}, /* UNKNOWN */ {",", 0, FALSE, 0, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_LEFT_TO_RIGHT}, /* COMMA */ {"?", 5, FALSE, 3, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_RIGHT_TO_LEFT}, /* TERNARY_QUESTION_MARK */ {":", 5, FALSE, 1, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_RIGHT_TO_LEFT}, /* TERNARY_COLON */ {"||", 10, FALSE, 2, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_LEFT_TO_RIGHT}, /* LOGICAL_OR */ {"&&", 20, FALSE, 2, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_LEFT_TO_RIGHT}, /* LOGICAL_AND */ {"|", 40, FALSE, 2, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_LEFT_TO_RIGHT}, /* BITWISE_OR */ {"^", 50, FALSE, 2, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_LEFT_TO_RIGHT}, /* BITWISE_XOR */ {"&", 60, FALSE, 2, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_LEFT_TO_RIGHT}, /* BITWISE_AND */ {"=", 70, FALSE, 2, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_LEFT_TO_RIGHT}, /* EQUAL, */ {"<>", 70, FALSE, 2, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_LEFT_TO_RIGHT}, /* NOT_EQUAL */ {"<=", 80, FALSE, 2, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_LEFT_TO_RIGHT}, /* LESS_OR_EQUAL */ {">=", 80, FALSE, 2, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_LEFT_TO_RIGHT}, /* GREATER_OR_EQUAL */ {"<", 80, FALSE, 2, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_LEFT_TO_RIGHT}, /* LESS */ {">", 80, FALSE, 2, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_LEFT_TO_RIGHT}, /* GREATER */ {">>", 90, FALSE, 2, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_LEFT_TO_RIGHT}, /* SHIFT_RIGHT */ {"<<", 90, FALSE, 2, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_LEFT_TO_RIGHT}, /* SHIFT_LEFT */ {"-", 100, FALSE, 2, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_LEFT_TO_RIGHT}, /* SUBSTRACTION */ {"+", 100, FALSE, 2, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_LEFT_TO_RIGHT}, /* ADDITION */ {"%", 110, FALSE, 2, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_LEFT_TO_RIGHT}, /* REMAINDER */ {"/", 110, FALSE, 2, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_LEFT_TO_RIGHT}, /* DIVISION */ {"*", 110, FALSE, 2, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_LEFT_TO_RIGHT}, /* MULTIPLICATION */ {"**", 120, FALSE, 2, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_RIGHT_TO_LEFT}, /* POWER */ {"minus", 130, FALSE, 1, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_RIGHT_TO_LEFT}, /* MINUS */ {"plus", 130, FALSE, 1, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_RIGHT_TO_LEFT}, /* PLUS */ {"~", 130, FALSE, 1, ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_RIGHT_TO_LEFT}, /* BITWISE_NOT */ {"sin", 200, TRUE, 1, 0}, /* FUNCTION_SIN */ {"cos", 200, TRUE, 1, 0}, /* FUNCTION_COS */ {"sgn", 200, FALSE, 1, 0}, /* FUNCTION_SGN */ {"neg", 200, FALSE, 1, 0}, /* FUNCTION_NEG */ {"atan", 200, TRUE, 1, 0}, /* FUNCTION_ATAN */ {"tan" , 200, TRUE, 1, 0}, /* FUNCTION_TAN */ {"abs" , 200, TRUE, 1, 0}, /* FUNCTION_ABS */ {"exp" , 200, TRUE, 1, 0}, /* FUNCTION_EXP */ {"ln", 200, TRUE, 1, 0}, /* FUNCTION_LN */ {"lg", 200, TRUE, 1, 0}, /* FUNCTION_LG */ {"sqrt", 200, TRUE, 1, 0}, /* FUNCTION_SQRT */ {"trunc", 200, TRUE, 1, 0}, /* FUNCTION_TRUNC */ {"round", 200, TRUE, 1, 0}, /* FUNCTION_ROUND */ {"floor", 200, TRUE, 1, 0}, /* FUNCTION_FLOOR */ {"ceil", 200, TRUE, 1, 0}, /* FUNCTION_CEIL */ {"asin", 200, TRUE, 1, 0}, /* FUNCTION_ASIN */ {"acos", 200, TRUE, 1, 0}, /* FUNCTION_ACOS */ {")", 990, FALSE, 0, 0}, /* RIGHT_PARENTHESIS */ {"(", -1, FALSE, 0, 0}, /* LEFT_PARENTHESIS */ {"int64", 200, FALSE, 0, 0}, /* CONSTANT_INT64 */ {"double", 200, FALSE, 0, 0}, /* CONSTANT_DOUBLE */ {"var", 200, FALSE, 0, 0}, /* VARIABLE */ }; typedef struct { ArvEvaluatorTokenId token_id; gint32 parenthesis_level; union { double v_double; gint64 v_int64; char * name; } data; } ArvEvaluatorToken; typedef struct { gint32 parenthesis_level; ArvValue value; } ArvEvaluatorValuesStackItem; static ArvEvaluatorToken * arv_evaluator_token_new (ArvEvaluatorTokenId token_id) { ArvEvaluatorToken *token = g_new0 (ArvEvaluatorToken, 1); token->token_id = token_id; return token; } static ArvEvaluatorToken * arv_evaluator_token_new_double (double v_double) { ArvEvaluatorToken *token = arv_evaluator_token_new (ARV_EVALUATOR_TOKEN_CONSTANT_DOUBLE); token->data.v_double = v_double; return token; } static ArvEvaluatorToken * arv_evaluator_token_new_int64 (double v_int64) { ArvEvaluatorToken *token = arv_evaluator_token_new (ARV_EVALUATOR_TOKEN_CONSTANT_INT64); token->data.v_int64 = v_int64; return token; } static ArvEvaluatorToken * arv_evaluator_token_new_variable (const char *name) { ArvEvaluatorToken *token = arv_evaluator_token_new (ARV_EVALUATOR_TOKEN_VARIABLE); token->data.name = g_strdup (name); return token; } static void arv_evaluator_token_free (ArvEvaluatorToken *token) { if (token == NULL) return; if (token->token_id == ARV_EVALUATOR_TOKEN_VARIABLE) g_free (token->data.name); g_free (token); } static void arv_evaluator_token_debug (ArvEvaluatorToken *token, GHashTable *variables) { ArvValue *value; g_return_if_fail (token != NULL); switch (token->token_id) { case ARV_EVALUATOR_TOKEN_VARIABLE: value = g_hash_table_lookup (variables, token->data.name); arv_log_evaluator ("(var) %s = %g%s", token->data.name, value != NULL ? arv_value_get_double (value) : 0, value != NULL ? "" : " not found"); break; case ARV_EVALUATOR_TOKEN_CONSTANT_INT64: arv_log_evaluator ("(int64) %Ld", token->data.v_int64); break; case ARV_EVALUATOR_TOKEN_CONSTANT_DOUBLE: arv_log_evaluator ("(double) %g", token->data.v_double); break; default: arv_log_evaluator ("(operator) %s", arv_evaluator_token_infos[token->token_id].tag); } } static gboolean arv_evaluator_token_is_variable (ArvEvaluatorToken *token) { return (token != NULL && token->token_id == ARV_EVALUATOR_TOKEN_VARIABLE); } static gboolean arv_evaluator_token_is_operand (ArvEvaluatorToken *token) { return (token != NULL && token->token_id > ARV_EVALUATOR_TOKEN_LEFT_PARENTHESIS); } static gboolean arv_evaluator_token_is_operator (ArvEvaluatorToken *token) { return (token != NULL && token->token_id > ARV_EVALUATOR_TOKEN_UNKNOWN && token->token_id < ARV_EVALUATOR_TOKEN_RIGHT_PARENTHESIS); } static gboolean arv_evaluator_token_is_comma (ArvEvaluatorToken *token) { return (token != NULL && token->token_id == ARV_EVALUATOR_TOKEN_COMMA); } static gboolean arv_evaluator_token_is_left_parenthesis (ArvEvaluatorToken *token) { return (token != NULL && token->token_id == ARV_EVALUATOR_TOKEN_LEFT_PARENTHESIS); } static gboolean arv_evaluator_token_is_right_parenthesis (ArvEvaluatorToken *token) { return (token != NULL && token->token_id == ARV_EVALUATOR_TOKEN_RIGHT_PARENTHESIS); } static gboolean arv_evaluator_token_compare_precedence (ArvEvaluatorToken *a, ArvEvaluatorToken *b) { gint a_precedence; gint b_precedence; ArvEvaluatorTokenAssociativity a_associativity; if (a == NULL || b == NULL || a->token_id >= G_N_ELEMENTS (arv_evaluator_token_infos) || b->token_id >= G_N_ELEMENTS (arv_evaluator_token_infos)) return FALSE; a_precedence = arv_evaluator_token_infos[a->token_id].precedence; b_precedence = arv_evaluator_token_infos[b->token_id].precedence; a_associativity = arv_evaluator_token_infos[a->token_id].associativity; return (((a_precedence <= b_precedence) && a_associativity == ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_LEFT_TO_RIGHT) || ((a_precedence < b_precedence) && a_associativity == ARV_EVALUATOR_TOKEN_ASSOCIATIVITY_RIGHT_TO_LEFT)); } static ArvEvaluatorToken * arv_get_next_token (char **expression, gboolean previous_token_was_operand, gboolean previous_token_was_right_parenthesis) { ArvEvaluatorToken *token = NULL; ArvEvaluatorTokenId token_id = ARV_EVALUATOR_TOKEN_UNKNOWN; g_return_val_if_fail (expression != NULL && *expression != NULL, NULL); arv_str_skip_spaces (expression); if (**expression == '\0') return NULL; if (g_ascii_isdigit (**expression)) { char *end; gint64 v_int64; double v_double; ptrdiff_t length_int64; ptrdiff_t length_double; v_int64 = g_ascii_strtoll (*expression, &end, 0); length_int64 = end - *expression; end = *expression; arv_str_parse_double (&end, &v_double); length_double = end - *expression; if (length_double > 0 || length_int64 > 0) { if (length_double > length_int64) { token = arv_evaluator_token_new_double (v_double); *expression += length_double; } else { token = arv_evaluator_token_new_int64 (v_int64); *expression += length_int64; } } } else if (g_ascii_isalpha (**expression) || **expression=='_') { char *end = *expression; ptrdiff_t token_length; while (g_ascii_isalnum (*end) || *end == '_') end++; token_length = end - *expression; if (token_length == 2) { if (g_ascii_strncasecmp ("ln", *expression, token_length) == 0) token_id = ARV_EVALUATOR_TOKEN_FUNCTION_LN; else if (g_ascii_strncasecmp ("lg", *expression, token_length) == 0) token_id = ARV_EVALUATOR_TOKEN_FUNCTION_LG; } else if (token_length == 3) { if (g_ascii_strncasecmp ("sin", *expression, token_length) == 0) token_id = ARV_EVALUATOR_TOKEN_FUNCTION_SIN; else if (g_ascii_strncasecmp ("cos", *expression, token_length) == 0) token_id = ARV_EVALUATOR_TOKEN_FUNCTION_COS; else if (g_ascii_strncasecmp ("sgn", *expression, token_length) == 0) token_id = ARV_EVALUATOR_TOKEN_FUNCTION_SGN; else if (g_ascii_strncasecmp ("neg", *expression, token_length) == 0) token_id = ARV_EVALUATOR_TOKEN_FUNCTION_NEG; else if (g_ascii_strncasecmp ("tan", *expression, token_length) == 0) token_id = ARV_EVALUATOR_TOKEN_FUNCTION_TAN; else if (g_ascii_strncasecmp ("abs", *expression, token_length) == 0) token_id = ARV_EVALUATOR_TOKEN_FUNCTION_ABS; else if (g_ascii_strncasecmp ("exp", *expression, token_length) == 0) token_id = ARV_EVALUATOR_TOKEN_FUNCTION_EXP; } else if (token_length == 4) { if (g_ascii_strncasecmp ("atan", *expression, token_length) == 0) token_id = ARV_EVALUATOR_TOKEN_FUNCTION_ATAN; else if (g_ascii_strncasecmp ("sqrt", *expression, token_length) == 0) token_id = ARV_EVALUATOR_TOKEN_FUNCTION_SQRT; else if (g_ascii_strncasecmp ("ceil", *expression, token_length) == 0) token_id = ARV_EVALUATOR_TOKEN_FUNCTION_CEIL; else if (g_ascii_strncasecmp ("asin", *expression, token_length) == 0) token_id = ARV_EVALUATOR_TOKEN_FUNCTION_ASIN; else if (g_ascii_strncasecmp ("acos", *expression, token_length) == 0) token_id = ARV_EVALUATOR_TOKEN_FUNCTION_ACOS; } else if (token_length == 5) { if (g_ascii_strncasecmp ("trunc", *expression, token_length) == 0) token_id = ARV_EVALUATOR_TOKEN_FUNCTION_TRUNC; else if (g_ascii_strncasecmp ("round", *expression, token_length) == 0) token_id = ARV_EVALUATOR_TOKEN_FUNCTION_ROUND; else if (g_ascii_strncasecmp ("floor", *expression, token_length) == 0) token_id = ARV_EVALUATOR_TOKEN_FUNCTION_FLOOR; } if (token_id != ARV_EVALUATOR_TOKEN_UNKNOWN) token = arv_evaluator_token_new (token_id); else { char *name = g_strndup (*expression, token_length); token = arv_evaluator_token_new_variable (name); g_free (name); } *expression = end; } else { switch (**expression) { case '(': token_id = ARV_EVALUATOR_TOKEN_LEFT_PARENTHESIS; break; case ')': token_id = ARV_EVALUATOR_TOKEN_RIGHT_PARENTHESIS; break; case ',': token_id = ARV_EVALUATOR_TOKEN_COMMA; break; case '?': token_id = ARV_EVALUATOR_TOKEN_TERNARY_QUESTION_MARK; break; case ':': token_id = ARV_EVALUATOR_TOKEN_TERNARY_COLON; break; case '+': if (previous_token_was_operand || previous_token_was_right_parenthesis) token_id = ARV_EVALUATOR_TOKEN_ADDITION; else token_id = ARV_EVALUATOR_TOKEN_PLUS; break; case '-': if (previous_token_was_operand || previous_token_was_right_parenthesis) token_id = ARV_EVALUATOR_TOKEN_SUBSTRACTION; else token_id = ARV_EVALUATOR_TOKEN_MINUS; break; case '*': if ((*expression)[1] == '*') { (*expression)++; token_id = ARV_EVALUATOR_TOKEN_POWER; } else token_id = ARV_EVALUATOR_TOKEN_MULTIPLICATION; break; case '/': token_id = ARV_EVALUATOR_TOKEN_DIVISION; break; case '%': token_id = ARV_EVALUATOR_TOKEN_REMAINDER; break; case '&': if ((*expression)[1] == '&') { (*expression)++; token_id = ARV_EVALUATOR_TOKEN_LOGICAL_AND; } else token_id = ARV_EVALUATOR_TOKEN_BITWISE_AND; break; case '|': if ((*expression)[1] == '|') { (*expression)++; token_id = ARV_EVALUATOR_TOKEN_LOGICAL_OR; } else token_id = ARV_EVALUATOR_TOKEN_BITWISE_OR; break; case '^': token_id = ARV_EVALUATOR_TOKEN_BITWISE_XOR; break; case '~': token_id = ARV_EVALUATOR_TOKEN_BITWISE_NOT; break; case '<': if ((*expression)[1] == '>') { (*expression)++; token_id = ARV_EVALUATOR_TOKEN_NOT_EQUAL; } else if ((*expression)[1] == '<') { (*expression)++; token_id = ARV_EVALUATOR_TOKEN_SHIFT_LEFT; } else if ((*expression)[1] == '=') { (*expression)++; token_id = ARV_EVALUATOR_TOKEN_LESS_OR_EQUAL; } else token_id = ARV_EVALUATOR_TOKEN_LESS; break; case '>': if ((*expression)[1] == '>') { (*expression)++; token_id = ARV_EVALUATOR_TOKEN_SHIFT_RIGHT; } else if ((*expression)[1] == '=') { (*expression)++; token_id = ARV_EVALUATOR_TOKEN_GREATER_OR_EQUAL; } else token_id = ARV_EVALUATOR_TOKEN_GREATER; break; case '=': token_id = ARV_EVALUATOR_TOKEN_EQUAL; break; } if (token_id != ARV_EVALUATOR_TOKEN_UNKNOWN) { (*expression)++; token = arv_evaluator_token_new (token_id); } } return token; } static double round_with_precision (double x, gint64 precision) { double pow_multiplier = pow(10, precision); return (round (x*pow_multiplier))/pow_multiplier; } static int get_arguments_count(ArvEvaluatorValuesStackItem * stack, int current_index) { int arguments_count = 0; int index = current_index; int parenthesis_level = stack[index].parenthesis_level; while ((index>=0) && (stack[index].parenthesis_level>=parenthesis_level)){ index--; arguments_count++; } return arguments_count; } static ArvEvaluatorStatus evaluate (GSList *token_stack, GHashTable *variables, gint64 *v_int64, double *v_double) { ArvEvaluatorToken *token; ArvEvaluatorStatus status; GSList *iter; ArvEvaluatorValuesStackItem stack[ARV_EVALUATOR_STACK_SIZE]; ArvValue *value; int index = -1; gboolean integer_mode; g_assert (v_int64 != NULL || v_double != NULL); integer_mode = v_int64 != NULL; for (iter = token_stack; iter != NULL; iter = iter->next) { token = iter->data; if (index < (arv_evaluator_token_infos[token->token_id].n_args - 1)) { status = ARV_EVALUATOR_STATUS_MISSING_ARGUMENTS; goto CLEANUP; } if (arv_evaluator_token_infos[token->token_id].double_only && integer_mode) { status = ARV_EVALUATOR_STATUS_INVALID_DOUBLE_FUNCTION; goto CLEANUP; } if (index >= ARV_EVALUATOR_STACK_SIZE - 1) { status = ARV_EVALUATOR_STATUS_STACK_OVERFLOW; goto CLEANUP; } arv_evaluator_token_debug (token, variables); int actual_arguments_count = arv_evaluator_token_infos[token->token_id].n_args; switch (token->token_id) { case ARV_EVALUATOR_TOKEN_LOGICAL_AND: arv_value_set_int64 (&stack[index-1].value, arv_value_get_int64 (&stack[index-1].value) && arv_value_get_int64 (&stack[index].value)); stack[index-1].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_LOGICAL_OR: arv_value_set_int64 (&stack[index-1].value, arv_value_get_int64 (&stack[index-1].value) || arv_value_get_int64 (&stack[index].value)); stack[index-1].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_BITWISE_NOT: arv_value_set_int64 (&stack[index].value, ~arv_value_get_int64 (&stack[index].value)); stack[index].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_BITWISE_AND: arv_value_set_int64 (&stack[index-1].value, arv_value_get_int64 (&stack[index-1].value) & arv_value_get_int64 (&stack[index].value)); stack[index-1].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_BITWISE_OR: arv_value_set_int64 (&stack[index-1].value, arv_value_get_int64 (&stack[index-1].value) | arv_value_get_int64 (&stack[index].value)); stack[index-1].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_BITWISE_XOR: arv_value_set_int64 (&stack[index-1].value, arv_value_get_int64 (&stack[index-1].value) ^ arv_value_get_int64 (&stack[index].value)); stack[index-1].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_EQUAL: if (integer_mode || (arv_value_holds_int64 (&stack[index-1].value) && arv_value_holds_int64 (&stack[index].value))) arv_value_set_int64 (&stack[index-1].value, arv_value_get_int64 (&stack[index-1].value) == arv_value_get_int64 (&stack[index].value)); else arv_value_set_int64 (&stack[index - 1].value, arv_value_get_double (&stack[index-1].value) == arv_value_get_double (&stack[index].value)); stack[index-1].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_NOT_EQUAL: if (integer_mode || (arv_value_holds_int64 (&stack[index-1].value) && arv_value_holds_int64 (&stack[index].value))) arv_value_set_int64 (&stack[index-1].value, arv_value_get_int64 (&stack[index-1].value) != arv_value_get_int64 (&stack[index].value)); else arv_value_set_int64 (&stack[index - 1].value, arv_value_get_double (&stack[index-1].value) != arv_value_get_double (&stack[index].value)); stack[index-1].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_LESS_OR_EQUAL: if (integer_mode || (arv_value_holds_int64 (&stack[index-1].value) && arv_value_holds_int64 (&stack[index].value))) arv_value_set_int64 (&stack[index-1].value, arv_value_get_int64 (&stack[index-1].value) <= arv_value_get_int64 (&stack[index].value)); else arv_value_set_int64 (&stack[index - 1].value, arv_value_get_double (&stack[index-1].value) <= arv_value_get_double (&stack[index].value)); stack[index-1].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_GREATER_OR_EQUAL: if (integer_mode || (arv_value_holds_int64 (&stack[index-1].value) && arv_value_holds_int64 (&stack[index].value))) arv_value_set_int64 (&stack[index-1].value, arv_value_get_int64 (&stack[index-1].value) >= arv_value_get_int64 (&stack[index].value)); else arv_value_set_int64 (&stack[index - 1].value, arv_value_get_double (&stack[index-1].value) >= arv_value_get_double (&stack[index].value)); stack[index-1].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_LESS: if (integer_mode || (arv_value_holds_int64 (&stack[index-1].value) && arv_value_holds_int64 (&stack[index].value))) arv_value_set_int64 (&stack[index-1].value, arv_value_get_int64 (&stack[index-1].value) < arv_value_get_int64 (&stack[index].value)); else arv_value_set_int64 (&stack[index - 1].value, arv_value_get_double (&stack[index-1].value) < arv_value_get_double (&stack[index].value)); stack[index-1].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_GREATER: if (integer_mode || (arv_value_holds_int64 (&stack[index-1].value) && arv_value_holds_int64 (&stack[index].value))) arv_value_set_int64 (&stack[index-1].value, arv_value_get_int64 (&stack[index-1].value) > arv_value_get_int64 (&stack[index].value)); else arv_value_set_int64 (&stack[index - 1].value, arv_value_get_double (&stack[index-1].value) > arv_value_get_double (&stack[index].value)); stack[index-1].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_SHIFT_RIGHT: arv_value_set_int64 (&stack[index-1].value, arv_value_get_int64 (&stack[index-1].value) >> arv_value_get_int64 (&stack[index].value)); stack[index-1].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_SHIFT_LEFT: arv_value_set_int64 (&stack[index-1].value, arv_value_get_int64 (&stack[index-1].value) << arv_value_get_int64 (&stack[index].value)); stack[index-1].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_SUBSTRACTION: if (integer_mode || (arv_value_holds_int64 (&stack[index-1].value) && arv_value_holds_int64 (&stack[index].value))) arv_value_set_int64 (&stack[index-1].value, arv_value_get_int64 (&stack[index-1].value) - arv_value_get_int64 (&stack[index].value)); else arv_value_set_double (&stack[index-1].value, arv_value_get_double (&stack[index-1].value) - arv_value_get_double (&stack[index].value)); stack[index-1].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_ADDITION: if (integer_mode || (arv_value_holds_int64 (&stack[index-1].value) && arv_value_holds_int64 (&stack[index].value))) arv_value_set_int64 (&stack[index-1].value, arv_value_get_int64 (&stack[index-1].value) + arv_value_get_int64 (&stack[index].value)); else arv_value_set_double (&stack[index-1].value, arv_value_get_double (&stack[index-1].value) + arv_value_get_double (&stack[index].value)); stack[index-1].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_REMAINDER: if (arv_value_get_int64 (&stack[index].value) == 0) { status = ARV_EVALUATOR_STATUS_DIVISION_BY_ZERO; goto CLEANUP; } arv_value_set_int64 (&stack[index-1].value, arv_value_get_int64 (&stack[index-1].value) % arv_value_get_int64 (&stack[index].value)); stack[index-1].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_DIVISION: if (integer_mode) { if (arv_value_get_int64 (&stack[index].value) == 0) { status = ARV_EVALUATOR_STATUS_DIVISION_BY_ZERO; goto CLEANUP; } arv_value_set_int64 (&stack[index-1].value, arv_value_get_int64 (&stack[index-1].value) / arv_value_get_int64 (&stack[index].value)); } else { if (arv_value_get_double (&stack[index].value) == 0.0) { status = ARV_EVALUATOR_STATUS_DIVISION_BY_ZERO; goto CLEANUP; } arv_value_set_double (&stack[index-1].value, arv_value_get_double (&stack[index-1].value) / arv_value_get_double (&stack[index].value)); } stack[index-1].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_MULTIPLICATION: if (integer_mode || (arv_value_holds_int64 (&stack[index-1].value) && arv_value_holds_int64 (&stack[index].value))) arv_value_set_int64 (&stack[index-1].value, arv_value_get_int64 (&stack[index-1].value) * arv_value_get_int64 (&stack[index].value)); else arv_value_set_double (&stack[index-1].value, arv_value_get_double (&stack[index-1].value) * arv_value_get_double (&stack[index].value)); stack[index-1].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_POWER: if (integer_mode) arv_value_set_int64 (&stack[index-1].value, pow (arv_value_get_int64(&stack[index-1].value), arv_value_get_int64(&stack[index].value))); else arv_value_set_double (&stack[index-1].value, pow (arv_value_get_double(&stack[index-1].value), arv_value_get_double(&stack[index].value))); stack[index-1].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_MINUS: if (integer_mode || arv_value_holds_int64 (&stack[index].value)) arv_value_set_int64 (&stack[index].value, -arv_value_get_int64 (&stack[index].value)); else arv_value_set_double (&stack[index].value, -arv_value_get_double (&stack[index].value)); stack[index].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_PLUS: break; case ARV_EVALUATOR_TOKEN_FUNCTION_SIN: arv_value_set_double (&stack[index].value, sin (arv_value_get_double (&stack[index].value))); stack[index].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_FUNCTION_COS: arv_value_set_double (&stack[index].value, cos (arv_value_get_double (&stack[index].value))); stack[index].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_FUNCTION_SGN: if (integer_mode || arv_value_holds_int64 (&stack[index].value)) { gint64 int_value = arv_value_get_int64 (&stack[index].value); if (int_value < 0) arv_value_set_int64 (&stack[index].value, -1); else if (int_value > 0) arv_value_set_int64 (&stack[index].value, 1); else arv_value_set_int64 (&stack[index].value, 0); } else { double dbl_value = arv_value_get_double (&stack[index].value); if (dbl_value < 0.0) arv_value_set_int64 (&stack[index].value, -1); else if (dbl_value > 0.0) arv_value_set_int64 (&stack[index].value, 1); else arv_value_set_int64 (&stack[index].value, 0); } stack[index].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_FUNCTION_NEG: if (integer_mode || arv_value_holds_int64 (&stack[index].value)) arv_value_set_int64 (&stack[index].value, -arv_value_get_int64 (&stack[index].value)); else arv_value_set_double (&stack[index].value, -arv_value_get_double (&stack[index].value)); stack[index].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_FUNCTION_ATAN: arv_value_set_double (&stack[index].value, atan (arv_value_get_double (&stack[index].value))); stack[index].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_FUNCTION_TAN: arv_value_set_double (&stack[index].value, tan (arv_value_get_double (&stack[index].value))); stack[index].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_FUNCTION_ABS: if (arv_value_holds_double (&stack[index].value)) arv_value_set_double (&stack[index].value, fabs (arv_value_get_double (&stack[index].value))); else arv_value_set_int64 (&stack[index].value, llabs (arv_value_get_int64 (&stack[index].value))); stack[index].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_FUNCTION_EXP: arv_value_set_double (&stack[index].value, exp (arv_value_get_double (&stack[index].value))); stack[index].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_FUNCTION_LN: arv_value_set_double (&stack[index].value, log (arv_value_get_double (&stack[index].value))); stack[index].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_FUNCTION_LG: arv_value_set_double (&stack[index].value, log10 (arv_value_get_double (&stack[index].value))); stack[index].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_FUNCTION_SQRT: arv_value_set_double (&stack[index].value, sqrt (arv_value_get_double (&stack[index].value))); stack[index].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_FUNCTION_TRUNC: if (arv_value_get_double (&stack[index].value) > 0.0) arv_value_set_double (&stack[index].value, floor (arv_value_get_double (&stack[index].value))); else arv_value_set_double (&stack[index].value, ceil (arv_value_get_double (&stack[index].value))); stack[index].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_FUNCTION_ROUND: actual_arguments_count = get_arguments_count(stack, index); if (actual_arguments_count==1) { arv_value_set_double(&stack[index].value, round(arv_value_get_double(&stack[index].value))); stack[index].parenthesis_level = token->parenthesis_level; } else if (actual_arguments_count==2) { arv_value_set_double(&stack[index - 1].value, round_with_precision(arv_value_get_double(&stack[index - 1].value), arv_value_get_int64(&stack[index].value))); stack[index - 1].parenthesis_level = token->parenthesis_level; } else { if (actual_arguments_count<1) { status = ARV_EVALUATOR_STATUS_MISSING_ARGUMENTS; } else { status = ARV_EVALUATOR_STATUS_REMAINING_OPERANDS; } goto CLEANUP; } break; case ARV_EVALUATOR_TOKEN_FUNCTION_FLOOR: arv_value_set_double (&stack[index].value, floor (arv_value_get_double (&stack[index].value))); stack[index].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_FUNCTION_CEIL: arv_value_set_double (&stack[index].value, ceil (arv_value_get_double (&stack[index].value))); stack[index].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_FUNCTION_ASIN: arv_value_set_double (&stack[index].value, asin (arv_value_get_double (&stack[index].value))); stack[index].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_FUNCTION_ACOS: arv_value_set_double (&stack[index].value, acos (arv_value_get_double (&stack[index].value))); stack[index].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_CONSTANT_INT64: arv_value_set_int64 (&stack[index+1].value, token->data.v_int64); stack[index+1].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_CONSTANT_DOUBLE: if (integer_mode) arv_value_set_int64 (&stack[index+1].value, token->data.v_double); else arv_value_set_double (&stack[index+1].value, token->data.v_double); stack[index+1].parenthesis_level = token->parenthesis_level; break; case ARV_EVALUATOR_TOKEN_VARIABLE: value = g_hash_table_lookup (variables, token->data.name); if (value != NULL) { arv_value_copy (&stack[index+1].value, value); stack[index+1].parenthesis_level = token->parenthesis_level; } else { status = ARV_EVALUATOR_STATUS_UNKNOWN_VARIABLE; goto CLEANUP; } break; case ARV_EVALUATOR_TOKEN_TERNARY_COLON: break; case ARV_EVALUATOR_TOKEN_TERNARY_QUESTION_MARK: if (arv_value_get_int64 (&stack[index-2].value) != 0) { arv_value_copy(&stack[index - 2].value, &stack[index - 1].value); stack[index - 2].parenthesis_level = stack[index - 1].parenthesis_level; } else { arv_value_copy(&stack[index - 2].value, &stack[index].value); stack[index - 2].parenthesis_level = stack[index].parenthesis_level; } break; default: status = ARV_EVALUATOR_STATUS_UNKNOWN_OPERATOR; goto CLEANUP; break; } index = index - actual_arguments_count + 1; } if (index != 0) { status = ARV_EVALUATOR_STATUS_REMAINING_OPERANDS; goto CLEANUP; } if (v_double != NULL) *v_double = arv_value_get_double (&stack[0].value); if (v_int64 != NULL) *v_int64 = arv_value_get_int64 (&stack[0].value); if (arv_value_holds_int64 (&stack[0].value)) arv_log_evaluator ("[Evaluator::evaluate] Result = (int64) %Ld", arv_value_get_int64 (&stack[0].value)); else arv_log_evaluator ("[Evaluator::evaluate] Result = (double) %g", arv_value_get_double (&stack[0].value)); return ARV_EVALUATOR_STATUS_SUCCESS; CLEANUP: if (v_double != NULL) *v_double = 0.0; if (v_int64 != NULL) *v_int64 = 0.0; return status; } typedef struct { int count; GSList *token_stack; GSList *operator_stack; GSList *garbage_stack; gboolean in_sub_expression; gboolean previous_token_was_operand; gboolean previous_token_was_right_parenthesis; } ArvEvaluatorParserState; static ArvEvaluatorStatus parse_to_stacks (ArvEvaluator *evaluator, char *expression, ArvEvaluatorParserState *state) { ArvEvaluatorToken *token; ArvEvaluatorStatus status; gboolean token_found; gint32 current_parenthesis_level = 0; if (expression == NULL) return ARV_EVALUATOR_STATUS_EMPTY_EXPRESSION; /* Dijkstra's "shunting yard" algorithm */ /* http://en.wikipedia.org/wiki/Shunting-yard_algorithm */ do { token = arv_get_next_token (&expression, state->previous_token_was_operand, state->previous_token_was_right_parenthesis); if (token != NULL) { token_found = TRUE; token->parenthesis_level = current_parenthesis_level; state->previous_token_was_operand = arv_evaluator_token_is_operand (token); state->previous_token_was_right_parenthesis = arv_evaluator_token_is_right_parenthesis (token); if (arv_evaluator_token_is_variable (token)) { if (g_hash_table_lookup_extended (evaluator->priv->constants, token->data.name, NULL, NULL)) { const char *constant; constant = g_hash_table_lookup (evaluator->priv->constants, token->data.name); if (constant != NULL) { arv_evaluator_token_free (token); token = arv_get_next_token ((char **) &constant, FALSE, FALSE); if (token != NULL) state->token_stack = g_slist_prepend (state->token_stack, token); } else { status = ARV_EVALUATOR_STATUS_UNKNOWN_CONSTANT; goto CLEANUP; } } else if (g_hash_table_lookup_extended (evaluator->priv->sub_expressions, token->data.name, NULL, NULL)) { const char *sub_expression; sub_expression = g_hash_table_lookup (evaluator->priv->sub_expressions, token->data.name); if (sub_expression != NULL) { char *string; if (state->in_sub_expression) { status = ARV_EVALUATOR_STATUS_FORBIDDEN_RECUSRION; goto CLEANUP; } string = g_strdup_printf ("(%s)", sub_expression); state->in_sub_expression = TRUE; status = parse_to_stacks (evaluator, string, state); state->in_sub_expression = FALSE; g_free (string); if (status != ARV_EVALUATOR_STATUS_SUCCESS) { goto CLEANUP; } arv_evaluator_token_free (token); token = NULL; } else { status = ARV_EVALUATOR_STATUS_UNKNOWN_SUB_EXPRESSION; goto CLEANUP; } } else { state->token_stack = g_slist_prepend (state->token_stack, token); } } else if (arv_evaluator_token_is_operand (token)) { state->token_stack = g_slist_prepend (state->token_stack, token); } else if (arv_evaluator_token_is_comma (token)) { while (state->operator_stack != NULL && !arv_evaluator_token_is_left_parenthesis (state->operator_stack->data)) { state->token_stack = g_slist_prepend (state->token_stack, state->operator_stack->data); state->operator_stack = g_slist_delete_link (state->operator_stack, state->operator_stack); } if (state->operator_stack == NULL || !arv_evaluator_token_is_left_parenthesis (state->operator_stack->data)) { status = ARV_EVALUATOR_STATUS_PARENTHESES_MISMATCH; goto CLEANUP; } state->garbage_stack = g_slist_prepend (state->garbage_stack, token); } else if (arv_evaluator_token_is_operator (token)) { while (state->operator_stack != NULL && arv_evaluator_token_compare_precedence (token, state->operator_stack->data)) { state->token_stack = g_slist_prepend (state->token_stack, state->operator_stack->data); state->operator_stack = g_slist_delete_link (state->operator_stack, state->operator_stack); } state->operator_stack = g_slist_prepend (state->operator_stack, token); } else if (arv_evaluator_token_is_left_parenthesis (token)) { current_parenthesis_level+=1; state->operator_stack = g_slist_prepend (state->operator_stack, token); } else if (arv_evaluator_token_is_right_parenthesis (token)) { current_parenthesis_level-=1; while (state->operator_stack != NULL && !arv_evaluator_token_is_left_parenthesis (state->operator_stack->data)) { state->token_stack = g_slist_prepend (state->token_stack, state->operator_stack->data); state->operator_stack = g_slist_delete_link (state->operator_stack, state->operator_stack); } if (state->operator_stack == NULL) { status = ARV_EVALUATOR_STATUS_PARENTHESES_MISMATCH; goto CLEANUP; } state->garbage_stack = g_slist_prepend (state->garbage_stack, token); state->garbage_stack = g_slist_prepend (state->garbage_stack, state->operator_stack->data); state->operator_stack = g_slist_delete_link (state->operator_stack, state->operator_stack); } else { status = ARV_EVALUATOR_STATUS_SYNTAX_ERROR; goto CLEANUP; } (state->count)++; } else if (*expression != '\0') { status = ARV_EVALUATOR_STATUS_SYNTAX_ERROR; goto CLEANUP; } else { token_found = FALSE; } } while (token_found); return ARV_EVALUATOR_STATUS_SUCCESS; CLEANUP: if (token != NULL) arv_evaluator_token_free (token); return status; } static void free_rpn_stack (ArvEvaluator *evaluator) { GSList *iter; for (iter = evaluator->priv->rpn_stack; iter != NULL; iter = iter->next) arv_evaluator_token_free (iter->data); g_slist_free (evaluator->priv->rpn_stack); evaluator->priv->rpn_stack = NULL; } static ArvEvaluatorStatus parse_expression (ArvEvaluator *evaluator) { ArvEvaluatorParserState state; ArvEvaluatorStatus status; GSList *iter; int count; state.count =0; state.previous_token_was_operand = FALSE; state.previous_token_was_right_parenthesis = FALSE; state.token_stack = NULL; state.operator_stack = NULL; state.garbage_stack = NULL; state.in_sub_expression = FALSE; free_rpn_stack (evaluator); arv_log_evaluator ("[Evaluator::parse_expression] %s", evaluator->priv->expression); status = parse_to_stacks (evaluator, evaluator->priv->expression, &state); if (status != ARV_EVALUATOR_STATUS_SUCCESS) goto CLEANUP; arv_log_evaluator ("[Evaluator::parse_expression] Found %d items in expression", state.count); while (state.operator_stack != NULL) { if (arv_evaluator_token_is_left_parenthesis (state.operator_stack->data)) { status = ARV_EVALUATOR_STATUS_PARENTHESES_MISMATCH; goto CLEANUP; } state.token_stack = g_slist_prepend (state.token_stack, state.operator_stack->data); state.operator_stack = g_slist_delete_link (state.operator_stack, state.operator_stack); } evaluator->priv->rpn_stack = g_slist_reverse (state.token_stack); for (iter = state.garbage_stack, count = 0; iter != NULL; iter = iter->next, count++) arv_evaluator_token_free (iter->data); g_slist_free (state.garbage_stack); arv_log_evaluator ("[Evaluator::parse_expression] %d items in garbage list", count); arv_log_evaluator ("[Evaluator::parse_expression] %d items in token list", g_slist_length (evaluator->priv->rpn_stack)); return evaluator->priv->rpn_stack == NULL ? ARV_EVALUATOR_STATUS_EMPTY_EXPRESSION : ARV_EVALUATOR_STATUS_SUCCESS; CLEANUP: for (iter = state.garbage_stack; iter != NULL; iter = iter->next) arv_evaluator_token_free (iter->data); g_slist_free (state.garbage_stack); for (iter = state.token_stack; iter != NULL; iter = iter->next) arv_evaluator_token_free (iter->data); g_slist_free (state.token_stack); for (iter = state.operator_stack; iter != NULL; iter = iter->next) arv_evaluator_token_free (iter->data); g_slist_free (state.operator_stack); return status; } static void arv_evaluator_set_error (GError **error, ArvEvaluatorStatus status) { g_set_error (error, g_quark_from_string ("Aravis"), status, "Parsing error: %s", arv_evaluator_status_strings [MIN (status, G_N_ELEMENTS (arv_evaluator_status_strings)-1)]); arv_warning_evaluator ("[Evaluator::set_error] Error '%s'", arv_evaluator_status_strings [MIN (status, G_N_ELEMENTS (arv_evaluator_status_strings)-1)]); } double arv_evaluator_evaluate_as_double (ArvEvaluator *evaluator, GError **error) { ArvEvaluatorStatus status; double value; g_return_val_if_fail (ARV_IS_EVALUATOR (evaluator), 0.0); arv_log_evaluator ("[Evaluator::evaluate_as_double] Expression = '%s'", evaluator->priv->expression); if (evaluator->priv->parsing_status == ARV_EVALUATOR_STATUS_NOT_PARSED) { evaluator->priv->parsing_status = parse_expression (evaluator); arv_log_evaluator ("[Evaluator::evaluate_as_double] Parsing status = %d", evaluator->priv->parsing_status); } if (evaluator->priv->parsing_status != ARV_EVALUATOR_STATUS_SUCCESS) { arv_evaluator_set_error (error, evaluator->priv->parsing_status); return 0.0; } status = evaluate (evaluator->priv->rpn_stack, evaluator->priv->variables, NULL, &value); if (status != ARV_EVALUATOR_STATUS_SUCCESS) { arv_evaluator_set_error (error, status); return 0.0; } return value; } gint64 arv_evaluator_evaluate_as_int64 (ArvEvaluator *evaluator, GError **error) { ArvEvaluatorStatus status; gint64 value; g_return_val_if_fail (ARV_IS_EVALUATOR (evaluator), 0.0); arv_log_evaluator ("[Evaluator::evaluate_as_int64] Expression = '%s'", evaluator->priv->expression); if (evaluator->priv->parsing_status == ARV_EVALUATOR_STATUS_NOT_PARSED) { evaluator->priv->parsing_status = parse_expression (evaluator); arv_log_evaluator ("[Evaluator::evaluate_as_int64] Parsing status = %d", evaluator->priv->parsing_status); } if (evaluator->priv->parsing_status != ARV_EVALUATOR_STATUS_SUCCESS) { arv_evaluator_set_error (error, evaluator->priv->parsing_status); return 0.0; } status = evaluate (evaluator->priv->rpn_stack, evaluator->priv->variables, &value, NULL); if (status != ARV_EVALUATOR_STATUS_SUCCESS) { arv_evaluator_set_error (error, status); return 0.0; } return value; } void arv_evaluator_set_expression (ArvEvaluator *evaluator, const char *expression) { g_return_if_fail (ARV_IS_EVALUATOR (evaluator)); if (g_strcmp0 (expression, evaluator->priv->expression) == 0) return; g_free (evaluator->priv->expression); evaluator->priv->expression = NULL; if (expression == NULL) { evaluator->priv->parsing_status = ARV_EVALUATOR_STATUS_EMPTY_EXPRESSION; return; } evaluator->priv->parsing_status = ARV_EVALUATOR_STATUS_NOT_PARSED; evaluator->priv->expression = g_strdup (expression); } const char * arv_evaluator_get_expression (ArvEvaluator *evaluator) { g_return_val_if_fail (ARV_IS_EVALUATOR (evaluator), NULL); return evaluator->priv->expression; } /** * arv_evaluator_set_sub_expression: * @evaluator:a #ArvEvaluator * @name: sub-expression name * @expression: (allow-none): sub-pexression formula * * Assign a formula to a sub-expression. If @expression == %NULL, the sub-expression previously assigned to @name will be removed. * A sub-expression may not reference another sub-expression. * * Since: 0.6.0 */ void arv_evaluator_set_sub_expression (ArvEvaluator *evaluator, const char *name, const char *expression) { const char *old_expression; g_return_if_fail (ARV_IS_EVALUATOR (evaluator)); if (name == NULL) return; old_expression = g_hash_table_lookup (evaluator->priv->sub_expressions, name); if (old_expression != NULL && g_strcmp0 (old_expression, expression) == 0) return; if (expression != NULL) g_hash_table_replace (evaluator->priv->sub_expressions, g_strdup (name), g_strdup (expression)); else g_hash_table_remove (evaluator->priv->sub_expressions, name); evaluator->priv->parsing_status = ARV_EVALUATOR_STATUS_NOT_PARSED; arv_log_evaluator ("[Evaluator::set_sub_expression] %s = %s", name, expression); } /** * arv_evaluator_get_sub_expression: * @evaluator: a #ArvEvaluator * @name: sub-expression name * * Returns: The formula of the sub-expression corresponding to @name, %NULL if not defined. * * Since: 0.6.0 */ const char * arv_evaluator_get_sub_expression (ArvEvaluator *evaluator, const char *name) { g_return_val_if_fail (ARV_IS_EVALUATOR (evaluator), NULL); if (name == NULL) return NULL; return g_hash_table_lookup (evaluator->priv->sub_expressions, name); } /** * arv_evaluator_set_constant: * @evaluator:a #ArvEvaluator * @name: constant name * @constant: (allow-none): constant as a string * * Assign a string to a constant. If @constant == %NULL, the constant previously assigned to @name will be removed. * * Since: 0.6.0 */ void arv_evaluator_set_constant (ArvEvaluator *evaluator, const char *name, const char *constant) { const char *old_constant; g_return_if_fail (ARV_IS_EVALUATOR (evaluator)); if (name == NULL) return; old_constant = g_hash_table_lookup (evaluator->priv->constants, name); if (old_constant != NULL && g_strcmp0 (old_constant, constant) == 0) return; if (constant != NULL) g_hash_table_replace (evaluator->priv->constants, g_strdup (name), g_strdup (constant)); else g_hash_table_remove (evaluator->priv->constants, name); evaluator->priv->parsing_status = ARV_EVALUATOR_STATUS_NOT_PARSED; arv_log_evaluator ("[Evaluator::set_constant] %s = %s", name, constant); } /** * arv_evaluator_get_constant: * @evaluator: a #ArvEvaluator * @name: constant name * * Returns: The formula of the constant corresponding to @name, %NULL if not defined. * * Since: 0.6.0 */ const char * arv_evaluator_get_constant (ArvEvaluator *evaluator, const char *name) { g_return_val_if_fail (ARV_IS_EVALUATOR (evaluator), NULL); if (name == NULL) return NULL; return g_hash_table_lookup (evaluator->priv->constants, name); } void arv_evaluator_set_double_variable (ArvEvaluator *evaluator, const char *name, double v_double) { ArvValue *old_value; g_return_if_fail (ARV_IS_EVALUATOR (evaluator)); g_return_if_fail (name != NULL); old_value = g_hash_table_lookup (evaluator->priv->variables, name); if (old_value != NULL && (arv_value_get_double (old_value) == v_double)) return; g_hash_table_insert (evaluator->priv->variables, g_strdup (name), arv_value_new_double (v_double)); arv_log_evaluator ("[Evaluator::set_double_variable] %s = %g", name, v_double); } void arv_evaluator_set_int64_variable (ArvEvaluator *evaluator, const char *name, gint64 v_int64) { ArvValue *old_value; g_return_if_fail (ARV_IS_EVALUATOR (evaluator)); g_return_if_fail (name != NULL); old_value = g_hash_table_lookup (evaluator->priv->variables, name); if (old_value != NULL && (arv_value_get_int64 (old_value) == v_int64)) return; g_hash_table_insert (evaluator->priv->variables, g_strdup (name), arv_value_new_int64 (v_int64)); arv_log_evaluator ("[Evaluator::set_int64_variable] %s = %Ld", name, v_int64); } /** * arv_evaluator_new: * @expression: (allow-none): an evaluator expression * * Creates a new #ArvEvaluator object. The syntax is described in the genicam standard specification. * * Return value: a new #ArvEvaluator object. */ ArvEvaluator * arv_evaluator_new (const char *expression) { ArvEvaluator *evaluator; evaluator = g_object_new (ARV_TYPE_EVALUATOR, NULL); arv_evaluator_set_expression (evaluator, expression); return evaluator; } static void arv_evaluator_init (ArvEvaluator *evaluator) { evaluator->priv = G_TYPE_INSTANCE_GET_PRIVATE (evaluator, ARV_TYPE_EVALUATOR, ArvEvaluatorPrivate); evaluator->priv->expression = NULL; evaluator->priv->rpn_stack = NULL; evaluator->priv->variables = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) arv_value_free); evaluator->priv->sub_expressions = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); evaluator->priv->constants = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); arv_evaluator_set_double_variable (evaluator, "PI", M_PI); arv_evaluator_set_double_variable (evaluator, "E", M_E); } static void arv_evaluator_finalize (GObject *object) { ArvEvaluator *evaluator = ARV_EVALUATOR (object); arv_evaluator_set_expression (evaluator, NULL); g_hash_table_unref (evaluator->priv->variables); g_hash_table_unref (evaluator->priv->sub_expressions); g_hash_table_unref (evaluator->priv->constants); free_rpn_stack (evaluator); parent_class->finalize (object); } static void arv_evaluator_class_init (ArvEvaluatorClass *evaluator_class) { GObjectClass *object_class = G_OBJECT_CLASS (evaluator_class); g_type_class_add_private (evaluator_class, sizeof (ArvEvaluatorPrivate)); parent_class = g_type_class_peek_parent (evaluator_class); object_class->finalize = arv_evaluator_finalize; } G_DEFINE_TYPE (ArvEvaluator, arv_evaluator, G_TYPE_OBJECT) aravis-ARAVIS_0_6_0/src/arvevaluator.h000066400000000000000000000056171334570641500177050ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_EVALUATOR_H #define ARV_EVALUATOR_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS #define ARV_TYPE_EVALUATOR (arv_evaluator_get_type ()) #define ARV_EVALUATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_EVALUATOR, ArvEvaluator)) #define ARV_EVALUATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_EVALUATOR, ArvEvaluatorClass)) #define ARV_IS_EVALUATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_EVALUATOR)) #define ARV_IS_EVALUATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_EVALUATOR)) #define ARV_EVALUATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_EVALUATOR, ArvEvaluatorClass)) typedef struct _ArvEvaluatorPrivate ArvEvaluatorPrivate; typedef struct _ArvEvaluatorClass ArvEvaluatorClass; struct _ArvEvaluator { GObject object; ArvEvaluatorPrivate *priv; }; struct _ArvEvaluatorClass { GObjectClass parent_class; }; GType arv_evaluator_get_type (void); ArvEvaluator * arv_evaluator_new (const char *expression); void arv_evaluator_set_expression (ArvEvaluator *evaluator, const char *expression); const char * arv_evaluator_get_expression (ArvEvaluator *evaluator); void arv_evaluator_set_sub_expression (ArvEvaluator *evaluator, const char *name, const char *expression); const char * arv_evaluator_get_sub_expression (ArvEvaluator *evaluator, const char *name); void arv_evaluator_set_constant (ArvEvaluator *evaluator, const char *name, const char *constant); const char * arv_evaluator_get_constant (ArvEvaluator *evaluator, const char *name); double arv_evaluator_evaluate_as_double (ArvEvaluator *evaluator, GError **error); gint64 arv_evaluator_evaluate_as_int64 (ArvEvaluator *evaluator, GError **error); void arv_evaluator_set_double_variable (ArvEvaluator *evaluator, const char *name, double v_double); void arv_evaluator_set_int64_variable (ArvEvaluator *evaluator, const char *name, gint64 v_int64); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvfakecamera.c000066400000000000000000000410051334570641500177440ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2011 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvfakecamera * @short_description: Fake camera internals * * #ArvFakeCamera is a class that simulate a real camera, which provides * methods for the implementation of #ArvFakeDevice and #ArvFakeStream. * * arv-fake-gv-camera is a GV camera simulator based on this class. */ #include #include #include #include #include #include #include #include #include #include static GObjectClass *parent_class = NULL; struct _ArvFakeCameraPrivate { void *memory; const void *genicam_xml; size_t genicam_xml_size; guint32 frame_id; double trigger_frequency; GMutex fill_pattern_mutex; ArvFakeCameraFillPattern fill_pattern_callback; void *fill_pattern_data; }; static const char *arv_fake_camera_genicam_filename = NULL; /* ArvFakeCamera implementation */ gboolean arv_fake_camera_read_memory (ArvFakeCamera *camera, guint32 address, guint32 size, void *buffer) { guint32 read_size; g_return_val_if_fail (ARV_IS_FAKE_CAMERA (camera), FALSE); g_return_val_if_fail (buffer != NULL, FALSE); g_return_val_if_fail (size > 0, FALSE); if (address < ARV_FAKE_CAMERA_MEMORY_SIZE) { read_size = MIN (address + size, ARV_FAKE_CAMERA_MEMORY_SIZE) - address; memcpy (buffer, ((char *) camera->priv->memory) + address, read_size); if (read_size == size) return TRUE; size = size - read_size; address = ARV_FAKE_CAMERA_MEMORY_SIZE; buffer = buffer + read_size; } address -= ARV_FAKE_CAMERA_MEMORY_SIZE; read_size = MIN (address + size, camera->priv->genicam_xml_size) - address; memcpy (buffer, ((char *) camera->priv->genicam_xml) + address, read_size); if (read_size < size) memset (buffer + read_size, 0, size - read_size); return TRUE; } gboolean arv_fake_camera_write_memory (ArvFakeCamera *camera, guint32 address, guint32 size, const void *buffer) { g_return_val_if_fail (ARV_IS_FAKE_CAMERA (camera), FALSE); g_return_val_if_fail (address + size < ARV_FAKE_CAMERA_MEMORY_SIZE + camera->priv->genicam_xml_size, FALSE); g_return_val_if_fail (buffer != NULL, FALSE); g_return_val_if_fail (size > 0, FALSE); /* genicam_data are read only */ if (address + size > ARV_FAKE_CAMERA_MEMORY_SIZE) return FALSE; memcpy (((char *) camera->priv->memory) + address, buffer, size); return TRUE; } gboolean arv_fake_camera_read_register (ArvFakeCamera *camera, guint32 address, guint32 *value) { gboolean success; guint32 be_value = 0; g_return_val_if_fail (value != NULL, FALSE); success = arv_fake_camera_read_memory (camera, address, sizeof (*value), &be_value); *value = GUINT32_FROM_BE (be_value); return success; } gboolean arv_fake_camera_write_register (ArvFakeCamera *camera, guint32 address, guint32 value) { guint32 be_value = GUINT32_TO_BE (value); return arv_fake_camera_write_memory (camera, address, sizeof (value), &be_value); } static guint32 _get_register (ArvFakeCamera *camera, guint32 address) { guint32 value; if (address + sizeof (guint32) > ARV_FAKE_CAMERA_MEMORY_SIZE) return 0; value = *((guint32 *) (((char *)(camera->priv->memory) + address))); return GUINT32_FROM_BE (value); } size_t arv_fake_camera_get_payload (ArvFakeCamera *camera) { guint32 width, height; g_return_val_if_fail (ARV_IS_FAKE_CAMERA (camera), 0); width = _get_register (camera, ARV_FAKE_CAMERA_REGISTER_WIDTH); height = _get_register (camera, ARV_FAKE_CAMERA_REGISTER_HEIGHT); return width * height; } guint64 arv_fake_camera_get_sleep_time_for_next_frame (ArvFakeCamera *camera, guint64 *next_timestamp_us) { guint64 time_us; guint64 sleep_time_us; guint64 frame_period_time_us; g_return_val_if_fail (ARV_IS_FAKE_CAMERA (camera), 0); if (_get_register (camera, ARV_FAKE_CAMERA_REGISTER_TRIGGER_MODE) == 1) frame_period_time_us = 1000000L / camera->priv->trigger_frequency; else frame_period_time_us = (guint64) _get_register (camera, ARV_FAKE_CAMERA_REGISTER_ACQUISITION_FRAME_PERIOD_US); if (frame_period_time_us == 0) { arv_warning_misc ("Invalid zero frame period, defaulting to 1 second"); frame_period_time_us = 1000000L; } time_us = g_get_real_time (); sleep_time_us = frame_period_time_us - (time_us % frame_period_time_us); if (next_timestamp_us != NULL) *next_timestamp_us = time_us + sleep_time_us; return sleep_time_us; } void arv_fake_camera_wait_for_next_frame (ArvFakeCamera *camera) { g_return_if_fail (ARV_IS_FAKE_CAMERA (camera)); g_usleep (arv_fake_camera_get_sleep_time_for_next_frame (camera, NULL)); } static void arv_fake_camera_diagonal_ramp (ArvBuffer *buffer, void *fill_pattern_data, guint32 exposure_time_us, guint32 gain, ArvPixelFormat pixel_format) { double pixel_value; double scale; guint32 x, y; guint32 width; guint32 height; if (buffer == NULL) return; if (pixel_format != ARV_PIXEL_FORMAT_MONO_8) return; width = buffer->priv->width; height = buffer->priv->height; scale = 1.0 + gain + log10 ((double) exposure_time_us / 10000.0); for (y = 0; y < height; y++) for (x = 0; x < width; x++) { pixel_value = (x + buffer->priv->frame_id + y) % 255; pixel_value *= scale; if (pixel_value < 0.0) ((unsigned char *) buffer->priv->data)[y * width + x] = 0; else if (pixel_value > 255.0) ((unsigned char *) buffer->priv->data)[y * width + x] = 255; else ((unsigned char *) buffer->priv->data)[y * width + x] = pixel_value; } } /** * arv_fake_camera_set_fill_pattern: * @camera: a #ArvFakeCamera * @fill_pattern_callback: (scope call): callback for image filling * @fill_pattern_data: (closure): image filling user data * * Sets the fill pattern callback for custom test images. */ void arv_fake_camera_set_fill_pattern (ArvFakeCamera *camera, ArvFakeCameraFillPattern fill_pattern_callback, void *fill_pattern_data) { g_return_if_fail (ARV_IS_FAKE_CAMERA (camera)); g_mutex_lock (&camera->priv->fill_pattern_mutex); if (fill_pattern_callback != NULL) { camera->priv->fill_pattern_callback = fill_pattern_callback; camera->priv->fill_pattern_data = fill_pattern_data; } else { camera->priv->fill_pattern_callback = arv_fake_camera_diagonal_ramp; camera->priv->fill_pattern_data = NULL; } g_mutex_unlock (&camera->priv->fill_pattern_mutex); } void arv_fake_camera_fill_buffer (ArvFakeCamera *camera, ArvBuffer *buffer, guint32 *packet_size) { guint32 width; guint32 height; guint32 exposure_time_us; guint32 gain; guint32 pixel_format; size_t payload; if (camera == NULL || buffer == NULL) return; width = _get_register (camera, ARV_FAKE_CAMERA_REGISTER_WIDTH); height = _get_register (camera, ARV_FAKE_CAMERA_REGISTER_HEIGHT); payload = width * height; if (buffer->priv->size < payload) { buffer->priv->status = ARV_BUFFER_STATUS_SIZE_MISMATCH; return; } buffer->priv->payload_type = ARV_BUFFER_PAYLOAD_TYPE_IMAGE; buffer->priv->chunk_endianness = G_BIG_ENDIAN; buffer->priv->width = width; buffer->priv->height = height; buffer->priv->status = ARV_BUFFER_STATUS_SUCCESS; buffer->priv->timestamp_ns = g_get_real_time () * 1000; buffer->priv->system_timestamp_ns = buffer->priv->timestamp_ns; buffer->priv->frame_id = camera->priv->frame_id++; buffer->priv->pixel_format = _get_register (camera, ARV_FAKE_CAMERA_REGISTER_PIXEL_FORMAT); g_mutex_lock (&camera->priv->fill_pattern_mutex); arv_fake_camera_read_register (camera, ARV_FAKE_CAMERA_REGISTER_EXPOSURE_TIME_US, &exposure_time_us); arv_fake_camera_read_register (camera, ARV_FAKE_CAMERA_REGISTER_GAIN_RAW, &gain); arv_fake_camera_read_register (camera, ARV_FAKE_CAMERA_REGISTER_PIXEL_FORMAT, &pixel_format); camera->priv->fill_pattern_callback (buffer, camera->priv->fill_pattern_data, exposure_time_us, gain, pixel_format); g_mutex_unlock (&camera->priv->fill_pattern_mutex); if (packet_size != NULL) *packet_size = _get_register (camera, ARV_GVBS_STREAM_CHANNEL_0_PACKET_SIZE_OFFSET); } void arv_fake_camera_set_inet_address (ArvFakeCamera *camera, GInetAddress *address) { const guint8 *bytes; g_return_if_fail (ARV_IS_FAKE_CAMERA (camera)); g_return_if_fail (G_IS_INET_ADDRESS (address)); g_return_if_fail (g_inet_address_get_family (address) == G_SOCKET_FAMILY_IPV4); bytes = g_inet_address_to_bytes (address); arv_fake_camera_write_memory (camera, ARV_GVBS_CURRENT_IP_ADDRESS_OFFSET, g_inet_address_get_native_size (address), (char *) bytes); } guint32 arv_fake_camera_get_acquisition_status (ArvFakeCamera *camera) { g_return_val_if_fail (ARV_IS_FAKE_CAMERA (camera), 0); return _get_register (camera, ARV_FAKE_CAMERA_REGISTER_ACQUISITION); } /** * arv_fake_camera_get_stream_address: * @camera: a #ArvFakeCamera * * Return value: (transfer full): the data stream #GSocketAddress for this camera */ GSocketAddress * arv_fake_camera_get_stream_address (ArvFakeCamera *camera) { GSocketAddress *stream_socket_address; GInetAddress *inet_address; guint32 value; g_return_val_if_fail (ARV_IS_FAKE_CAMERA (camera), NULL); arv_fake_camera_read_memory (camera, ARV_GVBS_STREAM_CHANNEL_0_IP_ADDRESS_OFFSET, sizeof (value), &value); inet_address = g_inet_address_new_from_bytes ((guint8 *) &value, G_SOCKET_FAMILY_IPV4); stream_socket_address = g_inet_socket_address_new (inet_address, _get_register (camera, ARV_GVBS_STREAM_CHANNEL_0_PORT_OFFSET)); g_object_unref (inet_address); return stream_socket_address; } void arv_fake_camera_set_trigger_frequency (ArvFakeCamera *camera, double frequency) { g_return_if_fail (ARV_IS_FAKE_CAMERA (camera)); g_return_if_fail (frequency > 0.0); camera->priv->trigger_frequency = frequency; } guint32 arv_fake_camera_get_control_channel_privilege (ArvFakeCamera *camera) { guint32 value; arv_fake_camera_read_register (camera, ARV_GVBS_CONTROL_CHANNEL_PRIVILEGE_OFFSET, &value); return value; } void arv_fake_camera_set_control_channel_privilege (ArvFakeCamera *camera, guint32 privilege) { arv_fake_camera_write_register (camera, ARV_GVBS_CONTROL_CHANNEL_PRIVILEGE_OFFSET, privilege); } guint32 arv_fake_camera_get_heartbeat_timeout (ArvFakeCamera *camera) { guint32 value; arv_fake_camera_read_register (camera, ARV_GVBS_HEARTBEAT_TIMEOUT_OFFSET, &value); return value; } void arv_set_fake_camera_genicam_filename (const char *filename) { arv_fake_camera_genicam_filename = filename; } const char * arv_get_fake_camera_genicam_xml (size_t *size) { static GMappedFile *genicam_file = NULL; static GMutex mutex; g_mutex_lock (&mutex); if (genicam_file == NULL ) { char *filename; if (arv_fake_camera_genicam_filename == NULL) filename = g_build_filename (ARAVIS_DATA_DIR, "arv-fake-camera.xml", NULL); else filename = g_strdup (arv_fake_camera_genicam_filename); genicam_file = g_mapped_file_new (filename, FALSE, NULL); if (genicam_file != NULL) { arv_debug_genicam ("[get_fake_camera_genicam_data] %s [size = %d]", filename, g_mapped_file_get_length (genicam_file)); arv_log_genicam (g_mapped_file_get_contents (genicam_file)); } g_free (filename); } g_mutex_unlock (&mutex); g_return_val_if_fail( genicam_file != NULL, NULL); if (size != NULL) *size = g_mapped_file_get_length (genicam_file); return g_mapped_file_get_contents (genicam_file); } /* GObject implemenation */ ArvFakeCamera * arv_fake_camera_new (const char *serial_number) { ArvFakeCamera *fake_camera; void *memory; char *xml_url; g_return_val_if_fail (serial_number != NULL, NULL); g_return_val_if_fail (*serial_number != '\0', NULL); g_return_val_if_fail (strlen (serial_number) < ARV_GVBS_SERIAL_NUMBER_SIZE, NULL); fake_camera = g_object_new (ARV_TYPE_FAKE_CAMERA, NULL); memory = g_malloc0 (ARV_FAKE_CAMERA_MEMORY_SIZE); g_mutex_init (&fake_camera->priv->fill_pattern_mutex); fake_camera->priv->fill_pattern_callback = arv_fake_camera_diagonal_ramp; fake_camera->priv->fill_pattern_data = NULL; fake_camera->priv->genicam_xml = arv_get_fake_camera_genicam_xml (&fake_camera->priv->genicam_xml_size); fake_camera->priv->memory = memory; strcpy (((char *) memory) + ARV_GVBS_MANUFACTURER_NAME_OFFSET, "Aravis"); strcpy (((char *) memory) + ARV_GVBS_MODEL_NAME_OFFSET, "Fake"); strcpy (((char *) memory) + ARV_GVBS_DEVICE_VERSION_OFFSET, PACKAGE_VERSION); strcpy (((char *) memory) + ARV_GVBS_SERIAL_NUMBER_OFFSET, serial_number); xml_url = g_strdup_printf ("Local:arv-fake-camera.xml;%x;%x", ARV_FAKE_CAMERA_MEMORY_SIZE, (unsigned int) fake_camera->priv->genicam_xml_size); strcpy (((char *) memory) + ARV_GVBS_XML_URL_0_OFFSET, xml_url); g_free (xml_url); arv_fake_camera_write_register (fake_camera, ARV_FAKE_CAMERA_REGISTER_SENSOR_WIDTH, ARV_FAKE_CAMERA_SENSOR_WIDTH); arv_fake_camera_write_register (fake_camera, ARV_FAKE_CAMERA_REGISTER_SENSOR_HEIGHT, ARV_FAKE_CAMERA_SENSOR_HEIGHT); arv_fake_camera_write_register (fake_camera, ARV_FAKE_CAMERA_REGISTER_WIDTH, ARV_FAKE_CAMERA_WIDTH_DEFAULT); arv_fake_camera_write_register (fake_camera, ARV_FAKE_CAMERA_REGISTER_HEIGHT, ARV_FAKE_CAMERA_HEIGHT_DEFAULT); arv_fake_camera_write_register (fake_camera, ARV_FAKE_CAMERA_REGISTER_X_OFFSET, 0); arv_fake_camera_write_register (fake_camera, ARV_FAKE_CAMERA_REGISTER_Y_OFFSET, 0); arv_fake_camera_write_register (fake_camera, ARV_FAKE_CAMERA_REGISTER_BINNING_HORIZONTAL, ARV_FAKE_CAMERA_BINNING_HORIZONTAL_DEFAULT); arv_fake_camera_write_register (fake_camera, ARV_FAKE_CAMERA_REGISTER_BINNING_VERTICAL, ARV_FAKE_CAMERA_BINNING_HORIZONTAL_DEFAULT); arv_fake_camera_write_register (fake_camera, ARV_FAKE_CAMERA_REGISTER_PIXEL_FORMAT, ARV_PIXEL_FORMAT_MONO_8); arv_fake_camera_write_register (fake_camera, ARV_FAKE_CAMERA_REGISTER_ACQUISITION, 0); arv_fake_camera_write_register (fake_camera, ARV_FAKE_CAMERA_REGISTER_ACQUISITION_MODE, 1); arv_fake_camera_write_register (fake_camera, ARV_FAKE_CAMERA_REGISTER_ACQUISITION_FRAME_PERIOD_US, 1000000.0 / ARV_FAKE_CAMERA_ACQUISITION_FRAME_RATE_DEFAULT); arv_fake_camera_write_register (fake_camera, ARV_FAKE_CAMERA_REGISTER_EXPOSURE_TIME_US, ARV_FAKE_CAMERA_EXPOSURE_TIME_US_DEFAULT); arv_fake_camera_write_register (fake_camera, ARV_FAKE_CAMERA_REGISTER_GAIN_RAW, 0); arv_fake_camera_write_register (fake_camera, ARV_FAKE_CAMERA_REGISTER_GAIN_MODE, 1); arv_fake_camera_write_register (fake_camera, ARV_GVBS_HEARTBEAT_TIMEOUT_OFFSET, 3000); arv_fake_camera_write_register (fake_camera, ARV_GVBS_TIMESTAMP_TICK_FREQUENCY_HIGH_OFFSET, 0); arv_fake_camera_write_register (fake_camera, ARV_GVBS_TIMESTAMP_TICK_FREQUENCY_LOW_OFFSET, 1000000000); arv_fake_camera_write_register (fake_camera, ARV_GVBS_CONTROL_CHANNEL_PRIVILEGE_OFFSET, 0); arv_fake_camera_write_register (fake_camera, ARV_GVBS_STREAM_CHANNEL_0_PACKET_SIZE_OFFSET, 2000); arv_fake_camera_write_register (fake_camera, ARV_GVBS_N_STREAM_CHANNELS_OFFSET, 1); arv_fake_camera_write_register (fake_camera, ARV_FAKE_CAMERA_REGISTER_TEST, ARV_FAKE_CAMERA_TEST_REGISTER_DEFAULT); return fake_camera; } static void arv_fake_camera_init (ArvFakeCamera *fake_camera) { fake_camera->priv = G_TYPE_INSTANCE_GET_PRIVATE (fake_camera, ARV_TYPE_FAKE_CAMERA, ArvFakeCameraPrivate); fake_camera->priv->trigger_frequency = 25.0; fake_camera->priv->frame_id = 65000; /* Trigger circular counter bugs sooner */ } static void arv_fake_camera_finalize (GObject *object) { ArvFakeCamera *fake_camera = ARV_FAKE_CAMERA (object); g_free (fake_camera->priv->memory); g_mutex_clear (&fake_camera->priv->fill_pattern_mutex); parent_class->finalize (object); } static void arv_fake_camera_class_init (ArvFakeCameraClass *fake_camera_class) { GObjectClass *object_class = G_OBJECT_CLASS (fake_camera_class); g_type_class_add_private (fake_camera_class, sizeof (ArvFakeCameraPrivate)); parent_class = g_type_class_peek_parent (fake_camera_class); object_class->finalize = arv_fake_camera_finalize; } G_DEFINE_TYPE (ArvFakeCamera, arv_fake_camera, G_TYPE_OBJECT) aravis-ARAVIS_0_6_0/src/arvfakecamera.h000066400000000000000000000132031334570641500177500ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2011 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_FAKE_CAMERA_H #define ARV_FAKE_CAMERA_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS typedef void (*ArvFakeCameraFillPattern) (ArvBuffer *buffer, void *fill_pattern_data, guint32 exposure_time_us, guint32 gain, ArvPixelFormat pixel_format); #define ARV_FAKE_CAMERA_MEMORY_SIZE 0x10000 /* To keep in sync with arv-fake-camera.xml */ /* Image format control */ #define ARV_FAKE_CAMERA_REGISTER_SENSOR_WIDTH 0x11c #define ARV_FAKE_CAMERA_REGISTER_SENSOR_HEIGHT 0x118 #define ARV_FAKE_CAMERA_REGISTER_WIDTH 0x100 #define ARV_FAKE_CAMERA_REGISTER_HEIGHT 0x104 #define ARV_FAKE_CAMERA_REGISTER_X_OFFSET 0x130 #define ARV_FAKE_CAMERA_REGISTER_Y_OFFSET 0x134 #define ARV_FAKE_CAMERA_REGISTER_BINNING_HORIZONTAL 0x108 #define ARV_FAKE_CAMERA_REGISTER_BINNING_VERTICAL 0x10c #define ARV_FAKE_CAMERA_REGISTER_PIXEL_FORMAT 0x128 #define ARV_FAKE_CAMERA_REGISTER_TEST 0x1f0 #define ARV_FAKE_CAMERA_SENSOR_WIDTH 2048 #define ARV_FAKE_CAMERA_SENSOR_HEIGHT 2048 #define ARV_FAKE_CAMERA_WIDTH_DEFAULT 512 #define ARV_FAKE_CAMERA_HEIGHT_DEFAULT 512 #define ARV_FAKE_CAMERA_BINNING_HORIZONTAL_DEFAULT 1 #define ARV_FAKE_CAMERA_BINNING_VERTICAL_DEFAULT 1 #define ARV_FAKE_CAMERA_PIXEL_FORMAT_DEFAULT ARV_PIXEL_FORMAT_MONO_8 #define ARV_FAKE_CAMERA_TEST_REGISTER_DEFAULT 0x12345678 /* Acquisition control */ #define ARV_FAKE_CAMERA_REGISTER_ACQUISITION_MODE 0x12c #define ARV_FAKE_CAMERA_REGISTER_ACQUISITION_FRAME_PERIOD_US 0x138 #define ARV_FAKE_CAMERA_REGISTER_FRAME_START_OFFSET 0x000 #define ARV_FAKE_CAMERA_REGISTER_ACQUISITION_START_OFFSET 0x020 #define ARV_FAKE_CAMERA_REGISTER_TRIGGER_MODE 0x300 #define ARV_FAKE_CAMERA_REGISTER_TRIGGER_SOURCE 0x304 #define ARV_FAKE_CAMERA_REGISTER_TRIGGER_ACTIVATION 0x308 #define ARV_FAKE_CAMERA_REGISTER_ACQUISITION 0x124 #define ARV_FAKE_CAMERA_REGISTER_EXPOSURE_TIME_US 0x120 #define ARV_FAKE_CAMERA_ACQUISITION_FRAME_RATE_DEFAULT 25.0 #define ARV_FAKE_CAMERA_EXPOSURE_TIME_US_DEFAULT 10000.0 /* Analog control */ #define ARV_FAKE_CAMERA_REGISTER_GAIN_RAW 0x110 #define ARV_FAKE_CAMERA_REGISTER_GAIN_MODE 0x114 #define ARV_TYPE_FAKE_CAMERA (arv_fake_camera_get_type ()) #define ARV_FAKE_CAMERA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_FAKE_CAMERA, ArvFakeCamera)) #define ARV_FAKE_CAMERA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_FAKE_CAMERA, ArvFakeCameraClass)) #define ARV_IS_FAKE_CAMERA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_FAKE_CAMERA)) #define ARV_IS_FAKE_CAMERA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_FAKE_CAMERA)) #define ARV_FAKE_CAMERA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_FAKE_CAMERA, ArvFakeCameraClass)) typedef struct _ArvFakeCameraClass ArvFakeCameraClass; typedef struct _ArvFakeCameraPrivate ArvFakeCameraPrivate; struct _ArvFakeCamera { GObject object; ArvFakeCameraPrivate *priv; }; struct _ArvFakeCameraClass { GObjectClass parent_class; }; GType arv_fake_camera_get_type (void); ArvFakeCamera * arv_fake_camera_new (const char *serial_number); gboolean arv_fake_camera_read_memory (ArvFakeCamera *camera, guint32 address, guint32 size, void *buffer); gboolean arv_fake_camera_write_memory (ArvFakeCamera *camera, guint32 address, guint32 size, const void *buffer); gboolean arv_fake_camera_read_register (ArvFakeCamera *camera, guint32 address, guint32 *value); gboolean arv_fake_camera_write_register (ArvFakeCamera *camera, guint32 address, guint32 value); size_t arv_fake_camera_get_payload (ArvFakeCamera *camera); void arv_fake_camera_wait_for_next_frame (ArvFakeCamera *camera); guint64 arv_fake_camera_get_sleep_time_for_next_frame (ArvFakeCamera *camera, guint64 *next_timestamp_us); void arv_fake_camera_fill_buffer (ArvFakeCamera *camera, ArvBuffer *buffer, guint32 *packet_size); guint32 arv_fake_camera_get_acquisition_status (ArvFakeCamera *camera); GSocketAddress *arv_fake_camera_get_stream_address (ArvFakeCamera *camera); void arv_fake_camera_set_inet_address (ArvFakeCamera *camera, GInetAddress *address); guint32 arv_fake_camera_get_control_channel_privilege (ArvFakeCamera *camera); void arv_fake_camera_set_control_channel_privilege (ArvFakeCamera *camera, guint32 privilege); guint32 arv_fake_camera_get_heartbeat_timeout (ArvFakeCamera *camera); void arv_fake_camera_set_fill_pattern (ArvFakeCamera *camera, ArvFakeCameraFillPattern fill_pattern_callback, void *fill_pattern_data); void arv_fake_camera_set_trigger_frequency (ArvFakeCamera *camera, double frequency); void arv_set_fake_camera_genicam_filename (const char *filename); const char * arv_get_fake_camera_genicam_xml (size_t *size); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvfakedevice.c000066400000000000000000000117611334570641500177610ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvfakedevice * @short_description: Fake device */ #include #include #include #include static GObjectClass *parent_class = NULL; struct _ArvFakeDevicePrivate { ArvFakeCamera *camera; ArvGc *genicam; const char *genicam_xml; size_t genicam_xml_size; }; /* ArvFakeDevice implemenation */ /* ArvDevice implemenation */ static ArvStream * arv_fake_device_create_stream (ArvDevice *device, ArvStreamCallback callback, void *user_data) { ArvFakeDevice *fake_device = ARV_FAKE_DEVICE (device); ArvStream *stream; stream = arv_fake_stream_new (fake_device->priv->camera, callback, user_data); return stream; } static const char * arv_fake_device_get_genicam_xml (ArvDevice *device, size_t *size) { ArvFakeDevice *fake_device = ARV_FAKE_DEVICE (device); *size = fake_device->priv->genicam_xml_size; return fake_device->priv->genicam_xml; } static ArvGc * arv_fake_device_get_genicam (ArvDevice *device) { ArvFakeDevice *fake_device = ARV_FAKE_DEVICE (device); return fake_device->priv->genicam; } static gboolean arv_fake_device_read_memory (ArvDevice *device, guint64 address, guint32 size, void *buffer, GError **error) { return arv_fake_camera_read_memory (ARV_FAKE_DEVICE (device)->priv->camera, address, size, buffer); } static gboolean arv_fake_device_write_memory (ArvDevice *device, guint64 address, guint32 size, void *buffer, GError **error) { return arv_fake_camera_write_memory (ARV_FAKE_DEVICE (device)->priv->camera, address, size, buffer); } static gboolean arv_fake_device_read_register (ArvDevice *device, guint64 address, guint32 *value, GError **error) { return arv_fake_camera_read_register (ARV_FAKE_DEVICE (device)->priv->camera, address, value); } static gboolean arv_fake_device_write_register (ArvDevice *device, guint64 address, guint32 value, GError **error) { return arv_fake_camera_write_register (ARV_FAKE_DEVICE (device)->priv->camera, address, value); } /** * arv_fake_device_get_fake_camera: * @device: a fake device * * Return value: (transfer none): the #ArvFakeCamera used by this device instance. */ ArvFakeCamera * arv_fake_device_get_fake_camera (ArvFakeDevice *device) { g_return_val_if_fail (ARV_IS_FAKE_DEVICE (device), NULL); return device->priv->camera; } ArvDevice * arv_fake_device_new (const char *serial_number) { ArvFakeDevice *fake_device; g_return_val_if_fail (serial_number != NULL, NULL); fake_device = g_object_new (ARV_TYPE_FAKE_DEVICE, NULL); fake_device->priv->camera = arv_fake_camera_new (serial_number); fake_device->priv->genicam_xml = arv_get_fake_camera_genicam_xml (&fake_device->priv->genicam_xml_size); fake_device->priv->genicam = arv_gc_new (ARV_DEVICE (fake_device), fake_device->priv->genicam_xml, fake_device->priv->genicam_xml_size); return ARV_DEVICE (fake_device); } static void arv_fake_device_init (ArvFakeDevice *fake_device) { fake_device->priv = G_TYPE_INSTANCE_GET_PRIVATE (fake_device, ARV_TYPE_FAKE_DEVICE, ArvFakeDevicePrivate); } static void arv_fake_device_finalize (GObject *object) { ArvFakeDevice *fake_device = ARV_FAKE_DEVICE (object); g_object_unref (fake_device->priv->genicam); g_object_unref (fake_device->priv->camera); parent_class->finalize (object); } static void arv_fake_device_class_init (ArvFakeDeviceClass *fake_device_class) { GObjectClass *object_class = G_OBJECT_CLASS (fake_device_class); ArvDeviceClass *device_class = ARV_DEVICE_CLASS (fake_device_class); g_type_class_add_private (fake_device_class, sizeof (ArvFakeDevicePrivate)); parent_class = g_type_class_peek_parent (fake_device_class); object_class->finalize = arv_fake_device_finalize; device_class->create_stream = arv_fake_device_create_stream; device_class->get_genicam_xml = arv_fake_device_get_genicam_xml; device_class->get_genicam = arv_fake_device_get_genicam; device_class->read_memory = arv_fake_device_read_memory; device_class->write_memory = arv_fake_device_write_memory; device_class->read_register = arv_fake_device_read_register; device_class->write_register = arv_fake_device_write_register; } G_DEFINE_TYPE (ArvFakeDevice, arv_fake_device, ARV_TYPE_DEVICE) aravis-ARAVIS_0_6_0/src/arvfakedevice.h000066400000000000000000000036171334570641500177670ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_FAKE_DEVICE_H #define ARV_FAKE_DEVICE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS #define ARV_TYPE_FAKE_DEVICE (arv_fake_device_get_type ()) #define ARV_FAKE_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_FAKE_DEVICE, ArvFakeDevice)) #define ARV_FAKE_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_FAKE_DEVICE, ArvFakeDeviceClass)) #define ARV_IS_FAKE_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_FAKE_DEVICE)) #define ARV_IS_FAKE_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_FAKE_DEVICE)) #define ARV_FAKE_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_FAKE_DEVICE, ArvFakeDeviceClass)) GType arv_fake_device_get_type (void); ArvDevice * arv_fake_device_new (const char *serial_number); ArvFakeCamera * arv_fake_device_get_fake_camera (ArvFakeDevice *device); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvfakedeviceprivate.h000066400000000000000000000025511334570641500213560ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_FAKE_DEVICE_PRIVATE_H #define ARV_FAKE_DEVICE_PRIVATE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef struct _ArvFakeDeviceClass ArvFakeDeviceClass; typedef struct _ArvFakeDevicePrivate ArvFakeDevicePrivate; struct _ArvFakeDevice { ArvDevice device; ArvFakeDevicePrivate *priv; }; struct _ArvFakeDeviceClass { ArvDeviceClass parent_class; }; G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvfakegvcamera.c000066400000000000000000000051711334570641500203050ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #include #include #include static gboolean cancel = FALSE; static void set_cancel (int signal) { cancel = TRUE; } static char *arv_option_interface_name = "lo"; static char *arv_option_debug_domains = NULL; static char *arv_option_genicam_file = NULL; static const GOptionEntry arv_option_entries[] = { { "interface", 'i', 0, G_OPTION_ARG_STRING, &arv_option_interface_name, "Listening interface name", "interface_id"}, { "genicam", 'g', 0, G_OPTION_ARG_STRING, &arv_option_genicam_file, "XML Genicam file to use", "genicam_filename"}, { "debug", 'd', 0, G_OPTION_ARG_STRING, &arv_option_debug_domains, NULL, "category[:level][,...]" }, { NULL } }; int main (int argc, char **argv) { ArvGvFakeCamera *gv_camera; GOptionContext *context; GError *error = NULL; context = g_option_context_new (NULL); g_option_context_set_summary (context, "Fake GigEVision camera."); g_option_context_set_description (context, "Example: 'arv-fake-gv-camera-" ARAVIS_API_VERSION " -i eth0'"); g_option_context_add_main_entries (context, arv_option_entries, NULL); if (!g_option_context_parse (context, &argc, &argv, &error)) { g_option_context_free (context); g_print ("Option parsing failed: %s\n", error->message); g_error_free (error); return EXIT_FAILURE; } g_option_context_free (context); arv_debug_enable (arv_option_debug_domains); arv_set_fake_camera_genicam_filename (arv_option_genicam_file); gv_camera = arv_gv_fake_camera_new (arv_option_interface_name); signal (SIGINT, set_cancel); if (arv_gv_fake_camera_start (gv_camera)) { while (!cancel) sleep (1); arv_gv_fake_camera_stop (gv_camera); } else printf ("Failed to start camera\n"); g_object_unref (gv_camera); return EXIT_SUCCESS; } aravis-ARAVIS_0_6_0/src/arvfakeinterface.c000066400000000000000000000071721334570641500204630ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvfakeinterface * @short_description: Fake interface */ #include #include #include #include #include #include #define ARV_FAKE_DEVICE_ID "Fake_1" #define ARV_FAKE_PHYSICAL_ID "Fake_1" #define ARV_FAKE_ADDRESS "0.0.0.0" #define ARV_FAKE_VENDOR "Aravis" #define ARV_FAKE_MODEL "Fake" #define ARV_FAKE_SERIAL "1" static GObjectClass *parent_class = NULL; static void arv_fake_interface_update_device_list (ArvInterface *interface, GArray *device_ids) { ArvInterfaceDeviceIds *ids; g_assert (device_ids->len == 0); ids = g_new0 (ArvInterfaceDeviceIds, 1); ids->device = g_strdup (ARV_FAKE_DEVICE_ID); ids->physical = g_strdup (ARV_FAKE_PHYSICAL_ID); ids->address = g_strdup (ARV_FAKE_ADDRESS); ids->vendor = g_strdup (ARV_FAKE_VENDOR); ids->model = g_strdup (ARV_FAKE_MODEL); ids->serial_nbr = g_strdup (ARV_FAKE_SERIAL); g_array_append_val (device_ids, ids); } static ArvDevice * arv_fake_interface_open_device (ArvInterface *interface, const char *device_id) { if (g_strcmp0 (device_id, ARV_FAKE_DEVICE_ID) == 0 || g_strcmp0 (device_id, ARV_FAKE_PHYSICAL_ID) == 0) return arv_fake_device_new ("1"); return NULL; } static ArvInterface *fake_interface = NULL; static GMutex fake_interface_mutex; /** * arv_fake_interface_get_instance: * * Gets the unique instance of the fake interface. * * Returns: (transfer none): a #ArvInterface singleton. */ ArvInterface * arv_fake_interface_get_instance (void) { g_mutex_lock (&fake_interface_mutex); if (fake_interface == NULL) fake_interface = g_object_new (ARV_TYPE_FAKE_INTERFACE, NULL); g_mutex_unlock (&fake_interface_mutex); return ARV_INTERFACE (fake_interface); } void arv_fake_interface_destroy_instance (void) { g_mutex_lock (&fake_interface_mutex); if (fake_interface != NULL) { g_object_unref (fake_interface); fake_interface = NULL; } g_mutex_unlock (&fake_interface_mutex); } static void arv_fake_interface_init (ArvFakeInterface *fake_interface) { } static void arv_fake_interface_finalize (GObject *object) { parent_class->finalize (object); } static void arv_fake_interface_class_init (ArvFakeInterfaceClass *fake_interface_class) { GObjectClass *object_class = G_OBJECT_CLASS (fake_interface_class); ArvInterfaceClass *interface_class = ARV_INTERFACE_CLASS (fake_interface_class); parent_class = g_type_class_peek_parent (fake_interface_class); object_class->finalize = arv_fake_interface_finalize; interface_class->update_device_list = arv_fake_interface_update_device_list; interface_class->open_device = arv_fake_interface_open_device; interface_class->protocol = "Fake"; } G_DEFINE_TYPE (ArvFakeInterface, arv_fake_interface, ARV_TYPE_INTERFACE) aravis-ARAVIS_0_6_0/src/arvfakeinterface.h000066400000000000000000000035701334570641500204660ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_FAKE_INTERFACE_H #define ARV_FAKE_INTERFACE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS #define ARV_TYPE_FAKE_INTERFACE (arv_fake_interface_get_type ()) #define ARV_FAKE_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_FAKE_INTERFACE, ArvFakeInterface)) #define ARV_FAKE_INTERFACE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_FAKE_INTERFACE, ArvFakeInterfaceClass)) #define ARV_IS_FAKE_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_FAKE_INTERFACE)) #define ARV_IS_FAKE_INTERFACE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_FAKE_INTERFACE)) #define ARV_FAKE_INTERFACE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_FAKE_INTERFACE, ArvFakeInterfaceClass)) GType arv_fake_interface_get_type (void); ArvInterface * arv_fake_interface_get_instance (void); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvfakeinterfaceprivate.h000066400000000000000000000027571334570641500220670ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_FAKE_INTERFACE_PRIVATE_H #define ARV_FAKE_INTERFACE_PRIVATE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS #define ARV_FAKE_INTERFACE_DISCOVERY_TIMEOUT_MS 1000 #define ARV_FAKE_INTERFACE_SOCKET_BUFFER_SIZE 1024 G_END_DECLS typedef struct _ArvFakeInterfaceClass ArvFakeInterfaceClass; struct _ArvFakeInterface { ArvInterface interface; }; struct _ArvFakeInterfaceClass { ArvInterfaceClass parent_class; }; void arv_fake_interface_destroy_instance (void); #endif aravis-ARAVIS_0_6_0/src/arvfakestream.c000066400000000000000000000131251334570641500200110ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvfakestream * @short_description: Fake stream */ #include #include #include #include #include static GObjectClass *parent_class = NULL; struct _ArvFakeStreamPrivate { GThread *thread; void *thread_data; ArvFakeCamera *camera; }; /* Acquisition thread */ typedef struct { ArvFakeCamera *camera; ArvStream *stream; ArvStreamCallback callback; void *user_data; gboolean cancel; /* Statistics */ guint n_completed_buffers; guint n_failures; guint n_underruns; } ArvFakeStreamThreadData; static void * arv_fake_stream_thread (void *data) { ArvFakeStreamThreadData *thread_data = data; ArvBuffer *buffer; arv_log_stream_thread ("[FakeStream::thread] Start"); if (thread_data->callback != NULL) thread_data->callback (thread_data->user_data, ARV_STREAM_CALLBACK_TYPE_INIT, NULL); while (!g_atomic_int_get (&thread_data->cancel)) { arv_fake_camera_wait_for_next_frame (thread_data->camera); buffer = arv_stream_pop_input_buffer (thread_data->stream); if (buffer != NULL) { if (thread_data->callback != NULL) thread_data->callback (thread_data->user_data, ARV_STREAM_CALLBACK_TYPE_START_BUFFER, NULL); arv_fake_camera_fill_buffer (thread_data->camera, buffer, NULL); if (buffer->priv->status == ARV_BUFFER_STATUS_SUCCESS) thread_data->n_completed_buffers++; else thread_data->n_failures++; arv_stream_push_output_buffer (thread_data->stream, buffer); if (thread_data->callback != NULL) thread_data->callback (thread_data->user_data, ARV_STREAM_CALLBACK_TYPE_BUFFER_DONE, buffer); } else thread_data->n_underruns++; } if (thread_data->callback != NULL) thread_data->callback (thread_data->user_data, ARV_STREAM_CALLBACK_TYPE_EXIT, NULL); arv_log_stream_thread ("[FakeStream::thread] Stop"); return NULL; } /* ArvFakeStream implemenation */ /** * arv_fake_stream_new: (skip) * @camera: a #ArvFakeCamera * @callback: (scope call): image processing callback * @user_data: (closure): user data for @callback * * Return Value: (transfer full): a new #ArvStream. */ ArvStream * arv_fake_stream_new (ArvFakeCamera *camera, ArvStreamCallback callback, void *user_data) { ArvFakeStream *fake_stream; ArvFakeStreamThreadData *thread_data; ArvStream *stream; g_return_val_if_fail (ARV_IS_FAKE_CAMERA (camera), NULL); g_object_ref (camera); fake_stream = g_object_new (ARV_TYPE_FAKE_STREAM, NULL); stream = ARV_STREAM (fake_stream); thread_data = g_new (ArvFakeStreamThreadData, 1); thread_data->stream = stream; thread_data->camera = camera; thread_data->callback = callback; thread_data->user_data = user_data; thread_data->cancel = FALSE; thread_data->n_completed_buffers = 0; thread_data->n_failures = 0; thread_data->n_underruns = 0; fake_stream->priv->camera = camera; fake_stream->priv->thread_data = thread_data; fake_stream->priv->thread = g_thread_new ("arv_fake_stream", arv_fake_stream_thread, fake_stream->priv->thread_data); return ARV_STREAM (fake_stream); } /* ArvStream implementation */ static void arv_fake_stream_get_statistics (ArvStream *stream, guint64 *n_completed_buffers, guint64 *n_failures, guint64 *n_underruns) { ArvFakeStream *fake_stream = ARV_FAKE_STREAM (stream); ArvFakeStreamThreadData *thread_data; thread_data = fake_stream->priv->thread_data; *n_completed_buffers = thread_data->n_completed_buffers; *n_failures = thread_data->n_failures; *n_underruns = thread_data->n_underruns; } static void arv_fake_stream_init (ArvFakeStream *fake_stream) { fake_stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (fake_stream, ARV_TYPE_FAKE_STREAM, ArvFakeStreamPrivate); } static void arv_fake_stream_finalize (GObject *object) { ArvFakeStream *fake_stream = ARV_FAKE_STREAM (object); if (fake_stream->priv->thread != NULL) { ArvFakeStreamThreadData *thread_data; thread_data = fake_stream->priv->thread_data; g_atomic_int_set (&thread_data->cancel, TRUE); g_thread_join (fake_stream->priv->thread); g_free (thread_data); fake_stream->priv->thread_data = NULL; fake_stream->priv->thread = NULL; } g_object_unref (fake_stream->priv->camera); parent_class->finalize (object); } static void arv_fake_stream_class_init (ArvFakeStreamClass *fake_stream_class) { GObjectClass *object_class = G_OBJECT_CLASS (fake_stream_class); ArvStreamClass *stream_class = ARV_STREAM_CLASS (fake_stream_class); g_type_class_add_private (fake_stream_class, sizeof (ArvFakeStreamPrivate)); parent_class = g_type_class_peek_parent (fake_stream_class); object_class->finalize = arv_fake_stream_finalize; stream_class->get_statistics = arv_fake_stream_get_statistics; } G_DEFINE_TYPE (ArvFakeStream, arv_fake_stream, ARV_TYPE_STREAM) aravis-ARAVIS_0_6_0/src/arvfakestream.h000066400000000000000000000034361334570641500200220ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_FAKE_STREAM_H #define ARV_FAKE_STREAM_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS #define ARV_TYPE_FAKE_STREAM (arv_fake_stream_get_type ()) #define ARV_FAKE_STREAM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_FAKE_STREAM, ArvFakeStream)) #define ARV_FAKE_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_FAKE_STREAM, ArvFakeStreamClass)) #define ARV_IS_FAKE_STREAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_FAKE_STREAM)) #define ARV_IS_FAKE_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_FAKE_STREAM)) #define ARV_FAKE_STREAM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_FAKE_STREAM, ArvFakeStreamClass)) GType arv_fake_stream_get_type (void); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvfakestreamprivate.h000066400000000000000000000027211334570641500214110ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_FAKE_STREAM_PRIVATE_H #define ARV_FAKE_STREAM_PRIVATE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef struct _ArvFakeStreamPrivate ArvFakeStreamPrivate; typedef struct _ArvFakeStreamClass ArvFakeStreamClass; struct _ArvFakeStream { ArvStream stream; ArvFakeStreamPrivate *priv; }; struct _ArvFakeStreamClass { ArvStreamClass parent_class; }; ArvStream * arv_fake_stream_new (ArvFakeCamera *camera, ArvStreamCallback callback, void *user_data); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvfeatures.h.in000066400000000000000000000026521334570641500201220ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_FEATURES_H #define ARV_FEATURES_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif /** * ARAVIS_HAS_USB * * ARAVIS_HAS_USB is defined as 1 if aravis is compiled with USB support, 0 if not. * * Since: 0.6.0 */ #define ARAVIS_HAS_USB @ARAVIS_HAS_USB@ /** * ARAVIS_HAS_PACKET_SOCKET * * ARAVIS_HAS_PACKET_SOCKET is defined as 1 if aravis is compiled with packet socket support, 0 if not. * * Since: 0.6.0 */ #define ARAVIS_HAS_PACKET_SOCKET @ARAVIS_HAS_PACKET_SOCKET@ #endif aravis-ARAVIS_0_6_0/src/arvgc.c000066400000000000000000000303461334570641500162640ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION:arvgc * @short_description: Genicam root document class * * #ArvGc implements the root document for the storage of the Genicam feature * nodes. It builds the node tree by parsing an xml file in the Genicam * standard format. See http://www.genicam.org. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static GObjectClass *parent_class = NULL; struct _ArvGcPrivate { GHashTable *nodes; ArvDevice *device; ArvBuffer *buffer; }; GQuark arv_gc_error_quark (void) { return g_quark_from_static_string ("arv-gc-error-quark"); } /* ArvDomNode implementation */ static gboolean arv_gc_can_append_child (ArvDomNode *self, ArvDomNode *child) { return ARV_IS_GC_NODE (child); } /* ArvDomDocument implementation */ static ArvDomElement * arv_gc_create_element (ArvDomDocument *document, const char *tag_name) { ArvGcNode *node = NULL; if (strcmp (tag_name, "Category") == 0) node = arv_gc_category_new (); else if (strcmp (tag_name, "Command") == 0) node = arv_gc_command_new (); else if (strcmp (tag_name, "Converter") == 0) node = arv_gc_converter_new (); else if (strcmp (tag_name, "IntConverter") == 0) node = arv_gc_converter_new_integer (); else if (strcmp (tag_name, "IntReg") == 0) node = arv_gc_register_node_new_integer (); else if (strcmp (tag_name, "MaskedIntReg") == 0) node = arv_gc_register_node_new_masked_integer (); else if (strcmp (tag_name, "FloatReg") == 0) node = arv_gc_register_node_new_float (); else if (strcmp (tag_name, "StringReg") == 0) node = arv_gc_register_node_new_string (); else if (strcmp (tag_name, "StructReg") == 0) node = arv_gc_register_node_new_struct_register (); else if (strcmp (tag_name, "StructEntry") == 0) node = arv_gc_struct_entry_node_new (); else if (strcmp (tag_name, "Integer") == 0) node = arv_gc_integer_node_new (); else if (strcmp (tag_name, "Float") == 0) node = arv_gc_float_node_new (); else if (strcmp (tag_name, "Boolean") == 0) node = arv_gc_boolean_new (); else if (strcmp (tag_name, "Enumeration") == 0) node = arv_gc_enumeration_new (); else if (strcmp (tag_name, "EnumEntry") == 0) node = arv_gc_enum_entry_new (); else if (strcmp (tag_name, "SwissKnife") == 0) node = arv_gc_swiss_knife_new (); else if (strcmp (tag_name, "IntSwissKnife") == 0) node = arv_gc_swiss_knife_new_integer (); else if (strcmp (tag_name, "Port") == 0) node = arv_gc_port_new (); else if (strcmp (tag_name, "pIndex") == 0) node = arv_gc_index_node_new (); else if (strcmp (tag_name, "RegisterDescription") == 0) node = arv_gc_register_description_node_new (); else if (strcmp (tag_name, "pFeature") == 0) node = arv_gc_property_node_new_p_feature (); else if (strcmp (tag_name, "Value") == 0) node = arv_gc_property_node_new_value (); else if (strcmp (tag_name, "pValue") == 0) node = arv_gc_property_node_new_p_value (); else if (strcmp (tag_name, "Address") == 0) node = arv_gc_property_node_new_address (); else if (strcmp (tag_name, "pAddress") == 0) node = arv_gc_property_node_new_p_address (); else if (strcmp (tag_name, "Description") == 0) node = arv_gc_property_node_new_description (); else if (strcmp (tag_name, "ToolTip") == 0) node = arv_gc_property_node_new_tooltip (); else if (strcmp (tag_name, "DisplayName") == 0) node = arv_gc_property_node_new_display_name (); else if (strcmp (tag_name, "Min") == 0) node = arv_gc_property_node_new_minimum (); else if (strcmp (tag_name, "pMin") == 0) node = arv_gc_property_node_new_p_minimum (); else if (strcmp (tag_name, "Max") == 0) node = arv_gc_property_node_new_maximum (); else if (strcmp (tag_name, "pMax") == 0) node = arv_gc_property_node_new_p_maximum (); else if (strcmp (tag_name, "Inc") == 0) node = arv_gc_property_node_new_increment (); else if (strcmp (tag_name, "pInc") == 0) node = arv_gc_property_node_new_p_increment (); else if (strcmp (tag_name, "Unit") == 0) node = arv_gc_property_node_new_unit (); else if (strcmp (tag_name, "OnValue") == 0) node = arv_gc_property_node_new_on_value (); else if (strcmp (tag_name, "OffValue") == 0) node = arv_gc_property_node_new_off_value (); else if (strcmp (tag_name, "pIsImplemented") == 0) node = arv_gc_property_node_new_p_is_implemented (); else if (strcmp (tag_name, "pIsAvailable") == 0) node = arv_gc_property_node_new_p_is_available (); else if (strcmp (tag_name, "pIsLocked") == 0) node = arv_gc_property_node_new_p_is_locked (); else if (strcmp (tag_name, "Length") == 0) node = arv_gc_property_node_new_length (); else if (strcmp (tag_name, "pLength") == 0) node = arv_gc_property_node_new_p_length (); else if (strcmp (tag_name, "pPort") == 0) node = arv_gc_property_node_new_p_port (); else if (strcmp (tag_name, "pVariable") == 0) node = arv_gc_property_node_new_p_variable (); else if (strcmp (tag_name, "ValueIndexed") == 0) node = arv_gc_value_indexed_node_new (); else if (strcmp (tag_name, "pValueIndexed") == 0) node = arv_gc_p_value_indexed_node_new (); else if (strcmp (tag_name, "ValueDefault") == 0) node = arv_gc_property_node_new_value_default (); else if (strcmp (tag_name, "pValueDefault") == 0) node = arv_gc_property_node_new_p_value_default (); else if (strcmp (tag_name, "Formula") == 0) node = arv_gc_property_node_new_formula (); else if (strcmp (tag_name, "FormulaTo") == 0) node = arv_gc_property_node_new_formula_to (); else if (strcmp (tag_name, "FormulaFrom") == 0) node = arv_gc_property_node_new_formula_from (); else if (strcmp (tag_name, "Expression") == 0) node = arv_gc_property_node_new_expression (); else if (strcmp (tag_name, "Constant") == 0) node = arv_gc_property_node_new_constant (); else if (strcmp (tag_name, "AccessMode") == 0) node = arv_gc_property_node_new_access_mode (); else if (strcmp (tag_name, "Cachable") == 0) node = arv_gc_property_node_new_cachable (); else if (strcmp (tag_name, "PollingTime") == 0) node = arv_gc_property_node_new_polling_time (); else if (strcmp (tag_name, "Endianess") == 0) node = arv_gc_property_node_new_endianess (); else if (strcmp (tag_name, "Sign") == 0) node = arv_gc_property_node_new_sign (); else if (strcmp (tag_name, "LSB") == 0) node = arv_gc_property_node_new_lsb (); else if (strcmp (tag_name, "MSB") == 0) node = arv_gc_property_node_new_msb (); else if (strcmp (tag_name, "Bit") == 0) node = arv_gc_property_node_new_bit (); else if (strcmp (tag_name, "pInvalidator") == 0) node = arv_gc_invalidator_node_new (); else if (strcmp (tag_name, "CommandValue") == 0) node = arv_gc_property_node_new_command_value (); else if (strcmp (tag_name, "pCommandValue") == 0) node = arv_gc_property_node_new_p_command_value (); else if (strcmp (tag_name, "ChunkID") == 0) node = arv_gc_property_node_new_chunk_id (); else if (strcmp (tag_name, "Group") == 0) node = arv_gc_group_node_new (); else arv_debug_dom ("[Genicam::create_element] Unknow tag (%s)", tag_name); return ARV_DOM_ELEMENT (node); } /* ArvGc implementation */ /** * arv_gc_get_node: * @genicam: a #ArvGc object * @name: node name * * Retrieves a genicam node by name. * * Return value: (transfer none): a #ArvGcNode, null if not found. */ ArvGcNode * arv_gc_get_node (ArvGc *genicam, const char *name) { g_return_val_if_fail (ARV_IS_GC (genicam), NULL); g_return_val_if_fail (name != NULL, NULL); return g_hash_table_lookup (genicam->priv->nodes, name); } /** * arv_gc_get_device: * @genicam: a #ArvGc object * * Retrieves the device handled by this genicam interface. The device is used for register access. * * Return value: (transfer none): a #ArvDevice. */ ArvDevice * arv_gc_get_device (ArvGc *genicam) { g_return_val_if_fail (ARV_IS_GC (genicam), NULL); return genicam->priv->device; } void arv_gc_register_feature_node (ArvGc *genicam, ArvGcFeatureNode *node) { const char *name; g_return_if_fail (ARV_IS_GC (genicam)); g_return_if_fail (ARV_IS_GC_FEATURE_NODE (node)); name = arv_gc_feature_node_get_name (node); if (name == NULL) return; g_object_ref (node); g_hash_table_remove (genicam->priv->nodes, (char *) name); g_hash_table_insert (genicam->priv->nodes, (char *) name, node); arv_log_genicam ("[Gc::register_feature_node] Register node '%s' [%s]", name, arv_dom_node_get_node_name (ARV_DOM_NODE (node))); } void arv_gc_set_default_node_data (ArvGc *genicam, const char *node_name, const char *node_data) { g_return_if_fail (ARV_IS_GC (genicam)); g_return_if_fail (node_name != NULL); g_return_if_fail (node_data != NULL); if (arv_gc_get_node (genicam, node_name) != NULL) return; arv_dom_document_append_from_memory (ARV_DOM_DOCUMENT (genicam), NULL, node_data, -1, NULL); } static void _weak_notify_cb (gpointer data, GObject *object) { ArvGc *genicam = data; genicam->priv->buffer = NULL; } void arv_gc_set_buffer (ArvGc *genicam, ArvBuffer *buffer) { g_return_if_fail (ARV_IS_GC (genicam)); g_return_if_fail (ARV_IS_BUFFER (buffer)); if (genicam->priv->buffer != NULL) g_object_weak_unref (G_OBJECT (genicam->priv->buffer), _weak_notify_cb, genicam); g_object_weak_ref (G_OBJECT (buffer), _weak_notify_cb, genicam); genicam->priv->buffer = buffer; } /** * arv_gc_get_buffer: * @genicam: a #ArvGc object * * Retrieves the binded buffer. * * Return value: (transfer none): a #ArvBuffer. */ ArvBuffer * arv_gc_get_buffer (ArvGc *genicam) { g_return_val_if_fail (ARV_IS_GC (genicam), NULL); return genicam->priv->buffer; } ArvGc * arv_gc_new (ArvDevice *device, const void *xml, size_t size) { ArvDomDocument *document; ArvGc *genicam; document = arv_dom_document_new_from_memory (xml, size, NULL); if (!ARV_IS_GC (document)) { if (document != NULL) g_object_unref (document); return NULL; } genicam = ARV_GC (document); genicam->priv->device = device; return genicam; } static void arv_gc_init (ArvGc *genicam) { genicam->priv = G_TYPE_INSTANCE_GET_PRIVATE (genicam, ARV_TYPE_GC, ArvGcPrivate); genicam->priv->nodes = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref); } static void arv_gc_finalize (GObject *object) { ArvGc *genicam = ARV_GC (object); if (genicam->priv->buffer != NULL) g_object_weak_unref (G_OBJECT (genicam->priv->buffer), _weak_notify_cb, genicam); g_hash_table_unref (genicam->priv->nodes); parent_class->finalize (object); } static void arv_gc_class_init (ArvGcClass *node_class) { GObjectClass *object_class = G_OBJECT_CLASS (node_class); ArvDomNodeClass *d_node_class = ARV_DOM_NODE_CLASS (node_class); ArvDomDocumentClass *d_document_class = ARV_DOM_DOCUMENT_CLASS (node_class); g_type_class_add_private (node_class, sizeof (ArvGcPrivate)); parent_class = g_type_class_peek_parent (node_class); object_class->finalize = arv_gc_finalize; d_node_class->can_append_child = arv_gc_can_append_child; d_document_class->create_element = arv_gc_create_element; } G_DEFINE_TYPE (ArvGc, arv_gc, ARV_TYPE_DOM_DOCUMENT) aravis-ARAVIS_0_6_0/src/arvgc.h000066400000000000000000000050601334570641500162640ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_H #define ARV_GC_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS #define ARV_GC_ERROR arv_gc_error_quark() GQuark arv_gc_error_quark (void); typedef enum { ARV_GC_ERROR_PROPERTY_NOT_DEFINED, ARV_GC_ERROR_PVALUE_NOT_DEFINED, ARV_GC_ERROR_INVALID_PVALUE, ARV_GC_ERROR_EMPTY_ENUMERATION, ARV_GC_ERROR_OUT_OF_RANGE } ArvGcError; #define ARV_TYPE_GC (arv_gc_get_type ()) #define ARV_GC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC, ArvGc)) #define ARV_GC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GC, ArvGcClass)) #define ARV_IS_GC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC)) #define ARV_IS_GC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GC)) #define ARV_GC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GC, ArvGcClass)) typedef struct _ArvGcPrivate ArvGcPrivate; typedef struct _ArvGcClass ArvGcClass; struct _ArvGc { ArvDomDocument base; ArvGcPrivate *priv; }; struct _ArvGcClass { ArvDomDocumentClass parent_class; }; GType arv_gc_get_type (void); ArvGc * arv_gc_new (ArvDevice *device, const void *xml, size_t size); void arv_gc_register_feature_node (ArvGc *genicam, ArvGcFeatureNode *node); void arv_gc_set_default_node_data (ArvGc *genicam, const char *node_name, const char *node_data); ArvGcNode * arv_gc_get_node (ArvGc *genicam, const char *name); ArvDevice * arv_gc_get_device (ArvGc *genicam); void arv_gc_set_buffer (ArvGc *genicam, ArvBuffer *buffer); ArvBuffer * arv_gc_get_buffer (ArvGc *genicam); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcboolean.c000066400000000000000000000154551334570641500176300ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcboolean * @short_description: Class for Boolean nodes */ #include #include #include #include #include static GObjectClass *parent_class = NULL; /* ArvDomNode implementation */ static const char * arv_gc_boolean_get_node_name (ArvDomNode *node) { return "Boolean"; } static void arv_gc_boolean_post_new_child (ArvDomNode *self, ArvDomNode *child) { ArvGcBoolean *node = ARV_GC_BOOLEAN (self); if (ARV_IS_GC_PROPERTY_NODE (child)) { ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (child); switch (arv_gc_property_node_get_node_type (property_node)) { case ARV_GC_PROPERTY_NODE_TYPE_VALUE: case ARV_GC_PROPERTY_NODE_TYPE_P_VALUE: node->value = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_ON_VALUE: node->on_value = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_OFF_VALUE: node->off_value = property_node; break; default: ARV_DOM_NODE_CLASS (parent_class)->post_new_child (self, child); break; } } } static void arv_gc_boolean_pre_remove_child (ArvDomNode *self, ArvDomNode *child) { g_assert_not_reached (); } /* ArvGcFeatureNode implementation */ static void arv_gc_boolean_set_value_from_string (ArvGcFeatureNode *node, const char *string, GError **error) { GError *local_error = NULL; arv_gc_boolean_set_value (ARV_GC_BOOLEAN (node), g_strcmp0 (string, "true") == 0, &local_error); if (local_error != NULL) g_propagate_error (error, local_error); } static const char * arv_gc_boolean_get_value_as_string (ArvGcFeatureNode *node, GError **error) { const char *string; GError *local_error = NULL; string = arv_gc_boolean_get_value (ARV_GC_BOOLEAN (node), &local_error) ? "true" : "false"; if (local_error != NULL) { g_propagate_error (error, local_error); return NULL; } return string; } static GType arv_gc_boolean_get_value_type (ArvGcFeatureNode *node) { return G_TYPE_BOOLEAN; } /* ArvGcBoolean implementation */ static gint64 arv_gc_boolean_get_on_value (ArvGcBoolean *gc_boolean, GError **error) { gint64 on_value; GError *local_error = NULL; if (gc_boolean->on_value == NULL) return 1; on_value = arv_gc_property_node_get_int64 (gc_boolean->on_value, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 1; } return on_value; } static gint64 arv_gc_boolean_get_off_value (ArvGcBoolean *gc_boolean, GError **error) { gint64 off_value; GError *local_error = NULL; if (gc_boolean->off_value == NULL) return 0; off_value = arv_gc_property_node_get_int64 (gc_boolean->off_value, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } return off_value; } gboolean arv_gc_boolean_get_value (ArvGcBoolean *gc_boolean, GError **error) { gboolean value; gint64 on_value; GError *local_error = NULL; g_return_val_if_fail (ARV_IS_GC_BOOLEAN (gc_boolean), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); if (gc_boolean->value == NULL) return FALSE; value = arv_gc_property_node_get_int64 (gc_boolean->value, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return FALSE; } on_value = arv_gc_boolean_get_on_value (gc_boolean, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return FALSE; } return value == on_value; } void arv_gc_boolean_set_value (ArvGcBoolean *gc_boolean, gboolean v_boolean, GError **error) { gboolean value; GError *local_error = NULL; g_return_if_fail (ARV_IS_GC_BOOLEAN (gc_boolean)); g_return_if_fail (error == NULL || *error == NULL); if (v_boolean) value = arv_gc_boolean_get_on_value (gc_boolean, &local_error); else value = arv_gc_boolean_get_off_value (gc_boolean, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } arv_gc_property_node_set_int64 (gc_boolean->value, value, &local_error); if (local_error != NULL) g_propagate_error (error, local_error); } ArvGcNode * arv_gc_boolean_new (void) { ArvGcNode *node; node = g_object_new (ARV_TYPE_GC_BOOLEAN, NULL); return node; } static void arv_gc_boolean_init (ArvGcBoolean *gc_boolean) { } static void arv_gc_boolean_finalize (GObject *object) { parent_class->finalize (object); } static void arv_gc_boolean_class_init (ArvGcBooleanClass *this_class) { GObjectClass *object_class = G_OBJECT_CLASS (this_class); ArvDomNodeClass *dom_node_class = ARV_DOM_NODE_CLASS (this_class); ArvGcFeatureNodeClass *gc_feature_node_class = ARV_GC_FEATURE_NODE_CLASS (this_class); parent_class = g_type_class_peek_parent (this_class); object_class->finalize = arv_gc_boolean_finalize; dom_node_class->get_node_name = arv_gc_boolean_get_node_name; dom_node_class->post_new_child = arv_gc_boolean_post_new_child; dom_node_class->pre_remove_child = arv_gc_boolean_pre_remove_child; gc_feature_node_class->set_value_from_string = arv_gc_boolean_set_value_from_string; gc_feature_node_class->get_value_as_string = arv_gc_boolean_get_value_as_string; gc_feature_node_class->get_value_type = arv_gc_boolean_get_value_type; } /* ArvGcInteger interface implementation */ static gint64 arv_gc_boolean_get_integer_value (ArvGcInteger *gc_integer, GError **error) { ArvGcBoolean *gc_boolean = ARV_GC_BOOLEAN (gc_integer); return arv_gc_boolean_get_value (gc_boolean, error) ? 1 : 0 ; } static void arv_gc_boolean_set_integer_value (ArvGcInteger *gc_integer, gint64 value, GError **error) { ArvGcBoolean *gc_boolean = ARV_GC_BOOLEAN (gc_integer); return arv_gc_boolean_set_value (gc_boolean, value != 0, error); } static void arv_gc_boolean_integer_interface_init (ArvGcIntegerInterface *interface) { interface->get_value = arv_gc_boolean_get_integer_value; interface->set_value = arv_gc_boolean_set_integer_value; } G_DEFINE_TYPE_WITH_CODE (ArvGcBoolean, arv_gc_boolean, ARV_TYPE_GC_FEATURE_NODE, G_IMPLEMENT_INTERFACE (ARV_TYPE_GC_INTEGER, arv_gc_boolean_integer_interface_init)) aravis-ARAVIS_0_6_0/src/arvgcboolean.h000066400000000000000000000043751334570641500176340ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_BOOLEAN_H #define ARV_GC_BOOLEAN_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS #define ARV_TYPE_GC_BOOLEAN (arv_gc_boolean_get_type ()) #define ARV_GC_BOOLEAN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_BOOLEAN, ArvGcBoolean)) #define ARV_GC_BOOLEAN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GC_BOOLEAN, ArvGcBooleanClass)) #define ARV_IS_GC_BOOLEAN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_BOOLEAN)) #define ARV_IS_GC_BOOLEAN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GC_BOOLEAN)) #define ARV_GC_BOOLEAN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GC_BOOLEAN, ArvGcBooleanClass)) typedef struct _ArvGcBooleanClass ArvGcBooleanClass; struct _ArvGcBoolean { ArvGcFeatureNode node; ArvGcPropertyNode *value; ArvGcPropertyNode *on_value; ArvGcPropertyNode *off_value; }; struct _ArvGcBooleanClass { ArvGcFeatureNodeClass parent_class; }; GType arv_gc_boolean_get_type (void); ArvGcNode * arv_gc_boolean_new (void); gboolean arv_gc_boolean_get_value (ArvGcBoolean *gc_boolean, GError **error); void arv_gc_boolean_set_value (ArvGcBoolean *gc_boolean, gboolean v_boolean, GError **error); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgccategory.c000066400000000000000000000067521334570641500200260ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgccategory * @short_description: Class for Category nodes */ #include #include #include #include static GObjectClass *parent_class = NULL; /* ArvDomNode implementation */ static const char * arv_gc_category_get_node_name (ArvDomNode *node) { return "Category"; } static gboolean arv_gc_category_can_append_child (ArvDomNode *parent, ArvDomNode *child) { return ARV_IS_GC_PROPERTY_NODE (child) && arv_gc_property_node_get_node_type (ARV_GC_PROPERTY_NODE (child)) == ARV_GC_PROPERTY_NODE_TYPE_P_FEATURE; } /* ArvGcCategory implementation */ static void _free_features (ArvGcCategory *category) { GSList *iter; for (iter = category->features; iter != NULL; iter = iter->next) g_free (iter->data); g_slist_free (category->features); category->features = NULL; } /** * arv_gc_category_get_features: * @category: a #ArvGcCategory * * Get a list of strings with the name of the features listed in the given category node. * * Returns: (element-type utf8) (transfer none): a list of strings. */ const GSList * arv_gc_category_get_features (ArvGcCategory *category) { ArvDomNode *iter; ArvGcNode *node; g_return_val_if_fail (ARV_IS_GC_CATEGORY (category), NULL); _free_features (category); for (iter = arv_dom_node_get_first_child (ARV_DOM_NODE (category)); iter != NULL; iter = arv_dom_node_get_next_sibling (iter)) { node = arv_gc_property_node_get_linked_node (ARV_GC_PROPERTY_NODE (iter)); if (ARV_IS_GC_FEATURE_NODE (node)) { char *name; name = g_strdup (arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (node))); category->features = g_slist_append (category->features, name); } } return category->features; } ArvGcNode * arv_gc_category_new (void) { ArvGcNode *node; node = g_object_new (ARV_TYPE_GC_CATEGORY, NULL); return node; } static void arv_gc_category_init (ArvGcCategory *gc_category) { gc_category->features = NULL; } static void arv_gc_category_finalize (GObject *object) { ArvGcCategory *category = ARV_GC_CATEGORY (object); _free_features (category); parent_class->finalize (object); } static void arv_gc_category_class_init (ArvGcCategoryClass *this_class) { GObjectClass *object_class = G_OBJECT_CLASS (this_class); ArvDomNodeClass *dom_node_class = ARV_DOM_NODE_CLASS (this_class); parent_class = g_type_class_peek_parent (this_class); object_class->finalize = arv_gc_category_finalize; dom_node_class->get_node_name = arv_gc_category_get_node_name; dom_node_class->can_append_child = arv_gc_category_can_append_child; } G_DEFINE_TYPE (ArvGcCategory, arv_gc_category, ARV_TYPE_GC_FEATURE_NODE) aravis-ARAVIS_0_6_0/src/arvgccategory.h000066400000000000000000000041071334570641500200230ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_CATEGORY_H #define ARV_GC_CATEGORY_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS #define ARV_TYPE_GC_CATEGORY (arv_gc_category_get_type ()) #define ARV_GC_CATEGORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_CATEGORY, ArvGcCategory)) #define ARV_GC_CATEGORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GC_CATEGORY, ArvGcCategoryClass)) #define ARV_IS_GC_CATEGORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_CATEGORY)) #define ARV_IS_GC_CATEGORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GC_CATEGORY)) #define ARV_GC_CATEGORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GC_CATEGORY, ArvGcCategoryClass)) typedef struct _ArvGcCategoryClass ArvGcCategoryClass; struct _ArvGcCategory { ArvGcFeatureNode base; GSList *features; }; struct _ArvGcCategoryClass { ArvGcFeatureNodeClass parent_class; }; GType arv_gc_category_get_type (void); ArvGcNode * arv_gc_category_new (void); const GSList * arv_gc_category_get_features (ArvGcCategory *category); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgccommand.c000066400000000000000000000074431334570641500176250ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgccommand * @short_description: Class for Command nodes */ #include #include #include #include #include #include #include #include static GObjectClass *parent_class = NULL; /* ArvGcFeatureNode implementation */ static const char * arv_gc_command_get_node_name (ArvDomNode *node) { return "Command"; } static void arv_gc_command_post_new_child (ArvDomNode *self, ArvDomNode *child) { ArvGcCommand *node = ARV_GC_COMMAND (self); if (ARV_IS_GC_PROPERTY_NODE (child)) { ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (child); switch (arv_gc_property_node_get_node_type (property_node)) { case ARV_GC_PROPERTY_NODE_TYPE_VALUE: case ARV_GC_PROPERTY_NODE_TYPE_P_VALUE: node->value = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_COMMAND_VALUE: case ARV_GC_PROPERTY_NODE_TYPE_P_COMMAND_VALUE: node->command_value = property_node; break; default: ARV_DOM_NODE_CLASS (parent_class)->post_new_child (self, child); break; } } } static void arv_gc_command_pre_remove_child (ArvDomNode *self, ArvDomNode *child) { g_assert_not_reached (); } /* ArvGcFeatureNode implementation */ /* ArvGcCommand implementation */ void arv_gc_command_execute (ArvGcCommand *gc_command, GError **error) { ArvGc *genicam; GError *local_error = NULL; gint64 command_value; g_return_if_fail (ARV_IS_GC_COMMAND (gc_command)); genicam = arv_gc_node_get_genicam (ARV_GC_NODE (gc_command)); g_return_if_fail (ARV_IS_GC (genicam)); if (gc_command->value == NULL) return; command_value = arv_gc_property_node_get_int64 (gc_command->command_value, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } arv_gc_property_node_set_int64 (gc_command->value, command_value, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } arv_log_genicam ("[GcCommand::execute] %s (0x%x)", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (gc_command)), command_value); } ArvGcNode * arv_gc_command_new (void) { ArvGcNode *node; node = g_object_new (ARV_TYPE_GC_COMMAND, NULL); return node; } static void arv_gc_command_init (ArvGcCommand *gc_command) { } static void arv_gc_command_finalize (GObject *object) { parent_class->finalize (object); } static void arv_gc_command_class_init (ArvGcCommandClass *this_class) { GObjectClass *object_class = G_OBJECT_CLASS (this_class); ArvDomNodeClass *dom_node_class = ARV_DOM_NODE_CLASS (this_class); parent_class = g_type_class_peek_parent (this_class); object_class->finalize = arv_gc_command_finalize; dom_node_class->get_node_name = arv_gc_command_get_node_name; dom_node_class->post_new_child = arv_gc_command_post_new_child; dom_node_class->pre_remove_child = arv_gc_command_pre_remove_child; } G_DEFINE_TYPE (ArvGcCommand, arv_gc_command, ARV_TYPE_GC_FEATURE_NODE) aravis-ARAVIS_0_6_0/src/arvgccommand.h000066400000000000000000000041751334570641500176310ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_COMMAND_H #define ARV_GC_COMMAND_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS #define ARV_TYPE_GC_COMMAND (arv_gc_command_get_type ()) #define ARV_GC_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_COMMAND, ArvGcCommand)) #define ARV_GC_COMMAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GC_COMMAND, ArvGcCommandClass)) #define ARV_IS_GC_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_COMMAND)) #define ARV_IS_GC_COMMAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GC_COMMAND)) #define ARV_GC_COMMAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GC_COMMAND, ArvGcCommandClass)) typedef struct _ArvGcCommandClass ArvGcCommandClass; struct _ArvGcCommand { ArvGcFeatureNode node; ArvGcPropertyNode *command_value; ArvGcPropertyNode *value; }; struct _ArvGcCommandClass { ArvGcFeatureNodeClass parent_class; }; GType arv_gc_command_get_type (void); ArvGcNode * arv_gc_command_new (void); void arv_gc_command_execute (ArvGcCommand *gc_command, GError **error); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcconverter.c000066400000000000000000000460671334570641500202230ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcconverter * @short_description: Class for Converter and IntConverter nodes */ #include #include #include #include #include #include #include #include typedef enum { ARV_GC_CONVERTER_NODE_TYPE_VALUE, ARV_GC_CONVERTER_NODE_TYPE_MIN, ARV_GC_CONVERTER_NODE_TYPE_MAX } ArvGcConverterNodeType; static GObjectClass *parent_class = NULL; /* ArvDomNode implementation */ static const char * arv_gc_converter_get_node_name (ArvDomNode *node) { ArvGcConverter *gc_converter = ARV_GC_CONVERTER (node); if (gc_converter->value_type == G_TYPE_DOUBLE) return "Converter"; return "IntConverter"; } static void arv_gc_converter_post_new_child (ArvDomNode *self, ArvDomNode *child) { ArvGcConverter *node = ARV_GC_CONVERTER (self); if (ARV_IS_GC_PROPERTY_NODE (child)) { ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (child); switch (arv_gc_property_node_get_node_type (property_node)) { case ARV_GC_PROPERTY_NODE_TYPE_P_VARIABLE: node->variables = g_slist_prepend (node->variables, property_node); break; case ARV_GC_PROPERTY_NODE_TYPE_P_VALUE: node->value = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_FORMULA_TO: node->formula_to_node = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_FORMULA_FROM: node->formula_from_node = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_EXPRESSION: node->expressions = g_slist_prepend (node->expressions, property_node); break; case ARV_GC_PROPERTY_NODE_TYPE_CONSTANT: node->constants = g_slist_prepend (node->constants, property_node); break; case ARV_GC_PROPERTY_NODE_TYPE_UNIT: node->unit = property_node; break; default: ARV_DOM_NODE_CLASS (parent_class)->post_new_child (self, child); break; } } } static void arv_gc_converter_pre_remove_child (ArvDomNode *self, ArvDomNode *child) { g_assert_not_reached (); } /* ArvGcFeatureNode implementation */ static GType arv_gc_converter_node_get_value_type (ArvGcFeatureNode *node) { ArvGcConverter *gc_converter = ARV_GC_CONVERTER (node); return gc_converter->value_type; } static void _set_value_from_string (ArvGcFeatureNode *node, const char *string, GError **error) { ArvGcConverter *converter = ARV_GC_CONVERTER (node); GError *local_error = NULL; if (converter->value_type == G_TYPE_DOUBLE) arv_gc_float_set_value (ARV_GC_FLOAT (node), g_ascii_strtod (string, NULL), &local_error); else arv_gc_integer_set_value (ARV_GC_INTEGER (node), g_ascii_strtoll (string, NULL, 0), &local_error); if (local_error != NULL) g_propagate_error (error, local_error); } /* ArvGcConverter implementation */ ArvGcNode * arv_gc_converter_new (void) { ArvGcConverter *converter; converter = g_object_new (ARV_TYPE_GC_CONVERTER, NULL); converter->value_type = G_TYPE_DOUBLE; return ARV_GC_NODE (converter); } ArvGcNode * arv_gc_converter_new_integer (void) { ArvGcConverter *converter; converter = g_object_new (ARV_TYPE_GC_CONVERTER, NULL); converter->value_type = G_TYPE_INT64; return ARV_GC_NODE (converter); } static void arv_gc_converter_init (ArvGcConverter *gc_converter) { gc_converter->formula_to = arv_evaluator_new (NULL); gc_converter->formula_from = arv_evaluator_new (NULL); gc_converter->value = NULL; } static void arv_gc_converter_finalize (GObject *object) { ArvGcConverter *gc_converter = ARV_GC_CONVERTER (object); g_slist_free (gc_converter->variables); g_slist_free (gc_converter->expressions); g_slist_free (gc_converter->constants); g_object_unref (gc_converter->formula_to); g_object_unref (gc_converter->formula_from); parent_class->finalize (object); } static void arv_gc_converter_class_init (ArvGcConverterClass *this_class) { GObjectClass *object_class = G_OBJECT_CLASS (this_class); ArvDomNodeClass *dom_node_class = ARV_DOM_NODE_CLASS (this_class); ArvGcFeatureNodeClass *gc_feature_node_class = ARV_GC_FEATURE_NODE_CLASS (this_class); parent_class = g_type_class_peek_parent (this_class); object_class->finalize = arv_gc_converter_finalize; dom_node_class->get_node_name = arv_gc_converter_get_node_name; dom_node_class->post_new_child = arv_gc_converter_post_new_child; dom_node_class->pre_remove_child = arv_gc_converter_pre_remove_child; gc_feature_node_class->get_value_type = arv_gc_converter_node_get_value_type; gc_feature_node_class->set_value_from_string = _set_value_from_string; } /* ArvGcInteger interface implementation */ static gboolean _update_from_variables (ArvGcConverter *gc_converter, ArvGcConverterNodeType node_type, GError **error) { ArvGcNode *node = NULL; GError *local_error = NULL; GSList *iter; const char *expression; if (gc_converter->formula_from_node != NULL) expression = arv_gc_property_node_get_string (gc_converter->formula_from_node, &local_error); else expression = ""; if (local_error != NULL) { g_propagate_error (error, local_error); return FALSE; } arv_evaluator_set_expression (gc_converter->formula_from, expression); for (iter = gc_converter->expressions; iter != NULL; iter = iter->next) { const char *expression; const char *name; expression = arv_gc_property_node_get_string (ARV_GC_PROPERTY_NODE (iter->data), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return FALSE; } name = arv_gc_property_node_get_name (iter->data); arv_evaluator_set_sub_expression (gc_converter->formula_from, name, expression); } for (iter = gc_converter->constants; iter != NULL; iter = iter->next) { const char *constant; const char *name; constant = arv_gc_property_node_get_string (ARV_GC_PROPERTY_NODE (iter->data), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return FALSE; } name = arv_gc_property_node_get_name (iter->data); arv_evaluator_set_constant (gc_converter->formula_from, name, constant); } for (iter = gc_converter->variables; iter != NULL; iter = iter->next) { ArvGcPropertyNode *variable_node = iter->data; node = arv_gc_property_node_get_linked_node (ARV_GC_PROPERTY_NODE (variable_node)); if (arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (node)) == G_TYPE_INT64) { gint64 value; value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return FALSE; } arv_evaluator_set_int64_variable (gc_converter->formula_from, arv_gc_property_node_get_name (variable_node), value); } else if (arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (node)) == G_TYPE_DOUBLE) { double value; value = arv_gc_float_get_value (ARV_GC_FLOAT (node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return FALSE; } arv_evaluator_set_double_variable (gc_converter->formula_from, arv_gc_property_node_get_name (variable_node), value); } } if (gc_converter->value != NULL) { node = arv_gc_property_node_get_linked_node (gc_converter->value); if (arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (node)) == G_TYPE_INT64) { gint64 value; switch (node_type) { case ARV_GC_CONVERTER_NODE_TYPE_MIN: value = arv_gc_integer_get_min (ARV_GC_INTEGER (node), &local_error); break; case ARV_GC_CONVERTER_NODE_TYPE_MAX: value = arv_gc_integer_get_max (ARV_GC_INTEGER (node), &local_error); break; default: value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), &local_error); break; } if (local_error != NULL) { g_propagate_error (error, local_error); return FALSE; } arv_evaluator_set_int64_variable (gc_converter->formula_from, "TO", value); } else if (arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (node)) == G_TYPE_DOUBLE) { double value; switch (node_type) { case ARV_GC_CONVERTER_NODE_TYPE_MIN: value = arv_gc_float_get_min (ARV_GC_FLOAT (node), &local_error); break; case ARV_GC_CONVERTER_NODE_TYPE_MAX: value = arv_gc_float_get_max (ARV_GC_FLOAT (node), &local_error); break; default: value = arv_gc_float_get_value (ARV_GC_FLOAT (node), &local_error); break; } if (local_error != NULL) { g_propagate_error (error, local_error); return FALSE; } arv_evaluator_set_double_variable (gc_converter->formula_from, "TO", value); } else { arv_warning_genicam ("[GcConverter::set_value] Invalid pValue node '%s'", gc_converter->value); g_set_error (error, ARV_GC_ERROR, ARV_GC_ERROR_INVALID_PVALUE, "pValue node '%s' of '%s' is invalid", arv_gc_property_node_get_string (gc_converter->value, NULL), arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (gc_converter))); return FALSE; } } else { g_set_error (error, ARV_GC_ERROR, ARV_GC_ERROR_PVALUE_NOT_DEFINED, "pValue node of '%s' converter is not defined", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (gc_converter))); return FALSE; } return TRUE; } static const char * _get_unit (ArvGcConverter *gc_converter, GError **error) { if (gc_converter->unit == NULL) return NULL; return arv_gc_property_node_get_string (ARV_GC_PROPERTY_NODE (gc_converter->unit), error); } static void _update_to_variables (ArvGcConverter *gc_converter, GError **error) { ArvGcNode *node; GError *local_error = NULL; GSList *iter; const char *expression; if (gc_converter->formula_to_node != NULL) expression = arv_gc_property_node_get_string (gc_converter->formula_to_node, &local_error); else expression = ""; if (local_error != NULL) { g_propagate_error (error, local_error); return; } arv_evaluator_set_expression (gc_converter->formula_to, expression); for (iter = gc_converter->expressions; iter != NULL; iter = iter->next) { const char *expression; const char *name; expression = arv_gc_property_node_get_string (ARV_GC_PROPERTY_NODE (iter->data), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } name = arv_gc_property_node_get_name (iter->data); arv_evaluator_set_sub_expression (gc_converter->formula_to, name, expression); } for (iter = gc_converter->constants; iter != NULL; iter = iter->next) { const char *constant; const char *name; constant = arv_gc_property_node_get_string (ARV_GC_PROPERTY_NODE (iter->data), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } name = arv_gc_property_node_get_name (iter->data); arv_evaluator_set_constant (gc_converter->formula_to, name, constant); } for (iter = gc_converter->variables; iter != NULL; iter = iter->next) { ArvGcPropertyNode *variable_node = iter->data; node = arv_gc_property_node_get_linked_node (ARV_GC_PROPERTY_NODE (variable_node)); if (arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (node)) == G_TYPE_INT64) { gint64 value; value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } arv_evaluator_set_int64_variable (gc_converter->formula_to, arv_gc_property_node_get_name (variable_node), value); } else if (arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (node)) == G_TYPE_DOUBLE) { double value; value = arv_gc_float_get_value (ARV_GC_FLOAT (node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } arv_evaluator_set_double_variable (gc_converter->formula_to, arv_gc_property_node_get_name (variable_node), value); } } if (gc_converter->value != NULL) { node = arv_gc_property_node_get_linked_node (gc_converter->value); if (arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (node)) == G_TYPE_INT64) { arv_gc_integer_set_value (ARV_GC_INTEGER (node), arv_evaluator_evaluate_as_double (gc_converter->formula_to, NULL), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } } else if (arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (node)) == G_TYPE_DOUBLE) { arv_gc_float_set_value (ARV_GC_FLOAT (node), arv_evaluator_evaluate_as_double (gc_converter->formula_to, NULL), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } } else arv_warning_genicam ("[GcConverter::set_value] Invalid pValue node '%s'", gc_converter->value); } } static gint64 _get_node_integer_value (ArvGcInteger *gc_integer, ArvGcConverterNodeType node_type, GError **error) { ArvGcConverter *gc_converter = ARV_GC_CONVERTER (gc_integer); GError *local_error = NULL; if (!_update_from_variables (gc_converter, node_type, &local_error)) { if (local_error != NULL) g_propagate_error (error, local_error); switch (node_type) { case ARV_GC_CONVERTER_NODE_TYPE_MIN: return G_MININT64; case ARV_GC_CONVERTER_NODE_TYPE_MAX: return G_MAXINT64; default: return 0; } } return arv_evaluator_evaluate_as_double (gc_converter->formula_from, NULL); } static gint64 arv_gc_converter_get_integer_value (ArvGcInteger *gc_integer, GError **error) { return _get_node_integer_value (gc_integer, ARV_GC_CONVERTER_NODE_TYPE_VALUE, error); } static gint64 arv_gc_converter_get_integer_min (ArvGcInteger *gc_integer, GError **error) { GError *local_error = NULL; gint64 a, b; /* TODO: we should use the Slope node here, instead of using MIN (min, max) */ a = _get_node_integer_value (gc_integer, ARV_GC_CONVERTER_NODE_TYPE_MIN, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return G_MININT64; } b = _get_node_integer_value (gc_integer, ARV_GC_CONVERTER_NODE_TYPE_MAX, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return G_MININT64; } return MIN (a, b); } static gint64 arv_gc_converter_get_integer_max (ArvGcInteger *gc_integer, GError **error) { GError *local_error = NULL; gint64 a, b; /* TODO: we should use the Slope node here, instead of using MAX (min, max) */ a = _get_node_integer_value (gc_integer, ARV_GC_CONVERTER_NODE_TYPE_MIN, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return G_MAXINT64; } b = _get_node_integer_value (gc_integer, ARV_GC_CONVERTER_NODE_TYPE_MAX, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return G_MAXINT64; } return MAX (a, b); } static void arv_gc_converter_set_integer_value (ArvGcInteger *gc_integer, gint64 value, GError **error) { ArvGcConverter *gc_converter = ARV_GC_CONVERTER (gc_integer); arv_evaluator_set_int64_variable (gc_converter->formula_to, "FROM", value); _update_to_variables (gc_converter, error); } static const char * arv_gc_converter_get_integer_unit (ArvGcInteger *gc_integer, GError **error) { return _get_unit (ARV_GC_CONVERTER (gc_integer), error); } static void arv_gc_converter_integer_interface_init (ArvGcIntegerInterface *interface) { interface->get_value = arv_gc_converter_get_integer_value; interface->get_min = arv_gc_converter_get_integer_min; interface->get_max = arv_gc_converter_get_integer_max; interface->set_value = arv_gc_converter_set_integer_value; interface->get_unit = arv_gc_converter_get_integer_unit; } static double _get_node_float_value (ArvGcFloat *gc_float, ArvGcConverterNodeType node_type, GError **error) { ArvGcConverter *gc_converter = ARV_GC_CONVERTER (gc_float); GError *local_error = NULL; if (!_update_from_variables (gc_converter, node_type, &local_error)) { if (local_error != NULL) g_propagate_error (error, local_error); switch (node_type) { case ARV_GC_CONVERTER_NODE_TYPE_MIN: return -G_MAXDOUBLE; case ARV_GC_CONVERTER_NODE_TYPE_MAX: return G_MAXDOUBLE; default: return 0.0; } } return arv_evaluator_evaluate_as_double (gc_converter->formula_from, NULL); } static double arv_gc_converter_get_float_value (ArvGcFloat *gc_float, GError **error) { return _get_node_float_value (gc_float, ARV_GC_CONVERTER_NODE_TYPE_VALUE, error); } static double arv_gc_converter_get_float_min (ArvGcFloat *gc_float, GError **error) { GError *local_error = NULL; double a, b; /* TODO: we should use the Slope node here, instead of using MIN (min, max) */ a = _get_node_float_value (gc_float, ARV_GC_CONVERTER_NODE_TYPE_MIN, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return -G_MAXDOUBLE; } b = _get_node_float_value (gc_float, ARV_GC_CONVERTER_NODE_TYPE_MAX, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return -G_MAXDOUBLE; } return MIN (a, b); } static double arv_gc_converter_get_float_max (ArvGcFloat *gc_float, GError **error) { GError *local_error = NULL; double a, b; /* TODO: we should use the Slope node here, instead of using MAX (min, max) */ a = _get_node_float_value (gc_float, ARV_GC_CONVERTER_NODE_TYPE_MIN, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return G_MAXDOUBLE; } b = _get_node_float_value (gc_float, ARV_GC_CONVERTER_NODE_TYPE_MAX, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return G_MAXDOUBLE; } return MAX (a, b); } static const char * arv_gc_converter_get_float_unit (ArvGcFloat *gc_float, GError **error) { return _get_unit (ARV_GC_CONVERTER (gc_float), error); } static void arv_gc_converter_set_float_value (ArvGcFloat *gc_float, double value, GError **error) { ArvGcConverter *gc_converter = ARV_GC_CONVERTER (gc_float); arv_evaluator_set_double_variable (gc_converter->formula_to, "FROM", value); _update_to_variables (gc_converter, error); } static void arv_gc_converter_float_interface_init (ArvGcFloatInterface *interface) { interface->get_value = arv_gc_converter_get_float_value; interface->get_min = arv_gc_converter_get_float_min; interface->get_max = arv_gc_converter_get_float_max; interface->set_value = arv_gc_converter_set_float_value; interface->get_unit = arv_gc_converter_get_float_unit; } G_DEFINE_TYPE_WITH_CODE (ArvGcConverter, arv_gc_converter, ARV_TYPE_GC_FEATURE_NODE, G_IMPLEMENT_INTERFACE (ARV_TYPE_GC_INTEGER, arv_gc_converter_integer_interface_init) G_IMPLEMENT_INTERFACE (ARV_TYPE_GC_FLOAT, arv_gc_converter_float_interface_init)) aravis-ARAVIS_0_6_0/src/arvgcconverter.h000066400000000000000000000046671334570641500202300ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_CONVERTER_H #define ARV_GC_CONVERTER_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS #define ARV_TYPE_GC_CONVERTER (arv_gc_converter_get_type ()) #define ARV_GC_CONVERTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_CONVERTER, ArvGcConverter)) #define ARV_GC_CONVERTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GC_CONVERTER, ArvGcConverterClass)) #define ARV_IS_GC_CONVERTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_CONVERTER)) #define ARV_IS_GC_CONVERTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GC_CONVERTER)) #define ARV_GC_CONVERTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GC_CONVERTER, ArvGcConverterClass)) typedef struct _ArvGcConverterClass ArvGcConverterClass; struct _ArvGcConverter { ArvGcFeatureNode node; GType value_type; GSList *variables; /* ArvGcVariableNode list */ GSList *constants; /* ArvGcVariableNode list */ GSList *expressions; /* ArvGcVariableNode list */ ArvGcPropertyNode *value; ArvGcPropertyNode *formula_to_node; ArvGcPropertyNode *formula_from_node; ArvGcPropertyNode *unit; ArvEvaluator *formula_to; ArvEvaluator *formula_from; }; struct _ArvGcConverterClass { ArvGcFeatureNodeClass parent_class; }; GType arv_gc_converter_get_type (void); ArvGcNode * arv_gc_converter_new (void); ArvGcNode * arv_gc_converter_new_integer (void); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcenumentry.c000066400000000000000000000063741334570641500202370ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcenumentry * @short_description: Class for EnumEntry nodes */ #include #include #include static GObjectClass *parent_class = NULL; /* ArvDomNode implementation */ static const char * arv_gc_enum_entry_get_node_name (ArvDomNode *node) { return "EnumEntry"; } static void arv_gc_enum_entry_post_new_child (ArvDomNode *self, ArvDomNode *child) { ArvGcEnumEntry *node = ARV_GC_ENUM_ENTRY (self); if (ARV_IS_GC_PROPERTY_NODE (child)) { ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (child); switch (arv_gc_property_node_get_node_type (property_node)) { case ARV_GC_PROPERTY_NODE_TYPE_VALUE: case ARV_GC_PROPERTY_NODE_TYPE_P_VALUE: node->value = property_node; break; default: ARV_DOM_NODE_CLASS (parent_class)->post_new_child (self, child); break; } } } static void arv_gc_integer_node_pre_remove_child (ArvDomNode *self, ArvDomNode *child) { g_assert_not_reached (); } /* ArvGcFeatureNode implementation */ /* ArvGcEnumEntry implementation */ gint64 arv_gc_enum_entry_get_value (ArvGcEnumEntry *entry, GError **error) { gint64 value; GError *local_error = NULL; g_return_val_if_fail (ARV_IS_GC_ENUM_ENTRY (entry), 0); g_return_val_if_fail (error == NULL || *error == NULL, 0); if (entry->value == NULL) return 0; value = arv_gc_property_node_get_int64 (entry->value, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } return value; } ArvGcNode * arv_gc_enum_entry_new (void) { ArvGcNode *node; node = g_object_new (ARV_TYPE_GC_ENUM_ENTRY, NULL); return node; } static void arv_gc_enum_entry_init (ArvGcEnumEntry *gc_enum_entry) { gc_enum_entry->value = 0; } static void arv_gc_enum_entry_finalize (GObject *object) { parent_class->finalize (object); } static void arv_gc_enum_entry_class_init (ArvGcEnumEntryClass *this_class) { GObjectClass *object_class = G_OBJECT_CLASS (this_class); ArvDomNodeClass *dom_node_class = ARV_DOM_NODE_CLASS (this_class); parent_class = g_type_class_peek_parent (this_class); object_class->finalize = arv_gc_enum_entry_finalize; dom_node_class->get_node_name = arv_gc_enum_entry_get_node_name; dom_node_class->post_new_child = arv_gc_enum_entry_post_new_child; dom_node_class->pre_remove_child = arv_gc_integer_node_pre_remove_child; } G_DEFINE_TYPE (ArvGcEnumEntry, arv_gc_enum_entry, ARV_TYPE_GC_FEATURE_NODE) aravis-ARAVIS_0_6_0/src/arvgcenumentry.h000066400000000000000000000042321334570641500202330ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_ENUM_ENTRY_H #define ARV_GC_ENUM_ENTRY_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS #define ARV_TYPE_GC_ENUM_ENTRY (arv_gc_enum_entry_get_type ()) #define ARV_GC_ENUM_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_ENUM_ENTRY, ArvGcEnumEntry)) #define ARV_GC_ENUM_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GC_ENUM_ENTRY, ArvGcEnumEntryClass)) #define ARV_IS_GC_ENUM_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_ENUM_ENTRY)) #define ARV_IS_GC_ENUM_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GC_ENUM_ENTRY)) #define ARV_GC_ENUM_ENTRY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GC_ENUM_ENTRY, ArvGcEnumEntryClass)) typedef struct _ArvGcEnumEntryClass ArvGcEnumEntryClass; struct _ArvGcEnumEntry { ArvGcFeatureNode base; ArvGcPropertyNode *value; }; struct _ArvGcEnumEntryClass { ArvGcFeatureNodeClass parent_class; }; GType arv_gc_enum_entry_get_type (void); ArvGcNode * arv_gc_enum_entry_new (void); gint64 arv_gc_enum_entry_get_value (ArvGcEnumEntry *entry, GError **error); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcenumeration.c000066400000000000000000000365311334570641500205350ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcenumeration * @short_description: Class for Enumeration nodes */ #include #include #include #include #include #include #include #include static GObjectClass *parent_class = NULL; /* ArvGcDomNode implementation */ static const char * arv_gc_enumeration_get_node_name (ArvDomNode *node) { return "Enumeration"; } static gboolean arv_gc_enumeration_can_append_child (ArvDomNode *node, ArvDomNode *child) { return (ARV_IS_GC_ENUM_ENTRY (child) || ARV_IS_GC_PROPERTY_NODE (child)); } static void arv_gc_enumeration_post_new_child (ArvDomNode *self, ArvDomNode *child) { ArvGcEnumeration *node = ARV_GC_ENUMERATION (self); if (ARV_IS_GC_PROPERTY_NODE (child)) { ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (child); switch (arv_gc_property_node_get_node_type (property_node)) { case ARV_GC_PROPERTY_NODE_TYPE_VALUE: case ARV_GC_PROPERTY_NODE_TYPE_P_VALUE: node->value = property_node; break; default: ARV_DOM_NODE_CLASS (parent_class)->post_new_child (self, child); break; } } else if (ARV_IS_GC_ENUM_ENTRY (child)) node->entries = g_slist_prepend (node->entries, child); } static void arv_gc_enumeration_pre_remove_child (ArvDomNode *self, ArvDomNode *child) { g_assert_not_reached (); } /* ArvGcFeatureNode implementation */ static void arv_gc_enumeration_set_value_from_string (ArvGcFeatureNode *node, const char *string, GError **error) { GError *local_error = NULL; arv_gc_enumeration_set_string_value (ARV_GC_ENUMERATION (node), string, &local_error); if (local_error != NULL) g_propagate_error (error, local_error); } static const char * arv_gc_enumeration_get_value_as_string (ArvGcFeatureNode *node, GError **error) { const char *string; GError *local_error = NULL; string = arv_gc_enumeration_get_string_value (ARV_GC_ENUMERATION (node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return NULL; } return string; } GType arv_gc_enumeration_get_value_type (ArvGcFeatureNode *node) { return G_TYPE_INT64; } /* ArvGcEnumeration implementation */ const char * arv_gc_enumeration_get_string_value (ArvGcEnumeration *enumeration, GError **error) { const GSList *iter; GError *local_error = NULL; gint64 value; g_return_val_if_fail (ARV_IS_GC_ENUMERATION (enumeration), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); value = arv_gc_enumeration_get_int_value (enumeration, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return NULL; } for (iter = enumeration->entries; iter != NULL; iter = iter->next) { gint64 enum_value; enum_value = arv_gc_enum_entry_get_value (iter->data, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return NULL; } if (enum_value == value) { const char *string; string = arv_gc_feature_node_get_name (iter->data); arv_log_genicam ("[GcEnumeration::get_string_value] value = %Ld - string = %s", value, string); return string; } } arv_warning_genicam ("[GcEnumeration::get_string_value] value = %Ld not found for node %s", value, arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (enumeration))); return NULL; } void arv_gc_enumeration_set_string_value (ArvGcEnumeration *enumeration, const char *value, GError **error) { const GSList *iter; g_return_if_fail (ARV_IS_GC_ENUMERATION (enumeration)); g_return_if_fail (error == NULL || *error == NULL); for (iter = enumeration->entries; iter != NULL; iter = iter->next) if (g_strcmp0 (arv_gc_feature_node_get_name (iter->data), value) == 0) { GError *local_error = NULL; gint64 enum_value; enum_value = arv_gc_enum_entry_get_value (iter->data, &local_error); arv_log_genicam ("[GcEnumeration::set_string_value] value = %d - string = %s", enum_value, value); if (local_error != NULL) { g_propagate_error (error, local_error); return; } arv_gc_enumeration_set_int_value (enumeration, enum_value, &local_error); if (local_error != NULL) g_propagate_error (error, local_error); return; } arv_warning_genicam ("[GcEnumeration::set_string_value] entry %s not found", value); } gint64 arv_gc_enumeration_get_int_value (ArvGcEnumeration *enumeration, GError **error) { GError *local_error = NULL; gint64 value; gint64 *available_values; unsigned n_values; unsigned i; gboolean found = FALSE; g_return_val_if_fail (ARV_IS_GC_ENUMERATION (enumeration), 0); g_return_val_if_fail (error == NULL || *error == NULL, 0); if (enumeration->value == NULL) return 0; value = arv_gc_property_node_get_int64 (enumeration->value, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } available_values = arv_gc_enumeration_get_available_int_values (enumeration, &n_values, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return value; } if (available_values == NULL) { g_set_error (error, ARV_GC_ERROR, ARV_GC_ERROR_EMPTY_ENUMERATION, "No available entry found in '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (enumeration))); return value; } for (i = 0; i < n_values; i++) if (available_values[i] == value) found = TRUE; g_free (available_values); if (!found) g_set_error (error, ARV_GC_ERROR, ARV_GC_ERROR_OUT_OF_RANGE, "Value not found in '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (enumeration))); return value; } gint64 * arv_gc_enumeration_get_available_int_values (ArvGcEnumeration *enumeration, guint *n_values, GError **error) { gint64 *values; const GSList *entries, *iter; GSList *available_entries = NULL; unsigned int i; GError *local_error = NULL; g_return_val_if_fail (n_values != NULL, NULL); *n_values = 0; g_return_val_if_fail (ARV_IS_GC_ENUMERATION (enumeration), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); entries = arv_gc_enumeration_get_entries (enumeration); *n_values = 0; for (iter = entries; iter != NULL; iter = iter->next) { gboolean is_available; is_available = arv_gc_feature_node_is_available (iter->data, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); *n_values = 0; g_slist_free (available_entries); return NULL; } if (is_available) { gboolean is_implemented; is_implemented = arv_gc_feature_node_is_implemented (iter->data, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); *n_values = 0; g_slist_free (available_entries); return NULL; } if (is_implemented) { (*n_values)++; available_entries = g_slist_prepend (available_entries, iter->data); } } } if (*n_values == 0) { g_slist_free (available_entries); return NULL; } values = g_new (gint64, *n_values); for (iter = available_entries, i = 0; iter != NULL; iter = iter->next) { values[i] = arv_gc_enum_entry_get_value (iter->data, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); *n_values = 0; g_slist_free (available_entries); g_free (values); return NULL; } i++; } g_slist_free (available_entries); return values; } /** * arv_gc_enumeration_get_available_string_values: * @enumeration: an #ArvGcEnumeration * @n_values: (out): placeholder for the number of values * @error: placeholder for error, may be NULL * * Create an array of all available values of @enumeration, as strings. * * Returns: (array length=n_values) (transfer container): an newly created array of const strings, which must freed after use using g_free. */ const char ** arv_gc_enumeration_get_available_string_values (ArvGcEnumeration *enumeration, guint *n_values, GError **error) { const char ** strings; const GSList *entries, *iter; GSList *available_entries = NULL; unsigned int i; GError *local_error = NULL; g_return_val_if_fail (n_values != NULL, NULL); *n_values = 0; g_return_val_if_fail (ARV_IS_GC_ENUMERATION (enumeration), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); entries = arv_gc_enumeration_get_entries (enumeration); *n_values = 0; for (iter = entries; iter != NULL; iter = iter->next) { gboolean is_available; is_available = arv_gc_feature_node_is_available (iter->data, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); *n_values = 0; g_slist_free (available_entries); return NULL; } if (is_available) { gboolean is_implemented; is_implemented = arv_gc_feature_node_is_implemented (iter->data, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); *n_values = 0; g_slist_free (available_entries); return NULL; } if (is_implemented) { (*n_values)++; available_entries = g_slist_prepend (available_entries, iter->data); } } } if (*n_values == 0) { g_slist_free (available_entries); return NULL; } strings = g_new (const char*, *n_values); for (iter = available_entries, i = 0; iter != NULL; iter = iter->next, i++) strings[i] = arv_gc_feature_node_get_name (iter->data); g_slist_free (available_entries); return strings; } void arv_gc_enumeration_set_int_value (ArvGcEnumeration *enumeration, gint64 value, GError **error) { g_return_if_fail (ARV_IS_GC_ENUMERATION (enumeration)); g_return_if_fail (error == NULL || *error == NULL); if (enumeration->value) { GError *local_error = NULL; { gint64 *available_values; unsigned n_values; unsigned i; gboolean found = FALSE; available_values = arv_gc_enumeration_get_available_int_values (enumeration, &n_values, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } if (available_values == NULL) { g_set_error (error, ARV_GC_ERROR, ARV_GC_ERROR_EMPTY_ENUMERATION, "No available entry found in '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (enumeration))); return; } for (i = 0; i < n_values; i++) if (available_values[i] == value) found = TRUE; g_free (available_values); if (!found) { g_set_error (error, ARV_GC_ERROR, ARV_GC_ERROR_OUT_OF_RANGE, "Value not found in '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (enumeration))); return; } } arv_gc_property_node_set_int64 (enumeration->value, value, &local_error); if (local_error != NULL) g_propagate_error (error, local_error); } } /** * arv_gc_enumeration_get_entries: * @enumeration: a #ArvGcEnumeration * * Returns: (element-type ArvGcFeatureNode) (transfer none): the list of enumeration entry nodes. */ const GSList * arv_gc_enumeration_get_entries (ArvGcEnumeration *enumeration) { g_return_val_if_fail (ARV_IS_GC_ENUMERATION (enumeration), NULL); return enumeration->entries; } ArvGcNode * arv_gc_enumeration_new (void) { ArvGcNode *node; node = g_object_new (ARV_TYPE_GC_ENUMERATION, NULL); return node; } static void arv_gc_enumeration_init (ArvGcEnumeration *gc_enumeration) { } static void arv_gc_enumeration_finalize (GObject *object) { ArvGcEnumeration *enumeration = ARV_GC_ENUMERATION (object); g_slist_free (enumeration->entries); enumeration->entries = NULL; parent_class->finalize (object); } static void arv_gc_enumeration_class_init (ArvGcEnumerationClass *this_class) { GObjectClass *object_class = G_OBJECT_CLASS (this_class); ArvDomNodeClass *dom_node_class = ARV_DOM_NODE_CLASS (this_class); ArvGcFeatureNodeClass *gc_feature_node_class = ARV_GC_FEATURE_NODE_CLASS (this_class); parent_class = g_type_class_peek_parent (this_class); object_class->finalize = arv_gc_enumeration_finalize; dom_node_class->get_node_name = arv_gc_enumeration_get_node_name; dom_node_class->can_append_child = arv_gc_enumeration_can_append_child; dom_node_class->post_new_child = arv_gc_enumeration_post_new_child; dom_node_class->pre_remove_child = arv_gc_enumeration_pre_remove_child; gc_feature_node_class->set_value_from_string = arv_gc_enumeration_set_value_from_string; gc_feature_node_class->get_value_as_string = arv_gc_enumeration_get_value_as_string; gc_feature_node_class->get_value_type = arv_gc_enumeration_get_value_type; } /* ArvGcInteger interface implementation */ static gint64 arv_gc_enumeration_get_integer_value (ArvGcInteger *gc_integer, GError **error) { ArvGcEnumeration *gc_enumeration = ARV_GC_ENUMERATION (gc_integer); return arv_gc_enumeration_get_int_value (gc_enumeration, error); } static void arv_gc_enumeration_set_integer_value (ArvGcInteger *gc_integer, gint64 value, GError **error) { ArvGcEnumeration *gc_enumeration = ARV_GC_ENUMERATION (gc_integer); return arv_gc_enumeration_set_int_value (gc_enumeration, value, error); } static void arv_gc_enumeration_integer_interface_init (ArvGcIntegerInterface *interface) { interface->get_value = arv_gc_enumeration_get_integer_value; interface->set_value = arv_gc_enumeration_set_integer_value; } static const char * arv_gc_enumeration_get_str_value (ArvGcString *gc_string, GError **error) { ArvGcEnumeration *gc_enumeration = ARV_GC_ENUMERATION (gc_string); return arv_gc_enumeration_get_string_value (gc_enumeration, error); } static void arv_gc_enumeration_set_str_value (ArvGcString *gc_string, const char *value, GError **error) { ArvGcEnumeration *gc_enumeration = ARV_GC_ENUMERATION (gc_string); arv_gc_enumeration_set_string_value (gc_enumeration, value, error); } static gint64 arv_gc_enumeration_get_max_string_length (ArvGcString *gc_string, GError **error) { ArvGcEnumeration *gc_enumeration = ARV_GC_ENUMERATION (gc_string); const GSList *entries, *iter; gint64 length, max_length = 0; entries = arv_gc_enumeration_get_entries (gc_enumeration); for (iter = entries; iter != NULL; iter = iter->next) { const char *name; name = arv_gc_feature_node_get_name (iter->data); length = name != NULL ? strlen (name) : 0; if (length > max_length) max_length = length; } return max_length; } static void arv_gc_enumeration_string_interface_init (ArvGcStringInterface *interface) { interface->get_value = arv_gc_enumeration_get_str_value; interface->set_value = arv_gc_enumeration_set_str_value; interface->get_max_length = arv_gc_enumeration_get_max_string_length; } G_DEFINE_TYPE_WITH_CODE (ArvGcEnumeration, arv_gc_enumeration, ARV_TYPE_GC_FEATURE_NODE, G_IMPLEMENT_INTERFACE (ARV_TYPE_GC_INTEGER, arv_gc_enumeration_integer_interface_init) G_IMPLEMENT_INTERFACE (ARV_TYPE_GC_STRING, arv_gc_enumeration_string_interface_init)) aravis-ARAVIS_0_6_0/src/arvgcenumeration.h000066400000000000000000000055341334570641500205410ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_ENUMERATION_H #define ARV_GC_ENUMERATION_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS #define ARV_TYPE_GC_ENUMERATION (arv_gc_enumeration_get_type ()) #define ARV_GC_ENUMERATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_ENUMERATION, ArvGcEnumeration)) #define ARV_GC_ENUMERATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GC_ENUMERATION, ArvGcEnumerationClass)) #define ARV_IS_GC_ENUMERATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_ENUMERATION)) #define ARV_IS_GC_ENUMERATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GC_ENUMERATION)) #define ARV_GC_ENUMERATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GC_ENUMERATION, ArvGcEnumerationClass)) typedef struct _ArvGcEnumerationClass ArvGcEnumerationClass; struct _ArvGcEnumeration { ArvGcFeatureNode base; ArvGcPropertyNode *value; GSList *entries; }; struct _ArvGcEnumerationClass { ArvGcFeatureNodeClass parent_class; }; GType arv_gc_enumeration_get_type (void); ArvGcNode * arv_gc_enumeration_new (void); const GSList * arv_gc_enumeration_get_entries (ArvGcEnumeration *enumeration); const char * arv_gc_enumeration_get_string_value (ArvGcEnumeration *enumeration, GError **error); void arv_gc_enumeration_set_string_value (ArvGcEnumeration *enumeration, const char *value, GError **error); gint64 arv_gc_enumeration_get_int_value (ArvGcEnumeration *enumeration, GError **error); void arv_gc_enumeration_set_int_value (ArvGcEnumeration *enumeration, gint64 value, GError **error); gint64 * arv_gc_enumeration_get_available_int_values (ArvGcEnumeration *enumeration, guint *n_values, GError **error); const char ** arv_gc_enumeration_get_available_string_values (ArvGcEnumeration *enumeration, guint *n_values, GError **error); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcfeaturenode.c000066400000000000000000000301741334570641500205050ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcfeaturenode * @short_description: Base class for Genicam feature nodes * * #ArvGcFeatureNode provides a base class for the implementation of the different * types of Genicam feature node (Group, Integer, Float, Enumeration...). */ #include #include #include #include #include #include static GObjectClass *parent_class = NULL; struct _ArvGcFeatureNodePrivate { char *name; ArvGcNameSpace name_space; ArvGcPropertyNode *tooltip; ArvGcPropertyNode *description; ArvGcPropertyNode *display_name; ArvGcPropertyNode *is_implemented; ArvGcPropertyNode *is_available; ArvGcPropertyNode *is_locked; gint modification_count; }; /* ArvDomNode implementation */ static gboolean arv_gc_feature_node_can_append_child (ArvDomNode *self, ArvDomNode *child) { return ARV_IS_GC_NODE (child); } static void arv_gc_feature_node_post_new_child (ArvDomNode *self, ArvDomNode *child) { ArvGcFeatureNode *node = ARV_GC_FEATURE_NODE (self); if (ARV_IS_GC_PROPERTY_NODE (child)) { ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (child); switch (arv_gc_property_node_get_node_type (property_node)) { case ARV_GC_PROPERTY_NODE_TYPE_TOOLTIP: node->priv->tooltip = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_DESCRIPTION: node->priv->description = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_DISPLAY_NAME: node->priv->display_name = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_P_IS_AVAILABLE: node->priv->is_available = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_P_IS_IMPLEMENTED: node->priv->is_implemented = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_P_IS_LOCKED: node->priv->is_locked = property_node; break; default: break; } } } static void arv_gc_feature_node_pre_remove_child (ArvDomNode *self, ArvDomNode *child) { ArvGcFeatureNode *node = ARV_GC_FEATURE_NODE (self); if (ARV_IS_GC_PROPERTY_NODE (child)) { ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (child); switch (arv_gc_property_node_get_node_type (property_node)) { case ARV_GC_PROPERTY_NODE_TYPE_TOOLTIP: node->priv->tooltip = NULL; break; case ARV_GC_PROPERTY_NODE_TYPE_DESCRIPTION: node->priv->description = NULL; break; case ARV_GC_PROPERTY_NODE_TYPE_DISPLAY_NAME: node->priv->description = NULL; break; case ARV_GC_PROPERTY_NODE_TYPE_P_IS_AVAILABLE: node->priv->is_available = NULL; break; case ARV_GC_PROPERTY_NODE_TYPE_P_IS_IMPLEMENTED: node->priv->is_implemented = NULL; break; case ARV_GC_PROPERTY_NODE_TYPE_P_IS_LOCKED: node->priv->is_locked = NULL; break; default: break; } } } /* ArvDomNode implementation */ static void arv_gc_feature_node_set_attribute (ArvDomElement *self, const char *name, const char *value) { ArvGcFeatureNode *node = ARV_GC_FEATURE_NODE (self); if (strcmp (name, "Name") == 0) { ArvGc *genicam; g_free (node->priv->name); node->priv->name = g_strdup (value); genicam = arv_gc_node_get_genicam (ARV_GC_NODE (self)); /* Kludge around ugly Genicam specification (Really, pre-parsing for EnumEntry Name substitution ?) */ if (strcmp (arv_dom_node_get_node_name (ARV_DOM_NODE (node)), "EnumEntry") != 0) arv_gc_register_feature_node (genicam, node); } else if (strcmp (name, "NameSpace") == 0) { if (g_strcmp0 (value, "Standard") == 0) node->priv->name_space = ARV_GC_NAME_SPACE_STANDARD; else node->priv->name_space = ARV_GC_NAME_SPACE_CUSTOM; } else arv_debug_dom ("[GcFeature::set_attribute] Unknown attribute '%s'", name); } static const char * arv_gc_feature_node_get_attribute (ArvDomElement *self, const char *name) { ArvGcFeatureNode *node = ARV_GC_FEATURE_NODE (self); if (strcmp (name, "Name") == 0) return node->priv->name; else if (strcmp (name, "NameSpace") == 0) switch (node->priv->name_space) { case ARV_GC_NAME_SPACE_STANDARD: return "Standard"; default: return "Custom"; } arv_debug_dom ("[GcFeature::set_attribute] Unknown attribute '%s'", name); return NULL; } /* ArvGcFeatureNode implementation */ const char * arv_gc_feature_node_get_name (ArvGcFeatureNode *node) { g_return_val_if_fail (ARV_IS_GC_FEATURE_NODE (node), NULL); return node->priv->name; } const char * arv_gc_feature_node_get_tooltip (ArvGcFeatureNode *node, GError **error) { const char *tooltip; GError *local_error = NULL; g_return_val_if_fail (ARV_IS_GC_FEATURE_NODE (node), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); if (node->priv->tooltip == NULL) return NULL; tooltip = arv_gc_property_node_get_string (node->priv->tooltip, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return NULL; } return tooltip; } const char * arv_gc_feature_node_get_description (ArvGcFeatureNode *node, GError **error) { const char *description; GError *local_error = NULL; g_return_val_if_fail (ARV_IS_GC_FEATURE_NODE (node), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); if (node->priv->description == NULL) return NULL; description = arv_gc_property_node_get_string (node->priv->description, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return NULL; } return description; } const char * arv_gc_feature_node_get_display_name (ArvGcFeatureNode *node, GError **error) { const char *display_name; GError *local_error = NULL; g_return_val_if_fail (ARV_IS_GC_FEATURE_NODE (node), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); if (node->priv->display_name == NULL) return NULL; display_name = arv_gc_property_node_get_string (node->priv->display_name, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return NULL; } return display_name; } gboolean arv_gc_feature_node_is_implemented (ArvGcFeatureNode *gc_feature_node, GError **error) { gboolean value; GError *local_error = NULL; g_return_val_if_fail (ARV_IS_GC_FEATURE_NODE (gc_feature_node), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); if (gc_feature_node->priv->is_implemented == NULL) return TRUE; value = arv_gc_property_node_get_int64 (gc_feature_node->priv->is_implemented, &local_error) != 0; if (local_error != NULL) { g_propagate_error (error, local_error); return FALSE; } return value; } gboolean arv_gc_feature_node_is_available (ArvGcFeatureNode *gc_feature_node, GError **error) { gboolean value; GError *local_error = NULL; g_return_val_if_fail (ARV_IS_GC_FEATURE_NODE (gc_feature_node), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); if (gc_feature_node->priv->is_available == NULL) return TRUE; value = arv_gc_property_node_get_int64 (gc_feature_node->priv->is_available, &local_error) != 0; if (local_error != NULL) { g_propagate_error (error, local_error); return FALSE; } return value; } gboolean arv_gc_feature_node_is_locked (ArvGcFeatureNode *gc_feature_node, GError **error) { gboolean value; GError *local_error = NULL; g_return_val_if_fail (ARV_IS_GC_FEATURE_NODE (gc_feature_node), FALSE); if (gc_feature_node->priv->is_locked == NULL) return FALSE; value = arv_gc_property_node_get_int64 (gc_feature_node->priv->is_locked, &local_error) != 0; if (local_error != NULL) { g_propagate_error (error, local_error); return FALSE; } return value; } ArvGcFeatureNode * arv_gc_feature_node_new (void) { ArvGcFeatureNode *node; node = g_object_new (ARV_TYPE_GC_FEATURE_NODE, NULL); return node; } GType arv_gc_feature_node_get_value_type (ArvGcFeatureNode *node) { ArvGcFeatureNodeClass *node_class; g_return_val_if_fail (ARV_IS_GC_FEATURE_NODE (node), 0); node_class = ARV_GC_FEATURE_NODE_GET_CLASS (node); if (node_class->get_value_type != NULL) return node_class->get_value_type (node); return 0; } /** * arv_gc_feature_node_set_value_from_string: * @gc_feature_node: a #ArvGcFeatureNode * @string: new node value, as string * @error: return location for a GError, or NULL * * Set the node value using a string representation of the value. May not be applicable to every node type, but safe. */ void arv_gc_feature_node_set_value_from_string (ArvGcFeatureNode *gc_feature_node, const char *string, GError **error) { ArvGcFeatureNodeClass *node_class; g_return_if_fail (ARV_IS_GC_FEATURE_NODE (gc_feature_node)); g_return_if_fail (error == NULL || *error == NULL); g_return_if_fail (string != NULL); node_class = ARV_GC_FEATURE_NODE_GET_CLASS (gc_feature_node); if (node_class->set_value_from_string != NULL) node_class->set_value_from_string (gc_feature_node, string, error); } /** * arv_gc_feature_node_get_value_as_string: * @gc_feature_node: a #ArvGcFeatureNode * @error: return location for a GError, or NULL * * Retrieve the node value a string. * * Please note the string content is still owned by the @node object, which means the returned pointer may not be still valid after a new call to this function. * * Returns: (transfer none): a string representation of the node value, %NULL if not applicable. */ const char * arv_gc_feature_node_get_value_as_string (ArvGcFeatureNode *gc_feature_node, GError **error) { ArvGcFeatureNodeClass *node_class; g_return_val_if_fail (ARV_IS_GC_FEATURE_NODE (gc_feature_node), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); node_class = ARV_GC_FEATURE_NODE_GET_CLASS (gc_feature_node); if (node_class->get_value_as_string != NULL) return node_class->get_value_as_string (gc_feature_node, error); return NULL; } void arv_gc_feature_node_inc_modification_count (ArvGcFeatureNode *gc_feature_node) { g_return_if_fail (ARV_IS_GC_FEATURE_NODE (gc_feature_node)); gc_feature_node->priv->modification_count++; } gint arv_gc_feature_node_get_modification_count (ArvGcFeatureNode *node) { g_return_val_if_fail (ARV_IS_GC_FEATURE_NODE (node), 0); return node->priv->modification_count; } static void arv_gc_feature_node_init (ArvGcFeatureNode *gc_feature_node) { gc_feature_node->priv = G_TYPE_INSTANCE_GET_PRIVATE (gc_feature_node, ARV_TYPE_GC_FEATURE_NODE, ArvGcFeatureNodePrivate); gc_feature_node->priv->modification_count = 0; } static void arv_gc_feature_node_finalize (GObject *object) { ArvGcFeatureNode *node = ARV_GC_FEATURE_NODE(object); g_free (node->priv->name); parent_class->finalize (object); } static void arv_gc_feature_node_class_init (ArvGcFeatureNodeClass *this_class) { GObjectClass *object_class = G_OBJECT_CLASS (this_class); ArvDomNodeClass *dom_node_class = ARV_DOM_NODE_CLASS (this_class); ArvDomElementClass *dom_element_class = ARV_DOM_ELEMENT_CLASS (this_class); g_type_class_add_private (this_class, sizeof (ArvGcFeatureNodePrivate)); parent_class = g_type_class_peek_parent (this_class); object_class->finalize = arv_gc_feature_node_finalize; dom_node_class->can_append_child = arv_gc_feature_node_can_append_child; dom_node_class->post_new_child = arv_gc_feature_node_post_new_child; dom_node_class->pre_remove_child = arv_gc_feature_node_pre_remove_child; dom_element_class->set_attribute = arv_gc_feature_node_set_attribute; dom_element_class->get_attribute = arv_gc_feature_node_get_attribute; this_class->get_value_type = NULL; } G_DEFINE_TYPE (ArvGcFeatureNode, arv_gc_feature_node, ARV_TYPE_GC_NODE) aravis-ARAVIS_0_6_0/src/arvgcfeaturenode.h000066400000000000000000000071031334570641500205060ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_FEATURE_NODE_H #define ARV_GC_FEATURE_NODE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS #define ARV_TYPE_GC_FEATURE_NODE (arv_gc_feature_node_get_type ()) #define ARV_GC_FEATURE_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_FEATURE_NODE, ArvGcFeatureNode)) #define ARV_GC_FEATURE_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GC_FEATURE_NODE, ArvGcFeatureNodeClass)) #define ARV_IS_GC_FEATURE_NODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_FEATURE_NODE)) #define ARV_IS_GC_FEATURE_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GC_FEATURE_NODE)) #define ARV_GC_FEATURE_NODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GC_FEATURE_NODE, ArvGcFeatureNodeClass)) typedef struct _ArvGcFeatureNodePrivate ArvGcFeatureNodePrivate; typedef struct _ArvGcFeatureNodeClass ArvGcFeatureNodeClass; struct _ArvGcFeatureNode { ArvGcNode base; ArvGcFeatureNodePrivate *priv; }; struct _ArvGcFeatureNodeClass { ArvGcNodeClass parent_class; GType (*get_value_type) (ArvGcFeatureNode *gc_feature_node); void (*set_value_from_string) (ArvGcFeatureNode *gc_feature_node, const char *string, GError **error); const char * (*get_value_as_string) (ArvGcFeatureNode *gc_feature_node, GError **error); }; GType arv_gc_feature_node_get_type (void); ArvGcFeatureNode * arv_gc_feature_node_new (void); const char * arv_gc_feature_node_get_name (ArvGcFeatureNode *gc_feature_node); const char * arv_gc_feature_node_get_tooltip (ArvGcFeatureNode *gc_feature_node, GError **error); const char * arv_gc_feature_node_get_description (ArvGcFeatureNode *gc_feature_node, GError **error); const char * arv_gc_feature_node_get_display_name (ArvGcFeatureNode *gc_feature_node, GError **error); gboolean arv_gc_feature_node_is_available (ArvGcFeatureNode *gc_feature_node, GError **error); gboolean arv_gc_feature_node_is_implemented (ArvGcFeatureNode *gc_feature_node, GError **error); gboolean arv_gc_feature_node_is_locked (ArvGcFeatureNode *gc_feature_node, GError **error); void arv_gc_feature_node_set_value_from_string (ArvGcFeatureNode *gc_feature_node, const char *string, GError **error); const char * arv_gc_feature_node_get_value_as_string (ArvGcFeatureNode *gc_feature_node, GError **error); GType arv_gc_feature_node_get_value_type (ArvGcFeatureNode *gc_feature_node); void arv_gc_feature_node_inc_modification_count (ArvGcFeatureNode *gc_feature_node); gint arv_gc_feature_node_get_modification_count (ArvGcFeatureNode *gc_feature_node); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcfloat.c000066400000000000000000000120771334570641500173130ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcfloat * @short_description: Float interface */ #include #include #include #include static void arv_gc_float_default_init (ArvGcFloatInterface *gc_float_iface) { } G_DEFINE_INTERFACE (ArvGcFloat, arv_gc_float, G_TYPE_OBJECT) double arv_gc_float_get_value (ArvGcFloat *gc_float, GError **error) { g_return_val_if_fail (ARV_IS_GC_FLOAT (gc_float), 0.0); g_return_val_if_fail (error == NULL || *error == NULL, 0.0); return ARV_GC_FLOAT_GET_INTERFACE (gc_float)->get_value (gc_float, error); } void arv_gc_float_set_value (ArvGcFloat *gc_float, double value, GError **error) { g_return_if_fail (ARV_IS_GC_FLOAT (gc_float)); g_return_if_fail (error == NULL || *error == NULL); ARV_GC_FLOAT_GET_INTERFACE (gc_float)->set_value (gc_float, value, error); } double arv_gc_float_get_min (ArvGcFloat *gc_float, GError **error) { ArvGcFloatInterface *float_interface; g_return_val_if_fail (ARV_IS_GC_FLOAT (gc_float), 0.0); g_return_val_if_fail (error == NULL || *error == NULL, 0.0); float_interface = ARV_GC_FLOAT_GET_INTERFACE (gc_float); if (float_interface->get_min != NULL) return float_interface->get_min (gc_float, error); g_set_error (error, ARV_GC_ERROR, ARV_GC_ERROR_PROPERTY_NOT_DEFINED, " node not found for '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (gc_float))); return -G_MAXDOUBLE; } double arv_gc_float_get_max (ArvGcFloat *gc_float, GError **error) { ArvGcFloatInterface *float_interface; g_return_val_if_fail (ARV_IS_GC_FLOAT (gc_float), 0.0); g_return_val_if_fail (error == NULL || *error == NULL, 0.0); float_interface = ARV_GC_FLOAT_GET_INTERFACE (gc_float); if (float_interface->get_max != NULL) return float_interface->get_max (gc_float, error); g_set_error (error, ARV_GC_ERROR, ARV_GC_ERROR_PROPERTY_NOT_DEFINED, " node not found for '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (gc_float))); return G_MAXDOUBLE; } double arv_gc_float_get_inc (ArvGcFloat *gc_float, GError **error) { ArvGcFloatInterface *float_interface; g_return_val_if_fail (ARV_IS_GC_FLOAT (gc_float), 0.0); g_return_val_if_fail (error == NULL || *error == NULL, 0.0); float_interface = ARV_GC_FLOAT_GET_INTERFACE (gc_float); if (float_interface->get_inc != NULL) return float_interface->get_inc (gc_float, error); g_set_error (error, ARV_GC_ERROR, ARV_GC_ERROR_PROPERTY_NOT_DEFINED, " node not found for '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (gc_float))); return 1; } const char * arv_gc_float_get_unit (ArvGcFloat *gc_float, GError **error) { ArvGcFloatInterface *float_interface; g_return_val_if_fail (ARV_IS_GC_FLOAT (gc_float), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); float_interface = ARV_GC_FLOAT_GET_INTERFACE (gc_float); if (float_interface->get_unit != NULL) return float_interface->get_unit (gc_float, error); g_set_error (error, ARV_GC_ERROR, ARV_GC_ERROR_PROPERTY_NOT_DEFINED, " node not found for '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (gc_float))); return NULL; } void arv_gc_float_impose_min (ArvGcFloat *gc_float, double minimum, GError **error) { ArvGcFloatInterface *float_interface; g_return_if_fail (ARV_IS_GC_FLOAT (gc_float)); g_return_if_fail (error == NULL || *error == NULL); float_interface = ARV_GC_FLOAT_GET_INTERFACE (gc_float); if (float_interface->impose_min != NULL) float_interface->impose_min (gc_float, minimum, error); else g_set_error (error, ARV_GC_ERROR, ARV_GC_ERROR_PROPERTY_NOT_DEFINED, " node not found for '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (gc_float))); } void arv_gc_float_impose_max (ArvGcFloat *gc_float, double maximum, GError **error) { ArvGcFloatInterface *float_interface; g_return_if_fail (ARV_IS_GC_FLOAT (gc_float)); g_return_if_fail (error == NULL || *error == NULL); float_interface = ARV_GC_FLOAT_GET_INTERFACE (gc_float); if (float_interface->impose_max != NULL) float_interface->impose_max (gc_float, maximum, error); else g_set_error (error, ARV_GC_ERROR, ARV_GC_ERROR_PROPERTY_NOT_DEFINED, " node not found for '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (gc_float))); } aravis-ARAVIS_0_6_0/src/arvgcfloat.h000066400000000000000000000054671334570641500173250ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_FLOAT_H #define ARV_GC_FLOAT_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS #define ARV_TYPE_GC_FLOAT (arv_gc_float_get_type ()) #define ARV_GC_FLOAT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_FLOAT, ArvGcFloat)) #define ARV_IS_GC_FLOAT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_FLOAT)) #define ARV_GC_FLOAT_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), ARV_TYPE_GC_FLOAT, ArvGcFloatInterface)) typedef struct _ArvGcFloatInterface ArvGcFloatInterface; struct _ArvGcFloatInterface { GTypeInterface parent; double (*get_value) (ArvGcFloat *gc_float, GError **error); void (*set_value) (ArvGcFloat *gc_float, double value, GError **error); double (*get_min) (ArvGcFloat *gc_float, GError **error); double (*get_max) (ArvGcFloat *gc_float, GError **error); double (*get_inc) (ArvGcFloat *gc_float, GError **error); const char * (*get_unit) (ArvGcFloat *gc_float, GError **error); void (*impose_min) (ArvGcFloat *gc_float, double minimum, GError **error); void (*impose_max) (ArvGcFloat *gc_float, double maximum, GError **error); }; GType arv_gc_float_get_type (void); double arv_gc_float_get_value (ArvGcFloat *gc_float, GError **error); void arv_gc_float_set_value (ArvGcFloat *gc_float, double value, GError **error); double arv_gc_float_get_min (ArvGcFloat *gc_float, GError **error); double arv_gc_float_get_max (ArvGcFloat *gc_float, GError **error); double arv_gc_float_get_inc (ArvGcFloat *gc_float, GError **error); const char * arv_gc_float_get_unit (ArvGcFloat *gc_float, GError **error); void arv_gc_float_impose_min (ArvGcFloat *gc_float, double minimum, GError **error); void arv_gc_float_impose_max (ArvGcFloat *gc_float, double maximum, GError **error); /* FIXME get_representation, has_inc and get_inc are missing */ G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcfloatnode.c000066400000000000000000000237631334570641500201650ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2017 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcfloatnode * @short_description: Class for Float nodes */ #include #include #include #include #include #include #include static GObjectClass *parent_class = NULL; /* ArvDomNode implementation */ static const char * arv_gc_float_node_get_node_name (ArvDomNode *node) { return "Float"; } static void arv_gc_float_node_post_new_child (ArvDomNode *self, ArvDomNode *child) { ArvGcFloatNode *node = ARV_GC_FLOAT_NODE (self); if (ARV_IS_GC_PROPERTY_NODE (child)) { ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (child); switch (arv_gc_property_node_get_node_type (property_node)) { case ARV_GC_PROPERTY_NODE_TYPE_VALUE: case ARV_GC_PROPERTY_NODE_TYPE_P_VALUE: node->value = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_MINIMUM: case ARV_GC_PROPERTY_NODE_TYPE_P_MINIMUM: node->minimum = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_MAXIMUM: case ARV_GC_PROPERTY_NODE_TYPE_P_MAXIMUM: node->maximum = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_INCREMENT: case ARV_GC_PROPERTY_NODE_TYPE_P_INCREMENT: node->increment = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_UNIT: node->unit = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_P_INDEX: node->index = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_VALUE_INDEXED: case ARV_GC_PROPERTY_NODE_TYPE_P_VALUE_INDEXED: node->value_indexed_nodes = g_slist_prepend (node->value_indexed_nodes, property_node); break; case ARV_GC_PROPERTY_NODE_TYPE_VALUE_DEFAULT: case ARV_GC_PROPERTY_NODE_TYPE_P_VALUE_DEFAULT: node->value_default = property_node; break; default: ARV_DOM_NODE_CLASS (parent_class)->post_new_child (self, child); break; } } } static void arv_gc_float_node_pre_remove_child (ArvDomNode *self, ArvDomNode *child) { g_assert_not_reached (); } /* ArvGcFeatureNode implementation */ static ArvGcPropertyNode * _get_value_node (ArvGcFloatNode *gc_float_node, GError **error) { GError *local_error = NULL; if (gc_float_node->value != NULL) return gc_float_node->value; if (gc_float_node->index != NULL) { gint64 index; GSList *iter; index = arv_gc_property_node_get_int64 (ARV_GC_PROPERTY_NODE (gc_float_node->index), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return NULL; } for (iter = gc_float_node->value_indexed_nodes; iter != NULL; iter = iter->next) if (arv_gc_value_indexed_node_get_index (iter->data) == index) return iter->data; if (gc_float_node->value_default != NULL) return gc_float_node->value_default; } return NULL; } static GType arv_gc_float_node_get_value_type (ArvGcFeatureNode *node) { return G_TYPE_DOUBLE; } static void arv_gc_float_node_set_value_from_string (ArvGcFeatureNode *node, const char *string, GError **error) { arv_gc_float_set_value (ARV_GC_FLOAT (node), g_ascii_strtod (string, NULL), error); } static const char * arv_gc_float_node_get_value_as_string (ArvGcFeatureNode *node, GError **error) { ArvGcFloatNode *float_node = ARV_GC_FLOAT_NODE (node); ArvGcPropertyNode *value_node; GError *local_error = NULL; const char *string; value_node = _get_value_node (float_node, error); if (value_node == NULL) return NULL; string = arv_gc_property_node_get_string (ARV_GC_PROPERTY_NODE (value_node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return NULL; } return string; } /* ArvGcFloatNode implementation */ ArvGcNode * arv_gc_float_node_new (void) { ArvGcNode *node; node = g_object_new (ARV_TYPE_GC_FLOAT_NODE, NULL); return node; } static void arv_gc_float_node_init (ArvGcFloatNode *gc_float_node) { } static void arv_gc_float_node_finalize (GObject *object) { ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (object); parent_class->finalize (object); g_slist_free (gc_float_node->value_indexed_nodes); } static void arv_gc_float_node_class_init (ArvGcFloatNodeClass *this_class) { GObjectClass *object_class = G_OBJECT_CLASS (this_class); ArvDomNodeClass *dom_node_class = ARV_DOM_NODE_CLASS (this_class); ArvGcFeatureNodeClass *gc_feature_node_class = ARV_GC_FEATURE_NODE_CLASS (this_class); parent_class = g_type_class_peek_parent (this_class); object_class->finalize = arv_gc_float_node_finalize; dom_node_class->get_node_name = arv_gc_float_node_get_node_name; dom_node_class->post_new_child = arv_gc_float_node_post_new_child; dom_node_class->pre_remove_child = arv_gc_float_node_pre_remove_child; gc_feature_node_class->get_value_type = arv_gc_float_node_get_value_type; gc_feature_node_class->set_value_from_string = arv_gc_float_node_set_value_from_string; gc_feature_node_class->get_value_as_string = arv_gc_float_node_get_value_as_string; } /* ArvGcFloat interface implementation */ static double arv_gc_float_node_get_float_value (ArvGcFloat *gc_float, GError **error) { ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float); ArvGcPropertyNode *value_node; GError *local_error = NULL; double value; value_node = _get_value_node (gc_float_node, error); if (value_node == NULL) return 0.0; value = arv_gc_property_node_get_double (ARV_GC_PROPERTY_NODE (value_node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0.0; } return value; } static void arv_gc_float_node_set_float_value (ArvGcFloat *gc_float, double value, GError **error) { ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float); ArvGcPropertyNode *value_node; GError *local_error = NULL; value_node = _get_value_node (gc_float_node, error); if (value_node == NULL) return; arv_gc_property_node_set_double (ARV_GC_PROPERTY_NODE (value_node), value, &local_error); if (local_error != NULL) g_propagate_error (error, local_error); } static double arv_gc_float_node_get_min (ArvGcFloat *gc_float, GError **error) { ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float); GError *local_error = NULL; double value; if (gc_float_node->minimum == NULL) return -G_MAXDOUBLE; value = arv_gc_property_node_get_double (ARV_GC_PROPERTY_NODE (gc_float_node->minimum), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return -G_MAXDOUBLE; } return value; } static double arv_gc_float_node_get_max (ArvGcFloat *gc_float, GError **error) { ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float); GError *local_error = NULL; double value; if (gc_float_node->maximum == NULL) return G_MAXDOUBLE; value = arv_gc_property_node_get_double (ARV_GC_PROPERTY_NODE (gc_float_node->maximum), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return G_MAXDOUBLE; } return value; } static double arv_gc_float_node_get_inc (ArvGcFloat *gc_float, GError **error) { ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float); GError *local_error = NULL; double value; if (gc_float_node->increment == NULL) return 1.0; value = arv_gc_property_node_get_double (ARV_GC_PROPERTY_NODE (gc_float_node->increment), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 1.0; } return value; } static const char * arv_gc_float_node_get_unit (ArvGcFloat *gc_float, GError **error) { ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float); GError *local_error = NULL; const char *string; if (gc_float_node->unit == NULL) return NULL; string = arv_gc_property_node_get_string (ARV_GC_PROPERTY_NODE (gc_float_node->unit), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return NULL; } return string; } static void arv_gc_float_node_impose_min (ArvGcFloat *gc_float, double minimum, GError **error) { ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float); GError *local_error = NULL; if (gc_float_node->minimum == NULL) return; arv_gc_property_node_set_double (ARV_GC_PROPERTY_NODE (gc_float_node->minimum), minimum, &local_error); if (local_error != NULL) g_propagate_error (error, local_error); } static void arv_gc_float_node_impose_max (ArvGcFloat *gc_float, double maximum, GError **error) { ArvGcFloatNode *gc_float_node = ARV_GC_FLOAT_NODE (gc_float); GError *local_error = NULL; if (gc_float_node->maximum == NULL) return; arv_gc_property_node_set_double (ARV_GC_PROPERTY_NODE (gc_float_node->maximum), maximum, &local_error); if (local_error != NULL) g_propagate_error (error, local_error); } static void arv_gc_float_node_float_interface_init (ArvGcFloatInterface *interface) { interface->get_value = arv_gc_float_node_get_float_value; interface->set_value = arv_gc_float_node_set_float_value; interface->get_min = arv_gc_float_node_get_min; interface->get_max = arv_gc_float_node_get_max; interface->get_inc = arv_gc_float_node_get_inc; interface->get_unit = arv_gc_float_node_get_unit; interface->impose_min = arv_gc_float_node_impose_min; interface->impose_max = arv_gc_float_node_impose_max; } G_DEFINE_TYPE_WITH_CODE (ArvGcFloatNode, arv_gc_float_node, ARV_TYPE_GC_FEATURE_NODE, G_IMPLEMENT_INTERFACE (ARV_TYPE_GC_FLOAT, arv_gc_float_node_float_interface_init)) aravis-ARAVIS_0_6_0/src/arvgcfloatnode.h000066400000000000000000000044341334570641500201640ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_FLOAT_NODE_H #define ARV_GC_FLOAT_NODE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS #define ARV_TYPE_GC_FLOAT_NODE (arv_gc_float_node_get_type ()) #define ARV_GC_FLOAT_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_FLOAT_NODE, ArvGcFloatNode)) #define ARV_GC_FLOAT_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GC_FLOAT_NODE, ArvGcFloatNodeClass)) #define ARV_IS_GC_FLOAT_NODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_FLOAT_NODE)) #define ARV_IS_GC_FLOAT_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GC_FLOAT_NODE)) #define ARV_GC_FLOAT_NODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GC_FLOAT_NODE, ArvGcFloatNodeClass)) typedef struct _ArvGcFloatNodeClass ArvGcFloatNodeClass; struct _ArvGcFloatNode { ArvGcFeatureNode node; ArvGcPropertyNode *value; ArvGcPropertyNode *minimum; ArvGcPropertyNode *maximum; ArvGcPropertyNode *increment; ArvGcPropertyNode *unit; ArvGcPropertyNode *index; GSList *value_indexed_nodes; ArvGcPropertyNode *value_default; }; struct _ArvGcFloatNodeClass { ArvGcFeatureNodeClass parent_class; }; GType arv_gc_float_node_get_type (void); ArvGcNode * arv_gc_float_node_new (void); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcgroupnode.c000066400000000000000000000054151334570641500202060ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcgroupnode * @short_description: Class for Group nodes */ #include #include #include static GObjectClass *parent_class = NULL; /* ArvDomNode implementation */ static const char * arv_gc_group_node_get_node_name (ArvDomNode *node) { return "Group"; } /* ArvGcFeatureNode implementation */ static void arv_gc_group_node_set_attribute (ArvDomElement *self, const char* name, const char *value) { ArvGcGroupNode *node = ARV_GC_GROUP_NODE (self); if (strcmp (name, "Comment") == 0) { g_free (node->comment); node->comment = g_strdup (value); } } static const char * arv_gc_group_node_get_attribute (ArvDomElement *self, const char *name) { ArvGcGroupNode *node = ARV_GC_GROUP_NODE (self); if (strcmp (name, "ModelName") == 0) return node->comment; return NULL; } /* ArvGcGroupNode implementation */ ArvGcNode * arv_gc_group_node_new (void) { ArvGcNode *node; node = g_object_new (ARV_TYPE_GC_GROUP_NODE, NULL); return node; } static void arv_gc_group_node_init (ArvGcGroupNode *gc_group_node) { } static void arv_gc_group_node_finalize (GObject *object) { ArvGcGroupNode *group_node = ARV_GC_GROUP_NODE (object); g_free (group_node->comment); parent_class->finalize (object); } static void arv_gc_group_node_class_init (ArvGcGroupNodeClass *this_class) { GObjectClass *object_class = G_OBJECT_CLASS (this_class); ArvDomNodeClass *dom_node_class = ARV_DOM_NODE_CLASS (this_class); ArvDomElementClass *dom_element_class = ARV_DOM_ELEMENT_CLASS (this_class); parent_class = g_type_class_peek_parent (this_class); object_class->finalize = arv_gc_group_node_finalize; dom_node_class->get_node_name = arv_gc_group_node_get_node_name; dom_element_class->set_attribute = arv_gc_group_node_set_attribute; dom_element_class->get_attribute = arv_gc_group_node_get_attribute; } G_DEFINE_TYPE (ArvGcGroupNode, arv_gc_group_node, ARV_TYPE_GC_FEATURE_NODE) aravis-ARAVIS_0_6_0/src/arvgcgroupnode.h000066400000000000000000000040421334570641500202060ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_GROUP_NODE_H #define ARV_GC_GROUP_NODE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS #define ARV_TYPE_GC_GROUP_NODE (arv_gc_group_node_get_type ()) #define ARV_GC_GROUP_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_GROUP_NODE, ArvGcGroupNode)) #define ARV_GC_GROUP_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GC_GROUP_NODE, ArvGcGroupNodeClass)) #define ARV_IS_GC_GROUP_NODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_GROUP_NODE)) #define ARV_IS_GC_GROUP_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GC_GROUP_NODE)) #define ARV_GC_GROUP_NODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GC_GROUP_NODE, ArvGcGroupNodeClass)) typedef struct _ArvGcGroupNodeClass ArvGcGroupNodeClass; struct _ArvGcGroupNode { ArvGcFeatureNode base; char *comment; }; struct _ArvGcGroupNodeClass { ArvGcFeatureNodeClass parent_class; }; GType arv_gc_group_node_get_type (void); ArvGcNode * arv_gc_group_node_new (void); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcindexnode.c000066400000000000000000000104451334570641500201600ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcindexnode * @short_description: Class for Index nodes */ #include #include #include #include #include #include #include static GObjectClass *parent_class = NULL; /* ArvDomNode implementation */ static const char * arv_gc_index_node_get_node_name (ArvDomNode *node) { return "pIndex"; } static gboolean arv_gc_index_node_can_append_child (ArvDomNode *parent, ArvDomNode *child) { return ARV_IS_DOM_TEXT (child); } /* ArvDomElement implementation */ static void arv_gc_index_node_set_attribute (ArvDomElement *self, const char *name, const char *value) { ArvGcIndexNode *index_node = ARV_GC_INDEX_NODE (self); if (strcmp (name, "Offset") == 0) { g_free (index_node->offset); index_node->offset = g_strdup (value); index_node->is_p_offset = FALSE; } else if (strcmp (name, "pOffset") == 0) { g_free (index_node->offset); index_node->offset = g_strdup (value); index_node->is_p_offset = TRUE; } } static const char * arv_gc_index_node_get_attribute (ArvDomElement *self, const char *name) { g_assert_not_reached (); return NULL; } /* ArvGcIndexNode implementation */ gint64 arv_gc_index_node_get_index (ArvGcIndexNode *index_node, gint64 default_offset, GError **error) { gint64 offset; gint64 node_value; GError *local_error = NULL; g_return_val_if_fail (ARV_IS_GC_INDEX_NODE (index_node), 0); g_return_val_if_fail (error == NULL || *error == NULL, 0); if (index_node->offset == NULL) offset = default_offset; else { if (index_node->is_p_offset) { ArvGcNode *node; ArvGc *genicam; genicam = arv_gc_node_get_genicam (ARV_GC_NODE (index_node)); node = arv_gc_get_node (genicam, index_node->offset); offset = arv_gc_integer_get_value (ARV_GC_INTEGER (node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } } else offset = g_ascii_strtoll (index_node->offset, NULL, 0); } node_value = arv_gc_property_node_get_int64 (ARV_GC_PROPERTY_NODE (index_node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } return offset * node_value; } ArvGcNode * arv_gc_index_node_new (void) { ArvGcPropertyNode *node; node = g_object_new (ARV_TYPE_GC_INDEX_NODE, NULL); node->type = ARV_GC_PROPERTY_NODE_TYPE_P_INDEX; return ARV_GC_NODE (node); } static void arv_gc_index_node_init (ArvGcIndexNode *index_node) { index_node->offset = NULL; index_node->is_p_offset = FALSE; } static void arv_gc_index_node_finalize (GObject *object) { ArvGcIndexNode *index_node = ARV_GC_INDEX_NODE (object); g_free (index_node->offset); parent_class->finalize (object); } static void arv_gc_index_node_class_init (ArvGcIndexNodeClass *this_class) { GObjectClass *object_class = G_OBJECT_CLASS (this_class); ArvDomNodeClass *dom_node_class = ARV_DOM_NODE_CLASS (this_class); ArvDomElementClass *dom_element_class = ARV_DOM_ELEMENT_CLASS (this_class); parent_class = g_type_class_peek_parent (this_class); object_class->finalize = arv_gc_index_node_finalize; dom_node_class->get_node_name = arv_gc_index_node_get_node_name; dom_node_class->can_append_child = arv_gc_index_node_can_append_child; dom_element_class->set_attribute = arv_gc_index_node_set_attribute; dom_element_class->get_attribute = arv_gc_index_node_get_attribute; } G_DEFINE_TYPE (ArvGcIndexNode, arv_gc_index_node, ARV_TYPE_GC_PROPERTY_NODE) aravis-ARAVIS_0_6_0/src/arvgcindexnode.h000066400000000000000000000042441334570641500201650ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_INDEX_NODE_H #define ARV_GC_INDEX_NODE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS #define ARV_TYPE_GC_INDEX_NODE (arv_gc_index_node_get_type ()) #define ARV_GC_INDEX_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_INDEX_NODE, ArvGcIndexNode)) #define ARV_GC_INDEX_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GC_INDEX_NODE, ArvGcIndexNodeClass)) #define ARV_IS_GC_INDEX_NODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_INDEX_NODE)) #define ARV_IS_GC_INDEX_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GC_INDEX_NODE)) #define ARV_GC_INDEX_NODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GC_INDEX_NODE, ArvGcIndexNodeClass)) typedef struct _ArvGcIndexNodeClass ArvGcIndexNodeClass; struct _ArvGcIndexNode { ArvGcPropertyNode base; char *offset; gboolean is_p_offset; }; struct _ArvGcIndexNodeClass { ArvGcPropertyNodeClass parent_class; }; GType arv_gc_index_node_get_type (void); ArvGcNode * arv_gc_index_node_new (void); gint64 arv_gc_index_node_get_index (ArvGcIndexNode *index_node, gint64 default_offset, GError **error); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcinteger.c000066400000000000000000000124041334570641500176350ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcinteger * @short_description: Integer interface */ #include #include #include #include static void arv_gc_integer_default_init (ArvGcIntegerInterface *gc_integer_iface) { } G_DEFINE_INTERFACE (ArvGcInteger, arv_gc_integer, G_TYPE_OBJECT) gint64 arv_gc_integer_get_value (ArvGcInteger *gc_integer, GError **error) { g_return_val_if_fail (ARV_IS_GC_INTEGER (gc_integer), 0); g_return_val_if_fail (error == NULL || *error == NULL, 0); return ARV_GC_INTEGER_GET_INTERFACE (gc_integer)->get_value (gc_integer, error); } void arv_gc_integer_set_value (ArvGcInteger *gc_integer, gint64 value, GError **error) { g_return_if_fail (ARV_IS_GC_INTEGER (gc_integer)); g_return_if_fail (error == NULL || *error == NULL); ARV_GC_INTEGER_GET_INTERFACE (gc_integer)->set_value (gc_integer, value, error); } gint64 arv_gc_integer_get_min (ArvGcInteger *gc_integer, GError **error) { ArvGcIntegerInterface *integer_interface; g_return_val_if_fail (ARV_IS_GC_INTEGER (gc_integer), 0); g_return_val_if_fail (error == NULL || *error == NULL, 0); integer_interface = ARV_GC_INTEGER_GET_INTERFACE (gc_integer); if (integer_interface->get_min != NULL) return integer_interface->get_min (gc_integer, error); g_set_error (error, ARV_GC_ERROR, ARV_GC_ERROR_PROPERTY_NOT_DEFINED, " node not found for '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (gc_integer))); return G_MININT64; } gint64 arv_gc_integer_get_max (ArvGcInteger *gc_integer, GError **error) { ArvGcIntegerInterface *integer_interface; g_return_val_if_fail (ARV_IS_GC_INTEGER (gc_integer), 0); g_return_val_if_fail (error == NULL || *error == NULL, 0); integer_interface = ARV_GC_INTEGER_GET_INTERFACE (gc_integer); if (integer_interface->get_max != NULL) return integer_interface->get_max (gc_integer, error); g_set_error (error, ARV_GC_ERROR, ARV_GC_ERROR_PROPERTY_NOT_DEFINED, " node not found for '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (gc_integer))); return G_MAXINT64; } gint64 arv_gc_integer_get_inc (ArvGcInteger *gc_integer, GError **error) { ArvGcIntegerInterface *integer_interface; g_return_val_if_fail (ARV_IS_GC_INTEGER (gc_integer), 0); g_return_val_if_fail (error == NULL || *error == NULL, 0); integer_interface = ARV_GC_INTEGER_GET_INTERFACE (gc_integer); if (integer_interface->get_inc != NULL) return integer_interface->get_inc (gc_integer, error); g_set_error (error, ARV_GC_ERROR, ARV_GC_ERROR_PROPERTY_NOT_DEFINED, " node not found for '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (gc_integer))); return 1; } const char * arv_gc_integer_get_unit (ArvGcInteger *gc_integer, GError **error) { ArvGcIntegerInterface *integer_interface; g_return_val_if_fail (ARV_IS_GC_INTEGER (gc_integer), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); integer_interface = ARV_GC_INTEGER_GET_INTERFACE (gc_integer); if (integer_interface->get_unit != NULL) return integer_interface->get_unit (gc_integer, error); g_set_error (error, ARV_GC_ERROR, ARV_GC_ERROR_PROPERTY_NOT_DEFINED, " node not found for '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (gc_integer))); return NULL; } void arv_gc_integer_impose_min (ArvGcInteger *gc_integer, gint64 minimum, GError **error) { ArvGcIntegerInterface *integer_interface; g_return_if_fail (ARV_IS_GC_INTEGER (gc_integer)); g_return_if_fail (error == NULL || *error == NULL); integer_interface = ARV_GC_INTEGER_GET_INTERFACE (gc_integer); if (integer_interface->impose_min != NULL) integer_interface->impose_min (gc_integer, minimum, error); else g_set_error (error, ARV_GC_ERROR, ARV_GC_ERROR_PROPERTY_NOT_DEFINED, " node not found for '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (gc_integer))); } void arv_gc_integer_impose_max (ArvGcInteger *gc_integer, gint64 maximum, GError **error) { ArvGcIntegerInterface *integer_interface; g_return_if_fail (ARV_IS_GC_INTEGER (gc_integer)); g_return_if_fail (error == NULL || *error == NULL); integer_interface = ARV_GC_INTEGER_GET_INTERFACE (gc_integer); if (integer_interface->impose_max != NULL) integer_interface->impose_max (gc_integer, maximum, error); else g_set_error (error, ARV_GC_ERROR, ARV_GC_ERROR_PROPERTY_NOT_DEFINED, " node not found for '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (gc_integer))); } aravis-ARAVIS_0_6_0/src/arvgcinteger.h000066400000000000000000000056201334570641500176440ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_INTEGER_H #define ARV_GC_INTEGER_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS #define ARV_TYPE_GC_INTEGER (arv_gc_integer_get_type ()) #define ARV_GC_INTEGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_INTEGER, ArvGcInteger)) #define ARV_IS_GC_INTEGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_INTEGER)) #define ARV_GC_INTEGER_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), ARV_TYPE_GC_INTEGER, ArvGcIntegerInterface)) typedef struct _ArvGcIntegerInterface ArvGcIntegerInterface; struct _ArvGcIntegerInterface { GTypeInterface parent; gint64 (*get_value) (ArvGcInteger *gc_integer, GError **error); void (*set_value) (ArvGcInteger *gc_integer, gint64 value, GError **error); gint64 (*get_min) (ArvGcInteger *gc_integer, GError **error); gint64 (*get_max) (ArvGcInteger *gc_integer, GError **error); gint64 (*get_inc) (ArvGcInteger *gc_integer, GError **error); const char * (*get_unit) (ArvGcInteger *gc_integer, GError **error); void (*impose_min) (ArvGcInteger *gc_integer, gint64 minimum, GError **error); void (*impose_max) (ArvGcInteger *gc_integer, gint64 maximum, GError **error); }; GType arv_gc_integer_get_type (void); gint64 arv_gc_integer_get_value (ArvGcInteger *gc_integer, GError **error); void arv_gc_integer_set_value (ArvGcInteger *gc_integer, gint64 value, GError **error); gint64 arv_gc_integer_get_min (ArvGcInteger *gc_integer, GError **error); gint64 arv_gc_integer_get_max (ArvGcInteger *gc_integer, GError **error); gint64 arv_gc_integer_get_inc (ArvGcInteger *gc_integer, GError **error); const char * arv_gc_integer_get_unit (ArvGcInteger *gc_integer, GError **error); void arv_gc_integer_impose_min (ArvGcInteger *gc_integer, gint64 minimum, GError **error); void arv_gc_integer_impose_max (ArvGcInteger *gc_integer, gint64 maximum, GError **error); /* FIXME get_representation is missing */ G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcintegernode.c000066400000000000000000000243451334570641500205120ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2017 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcintegernode * @short_description: Class for Integer nodes */ #include #include #include #include #include #include #include static GObjectClass *parent_class = NULL; /* ArvDomNode implementation */ static const char * arv_gc_integer_node_get_node_name (ArvDomNode *node) { return "Integer"; } static void arv_gc_integer_node_post_new_child (ArvDomNode *self, ArvDomNode *child) { ArvGcIntegerNode *node = ARV_GC_INTEGER_NODE (self); if (ARV_IS_GC_PROPERTY_NODE (child)) { ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (child); switch (arv_gc_property_node_get_node_type (property_node)) { case ARV_GC_PROPERTY_NODE_TYPE_VALUE: case ARV_GC_PROPERTY_NODE_TYPE_P_VALUE: node->value = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_MINIMUM: case ARV_GC_PROPERTY_NODE_TYPE_P_MINIMUM: node->minimum = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_MAXIMUM: case ARV_GC_PROPERTY_NODE_TYPE_P_MAXIMUM: node->maximum = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_INCREMENT: case ARV_GC_PROPERTY_NODE_TYPE_P_INCREMENT: node->increment = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_UNIT: node->unit = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_P_INDEX: node->index = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_VALUE_INDEXED: case ARV_GC_PROPERTY_NODE_TYPE_P_VALUE_INDEXED: node->value_indexed_nodes = g_slist_prepend (node->value_indexed_nodes, property_node); break; case ARV_GC_PROPERTY_NODE_TYPE_VALUE_DEFAULT: case ARV_GC_PROPERTY_NODE_TYPE_P_VALUE_DEFAULT: node->value_default = property_node; break; default: ARV_DOM_NODE_CLASS (parent_class)->post_new_child (self, child); break; } } } static void arv_gc_integer_node_pre_remove_child (ArvDomNode *self, ArvDomNode *child) { g_assert_not_reached (); } /* ArvGcFeatureNode implementation */ static ArvGcPropertyNode * _get_value_node (ArvGcIntegerNode *gc_integer_node, GError **error) { GError *local_error = NULL; if (gc_integer_node->value != NULL) return gc_integer_node->value; if (gc_integer_node->index != NULL) { gint64 index; GSList *iter; index = arv_gc_property_node_get_int64 (ARV_GC_PROPERTY_NODE (gc_integer_node->index), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return NULL; } for (iter = gc_integer_node->value_indexed_nodes; iter != NULL; iter = iter->next) { if (arv_gc_value_indexed_node_get_index (iter->data) == index) return iter->data; } if (gc_integer_node->value_default != NULL) return gc_integer_node->value_default; } return NULL; } static GType arv_gc_integer_node_get_value_type (ArvGcFeatureNode *node) { return G_TYPE_INT64; } static void arv_gc_integer_node_set_value_from_string (ArvGcFeatureNode *node, const char *string, GError **error) { arv_gc_integer_set_value (ARV_GC_INTEGER (node), g_ascii_strtoll (string, NULL, 0), error); } static const char * arv_gc_integer_node_get_value_as_string (ArvGcFeatureNode *node, GError **error) { ArvGcIntegerNode *integer_node = ARV_GC_INTEGER_NODE (node); ArvGcPropertyNode *value_node; GError *local_error = NULL; const char *string; value_node = _get_value_node (integer_node, error); if (value_node == NULL) return NULL; string = arv_gc_property_node_get_string (value_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return NULL; } return string; } /* ArvGcIntegerNode implementation */ ArvGcNode * arv_gc_integer_node_new (void) { ArvGcNode *node; node = g_object_new (ARV_TYPE_GC_INTEGER_NODE, NULL); return node; } static void arv_gc_integer_node_init (ArvGcIntegerNode *gc_integer_node) { } static void arv_gc_integer_node_finalize (GObject *object) { ArvGcIntegerNode *gc_integer_node = ARV_GC_INTEGER_NODE (object); parent_class->finalize (object); g_slist_free (gc_integer_node->value_indexed_nodes); } static void arv_gc_integer_node_class_init (ArvGcIntegerNodeClass *this_class) { GObjectClass *object_class = G_OBJECT_CLASS (this_class); ArvDomNodeClass *dom_node_class = ARV_DOM_NODE_CLASS (this_class); ArvGcFeatureNodeClass *gc_feature_node_class = ARV_GC_FEATURE_NODE_CLASS (this_class); parent_class = g_type_class_peek_parent (this_class); object_class->finalize = arv_gc_integer_node_finalize; dom_node_class->get_node_name = arv_gc_integer_node_get_node_name; dom_node_class->post_new_child = arv_gc_integer_node_post_new_child; dom_node_class->pre_remove_child = arv_gc_integer_node_pre_remove_child; gc_feature_node_class->get_value_type = arv_gc_integer_node_get_value_type; gc_feature_node_class->set_value_from_string = arv_gc_integer_node_set_value_from_string; gc_feature_node_class->get_value_as_string = arv_gc_integer_node_get_value_as_string; } /* ArvGcInteger interface implementation */ static gint64 arv_gc_integer_node_get_integer_value (ArvGcInteger *gc_integer, GError **error) { ArvGcIntegerNode *gc_integer_node = ARV_GC_INTEGER_NODE (gc_integer); ArvGcPropertyNode *value_node; GError *local_error = NULL; gint64 value; value_node = _get_value_node (gc_integer_node, error); if (value_node == NULL) return 0; value = arv_gc_property_node_get_int64 (ARV_GC_PROPERTY_NODE (value_node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } return value; } static void arv_gc_integer_node_set_integer_value (ArvGcInteger *gc_integer, gint64 value, GError **error) { ArvGcIntegerNode *gc_integer_node = ARV_GC_INTEGER_NODE (gc_integer); ArvGcPropertyNode *value_node; GError *local_error = NULL; value_node = _get_value_node (gc_integer_node, error); if (value_node == NULL) return; arv_gc_property_node_set_int64 (ARV_GC_PROPERTY_NODE (value_node), value, &local_error); if (local_error != NULL) g_propagate_error (error, local_error); } static gint64 arv_gc_integer_node_get_min (ArvGcInteger *gc_integer, GError **error) { ArvGcIntegerNode *gc_integer_node = ARV_GC_INTEGER_NODE (gc_integer); GError *local_error = NULL; gint64 value; if (gc_integer_node->minimum == NULL) return G_MININT64; value = arv_gc_property_node_get_int64 (ARV_GC_PROPERTY_NODE (gc_integer_node->minimum), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return G_MININT64; } return value; } static gint64 arv_gc_integer_node_get_max (ArvGcInteger *gc_integer, GError **error) { ArvGcIntegerNode *gc_integer_node = ARV_GC_INTEGER_NODE (gc_integer); GError *local_error = NULL; gint64 value; if (gc_integer_node->maximum == NULL) return G_MAXINT64; value = arv_gc_property_node_get_int64 (ARV_GC_PROPERTY_NODE (gc_integer_node->maximum), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return G_MAXINT64; } return value; } static gint64 arv_gc_integer_node_get_inc (ArvGcInteger *gc_integer, GError **error) { ArvGcIntegerNode *gc_integer_node = ARV_GC_INTEGER_NODE (gc_integer); GError *local_error = NULL; gint64 value; if (gc_integer_node->increment == NULL) return 1; value = arv_gc_property_node_get_int64 (ARV_GC_PROPERTY_NODE (gc_integer_node->increment), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 1; } return value; } static const char * arv_gc_integer_node_get_unit (ArvGcInteger *gc_integer, GError **error) { ArvGcIntegerNode *gc_integer_node = ARV_GC_INTEGER_NODE (gc_integer); GError *local_error = NULL; const char *string; if (gc_integer_node->unit == NULL) return NULL; string = arv_gc_property_node_get_string (ARV_GC_PROPERTY_NODE (gc_integer_node->unit), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return NULL; } return string; } static void arv_gc_integer_node_impose_min (ArvGcInteger *gc_integer, gint64 minimum, GError **error) { ArvGcIntegerNode *gc_integer_node = ARV_GC_INTEGER_NODE (gc_integer); GError *local_error = NULL; if (gc_integer_node->minimum == NULL) return; arv_gc_property_node_set_int64 (ARV_GC_PROPERTY_NODE (gc_integer_node->minimum), minimum, &local_error); if (local_error != NULL) g_propagate_error (error, local_error); } static void arv_gc_integer_node_impose_max (ArvGcInteger *gc_integer, gint64 maximum, GError **error) { ArvGcIntegerNode *gc_integer_node = ARV_GC_INTEGER_NODE (gc_integer); GError *local_error = NULL; if (gc_integer_node->maximum == NULL) return; arv_gc_property_node_set_int64 (ARV_GC_PROPERTY_NODE (gc_integer_node->maximum), maximum, &local_error); if (local_error != NULL) g_propagate_error (error, local_error); } static void arv_gc_integer_node_integer_interface_init (ArvGcIntegerInterface *interface) { interface->get_value = arv_gc_integer_node_get_integer_value; interface->set_value = arv_gc_integer_node_set_integer_value; interface->get_min = arv_gc_integer_node_get_min; interface->get_max = arv_gc_integer_node_get_max; interface->get_inc = arv_gc_integer_node_get_inc; interface->get_unit = arv_gc_integer_node_get_unit; interface->impose_min = arv_gc_integer_node_impose_min; interface->impose_max = arv_gc_integer_node_impose_max; } G_DEFINE_TYPE_WITH_CODE (ArvGcIntegerNode, arv_gc_integer_node, ARV_TYPE_GC_FEATURE_NODE, G_IMPLEMENT_INTERFACE (ARV_TYPE_GC_INTEGER, arv_gc_integer_node_integer_interface_init)) aravis-ARAVIS_0_6_0/src/arvgcintegernode.h000066400000000000000000000045111334570641500205100ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_INTEGER_NODE_H #define ARV_GC_INTEGER_NODE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS #define ARV_TYPE_GC_INTEGER_NODE (arv_gc_integer_node_get_type ()) #define ARV_GC_INTEGER_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_INTEGER_NODE, ArvGcIntegerNode)) #define ARV_GC_INTEGER_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GC_INTEGER_NODE, ArvGcIntegerNodeClass)) #define ARV_IS_GC_INTEGER_NODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_INTEGER_NODE)) #define ARV_IS_GC_INTEGER_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GC_INTEGER_NODE)) #define ARV_GC_INTEGER_NODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GC_INTEGER_NODE, ArvGcIntegerNodeClass)) typedef struct _ArvGcIntegerNodeClass ArvGcIntegerNodeClass; struct _ArvGcIntegerNode { ArvGcFeatureNode node; ArvGcPropertyNode *value; ArvGcPropertyNode *minimum; ArvGcPropertyNode *maximum; ArvGcPropertyNode *increment; ArvGcPropertyNode *unit; ArvGcPropertyNode *index; GSList *value_indexed_nodes; ArvGcPropertyNode *value_default; }; struct _ArvGcIntegerNodeClass { ArvGcFeatureNodeClass parent_class; }; GType arv_gc_integer_node_get_type (void); ArvGcNode * arv_gc_integer_node_new (void); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcinvalidatornode.c000066400000000000000000000047651334570641500213750ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcinvalidatornode * @short_description: Class for Invalidator nodes */ #include #include #include #include #include #include static GObjectClass *parent_class = NULL; /* ArvDomNode implementation */ static const char * arv_gc_invalidator_node_get_node_name (ArvDomNode *node) { return "pInvalidator"; } /* ArvGcInvalidatorNode implementation */ gint arv_gc_invalidator_node_get_modification_count (ArvGcInvalidatorNode *invalidator_node) { g_return_val_if_fail (ARV_IS_GC_INVALIDATOR_NODE (invalidator_node), 0); return invalidator_node->modification_count; } void arv_gc_invalidator_node_set_modification_count (ArvGcInvalidatorNode *invalidator_node, gint modification_count) { g_return_if_fail (ARV_IS_GC_INVALIDATOR_NODE (invalidator_node)); invalidator_node->modification_count = modification_count; } ArvGcNode * arv_gc_invalidator_node_new (void) { ArvGcPropertyNode *node; node = g_object_new (ARV_TYPE_GC_INVALIDATOR_NODE, NULL); node->type = ARV_GC_PROPERTY_NODE_TYPE_P_INVALIDATOR; return ARV_GC_NODE (node); } static void arv_gc_invalidator_node_init (ArvGcInvalidatorNode *invalidator_node) { invalidator_node->modification_count = 0; } static void arv_gc_invalidator_node_class_init (ArvGcInvalidatorNodeClass *this_class) { ArvDomNodeClass *dom_node_class = ARV_DOM_NODE_CLASS (this_class); parent_class = g_type_class_peek_parent (this_class); dom_node_class->get_node_name = arv_gc_invalidator_node_get_node_name; } G_DEFINE_TYPE (ArvGcInvalidatorNode, arv_gc_invalidator_node, ARV_TYPE_GC_PROPERTY_NODE) aravis-ARAVIS_0_6_0/src/arvgcinvalidatornode.h000066400000000000000000000046221334570641500213720ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_INVALIDATOR_NODE_H #define ARV_GC_INVALIDATOR_NODE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS #define ARV_TYPE_GC_INVALIDATOR_NODE (arv_gc_invalidator_node_get_type ()) #define ARV_GC_INVALIDATOR_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_INVALIDATOR_NODE, ArvGcInvalidatorNode)) #define ARV_GC_INVALIDATOR_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GC_INVALIDATOR_NODE, ArvGcInvalidatorNodeClass)) #define ARV_IS_GC_INVALIDATOR_NODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_INVALIDATOR_NODE)) #define ARV_IS_GC_INVALIDATOR_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GC_INVALIDATOR_NODE)) #define ARV_GC_INVALIDATOR_NODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GC_INVALIDATOR_NODE, ArvGcInvalidatorNodeClass)) typedef struct _ArvGcInvalidatorNodeClass ArvGcInvalidatorNodeClass; struct _ArvGcInvalidatorNode { ArvGcPropertyNode base; gint modification_count; }; struct _ArvGcInvalidatorNodeClass { ArvGcPropertyNodeClass parent_class; }; GType arv_gc_invalidator_node_get_type (void); ArvGcNode * arv_gc_invalidator_node_new (void); gint arv_gc_invalidator_node_get_modification_count (ArvGcInvalidatorNode *invalidator_node); void arv_gc_invalidator_node_set_modification_count (ArvGcInvalidatorNode *invalidator_node, gint modification_count); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcnode.c000066400000000000000000000040401334570641500171220ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcnode * @short_description: Base class for all Genicam nodes * * #ArvGcNode provides a base class for the implementation of the different * types of Genicam nodes. */ #include #include #include #include #include static GObjectClass *parent_class = NULL; /* ArvDomNode implementation */ /* ArvDomElement implementation */ /* ArvGcNode implementation */ /** * arv_gc_node_get_genicam: * @gc_node: a #ArvGcNode * * Retrieves the parent genicam document of @gc_node. * * Return value: (transfer none): the parent #ArvGc */ ArvGc * arv_gc_node_get_genicam (ArvGcNode *gc_node) { return ARV_GC (arv_dom_node_get_owner_document (ARV_DOM_NODE (gc_node))); } static void arv_gc_node_init (ArvGcNode *gc_node) { } static void arv_gc_node_finalize (GObject *object) { parent_class->finalize (object); } static void arv_gc_node_class_init (ArvGcNodeClass *this_class) { GObjectClass *object_class = G_OBJECT_CLASS (this_class); parent_class = g_type_class_peek_parent (this_class); object_class->finalize = arv_gc_node_finalize; } G_DEFINE_ABSTRACT_TYPE (ArvGcNode, arv_gc_node, ARV_TYPE_DOM_ELEMENT) aravis-ARAVIS_0_6_0/src/arvgcnode.h000066400000000000000000000037101334570641500171320ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_NODE_H #define ARV_GC_NODE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS #define ARV_TYPE_GC_NODE (arv_gc_node_get_type ()) #define ARV_GC_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_NODE, ArvGcNode)) #define ARV_GC_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GC_NODE, ArvGcNodeClass)) #define ARV_IS_GC_NODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_NODE)) #define ARV_IS_GC_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GC_NODE)) #define ARV_GC_NODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GC_NODE, ArvGcNodeClass)) typedef struct _ArvGcNodePrivate ArvGcNodePrivate; typedef struct _ArvGcNodeClass ArvGcNodeClass; struct _ArvGcNode { ArvDomElement base; }; struct _ArvGcNodeClass { ArvDomElementClass parent_class; }; GType arv_gc_node_get_type (void); ArvGc * arv_gc_node_get_genicam (ArvGcNode *gc_node); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcport.c000066400000000000000000000173251334570641500171730ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcport * @short_description: Class for Port nodes */ #include #include #include #include #include #include #include #include #include static GObjectClass *parent_class = NULL; struct _ArvGcPortPrivate { ArvGcPropertyNode *chunk_id; }; /* ArvDomNode implementation */ static const char * _get_node_name (ArvDomNode *node) { return "Port"; } static void _post_new_child (ArvDomNode *self, ArvDomNode *child) { ArvGcPort *node = ARV_GC_PORT (self); if (ARV_IS_GC_PROPERTY_NODE (child)) { ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (child); switch (arv_gc_property_node_get_node_type (property_node)) { case ARV_GC_PROPERTY_NODE_TYPE_CHUNK_ID: node->priv->chunk_id = property_node; break; default: ARV_DOM_NODE_CLASS (parent_class)->post_new_child (self, child); break; } } else ARV_DOM_NODE_CLASS (parent_class)->post_new_child (self, child); } static void _pre_remove_child (ArvDomNode *self, ArvDomNode *child) { g_assert_not_reached (); } /* ArvGcPort implementation */ static gboolean _use_legacy_endianess_mechanism (ArvGcPort *port, guint64 length) { ArvDomDocument *document; ArvGcRegisterDescriptionNode *register_description; document = arv_dom_node_get_owner_document (ARV_DOM_NODE (port)); register_description = ARV_GC_REGISTER_DESCRIPTION_NODE (arv_dom_document_get_document_element (document)); return length == 4 && (arv_gc_register_description_node_compare_schema_version (register_description, 1, 1, 0) < 0); } void arv_gc_port_read (ArvGcPort *port, void *buffer, guint64 address, guint64 length, GError **error) { ArvGc *genicam; g_return_if_fail (ARV_IS_GC_PORT (port)); g_return_if_fail (error == NULL || *error == NULL); g_return_if_fail (buffer != NULL); genicam = arv_gc_node_get_genicam (ARV_GC_NODE (port)); if (port->priv->chunk_id == NULL) { ArvDevice *device; device = arv_gc_get_device (genicam); if (ARV_IS_DEVICE (device)) { /* For schema < 1.1.0 and length == 4, register read must be used instead of memory read. * Only applies to GigE Vision devices. See Appendix 3 of Genicam 2.0 specification. */ if (ARV_IS_GV_DEVICE (device) && _use_legacy_endianess_mechanism (port, length)) { guint32 value; /* For schema < 1.1.0, all registers are big endian. */ value = *((guint32 *) buffer); value = GUINT32_FROM_BE (value); arv_device_read_register (device, address, &value, error); *((guint32 *) buffer) = GUINT32_TO_BE (value); } else arv_device_read_memory (device, address, length, buffer, error); } else { if (error != NULL && *error == NULL) *error = g_error_new (ARV_CHUNK_PARSER_ERROR, ARV_CHUNK_PARSER_STATUS_INVALID_FEATURE_NAME, "[ArvGcPort::read] Invalid feature name"); } } else { ArvBuffer *chunk_data_buffer; chunk_data_buffer = arv_gc_get_buffer (genicam); if (!ARV_IS_BUFFER (chunk_data_buffer)) { if (error != NULL && *error == NULL) *error = g_error_new (ARV_CHUNK_PARSER_ERROR, ARV_CHUNK_PARSER_STATUS_BUFFER_NOT_FOUND, "[ArvGcPort::read] Buffer not found"); } else { char *chunk_data; size_t chunk_data_size; guint chunk_id; chunk_id = g_ascii_strtoll (arv_gc_property_node_get_string (port->priv->chunk_id, NULL), NULL, 16); chunk_data = (char *) arv_buffer_get_chunk_data (chunk_data_buffer, chunk_id, &chunk_data_size); if (chunk_data != NULL) { memcpy (buffer, chunk_data + address, MIN (chunk_data_size - address, length)); } else { if (error != NULL && *error == NULL) *error = g_error_new (ARV_CHUNK_PARSER_ERROR, ARV_CHUNK_PARSER_STATUS_CHUNK_NOT_FOUND, "[ArvGcPort::read] Chunk 0x%08x not found", chunk_id); } } } } void arv_gc_port_write (ArvGcPort *port, void *buffer, guint64 address, guint64 length, GError **error) { ArvGc *genicam; ArvDevice *device; g_return_if_fail (ARV_IS_GC_PORT (port)); g_return_if_fail (error == NULL || *error == NULL); g_return_if_fail (buffer != NULL); genicam = arv_gc_node_get_genicam (ARV_GC_NODE (port)); if (port->priv->chunk_id == NULL) { device = arv_gc_get_device (genicam); if (ARV_IS_DEVICE (device)) { /* For schema < 1.1.0 and length == 4, register write must be used instead of memory write. * Only applies to GigE Vision devices. See Appendix 3 of Genicam 2.0 specification. */ if (ARV_IS_GV_DEVICE (device) && _use_legacy_endianess_mechanism (port, length)) { guint32 value; /* For schema < 1.1.0, all registers are big endian. */ value = *((guint32 *) buffer); value = GUINT32_FROM_BE (value); arv_device_write_register (device, address, value, error); } else arv_device_write_memory (device, address, length, buffer, error); } else { if (error != NULL && *error == NULL) *error = g_error_new (ARV_CHUNK_PARSER_ERROR, ARV_CHUNK_PARSER_STATUS_INVALID_FEATURE_NAME, "[ArvGcPort::write] Invalid feature name"); } } else { ArvBuffer *chunk_data_buffer; chunk_data_buffer = arv_gc_get_buffer (genicam); if (!ARV_IS_BUFFER (chunk_data_buffer)) { if (error != NULL && *error == NULL) *error = g_error_new (ARV_CHUNK_PARSER_ERROR, ARV_CHUNK_PARSER_STATUS_BUFFER_NOT_FOUND, "[ArvGcPort::write] Buffer not found"); } else { char *chunk_data; size_t chunk_data_size; guint chunk_id; chunk_id = g_ascii_strtoll (arv_gc_property_node_get_string (port->priv->chunk_id, NULL), NULL, 16); chunk_data = (char *) arv_buffer_get_chunk_data (chunk_data_buffer, chunk_id, &chunk_data_size); if (chunk_data != NULL) { memcpy (chunk_data + address, buffer, MIN (chunk_data_size - address, length)); } else { if (error != NULL && *error == NULL) *error = g_error_new (ARV_CHUNK_PARSER_ERROR, ARV_CHUNK_PARSER_STATUS_CHUNK_NOT_FOUND, "[ArvGcPort::write] Chunk 0x%08x not found", chunk_id); } } } } ArvGcNode * arv_gc_port_new (void) { ArvGcNode *node; node = g_object_new (ARV_TYPE_GC_PORT, NULL); return node; } static void arv_gc_port_init (ArvGcPort *gc_port) { gc_port->priv = G_TYPE_INSTANCE_GET_PRIVATE (gc_port, ARV_TYPE_GC_PORT, ArvGcPortPrivate); gc_port->priv->chunk_id = 0; } static void _finalize (GObject *object) { parent_class->finalize (object); } static void arv_gc_port_class_init (ArvGcPortClass *this_class) { GObjectClass *object_class = G_OBJECT_CLASS (this_class); ArvDomNodeClass *dom_node_class = ARV_DOM_NODE_CLASS (this_class); g_type_class_add_private (this_class, sizeof (ArvGcPortPrivate)); parent_class = g_type_class_peek_parent (this_class); object_class->finalize = _finalize; dom_node_class->get_node_name = _get_node_name; dom_node_class->post_new_child = _post_new_child; dom_node_class->pre_remove_child = _pre_remove_child; } G_DEFINE_TYPE (ArvGcPort, arv_gc_port, ARV_TYPE_GC_FEATURE_NODE) aravis-ARAVIS_0_6_0/src/arvgcport.h000066400000000000000000000042561334570641500171770ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_PORT_H #define ARV_GC_PORT_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS #define ARV_TYPE_GC_PORT (arv_gc_port_get_type ()) #define ARV_GC_PORT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_PORT, ArvGcPort)) #define ARV_GC_PORT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GC_PORT, ArvGcPortClass)) #define ARV_IS_GC_PORT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_PORT)) #define ARV_IS_GC_PORT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GC_PORT)) #define ARV_GC_PORT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GC_PORT, ArvGcPortClass)) typedef struct _ArvGcPortPrivate ArvGcPortPrivate; typedef struct _ArvGcPortClass ArvGcPortClass; struct _ArvGcPort { ArvGcFeatureNode node; ArvGcPortPrivate *priv; }; struct _ArvGcPortClass { ArvGcFeatureNodeClass parent_class; }; GType arv_gc_port_get_type (void); ArvGcNode * arv_gc_port_new (void); void arv_gc_port_read (ArvGcPort *port, void *buffer, guint64 address, guint64 length, GError **error); void arv_gc_port_write (ArvGcPort *port, void *buffer, guint64 address, guint64 length, GError **error); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcpropertynode.c000066400000000000000000000471731334570641500207450ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcpropertynode * @short_description: Base class for Genicam property nodes * * #ArvGcPropertyNode provides a base class for the implementation of the different * types of Genicam property nodes (Value, pValue, Endianess...). */ #include #include #include #include #include #include #include #include #include #include static GObjectClass *parent_class = NULL; /* ArvDomNode implementation */ static const char * arv_gc_property_node_get_node_name (ArvDomNode *node) { ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (node); switch (property_node->type) { case ARV_GC_PROPERTY_NODE_TYPE_VALUE: return "Value"; case ARV_GC_PROPERTY_NODE_TYPE_ADDRESS: return "Address"; case ARV_GC_PROPERTY_NODE_TYPE_DESCRIPTION: return "Description"; case ARV_GC_PROPERTY_NODE_TYPE_TOOLTIP: return "ToolTip"; case ARV_GC_PROPERTY_NODE_TYPE_DISPLAY_NAME: return "DisplayName"; case ARV_GC_PROPERTY_NODE_TYPE_MINIMUM: return "Min"; case ARV_GC_PROPERTY_NODE_TYPE_MAXIMUM: return "Max"; case ARV_GC_PROPERTY_NODE_TYPE_INCREMENT: return "Inc"; case ARV_GC_PROPERTY_NODE_TYPE_UNIT: return "Unit"; case ARV_GC_PROPERTY_NODE_TYPE_ON_VALUE: return "OnValue"; case ARV_GC_PROPERTY_NODE_TYPE_OFF_VALUE: return "OffValue"; case ARV_GC_PROPERTY_NODE_TYPE_LENGTH: return "Length"; case ARV_GC_PROPERTY_NODE_TYPE_FORMULA: return "Formula"; case ARV_GC_PROPERTY_NODE_TYPE_FORMULA_TO: return "FormulaTo"; case ARV_GC_PROPERTY_NODE_TYPE_FORMULA_FROM: return "FormulaFrom"; case ARV_GC_PROPERTY_NODE_TYPE_EXPRESSION: return "Expression"; case ARV_GC_PROPERTY_NODE_TYPE_CONSTANT: return "Constant"; case ARV_GC_PROPERTY_NODE_TYPE_ACCESS_MODE: return "AccessMode"; case ARV_GC_PROPERTY_NODE_TYPE_CACHABLE: return "Cachable"; case ARV_GC_PROPERTY_NODE_TYPE_POLLING_TIME: return "PollingTime"; case ARV_GC_PROPERTY_NODE_TYPE_ENDIANESS: return "Endianess"; case ARV_GC_PROPERTY_NODE_TYPE_SIGN: return "Sign"; case ARV_GC_PROPERTY_NODE_TYPE_LSB: return "LSB"; case ARV_GC_PROPERTY_NODE_TYPE_MSB: return "MSB"; case ARV_GC_PROPERTY_NODE_TYPE_BIT: return "Bit"; case ARV_GC_PROPERTY_NODE_TYPE_COMMAND_VALUE: return "CommandValue"; case ARV_GC_PROPERTY_NODE_TYPE_CHUNK_ID: return "ChunkID"; case ARV_GC_PROPERTY_NODE_TYPE_VALUE_DEFAULT: return "ValueDefault"; case ARV_GC_PROPERTY_NODE_TYPE_P_FEATURE: return "pFeature"; case ARV_GC_PROPERTY_NODE_TYPE_P_VALUE: return "pValue"; case ARV_GC_PROPERTY_NODE_TYPE_P_ADDRESS: return "pAddress"; case ARV_GC_PROPERTY_NODE_TYPE_P_IS_IMPLEMENTED: return "pIsImplemented"; case ARV_GC_PROPERTY_NODE_TYPE_P_IS_AVAILABLE: return "pIsAvailable"; case ARV_GC_PROPERTY_NODE_TYPE_P_IS_LOCKED: return "pIsLocked"; case ARV_GC_PROPERTY_NODE_TYPE_P_MINIMUM: return "pMin"; case ARV_GC_PROPERTY_NODE_TYPE_P_MAXIMUM: return "pMax"; case ARV_GC_PROPERTY_NODE_TYPE_P_INCREMENT: return "pInc"; case ARV_GC_PROPERTY_NODE_TYPE_P_LENGTH: return "pLength"; case ARV_GC_PROPERTY_NODE_TYPE_P_PORT: return "pPort"; case ARV_GC_PROPERTY_NODE_TYPE_P_VARIABLE: return "pVariable"; case ARV_GC_PROPERTY_NODE_TYPE_P_COMMAND_VALUE: return "pCommandValue"; case ARV_GC_PROPERTY_NODE_TYPE_P_VALUE_DEFAULT: return "pValueDefault"; default: return "Unknown"; } } /* ArvDomElement implementation */ static gboolean _can_append_child (ArvDomNode *self, ArvDomNode *child) { return ARV_IS_DOM_TEXT (child); } static void _post_new_child (ArvDomNode *parent, ArvDomNode *child) { ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (parent); property_node->value_data_up_to_date = FALSE; } static void _pre_remove_child (ArvDomNode *parent, ArvDomNode *child) { ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (parent); property_node->value_data_up_to_date = FALSE; } /* ArvDomElement implementation */ static void arv_gc_property_node_set_attribute (ArvDomElement *self, const char *name, const char *value) { ArvGcPropertyNode *gc_property_node = ARV_GC_PROPERTY_NODE (self); if (strcmp (name, "Name") == 0) { g_free (gc_property_node->name); gc_property_node->name = g_strdup (value); } else arv_debug_dom ("[GcPropertyNode::set_attribute] Uknown attribute '%s'", name); } static const char * arv_gc_property_node_get_attribute (ArvDomElement *self, const char *name) { ArvGcPropertyNode *gc_property_node = ARV_GC_PROPERTY_NODE (self); if (strcmp (name, "Name") == 0) return gc_property_node->name; arv_debug_dom ("[GcPropertyNode::set_attribute] Uknown attribute '%s'", name); return NULL; } /* ArvGcPropertyNode implementation */ static const char * _get_value_data (ArvGcPropertyNode *property_node) { ArvDomNode *dom_node = ARV_DOM_NODE (property_node); if (!property_node->value_data_up_to_date) { ArvDomNode *iter; GString *string = g_string_new (NULL); for (iter = dom_node->first_child; iter != NULL; iter = iter->next_sibling) g_string_append (string, arv_dom_character_data_get_data (ARV_DOM_CHARACTER_DATA (iter))); g_free (property_node->value_data); property_node->value_data = string->str; g_string_free (string, FALSE); property_node->value_data_up_to_date = TRUE; } return property_node->value_data; } static void _set_value_data (ArvGcPropertyNode *property_node, const char *data) { ArvDomNode *dom_node = ARV_DOM_NODE (property_node); if (dom_node->first_child != NULL) { ArvDomNode *iter; arv_dom_character_data_set_data (ARV_DOM_CHARACTER_DATA (dom_node->first_child), data); for (iter = dom_node->first_child->next_sibling; iter != NULL; iter = iter->next_sibling) arv_dom_character_data_set_data (ARV_DOM_CHARACTER_DATA (iter), ""); } g_free (property_node->value_data); property_node->value_data = g_strdup (data); property_node->value_data_up_to_date = TRUE; } static ArvDomNode * _get_pvalue_node (ArvGcPropertyNode *property_node) { ArvDomNode *pvalue_node; const char *node_name; ArvGc *genicam; if (property_node->type < ARV_GC_PROPERTY_NODE_TYPE_P_UNKNONW) return NULL; node_name = _get_value_data (property_node); genicam = arv_gc_node_get_genicam (ARV_GC_NODE (property_node)); pvalue_node = ARV_DOM_NODE (arv_gc_get_node (genicam, node_name)); return pvalue_node; } /** * arv_gc_property_node_get_name: * @node: a #ArvGcPropertyNode * * Returns: node Name property value. * * Since: 0.6.0 */ const char * arv_gc_property_node_get_name (ArvGcPropertyNode *node) { g_return_val_if_fail (ARV_IS_GC_PROPERTY_NODE (node), NULL); return node->name; } const char * arv_gc_property_node_get_string (ArvGcPropertyNode *node, GError **error) { ArvDomNode *pvalue_node; g_return_val_if_fail (ARV_IS_GC_PROPERTY_NODE (node), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); pvalue_node = _get_pvalue_node (node); if (pvalue_node == NULL) return _get_value_data (node); if (ARV_IS_GC_STRING (pvalue_node)) { GError *local_error = NULL; const char *value; value = arv_gc_string_get_value (ARV_GC_STRING (pvalue_node), &local_error); if (local_error != NULL) g_propagate_error (error, local_error); return value; } arv_warning_genicam ("[GcPropertyNode::get_string] Invalid node '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (pvalue_node))); return NULL; } void arv_gc_property_node_set_string (ArvGcPropertyNode *node, const char *string, GError **error) { ArvDomNode *pvalue_node; g_return_if_fail (ARV_IS_GC_PROPERTY_NODE (node)); g_return_if_fail (error == NULL || *error == NULL); pvalue_node = _get_pvalue_node (node); if (pvalue_node == NULL) { _set_value_data (node, string); return; } if (ARV_IS_GC_STRING (pvalue_node)) { GError *local_error = NULL; arv_gc_string_set_value (ARV_GC_STRING (pvalue_node), string, &local_error); if (local_error != NULL) g_propagate_error (error, local_error); return; } arv_warning_genicam ("[GcPropertyNode::set_string] Invalid linked node '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (pvalue_node))); } gint64 arv_gc_property_node_get_int64 (ArvGcPropertyNode *node, GError **error) { ArvDomNode *pvalue_node; g_return_val_if_fail (ARV_IS_GC_PROPERTY_NODE (node), 0); g_return_val_if_fail (error == NULL || *error == NULL, 0); pvalue_node = _get_pvalue_node (node); if (pvalue_node == NULL) return g_ascii_strtoll (_get_value_data (node), NULL, 0); if (ARV_IS_GC_INTEGER (pvalue_node)) { GError *local_error = NULL; gint64 value; value = arv_gc_integer_get_value (ARV_GC_INTEGER (pvalue_node), &local_error); if (local_error != NULL) g_propagate_error (error, local_error); return value; } arv_warning_genicam ("[GcPropertyNode::get_int64] Invalid node '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (pvalue_node))); return 0; } void arv_gc_property_node_set_int64 (ArvGcPropertyNode *node, gint64 v_int64, GError **error) { ArvDomNode *pvalue_node; g_return_if_fail (ARV_IS_GC_PROPERTY_NODE (node)); g_return_if_fail (error == NULL || *error == NULL); pvalue_node = _get_pvalue_node (node); if (pvalue_node == NULL) { char *buffer; buffer = g_strdup_printf ("%" G_GINT64_FORMAT, v_int64); _set_value_data (node, buffer); g_free (buffer); return ; } if (ARV_IS_GC_INTEGER (pvalue_node)) { GError *local_error = NULL; arv_gc_integer_set_value (ARV_GC_INTEGER (pvalue_node), v_int64, &local_error); if (local_error != NULL) g_propagate_error (error, local_error); return; } arv_warning_genicam ("[GcPropertyNode::set_int64] Invalid linked node '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (pvalue_node))); } double arv_gc_property_node_get_double (ArvGcPropertyNode *node, GError **error) { ArvDomNode *pvalue_node; g_return_val_if_fail (ARV_IS_GC_PROPERTY_NODE (node), 0.0); g_return_val_if_fail (error == NULL || *error == NULL, 0.0); pvalue_node = _get_pvalue_node (node); if (pvalue_node == NULL) return g_ascii_strtod (_get_value_data (node), NULL); if (ARV_IS_GC_FLOAT (pvalue_node)) { GError *local_error = NULL; double value; value = arv_gc_float_get_value (ARV_GC_FLOAT (pvalue_node), &local_error); if (local_error != NULL) g_propagate_error (error, local_error); return value; } arv_warning_genicam ("[GcPropertyNode::get_double] Invalid node '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (pvalue_node))); return 0.0; } void arv_gc_property_node_set_double (ArvGcPropertyNode *node, double v_double, GError **error) { ArvDomNode *pvalue_node; g_return_if_fail (ARV_IS_GC_PROPERTY_NODE (node)); g_return_if_fail (error == NULL || *error == NULL); pvalue_node = _get_pvalue_node (node); if (pvalue_node == NULL) { char buffer[G_ASCII_DTOSTR_BUF_SIZE]; g_ascii_dtostr (buffer, G_ASCII_DTOSTR_BUF_SIZE, v_double); _set_value_data (node, buffer); return ; } if (ARV_IS_GC_FLOAT (pvalue_node)) { GError *local_error = NULL; arv_gc_float_set_value (ARV_GC_FLOAT (pvalue_node), v_double, &local_error); if (local_error != NULL) g_propagate_error (error, local_error); return; } arv_warning_genicam ("[GcPropertyNode::set_double] Invalid linked node '%s'", arv_gc_feature_node_get_name (ARV_GC_FEATURE_NODE (pvalue_node))); } ArvGcPropertyNodeType arv_gc_property_node_get_node_type (ArvGcPropertyNode *node) { g_return_val_if_fail (ARV_IS_GC_PROPERTY_NODE (node), ARV_GC_PROPERTY_NODE_TYPE_UNKNOWN); return node->type; } /** * arv_gc_property_node_get_linked_node: * @node: a #ArvGcPropertyNode * * Returns: (transfer none): the #ArvGcNode which @node points to. */ ArvGcNode * arv_gc_property_node_get_linked_node (ArvGcPropertyNode *node) { ArvGc *genicam; g_return_val_if_fail (ARV_IS_GC_PROPERTY_NODE (node), NULL); g_return_val_if_fail (node->type > ARV_GC_PROPERTY_NODE_TYPE_P_UNKNONW, NULL); genicam = arv_gc_node_get_genicam (ARV_GC_NODE (node)); return arv_gc_get_node (genicam, _get_value_data (node)); } static ArvGcNode * arv_gc_property_node_new (ArvGcPropertyNodeType type) { ArvGcPropertyNode *node; node = g_object_new (ARV_TYPE_GC_PROPERTY_NODE, NULL); node->type = type; return ARV_GC_NODE (node); } ArvGcNode * arv_gc_property_node_new_p_feature (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_P_FEATURE); } ArvGcNode * arv_gc_property_node_new_value (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_VALUE); } ArvGcNode * arv_gc_property_node_new_p_value (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_P_VALUE); } ArvGcNode * arv_gc_property_node_new_address (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_ADDRESS); } ArvGcNode * arv_gc_property_node_new_p_address (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_P_ADDRESS); } ArvGcNode * arv_gc_property_node_new_description (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_DESCRIPTION); } ArvGcNode * arv_gc_property_node_new_tooltip (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_TOOLTIP); } ArvGcNode * arv_gc_property_node_new_display_name (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_DISPLAY_NAME); } ArvGcNode * arv_gc_property_node_new_minimum (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_MINIMUM); } ArvGcNode * arv_gc_property_node_new_p_minimum (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_P_MINIMUM); } ArvGcNode * arv_gc_property_node_new_maximum (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_MAXIMUM); } ArvGcNode * arv_gc_property_node_new_p_maximum (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_P_MAXIMUM); } ArvGcNode * arv_gc_property_node_new_increment (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_INCREMENT); } ArvGcNode * arv_gc_property_node_new_p_increment (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_P_INCREMENT); } ArvGcNode * arv_gc_property_node_new_unit (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_UNIT); } ArvGcNode * arv_gc_property_node_new_on_value (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_ON_VALUE); } ArvGcNode * arv_gc_property_node_new_off_value (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_OFF_VALUE); } ArvGcNode * arv_gc_property_node_new_p_is_implemented (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_P_IS_IMPLEMENTED); } ArvGcNode * arv_gc_property_node_new_p_is_available (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_P_IS_AVAILABLE); } ArvGcNode * arv_gc_property_node_new_p_is_locked (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_P_IS_LOCKED); } ArvGcNode * arv_gc_property_node_new_length (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_LENGTH); } ArvGcNode * arv_gc_property_node_new_p_length (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_P_LENGTH); } ArvGcNode * arv_gc_property_node_new_p_port (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_P_PORT); } ArvGcNode * arv_gc_property_node_new_p_variable (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_P_VARIABLE); } ArvGcNode * arv_gc_property_node_new_formula (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_FORMULA); } ArvGcNode * arv_gc_property_node_new_formula_to (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_FORMULA_TO); } ArvGcNode * arv_gc_property_node_new_formula_from (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_FORMULA_FROM); } ArvGcNode * arv_gc_property_node_new_expression (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_EXPRESSION); } ArvGcNode * arv_gc_property_node_new_constant (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_CONSTANT); } ArvGcNode * arv_gc_property_node_new_access_mode (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_ACCESS_MODE); } ArvGcNode * arv_gc_property_node_new_cachable (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_CACHABLE); } ArvGcNode * arv_gc_property_node_new_polling_time (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_POLLING_TIME); } ArvGcNode * arv_gc_property_node_new_endianess (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_ENDIANESS); } ArvGcNode * arv_gc_property_node_new_sign (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_SIGN); } ArvGcNode * arv_gc_property_node_new_lsb (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_LSB); } ArvGcNode * arv_gc_property_node_new_msb (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_MSB); } ArvGcNode * arv_gc_property_node_new_bit (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_BIT); } ArvGcNode * arv_gc_property_node_new_command_value (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_COMMAND_VALUE); } ArvGcNode * arv_gc_property_node_new_p_command_value (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_P_COMMAND_VALUE); } ArvGcNode * arv_gc_property_node_new_chunk_id (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_CHUNK_ID); } ArvGcNode * arv_gc_property_node_new_value_default (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_VALUE_DEFAULT); } ArvGcNode * arv_gc_property_node_new_p_value_default (void) { return arv_gc_property_node_new (ARV_GC_PROPERTY_NODE_TYPE_P_VALUE_DEFAULT); } static void arv_gc_property_node_init (ArvGcPropertyNode *gc_property_node) { gc_property_node->type = 0; gc_property_node->value_data = NULL; gc_property_node->value_data_up_to_date = FALSE; } static void arv_gc_property_node_finalize (GObject *object) { ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (object); parent_class->finalize (object); g_free (property_node->value_data); g_free (property_node->name); } static void arv_gc_property_node_class_init (ArvGcPropertyNodeClass *this_class) { GObjectClass *object_class = G_OBJECT_CLASS (this_class); ArvDomNodeClass *dom_node_class = ARV_DOM_NODE_CLASS (this_class); ArvDomElementClass *dom_element_class = ARV_DOM_ELEMENT_CLASS (this_class); parent_class = g_type_class_peek_parent (this_class); object_class->finalize = arv_gc_property_node_finalize; dom_node_class->get_node_name = arv_gc_property_node_get_node_name; dom_node_class->can_append_child = _can_append_child; dom_node_class->post_new_child = _post_new_child; dom_node_class->pre_remove_child = _pre_remove_child; dom_element_class->set_attribute = arv_gc_property_node_set_attribute; dom_element_class->get_attribute = arv_gc_property_node_get_attribute; } G_DEFINE_TYPE (ArvGcPropertyNode, arv_gc_property_node, ARV_TYPE_GC_NODE) aravis-ARAVIS_0_6_0/src/arvgcpropertynode.h000066400000000000000000000162261334570641500207450ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_PROPERTY_NODE_H #define ARV_GC_PROPERTY_NODE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS typedef enum { ARV_GC_PROPERTY_NODE_TYPE_UNKNOWN = 0, ARV_GC_PROPERTY_NODE_TYPE_VALUE, ARV_GC_PROPERTY_NODE_TYPE_ADDRESS, ARV_GC_PROPERTY_NODE_TYPE_DESCRIPTION, ARV_GC_PROPERTY_NODE_TYPE_TOOLTIP, ARV_GC_PROPERTY_NODE_TYPE_DISPLAY_NAME, ARV_GC_PROPERTY_NODE_TYPE_MINIMUM, ARV_GC_PROPERTY_NODE_TYPE_MAXIMUM, ARV_GC_PROPERTY_NODE_TYPE_INCREMENT, ARV_GC_PROPERTY_NODE_TYPE_UNIT, ARV_GC_PROPERTY_NODE_TYPE_ON_VALUE, ARV_GC_PROPERTY_NODE_TYPE_OFF_VALUE, ARV_GC_PROPERTY_NODE_TYPE_LENGTH, ARV_GC_PROPERTY_NODE_TYPE_FORMULA, ARV_GC_PROPERTY_NODE_TYPE_FORMULA_TO, ARV_GC_PROPERTY_NODE_TYPE_FORMULA_FROM, ARV_GC_PROPERTY_NODE_TYPE_EXPRESSION, ARV_GC_PROPERTY_NODE_TYPE_CONSTANT, ARV_GC_PROPERTY_NODE_TYPE_ACCESS_MODE, ARV_GC_PROPERTY_NODE_TYPE_CACHABLE, ARV_GC_PROPERTY_NODE_TYPE_POLLING_TIME, ARV_GC_PROPERTY_NODE_TYPE_ENDIANESS, ARV_GC_PROPERTY_NODE_TYPE_SIGN, ARV_GC_PROPERTY_NODE_TYPE_LSB, ARV_GC_PROPERTY_NODE_TYPE_MSB, ARV_GC_PROPERTY_NODE_TYPE_BIT, ARV_GC_PROPERTY_NODE_TYPE_COMMAND_VALUE, ARV_GC_PROPERTY_NODE_TYPE_CHUNK_ID, ARV_GC_PROPERTY_NODE_TYPE_VALUE_INDEXED, ARV_GC_PROPERTY_NODE_TYPE_VALUE_DEFAULT, ARV_GC_PROPERTY_NODE_TYPE_P_UNKNONW = 1000, ARV_GC_PROPERTY_NODE_TYPE_P_FEATURE, ARV_GC_PROPERTY_NODE_TYPE_P_VALUE, ARV_GC_PROPERTY_NODE_TYPE_P_ADDRESS, ARV_GC_PROPERTY_NODE_TYPE_P_IS_IMPLEMENTED, ARV_GC_PROPERTY_NODE_TYPE_P_IS_LOCKED, ARV_GC_PROPERTY_NODE_TYPE_P_IS_AVAILABLE, ARV_GC_PROPERTY_NODE_TYPE_P_MINIMUM, ARV_GC_PROPERTY_NODE_TYPE_P_MAXIMUM, ARV_GC_PROPERTY_NODE_TYPE_P_INCREMENT, ARV_GC_PROPERTY_NODE_TYPE_P_INDEX, ARV_GC_PROPERTY_NODE_TYPE_P_LENGTH, ARV_GC_PROPERTY_NODE_TYPE_P_PORT, ARV_GC_PROPERTY_NODE_TYPE_P_VARIABLE, ARV_GC_PROPERTY_NODE_TYPE_P_INVALIDATOR, ARV_GC_PROPERTY_NODE_TYPE_P_COMMAND_VALUE, ARV_GC_PROPERTY_NODE_TYPE_P_VALUE_INDEXED, ARV_GC_PROPERTY_NODE_TYPE_P_VALUE_DEFAULT } ArvGcPropertyNodeType; #define ARV_TYPE_GC_PROPERTY_NODE (arv_gc_property_node_get_type ()) #define ARV_GC_PROPERTY_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_PROPERTY_NODE, ArvGcPropertyNode)) #define ARV_GC_PROPERTY_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GC_PROPERTY_NODE, ArvGcPropertyNodeClass)) #define ARV_IS_GC_PROPERTY_NODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_PROPERTY_NODE)) #define ARV_IS_GC_PROPERTY_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GC_PROPERTY_NODE)) #define ARV_GC_PROPERTY_NODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GC_PROPERTY_NODE, ArvGcPropertyNodeClass)) typedef struct _ArvGcPropertyNodePrivate ArvGcPropertyNodePrivate; typedef struct _ArvGcPropertyNodeClass ArvGcPropertyNodeClass; struct _ArvGcPropertyNode { ArvGcNode base; ArvGcPropertyNodeType type; char *name; gboolean value_data_up_to_date; char *value_data; }; struct _ArvGcPropertyNodeClass { ArvGcNodeClass parent_class; }; GType arv_gc_property_node_get_type (void); ArvGcNode * arv_gc_property_node_new_p_feature (void); ArvGcNode * arv_gc_property_node_new_value (void); ArvGcNode * arv_gc_property_node_new_p_value (void); ArvGcNode * arv_gc_property_node_new_address (void); ArvGcNode * arv_gc_property_node_new_p_address (void); ArvGcNode * arv_gc_property_node_new_description (void); ArvGcNode * arv_gc_property_node_new_tooltip (void); ArvGcNode * arv_gc_property_node_new_display_name (void); ArvGcNode * arv_gc_property_node_new_minimum (void); ArvGcNode * arv_gc_property_node_new_p_minimum (void); ArvGcNode * arv_gc_property_node_new_maximum (void); ArvGcNode * arv_gc_property_node_new_p_maximum (void); ArvGcNode * arv_gc_property_node_new_increment (void); ArvGcNode * arv_gc_property_node_new_p_increment (void); ArvGcNode * arv_gc_property_node_new_unit (void); ArvGcNode * arv_gc_property_node_new_on_value (void); ArvGcNode * arv_gc_property_node_new_off_value (void); ArvGcNode * arv_gc_property_node_new_p_is_implemented (void); ArvGcNode * arv_gc_property_node_new_p_is_available (void); ArvGcNode * arv_gc_property_node_new_p_is_locked (void); ArvGcNode * arv_gc_property_node_new_length (void); ArvGcNode * arv_gc_property_node_new_p_length (void); ArvGcNode * arv_gc_property_node_new_p_port (void); ArvGcNode * arv_gc_property_node_new_p_variable (void); ArvGcNode * arv_gc_property_node_new_formula (void); ArvGcNode * arv_gc_property_node_new_formula_to (void); ArvGcNode * arv_gc_property_node_new_formula_from (void); ArvGcNode * arv_gc_property_node_new_expression (void); ArvGcNode * arv_gc_property_node_new_constant (void); ArvGcNode * arv_gc_property_node_new_access_mode (void); ArvGcNode * arv_gc_property_node_new_cachable (void); ArvGcNode * arv_gc_property_node_new_polling_time (void); ArvGcNode * arv_gc_property_node_new_endianess (void); ArvGcNode * arv_gc_property_node_new_sign (void); ArvGcNode * arv_gc_property_node_new_lsb (void); ArvGcNode * arv_gc_property_node_new_msb (void); ArvGcNode * arv_gc_property_node_new_bit (void); ArvGcNode * arv_gc_property_node_new_command_value (void); ArvGcNode * arv_gc_property_node_new_p_command_value (void); ArvGcNode * arv_gc_property_node_new_chunk_id (void); ArvGcNode * arv_gc_property_node_new_value_default (void); ArvGcNode * arv_gc_property_node_new_p_value_default (void); const char * arv_gc_property_node_get_name (ArvGcPropertyNode *node); const char * arv_gc_property_node_get_string (ArvGcPropertyNode *node, GError **error); void arv_gc_property_node_set_string (ArvGcPropertyNode *node, const char *string, GError **error); gint64 arv_gc_property_node_get_int64 (ArvGcPropertyNode *node, GError **error); void arv_gc_property_node_set_int64 (ArvGcPropertyNode *node, gint64 v_int64, GError **error); double arv_gc_property_node_get_double (ArvGcPropertyNode *node, GError **error); void arv_gc_property_node_set_double (ArvGcPropertyNode *node, double v_double, GError **error); ArvGcNode * arv_gc_property_node_get_linked_node (ArvGcPropertyNode *node); ArvGcPropertyNodeType arv_gc_property_node_get_node_type (ArvGcPropertyNode *node); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcregister.c000066400000000000000000000046721334570641500200340ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcregister * @short_description: Register interface */ #include #include static void arv_gc_register_default_init (ArvGcRegisterInterface *gc_register_iface) { } G_DEFINE_INTERFACE (ArvGcRegister, arv_gc_register, G_TYPE_OBJECT) void arv_gc_register_get (ArvGcRegister *gc_register, void *buffer, guint64 length, GError **error) { g_return_if_fail (ARV_IS_GC_REGISTER (gc_register)); g_return_if_fail (buffer != NULL); g_return_if_fail (length > 0); g_return_if_fail (error == NULL || *error == NULL); ARV_GC_REGISTER_GET_INTERFACE (gc_register)->get (gc_register, buffer, length, error); } void arv_gc_register_set (ArvGcRegister *gc_register, void *buffer, guint64 length, GError **error) { g_return_if_fail (ARV_IS_GC_REGISTER (gc_register)); g_return_if_fail (buffer != NULL); g_return_if_fail (length > 0); g_return_if_fail (error == NULL || *error == NULL); ARV_GC_REGISTER_GET_INTERFACE (gc_register)->set (gc_register, buffer, length, error); } guint64 arv_gc_register_get_address (ArvGcRegister *gc_register, GError **error) { g_return_val_if_fail (ARV_IS_GC_REGISTER (gc_register), 0); g_return_val_if_fail (error == NULL || *error == NULL, 0); return ARV_GC_REGISTER_GET_INTERFACE (gc_register)->get_address (gc_register, error); } guint64 arv_gc_register_get_length (ArvGcRegister *gc_register, GError **error) { g_return_val_if_fail (ARV_IS_GC_REGISTER (gc_register), 0); g_return_val_if_fail (error == NULL || *error == NULL, 0); return ARV_GC_REGISTER_GET_INTERFACE (gc_register)->get_length (gc_register, error); } aravis-ARAVIS_0_6_0/src/arvgcregister.h000066400000000000000000000045451334570641500200400ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_REGISTER_H #define ARV_GC_REGISTER_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS #define ARV_TYPE_GC_REGISTER (arv_gc_register_get_type ()) #define ARV_GC_REGISTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_REGISTER, ArvGcRegister)) #define ARV_IS_GC_REGISTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_REGISTER)) #define ARV_GC_REGISTER_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), ARV_TYPE_GC_REGISTER, ArvGcRegisterInterface)) typedef struct _ArvGcRegisterInterface ArvGcRegisterInterface; struct _ArvGcRegisterInterface { GTypeInterface parent; void (*get) (ArvGcRegister *gc_register, void *buffer, guint64 length, GError **error); void (*set) (ArvGcRegister *gc_register, void *buffer, guint64 length, GError **error); guint64 (*get_address) (ArvGcRegister *gc_register, GError **error); guint64 (*get_length) (ArvGcRegister *gc_register, GError **error); }; GType arv_gc_register_get_type (void); void arv_gc_register_get (ArvGcRegister *gc_register, void *buffer, guint64 length, GError **error); void arv_gc_register_set (ArvGcRegister *gc_register, void *buffer, guint64 length, GError **error); guint64 arv_gc_register_get_address (ArvGcRegister *gc_register, GError **error); guint64 arv_gc_register_get_length (ArvGcRegister *gc_register, GError **error); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcregisterdescriptionnode.c000066400000000000000000000132441334570641500231410ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcregisterdescriptionnode * @short_description: Class for RegisterDescription nodes */ #include #include static GObjectClass *parent_class = NULL; /* ArvDomNode implementation */ static const char * arv_gc_register_description_node_get_node_name (ArvDomNode *node) { return "RegisterDescription"; } static void arv_gc_register_description_node_set_attribute (ArvDomElement *self, const char* name, const char *value) { ArvGcRegisterDescriptionNode *node = ARV_GC_REGISTER_DESCRIPTION_NODE (self); if (strcmp (name, "ModelName") == 0) { g_free (node->model_name); node->model_name = g_strdup (value); } else if (strcmp (name, "VendorName") == 0) { g_free (node->vendor_name); node->vendor_name = g_strdup (value); } else if (strcmp (name, "SchemaMajorVersion") == 0) { node->schema_major_version = g_ascii_strtoll (value, NULL, 0); } else if (strcmp (name, "SchemaMinorVersion") == 0) { node->schema_minor_version = g_ascii_strtoll (value, NULL, 0); } else if (strcmp (name, "SchemaSubMinorVersion") == 0) { node->schema_subminor_version = g_ascii_strtoll (value, NULL, 0); } else if (strcmp (name, "MajorVersion") == 0) { node->major_version = g_ascii_strtoll (value, NULL, 0); } else if (strcmp (name, "MinorVersion") == 0) { node->minor_version = g_ascii_strtoll (value, NULL, 0); } else if (strcmp (name, "SubMinorVersion") == 0) { node->subminor_version = g_ascii_strtoll (value, NULL, 0); } else ARV_DOM_ELEMENT_CLASS (parent_class)->set_attribute (self, name, value); } static const char * arv_gc_register_description_node_get_attribute (ArvDomElement *self, const char *name) { ArvGcRegisterDescriptionNode *node = ARV_GC_REGISTER_DESCRIPTION_NODE (self); if (strcmp (name, "ModelName") == 0) return node->model_name; else if (strcmp (name, "VendorName") == 0) return node->vendor_name; else return ARV_DOM_ELEMENT_CLASS (parent_class)->get_attribute (self, name); } /* ArvGcRegisterDescriptionNode implementation */ /** * arv_gc_register_description_node_compare_schema_version: * @node: a #ArvGcRegisterDescriptionNode * @major: major version number * @minor: minor version number * @subminor: sub mminor version number * * Compare the Genicam document version to the given version. * * Returns: -1 if document version is lower than the given version, 0 if equal and 1 if greater. * * Since: 0.6.0 */ int arv_gc_register_description_node_compare_schema_version (ArvGcRegisterDescriptionNode *node, guint major, guint minor, guint subminor) { g_return_val_if_fail (ARV_IS_GC_REGISTER_DESCRIPTION_NODE (node), FALSE); if (node->schema_major_version < major) return -1; if (node->schema_major_version > major) return 1; if (node->schema_minor_version < minor) return -1; if (node->schema_minor_version > minor) return 1; if (node->schema_subminor_version < subminor) return -1; if (node->schema_subminor_version > subminor) return 1; return 0; } gboolean arv_gc_register_description_node_check_schema_version (ArvGcRegisterDescriptionNode *node, guint required_major, guint required_minor, guint required_subminor) { return arv_gc_register_description_node_compare_schema_version (node, required_major, required_minor, required_subminor) >= 0; } ArvGcNode * arv_gc_register_description_node_new (void) { ArvGcNode *node; node = g_object_new (ARV_TYPE_GC_REGISTER_DESCRIPTION_NODE, NULL); return node; } static void arv_gc_register_description_node_init (ArvGcRegisterDescriptionNode *gc_register_description_node) { gc_register_description_node->schema_major_version = 0; gc_register_description_node->schema_minor_version = 0; gc_register_description_node->schema_subminor_version = 0; } static void arv_gc_register_description_node_finalize (GObject *object) { ArvGcRegisterDescriptionNode *node = ARV_GC_REGISTER_DESCRIPTION_NODE (object); g_free (node->model_name); g_free (node->vendor_name); parent_class->finalize (object); } static void arv_gc_register_description_node_class_init (ArvGcRegisterDescriptionNodeClass *this_class) { GObjectClass *object_class = G_OBJECT_CLASS (this_class); ArvDomNodeClass *dom_node_class = ARV_DOM_NODE_CLASS (this_class); ArvDomElementClass *dom_element_class = ARV_DOM_ELEMENT_CLASS (this_class); parent_class = g_type_class_peek_parent (this_class); object_class->finalize = arv_gc_register_description_node_finalize; dom_node_class->get_node_name = arv_gc_register_description_node_get_node_name; dom_element_class->set_attribute = arv_gc_register_description_node_set_attribute; dom_element_class->get_attribute = arv_gc_register_description_node_get_attribute; } /* ArvGcInteger interface implementation */ G_DEFINE_TYPE (ArvGcRegisterDescriptionNode, arv_gc_register_description_node, ARV_TYPE_GC_FEATURE_NODE) aravis-ARAVIS_0_6_0/src/arvgcregisterdescriptionnode.h000066400000000000000000000056371334570641500231550ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_REGISTER_DESCRIPTION_NODE_H #define ARV_GC_REGISTER_DESCRIPTION_NODE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS #define ARV_TYPE_GC_REGISTER_DESCRIPTION_NODE (arv_gc_register_description_node_get_type ()) #define ARV_GC_REGISTER_DESCRIPTION_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_REGISTER_DESCRIPTION_NODE, ArvGcRegisterDescriptionNode)) #define ARV_GC_REGISTER_DESCRIPTION_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GC_REGISTER_DESCRIPTION_NODE, ArvGcRegisterDescriptionNodeClass)) #define ARV_IS_GC_REGISTER_DESCRIPTION_NODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_REGISTER_DESCRIPTION_NODE)) #define ARV_IS_GC_REGISTER_DESCRIPTION_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GC_REGISTER_DESCRIPTION_NODE)) #define ARV_GC_REGISTER_DESCRIPTION_NODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GC_REGISTER_DESCRIPTION_NODE, ArvGcRegisterDescriptionNodeClass)) typedef struct _ArvGcRegisterDescriptionNodeClass ArvGcRegisterDescriptionNodeClass; struct _ArvGcRegisterDescriptionNode { ArvGcFeatureNode node; char *model_name; char *vendor_name; guint major_version; guint minor_version; guint subminor_version; guint schema_major_version; guint schema_minor_version; guint schema_subminor_version; }; struct _ArvGcRegisterDescriptionNodeClass { ArvGcFeatureNodeClass parent_class; }; GType arv_gc_register_description_node_get_type (void); ArvGcNode * arv_gc_register_description_node_new (void); int arv_gc_register_description_node_compare_schema_version (ArvGcRegisterDescriptionNode *node, guint major, guint minor, guint subminor); gboolean arv_gc_register_description_node_check_schema_version (ArvGcRegisterDescriptionNode *node, guint required_major, guint required_minor, guint required_subminor); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcregisternode.c000066400000000000000000000732531334570641500207030ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcregisternode * @short_description: Class for Register, IntReg, MaskedIntReg, FloatReg, StringReg and StructReg nodes */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include static GObjectClass *parent_class = NULL; /* ArvDomNode implementation */ static const char * arv_gc_register_node_get_node_name (ArvDomNode *node) { ArvGcRegisterNode *gc_register_node = ARV_GC_REGISTER_NODE (node); switch (gc_register_node->type) { case ARV_GC_REGISTER_NODE_TYPE_REGISTER: return "Register"; case ARV_GC_REGISTER_NODE_TYPE_INTEGER: return "IntReg"; case ARV_GC_REGISTER_NODE_TYPE_MASKED_INTEGER: return "MaskedIntReg"; case ARV_GC_REGISTER_NODE_TYPE_FLOAT: return "FloatReg"; case ARV_GC_REGISTER_NODE_TYPE_STRING: return "StringReg"; case ARV_GC_REGISTER_NODE_TYPE_STRUCT_REGISTER: return "StuctReg"; } return NULL; } static void arv_gc_register_node_post_new_child (ArvDomNode *self, ArvDomNode *child) { ArvGcRegisterNode *node = ARV_GC_REGISTER_NODE (self); if (ARV_IS_GC_PROPERTY_NODE (child)) { ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (child); switch (arv_gc_property_node_get_node_type (property_node)) { case ARV_GC_PROPERTY_NODE_TYPE_ADDRESS: case ARV_GC_PROPERTY_NODE_TYPE_P_ADDRESS: node->addresses = g_slist_prepend (node->addresses, child); break; case ARV_GC_PROPERTY_NODE_TYPE_P_INDEX: node->index = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_LENGTH: case ARV_GC_PROPERTY_NODE_TYPE_P_LENGTH: node->length = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_P_PORT: node->port = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_ACCESS_MODE: /* TODO */ node->access_mode = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_CACHABLE: node->cachable = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_POLLING_TIME: /* TODO */ node->polling_time = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_ENDIANESS: node->endianess = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_SIGN: node->sign = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_LSB: node->lsb = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_MSB: node->msb = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_BIT: node->msb = property_node; node->lsb = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_P_INVALIDATOR: node->invalidators = g_slist_prepend (node->invalidators, property_node); break; default: ARV_DOM_NODE_CLASS (parent_class)->post_new_child (self, child); break; } } else if (ARV_IS_GC_SWISS_KNIFE (child)) node->swiss_knives = g_slist_prepend (node->swiss_knives, child); else ARV_DOM_NODE_CLASS (parent_class)->post_new_child (self, child); } static void arv_gc_register_node_pre_remove_child (ArvDomNode *self, ArvDomNode *child) { g_assert_not_reached (); } /* ArvGcFeatureNode implementation */ static GType arv_gc_register_node_get_value_type (ArvGcFeatureNode *node) { ArvGcRegisterNode *gc_register_node = ARV_GC_REGISTER_NODE (node); return gc_register_node->value_type; } static void arv_gc_register_node_set_value_from_string (ArvGcFeatureNode *node, const char *string, GError **error) { ArvGcRegisterNode *gc_register_node = ARV_GC_REGISTER_NODE (node); switch (gc_register_node->value_type) { case G_TYPE_INT64: arv_gc_integer_set_value (ARV_GC_INTEGER (node), g_ascii_strtoll (string, NULL, 0), error); break; case G_TYPE_DOUBLE: arv_gc_float_set_value (ARV_GC_FLOAT (node), g_ascii_strtod (string, NULL), error); break; case G_TYPE_STRING: arv_gc_string_set_value (ARV_GC_STRING (node), string, error); break; default: break; } arv_warning_genicam ("[GcRegisterNode::set_value_from_string] Invalid value type"); } static const char * arv_gc_register_node_get_value_as_string (ArvGcFeatureNode *node, GError **error) { ArvGcRegisterNode *gc_register_node = ARV_GC_REGISTER_NODE (node); GError *local_error = NULL; const char *string; switch (gc_register_node->value_type) { case G_TYPE_INT64: g_snprintf (gc_register_node->v_string, G_ASCII_DTOSTR_BUF_SIZE, "0x%08" G_GINT64_MODIFIER "x", arv_gc_integer_get_value (ARV_GC_INTEGER (node), &local_error)); if (local_error != NULL) { g_propagate_error (error, local_error); return NULL; } return gc_register_node->v_string; case G_TYPE_DOUBLE: g_ascii_dtostr (gc_register_node->v_string, G_ASCII_DTOSTR_BUF_SIZE, arv_gc_float_get_value (ARV_GC_FLOAT (node), &local_error)); if (local_error != NULL) { g_propagate_error (error, local_error); return NULL; } return gc_register_node->v_string; case G_TYPE_STRING: string = arv_gc_string_get_value (ARV_GC_STRING (node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return NULL; } return string; default: break; } arv_warning_genicam ("[GcRegisterNode::get_value_as_string] Invalid value type"); return NULL; } /* ArvGcRegisterNode implementation */ gboolean _get_cache_validity (ArvGcRegisterNode *gc_register_node) { GSList *iter; gint modification_count; gint feature_modification_count; gboolean is_cache_valid = gc_register_node->is_cache_valid; for (iter = gc_register_node->invalidators; iter != NULL; iter = iter->next) { ArvGcInvalidatorNode *invalidator = iter->data; ArvGcNode *node; modification_count = arv_gc_invalidator_node_get_modification_count (invalidator); node = arv_gc_property_node_get_linked_node (ARV_GC_PROPERTY_NODE (invalidator)); feature_modification_count = arv_gc_feature_node_get_modification_count (ARV_GC_FEATURE_NODE (node)); arv_gc_invalidator_node_set_modification_count (invalidator, feature_modification_count); if (modification_count != feature_modification_count) is_cache_valid = FALSE; } return is_cache_valid; } static gint64 _get_length (ArvGcRegisterNode *gc_register_node, GError **error) { if (gc_register_node->length == NULL) return 4; return arv_gc_property_node_get_int64 (gc_register_node->length, error); } static guint64 _get_address (ArvGcRegisterNode *gc_register_node, GError **error) { ArvGc *genicam; GError *local_error = NULL; GSList *iter; guint64 value = 0; genicam = arv_gc_node_get_genicam (ARV_GC_NODE (gc_register_node)); g_return_val_if_fail (ARV_IS_GC (genicam), 0); for (iter = gc_register_node->addresses; iter != NULL; iter = iter->next) { value += arv_gc_property_node_get_int64 (iter->data, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } } for (iter = gc_register_node->swiss_knives; iter != NULL; iter = iter->next) { value += arv_gc_integer_get_value (iter->data, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } } if (gc_register_node->index != NULL) { gint64 length; length = _get_length (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } value += arv_gc_index_node_get_index (ARV_GC_INDEX_NODE (gc_register_node->index), length, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } } return value; } static void _update_cache_size (ArvGcRegisterNode *gc_register_node, GError **error) { GError *local_error = NULL; gint64 length; length = _get_length (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } if (length != gc_register_node->cache_size) { g_free (gc_register_node->cache); gc_register_node->cache = g_malloc (length); gc_register_node->cache_size = length; } } static ArvGcCachable _get_cachable (ArvGcRegisterNode *gc_register_node, GError **error) { GError *local_error = NULL; const char *cachable; if (gc_register_node->cachable == NULL) return ARV_GC_CACHABLE_NO_CACHE; cachable = arv_gc_property_node_get_string (gc_register_node->cachable, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return ARV_GC_CACHABLE_NO_CACHE; } if (g_strcmp0 (cachable, "WriteThrough") == 0) return ARV_GC_CACHABLE_WRITE_TRHOUGH; else if (strcmp (cachable, "WriteAround") == 0) return ARV_GC_CACHABLE_WRITE_AROUND; return ARV_GC_CACHABLE_NO_CACHE; } /* Set default to read only 32 bits little endian integer register */ static guint _get_endianess (ArvGcRegisterNode *gc_register_node, GError **error) { GError *local_error = NULL; const char *endianess; if (gc_register_node->endianess == NULL) return G_LITTLE_ENDIAN; endianess = arv_gc_property_node_get_string (gc_register_node->endianess, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return G_LITTLE_ENDIAN; } if (g_strcmp0 (endianess, "BigEndian") == 0) return G_BIG_ENDIAN; return G_LITTLE_ENDIAN; } static ArvGcSignedness _get_signedness (ArvGcRegisterNode *gc_register_node, GError **error) { GError *local_error = NULL; const char *sign; if (gc_register_node->sign == NULL) return gc_register_node->type == ARV_GC_REGISTER_NODE_TYPE_REGISTER ? ARV_GC_SIGNEDNESS_SIGNED : ARV_GC_SIGNEDNESS_UNSIGNED; sign = arv_gc_property_node_get_string (gc_register_node->sign, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return ARV_GC_SIGNEDNESS_SIGNED; } if (g_strcmp0 (sign, "Unsigned") == 0) return ARV_GC_SIGNEDNESS_UNSIGNED; return ARV_GC_SIGNEDNESS_SIGNED; } static gint64 _get_lsb (ArvGcRegisterNode *gc_register_node, GError **error) { if (gc_register_node->lsb == NULL) return 0; return arv_gc_property_node_get_int64 (gc_register_node->lsb, error); } static gint64 _get_msb (ArvGcRegisterNode *gc_register_node, GError **error) { if (gc_register_node->msb == NULL) return 31; return arv_gc_property_node_get_int64 (gc_register_node->msb, error); } static void _read_cache (ArvGcRegisterNode *gc_register_node, GError **error) { GError *local_error = NULL; ArvGcNode *port; gboolean cachable; gint64 address; if (gc_register_node->is_cache_valid == TRUE) { arv_log_genicam ("[GcRegisterNode::read_cache] Cache is valid"); return; } port = arv_gc_property_node_get_linked_node (gc_register_node->port); if (!ARV_IS_GC_PORT (port)) return; _update_cache_size (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } address = _get_address (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } arv_gc_port_read (ARV_GC_PORT (port), gc_register_node->cache, address, gc_register_node->cache_size, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } cachable = _get_cachable (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } if (cachable != ARV_GC_CACHABLE_NO_CACHE) gc_register_node->is_cache_valid = TRUE; else gc_register_node->is_cache_valid = FALSE; } static void _write_cache (ArvGcRegisterNode *gc_register_node, GError **error) { GError *local_error = NULL; gint64 address; gboolean cachable; ArvGcNode *port; arv_gc_feature_node_inc_modification_count (ARV_GC_FEATURE_NODE (gc_register_node)); port = arv_gc_property_node_get_linked_node (gc_register_node->port); if (!ARV_IS_GC_PORT (port)) return; _update_cache_size (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } address = _get_address (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } arv_gc_port_write (ARV_GC_PORT (port), gc_register_node->cache, address, gc_register_node->cache_size, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } cachable = _get_cachable (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } if (cachable == ARV_GC_CACHABLE_WRITE_TRHOUGH) gc_register_node->is_cache_valid = TRUE; else gc_register_node->is_cache_valid = FALSE; } ArvGcNode * arv_gc_register_node_new (void) { ArvGcRegisterNode *gc_register_node; gc_register_node = g_object_new (ARV_TYPE_GC_REGISTER_NODE, NULL); gc_register_node->type = ARV_GC_REGISTER_NODE_TYPE_REGISTER; gc_register_node->value_type = G_TYPE_BYTE_ARRAY; return ARV_GC_NODE (gc_register_node); } ArvGcNode * arv_gc_register_node_new_integer (void) { ArvGcRegisterNode *gc_register_node; gc_register_node = g_object_new (ARV_TYPE_GC_REGISTER_NODE, NULL); gc_register_node->type = ARV_GC_REGISTER_NODE_TYPE_INTEGER; gc_register_node->value_type = G_TYPE_INT64; return ARV_GC_NODE (gc_register_node); } ArvGcNode * arv_gc_register_node_new_masked_integer (void) { ArvGcRegisterNode *gc_register_node; gc_register_node = g_object_new (ARV_TYPE_GC_REGISTER_NODE, NULL); gc_register_node->type = ARV_GC_REGISTER_NODE_TYPE_MASKED_INTEGER; gc_register_node->value_type = G_TYPE_INT64; return ARV_GC_NODE (gc_register_node); } ArvGcNode * arv_gc_register_node_new_float (void) { ArvGcRegisterNode *gc_register_node; gc_register_node = g_object_new (ARV_TYPE_GC_REGISTER_NODE, NULL); gc_register_node->type = ARV_GC_REGISTER_NODE_TYPE_FLOAT; gc_register_node->value_type = G_TYPE_DOUBLE; return ARV_GC_NODE (gc_register_node); } ArvGcNode * arv_gc_register_node_new_string (void) { ArvGcRegisterNode *gc_register_node; gc_register_node = g_object_new (ARV_TYPE_GC_REGISTER_NODE, NULL); gc_register_node->type = ARV_GC_REGISTER_NODE_TYPE_STRING; gc_register_node->value_type = G_TYPE_STRING; return ARV_GC_NODE (gc_register_node); } ArvGcNode * arv_gc_register_node_new_struct_register (void) { ArvGcRegisterNode *gc_register_node; gc_register_node = g_object_new (ARV_TYPE_GC_REGISTER_NODE, NULL); gc_register_node->type = ARV_GC_REGISTER_NODE_TYPE_STRUCT_REGISTER; gc_register_node->value_type = G_TYPE_INT64; return ARV_GC_NODE (gc_register_node); } static void arv_gc_register_node_init (ArvGcRegisterNode *gc_register_node) { gc_register_node->cache = g_malloc0(4); gc_register_node->cache_size = 4; gc_register_node->is_cache_valid = FALSE; } static void arv_gc_register_node_finalize (GObject *object) { ArvGcRegisterNode *gc_register_node = ARV_GC_REGISTER_NODE (object); g_slist_free (gc_register_node->addresses); g_slist_free (gc_register_node->swiss_knives); g_free (gc_register_node->cache); g_slist_free (gc_register_node->invalidators); parent_class->finalize (object); } static void arv_gc_register_node_class_init (ArvGcRegisterNodeClass *this_class) { GObjectClass *object_class = G_OBJECT_CLASS (this_class); ArvDomNodeClass *dom_node_class = ARV_DOM_NODE_CLASS (this_class); ArvGcFeatureNodeClass *gc_feature_node_class = ARV_GC_FEATURE_NODE_CLASS (this_class); parent_class = g_type_class_peek_parent (this_class); object_class->finalize = arv_gc_register_node_finalize; dom_node_class->get_node_name = arv_gc_register_node_get_node_name; dom_node_class->post_new_child = arv_gc_register_node_post_new_child; dom_node_class->pre_remove_child = arv_gc_register_node_pre_remove_child; gc_feature_node_class->get_value_type = arv_gc_register_node_get_value_type; gc_feature_node_class->set_value_from_string = arv_gc_register_node_set_value_from_string; gc_feature_node_class->get_value_as_string = arv_gc_register_node_get_value_as_string; } /* ArvGcRegister interface implementation */ static void arv_gc_register_node_get (ArvGcRegister *gc_register, void *buffer, guint64 length, GError **error) { ArvGcRegisterNode *gc_register_node = ARV_GC_REGISTER_NODE (gc_register); GError *local_error = NULL; _read_cache (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } if (length > gc_register_node->cache_size) { memcpy (buffer, gc_register_node->cache, gc_register_node->cache_size); memset (((char *) buffer) + gc_register_node->cache_size, 0, length - gc_register_node->cache_size); } else memcpy (buffer, gc_register_node->cache, length); arv_log_genicam ("[GcRegisterNode::get] 0x%Lx,%Ld", _get_address (gc_register_node, NULL), length); } static void arv_gc_register_node_set (ArvGcRegister *gc_register, void *buffer, guint64 length, GError **error) { ArvGcRegisterNode *gc_register_node = ARV_GC_REGISTER_NODE (gc_register); GError *local_error = NULL; if (gc_register_node->cache_size > length) { memcpy (gc_register_node->cache, buffer, length); memset (((char *) gc_register_node->cache) + length, 0, gc_register_node->cache_size - length); } else memcpy (gc_register_node->cache, buffer, gc_register_node->cache_size); _write_cache (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } arv_log_genicam ("[GcRegisterNode::set] 0x%Lx,%Ld", _get_address (gc_register_node, NULL), length); } static guint64 arv_gc_register_node_get_address (ArvGcRegister *gc_register, GError **error) { ArvGcRegisterNode *gc_register_node = ARV_GC_REGISTER_NODE (gc_register); return _get_address (gc_register_node, error); } static guint64 arv_gc_register_node_get_length (ArvGcRegister *gc_register, GError **error) { ArvGcRegisterNode *gc_register_node = ARV_GC_REGISTER_NODE (gc_register); return _get_length (gc_register_node, error); } static void arv_gc_register_node_register_interface_init (ArvGcRegisterInterface *interface) { interface->get = arv_gc_register_node_get; interface->set = arv_gc_register_node_set; interface->get_address = arv_gc_register_node_get_address; interface->get_length = arv_gc_register_node_get_length; } /* ArvGcInteger interface implementation */ static gint64 _get_integer_value (ArvGcRegisterNode *gc_register_node, guint register_lsb, guint register_msb, ArvGcSignedness signedness, GError **error) { GError *local_error = NULL; gint64 value; guint lsb; guint msb; guint endianess; endianess = _get_endianess (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } _read_cache (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } arv_copy_memory_with_endianess (&value, sizeof (value), G_BYTE_ORDER, gc_register_node->cache, gc_register_node->cache_size, endianess); if (gc_register_node->type == ARV_GC_REGISTER_NODE_TYPE_MASKED_INTEGER || gc_register_node->type == ARV_GC_REGISTER_NODE_TYPE_STRUCT_REGISTER) { guint64 mask; if (endianess == G_LITTLE_ENDIAN) { msb = register_msb; lsb = register_lsb; } else { lsb = 8 * gc_register_node->cache_size - register_lsb - 1; msb = 8 * gc_register_node->cache_size - register_msb - 1; } arv_log_genicam ("[GcRegisterNode::_get_integer_value] reglsb = %d, regmsb, %d, lsb = %d, msb = %d", register_lsb, register_msb, lsb, msb); arv_log_genicam ("[GcRegisterNode::_get_integer_value] value = 0x%08Lx", value); if (msb - lsb < 63) mask = ((((guint64) 1) << (msb - lsb + 1)) - 1) << lsb; else mask = G_MAXUINT64; value = (value & mask) >> lsb; if (msb-lsb < 63 && (value & (((guint64) 1) << (msb - lsb))) != 0 && signedness == ARV_GC_SIGNEDNESS_SIGNED) { value |= G_MAXUINT64 ^ (mask >> lsb); } arv_log_genicam ("[GcRegisterNode::_get_integer_value] mask = 0x%08Lx", mask); } else { unsigned length = _get_length (gc_register_node, NULL); if (length < 8 && ((value & (((guint64) 1) << (length * 8 - 1))) != 0) && signedness == ARV_GC_SIGNEDNESS_SIGNED) value |= G_MAXUINT64 ^ ((((guint64) 1) << (length * 8)) - 1); } arv_log_genicam ("[GcRegisterNode::_get_integer_value] address = 0x%Lx, value = 0x%Lx", _get_address (gc_register_node, NULL), value); return value; } gint64 arv_gc_register_node_get_masked_integer_value (ArvGcRegisterNode *gc_register_node, guint lsb, guint msb, ArvGcSignedness signedness, GError **error) { g_return_val_if_fail (ARV_IS_GC_REGISTER_NODE (gc_register_node), 0); g_return_val_if_fail (error == NULL || *error == NULL, 0); return _get_integer_value (gc_register_node, lsb, msb, signedness, error); } static gint64 arv_gc_register_node_get_integer_value (ArvGcInteger *gc_integer, GError **error) { GError *local_error = NULL; ArvGcRegisterNode *gc_register_node = ARV_GC_REGISTER_NODE (gc_integer); ArvGcSignedness signedness; gint64 lsb, msb; lsb = _get_lsb (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } msb = _get_msb (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } signedness = _get_signedness (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } return _get_integer_value (gc_register_node, lsb, msb, signedness, error); } static void _set_integer_value (ArvGcRegisterNode *gc_register_node, guint register_lsb, guint register_msb, gint64 value, GError **error) { GError *local_error = NULL; guint lsb; guint msb; guint endianess; endianess = _get_endianess (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } if (gc_register_node->type == ARV_GC_REGISTER_NODE_TYPE_MASKED_INTEGER || gc_register_node->type == ARV_GC_REGISTER_NODE_TYPE_STRUCT_REGISTER) { gint64 current_value; guint64 mask; _read_cache (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } arv_copy_memory_with_endianess (¤t_value, sizeof (current_value), G_BYTE_ORDER, gc_register_node->cache, gc_register_node->cache_size, endianess); if (endianess == G_LITTLE_ENDIAN) { msb = register_msb; lsb = register_lsb; } else { lsb = 8 * gc_register_node->cache_size - register_lsb - 1; msb = 8 * gc_register_node->cache_size - register_msb - 1; } arv_log_genicam ("[GcRegisterNode::_set_integer_value] reglsb = %d, regmsb, %d, lsb = %d, msb = %d", register_lsb, register_msb, lsb, msb); arv_log_genicam ("[GcRegisterNode::_set_integer_value] value = 0x%08Lx", value); if (msb - lsb < 63) mask = ((((guint64) 1) << (msb - lsb + 1)) - 1) << lsb; else mask = G_MAXUINT64; value = ((value << lsb) & mask) | (current_value & ~mask); arv_log_genicam ("[GcRegisterNode::_set_integer_value] mask = 0x%08Lx", mask); } else { _update_cache_size (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } } arv_log_genicam ("[GcRegisterNode::_set_integer_value] address = 0x%Lx, value = 0x%Lx", _get_address (gc_register_node, NULL), value); arv_copy_memory_with_endianess (gc_register_node->cache, gc_register_node->cache_size, endianess, &value, sizeof (value), G_BYTE_ORDER); _write_cache (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } } void arv_gc_register_node_set_masked_integer_value (ArvGcRegisterNode *gc_register_node, guint lsb, guint msb, gint64 value, GError **error) { g_return_if_fail (ARV_IS_GC_REGISTER_NODE (gc_register_node)); g_return_if_fail (error == NULL || *error == NULL); _set_integer_value (gc_register_node, lsb, msb, value, error); } static void arv_gc_register_node_set_integer_value (ArvGcInteger *gc_integer, gint64 value, GError **error) { ArvGcRegisterNode *gc_register_node = ARV_GC_REGISTER_NODE (gc_integer); GError *local_error = NULL; gint64 lsb, msb; lsb = _get_lsb (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } msb = _get_msb (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } _set_integer_value (gc_register_node, lsb, msb, value, error); } static void arv_gc_register_node_integer_interface_init (ArvGcIntegerInterface *interface) { interface->get_value = arv_gc_register_node_get_integer_value; interface->set_value = arv_gc_register_node_set_integer_value; } static double arv_gc_register_node_get_float_value (ArvGcFloat *gc_float, GError **error) { ArvGcRegisterNode *gc_register_node = ARV_GC_REGISTER_NODE (gc_float); GError *local_error = NULL; guint endianess; endianess = _get_endianess (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0.0; } _read_cache (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0.0; } if (gc_register_node->cache_size == 4) { float v_float; arv_copy_memory_with_endianess (&v_float, sizeof (v_float), G_BYTE_ORDER, gc_register_node->cache, gc_register_node->cache_size, endianess); return v_float; } else if (gc_register_node->cache_size == 8) { double v_double; arv_copy_memory_with_endianess (&v_double, sizeof (v_double), G_BYTE_ORDER, gc_register_node->cache, gc_register_node->cache_size, endianess); return v_double; } else { arv_warning_genicam ("[GcFloatReg::get_value] Invalid register size"); return 0.0; } } static void arv_gc_register_node_set_float_value (ArvGcFloat *gc_float, double v_double, GError **error) { ArvGcRegisterNode *gc_register_node = ARV_GC_REGISTER_NODE (gc_float); GError *local_error = NULL; guint endianess; endianess = _get_endianess (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } _update_cache_size (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } if (gc_register_node->cache_size == 4) { float v_float = v_double; arv_copy_memory_with_endianess (gc_register_node->cache, gc_register_node->cache_size, endianess, &v_float, sizeof (v_float), G_BYTE_ORDER); } else if (gc_register_node->cache_size == 8) { arv_copy_memory_with_endianess (gc_register_node->cache, gc_register_node->cache_size, endianess, &v_double, sizeof (v_double), G_BYTE_ORDER); } else { arv_warning_genicam ("[GcFloatReg::set_value] Invalid register size"); return; } _write_cache (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } } static void arv_gc_register_node_float_interface_init (ArvGcFloatInterface *interface) { interface->get_value = arv_gc_register_node_get_float_value; interface->set_value = arv_gc_register_node_set_float_value; } static const char * arv_gc_register_node_get_string_value (ArvGcString *gc_string, GError **error) { ArvGcRegisterNode *gc_register_node = ARV_GC_REGISTER_NODE (gc_string); GError *local_error = NULL; _read_cache (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return NULL; } if (gc_register_node->cache_size > 0) ((char *) gc_register_node->cache)[gc_register_node->cache_size - 1] = '\0'; return gc_register_node->cache; } static void arv_gc_register_node_set_string_value (ArvGcString *gc_string, const char *value, GError **error) { ArvGcRegisterNode *gc_register_node = ARV_GC_REGISTER_NODE (gc_string); GError *local_error = NULL; _update_cache_size (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } if (gc_register_node->cache_size > 0) { strncpy (gc_register_node->cache, value, gc_register_node->cache_size); ((char *) gc_register_node->cache)[gc_register_node->cache_size - 1] = '\0'; _write_cache (gc_register_node, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } } } static gint64 arv_gc_register_node_get_max_string_length (ArvGcString *gc_string, GError **error) { ArvGcRegisterNode *gc_register_node = ARV_GC_REGISTER_NODE (gc_string); return _get_length (gc_register_node, error); } static void arv_gc_register_node_string_interface_init (ArvGcStringInterface *interface) { interface->get_value = arv_gc_register_node_get_string_value; interface->set_value = arv_gc_register_node_set_string_value; interface->get_max_length = arv_gc_register_node_get_max_string_length; } G_DEFINE_TYPE_WITH_CODE (ArvGcRegisterNode, arv_gc_register_node, ARV_TYPE_GC_FEATURE_NODE, G_IMPLEMENT_INTERFACE (ARV_TYPE_GC_REGISTER, arv_gc_register_node_register_interface_init) G_IMPLEMENT_INTERFACE (ARV_TYPE_GC_INTEGER, arv_gc_register_node_integer_interface_init) G_IMPLEMENT_INTERFACE (ARV_TYPE_GC_FLOAT, arv_gc_register_node_float_interface_init) G_IMPLEMENT_INTERFACE (ARV_TYPE_GC_STRING, arv_gc_register_node_string_interface_init)) aravis-ARAVIS_0_6_0/src/arvgcregisternode.h000066400000000000000000000101161334570641500206750ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_REGISTER_NODE_H #define ARV_GC_REGISTER_NODE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS /** * ArvGcSign: * @ARV_GC_SIGN_SIGNED: signed integer * @ARV_GC_SIGN_UNSIGNED: unsigned integer */ typedef enum { ARV_GC_SIGN_SIGNED, ARV_GC_SIGN_UNSIGNED } ArvGcSign; /** * ArvGcRegisterNodeType: * @ARV_GC_REGISTER_NODE_TYPE_REGISTER: Register node * @ARV_GC_REGISTER_NODE_TYPE_INTEGER: IntReg node * @ARV_GC_REGISTER_NODE_TYPE_MASKED_INTEGER: MaskedIntReg node * @ARV_GC_REGISTER_NODE_TYPE_FLOAT: FloatReg node * @ARV_GC_REGISTER_NODE_TYPE_STRING: StringReg node * @ARV_GC_REGISTER_NODE_TYPE_STRUCT_REGISTER: StructReg node */ typedef enum { ARV_GC_REGISTER_NODE_TYPE_REGISTER, ARV_GC_REGISTER_NODE_TYPE_INTEGER, ARV_GC_REGISTER_NODE_TYPE_MASKED_INTEGER, ARV_GC_REGISTER_NODE_TYPE_FLOAT, ARV_GC_REGISTER_NODE_TYPE_STRING, ARV_GC_REGISTER_NODE_TYPE_STRUCT_REGISTER } ArvGcRegisterNodeType; #define ARV_TYPE_GC_REGISTER_NODE (arv_gc_register_node_get_type ()) #define ARV_GC_REGISTER_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_REGISTER_NODE, ArvGcRegisterNode)) #define ARV_GC_REGISTER_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GC_REGISTER_NODE, ArvGcRegisterNodeClass)) #define ARV_IS_GC_REGISTER_NODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_REGISTER_NODE)) #define ARV_IS_GC_REGISTER_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GC_REGISTER_NODE)) #define ARV_GC_REGISTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GC_REGISTER_NODE, ArvGcRegisterNodeClass)) typedef struct _ArvGcRegisterNodeClass ArvGcRegisterNodeClass; struct _ArvGcRegisterNode { ArvGcFeatureNode node; ArvGcRegisterNodeType type; GType value_type; GSList *addresses; GSList *swiss_knives; ArvGcPropertyNode *index; ArvGcPropertyNode *length; ArvGcPropertyNode *port; ArvGcPropertyNode *access_mode; ArvGcPropertyNode *cachable; ArvGcPropertyNode *polling_time; ArvGcPropertyNode *endianess; ArvGcPropertyNode *sign; ArvGcPropertyNode *lsb; ArvGcPropertyNode *msb; GSList *invalidators; /* ArvGcPropertyNode list */ void *cache; size_t cache_size; gboolean is_cache_valid; char v_string[G_ASCII_DTOSTR_BUF_SIZE]; }; struct _ArvGcRegisterNodeClass { ArvGcFeatureNodeClass parent_class; }; GType arv_gc_register_node_get_type (void); ArvGcNode * arv_gc_register_node_new (void); ArvGcNode * arv_gc_register_node_new_integer (void); ArvGcNode * arv_gc_register_node_new_masked_integer (void); ArvGcNode * arv_gc_register_node_new_float (void); ArvGcNode * arv_gc_register_node_new_string (void); ArvGcNode * arv_gc_register_node_new_struct_register (void); gint64 arv_gc_register_node_get_masked_integer_value (ArvGcRegisterNode *gc_register_node, guint lsb, guint msb, ArvGcSignedness signedness, GError **error); void arv_gc_register_node_set_masked_integer_value (ArvGcRegisterNode *gc_register_node, guint lsb, guint msb, gint64 value, GError **error); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcstring.c000066400000000000000000000041361334570641500175110ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcstring * @short_description: String interface */ #include #include static void arv_gc_string_default_init (ArvGcStringInterface *gc_string_iface) { } G_DEFINE_INTERFACE (ArvGcString, arv_gc_string, G_TYPE_OBJECT) const char * arv_gc_string_get_value (ArvGcString *gc_string, GError **error) { g_return_val_if_fail (ARV_IS_GC_STRING (gc_string), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); return ARV_GC_STRING_GET_INTERFACE (gc_string)->get_value (gc_string, error); } void arv_gc_string_set_value (ArvGcString *gc_string, const char *value, GError **error) { g_return_if_fail (ARV_IS_GC_STRING (gc_string)); g_return_if_fail (error == NULL || *error == NULL); ARV_GC_STRING_GET_INTERFACE (gc_string)->set_value (gc_string, value, error); } gint64 arv_gc_string_get_max_length (ArvGcString *gc_string, GError **error) { ArvGcStringInterface *string_interface; g_return_val_if_fail (ARV_IS_GC_STRING (gc_string), 0); g_return_val_if_fail (error == NULL || *error == NULL, 0); string_interface = ARV_GC_STRING_GET_INTERFACE (gc_string); if (string_interface->get_max_length != NULL) return string_interface->get_max_length (gc_string, error); else return 0; } aravis-ARAVIS_0_6_0/src/arvgcstring.h000066400000000000000000000041341334570641500175140ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_STRING_H #define ARV_GC_STRING_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS #define ARV_TYPE_GC_STRING (arv_gc_string_get_type ()) #define ARV_GC_STRING(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_STRING, ArvGcString)) #define ARV_IS_GC_STRING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_STRING)) #define ARV_GC_STRING_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), ARV_TYPE_GC_STRING, ArvGcStringInterface)) typedef struct _ArvGcStringInterface ArvGcStringInterface; struct _ArvGcStringInterface { GTypeInterface parent; const char * (*get_value) (ArvGcString *gc_string, GError **error); void (*set_value) (ArvGcString *gc_string, const char *value, GError **error); gint64 (*get_max_length) (ArvGcString *gc_string, GError **error); }; GType arv_gc_string_get_type (void); const char * arv_gc_string_get_value (ArvGcString *gc_string, GError **error); void arv_gc_string_set_value (ArvGcString *gc_string, const char *value, GError **error); gint64 arv_gc_string_get_max_length (ArvGcString *gc_string, GError **error); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcstructentrynode.c000066400000000000000000000240621334570641500214570ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcstructentrynode * @short_description: Class for StructEntry nodes */ #include #include #include #include #include #include #include #include #include #include static GObjectClass *parent_class = NULL; /* ArvDomNode implementation */ static const char * arv_gc_struct_entry_node_get_node_name (ArvDomNode *node) { return "StructEntry"; } static void arv_gc_struct_entry_node_post_new_child (ArvDomNode *self, ArvDomNode *child) { ArvGcStructEntryNode *node = ARV_GC_STRUCT_ENTRY_NODE (self); if (ARV_IS_GC_PROPERTY_NODE (child)) { ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (child); switch (arv_gc_property_node_get_node_type (property_node)) { case ARV_GC_PROPERTY_NODE_TYPE_SIGN: node->sign = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_LSB: node->lsb = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_MSB: node->msb = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_BIT: node->msb = property_node; node->lsb = property_node; break; default: ARV_DOM_NODE_CLASS (parent_class)->post_new_child (self, child); break; } } } static void arv_gc_struct_entry_node_pre_remove_child (ArvDomNode *self, ArvDomNode *child) { g_assert_not_reached (); } /* ArvGcFeatureNode implementation */ static GType arv_gc_struct_entry_node_get_value_type (ArvGcFeatureNode *node) { return G_TYPE_INT64; } static void arv_gc_struct_entry_node_set_value_from_string (ArvGcFeatureNode *node, const char *string, GError **error) { arv_gc_integer_set_value (ARV_GC_INTEGER (node), g_ascii_strtoll (string, NULL, 0), error); } static const char * arv_gc_struct_entry_node_get_value_as_string (ArvGcFeatureNode *node, GError **error) { ArvGcStructEntryNode *gc_struct_entry_node = ARV_GC_STRUCT_ENTRY_NODE (node); GError *local_error = NULL; gint64 value; value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return NULL; } g_snprintf (gc_struct_entry_node->v_string, G_ASCII_DTOSTR_BUF_SIZE, "0x%08" G_GINT64_MODIFIER "x", value); return gc_struct_entry_node->v_string; } /* ArvGcStructEntryNode implementation */ /* Set default to read only 32 bits little endian integer struct_entry_node */ static gint64 _get_lsb (ArvGcStructEntryNode *gc_struct_entry_node, GError **error) { if (gc_struct_entry_node->lsb == NULL) return 0; return arv_gc_property_node_get_int64 (gc_struct_entry_node->lsb, error); } static gint64 _get_msb (ArvGcStructEntryNode *gc_struct_entry_node, GError **error) { if (gc_struct_entry_node->msb == NULL) return 31; return arv_gc_property_node_get_int64 (gc_struct_entry_node->msb, error); } static ArvGcSignedness _get_signedness (ArvGcStructEntryNode *gc_struct_entry_node, GError **error) { const char *signedness; if (gc_struct_entry_node->sign == NULL) return ARV_GC_SIGNEDNESS_UNSIGNED; signedness = arv_gc_property_node_get_string (gc_struct_entry_node->sign, error); if (g_strcmp0 (signedness, "Unsigned") == 0) return ARV_GC_SIGNEDNESS_UNSIGNED; return ARV_GC_SIGNEDNESS_SIGNED; } /** * arv_gc_struct_entry_node_new: * * Returns: (transfer full): a newly created #ArvGcStructEntryNode. */ ArvGcNode * arv_gc_struct_entry_node_new (void) { ArvGcStructEntryNode *gc_struct_entry_node; gc_struct_entry_node = g_object_new (ARV_TYPE_GC_STRUCT_ENTRY_NODE, NULL); return ARV_GC_NODE (gc_struct_entry_node); } static void arv_gc_struct_entry_node_init (ArvGcStructEntryNode *gc_struct_entry_node) { } static void arv_gc_struct_entry_node_finalize (GObject *object) { parent_class->finalize (object); } static void arv_gc_struct_entry_node_class_init (ArvGcStructEntryNodeClass *this_class) { GObjectClass *object_class = G_OBJECT_CLASS (this_class); ArvDomNodeClass *dom_node_class = ARV_DOM_NODE_CLASS (this_class); ArvGcFeatureNodeClass *gc_feature_node_class = ARV_GC_FEATURE_NODE_CLASS (this_class); parent_class = g_type_class_peek_parent (this_class); object_class->finalize = arv_gc_struct_entry_node_finalize; dom_node_class->get_node_name = arv_gc_struct_entry_node_get_node_name; dom_node_class->post_new_child = arv_gc_struct_entry_node_post_new_child; dom_node_class->pre_remove_child = arv_gc_struct_entry_node_pre_remove_child; gc_feature_node_class->get_value_type = arv_gc_struct_entry_node_get_value_type; gc_feature_node_class->set_value_from_string = arv_gc_struct_entry_node_set_value_from_string; gc_feature_node_class->get_value_as_string = arv_gc_struct_entry_node_get_value_as_string; } /* ArvGcRegister interface implementation */ static void arv_gc_struct_entry_node_get (ArvGcRegister *gc_register, void *buffer, guint64 length, GError **error) { ArvDomNode *struct_register = arv_dom_node_get_parent_node (ARV_DOM_NODE (gc_register)); g_return_if_fail (ARV_IS_GC_REGISTER (struct_register)); arv_gc_register_get (ARV_GC_REGISTER (struct_register), buffer, length, error); } static void arv_gc_struct_entry_node_set (ArvGcRegister *gc_register, void *buffer, guint64 length, GError **error) { ArvDomNode *struct_register = arv_dom_node_get_parent_node (ARV_DOM_NODE (gc_register)); g_return_if_fail (ARV_IS_GC_REGISTER (struct_register)); return arv_gc_register_set (ARV_GC_REGISTER (struct_register), buffer, length, error); } static guint64 arv_gc_struct_entry_node_get_address (ArvGcRegister *gc_register, GError **error) { ArvDomNode *struct_register = arv_dom_node_get_parent_node (ARV_DOM_NODE (gc_register)); GError *local_error = NULL; gint64 address; g_return_val_if_fail (ARV_IS_GC_REGISTER (struct_register), 0); address = arv_gc_register_get_address (ARV_GC_REGISTER (struct_register), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } return address; } static guint64 arv_gc_struct_entry_node_get_length (ArvGcRegister *gc_register, GError **error) { ArvDomNode *struct_register = arv_dom_node_get_parent_node (ARV_DOM_NODE (gc_register)); GError *local_error = NULL; gint64 length; g_return_val_if_fail (ARV_IS_GC_REGISTER (struct_register), 0); length = arv_gc_register_get_length (ARV_GC_REGISTER (struct_register), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } return length; } static void arv_gc_struct_entry_node_register_interface_init (ArvGcRegisterInterface *interface) { interface->get = arv_gc_struct_entry_node_get; interface->set = arv_gc_struct_entry_node_set; interface->get_address = arv_gc_struct_entry_node_get_address; interface->get_length = arv_gc_struct_entry_node_get_length; } /* ArvGcInteger interface implementation */ static gint64 arv_gc_struct_entry_node_get_integer_value (ArvGcInteger *gc_integer, GError **error) { ArvGcStructEntryNode *struct_entry = ARV_GC_STRUCT_ENTRY_NODE (gc_integer); ArvDomNode *struct_register; ArvGcSignedness signedness; GError *local_error = NULL; gint64 value; guint lsb; guint msb; struct_register = arv_dom_node_get_parent_node (ARV_DOM_NODE (gc_integer)); if (!ARV_IS_GC_REGISTER_NODE (struct_register)) return 0; lsb = _get_lsb (struct_entry, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } msb = _get_msb (struct_entry, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } signedness = _get_signedness (struct_entry, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } value = arv_gc_register_node_get_masked_integer_value (ARV_GC_REGISTER_NODE (struct_register), lsb, msb, signedness, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } return value; } static void arv_gc_struct_entry_node_set_integer_value (ArvGcInteger *gc_integer, gint64 value, GError **error) { ArvGcStructEntryNode *struct_entry = ARV_GC_STRUCT_ENTRY_NODE (gc_integer); ArvDomNode *struct_register; GError *local_error = NULL; guint lsb; guint msb; struct_register = arv_dom_node_get_parent_node (ARV_DOM_NODE (gc_integer)); if (!ARV_IS_GC_REGISTER_NODE (struct_register)) return; lsb = _get_lsb (struct_entry, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } msb = _get_msb (struct_entry, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } arv_gc_register_node_set_masked_integer_value (ARV_GC_REGISTER_NODE (struct_register), lsb, msb, value, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } } static void arv_gc_struct_entry_node_integer_interface_init (ArvGcIntegerInterface *interface) { interface->get_value = arv_gc_struct_entry_node_get_integer_value; interface->set_value = arv_gc_struct_entry_node_set_integer_value; } G_DEFINE_TYPE_WITH_CODE (ArvGcStructEntryNode, arv_gc_struct_entry_node, ARV_TYPE_GC_FEATURE_NODE, G_IMPLEMENT_INTERFACE (ARV_TYPE_GC_REGISTER, arv_gc_struct_entry_node_register_interface_init) G_IMPLEMENT_INTERFACE (ARV_TYPE_GC_INTEGER, arv_gc_struct_entry_node_integer_interface_init)) aravis-ARAVIS_0_6_0/src/arvgcstructentrynode.h000066400000000000000000000045031334570641500214620ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_STRUCT_ENTRY_NODE_H #define ARV_GC_STRUCT_ENTRY_NODE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS #define ARV_TYPE_GC_STRUCT_ENTRY_NODE (arv_gc_struct_entry_node_get_type ()) #define ARV_GC_STRUCT_ENTRY_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_STRUCT_ENTRY_NODE, ArvGcStructEntryNode)) #define ARV_GC_STRUCT_ENTRY_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GC_STRUCT_ENTRY_NODE, ArvGcStructEntryNodeClass)) #define ARV_IS_GC_STRUCT_ENTRY_NODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_STRUCT_ENTRY_NODE)) #define ARV_IS_GC_STRUCT_ENTRY_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GC_STRUCT_ENTRY_NODE)) #define ARV_GC_STRUCT_ENTRY_NODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GC_STRUCT_ENTRY_NODE, ArvGcStructEntryNodeClass)) typedef struct _ArvGcStructEntryNodeClass ArvGcStructEntryNodeClass; struct _ArvGcStructEntryNode { ArvGcFeatureNode node; ArvGcPropertyNode *sign; ArvGcPropertyNode *lsb; ArvGcPropertyNode *msb; char v_string[G_ASCII_DTOSTR_BUF_SIZE]; }; struct _ArvGcStructEntryNodeClass { ArvGcFeatureNodeClass parent_class; }; GType arv_gc_struct_entry_node_get_type (void); ArvGcNode * arv_gc_struct_entry_node_new (void); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcswissknife.c000066400000000000000000000205531334570641500203710ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcswissknife * @short_description: Class for SwissKnife and IntSwissKnife nodes */ #include #include #include #include #include #include #include #include static GObjectClass *parent_class = NULL; /* ArvDomNode implementation */ static const char * arv_gc_swiss_knife_get_node_name (ArvDomNode *node) { ArvGcSwissKnife *gc_swiss_knife = ARV_GC_SWISS_KNIFE (node); if (gc_swiss_knife->value_type == G_TYPE_DOUBLE) return "SwissKnife"; return "IntSwissKnife"; } static void arv_gc_swiss_knife_post_new_child (ArvDomNode *self, ArvDomNode *child) { ArvGcSwissKnife *node = ARV_GC_SWISS_KNIFE (self); if (ARV_IS_GC_PROPERTY_NODE (child)) { ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (child); switch (arv_gc_property_node_get_node_type (property_node)) { case ARV_GC_PROPERTY_NODE_TYPE_P_VARIABLE: node->variables = g_slist_prepend (node->variables, property_node); break; case ARV_GC_PROPERTY_NODE_TYPE_FORMULA: node->formula_node = property_node; break; case ARV_GC_PROPERTY_NODE_TYPE_EXPRESSION: node->expressions = g_slist_prepend (node->expressions, property_node); break; case ARV_GC_PROPERTY_NODE_TYPE_CONSTANT: node->constants = g_slist_prepend (node->constants, property_node); break; default: ARV_DOM_NODE_CLASS (parent_class)->post_new_child (self, child); break; } } } static void arv_gc_swiss_knife_pre_remove_child (ArvDomNode *self, ArvDomNode *child) { g_assert_not_reached (); } /* ArvGcFeatureNode implementation */ static GType arv_gc_swiss_knife_node_get_value_type (ArvGcFeatureNode *node) { ArvGcSwissKnife *gc_swiss_knife = ARV_GC_SWISS_KNIFE (node); return gc_swiss_knife->value_type; } /* ArvGcSwissKnife implementation */ ArvGcNode * arv_gc_swiss_knife_new (void) { ArvGcSwissKnife *swiss_knife; swiss_knife = g_object_new (ARV_TYPE_GC_SWISS_KNIFE, NULL); swiss_knife->value_type = G_TYPE_DOUBLE; return ARV_GC_NODE (swiss_knife); } ArvGcNode * arv_gc_swiss_knife_new_integer (void) { ArvGcSwissKnife *swiss_knife; swiss_knife = g_object_new (ARV_TYPE_GC_SWISS_KNIFE, NULL); swiss_knife->value_type = G_TYPE_INT64; return ARV_GC_NODE (swiss_knife); } static void arv_gc_swiss_knife_init (ArvGcSwissKnife *gc_swiss_knife) { gc_swiss_knife->formula = arv_evaluator_new (NULL); } static void arv_gc_swiss_knife_finalize (GObject *object) { ArvGcSwissKnife *gc_swiss_knife = ARV_GC_SWISS_KNIFE (object); g_slist_free (gc_swiss_knife->variables); g_slist_free (gc_swiss_knife->expressions); g_slist_free (gc_swiss_knife->constants); g_clear_object (&gc_swiss_knife->formula); parent_class->finalize (object); } static void arv_gc_swiss_knife_class_init (ArvGcSwissKnifeClass *this_class) { GObjectClass *object_class = G_OBJECT_CLASS (this_class); ArvDomNodeClass *dom_node_class = ARV_DOM_NODE_CLASS (this_class); ArvGcFeatureNodeClass *gc_feature_node_class = ARV_GC_FEATURE_NODE_CLASS (this_class); parent_class = g_type_class_peek_parent (this_class); object_class->finalize = arv_gc_swiss_knife_finalize; dom_node_class->get_node_name = arv_gc_swiss_knife_get_node_name; dom_node_class->post_new_child = arv_gc_swiss_knife_post_new_child; dom_node_class->pre_remove_child = arv_gc_swiss_knife_pre_remove_child; gc_feature_node_class->get_value_type = arv_gc_swiss_knife_node_get_value_type; } /* ArvGcInteger interface implementation */ static void _update_variables (ArvGcSwissKnife *gc_swiss_knife, GError **error) { ArvGcNode *node; GError *local_error = NULL; GSList *iter; const char *expression; if (gc_swiss_knife->formula_node != NULL) expression = arv_gc_property_node_get_string (gc_swiss_knife->formula_node, &local_error); else expression = ""; if (local_error != NULL) { g_propagate_error (error, local_error); return; } arv_evaluator_set_expression (gc_swiss_knife->formula, expression); for (iter = gc_swiss_knife->expressions; iter != NULL; iter = iter->next) { const char *expression; const char *name; expression = arv_gc_property_node_get_string (ARV_GC_PROPERTY_NODE (iter->data), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } name = arv_gc_property_node_get_name (iter->data); arv_evaluator_set_sub_expression (gc_swiss_knife->formula, name, expression); } for (iter = gc_swiss_knife->constants; iter != NULL; iter = iter->next) { const char *constant; const char *name; constant = arv_gc_property_node_get_string (ARV_GC_PROPERTY_NODE (iter->data), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } name = arv_gc_property_node_get_name (iter->data); arv_evaluator_set_constant (gc_swiss_knife->formula, name, constant); } for (iter = gc_swiss_knife->variables; iter != NULL; iter = iter->next) { ArvGcPropertyNode *variable_node = iter->data; node = arv_gc_property_node_get_linked_node (ARV_GC_PROPERTY_NODE (variable_node)); if (arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (node)) == G_TYPE_INT64) { gint64 value; value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } arv_evaluator_set_int64_variable (gc_swiss_knife->formula, arv_gc_property_node_get_name (variable_node), value); } else if (arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (node)) == G_TYPE_DOUBLE) { double value; value = arv_gc_float_get_value (ARV_GC_FLOAT (node), &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return; } arv_evaluator_set_double_variable (gc_swiss_knife->formula, arv_gc_property_node_get_name (variable_node), value); } } } static gint64 arv_gc_swiss_knife_get_integer_value (ArvGcInteger *gc_integer, GError **error) { ArvGcSwissKnife *gc_swiss_knife = ARV_GC_SWISS_KNIFE (gc_integer); GError *local_error = NULL; _update_variables (gc_swiss_knife, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } return arv_evaluator_evaluate_as_int64 (gc_swiss_knife->formula, NULL); } static void arv_gc_swiss_knife_set_integer_value (ArvGcInteger *gc_integer, gint64 value, GError **error) { } static void arv_gc_swiss_knife_integer_interface_init (ArvGcIntegerInterface *interface) { interface->get_value = arv_gc_swiss_knife_get_integer_value; interface->set_value = arv_gc_swiss_knife_set_integer_value; } static double arv_gc_swiss_knife_get_float_value (ArvGcFloat *gc_float, GError **error) { ArvGcSwissKnife *gc_swiss_knife = ARV_GC_SWISS_KNIFE (gc_float); GError *local_error = NULL; _update_variables (gc_swiss_knife, &local_error); if (local_error != NULL) { g_propagate_error (error, local_error); return 0.0; } return arv_evaluator_evaluate_as_double (gc_swiss_knife->formula, NULL); } static void arv_gc_swiss_knife_set_float_value (ArvGcFloat *gc_float, double value, GError **error) { } static void arv_gc_swiss_knife_float_interface_init (ArvGcFloatInterface *interface) { interface->get_value = arv_gc_swiss_knife_get_float_value; interface->set_value = arv_gc_swiss_knife_set_float_value; } G_DEFINE_TYPE_WITH_CODE (ArvGcSwissKnife, arv_gc_swiss_knife, ARV_TYPE_GC_FEATURE_NODE, G_IMPLEMENT_INTERFACE (ARV_TYPE_GC_INTEGER, arv_gc_swiss_knife_integer_interface_init) G_IMPLEMENT_INTERFACE (ARV_TYPE_GC_FLOAT, arv_gc_swiss_knife_float_interface_init)) aravis-ARAVIS_0_6_0/src/arvgcswissknife.h000066400000000000000000000045411334570641500203750ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_SWISS_KNIFE_H #define ARV_GC_SWISS_KNIFE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS #define ARV_TYPE_GC_SWISS_KNIFE (arv_gc_swiss_knife_get_type ()) #define ARV_GC_SWISS_KNIFE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_SWISS_KNIFE, ArvGcSwissKnife)) #define ARV_GC_SWISS_KNIFE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GC_SWISS_KNIFE, ArvGcSwissKnifeClass)) #define ARV_IS_GC_SWISS_KNIFE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_SWISS_KNIFE)) #define ARV_IS_GC_SWISS_KNIFE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GC_SWISS_KNIFE)) #define ARV_GC_SWISS_KNIFE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GC_SWISS_KNIFE, ArvGcSwissKnifeClass)) typedef struct _ArvGcSwissKnifeClass ArvGcSwissKnifeClass; struct _ArvGcSwissKnife { ArvGcFeatureNode node; GType value_type; GSList *variables; /* ArvGcVariableNode list */ GSList *constants; /* ArvGcVariableNode list */ GSList *expressions; /* ArvGcVariableNode list */ ArvGcPropertyNode *formula_node; ArvEvaluator *formula; }; struct _ArvGcSwissKnifeClass { ArvGcFeatureNodeClass parent_class; }; GType arv_gc_swiss_knife_get_type (void); ArvGcNode * arv_gc_swiss_knife_new (void); ArvGcNode * arv_gc_swiss_knife_new_integer (void); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgcvalueindexednode.c000066400000000000000000000102321334570641500215200ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2017 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgcvalueindexednode * @short_description: Class for Index nodes */ #include #include #include #include #include #include #include static GObjectClass *parent_class = NULL; /* ArvDomNode implementation */ static const char * arv_gc_value_indexed_node_get_node_name (ArvDomNode *node) { ArvGcPropertyNode *property_node = ARV_GC_PROPERTY_NODE (node); switch (property_node->type) { case ARV_GC_PROPERTY_NODE_TYPE_VALUE_INDEXED: return "ValueIndexed"; case ARV_GC_PROPERTY_NODE_TYPE_P_VALUE_INDEXED: return "pValueIndexed"; default: g_assert_not_reached (); } } static gboolean arv_gc_value_indexed_node_can_append_child (ArvDomNode *parent, ArvDomNode *child) { return ARV_IS_DOM_TEXT (child); } /* ArvDomElement implementation */ static void arv_gc_value_indexed_node_set_attribute (ArvDomElement *self, const char *name, const char *value) { ArvGcValueIndexedNode *value_indexed_node = ARV_GC_VALUE_INDEXED_NODE (self); if (strcmp (name, "Index") == 0) { g_free (value_indexed_node->index); value_indexed_node->index = g_strdup (value); } } static const char * arv_gc_value_indexed_node_get_attribute (ArvDomElement *self, const char *name) { g_assert_not_reached (); return NULL; } /* ArvGcValueIndexedNode implementation */ gint64 arv_gc_value_indexed_node_get_index (ArvGcValueIndexedNode *value_indexed_node) { gint64 index; g_return_val_if_fail (ARV_IS_GC_VALUE_INDEXED_NODE (value_indexed_node), 0); if (value_indexed_node->index == NULL) index = 0; else index = g_ascii_strtoll (value_indexed_node->index, NULL, 0); return index; } ArvGcNode * arv_gc_value_indexed_node_new (void) { ArvGcPropertyNode *node; node = g_object_new (ARV_TYPE_GC_VALUE_INDEXED_NODE, NULL); node->type = ARV_GC_PROPERTY_NODE_TYPE_VALUE_INDEXED; return ARV_GC_NODE (node); } ArvGcNode * arv_gc_p_value_indexed_node_new (void) { ArvGcPropertyNode *node; node = g_object_new (ARV_TYPE_GC_VALUE_INDEXED_NODE, NULL); node->type = ARV_GC_PROPERTY_NODE_TYPE_P_VALUE_INDEXED; return ARV_GC_NODE (node); } static void arv_gc_value_indexed_node_init (ArvGcValueIndexedNode *value_indexed_node) { value_indexed_node->index = NULL; } static void arv_gc_value_indexed_node_finalize (GObject *object) { ArvGcValueIndexedNode *value_indexed_node = ARV_GC_VALUE_INDEXED_NODE (object); g_clear_pointer (&value_indexed_node->index, g_free); parent_class->finalize (object); } static void arv_gc_value_indexed_node_class_init (ArvGcValueIndexedNodeClass *this_class) { GObjectClass *object_class = G_OBJECT_CLASS (this_class); ArvDomNodeClass *dom_node_class = ARV_DOM_NODE_CLASS (this_class); ArvDomElementClass *dom_element_class = ARV_DOM_ELEMENT_CLASS (this_class); parent_class = g_type_class_peek_parent (this_class); object_class->finalize = arv_gc_value_indexed_node_finalize; dom_node_class->get_node_name = arv_gc_value_indexed_node_get_node_name; dom_node_class->can_append_child = arv_gc_value_indexed_node_can_append_child; dom_element_class->set_attribute = arv_gc_value_indexed_node_set_attribute; dom_element_class->get_attribute = arv_gc_value_indexed_node_get_attribute; } G_DEFINE_TYPE (ArvGcValueIndexedNode, arv_gc_value_indexed_node, ARV_TYPE_GC_PROPERTY_NODE) aravis-ARAVIS_0_6_0/src/arvgcvalueindexednode.h000066400000000000000000000045431334570641500215350ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GC_VALUE_INDEXED_NODE_H #define ARV_GC_VALUE_INDEXED_NODE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS #define ARV_TYPE_GC_VALUE_INDEXED_NODE (arv_gc_value_indexed_node_get_type ()) #define ARV_GC_VALUE_INDEXED_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GC_VALUE_INDEXED_NODE, ArvGcValueIndexedNode)) #define ARV_GC_VALUE_INDEXED_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GC_VALUE_INDEXED_NODE, ArvGcValueIndexedNodeClass)) #define ARV_IS_GC_VALUE_INDEXED_NODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GC_VALUE_INDEXED_NODE)) #define ARV_IS_GC_VALUE_INDEXED_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GC_VALUE_INDEXED_NODE)) #define ARV_GC_VALUE_INDEXED_NODE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GC_VALUE_INDEXED_NODE, ArvGcValueIndexedNodeClass)) typedef struct _ArvGcValueIndexedNodeClass ArvGcValueIndexedNodeClass; struct _ArvGcValueIndexedNode { ArvGcPropertyNode base; char *index; }; struct _ArvGcValueIndexedNodeClass { ArvGcPropertyNodeClass parent_class; }; GType arv_gc_value_indexed_node_get_type (void); ArvGcNode * arv_gc_value_indexed_node_new (void); ArvGcNode * arv_gc_p_value_indexed_node_new (void); gint64 arv_gc_value_indexed_node_get_index (ArvGcValueIndexedNode *value_indexed_node); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgvcp.c000066400000000000000000000371221334570641500166310ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgvcp * @short_description: GigEVision control packet handling */ #include #include #include #include #include void arv_gvcp_packet_free (ArvGvcpPacket *packet) { g_free (packet); } /** * arv_gvcp_packet_new_read_memory_cmd: (skip) * @address: read address * @size: read size, in bytes * @packet_id: packet id * @packet_size: (out): packet size, in bytes * Return value: (transfer full): a new #ArvGvcpPacket * * Create a gvcp packet for a memory read command. */ ArvGvcpPacket * arv_gvcp_packet_new_read_memory_cmd (guint32 address, guint32 size, guint16 packet_id, size_t *packet_size) { ArvGvcpPacket *packet; guint32 n_address = g_htonl (address); guint32 n_size = g_htonl (size); g_return_val_if_fail (packet_size != NULL, NULL); *packet_size = sizeof (ArvGvcpHeader) + 2 * sizeof (guint32); packet = g_malloc (*packet_size); packet->header.packet_type = g_htons (ARV_GVCP_PACKET_TYPE_CMD); packet->header.command = g_htons (ARV_GVCP_COMMAND_READ_MEMORY_CMD); packet->header.size = g_htons (2 * sizeof (guint32)); packet->header.id = g_htons (packet_id); memcpy (&packet->data, &n_address, sizeof (guint32)); memcpy (&packet->data[sizeof(guint32)], &n_size, sizeof (guint32)); return packet; } /** * arv_gvcp_packet_new_read_memory_ack: (skip) * @address: read address * @size: read size, in bytes * @packet_id: packet id * @packet_size: (out): packet size, in bytes * Return value: (transfer full): a new #ArvGvcpPacket * * Create a gvcp packet for a memory read acknowledge. */ ArvGvcpPacket * arv_gvcp_packet_new_read_memory_ack (guint32 address, guint32 size, guint16 packet_id, size_t *packet_size) { ArvGvcpPacket *packet; guint32 n_address = g_htonl (address); g_return_val_if_fail (packet_size != NULL, NULL); *packet_size = sizeof (ArvGvcpHeader) + sizeof (guint32) + size; packet = g_malloc (*packet_size); packet->header.packet_type = g_htons (ARV_GVCP_PACKET_TYPE_ACK); packet->header.command = g_htons (ARV_GVCP_COMMAND_READ_MEMORY_ACK); packet->header.size = g_htons (sizeof (guint32) + size); packet->header.id = g_htons (packet_id); memcpy (&packet->data, &n_address, sizeof (guint32)); return packet; } /** * arv_gvcp_packet_new_write_memory_cmd: (skip) * @address: write address * @size: write size, in bytes * @packet_id: packet id * @packet_size: (out): packet size, in bytes * Return value: (transfer full): a new #ArvGvcpPacket * * Create a gvcp packet for a memory write command. */ ArvGvcpPacket * arv_gvcp_packet_new_write_memory_cmd (guint32 address, guint32 size, guint16 packet_id, size_t *packet_size) { ArvGvcpPacket *packet; guint32 n_address = g_htonl (address); g_return_val_if_fail (packet_size != NULL, NULL); *packet_size = sizeof (ArvGvcpHeader) + sizeof (guint32) + size; packet = g_malloc (*packet_size); packet->header.packet_type = g_htons (ARV_GVCP_PACKET_TYPE_CMD); packet->header.command = g_htons (ARV_GVCP_COMMAND_WRITE_MEMORY_CMD); packet->header.size = g_htons (sizeof (guint32) + size); packet->header.id = g_htons (packet_id); memcpy (&packet->data, &n_address, sizeof (guint32)); return packet; } /** * arv_gvcp_packet_new_write_memory_ack: (skip) * @address: write address * @packet_id: packet id * @packet_size: (out): packet size, in bytes * Return value: (transfer full): a new #ArvGvcpPacket * * Create a gvcp packet for a memory write acknowledge. */ ArvGvcpPacket * arv_gvcp_packet_new_write_memory_ack (guint32 address, guint16 packet_id, size_t *packet_size) { ArvGvcpPacket *packet; guint32 n_address = g_htonl (address); g_return_val_if_fail (packet_size != NULL, NULL); *packet_size = sizeof (ArvGvcpHeader) + sizeof (guint32); packet = g_malloc (*packet_size); packet->header.packet_type = g_htons (ARV_GVCP_PACKET_TYPE_ACK); packet->header.command = g_htons (ARV_GVCP_COMMAND_WRITE_MEMORY_ACK); packet->header.size = g_htons (sizeof (guint32)); packet->header.id = g_htons (packet_id); memcpy (&packet->data, &n_address, sizeof (guint32)); return packet; } /** * arv_gvcp_packet_new_read_register_cmd: (skip) * @address: write address * @packet_id: packet id * @packet_size: (out): packet size, in bytes * Return value: (transfer full): a new #ArvGvcpPacket * * Create a gvcp packet for a register read command. */ ArvGvcpPacket * arv_gvcp_packet_new_read_register_cmd (guint32 address, guint16 packet_id, size_t *packet_size) { ArvGvcpPacket *packet; guint32 n_address = g_htonl (address); g_return_val_if_fail (packet_size != NULL, NULL); *packet_size = sizeof (ArvGvcpHeader) + sizeof (guint32); packet = g_malloc (*packet_size); packet->header.packet_type = g_htons (ARV_GVCP_PACKET_TYPE_CMD); packet->header.command = g_htons (ARV_GVCP_COMMAND_READ_REGISTER_CMD); packet->header.size = g_htons (sizeof (guint32)); packet->header.id = g_htons (packet_id); memcpy (&packet->data, &n_address, sizeof (guint32)); return packet; } /** * arv_gvcp_packet_new_read_register_ack: (skip) * @value: read value * @packet_id: packet id * @packet_size: (out): packet size, in bytes * Return value: (transfer full): a new #ArvGvcpPacket * * Create a gvcp packet for a register read acknowledge. */ ArvGvcpPacket * arv_gvcp_packet_new_read_register_ack (guint32 value, guint16 packet_id, size_t *packet_size) { ArvGvcpPacket *packet; guint32 n_value = g_htonl (value); g_return_val_if_fail (packet_size != NULL, NULL); *packet_size = sizeof (ArvGvcpHeader) + sizeof (guint32); packet = g_malloc (*packet_size); packet->header.packet_type = g_htons (ARV_GVCP_PACKET_TYPE_ACK); packet->header.command = g_htons (ARV_GVCP_COMMAND_READ_REGISTER_ACK); packet->header.size = g_htons (sizeof (guint32)); packet->header.id = g_htons (packet_id); memcpy (&packet->data, &n_value, sizeof (guint32)); return packet; } /** * arv_gvcp_packet_new_write_register_cmd: (skip) * @address: write address * @value: value to write * @packet_id: packet id * @packet_size: (out): packet size, in bytes * Return value: (transfer full): a new #ArvGvcpPacket * * Create a gvcp packet for a register write command. */ ArvGvcpPacket * arv_gvcp_packet_new_write_register_cmd (guint32 address, guint32 value, guint16 packet_id, size_t *packet_size) { ArvGvcpPacket *packet; guint32 n_address = g_htonl (address); guint32 n_value = g_htonl (value); g_return_val_if_fail (packet_size != NULL, NULL); *packet_size = sizeof (ArvGvcpHeader) + 2 * sizeof (guint32); packet = g_malloc (*packet_size); packet->header.packet_type = g_htons (ARV_GVCP_PACKET_TYPE_CMD); packet->header.command = g_htons (ARV_GVCP_COMMAND_WRITE_REGISTER_CMD); packet->header.size = g_htons (2 * sizeof (guint32)); packet->header.id = g_htons (packet_id); memcpy (&packet->data, &n_address, sizeof (guint32)); memcpy (&packet->data[sizeof (guint32)], &n_value, sizeof (guint32)); return packet; } /** * arv_gvcp_packet_new_write_register_ack: (skip) * @data_index: data index * @packet_id: packet id * @packet_size: (out): packet size, in bytes * Return value: (transfer full): a new #ArvGvcpPacket * * Create a gvcp packet for a register write acknowledge. */ ArvGvcpPacket * arv_gvcp_packet_new_write_register_ack (guint32 data_index, guint16 packet_id, size_t *packet_size) { ArvGvcpPacket *packet; guint32 n_data_index = g_htonl (data_index); g_return_val_if_fail (packet_size != NULL, NULL); *packet_size = sizeof (ArvGvcpHeader) + sizeof (guint32); packet = g_malloc (*packet_size); packet->header.packet_type = g_htons (ARV_GVCP_PACKET_TYPE_ACK); packet->header.command = g_htons (ARV_GVCP_COMMAND_WRITE_REGISTER_ACK); packet->header.size = g_htons (sizeof (guint32)); packet->header.id = g_htons (packet_id); memcpy (&packet->data, &n_data_index, sizeof (guint32)); return packet; } /** * arv_gvcp_packet_new_discovery_cmd: (skip) * @size: (out): packet size, in bytes * Return value: (transfer full): a new #ArvGvcpPacket * * Create a gvcp packet for a discovery command. */ ArvGvcpPacket * arv_gvcp_packet_new_discovery_cmd (size_t *packet_size) { ArvGvcpPacket *packet; g_return_val_if_fail (packet_size != NULL, NULL); *packet_size = sizeof (ArvGvcpHeader); packet = g_malloc (*packet_size); packet->header.packet_type = g_htons (ARV_GVCP_PACKET_TYPE_CMD); packet->header.command = g_htons (ARV_GVCP_COMMAND_DISCOVERY_CMD); packet->header.size = g_htons (0x0000); packet->header.id = g_htons (0xffff); return packet; } /** * arv_gvcp_packet_new_discovery_ack: (skip) * @packet_size: (out): packet size, in bytes * Return value: (transfer full): a new #ArvGvcpPacket * * Create a gvcp packet for a discovery acknowledge. */ ArvGvcpPacket * arv_gvcp_packet_new_discovery_ack (size_t *packet_size) { ArvGvcpPacket *packet; g_return_val_if_fail (packet_size != NULL, NULL); *packet_size = sizeof (ArvGvcpHeader) + ARV_GVBS_DISCOVERY_DATA_SIZE ; packet = g_malloc (*packet_size); packet->header.packet_type = g_htons (ARV_GVCP_PACKET_TYPE_ACK); packet->header.command = g_htons (ARV_GVCP_COMMAND_DISCOVERY_ACK); packet->header.size = g_htons (ARV_GVBS_DISCOVERY_DATA_SIZE); packet->header.id = g_htons (0xffff); return packet; } /** * arv_gvcp_packet_new_packet_resend_cmd: (skip) * @frame_id: frame id * @first_block: first missing packet * @last_block: last missing packet * @packet_id: packet id * @packet_size: (out): packet size, in bytes * * Create a gvcp packet for a packet resend command. * * Return value: (transfer full): a new #ArvGvcpPacket */ ArvGvcpPacket * arv_gvcp_packet_new_packet_resend_cmd (guint32 frame_id, guint32 first_block, guint32 last_block, guint16 packet_id, size_t *packet_size) { ArvGvcpPacket *packet; guint32 *data; g_return_val_if_fail (packet_size != NULL, NULL); *packet_size = sizeof (ArvGvcpHeader) + 3 * sizeof (guint32); packet = g_malloc (*packet_size); packet->header.packet_type = g_htons (ARV_GVCP_PACKET_TYPE_RESEND); packet->header.command = g_htons (ARV_GVCP_COMMAND_PACKET_RESEND_CMD); packet->header.size = g_htons (3 * sizeof (guint32)); packet->header.id = g_htons (packet_id); data = (guint32 *) &packet->data; data[0] = g_htonl (frame_id); data[1] = g_htonl (first_block); data[2] = g_htonl (last_block); return packet; } static const char * arv_enum_to_string (GType type, guint enum_value) { GEnumClass *enum_class; GEnumValue *value; const char *retval = NULL; enum_class = g_type_class_ref (type); value = g_enum_get_value (enum_class, enum_value); if (value) retval = value->value_nick; g_type_class_unref (enum_class); return retval; } static const char * arv_gvcp_packet_type_to_string (ArvGvcpPacketType value) { return arv_enum_to_string (ARV_TYPE_GVCP_PACKET_TYPE, value); } static const char * arv_gvcp_command_to_string (ArvGvcpCommand value) { return arv_enum_to_string (ARV_TYPE_GVCP_COMMAND, value); } /** * arv_gvcp_packet_to_string: * @packet: a #ArvGvcpPacket * * Converts @packet into a human readable string. * * return value: (transfer full): A newly allocated string. */ char * arv_gvcp_packet_to_string (const ArvGvcpPacket *packet) { GString *string; char *c_string; char *data; int packet_size; guint32 value; g_return_val_if_fail (packet != NULL, NULL); string = g_string_new (""); g_string_append_printf (string, "packet_type = %s\n", arv_gvcp_packet_type_to_string (g_ntohs (packet->header.packet_type))); g_string_append_printf (string, "command = %s\n", arv_gvcp_command_to_string (g_ntohs (packet->header.command))); g_string_append_printf (string, "size = %d\n", g_ntohs (packet->header.size)); g_string_append_printf (string, "id = %d\n", g_ntohs (packet->header.id)); data = (char *) &packet->data; switch (g_ntohs (packet->header.command)) { case ARV_GVCP_COMMAND_DISCOVERY_CMD: break; case ARV_GVCP_COMMAND_DISCOVERY_ACK: g_string_append_printf (string, "manufacturer = %s\n", &data[ARV_GVBS_MANUFACTURER_NAME_OFFSET]); g_string_append_printf (string, "name = %s\n", &data[ARV_GVBS_USER_DEFINED_NAME_OFFSET]); g_string_append_printf (string, "model = %s\n", &data[ARV_GVBS_MODEL_NAME_OFFSET]); g_string_append_printf (string, "address = %d.%d.%d.%d\n", data[ARV_GVBS_CURRENT_IP_ADDRESS_OFFSET] & 0xff, data[ARV_GVBS_CURRENT_IP_ADDRESS_OFFSET + 1] & 0xff, data[ARV_GVBS_CURRENT_IP_ADDRESS_OFFSET + 2] & 0xff, data[ARV_GVBS_CURRENT_IP_ADDRESS_OFFSET + 3] & 0xff); break; case ARV_GVCP_COMMAND_WRITE_REGISTER_CMD: value = g_ntohl (*((guint32 *) &data[0])); g_string_append_printf (string, "address = %10u (0x%08x)\n", value, value); value = g_ntohl (*((guint32 *) &data[4])); g_string_append_printf (string, "value = %10u (0x%08x)\n", value, value); break; case ARV_GVCP_COMMAND_WRITE_REGISTER_ACK: value = g_ntohl (*((guint32 *) &data[0])); g_string_append_printf (string, "data index = %10u (0x%08x)\n", value, value); break; case ARV_GVCP_COMMAND_READ_REGISTER_CMD: value = g_ntohl (*((guint32 *) &data[0])); g_string_append_printf (string, "address = %10u (0x%08x)\n", value, value); break; case ARV_GVCP_COMMAND_READ_REGISTER_ACK: value = g_ntohl (*((guint32 *) &data[0])); g_string_append_printf (string, "success = %10u (0x%08x)\n", value, value); break; case ARV_GVCP_COMMAND_READ_MEMORY_CMD: value = g_ntohl (*((guint32 *) &data[0])); g_string_append_printf (string, "address = %10u (0x%08x)\n", value, value); value = g_ntohl (*((guint32 *) &data[4])); g_string_append_printf (string, "size = %10u (0x%08x)\n", value, value); break; case ARV_GVCP_COMMAND_READ_MEMORY_ACK: value = g_ntohl (*((guint32 *) &data[0])); g_string_append_printf (string, "address = %10u (0x%08x)\n", value, value); break; } packet_size = sizeof (ArvGvcpHeader) + g_ntohs (packet->header.size); arv_g_string_append_hex_dump (string, packet, packet_size); c_string = string->str; g_string_free (string, FALSE); return c_string; } /** * arv_gvcp_packet_debug: * @packet: a #ArvGvcpPacket * @level: debug level * * Dumps the content of @packet if level is lower or equal to the current debug level for the cp debug category. See arv_debug_enable(). */ void arv_gvcp_packet_debug (const ArvGvcpPacket *packet, ArvDebugLevel level) { char *string; if (!arv_debug_check (&arv_debug_category_cp, level)) return; string = arv_gvcp_packet_to_string (packet); switch (level) { case ARV_DEBUG_LEVEL_LOG: arv_log_cp ("%s", string); break; case ARV_DEBUG_LEVEL_DEBUG: arv_debug_cp ("%s", string); break; case ARV_DEBUG_LEVEL_WARNING: arv_warning_cp ("%s", string); break; default: break; } g_free (string); } aravis-ARAVIS_0_6_0/src/arvgvcp.h000066400000000000000000000353731334570641500166440ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GVCP_H #define ARV_GVCP_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS /** * ARV_GVCP_PORT: * * Standard device listening port for GVCP packets */ #define ARV_GVCP_PORT 3956 #define ARV_GVBS_VERSION_OFFSET 0x00000000 #define ARV_GVBS_VERSION_MINOR_MASK 0x0000ffff #define ARV_GVBS_VERSION_MINOR_POS 0 #define ARV_GVBS_VERSION_MAJOR_MASK 0xffff0000 #define ARV_GVBS_VERSION_MAJOR_POS 16 #define ARV_GVBS_DEVICE_MODE_OFFSET 0x00000004 #define ARV_GVBS_DEVICE_MODE_BIG_ENDIAN 1 << 31 #define ARV_GVBS_DEVICE_MODE_CHARACTER_SET_MASK 0x0000ffff #define ARV_GVBS_DEVICE_MODE_CHARACTER_SET_POS 0 #define ARV_GVBS_DEVICE_MAC_ADDRESS_HIGH_OFFSET 0x00000008 #define ARV_GVBS_DEVICE_MAC_ADDRESS_LOW_OFFSET 0x0000000c #define ARV_GVBS_SUPPORTED_IP_CONFIGURATION_OFFSET 0x00000010 #define ARV_GVBS_CURRENT_IP_CONFIGURATION_OFFSET 0x00000014 #define ARV_GVBS_IP_CONFIGURATION_PERSISTENT 1 << 0 #define ARV_GVBS_IP_CONFIGURATION_DHCP 1 << 1 #define ARV_GVBS_IP_CONFIGURATION_LLA 1 << 2 #define ARV_GVBS_CURRENT_IP_ADDRESS_OFFSET 0x00000024 #define ARV_GVBS_CURRENT_SUBNET_MASK_OFFSET 0x00000034 #define ARV_GVBS_CURRENT_GATEWAY_OFFSET 0x00000044 #define ARV_GVBS_MANUFACTURER_NAME_OFFSET 0x00000048 #define ARV_GVBS_MANUFACTURER_NAME_SIZE 32 #define ARV_GVBS_MODEL_NAME_OFFSET 0x00000068 #define ARV_GVBS_MODEL_NAME_SIZE 32 #define ARV_GVBS_DEVICE_VERSION_OFFSET 0x00000088 #define ARV_GVBS_DEVICE_VERSION_SIZE 32 #define ARV_GVBS_MANUFACTURER_INFORMATIONS_OFFSET 0x000000a8 #define ARV_GVBS_MANUFACTURER_INFORMATIONS_SIZE 48 #define ARV_GVBS_SERIAL_NUMBER_OFFSET 0x000000d8 #define ARV_GVBS_SERIAL_NUMBER_SIZE 16 #define ARV_GVBS_USER_DEFINED_NAME_OFFSET 0x000000e8 #define ARV_GVBS_USER_DEFINED_NAME_SIZE 16 #define ARV_GVBS_DISCOVERY_DATA_SIZE 0xf8 #define ARV_GVBS_XML_URL_0_OFFSET 0x00000200 #define ARV_GVBS_XML_URL_1_OFFSET 0x00000400 #define ARV_GVBS_XML_URL_SIZE 512 #define ARV_GVBS_N_NETWORK_INTERFACES_OFFSET 0x00000600 #define ARV_GVBS_PERSISTENT_IP_ADDRESS_0_OFFSET 0x0000064c #define ARV_GVBS_PERSISTENT_SUBNET_MASK_0_OFFSET 0x0000065c #define ARV_GVBS_PERSISTENT_GATEWAY_0_OFFSET 0x0000066c #define ARV_GVBS_N_MESSAGE_CHANNELS_OFFSET 0x00000900 #define ARV_GVBS_N_STREAM_CHANNELS_OFFSET 0x00000904 #define ARV_GVBS_GVCP_CAPABILITY_OFFSET 0x00000934 #define ARV_GVBS_GVCP_CAPABILITY_CONCATENATION 1 << 0 #define ARV_GVBS_GVCP_CAPABILITY_WRITE_MEMORY 1 << 1 #define ARV_GVBS_GVCP_CAPABILITY_PACKET_RESEND 1 << 2 #define ARV_GVBS_GVCP_CAPABILITY_EVENT 1 << 3 #define ARV_GVBS_GVCP_CAPABILITY_EVENT_DATA 1 << 4 #define ARV_GVBS_GVCP_CAPABILITY_PENDING_ACK 1 << 5 #define ARV_GVBS_GVCP_CAPABILITY_ACTION 1 << 6 #define ARV_GVBS_GVCP_CAPABILITY_PRIMARY_APPLICATION_SWITCHOVER 1 << 21 #define ARV_GVBS_GVCP_CAPABILITY_EXTENDED_STATUS_CODES 1 << 22 #define ARV_GVBS_GVCP_CAPABILITY_DISCOVERY_ACK_DELAY_WRITABLE 1 << 23 #define ARV_GVBS_GVCP_CAPABILITY_DISCOVERY_ACK_DELAY 1 << 24 #define ARV_GVBS_GVCP_CAPABILITY_TEST_DATA 1 << 25 #define ARV_GVBS_GVCP_CAPABILITY_MANIFEST_TABLE 1 << 26 #define ARV_GVBS_GVCP_CAPABILITY_CCP_APPLICATION_SOCKET 1 << 27 #define ARV_GVBS_GVCP_CAPABILITY_LINK_SPEED 1 << 28 #define ARV_GVBS_GVCP_CAPABILITY_HEARTBEAT_DISABLE 1 << 29 #define ARV_GVBS_GVCP_CAPABILITY_SERIAL_NUMBER 1 << 30 #define ARV_GVBS_GVCP_CAPABILITY_NAME_REGISTER 1 << 31 #define ARV_GVBS_HEARTBEAT_TIMEOUT_OFFSET 0x00000938 #define ARV_GVBS_TIMESTAMP_TICK_FREQUENCY_HIGH_OFFSET 0x0000093c #define ARV_GVBS_TIMESTAMP_TICK_FREQUENCY_LOW_OFFSET 0x00000940 #define ARV_GVBS_TIMESTAMP_CONTROL_OFFSET 0x00000944 #define ARV_GVBS_TIMESTAMP_LATCHED_VALUE_HIGH_OFFSET 0x00000948 #define ARV_GVBS_TIMESTAMP_LATCHED_VALUE_LOW_OFFSET 0x0000094c #define ARV_GVBS_CONTROL_CHANNEL_PRIVILEGE_OFFSET 0x00000a00 #define ARV_GVBS_CONTROL_CHANNEL_PRIVILEGE_CONTROL 1 << 1 #define ARV_GVBS_CONTROL_CHANNEL_PRIVILEGE_EXCLUSIVE 1 << 0 #define ARV_GVBS_STREAM_CHANNEL_0_PORT_OFFSET 0x00000d00 #define ARV_GVBS_STREAM_CHANNEL_0_PACKET_SIZE_OFFSET 0x00000d04 #define ARV_GVBS_STREAM_CHANNEL_0_PACKET_SIZE_MASK 0x0000ffff #define ARV_GVBS_STREAM_CHANNEL_0_PACKET_SIZE_POS 0 #define ARV_GVBS_STREAM_CHANNEL_0_PACKET_BIG_ENDIAN 1 << 29 #define ARV_GVBS_STREAM_CHANNEL_0_PACKET_DO_NOT_FRAGMENT 1 << 30 #define ARV_GVBS_STREAM_CHANNEL_0_PACKET_SIZE_FIRE_TEST 1 << 31 #define ARV_GVBS_STREAM_CHANNEL_0_PACKET_DELAY_OFFSET 0x00000d08 #define ARV_GVBS_STREAM_CHANNEL_0_IP_ADDRESS_OFFSET 0x00000d18 #define ARV_GVBS_DEVICE_LINK_SPEED_0_OFFSET 0x0000b000 #define ARV_GVBS_STREAM_CHANNEL_0_PACKET_SIZE_MIN_OFFSET 0x0000c000 #define ARV_GVBS_STREAM_CHANNEL_0_PACKET_SIZE_MAX_OFFSET 0x0000c004 #define ARV_GVBS_STREAM_CHANNEL_0_PACKET_DELAY_MIN_OFFSET 0x0000c008 #define ARV_GVBS_STREAM_CHANNEL_0_PACKET_DELAY_MAX_OFFSET 0x0000c00c #define ARV_GVBS_STREAM_CHANNEL_0_FRAME_TRANSMISSION_DELAY_OFFSET 0x0000c010 #define ARV_GVBS_STREAM_CHANNEL_0_FRAME_TRANSMISSION_DELAY_MIN_OFFSET 0x0000c014 #define ARV_GVBS_STREAM_CHANNEL_0_FRAME_TRANSMISSION_DELAY_MAX_OFFSET 0x0000c018 #define ARV_GVBS_STREAM_CHANNEL_0_BANDWITDH_RESERVE_OFFSET 0x0000c01c #define ARV_GVBS_STREAM_CHANNEL_0_BANDWITDH_RESERVE_MIN_OFFSET 0x0000c020 #define ARV_GVBS_STREAM_CHANNEL_0_BANDWITDH_RESERVE_MAX_OFFSET 0x0000c024 #define ARV_GVBS_STREAM_CHANNEL_0_BANDWITDH_RESERVE_ACCUMULATION_OFFSET 0x0000c028 #define ARV_GVBS_STREAM_CHANNEL_0_BANDWITDH_RESERVE_ACCUMULATION_MIN_OFFSET 0x0000c02c #define ARV_GVBS_STREAM_CHANNEL_0_BANDWITDH_RESERVE_ACCUMULATION_MAX_OFFSET 0x0000c030 #define ARV_GVBS_STREAM_CHANNEL_0_THROUGHPUT_MAX_OFFSET 0x0000c100 #define ARV_GVBS_STREAM_CHANNEL_0_CURRENT_THOURGHPUT_OFFSET 0x0000c104 #define ARV_GVBS_STREAM_CHANNEL_0_ASSIGNED_BANDWIDTH_OFFSET 0x0000c108 #define ARV_GVBS_STREAM_CHANNEL_0_FRAME_JITTER_MAX_OFFSET 0x0000c10c #define ARV_GVCP_DATA_SIZE_MAX 512 /** * ArvGvcpPacketType: * @ARV_GVCP_PACKET_TYPE_ACK: acknowledge packet * @ARV_GVCP_PACKET_TYPE_RESEND: resend request packet * @ARV_GVCP_PACKET_TYPE_CMD: command packet * @ARV_GVCP_PACKET_TYPE_ERROR: error packet */ typedef enum { ARV_GVCP_PACKET_TYPE_ACK = 0x0000, ARV_GVCP_PACKET_TYPE_RESEND = 0x4200, ARV_GVCP_PACKET_TYPE_CMD = 0x4201, ARV_GVCP_PACKET_TYPE_ERROR = 0x8006 } ArvGvcpPacketType; /** * ArvGvcpCommand: * @ARV_GVCP_COMMAND_DISCOVERY_CMD: discovery command * @ARV_GVCP_COMMAND_DISCOVERY_ACK: discovery acknowledge * @ARV_GVCP_COMMAND_BYE_CMD: goodbye command, for connection termination * @ARV_GVCP_COMMAND_BYE_ACK: goodbye acknowledge * @ARV_GVCP_COMMAND_PACKET_RESEND_CMD: packet resend request * @ARV_GVCP_COMMAND_PACKET_RESEND_ACK: packet resend acknowledge (not used ?) * @ARV_GVCP_COMMAND_READ_REGISTER_CMD: read register command * @ARV_GVCP_COMMAND_READ_REGISTER_ACK: read register acknowledge * @ARV_GVCP_COMMAND_WRITE_REGISTER_CMD: write register command * @ARV_GVCP_COMMAND_WRITE_REGISTER_ACK: write register acknowledge * @ARV_GVCP_COMMAND_READ_MEMORY_CMD: read memory command * @ARV_GVCP_COMMAND_READ_MEMORY_ACK: read memory acknowledge * @ARV_GVCP_COMMAND_WRITE_MEMORY_CMD: write memory command * @ARV_GVCP_COMMAND_WRITE_MEMORY_ACK: write memory acknowledge * @ARV_GVCP_COMMAND_PENDING_ACK: pending command acknowledge */ typedef enum { ARV_GVCP_COMMAND_DISCOVERY_CMD = 0x0002, ARV_GVCP_COMMAND_DISCOVERY_ACK = 0x0003, ARV_GVCP_COMMAND_BYE_CMD = 0x0004, ARV_GVCP_COMMAND_BYE_ACK = 0x0005, ARV_GVCP_COMMAND_PACKET_RESEND_CMD = 0x0040, ARV_GVCP_COMMAND_PACKET_RESEND_ACK = 0x0041, ARV_GVCP_COMMAND_READ_REGISTER_CMD = 0x0080, ARV_GVCP_COMMAND_READ_REGISTER_ACK = 0x0081, ARV_GVCP_COMMAND_WRITE_REGISTER_CMD = 0x0082, ARV_GVCP_COMMAND_WRITE_REGISTER_ACK = 0x0083, ARV_GVCP_COMMAND_READ_MEMORY_CMD = 0x0084, ARV_GVCP_COMMAND_READ_MEMORY_ACK = 0x0085, ARV_GVCP_COMMAND_WRITE_MEMORY_CMD = 0x0086, ARV_GVCP_COMMAND_WRITE_MEMORY_ACK = 0x0087, ARV_GVCP_COMMAND_PENDING_ACK = 0x0089 } ArvGvcpCommand; #pragma pack(push,1) /** * ArvGvcpHeader: * @packet_type: a #ArvGvcpPacketType identifier * @command: a #ArvGvcpCommand identifier * @size: data size * @id: packet identifier * * GVCP packet header structure. */ typedef struct { guint16 packet_type; guint16 command; guint16 size; guint16 id; } ArvGvcpHeader; /** * ArvGvcpPacket: * @header: packet header * @data: variable size byte array * * GVCP packet structure. */ typedef struct { ArvGvcpHeader header; unsigned char data[]; } ArvGvcpPacket; #pragma pack(pop) void arv_gvcp_packet_free (ArvGvcpPacket *packet); ArvGvcpPacket * arv_gvcp_packet_new_read_memory_cmd (guint32 address, guint32 size, guint16 packet_id, size_t *packet_size); ArvGvcpPacket * arv_gvcp_packet_new_read_memory_ack (guint32 address, guint32 size, guint16 packet_id, size_t *packet_size); ArvGvcpPacket * arv_gvcp_packet_new_write_memory_cmd (guint32 address, guint32 size, guint16 packet_id, size_t *packet_size); ArvGvcpPacket * arv_gvcp_packet_new_write_memory_ack (guint32 address, guint16 packet_id, size_t *packet_size); ArvGvcpPacket * arv_gvcp_packet_new_read_register_cmd (guint32 address, guint16 packet_id, size_t *packet_size); ArvGvcpPacket * arv_gvcp_packet_new_read_register_ack (guint32 value, guint16 packet_id, size_t *packet_size); ArvGvcpPacket * arv_gvcp_packet_new_write_register_cmd (guint32 address, guint32 value, guint16 packet_id, size_t *packet_size); ArvGvcpPacket * arv_gvcp_packet_new_write_register_ack (guint32 data_index, guint16 packet_id, size_t *packet_size); ArvGvcpPacket * arv_gvcp_packet_new_discovery_cmd (size_t *size); ArvGvcpPacket * arv_gvcp_packet_new_discovery_ack (size_t *packet_size); ArvGvcpPacket * arv_gvcp_packet_new_packet_resend_cmd (guint32 frame_id, guint32 first_block, guint32 last_block, guint16 packet_id, size_t *packet_size); char * arv_gvcp_packet_to_string (const ArvGvcpPacket *packet); void arv_gvcp_packet_debug (const ArvGvcpPacket *packet, ArvDebugLevel level); /** * arv_gvcp_packet_get_packet_type: * @packet: a #ArvGvcpPacket * * Return value: The #ArvGvcpPacketType code of @packet. */ static inline ArvGvcpPacketType arv_gvcp_packet_get_packet_type (ArvGvcpPacket *packet) { if (packet == NULL) return ARV_GVCP_PACKET_TYPE_ERROR; return (ArvGvcpPacketType) g_ntohs (packet->header.packet_type); } /** * arv_gvcp_packet_get_command: * @packet: a #ArvGvcpPacket * * Return value: The #ArvGvcpCommand code of @packet. */ static inline ArvGvcpCommand arv_gvcp_packet_get_command (ArvGvcpPacket *packet) { if (packet == NULL) return (ArvGvcpCommand) 0; return (ArvGvcpCommand) g_ntohs (packet->header.command); } static inline void arv_gvcp_packet_set_packet_id (ArvGvcpPacket *packet, guint16 id) { if (packet != NULL) packet->header.id = g_htons (id); } static inline guint16 arv_gvcp_packet_get_packet_id (ArvGvcpPacket *packet) { if (packet == NULL) return 0; return g_ntohs (packet->header.id); } static inline void arv_gvcp_packet_get_read_memory_cmd_infos (const ArvGvcpPacket *packet, guint32 *address, guint32 *size) { if (packet == NULL) { if (address != NULL) *address = 0; if (size != NULL) *size = 0; return; } if (address != NULL) *address = g_ntohl (*((guint32 *) ((char *) packet + sizeof (ArvGvcpPacket)))); if (size != NULL) *size = (g_ntohl (*((guint32 *) ((char *) packet + sizeof (ArvGvcpPacket) + sizeof (guint32))))) & 0xffff; } static inline size_t arv_gvcp_packet_get_read_memory_ack_size (guint32 data_size) { return sizeof (ArvGvcpHeader) + sizeof (guint32) + data_size; } static inline void * arv_gvcp_packet_get_read_memory_ack_data (const ArvGvcpPacket *packet) { return (char *) packet + sizeof (ArvGvcpHeader) + sizeof (guint32); } static inline void arv_gvcp_packet_get_write_memory_cmd_infos (const ArvGvcpPacket *packet, guint32 *address, guint32 *size) { if (packet == NULL) { if (address != NULL) *address = 0; if (size != NULL) *size = 0; return; } if (address != NULL) *address = g_ntohl (*((guint32 *) ((char *) packet + sizeof (ArvGvcpPacket)))); if (size != NULL) *size = g_ntohs (packet->header.size) - sizeof (guint32); } static inline void * arv_gvcp_packet_get_write_memory_cmd_data (const ArvGvcpPacket *packet) { return (char *) packet + sizeof (ArvGvcpPacket) + sizeof (guint32); } static inline size_t arv_gvcp_packet_get_write_memory_ack_size (void) { return sizeof (ArvGvcpPacket) + sizeof (guint32); } static inline void arv_gvcp_packet_get_read_register_cmd_infos (const ArvGvcpPacket *packet, guint32 *address) { if (packet == NULL) { if (address != NULL) *address = 0; return; } if (address != NULL) *address = g_ntohl (*((guint32 *) ((char *) packet + sizeof (ArvGvcpPacket)))); } static inline guint32 arv_gvcp_packet_get_read_register_ack_value (const ArvGvcpPacket *packet) { if (packet == NULL) return 0; return g_ntohl (*((guint32 *) ((char *) packet + sizeof (ArvGvcpPacket)))); } static inline void arv_gvcp_packet_get_write_register_cmd_infos (const ArvGvcpPacket *packet, guint32 *address, guint32 *value) { if (packet == NULL) { if (address != NULL) *address = 0; if (value != NULL) *value = 0; return; } if (address != NULL) *address = g_ntohl (*((guint32 *) ((char *) packet + sizeof (ArvGvcpPacket)))); if (value != NULL) *value = g_ntohl (*((guint32 *) ((char *) packet + sizeof (ArvGvcpPacket) + sizeof (guint32)))); } static inline guint16 arv_gvcp_next_packet_id (guint16 packet_id) { /* packet_id == 0 is an error value */ if (packet_id == 0xffff) return 1; return packet_id + 1; } /** * arv_gvcp_packet_get_pending_ack_timeout: * @packet: a #ArvGvcpPacket * * Returns: The pending acknowledge timeout stored in @packet, in ms. * * Since: 0.6.0 */ static inline guint32 arv_gvcp_packet_get_pending_ack_timeout (const ArvGvcpPacket *packet) { return packet != NULL ? g_ntohl (*((guint32 *) ((char *) packet + sizeof (ArvGvcpPacket)))) : 0; } G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgvdevice.c000066400000000000000000001324061334570641500174670ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgvdevice * @short_description: GigEVision device */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef __APPLE__ #include #endif #include static GObjectClass *parent_class = NULL; /* Shared data (main thread - heartbeat) */ #ifdef __APPLE__ struct iphdr { #if __BYTE_ORDER == __LITTLE_ENDIAN unsigned int ihl:4; unsigned int version:4; #elif __BYTE_ORDER == __BIG_ENDIAN unsigned int version:4; unsigned int ihl:4; #else # error "Please fix " #endif u_int8_t tos; u_int16_t tot_len; u_int16_t id; u_int16_t frag_off; u_int8_t ttl; u_int8_t protocol; u_int16_t check; u_int32_t saddr; u_int32_t daddr; /*The options start here. */ }; #endif typedef struct { GMutex mutex; guint16 packet_id; GSocket *socket; GSocketAddress *interface_address; GSocketAddress *device_address; GPollFD poll_in_event; void *buffer; unsigned int gvcp_n_retries; unsigned int gvcp_timeout_ms; gboolean is_controller; } ArvGvDeviceIOData; struct _ArvGvDevicePrivate { ArvGvDeviceIOData *io_data; void *heartbeat_thread; void *heartbeat_data; ArvGc *genicam; char *genicam_xml; size_t genicam_xml_size; gboolean is_packet_resend_supported; gboolean is_write_memory_supported; ArvGvStreamOption stream_options; }; GRegex * arv_gv_device_get_url_regex (void) { static GRegex *arv_gv_device_url_regex = NULL; if (arv_gv_device_url_regex == NULL) arv_gv_device_url_regex = g_regex_new ("^(local:|file:|http:)(.+\\.[^;]+);?(?:0x)?([0-9:a-f]*)?;?(?:0x)?([0-9:a-f]*)?$", G_REGEX_CASELESS, 0, NULL); return arv_gv_device_url_regex; } static void _flush_socket_buffer(ArvGvDeviceIOData *io_data) { GError *local_error = NULL; gboolean success = TRUE; while (success && g_poll (&io_data->poll_in_event, 1, 0) > 0 ) { arv_debug_device ("[GvDevice::flush_receive_socket] Flush packet"); success = g_socket_receive (io_data->socket, io_data->buffer, ARV_GV_DEVICE_BUFFER_SIZE, NULL, &local_error) > 0; } } static gboolean _read_memory (ArvGvDeviceIOData *io_data, guint64 address, guint32 size, void *buffer, GError **error) { ArvGvcpPacket *packet; ArvGvcpPacket *ack_packet = io_data->buffer; size_t packet_size; size_t answer_size; int count; unsigned int n_retries = 0; gboolean success = FALSE; guint32 timeout_ms; answer_size = arv_gvcp_packet_get_read_memory_ack_size (size); g_return_val_if_fail (answer_size <= ARV_GV_DEVICE_BUFFER_SIZE, FALSE); g_mutex_lock (&io_data->mutex); packet = arv_gvcp_packet_new_read_memory_cmd (address, ((size + sizeof (guint32) - 1) / sizeof (guint32)) * sizeof (guint32), 0, &packet_size); do { GError *local_error = NULL; io_data->packet_id = arv_gvcp_next_packet_id (io_data->packet_id); arv_gvcp_packet_set_packet_id (packet, io_data->packet_id); arv_gvcp_packet_debug (packet, ARV_DEBUG_LEVEL_LOG); _flush_socket_buffer(io_data); success = g_socket_send_to (io_data->socket, io_data->device_address, (const char *) packet, packet_size, NULL, &local_error) >= 0; if (success) { gboolean pending_ack; gboolean expected_answer; timeout_ms = io_data->gvcp_timeout_ms; do { success = TRUE; success = success && g_poll (&io_data->poll_in_event, 1, timeout_ms) > 0; if (success) count = g_socket_receive (io_data->socket, io_data->buffer, ARV_GV_DEVICE_BUFFER_SIZE, NULL, &local_error); else count = 0; success = success && (count >= answer_size); if (success) { ArvGvcpPacketType packet_type; ArvGvcpCommand command; guint16 packet_id; arv_gvcp_packet_debug (ack_packet, ARV_DEBUG_LEVEL_LOG); packet_type = arv_gvcp_packet_get_packet_type (ack_packet); command = arv_gvcp_packet_get_command (ack_packet); packet_id = arv_gvcp_packet_get_packet_id (ack_packet); if (command == ARV_GVCP_COMMAND_PENDING_ACK) { pending_ack = TRUE; expected_answer = FALSE; timeout_ms = arv_gvcp_packet_get_pending_ack_timeout (ack_packet); arv_log_device ("[GvDevice::read_memory] Pending ack timeout = %d", timeout_ms); } else { pending_ack = FALSE; expected_answer = packet_type == ARV_GVCP_PACKET_TYPE_ACK && command == ARV_GVCP_COMMAND_READ_MEMORY_ACK && packet_id == io_data->packet_id; if (!expected_answer) { arv_debug_device ("[GvDevice::read_memory] Unexpected answer (0x%04x)", packet_type); } } } else { pending_ack = FALSE; expected_answer = FALSE; if (local_error != NULL) arv_warning_device ("[GvDevice::read_memory] Ack reception error: %s", local_error->message); g_clear_error (&local_error); } } while (pending_ack); success = success && expected_answer; if (success) memcpy (buffer, arv_gvcp_packet_get_read_memory_ack_data (ack_packet), size); } else { if (local_error != NULL) arv_warning_device ("[GvDevice::read_memory] Command sending error: %s", local_error->message); g_clear_error (&local_error); } n_retries++; } while (!success && n_retries < io_data->gvcp_n_retries); arv_gvcp_packet_free (packet); g_mutex_unlock (&io_data->mutex); if (!success) { if (error != NULL && *error == NULL) *error = g_error_new (ARV_DEVICE_ERROR, ARV_DEVICE_STATUS_TIMEOUT, "[ArvDevice::read_memory] Timeout"); } return success; } static gboolean _write_memory (ArvGvDeviceIOData *io_data, guint64 address, guint32 size, void *buffer, GError **error) { ArvGvcpPacket *packet; ArvGvcpPacket *ack_packet = io_data->buffer; size_t packet_size; int count; unsigned int n_retries = 0; gboolean success = FALSE; guint32 timeout_ms; g_mutex_lock (&io_data->mutex); packet = arv_gvcp_packet_new_write_memory_cmd (address, ((size + sizeof (guint32) - 1) / sizeof (guint32)) * sizeof (guint32), 0, &packet_size); memcpy (arv_gvcp_packet_get_write_memory_cmd_data (packet), buffer, size); do { GError *local_error = NULL; io_data->packet_id = arv_gvcp_next_packet_id (io_data->packet_id); arv_gvcp_packet_set_packet_id (packet, io_data->packet_id); arv_gvcp_packet_debug (packet, ARV_DEBUG_LEVEL_LOG); _flush_socket_buffer(io_data); success = g_socket_send_to (io_data->socket, io_data->device_address, (const char *) packet, packet_size, NULL, &local_error) >= 0; if (success) { gboolean pending_ack; gboolean expected_answer; timeout_ms = io_data->gvcp_timeout_ms; do { success = TRUE; success = success && g_poll (&io_data->poll_in_event, 1, io_data->gvcp_timeout_ms) > 0; if (success) count = g_socket_receive (io_data->socket, io_data->buffer, ARV_GV_DEVICE_BUFFER_SIZE, NULL, &local_error); else count = 0; success = success && (count >= arv_gvcp_packet_get_write_memory_ack_size ()); if (success) { ArvGvcpPacketType packet_type; ArvGvcpCommand command; guint16 packet_id; arv_gvcp_packet_debug (ack_packet, ARV_DEBUG_LEVEL_LOG); packet_type = arv_gvcp_packet_get_packet_type (ack_packet); command = arv_gvcp_packet_get_command (ack_packet); packet_id = arv_gvcp_packet_get_packet_id (ack_packet); if (command == ARV_GVCP_COMMAND_PENDING_ACK) { pending_ack = TRUE; expected_answer = FALSE; timeout_ms = arv_gvcp_packet_get_pending_ack_timeout (ack_packet); arv_log_device ("[GvDevice::write_memory] Pending ack timeout = %d", timeout_ms); } else { pending_ack = FALSE; expected_answer = packet_type == ARV_GVCP_PACKET_TYPE_ACK && command == ARV_GVCP_COMMAND_WRITE_MEMORY_ACK && packet_id == io_data->packet_id; if (!expected_answer) { arv_debug_device ("[GvDevice::write_memory] Unexpected answer (0x%04x)", packet_type); } } } else { pending_ack = FALSE; expected_answer = FALSE; if (local_error != NULL) arv_warning_device ("[GvDevice::write_memory] Ack reception error: %s", local_error->message); g_clear_error (&local_error); } } while (pending_ack); success = success && expected_answer; } else { if (local_error != NULL) arv_warning_device ("[GvDevice::write_memory] Command sending error: %s", local_error->message); g_clear_error (&local_error); } n_retries++; } while (!success && n_retries < io_data->gvcp_n_retries); arv_gvcp_packet_free (packet); g_mutex_unlock (&io_data->mutex); if (!success) { if (error != NULL && *error == NULL) *error = g_error_new (ARV_DEVICE_ERROR, ARV_DEVICE_STATUS_TIMEOUT, "[ArvDevice::write_memory] Timeout"); } return success; } gboolean _read_register (ArvGvDeviceIOData *io_data, guint32 address, guint32 *value_placeholder, GError **error) { ArvGvcpPacket *packet; ArvGvcpPacket *ack_packet = io_data->buffer; size_t packet_size; int count; unsigned int n_retries = 0; gboolean success = FALSE; guint32 timeout_ms; g_mutex_lock (&io_data->mutex); packet = arv_gvcp_packet_new_read_register_cmd (address, 0, &packet_size); do { GError *local_error = NULL; io_data->packet_id = arv_gvcp_next_packet_id (io_data->packet_id); arv_gvcp_packet_set_packet_id (packet, io_data->packet_id); arv_gvcp_packet_debug (packet, ARV_DEBUG_LEVEL_LOG); _flush_socket_buffer(io_data); success = g_socket_send_to (io_data->socket, io_data->device_address, (const char *) packet, packet_size, NULL, &local_error) >= 0; if (success) { gboolean pending_ack; gboolean expected_answer; timeout_ms = io_data->gvcp_timeout_ms; do { success = TRUE; success = success && g_poll (&io_data->poll_in_event, 1, io_data->gvcp_timeout_ms) > 0; if (success) count = g_socket_receive (io_data->socket, io_data->buffer, ARV_GV_DEVICE_BUFFER_SIZE, NULL, &local_error); else count = 0; success = success && (count > 0); if (success) { ArvGvcpPacketType packet_type; ArvGvcpCommand command; guint16 packet_id; arv_gvcp_packet_debug (ack_packet, ARV_DEBUG_LEVEL_LOG); packet_type = arv_gvcp_packet_get_packet_type (ack_packet); command = arv_gvcp_packet_get_command (ack_packet); packet_id = arv_gvcp_packet_get_packet_id (ack_packet); if (command == ARV_GVCP_COMMAND_PENDING_ACK) { pending_ack = TRUE; expected_answer = FALSE; timeout_ms = arv_gvcp_packet_get_pending_ack_timeout (ack_packet); arv_log_device ("[GvDevice::read_register] Pending ack timeout = %d", timeout_ms); } else { pending_ack = FALSE; expected_answer = packet_type == ARV_GVCP_PACKET_TYPE_ACK && command == ARV_GVCP_COMMAND_READ_REGISTER_ACK && packet_id == io_data->packet_id; if (!expected_answer) { arv_debug_device ("[GvDevice::read_register] Unexpected answer (0x%04x)", packet_type); } } } else { pending_ack = FALSE; expected_answer = FALSE; if (local_error != NULL) arv_warning_device ("[GvDevice::read_register] Ack reception error: %s", local_error->message); g_clear_error (&local_error); } } while (pending_ack); success = success && expected_answer; if (success) *value_placeholder = arv_gvcp_packet_get_read_register_ack_value (ack_packet); } else { if (local_error != NULL) arv_warning_device ("[GvDevice::read_register] Command sending error: %s", local_error->message); g_clear_error (&local_error); } n_retries++; } while (!success && n_retries < io_data->gvcp_n_retries); arv_gvcp_packet_free (packet); g_mutex_unlock (&io_data->mutex); if (!success) { *value_placeholder = 0; if (error != NULL && *error == NULL) *error = g_error_new (ARV_DEVICE_ERROR, ARV_DEVICE_STATUS_TIMEOUT, "[ArvDevice::read_register] Timeout"); } return success; } gboolean _write_register (ArvGvDeviceIOData *io_data, guint32 address, guint32 value, GError **error) { ArvGvcpPacket *packet; ArvGvcpPacket *ack_packet = io_data->buffer; size_t packet_size; int count; unsigned int n_retries = 0; gboolean success = FALSE; guint32 timeout_ms; g_mutex_lock (&io_data->mutex); packet = arv_gvcp_packet_new_write_register_cmd (address, value, io_data->packet_id, &packet_size); do { GError *local_error = NULL; io_data->packet_id = arv_gvcp_next_packet_id (io_data->packet_id); arv_gvcp_packet_set_packet_id (packet, io_data->packet_id); arv_gvcp_packet_debug (packet, ARV_DEBUG_LEVEL_LOG); _flush_socket_buffer(io_data); success = g_socket_send_to (io_data->socket, io_data->device_address, (const char *) packet, packet_size, NULL, &local_error) >= 0; if (success) { gboolean pending_ack; gboolean expected_answer; timeout_ms = io_data->gvcp_timeout_ms; do { success = TRUE; success = success && g_poll (&io_data->poll_in_event, 1, io_data->gvcp_timeout_ms) > 0; if (success) count = g_socket_receive (io_data->socket, io_data->buffer, ARV_GV_DEVICE_BUFFER_SIZE, NULL, NULL); else count = 0; success = success && (count > 0); if (success) { ArvGvcpPacketType packet_type; ArvGvcpCommand command; guint16 packet_id; arv_gvcp_packet_debug (ack_packet, ARV_DEBUG_LEVEL_LOG); packet_type = arv_gvcp_packet_get_packet_type (ack_packet); command = arv_gvcp_packet_get_command (ack_packet); packet_id = arv_gvcp_packet_get_packet_id (ack_packet); if (command == ARV_GVCP_COMMAND_PENDING_ACK) { pending_ack = TRUE; expected_answer = FALSE; timeout_ms = arv_gvcp_packet_get_pending_ack_timeout (ack_packet); arv_log_device ("[GvDevice::write_register] Pending ack timeout = %d", timeout_ms); } else { pending_ack = FALSE; expected_answer = packet_type == ARV_GVCP_PACKET_TYPE_ACK && command == ARV_GVCP_COMMAND_WRITE_REGISTER_ACK && packet_id == io_data->packet_id; if (!expected_answer) { arv_debug_device ("[GvDevice::write_register] Unexpected answer (0x%04x)", packet_type); } } } else { pending_ack = FALSE; expected_answer = FALSE; if (local_error != NULL) arv_warning_device ("[GvDevice::write_register] Ack reception error: %s", local_error->message); g_clear_error (&local_error); } } while (pending_ack); success = success && expected_answer; } else { if (local_error != NULL) arv_warning_device ("[GvDevice::write_register] Command sending error: %s", local_error->message); g_clear_error (&local_error); } n_retries++; } while (!success && n_retries < io_data->gvcp_n_retries); arv_gvcp_packet_free (packet); g_mutex_unlock (&io_data->mutex); if (!success) { if (error != NULL && *error == NULL) *error = g_error_new (ARV_DEVICE_ERROR, ARV_DEVICE_STATUS_TIMEOUT, "[ArvDevice::write_register] Timeout"); } return success; } /* Heartbeat thread */ typedef struct { ArvGvDevice *gv_device; ArvGvDeviceIOData *io_data; int period_us; gboolean cancel; } ArvGvDeviceHeartbeatData; static void * arv_gv_device_heartbeat_thread (void *data) { ArvGvDeviceHeartbeatData *thread_data = data; ArvGvDeviceIOData *io_data = thread_data->io_data; GTimer *timer; guint32 value; timer = g_timer_new (); do { g_usleep (thread_data->period_us); if (io_data->is_controller) { guint counter = 1; /* TODO: Instead of reading the control register, Pylon does write the heartbeat * timeout value, which is interresting, as doing this we could get an error * ack packet which will indicate we lost the control access. */ g_timer_start (timer); while (!_read_register (io_data, ARV_GVBS_CONTROL_CHANNEL_PRIVILEGE_OFFSET, &value, NULL) && g_timer_elapsed (timer, NULL) < ARV_GV_DEVICE_HEARTBEAT_RETRY_TIMEOUT_S && !g_atomic_int_get (&thread_data->cancel)) { g_usleep (ARV_GV_DEVICE_HEARTBEAT_RETRY_DELAY_US); counter++; } if (!g_atomic_int_get (&thread_data->cancel)) { arv_log_device ("[GvDevice::Heartbeat] Ack value = %d", value); if (counter > 1) arv_log_device ("[GvDevice::Heartbeat] Tried %u times", counter); if ((value & (ARV_GVBS_CONTROL_CHANNEL_PRIVILEGE_CONTROL | ARV_GVBS_CONTROL_CHANNEL_PRIVILEGE_EXCLUSIVE)) == 0) { arv_warning_device ("[GvDevice::Heartbeat] Control access lost"); arv_device_emit_control_lost_signal (ARV_DEVICE (thread_data->gv_device)); io_data->is_controller = FALSE; } } else io_data->is_controller = FALSE; } } while (!g_atomic_int_get (&thread_data->cancel)); g_timer_destroy (timer); return NULL; } /* ArvGvDevice implemenation */ static gboolean arv_gv_device_take_control (ArvGvDevice *gv_device) { gboolean success; success = arv_device_write_register (ARV_DEVICE (gv_device), ARV_GVBS_CONTROL_CHANNEL_PRIVILEGE_OFFSET, ARV_GVBS_CONTROL_CHANNEL_PRIVILEGE_CONTROL, NULL); gv_device->priv->io_data->is_controller = success; /* Disable GVSP extended ID mode for now, it is not supported yet by ArvGvStream */ if (success) arv_device_set_string_feature_value (ARV_DEVICE (gv_device), "GevGVSPExtendedIDMode", "Off"); if (!success) arv_warning_device ("[GvDevice::take_control] Can't get control access"); return success; } static gboolean arv_gv_device_leave_control (ArvGvDevice *gv_device) { gboolean success; gv_device->priv->io_data->is_controller = FALSE; success = arv_device_write_register (ARV_DEVICE (gv_device), ARV_GVBS_CONTROL_CHANNEL_PRIVILEGE_OFFSET, 0, NULL); return success; } guint64 arv_gv_device_get_timestamp_tick_frequency (ArvGvDevice *gv_device) { guint32 timestamp_tick_frequency_high; guint32 timestamp_tick_frequency_low; g_return_val_if_fail (ARV_IS_GV_DEVICE (gv_device), 0); if (arv_device_read_register (ARV_DEVICE (gv_device), ARV_GVBS_TIMESTAMP_TICK_FREQUENCY_HIGH_OFFSET, ×tamp_tick_frequency_high, NULL) && arv_device_read_register (ARV_DEVICE (gv_device), ARV_GVBS_TIMESTAMP_TICK_FREQUENCY_LOW_OFFSET, ×tamp_tick_frequency_low, NULL)) { guint64 timestamp_tick_frequency; timestamp_tick_frequency = ((guint64) timestamp_tick_frequency_high << 32) | timestamp_tick_frequency_low; return timestamp_tick_frequency; } return 0; } guint arv_gv_device_get_packet_size (ArvGvDevice *gv_device) { return arv_device_get_integer_feature_value (ARV_DEVICE (gv_device), "GevSCPSPacketSize"); } void arv_gv_device_set_packet_size (ArvGvDevice *gv_device, gint packet_size) { g_return_if_fail (packet_size > 0); arv_device_set_integer_feature_value (ARV_DEVICE (gv_device), "GevSCPSPacketSize", packet_size); } /** * arv_gv_device_auto_packet_size: * @gv_device: a #ArvGvDevice * * Automatically determine the biggest packet size that can be used data * streaming, and set GevSCPSPacketSize value accordingly. This function relies * on the GevSCPSFireTestPacket feature. If this feature is not available, the * packet size will be set to a default value (1500 bytes). * * Returns: The packet size, in bytes. * * Since: 0.6.0 */ guint arv_gv_device_auto_packet_size (ArvGvDevice *gv_device) { ArvDevice *device = ARV_DEVICE (gv_device); ArvGvDeviceIOData *io_data = gv_device->priv->io_data; ArvGcNode *node; GSocket *socket; GInetAddress *interface_address; GSocketAddress *interface_socket_address; GInetSocketAddress *local_address; GPollFD poll_fd; const guint8 *address_bytes; guint16 port; gboolean do_not_fragment; gboolean is_command; int n_events; guint max_size, min_size, current_size; guint packet_size = 1500; char *buffer; g_return_val_if_fail (ARV_IS_GV_DEVICE (gv_device), 1500); node = arv_device_get_feature (device, "GevSCPSFireTestPacket"); if (!ARV_IS_GC_COMMAND (node) && !ARV_IS_GC_BOOLEAN (node)) { arv_debug_device ("[GvDevice::auto_packet_size] No GevSCPSFireTestPacket feature found, " "use default packet size (%d bytes)", packet_size); return packet_size; } is_command = ARV_IS_GC_COMMAND (node); interface_address = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (io_data->interface_address)); interface_socket_address = g_inet_socket_address_new (interface_address, 0); socket = g_socket_new (G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_DATAGRAM, G_SOCKET_PROTOCOL_UDP, NULL); g_socket_bind (socket, interface_socket_address, FALSE, NULL); local_address = G_INET_SOCKET_ADDRESS (g_socket_get_local_address (socket, NULL)); port = g_inet_socket_address_get_port (local_address); address_bytes = g_inet_address_to_bytes (interface_address); arv_device_set_integer_feature_value (ARV_DEVICE (gv_device), "GevSCDA", g_htonl (*((guint32 *) address_bytes))); arv_device_set_integer_feature_value (ARV_DEVICE (gv_device), "GevSCPHostPort", port); g_clear_object (&local_address); g_clear_object (&interface_socket_address); do_not_fragment = arv_device_get_boolean_feature_value (device, "GevSCPSDoNotFragment"); arv_device_set_boolean_feature_value (device, "GevSCPSDoNotFragment", TRUE); poll_fd.fd = g_socket_get_fd (socket); poll_fd.events = G_IO_IN; poll_fd.revents = 0; current_size = 1500; max_size = 16384; min_size = 256; buffer = g_malloc (8192); do { size_t read_count; unsigned n_tries = 0; arv_debug_device ("[GvDevice::auto_packet_size] Try packet size = %d", current_size); arv_device_set_integer_feature_value (device, "GevSCPSPacketSize", current_size); do { if (is_command) { arv_device_execute_command (device, "GevSCPSFireTestPacket"); } else { arv_device_set_boolean_feature_value (device, "GevSCPSFireTestPacket", FALSE); arv_device_set_boolean_feature_value (device, "GevSCPSFireTestPacket", TRUE); } do { n_events = g_poll (&poll_fd, 1, 10); if (n_events != 0) read_count = g_socket_receive (socket, buffer, 8192, NULL, NULL); else read_count = 0; /* Discard late packets, read_count should be equal to packet size minus IP and UDP headers */ } while (n_events != 0 && read_count != (current_size - sizeof (struct iphdr) - sizeof (struct udphdr))); n_tries++; } while (n_events == 0 && n_tries < 3); if (n_events != 0) { arv_debug_device ("[GvDevice::auto_packet_size] Received %d bytes", (int) read_count); packet_size = current_size; min_size = current_size; current_size = (max_size - min_size) / 2 + min_size; } else { max_size = current_size; current_size = (max_size - min_size) / 2 + min_size; } } while ((max_size - min_size) > 16); g_clear_pointer (&buffer, g_free); g_clear_object (&socket); arv_debug_device ("[GvDevice::auto_packet_size] Packet size set to %d bytes", packet_size); arv_device_set_boolean_feature_value (device, "GevSCPSDoNotFragment", do_not_fragment); arv_device_set_integer_feature_value (device, "GevSCPSPacketSize", packet_size); return packet_size; } static char * _load_genicam (ArvGvDevice *gv_device, guint32 address, size_t *size) { char filename[ARV_GVBS_XML_URL_SIZE]; char **tokens; char *genicam = NULL; g_return_val_if_fail (size != NULL, NULL); *size = 0; if (!arv_device_read_memory (ARV_DEVICE (gv_device), address, ARV_GVBS_XML_URL_SIZE, filename, NULL)) return NULL; filename[ARV_GVBS_XML_URL_SIZE - 1] = '\0'; arv_debug_device ("[GvDevice::load_genicam] xml url = '%s' at 0x%x", filename, address); tokens = g_regex_split (arv_gv_device_get_url_regex (), filename, 0); if (tokens[0] != NULL && tokens[1] != NULL) { if (g_ascii_strcasecmp (tokens[1], "file:") == 0) { gsize len; g_file_get_contents (tokens[2], &genicam, &len, NULL); if (genicam) *size = len; } else if (g_ascii_strcasecmp (tokens[1], "local:") == 0 && tokens[2] != NULL && tokens[3] != NULL && tokens[4] != NULL) { guint32 file_address; guint32 file_size; file_address = strtoul (tokens[3], NULL, 16); file_size = strtoul (tokens[4], NULL, 16); arv_debug_device ("[GvDevice::load_genicam] Xml address = 0x%x - size = 0x%x - %s", file_address, file_size, tokens[2]); if (file_size > 0) { genicam = g_malloc (file_size); if (arv_device_read_memory (ARV_DEVICE (gv_device), file_address, file_size, genicam, NULL)) { if (arv_debug_check (&arv_debug_category_misc, ARV_DEBUG_LEVEL_LOG)) { GString *string = g_string_new (""); g_string_append_printf (string, "[GvDevice::load_genicam] Raw data size = 0x%x\n", file_size); arv_g_string_append_hex_dump (string, genicam, file_size); arv_log_misc ("%s", string->str); g_string_free (string, TRUE); } if (g_str_has_suffix (tokens[2], ".zip")) { ArvZip *zip; const GSList *zip_files; arv_debug_device ("[GvDevice::load_genicam] Zipped xml data"); zip = arv_zip_new (genicam, file_size); zip_files = arv_zip_get_file_list (zip); if (zip_files != NULL) { const char *zip_filename; void *tmp_buffer; size_t tmp_buffer_size; zip_filename = arv_zip_file_get_name (zip_files->data); tmp_buffer = arv_zip_get_file (zip, zip_filename, &tmp_buffer_size); g_free (genicam); file_size = tmp_buffer_size; genicam = tmp_buffer; } else arv_warning_device ("[GvDevice::load_genicam] Invalid format"); arv_zip_free (zip); } *size = file_size; } else { g_free (genicam); genicam = NULL; *size = 0; } } } else if (g_ascii_strcasecmp (tokens[1], "http:") == 0) { GFile *file; GFileInputStream *stream; file = g_file_new_for_uri (filename); stream = g_file_read (file, NULL, NULL); if(stream) { GDataInputStream *data_stream; gsize len; data_stream = g_data_input_stream_new (G_INPUT_STREAM (stream)); genicam = g_data_input_stream_read_upto (data_stream, "", 0, &len, NULL, NULL); if (genicam) *size = len; g_object_unref (data_stream); g_object_unref (stream); } g_object_unref (file); } } g_strfreev (tokens); return genicam; } static const char * arv_gv_device_get_genicam_xml (ArvDevice *device, size_t *size) { char *xml; ArvGvDevice *gv_device = ARV_GV_DEVICE (device); if (gv_device->priv->genicam_xml != NULL) { *size = gv_device->priv->genicam_xml_size; return gv_device->priv->genicam_xml; } *size = 0; xml = _load_genicam (gv_device, ARV_GVBS_XML_URL_0_OFFSET, size); if (xml == NULL) xml = _load_genicam (gv_device, ARV_GVBS_XML_URL_1_OFFSET, size); gv_device->priv->genicam_xml = xml; gv_device->priv->genicam_xml_size = *size; return xml; } static void arv_gv_device_load_genicam (ArvGvDevice *gv_device) { const char *genicam; size_t size; genicam = arv_gv_device_get_genicam_xml (ARV_DEVICE (gv_device), &size); if (genicam != NULL) { gv_device->priv->genicam = arv_gc_new (ARV_DEVICE (gv_device), genicam, size); arv_gc_set_default_node_data (gv_device->priv->genicam, "DeviceVendorName", "" "Vendor Name" "
0x48
" "32" "RO" "Device" "
"); arv_gc_set_default_node_data (gv_device->priv->genicam, "DeviceModelName", "" "Model Name" "
0x68
" "32" "RO" "Device" "
"); arv_gc_set_default_node_data (gv_device->priv->genicam, "DeviceVersion", "" "Device Version" "
0x88
" "32" "RO" "Device" "
"); arv_gc_set_default_node_data (gv_device->priv->genicam, "DeviceManufacturerInfo", "" "Manufacturer Info" "
0xa8
" "48" "RO" "Device" "
"); arv_gc_set_default_node_data (gv_device->priv->genicam, "DeviceID", "" "Device ID" "
0xd8
" "16" "RO" "Device" "
"); arv_gc_set_default_node_data (gv_device->priv->genicam, "NumberOfStreamChannels", "" "
0x904
" "4" "RO" "BigEndian" "Device" "
"); arv_gc_set_default_node_data (gv_device->priv->genicam, "GevSCPHostPort", "" "Expert" "TLParamsLocked" "GevSCPHostPortReg" ""); arv_gc_set_default_node_data (gv_device->priv->genicam, "GevSCPHostPortReg", "" "
0xd00
" "GevSCPAddrCalc" "4" "RW" "Device" "31" "16" "Unsigned" "BigEndian" "
"); #if 0 arv_gc_set_default_node_data (gv_device->priv->genicam, "GevSCPSFireTestPacket", "" "TLParamsLocked" "GevSCPSFireTestPacketReg" "1" ""); arv_gc_set_default_node_data (gv_device->priv->genicam, "GevSCPSFireTestPacketReg", "" "
0x0d04
" "GevSCPAddrCalc" "4" "RW" "0" "
"); #endif arv_gc_set_default_node_data (gv_device->priv->genicam, "GevSCPSDoNotFragment", "" "TLParamsLocked" "GevSCPSDoNotFragmentReg" ""); arv_gc_set_default_node_data (gv_device->priv->genicam, "GevSCPSDoNotFragmentReg", "" "
0x0d04
" "GevSCPAddrCalc" "4" "RW" "1" "
"); arv_gc_set_default_node_data (gv_device->priv->genicam, "GevSCPSBigEndian", "" "TLParamsLocked" "GevSCPSBigEndianReg" ""); arv_gc_set_default_node_data (gv_device->priv->genicam, "GevSCPSBigEndianReg", "" "
0x0d04
" "GevSCPAddrCalc" "4" "RW" "2" "
"); arv_gc_set_default_node_data (gv_device->priv->genicam, "GevSCPSPacketSize", "" "Expert" "TLParamsLocked" "GevSCPSPacketSizeReg" ""); arv_gc_set_default_node_data (gv_device->priv->genicam, "GevSCPSPacketSizeReg", "" "
0xd04
" "GevSCPAddrCalc" "4" "RW" "Device" "31" "16" "Unsigned" "BigEndian" "
"); arv_gc_set_default_node_data (gv_device->priv->genicam, "GevSCDA", "" "Expert" "TLParamsLocked" "GevSCDAReg" ""); arv_gc_set_default_node_data (gv_device->priv->genicam, "GevSCDAReg", "" "
0xd18
" "GevSCPAddrCalc" "4" "RW" "Device" "Unsigned" "BigEndian" "
"); arv_gc_set_default_node_data (gv_device->priv->genicam, "GevSCSP", "" "Expert" "TLParamsLocked" "GevSCSPReg" ""); arv_gc_set_default_node_data (gv_device->priv->genicam, "GevSCSPReg", "" "
0xd1c
" "GevSCPAddrCalc" "4" "RO" "Device" "31" "16" "Unsigned" "BigEndian" "
"); arv_gc_set_default_node_data (gv_device->priv->genicam, "GevSCPAddrCalc", "" "GevStreamChannelSelector" "SEL * 0x40" ""); arv_gc_set_default_node_data (gv_device->priv->genicam, "GevStreamChannelSelector", "" "0" "0" "GevStreamChannelSelectorMax" "1" ""); arv_gc_set_default_node_data (gv_device->priv->genicam, "GevStreamChannelSelectorMax", "" "NumberOfStreamChannels" "N_STREAM_CHANNELS - 1" ""); arv_gc_set_default_node_data (gv_device->priv->genicam, "TLParamsLocked", "" "Invisible" "0" "0" "1" ""); } } /* ArvDevice implemenation */ static ArvStream * arv_gv_device_create_stream (ArvDevice *device, ArvStreamCallback callback, void *user_data) { ArvGvDevice *gv_device = ARV_GV_DEVICE (device); ArvGvDeviceIOData *io_data = gv_device->priv->io_data; ArvStream *stream; guint32 n_stream_channels; GInetAddress *interface_address; GInetAddress *device_address; n_stream_channels = arv_device_get_integer_feature_value (device, "NumberOfStreamChannels"); arv_debug_device ("[GvDevice::create_stream] Number of stream channels = %d", n_stream_channels); if (n_stream_channels < 1) return NULL; if (!io_data->is_controller) { arv_warning_device ("[GvDevice::create_stream] Can't create stream without control access"); return NULL; } interface_address = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (io_data->interface_address)); device_address = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (io_data->device_address)); stream = arv_gv_stream_new (gv_device, interface_address, device_address, callback, user_data); if (!ARV_IS_STREAM (stream)) return NULL; if (!gv_device->priv->is_packet_resend_supported) g_object_set (stream, "packet-resend", ARV_GV_STREAM_PACKET_RESEND_NEVER, NULL); return stream; } static ArvGc * arv_gv_device_get_genicam (ArvDevice *device) { ArvGvDevice *gv_device = ARV_GV_DEVICE (device); return gv_device->priv->genicam; } static gboolean arv_gv_device_read_memory (ArvDevice *device, guint64 address, guint32 size, void *buffer, GError **error) { ArvGvDevice *gv_device = ARV_GV_DEVICE (device); int i; gint32 block_size; for (i = 0; i < (size + ARV_GVCP_DATA_SIZE_MAX - 1) / ARV_GVCP_DATA_SIZE_MAX; i++) { block_size = MIN (ARV_GVCP_DATA_SIZE_MAX, size - i * ARV_GVCP_DATA_SIZE_MAX); if (!_read_memory (gv_device->priv->io_data, address + i * ARV_GVCP_DATA_SIZE_MAX, block_size, ((char *) buffer) + i * ARV_GVCP_DATA_SIZE_MAX, error)) return FALSE; } return TRUE; } static gboolean arv_gv_device_write_memory (ArvDevice *device, guint64 address, guint32 size, void *buffer, GError **error) { ArvGvDevice *gv_device = ARV_GV_DEVICE (device); int i; gint32 block_size; for (i = 0; i < (size + ARV_GVCP_DATA_SIZE_MAX - 1) / ARV_GVCP_DATA_SIZE_MAX; i++) { block_size = MIN (ARV_GVCP_DATA_SIZE_MAX, size - i * ARV_GVCP_DATA_SIZE_MAX); if (!_write_memory (gv_device->priv->io_data, address + i * ARV_GVCP_DATA_SIZE_MAX, block_size, ((char *) buffer) + i * ARV_GVCP_DATA_SIZE_MAX, error)) return FALSE; } return TRUE; } static gboolean arv_gv_device_read_register (ArvDevice *device, guint64 address, guint32 *value, GError **error) { ArvGvDevice *gv_device = ARV_GV_DEVICE (device); return _read_register (gv_device->priv->io_data, address, value, error); } static gboolean arv_gv_device_write_register (ArvDevice *device, guint64 address, guint32 value, GError **error) { ArvGvDevice *gv_device = ARV_GV_DEVICE (device); return _write_register (gv_device->priv->io_data, address, value, error); } /** * arv_gv_device_get_stream_options: * @gv_device: a #ArvGvDevice * * Returns: options for stream creation * * Since: 0.6.0 */ ArvGvStreamOption arv_gv_device_get_stream_options (ArvGvDevice *gv_device) { g_return_val_if_fail (ARV_IS_GV_DEVICE (gv_device), ARV_GV_STREAM_OPTION_NONE); return gv_device->priv->stream_options; } /** * arv_gv_device_set_stream_options: * @gv_device: a #ArvGvDevice * @options: options for stream creation * * Sets the option used during stream creation. It must be called before arv_device_create_stream(). * * Since: 0.6.0 */ void arv_gv_device_set_stream_options (ArvGvDevice *gv_device, ArvGvStreamOption options) { g_return_if_fail (ARV_IS_GV_DEVICE (gv_device)); gv_device->priv->stream_options = options; } ArvDevice * arv_gv_device_new (GInetAddress *interface_address, GInetAddress *device_address) { ArvGvDevice *gv_device; ArvGvDeviceIOData *io_data; ArvGvDeviceHeartbeatData *heartbeat_data; ArvGcRegisterDescriptionNode *register_description; ArvDomDocument *document; char *address_string; guint32 capabilities; g_return_val_if_fail (G_IS_INET_ADDRESS (interface_address), NULL); g_return_val_if_fail (G_IS_INET_ADDRESS (device_address), NULL); address_string = g_inet_address_to_string (interface_address); arv_debug_device ("[GvDevice::new] Interface address = %s", address_string); g_free (address_string); address_string = g_inet_address_to_string (device_address); arv_debug_device ("[GvDevice::new] Device address = %s", address_string); g_free (address_string); gv_device = g_object_new (ARV_TYPE_GV_DEVICE, NULL); io_data = g_new0 (ArvGvDeviceIOData, 1); g_mutex_init (&io_data->mutex); io_data->packet_id = 65300; /* Start near the end of the circular counter */ io_data->interface_address = g_inet_socket_address_new (interface_address, 0); io_data->device_address = g_inet_socket_address_new (device_address, ARV_GVCP_PORT); io_data->socket = g_socket_new (G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_DATAGRAM, G_SOCKET_PROTOCOL_UDP, NULL); g_socket_bind (io_data->socket, io_data->interface_address, FALSE, NULL); io_data->buffer = g_malloc (ARV_GV_DEVICE_BUFFER_SIZE); io_data->gvcp_n_retries = ARV_GV_DEVICE_GVCP_N_RETRIES_DEFAULT; io_data->gvcp_timeout_ms = ARV_GV_DEVICE_GVCP_TIMEOUT_MS_DEFAULT; io_data->poll_in_event.fd = g_socket_get_fd (io_data->socket); io_data->poll_in_event.events = G_IO_IN; io_data->poll_in_event.revents = 0; gv_device->priv->io_data = io_data; arv_gv_device_load_genicam (gv_device); if (!ARV_IS_GC (gv_device->priv->genicam)) { arv_warning_device ("[GvDevice::new] Failed to load genicam data"); g_object_unref (gv_device); return NULL; } arv_gv_device_take_control (gv_device); heartbeat_data = g_new (ArvGvDeviceHeartbeatData, 1); heartbeat_data->gv_device = gv_device; heartbeat_data->io_data = io_data; heartbeat_data->period_us = ARV_GV_DEVICE_HEARTBEAT_PERIOD_US; heartbeat_data->cancel = FALSE; gv_device->priv->heartbeat_data = heartbeat_data; gv_device->priv->heartbeat_thread = g_thread_new ("arv_gv_heartbeat", arv_gv_device_heartbeat_thread, gv_device->priv->heartbeat_data); arv_device_read_register (ARV_DEVICE (gv_device), ARV_GVBS_GVCP_CAPABILITY_OFFSET, &capabilities, NULL); gv_device->priv->is_packet_resend_supported = (capabilities & ARV_GVBS_GVCP_CAPABILITY_PACKET_RESEND) != 0; gv_device->priv->is_write_memory_supported = (capabilities & ARV_GVBS_GVCP_CAPABILITY_WRITE_MEMORY) != 0; arv_debug_device ("[GvDevice::new] Packet resend = %s", gv_device->priv->is_packet_resend_supported ? "yes" : "no"); arv_debug_device ("[GvDevice::new] Write memory = %s", gv_device->priv->is_write_memory_supported ? "yes" : "no"); document = ARV_DOM_DOCUMENT (gv_device->priv->genicam); register_description = ARV_GC_REGISTER_DESCRIPTION_NODE (arv_dom_document_get_document_element (document)); if (arv_gc_register_description_node_compare_schema_version (register_description, 1, 1, 0) < 0) arv_debug_device ("[GvDevice::new] Register workaround = yes"); return ARV_DEVICE (gv_device); } static void arv_gv_device_init (ArvGvDevice *gv_device) { gv_device->priv = G_TYPE_INSTANCE_GET_PRIVATE (gv_device, ARV_TYPE_GV_DEVICE, ArvGvDevicePrivate); gv_device->priv->genicam = NULL; gv_device->priv->genicam_xml = NULL; gv_device->priv->genicam_xml_size = 0; gv_device->priv->stream_options = ARV_GV_STREAM_OPTION_NONE; } static void arv_gv_device_finalize (GObject *object) { ArvGvDevice *gv_device = ARV_GV_DEVICE (object); ArvGvDeviceIOData *io_data; if (gv_device->priv->heartbeat_thread != NULL) { ArvGvDeviceHeartbeatData *heartbeat_data; heartbeat_data = gv_device->priv->heartbeat_data; g_atomic_int_set (&heartbeat_data->cancel, TRUE); g_thread_join (gv_device->priv->heartbeat_thread); g_free (heartbeat_data); gv_device->priv->heartbeat_data = NULL; gv_device->priv->heartbeat_thread = NULL; } arv_gv_device_leave_control (gv_device); io_data = gv_device->priv->io_data; g_object_unref (io_data->device_address); g_object_unref (io_data->interface_address); g_object_unref (io_data->socket); g_free (io_data->buffer); g_mutex_clear (&io_data->mutex); g_free (gv_device->priv->io_data); if (gv_device->priv->genicam != NULL) g_object_unref (gv_device->priv->genicam); g_free (gv_device->priv->genicam_xml); parent_class->finalize (object); } /** * arv_gv_device_get_interface_address: * @device: a #ArvGvDevice * * Returns: (transfer none): the device host interface IP address. * * Since: 0.2.0 */ GSocketAddress *arv_gv_device_get_interface_address(ArvGvDevice *device) { ArvGvDeviceIOData *io_data = device->priv->io_data; return io_data->interface_address; } /** * arv_gv_device_get_device_address: * @device: a #ArvGvDevice * * Returns: (transfer none): the device IP address. * * since: 0.2.0 */ GSocketAddress *arv_gv_device_get_device_address(ArvGvDevice *device) { ArvGvDeviceIOData *io_data = device->priv->io_data; return io_data->device_address; } static void arv_gv_device_class_init (ArvGvDeviceClass *gv_device_class) { GObjectClass *object_class = G_OBJECT_CLASS (gv_device_class); ArvDeviceClass *device_class = ARV_DEVICE_CLASS (gv_device_class); g_type_class_add_private (gv_device_class, sizeof (ArvGvDevicePrivate)); parent_class = g_type_class_peek_parent (gv_device_class); object_class->finalize = arv_gv_device_finalize; device_class->create_stream = arv_gv_device_create_stream; device_class->get_genicam_xml = arv_gv_device_get_genicam_xml; device_class->get_genicam = arv_gv_device_get_genicam; device_class->read_memory = arv_gv_device_read_memory; device_class->write_memory = arv_gv_device_write_memory; device_class->read_register = arv_gv_device_read_register; device_class->write_register = arv_gv_device_write_register; } G_DEFINE_TYPE (ArvGvDevice, arv_gv_device, ARV_TYPE_DEVICE) aravis-ARAVIS_0_6_0/src/arvgvdevice.h000066400000000000000000000050341334570641500174700ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #ifndef ARV_GV_DEVICE_H #define ARV_GV_DEVICE_H #include #include #include #include G_BEGIN_DECLS #define ARV_TYPE_GV_DEVICE (arv_gv_device_get_type ()) #define ARV_GV_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GV_DEVICE, ArvGvDevice)) #define ARV_GV_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GV_DEVICE, ArvGvDeviceClass)) #define ARV_IS_GV_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GV_DEVICE)) #define ARV_IS_GV_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GV_DEVICE)) #define ARV_GV_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GV_DEVICE, ArvGvDeviceClass)) GType arv_gv_device_get_type (void); ArvDevice * arv_gv_device_new (GInetAddress *interface_address, GInetAddress *device_address); guint64 arv_gv_device_get_timestamp_tick_frequency (ArvGvDevice *gv_device); GRegex * arv_gv_device_get_url_regex (void); GSocketAddress * arv_gv_device_get_interface_address (ArvGvDevice *device); GSocketAddress * arv_gv_device_get_device_address (ArvGvDevice *device); guint arv_gv_device_get_packet_size (ArvGvDevice *gv_device); void arv_gv_device_set_packet_size (ArvGvDevice *gv_device, gint packet_size); guint arv_gv_device_auto_packet_size (ArvGvDevice *gv_device); ArvGvStreamOption arv_gv_device_get_stream_options (ArvGvDevice *gv_device); void arv_gv_device_set_stream_options (ArvGvDevice *gv_device, ArvGvStreamOption options); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgvdeviceprivate.h000066400000000000000000000040401334570641500210570ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GV_DEVICE_PRIVATE_H #define ARV_GV_DEVICE_PRIVATE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS #ifdef ARAVIS_FAST_HEARTBEAT #define ARV_GV_DEVICE_GVCP_N_RETRIES_DEFAULT 3 #define ARV_GV_DEVICE_GVCP_TIMEOUT_MS_DEFAULT 25 #define ARV_GV_DEVICE_HEARTBEAT_PERIOD_US 50000 #define ARV_GV_DEVICE_HEARTBEAT_RETRY_DELAY_US 1000 #define ARV_GV_DEVICE_HEARTBEAT_RETRY_TIMEOUT_S 0.25 #else #define ARV_GV_DEVICE_GVCP_N_RETRIES_DEFAULT 5 #define ARV_GV_DEVICE_GVCP_TIMEOUT_MS_DEFAULT 500 #define ARV_GV_DEVICE_HEARTBEAT_PERIOD_US 1000000 #define ARV_GV_DEVICE_HEARTBEAT_RETRY_DELAY_US 10000 #define ARV_GV_DEVICE_HEARTBEAT_RETRY_TIMEOUT_S 5.0 /* FIXME */ #endif #define ARV_GV_DEVICE_GVSP_PACKET_SIZE_DEFAULT 1500 #define ARV_GV_DEVICE_BUFFER_SIZE 1024 typedef struct _ArvGvDeviceClass ArvGvDeviceClass; typedef struct _ArvGvDevicePrivate ArvGvDevicePrivate; struct _ArvGvDevice { ArvDevice device; ArvGvDevicePrivate *priv; }; struct _ArvGvDeviceClass { ArvDeviceClass parent_class; }; G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgvfakecamera.c000066400000000000000000000507401334570641500203070ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2017 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #include #include #include #include #include #include #include #include /** * SECTION: arvgvfakecamera * @short_description: GigE Vision Simulator * * #ArvGvFakeCamera is a class that simulates a real GigEVision camera. */ #define ARV_GV_FAKE_CAMERA_BUFFER_SIZE 65536 enum { PROP_0, PROP_INTERFACE_NAME, PROP_CM_DOMAIN }; static GObjectClass *parent_class = NULL; struct _ArvGvFakeCameraPrivate { char *interface_name; ArvFakeCamera *camera; GPollFD gvcp_fds[2]; guint n_gvcp_fds; GSocketAddress *controller_address; gint64 controller_time; GSocket *gvcp_socket; GSocket *gvsp_socket; GSocket *discovery_socket; GThread *thread; gboolean cancel; }; static gboolean _g_inet_socket_address_is_equal (GInetSocketAddress *a, GInetSocketAddress *b) { GInetAddress *a_addr; GInetAddress *b_addr; char *a_str; char *b_str; gboolean result; if (!G_IS_INET_SOCKET_ADDRESS (a) || !G_IS_INET_SOCKET_ADDRESS (b)) return FALSE; if (g_inet_socket_address_get_port (a) != g_inet_socket_address_get_port (b)) return FALSE; a_addr = g_inet_socket_address_get_address (a); b_addr = g_inet_socket_address_get_address (b); a_str = g_inet_address_to_string (a_addr); b_str = g_inet_address_to_string (b_addr); /* TODO: find a better way to do inet address comparison */ result = g_strcmp0 (a_str, b_str) == 0; g_free (a_str); g_free (b_str); return result; } gboolean handle_control_packet (ArvGvFakeCamera *gv_fake_camera, GSocket *socket, GSocketAddress *remote_address, ArvGvcpPacket *packet, size_t size) { ArvGvcpPacket *ack_packet = NULL; size_t ack_packet_size; guint32 block_address; guint32 block_size; guint16 packet_id; guint16 packet_type; guint32 register_address; guint32 register_value; gboolean write_access; gboolean success = FALSE; if (gv_fake_camera->priv->controller_address != NULL) { gint64 time; guint64 elapsed_ms; time = g_get_real_time (); elapsed_ms = (time - gv_fake_camera->priv->controller_time) / 1000; if (elapsed_ms > arv_fake_camera_get_heartbeat_timeout (gv_fake_camera->priv->camera)) { g_object_unref (gv_fake_camera->priv->controller_address); gv_fake_camera->priv->controller_address = NULL; write_access = TRUE; arv_warning_device ("[GvFakeCamera::handle_control_packet] Heartbeat timeout"); arv_fake_camera_set_control_channel_privilege (gv_fake_camera->priv->camera, 0); } else write_access = _g_inet_socket_address_is_equal (G_INET_SOCKET_ADDRESS (remote_address), G_INET_SOCKET_ADDRESS (gv_fake_camera->priv->controller_address)); } else write_access = TRUE; arv_gvcp_packet_debug (packet, ARV_DEBUG_LEVEL_LOG); packet_id = arv_gvcp_packet_get_packet_id (packet); packet_type = arv_gvcp_packet_get_packet_type (packet); if (packet_type != ARV_GVCP_PACKET_TYPE_CMD) { arv_warning_device ("[GvFakeCamera::handle_control_packet] Unknown packet type"); return FALSE; } switch (g_ntohs (packet->header.command)) { case ARV_GVCP_COMMAND_DISCOVERY_CMD: ack_packet = arv_gvcp_packet_new_discovery_ack (&ack_packet_size); arv_debug_device ("[GvFakeCamera::handle_control_packet] Discovery command"); arv_fake_camera_read_memory (gv_fake_camera->priv->camera, 0, ARV_GVBS_DISCOVERY_DATA_SIZE, &ack_packet->data); break; case ARV_GVCP_COMMAND_READ_MEMORY_CMD: arv_gvcp_packet_get_read_memory_cmd_infos (packet, &block_address, &block_size); arv_debug_device ("[GvFakeCamera::handle_control_packet] Read memory command %d (%d)", block_address, block_size); ack_packet = arv_gvcp_packet_new_read_memory_ack (block_address, block_size, packet_id, &ack_packet_size); arv_fake_camera_read_memory (gv_fake_camera->priv->camera, block_address, block_size, arv_gvcp_packet_get_read_memory_ack_data (ack_packet)); break; case ARV_GVCP_COMMAND_WRITE_MEMORY_CMD: arv_gvcp_packet_get_write_memory_cmd_infos (packet, &block_address, &block_size); if (!write_access) { arv_warning_device("[GvFakeCamera::handle_control_packet] Ignore Write memory command %d (%d) not controller", block_address, block_size); break; } arv_debug_device ("[GvFakeCamera::handle_control_packet] Write memory command %d (%d)", block_address, block_size); arv_fake_camera_write_memory (gv_fake_camera->priv->camera, block_address, block_size, arv_gvcp_packet_get_write_memory_cmd_data (packet)); ack_packet = arv_gvcp_packet_new_write_memory_ack (block_address, packet_id, &ack_packet_size); break; case ARV_GVCP_COMMAND_READ_REGISTER_CMD: arv_gvcp_packet_get_read_register_cmd_infos (packet, ®ister_address); arv_fake_camera_read_register (gv_fake_camera->priv->camera, register_address, ®ister_value); arv_debug_device ("[GvFakeCamera::handle_control_packet] Read register command %d -> %d", register_address, register_value); ack_packet = arv_gvcp_packet_new_read_register_ack (register_value, packet_id, &ack_packet_size); if (register_address == ARV_GVBS_CONTROL_CHANNEL_PRIVILEGE_OFFSET) gv_fake_camera->priv->controller_time = g_get_real_time (); break; case ARV_GVCP_COMMAND_WRITE_REGISTER_CMD: arv_gvcp_packet_get_write_register_cmd_infos (packet, ®ister_address, ®ister_value); if (!write_access) { arv_warning_device("[GvFakeCamera::handle_control_packet] Ignore Write register command %d (%d) not controller", register_address, register_value); break; } arv_fake_camera_write_register (gv_fake_camera->priv->camera, register_address, register_value); arv_debug_device ("[GvFakeCamera::handle_control_packet] Write register command %d -> %d", register_address, register_value); ack_packet = arv_gvcp_packet_new_write_register_ack (1, packet_id, &ack_packet_size); break; default: arv_warning_device ("[GvFakeCamera::handle_control_packet] Unknown command"); } if (ack_packet != NULL) { g_socket_send_to (socket, remote_address, (char *) ack_packet, ack_packet_size, NULL, NULL); arv_gvcp_packet_debug (ack_packet, ARV_DEBUG_LEVEL_LOG); g_free (ack_packet); success = TRUE; } if (gv_fake_camera->priv->controller_address == NULL && arv_fake_camera_get_control_channel_privilege (gv_fake_camera->priv->camera) != 0) { g_object_ref (remote_address); arv_debug_device("[GvFakeCamera::handle_control_packet] New controller"); gv_fake_camera->priv->controller_address = remote_address; gv_fake_camera->priv->controller_time = g_get_real_time (); } else if (gv_fake_camera->priv->controller_address != NULL && arv_fake_camera_get_control_channel_privilege (gv_fake_camera->priv->camera) == 0) { g_object_unref (gv_fake_camera->priv->controller_address); arv_debug_device("[GvFakeCamera::handle_control_packet] Controller releases"); gv_fake_camera->priv->controller_address = NULL; gv_fake_camera->priv->controller_time = g_get_real_time (); } return success; } void * _thread (void *user_data) { ArvGvFakeCamera *gv_fake_camera = user_data; ArvBuffer *image_buffer = NULL; GError *error = NULL; GSocketAddress *stream_address = NULL; void *packet_buffer; size_t packet_size; size_t payload = 0; guint16 block_id; ptrdiff_t offset; guint32 gv_packet_size; GInputVector input_vector; int n_events; gboolean is_streaming = FALSE; input_vector.buffer = g_malloc0 (ARV_GV_FAKE_CAMERA_BUFFER_SIZE); input_vector.size = ARV_GV_FAKE_CAMERA_BUFFER_SIZE; packet_buffer = g_malloc (ARV_GV_FAKE_CAMERA_BUFFER_SIZE); do { guint64 next_timestamp_us; guint64 sleep_time_us; if (is_streaming) { sleep_time_us = arv_fake_camera_get_sleep_time_for_next_frame (gv_fake_camera->priv->camera, &next_timestamp_us); } else { sleep_time_us = 100000; next_timestamp_us = g_get_real_time () + sleep_time_us; } do { gint timeout_ms; timeout_ms = MIN (100, (next_timestamp_us - g_get_real_time ()) / 1000LL); if (timeout_ms < 0) timeout_ms = 0; n_events = g_poll (gv_fake_camera->priv->gvcp_fds, 2, timeout_ms); if (n_events > 0) { GSocketAddress *remote_address = NULL; int count; count = g_socket_receive_message (gv_fake_camera->priv->gvcp_socket, &remote_address, &input_vector, 1, NULL, NULL, NULL, NULL, NULL); if (count > 0) { if (handle_control_packet (gv_fake_camera, gv_fake_camera->priv->gvcp_socket, remote_address, input_vector.buffer, count)) arv_debug_device ("[GvFakeCamera::thread] Control packet received"); } g_clear_object (&remote_address); if (gv_fake_camera->priv->discovery_socket != NULL) { count = g_socket_receive_message (gv_fake_camera->priv->discovery_socket, &remote_address, &input_vector, 1, NULL, NULL, NULL, NULL, NULL); if (count > 0) { if (handle_control_packet (gv_fake_camera, gv_fake_camera->priv->discovery_socket, remote_address, input_vector.buffer, count)) arv_debug_device ("[GvFakeCamera::thread]" " Control packet received on discovery socket\n"); } g_clear_object (&remote_address); } } } while (!g_atomic_int_get (&gv_fake_camera->priv->cancel) && g_get_real_time () < next_timestamp_us); if (arv_fake_camera_get_control_channel_privilege (gv_fake_camera->priv->camera) == 0 || arv_fake_camera_get_acquisition_status (gv_fake_camera->priv->camera) == 0) { if (stream_address != NULL) { g_object_unref (stream_address); stream_address = NULL; g_object_unref (image_buffer); image_buffer = NULL; arv_debug_stream_thread ("[GvFakeCamera::thread] Stop stream"); } is_streaming = FALSE; } else { if (stream_address == NULL) { GInetAddress *inet_address; char *inet_address_string; stream_address = arv_fake_camera_get_stream_address (gv_fake_camera->priv->camera); inet_address = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (stream_address)); inet_address_string = g_inet_address_to_string (inet_address); arv_debug_stream_thread ("[GvFakeCamera::thread] Start stream to %s (%d)", inet_address_string, g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (stream_address))); g_free (inet_address_string); payload = arv_fake_camera_get_payload (gv_fake_camera->priv->camera); image_buffer = arv_buffer_new (payload, NULL); } arv_fake_camera_fill_buffer (gv_fake_camera->priv->camera, image_buffer, &gv_packet_size); arv_debug_stream_thread ("[GvFakeCamera::thread] Send frame %d", image_buffer->priv->frame_id); block_id = 0; packet_size = ARV_GV_FAKE_CAMERA_BUFFER_SIZE; arv_gvsp_packet_new_data_leader (image_buffer->priv->frame_id, block_id, image_buffer->priv->timestamp_ns, image_buffer->priv->pixel_format, image_buffer->priv->width, image_buffer->priv->height, image_buffer->priv->x_offset, image_buffer->priv->y_offset, packet_buffer, &packet_size); g_socket_send_to (gv_fake_camera->priv->gvsp_socket, stream_address, packet_buffer, packet_size, NULL, &error); if (error != NULL) { arv_warning_stream_thread ("[GvFakeCamera::thread] Failed to send leader for frame %d: %s", image_buffer->priv->frame_id, error->message); g_clear_error (&error); } block_id++; offset = 0; while (offset < payload) { size_t data_size; data_size = MIN (gv_packet_size - ARV_GVSP_PACKET_PROTOCOL_OVERHEAD, payload - offset); packet_size = ARV_GV_FAKE_CAMERA_BUFFER_SIZE; arv_gvsp_packet_new_data_block (image_buffer->priv->frame_id, block_id, data_size, ((char *) image_buffer->priv->data) + offset, packet_buffer, &packet_size); g_socket_send_to (gv_fake_camera->priv->gvsp_socket, stream_address, packet_buffer, packet_size, NULL, &error); if (error != NULL) { arv_debug_stream_thread ("[GvFakeCamera::thread] Failed to send frame block %d for frame: %s", block_id, image_buffer->priv->frame_id, error->message); g_clear_error (&error); } offset += data_size; block_id++; } packet_size = ARV_GV_FAKE_CAMERA_BUFFER_SIZE; arv_gvsp_packet_new_data_trailer (image_buffer->priv->frame_id, block_id, packet_buffer, &packet_size); g_socket_send_to (gv_fake_camera->priv->gvsp_socket, stream_address, packet_buffer, packet_size, NULL, &error); if (error != NULL) { arv_debug_stream_thread ("[GvFakeCamera::thread] Failed to send trailer for frame %d: %s", image_buffer->priv->frame_id, error->message); g_clear_error (&error); } is_streaming = TRUE; } } while (!g_atomic_int_get (&gv_fake_camera->priv->cancel)); if (stream_address != NULL) g_object_unref (stream_address); if (image_buffer != NULL) g_object_unref (image_buffer); g_free (packet_buffer); g_free (input_vector.buffer); return NULL; } gboolean arv_gv_fake_camera_start (ArvGvFakeCamera *gv_fake_camera) { struct ifaddrs *ifap = NULL; struct ifaddrs *ifap_iter; int return_value; gboolean interface_found = FALSE; gboolean binding_error = FALSE; g_return_val_if_fail (ARV_IS_GV_FAKE_CAMERA (gv_fake_camera), FALSE); return_value = getifaddrs (&ifap); if (return_value < 0) { arv_warning_device ("[GvFakeCamera::start] No network interface found"); return FALSE; } for (ifap_iter = ifap ;ifap_iter != NULL && !interface_found; ifap_iter = ifap_iter->ifa_next) { if ((ifap_iter->ifa_flags & IFF_UP) != 0 && (ifap_iter->ifa_flags & IFF_POINTOPOINT) == 0 && (ifap_iter->ifa_addr->sa_family == AF_INET) && g_strcmp0 (ifap_iter->ifa_name, gv_fake_camera->priv->interface_name) == 0) { GSocketAddress *socket_address; GSocketAddress *inet_socket_address; GInetAddress *inet_address; char *gvcp_address_string; char *discovery_address_string; socket_address = g_socket_address_new_from_native (ifap_iter->ifa_addr, sizeof (struct sockaddr)); inet_address = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (socket_address)); gvcp_address_string = g_inet_address_to_string (inet_address); arv_debug_device ("[GvFakeCamera::start] Interface address = %s", gvcp_address_string); inet_socket_address = g_inet_socket_address_new (inet_address, ARV_GVCP_PORT); gv_fake_camera->priv->gvcp_socket = g_socket_new (G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_DATAGRAM, G_SOCKET_PROTOCOL_UDP, NULL); if (!g_socket_bind (gv_fake_camera->priv->gvcp_socket, inet_socket_address, FALSE, NULL)) binding_error = TRUE; g_socket_set_blocking (gv_fake_camera->priv->gvcp_socket, FALSE); arv_fake_camera_set_inet_address (gv_fake_camera->priv->camera, inet_address); g_object_unref (inet_socket_address); inet_socket_address = g_inet_socket_address_new (inet_address, 0); gv_fake_camera->priv->gvsp_socket = g_socket_new (G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_DATAGRAM, G_SOCKET_PROTOCOL_UDP, NULL); if (!g_socket_bind (gv_fake_camera->priv->gvsp_socket, inet_socket_address, FALSE, NULL)) binding_error = TRUE; g_clear_object (&inet_socket_address); g_clear_object (&socket_address); inet_address = g_inet_address_new_from_string ("255.255.255.255"); discovery_address_string = g_inet_address_to_string (inet_address); arv_debug_device ("[GvFakeCamera::start] Discovery address = %s", discovery_address_string); inet_socket_address = g_inet_socket_address_new (inet_address, ARV_GVCP_PORT); if (g_strcmp0 (gvcp_address_string, discovery_address_string) == 0) gv_fake_camera->priv->discovery_socket = NULL; else { gv_fake_camera->priv->discovery_socket = g_socket_new (G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_DATAGRAM, G_SOCKET_PROTOCOL_UDP, NULL); if (!g_socket_bind (gv_fake_camera->priv->discovery_socket, inet_socket_address, FALSE, NULL)) binding_error = TRUE; g_socket_set_blocking (gv_fake_camera->priv->discovery_socket, FALSE); } g_clear_object (&inet_socket_address); g_clear_object (&inet_address); g_free (gvcp_address_string); g_free (discovery_address_string); gv_fake_camera->priv->gvcp_fds[0].fd = g_socket_get_fd (gv_fake_camera->priv->gvcp_socket); gv_fake_camera->priv->gvcp_fds[0].events = G_IO_IN; gv_fake_camera->priv->gvcp_fds[0].revents = 0; if (gv_fake_camera->priv->discovery_socket != NULL) { gv_fake_camera->priv->gvcp_fds[1].fd = g_socket_get_fd (gv_fake_camera->priv->discovery_socket); gv_fake_camera->priv->gvcp_fds[1].events = G_IO_IN; gv_fake_camera->priv->gvcp_fds[1].revents = 0; gv_fake_camera->priv->n_gvcp_fds = 2; } else gv_fake_camera->priv->n_gvcp_fds = 1; interface_found = TRUE; } } freeifaddrs (ifap); if (binding_error) { g_clear_object (&gv_fake_camera->priv->gvcp_socket); g_clear_object (&gv_fake_camera->priv->gvsp_socket); g_clear_object (&gv_fake_camera->priv->discovery_socket); return FALSE; } if (!interface_found) { return FALSE; } gv_fake_camera->priv->cancel = FALSE; gv_fake_camera->priv->thread = g_thread_new ("arv_fake_gv_fake_camera", _thread, gv_fake_camera); return TRUE; } void arv_gv_fake_camera_stop (ArvGvFakeCamera *gv_fake_camera) { g_return_if_fail (ARV_IS_GV_FAKE_CAMERA (gv_fake_camera)); if (gv_fake_camera->priv->thread == NULL) return; g_atomic_int_set (&gv_fake_camera->priv->cancel, TRUE); g_thread_join (gv_fake_camera->priv->thread); gv_fake_camera->priv->thread = NULL; g_clear_object (&gv_fake_camera->priv->gvcp_socket); g_clear_object (&gv_fake_camera->priv->gvsp_socket); g_clear_object (&gv_fake_camera->priv->discovery_socket); g_clear_object (&gv_fake_camera->priv->controller_address); } ArvGvFakeCamera * arv_gv_fake_camera_new (const char *interface_name) { return g_object_new (ARV_TYPE_GV_FAKE_CAMERA, "interface-name", interface_name, NULL); } static void _set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { ArvGvFakeCamera *gv_fake_camera = ARV_GV_FAKE_CAMERA (object); switch (prop_id) { case PROP_INTERFACE_NAME: g_free (gv_fake_camera->priv->interface_name); gv_fake_camera->priv->interface_name = g_value_dup_string (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void arv_gv_fake_camera_init (ArvGvFakeCamera *gv_fake_camera) { gv_fake_camera->priv = G_TYPE_INSTANCE_GET_PRIVATE (gv_fake_camera, ARV_TYPE_GV_FAKE_CAMERA, ArvGvFakeCameraPrivate); gv_fake_camera->priv->interface_name = g_strdup ("lo"); } static void _constructed (GObject *gobject) { ArvGvFakeCamera *gv_fake_camera = ARV_GV_FAKE_CAMERA (gobject); parent_class->constructed (gobject); gv_fake_camera->priv->camera = arv_fake_camera_new ("GV01"); } static void _finalize (GObject *object) { ArvGvFakeCamera *gv_fake_camera = ARV_GV_FAKE_CAMERA (object); g_object_unref (gv_fake_camera->priv->camera); g_free (gv_fake_camera->priv->interface_name); parent_class->finalize (object); } static void arv_gv_fake_camera_class_init (ArvGvFakeCameraClass *this_class) { GObjectClass *object_class = G_OBJECT_CLASS (this_class); g_type_class_add_private (this_class, sizeof (ArvGvFakeCameraPrivate)); parent_class = g_type_class_peek_parent (this_class); object_class->set_property = _set_property; object_class->constructed = _constructed; object_class->finalize = _finalize; g_object_class_install_property (object_class, PROP_INTERFACE_NAME, g_param_spec_string ("interface-name", "Interface name", "Interface name", NULL, G_PARAM_CONSTRUCT_ONLY| G_PARAM_WRITABLE| G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); } G_DEFINE_TYPE (ArvGvFakeCamera, arv_gv_fake_camera, G_TYPE_OBJECT) aravis-ARAVIS_0_6_0/src/arvgvfakecamera.h000066400000000000000000000043771334570641500203210ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #ifndef ARV_GV_FAKE_CAMERA_H #define ARV_GV_FAKE_CAMERA_H #include G_BEGIN_DECLS #define ARV_TYPE_GV_FAKE_CAMERA (arv_gv_fake_camera_get_type ()) #define ARV_GV_FAKE_CAMERA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GV_FAKE_CAMERA, ArvGvFakeCamera)) #define ARV_GV_FAKE_CAMERA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GV_FAKE_CAMERA, ArvGvFakeCameraClass)) #define ARV_IS_GV_FAKE_CAMERA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GV_FAKE_CAMERA)) #define ARV_IS_GV_FAKE_CAMERA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GV_FAKE_CAMERA)) #define ARV_GV_FAKE_CAMERA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GV_FAKE_CAMERA, ArvGvFakeCameraClass)) typedef struct _ArvGvFakeCameraPrivate ArvGvFakeCameraPrivate; typedef struct _ArvGvFakeCameraClass ArvGvFakeCameraClass; struct _ArvGvFakeCamera { GObject object; ArvGvFakeCameraPrivate *priv; }; struct _ArvGvFakeCameraClass { GObjectClass parent_class; }; GType arv_gv_fake_camera_get_type (void); ArvGvFakeCamera * arv_gv_fake_camera_new (const char *interface_name); gboolean arv_gv_fake_camera_start (ArvGvFakeCamera *gv_fake_camera); void arv_gv_fake_camera_stop (ArvGvFakeCamera *gv_fake_camera); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgvinterface.c000066400000000000000000000515511334570641500201710ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgvinterface * @short_description: GigEVision interface */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* ArvGvDiscoverSocket implementation */ typedef struct { GSocketAddress *interface_address; GSocket *socket; } ArvGvDiscoverSocket; static gboolean arv_gv_discover_socket_set_broadcast (ArvGvDiscoverSocket *discover_socket, gboolean enable) { int socket_fd; int result; socket_fd = g_socket_get_fd (discover_socket->socket); result = setsockopt (socket_fd, SOL_SOCKET, SO_BROADCAST, (char*)&enable, sizeof (enable)); return result == 0; } typedef struct { unsigned int n_sockets; GSList *sockets; GPollFD *poll_fds; } ArvGvDiscoverSocketList; static ArvGvDiscoverSocketList * arv_gv_discover_socket_list_new (void) { ArvGvDiscoverSocketList *socket_list; GSList *iter; struct ifaddrs *ifap = NULL; struct ifaddrs *ifap_iter; int i; socket_list = g_new0 (ArvGvDiscoverSocketList, 1); if (getifaddrs (&ifap) < 0) return socket_list; for (ifap_iter = ifap; ifap_iter != NULL; ifap_iter = ifap_iter->ifa_next) { if ((ifap_iter->ifa_flags & IFF_UP) != 0 && (ifap_iter->ifa_flags & IFF_POINTOPOINT) == 0 && (ifap_iter->ifa_addr != NULL) && (ifap_iter->ifa_addr->sa_family == AF_INET)) { ArvGvDiscoverSocket *discover_socket = g_new0 (ArvGvDiscoverSocket, 1); GSocketAddress *socket_address; GInetAddress *inet_address; char *inet_address_string; GError *error = NULL; socket_address = g_socket_address_new_from_native (ifap_iter->ifa_addr, sizeof (struct sockaddr)); inet_address = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (socket_address)); inet_address_string = g_inet_address_to_string (inet_address); arv_debug_interface ("[GvDiscoverSocket::new] Add interface %s", inet_address_string); g_free (inet_address_string); discover_socket->interface_address = g_inet_socket_address_new (inet_address, 0); g_object_unref (socket_address); discover_socket->socket = g_socket_new (G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_DATAGRAM, G_SOCKET_PROTOCOL_UDP, NULL); g_socket_bind (discover_socket->socket, discover_socket->interface_address, FALSE, &error); socket_list->sockets = g_slist_prepend (socket_list->sockets, discover_socket); socket_list->n_sockets++; } } freeifaddrs (ifap); socket_list->poll_fds = g_new (GPollFD, socket_list->n_sockets); for (i = 0, iter = socket_list->sockets; iter != NULL; i++, iter = iter->next) { ArvGvDiscoverSocket *discover_socket = iter->data; socket_list->poll_fds[i].fd = g_socket_get_fd (discover_socket->socket); socket_list->poll_fds[i].events = G_IO_IN; socket_list->poll_fds[i].revents = 0; } return socket_list; } static void arv_gv_discover_socket_list_free (ArvGvDiscoverSocketList *socket_list) { GSList *iter; g_return_if_fail (socket_list != NULL); for (iter = socket_list->sockets; iter != NULL; iter = iter->next) { ArvGvDiscoverSocket *discover_socket = iter->data; g_object_unref (discover_socket->interface_address); g_object_unref (discover_socket->socket); g_free (discover_socket); } g_slist_free (socket_list->sockets); g_free (socket_list->poll_fds); socket_list->sockets = NULL; socket_list->n_sockets = 0; socket_list->poll_fds = NULL; g_free (socket_list); } static void arv_gv_discover_socket_list_send_discover_packet (ArvGvDiscoverSocketList *socket_list) { GInetAddress *broadcast_address; GSocketAddress *broadcast_socket_address; ArvGvcpPacket *packet; GSList *iter; size_t size; packet = arv_gvcp_packet_new_discovery_cmd (&size); broadcast_address = g_inet_address_new_from_string ("255.255.255.255"); broadcast_socket_address = g_inet_socket_address_new (broadcast_address, ARV_GVCP_PORT); g_object_unref (broadcast_address); for (iter = socket_list->sockets; iter != NULL; iter = iter->next) { ArvGvDiscoverSocket *discover_socket = iter->data; GError *error = NULL; arv_gv_discover_socket_set_broadcast (discover_socket, TRUE); g_socket_send_to (discover_socket->socket, broadcast_socket_address, (const char *) packet, size, NULL, &error); if (error != NULL) { arv_warning_interface ("[ArvGVInterface::send_discover_packet] Error: %s", error->message); g_error_free (error); } arv_gv_discover_socket_set_broadcast (discover_socket, FALSE); } g_object_unref (broadcast_socket_address); arv_gvcp_packet_free (packet); } /* ArvGvInterfaceDeviceInfos implementation */ typedef struct { char *id; char *user_id; char *vendor_serial; char *vendor_alias_serial; char *vendor; char *model; char *serial; char *mac; GInetAddress *interface_address; guchar discovery_data[ARV_GVBS_DISCOVERY_DATA_SIZE]; volatile gint ref_count; } ArvGvInterfaceDeviceInfos; static ArvGvInterfaceDeviceInfos * arv_gv_interface_device_infos_new (GInetAddress *interface_address, void *discovery_data) { ArvGvInterfaceDeviceInfos *infos; g_return_val_if_fail (G_IS_INET_ADDRESS (interface_address), NULL); g_return_val_if_fail (discovery_data != NULL, NULL); g_object_ref (interface_address); infos = g_new0 (ArvGvInterfaceDeviceInfos, 1); memcpy (infos->discovery_data, discovery_data, ARV_GVBS_DISCOVERY_DATA_SIZE); infos->vendor = g_strndup ((char *) &infos->discovery_data[ARV_GVBS_MANUFACTURER_NAME_OFFSET], ARV_GVBS_MANUFACTURER_NAME_SIZE); infos->model = g_strndup ((char *) &infos->discovery_data[ARV_GVBS_MODEL_NAME_OFFSET], ARV_GVBS_MODEL_NAME_SIZE); infos->serial = g_strndup ((char *) &infos->discovery_data[ARV_GVBS_SERIAL_NUMBER_OFFSET], ARV_GVBS_SERIAL_NUMBER_SIZE); infos->user_id = g_strndup ((char *) &infos->discovery_data[ARV_GVBS_USER_DEFINED_NAME_OFFSET], ARV_GVBS_USER_DEFINED_NAME_SIZE); infos->id = g_strdup_printf ("%s-%s-%s", infos->vendor, infos->model, infos->serial); arv_str_strip (infos->id, ARV_DEVICE_NAME_ILLEGAL_CHARACTERS, ARV_DEVICE_NAME_REPLACEMENT_CHARACTER); infos->vendor_alias_serial = g_strdup_printf ("%s-%s", arv_vendor_alias_lookup (infos->vendor), infos->serial); arv_str_strip (infos->vendor_alias_serial, ARV_DEVICE_NAME_ILLEGAL_CHARACTERS, ARV_DEVICE_NAME_REPLACEMENT_CHARACTER); infos->vendor_serial = g_strdup_printf ("%s-%s", infos->vendor, infos->serial); arv_str_strip (infos->vendor_serial, ARV_DEVICE_NAME_ILLEGAL_CHARACTERS, ARV_DEVICE_NAME_REPLACEMENT_CHARACTER); infos->interface_address = interface_address; infos->mac = g_strdup_printf ("%02x:%02x:%02x:%02x:%02x:%02x", infos->discovery_data[ARV_GVBS_DEVICE_MAC_ADDRESS_HIGH_OFFSET + 2], infos->discovery_data[ARV_GVBS_DEVICE_MAC_ADDRESS_HIGH_OFFSET + 3], infos->discovery_data[ARV_GVBS_DEVICE_MAC_ADDRESS_HIGH_OFFSET + 4], infos->discovery_data[ARV_GVBS_DEVICE_MAC_ADDRESS_HIGH_OFFSET + 5], infos->discovery_data[ARV_GVBS_DEVICE_MAC_ADDRESS_HIGH_OFFSET + 6], infos->discovery_data[ARV_GVBS_DEVICE_MAC_ADDRESS_HIGH_OFFSET + 7]); infos->ref_count = 1; return infos; } static ArvGvInterfaceDeviceInfos * arv_gv_interface_device_infos_ref (ArvGvInterfaceDeviceInfos *infos) { g_return_val_if_fail (infos != NULL, NULL); g_return_val_if_fail (g_atomic_int_get (&infos->ref_count) > 0, NULL); g_atomic_int_inc (&infos->ref_count); return infos; } static void arv_gv_interface_device_infos_unref (ArvGvInterfaceDeviceInfos *infos) { g_return_if_fail (infos != NULL); g_return_if_fail (g_atomic_int_get (&infos->ref_count) > 0); if (g_atomic_int_dec_and_test (&infos->ref_count)) { g_object_unref (infos->interface_address); g_free (infos->id); g_free (infos->user_id); g_free (infos->vendor_serial); g_free (infos->vendor_alias_serial); g_free (infos->vendor); g_free (infos->model); g_free (infos->serial); g_free (infos->mac); g_free (infos); } } /* ArvGvInterface implementation */ static GObjectClass *parent_class = NULL; struct _ArvGvInterfacePrivate { GHashTable *devices; }; static ArvGvInterfaceDeviceInfos * _discover (GHashTable *devices, const char *device_id) { ArvGvDiscoverSocketList *socket_list; GSList *iter; char buffer[ARV_GV_INTERFACE_SOCKET_BUFFER_SIZE]; int count; int i; g_assert (devices == NULL || device_id == NULL); if (devices != NULL) g_hash_table_remove_all (devices); socket_list = arv_gv_discover_socket_list_new (); if (socket_list->n_sockets < 1) { arv_gv_discover_socket_list_free (socket_list); return NULL; } arv_gv_discover_socket_list_send_discover_packet (socket_list); do { if (g_poll (socket_list->poll_fds, socket_list->n_sockets, ARV_GV_INTERFACE_DISCOVERY_TIMEOUT_MS) == 0) { arv_gv_discover_socket_list_free (socket_list); return NULL; } for (i = 0, iter = socket_list->sockets; iter != NULL; i++, iter = iter->next) { ArvGvDiscoverSocket *discover_socket = iter->data; do { g_socket_set_blocking (discover_socket->socket, FALSE); count = g_socket_receive (discover_socket->socket, buffer, ARV_GV_INTERFACE_SOCKET_BUFFER_SIZE, NULL, NULL); g_socket_set_blocking (discover_socket->socket, TRUE); if (count > 0) { ArvGvcpPacket *packet = (ArvGvcpPacket *) buffer; if (g_ntohs (packet->header.command) == ARV_GVCP_COMMAND_DISCOVERY_ACK && g_ntohs (packet->header.id) == 0xffff) { ArvGvInterfaceDeviceInfos *device_infos; GInetAddress *interface_address; char *address_string; char *data = buffer + sizeof (ArvGvcpHeader); arv_gvcp_packet_debug (packet, ARV_DEBUG_LEVEL_LOG); interface_address = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (discover_socket->interface_address)); device_infos = arv_gv_interface_device_infos_new (interface_address, data); address_string = g_inet_address_to_string (interface_address); arv_debug_interface ("[GvInterface::discovery] Device '%s' found " "(interface %s) user_id '%s' - MAC '%s'", device_infos->id, address_string, device_infos->user_id, device_infos->mac); g_free (address_string); if (devices != NULL) { if (device_infos->id != NULL && device_infos->id[0] != '\0') g_hash_table_replace (devices, device_infos->id, arv_gv_interface_device_infos_ref (device_infos)); if (device_infos->user_id != NULL && device_infos->user_id[0] != '\0') g_hash_table_replace (devices, device_infos->user_id, arv_gv_interface_device_infos_ref (device_infos)); if (device_infos->vendor_serial != NULL && device_infos->vendor_serial[0] != '\0') g_hash_table_replace (devices, device_infos->vendor_serial, arv_gv_interface_device_infos_ref (device_infos)); if (device_infos->vendor_alias_serial != NULL && device_infos->vendor_alias_serial[0] != '\0') g_hash_table_replace (devices, device_infos->vendor_alias_serial, arv_gv_interface_device_infos_ref (device_infos)); g_hash_table_replace (devices, device_infos->mac, arv_gv_interface_device_infos_ref (device_infos)); } else { if (device_id == NULL || g_strcmp0 (device_infos->id, device_id) == 0 || g_strcmp0 (device_infos->user_id, device_id) == 0 || g_strcmp0 (device_infos->vendor_serial, device_id) == 0 || g_strcmp0 (device_infos->vendor_alias_serial, device_id) == 0 || g_strcmp0 (device_infos->mac, device_id) == 0) { arv_gv_discover_socket_list_free (socket_list); return device_infos; } } arv_gv_interface_device_infos_unref (device_infos); } } } while (count > 0); } } while (1); } static void arv_gv_interface_discover (ArvGvInterface *gv_interface) { _discover (gv_interface->priv->devices, NULL); } static GInetAddress * _device_infos_to_ginetaddress (ArvGvInterfaceDeviceInfos *device_infos) { GInetAddress *device_address; device_address = g_inet_address_new_from_bytes (&device_infos->discovery_data[ARV_GVBS_CURRENT_IP_ADDRESS_OFFSET], G_SOCKET_FAMILY_IPV4); return device_address; } static void arv_gv_interface_update_device_list (ArvInterface *interface, GArray *device_ids) { ArvGvInterface *gv_interface; GHashTableIter iter; gpointer key, value; g_assert (device_ids->len == 0); gv_interface = ARV_GV_INTERFACE (interface); arv_gv_interface_discover (gv_interface); g_hash_table_iter_init (&iter, gv_interface->priv->devices); while (g_hash_table_iter_next (&iter, &key, &value)) { ArvGvInterfaceDeviceInfos *infos = value; if (g_strcmp0 (key, infos->id) == 0) { ArvInterfaceDeviceIds *ids; GInetAddress *device_address; device_address = _device_infos_to_ginetaddress (infos); ids = g_new0 (ArvInterfaceDeviceIds, 1); ids->device = g_strdup (key); ids->physical = g_strdup (infos->mac); ids->address = g_inet_address_to_string (device_address); ids->vendor = g_strdup (infos->vendor); ids->model = g_strdup (infos->model); ids->serial_nbr = g_strdup (infos->serial); g_array_append_val (device_ids, ids); g_object_unref (device_address); } } } static GInetAddress * arv_gv_interface_camera_locate (ArvGvInterface *gv_interface, GInetAddress *device_address) { ArvGvDiscoverSocketList *socket_list; ArvGvcpPacket *packet; char buffer[ARV_GV_INTERFACE_SOCKET_BUFFER_SIZE]; GSList *iter; GSocketAddress *device_socket_address; size_t size; int i, count; socket_list = arv_gv_discover_socket_list_new (); if (socket_list->n_sockets < 1) { arv_gv_discover_socket_list_free (socket_list); return NULL; } /* Just read a random register from the camera socket */ packet = arv_gvcp_packet_new_read_register_cmd (ARV_GVBS_N_STREAM_CHANNELS_OFFSET, 0, &size); device_socket_address = g_inet_socket_address_new (device_address, ARV_GVCP_PORT); for (iter = socket_list->sockets; iter != NULL; iter = iter->next) { ArvGvDiscoverSocket *socket = iter->data; GError *error = NULL; g_socket_send_to (socket->socket, device_socket_address, (const char *) packet, size, NULL, &error); if (error != NULL) { arv_warning_interface ("[ArvGVInterface::arv_gv_interface_camera_locate] Error: %s", error->message); g_error_free (error); } } arv_gvcp_packet_free (packet); do { /* Now parse the result */ if (g_poll (socket_list->poll_fds, socket_list->n_sockets, ARV_GV_INTERFACE_DISCOVERY_TIMEOUT_MS) == 0) { arv_gv_discover_socket_list_free (socket_list); return NULL; } for (i = 0, iter = socket_list->sockets; iter != NULL; i++, iter = iter->next) { ArvGvDiscoverSocket *socket = iter->data; do { g_socket_set_blocking (socket->socket, FALSE); count = g_socket_receive (socket->socket, buffer, ARV_GV_INTERFACE_SOCKET_BUFFER_SIZE, NULL, NULL); g_socket_set_blocking (socket->socket, TRUE); if (count > 0) { ArvGvcpPacket *packet = (ArvGvcpPacket *) buffer; if (g_ntohs (packet->header.command) == ARV_GVCP_COMMAND_READ_REGISTER_CMD || g_ntohs (packet->header.command) == ARV_GVCP_COMMAND_READ_REGISTER_ACK) { GInetAddress *interface_address = g_inet_socket_address_get_address( G_INET_SOCKET_ADDRESS (socket->interface_address)); g_object_ref(interface_address); arv_gv_discover_socket_list_free (socket_list); return interface_address; } } } while (count > 0); } } while (1); arv_gv_discover_socket_list_free (socket_list); return NULL; } static ArvDevice * _open_device (ArvInterface *interface, GHashTable *devices, const char *device_id) { ArvGvInterface *gv_interface; ArvDevice *device = NULL; ArvGvInterfaceDeviceInfos *device_infos; GInetAddress *device_address; gv_interface = ARV_GV_INTERFACE (interface); if (device_id == NULL) { GList *device_list; device_list = g_hash_table_get_values (devices); device_infos = device_list != NULL ? device_list->data : NULL; g_list_free (device_list); } else device_infos = g_hash_table_lookup (devices, device_id); if (device_infos == NULL) { struct addrinfo hints; struct addrinfo *servinfo, *endpoint; if (device_id == NULL) return NULL; /* Try if device_id is a hostname/IP address */ memset(&hints, 0, sizeof (hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_DGRAM; if (getaddrinfo(device_id, "3956", &hints, &servinfo) != 0) { return NULL; } for (endpoint=servinfo; endpoint!=NULL; endpoint=endpoint->ai_next) { char ipstr[INET_ADDRSTRLEN]; struct sockaddr_in *ip = (struct sockaddr_in *) endpoint->ai_addr; inet_ntop (endpoint->ai_family, &ip->sin_addr, ipstr, sizeof (ipstr)); device_address = g_inet_address_new_from_string (ipstr); if (device_address != NULL) { /* Try and find an interface that the camera will respond on */ GInetAddress *interface_address = arv_gv_interface_camera_locate (gv_interface, device_address); if (interface_address != NULL) { device = arv_gv_device_new (interface_address, device_address); g_object_unref (interface_address); } } g_object_unref (device_address); if (device != NULL) { break; } } freeaddrinfo (servinfo); return device; } device_address = _device_infos_to_ginetaddress (device_infos); device = arv_gv_device_new (device_infos->interface_address, device_address); g_object_unref (device_address); return device; } static ArvDevice * arv_gv_interface_open_device (ArvInterface *interface, const char *device_id) { ArvDevice *device; ArvGvInterfaceDeviceInfos *device_infos; device = _open_device (interface, ARV_GV_INTERFACE (interface)->priv->devices, device_id); if (ARV_IS_DEVICE (device)) return device; device_infos = _discover (NULL, device_id); if (device_infos != NULL) { GInetAddress *device_address; device_address = _device_infos_to_ginetaddress (device_infos); device = arv_gv_device_new (device_infos->interface_address, device_address); g_object_unref (device_address); arv_gv_interface_device_infos_unref (device_infos); return device; } return NULL; } static ArvInterface *gv_interface = NULL; static GMutex gv_interface_mutex; /** * arv_gv_interface_get_instance: * * Gets the unique instance of the GV interface. * * Returns: (transfer none): a #ArvInterface singleton. */ ArvInterface * arv_gv_interface_get_instance (void) { g_mutex_lock (&gv_interface_mutex); if (gv_interface == NULL) gv_interface = g_object_new (ARV_TYPE_GV_INTERFACE, NULL); g_mutex_unlock (&gv_interface_mutex); return ARV_INTERFACE (gv_interface); } void arv_gv_interface_destroy_instance (void) { g_mutex_lock (&gv_interface_mutex); if (gv_interface != NULL) { g_object_unref (gv_interface); gv_interface = NULL; } g_mutex_unlock (&gv_interface_mutex); } static void arv_gv_interface_init (ArvGvInterface *gv_interface) { gv_interface->priv = G_TYPE_INSTANCE_GET_PRIVATE (gv_interface, ARV_TYPE_GV_INTERFACE, ArvGvInterfacePrivate); gv_interface->priv->devices = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) arv_gv_interface_device_infos_unref); } static void arv_gv_interface_finalize (GObject *object) { ArvGvInterface *gv_interface = ARV_GV_INTERFACE (object); g_hash_table_unref (gv_interface->priv->devices); gv_interface->priv->devices = NULL; parent_class->finalize (object); } static void arv_gv_interface_class_init (ArvGvInterfaceClass *gv_interface_class) { GObjectClass *object_class = G_OBJECT_CLASS (gv_interface_class); ArvInterfaceClass *interface_class = ARV_INTERFACE_CLASS (gv_interface_class); g_type_class_add_private (gv_interface_class, sizeof (ArvGvInterfacePrivate)); parent_class = g_type_class_peek_parent (gv_interface_class); object_class->finalize = arv_gv_interface_finalize; interface_class->update_device_list = arv_gv_interface_update_device_list; interface_class->open_device = arv_gv_interface_open_device; interface_class->protocol = "GigEVision"; } G_DEFINE_TYPE (ArvGvInterface, arv_gv_interface, ARV_TYPE_INTERFACE) aravis-ARAVIS_0_6_0/src/arvgvinterface.h000066400000000000000000000035221334570641500201710ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GV_INTERFACE_H #define ARV_GV_INTERFACE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS #define ARV_TYPE_GV_INTERFACE (arv_gv_interface_get_type ()) #define ARV_GV_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GV_INTERFACE, ArvGvInterface)) #define ARV_GV_INTERFACE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GV_INTERFACE, ArvGvInterfaceClass)) #define ARV_IS_GV_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GV_INTERFACE)) #define ARV_IS_GV_INTERFACE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GV_INTERFACE)) #define ARV_GV_INTERFACE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GV_INTERFACE, ArvGvInterfaceClass)) GType arv_gv_interface_get_type (void); ArvInterface * arv_gv_interface_get_instance (void); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgvinterfaceprivate.h000066400000000000000000000030661334570641500215670ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GV_INTERFACE_PRIVATE_H #define ARV_GV_INTERFACE_PRIVATE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS #define ARV_GV_INTERFACE_DISCOVERY_TIMEOUT_MS 1000 #define ARV_GV_INTERFACE_SOCKET_BUFFER_SIZE 1024 typedef struct _ArvGvInterfacePrivate ArvGvInterfacePrivate; typedef struct _ArvGvInterfaceClass ArvGvInterfaceClass; struct _ArvGvInterface { ArvInterface interface; ArvGvInterfacePrivate *priv; }; struct _ArvGvInterfaceClass { ArvInterfaceClass parent_class; }; void arv_gv_interface_destroy_instance (void); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgvsp.c000066400000000000000000000154421334570641500166520ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgvsp * @short_description: GigEVision stream packet handling */ #include #include #include #include #include static ArvGvspPacket * arv_gvsp_packet_new (ArvGvspContentType content_type, guint16 frame_id, guint32 packet_id, size_t data_size, void *buffer, size_t *buffer_size) { ArvGvspPacket *packet; size_t packet_size; packet_size = sizeof (ArvGvspPacket) + data_size; if (packet_size == 0 || (buffer != NULL && (buffer_size == NULL || packet_size > *buffer_size))) return NULL; if (buffer_size != NULL) *buffer_size = packet_size; if (buffer != NULL) packet = buffer; else packet = g_malloc (packet_size); packet->header.packet_type = 0; packet->header.frame_id = g_htons (frame_id); packet->header.packet_infos = g_htonl ((packet_id & ARV_GVSP_PACKET_INFOS_ID_MASK) | ((content_type << ARV_GVSP_PACKET_INFOS_CONTENT_TYPE_POS) & ARV_GVSP_PACKET_INFOS_CONTENT_TYPE_MASK)); return packet; } ArvGvspPacket * arv_gvsp_packet_new_data_leader (guint16 frame_id, guint32 packet_id, guint64 timestamp, ArvPixelFormat pixel_format, guint32 width, guint32 height, guint32 x_offset, guint32 y_offset, void *buffer, size_t *buffer_size) { ArvGvspPacket *packet; packet = arv_gvsp_packet_new (ARV_GVSP_CONTENT_TYPE_DATA_LEADER, frame_id, packet_id, sizeof (ArvGvspDataLeader), buffer, buffer_size); if (packet != NULL) { ArvGvspDataLeader *leader; leader = (ArvGvspDataLeader *) &packet->data; leader->flags = 0; leader->payload_type = g_htons (ARV_GVSP_PAYLOAD_TYPE_IMAGE); leader->timestamp_high = g_htonl (((guint64) timestamp >> 32)); leader->timestamp_low = g_htonl ((guint64) timestamp & 0xffffffff); leader->pixel_format = g_htonl (pixel_format); leader->width = g_htonl (width); leader->height = g_htonl (height); leader->x_offset = g_htonl (x_offset); leader->y_offset = g_htonl (y_offset); } return packet; } ArvGvspPacket * arv_gvsp_packet_new_data_trailer (guint16 frame_id, guint32 packet_id, void *buffer, size_t *buffer_size) { ArvGvspPacket *packet; packet = arv_gvsp_packet_new (ARV_GVSP_CONTENT_TYPE_DATA_TRAILER, frame_id, packet_id, sizeof (ArvGvspDataTrailer), buffer, buffer_size); if (packet != NULL) { ArvGvspDataTrailer *trailer; trailer = (ArvGvspDataTrailer *) &packet->data; trailer->payload_type = g_htonl (ARV_GVSP_PAYLOAD_TYPE_IMAGE); trailer->data0 = 0; } return packet; } ArvGvspPacket * arv_gvsp_packet_new_data_block (guint16 frame_id, guint32 packet_id, size_t size, void *data, void *buffer, size_t *buffer_size) { ArvGvspPacket *packet; packet = arv_gvsp_packet_new (ARV_GVSP_CONTENT_TYPE_DATA_BLOCK, frame_id, packet_id, size, buffer, buffer_size); if (packet != NULL) memcpy (&packet->data, data, size); return packet; } static const char * arv_enum_to_string (GType type, guint enum_value) { GEnumClass *enum_class; GEnumValue *value; const char *retval = NULL; enum_class = g_type_class_ref (type); value = g_enum_get_value (enum_class, enum_value); if (value) retval = value->value_nick; g_type_class_unref (enum_class); return retval; } static const char * arv_gvsp_packet_type_to_string (ArvGvspPacketType value) { return arv_enum_to_string (ARV_TYPE_GVSP_PACKET_TYPE, value); } static const char * arv_gvsp_content_type_to_string (ArvGvspContentType value) { return arv_enum_to_string (ARV_TYPE_GVSP_CONTENT_TYPE, value); } char * arv_gvsp_packet_to_string (const ArvGvspPacket *packet, size_t packet_size) { ArvGvspDataLeader *leader; ArvGvspPacketType packet_type; ArvGvspContentType content_type; GString *string; char *c_string; string = g_string_new (""); packet_type = arv_gvsp_packet_get_packet_type (packet); content_type = arv_gvsp_packet_get_content_type (packet); g_string_append_printf (string, "packet_type = %8s (0x%04x)\n", arv_gvsp_packet_type_to_string (packet_type), packet_type); g_string_append_printf (string, "content_type = %8s (0x%04x)\n", arv_gvsp_content_type_to_string (content_type), content_type); switch (content_type) { case ARV_GVSP_CONTENT_TYPE_DATA_LEADER: leader = (ArvGvspDataLeader *) &packet->data; switch (g_ntohl (leader->payload_type)) { case ARV_GVSP_PAYLOAD_TYPE_IMAGE: g_string_append (string, "payload_type = image\n"); break; case ARV_GVSP_PAYLOAD_TYPE_CHUNK_DATA: g_string_append (string, "payload_type = chunk\n"); break; case ARV_GVSP_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA: g_string_append (string, "payload_type = extended chunk\n"); break; case ARV_GVSP_PAYLOAD_TYPE_H264: g_string_append (string, "payload_type = h264\n"); break; default: g_string_append (string, "payload_type = unknown\n"); break; } g_string_append_printf (string, "pixel format = %s\n", arv_pixel_format_to_gst_caps_string (g_ntohl (leader->pixel_format))); g_string_append_printf (string, "width = %d\n", g_ntohl (leader->width)); g_string_append_printf (string, "height = %d\n", g_ntohl (leader->height)); g_string_append_printf (string, "x_offset = %d\n", g_ntohl (leader->x_offset)); g_string_append_printf (string, "y_offset = %d\n", g_ntohl (leader->y_offset)); break; case ARV_GVSP_CONTENT_TYPE_DATA_TRAILER: break; case ARV_GVSP_CONTENT_TYPE_DATA_BLOCK: break; } c_string = string->str; g_string_free (string, FALSE); return c_string; } void arv_gvsp_packet_debug (const ArvGvspPacket *packet, size_t packet_size, ArvDebugLevel level) { char *string; if (!arv_debug_check (&arv_debug_category_sp, level)) return; string = arv_gvsp_packet_to_string (packet, packet_size); switch (level) { case ARV_DEBUG_LEVEL_LOG: arv_log_sp ("%s", string); break; case ARV_DEBUG_LEVEL_DEBUG: arv_debug_sp ("%s", string); break; case ARV_DEBUG_LEVEL_WARNING: arv_warning_sp ("%s", string); break; default: break; } g_free (string); } aravis-ARAVIS_0_6_0/src/arvgvsp.h000066400000000000000000000212761334570641500166610ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GVSP_H #define ARV_GVSP_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS #define ARV_GVSP_PACKET_INFOS_ID_MASK 0x00ffffff #define ARV_GVSP_PACKET_INFOS_CONTENT_TYPE_MASK 0xff000000 #define ARV_GVSP_PACKET_INFOS_CONTENT_TYPE_POS 24 #define ARV_GVSP_PACKET_PROTOCOL_OVERHEAD (20 + 8 + 8) /* IP + UDP + GVSP headers */ /** * ArvGvspPacketType: * @ARV_GVSP_PACKET_TYPE_OK: valid packet * @ARV_GVSP_PACKET_TYPE_RESEND: resent packet (BlackFly PointGrey camera support) * @ARV_GVSP_PACKET_TYPE_ERROR: error packet, indicating invalid resend request */ typedef enum { ARV_GVSP_PACKET_TYPE_OK = 0x0000, ARV_GVSP_PACKET_TYPE_RESEND = 0x0100, ARV_GVSP_PACKET_TYPE_ERROR = 0x800c } ArvGvspPacketType; /** * ArvGvspContentType: * @ARV_GVSP_CONTENT_TYPE_DATA_LEADER: leader packet * @ARV_GVSP_CONTENT_TYPE_DATA_TRAILER: trailer packet * @ARV_GVSP_CONTENT_TYPE_DATA_BLOCK: data packet */ typedef enum { ARV_GVSP_CONTENT_TYPE_DATA_LEADER = 0x01, ARV_GVSP_CONTENT_TYPE_DATA_TRAILER = 0x02, ARV_GVSP_CONTENT_TYPE_DATA_BLOCK = 0x03 } ArvGvspContentType; /** * ArvGvspPayloadType: * @ARV_GVSP_PAYLOAD_TYPE_IMAGE: image data * @ARV_GVSP_PAYLOAD_TYPE_RAWDATA: raw data * @ARV_GVSP_PAYLOAD_TYPE_FILE: file * @ARV_GVSP_PAYLOAD_TYPE_CHUNK_DATA: chunk data * @ARV_GVSP_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA: extended chunk data * @ARV_GVSP_PAYLOAD_TYPE_JPEG: JPEG data * @ARV_GVSP_PAYLOAD_TYPE_JPEG2000: JPEG2000 data * @ARV_GVSP_PAYLOAD_TYPE_H264: h264 data * @ARV_GVSP_PAYLOAD_TYPE_MULTIZONE_IMAGE: multizone image */ typedef enum { ARV_GVSP_PAYLOAD_TYPE_IMAGE = 0x0001, ARV_GVSP_PAYLOAD_TYPE_RAWDATA = 0x0002, ARV_GVSP_PAYLOAD_TYPE_FILE = 0x0003, ARV_GVSP_PAYLOAD_TYPE_CHUNK_DATA = 0x0004, ARV_GVSP_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA = 0x0005, /* Deprecated */ ARV_GVSP_PAYLOAD_TYPE_JPEG = 0x0006, ARV_GVSP_PAYLOAD_TYPE_JPEG2000 = 0x0007, ARV_GVSP_PAYLOAD_TYPE_H264 = 0x0008, ARV_GVSP_PAYLOAD_TYPE_MULTIZONE_IMAGE = 0x0009 } ArvGvspPayloadType; #pragma pack(push,1) /** * ArvGvspHeader: * @packet_type: a #ArvGvspPacketType identifier * @frame_id: frame identifier * @packet_infos: #ArvGvspContentType and packet identifier in a 32 bit value * * GVSP packet header structure. */ typedef struct { guint16 packet_type; guint16 frame_id; guint32 packet_infos; } ArvGvspHeader; /** * ArvGvspDataLeader: * @flags: generic flags * @payload_type: ID of the payload type * @timestamp_high: most significant bits of frame timestamp * @timestamp_low: least significant bits of frame timestamp_low * @pixel_format: a #ArvPixelFormat identifier * @width: frame width, in pixels * @height: frame height, in pixels * @x_offset: frame x offset, in pixels * @y_offset: frame y offset, in pixels * * GVSP data leader packet data area. */ typedef struct { guint16 flags; guint16 payload_type; guint32 timestamp_high; guint32 timestamp_low; guint32 pixel_format; guint32 width; guint32 height; guint32 x_offset; guint32 y_offset; } ArvGvspDataLeader; /** * ArvGvspDataTrailer: * @payload_type: ID of the payload type * @data0: unused * * GVSP data trailer packet data area. */ typedef struct { guint32 payload_type; guint32 data0; } ArvGvspDataTrailer; /** * ArvGvspPacket: * @header: common GVSP packet header * @data: data byte array * * GVSP packet structure. */ typedef struct { ArvGvspHeader header; guint8 data[]; } ArvGvspPacket; #pragma pack(pop) ArvGvspPacket * arv_gvsp_packet_new_data_leader (guint16 frame_id, guint32 packet_id, guint64 timestamp, ArvPixelFormat pixel_format, guint32 width, guint32 height, guint32 x_offset, guint32 y_offset, void *buffer, size_t *buffer_size); ArvGvspPacket * arv_gvsp_packet_new_data_trailer (guint16 frame_id, guint32 packet_id, void *buffer, size_t *buffer_size); ArvGvspPacket * arv_gvsp_packet_new_data_block (guint16 frame_id, guint32 packet_id, size_t size, void *data, void *buffer, size_t *buffer_size); char * arv_gvsp_packet_to_string (const ArvGvspPacket *packet, size_t packet_size); void arv_gvsp_packet_debug (const ArvGvspPacket *packet, size_t packet_size, ArvDebugLevel level); static inline ArvGvspPacketType arv_gvsp_packet_get_packet_type (const ArvGvspPacket *packet) { return (ArvGvspPacketType) g_ntohs (packet->header.packet_type); } static inline ArvGvspContentType arv_gvsp_packet_get_content_type (const ArvGvspPacket *packet) { return (ArvGvspContentType) ((g_ntohl (packet->header.packet_infos) & ARV_GVSP_PACKET_INFOS_CONTENT_TYPE_MASK) >> ARV_GVSP_PACKET_INFOS_CONTENT_TYPE_POS); } static inline guint16 arv_gvsp_packet_get_packet_id (const ArvGvspPacket *packet) { return g_ntohl (packet->header.packet_infos) & ARV_GVSP_PACKET_INFOS_ID_MASK; } static inline guint16 arv_gvsp_packet_get_frame_id (const ArvGvspPacket *packet) { return g_ntohs (packet->header.frame_id); } static inline ArvBufferPayloadType arv_gvsp_packet_get_buffer_payload_type (const ArvGvspPacket *packet) { ArvGvspDataLeader *leader; ArvGvspPayloadType gvsp_payload_type; leader = (ArvGvspDataLeader *) &packet->data; gvsp_payload_type = (ArvGvspPayloadType) g_ntohs (leader->payload_type); switch (gvsp_payload_type) { case ARV_GVSP_PAYLOAD_TYPE_IMAGE: return ARV_BUFFER_PAYLOAD_TYPE_IMAGE; case ARV_GVSP_PAYLOAD_TYPE_RAWDATA: return ARV_BUFFER_PAYLOAD_TYPE_RAWDATA; case ARV_GVSP_PAYLOAD_TYPE_FILE: return ARV_BUFFER_PAYLOAD_TYPE_FILE; case ARV_GVSP_PAYLOAD_TYPE_CHUNK_DATA: return ARV_BUFFER_PAYLOAD_TYPE_CHUNK_DATA; case ARV_GVSP_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA: return ARV_BUFFER_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA; case ARV_GVSP_PAYLOAD_TYPE_JPEG: return ARV_BUFFER_PAYLOAD_TYPE_JPEG; case ARV_GVSP_PAYLOAD_TYPE_JPEG2000: return ARV_BUFFER_PAYLOAD_TYPE_JPEG2000; case ARV_GVSP_PAYLOAD_TYPE_H264: return ARV_BUFFER_PAYLOAD_TYPE_H264; case ARV_GVSP_PAYLOAD_TYPE_MULTIZONE_IMAGE: return ARV_BUFFER_PAYLOAD_TYPE_MULTIZONE_IMAGE; } return ARV_BUFFER_PAYLOAD_TYPE_UNKNOWN; } static inline guint32 arv_gvsp_packet_get_x_offset (const ArvGvspPacket *packet) { ArvGvspDataLeader *leader; leader = (ArvGvspDataLeader *) &packet->data; return g_ntohl (leader->x_offset); } static inline guint32 arv_gvsp_packet_get_y_offset (const ArvGvspPacket *packet) { ArvGvspDataLeader *leader; leader = (ArvGvspDataLeader *) &packet->data; return g_ntohl (leader->y_offset); } static inline guint32 arv_gvsp_packet_get_width (const ArvGvspPacket *packet) { ArvGvspDataLeader *leader; leader = (ArvGvspDataLeader *) &packet->data; return g_ntohl (leader->width); } static inline guint32 arv_gvsp_packet_get_height (const ArvGvspPacket *packet) { ArvGvspDataLeader *leader; leader = (ArvGvspDataLeader *) &packet->data; return g_ntohl (leader->height); } static inline ArvPixelFormat arv_gvsp_packet_get_pixel_format (const ArvGvspPacket *packet) { ArvGvspDataLeader *leader; leader = (ArvGvspDataLeader *) &packet->data; return (ArvPixelFormat) g_ntohl (leader->pixel_format); } static inline guint64 arv_gvsp_packet_get_timestamp (const ArvGvspPacket *packet, guint64 timestamp_tick_frequency) { ArvGvspDataLeader *leader; guint64 timestamp_s; guint64 timestamp_ns; guint64 timestamp; if (timestamp_tick_frequency < 1) return 0; leader = (ArvGvspDataLeader *) &packet->data; timestamp = ( (guint64) g_ntohl (leader->timestamp_high) << 32) | g_ntohl (leader->timestamp_low); timestamp_s = timestamp / timestamp_tick_frequency; timestamp_ns = ((timestamp % timestamp_tick_frequency) * 1000000000) / timestamp_tick_frequency; timestamp_ns += timestamp_s * 1000000000; return timestamp_ns; } static inline size_t arv_gvsp_packet_get_data_size (size_t packet_size) { return packet_size - sizeof (ArvGvspHeader); } G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgvstream.c000066400000000000000000001233701334570641500175230ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvgvstream * @short_description: GigEVision stream */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef ARAVIS_BUILD_PACKET_SOCKET #include #include #include #include #include #include #include #include #include #include #endif #define ARV_GV_STREAM_INCOMING_BUFFER_SIZE 65536 #define ARV_GV_STREAM_POLL_TIMEOUT_US 1000000 #define ARV_GV_STREAM_PACKET_TIMEOUT_US_DEFAULT 40000 #define ARV_GV_STREAM_FRAME_RETENTION_US_DEFAULT 200000 #define ARV_GV_STREAM_PACKET_REQUEST_RATIO_DEFAULT 0.10 #define ARV_GV_STREAM_DISCARD_LATE_FRAME_THRESHOLD 100 enum { ARV_GV_STREAM_PROPERTY_0, ARV_GV_STREAM_PROPERTY_SOCKET_BUFFER, ARV_GV_STREAM_PROPERTY_SOCKET_BUFFER_SIZE, ARV_GV_STREAM_PROPERTY_PACKET_RESEND, ARV_GV_STREAM_PROPERTY_PACKET_REQUEST_RATIO, ARV_GV_STREAM_PROPERTY_PACKET_TIMEOUT, ARV_GV_STREAM_PROPERTY_FRAME_RETENTION } ArvGvStreamProperties; static GObjectClass *parent_class = NULL; typedef struct _ArvGvStreamThreadData ArvGvStreamThreadData; struct _ArvGvStreamPrivate { GThread *thread; ArvGvStreamThreadData *thread_data; }; /* Acquisition thread */ typedef struct { gboolean received; guint64 time_us; } ArvGvStreamPacketData; typedef struct { ArvBuffer *buffer; guint32 frame_id; gint32 last_valid_packet; guint64 first_packet_time_us; guint64 last_packet_time_us; gboolean error_packet_received; guint n_packets; ArvGvStreamPacketData *packet_data; } ArvGvStreamFrameData; struct _ArvGvStreamThreadData { ArvGvDevice *gv_device; ArvStream *stream; ArvStreamCallback callback; void *user_data; GSocket *socket; GInetAddress *interface_address; GSocketAddress *interface_socket_address; GInetAddress *device_address; GSocketAddress *device_socket_address; guint16 source_stream_port; guint16 stream_port; ArvGvStreamPacketResend packet_resend; double packet_request_ratio; guint packet_timeout_us; guint frame_retention_us; guint64 timestamp_tick_frequency; guint data_size; gboolean cancel; guint16 packet_id; GSList *frames; gboolean first_packet; guint32 last_frame_id; gboolean use_packet_socket; /* Statistics */ guint n_completed_buffers; guint n_failures; guint n_timeouts; guint n_underruns; guint n_aborteds; guint n_missing_frames; guint n_size_mismatch_errors; guint n_received_packets; guint n_missing_packets; guint n_error_packets; guint n_ignored_packets; guint n_resend_requests; guint n_resent_packets; guint n_duplicated_packets; ArvStatistic *statistic; guint32 statistic_count; ArvGvStreamSocketBuffer socket_buffer_option; int socket_buffer_size; int current_socket_buffer_size; }; static void _send_packet_request (ArvGvStreamThreadData *thread_data, guint32 frame_id, guint32 first_block, guint32 last_block) { ArvGvcpPacket *packet; size_t packet_size; thread_data->packet_id = arv_gvcp_next_packet_id (thread_data->packet_id); packet = arv_gvcp_packet_new_packet_resend_cmd (frame_id, first_block, last_block, thread_data->packet_id, &packet_size); arv_log_stream_thread ("[GvStream::send_packet_request] frame_id = %u (%d - %d)", frame_id, first_block, last_block); arv_gvcp_packet_debug (packet, ARV_DEBUG_LEVEL_LOG); g_socket_send_to (thread_data->socket, thread_data->device_socket_address, (const char *) packet, packet_size, NULL, NULL); arv_gvcp_packet_free (packet); } static void _update_socket (ArvGvStreamThreadData *thread_data, ArvBuffer *buffer) { int buffer_size, fd; if (thread_data->socket_buffer_option == ARV_GV_STREAM_SOCKET_BUFFER_FIXED && thread_data->socket_buffer_size <= 0) return; fd = g_socket_get_fd (thread_data->socket); switch (thread_data->socket_buffer_option) { case ARV_GV_STREAM_SOCKET_BUFFER_FIXED: buffer_size = thread_data->socket_buffer_size; break; case ARV_GV_STREAM_SOCKET_BUFFER_AUTO: if (thread_data->socket_buffer_size <= 0) buffer_size = buffer->priv->size; else buffer_size = MIN (buffer->priv->size, thread_data->socket_buffer_size); break; } if (buffer_size != thread_data->current_socket_buffer_size) { int result; result = setsockopt (fd, SOL_SOCKET, SO_RCVBUF, &buffer_size, sizeof (buffer_size)); if (result == 0) { thread_data->current_socket_buffer_size = buffer_size; arv_debug_stream_thread ("[GvStream::update_socket] Socket buffer size set to %d", buffer_size); } else { arv_warning_stream_thread ("[GvStream::update_socket] Failed to set socket buffer size to %d (%d)", buffer_size, errno); } } } static void _process_data_leader (ArvGvStreamThreadData *thread_data, ArvGvStreamFrameData *frame, const ArvGvspPacket *packet, guint32 packet_id) { if (frame->buffer->priv->status != ARV_BUFFER_STATUS_FILLING) return; if (packet_id != 0) { frame->buffer->priv->status = ARV_BUFFER_STATUS_WRONG_PACKET_ID; return; } frame->buffer->priv->payload_type = arv_gvsp_packet_get_buffer_payload_type (packet); frame->buffer->priv->frame_id = arv_gvsp_packet_get_frame_id (packet); frame->buffer->priv->chunk_endianness = G_BIG_ENDIAN; frame->buffer->priv->system_timestamp_ns = g_get_real_time() * 1000LL; if (frame->buffer->priv->payload_type != ARV_BUFFER_PAYLOAD_TYPE_H264) { if (G_LIKELY (thread_data->timestamp_tick_frequency != 0)) frame->buffer->priv->timestamp_ns = arv_gvsp_packet_get_timestamp (packet, thread_data->timestamp_tick_frequency); else { frame->buffer->priv->timestamp_ns = frame->buffer->priv->system_timestamp_ns; } } else frame->buffer->priv->timestamp_ns = frame->buffer->priv->system_timestamp_ns; if (frame->buffer->priv->payload_type == ARV_BUFFER_PAYLOAD_TYPE_IMAGE || frame->buffer->priv->payload_type == ARV_BUFFER_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA) { frame->buffer->priv->x_offset = arv_gvsp_packet_get_x_offset (packet); frame->buffer->priv->y_offset = arv_gvsp_packet_get_y_offset (packet); frame->buffer->priv->width = arv_gvsp_packet_get_width (packet); frame->buffer->priv->height = arv_gvsp_packet_get_height (packet); frame->buffer->priv->pixel_format = arv_gvsp_packet_get_pixel_format (packet); } if (frame->packet_data[packet_id].time_us > 0) { thread_data->n_resent_packets++; arv_log_stream_thread ("[GvStream::process_data_leader] Received resent packet %u for frame %u", packet_id, frame->frame_id); } } static void _process_data_block (ArvGvStreamThreadData *thread_data, ArvGvStreamFrameData *frame, const ArvGvspPacket *packet, guint32 packet_id, size_t read_count) { size_t block_size; ptrdiff_t block_offset; ptrdiff_t block_end; if (frame->buffer->priv->status != ARV_BUFFER_STATUS_FILLING) return; if (packet_id > frame->n_packets - 2 || packet_id < 1) { arv_gvsp_packet_debug (packet, read_count, ARV_DEBUG_LEVEL_DEBUG); frame->buffer->priv->status = ARV_BUFFER_STATUS_WRONG_PACKET_ID; return; } block_size = arv_gvsp_packet_get_data_size (read_count); block_offset = (packet_id - 1) * thread_data->data_size; block_end = block_size + block_offset; if (block_end > frame->buffer->priv->size) { arv_debug_stream_thread ("[GvStream::process_data_block] %d unexpected bytes in packet %u " " for frame %u", block_end - frame->buffer->priv->size, packet_id, frame->frame_id); thread_data->n_size_mismatch_errors++; block_end = frame->buffer->priv->size; block_size = block_end - block_offset; } memcpy (((char *) frame->buffer->priv->data) + block_offset, &packet->data, block_size); if (frame->packet_data[packet_id].time_us > 0) { thread_data->n_resent_packets++; arv_log_stream_thread ("[GvStream::process_data_block] Received resent packet %u for frame %u", packet_id, frame->frame_id); } } static void _process_data_trailer (ArvGvStreamThreadData *thread_data, ArvGvStreamFrameData *frame, const ArvGvspPacket *packet, guint32 packet_id) { if (frame->buffer->priv->status != ARV_BUFFER_STATUS_FILLING) return; if (packet_id != frame->n_packets - 1) { frame->buffer->priv->status = ARV_BUFFER_STATUS_WRONG_PACKET_ID; return; } if (frame->packet_data[packet_id].time_us > 0) { thread_data->n_resent_packets++; arv_log_stream_thread ("[GvStream::process_data_trailer] Received resent packet %u for frame %u", packet_id, frame->frame_id); } } static ArvGvStreamFrameData * _find_frame_data (ArvGvStreamThreadData *thread_data, guint32 frame_id, const ArvGvspPacket *packet, guint32 packet_id, size_t read_count, guint64 time_us) { ArvGvStreamFrameData *frame = NULL; ArvBuffer *buffer; GSList *iter; guint n_packets = 0; gint16 frame_id_inc; for (iter = thread_data->frames; iter != NULL; iter = iter->next) { frame = iter->data; if (frame->frame_id == frame_id) { frame->last_packet_time_us = time_us; return frame; } } frame_id_inc = (gint16) frame_id - (gint16) thread_data->last_frame_id; /* Frame id 0 is not a valid value */ if ((gint16) frame_id > 0 && (gint16) thread_data->last_frame_id < 0) frame_id_inc--; if (frame_id_inc < 1 && frame_id_inc > -ARV_GV_STREAM_DISCARD_LATE_FRAME_THRESHOLD) { arv_debug_stream_thread ("[GvStream::find_frame_data] Discard late frame %u (last: %u)", frame_id, thread_data->last_frame_id); return NULL; } buffer = arv_stream_pop_input_buffer (thread_data->stream); if (buffer == NULL) { thread_data->n_underruns++; return NULL; } frame = g_new0 (ArvGvStreamFrameData, 1); frame->error_packet_received = FALSE; frame->frame_id = frame_id; frame->last_valid_packet = -1; frame->buffer = buffer; _update_socket (thread_data, frame->buffer); frame->buffer->priv->status = ARV_BUFFER_STATUS_FILLING; n_packets = (frame->buffer->priv->size + thread_data->data_size - 1) / thread_data->data_size + 2; frame->first_packet_time_us = time_us; frame->last_packet_time_us = time_us; frame->packet_data = g_new0 (ArvGvStreamPacketData, n_packets); frame->n_packets = n_packets; if (thread_data->callback != NULL && frame->buffer != NULL) thread_data->callback (thread_data->user_data, ARV_STREAM_CALLBACK_TYPE_START_BUFFER, NULL); thread_data->last_frame_id = frame_id; if (frame_id_inc > 1) { thread_data->n_missing_frames++; arv_log_stream_thread ("[GvStream::find_frame_data] Missed %d frame(s) before %u", frame_id_inc - 1, frame_id); } thread_data->frames = g_slist_append (thread_data->frames, frame); arv_log_stream_thread ("[GvStream::find_frame_data] Start frame %u", frame_id); return frame; } static void _missing_packet_check (ArvGvStreamThreadData *thread_data, ArvGvStreamFrameData *frame, guint32 packet_id, guint64 time_us) { guint n_packet_requests = 0; int i; if (thread_data->packet_resend == ARV_GV_STREAM_PACKET_RESEND_NEVER || frame->error_packet_received) return; if ((int) (frame->n_packets * thread_data->packet_request_ratio) <= 0) return; if (packet_id < frame->n_packets) { int first_missing = -1; for (i = frame->last_valid_packet + 1; i <= packet_id; i++) { if (!frame->packet_data[i].received && (frame->packet_data[i].time_us == 0 || (time_us - frame->packet_data[i].time_us > thread_data->packet_timeout_us))) { if (first_missing < 0) first_missing = i; } else if (first_missing >= 0) { int j; if (i - first_missing + n_packet_requests > (frame->n_packets * thread_data->packet_request_ratio)) { n_packet_requests += i - first_missing; arv_log_stream_thread ("[GvStream::missing_packet_check]" " Maximum number of packet requests " "reached at dt = %" G_GINT64_FORMAT ", n_requests = %u/%u", time_us - frame->first_packet_time_us, n_packet_requests, frame->n_packets); return; } arv_log_stream_thread ("[GvStream::missing_packet_check]" " Resend request at dt = %" G_GINT64_FORMAT ", packet id = %u/%u", time_us - frame->first_packet_time_us, packet_id, frame->n_packets); _send_packet_request (thread_data, frame->frame_id, first_missing, i - 1); for (j = first_missing; j < i; j++) frame->packet_data[j].time_us = time_us; thread_data->n_resend_requests += (i - first_missing); first_missing = -1; } } if (first_missing >= 0) { int j; if (i - first_missing + n_packet_requests > (frame->n_packets * thread_data->packet_request_ratio)) { n_packet_requests += i - first_missing; arv_log_stream_thread ("[GvStream::missing_packet_check]" " Maximum number of packet requests " "reached at dt = %" G_GINT64_FORMAT ", n_requests = %u/%u", time_us - frame->first_packet_time_us, n_packet_requests, frame->n_packets); return; } arv_log_stream_thread ("[GvStream::missing_packet_check]" " Resend request at dt = %" G_GINT64_FORMAT", packet id = %u/%u", time_us - frame->first_packet_time_us, packet_id, frame->n_packets); _send_packet_request (thread_data, frame->frame_id, first_missing, i - 1); for (j = first_missing; j < i; j++) frame->packet_data[j].time_us = time_us; thread_data->n_resend_requests += (i - first_missing); } } } static void _close_frame (ArvGvStreamThreadData *thread_data, ArvGvStreamFrameData *frame) { GTimeVal current_time; gint64 current_time_us; if (frame->buffer->priv->status == ARV_BUFFER_STATUS_SUCCESS) thread_data->n_completed_buffers++; else if (frame->buffer->priv->status != ARV_BUFFER_STATUS_ABORTED) thread_data->n_failures++; if (frame->buffer->priv->status == ARV_BUFFER_STATUS_TIMEOUT) thread_data->n_timeouts++; if (frame->buffer->priv->status == ARV_BUFFER_STATUS_ABORTED) thread_data->n_aborteds++; if (frame->buffer->priv->status != ARV_BUFFER_STATUS_SUCCESS && frame->buffer->priv->status != ARV_BUFFER_STATUS_ABORTED) thread_data->n_missing_packets += (int) frame->n_packets - (frame->last_valid_packet + 1); arv_stream_push_output_buffer (thread_data->stream, frame->buffer); if (thread_data->callback != NULL) thread_data->callback (thread_data->user_data, ARV_STREAM_CALLBACK_TYPE_BUFFER_DONE, frame->buffer); g_get_current_time (¤t_time); current_time_us = current_time.tv_sec * 1000000 + current_time.tv_usec; if (thread_data->statistic_count > 5) { arv_statistic_fill (thread_data->statistic, 0, current_time_us - frame->first_packet_time_us, frame->buffer->priv->frame_id); } else thread_data->statistic_count++; arv_log_stream_thread ("[GvStream::close_frame] Close frame %u", frame->frame_id); frame->buffer = NULL; frame->frame_id = 0; g_free (frame->packet_data); g_free (frame); } static void _check_frame_completion (ArvGvStreamThreadData *thread_data, guint64 time_us, ArvGvStreamFrameData *current_frame) { GSList *iter; ArvGvStreamFrameData *frame; gboolean can_close_frame = TRUE; for (iter = thread_data->frames; iter != NULL;) { frame = iter->data; if (can_close_frame && thread_data->packet_resend == ARV_GV_STREAM_PACKET_RESEND_NEVER && iter->next != NULL) { frame->buffer->priv->status = ARV_BUFFER_STATUS_MISSING_PACKETS; arv_debug_stream_thread ("[GvStream::check_frame_completion] Incomplete frame %u", frame->frame_id); _close_frame (thread_data, frame); thread_data->frames = iter->next; g_slist_free_1 (iter); iter = thread_data->frames; continue; } if (can_close_frame && frame->last_valid_packet == frame->n_packets - 1) { frame->buffer->priv->status = ARV_BUFFER_STATUS_SUCCESS; arv_log_stream_thread ("[GvStream::check_frame_completion] Completed frame %u", frame->frame_id); _close_frame (thread_data, frame); thread_data->frames = iter->next; g_slist_free_1 (iter); iter = thread_data->frames; continue; } if (can_close_frame && time_us - frame->last_packet_time_us >= thread_data->frame_retention_us) { frame->buffer->priv->status = ARV_BUFFER_STATUS_TIMEOUT; arv_debug_stream_thread ("[GvStream::check_frame_completion] Timeout for frame %u " "at dt = %Lu", frame->frame_id, time_us - frame->first_packet_time_us); #if 0 if (arv_debug_check (&arv_debug_category_stream_thread, ARV_DEBUG_LEVEL_LOG)) { int i; arv_log_stream_thread ("frame_id = %Lu", frame->frame_id); arv_log_stream_thread ("last_valid_packet = %d", frame->last_valid_packet); for (i = 0; i < frame->n_packets; i++) { arv_log_stream_thread ("%d - time = %Lu%s", i, frame->packet_data[i].time_us, frame->packet_data[i].received ? " - OK" : ""); } } #endif _close_frame (thread_data, frame); thread_data->frames = iter->next; g_slist_free_1 (iter); iter = thread_data->frames; continue; } can_close_frame = FALSE; if (frame != current_frame && time_us - frame->last_packet_time_us >= thread_data->packet_timeout_us) { _missing_packet_check (thread_data, frame, frame->n_packets - 1, time_us); iter = iter->next; continue; } iter = iter->next; } } static void _flush_frames (ArvGvStreamThreadData *thread_data) { GSList *iter; ArvGvStreamFrameData *frame; for (iter = thread_data->frames; iter != NULL; iter = iter->next) { frame = iter->data; frame->buffer->priv->status = ARV_BUFFER_STATUS_ABORTED; _close_frame (thread_data, frame); } g_slist_free (thread_data->frames); thread_data->frames = NULL; } static ArvGvStreamFrameData * _process_packet (ArvGvStreamThreadData *thread_data, const ArvGvspPacket *packet, size_t packet_size, guint64 time_us) { ArvGvStreamFrameData *frame; guint32 packet_id; guint32 frame_id; int i; thread_data->n_received_packets++; frame_id = arv_gvsp_packet_get_frame_id (packet); packet_id = arv_gvsp_packet_get_packet_id (packet); if (thread_data->first_packet) { thread_data->last_frame_id = frame_id - 1; thread_data->first_packet = FALSE; } frame = _find_frame_data (thread_data, frame_id, packet, packet_id, packet_size, time_us); if (frame != NULL) { ArvGvspPacketType packet_type = arv_gvsp_packet_get_packet_type (packet); if (packet_type != ARV_GVSP_PACKET_TYPE_OK && packet_type != ARV_GVSP_PACKET_TYPE_RESEND) { arv_debug_stream_thread ("[GvStream::process_packet]" " Error packet at dt = %" G_GINT64_FORMAT ", packet id = %u" " frame id = %u", time_us - frame->first_packet_time_us, packet_id, frame->frame_id); arv_gvsp_packet_debug (packet, packet_size, ARV_DEBUG_LEVEL_DEBUG); frame->error_packet_received = TRUE; thread_data->n_error_packets++; } else { /* Check for duplicated packets */ if (packet_id < frame->n_packets) { if (frame->packet_data[packet_id].received) thread_data->n_duplicated_packets++; else frame->packet_data[packet_id].received = TRUE; } /* Keep track of last packet of a continuous block starting from packet 0 */ for (i = frame->last_valid_packet + 1; i < frame->n_packets; i++) if (!frame->packet_data[i].received) break; frame->last_valid_packet = i - 1; arv_gvsp_packet_debug (packet, packet_size, ARV_DEBUG_LEVEL_LOG); switch (arv_gvsp_packet_get_content_type (packet)) { case ARV_GVSP_CONTENT_TYPE_DATA_LEADER: _process_data_leader (thread_data, frame, packet, packet_id); break; case ARV_GVSP_CONTENT_TYPE_DATA_BLOCK: _process_data_block (thread_data, frame, packet, packet_id, packet_size); break; case ARV_GVSP_CONTENT_TYPE_DATA_TRAILER: _process_data_trailer (thread_data, frame, packet, packet_id); break; default: thread_data->n_ignored_packets++; break; } _missing_packet_check (thread_data, frame, packet_id, time_us); } } else thread_data->n_ignored_packets++; return frame; } static void _loop (ArvGvStreamThreadData *thread_data) { ArvGvStreamFrameData *frame; ArvGvspPacket *packet; GPollFD poll_fd; GTimeVal current_time; guint64 time_us; size_t read_count; int timeout_ms; int n_events; arv_debug_stream ("[GvStream::loop] Standard socket method"); poll_fd.fd = g_socket_get_fd (thread_data->socket); poll_fd.events = G_IO_IN; poll_fd.revents = 0; packet = g_malloc0 (ARV_GV_STREAM_INCOMING_BUFFER_SIZE); do { if (thread_data->frames != NULL) timeout_ms = thread_data->packet_timeout_us / 1000; else timeout_ms = ARV_GV_STREAM_POLL_TIMEOUT_US / 1000; n_events = g_poll (&poll_fd, 1, timeout_ms); g_get_current_time (¤t_time); time_us = current_time.tv_sec * 1000000 + current_time.tv_usec; if (n_events > 0) { read_count = g_socket_receive (thread_data->socket, (char *) packet, ARV_GV_STREAM_INCOMING_BUFFER_SIZE, NULL, NULL); frame = _process_packet (thread_data, packet, read_count, time_us); } else frame = NULL; _check_frame_completion (thread_data, time_us, frame); } while (!g_atomic_int_get (&thread_data->cancel)); g_free (packet); } #ifdef ARAVIS_BUILD_PACKET_SOCKET static void _set_socket_filter (int socket, guint32 source_ip, guint32 source_port, guint32 destination_ip, guint32 destination_port) { struct sock_filter bpf[18] = { { 0x28, 0, 0, 0x0000000c }, { 0x15, 15, 0, 0x000086dd }, { 0x15, 0, 14, 0x00000800 }, { 0x30, 0, 0, 0x00000017 }, { 0x15, 0, 12, 0x00000011 }, { 0x20, 0, 0, 0x0000001a }, { 0x15, 0, 10, source_ip }, { 0x28, 0, 0, 0x00000014 }, { 0x45, 8, 0, 0x00001fff }, { 0xb1, 0, 0, 0x0000000e }, { 0x48, 0, 0, 0x0000000e }, { 0x15, 0, 5, source_port }, { 0x20, 0, 0, 0x0000001e }, { 0x15, 0, 3, destination_ip }, { 0x48, 0, 0, 0x00000010 }, { 0x15, 0, 1, destination_port }, { 0x6, 0, 0, 0x00040000 }, { 0x6, 0, 0, 0x00000000 } }; struct sock_fprog bpf_prog = {sizeof(bpf) / sizeof(struct sock_filter), bpf}; arv_debug_stream_thread ("[GvStream::set_socket_filter] source ip = 0x%08x - port = %d - dest ip = 0x%08x - port %d", source_ip, source_port, destination_ip, destination_port); if (setsockopt(socket, SOL_SOCKET, SO_ATTACH_FILTER, &bpf_prog, sizeof(bpf_prog)) != 0) arv_warning_stream_thread ("[GvStream::set_socket_filter] Failed to attach Beckerley Packet Filter to stream socket"); } static unsigned _interface_index_from_address (guint32 ip) { struct ifaddrs *ifaddr = NULL; struct ifaddrs *ifa; unsigned index = 0; if (getifaddrs(&ifaddr) == -1) { return index; } for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr != NULL && ifa->ifa_addr->sa_family == AF_INET) { struct sockaddr_in *sa; sa = (struct sockaddr_in *) (ifa->ifa_addr); if (ip == g_ntohl (sa->sin_addr.s_addr)) { index = if_nametoindex (ifa->ifa_name); break; } } } freeifaddrs (ifaddr); return index; } typedef struct { guint32 version; guint32 offset_to_priv; struct tpacket_hdr_v1 h1; } ArvGvStreamBlockDescriptor; static void _ring_buffer_loop (ArvGvStreamThreadData *thread_data) { GPollFD poll_fd; char *buffer; struct tpacket_req3 req; struct sockaddr_ll local_address; enum tpacket_versions version; int fd; unsigned block_id; const guint8 *bytes; guint32 interface_address; guint32 device_address; arv_debug_stream ("[GvStream::loop] Packet socket method"); fd = socket (PF_PACKET, SOCK_RAW, g_htons (ETH_P_ALL)); if (fd < 0) { arv_warning_stream_thread ("[GvStream::loop] Failed to create AF_PACKET socket"); return; } version = TPACKET_V3; if (setsockopt (fd, SOL_PACKET, PACKET_VERSION, &version, sizeof(version)) < 0) { arv_warning_stream_thread ("[GvStream::loop] Failed to set packet version"); goto socket_option_error; } req.tp_block_size = 1 << 21; req.tp_frame_size = 1024; req.tp_block_nr = 16; req.tp_frame_nr = (req.tp_block_size * req.tp_block_nr) / req.tp_frame_size; req.tp_sizeof_priv = 0; req.tp_retire_blk_tov = 5; req.tp_feature_req_word = TP_FT_REQ_FILL_RXHASH; if (setsockopt (fd, SOL_PACKET, PACKET_RX_RING, &req, sizeof(req)) < 0) { arv_warning_stream_thread ("[GvStream::loop] Failed to set packet rx ring"); goto socket_option_error; } buffer = mmap (NULL, req.tp_block_size * req.tp_block_nr, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, fd, 0); if (buffer == MAP_FAILED) { arv_warning_stream_thread ("[GvStream::loop] Failed to map ring buffer"); goto map_error; } bytes = g_inet_address_to_bytes (thread_data->interface_address); interface_address = g_ntohl (*((guint32 *) bytes)); bytes = g_inet_address_to_bytes (thread_data->device_address); device_address = g_ntohl (*((guint32 *) bytes)); local_address.sll_family = AF_PACKET; local_address.sll_protocol = g_htons(ETH_P_IP); local_address.sll_ifindex = _interface_index_from_address (interface_address); local_address.sll_hatype = 0; local_address.sll_pkttype = 0; local_address.sll_halen = 0; if (bind (fd, (struct sockaddr *) &local_address, sizeof(local_address)) == -1) { arv_warning_stream_thread ("[GvStream::loop] Failed to bind packet socket"); goto bind_error; } _set_socket_filter (fd, device_address, thread_data->source_stream_port, interface_address, thread_data->stream_port); poll_fd.fd = fd; poll_fd.events = G_IO_IN; poll_fd.revents = 0; block_id = 0; do { ArvGvStreamBlockDescriptor *descriptor; GTimeVal current_time; guint64 time_us; g_get_current_time (¤t_time); time_us = current_time.tv_sec * 1000000 + current_time.tv_usec; descriptor = (void *) (buffer + block_id * req.tp_block_size); if ((descriptor->h1.block_status & TP_STATUS_USER) == 0) { _check_frame_completion (thread_data, time_us, NULL); g_poll (&poll_fd, 1, 100); } else { ArvGvStreamFrameData *frame; const struct tpacket3_hdr *header; unsigned i; header = (void *) (((char *) descriptor) + descriptor->h1.offset_to_first_pkt); for (i = 0; i < descriptor->h1.num_pkts; i++) { const struct iphdr *ip; const ArvGvspPacket *packet; size_t size; ip = (void *) (((char *) header) + header->tp_mac + ETH_HLEN); packet = (void *) (((char *) ip) + sizeof (struct iphdr) + sizeof (struct udphdr)); size = g_ntohs (ip->tot_len) - sizeof (struct iphdr) - sizeof (struct udphdr); frame = _process_packet (thread_data, packet, size, time_us); _check_frame_completion (thread_data, time_us, frame); header = (void *) (((char *) header) + header->tp_next_offset); } descriptor->h1.block_status = TP_STATUS_KERNEL; block_id = (block_id + 1) % req.tp_block_nr; } } while (!g_atomic_int_get (&thread_data->cancel)); bind_error: munmap (buffer, req.tp_block_size * req.tp_block_nr); socket_option_error: map_error: close (fd); } #endif /* ARAVIS_BUILD_PACKET_SOCKET */ static void * arv_gv_stream_thread (void *data) { ArvGvStreamThreadData *thread_data = data; #ifdef ARAVIS_BUILD_PACKET_SOCKET int fd; #endif thread_data->frames = NULL; thread_data->last_frame_id = 0; thread_data->first_packet = TRUE; arv_debug_stream_thread ("[GvStream::stream_thread] Packet timeout = %g ms", thread_data->packet_timeout_us / 1000.0); arv_debug_stream_thread ("[GvStream::stream_thread] Frame retention = %g ms", thread_data->frame_retention_us / 1000.0); if (thread_data->callback != NULL) thread_data->callback (thread_data->user_data, ARV_STREAM_CALLBACK_TYPE_INIT, NULL); #ifdef ARAVIS_BUILD_PACKET_SOCKET if (thread_data->use_packet_socket && (fd = socket (PF_PACKET, SOCK_RAW, g_htons (ETH_P_ALL))) >= 0) { close (fd); _ring_buffer_loop (thread_data); } else #endif _loop (thread_data); _flush_frames (thread_data); if (thread_data->callback != NULL) thread_data->callback (thread_data->user_data, ARV_STREAM_CALLBACK_TYPE_EXIT, NULL); return NULL; } /* ArvGvStream implementation */ guint16 arv_gv_stream_get_port (ArvGvStream *gv_stream) { g_return_val_if_fail (ARV_IS_GV_STREAM (gv_stream), 0); return gv_stream->priv->thread_data->stream_port; } /** * arv_gv_stream_new: (skip) * @gv_device: a #ArvGvDevice * @interface_address: inet interface address for gvsp * @device_address: inet device address for gvsp * @callback: (scope call): processing callback * @user_data: (closure): user data for @callback * * Return value: (transfer full): a new #ArvStream. */ ArvStream * arv_gv_stream_new (ArvGvDevice *gv_device, GInetAddress *interface_address, GInetAddress *device_address, ArvStreamCallback callback, void *user_data) { ArvGvStreamThreadData *thread_data; ArvGvStream *gv_stream; ArvStream *stream; ArvGvStreamOption options; guint64 timestamp_tick_frequency; const guint8 *address_bytes; GInetSocketAddress *local_address; guint packet_size; g_return_val_if_fail (ARV_IS_GV_DEVICE (gv_device), NULL); g_return_val_if_fail (G_IS_INET_ADDRESS (interface_address), NULL); g_return_val_if_fail (G_IS_INET_ADDRESS (device_address), NULL); timestamp_tick_frequency = arv_gv_device_get_timestamp_tick_frequency (gv_device); options = arv_gv_device_get_stream_options (gv_device); packet_size = arv_gv_device_get_packet_size (gv_device); if (packet_size <= ARV_GVSP_PACKET_PROTOCOL_OVERHEAD) { arv_gv_device_set_packet_size (gv_device, ARV_GV_DEVICE_GVSP_PACKET_SIZE_DEFAULT); arv_debug_device ("[GvStream::stream_new] Packet size set to default value (%d)", ARV_GV_DEVICE_GVSP_PACKET_SIZE_DEFAULT); } packet_size = arv_gv_device_get_packet_size (gv_device); arv_debug_device ("[GvStream::stream_new] Packet size = %d byte(s)", packet_size); g_return_val_if_fail (packet_size > ARV_GVSP_PACKET_PROTOCOL_OVERHEAD, NULL); gv_stream = g_object_new (ARV_TYPE_GV_STREAM, NULL); stream = ARV_STREAM (gv_stream); thread_data = g_new (ArvGvStreamThreadData, 1); thread_data->gv_device = g_object_ref (gv_device); thread_data->stream = stream; thread_data->callback = callback; thread_data->user_data = user_data; thread_data->packet_resend = ARV_GV_STREAM_PACKET_RESEND_ALWAYS; thread_data->packet_request_ratio = ARV_GV_STREAM_PACKET_REQUEST_RATIO_DEFAULT; thread_data->packet_timeout_us = ARV_GV_STREAM_PACKET_TIMEOUT_US_DEFAULT; thread_data->frame_retention_us = ARV_GV_STREAM_FRAME_RETENTION_US_DEFAULT; thread_data->timestamp_tick_frequency = timestamp_tick_frequency; thread_data->data_size = packet_size - ARV_GVSP_PACKET_PROTOCOL_OVERHEAD; thread_data->use_packet_socket = (options & ARV_GV_STREAM_OPTION_PACKET_SOCKET_DISABLED) == 0; thread_data->cancel = FALSE; thread_data->packet_id = 65300; thread_data->last_frame_id = 0; thread_data->n_completed_buffers = 0; thread_data->n_failures = 0; thread_data->n_underruns = 0; thread_data->n_aborteds = 0; thread_data->n_timeouts = 0; thread_data->n_missing_frames = 0; thread_data->n_size_mismatch_errors = 0; thread_data->n_received_packets = 0; thread_data->n_missing_packets = 0; thread_data->n_error_packets = 0; thread_data->n_ignored_packets = 0; thread_data->n_resent_packets = 0; thread_data->n_resend_requests = 0; thread_data->n_duplicated_packets = 0; thread_data->statistic = arv_statistic_new (1, 5000, 200, 0); thread_data->statistic_count = 0; arv_statistic_set_name (thread_data->statistic, 0, "Buffer reception time"); thread_data->socket_buffer_option = ARV_GV_STREAM_SOCKET_BUFFER_FIXED; thread_data->socket_buffer_size = 0; thread_data->current_socket_buffer_size = 0; gv_stream->priv->thread_data = thread_data; thread_data->socket = g_socket_new (G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_DATAGRAM, G_SOCKET_PROTOCOL_UDP, NULL); thread_data->device_address = g_object_ref (device_address); thread_data->interface_address = g_object_ref (interface_address); thread_data->interface_socket_address = g_inet_socket_address_new (interface_address, 0); thread_data->device_socket_address = g_inet_socket_address_new (device_address, ARV_GVCP_PORT); g_socket_bind (thread_data->socket, thread_data->interface_socket_address, FALSE, NULL); local_address = G_INET_SOCKET_ADDRESS (g_socket_get_local_address (thread_data->socket, NULL)); thread_data->stream_port = g_inet_socket_address_get_port (local_address); g_object_unref (local_address); address_bytes = g_inet_address_to_bytes (interface_address); arv_device_set_integer_feature_value (ARV_DEVICE (gv_device), "GevSCDA", g_htonl (*((guint32 *) address_bytes))); arv_device_set_integer_feature_value (ARV_DEVICE (gv_device), "GevSCPHostPort", thread_data->stream_port); thread_data->source_stream_port = arv_device_get_integer_feature_value (ARV_DEVICE (gv_device), "GevSCSP"); arv_debug_stream ("[GvStream::stream_new] Destination stream port = %d", thread_data->stream_port); arv_debug_stream ("[GvStream::stream_new] Source stream port = %d", thread_data->source_stream_port); gv_stream->priv->thread = g_thread_new ("arv_gv_stream", arv_gv_stream_thread, gv_stream->priv->thread_data); return ARV_STREAM (gv_stream); } /* ArvStream implementation */ void arv_gv_stream_get_statistics (ArvGvStream *gv_stream, guint64 *n_resent_packets, guint64 *n_missing_packets) { ArvGvStreamThreadData *thread_data; g_return_if_fail (ARV_IS_GV_STREAM (gv_stream)); thread_data = gv_stream->priv->thread_data; if (n_resent_packets != NULL) *n_resent_packets = thread_data->n_resent_packets; if (n_missing_packets != NULL) *n_missing_packets = thread_data->n_missing_packets; } static void _get_statistics (ArvStream *stream, guint64 *n_completed_buffers, guint64 *n_failures, guint64 *n_underruns) { ArvGvStream *gv_stream = ARV_GV_STREAM (stream); ArvGvStreamThreadData *thread_data; thread_data = gv_stream->priv->thread_data; *n_completed_buffers = thread_data->n_completed_buffers; *n_failures = thread_data->n_failures; *n_underruns = thread_data->n_underruns; } static void arv_gv_stream_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { ArvGvStream *gv_stream = ARV_GV_STREAM (object); ArvGvStreamThreadData *thread_data; thread_data = gv_stream->priv->thread_data; switch (prop_id) { case ARV_GV_STREAM_PROPERTY_SOCKET_BUFFER: thread_data->socket_buffer_option = g_value_get_enum (value); break; case ARV_GV_STREAM_PROPERTY_SOCKET_BUFFER_SIZE: thread_data->socket_buffer_size = g_value_get_int (value); break; case ARV_GV_STREAM_PROPERTY_PACKET_RESEND: thread_data->packet_resend = g_value_get_enum (value); break; case ARV_GV_STREAM_PROPERTY_PACKET_REQUEST_RATIO: thread_data->packet_request_ratio = g_value_get_double (value); break; case ARV_GV_STREAM_PROPERTY_PACKET_TIMEOUT: thread_data->packet_timeout_us = g_value_get_uint (value); break; case ARV_GV_STREAM_PROPERTY_FRAME_RETENTION: thread_data->frame_retention_us = g_value_get_uint (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void arv_gv_stream_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { ArvGvStream *gv_stream = ARV_GV_STREAM (object); ArvGvStreamThreadData *thread_data; thread_data = gv_stream->priv->thread_data; switch (prop_id) { case ARV_GV_STREAM_PROPERTY_SOCKET_BUFFER: g_value_set_enum (value, thread_data->socket_buffer_option); break; case ARV_GV_STREAM_PROPERTY_SOCKET_BUFFER_SIZE: g_value_set_int (value, thread_data->socket_buffer_size); break; case ARV_GV_STREAM_PROPERTY_PACKET_RESEND: g_value_set_enum (value, thread_data->packet_resend); break; case ARV_GV_STREAM_PROPERTY_PACKET_REQUEST_RATIO: g_value_set_double (value, thread_data->packet_request_ratio); break; case ARV_GV_STREAM_PROPERTY_PACKET_TIMEOUT: g_value_set_uint (value, thread_data->packet_timeout_us); break; case ARV_GV_STREAM_PROPERTY_FRAME_RETENTION: g_value_set_uint (value, thread_data->frame_retention_us); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void arv_gv_stream_init (ArvGvStream *gv_stream) { gv_stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (gv_stream, ARV_TYPE_GV_STREAM, ArvGvStreamPrivate); } static void arv_gv_stream_finalize (GObject *object) { ArvGvStream *gv_stream = ARV_GV_STREAM (object); if (gv_stream->priv->thread != NULL) { ArvGvStreamThreadData *thread_data; char *statistic_string; thread_data = gv_stream->priv->thread_data; g_atomic_int_set (&thread_data->cancel, TRUE); g_thread_join (gv_stream->priv->thread); statistic_string = arv_statistic_to_string (thread_data->statistic); arv_debug_stream (statistic_string); g_free (statistic_string); arv_statistic_free (thread_data->statistic); arv_debug_stream ("[GvStream::finalize] n_completed_buffers = %u", thread_data->n_completed_buffers); arv_debug_stream ("[GvStream::finalize] n_failures = %u", thread_data->n_failures); arv_debug_stream ("[GvStream::finalize] n_timeouts = %u", thread_data->n_timeouts); arv_debug_stream ("[GvStream::finalize] n_aborteds = %u", thread_data->n_aborteds); arv_debug_stream ("[GvStream::finalize] n_underruns = %u", thread_data->n_underruns); arv_debug_stream ("[GvStream::finalize] n_missing_frames = %u", thread_data->n_missing_frames); arv_debug_stream ("[GvStream::finalize] n_size_mismatch_errors = %u", thread_data->n_size_mismatch_errors); arv_debug_stream ("[GvStream::finalize] n_received_packets = %u", thread_data->n_received_packets); arv_debug_stream ("[GvStream::finalize] n_missing_packets = %u", thread_data->n_missing_packets); arv_debug_stream ("[GvStream::finalize] n_error_packets = %u", thread_data->n_error_packets); arv_debug_stream ("[GvStream::finalize] n_ignored_packets = %u", thread_data->n_ignored_packets); arv_debug_stream ("[GvStream::finalize] n_resend_requests = %u", thread_data->n_resend_requests); arv_debug_stream ("[GvStream::finalize] n_resent_packets = %u", thread_data->n_resent_packets); arv_debug_stream ("[GvStream::finalize] n_duplicated_packets = %u", thread_data->n_duplicated_packets); g_clear_object (&thread_data->device_address); g_clear_object (&thread_data->interface_address); g_clear_object (&thread_data->device_socket_address); g_clear_object (&thread_data->interface_socket_address); g_clear_object (&thread_data->socket); g_clear_object (&thread_data->gv_device); g_free (thread_data); gv_stream->priv->thread_data = NULL; gv_stream->priv->thread = NULL; } parent_class->finalize (object); } static void arv_gv_stream_class_init (ArvGvStreamClass *gv_stream_class) { GObjectClass *object_class = G_OBJECT_CLASS (gv_stream_class); ArvStreamClass *stream_class = ARV_STREAM_CLASS (gv_stream_class); g_type_class_add_private (gv_stream_class, sizeof (ArvGvStreamPrivate)); parent_class = g_type_class_peek_parent (gv_stream_class); object_class->finalize = arv_gv_stream_finalize; object_class->set_property = arv_gv_stream_set_property; object_class->get_property = arv_gv_stream_get_property; stream_class->get_statistics = _get_statistics; g_object_class_install_property ( object_class, ARV_GV_STREAM_PROPERTY_SOCKET_BUFFER, g_param_spec_enum ("socket-buffer", "Socket buffer", "Socket buffer behaviour", ARV_TYPE_GV_STREAM_SOCKET_BUFFER, ARV_GV_STREAM_SOCKET_BUFFER_AUTO, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) ); g_object_class_install_property ( object_class, ARV_GV_STREAM_PROPERTY_SOCKET_BUFFER_SIZE, g_param_spec_int ("socket-buffer-size", "Socket buffer size", "Socket buffer size, in bytes", -1, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) ); g_object_class_install_property ( object_class, ARV_GV_STREAM_PROPERTY_PACKET_RESEND, g_param_spec_enum ("packet-resend", "Packet resend", "Packet resend behaviour", ARV_TYPE_GV_STREAM_PACKET_RESEND, ARV_GV_STREAM_PACKET_RESEND_ALWAYS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) ); g_object_class_install_property ( object_class, ARV_GV_STREAM_PROPERTY_PACKET_REQUEST_RATIO, g_param_spec_double ("packet-request-ratio", "Packet request ratio", "Packet resend request limit as a percentage of frame packet number", 0.0, 2.0, ARV_GV_STREAM_PACKET_REQUEST_RATIO_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) ); g_object_class_install_property ( object_class, ARV_GV_STREAM_PROPERTY_PACKET_TIMEOUT, g_param_spec_uint ("packet-timeout", "Packet timeout", "Packet timeout, in µs", 1000, 10000000, ARV_GV_STREAM_PACKET_TIMEOUT_US_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) ); g_object_class_install_property ( object_class, ARV_GV_STREAM_PROPERTY_FRAME_RETENTION, g_param_spec_uint ("frame-retention", "Frame retention", "Packet retention, in µs", 1000, 10000000, ARV_GV_STREAM_FRAME_RETENTION_US_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) ); } G_DEFINE_TYPE (ArvGvStream, arv_gv_stream, ARV_TYPE_STREAM) aravis-ARAVIS_0_6_0/src/arvgvstream.h000066400000000000000000000054341334570641500175300ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GV_STREAM_H #define ARV_GV_STREAM_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS /** * ArvGvStreamOption: * @ARV_GV_STREAM_OPTION_NONE: no option specified * @ARV_GV_STREAM_OPTION_PACKET_SOCKET_DISABLED: use of packet socket is disabled */ typedef enum { ARV_GV_STREAM_OPTION_NONE = 0, ARV_GV_STREAM_OPTION_PACKET_SOCKET_DISABLED } ArvGvStreamOption; /** * ArvGvStreamSocketBuffer: * @ARV_GV_STREAM_SOCKET_BUFFER_FIXED: socket buffer is set to a given fixed value * @ARV_GV_STREAM_SOCKET_BUFFER_AUTO: sockect buffer is set with respect to the payload size */ typedef enum { ARV_GV_STREAM_SOCKET_BUFFER_FIXED, ARV_GV_STREAM_SOCKET_BUFFER_AUTO } ArvGvStreamSocketBuffer; /** * ArvGvStreamPacketResend: * @ARV_GV_STREAM_PACKET_RESEND_NEVER: never request a packet resend * @ARV_GV_STREAM_PACKET_RESEND_ALWAYS: request a packet resend if a packet was missing */ typedef enum { ARV_GV_STREAM_PACKET_RESEND_NEVER, ARV_GV_STREAM_PACKET_RESEND_ALWAYS } ArvGvStreamPacketResend; #define ARV_TYPE_GV_STREAM (arv_gv_stream_get_type ()) #define ARV_GV_STREAM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_GV_STREAM, ArvGvStream)) #define ARV_GV_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_GV_STREAM, ArvGvStreamClass)) #define ARV_IS_GV_STREAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_GV_STREAM)) #define ARV_IS_GV_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_GV_STREAM)) #define ARV_GV_STREAM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_GV_STREAM, ArvGvStreamClass)) GType arv_gv_stream_get_type (void); guint16 arv_gv_stream_get_port (ArvGvStream *gv_stream); void arv_gv_stream_get_statistics (ArvGvStream *gv_stream, guint64 *n_resent_packets, guint64 *n_missing_packets); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvgvstreamprivate.h000066400000000000000000000031011334570641500211100ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_GV_STREAM_PRIVATE_H #define ARV_GV_STREAM_PRIVATE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS typedef struct _ArvGvStreamPrivate ArvGvStreamPrivate; typedef struct _ArvGvStreamClass ArvGvStreamClass; struct _ArvGvStream { ArvStream stream; ArvGvStreamPrivate *priv; }; struct _ArvGvStreamClass { ArvStreamClass parent_class; }; ArvStream * arv_gv_stream_new (ArvGvDevice *gv_device, GInetAddress *interface_address, GInetAddress *device_address, ArvStreamCallback callback, void *user_data); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvinterface.c000066400000000000000000000236351334570641500176360ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvinterface * @short_description: Abstract base class for camera discovery * * #ArvCamera is an abstract base class for camera discovery. It maintains a * list of the available devices and help to instantiate the corresponding * #ArvDevice object. If user already knows the device id of the device, he should * not worry about this class and just use arv_camera_new() or * arv_open_device(). */ #include static GObjectClass *parent_class = NULL; struct _ArvInterfacePrivate { GArray *device_ids; }; static void arv_interface_clear_device_ids (ArvInterface *interface) { unsigned int i; for (i = 0; i < interface->priv->device_ids->len; i++) { g_free (g_array_index (interface->priv->device_ids, ArvInterfaceDeviceIds *, i)->device); g_free (g_array_index (interface->priv->device_ids, ArvInterfaceDeviceIds *, i)->physical); g_free (g_array_index (interface->priv->device_ids, ArvInterfaceDeviceIds *, i)->address); g_free (g_array_index (interface->priv->device_ids, ArvInterfaceDeviceIds *, i)->vendor); g_free (g_array_index (interface->priv->device_ids, ArvInterfaceDeviceIds *, i)->model); g_free (g_array_index (interface->priv->device_ids, ArvInterfaceDeviceIds *, i)->serial_nbr); g_free (g_array_index (interface->priv->device_ids, ArvInterfaceDeviceIds *, i)); } g_array_set_size (interface->priv->device_ids, 0); } static gint _compare_device_ids (ArvInterfaceDeviceIds **a, ArvInterfaceDeviceIds **b) { if (*a == NULL || (*a)->device == NULL) return -1; if (*b == NULL || (*b)->device == NULL) return 1; return g_ascii_strcasecmp ((*a)->device, (*b)->device); } /** * arv_interface_update_device_list: * @interface: a #ArvInterface * * Updates the internal list of available devices. This may change the * connection between a list index and a device ID. * * Since: 0.2.0 */ void arv_interface_update_device_list (ArvInterface *interface) { g_return_if_fail (ARV_IS_INTERFACE (interface)); arv_interface_clear_device_ids (interface); ARV_INTERFACE_GET_CLASS (interface)->update_device_list (interface, interface->priv->device_ids); g_array_sort (interface->priv->device_ids, (GCompareFunc) _compare_device_ids); } /** * arv_interface_get_n_devices: * @interface: a #ArvInterface * * Queries the number of available devices on this interface. Prior to this * call the @arv_interface_update_device_list function must be called. The list content will not * change until the next call of the update function. * * Returns: the number of available devices * * Since: 0.2.0 */ unsigned int arv_interface_get_n_devices (ArvInterface *interface) { g_return_val_if_fail (ARV_IS_INTERFACE (interface), 0); g_return_val_if_fail (interface->priv->device_ids != NULL, 0); return interface->priv->device_ids->len; } /** * arv_interface_get_device_id: * @interface: a #ArvInterface * @index: device index * * Queries the unique device id corresponding to index. Prior to this * call the arv_interface_update_device_list() function must be called. * * Returns: a unique device id * * Since: 0.2.0 */ const char * arv_interface_get_device_id (ArvInterface *interface, unsigned int index) { g_return_val_if_fail (ARV_IS_INTERFACE (interface), 0); g_return_val_if_fail (interface->priv->device_ids != NULL, 0); if (index >= interface->priv->device_ids->len) return NULL; return g_array_index (interface->priv->device_ids, ArvInterfaceDeviceIds *, index)->device; } /** * arv_interface_get_device_physical_id: * @interface: a #ArvInterface * @index: device index * * Queries the physical device id corresponding to index such * as the MAC address for Ethernet based devices, bus id for PCI, * USB or Firewire based devices. * * Prior to this call the arv_interface_update_device_list() * function must be called. * * Returns: a physical device id * * Since: 0.2.0 */ const char * arv_interface_get_device_physical_id (ArvInterface *interface, unsigned int index) { g_return_val_if_fail (ARV_IS_INTERFACE (interface), 0); g_return_val_if_fail (interface->priv->device_ids != NULL, 0); if (index >= interface->priv->device_ids->len) return NULL; return g_array_index (interface->priv->device_ids, ArvInterfaceDeviceIds *, index)->physical; } /** * arv_interface_get_device_address: * @interface: a #ArvInterface * @index: device index * * queries the device address (IP address in the case of an ethernet camera). Useful * for constructing manual connections to devices using @arv_gv_device_new * * Prior to this call the arv_interface_update_device_list() * function must be called. * * Returns: (transfer none): the device address * * Since: 0.2.0 */ const char * arv_interface_get_device_address (ArvInterface *interface, unsigned int index) { g_return_val_if_fail (ARV_IS_INTERFACE (interface), 0); g_return_val_if_fail (interface->priv->device_ids != NULL, 0); if (index >= interface->priv->device_ids->len) return NULL; return g_array_index (interface->priv->device_ids, ArvInterfaceDeviceIds *, index)->address; } /** * arv_interface_get_device_vendor: * @interface: a #ArvInterface * @index: device index * * Queries the device vendor. * * Prior to this call the arv_interface_update_device_list() * function must be called. * * Returns: (transfer none): the device vendor, NULL on error * * Since: 0.6.0 */ const char * arv_interface_get_device_vendor (ArvInterface *interface, unsigned int index) { g_return_val_if_fail (ARV_IS_INTERFACE (interface), 0); g_return_val_if_fail (interface->priv->device_ids != NULL, 0); if (index >= interface->priv->device_ids->len) return NULL; return g_array_index (interface->priv->device_ids, ArvInterfaceDeviceIds *, index)->vendor; } /** * arv_interface_get_device_model: * @interface: a #ArvInterface * @index: device index * * Queries the device model. * * Prior to this call the arv_interface_update_device_list() * function must be called. * * Returns: (transfer none): the device model, NULL on error * * Since: 0.6.0 */ const char * arv_interface_get_device_model (ArvInterface *interface, unsigned int index) { g_return_val_if_fail (ARV_IS_INTERFACE (interface), 0); g_return_val_if_fail (interface->priv->device_ids != NULL, 0); if (index >= interface->priv->device_ids->len) return NULL; return g_array_index (interface->priv->device_ids, ArvInterfaceDeviceIds *, index)->model; } /** * arv_interface_get_device_serial_nbr: * @interface: a #ArvInterface * @index: device index * * Queries the device serial. * * Prior to this call the arv_interface_update_device_list() * function must be called. * * Returns: (transfer none): the device serial, NULL on error * * Since: 0.6.0 */ const char * arv_interface_get_device_serial_nbr (ArvInterface *interface, unsigned int index) { g_return_val_if_fail (ARV_IS_INTERFACE (interface), 0); g_return_val_if_fail (interface->priv->device_ids != NULL, 0); if (index >= interface->priv->device_ids->len) return NULL; return g_array_index (interface->priv->device_ids, ArvInterfaceDeviceIds *, index)->serial_nbr; } /** * arv_interface_get_device_protocol: * @interface: a #ArvInterface * @index: device index * * Queries the device protocol. Possible values are 'USB3Vision', 'GigEVision' * and 'Fake'. * * Prior to this call the arv_interface_update_device_list() * function must be called. * * Returns: (transfer none): the device protocol as a string, NULL on error * * Since: 0.6.0 */ const char * arv_interface_get_device_protocol (ArvInterface *interface, unsigned int index) { g_return_val_if_fail (ARV_IS_INTERFACE (interface), NULL); return ARV_INTERFACE_GET_CLASS (interface)->protocol; } /** * arv_interface_open_device: * @interface: a #ArvInterface * @device_id: (allow-none): device unique id * * Creates a new #ArvDevice object corresponding to the given device id string. * The first available device is returned if @device_id is %NULL. * * Returns: (transfer full): a new #ArvDevice * * Since: 0.2.0 */ ArvDevice * arv_interface_open_device (ArvInterface *interface, const char *device_id) { g_return_val_if_fail (ARV_IS_INTERFACE (interface), NULL); return ARV_INTERFACE_GET_CLASS (interface)->open_device (interface, device_id); } static void arv_interface_init (ArvInterface *interface) { interface->priv = G_TYPE_INSTANCE_GET_PRIVATE (interface, ARV_TYPE_INTERFACE, ArvInterfacePrivate); interface->priv->device_ids = g_array_new (FALSE, TRUE, sizeof (ArvInterfaceDeviceIds *)); } static void arv_interface_finalize (GObject *object) { ArvInterface *interface = ARV_INTERFACE (object); parent_class->finalize (object); arv_interface_clear_device_ids (interface); g_array_free (interface->priv->device_ids, TRUE); interface->priv->device_ids = NULL; } static void arv_interface_class_init (ArvInterfaceClass *interface_class) { GObjectClass *object_class = G_OBJECT_CLASS (interface_class); g_type_class_add_private (interface_class, sizeof (ArvInterfacePrivate)); parent_class = g_type_class_peek_parent (interface_class); object_class->finalize = arv_interface_finalize; } G_DEFINE_ABSTRACT_TYPE (ArvInterface, arv_interface, G_TYPE_OBJECT) aravis-ARAVIS_0_6_0/src/arvinterface.h000066400000000000000000000060261334570641500176360ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_INTERFACE_H #define ARV_INTERFACE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS #define ARV_TYPE_INTERFACE (arv_interface_get_type ()) #define ARV_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_INTERFACE, ArvInterface)) #define ARV_INTERFACE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_INTERFACE, ArvInterfaceClass)) #define ARV_IS_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_INTERFACE)) #define ARV_IS_INTERFACE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_INTERFACE)) #define ARV_INTERFACE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_INTERFACE, ArvInterfaceClass)) typedef struct _ArvInterfacePrivate ArvInterfacePrivate; typedef struct _ArvInterfaceClass ArvInterfaceClass; struct _ArvInterface { GObject object; ArvInterfacePrivate *priv; }; struct _ArvInterfaceClass { GObjectClass parent_class; void (*update_device_list) (ArvInterface *interface, GArray *device_ids); ArvDevice * (*open_device) (ArvInterface *interface, const char *device_id); const char * protocol; }; GType arv_interface_get_type (void); void arv_interface_update_device_list (ArvInterface *interface); unsigned int arv_interface_get_n_devices (ArvInterface *interface); const char * arv_interface_get_device_id (ArvInterface *interface, unsigned int index); const char * arv_interface_get_device_physical_id (ArvInterface *interface, unsigned int index); const char * arv_interface_get_device_address (ArvInterface *interface, unsigned int index); const char * arv_interface_get_device_vendor (ArvInterface *interface, unsigned int index); const char * arv_interface_get_device_model (ArvInterface *interface, unsigned int index); const char * arv_interface_get_device_serial_nbr (ArvInterface *interface, unsigned int index); const char * arv_interface_get_device_protocol (ArvInterface *interface, unsigned int index); ArvDevice * arv_interface_open_device (ArvInterface *interface, const char *device_id); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvinterfaceprivate.h000066400000000000000000000027261334570641500212340ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_INTERFACE_PRIVATE_H #define ARV_INTERFACE_PRIVATE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS #define ARV_DEVICE_NAME_ILLEGAL_CHARACTERS "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" \ "\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" #define ARV_DEVICE_NAME_REPLACEMENT_CHARACTER '\0' typedef struct { char *device; char *physical; char *address; char *vendor; char *model; char *serial_nbr; } ArvInterfaceDeviceIds; G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvmisc.c000066400000000000000000000472611334570641500166320ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #include #include #include #include #include #include /** * SECTION: arvstatistic * @short_description: An histogram tool */ typedef struct _ArvHistogram ArvHistogram; struct _ArvHistogram { char * name; guint64 and_more; guint64 and_less; guint64 last_seen_worst; int worst; int best; guint64 * bins; }; struct _ArvStatistic { guint n_histograms; guint n_bins; guint bin_step; int offset; guint64 counter; ArvHistogram *histograms; }; static void _arv_statistic_free (ArvStatistic *statistic) { guint j; if (statistic == NULL) return; if (statistic->histograms != NULL) { for (j = 0; j < statistic->n_histograms && statistic->histograms[j].bins != NULL; j++) { if (statistic->histograms[j].name != NULL) g_free (statistic->histograms[j].name); g_free (statistic->histograms[j].bins); } g_free (statistic->histograms); } g_free (statistic); } /** * arv_statistic_new: (skip) * @n_histograms: number of histograms * @n_bins: number of bins for each histogram * @bin_step: bin step * @offset: offset of the first bin * Return value: a new #ArvStatistic structure */ ArvStatistic * arv_statistic_new (unsigned int n_histograms, unsigned n_bins, unsigned int bin_step, int offset) { ArvStatistic *statistic; unsigned int i; g_return_val_if_fail (n_histograms > 0, NULL); g_return_val_if_fail (n_bins > 0, NULL); g_return_val_if_fail (bin_step > 0, NULL); statistic = g_new0 (ArvStatistic, 1); statistic->n_histograms = n_histograms; statistic->n_bins = n_bins; statistic->bin_step = bin_step; statistic->offset = offset; statistic->histograms = g_new (ArvHistogram, n_histograms); for (i = 0; i < statistic->n_histograms; i++) { statistic->histograms[i].name = NULL; statistic->histograms[i].bins = g_new (guint64, statistic->n_bins); } arv_statistic_reset (statistic); return statistic; } void arv_statistic_free (ArvStatistic *statistic) { g_return_if_fail (statistic != NULL); _arv_statistic_free (statistic); } void arv_statistic_reset (ArvStatistic *statistic) { ArvHistogram *histogram; int i, j; g_return_if_fail (statistic != NULL); statistic->counter = 0; for (j = 0; j < statistic->n_histograms; j++) { histogram = &statistic->histograms[j]; histogram->last_seen_worst = 0; histogram->best = 0x7fffffff; histogram->worst = 0x80000000; histogram->and_more = histogram->and_less = 0; for (i = 0; i < statistic->n_bins; i++) histogram->bins[i] = 0; } } void arv_statistic_set_name (ArvStatistic *statistic, unsigned int histogram_id, char const *name) { ArvHistogram *histogram; size_t length; g_return_if_fail (statistic != NULL); g_return_if_fail (histogram_id < statistic->n_histograms); histogram = &statistic->histograms[histogram_id]; if (histogram->name != NULL) { g_free (histogram->name); histogram->name = NULL; } if (name == NULL) return; length = strlen (name); if (length < 1) return; histogram->name = g_malloc (length + 1); if (histogram->name == NULL) return; memcpy (histogram->name, name, length + 1); } gboolean arv_statistic_fill (ArvStatistic *statistic, guint histogram_id, int value, guint64 counter) { ArvHistogram *histogram; unsigned int class; if (statistic == NULL) return FALSE; if (histogram_id >= statistic->n_histograms) return FALSE; statistic->counter = counter; histogram = &statistic->histograms[histogram_id]; if (histogram->best > value) histogram->best = value; if (histogram->worst < value) { histogram->worst = value; histogram->last_seen_worst = counter; } class = (value - statistic->offset) / statistic->bin_step; if (value < statistic->offset) histogram->and_less++; else if (class >= statistic->n_bins) histogram->and_more++; else histogram->bins[class]++; return TRUE; } char * arv_statistic_to_string (const ArvStatistic *statistic) { int i, j, bin_max; gboolean max_found = FALSE; GString *string; char *str; g_return_val_if_fail (statistic != NULL, NULL); string = g_string_new (""); bin_max = 0; for (i = statistic->n_bins - 1; i > 0 && !max_found; i--) { for (j = 0; j < statistic->n_histograms && !max_found; j++) { if (statistic->histograms[j].bins[i] != 0) { bin_max = i; max_found = TRUE; } } } if (bin_max >= statistic->n_bins) bin_max = statistic->n_bins - 1; for (j = 0; j < statistic->n_histograms; j++) { if (j == 0) g_string_append (string, " bins "); g_string_append_printf (string, ";%8.8s", statistic->histograms[j].name != NULL ? statistic->histograms[j].name : " ---- "); } g_string_append (string, "\n"); for (i = 0; i <= bin_max; i++) { for (j = 0; j < statistic->n_histograms; j++) { if (j == 0) g_string_append_printf (string, "%8d", i * statistic->bin_step + statistic->offset); g_string_append_printf (string, ";%8Lu", (unsigned long long) statistic->histograms[j].bins[i]); } g_string_append (string, "\n"); } g_string_append (string, "-------------\n"); for (j = 0; j < statistic->n_histograms; j++) { if (j == 0) g_string_append_printf (string, ">=%6d", i * statistic->bin_step + statistic->offset); g_string_append_printf (string, ";%8Lu", (unsigned long long) statistic->histograms[j].and_more); } g_string_append (string, "\n"); for (j = 0; j < statistic->n_histograms; j++) { if (j == 0) g_string_append_printf (string, "< %6d", statistic->offset); g_string_append_printf (string, ";%8Lu", (unsigned long long) statistic->histograms[j].and_less); } g_string_append (string, "\n"); for (j = 0; j < statistic->n_histograms; j++) { if (j == 0) g_string_append (string, "min "); if (statistic->histograms[j].best != 0x7fffffff) g_string_append_printf (string, ";%8d", statistic->histograms[j].best); else g_string_append_printf (string, ";%8s", "n/a"); } g_string_append (string, "\n"); for (j = 0; j < statistic->n_histograms; j++) { if (j == 0) g_string_append (string, "max "); if (statistic->histograms[j].worst != 0x80000000) g_string_append_printf (string, ";%8d", statistic->histograms[j].worst); else g_string_append_printf (string, ";%8s", "n/a"); } g_string_append (string, "\n"); for (j = 0; j < statistic->n_histograms; j++) { if (j == 0) g_string_append (string, "last max\nat: "); g_string_append_printf (string, ";%8Lu", (unsigned long long) statistic->histograms[j].last_seen_worst); } g_string_append (string, "\n"); g_string_append_printf (string, "Counter = %8Lu", (unsigned long long) statistic->counter); str = string->str; g_string_free (string, FALSE); return str; } /** * SECTION: arvvalue * @short_description: An int64/double value storage */ ArvValue * arv_value_new_double (double v_double) { ArvValue *value = g_new (ArvValue, 1); value->type = G_TYPE_DOUBLE; value->data.v_double = v_double; return value; } ArvValue * arv_value_new_int64 (double v_int64) { ArvValue *value = g_new (ArvValue, 1); value->type = G_TYPE_INT64; value->data.v_int64 = v_int64; return value; } void arv_value_free (ArvValue *value) { g_free (value); } void arv_value_copy (ArvValue *to, const ArvValue *from) { *to = *from; } ArvValue * arv_value_duplicate (const ArvValue *from) { ArvValue *value = g_new (ArvValue, 1); if (from == NULL) return NULL; *value = *from; return value; } GType arv_value_get_type (void) { GType type_id = 0; if (type_id == 0) type_id = g_boxed_type_register_static ("ArvValue", (GBoxedCopyFunc) arv_value_duplicate, (GBoxedFreeFunc) arv_value_free); return type_id; } void arv_value_set_int64 (ArvValue *value, gint64 v_int64) { value->type = G_TYPE_INT64; value->data.v_int64 = v_int64; } void arv_value_set_double (ArvValue *value, double v_double) { value->type = G_TYPE_DOUBLE; value->data.v_double = v_double; } gint64 arv_value_get_int64 (ArvValue *value) { if (value->type == G_TYPE_INT64) return value->data.v_int64; else return (gint64) value->data.v_double; } double arv_value_get_double (ArvValue *value) { if (value->type == G_TYPE_INT64) return (double) value->data.v_int64; else return value->data.v_double; } gboolean arv_value_holds_int64 (ArvValue *value) { return value->type == G_TYPE_INT64; } double arv_value_holds_double (ArvValue *value) { return value->type == G_TYPE_DOUBLE; } void arv_copy_memory_with_endianess (void *to, size_t to_size, guint to_endianess, void *from, size_t from_size, guint from_endianess) { char *to_ptr; char *from_ptr; int i; g_return_if_fail (to != NULL); g_return_if_fail (from != NULL); if (to_endianess == G_LITTLE_ENDIAN && from_endianess == G_BIG_ENDIAN) { to_ptr = to; from_ptr = ((char *) from) + from_size - 1; if (to_size <= from_size) { for (i = 0; i < to_size; i++, to_ptr++, from_ptr--) *to_ptr = *from_ptr; } else { for (i = 0; i < from_size; i++, to_ptr++, from_ptr--) *to_ptr = *from_ptr; memset (((char *) to) + from_size, 0, to_size - from_size); } } else if (to_endianess == G_BIG_ENDIAN && from_endianess == G_LITTLE_ENDIAN) { to_ptr = ((char *) to) + to_size - 1; from_ptr = from; if (to_size <= from_size) { for (i = 0; i < to_size; i++, to_ptr--, from_ptr++) *to_ptr = *from_ptr; } else { for (i = 0; i < from_size; i++, to_ptr--, from_ptr++) *to_ptr = *from_ptr; memset (to, 0, to_size - from_size); } } else if (to_endianess == G_LITTLE_ENDIAN && from_endianess == G_LITTLE_ENDIAN) { if (to_size <= from_size) memcpy (to, from, to_size); else { memcpy (to, from, from_size); memset (((char *) to) + from_size, 0, to_size - from_size); } } else if (to_endianess == G_BIG_ENDIAN && from_endianess == G_BIG_ENDIAN) { if (to_size <= from_size) memcpy (to, ((char *) from) + from_size - to_size, to_size); else { memcpy (((char *) to) + to_size - from_size, from, from_size); memset (to, 0, to_size - from_size); } } else g_assert_not_reached (); } #define ARV_DECOMPRESS_CHUNK 16384 /** * arv_decompress: * @input_buffer: compressed data * @input_buffer: size of compressed data * @output_size: (out): placeholder for inflated data * Return value: (transfer full): a newly allocated buffer **/ void * arv_decompress (void *input_buffer, size_t input_size, size_t *output_size) { z_stream stream; GByteArray *output; guchar z_stream_output[ARV_DECOMPRESS_CHUNK]; unsigned have; int result; g_return_val_if_fail (input_buffer != NULL, NULL); g_return_val_if_fail (input_size > 0, NULL); /* allocate inflate state */ stream.zalloc = Z_NULL; stream.zfree = Z_NULL; stream.opaque = Z_NULL; stream.avail_in = 0; stream.next_in = Z_NULL; stream.data_type = Z_UNKNOWN; g_return_val_if_fail (inflateInit2(&stream, -MAX_WBITS) == Z_OK, NULL); output = g_byte_array_new (); /* decompress until deflate stream ends or end of file */ do { stream.avail_in = MIN (input_size, ARV_DECOMPRESS_CHUNK); stream.next_in = input_buffer; arv_debug_misc ("[Decompress] Input ptr = 0x%x - Chunk size = %d - %c", stream.next_in, stream.avail_in, *stream.next_in); input_size -= stream.avail_in; input_buffer = ((char *) input_buffer) + stream.avail_in; /* run inflate() on input until output buffer not full */ do { stream.avail_out = ARV_DECOMPRESS_CHUNK; stream.next_out = z_stream_output; result = inflate(&stream, Z_NO_FLUSH); if (result == Z_STREAM_ERROR) { arv_warning_misc ("[Decompress] Z_STREAM_ERROR"); goto CLEANUP; } switch (result) { case Z_NEED_DICT: arv_warning_misc ("[Decompress] Z_NEED_DICT"); goto CLEANUP; case Z_DATA_ERROR: arv_warning_misc ("[Decompress] Z_DATA_ERROR"); goto CLEANUP; case Z_MEM_ERROR: arv_warning_misc ("[Decompress] Z_MEM_ERROR"); goto CLEANUP; } have = ARV_DECOMPRESS_CHUNK - stream.avail_out; g_byte_array_append (output, z_stream_output, have); } while (stream.avail_out == 0); /* done when inflate() says it's done */ } while (input_size > 0 && result != Z_STREAM_END); /* clean up and return */ inflateEnd(&stream); if (result != Z_STREAM_END) { arv_warning_misc ("[Decompress] !Z_STREAM_END"); g_byte_array_free (output, TRUE); if (output_size != NULL) *output_size = 0; return NULL; } if (output_size != NULL) *output_size = output->len; return g_byte_array_free (output, FALSE); CLEANUP: if (output_size != NULL) *output_size = 0; g_byte_array_free (output, TRUE); inflateEnd(&stream); return NULL; } /** * SECTION: arvgst * @short_description: Gstreamer utilities */ #define ARV_MAKE_FOURCC(a,b,c,d) ((guint32)((a)|(b)<<8|(c)<<16|(d)<<24)) typedef struct { ArvPixelFormat pixel_format; const char *gst_caps_string; const char *name; const char *format; const char *gst_0_10_caps_string; const char *name_0_10; int bpp; int depth; guint32 fourcc; } ArvGstCapsInfos; ArvGstCapsInfos arv_gst_caps_infos[] = { { ARV_PIXEL_FORMAT_MONO_8, "video/x-raw, format=(string)GRAY8", "video/x-raw", "GRAY8", "video/x-raw-gray, bpp=(int)8, depth=(int)8", "video/x-raw-gray", 8, 8, 0 }, { ARV_PIXEL_FORMAT_MONO_16, "video/x-raw, format=(string)GRAY16_LE", "video/x-raw", "GRAY16_LE", "video/x-raw-gray, bpp=(int)16, depth=(int)16", "video/x-raw-gray", 16, 16, 0 }, { ARV_PIXEL_FORMAT_MONO_12, "video/x-raw, format=(string)GRAY16_LE", "video/x-raw", "GRAY16_LE", "video/x-raw-gray, bpp=(int)16, depth=(int)12", "video/x-raw-gray", 16, 12, 0 }, { ARV_PIXEL_FORMAT_MONO_12_PACKED, "video/x-raw, format=(string)GRAY16_LE", "video/x-raw", "GRAY16_LE", "video/x-raw-gray, bpp=(int)12, depth=(int)12", "video/x-raw-gray", 12, 12, 0 }, { ARV_PIXEL_FORMAT_MONO_10, "video/x-raw, format=(string)GRAY16_LE", "video/x-raw", "GRAY16_LE", "video/x-raw-gray, bpp=(int)16, depth=(int)10", "video/x-raw-gray", 16, 10, 0 }, { ARV_PIXEL_FORMAT_BAYER_GR_8, "video/x-bayer, format=(string)grbg", "video/x-bayer", "grbg", "video/x-raw-bayer, format=(string)grbg, bpp=(int)8, depth=(int)8", "video/x-raw-bayer", 8, 8, ARV_MAKE_FOURCC ('g','r','b','g') }, { ARV_PIXEL_FORMAT_BAYER_RG_8, "video/x-bayer, format=(string)rggb", "video/x-bayer", "rggb", "video/x-raw-bayer, format=(string)rggb, bpp=(int)8, depth=(int)8", "video/x-raw-bayer", 8, 8, ARV_MAKE_FOURCC ('r','g','g','b') }, { ARV_PIXEL_FORMAT_BAYER_GB_8, "video/x-bayer, format=(string)gbrg", "video/x-bayer", "gbrg", "video/x-raw-bayer, format=(string)gbrg, bpp=(int)8, depth=(int)8", "video/x-raw-bayer", 8, 8, ARV_MAKE_FOURCC ('g','b','r','g') }, { ARV_PIXEL_FORMAT_BAYER_BG_8, "video/x-bayer, format=(string)bggr", "video/x-bayer", "bggr", "video/x-raw-bayer, format=(string)bggr, bpp=(int)8, depth=(int)8", "video/x-raw-bayer", 8, 8, ARV_MAKE_FOURCC ('b','g','g','r') }, /* Non 8bit bayer formats are not supported by gstreamer bayer plugin. * This feature is discussed in bug https://bugzilla.gnome.org/show_bug.cgi?id=693666 .*/ { ARV_PIXEL_FORMAT_YUV_422_PACKED, "video/x-raw, format=(string)UYVY", "video/x-raw", "UYVY", "video/x-raw-yuv, format=(fourcc)UYVY", "video/x-raw-yuv", 0, 0, ARV_MAKE_FOURCC ('U','Y','V','Y') }, { ARV_PIXEL_FORMAT_YUV_422_YUYV_PACKED, "video/x-raw, format=(string)YUY2", "video/x-raw", "YUY2", "video/x-raw-yuv, format=(fourcc)YUYU2", "video/x-raw-yuv", 0, 0, ARV_MAKE_FOURCC ('Y','U','Y','2') }, { ARV_PIXEL_FORMAT_RGB_8_PACKED, "video/x-raw, format=(string)RGB", "video/x-raw", "RGB", "video/x-raw-rgb, format=(string)RGB, bpp=(int)24, depth=(int)24", "video/x-raw-rgb", 24, 24, 0 }, { ARV_PIXEL_FORMAT_CUSTOM_YUV_422_YUYV_PACKED, "video/x-raw, format=(string)YUY2", "video/x-raw", "YUY2", "video/x-raw-yuv, format=(fourcc)YUYU2", "video/x-raw-yuv", 0, 0, ARV_MAKE_FOURCC ('Y','U','Y','2') } }; /** * arv_pixel_format_to_gst_caps_string: * @pixel_format: a pixel format * Return value: a gstreamer caps string describing the given @pixel_format. */ const char * arv_pixel_format_to_gst_caps_string (ArvPixelFormat pixel_format) { int i; for (i = 0; i < G_N_ELEMENTS (arv_gst_caps_infos); i++) if (arv_gst_caps_infos[i].pixel_format == pixel_format) break; if (i == G_N_ELEMENTS (arv_gst_caps_infos)) { arv_warning_misc ("[PixelFormat::to_gst_caps_string] 0x%08x not found", pixel_format); return NULL; } arv_log_misc ("[PixelFormat::to_gst_caps_string] 0x%08x -> %s", pixel_format, arv_gst_caps_infos[i].gst_caps_string); return arv_gst_caps_infos[i].gst_caps_string; } ArvPixelFormat arv_pixel_format_from_gst_caps (const char *name, const char *format, int bpp, int depth) { unsigned int i; g_return_val_if_fail (name != NULL, 0); for (i = 0; i < G_N_ELEMENTS (arv_gst_caps_infos); i++) { if (strcmp (name, arv_gst_caps_infos[i].name) != 0 || (depth > 0 && depth != arv_gst_caps_infos[i].depth) || (bpp > 0 && bpp != arv_gst_caps_infos[i].bpp)) continue; if (strcmp (name, "video/x-raw") == 0 && strcmp (format, arv_gst_caps_infos[i].format) == 0) return arv_gst_caps_infos[i].pixel_format; if (strcmp (name, "video/x-bayer") == 0 && strcmp (format, arv_gst_caps_infos[i].format) == 0) return arv_gst_caps_infos[i].pixel_format; } return 0; } const char * arv_pixel_format_to_gst_0_10_caps_string (ArvPixelFormat pixel_format) { int i; for (i = 0; i < G_N_ELEMENTS (arv_gst_caps_infos); i++) if (arv_gst_caps_infos[i].pixel_format == pixel_format) break; if (i == G_N_ELEMENTS (arv_gst_caps_infos)) { arv_warning_misc ("[PixelFormat::to_gst_0_10_caps_string] 0x%08x not found", pixel_format); return NULL; } arv_log_misc ("[PixelFormat::to_gst_0_10_caps_string] 0x%08x -> %s", pixel_format, arv_gst_caps_infos[i].gst_0_10_caps_string); return arv_gst_caps_infos[i].gst_0_10_caps_string; } ArvPixelFormat arv_pixel_format_from_gst_0_10_caps (const char *name, int bpp, int depth, guint32 fourcc) { unsigned int i; g_return_val_if_fail (name != NULL, 0); for (i = 0; i < G_N_ELEMENTS (arv_gst_caps_infos); i++) { if (strcmp (name, arv_gst_caps_infos[i].name_0_10) != 0) continue; if (strcmp (name, "video/x-raw-yuv") == 0 && (fourcc <= 0 || fourcc == arv_gst_caps_infos[i].fourcc)) return arv_gst_caps_infos[i].pixel_format; if ((depth <= 0 || depth == arv_gst_caps_infos[i].depth) && (bpp <= 0 || bpp == arv_gst_caps_infos[i].bpp) && fourcc == arv_gst_caps_infos[i].fourcc) return arv_gst_caps_infos[i].pixel_format; } return 0; } static struct { const char *vendor; const char *alias; } vendor_aliases[] = { { "The Imaging Source Europe GmbH", "TIS"}, { "Point Grey Research", "PointGrey"} }; /** * arv_vendor_alias_lookup: * @vendor: a vendor string * * Returns: vendor alias string if found, or @vendor if not found. * * Since: 0.6.0 */ const char * arv_vendor_alias_lookup (const char *vendor) { int i; if (vendor == NULL) return NULL; for (i = 0; i < G_N_ELEMENTS (vendor_aliases); i++) if (g_strcmp0 (vendor_aliases[i].vendor, vendor) == 0) return vendor_aliases[i].alias; return vendor; } aravis-ARAVIS_0_6_0/src/arvmisc.h000066400000000000000000000060111334570641500166230ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_TOOLS_H #define ARV_TOOLS_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS typedef struct _ArvStatistic ArvStatistic; ArvStatistic * arv_statistic_new (guint n_histograms, guint n_bins, guint bin_step, int offset); void arv_statistic_free (ArvStatistic *statistic); void arv_statistic_reset (ArvStatistic *statistic); gboolean arv_statistic_fill (ArvStatistic *statistic, guint histogram_id, int value, guint64 counter); void arv_statistic_set_name (ArvStatistic *statistic, guint histogram_id, char const *name); char * arv_statistic_to_string (const ArvStatistic *statistic); #define ARV_TYPE_VALUE (arv_value_get_type()) GType arv_value_get_type (void); typedef struct _ArvValue ArvValue; struct _ArvValue { GType type; union { gint64 v_int64; double v_double; } data; }; ArvValue * arv_value_new_double (double v_double); ArvValue * arv_value_new_int64 (double v_int64); void arv_value_free (ArvValue *value); void arv_value_copy (ArvValue *to, const ArvValue *from); void arv_value_set_int64 (ArvValue *value, gint64 v_int64); void arv_value_set_double (ArvValue *value, double v_double); gint64 arv_value_get_int64 (ArvValue *value); double arv_value_get_double (ArvValue *value); gboolean arv_value_holds_int64 (ArvValue *value); double arv_value_holds_double (ArvValue *value); void arv_copy_memory_with_endianess (void *to, size_t to_size, guint to_endianess, void *from, size_t from_size, guint from_endianess); void * arv_decompress (void *input_buffer, size_t input_size, size_t *output_size); const char * arv_pixel_format_to_gst_caps_string (ArvPixelFormat pixel_format); ArvPixelFormat arv_pixel_format_from_gst_caps (const char *name, const char *format, int bpp, int depth); const char * arv_pixel_format_to_gst_0_10_caps_string (ArvPixelFormat pixel_format); ArvPixelFormat arv_pixel_format_from_gst_0_10_caps (const char *name, int bpp, int depth, guint32 fourcc); const char * arv_vendor_alias_lookup (const char *vendor); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvrealtime.c000066400000000000000000000214641334570641500174760ustar00rootroot00000000000000/*** Copyright 2009 Lennart Poettering Copyright 2010 David Henningsson Copyright 2014 Emmanuel Pacaud Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. This file is based on rtkit sources, ported from libdbus to glib gdbus API. ***/ #include #include #include #include #include #include #include #include #include #define RTKIT_SERVICE_NAME "org.freedesktop.RealtimeKit1" #define RTKIT_OBJECT_PATH "/org/freedesktop/RealtimeKit1" #define ARV_RTKIT_ERROR arv_rtkit_error_quark () typedef enum { ARV_RTKIT_ERROR_PERMISSION_DENIED, ARV_RTKIT_ERROR_WRONG_REPLY } ArvRtkitError; static GQuark arv_rtkit_error_quark (void) { return g_quark_from_static_string ("arv-rtkit-error-quark"); } static gint64 arv_rtkit_get_int_property (GDBusConnection *connection, const char* propname, GError **error) { GDBusMessage *message; GDBusMessage *reply; GError *local_error = NULL; GVariant *body; GVariant *parameter; GVariant *variant; const GVariantType *variant_type; gint64 value; message = g_dbus_message_new_method_call (RTKIT_SERVICE_NAME, RTKIT_OBJECT_PATH, "org.freedesktop.DBus.Properties", "Get"); g_dbus_message_set_body (message, g_variant_new ("(ss)", "org.freedesktop.RealtimeKit1", propname)); reply = g_dbus_connection_send_message_with_reply_sync (connection, message, G_DBUS_SEND_MESSAGE_FLAGS_NONE, 1000, NULL, NULL, &local_error); g_object_unref (message); if (local_error != NULL) { g_propagate_error (error, local_error); return 0; } if (g_dbus_message_get_message_type (reply) != G_DBUS_MESSAGE_TYPE_METHOD_RETURN) { local_error = g_error_new (ARV_RTKIT_ERROR, ARV_RTKIT_ERROR_PERMISSION_DENIED, "%s", g_dbus_message_get_error_name (reply)); g_propagate_error (error, local_error); g_object_unref (reply); return 0; } if (!g_variant_type_equal ("v", g_dbus_message_get_signature (reply))) { local_error = g_error_new (ARV_RTKIT_ERROR, ARV_RTKIT_ERROR_WRONG_REPLY, "Invalid reply signature"); g_propagate_error (error, local_error); g_object_unref (reply); return 0; } body = g_dbus_message_get_body (reply); parameter = g_variant_get_child_value (body, 0); variant = g_variant_get_variant (parameter); variant_type = g_variant_get_type (variant); if (g_variant_type_equal (variant_type, G_VARIANT_TYPE_INT32)) value = g_variant_get_int32 (variant); else if (g_variant_type_equal (variant_type, G_VARIANT_TYPE_INT64)) value = g_variant_get_int64 (variant); else value = 0; g_variant_unref (parameter); g_variant_unref (variant); g_object_unref (reply); return value; } int arv_rtkit_get_max_realtime_priority (GDBusConnection *connection, GError **error) { return arv_rtkit_get_int_property (connection, "MaxRealtimePriority", error); } int arv_rtkit_get_min_nice_level (GDBusConnection *connection, GError **error) { return arv_rtkit_get_int_property (connection, "MinNiceLevel", error); } gint64 arv_rtkit_get_rttime_usec_max (GDBusConnection *connection, GError **error) { GError *local_error = NULL; gint64 rttime_usec_max; rttime_usec_max = arv_rtkit_get_int_property (connection, "RTTimeUSecMax", &local_error); if (local_error == NULL) return rttime_usec_max; g_error_free (local_error); return arv_rtkit_get_int_property (connection, "RTTimeNSecMax", error) / 1000; } void arv_rtkit_make_realtime (GDBusConnection *connection, pid_t thread, int priority, GError **error) { GDBusMessage *message; GDBusMessage *reply; GError *local_error = NULL; message = g_dbus_message_new_method_call (RTKIT_SERVICE_NAME, RTKIT_OBJECT_PATH, "org.freedesktop.RealtimeKit1", "MakeThreadRealtime"); g_dbus_message_set_body (message, g_variant_new ("(tu)", thread, priority)); reply = g_dbus_connection_send_message_with_reply_sync (connection, message, G_DBUS_SEND_MESSAGE_FLAGS_NONE, 1000, NULL, NULL, &local_error); g_object_unref (message); if (local_error != NULL) { g_propagate_error (error, local_error); return; } if (g_dbus_message_get_message_type (reply) != G_DBUS_MESSAGE_TYPE_METHOD_RETURN) { local_error = g_error_new (ARV_RTKIT_ERROR, 0, "%s", g_dbus_message_get_error_name (reply)); g_propagate_error (error, local_error); g_object_unref (reply); return; } g_object_unref (reply); } void arv_rtkit_make_high_priority (GDBusConnection *connection, pid_t thread, int nice_level, GError **error) { GDBusMessage *message; GDBusMessage *reply; GError *local_error = NULL; message = g_dbus_message_new_method_call (RTKIT_SERVICE_NAME, RTKIT_OBJECT_PATH, "org.freedesktop.RealtimeKit1", "MakeThreadHighPriority"); g_dbus_message_set_body (message, g_variant_new ("(ti)", thread, nice_level)); reply = g_dbus_connection_send_message_with_reply_sync (connection, message, G_DBUS_SEND_MESSAGE_FLAGS_NONE, 1000, NULL, NULL, &local_error); g_object_unref (message); if (local_error != NULL) { g_propagate_error (error, local_error); return; } if (g_dbus_message_get_message_type (reply) != G_DBUS_MESSAGE_TYPE_METHOD_RETURN) { local_error = g_error_new (ARV_RTKIT_ERROR, 0, "%s", g_dbus_message_get_error_name (reply)); g_propagate_error (error, local_error); g_object_unref (reply); return; } g_object_unref (reply); } #ifndef SCHED_RESET_ON_FORK #define SCHED_RESET_ON_FORK 0x40000000 #endif #ifndef RLIMIT_RTTIME #define RLIMIT_RTTIME 15 #endif static pid_t _gettid(void) { return (pid_t) syscall(SYS_gettid); } /** * arv_make_thread_realtime: * @priority: realtime priority * * Returns: %TRUE on success. * * Try to make current thread realtime. It first try to use sched_setscheduler, * and if it fails, use rtkit. * * Since: 0.4.0 */ #ifndef __APPLE__ gboolean arv_make_thread_realtime (int priority) { struct sched_param p; memset(&p, 0, sizeof(p)); p.sched_priority = priority; if (sched_setscheduler(_gettid (), SCHED_RR|SCHED_RESET_ON_FORK, &p) < 0 && errno == EPERM) { struct rlimit rlim; GDBusConnection *bus; GError *error = NULL; memset(&rlim, 0, sizeof(rlim)); rlim.rlim_cur = rlim.rlim_max = 100000000ULL; /* 100ms */ if ((setrlimit(RLIMIT_RTTIME, &rlim) < 0)) { arv_warning_misc ("Failed to set RLIMIT_RTTIME: %s", strerror (errno)); return FALSE; } bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); if (error != NULL) { arv_warning_misc ("Failed to connect to system bus: %s", error->message); g_error_free (error); return FALSE; } arv_rtkit_make_realtime(bus, _gettid (), p.sched_priority, &error); g_object_unref (bus); if (error != NULL) { arv_warning_misc ("Failed to connect make realtime: %s", error->message); g_error_free (error); return FALSE; } arv_debug_misc ("Thread became realtime with priority %d", priority); return TRUE; } return TRUE; } #else gboolean arv_make_thread_realtime (int priority) { arv_debug_misc ("SCHED API not supported on OSX"); return FALSE; } #endif /** * arv_make_thread_high_priority: * @nice_level: new nice level * * Returns: %TRUE on success. * * Try to set current thread nice level to high priority, using rtkit. * * Since: 0.4.0 */ gboolean arv_make_thread_high_priority (int nice_level) { GDBusConnection *bus; GError *error = NULL; bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); if (error != NULL) { arv_warning_misc ("Failed to connect to system bus: %s", error->message); g_error_free (error); return FALSE; } arv_rtkit_make_high_priority (bus, _gettid(), nice_level, &error); g_object_unref (bus); if (error != NULL) { arv_warning_misc ("Failed to connect high priority: %s", error->message); g_error_free (error); return FALSE; } arv_debug_misc ("Nice level successfully changed to %d", nice_level); return TRUE; } aravis-ARAVIS_0_6_0/src/arvrealtime.h000066400000000000000000000005161334570641500174760ustar00rootroot00000000000000#ifndef ARV_REALTIME_H #define ARV_REALTIME_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS gboolean arv_make_thread_realtime (int priority); gboolean arv_make_thread_high_priority (int nice_level); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvrealtimeprivate.h000066400000000000000000000013141334570641500210660ustar00rootroot00000000000000#ifndef ARV_REALTIME_PRIVATE_H #define ARV_REALTIME_PRIVATE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include int arv_rtkit_get_max_realtime_priority (GDBusConnection *connection, GError **error); int arv_rtkit_get_min_nice_level (GDBusConnection *connection, GError **error); gint64 arv_rtkit_get_rttime_usec_max (GDBusConnection *connection, GError **error); void arv_rtkit_make_realtime (GDBusConnection *connection, pid_t thread, int priority, GError **error); void arv_rtkit_make_high_priority (GDBusConnection *connection, pid_t thread, int nice_level, GError **error); #endif aravis-ARAVIS_0_6_0/src/arvstr.c000066400000000000000000000147771334570641500165150ustar00rootroot00000000000000/* Lasem * * Copyright © 2009 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ #include #include #include #include #include /** * SECTION: arvstr * @short_description: String utilities */ /** * arv_str_strip: * @str: (allow-none): a string * @illegal_chars: illegal characters * @replacement_char: replacement character * * Remove any @illegal_chars from @str, and replace them by @replacement_char if they are not at the end or at the beginning of @str. * Several consecutive @illegal_chars are replaced by only one @replacement_char. @illegal_chars at the beginnig or at the end of @str * are simply removed. * * If @replacement_char is '\0', all @illegal_chars are simply removed. * * Returns: @str * * Since: 0.4.0 */ char * arv_str_strip (char *str, const char *illegal_chars, char replacement_char) { char *last_char = NULL; char *ptr = str; char *out = str; unsigned int n_illegal_chars; unsigned int i; if (str == NULL || illegal_chars == NULL) return str; n_illegal_chars = strlen (illegal_chars); if (n_illegal_chars == 0) return str; while (*ptr != '\0') { gboolean found = FALSE; for (i = 0; i < n_illegal_chars && !found; i++) found = illegal_chars[i] == *ptr; if (found) { if (last_char == out && replacement_char != '\0') { *out = replacement_char; out++; } } else { *out = *ptr; out++; last_char = out; } ptr++; } if (last_char != NULL) *last_char = '\0'; else *str = '\0'; return str; } /* http://www.ietf.org/rfc/rfc2396.txt - Implementation comes from librsvg (rsvg-base.c). */ gboolean arv_str_is_uri (const char *str) { char const *p; if (str == NULL) return FALSE; if (strlen (str) < 4) return FALSE; if ( (str[0] < 'a' || str[0] > 'z') && (str[0] < 'A' || str[0] > 'Z')) return FALSE; for (p = &str[1]; (*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z') || (*p >= '0' && *p <= '9') || *p == '+' || *p == '-' || *p == '.'; p++); if (strlen (p) < 3) return FALSE; return (p[0] == ':' && p[1] == '/' && p[2] == '/'); } char * arv_str_to_uri (const char *str) { gchar *current_dir; gchar *absolute_filename; gchar *uri; if (str == NULL) return NULL; if (arv_str_is_uri (str)) return g_strdup (str); if (g_path_is_absolute (str)) return g_filename_to_uri (str, NULL, NULL); current_dir = g_get_current_dir (); absolute_filename = g_build_filename (current_dir, str, NULL); uri = g_filename_to_uri (absolute_filename, NULL, NULL); g_free (absolute_filename); g_free (current_dir); return uri; } gboolean arv_str_parse_double (char **str, double *x) { char *end, *c; gboolean integer_part = FALSE; gboolean fractional_part = FALSE; gboolean exponent_part = FALSE; double mantissa = 0.0; double exponent =0.0; double divisor; gboolean mantissa_sign = 1.0; gboolean exponent_sign = 1.0; c = *str; if (*c == '-') { mantissa_sign = -1.0; c++; } else if (*c == '+') c++; if (*c >= '0' && *c <= '9') { integer_part = TRUE; mantissa = *c - '0'; c++; while (*c >= '0' && *c <= '9') { mantissa = mantissa * 10.0 + *c - '0'; c++; } } if (*c == '.') c++; else if (!integer_part) return FALSE; if (*c >= '0' && *c <= '9') { fractional_part = TRUE; mantissa += (*c - '0') * 0.1; divisor = 0.01; c++; while (*c >= '0' && *c <= '9') { mantissa += (*c - '0') * divisor; divisor *= 0.1; c++; } } if (!fractional_part && !integer_part) return FALSE; end = c; if (*c == 'E' || *c == 'e') { c++; if (*c == '-') { exponent_sign = -1.0; c++; } else if (*c == '+') c++; if (*c >= '0' && *c <= '9') { exponent_part = TRUE; exponent = *c - '0'; c++; while (*c >= '0' && *c <= '9') { exponent = exponent * 10.0 + *c - '0'; c++; } } } if (exponent_part) { end = c; *x = mantissa_sign * mantissa * pow (10.0, exponent_sign * exponent); } else *x = mantissa_sign * mantissa; *str = end; return TRUE; } unsigned int arv_str_parse_double_list (char **str, unsigned int n_values, double *values) { char *ptr = *str; unsigned int i; arv_str_skip_comma_and_spaces (str); for (i = 0; i < n_values; i++) { if (!arv_str_parse_double (str, &values[i])) { *str = ptr; return i; } arv_str_skip_comma_and_spaces (str); } return i; } /** * arv_g_string_append_hex_dump: * @string: a #GString * @data: binary data * @size: size of binary data * * Adds an hexadecimal dump of @data to @string, which consists in lines displaying the data adress, 16 8 bit values in hexadecimal representation, followed by their corresponding ASCII character (replaced by a dot for control ones). * * Here is an example of the output: * * 01e0 c8 b7 89 b0 45 fa 3d 9d 8c e9 a7 33 46 85 1f 2c ....E.=....3F.., * 01f0 3f 4c ba 8d 99 f3 ff d0 40 78 73 37 32 e5 4f 9f ?L......@xs72.O. * 0200 d0 d2 f2 ef 5a 2f fc 61 e3 64 36 21 ....Z/.a.d6! */ void arv_g_string_append_hex_dump (GString *string, const void *data, size_t size) { guint64 i, j, index; for (i = 0; i < (size + 15) / 16; i++) { for (j = 0; j < 16; j++) { index = i * 16 + j; if (j == 0) g_string_append_printf (string, "%08" G_GINT64_MODIFIER "x", i * 16); if (index < size) g_string_append_printf (string, " %02x", *((guint8 *) data + index)); else g_string_append (string, " "); } for (j = 0; j < 16; j++) { index = i * 16 + j; if (j == 0) g_string_append (string, " "); if (index < size) if (*((char *) data + index) >= ' ' && *((char *) data + index) < '\x7f') g_string_append_c (string, *((char *) data + index)); else g_string_append_c (string, '.'); else g_string_append_c (string, ' '); } if (index < size) g_string_append (string, "\n"); } } aravis-ARAVIS_0_6_0/src/arvstr.h000066400000000000000000000040301334570641500164770ustar00rootroot00000000000000/* Lasem * * Copyright © 2009 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: * Emmanuel Pacaud */ #ifndef ARV_STR_H #define ARV_STR_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS char * arv_str_strip (char *str, const char *illegal_chars, char replacement_char); gboolean arv_str_is_uri (const char *str); char * arv_str_to_uri (const char *str); gboolean arv_str_parse_double (char **str, double *x); unsigned int arv_str_parse_double_list (char **str, unsigned int n_values, double *values); static inline void arv_str_skip_spaces (char **str) { while (g_ascii_isspace (**str)) (*str)++; } static inline void arv_str_skip_char (char **str, char c) { while (**str == c) (*str)++; } static inline void arv_str_skip_comma_and_spaces (char **str) { while (g_ascii_isspace (**str) || **str == ',') (*str)++; } static inline void arv_str_skip_semicolon_and_spaces (char **str) { while (g_ascii_isspace (**str) || **str == ';') (*str)++; } static inline void arv_str_skip_colon_and_spaces (char **str) { while (g_ascii_isspace (**str) || **str == ':') (*str)++; } void arv_g_string_append_hex_dump (GString *string, const void *data, size_t size); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvstream.c000066400000000000000000000257311334570641500171700ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvstream * @short_description: Abstract base class for video stream reception * * #ArvStream provides an abstract base class for the implementation of video * stream reception threads. The interface between the reception thread and the * main thread is done using asynchronous queues, containing #ArvBuffer * objects. */ #include #include #include enum { ARV_STREAM_SIGNAL_NEW_BUFFER, ARV_STREAM_SIGNAL_LAST } ArvStreamSignals; static guint arv_stream_signals[ARV_STREAM_SIGNAL_LAST] = {0}; enum { ARV_STREAM_PROPERTY_0, ARV_STREAM_PROPERTY_EMIT_SIGNALS, ARV_STREAM_PROPERTY_LAST } ArvStreamProperties; static GObjectClass *parent_class = NULL; struct _ArvStreamPrivate { GAsyncQueue *input_queue; GAsyncQueue *output_queue; GRecMutex mutex; gboolean emit_signals; }; /** * arv_stream_push_buffer: * @stream: a #ArvStream * @buffer: (transfer full): buffer to push * * Pushes a #ArvBuffer to the @stream thread. The @stream takes ownership of @buffer, * and will free all the buffers still in its queues when destroyed. * * This method is thread safe. * * Since: 0.2.0 */ void arv_stream_push_buffer (ArvStream *stream, ArvBuffer *buffer) { g_return_if_fail (ARV_IS_STREAM (stream)); g_return_if_fail (ARV_IS_BUFFER (buffer)); g_async_queue_push (stream->priv->input_queue, buffer); } /** * arv_stream_pop_buffer: * @stream: a #ArvStream * * Pops a buffer from the output queue of @stream. The retrieved buffer * may contain an invalid image. Caller should check the buffer status before using it. * This function blocks until a buffer is available. * * This method is thread safe. * * Returns: (transfer full): a #ArvBuffer * * Since: 0.2.0 */ ArvBuffer * arv_stream_pop_buffer (ArvStream *stream) { g_return_val_if_fail (ARV_IS_STREAM (stream), NULL); return g_async_queue_pop (stream->priv->output_queue); } /** * arv_stream_try_pop_buffer: * @stream: a #ArvStream * * Pops a buffer from the output queue of @stream. The retrieved buffer * may contain an invalid image. Caller should check the buffer status before using it. * This is the non blocking version of pop_buffer. * * This method is thread safe. * * Returns: (transfer full): a #ArvBuffer, NULL if no buffer is available. * * Since: 0.2.0 */ ArvBuffer * arv_stream_try_pop_buffer (ArvStream *stream) { g_return_val_if_fail (ARV_IS_STREAM (stream), NULL); return g_async_queue_try_pop (stream->priv->output_queue); } /** * arv_stream_timeout_pop_buffer: * @stream: a #ArvStream * @timeout: timeout, in µs * * Pops a buffer from the output queue of @stream, waiting no more than @timeout. The retrieved buffer * may contain an invalid image. Caller should check the buffer status before using it. * * This method is thread safe. * * Returns: (transfer full): a #ArvBuffer, NULL if no buffer is available until the timeout occurs. * * Since: 0.2.0 */ ArvBuffer * arv_stream_timeout_pop_buffer (ArvStream *stream, guint64 timeout) { g_return_val_if_fail (ARV_IS_STREAM (stream), NULL); return g_async_queue_timeout_pop (stream->priv->output_queue, timeout); } /** * arv_stream_pop_input_buffer: (skip) * @stream: (transfer full): a #ArvStream * * Pops a buffer from the input queue of @stream. * * Since: 0.2.0 */ ArvBuffer * arv_stream_pop_input_buffer (ArvStream *stream) { g_return_val_if_fail (ARV_IS_STREAM (stream), NULL); return g_async_queue_try_pop (stream->priv->input_queue); } void arv_stream_push_output_buffer (ArvStream *stream, ArvBuffer *buffer) { g_return_if_fail (ARV_IS_STREAM (stream)); g_return_if_fail (ARV_IS_BUFFER (buffer)); g_async_queue_push (stream->priv->output_queue, buffer); g_rec_mutex_lock (&stream->priv->mutex); if (stream->priv->emit_signals) g_signal_emit (stream, arv_stream_signals[ARV_STREAM_SIGNAL_NEW_BUFFER], 0); g_rec_mutex_unlock (&stream->priv->mutex); } /** * arv_stream_get_n_buffers: * @stream: a #ArvStream * @n_input_buffers: (out) (allow-none): input queue length * @n_output_buffers: (out) (allow-none): output queue length * * An accessor to the stream buffer queue lengths. * * Since: 0.2.0 */ void arv_stream_get_n_buffers (ArvStream *stream, gint *n_input_buffers, gint *n_output_buffers) { if (!ARV_IS_STREAM (stream)) { if (n_input_buffers != NULL) *n_input_buffers = 0; if (n_output_buffers != NULL) *n_output_buffers = 0; return; } if (n_input_buffers != NULL) *n_input_buffers = g_async_queue_length (stream->priv->input_queue); if (n_output_buffers != NULL) *n_output_buffers = g_async_queue_length (stream->priv->output_queue); } /** * arv_stream_get_statistics: * @stream: a #ArvStream * @n_completed_buffers: (out) (allow-none): number of complete received buffers * @n_failures: (out) (allow-none): number of reception failures * @n_underruns: (out) (allow-none): number of input buffer underruns * * An accessor to the stream statistics. * * Since: 0.2.0 */ void arv_stream_get_statistics (ArvStream *stream, guint64 *n_completed_buffers, guint64 *n_failures, guint64 *n_underruns) { ArvStreamClass *stream_class; guint64 dummy; if (n_completed_buffers == NULL) n_completed_buffers = &dummy; if (n_failures == NULL) n_failures = &dummy; if (n_underruns == NULL) n_underruns = &dummy; *n_completed_buffers = 0; *n_failures = 0; *n_underruns = 0; g_return_if_fail (ARV_IS_STREAM (stream)); stream_class = ARV_STREAM_GET_CLASS (stream); if (stream_class->get_statistics != NULL) stream_class->get_statistics (stream, n_completed_buffers, n_failures, n_underruns); } /** * arv_stream_set_emit_signals: * @stream: a #ArvStream * @emit_signals: the new state * * Make @stream emit signals. This option is * by default disabled because signal emission is expensive and unneeded when * the application prefers to operate in pull mode. * * Since: 0.2.0 */ void arv_stream_set_emit_signals (ArvStream *stream, gboolean emit_signals) { g_return_if_fail (ARV_IS_STREAM (stream)); g_rec_mutex_lock (&stream->priv->mutex); stream->priv->emit_signals = emit_signals; g_rec_mutex_unlock (&stream->priv->mutex); } /** * arv_stream_get_emit_signals: * @stream: a #ArvStream * * Check if stream will emit its signals. * * Returns: %TRUE if @stream is emiting its signals. * * Since: 0.2.0 */ gboolean arv_stream_get_emit_signals (ArvStream *stream) { gboolean ret; g_return_val_if_fail (ARV_IS_STREAM (stream), FALSE); g_rec_mutex_lock (&stream->priv->mutex); ret = stream->priv->emit_signals; g_rec_mutex_unlock (&stream->priv->mutex); return ret; } static void arv_stream_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { ArvStream *stream = ARV_STREAM (object); switch (prop_id) { case ARV_STREAM_PROPERTY_EMIT_SIGNALS: arv_stream_set_emit_signals (stream, g_value_get_boolean (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void arv_stream_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { ArvStream *stream = ARV_STREAM (object); switch (prop_id) { case ARV_STREAM_PROPERTY_EMIT_SIGNALS: g_value_set_boolean (value, arv_stream_get_emit_signals (stream)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void arv_stream_init (ArvStream *stream) { stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, ARV_TYPE_STREAM, ArvStreamPrivate); stream->priv->input_queue = g_async_queue_new (); stream->priv->output_queue = g_async_queue_new (); stream->priv->emit_signals = FALSE; g_rec_mutex_init (&stream->priv->mutex); } static void arv_stream_finalize (GObject *object) { ArvStream *stream = ARV_STREAM (object); ArvBuffer *buffer; arv_debug_stream ("[Stream::finalize] Flush %d buffer[s] in input queue", g_async_queue_length (stream->priv->input_queue)); arv_debug_stream ("[Stream::finalize] Flush %d buffer[s] in output queue", g_async_queue_length (stream->priv->output_queue)); if (stream->priv->emit_signals) { g_warning ("Stream finalized with 'new-buffer' signal enabled"); g_warning ("Please call arv_stream_set_emit_signals (stream, FALSE) before ArvStream object finalization"); } do { buffer = g_async_queue_try_pop (stream->priv->output_queue); if (buffer != NULL) g_object_unref (buffer); } while (buffer != NULL); do { buffer = g_async_queue_try_pop (stream->priv->input_queue); if (buffer != NULL) g_object_unref (buffer); } while (buffer != NULL); g_async_queue_unref (stream->priv->input_queue); g_async_queue_unref (stream->priv->output_queue); g_rec_mutex_clear (&stream->priv->mutex); parent_class->finalize (object); } static void arv_stream_class_init (ArvStreamClass *node_class) { GObjectClass *object_class = G_OBJECT_CLASS (node_class); g_type_class_add_private (node_class, sizeof (ArvStreamPrivate)); parent_class = g_type_class_peek_parent (node_class); object_class->finalize = arv_stream_finalize; object_class->set_property = arv_stream_set_property; object_class->get_property = arv_stream_get_property; /** * ArvStream::new-buffer: * @stream: the stream that emited the signal * * Signal that a new buffer is available. * * This signal is emited from the stream receive thread and only when the * "emit-signals" property is %TRUE. * * The new buffer can be retrieved with arv_stream_pop_buffer(). * * Note that this signal is only emited when the "emit-signals" property is * set to %TRUE, which it is not by default for performance reasons. * * Since: 0.2.0 */ arv_stream_signals[ARV_STREAM_SIGNAL_NEW_BUFFER] = g_signal_new ("new-buffer", G_TYPE_FROM_CLASS (node_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (ArvStreamClass, new_buffer), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); g_object_class_install_property ( object_class, ARV_STREAM_PROPERTY_EMIT_SIGNALS, g_param_spec_boolean ("emit-signals", "Emit signals", "Emit signals", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS) ); } G_DEFINE_ABSTRACT_TYPE (ArvStream, arv_stream, G_TYPE_OBJECT) aravis-ARAVIS_0_6_0/src/arvstream.h000066400000000000000000000066001334570641500171670ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_STREAM_H #define ARV_STREAM_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS /** * ArvStreamCallbackType: * @ARV_STREAM_CALLBACK_TYPE_INIT: thread initialization, happens once * @ARV_STREAM_CALLBACK_TYPE_EXIT: thread end, happens once * @ARV_STREAM_CALLBACK_TYPE_START_BUFFER: buffer filling start, happens at each frame * @ARV_STREAM_CALLBACK_TYPE_BUFFER_DONE: buffer filled, happens at each frame * * Describes when the stream callback is called. */ typedef enum { ARV_STREAM_CALLBACK_TYPE_INIT, ARV_STREAM_CALLBACK_TYPE_EXIT, ARV_STREAM_CALLBACK_TYPE_START_BUFFER, ARV_STREAM_CALLBACK_TYPE_BUFFER_DONE } ArvStreamCallbackType; typedef void (*ArvStreamCallback) (void *user_data, ArvStreamCallbackType type, ArvBuffer *buffer); #define ARV_TYPE_STREAM (arv_stream_get_type ()) #define ARV_STREAM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_STREAM, ArvStream)) #define ARV_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_STREAM, ArvStreamClass)) #define ARV_IS_STREAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_STREAM)) #define ARV_IS_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_STREAM)) #define ARV_STREAM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_STREAM, ArvStreamClass)) typedef struct _ArvStreamPrivate ArvStreamPrivate; typedef struct _ArvStreamClass ArvStreamClass; struct _ArvStream { GObject object; ArvStreamPrivate *priv; }; struct _ArvStreamClass { GObjectClass parent_class; void (*get_statistics) (ArvStream *stream, guint64 *n_completed_buffers, guint64 *n_failures, guint64 *n_underruns); /* signals */ void (*new_buffer) (ArvStream *stream); }; GType arv_stream_get_type (void); void arv_stream_push_buffer (ArvStream *stream, ArvBuffer *buffer); ArvBuffer * arv_stream_pop_buffer (ArvStream *stream); ArvBuffer * arv_stream_try_pop_buffer (ArvStream *stream); ArvBuffer * arv_stream_timeout_pop_buffer (ArvStream *stream, guint64 timeout); void arv_stream_get_n_buffers (ArvStream *stream, gint *n_input_buffers, gint *n_output_buffers); void arv_stream_get_statistics (ArvStream *stream, guint64 *n_completed_buffers, guint64 *n_failures, guint64 *n_underruns); void arv_stream_set_emit_signals (ArvStream *stream, gboolean emit_signals); gboolean arv_stream_get_emit_signals (ArvStream *stream); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvstreamprivate.h000066400000000000000000000023501334570641500205600ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_STREAM_PRIVATE_H #define ARV_STREAM_PRIVATE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS ArvBuffer * arv_stream_pop_input_buffer (ArvStream *stream); void arv_stream_push_output_buffer (ArvStream *stream, ArvBuffer *buffer); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvsystem.c000066400000000000000000000227131334570641500172160ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #include #include #include #ifdef ARAVIS_BUILD_USB #include #endif #include #include #include #include #include static GMutex arv_system_mutex; /** * SECTION: arv * @short_description: Device discovery and instantiation * * This module contans a set of APIs that allows to list and enable/disable the available interfaces, * and list and instantiate devices. */ typedef struct { const char *interface_id; gboolean is_available; ArvInterface * (*get_interface_instance) (void); void (*destroy_interface_instance) (void); } ArvInterfaceInfos; ArvInterfaceInfos interfaces[] = { { .interface_id = "Fake", .is_available = FALSE, .get_interface_instance = arv_fake_interface_get_instance, .destroy_interface_instance = arv_fake_interface_destroy_instance }, #ifdef ARAVIS_BUILD_USB { .interface_id = "USB3Vision", .is_available = TRUE, .get_interface_instance = arv_uv_interface_get_instance, .destroy_interface_instance = arv_uv_interface_destroy_instance }, #endif { .interface_id = "GigEVision", .is_available = TRUE, .get_interface_instance = arv_gv_interface_get_instance, .destroy_interface_instance = arv_gv_interface_destroy_instance } }; /** * arv_get_n_interfaces: * * Gets the number of available interfaces, including the disabled ones. * * Returns: The number of available interfaces. */ unsigned int arv_get_n_interfaces (void) { return G_N_ELEMENTS (interfaces); } /** * arv_get_interface_id: * @index: interface index * * Retrieves the interface identifier. Possible values are 'Fake', 'USB3Vision' * and 'GigEVision'. * * Returns: The interfae identifier string. */ const char * arv_get_interface_id (unsigned int index) { if (index >= G_N_ELEMENTS (interfaces)) return NULL; return interfaces[index].interface_id; } /** * arv_enable_interface: * @interface_id: name of the interface * * Enable an interface by name. By default, all interfaces are enabled, except 'Fake'. */ void arv_enable_interface (const char *interface_id) { guint i; g_return_if_fail (interface_id != NULL); for (i = 0; i < G_N_ELEMENTS (interfaces) ; i++) if (strcmp (interface_id, interfaces[i].interface_id) == 0) { interfaces[i].is_available = TRUE; return; } g_warning ("[Arv::enable_interface] Unknown interface '%s'", interface_id); } /** * arv_disable_interface: * @interface_id: name of the interface * * Disable an interface by name. By default, all interfaces are enabled, except 'Fake'. */ void arv_disable_interface (const char *interface_id) { guint i; g_return_if_fail (interface_id != NULL); for (i = 0; i < G_N_ELEMENTS (interfaces); i++) if (strcmp (interface_id, interfaces[i].interface_id) == 0) { interfaces[i].is_available = FALSE; return; } g_warning ("[Arv::enable_interface] Unknown interface '%s'", interface_id); } /** * arv_update_device_list: * * Updates the list of currently online devices. **/ void arv_update_device_list (void) { unsigned int i; g_mutex_lock (&arv_system_mutex); for (i = 0; i < G_N_ELEMENTS (interfaces); i++) { ArvInterface *interface; if (interfaces[i].is_available) { interface = interfaces[i].get_interface_instance (); arv_interface_update_device_list (interface); } } g_mutex_unlock (&arv_system_mutex); } /** * arv_get_n_devices: * * Retrieves the number of currently online devices. This value is valid until * the next call to arv_update_device_list(). * * Returns: The number of currently online devices. **/ unsigned int arv_get_n_devices (void) { unsigned int n_devices = 0; unsigned int i; g_mutex_lock (&arv_system_mutex); for (i = 0; i < G_N_ELEMENTS (interfaces); i++) { ArvInterface *interface; if (interfaces[i].is_available) { interface = interfaces[i].get_interface_instance (); n_devices += arv_interface_get_n_devices (interface); } } g_mutex_unlock (&arv_system_mutex); return n_devices; } static const char * arv_get_info (unsigned int index, const char *get_info (ArvInterface *, guint)) { unsigned int offset = 0; unsigned int i; const char *info; g_mutex_lock (&arv_system_mutex); for (i = 0; i < G_N_ELEMENTS (interfaces); i++) { ArvInterface *interface; unsigned int n_devices; if (interfaces[i].is_available) { interface = interfaces[i].get_interface_instance (); n_devices = arv_interface_get_n_devices (interface); if (index - offset < n_devices) { info = get_info (interface, index - offset); g_mutex_unlock (&arv_system_mutex); return info; } offset += n_devices; } } g_mutex_unlock (&arv_system_mutex); return NULL; } /** * arv_get_device_id: * @index: device index * * Queries the unique device id corresponding to index. Prior to this * call the arv_update_device_list() function must be called. * * Returns: a unique device id * * Since: 0.2.0 */ const char * arv_get_device_id (unsigned int index) { return arv_get_info (index, arv_interface_get_device_id); } /** * arv_get_device_physical_id: * @index: device index * * Queries the physical device id corresponding to index such * as the MAC address for Ethernet based devices, bus id for PCI, * USB or Firewire based devices. * * Prior to this call the arv_update_device_list() * function must be called. * * Returns: a physical device id * * Since: 0.2.0 */ const char * arv_get_device_physical_id (unsigned int index) { return arv_get_info (index, arv_interface_get_device_physical_id); } /** * arv_get_device_vendor: * @index: device index * * Queries the device vendor. * * Prior to this call the arv_update_device_list() * function must be called. * * Returns: (transfer none): the device vendor, NULL on error * * Since: 0.6.0 */ const char * arv_get_device_vendor (unsigned int index) { return arv_get_info (index, arv_interface_get_device_vendor); } /** * arv_get_device_model: * @index: device index * * Queries the device model. * * Prior to this call the arv_update_device_list() * function must be called. * * Returns: (transfer none): the device model, NULL on error * * Since: 0.6.0 */ const char * arv_get_device_model (unsigned int index) { return arv_get_info (index, arv_interface_get_device_model); } /** * arv_get_device_serial_nbr: * @index: device index * * Queries the device serial. * * Prior to this call the arv_update_device_list() * function must be called. * * Returns: (transfer none): the device serial, NULL on error * * Since: 0.6.0 */ const char * arv_get_device_serial_nbr (unsigned int index) { return arv_get_info (index, arv_interface_get_device_serial_nbr); } /** * arv_get_device_address: * @index: device index * * The index of a device may change after a call to arv_update_device_list(). * * Returns: The address of the device corresponding to @index as a string. * * Since: 0.6.0 */ const char * arv_get_device_address (unsigned int index) { return arv_get_info (index, arv_interface_get_device_address); } /** * arv_get_device_protocol: * @index: device index * * The index of a device may change after a call to arv_update_device_list(). * * Returns: The device protocol as a string. * * Since: 0.6.0 */ const char * arv_get_device_protocol (unsigned int index) { return arv_get_info (index, arv_interface_get_device_protocol); } /** * arv_open_device: * @device_id: (allow-none): a device identifier string * * Open a device corresponding to the given identifier. A %NULL string makes * this function return the first available device. * * Return value: (transfer full): A new #ArvDevice instance. * * Since: 0.2.0 */ ArvDevice * arv_open_device (const char *device_id) { unsigned int i; g_mutex_lock (&arv_system_mutex); for (i = 0; i < G_N_ELEMENTS (interfaces); i++) { ArvInterface *interface; ArvDevice *device; if (interfaces[i].is_available) { interface = interfaces[i].get_interface_instance (); device = arv_interface_open_device (interface, device_id); if (device != NULL) { g_mutex_unlock (&arv_system_mutex); return device; } } } g_mutex_unlock (&arv_system_mutex); return NULL; } /** * arv_shutdown: * * Frees a number of ressources allocated by Aravis that would be otherwise * reported as memory leak by tools like Valgrind. The call to this function is * optional if you don't intend to check for memmory leaks. */ void arv_shutdown (void) { unsigned int i; g_mutex_lock (&arv_system_mutex); for (i = 0; i < G_N_ELEMENTS (interfaces); i++) interfaces[i].destroy_interface_instance (); arv_debug_shutdown (); g_mutex_unlock (&arv_system_mutex); } aravis-ARAVIS_0_6_0/src/arvsystem.h000066400000000000000000000036131334570641500172210ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_SYSTEM_H #define ARV_SYSTEM_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS unsigned int arv_get_n_interfaces (void); const char * arv_get_interface_id (unsigned int index); void arv_enable_interface (const char *interface_id); void arv_disable_interface (const char *interface_id); void arv_update_device_list (void); unsigned int arv_get_n_devices (void); const char * arv_get_device_id (unsigned int index); const char * arv_get_device_physical_id (unsigned int index); const char * arv_get_device_address (unsigned int index); const char * arv_get_device_vendor (unsigned int index); const char * arv_get_device_model (unsigned int index); const char * arv_get_device_serial_nbr (unsigned int index); const char * arv_get_device_protocol (unsigned int index); ArvDevice * arv_open_device (const char *device_id); void arv_shutdown (void); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvtest.c000066400000000000000000000050771334570641500166550ustar00rootroot00000000000000#include #include #include typedef struct { int dummy; } TestData; typedef struct { gboolean genicam_success; const char *genicam_error; gboolean read_sensor_success; gint sensor_width; gint sensor_height; } TestResult; ArvXmlSchema *schema_1_1; ArvXmlSchema *schema_1_0; static void print_result (TestData *data, TestResult *result) { printf ("Genicam: %s %s\n", result->genicam_success ? "SUCCESS" : "FAILED", result->genicam_error != NULL ? result->genicam_error : ""); if (result->read_sensor_success) printf ("Sensor size read: %d %d\n", result->sensor_width, result->sensor_height); else printf ("Sensor size read: FAILED\n"); } static gboolean test_genicam (ArvCamera *camera, TestData *data, TestResult *result) { ArvDevice *device; const char *genicam; size_t size; device = arv_camera_get_device (camera); genicam = arv_device_get_genicam_xml (device, &size); if (genicam == NULL) { result->genicam_error = "Failed to retrieve Genicam data"; result->genicam_success = FALSE; return FALSE; } if (!arv_xml_schema_validate (schema_1_1, genicam, size, NULL, NULL, NULL) && !arv_xml_schema_validate (schema_1_0, genicam, size, NULL, NULL, NULL)) { result->genicam_error = "Invalid Genicam XML data"; result->genicam_success = FALSE; return FALSE; } result->genicam_error = NULL; result->genicam_success = TRUE; return TRUE; } static gboolean test_device_properties (ArvCamera *camera, TestData *data, TestResult *result) { arv_camera_get_sensor_size (camera, &result->sensor_width, &result->sensor_height); result->read_sensor_success = arv_device_get_status (arv_camera_get_device (camera)) == ARV_DEVICE_STATUS_SUCCESS; return TRUE; } int main (int argc, char **argv) { unsigned n_devices, i; ArvCamera *camera; schema_1_0 = arv_xml_schema_new_from_path ("GenApiSchema_Version_1_0.xsd"); schema_1_1 = arv_xml_schema_new_from_path ("GenApiSchema_Version_1_1.xsd"); arv_update_device_list (); n_devices = arv_get_n_devices (); for (i = 0; i < n_devices; i++) { TestData *data; TestResult *result; printf ("Testing device '%s' from '%s'\n", arv_get_device_model (i), arv_get_device_vendor (i)); data = g_new0 (TestData, 1); result = g_new0 (TestResult, 1); camera = arv_camera_new (arv_get_device_id (i)); test_genicam (camera, data, result); test_device_properties (camera, data, result); print_result (data, result); g_object_unref (camera); g_free (data); g_free (result); } g_object_unref (schema_1_1); g_object_unref (schema_1_0); arv_shutdown (); return EXIT_SUCCESS; } aravis-ARAVIS_0_6_0/src/arvtool.c000066400000000000000000000225771334570641500166570ustar00rootroot00000000000000#include #include #include #include static void arv_tool_list_features (ArvGc *genicam, const char *feature, gboolean show_description, int level) { ArvGcNode *node; node = arv_gc_get_node (genicam, feature); if (ARV_IS_GC_FEATURE_NODE (node) && arv_gc_feature_node_is_implemented (ARV_GC_FEATURE_NODE (node), NULL)) { int i; for (i = 0; i < level; i++) printf (" "); printf ("%s: '%s'%s\n", arv_dom_node_get_node_name (ARV_DOM_NODE (node)), feature, arv_gc_feature_node_is_available (ARV_GC_FEATURE_NODE (node), NULL) ? "" : " (Not available)"); if (show_description) { const char *description; description = arv_gc_feature_node_get_description (ARV_GC_FEATURE_NODE (node), NULL); if (description) printf ("%s\n", description); } if (ARV_IS_GC_CATEGORY (node)) { const GSList *features; const GSList *iter; features = arv_gc_category_get_features (ARV_GC_CATEGORY (node)); for (iter = features; iter != NULL; iter = iter->next) arv_tool_list_features (genicam, iter->data, show_description, level + 1); } else if (ARV_IS_GC_ENUMERATION (node)) { const GSList *childs; const GSList *iter; childs = arv_gc_enumeration_get_entries (ARV_GC_ENUMERATION (node)); for (iter = childs; iter != NULL; iter = iter->next) { if (arv_gc_feature_node_is_implemented (iter->data, NULL)) { for (i = 0; i < level + 1; i++) printf (" "); printf ("%s: '%s'%s\n", arv_dom_node_get_node_name (iter->data), arv_gc_feature_node_get_name (iter->data), arv_gc_feature_node_is_available (iter->data, NULL) ? "" : " (Not available)"); } } } } } static void arv_tool_execute_command (int argc, char **argv, ArvDevice *device) { ArvGc *genicam; const char *command = argv[1]; if (device == NULL || argc < 2) return; genicam = arv_device_get_genicam (device); if (g_strcmp0 (command, "genicam") == 0) { const char *xml; size_t size; xml = arv_device_get_genicam_xml (device, &size); if (xml != NULL) printf ("%*s\n", (int) size, xml); } else if (g_strcmp0 (command, "features") == 0) { arv_tool_list_features (genicam, "Root", FALSE, 0); } else if (g_strcmp0 (command, "description") == 0) { if (argc < 3) arv_tool_list_features (genicam, "Root", TRUE, 0); else { int i; for (i = 2; i < argc; i++) { ArvGcNode *node; node = arv_gc_get_node (genicam, argv[i]); if (ARV_IS_GC_NODE (node)) { const char *description; printf ("%s: '%s'\n", arv_dom_node_get_node_name (ARV_DOM_NODE (node)), argv[i]); description = arv_gc_feature_node_get_description (ARV_GC_FEATURE_NODE (node), NULL); if (description) printf ("%s\n", description); } } } } else if (g_strcmp0 (command, "control") == 0) { int i; for (i = 2; i < argc; i++) { ArvGcNode *feature; char **tokens; tokens = g_strsplit (argv[i], "=", 2); feature = arv_device_get_feature (device, tokens[0]); if (ARV_IS_GC_FEATURE_NODE (feature)) { if (ARV_IS_GC_COMMAND (feature)) { arv_gc_command_execute (ARV_GC_COMMAND (feature), NULL); printf ("%s executed\n", tokens[0]); } else { GType value_type; gint64 max_int64, min_int64; double max_double, min_double; const char *unit; if (tokens[1] != NULL) arv_gc_feature_node_set_value_from_string (ARV_GC_FEATURE_NODE (feature), tokens[1], NULL); value_type = arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (feature)); switch (value_type) { case G_TYPE_INT64: if (ARV_IS_GC_ENUMERATION (feature)) { printf ("%s = %s\n", tokens[0], arv_gc_string_get_value (ARV_GC_STRING (feature), NULL)); } else { min_int64 = arv_gc_integer_get_min (ARV_GC_INTEGER (feature), NULL); max_int64 = arv_gc_integer_get_max (ARV_GC_INTEGER (feature), NULL); unit = arv_gc_integer_get_unit (ARV_GC_INTEGER (feature), NULL); if (min_int64 != -G_MAXINT64 && max_int64 != G_MAXINT64) printf ("%s = %" G_GINT64_FORMAT "%s%s (min:%" G_GINT64_FORMAT ";max:%" G_GINT64_FORMAT ")\n", tokens[0], arv_gc_integer_get_value (ARV_GC_INTEGER (feature), NULL), unit != NULL ? " ": "", unit != NULL ? unit : "", min_int64, max_int64); else printf ("%s = %" G_GINT64_FORMAT "%s%s\n", tokens[0], arv_gc_integer_get_value (ARV_GC_INTEGER (feature), NULL), unit != NULL ? " ": "", unit != NULL ? unit : ""); } break; case G_TYPE_DOUBLE: min_double = arv_gc_float_get_min (ARV_GC_FLOAT (feature), NULL); max_double = arv_gc_float_get_max (ARV_GC_FLOAT (feature), NULL); unit = arv_gc_float_get_unit (ARV_GC_FLOAT (feature), NULL); if (min_double != -G_MAXDOUBLE && max_double != G_MAXDOUBLE) printf ("%s = %g%s%s (min:%g;max:%g)\n", tokens[0], arv_gc_float_get_value (ARV_GC_FLOAT (feature), NULL), unit != NULL ? " ": "", unit != NULL ? unit : "", min_double, max_double); else printf ("%s = %g%s%s\n", tokens[0], arv_gc_float_get_value (ARV_GC_FLOAT (feature), NULL), unit != NULL ? " ": "", unit != NULL ? unit : ""); break; case G_TYPE_STRING: printf ("%s = %s\n", tokens[0], arv_gc_string_get_value (ARV_GC_STRING (feature), NULL)); break; case G_TYPE_BOOLEAN: printf ("%s = %s\n", tokens[0], arv_gc_integer_get_value (ARV_GC_INTEGER (feature), NULL) != 0 ? "true" : "false"); break; default: printf ("%s = %s\n", tokens[0], arv_gc_feature_node_get_value_as_string (ARV_GC_FEATURE_NODE (feature), NULL)); } } } else { if (g_strrstr (tokens[0], "R[") == tokens[0]) { guint32 value; guint32 address; address = g_ascii_strtoll(&tokens[0][2], NULL, 0); if (tokens[1] != NULL) { arv_device_write_register (device, address, g_ascii_strtoll (tokens[1], NULL, 0), NULL); /* TODO error handling */ } arv_device_read_register (device, address, &value, NULL); /* TODO error handling */ printf ("R[0x%08x] = 0x%08x\n", address, value); } else printf ("Feature '%s' not found\n", tokens[0]); } g_strfreev (tokens); } } else { printf ("Unkown command\n"); } } static char *arv_option_device_name = NULL; static char *arv_option_device_address = NULL; static char *arv_option_debug_domains = NULL; static const GOptionEntry arv_option_entries[] = { { "name", 'n', 0, G_OPTION_ARG_STRING, &arv_option_device_name, NULL, ""}, { "address", 'a', 0, G_OPTION_ARG_STRING, &arv_option_device_address, NULL, ""}, { "debug", 'd', 0, G_OPTION_ARG_STRING, &arv_option_debug_domains, NULL, "[:][,...]" }, { NULL } }; static const char description_content[] = "Command may be one of the following possibilities:\n" "\n" " genicam: dump the content of the Genicam xml data\n" " features: list all availale features\n" " description [] ...: show the full feature description\n" " control [=] ...: read/write device features\n" "\n" "If no command is given, this utility will list all the available devices.\n" "For the control command, direct access to device registers is provided using a R[address] syntax" " in place of a feature name.\n" "\n" "Examples:\n" "\n" "arv-tool-" ARAVIS_API_VERSION " control Width=128 Height=128 Gain R[0x10000]=0x10\n" "arv-tool-" ARAVIS_API_VERSION " features\n" "arv-tool-" ARAVIS_API_VERSION " description Width Height\n" "arv-tool-" ARAVIS_API_VERSION " -n Basler-210ab4 genicam\n"; int main (int argc, char **argv) { ArvDevice *device; const char *device_id; GOptionContext *context; GError *error = NULL; unsigned int n_devices; unsigned int i; context = g_option_context_new (" command "); g_option_context_set_summary (context, "Small utility for basic control of a Genicam device."); g_option_context_set_description (context, description_content); g_option_context_add_main_entries (context, arv_option_entries, NULL); if (!g_option_context_parse (context, &argc, &argv, &error)) { g_option_context_free (context); g_print ("Option parsing failed: %s\n", error->message); g_error_free (error); return EXIT_FAILURE; } g_option_context_free (context); arv_debug_enable (arv_option_debug_domains); device_id = arv_option_device_address != NULL ? arv_option_device_address : arv_option_device_name; if (device_id != NULL) { device = arv_open_device (device_id); if (ARV_IS_DEVICE (device)) { if (argc < 2) printf ("%s\n", device_id); else arv_tool_execute_command (argc, argv, device); g_object_unref (device); } else { fprintf (stderr, "Device '%s' not found\n", device_id); } } else { arv_update_device_list (); n_devices = arv_get_n_devices (); if (n_devices > 0) { for (i = 0; i < n_devices; i++) { device_id = arv_get_device_id (i); device = arv_open_device (device_id); if (ARV_IS_DEVICE (device)) { printf ("%s (%s)\n", device_id, arv_get_device_address (i)); arv_tool_execute_command (argc, argv, device); g_object_unref (device); } } } else { fprintf (stderr, "No device found\n"); } } arv_shutdown (); return EXIT_SUCCESS; } aravis-ARAVIS_0_6_0/src/arvtypes.h000066400000000000000000000072121334570641500170400ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_TYPES_H #define ARV_TYPES_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS typedef struct _ArvCamera ArvCamera; typedef struct _ArvEvaluator ArvEvaluator; typedef struct _ArvDomNode ArvDomNode; typedef struct _ArvDomNodeList ArvDomNodeList; typedef struct _ArvDomNamedNodeMap ArvDomNamedNodeMap; typedef struct _ArvDomElement ArvDomElement; typedef struct _ArvDomDocument ArvDomDocument; typedef struct _ArvDomDocumentFragment ArvDomDocumentFragment; typedef struct _ArvDomCharacterData ArvDomCharacterData; typedef struct _ArvDomText ArvDomText; typedef struct _ArvGc ArvGc; typedef struct _ArvGcNode ArvGcNode; typedef struct _ArvGcPropertyNode ArvGcPropertyNode; typedef struct _ArvGcIndexNode ArvGcIndexNode; typedef struct _ArvGcValueIndexedNode ArvGcValueIndexedNode; typedef struct _ArvGcInvalidatorNode ArvGcInvalidatorNode; typedef struct _ArvGcFeatureNode ArvGcFeatureNode; typedef struct _ArvGcRegisterDescriptionNode ArvGcRegisterDescriptionNode; typedef struct _ArvGcGroupNode ArvGcGroupNode; typedef struct _ArvGcCategory ArvGcCategory; typedef struct _ArvGcBoolean ArvGcBoolean; typedef struct _ArvGcEnumeration ArvGcEnumeration; typedef struct _ArvGcEnumEntry ArvGcEnumEntry; typedef struct _ArvGcIntegerNode ArvGcIntegerNode; typedef struct _ArvGcFloatNode ArvGcFloatNode; typedef struct _ArvGcRegisterNode ArvGcRegisterNode; typedef struct _ArvGcStructEntryNode ArvGcStructEntryNode; typedef struct _ArvGcCommand ArvGcCommand; typedef struct _ArvGcSwissKnife ArvGcSwissKnife; typedef struct _ArvGcConverter ArvGcConverter; typedef struct _ArvGcPort ArvGcPort; typedef struct _ArvGcRegister ArvGcRegister; typedef struct _ArvGcInteger ArvGcInteger; typedef struct _ArvGcFloat ArvGcFloat; typedef struct _ArvGcString ArvGcString; typedef struct _ArvInterface ArvInterface; typedef struct _ArvDevice ArvDevice; typedef struct _ArvStream ArvStream; typedef struct _ArvBuffer ArvBuffer; typedef struct _ArvChunkParser ArvChunkParser; typedef struct _ArvGvInterface ArvGvInterface; typedef struct _ArvGvDevice ArvGvDevice; typedef struct _ArvGvStream ArvGvStream; #if ARAVIS_HAS_USB typedef struct _ArvUvInterface ArvUvInterface; typedef struct _ArvUvDevice ArvUvDevice; typedef struct _ArvUvStream ArvUvStream; #endif typedef struct _ArvFakeInterface ArvFakeInterface; typedef struct _ArvFakeDevice ArvFakeDevice; typedef struct _ArvFakeStream ArvFakeStream; typedef struct _ArvFakeCamera ArvFakeCamera; typedef struct _ArvGvFakeCamera ArvGvFakeCamera; typedef struct _ArvZip ArvZip; typedef struct _ArvZipFile ArvZipFile; typedef struct _ArvXmlSchema ArvXmlSchema; G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvuvcp.c000066400000000000000000000150111334570641500166400ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvuvcp * @short_description: USB3Vision control packet handling */ #include #include #include #include #include void arv_uvcp_packet_free (ArvUvcpPacket *packet) { g_free (packet); } /** * arv_uvcp_packet_new_read_memory_cmd: (skip) * @address: read address * @size: read size, in bytes * @packet_id: packet id * @packet_size: (out): packet size, in bytes * Return value: (transfer full): a new #ArvUvcpPacket * * Create a uvcp packet for a memory read command. */ ArvUvcpPacket * arv_uvcp_packet_new_read_memory_cmd (guint64 address, guint32 size, guint16 packet_id, size_t *packet_size) { ArvUvcpReadMemoryCmd *packet; g_return_val_if_fail (packet_size != NULL, NULL); *packet_size = sizeof (ArvUvcpReadMemoryCmd); packet = g_malloc (*packet_size); packet->header.magic = GUINT32_TO_LE (ARV_UVCP_MAGIC); packet->header.packet_type = GUINT16_TO_LE (ARV_UVCP_PACKET_TYPE_CMD); packet->header.command = GUINT16_TO_LE (ARV_UVCP_COMMAND_READ_MEMORY_CMD); packet->header.size = GUINT16_TO_LE (sizeof (ArvUvcpReadMemoryCmdInfos)); packet->header.id = GUINT16_TO_LE (packet_id); packet->infos.address = GUINT64_TO_LE (address); packet->infos.size = GUINT16_TO_LE (size); return (ArvUvcpPacket *) packet; } /** * arv_uvcp_packet_new_write_memory_cmd: (skip) * @address: write address * @size: write size, in bytes * @packet_id: packet id * @packet_size: (out): packet size, in bytes * Return value: (transfer full): a new #ArvUvcpPacket * * Create a uvcp packet for a memory write command. */ ArvUvcpPacket * arv_uvcp_packet_new_write_memory_cmd (guint64 address, guint32 size, guint16 packet_id, size_t *packet_size) { ArvUvcpWriteMemoryCmd *packet; g_return_val_if_fail (packet_size != NULL, NULL); *packet_size = sizeof (ArvUvcpWriteMemoryCmd) + size; packet = g_malloc (*packet_size); packet->header.magic = GUINT32_TO_LE (ARV_UVCP_MAGIC); packet->header.packet_type = GUINT16_TO_LE (ARV_UVCP_PACKET_TYPE_CMD); packet->header.command = GUINT16_TO_LE (ARV_UVCP_COMMAND_WRITE_MEMORY_CMD); packet->header.size = GUINT16_TO_LE (sizeof (ArvUvcpWriteMemoryCmdInfos) + size); packet->header.id = GUINT16_TO_LE (packet_id); packet->infos.address = GUINT64_TO_LE (address); return (ArvUvcpPacket *) packet; } static const char * arv_enum_to_string (GType type, guint enum_value) { GEnumClass *enum_class; GEnumValue *value; const char *retval = NULL; enum_class = g_type_class_ref (type); value = g_enum_get_value (enum_class, enum_value); if (value) retval = value->value_nick; g_type_class_unref (enum_class); return retval; } const char * arv_uvcp_packet_type_to_string (ArvUvcpPacketType value) { return arv_enum_to_string (ARV_TYPE_UVCP_PACKET_TYPE, value); } const char * arv_uvcp_command_to_string (ArvUvcpCommand value) { return arv_enum_to_string (ARV_TYPE_UVCP_COMMAND, value); } /** * arv_uvcp_packet_to_string: * @packet: a #ArvUvcpPacket * * Converts @packet into a human readable string. * * return value: (transfer full): A newly allocated string. */ char * arv_uvcp_packet_to_string (const ArvUvcpPacket *packet) { GString *string; char *c_string; int packet_size; guint64 value; g_return_val_if_fail (packet != NULL, NULL); string = g_string_new (""); g_string_append_printf (string, "packet_type = %s\n", arv_uvcp_packet_type_to_string (GUINT16_FROM_LE (packet->header.packet_type))); g_string_append_printf (string, "command = %s\n", arv_uvcp_command_to_string (GUINT16_FROM_LE (packet->header.command))); g_string_append_printf (string, "size = %d\n", GUINT16_FROM_LE (packet->header.size)); g_string_append_printf (string, "id = %d\n", GUINT16_FROM_LE (packet->header.id)); switch (GUINT16_FROM_LE (packet->header.command)) { case ARV_UVCP_COMMAND_READ_MEMORY_CMD: { ArvUvcpReadMemoryCmd *cmd_packet = (void *) packet; value = GUINT64_FROM_LE (cmd_packet->infos.address); g_string_append_printf (string, "address = 0x%016lx\n", value); value = GUINT16_FROM_LE (cmd_packet->infos.size); g_string_append_printf (string, "size = %10lu (0x%08lx)\n", value, value); break; } case ARV_UVCP_COMMAND_READ_MEMORY_ACK: { break; } case ARV_UVCP_COMMAND_WRITE_MEMORY_CMD: { ArvUvcpWriteMemoryCmd *cmd_packet = (void *) packet; value = GUINT64_FROM_LE (cmd_packet->infos.address); g_string_append_printf (string, "address = 0x%016lx\n", value); break; } case ARV_UVCP_COMMAND_WRITE_MEMORY_ACK: { ArvUvcpWriteMemoryAck *cmd_packet = (void *) packet; value = GUINT64_FROM_LE (cmd_packet->infos.bytes_written); g_string_append_printf (string, "written = %10lu (0x%08lx)\n", value, value); break; } } packet_size = sizeof (ArvUvcpHeader) + GUINT16_FROM_LE (packet->header.size); arv_g_string_append_hex_dump (string, packet, packet_size); c_string = string->str; g_string_free (string, FALSE); return c_string; } /** * arv_uvcp_packet_debug: * @packet: a #ArvUvcpPacket * @level: debug level * * Dumps the content of @packet if level is lower or equal to the current debug level for the cp debug category. See arv_debug_enable(). */ void arv_uvcp_packet_debug (const ArvUvcpPacket *packet, ArvDebugLevel level) { char *string; if (!arv_debug_check (&arv_debug_category_cp, level)) return; string = arv_uvcp_packet_to_string (packet); switch (level) { case ARV_DEBUG_LEVEL_LOG: arv_log_cp ("%s", string); break; case ARV_DEBUG_LEVEL_DEBUG: arv_debug_cp ("%s", string); break; case ARV_DEBUG_LEVEL_WARNING: arv_warning_cp ("%s", string); break; default: break; } g_free (string); } aravis-ARAVIS_0_6_0/src/arvuvcp.h000066400000000000000000000207711334570641500166560ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_UVCP_H #define ARV_UVCP_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS #define ARV_UVCP_MAGIC 0x43563355 #define ARV_UVCP_DEFAULT_RESPONSE_TIME_MS 5 #define ARV_ABRM_GENCP_VERSION 0x0000 #define ARV_ABRM_MANUFACTURER_NAME 0x0004 #define ARV_ABRM_MODEL_NAME 0x0044 #define ARV_ABRM_FAMILY_NAME 0x0084 #define ARV_ABRM_DEVICE_VERSION 0x00c4 #define ARV_ABRM_MANUFACTURER_INFO 0x0104 #define ARV_ABRM_SERIAL_NUMBER 0x0144 #define ARV_ABRM_USER_DEFINED_NAME 0x0184 #define ARV_ABRM_DEVICE_CAPABILITY 0x01c4 #define ARV_ABRM_MAX_DEVICE_RESPONSE_TIME 0x01cc /* in ms */ #define ARV_ABRM_MANIFEST_TABLE_ADDRESS 0x01d0 #define ARV_ABRM_SBRM_ADDRESS 0x01d8 #define ARV_ABRM_DEVICE_CONFIGURATION 0x01e0 #define ARV_ABRM_HEARTBEAT_TIMEOUT 0x01e8 #define ARV_ABRM_MESSAGE_CHANNEL_ID 0x01ec #define ARV_ABRM_TIMESTAMP 0x01f0 #define ARV_ABRM_TIMESTAMP_LATCH 0x01f8 #define ARV_ABRM_TIMESTAMP_INCREMENT 0x01fc #define ARV_ABRM_ACCESS_PRIVILEGE 0x0204 #define ARV_ABRM_PROTOCOL_ENDIANESS 0x0208 #define ARV_ABRM_IMPLEMENTATION_ENDIANESS 0x020c #define ARV_ABRM_RESERVED 0x0210 #define ARV_SBRM_U3V_VERSION 0x0000 #define ARV_SBRM_U3VCP_CAPABILITY 0x0004 #define ARV_SBRM_U3VCP_CONFIGURATION 0x000c #define ARV_SBRM_MAX_CMD_TRANSFER 0x0014 #define ARV_SBRM_MAX_ACK_TRANSFER 0x0018 #define ARV_SBRM_NUM_STREAM_CHANNELS 0x001c #define ARV_SBRM_SIRM_ADDRESS 0x0020 #define ARV_SBRM_SIRM_LENGTH 0x0028 #define ARV_SBRM_EIRM_ADDRESS 0x002c #define ARV_SBRM_EIRM_LENGTH 0x0034 #define ARV_SBRM_IIDC2_ADDRESS 0x0038 #define ARV_SBRM_CURRENT_SPEED 0x0040 #define ARV_SBRM_RESERVED 0x0044 #define ARV_SI_INFO 0x0000 #define ARV_SI_CONTROL 0x0004 #define ARV_SI_REQ_PAYLOAD_SIZE 0x0008 #define ARV_SI_REQ_LEADER_SIZE 0x0010 #define ARV_SI_REQ_TRAILER_SIZE 0x0014 #define ARV_SI_MAX_LEADER_SIZE 0x0018 #define ARV_SI_PAYLOAD_SIZE 0x001C #define ARV_SI_PAYLOAD_COUNT 0x0020 #define ARV_SI_TRANSFER1_SIZE 0x0024 #define ARV_SI_TRANSFER2_SIZE 0x0028 #define ARV_SI_MAX_TRAILER_SIZE 0x002C #define ARV_SI_INFO_ALIGNMENT_MASK 0xFF000000 #define ARV_SI_INFO_ALIGNMENT_SHIFT 0x0018 /** * ArvUvcpPacketType: * @ARV_UVCP_PACKET_TYPE_ERROR: error packet * @ARV_UVCP_PACKET_TYPE_ACK: acknowledge packet * @ARV_UVCP_PACKET_TYPE_CMD: command packet */ typedef enum { ARV_UVCP_PACKET_TYPE_ERROR = 0xffff, ARV_UVCP_PACKET_TYPE_ACK = 0x0000, ARV_UVCP_PACKET_TYPE_CMD = 0x4000 } ArvUvcpPacketType; /** * ArvUvcpCommand: * @ARV_UVCP_COMMAND_READ_MEMORY_CMD: read memory command * @ARV_UVCP_COMMAND_READ_MEMORY_ACK: read memory acknowledge * @ARV_UVCP_COMMAND_WRITE_MEMORY_CMD: write memory command * @ARV_UVCP_COMMAND_WRITE_MEMORY_ACK: write memory acknowledge * @ARV_UVCP_COMMAND_PENDING_ACK: pending command acknowledge * @ARV_UVCP_COMMAND_EVENT_CMD: event command */ typedef enum { ARV_UVCP_COMMAND_READ_MEMORY_CMD = 0x0800, ARV_UVCP_COMMAND_READ_MEMORY_ACK = 0x0801, ARV_UVCP_COMMAND_WRITE_MEMORY_CMD = 0x0802, ARV_UVCP_COMMAND_WRITE_MEMORY_ACK = 0x0803, ARV_UVCP_COMMAND_PENDING_ACK = 0x0805, ARV_UVCP_COMMAND_EVENT_CMD = 0x0c00 } ArvUvcpCommand; #pragma pack(push,1) /** * ArvUvcpHeader: * * UVCP packet header structure. */ typedef struct { guint32 magic; guint16 packet_type; guint16 command; guint16 size; guint16 id; } ArvUvcpHeader; typedef struct { guint64 address; guint16 unknown; /* Listed as reserved, always 0 */ guint16 size; } ArvUvcpReadMemoryCmdInfos; typedef struct { ArvUvcpHeader header; ArvUvcpReadMemoryCmdInfos infos; } ArvUvcpReadMemoryCmd; typedef struct { guint64 address; } ArvUvcpWriteMemoryCmdInfos; typedef struct { ArvUvcpHeader header; ArvUvcpWriteMemoryCmdInfos infos; } ArvUvcpWriteMemoryCmd; typedef struct { guint16 unknown; guint16 bytes_written; } ArvUvcpWriteMemoryAckInfos; typedef struct { ArvUvcpHeader header; ArvUvcpWriteMemoryAckInfos infos; } ArvUvcpWriteMemoryAck; typedef struct { guint16 unknown; guint16 timeout; } ArvUvcpPendingAckInfos; typedef struct { ArvUvcpHeader header; ArvUvcpPendingAckInfos infos; } ArvUvcpPendingAck; /** * ArvUvcpPacket: * @header: packet header * @data: variable size byte array * * UVCP packet structure. */ typedef struct { ArvUvcpHeader header; unsigned char data[]; } ArvUvcpPacket; typedef struct { guint16 file_version_subminor; guint8 file_version_minor; guint8 file_version_major; guint32 schema; guint64 address; guint64 size; guint64 unknown3; guint64 unknown4; guint64 unknown5; guint64 unknown6; guint64 unknown7; } ArvUvcpManifestEntry; #pragma pack(pop) /** * ArvUvcpManifestSchemaType: * @ARV_UVCP_SCHEMA_RAW: uncompressed genicam data * @ARV_UVCP_SCHEMA_ZIP: zipped genicam data * * This is packed into the 32-bit schema type as bits 10-15 */ typedef enum { ARV_UVCP_SCHEMA_RAW = 0x0, ARV_UVCP_SCHEMA_ZIP = 0x1 } ArvUvcpManifestSchemaType; static inline ArvUvcpManifestSchemaType arv_uvcp_manifest_entry_get_schema_type (ArvUvcpManifestEntry *entry) { g_return_val_if_fail (entry != NULL, ARV_UVCP_SCHEMA_RAW); return (ArvUvcpManifestSchemaType) ((entry->schema >> 10) & 0x0000001f); } void arv_uvcp_packet_free (ArvUvcpPacket *packet); ArvUvcpPacket * arv_uvcp_packet_new_read_memory_cmd (guint64 address, guint32 size, guint16 packet_id, size_t *packet_size); ArvUvcpPacket * arv_uvcp_packet_new_write_memory_cmd (guint64 address, guint32 size, guint16 packet_id, size_t *packet_size); char * arv_uvcp_packet_to_string (const ArvUvcpPacket *packet); void arv_uvcp_packet_debug (const ArvUvcpPacket *packet, ArvDebugLevel level); const char * arv_uvcp_packet_type_to_string (ArvUvcpPacketType value); const char * arv_uvcp_command_to_string (ArvUvcpCommand value); /** * arv_uvcp_packet_get_packet_type: * @packet: a #ArvUvcpPacket * * Return value: The #ArvUvcpPacketType code of @packet. */ static inline ArvUvcpPacketType arv_uvcp_packet_get_packet_type (ArvUvcpPacket *packet) { if (packet == NULL) return ARV_UVCP_PACKET_TYPE_ERROR; return (ArvUvcpPacketType) GUINT16_FROM_LE (packet->header.packet_type); } /** * arv_uvcp_packet_get_command: * @packet: a #ArvUvcpPacket * * Return value: The #ArvUvcpCommand code of @packet. */ static inline ArvUvcpCommand arv_uvcp_packet_get_command (ArvUvcpPacket *packet) { if (packet == NULL) return (ArvUvcpCommand) 0; return (ArvUvcpCommand) GUINT16_FROM_LE (packet->header.command); } static inline void arv_uvcp_packet_set_packet_id (ArvUvcpPacket *packet, guint16 id) { if (packet != NULL) packet->header.id = GUINT16_TO_LE (id); } static inline guint16 arv_uvcp_packet_get_packet_id (ArvUvcpPacket *packet) { if (packet == NULL) return 0; return GUINT16_FROM_LE (packet->header.id); } static inline void * arv_uvcp_packet_get_read_memory_ack_data (const ArvUvcpPacket *packet) { return (char *) packet + sizeof (ArvUvcpHeader); } static inline size_t arv_uvcp_packet_get_read_memory_ack_size (size_t data_size) { return sizeof (ArvUvcpHeader) + data_size; } static inline void * arv_uvcp_packet_get_write_memory_cmd_data (const ArvUvcpPacket *packet) { return (char *) packet + sizeof (ArvUvcpWriteMemoryCmd); } static inline size_t arv_uvcp_packet_get_write_memory_ack_size (void) { return sizeof (ArvUvcpWriteMemoryAck); } static inline guint16 arv_uvcp_packet_get_pending_ack_timeout (ArvUvcpPacket *packet) { return GUINT16_FROM_LE (((ArvUvcpPendingAck *) packet)->infos.timeout); } static inline guint16 arv_uvcp_next_packet_id (guint16 packet_id) { /* packet_id == 0 is an error value */ if (packet_id == 0xffff) return 1; return packet_id + 1; } G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvuvdevice.c000066400000000000000000000635041334570641500175070ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvuvdevice * @short_description: USB3Vision device */ #include #include #include #include #include #include #include #include #include #include #include #define ARV_UV_DEVICE_N_TRIES_MAX 5 static GObjectClass *parent_class = NULL; struct _ArvUvDevicePrivate { char *vendor; char *product; char *serial_nbr; libusb_context *usb; libusb_device_handle *usb_device; ArvGc *genicam; const char *genicam_xml; size_t genicam_xml_size; guint16 packet_id; guint timeout_ms; guint cmd_packet_size_max; guint ack_packet_size_max; guint control_interface; guint data_interface; guint8 control_endpoint; guint8 data_endpoint; gboolean disconnected; }; /* ArvDevice implementation */ /* ArvUvDevice implementation */ gboolean arv_uv_device_bulk_transfer (ArvUvDevice *uv_device, ArvUvEndpointType endpoint_type, unsigned char endpoint_flags, void *data, size_t size, size_t *transferred_size, guint32 timeout_ms, GError **error) { gboolean success; guint8 endpoint; int transferred = 0; int result; g_return_val_if_fail (ARV_IS_UV_DEVICE (uv_device), FALSE); g_return_val_if_fail (data != NULL, FALSE); g_return_val_if_fail (size > 0, FALSE); if (uv_device->priv->disconnected) { g_set_error (error, ARV_DEVICE_ERROR, ARV_DEVICE_STATUS_NOT_CONNECTED, "Not connected"); return FALSE; } endpoint = (endpoint_type == ARV_UV_ENDPOINT_CONTROL) ? uv_device->priv->control_endpoint : uv_device->priv->data_endpoint; result = libusb_bulk_transfer (uv_device->priv->usb_device, endpoint | endpoint_flags, data, size, &transferred, MAX (uv_device->priv->timeout_ms, timeout_ms)); success = result >= 0; if (!success) g_set_error (error, ARV_DEVICE_ERROR, ARV_DEVICE_STATUS_TRANSFER_ERROR, "%s", libusb_error_name (result)); if (transferred_size != NULL) *transferred_size = transferred; if (result == LIBUSB_ERROR_NO_DEVICE) { uv_device->priv->disconnected = TRUE; arv_device_emit_control_lost_signal (ARV_DEVICE (uv_device)); } return success; } static ArvStream * arv_uv_device_create_stream (ArvDevice *device, ArvStreamCallback callback, void *user_data) { ArvUvDevice *uv_device = ARV_UV_DEVICE (device); ArvStream *stream; stream = arv_uv_stream_new (uv_device, callback, user_data); return stream; } static gboolean _read_memory (ArvUvDevice *uv_device, guint64 address, guint32 size, void *buffer, GError **error) { ArvUvcpPacket *packet; void *read_packet; size_t read_packet_size; size_t packet_size; gboolean success = FALSE; unsigned n_tries = 0; guint32 timeout_ms = 0; read_packet_size = arv_uvcp_packet_get_read_memory_ack_size (size); if (read_packet_size > uv_device->priv->ack_packet_size_max) { arv_debug_device ("Invalid acknowledge packet size (%d / max: %d)", read_packet_size, uv_device->priv->ack_packet_size_max); return FALSE; } packet = arv_uvcp_packet_new_read_memory_cmd (address, size, 0, &packet_size); if (packet_size > uv_device->priv->cmd_packet_size_max) { arv_debug_device ("Invalid command packet size (%d / max: %d)", packet_size, uv_device->priv->cmd_packet_size_max); arv_uvcp_packet_free (packet); return FALSE; } read_packet = g_malloc (read_packet_size); do { GError *local_error = NULL; size_t transferred; uv_device->priv->packet_id = arv_uvcp_next_packet_id (uv_device->priv->packet_id); arv_uvcp_packet_set_packet_id (packet, uv_device->priv->packet_id); arv_uvcp_packet_debug (packet, ARV_DEBUG_LEVEL_LOG); success = TRUE; success = success && arv_uv_device_bulk_transfer (uv_device, ARV_UV_ENDPOINT_CONTROL, LIBUSB_ENDPOINT_OUT, packet, packet_size, NULL, 0, &local_error); if (success) { gboolean pending_ack; gboolean expected_answer; do { success = TRUE; success = success && arv_uv_device_bulk_transfer (uv_device, ARV_UV_ENDPOINT_CONTROL, LIBUSB_ENDPOINT_IN, read_packet, read_packet_size, &transferred, 0, &local_error); if (success) { ArvUvcpPacketType packet_type; ArvUvcpCommand command; guint16 packet_id; arv_uvcp_packet_debug (read_packet, ARV_DEBUG_LEVEL_LOG); packet_type = arv_uvcp_packet_get_packet_type (read_packet); command = arv_uvcp_packet_get_command (read_packet); packet_id = arv_uvcp_packet_get_packet_id (read_packet); if (command == ARV_UVCP_COMMAND_PENDING_ACK) { pending_ack = TRUE; expected_answer = FALSE; timeout_ms = arv_uvcp_packet_get_pending_ack_timeout (read_packet); arv_log_device ("[UvDevice::read_memory] Pending ack timeout = %d", timeout_ms); } else { pending_ack = FALSE; expected_answer = packet_type == ARV_UVCP_PACKET_TYPE_ACK && command == ARV_UVCP_COMMAND_READ_MEMORY_ACK && packet_id == uv_device->priv->packet_id; if (!expected_answer) arv_debug_device ("[[UvDevice::read_memory] Unexpected answer (0x%04x)", packet_type); } } else { pending_ack = FALSE; expected_answer = FALSE; if (local_error != NULL) arv_warning_device ("[UvDevice::read_memory] Ack reception error: %s", local_error->message); g_clear_error (&local_error); } } while (pending_ack); success = success && expected_answer; if (success) memcpy (buffer, arv_uvcp_packet_get_read_memory_ack_data (read_packet), size); } else { if (local_error != NULL) arv_warning_device ("[UvDevice::read_memory] Command sending error: %s", local_error->message); g_clear_error (&local_error); } n_tries++; } while (!success && n_tries < ARV_UV_DEVICE_N_TRIES_MAX); g_free (read_packet); arv_uvcp_packet_free (packet); if (!success) { if (error != NULL && *error == NULL) *error = g_error_new (ARV_DEVICE_ERROR, ARV_DEVICE_STATUS_TIMEOUT, "[ArvDevice::read_memory] Timeout"); } return success; } static gboolean arv_uv_device_read_memory (ArvDevice *device, guint64 address, guint32 size, void *buffer, GError **error) { ArvUvDevice *uv_device = ARV_UV_DEVICE (device); int i; gint32 block_size; guint data_size_max; data_size_max = uv_device->priv->ack_packet_size_max - sizeof (ArvUvcpHeader); for (i = 0; i < (size + data_size_max - 1) / data_size_max; i++) { block_size = MIN (data_size_max, size - i * data_size_max); if (!_read_memory (uv_device, address + i * data_size_max, block_size, ((char *) buffer) + i * data_size_max, error)) return FALSE; } return TRUE; } static gboolean _write_memory (ArvUvDevice *uv_device, guint64 address, guint32 size, void *buffer, GError **error) { ArvUvcpPacket *packet; void *read_packet; size_t packet_size; size_t read_packet_size; gboolean success = FALSE; unsigned n_tries = 0; guint32 timeout_ms = 0; read_packet_size = arv_uvcp_packet_get_write_memory_ack_size (); if (read_packet_size > uv_device->priv->ack_packet_size_max) { arv_debug_device ("Invalid acknowledge packet size (%d / max: %d)", read_packet_size, uv_device->priv->ack_packet_size_max); return FALSE; } packet = arv_uvcp_packet_new_write_memory_cmd (address, size, 0, &packet_size); if (packet_size > uv_device->priv->cmd_packet_size_max) { arv_debug_device ("Invalid command packet size (%d / max: %d)", packet_size, uv_device->priv->cmd_packet_size_max); arv_uvcp_packet_free (packet); return FALSE; } memcpy (arv_uvcp_packet_get_write_memory_cmd_data (packet), buffer, size); read_packet = g_malloc (read_packet_size); do { GError *local_error = NULL; size_t transferred; uv_device->priv->packet_id = arv_uvcp_next_packet_id (uv_device->priv->packet_id); arv_uvcp_packet_set_packet_id (packet, uv_device->priv->packet_id); arv_uvcp_packet_debug (packet, ARV_DEBUG_LEVEL_LOG); success = TRUE; success = success && arv_uv_device_bulk_transfer (uv_device, ARV_UV_ENDPOINT_CONTROL, LIBUSB_ENDPOINT_OUT, packet, packet_size, NULL, 0, &local_error); if (success ) { gboolean pending_ack; gboolean expected_answer; do { success = TRUE; success = success && arv_uv_device_bulk_transfer (uv_device, ARV_UV_ENDPOINT_CONTROL, LIBUSB_ENDPOINT_IN, read_packet, read_packet_size, &transferred, timeout_ms, &local_error); if (success) { ArvUvcpPacketType packet_type; ArvUvcpCommand command; guint16 packet_id; arv_uvcp_packet_debug (read_packet, ARV_DEBUG_LEVEL_LOG); packet_type = arv_uvcp_packet_get_packet_type (read_packet); command = arv_uvcp_packet_get_command (read_packet); packet_id = arv_uvcp_packet_get_packet_id (read_packet); if (command == ARV_UVCP_COMMAND_PENDING_ACK) { pending_ack = TRUE; expected_answer = FALSE; timeout_ms = arv_uvcp_packet_get_pending_ack_timeout (read_packet); arv_log_device ("[UvDevice::write_memory] Pending ack timeout = %d", timeout_ms); } else { pending_ack = FALSE; expected_answer = packet_type == ARV_UVCP_PACKET_TYPE_ACK && command == ARV_UVCP_COMMAND_WRITE_MEMORY_ACK && packet_id == uv_device->priv->packet_id; if (!expected_answer) arv_debug_device ("[[UvDevice::write_memory] Unexpected answer (0x%04x)", packet_type); } } else { pending_ack = FALSE; expected_answer = FALSE; if (local_error != NULL) arv_warning_device ("[UvDevice::write_memory] Ack reception error: %s", local_error->message); g_clear_error (&local_error); } } while (pending_ack); success = success && expected_answer; if (success) arv_uvcp_packet_debug (read_packet, ARV_DEBUG_LEVEL_LOG); } else { if (local_error != NULL) arv_warning_device ("[UvDevice::write_memory] Command sending error: %s", local_error->message); g_clear_error (&local_error); } n_tries++; } while (!success && n_tries < ARV_UV_DEVICE_N_TRIES_MAX); g_free (read_packet); arv_uvcp_packet_free (packet); if (!success) { if (error != NULL && *error == NULL) *error = g_error_new (ARV_DEVICE_ERROR, ARV_DEVICE_STATUS_TIMEOUT, "[ArvDevice::write_memory] Timeout"); } return success; } static gboolean arv_uv_device_write_memory (ArvDevice *device, guint64 address, guint32 size, void *buffer, GError **error) { ArvUvDevice *uv_device = ARV_UV_DEVICE (device); int i; gint32 block_size; guint data_size_max; data_size_max = uv_device->priv->ack_packet_size_max - sizeof (ArvUvcpHeader); for (i = 0; i < (size + data_size_max - 1) / data_size_max; i++) { block_size = MIN (data_size_max, size - i * data_size_max); if (!_write_memory (uv_device, address + i * data_size_max, block_size, ((char *) buffer) + i * data_size_max, error)) return FALSE; } return TRUE; } static gboolean arv_uv_device_read_register (ArvDevice *device, guint64 address, guint32 *value, GError **error) { return arv_uv_device_read_memory (device, address, sizeof (guint32), value, error); } static gboolean arv_uv_device_write_register (ArvDevice *device, guint64 address, guint32 value, GError **error) { return arv_uv_device_write_memory (device, address, sizeof (guint32), &value, error); } static void _bootstrap (ArvUvDevice *uv_device) { ArvDevice *device = ARV_DEVICE (uv_device); guint64 offset; guint32 response_time; guint64 manifest_table_address; guint64 device_capability; guint32 max_cmd_transfer; guint32 max_ack_transfer; guint32 u3vcp_capability; guint64 sirm_offset; guint32 si_info; guint32 si_control; guint64 si_req_payload_size; guint32 si_req_leader_size; guint32 si_req_trailer_size; guint32 si_max_leader_size; guint32 si_payload_size; guint32 si_payload_count; guint32 si_transfer1_size; guint32 si_transfer2_size; guint32 si_max_trailer_size; guint64 manifest_n_entries; ArvUvcpManifestEntry entry; ArvUvcpManifestSchemaType schema_type; GString *string; void *data; char manufacturer[64]; arv_debug_device ("Get genicam"); arv_device_read_memory(device, ARV_ABRM_MANUFACTURER_NAME, 64, &manufacturer, NULL); manufacturer[63] = 0; arv_debug_device ("MANUFACTURER_NAME = '%s'", manufacturer); arv_device_read_memory (device, ARV_ABRM_SBRM_ADDRESS, sizeof (guint64), &offset, NULL); arv_device_read_memory (device, ARV_ABRM_MAX_DEVICE_RESPONSE_TIME, sizeof (guint32), &response_time, NULL); arv_device_read_memory (device, ARV_ABRM_DEVICE_CAPABILITY, sizeof (guint64), &device_capability, NULL); arv_device_read_memory (device, ARV_ABRM_MANIFEST_TABLE_ADDRESS, sizeof (guint64), &manifest_table_address, NULL); arv_debug_device ("MAX_DEVICE_RESPONSE_TIME = 0x%08x", response_time); arv_debug_device ("DEVICE_CAPABILITY = 0x%016lx", device_capability); arv_debug_device ("SRBM_ADDRESS = 0x%016lx", offset); arv_debug_device ("MANIFEST_TABLE_ADDRESS = 0x%016lx", manifest_table_address); uv_device->priv->timeout_ms = MAX (ARV_UVCP_DEFAULT_RESPONSE_TIME_MS, response_time); arv_device_read_memory (device, offset + ARV_SBRM_U3VCP_CAPABILITY, sizeof (guint32), &u3vcp_capability, NULL); arv_device_read_memory (device, offset + ARV_SBRM_MAX_CMD_TRANSFER, sizeof (guint32), &max_cmd_transfer, NULL); arv_device_read_memory (device, offset + ARV_SBRM_MAX_ACK_TRANSFER, sizeof (guint32), &max_ack_transfer, NULL); arv_device_read_memory (device, offset + ARV_SBRM_SIRM_ADDRESS, sizeof (guint64), &sirm_offset, NULL); arv_debug_device ("U3VCP_CAPABILITY = 0x%08x", u3vcp_capability); arv_debug_device ("MAX_CMD_TRANSFER = 0x%08x", max_cmd_transfer); arv_debug_device ("MAX_ACK_TRANSFER = 0x%08x", max_ack_transfer); arv_debug_device ("SIRM_OFFSET = 0x%016lx", sirm_offset); uv_device->priv->cmd_packet_size_max = MIN (uv_device->priv->cmd_packet_size_max, max_cmd_transfer); uv_device->priv->ack_packet_size_max = MIN (uv_device->priv->ack_packet_size_max, max_ack_transfer); arv_device_read_memory (device, sirm_offset + ARV_SI_INFO, sizeof (si_info), &si_info, NULL); arv_device_read_memory (device, sirm_offset + ARV_SI_CONTROL, sizeof (si_control), &si_control, NULL); arv_device_read_memory (device, sirm_offset + ARV_SI_REQ_PAYLOAD_SIZE, sizeof (si_req_payload_size), &si_req_payload_size, NULL); arv_device_read_memory (device, sirm_offset + ARV_SI_REQ_LEADER_SIZE, sizeof (si_req_leader_size), &si_req_leader_size, NULL); arv_device_read_memory (device, sirm_offset + ARV_SI_REQ_TRAILER_SIZE, sizeof (si_req_trailer_size), &si_req_trailer_size, NULL); arv_device_read_memory (device, sirm_offset + ARV_SI_MAX_LEADER_SIZE, sizeof (si_max_leader_size), &si_max_leader_size, NULL); arv_device_read_memory (device, sirm_offset + ARV_SI_PAYLOAD_SIZE, sizeof (si_payload_size), &si_payload_size, NULL); arv_device_read_memory (device, sirm_offset + ARV_SI_PAYLOAD_COUNT, sizeof (si_payload_count), &si_payload_count, NULL); arv_device_read_memory (device, sirm_offset + ARV_SI_TRANSFER1_SIZE, sizeof (si_transfer1_size), &si_transfer1_size, NULL); arv_device_read_memory (device, sirm_offset + ARV_SI_TRANSFER2_SIZE, sizeof (si_transfer2_size), &si_transfer2_size, NULL); arv_device_read_memory (device, sirm_offset + ARV_SI_MAX_TRAILER_SIZE, sizeof (si_max_trailer_size), &si_max_trailer_size, NULL); arv_debug_device ("SI_INFO = 0x%08x", si_info); arv_debug_device ("SI_CONTROL = 0x%08x", si_control); arv_debug_device ("SI_REQ_PAYLOAD_SIZE = 0x%016lx", si_req_payload_size); arv_debug_device ("SI_REQ_LEADER_SIZE = 0x%08x", si_req_leader_size); arv_debug_device ("SI_REQ_TRAILER_SIZE = 0x%08x", si_req_trailer_size); arv_debug_device ("SI_MAX_LEADER_SIZE = 0x%08x", si_max_leader_size); arv_debug_device ("SI_PAYLOAD_SIZE = 0x%08x", si_payload_size); arv_debug_device ("SI_PAYLOAD_COUNT = 0x%08x", si_payload_count); arv_debug_device ("SI_TRANSFER1_SIZE = 0x%08x", si_transfer1_size); arv_debug_device ("SI_TRANSFER2_SIZE = 0x%08x", si_transfer2_size); arv_debug_device ("SI_MAX_TRAILER_SIZE = 0x%08x", si_max_trailer_size); arv_device_read_memory (device, manifest_table_address, sizeof (guint64), &manifest_n_entries, NULL); arv_device_read_memory (device, manifest_table_address + 0x08, sizeof (entry), &entry, NULL); arv_debug_device ("MANIFEST_N_ENTRIES = 0x%016lx", manifest_n_entries); string = g_string_new (""); arv_g_string_append_hex_dump (string, &entry, sizeof (entry)); arv_debug_device ("MANIFEST ENTRY\n%s", string->str); g_string_free (string, TRUE); arv_debug_device ("genicam address = 0x%016lx", entry.address); arv_debug_device ("genicam size = 0x%016lx", entry.size); data = g_malloc0 (entry.size); arv_device_read_memory (device, entry.address, entry.size, data, NULL); #if 0 string = g_string_new (""); arv_g_string_append_hex_dump (string, data, entry.size); arv_debug_device ("GENICAM\n%s", string->str); g_string_free (string, TRUE); #endif schema_type = arv_uvcp_manifest_entry_get_schema_type (&entry); switch (schema_type) { case ARV_UVCP_SCHEMA_ZIP: { ArvZip *zip; const GSList *zip_files; zip = arv_zip_new (data, entry.size); zip_files = arv_zip_get_file_list (zip); if (zip_files != NULL) { const char *zip_filename; zip_filename = arv_zip_file_get_name (zip_files->data); uv_device->priv->genicam_xml = arv_zip_get_file (zip, zip_filename, &uv_device->priv->genicam_xml_size); arv_debug_device ("zip file = %s", zip_filename); #if 0 string = g_string_new (""); arv_g_string_append_hex_dump (string, uv_device->priv->genicam_xml, uv_device->priv->genicam_xml_size); arv_debug_device ("GENICAM\n%s", string->str); g_string_free (string, TRUE); #endif uv_device->priv->genicam = arv_gc_new (ARV_DEVICE (uv_device), uv_device->priv->genicam_xml, uv_device->priv->genicam_xml_size); } arv_zip_free (zip); g_free (data); } break; case ARV_UVCP_SCHEMA_RAW: { uv_device->priv->genicam_xml = data; uv_device->priv->genicam_xml_size = entry.size; uv_device->priv->genicam = arv_gc_new (ARV_DEVICE (uv_device), uv_device->priv->genicam_xml, uv_device->priv->genicam_xml_size); } break; default: arv_warning_device ("Unknown USB3Vision manifest schema type (%d)", schema_type); } #if 0 arv_debug_device("GENICAM\n:%s", uv_device->priv->genicam_xml); #endif } static ArvGc * arv_uv_device_get_genicam (ArvDevice *device) { ArvUvDevice *uv_device = ARV_UV_DEVICE (device); return uv_device->priv->genicam; } static const char * arv_uv_device_get_genicam_xml (ArvDevice *device, size_t *size) { ArvUvDevice *uv_device = ARV_UV_DEVICE (device); if (size != NULL) *size = uv_device->priv->genicam_xml_size; return uv_device->priv->genicam_xml; } static void _open_usb_device (ArvUvDevice *uv_device) { libusb_device **devices; unsigned i, j, k; ssize_t count; count = libusb_get_device_list (uv_device->priv->usb, &devices); if (count < 0) { arv_warning_device ("[[UvDevice::_open_usb_device] Failed to get USB device list: %s", libusb_error_name (count)); return; } for (i = 0; i < count && uv_device->priv->usb_device == NULL; i++) { libusb_device_handle *usb_device; struct libusb_device_descriptor desc; if (libusb_get_device_descriptor (devices[i], &desc) >= 0 && libusb_open (devices[i], &usb_device) == LIBUSB_SUCCESS) { unsigned char *manufacturer; unsigned char *product; unsigned char *serial_nbr; int index; manufacturer = g_malloc0 (256); product = g_malloc0 (256); serial_nbr = g_malloc0 (256); index = desc.iManufacturer; if (index > 0) libusb_get_string_descriptor_ascii (usb_device, index, manufacturer, 256); index = desc.iProduct; if (index > 0) libusb_get_string_descriptor_ascii (usb_device, index, product, 256); index = desc.iSerialNumber; if (index > 0) libusb_get_string_descriptor_ascii (usb_device, index, serial_nbr, 256); if (g_strcmp0 ((char * ) manufacturer, uv_device->priv->vendor) == 0 && g_strcmp0 ((char * ) product, uv_device->priv->product) == 0 && g_strcmp0 ((char * ) serial_nbr, uv_device->priv->serial_nbr) == 0) { struct libusb_config_descriptor *config; struct libusb_endpoint_descriptor endpoint; const struct libusb_interface *inter; const struct libusb_interface_descriptor *interdesc; uv_device->priv->usb_device = usb_device; libusb_get_config_descriptor (devices[i], 0, &config); for (j = 0; j < (int) config->bNumInterfaces; j++) { inter = &config->interface[j]; for (k = 0; k < inter->num_altsetting; k++) { interdesc = &inter->altsetting[k]; if (interdesc->bInterfaceClass == ARV_UV_INTERFACE_INTERFACE_CLASS && interdesc->bInterfaceSubClass == ARV_UV_INTERFACE_INTERFACE_SUBCLASS) { if (interdesc->bInterfaceProtocol == ARV_UV_INTERFACE_CONTROL_PROTOCOL) { endpoint = interdesc->endpoint[0]; uv_device->priv->control_endpoint = endpoint.bEndpointAddress & 0x0f; uv_device->priv->control_interface = interdesc->bInterfaceNumber; } if (interdesc->bInterfaceProtocol == ARV_UV_INTERFACE_DATA_PROTOCOL) { endpoint = interdesc->endpoint[0]; uv_device->priv->data_endpoint = endpoint.bEndpointAddress & 0x0f; uv_device->priv->data_interface = interdesc->bInterfaceNumber; } } } } libusb_free_config_descriptor (config); } else libusb_close (usb_device); g_free (manufacturer); g_free (product); g_free (serial_nbr); } } libusb_free_device_list (devices, 1); } ArvDevice * arv_uv_device_new (const char *vendor, const char *product, const char *serial_nbr) { ArvUvDevice *uv_device; g_return_val_if_fail (vendor != NULL, NULL); g_return_val_if_fail (product != NULL, NULL); g_return_val_if_fail (serial_nbr != NULL, NULL); arv_debug_device ("[UvDevice::new] Vendor = %s", vendor); arv_debug_device ("[UvDevice::new] Product = %s", product); arv_debug_device ("[UvDevice::new] S/N = %s", serial_nbr); uv_device = g_object_new (ARV_TYPE_UV_DEVICE, NULL); libusb_init (&uv_device->priv->usb); uv_device->priv->vendor = g_strdup (vendor); uv_device->priv->product = g_strdup (product); uv_device->priv->serial_nbr = g_strdup (serial_nbr); uv_device->priv->packet_id = 65300; /* Start near the end of the circular counter */ uv_device->priv->timeout_ms = 32; _open_usb_device (uv_device); arv_debug_device("[UvDevice::new] Using control endpoint %d, interface %d", uv_device->priv->control_endpoint, uv_device->priv->control_interface); arv_debug_device("[UvDevice::new] Using data endpoint %d, interface %d", uv_device->priv->data_endpoint, uv_device->priv->data_interface); if (uv_device->priv->usb_device == NULL || libusb_claim_interface (uv_device->priv->usb_device, uv_device->priv->control_interface) < 0 || libusb_claim_interface (uv_device->priv->usb_device, uv_device->priv->data_interface) < 0) { arv_warning_device ("[UvDevice::new] Failed to claim USB interface to '%s - #%s'", product, serial_nbr); g_object_unref (uv_device); return NULL; } _bootstrap (uv_device); if (!ARV_IS_GC (uv_device->priv->genicam)) { arv_warning_device ("[UvDevice::new] Failed to load genicam data"); g_object_unref (uv_device); return NULL; } return ARV_DEVICE (uv_device); } static void arv_uv_device_init (ArvUvDevice *uv_device) { uv_device->priv = G_TYPE_INSTANCE_GET_PRIVATE (uv_device, ARV_TYPE_UV_DEVICE, ArvUvDevicePrivate); uv_device->priv->cmd_packet_size_max = 65536 + sizeof (ArvUvcpHeader); uv_device->priv->ack_packet_size_max = 65536 + sizeof (ArvUvcpHeader); uv_device->priv->disconnected = FALSE; } static void arv_uv_device_finalize (GObject *object) { ArvUvDevice *uv_device = ARV_UV_DEVICE (object); g_object_unref (uv_device->priv->genicam); g_clear_pointer (&uv_device->priv->vendor, g_free); g_clear_pointer (&uv_device->priv->product, g_free); g_clear_pointer (&uv_device->priv->serial_nbr, g_free); if (uv_device->priv->usb_device != NULL) { libusb_release_interface (uv_device->priv->usb_device, uv_device->priv->control_interface); libusb_release_interface (uv_device->priv->usb_device, uv_device->priv->data_interface); libusb_close (uv_device->priv->usb_device); } libusb_exit (uv_device->priv->usb); parent_class->finalize (object); } static void arv_uv_device_class_init (ArvUvDeviceClass *uv_device_class) { GObjectClass *object_class = G_OBJECT_CLASS (uv_device_class); ArvDeviceClass *device_class = ARV_DEVICE_CLASS (uv_device_class); g_type_class_add_private (uv_device_class, sizeof (ArvUvDevicePrivate)); parent_class = g_type_class_peek_parent (uv_device_class); object_class->finalize = arv_uv_device_finalize; device_class->create_stream = arv_uv_device_create_stream; device_class->get_genicam_xml = arv_uv_device_get_genicam_xml; device_class->get_genicam = arv_uv_device_get_genicam; device_class->read_memory = arv_uv_device_read_memory; device_class->write_memory = arv_uv_device_write_memory; device_class->read_register = arv_uv_device_read_register; device_class->write_register = arv_uv_device_write_register; } G_DEFINE_TYPE (ArvUvDevice, arv_uv_device, ARV_TYPE_DEVICE) aravis-ARAVIS_0_6_0/src/arvuvdevice.h000066400000000000000000000034561334570641500175140ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_UV_DEVICE_H #define ARV_UV_DEVICE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS #define ARV_TYPE_UV_DEVICE (arv_uv_device_get_type ()) #define ARV_UV_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_UV_DEVICE, ArvUvDevice)) #define ARV_UV_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_UV_DEVICE, ArvUvDeviceClass)) #define ARV_IS_UV_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_UV_DEVICE)) #define ARV_IS_UV_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_UV_DEVICE)) #define ARV_UV_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_UV_DEVICE, ArvUvDeviceClass)) GType arv_uv_device_get_type (void); ArvDevice * arv_uv_device_new (const char *vendor, const char *product, const char *serial_nbr); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvuvdeviceprivate.h000066400000000000000000000032711334570641500211020ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_UV_DEVICE_PRIVATE_H #define ARV_UV_DEVICE_PRIVATE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS typedef enum { ARV_UV_ENDPOINT_CONTROL, ARV_UV_ENDPOINT_DATA } ArvUvEndpointType; typedef struct _ArvUvDeviceClass ArvUvDeviceClass; typedef struct _ArvUvDevicePrivate ArvUvDevicePrivate; struct _ArvUvDevice { ArvDevice device; ArvUvDevicePrivate *priv; }; struct _ArvUvDeviceClass { ArvDeviceClass parent_class; }; gboolean arv_uv_device_bulk_transfer (ArvUvDevice *uv_device, ArvUvEndpointType endpoint_type, unsigned char endpoint_flags, void *data, size_t size, size_t *transferred_size, guint32 timeout_ms, GError **error); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvuvinterface.c000066400000000000000000000274211334570641500202060ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvuvinterface * @short_description: USB3Vision interface */ #include #include #include #include #include #include #include #include /* ArvUvInterface implementation */ static GObjectClass *parent_class = NULL; typedef struct { char *name; char *full_name; char *manufacturer; char *product; char *serial_nbr; volatile gint ref_count; } ArvUvInterfaceDeviceInfos; static ArvUvInterfaceDeviceInfos * arv_uv_interface_device_infos_new (const char *manufacturer, const char *product, const char *serial_nbr) { ArvUvInterfaceDeviceInfos *infos; g_return_val_if_fail (manufacturer != NULL, NULL); g_return_val_if_fail (product != NULL, NULL); g_return_val_if_fail (serial_nbr != NULL, NULL); infos = g_new (ArvUvInterfaceDeviceInfos, 1); infos->manufacturer = g_strdup (manufacturer); infos->name = g_strdup_printf ("%s-%s", arv_vendor_alias_lookup (manufacturer), serial_nbr); infos->full_name = g_strdup_printf ("%s-%s", manufacturer, serial_nbr); infos->product = g_strdup (product); infos->serial_nbr = g_strdup (serial_nbr); infos->ref_count = 1; arv_str_strip (infos->name, ARV_DEVICE_NAME_ILLEGAL_CHARACTERS, ARV_DEVICE_NAME_REPLACEMENT_CHARACTER); arv_str_strip (infos->full_name, ARV_DEVICE_NAME_ILLEGAL_CHARACTERS, ARV_DEVICE_NAME_REPLACEMENT_CHARACTER); return infos; } static ArvUvInterfaceDeviceInfos * arv_uv_interface_device_infos_ref (ArvUvInterfaceDeviceInfos *infos) { g_return_val_if_fail (infos != NULL, NULL); g_return_val_if_fail (g_atomic_int_get (&infos->ref_count) > 0, NULL); g_atomic_int_inc (&infos->ref_count); return infos; } static void arv_uv_interface_device_infos_unref (ArvUvInterfaceDeviceInfos *infos) { g_return_if_fail (infos != NULL); g_return_if_fail (g_atomic_int_get (&infos->ref_count) > 0); if (g_atomic_int_dec_and_test (&infos->ref_count)) { g_clear_pointer (&infos->name, g_free); g_clear_pointer (&infos->full_name, g_free); g_clear_pointer (&infos->manufacturer, g_free); g_clear_pointer (&infos->product, g_free); g_clear_pointer (&infos->serial_nbr, g_free); g_clear_pointer (&infos, g_free); } } struct _ArvUvInterfacePrivate { GHashTable *devices; libusb_context *usb; }; #if 0 static void printdev (libusb_device *device) { struct libusb_device_descriptor desc; struct libusb_config_descriptor *config; const struct libusb_interface *inter; const struct libusb_interface_descriptor *interdesc; int r, i, j; r = libusb_get_device_descriptor (device, &desc); if (r < 0) { printf ("Failed to get device descriptor\n"); return; } printf ("VendorID: 0x%04x\n", desc.idVendor); printf ("ProductID: 0x%04x\n", desc.idProduct); printf ("Device Class: 0x%02x\n", (int) desc.bDeviceClass); printf ("Device SubClass: 0x%02x\n", (int) desc.bDeviceSubClass); printf ("Protocol: 0x%02x\n", (int) desc.bDeviceProtocol); libusb_get_config_descriptor (device, 0, &config); printf ("Nbr of Interfaces: %d\n", (int)config->bNumInterfaces); for (i = 0; i< (int) config->bNumInterfaces; i++) { inter = &config->interface[i]; for (j = 0; j < inter->num_altsetting; j++) { interdesc = &inter->altsetting[j]; printf (" Interface Class: 0x%02x\n", (int) interdesc->bInterfaceClass); printf (" Interface SubClass: 0x%02x\n", (int) interdesc->bInterfaceSubClass); printf (" Interface Protocol: 0x%02x\n", (int) interdesc->bInterfaceProtocol); } } libusb_free_config_descriptor (config); } #endif ArvInterfaceDeviceIds * _usb_device_to_device_ids (ArvUvInterface *uv_interface, libusb_device *device) { ArvInterfaceDeviceIds *device_ids = NULL; libusb_device_handle *device_handle; struct libusb_device_descriptor desc; struct libusb_config_descriptor *config; const struct libusb_interface *inter; const struct libusb_interface_descriptor *interdesc; gboolean control_protocol_found; gboolean data_protocol_found; int r, i, j; r = libusb_get_device_descriptor (device, &desc); if (r < 0) { arv_warning_interface ("Failed to get device descriptor"); return NULL; } if (desc.bDeviceClass != ARV_UV_INTERFACE_DEVICE_CLASS || desc.bDeviceSubClass != ARV_UV_INTERFACE_DEVICE_SUBCLASS || desc.bDeviceProtocol != ARV_UV_INTERFACE_DEVICE_PROTOCOL) return NULL; control_protocol_found = FALSE; data_protocol_found = FALSE; libusb_get_config_descriptor (device, 0, &config); for (i = 0; i< (int) config->bNumInterfaces; i++) { inter = &config->interface[i]; for (j = 0; j < inter->num_altsetting; j++) { interdesc = &inter->altsetting[j]; if (interdesc->bInterfaceClass == ARV_UV_INTERFACE_INTERFACE_CLASS && interdesc->bInterfaceSubClass == ARV_UV_INTERFACE_INTERFACE_SUBCLASS) { if (interdesc->bInterfaceProtocol == ARV_UV_INTERFACE_CONTROL_PROTOCOL) control_protocol_found = TRUE; if (interdesc->bInterfaceProtocol == ARV_UV_INTERFACE_DATA_PROTOCOL) data_protocol_found = TRUE; } } } libusb_free_config_descriptor (config); if (!control_protocol_found || !data_protocol_found) return NULL; if (libusb_open (device, &device_handle) == LIBUSB_SUCCESS) { ArvUvInterfaceDeviceInfos *device_infos; unsigned char *manufacturer; unsigned char *product; unsigned char *serial_nbr; int index; device_ids = g_new0 (ArvInterfaceDeviceIds, 1); manufacturer = g_malloc0 (256); product = g_malloc0 (256); serial_nbr = g_malloc0 (256); index = desc.iManufacturer; if (index > 0) libusb_get_string_descriptor_ascii (device_handle, index, manufacturer, 256); index = desc.iProduct; if (index > 0) libusb_get_string_descriptor_ascii (device_handle, index, product, 256); index = desc.iSerialNumber; if (index > 0) libusb_get_string_descriptor_ascii (device_handle, index, serial_nbr, 256); device_infos = arv_uv_interface_device_infos_new ((char *) manufacturer, (char *) product, (char *) serial_nbr); g_hash_table_replace (uv_interface->priv->devices, device_infos->name, arv_uv_interface_device_infos_ref (device_infos)); g_hash_table_replace (uv_interface->priv->devices, device_infos->full_name, arv_uv_interface_device_infos_ref (device_infos)); arv_uv_interface_device_infos_unref (device_infos); device_ids->device = g_strdup (device_infos->name); device_ids->physical = g_strdup ("USB3"); /* FIXME */ device_ids->address = g_strdup ("USB3"); /* FIXME */ device_ids->vendor = g_strdup (device_infos->manufacturer); device_ids->model = g_strdup (device_infos->product); device_ids->serial_nbr = g_strdup (device_infos->serial_nbr); g_free (manufacturer); g_free (product); g_free (serial_nbr); libusb_close (device_handle); } else arv_warning_interface ("Failed to open USB device"); return device_ids; } static void _discover (ArvUvInterface *uv_interface, GArray *device_ids) { libusb_device **devices; unsigned uv_count = 0; ssize_t count; unsigned i; count = libusb_get_device_list(uv_interface->priv->usb, &devices); if (count < 0) { arv_warning_interface ("[[UvInterface:_discover] Failed to get USB device list: %s", libusb_error_name (count)); return; } for (i = 0; i < count; i++) { ArvInterfaceDeviceIds *ids; ids = _usb_device_to_device_ids (uv_interface, devices[i]); if (ids != NULL) { uv_count++; if (device_ids != NULL) g_array_append_val (device_ids, ids); else { g_free (ids->device); g_free (ids->physical); g_free (ids->address); g_free (ids->vendor); g_free (ids->model); g_free (ids->serial_nbr); g_free (ids); } } } arv_debug_interface ("Found %d USB3Vision device%s (among %d USB device%s)", uv_count , uv_count > 1 ? "s" : "", count, count > 1 ? "s" : ""); libusb_free_device_list (devices, 1); } static void arv_uv_interface_update_device_list (ArvInterface *interface, GArray *device_ids) { ArvUvInterface *uv_interface = ARV_UV_INTERFACE (interface); g_assert (device_ids->len == 0); _discover (uv_interface, device_ids); } static ArvDevice * _open_device (ArvInterface *interface, const char *device_id) { ArvUvInterface *uv_interface; ArvDevice *device = NULL; ArvUvInterfaceDeviceInfos *device_infos; uv_interface = ARV_UV_INTERFACE (interface); if (device_id == NULL) { GList *device_list; device_list = g_hash_table_get_values (uv_interface->priv->devices); device_infos = device_list != NULL ? device_list->data : NULL; g_list_free (device_list); } else device_infos = g_hash_table_lookup (uv_interface->priv->devices, device_id); if (device_infos == NULL) return NULL; device = arv_uv_device_new (device_infos->manufacturer, device_infos->product, device_infos->serial_nbr); return device; } static ArvDevice * arv_uv_interface_open_device (ArvInterface *interface, const char *device_id) { ArvDevice *device; device = _open_device (interface, device_id); if (ARV_IS_DEVICE (device)) return device; _discover (ARV_UV_INTERFACE (interface), NULL); return _open_device (interface, device_id); } static ArvInterface *uv_interface = NULL; static GMutex uv_interface_mutex; /** * arv_uv_interface_get_instance: * * Gets the unique instance of the GV interface. * * Returns: (transfer none): a #ArvInterface singleton. */ ArvInterface * arv_uv_interface_get_instance (void) { g_mutex_lock (&uv_interface_mutex); if (uv_interface == NULL) uv_interface = g_object_new (ARV_TYPE_UV_INTERFACE, NULL); g_mutex_unlock (&uv_interface_mutex); return ARV_INTERFACE (uv_interface); } void arv_uv_interface_destroy_instance (void) { g_mutex_lock (&uv_interface_mutex); g_clear_object (&uv_interface); g_mutex_unlock (&uv_interface_mutex); } static void arv_uv_interface_init (ArvUvInterface *uv_interface) { uv_interface->priv = G_TYPE_INSTANCE_GET_PRIVATE (uv_interface, ARV_TYPE_UV_INTERFACE, ArvUvInterfacePrivate); libusb_init (&uv_interface->priv->usb); uv_interface->priv->devices = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) arv_uv_interface_device_infos_unref); } static void arv_uv_interface_finalize (GObject *object) { ArvUvInterface *uv_interface = ARV_UV_INTERFACE (object); g_hash_table_unref (uv_interface->priv->devices); parent_class->finalize (object); libusb_exit (uv_interface->priv->usb); } static void arv_uv_interface_class_init (ArvUvInterfaceClass *uv_interface_class) { GObjectClass *object_class = G_OBJECT_CLASS (uv_interface_class); ArvInterfaceClass *interface_class = ARV_INTERFACE_CLASS (uv_interface_class); g_type_class_add_private (uv_interface_class, sizeof (ArvUvInterfacePrivate)); parent_class = g_type_class_peek_parent (uv_interface_class); object_class->finalize = arv_uv_interface_finalize; interface_class->update_device_list = arv_uv_interface_update_device_list; interface_class->open_device = arv_uv_interface_open_device; interface_class->protocol = "USB3Vision"; } G_DEFINE_TYPE (ArvUvInterface, arv_uv_interface, ARV_TYPE_INTERFACE) aravis-ARAVIS_0_6_0/src/arvuvinterface.h000066400000000000000000000035221334570641500202070ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_UV_INTERFACE_H #define ARV_UV_INTERFACE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS #define ARV_TYPE_UV_INTERFACE (arv_uv_interface_get_type ()) #define ARV_UV_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_UV_INTERFACE, ArvUvInterface)) #define ARV_UV_INTERFACE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_UV_INTERFACE, ArvUvInterfaceClass)) #define ARV_IS_UV_INTERFACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_UV_INTERFACE)) #define ARV_IS_UV_INTERFACE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_UV_INTERFACE)) #define ARV_UV_INTERFACE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_UV_INTERFACE, ArvUvInterfaceClass)) GType arv_uv_interface_get_type (void); ArvInterface * arv_uv_interface_get_instance (void); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvuvinterfaceprivate.h000066400000000000000000000035461334570641500216100ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_UV_INTERFACE_PRIVATE_H #define ARV_UV_INTERFACE_PRIVATE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include #define ARV_UV_INTERFACE_DEVICE_CLASS 0xef /* Miscellaneous device */ #define ARV_UV_INTERFACE_DEVICE_SUBCLASS 0x02 #define ARV_UV_INTERFACE_DEVICE_PROTOCOL 0x01 #define ARV_UV_INTERFACE_INTERFACE_CLASS 0xef #define ARV_UV_INTERFACE_INTERFACE_SUBCLASS 0x05 #define ARV_UV_INTERFACE_CONTROL_PROTOCOL 0x00 #define ARV_UV_INTERFACE_EVENT_PROTOCOL 0x01 #define ARV_UV_INTERFACE_DATA_PROTOCOL 0x02 G_BEGIN_DECLS typedef struct _ArvUvInterfacePrivate ArvUvInterfacePrivate; typedef struct _ArvUvInterfaceClass ArvUvInterfaceClass; struct _ArvUvInterface { ArvInterface interface; ArvUvInterfacePrivate *priv; }; struct _ArvUvInterfaceClass { ArvInterfaceClass parent_class; }; void arv_uv_interface_destroy_instance (void); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvuvsp.c000066400000000000000000000105231334570641500166630ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #include #include #include /** * SECTION: arvuvsp * @short_description: USB3Vision stream packet handling */ /** * arv_uvsp_packet_to_string: * @packet: a #ArvUvspPacket * * Converts @packet into a human readable string. * * return value: (transfer full): A newly allocated string. */ char * arv_uvsp_packet_to_string (const ArvUvspPacket *packet) { ArvUvspLeader *leader = (ArvUvspLeader *) packet; ArvUvspTrailer *trailer = (ArvUvspTrailer *) packet; GString *string; char *c_string; g_return_val_if_fail (packet != NULL, NULL); string = g_string_new (""); switch (GUINT32_FROM_LE (packet->header.magic)) { case ARV_UVSP_LEADER_MAGIC: g_string_append (string, "packet_type = leader\n"); g_string_append_printf (string, "size = %d\n", GUINT16_FROM_LE (packet->header.size)); g_string_append_printf (string, "frame id = %" G_GUINT64_FORMAT "\n", GUINT64_FROM_LE (packet->header.frame_id)); switch (GUINT16_FROM_LE (leader->infos.payload_type)) { case ARV_UVSP_PAYLOAD_TYPE_IMAGE: g_string_append (string, "payload_type = image\n"); break; case ARV_UVSP_PAYLOAD_TYPE_CHUNK: g_string_append (string, "payload_type = chunk\n"); break; case ARV_UVSP_PAYLOAD_TYPE_EXTENDED_CHUNK: g_string_append (string, "payload_type = extended chunk\n"); break; default: g_string_append (string, "payload_type = unknown\n"); break; } g_string_append_printf (string, "pixel format = %s\n", arv_pixel_format_to_gst_caps_string (GUINT32_FROM_LE (leader->infos.pixel_format))); g_string_append_printf (string, "width = %d\n", GUINT16_FROM_LE (leader->infos.width)); g_string_append_printf (string, "height = %d\n", GUINT16_FROM_LE (leader->infos.height)); g_string_append_printf (string, "x_offset = %d\n", GUINT16_FROM_LE (leader->infos.x_offset)); g_string_append_printf (string, "y_offset = %d", GUINT16_FROM_LE (leader->infos.y_offset)); break; case ARV_UVSP_TRAILER_MAGIC: g_string_append (string, "packet_type = trailer\n"); g_string_append_printf (string, "size = %d\n", GUINT16_FROM_LE (packet->header.size)); g_string_append_printf (string, "frame id = %" G_GUINT64_FORMAT "\n", GUINT64_FROM_LE (packet->header.frame_id)); g_string_append_printf (string, "payload_size = %" G_GUINT64_FORMAT "", GUINT64_FROM_LE (trailer->infos.payload_size)); break; default: g_string_append (string, "packet_type = image"); break; } #if 0 { size_t packet_size; packet_size = sizeof (ArvUvspHeader) + GUINT16_FROM_LE (packet->header.size); arv_g_string_append_hex_dump (string, packet, packet_size); } #endif c_string = string->str; g_string_free (string, FALSE); return c_string; } /** * arv_uvsp_packet_debug: * @packet: a #ArvUvspPacket * @level: debug level * * Dumps the content of @packet if level is lower or equal to the current debug level for the sp debug category. See arv_debug_enable(). */ void arv_uvsp_packet_debug (const ArvUvspPacket *packet, ArvDebugLevel level) { char *string; if (!arv_debug_check (&arv_debug_category_sp, level)) return; string = arv_uvsp_packet_to_string (packet); switch (level) { case ARV_DEBUG_LEVEL_LOG: arv_log_sp ("%s", string); break; case ARV_DEBUG_LEVEL_DEBUG: arv_debug_sp ("%s", string); break; case ARV_DEBUG_LEVEL_WARNING: arv_warning_sp ("%s", string); break; default: break; } g_free (string); } aravis-ARAVIS_0_6_0/src/arvuvsp.h000066400000000000000000000115321334570641500166710ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_UVSP_H #define ARV_UVSP_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS #define ARV_UVSP_LEADER_MAGIC 0x4C563355 #define ARV_UVSP_TRAILER_MAGIC 0x54563355 /** * ArvUvspPacketType: * @ARV_UVSP_PACKET_TYPE_UNKNOWN: unknown packet * @ARV_UVSP_PACKET_TYPE_LEADER: leader packet * @ARV_UVSP_PACKET_TYPE_TRAILER: trailer packet * @ARV_UVSP_PACKET_TYPE_DATA: data packet */ typedef enum { ARV_UVSP_PACKET_TYPE_UNKNOWN, ARV_UVSP_PACKET_TYPE_LEADER, ARV_UVSP_PACKET_TYPE_TRAILER, ARV_UVSP_PACKET_TYPE_DATA } ArvUvspPacketType; typedef enum { ARV_UVSP_PAYLOAD_TYPE_UNKNOWN = 0x0000, ARV_UVSP_PAYLOAD_TYPE_IMAGE = 0x0001, ARV_UVSP_PAYLOAD_TYPE_CHUNK = 0x4000, ARV_UVSP_PAYLOAD_TYPE_EXTENDED_CHUNK = 0x4001 } ArvUvspPayloadType; #pragma pack(push,1) typedef struct { guint32 magic; guint16 unknown0; guint16 size; guint64 frame_id; } ArvUvspHeader; typedef struct { ArvUvspHeader header; void *data; } ArvUvspPacket; typedef struct { guint16 unknown0; guint16 payload_type; guint64 timestamp; guint32 pixel_format; guint32 width; guint32 height; guint32 x_offset; guint32 y_offset; guint16 x_padding; guint16 unknown1; } ArvUvspLeaderInfos; typedef struct { ArvUvspHeader header; ArvUvspLeaderInfos infos; } ArvUvspLeader; typedef struct { guint32 unknown0; guint64 payload_size; } ArvUvspTrailerInfos; typedef struct { ArvUvspHeader header; ArvUvspTrailerInfos infos; } ArvUvspTrailer; #pragma pack(pop) char * arv_uvsp_packet_to_string (const ArvUvspPacket *packet); void arv_uvsp_packet_debug (const ArvUvspPacket *packet, ArvDebugLevel level); static inline ArvUvspPacketType arv_uvsp_packet_get_packet_type (const ArvUvspPacket *packet) { if (packet == NULL) return ARV_UVSP_PACKET_TYPE_UNKNOWN; else if (GUINT32_FROM_LE (packet->header.magic) == ARV_UVSP_LEADER_MAGIC) return ARV_UVSP_PACKET_TYPE_LEADER; else if (GUINT32_FROM_LE (packet->header.magic) == ARV_UVSP_TRAILER_MAGIC) return ARV_UVSP_PACKET_TYPE_TRAILER; else return ARV_UVSP_PACKET_TYPE_DATA; } static inline ArvBufferPayloadType arv_uvsp_packet_get_buffer_payload_type (ArvUvspPacket *packet) { ArvUvspLeader *leader; ArvUvspPayloadType uvsp_payload_type; if (packet == NULL) return ARV_BUFFER_PAYLOAD_TYPE_UNKNOWN; leader = (ArvUvspLeader *) packet; uvsp_payload_type = (ArvUvspPayloadType) GUINT16_FROM_LE (leader->infos.payload_type); switch (uvsp_payload_type) { case ARV_UVSP_PAYLOAD_TYPE_IMAGE: return ARV_BUFFER_PAYLOAD_TYPE_IMAGE; case ARV_UVSP_PAYLOAD_TYPE_CHUNK: return ARV_BUFFER_PAYLOAD_TYPE_CHUNK_DATA; case ARV_UVSP_PAYLOAD_TYPE_EXTENDED_CHUNK: return ARV_BUFFER_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA; case ARV_UVSP_PAYLOAD_TYPE_UNKNOWN: return ARV_BUFFER_PAYLOAD_TYPE_UNKNOWN; } return ARV_BUFFER_PAYLOAD_TYPE_UNKNOWN; } static inline guint64 arv_uvsp_packet_get_frame_id (ArvUvspPacket *packet) { if (packet == NULL) return 0; return (GUINT64_FROM_LE (packet->header.frame_id)); } static inline void arv_uvsp_packet_get_region (ArvUvspPacket *packet, guint32 *width, guint32 *height, guint32 *x_offset, guint32 *y_offset) { ArvUvspLeader *leader; if (packet == NULL) return; leader = (ArvUvspLeader *)packet; *width = GUINT32_FROM_LE (leader->infos.width); *height = GUINT32_FROM_LE (leader->infos.height); *x_offset = GUINT32_FROM_LE (leader->infos.x_offset); *y_offset = GUINT32_FROM_LE (leader->infos.y_offset); } static inline ArvPixelFormat arv_uvsp_packet_get_pixel_format (ArvUvspPacket *packet) { ArvUvspLeader *leader; if (packet == NULL) return 0; leader = (ArvUvspLeader *)packet; return GUINT32_FROM_LE (leader->infos.pixel_format); } static inline guint64 arv_uvsp_packet_get_timestamp (ArvUvspPacket *packet) { ArvUvspLeader *leader; if (packet == NULL) return 0; leader = (ArvUvspLeader *)packet; return GUINT64_FROM_LE (leader->infos.timestamp); } G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvuvstream.c000066400000000000000000000327321334570641500175420ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /** * SECTION: arvuvstream * @short_description: USB3Vision video stream */ #include #include #include #include #include #include #include #include #include #define ARV_UV_STREAM_MAXIMUM_TRANSFER_SIZE 1048576 static GObjectClass *parent_class = NULL; struct _ArvUvStreamPrivate { GThread *thread; void *thread_data; }; /* Acquisition thread */ typedef struct { ArvUvDevice *uv_device; ArvStream *stream; ArvStreamCallback callback; void *user_data; size_t leader_size; size_t payload_size; size_t trailer_size; gboolean cancel; /* Statistics */ guint n_completed_buffers; guint n_failures; guint n_underruns; } ArvUvStreamThreadData; static void * arv_uv_stream_thread (void *data) { ArvUvStreamThreadData *thread_data = data; ArvUvspPacket *packet; ArvBuffer *buffer = NULL; void *incoming_buffer; guint64 offset; size_t transferred; arv_log_stream_thread ("Start USB3Vision stream thread"); incoming_buffer = g_malloc (ARV_UV_STREAM_MAXIMUM_TRANSFER_SIZE); if (thread_data->callback != NULL) thread_data->callback (thread_data->user_data, ARV_STREAM_CALLBACK_TYPE_INIT, NULL); offset = 0; while (!g_atomic_int_get (&thread_data->cancel)) { GError *error = NULL; size_t size; transferred = 0; if (buffer == NULL) size = ARV_UV_STREAM_MAXIMUM_TRANSFER_SIZE; else { if (offset < buffer->priv->size) size = MIN (thread_data->payload_size, buffer->priv->size - offset); else size = thread_data->trailer_size; } /* Avoid unnecessary memory copy by transferring data directly to the image buffer */ if (buffer != NULL && buffer->priv->status == ARV_BUFFER_STATUS_FILLING && offset + size <= buffer->priv->size) packet = buffer->priv->data + offset; else packet = incoming_buffer; arv_log_sp ("Asking for %u bytes", size); arv_uv_device_bulk_transfer (thread_data->uv_device, ARV_UV_ENDPOINT_DATA, LIBUSB_ENDPOINT_IN, packet, size, &transferred, 0, &error); if (error != NULL) { arv_warning_sp ("USB transfer error: %s", error->message); g_clear_error (&error); } else { ArvUvspPacketType packet_type; arv_log_sp ("Received %d bytes", transferred); arv_uvsp_packet_debug (packet, ARV_DEBUG_LEVEL_LOG); packet_type = arv_uvsp_packet_get_packet_type (packet); switch (packet_type) { case ARV_UVSP_PACKET_TYPE_LEADER: if (buffer != NULL) { arv_debug_stream_thread ("New leader received while a buffer is still open"); buffer->priv->status = ARV_BUFFER_STATUS_MISSING_PACKETS; arv_stream_push_output_buffer (thread_data->stream, buffer); if (thread_data->callback != NULL) thread_data->callback (thread_data->user_data, ARV_STREAM_CALLBACK_TYPE_BUFFER_DONE, buffer); thread_data->n_failures++; buffer = NULL; } buffer = arv_stream_pop_input_buffer (thread_data->stream); if (buffer != NULL) { buffer->priv->system_timestamp_ns = g_get_real_time () * 1000LL; buffer->priv->status = ARV_BUFFER_STATUS_FILLING; buffer->priv->payload_type = arv_uvsp_packet_get_buffer_payload_type (packet); buffer->priv->chunk_endianness = G_LITTLE_ENDIAN; if (buffer->priv->payload_type == ARV_BUFFER_PAYLOAD_TYPE_IMAGE || buffer->priv->payload_type == ARV_BUFFER_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA) { arv_uvsp_packet_get_region (packet, &buffer->priv->width, &buffer->priv->height, &buffer->priv->x_offset, &buffer->priv->y_offset); buffer->priv->pixel_format = arv_uvsp_packet_get_pixel_format (packet); } buffer->priv->frame_id = arv_uvsp_packet_get_frame_id (packet); buffer->priv->timestamp_ns = arv_uvsp_packet_get_timestamp (packet); offset = 0; if (thread_data->callback != NULL) thread_data->callback (thread_data->user_data, ARV_STREAM_CALLBACK_TYPE_START_BUFFER, NULL); } else thread_data->n_underruns++; break; case ARV_UVSP_PACKET_TYPE_TRAILER: if (buffer != NULL) { arv_log_stream_thread ("Received %" G_GUINT64_FORMAT " bytes - expected %" G_GUINT64_FORMAT, offset, buffer->priv->size); /* If the image was incomplete, drop the frame and try again. */ if (offset != buffer->priv->size) { arv_debug_stream_thread ("Incomplete image received, dropping"); buffer->priv->status = ARV_BUFFER_STATUS_SIZE_MISMATCH; arv_stream_push_output_buffer (thread_data->stream, buffer); if (thread_data->callback != NULL) thread_data->callback (thread_data->user_data, ARV_STREAM_CALLBACK_TYPE_BUFFER_DONE, buffer); thread_data->n_underruns++; buffer = NULL; } else { buffer->priv->status = ARV_BUFFER_STATUS_SUCCESS; arv_stream_push_output_buffer (thread_data->stream, buffer); if (thread_data->callback != NULL) thread_data->callback (thread_data->user_data, ARV_STREAM_CALLBACK_TYPE_BUFFER_DONE, buffer); thread_data->n_completed_buffers++; buffer = NULL; } } break; case ARV_UVSP_PACKET_TYPE_DATA: if (buffer != NULL && buffer->priv->status == ARV_BUFFER_STATUS_FILLING) { if (offset + transferred <= buffer->priv->size) { if (packet == incoming_buffer) memcpy (((char *) buffer->priv->data) + offset, packet, transferred); offset += transferred; } else buffer->priv->status = ARV_BUFFER_STATUS_SIZE_MISMATCH; } break; default: arv_debug_stream_thread ("Unkown packet type"); break; } } } if (thread_data->callback != NULL) thread_data->callback (thread_data->user_data, ARV_STREAM_CALLBACK_TYPE_EXIT, NULL); g_free (incoming_buffer); arv_log_stream_thread ("Stop USB3Vision stream thread"); return NULL; } /* ArvUvStream implemenation */ /** * arv_uv_stream_new: (skip) * @uv_device: a #ArvUvDevice * @callback: (scope call): image processing callback * @user_data: (closure): user data for @callback * * Return Value: (transfer full): a new #ArvStream. */ ArvStream * arv_uv_stream_new (ArvUvDevice *uv_device, ArvStreamCallback callback, void *user_data) { ArvDevice *device; ArvUvStream *uv_stream; ArvUvStreamThreadData *thread_data; ArvStream *stream; guint64 offset; guint64 sirm_offset; guint64 si_req_payload_size; guint32 si_req_leader_size; guint32 si_req_trailer_size; guint32 si_payload_size; guint32 si_payload_count; guint32 si_transfer1_size; guint32 si_transfer2_size; guint32 si_control; g_return_val_if_fail (ARV_IS_UV_DEVICE (uv_device), NULL); device = ARV_DEVICE (uv_device); arv_device_read_memory (device, ARV_ABRM_SBRM_ADDRESS, sizeof (guint64), &offset, NULL); arv_device_read_memory (device, offset + ARV_SBRM_SIRM_ADDRESS, sizeof (guint64), &sirm_offset, NULL); arv_device_read_memory (device, sirm_offset + ARV_SI_REQ_PAYLOAD_SIZE, sizeof (si_req_payload_size), &si_req_payload_size, NULL); arv_device_read_memory (device, sirm_offset + ARV_SI_REQ_LEADER_SIZE, sizeof (si_req_leader_size), &si_req_leader_size, NULL); arv_device_read_memory (device, sirm_offset + ARV_SI_REQ_TRAILER_SIZE, sizeof (si_req_trailer_size), &si_req_trailer_size, NULL); arv_debug_stream ("SI_REQ_PAYLOAD_SIZE = 0x%016lx", si_req_payload_size); arv_debug_stream ("SI_REQ_LEADER_SIZE = 0x%08x", si_req_leader_size); arv_debug_stream ("SI_REQ_TRAILER_SIZE = 0x%08x", si_req_trailer_size); if (si_req_leader_size < 1) { arv_warning_stream ("Wrong SI_REQ_LEADER_SIZE value, using %d instead", ARV_UV_STREAM_MAXIMUM_TRANSFER_SIZE); si_req_leader_size = ARV_UV_STREAM_MAXIMUM_TRANSFER_SIZE; } if (si_req_trailer_size < 1) { arv_warning_stream ("Wrong SI_REQ_TRAILER_SIZE value, using %d instead", ARV_UV_STREAM_MAXIMUM_TRANSFER_SIZE); si_req_trailer_size = ARV_UV_STREAM_MAXIMUM_TRANSFER_SIZE; } si_payload_size = ARV_UV_STREAM_MAXIMUM_TRANSFER_SIZE; si_payload_count= si_req_payload_size / si_payload_size; si_transfer1_size = si_req_payload_size % si_payload_size; si_transfer2_size = 0; arv_device_write_memory (device, sirm_offset + ARV_SI_MAX_LEADER_SIZE, sizeof (si_req_leader_size), &si_req_leader_size, NULL); arv_device_write_memory (device, sirm_offset + ARV_SI_MAX_TRAILER_SIZE, sizeof (si_req_trailer_size), &si_req_trailer_size, NULL); arv_device_write_memory (device, sirm_offset + ARV_SI_PAYLOAD_SIZE, sizeof (si_payload_size), &si_payload_size, NULL); arv_device_write_memory (device, sirm_offset + ARV_SI_PAYLOAD_COUNT, sizeof (si_payload_count), &si_payload_count, NULL); arv_device_write_memory (device, sirm_offset + ARV_SI_TRANSFER1_SIZE, sizeof (si_transfer1_size), &si_transfer1_size, NULL); arv_device_write_memory (device, sirm_offset + ARV_SI_TRANSFER2_SIZE, sizeof (si_transfer2_size), &si_transfer2_size, NULL); arv_debug_stream ("SI_PAYLOAD_SIZE = 0x%08x", si_payload_size); arv_debug_stream ("SI_PAYLOAD_COUNT = 0x%08x", si_payload_count); arv_debug_stream ("SI_TRANSFER1_SIZE = 0x%08x", si_transfer1_size); arv_debug_stream ("SI_TRANSFER2_SIZE = 0x%08x", si_transfer2_size); arv_debug_stream ("SI_MAX_LEADER_SIZE = 0x%08x", si_req_leader_size); arv_debug_stream ("SI_MAX_TRAILER_SIZE = 0x%08x", si_req_trailer_size); si_control = 0x1; arv_device_write_memory (device, sirm_offset + ARV_SI_CONTROL, sizeof (si_control), &si_control, NULL); uv_stream = g_object_new (ARV_TYPE_UV_STREAM, NULL); stream = ARV_STREAM (uv_stream); thread_data = g_new (ArvUvStreamThreadData, 1); thread_data->uv_device = g_object_ref (uv_device); thread_data->stream = stream; thread_data->callback = callback; thread_data->user_data = user_data; thread_data->cancel = FALSE; thread_data->leader_size = si_req_leader_size; thread_data->payload_size = si_payload_size; thread_data->trailer_size = si_req_trailer_size; thread_data->n_completed_buffers = 0; thread_data->n_failures = 0; thread_data->n_underruns = 0; uv_stream->priv->thread_data = thread_data; uv_stream->priv->thread = g_thread_new ("arv_uv_stream", arv_uv_stream_thread, uv_stream->priv->thread_data); return ARV_STREAM (uv_stream); } /* ArvStream implementation */ static void arv_uv_stream_get_statistics (ArvStream *stream, guint64 *n_completed_buffers, guint64 *n_failures, guint64 *n_underruns) { ArvUvStream *uv_stream = ARV_UV_STREAM (stream); ArvUvStreamThreadData *thread_data; thread_data = uv_stream->priv->thread_data; *n_completed_buffers = thread_data->n_completed_buffers; *n_failures = thread_data->n_failures; *n_underruns = thread_data->n_underruns; } static void arv_uv_stream_init (ArvUvStream *uv_stream) { uv_stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (uv_stream, ARV_TYPE_UV_STREAM, ArvUvStreamPrivate); } static void arv_uv_stream_finalize (GObject *object) { ArvUvStream *uv_stream = ARV_UV_STREAM (object); if (uv_stream->priv->thread != NULL) { ArvUvStreamThreadData *thread_data; guint64 offset; guint64 sirm_offset; guint32 si_control; thread_data = uv_stream->priv->thread_data; g_atomic_int_set (&thread_data->cancel, TRUE); g_thread_join (uv_stream->priv->thread); si_control = 0x0; arv_device_read_memory (ARV_DEVICE (thread_data->uv_device), ARV_ABRM_SBRM_ADDRESS, sizeof (guint64), &offset, NULL); arv_device_read_memory (ARV_DEVICE (thread_data->uv_device), offset + ARV_SBRM_SIRM_ADDRESS, sizeof (guint64), &sirm_offset, NULL); arv_device_write_memory (ARV_DEVICE (thread_data->uv_device), sirm_offset + ARV_SI_CONTROL, sizeof (si_control), &si_control, NULL); arv_debug_stream ("[UvStream::finalize] n_completed_buffers = %u", thread_data->n_completed_buffers); arv_debug_stream ("[UvStream::finalize] n_failures = %u", thread_data->n_failures); arv_debug_stream ("[UvStream::finalize] n_underruns = %u", thread_data->n_underruns); g_clear_object (&thread_data->uv_device); g_free (thread_data); uv_stream->priv->thread_data = NULL; uv_stream->priv->thread = NULL; } parent_class->finalize (object); } static void arv_uv_stream_class_init (ArvUvStreamClass *uv_stream_class) { GObjectClass *object_class = G_OBJECT_CLASS (uv_stream_class); ArvStreamClass *stream_class = ARV_STREAM_CLASS (uv_stream_class); g_type_class_add_private (uv_stream_class, sizeof (ArvUvStreamPrivate)); parent_class = g_type_class_peek_parent (uv_stream_class); object_class->finalize = arv_uv_stream_finalize; stream_class->get_statistics = arv_uv_stream_get_statistics; } G_DEFINE_TYPE (ArvUvStream, arv_uv_stream, ARV_TYPE_STREAM) aravis-ARAVIS_0_6_0/src/arvuvstream.h000066400000000000000000000033101334570641500175350ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_UV_STREAM_H #define ARV_UV_STREAM_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS #define ARV_TYPE_UV_STREAM (arv_uv_stream_get_type ()) #define ARV_UV_STREAM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_UV_STREAM, ArvUvStream)) #define ARV_UV_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_UV_STREAM, ArvUvStreamClass)) #define ARV_IS_UV_STREAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_UV_STREAM)) #define ARV_IS_UV_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_UV_STREAM)) #define ARV_UV_STREAM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), ARV_TYPE_UV_STREAM, ArvUvStreamClass)) GType arv_uv_stream_get_type (void); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvuvstreamprivate.h000066400000000000000000000027631334570641500211430ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_UV_STREAM_PRIVATE_H #define ARV_UV_STREAM_PRIVATE_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include #include G_BEGIN_DECLS typedef struct _ArvUvStreamPrivate ArvUvStreamPrivate; typedef struct _ArvUvStreamClass ArvUvStreamClass; struct _ArvUvStream { ArvStream stream; ArvUvStreamPrivate *priv; }; struct _ArvUvStreamClass { ArvStreamClass parent_class; }; ArvStream * arv_uv_stream_new (ArvUvDevice *uv_device, ArvStreamCallback callback, void *user_data); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvversion.h.in000066400000000000000000000042571334570641500177740ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_VERSION_H #define ARV_VERSION_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS /** * ARAVIS_MAJOR_VERSION: * * The major version of the Aravis library. * * Since: 0.6.0 */ #define ARAVIS_MAJOR_VERSION @ARAVIS_MAJOR_VERSION@ /** * ARAVIS_MINOR_VERSION: * * The minor version of the Aravis library. * * Since: 0.6.0 */ #define ARAVIS_MINOR_VERSION @ARAVIS_MINOR_VERSION@ /** * ARAVIS_MICRO_VERSION: * * The micor version of the Aravis library. * * Since: 0.6.0 */ #define ARAVIS_MICRO_VERSION @ARAVIS_MICRO_VERSION@ /** * ARAVIS_CHECK_VERSION: * @major: the major version to check for * @minor: the minor version to check for * @micro: the micro version to check for * * Checks the version of the Aravis library that is being compiled * against. * * Returns: %TRUE if the version of the Aravis header files * is the same as or newer than the passed-in version. * * Since: 0.6.0 */ #define ARAVIS_CHECK_VERSION(major,minor,micro) \ (ARAVIS_MAJOR_VERSION > (major) || \ (ARAVIS_MAJOR_VERSION == (major) && ARAVIS_MINOR_VERSION > (minor)) || \ (ARAVIS_MAJOR_VERSION == (major) && ARAVIS_MINOR_VERSION == (minor) && \ ARAVIS_MICRO_VERSION >= (micro))) G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvxmlschema.c000066400000000000000000000117071334570641500176540ustar00rootroot00000000000000/* Aravis * * Copyright © 2017 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. * * Author: * Emmanuel Pacaud */ /** * SECTION: arvxmlschema * @short_description: XML Schema storage */ #include #include #include #include #include #include #include static GObjectClass *parent_class = NULL; struct _ArvXmlSchemaPrivate { char *xsd; size_t xsd_size; xmlSchemaParserCtxtPtr parser_ctxt; xmlSchemaPtr schema; xmlSchemaValidCtxtPtr valid_ctxt; }; static GQuark arv_xml_schema_error_quark (void) { static GQuark q = 0; if (q == 0) { q = g_quark_from_static_string ("vmo-xml-schema-error-quark"); } return q; } #define ARV_XML_SCHEMA_ERROR arv_xml_schema_error_quark () typedef struct { int line; int column; GError **error; } XmlSchemaError; static void _structured_error_handler (void *ctx, xmlErrorPtr error) { XmlSchemaError *schema_error = ctx; if (schema_error->error == NULL || *(schema_error->error) != NULL) return; schema_error->line = error->line; schema_error->column = error->int2; g_set_error_literal (schema_error->error, ARV_XML_SCHEMA_ERROR, ARV_XML_SCHEMA_ERROR_INVALID_STRUCTURE, error->message); } gboolean arv_xml_schema_validate (ArvXmlSchema *schema, const void *xml, size_t size, int *line, int *column, GError **error) { xmlDocPtr xml_doc; int result; static GMutex mutex; XmlSchemaError schema_error = {0, 0, error}; g_return_val_if_fail (ARV_IS_XML_SCHEMA (schema), FALSE); g_return_val_if_fail (xml != NULL && size > 0, FALSE); g_return_val_if_fail (schema->priv->valid_ctxt != NULL, FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); g_mutex_lock (&mutex); xmlSetStructuredErrorFunc (&schema_error, _structured_error_handler); xml_doc = xmlParseMemory (xml, size); if (xml_doc != NULL) { xmlSchemaSetValidStructuredErrors (schema->priv->valid_ctxt, _structured_error_handler, &schema_error); xmlSchemaSetParserStructuredErrors (schema->priv->parser_ctxt, _structured_error_handler, &schema_error); result = xmlSchemaValidateDoc (schema->priv->valid_ctxt, xml_doc) == 0; xmlFreeDoc (xml_doc); } else result = FALSE; if (line != NULL) *line = schema_error.line; if (column != NULL) *column = schema_error.column; g_mutex_unlock (&mutex); return result; } ArvXmlSchema * arv_xml_schema_new_from_file (GFile *file) { ArvXmlSchema *schema; schema = g_object_new (ARV_TYPE_XML_SCHEMA, NULL); if (G_IS_FILE (file)) g_file_load_contents (file, NULL, &schema->priv->xsd, &schema->priv->xsd_size, NULL, NULL); if (schema->priv->xsd != NULL) schema->priv->parser_ctxt = xmlSchemaNewMemParserCtxt(schema->priv->xsd, schema->priv->xsd_size); if (schema->priv->parser_ctxt != NULL) schema->priv->schema = xmlSchemaParse (schema->priv->parser_ctxt); if (schema->priv->schema != NULL) schema->priv->valid_ctxt = xmlSchemaNewValidCtxt (schema->priv->schema); else { char *uri = g_file_get_uri (file); arv_warning_dom ("[XmlSchema::new_from_file] Invalid xsd file '%s'", uri); g_free (uri); } return schema; } ArvXmlSchema * arv_xml_schema_new_from_path (const char *path) { ArvXmlSchema *schema; GFile *file; file = g_file_new_for_path (path); schema = arv_xml_schema_new_from_file (file); g_object_unref (file); return schema; } static void arv_xml_schema_init (ArvXmlSchema *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, ARV_TYPE_XML_SCHEMA, ArvXmlSchemaPrivate); } static void _finalize (GObject *object) { ArvXmlSchema *schema = ARV_XML_SCHEMA (object); g_clear_pointer (&schema->priv->valid_ctxt, xmlSchemaFreeValidCtxt); g_clear_pointer (&schema->priv->schema, xmlSchemaFree); g_clear_pointer (&schema->priv->parser_ctxt, xmlSchemaFreeParserCtxt); g_clear_pointer (&schema->priv->xsd, g_free); parent_class->finalize (object); } static void arv_xml_schema_class_init (ArvXmlSchemaClass *this_class) { GObjectClass *gobject_class = G_OBJECT_CLASS (this_class); g_type_class_add_private (this_class, sizeof (ArvXmlSchemaPrivate)); parent_class = g_type_class_peek_parent (this_class); gobject_class->finalize = _finalize; xmlLineNumbersDefault (1); } G_DEFINE_TYPE (ArvXmlSchema, arv_xml_schema, G_TYPE_OBJECT) aravis-ARAVIS_0_6_0/src/arvxmlschema.h000066400000000000000000000045121334570641500176550ustar00rootroot00000000000000/* Aravis * * Copyright © 2017 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. * * Author: * Emmanuel Pacaud */ #ifndef ARV_XML_SCHEMA_H #define ARV_XML_SCHEMA_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS typedef enum { ARV_XML_SCHEMA_ERROR_INVALID_STRUCTURE } ArvXmlSchemaError; #define ARV_TYPE_XML_SCHEMA (arv_xml_schema_get_type ()) #define ARV_XML_SCHEMA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ARV_TYPE_XML_SCHEMA, ArvXmlSchema)) #define ARV_IS_XML_SCHEMA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_XML_SCHEMA)) #define ARV_XML_SCHEMA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ARV_TYPE_XML_SCHEMA, ArvXmlSchemaClass)) #define ARV_IS_XML_SCHEMA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ARV_TYPE_XML_SCHEMA)) #define ARV_XML_SCHEMA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ARV_TYPE_XML_SCHEMA, ArvXmlSchemaClass)) typedef struct _ArvXmlSchemaPrivate ArvXmlSchemaPrivate; typedef struct _ArvXmlSchemaClass ArvXmlSchemaClass; struct _ArvXmlSchema { GObject parent_instance; ArvXmlSchemaPrivate *priv; }; struct _ArvXmlSchemaClass { GObjectClass parent_class; }; GType arv_xml_schema_get_type (void); ArvXmlSchema * arv_xml_schema_new_from_file (GFile *file); ArvXmlSchema * arv_xml_schema_new_from_path (const char *path); gboolean arv_xml_schema_validate (ArvXmlSchema *schema, const void *xml, size_t size, int *line, int *column, GError **error); G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/arvzip.c000066400000000000000000000164571334570641500165040ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2013 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud * * http://www.pkware.com/documents/casestudies/APPNOTE.TXT * * Heavily inspired by the Imposter code from Gürer Özen . * */ /** * SECTION: arvzip * @short_description: A simple zip extractor */ #include #include #include #include struct _ArvZipFile { char *name; size_t compressed_size; size_t uncompressed_size; ptrdiff_t offset; }; const char * arv_zip_file_get_name (ArvZipFile *zip_file) { g_return_val_if_fail (zip_file != NULL, NULL); return zip_file->name; } size_t arv_zip_file_get_uncompressed_size (ArvZipFile *zip_file) { g_return_val_if_fail (zip_file != NULL, 0); return zip_file->uncompressed_size; } struct _ArvZip { const unsigned char *buffer; size_t buffer_size; GSList *files; size_t header_size; ptrdiff_t directory_position; size_t directory_size; ptrdiff_t directory_offset; guint n_files; }; static void arv_zip_build_file_list (ArvZip *zip) { ArvZipFile *zip_file; const void *ptr; ptrdiff_t offset; int i; offset = zip->directory_offset; for (i = 0; i < zip->n_files; i++) { ptr = zip->buffer + zip->header_size + offset; if (ARV_GUINT32_FROM_LE_PTR (ptr, 0) != 0x02014b50) { arv_debug_misc ("[Zip::build_file_list] Magic number of central directory not found (0x02014b50)"); arv_debug_misc ("[Zip::build_file_list] Expected at 0x%08x - found 0x%08x instead", zip->header_size + offset, ARV_GUINT32_FROM_LE_PTR (ptr, 0)); return; } zip_file = g_new0 (ArvZipFile, 1); zip_file->compressed_size = ARV_GUINT32_FROM_LE_PTR (ptr, 20); zip_file->uncompressed_size = ARV_GUINT32_FROM_LE_PTR (ptr, 24); zip_file->offset = ARV_GUINT32_FROM_LE_PTR (ptr, 42); zip_file->name = g_strndup (((char *) ptr) + 46, ARV_GUINT16_FROM_LE_PTR (ptr, 28)); arv_log_misc ("[Zip::list_files] %s", zip_file->name); zip->files = g_slist_prepend (zip->files, zip_file); offset += 0x2e + ARV_GUINT16_FROM_LE_PTR (ptr, 28) + /* filename size */ ARV_GUINT16_FROM_LE_PTR (ptr, 30) + /* extra field */ ARV_GUINT16_FROM_LE_PTR (ptr, 32); /* file comment */ } } static ArvZipFile * arv_zip_find_file (ArvZip *zip, const char *name) { ArvZipFile *zip_file; GSList *iter; for (iter = zip->files; iter != NULL; iter = iter->next) { zip_file = iter->data; if (g_strcmp0 (zip_file->name, name) == 0) return zip_file; } return NULL; } static ptrdiff_t arv_zip_get_file_data (ArvZip *zip, ArvZipFile *zip_file) { const void *ptr; ptr = zip->buffer + zip_file->offset + zip->header_size; if (ARV_GUINT32_FROM_LE_PTR (ptr, 0) != 0x04034b50) { arv_debug_misc ("[Zip::get_file_data] Magic number for file header not found (0x04034b50)"); return -1; } return zip_file->offset + zip->header_size + ARV_GUINT16_FROM_LE_PTR (ptr, 26) + ARV_GUINT16_FROM_LE_PTR (ptr, 28) + 30; } /** * arv_zip_new: (skip) * @buffer: zipped data * @size: size of the zipped data * Return value: a new #ArvZip instance */ ArvZip * arv_zip_new (const void *buffer, size_t size) { ArvZip *zip; const void *ptr; int i; gboolean directory_found; g_return_val_if_fail (buffer != NULL, NULL); g_return_val_if_fail (size > 0, NULL); zip = g_new0 (ArvZip, 1); zip->buffer = buffer; zip->buffer_size = size; directory_found = FALSE; for (i = zip->buffer_size - 4; i > 0; i--) { if (zip->buffer[i] == 0x50 && zip->buffer[i+1] == 0x4b && zip->buffer[i+2] == 0x05 && zip->buffer[i+3] == 0x06) { zip->directory_position = i; directory_found = TRUE; break; } } if (!directory_found) { arv_debug_misc ("[Zip::new] Magic number for end of central directory not found (0x06054b50)"); return zip; } ptr = zip->buffer + zip->directory_position; zip->n_files = ARV_GUINT16_FROM_LE_PTR (ptr, 10); if (ARV_GUINT16_FROM_LE_PTR (ptr, 8) != zip->n_files) { arv_debug_misc ("[Zip::new] Mismatch in number of files"); zip->n_files = 0; return zip; } zip->directory_size = ARV_GUINT32_FROM_LE_PTR (ptr, 12); zip->directory_offset = ARV_GUINT32_FROM_LE_PTR (ptr, 16); zip->header_size = zip->directory_position - (zip->directory_offset + zip->directory_size); arv_log_misc ("[Zip::new] number of files = %d", zip->n_files); arv_log_misc ("[Zip::new] directory position = 0x%08x", zip->directory_position); arv_log_misc ("[Zip::new] directory size = %d", zip->directory_size); arv_log_misc ("[Zip::new] directory offset = 0x%08x", zip->directory_offset); arv_log_misc ("[Zip::new] header size = %d", zip->header_size); arv_zip_build_file_list (zip); return zip; } void arv_zip_free (ArvZip *zip) { ArvZipFile *zip_file; GSList *iter; g_return_if_fail (zip != NULL); for (iter = zip->files; iter != NULL; iter = iter->next) { zip_file = iter->data; g_free (zip_file->name); g_free (zip_file); } g_slist_free (zip->files); g_free (zip); } const GSList * arv_zip_get_file_list (ArvZip *zip) { g_return_val_if_fail (zip != NULL, NULL); return zip->files; } void * arv_zip_get_file (ArvZip *zip, const char *name, size_t *size) { ArvZipFile *zip_file; void *output_buffer; ptrdiff_t offset; if (size != NULL) *size = 0; g_return_val_if_fail (zip != NULL, NULL); g_return_val_if_fail (name != NULL, NULL); zip_file = arv_zip_find_file (zip, name); if (!zip_file) return NULL; offset = arv_zip_get_file_data (zip, zip_file); if (offset < 0) return NULL; output_buffer = g_malloc (zip_file->uncompressed_size); if (output_buffer == NULL) return NULL; if (zip_file->compressed_size < zip_file->uncompressed_size) { z_stream zs; zs.zalloc = NULL; zs.zfree = NULL; zs.opaque = NULL; zs.next_in = (void *) &zip->buffer[offset]; zs.avail_in = zip_file->compressed_size; zs.next_out = output_buffer; zs.avail_out = zip_file->uncompressed_size; inflateInit2 (&zs, -MAX_WBITS); inflate (&zs, Z_FINISH); inflateEnd (&zs); } else memcpy (output_buffer, zip->buffer + offset, zip_file->uncompressed_size); if (size != NULL) *size = zip_file->uncompressed_size; return output_buffer; } aravis-ARAVIS_0_6_0/src/arvzip.h000066400000000000000000000073211334570641500164770ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_ZIP_H #define ARV_ZIP_H #if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) #error "Only can be included directly." #endif #include G_BEGIN_DECLS ArvZip * arv_zip_new (const void *buffer, size_t size); void arv_zip_free (ArvZip *zip); void * arv_zip_get_file (ArvZip *zip, const char *name, size_t *size); const GSList * arv_zip_get_file_list (ArvZip *zip); const char * arv_zip_file_get_name (ArvZipFile *zip_file); size_t arv_zip_file_get_uncompressed_size (ArvZipFile *zip_file); #define ARV_GUINT32_FROM_LE_PTR(ptr,offset) arv_guint32_from_unaligned_le_ptr (ptr, offset) #define ARV_GUINT16_FROM_LE_PTR(ptr,offset) arv_guint16_from_unaligned_le_ptr (ptr, offset) /** * arv_guint32_from_unaligned_le_ptr: * @ptr: pointer to a little endian 32 bit usigned integer * @offset: an offset to add to @ptr * * Here's an excerpt of the ARM documentation: * * "Unaligned data access in C and C++ code * * It can be necessary to access unaligned data in memory, for example, * when porting legacy code from a CISC architecture where instructions are * available to directly access unaligned data in memory. * * On ARMv4 and ARMv5 architectures, and on the ARMv6 architecture * depending on how it is configured, care is required when accessing * unaligned data in memory, to avoid unexpected results. For example, when * a conventional pointer is used to read a word in C or C++ source code, * the ARM compiler generates assembly language code that reads the word * using an LDR instruction. This works as expected when the address is a * multiple of four, for example if it lies on a word boundary. However, if * the address is not a multiple of four, the LDR instruction returns a * rotated result rather than performing a true unaligned word load. * Generally, this rotation is not what the programmer expects. * * On ARMv6 and later architectures, unaligned access is fully supported." * * Returns: a guint32 in machine endianess */ static inline guint32 arv_guint32_from_unaligned_le_ptr (const char *ptr, gint32 offset) { guint32 val; g_return_val_if_fail (ptr != NULL, 0); ptr += offset; *((char*)(&val)) = *((char*)ptr); *(((char*)(&val))+1) = *(((char*)ptr)+1); *(((char*)(&val))+2) = *(((char*)ptr)+2); *(((char*)(&val))+3) = *(((char*)ptr)+3); return GUINT32_FROM_LE (val); } /** * arv_guint16_from_unaligned_le_ptr: * @ptr: pointer to a little endian 16 bit usigned integer * @offset: an offset to add to @ptr * * See @arv_guint32_from_unaligned_le_ptr. * * Returns: a guint16 in machine endianess */ static inline guint16 arv_guint16_from_unaligned_le_ptr (const char *ptr, gint16 offset) { guint16 val; g_return_val_if_fail (ptr != NULL, 0); ptr += offset; *((char*)(&val)) = *((char*)ptr); *(((char*)(&val))+1) = *(((char*)ptr)+1); return GUINT16_FROM_LE (val); } G_END_DECLS #endif aravis-ARAVIS_0_6_0/src/meson.build000066400000000000000000000132641334570641500171600ustar00rootroot00000000000000library_sources = [ 'arvenums.c', 'arvdebug.c', 'arvsystem.c', 'arvevaluator.c', 'arvdomnode.c', 'arvdomnodelist.c', 'arvdomnamednodemap.c', 'arvdomdocument.c', 'arvdomdocumentfragment.c', 'arvdomelement.c', 'arvdomcharacterdata.c', 'arvdomtext.c', 'arvdomparser.c', 'arvdomimplementation.c', 'arvcamera.c', 'arvgc.c', 'arvgcnode.c', 'arvgcpropertynode.c', 'arvgcindexnode.c', 'arvgcvalueindexednode.c', 'arvgcinvalidatornode.c', 'arvgcfeaturenode.c', 'arvgcregisterdescriptionnode.c', 'arvgcgroupnode.c', 'arvgccategory.c', 'arvgcboolean.c', 'arvgcenumeration.c', 'arvgcenumentry.c', 'arvgcintegernode.c', 'arvgcfloatnode.c', 'arvgcregisternode.c', 'arvgcstructentrynode.c', 'arvgccommand.c', 'arvgcswissknife.c', 'arvgcconverter.c', 'arvgcport.c', 'arvgcregister.c', 'arvgcinteger.c', 'arvgcstring.c', 'arvgcfloat.c', 'arvinterface.c', 'arvdevice.c', 'arvstream.c', 'arvbuffer.c', 'arvchunkparser.c', 'arvgvinterface.c', 'arvgvdevice.c', 'arvgvstream.c', 'arvfakeinterface.c', 'arvfakedevice.c', 'arvfakestream.c', 'arvfakecamera.c', 'arvgvfakecamera.c', 'arvrealtime.c', 'arvxmlschema.c' ] library_no_introspection_sources = [ 'arvmisc.c', 'arvzip.c', 'arvstr.c', 'arvgvcp.c', 'arvgvsp.c' ] library_headers = [ 'arv.h', 'arvtypes.h', 'arvenums.h', 'arvdebug.h', 'arvsystem.h', 'arvevaluator.h', 'arvdomnode.h', 'arvdomnodelist.h', 'arvdomnamednodemap.h', 'arvdomdocument.h', 'arvdomdocumentfragment.h', 'arvdomelement.h', 'arvdomcharacterdata.h', 'arvdomtext.h', 'arvdomparser.h', 'arvdomimplementation.h', 'arvcamera.h', 'arvgc.h', 'arvgcnode.h', 'arvgcpropertynode.h', 'arvgcindexnode.h', 'arvgcvalueindexednode.h', 'arvgcinvalidatornode.h', 'arvgcfeaturenode.h', 'arvgcregisterdescriptionnode.h', 'arvgcgroupnode.h', 'arvgccategory.h', 'arvgcboolean.h', 'arvgcenumeration.h', 'arvgcenumentry.h', 'arvgcintegernode.h', 'arvgcfloatnode.h', 'arvgcregisternode.h', 'arvgcstructentrynode.h', 'arvgccommand.h', 'arvgcswissknife.h', 'arvgcconverter.h', 'arvgcport.h', 'arvgcregister.h', 'arvgcinteger.h', 'arvgcstring.h', 'arvgcfloat.h', 'arvinterface.h', 'arvdevice.h', 'arvstream.h', 'arvbuffer.h', 'arvchunkparser.h', 'arvgvinterface.h', 'arvgvdevice.h', 'arvgvstream.h', 'arvfakeinterface.h', 'arvfakedevice.h', 'arvfakestream.h', 'arvfakecamera.h', 'arvgvfakecamera.h', 'arvrealtime.h', 'arvxmlschema.h' ] library_no_introspection_headers = [ 'arvmisc.h', 'arvzip.h', 'arvstr.h', 'arvgvcp.h', 'arvgvsp.h' ] if get_option ('usb') library_sources += [ 'arvuvinterface.c', 'arvuvdevice.c', 'arvuvstream.c' ] library_no_introspection_sources += [ 'arvuvcp.c', 'arvuvsp.c' ] library_headers += [ 'arvuvinterface.h', 'arvuvdevice.h', 'arvuvstream.h' ] library_no_introspection_headers += [ 'arvuvcp.h', 'arvuvsp.h' ] endif library_enums = gnome.mkenums_simple ('arvenumtypes', sources: library_headers + library_no_introspection_headers) library_include_dir = join_paths (get_option ('includedir'), 'aravis-@0@'.format (aravis_api_version)) library_config_data = configuration_data () library_config_data.set10 ('ARAVIS_HAS_USB', get_option ('usb')) library_config_data.set10 ('ARAVIS_HAS_PACKET_SOCKET', get_option ('packet-socket')) configure_file (input: 'arvfeatures.h.in', output: 'arvfeatures.h', configuration: library_config_data, install_dir: library_include_dir) version_config_data = configuration_data () version_config_data.set ('ARAVIS_MAJOR_VERSION', aravis_major_version) version_config_data.set ('ARAVIS_MINOR_VERSION', aravis_minor_version) version_config_data.set ('ARAVIS_MICRO_VERSION', aravis_micro_version) configure_file (input: 'arvversion.h.in', output: 'arvversion.h', configuration: version_config_data, install_dir: library_include_dir) library_inc = include_directories ('.') install_headers (library_headers, install_dir: library_include_dir) install_data ('arv-fake-camera.xml', install_dir: aravis_data_dir) library_c_args = [ '-DARAVIS_COMPILATION', '-DARAVIS_DATA_DIR="@0@"'.format (join_paths(get_option ('prefix'), aravis_data_dir)), '-DARAVIS_API_VERSION="@0@"'.format (aravis_api_version) ] aravis_library = library ('aravis-@0@'.format (aravis_api_version), library_sources, library_headers, library_no_introspection_sources, library_no_introspection_headers, library_enums, version: aravis_version, soversion: '0', dependencies: aravis_dependencies, c_args: library_c_args, include_directories: configuration_inc, install: true) aravis_library_dependencies = declare_dependency (dependencies: aravis_dependencies, link_with: aravis_library) pkg.generate (libraries: [aravis_library, libm], filebase: 'aravis-@0@'.format (aravis_api_version), version: aravis_version, subdirs: 'aravis-@0@'.format (aravis_api_version), name: 'Aravis', description: 'Camera control and image acquisition library', requires: aravis_dependency_str, requires_private: aravis_private_dependency_str) progs = [[ 'arv-tool', 'arvtool.c'], [ 'arv-test', 'arvtest.c'], [ 'arv-fake-gv-camera', 'arvfakegvcamera.c']] foreach p: progs executable ((p[0] + '-@0@').format (aravis_api_version), p[1], link_with: aravis_library, c_args: library_c_args, dependencies: aravis_dependencies, install: true) endforeach if get_option ('introspection') gnome.generate_gir(aravis_library, sources : [library_sources, library_headers, library_enums], nsversion : aravis_api_version, namespace : 'Aravis', symbol_prefix : 'arv_', identifier_prefix : 'Arv', export_packages : 'aravis', includes : ['GObject-2.0', 'Gio-2.0'], extra_args: '-DARAVIS_COMPILATION', install : true ) endif aravis-ARAVIS_0_6_0/tests/000077500000000000000000000000001334570641500153635ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/tests/.gitignore000066400000000000000000000004531334570641500173550ustar00rootroot00000000000000evaluator genicam buffer misc fake fakegv cpp arv-device-test arv-genicam-test arv-evaluator-test arv-zip-test arv-camera-test arv-chunk-parser-test arv-heartbeat-test arv-acquisition-test arv-auto-packet-size-test arv-example time-test realtime-test load-http-test *.log *.trs *-coverage* vgcore.* aravis-ARAVIS_0_6_0/tests/Makefile.am000066400000000000000000000060241334570641500174210ustar00rootroot00000000000000include $(top_srcdir)/Makefile.decl AM_CPPFLAGS = -g -I$(top_srcdir)/src/ $(ARAVIS_CFLAGS) AM_CFLAGS = -Wall test_progs_ldadd = \ $(top_builddir)/src/libaravis-@ARAVIS_API_VERSION@.la \ $(ARAVIS_LIBS) noinst_PROGRAMS = \ arv-device-test \ arv-genicam-test \ arv-evaluator-test \ arv-zip-test \ arv-camera-test \ arv-chunk-parser-test \ arv-heartbeat-test \ arv-acquisition-test \ arv-example \ arv-auto-packet-size-test \ arv-device-scan-test \ time-test \ realtime-test \ load-http-test arv_device_test_SOURCES = arvdevicetest.c arv_device_test_LDADD = $(test_progs_ldadd) arv_genicam_test_SOURCES = arvgenicamtest.c arv_genicam_test_LDADD = $(test_progs_ldadd) arv_evaluator_test_SOURCES = arvevaluatortest.c arv_evaluator_test_LDADD = $(test_progs_ldadd) arv_zip_test_SOURCES = arvziptest.c arv_zip_test_LDADD = $(test_progs_ldadd) arv_camera_test_SOURCES = arvcameratest.c arv_camera_test_LDADD = $(test_progs_ldadd) arv_chunk_parser_test_SOURCES = arvchunkparsertest.c arv_chunk_parser_test_LDADD = $(test_progs_ldadd) arv_heartbeat_test_SOURCES = arvheartbeattest.c arv_heartbeat_test_LDADD = $(test_progs_ldadd) arv_acquisition_test_SOURCES = arvacquisitiontest.c arv_acquisition_test_LDADD = $(test_progs_ldadd) arv_auto_packet_size_test_SOURCES = arvautopacketsizetest.c arv_auto_packet_size_test_LDADD = $(test_progs_ldadd) arv_device_scan_test_SOURCES = arvdevicescantest.c arv_device_scan_test_LDADD = $(test_progs_ldadd) arv_example_SOURCES = arvexample.c arv_example_LDADD = $(test_progs_ldadd) time_test_SOURCES = timetest.c time_test_LDADD = $(test_progs_ldadd) realtime_test_SOURCES = realtimetest.c realtime_test_LDADD = $(test_progs_ldadd) load_http_test_SOURCES = loadhttptest.c load_http_test_LDADD = $(test_progs_ldadd) TESTS = evaluator buffer misc genicam fake fakegv if ARAVIS_BUILD_CPP_TEST TESTS += cpp endif @VALGRIND_CHECK_RULES@ VALGRIND_SUPPRESSIONS_FILES = aravis.supp EXTRA_DIST = aravis.supp check_PROGRAMS = $(TESTS) @CODE_COVERAGE_RULES@ evaluator_SOURCES = evaluator.c evaluator_CFLAGS = $(CODE_COVERAGE_CFLAGS) evaluator_LDADD = $(test_progs_ldadd) $(CODE_COVERAGE_LIBS) buffer_SOURCES = buffer.c buffer_CFLAGS = $(CODE_COVERAGE_CFLAGS) buffer_LDADD = $(test_progs_ldadd) $(CODE_COVERAGE_LIBS) misc_SOURCES = misc.c misc_CFLAGS = $(CODE_COVERAGE_CFLAGS) misc_LDADD = $(test_progs_ldadd) $(CODE_COVERAGE_LIBS) fake_SOURCES = fake.c fake_CFLAGS = -DGENICAM_FILENAME="\"$(top_srcdir)/src/arv-fake-camera.xml\"" $(CODE_COVERAGE_CFLAGS) fake_LDADD = $(test_progs_ldadd) $(CODE_COVERAGE_LIBS) fakegv_SOURCES = fakegv.c fakegv_CFLAGS = -DGENICAM_FILENAME="\"$(top_srcdir)/src/arv-fake-camera.xml\"" $(CODE_COVERAGE_CFLAGS) fakegv_LDADD = $(test_progs_ldadd) $(CODE_COVERAGE_LIBS) genicam_SOURCES = genicam.c genicam_CFLAGS = -DGENICAM_FILENAME="\"$(top_srcdir)/tests/data/genicam.xml\"" $(CODE_COVERAGE_CFLAGS) genicam_LDADD = $(test_progs_ldadd) $(CODE_COVERAGE_LIBS) cpp_SOURCES = cpp.cc cpp_LDADD = $(test_progs_ldadd) EXTRA_DIST += data/genicam.xml aravis-ARAVIS_0_6_0/tests/aravis.supp000066400000000000000000000023511334570641500175620ustar00rootroot00000000000000# # glib # { glib initialisation Memcheck:Leak fun:calloc fun:g_malloc0 ... fun:_dl_init } { g_type_register_fundamental_realloc Memcheck:Leak fun:malloc fun:realloc fun:g_realloc ... fun:g_type_register_fundamental ... fun:_dl_init } { g_type_register_static Memcheck:Leak fun:realloc fun:g_realloc ... fun:g_type_register_static ... fun:_dl_init } { g_type_register_static_app_malloc Memcheck:Leak fun:malloc fun:realloc fun:g_realloc ... fun:g_type_register_static fun:g_type_register_static_simple } { g_type_register_static_app Memcheck:Leak fun:realloc fun:g_realloc ... fun:g_type_register_static fun:g_type_register_static_simple } { g_enum_register_static_app Memcheck:Leak fun:realloc fun:g_realloc ... fun:g_type_register_static fun:g_enum_register_static } { g_type_add_interface_static_app Memcheck:Leak fun:malloc fun:g_malloc fun:g_slice_alloc ... fun:g_type_add_interface_static } { g_type_class_ref Memcheck:Leak fun:calloc fun:g_malloc0 fun:g_type_class_ref fun:g_type_class_ref } { g_type_class_ref_Wm Memcheck:Leak fun:calloc fun:g_malloc0 fun:type_class_init_Wm fun:g_type_class_ref fun:g_type_class_ref } aravis-ARAVIS_0_6_0/tests/arvacquisitiontest.c000066400000000000000000000006721334570641500214750ustar00rootroot00000000000000#include #include #include int main (int argc, char **argv) { ArvCamera *camera; ArvBuffer *buffer; camera = arv_camera_new (argc > 1 ? argv[1] : NULL); buffer = arv_camera_acquisition (camera, 0); if (ARV_IS_BUFFER (buffer)) printf ("Image successfully acquired\n"); else printf ("Failed to acquire a single image\n"); g_clear_object (&camera); g_clear_object (&buffer); return EXIT_SUCCESS; } aravis-ARAVIS_0_6_0/tests/arvautopacketsizetest.c000066400000000000000000000013201334570641500221670ustar00rootroot00000000000000#include #include #include int main (int argc, char **argv) { ArvCamera *camera; camera = arv_camera_new (argc > 1 ? argv[1] : NULL); if (!ARV_IS_CAMERA (camera)) { printf ("Camera not found\n"); return EXIT_FAILURE; } if (arv_camera_is_gv_device (camera)) { unsigned packet_size; packet_size = arv_camera_gv_auto_packet_size (camera); printf ("Packet size set to %d bytes on camera %s-%s\n", packet_size, arv_camera_get_vendor_name (camera), arv_camera_get_device_id (camera)); } else { printf ("%s-%s is not a GigEVision camera\n", arv_camera_get_vendor_name (camera), arv_camera_get_device_id (camera)); } g_clear_object (&camera); return EXIT_SUCCESS; } aravis-ARAVIS_0_6_0/tests/arvcameratest.c000066400000000000000000000310761334570641500203770ustar00rootroot00000000000000#include #include #include #include static char *arv_option_camera_name = NULL; static char *arv_option_debug_domains = NULL; static gboolean arv_option_snaphot = FALSE; static char *arv_option_trigger = NULL; static double arv_option_software_trigger = -1; static double arv_option_frequency = -1.0; static int arv_option_width = -1; static int arv_option_height = -1; static int arv_option_horizontal_binning = -1; static int arv_option_vertical_binning = -1; static double arv_option_exposure_time_us = -1; static int arv_option_gain = -1; static gboolean arv_option_auto_socket_buffer = FALSE; static gboolean arv_option_no_packet_resend = FALSE; static double arv_option_packet_request_ratio = -1.0; static unsigned int arv_option_packet_timeout = 20; static unsigned int arv_option_frame_retention = 100; static int arv_option_gv_stream_channel = -1; static int arv_option_gv_packet_delay = -1; static int arv_option_gv_packet_size = -1; static gboolean arv_option_realtime = FALSE; static gboolean arv_option_high_priority = FALSE; static gboolean arv_option_no_packet_socket = FALSE; static char *arv_option_chunks = NULL; static unsigned int arv_option_bandwidth_limit = -1; static const GOptionEntry arv_option_entries[] = { { "name", 'n', 0, G_OPTION_ARG_STRING, &arv_option_camera_name, "Camera name", NULL }, { "snapshot", 's', 0, G_OPTION_ARG_NONE, &arv_option_snaphot, "Snapshot", NULL }, { "frequency", 'f', 0, G_OPTION_ARG_DOUBLE, &arv_option_frequency, "Acquisition frequency", NULL }, { "trigger", 't', 0, G_OPTION_ARG_STRING, &arv_option_trigger, "External trigger", NULL }, { "software-trigger", 'o', 0, G_OPTION_ARG_DOUBLE, &arv_option_software_trigger, "Emit software trigger", NULL }, { "width", 'w', 0, G_OPTION_ARG_INT, &arv_option_width, "Width", NULL }, { "height", 'h', 0, G_OPTION_ARG_INT, &arv_option_height, "Height", NULL }, { "h-binning", '\0', 0, G_OPTION_ARG_INT, &arv_option_horizontal_binning, "Horizontal binning", NULL }, { "v-binning", '\0', 0, G_OPTION_ARG_INT, &arv_option_vertical_binning, "Vertical binning", NULL }, { "exposure", 'e', 0, G_OPTION_ARG_DOUBLE, &arv_option_exposure_time_us, "Exposure time (µs)", NULL }, { "gain", 'g', 0, G_OPTION_ARG_INT, &arv_option_gain, "Gain (dB)", NULL }, { "auto", 'a', 0, G_OPTION_ARG_NONE, &arv_option_auto_socket_buffer, "Auto socket buffer size", NULL }, { "no-packet-resend", 'r', 0, G_OPTION_ARG_NONE, &arv_option_no_packet_resend, "No packet resend", NULL }, { "packet-request-ratio", 'q', 0, G_OPTION_ARG_DOUBLE, &arv_option_packet_request_ratio, "Packet resend request limit as a frame packet number ratio [0..2.0]", NULL }, { "packet-timeout", 'p', 0, G_OPTION_ARG_INT, &arv_option_packet_timeout, "Packet timeout (ms)", NULL }, { "frame-retention", 'm', 0, G_OPTION_ARG_INT, &arv_option_frame_retention, "Frame retention (ms)", NULL }, { "gv-stream-channel", 'c', 0, G_OPTION_ARG_INT, &arv_option_gv_stream_channel, "GigEVision stream channel id", NULL }, { "gv-packet-delay", 'y', 0, G_OPTION_ARG_INT, &arv_option_gv_packet_delay, "GigEVision packet delay (ns)", NULL }, { "gv-packet-size", 'i', 0, G_OPTION_ARG_INT, &arv_option_gv_packet_size, "GigEVision packet size (bytes)", NULL }, { "chunks", 'u', 0, G_OPTION_ARG_STRING, &arv_option_chunks, "Chunks", NULL }, { "realtime", '\0', 0, G_OPTION_ARG_NONE, &arv_option_realtime, "Make stream thread realtime", NULL }, { "high-priority", '\0', 0, G_OPTION_ARG_NONE, &arv_option_high_priority, "Make stream thread high priority", NULL }, { "no-packet-socket", '\0', 0, G_OPTION_ARG_NONE, &arv_option_no_packet_socket, "Disable use of packet socket", NULL }, { "debug", 'd', 0, G_OPTION_ARG_STRING, &arv_option_debug_domains, "Debug domains", NULL }, { "bandwidth-limit", 'b', 0, G_OPTION_ARG_INT, &arv_option_bandwidth_limit, "Desired USB3 Vision device bandwidth limit", NULL }, { NULL } }; typedef struct { GMainLoop *main_loop; int buffer_count; ArvChunkParser *chunk_parser; char **chunks; } ApplicationData; static gboolean cancel = FALSE; static void set_cancel (int signal) { cancel = TRUE; } static void new_buffer_cb (ArvStream *stream, ApplicationData *data) { ArvBuffer *buffer; buffer = arv_stream_try_pop_buffer (stream); if (buffer != NULL) { if (arv_buffer_get_status (buffer) == ARV_BUFFER_STATUS_SUCCESS) data->buffer_count++; if ((arv_buffer_get_payload_type (buffer) == ARV_BUFFER_PAYLOAD_TYPE_CHUNK_DATA || arv_buffer_get_payload_type (buffer) == ARV_BUFFER_PAYLOAD_TYPE_EXTENDED_CHUNK_DATA) && data->chunks != NULL) { int i; for (i = 0; data->chunks[i] != NULL; i++) printf ("%s = %" G_GINT64_FORMAT "\n", data->chunks[i], arv_chunk_parser_get_integer_value (data->chunk_parser, buffer, data->chunks[i])); } /* Image processing here */ arv_stream_push_buffer (stream, buffer); } } static void stream_cb (void *user_data, ArvStreamCallbackType type, ArvBuffer *buffer) { if (type == ARV_STREAM_CALLBACK_TYPE_INIT) { if (arv_option_realtime) { if (!arv_make_thread_realtime (10)) printf ("Failed to make stream thread realtime\n"); } else if (arv_option_high_priority) { if (!arv_make_thread_high_priority (-10)) printf ("Failed to make stream thread high priority\n"); } } } static gboolean periodic_task_cb (void *abstract_data) { ApplicationData *data = abstract_data; printf ("Frame rate = %d Hz\n", data->buffer_count); data->buffer_count = 0; if (cancel) { g_main_loop_quit (data->main_loop); return FALSE; } return TRUE; } static gboolean emit_software_trigger (void *abstract_data) { ArvCamera *camera = abstract_data; arv_camera_software_trigger (camera); return TRUE; } static void control_lost_cb (ArvGvDevice *gv_device) { printf ("Control lost\n"); cancel = TRUE; } int main (int argc, char **argv) { ApplicationData data; ArvCamera *camera; ArvStream *stream; GOptionContext *context; GError *error = NULL; int i; data.buffer_count = 0; data.chunks = NULL; data.chunk_parser = NULL; context = g_option_context_new (NULL); g_option_context_add_main_entries (context, arv_option_entries, NULL); if (!g_option_context_parse (context, &argc, &argv, &error)) { g_option_context_free (context); g_print ("Option parsing failed: %s\n", error->message); g_error_free (error); return EXIT_FAILURE; } g_option_context_free (context); arv_debug_enable (arv_option_debug_domains); if (arv_option_camera_name == NULL) g_print ("Looking for the first available camera\n"); else g_print ("Looking for camera '%s'\n", arv_option_camera_name); camera = arv_camera_new (arv_option_camera_name); if (camera != NULL) { void (*old_sigint_handler)(int); gint payload; gint x, y, width, height; gint dx, dy; double exposure; guint64 n_completed_buffers; guint64 n_failures; guint64 n_underruns; int gain; guint software_trigger_source = 0; if (arv_option_chunks != NULL) { char *striped_chunks; striped_chunks = g_strdup (arv_option_chunks); arv_str_strip (striped_chunks, " ,:;", ','); data.chunks = g_strsplit_set (striped_chunks, ",", -1); g_free (striped_chunks); data.chunk_parser = arv_camera_create_chunk_parser (camera); for (i = 0; data.chunks[i] != NULL; i++) { char *chunk = g_strdup_printf ("Chunk%s", data.chunks[i]); g_free (data.chunks[i]); data.chunks[i] = chunk; } } arv_camera_set_chunks (camera, arv_option_chunks); arv_camera_set_region (camera, 0, 0, arv_option_width, arv_option_height); arv_camera_set_binning (camera, arv_option_horizontal_binning, arv_option_vertical_binning); arv_camera_set_exposure_time (camera, arv_option_exposure_time_us); arv_camera_set_gain (camera, arv_option_gain); if (arv_camera_is_uv_device(camera)) { arv_camera_uv_set_bandwidth (camera, arv_option_bandwidth_limit); } if (arv_camera_is_gv_device (camera)) { arv_camera_gv_select_stream_channel (camera, arv_option_gv_stream_channel); arv_camera_gv_set_packet_delay (camera, arv_option_gv_packet_delay); arv_camera_gv_set_packet_size (camera, arv_option_gv_packet_size); arv_camera_gv_set_stream_options (camera, arv_option_no_packet_socket ? ARV_GV_STREAM_OPTION_PACKET_SOCKET_DISABLED : ARV_GV_STREAM_OPTION_NONE); } arv_camera_get_region (camera, &x, &y, &width, &height); arv_camera_get_binning (camera, &dx, &dy); exposure = arv_camera_get_exposure_time (camera); payload = arv_camera_get_payload (camera); gain = arv_camera_get_gain (camera); printf ("vendor name = %s\n", arv_camera_get_vendor_name (camera)); printf ("model name = %s\n", arv_camera_get_model_name (camera)); printf ("device id = %s\n", arv_camera_get_device_id (camera)); printf ("image width = %d\n", width); printf ("image height = %d\n", height); printf ("horizontal binning = %d\n", dx); printf ("vertical binning = %d\n", dy); printf ("payload = %d bytes\n", payload); printf ("exposure = %g µs\n", exposure); printf ("gain = %d dB\n", gain); if (arv_camera_is_gv_device (camera)) { printf ("gv n_stream channels = %d\n", arv_camera_gv_get_n_stream_channels (camera)); printf ("gv current channel = %d\n", arv_camera_gv_get_current_stream_channel (camera)); printf ("gv packet delay = %" G_GINT64_FORMAT " ns\n", arv_camera_gv_get_packet_delay (camera)); printf ("gv packet size = %d bytes\n", arv_camera_gv_get_packet_size (camera)); } if (arv_camera_is_uv_device (camera)) { guint min,max; arv_camera_uv_get_bandwidth_bounds (camera, &min, &max); printf ("uv bandwidth limit = %d [%d..%d]\n", arv_camera_uv_get_bandwidth (camera), min, max); } stream = arv_camera_create_stream (camera, stream_cb, NULL); if (stream != NULL) { if (ARV_IS_GV_STREAM (stream)) { if (arv_option_auto_socket_buffer) g_object_set (stream, "socket-buffer", ARV_GV_STREAM_SOCKET_BUFFER_AUTO, "socket-buffer-size", 0, NULL); if (arv_option_no_packet_resend) g_object_set (stream, "packet-resend", ARV_GV_STREAM_PACKET_RESEND_NEVER, NULL); if (arv_option_packet_request_ratio >= 0.0) g_object_set (stream, "packet-request-ratio", arv_option_packet_request_ratio, NULL); g_object_set (stream, "packet-timeout", (unsigned) arv_option_packet_timeout * 1000, "frame-retention", (unsigned) arv_option_frame_retention * 1000, NULL); } for (i = 0; i < 50; i++) arv_stream_push_buffer (stream, arv_buffer_new (payload, NULL)); arv_camera_set_acquisition_mode (camera, ARV_ACQUISITION_MODE_CONTINUOUS); if (arv_option_frequency > 0.0) arv_camera_set_frame_rate (camera, arv_option_frequency); if (arv_option_trigger != NULL) arv_camera_set_trigger (camera, arv_option_trigger); if (arv_option_software_trigger > 0.0) { arv_camera_set_trigger (camera, "Software"); software_trigger_source = g_timeout_add ((double) (0.5 + 1000.0 / arv_option_software_trigger), emit_software_trigger, camera); } arv_camera_start_acquisition (camera); g_signal_connect (stream, "new-buffer", G_CALLBACK (new_buffer_cb), &data); arv_stream_set_emit_signals (stream, TRUE); g_signal_connect (arv_camera_get_device (camera), "control-lost", G_CALLBACK (control_lost_cb), NULL); g_timeout_add_seconds (1, periodic_task_cb, &data); data.main_loop = g_main_loop_new (NULL, FALSE); old_sigint_handler = signal (SIGINT, set_cancel); g_main_loop_run (data.main_loop); if (software_trigger_source > 0) g_source_remove (software_trigger_source); signal (SIGINT, old_sigint_handler); g_main_loop_unref (data.main_loop); arv_stream_get_statistics (stream, &n_completed_buffers, &n_failures, &n_underruns); printf ("Completed buffers = %Lu\n", (unsigned long long) n_completed_buffers); printf ("Failures = %Lu\n", (unsigned long long) n_failures); printf ("Underruns = %Lu\n", (unsigned long long) n_underruns); arv_camera_stop_acquisition (camera); arv_stream_set_emit_signals (stream, FALSE); g_object_unref (stream); } else printf ("Can't create stream thread (check if the device is not already used)\n"); g_object_unref (camera); } else printf ("No camera found\n"); if (data.chunks != NULL) g_strfreev (data.chunks); g_clear_object (&data.chunk_parser); return 0; } aravis-ARAVIS_0_6_0/tests/arvchunkparsertest.c000066400000000000000000000027501334570641500214710ustar00rootroot00000000000000#include #include int main (int argc, char **argv) { ArvCamera *camera; ArvStream *stream; ArvChunkParser *parser; /* Instantiation of the first available camera */ camera = arv_camera_new (NULL); if (camera != NULL) { gint payload; /* Instantiation of a chunk parser */ parser = arv_camera_create_chunk_parser (camera); /* Enable chunk data */ arv_camera_set_chunks (camera, "Width,Height"); /* retrieve image payload (number of bytes per image) */ payload = arv_camera_get_payload (camera); /* Create a new stream object */ stream = arv_camera_create_stream (camera, NULL, NULL); if (stream != NULL) { ArvBuffer *buffer; /* Push 1 buffer in the stream input buffer queue */ arv_stream_push_buffer (stream, arv_buffer_new (payload, NULL)); /* Start the video stream */ arv_camera_start_acquisition (camera); /* Retrieve the acquired buffer */ buffer = arv_stream_pop_buffer (stream); printf ("ChunkWidth = %d\n", (int) arv_chunk_parser_get_integer_value (parser, buffer, "ChunkWidth")); printf ("ChunkHeight = %d\n", (int) arv_chunk_parser_get_integer_value (parser, buffer, "ChunkHeight")); g_object_unref (buffer); /* Stop the video stream */ arv_camera_stop_acquisition (camera); g_object_unref (stream); } else printf ("Can't create stream thread (check if the device is not already used)\n"); g_object_unref (parser); g_object_unref (camera); } else printf ("No camera found\n"); return 0; } aravis-ARAVIS_0_6_0/tests/arvdevicescantest.c000066400000000000000000000016131334570641500212450ustar00rootroot00000000000000#include #include gboolean cancel = FALSE; static void set_cancel(int signal) { cancel = TRUE; } static gboolean periodic_task_cb (void *user_data) { GMainLoop *main_loop = user_data; guint n_devices; int i; if (cancel) { g_main_loop_quit(main_loop); return FALSE; } printf ("Update Device List\n"); arv_update_device_list(); n_devices = arv_get_n_devices(); printf ("Number of found Devices: %d\n", n_devices); for (i = 0; i < n_devices; i++) printf ("%s\n", arv_get_device_id (i)); return TRUE; } int main(int argc, char** argv) { GMainLoop *main_loop; void *sigint_handler; sigint_handler = signal(SIGINT, set_cancel); main_loop = g_main_loop_new (NULL, FALSE); g_timeout_add_seconds (10, periodic_task_cb, main_loop); g_main_loop_run (main_loop); signal(SIGINT, sigint_handler); g_main_loop_unref (main_loop); arv_shutdown(); return 0; } aravis-ARAVIS_0_6_0/tests/arvdevicetest.c000066400000000000000000000221051334570641500203770ustar00rootroot00000000000000#include #include #include #include "../src/arvgvsp.h" #include "../src/arvgvcp.h" static gboolean cancel = FALSE; static void set_cancel (int signal) { cancel = TRUE; } static char *arv_option_camera_name = NULL; static char *arv_option_debug_domains = NULL; static gboolean arv_option_auto_buffer = FALSE; static int arv_option_width = -1; static int arv_option_height = -1; static int arv_option_horizontal_binning = -1; static int arv_option_vertical_binning = -1; static const GOptionEntry arv_option_entries[] = { { "name", 'n', 0, G_OPTION_ARG_STRING, &arv_option_camera_name,"Camera name", NULL}, { "auto", 'a', 0, G_OPTION_ARG_NONE, &arv_option_auto_buffer, "AutoBufferSize", NULL}, { "width", 'w', 0, G_OPTION_ARG_INT, &arv_option_width, "Width", NULL }, { "height", 'h', 0, G_OPTION_ARG_INT, &arv_option_height, "Height", NULL }, { "h-binning", '\0', 0, G_OPTION_ARG_INT, &arv_option_horizontal_binning,"Horizontal binning", NULL }, { "v-binning", '\0', 0, G_OPTION_ARG_INT, &arv_option_vertical_binning, "Vertical binning", NULL }, { "debug", 'd', 0, G_OPTION_ARG_STRING, &arv_option_debug_domains, "Debug mode", NULL }, { NULL } }; typedef enum { ARV_CAMERA_TYPE_BASLER, ARV_CAMERA_TYPE_PROSILICA } ArvCameraType; int main (int argc, char **argv) { ArvDevice *device; ArvStream *stream; ArvBuffer *buffer; GOptionContext *context; GError *error = NULL; char memory_buffer[100000]; int i; unsigned buffer_count = 0; guint64 start_time, time; context = g_option_context_new (NULL); g_option_context_add_main_entries (context, arv_option_entries, NULL); if (!g_option_context_parse (context, &argc, &argv, &error)) { g_option_context_free (context); g_print ("Option parsing failed: %s\n", error->message); g_error_free (error); return EXIT_FAILURE; } g_option_context_free (context); arv_debug_enable (arv_option_debug_domains); if (arv_option_camera_name == NULL) g_print ("Looking for the first available camera\n"); else g_print ("Looking for camera '%s'\n", arv_option_camera_name); device = arv_open_device (arv_option_camera_name); if (device != NULL) { ArvGc *genicam; ArvGcNode *node; guint32 value; guint32 maximum; guint32 minimum; guint64 n_processed_buffers; guint64 n_failures; guint64 n_underruns; double v_double; double v_double_min; double v_double_max; const char *v_string; gboolean v_boolean; genicam = arv_device_get_genicam (device); if (arv_option_width > 0) { node = arv_gc_get_node (genicam, "Width"); arv_gc_integer_set_value (ARV_GC_INTEGER (node), arv_option_width, NULL); } if (arv_option_height > 0) { node = arv_gc_get_node (genicam, "Height"); arv_gc_integer_set_value (ARV_GC_INTEGER (node), arv_option_height, NULL); } if (arv_option_horizontal_binning > 0) { node = arv_gc_get_node (genicam, "BinningHorizontal"); arv_gc_integer_set_value (ARV_GC_INTEGER (node), arv_option_horizontal_binning, NULL); } if (arv_option_vertical_binning > 0) { node = arv_gc_get_node (genicam, "BinningVertical"); arv_gc_integer_set_value (ARV_GC_INTEGER (node), arv_option_vertical_binning, NULL); } node = arv_gc_get_node (genicam, "DeviceVendorName"); v_string = arv_gc_string_get_value (ARV_GC_STRING (node), NULL); g_print ("vendor = %s\n", v_string); node = arv_gc_get_node (genicam, "DeviceModelName"); v_string = arv_gc_string_get_value (ARV_GC_STRING (node), NULL); g_print ("model = %s\n", v_string); node = arv_gc_get_node (genicam, "DeviceID"); v_string = arv_gc_string_get_value (ARV_GC_STRING (node), NULL); g_print ("device id = %s\n", v_string); node = arv_gc_get_node (genicam, "SensorWidth"); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_print ("sensor width = %d\n", value); node = arv_gc_get_node (genicam, "SensorHeight"); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_print ("sensor height = %d\n", value); node = arv_gc_get_node (genicam, "Width"); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); maximum = arv_gc_integer_get_max (ARV_GC_INTEGER (node), NULL); g_print ("image width = %d (max:%d)\n", value, maximum); node = arv_gc_get_node (genicam, "Height"); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); maximum = arv_gc_integer_get_max (ARV_GC_INTEGER (node), NULL); g_print ("image height = %d (max:%d)\n", value, maximum); node = arv_gc_get_node (genicam, "BinningHorizontal"); if (ARV_IS_GC_NODE (node)) { value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); maximum = arv_gc_integer_get_max (ARV_GC_INTEGER (node), NULL); minimum = arv_gc_integer_get_min (ARV_GC_INTEGER (node), NULL); g_print ("horizontal binning = %d (min:%d - max:%d)\n", value, minimum, maximum); } node = arv_gc_get_node (genicam, "BinningVertical"); if (ARV_IS_GC_NODE (node)) { value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); maximum = arv_gc_integer_get_max (ARV_GC_INTEGER (node), NULL); minimum = arv_gc_integer_get_min (ARV_GC_INTEGER (node), NULL); g_print ("vertical binning = %d (min:%d - max:%d)\n", value, minimum, maximum); } node = arv_gc_get_node (genicam, "ExposureTimeAbs"); if (ARV_IS_GC_NODE (node)) { v_double = arv_gc_float_get_value (ARV_GC_FLOAT (node), NULL); v_double_min = arv_gc_float_get_min (ARV_GC_FLOAT (node), NULL); v_double_max = arv_gc_float_get_max (ARV_GC_FLOAT (node), NULL); g_print ("exposure = %g (min:%g - max:%g)\n", v_double, v_double_min, v_double_max); } node = arv_gc_get_node (genicam, "ExposureAuto"); if (ARV_IS_GC_NODE (node)) { v_string = arv_gc_enumeration_get_string_value (ARV_GC_ENUMERATION (node), NULL); g_print ("exposure auto mode = %s\n", v_string); } node = arv_gc_get_node (genicam, "GainRaw"); if (ARV_IS_GC_NODE (node)) { value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); maximum = arv_gc_integer_get_max (ARV_GC_INTEGER (node), NULL); minimum = arv_gc_integer_get_min (ARV_GC_INTEGER (node), NULL); g_print ("gain = %d (min:%d - max:%d)\n", value, minimum, maximum); } node = arv_gc_get_node (genicam, "GainAuto"); if (ARV_IS_GC_NODE (node)) { v_string = arv_gc_enumeration_get_string_value (ARV_GC_ENUMERATION (node), NULL); g_print ("gain auto mode = %s\n", v_string); } node = arv_gc_get_node (genicam, "TriggerSelector"); if (ARV_IS_GC_NODE (node)) { v_string = arv_gc_enumeration_get_string_value (ARV_GC_ENUMERATION (node), NULL); g_print ("trigger selector = %s\n", v_string); } node = arv_gc_get_node (genicam, "ReverseX"); if (ARV_IS_GC_NODE (node)) { v_boolean = arv_gc_boolean_get_value (ARV_GC_BOOLEAN (node), NULL); g_print ("reverse x = %s\n", v_boolean ? "TRUE" : "FALSE"); } stream = arv_device_create_stream (device, NULL, NULL); if (arv_option_auto_buffer) g_object_set (stream, "socket-buffer", ARV_GV_STREAM_SOCKET_BUFFER_AUTO, "socket-buffer-size", 0, NULL); node = arv_gc_get_node (genicam, "PayloadSize"); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_print ("payload size = %d (0x%x)\n", value, value); for (i = 0; i < 30; i++) arv_stream_push_buffer (stream, arv_buffer_new (value, NULL)); if (ARV_IS_GV_DEVICE (device)) { arv_device_read_register (device, ARV_GVBS_STREAM_CHANNEL_0_PORT_OFFSET, &value, NULL); g_print ("stream port = %d (%d)\n", value, arv_gv_stream_get_port (ARV_GV_STREAM (stream))); } arv_device_read_memory (device, 0x00014150, 8, memory_buffer, NULL); arv_device_read_memory (device, 0x000000e8, 16, memory_buffer, NULL); arv_device_read_memory (device, ARV_GVBS_USER_DEFINED_NAME_OFFSET, ARV_GVBS_USER_DEFINED_NAME_SIZE, memory_buffer, NULL); node = arv_gc_get_node (genicam, "AcquisitionStart"); arv_gc_command_execute (ARV_GC_COMMAND (node), NULL); signal (SIGINT, set_cancel); start_time = g_get_real_time (); do { g_usleep (100000); do { buffer = arv_stream_try_pop_buffer (stream); if (buffer != NULL) { arv_stream_push_buffer (stream, buffer); buffer_count++; } } while (buffer != NULL); time = g_get_real_time (); if (time - start_time > 1000000) { printf ("Frame rate = %d Hz\n", buffer_count); buffer_count = 0; start_time = time; } } while (!cancel); if (ARV_IS_GV_DEVICE (device)) { arv_device_read_register (device, ARV_GVBS_STREAM_CHANNEL_0_PORT_OFFSET, &value, NULL); g_print ("stream port = %d (%d)\n", value, arv_gv_stream_get_port (ARV_GV_STREAM (stream))); } arv_stream_get_statistics (stream, &n_processed_buffers, &n_failures, &n_underruns); g_print ("Processed buffers = %Lu\n", (unsigned long long) n_processed_buffers); g_print ("Failures = %Lu\n", (unsigned long long) n_failures); g_print ("Underruns = %Lu\n", (unsigned long long) n_underruns); node = arv_gc_get_node (genicam, "AcquisitionStop"); arv_gc_command_execute (ARV_GC_COMMAND (node), NULL); g_object_unref (stream); g_object_unref (device); } else g_print ("No device found\n"); return 0; } aravis-ARAVIS_0_6_0/tests/arvevaluatortest.c000066400000000000000000000031761334570641500211510ustar00rootroot00000000000000#include #include static char **arv_option_expressions = NULL; static char *arv_option_debug_domains = NULL; static const GOptionEntry arv_option_entries[] = { { G_OPTION_REMAINING, ' ', 0, G_OPTION_ARG_STRING_ARRAY, &arv_option_expressions, NULL, NULL}, { "debug", 'd', 0, G_OPTION_ARG_STRING, &arv_option_debug_domains, "Debug mode", NULL }, { NULL } }; int main (int argc, char **argv) { ArvEvaluator *evaluator; GOptionContext *context; GError *error = NULL; int i; double value; context = g_option_context_new (NULL); g_option_context_add_main_entries (context, arv_option_entries, NULL); if (!g_option_context_parse (context, &argc, &argv, &error)) { g_option_context_free (context); g_print ("Option parsing failed: %s\n", error->message); g_error_free (error); return EXIT_FAILURE; } g_option_context_free (context); arv_debug_enable (arv_option_debug_domains); evaluator = arv_evaluator_new (NULL); arv_evaluator_set_double_variable (evaluator, "TDBL", 124.2); arv_evaluator_set_int64_variable (evaluator, "TINT", 3200); if (arv_option_expressions == NULL) { g_print ("Missing expression.\n"); return EXIT_FAILURE; } for (i = 0; arv_option_expressions[i] != NULL; i++) { arv_evaluator_set_expression (evaluator, arv_option_expressions[i]); value = arv_evaluator_evaluate_as_double (evaluator, &error); if (error != NULL) { g_print ("Error in '%s': %s\n", arv_option_expressions[i], error->message); g_error_free (error); error = NULL; } else g_print ("%s = %g\n", arv_option_expressions[i], value); } g_object_unref (evaluator); return EXIT_SUCCESS; } aravis-ARAVIS_0_6_0/tests/arvexample.c000066400000000000000000000061601334570641500176760ustar00rootroot00000000000000#include #include #include #include typedef struct { GMainLoop *main_loop; int buffer_count; } ApplicationData; static gboolean cancel = FALSE; static void set_cancel (int signal) { cancel = TRUE; } static void new_buffer_cb (ArvStream *stream, ApplicationData *data) { ArvBuffer *buffer; buffer = arv_stream_try_pop_buffer (stream); if (buffer != NULL) { if (arv_buffer_get_status (buffer) == ARV_BUFFER_STATUS_SUCCESS) data->buffer_count++; /* Image processing here */ arv_stream_push_buffer (stream, buffer); } } static gboolean periodic_task_cb (void *abstract_data) { ApplicationData *data = abstract_data; printf ("Frame rate = %d Hz\n", data->buffer_count); data->buffer_count = 0; if (cancel) { g_main_loop_quit (data->main_loop); return FALSE; } return TRUE; } static void control_lost_cb (ArvGvDevice *gv_device) { /* Control of the device is lost. Display a message and force application exit */ printf ("Control lost\n"); cancel = TRUE; } int main (int argc, char **argv) { ApplicationData data; ArvCamera *camera; ArvStream *stream; int i; data.buffer_count = 0; /* Instantiation of the first available camera */ camera = arv_camera_new (NULL); if (camera != NULL) { void (*old_sigint_handler)(int); gint payload; /* Set region of interrest to a 200x200 pixel area */ arv_camera_set_region (camera, 0, 0, 200, 200); /* Set frame rate to 10 Hz */ arv_camera_set_frame_rate (camera, 10.0); /* retrieve image payload (number of bytes per image) */ payload = arv_camera_get_payload (camera); /* Create a new stream object */ stream = arv_camera_create_stream (camera, NULL, NULL); if (stream != NULL) { /* Push 50 buffer in the stream input buffer queue */ for (i = 0; i < 50; i++) arv_stream_push_buffer (stream, arv_buffer_new (payload, NULL)); /* Start the video stream */ arv_camera_start_acquisition (camera); /* Connect the new-buffer signal */ g_signal_connect (stream, "new-buffer", G_CALLBACK (new_buffer_cb), &data); /* And enable emission of this signal (it's disabled by default for performance reason) */ arv_stream_set_emit_signals (stream, TRUE); /* Connect the control-lost signal */ g_signal_connect (arv_camera_get_device (camera), "control-lost", G_CALLBACK (control_lost_cb), NULL); /* Install the callback for frame rate display */ g_timeout_add_seconds (1, periodic_task_cb, &data); /* Create a new glib main loop */ data.main_loop = g_main_loop_new (NULL, FALSE); old_sigint_handler = signal (SIGINT, set_cancel); /* Run the main loop */ g_main_loop_run (data.main_loop); signal (SIGINT, old_sigint_handler); g_main_loop_unref (data.main_loop); /* Stop the video stream */ arv_camera_stop_acquisition (camera); /* Signal must be inhibited to avoid stream thread running after the last unref */ arv_stream_set_emit_signals (stream, FALSE); g_object_unref (stream); } else printf ("Can't create stream thread (check if the device is not already used)\n"); g_object_unref (camera); } else printf ("No camera found\n"); return 0; } aravis-ARAVIS_0_6_0/tests/arvgenicamtest.c000066400000000000000000000042111334570641500205410ustar00rootroot00000000000000#include #include static char **arv_option_filenames = NULL; static char *arv_option_debug_domains = NULL; static const GOptionEntry arv_option_entries[] = { { G_OPTION_REMAINING, ' ', 0, G_OPTION_ARG_FILENAME_ARRAY, &arv_option_filenames, NULL, NULL}, { "debug", 'd', 0, G_OPTION_ARG_STRING, &arv_option_debug_domains, "Debug mode", NULL }, { NULL } }; int main (int argc, char **argv) { ArvGc *genicam; char *xml; size_t size; GOptionContext *context; GError *error = NULL; int i; context = g_option_context_new (NULL); g_option_context_add_main_entries (context, arv_option_entries, NULL); if (!g_option_context_parse (context, &argc, &argv, &error)) { g_option_context_free (context); g_print ("Option parsing failed: %s\n", error->message); g_error_free (error); return EXIT_FAILURE; } g_option_context_free (context); arv_debug_enable (arv_option_debug_domains); if (arv_option_filenames == NULL) { g_print ("Missing input filename.\n"); return EXIT_FAILURE; } for (i = 0; arv_option_filenames[i] != NULL; i++) { g_file_get_contents (arv_option_filenames[i], &xml, &size, NULL); if (xml != NULL) { ArvGcNode *node; g_print ("Loading '%s'.\n", arv_option_filenames[i]); genicam = arv_gc_new (NULL, xml, size); node = arv_gc_get_node (genicam, "RegAcquisitionCommand"); if (node != NULL) { g_print ("RegAcquisitionCommand address = 0x%Lx - length = 0x%Lx\n", (unsigned long long) arv_gc_register_get_address (ARV_GC_REGISTER (node), NULL), (unsigned long long) arv_gc_register_get_length (ARV_GC_REGISTER (node), NULL)); } node = arv_gc_get_node (genicam, "IntWidthIncrement"); if (node != NULL) { g_print ("IntWidthIncrement value = %Ld\n", (long long) arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL)); } node = arv_gc_get_node (genicam, "WhitebalValueMin"); if (node != NULL) { g_print ("WhitebalValueMin value = %g\n", arv_gc_float_get_value (ARV_GC_FLOAT (node), NULL)); } g_free (xml); g_object_unref (genicam); } else g_print ("File '%s' not found.\n", arv_option_filenames[i]); } return EXIT_SUCCESS; } aravis-ARAVIS_0_6_0/tests/arvheartbeattest.c000066400000000000000000000077271334570641500211140ustar00rootroot00000000000000#include #include #include static gboolean cancel = FALSE; static void set_cancel (int signal) { cancel = TRUE; } static char *arv_option_camera_name = NULL; static char *arv_option_feature_name = "Gain"; static int arv_option_min = 0; static int arv_option_max = 10; static char *arv_option_debug_domains = "device"; static const GOptionEntry arv_option_entries[] = { { "name", 'n', 0, G_OPTION_ARG_STRING, &arv_option_camera_name, "Camera name", NULL }, { "feature", 'f', 0, G_OPTION_ARG_STRING, &arv_option_feature_name, "Feature name", NULL }, { "max", 'a', 0, G_OPTION_ARG_INT, &arv_option_max, "Max", NULL }, { "min", 'i', 0, G_OPTION_ARG_INT, &arv_option_min, "Min", NULL }, { "debug", 'd', 0, G_OPTION_ARG_STRING, &arv_option_debug_domains, "Debug domains", NULL }, { NULL } }; int main(int argc, char *argv[]) { ArvDevice *device; ArvStream *stream; ArvCamera *camera; ArvGcFeatureNode *feature; guint64 n_completed_buffers; guint64 n_failures; guint64 n_underruns; GOptionContext *context; GError *error = NULL; void (*old_sigint_handler)(int); int i, payload; context = g_option_context_new (NULL); g_option_context_set_summary (context, "Test of heartbeat robustness while continuously changing a feature."); g_option_context_add_main_entries (context, arv_option_entries, NULL); if (!g_option_context_parse (context, &argc, &argv, &error)) { g_option_context_free (context); g_print ("Option parsing failed: %s\n", error->message); g_error_free (error); return EXIT_FAILURE; } g_option_context_free (context); arv_debug_enable (arv_option_debug_domains); camera = arv_camera_new (arv_option_camera_name); if (!ARV_IS_CAMERA (camera)) { printf ("Device not found\n"); return EXIT_FAILURE; } device = arv_camera_get_device (camera); stream = arv_camera_create_stream (camera, NULL, NULL); if (!ARV_IS_STREAM (stream)) { printf ("Invalid device\n"); } else { payload = arv_camera_get_payload (camera); if (ARV_IS_GV_STREAM (stream)) { g_object_set (stream, //"socket-buffer", ARV_GV_STREAM_SOCKET_BUFFER_AUTO, "socket-buffer", ARV_GV_STREAM_SOCKET_BUFFER_FIXED, "socket-buffer-size", payload*6, "packet-timeout", 1000 * 1000, "frame-retention", 100 * 1000, "packet-resend", ARV_GV_STREAM_PACKET_RESEND_ALWAYS, NULL); } for (i = 0; i < 100; i++) arv_stream_push_buffer(stream, arv_buffer_new(payload, NULL)); arv_camera_set_acquisition_mode(camera, ARV_ACQUISITION_MODE_CONTINUOUS); feature = ARV_GC_FEATURE_NODE (arv_device_get_feature (device, arv_option_feature_name)); arv_camera_start_acquisition (camera); old_sigint_handler = signal (SIGINT, set_cancel); while (!cancel) { ArvBuffer *buffer = arv_stream_timeout_pop_buffer(stream, 2000000); if (buffer) { usleep(10); arv_stream_push_buffer (stream, buffer); } if (!(++i%5)) { char *value; if ((i/100) % 2 == 0) value = g_strdup_printf ("%d", arv_option_min); else value = g_strdup_printf ("%d", arv_option_max); fprintf (stderr, "Setting %s from %s to %s\n", arv_option_feature_name, arv_gc_feature_node_get_value_as_string (feature, NULL), value); arv_gc_feature_node_set_value_from_string (feature, value, NULL); g_free (value); } } signal (SIGINT, old_sigint_handler); arv_stream_get_statistics (stream, &n_completed_buffers, &n_failures, &n_underruns); printf ("\nCompleted buffers = %Lu\n", (unsigned long long) n_completed_buffers); printf ("Failures = %Lu\n", (unsigned long long) n_failures); printf ("Underruns = %Lu\n", (unsigned long long) n_underruns); arv_camera_stop_acquisition (camera); } g_object_unref (camera); return 0; } aravis-ARAVIS_0_6_0/tests/arvziptest.c000066400000000000000000000023631334570641500177460ustar00rootroot00000000000000#include #include static char **arv_option_filenames = NULL; static char *arv_option_debug_domains; static const GOptionEntry arv_option_entries[] = { { G_OPTION_REMAINING, ' ', 0, G_OPTION_ARG_FILENAME_ARRAY, &arv_option_filenames, NULL, NULL}, { "debug", 'd', 0, G_OPTION_ARG_STRING, &arv_option_debug_domains, "Debug mode", NULL }, { NULL } }; int main (int argc, char **argv) { ArvZip *zip; char *buffer; size_t size; GOptionContext *context; GError *error = NULL; int i; context = g_option_context_new (NULL); g_option_context_add_main_entries (context, arv_option_entries, NULL); if (!g_option_context_parse (context, &argc, &argv, &error)) { g_option_context_free (context); g_print ("Option parsing failed: %s\n", error->message); g_error_free (error); return EXIT_FAILURE; } g_option_context_free (context); arv_debug_enable (arv_option_debug_domains); if (arv_option_filenames == NULL) { g_print ("Missing input filename.\n"); return EXIT_FAILURE; } for (i = 0; arv_option_filenames[i] != NULL; i++) { g_file_get_contents (arv_option_filenames[i], &buffer, &size, NULL); if (buffer != NULL) { zip = arv_zip_new (buffer, size); arv_zip_free (zip); } } return EXIT_SUCCESS; } aravis-ARAVIS_0_6_0/tests/buffer.c000066400000000000000000000053571334570641500170120ustar00rootroot00000000000000#include #include static void simple_buffer_test (void) { ArvBuffer *buffer; size_t size; const void *data; buffer = arv_buffer_new (1024, NULL); g_assert (ARV_IS_BUFFER (buffer)); data = arv_buffer_get_data (buffer, &size); g_assert (data != NULL); g_assert (size == 1024); g_assert (arv_buffer_get_payload_type (buffer) == ARV_BUFFER_PAYLOAD_TYPE_UNKNOWN); g_assert (arv_buffer_get_status (buffer) == ARV_BUFFER_STATUS_CLEARED); g_assert (arv_buffer_get_user_data (buffer) == NULL); g_assert (arv_buffer_get_frame_id (buffer) == 0); g_object_unref (buffer); } static void preallocated_buffer_test (void) { ArvBuffer *buffer; void *data = g_malloc (1024); buffer = arv_buffer_new (1024, data); g_assert (ARV_IS_BUFFER (buffer)); g_assert (arv_buffer_get_data (buffer, NULL) == data); g_assert (arv_buffer_get_payload_type (buffer) == ARV_BUFFER_PAYLOAD_TYPE_UNKNOWN); g_assert (arv_buffer_get_status (buffer) == ARV_BUFFER_STATUS_CLEARED); g_assert (arv_buffer_get_user_data (buffer) == NULL); g_object_unref (buffer); g_free (data); } static void full_buffer_destroy_func (void *data) { *((int *) data) = 4321; } static void full_buffer_test (void) { ArvBuffer *buffer; int value = 1234; const void *data; size_t size; buffer = arv_buffer_new_full (1024, NULL, &value, full_buffer_destroy_func); g_assert (ARV_IS_BUFFER (buffer)); data = arv_buffer_get_data (buffer, &size); g_assert (data != NULL); g_assert (size == 1024); g_assert (arv_buffer_get_payload_type (buffer) == ARV_BUFFER_PAYLOAD_TYPE_UNKNOWN); g_assert (arv_buffer_get_status (buffer) == ARV_BUFFER_STATUS_CLEARED); g_assert (arv_buffer_get_user_data (buffer) == &value); g_object_unref (buffer); g_assert (value == 4321); } static void timestamp (void) { ArvBuffer *buffer; buffer = arv_buffer_new (1024, NULL); g_assert (ARV_IS_BUFFER (buffer)); g_assert_cmpint (arv_buffer_get_timestamp (buffer), == , 0); arv_buffer_set_timestamp (buffer, 1234); g_assert_cmpint (arv_buffer_get_timestamp (buffer), == , 1234); g_object_unref (buffer); } static void allocate (void) { ArvBuffer *buffer; const void *data; size_t size; buffer = arv_buffer_new_allocate (512); data = arv_buffer_get_data (buffer, &size); g_assert (data != NULL); g_assert (size == 512); g_object_unref (buffer); } int main (int argc, char *argv[]) { int result; g_test_init (&argc, &argv, NULL); g_test_add_func ("/buffer/simple-buffer", simple_buffer_test); g_test_add_func ("/buffer/preallocated-buffer", preallocated_buffer_test); g_test_add_func ("/buffer/full-buffer", full_buffer_test); g_test_add_func ("/buffer/timestamp", timestamp); g_test_add_func ("/buffer/allocate", allocate); result = g_test_run(); arv_shutdown (); return result; } aravis-ARAVIS_0_6_0/tests/cpp.cc000066400000000000000000000002201334570641500164460ustar00rootroot00000000000000#include /* Dumb test program, just to make sure aravis headers are c++ compatible */ int main (int argc, char **argv) { return 0; } aravis-ARAVIS_0_6_0/tests/data/000077500000000000000000000000001334570641500162745ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/tests/data/genicam.xml000066400000000000000000000240231334570641500204220ustar00rootroot00000000000000 RWFloat RWBoolean RWInteger Enumeration ChunkInt ChunkString ChunkFloat 0.1 -10.0 10.0 2.0 -20.0 20.0 3.0 RWFloat P_RWFloat_Min P_RWFloat_Max P_RWFloat_Inc 1 23 RWBooleanValue 23 42 1 -10 10 2 -20 20 3 RWInteger P_RWInteger_Min P_RWInteger_Max P_RWInteger_Inc 0 1 NotAvailable 2 NotAvailable 3 EnumerationValue 0 0 0 0x50
0x1000
IntRegisterAddress 8 RW NoCache 5 Unsigned BigEndian
0x2000
0xff 8 RW NoCache 5 Unsigned BigEndian
0x1000
8 RW NoCache 5 BigEndian Device
0x1004
4 RW NoCache 5 BigEndian Signed Device
(0x12345678 & 0x10305070) (0 && 1)?2:3 0x1234 X 10 TEN + X TEN * XPLUS2 4 10 20 5 Bug699228_T Bug699228_L Bug699228_FILTER ((((L%2) = 0) &&((T%2) = 0) && (FILTER = 0))?0:( (((L%2) = 0) &&((T%2) = 1) && (FILTER = 1))?0:( (((L%2) = 1) &&((T%2) = 0) && (FILTER = 2))?0:( (((L%2) = 1) &&((T%2) = 1) && (FILTER = 3))?0:( (((L%2) = 0) &&((T%2) = 0) && (FILTER = 1))?1:( (((L%2) = 0) &&((T%2) = 1) && (FILTER = 0))?1:( (((L%2) = 1) &&((T%2) = 0) && (FILTER = 3))?1:( (((L%2) = 1) &&((T%2) = 1) && (FILTER = 2))?1:( (((L%2) = 0) &&((T%2) = 0) && (FILTER = 2))?2:( (((L%2) = 0) &&((T%2) = 1) && (FILTER = 3))?2:( (((L%2) = 1) &&((T%2) = 0) && (FILTER = 0))?2:( (((L%2) = 1) &&((T%2) = 1) && (FILTER = 1))?2:( (((L%2) = 0) &&((T%2) = 0) && (FILTER = 3))?3:( (((L%2) = 0) &&((T%2) = 1) && (FILTER = 2))?3:( (((L%2) = 1) &&((T%2) = 0) && (FILTER = 1))?3:( (((L%2) = 1) &&((T%2) = 1) && (FILTER = 0))?3:( 4 ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )) Indicates whether a live grab is under way Invisible 0 0 1
0xe8
16 RW Device
0x00
4 R IntPort NoCache Unsigned BigEndian
12345678
0x00
8 R FloatPort NoCache Unsigned BigEndian
12345679
0x00
64 R StringPort
87654321 0.5 * FROM 2.0 * TO ConverterValue 10 * FROM 0.1 * TO ConverterValue 100 4 + FROM 4 + TO Enumeration 10 TEN TO * TEN * XPLUS2 FROM / XPLUS2 IntConverterTestSubAndConstantValue 100 TableSelector 100 200 600 20 FloatTableSelector 100.1 200.2 600.6 20 MultiplexerSelector MultiplexerEntry0 MultiplexerEntry1 MultiplexerDefaultValue 20 100 200 600 FloatMultiplexerSelector FloatMultiplexerEntry0 FloatMultiplexerEntry1 FloatMultiplexerDefaultValue 20 100.1 200.2 600.6
aravis-ARAVIS_0_6_0/tests/data/pipelines.txt000066400000000000000000000036631334570641500210350ustar00rootroot00000000000000Theora - udp ~~~~~~~~~~~~ aravissrc width=256 height=256 v-binning=4 h-binning=4 frame-rate=25.0 ! ffmpegcolorspace ! theoraenc bitrate=150 ! udpsink host=127.0.0.1 port=1234 udpsrc port=1234 ! theoradec ! xvimagesink Mjpeg - tcp ~~~~~~~~~~~ aravissrc width=256 height=256 v-binning=4 h-binning=4 ! ffmpegcolorspace ! jpegenc quality=50 ! multipartmux ! tcpserversink port=1234 tcpclientsrc host=127.0.0.1 port=1234 ! multipartdemux ! jpegdec ! xvimagesink Smoke - tcp ~~~~~~~~~~~ aravissrc width=256 height=256 v-binning=4 h-binning=4 ! ffmpegcolorspace ! smokeenc ! multipartmux ! tcpserversink port=1234 tcpclientsrc host=127.0.0.1 port=1234 ! multipartdemux ! smokedec ! xvimagesink Direct output ~~~~~~~~~~~~~ aravissrc width=256 height=256 v-binning=4 h-binning=4 ! ffmpegcolorspace ! xvimagesink RTP ~~~ gstrtpbin name=rtpbin aravissrc width=256 height=256 v-binning=4 h-binning=4 ! ffmpegcolorspace ! queue ! x264enc byte-stream=true bitrate=300 ! rtph264pay ! rtpbin.send_rtp_sink_0 rtpbin.send_rtp_src_0 ! udpsink port=5000 host=127.0.0.1 ts-offset=0 name=vrtpsink rtpbin.send_rtcp_src_0 ! udpsink port=5001 host=127.0.0.1 sync=false async=false name=vrtcpsink udpsrc port=5005 name=vrtpsrc ! rtpbin.recv_rtcp_sink_0 gstrtpbin name=rtpbin latency=200 udpsrc caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264" port=5000 ! rtpbin.recv_rtp_sink_0 rtpbin. ! rtph264depay ! ffdec_h264 ! xvimagesink udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0 rtpbin.send_rtcp_src_0 ! udpsink port=5005 host=127.0.0.1 sync=false async=false udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1 rtpbin.send_rtcp_src_1 ! udpsink port=5007 host=127.0.0.1 sync=false async=false sdp file: v=0 o=- 1188340656180883 1 IN IP4 127.0.0.1 s=Session streamed by GStreamer i=server.sh t=0 0 a=tool:GStreamer a=type:broadcast m=video 5000 RTP/AVP 96 c=IN IP4 127.0.0.1 a=rtpmap:96 H264/90000 aravis-ARAVIS_0_6_0/tests/evaluator.c000066400000000000000000000304371334570641500175400ustar00rootroot00000000000000#include #include #include typedef struct { const char *test_name; const char *expression; gint64 result_int64; gboolean expected_error_int64; double result_double; } ExpressionTestData; static const ExpressionTestData expression_test_data[] = { {"/evaluator/addition", "10+2", 12, FALSE, 12.0}, {"/evaluator/parentheses", "(24+2)*2", 52, FALSE, 52.0}, {"/evaluator/precedence", "24+2*8", 40, FALSE, 40.0}, {"/evaluator/ternary-true", "1=1?1:0", 1, FALSE, 1.0}, {"/evaluator/ternary-false", "1=0?1:0", 0, FALSE, 0.0}, {"/evaluator/greater-true", "2>1", 1, FALSE, 1.0}, {"/evaluator/greater-false", "2>2", 0, FALSE, 0.0}, {"/evaluator/lower-true", "1<2", 1, FALSE, 1.0}, {"/evaluator/lower-false", "2<2", 0, FALSE, 0.0}, {"/evaluator/substraction", "10-8", 2, FALSE, 2.0}, {"/evaluator/substraction-float", "10.1-8.1", 2, FALSE, 2.0}, {"/evaluator/multiplication", "2.5*4", 8, FALSE, 10.0}, {"/evaluator/division", "10/4", 2, FALSE, 2.5}, {"/evaluator/division-float", "10.0/4", 2, FALSE, 2.5}, {"/evaluator/simple-minus", "-1", -1, FALSE, -1.0}, {"/evaluator/minus", "4*-3", -12, FALSE, -12.0}, {"/evaluator/plus", "4*+3", 12, FALSE, 12.0}, {"/evaluator/remainder", "10%3", 1, FALSE, 1.0}, {"/evaluator/power", "2**10", 1024, FALSE, 1024.0}, {"/evaluator/power-precedence", "2**10*2", 2048, FALSE, 2048.0}, {"/evaluator/ln", "LN(E)", 1, TRUE, 1.0}, {"/evaluator/lg", "LG(10)", 1, TRUE, 1.0}, {"/evaluator/sqrt", "SQRT(16)", 4, TRUE, 4.0}, {"/evaluator/tan", "TAN(0)", 0, TRUE, 0.0}, {"/evaluator/atan", "ATAN(0)", 0, TRUE, 0.0}, {"/evaluator/exp", "EXP(1)", 2, TRUE, M_E}, {"/evaluator/trunc-plus", "TRUNC(10.7)", 10, TRUE, 10.0}, {"/evaluator/trunc-minus", "TRUNC(-11.9)", -11, TRUE, -11.0}, {"/evaluator/round-plus", "ROUND(10.1)", 10, TRUE, 10.0}, {"/evaluator/round-plus-plus", "ROUND(10.9)", 11, TRUE, 11.0}, {"/evaluator/round-minus", "ROUND(-20.1)", -20, TRUE, -20.0}, {"/evaluator/round-minus-minus", "ROUND(-20.9)", -21, TRUE, -21.0}, {"/evaluator/round-plus-with-precision", "ROUND(10.11, 1)", 10, TRUE, 10.1}, {"/evaluator/round-plus-plus-with-precision", "ROUND(10.99, 1)", 11, TRUE, 11.0}, {"/evaluator/round-minus-with-precision", "ROUND(-20.11, 1)", -20, TRUE, -20.1}, {"/evaluator/round-minus-minus-with-precision", "ROUND(-20.99, 1)", -21, TRUE, -21.0}, {"/evaluator/floor-plus", "FLOOR(10.7)", 10, TRUE, 10.0}, {"/evaluator/floor-minus", "FLOOR(-11.9)", -12, TRUE, -12.0}, {"/evaluator/ceil-plus", "CEIL(10.7)", 11, TRUE, 11.0}, {"/evaluator/ceil-minus", "CEIL(-11.9)", -11, TRUE, -11.0}, {"/evaluator/sign-plus", "SGN(2)", 1, FALSE, 1.0}, {"/evaluator/sign-minus", "SGN(-2)", -1, FALSE, -1.0}, {"/evaluator/sign-zero", "SGN(0)", 0, FALSE, 0.0}, {"/evaluator/sign-plus-float", "SGN(2.0)", 1, FALSE, 1.0}, {"/evaluator/sign-minus-floa", "SGN(-2.0)", -1, FALSE, -1.0}, {"/evaluator/sign-zero-float", "SGN(0.0)", 0, FALSE, 0.0}, {"/evaluator/neg", "NEG(-1)", 1, FALSE, 1.0}, {"/evaluator/neg-float", "NEG(-2.5)", 2, FALSE, 2.5}, {"/evaluator/and", "255 & 8", 8, FALSE, 8.0}, {"/evaluator/or", "128 | 8", 136, FALSE, 136.0}, {"/evaluator/xor", "3 ^ 1", 2, FALSE, 2.0}, {"/evaluator/not", "~255", -256, FALSE, -256.0}, {"/evaluator/not-equal-true", "1<>2", 1, FALSE, 1.0}, {"/evaluator/not-equal-false", "1<>1", 0, FALSE, 0.0}, {"/evaluator/equal-true", "1=1", 1, FALSE, 1.0}, {"/evaluator/equal-false", "1=2", 0, FALSE, 0.0}, {"/evaluator/less-true", "1<2", 1, FALSE, 1.0}, {"/evaluator/less-false", "1<1", 0, FALSE, 0.0}, {"/evaluator/greater-or-equal-true", "2>=2", 1, FALSE, 1.0}, {"/evaluator/greater-or-equal-false", "1>=2", 0, FALSE, 0.0}, {"/evaluator/less-or-equal-true", "2<=2", 1, FALSE, 1.0}, {"/evaluator/less-or-equal-false", "2<=1", 0, FALSE, 0.0}, {"/evaluator/not-equal-true-double", "2.1<>2", 0, FALSE, 1.0}, {"/evaluator/not-equal-false-double", "1.0<>1", 0, FALSE, 0.0}, {"/evaluator/equal-true-double", "1.0=1", 1, FALSE, 1.0}, {"/evaluator/equal-false-double", "2.1=2", 1, FALSE, 0.0}, {"/evaluator/greater-true-double", "2.1>2", 0, FALSE, 1.0}, {"/evaluator/greater-false-double", "2>2.1", 0, FALSE, 0.0}, {"/evaluator/less-true-double", "2<2.1", 0, FALSE, 1.0}, {"/evaluator/less-false-double", "2.1<2", 0, FALSE, 0.0}, {"/evaluator/greater-or-equal-true-double", "2.1>=2", 1, FALSE, 1.0}, {"/evaluator/greater-or-equal-false-double", "2>=2.1", 1, FALSE, 0.0}, {"/evaluator/less-or-equal-true-double", "2<=2.1", 1, FALSE, 1.0}, {"/evaluator/less-or-equal-false-double", "2.1<=2", 1, FALSE, 0.0}, {"/evaluator/logical-and-true", "(2=2)&&(1=1)", 1, FALSE, 1.0}, {"/evaluator/logical-and-false", "(2=2)&&(1=2)", 0, FALSE, 0.0}, {"/evaluator/logical-or-true", "(2=2)||(1=2)", 1, FALSE, 1.0}, {"/evaluator/logical-or-false", "(1=2)||(0=2)", 0, FALSE, 0.0}, {"/evaluator/left-shift", "1<<4", 16, FALSE, 16.0}, {"/evaluator/right-shift", "16>>4", 1, FALSE, 1.0}, {"/evaluator/cos", "COS(PI)", -1, TRUE, -1.0}, {"/evaluator/sin", "SIN(-PI/2)", -1, TRUE, -1.0}, {"/evaluator/acos", "ACOS(1)", 0, TRUE, 0.0}, {"/evaluator/asin", "ASIN(0)", 0, TRUE, 0.0}, {"/evaluator/abs", "ABS(-1)", 1, TRUE, 1.0}, {"/evaluator/abs-float", "ABS(-10.3)", 10, TRUE, 10.3}, {"/evaluator/abs64bits", "ABS(-10000000000)", 10000000000, TRUE, 1e10}, {"/evaluator/bugs/681048-remaining-op", "(0 & 1)=0?((0 & 1)+2):1", 2, FALSE, 2.0}, {"/evaluator/bugs/743025-division-by-zero", "(4/(20/10000))", 2000, TRUE, 2000.0}, {"/evaluator/bugs/gh98-not-operatorprecedence", "(~(~0xC2000221|0xFEFFFFFF)) ? 2:0", 0, FALSE, 0.0} }; static void expression_test (ExpressionTestData *data) { ArvEvaluator *evaluator; const char *expression; gint64 v_int64; double v_double; GError *error = NULL; evaluator = arv_evaluator_new (data->expression); v_int64 = arv_evaluator_evaluate_as_int64 (evaluator, &error); if (data->expected_error_int64) { g_assert (error != NULL); g_clear_error (&error); } else { g_assert (error == NULL); g_assert_cmpint (v_int64, ==, data->result_int64); } v_double = arv_evaluator_evaluate_as_double (evaluator, &error); g_assert (error == NULL); g_assert_cmpfloat (v_double, ==, data->result_double); expression = arv_evaluator_get_expression (evaluator); g_assert_cmpstr (expression, ==, data->expression); g_object_unref (evaluator); } static void set_get_expression_test (void) { ArvEvaluator *evaluator; const char *expression; evaluator = arv_evaluator_new (NULL); expression = arv_evaluator_get_expression (evaluator); g_assert_cmpstr (expression, == , NULL); arv_evaluator_set_expression (evaluator, "1+1"); expression = arv_evaluator_get_expression (evaluator); g_assert_cmpstr (expression, == , "1+1"); arv_evaluator_set_expression (evaluator, NULL); expression = arv_evaluator_get_expression (evaluator); g_assert_cmpstr (expression, == , NULL); g_object_unref (evaluator); } static void set_double_variable_test (void) { ArvEvaluator *evaluator; GError *error = NULL; double v_double; evaluator = arv_evaluator_new ("V_DBLA+V_DBLB"); arv_evaluator_set_double_variable (evaluator, "V_DBLA", 123.0); arv_evaluator_set_double_variable (evaluator, "V_DBLB", 0.4); v_double = arv_evaluator_evaluate_as_double (evaluator, &error); g_assert_cmpfloat (v_double, ==, 123.4); g_assert (error == NULL); g_object_unref (evaluator); } static void set_int64_variable_test (void) { ArvEvaluator *evaluator; GError *error = NULL; gint64 v_int64; evaluator = arv_evaluator_new ("A_1"); arv_evaluator_set_int64_variable (evaluator, "A_1", 123); v_int64 = arv_evaluator_evaluate_as_int64 (evaluator, &error); g_assert_cmpfloat (v_int64, ==, 123); g_assert (error == NULL); g_object_unref (evaluator); } static void sub_expression_test (void) { ArvEvaluator *evaluator; GError *error = NULL; double v_double; const char *sub_expression; evaluator = arv_evaluator_new ("ZERO5 + SUB_EXP"); arv_evaluator_set_sub_expression (evaluator, "ZERO5", "0.5"); arv_evaluator_set_sub_expression (evaluator, "SUB_EXP", "2*X"); arv_evaluator_set_int64_variable (evaluator, "X", 6); v_double = arv_evaluator_evaluate_as_double (evaluator, &error); g_assert_cmpfloat (v_double, ==, 12.5); g_assert (error == NULL); sub_expression = arv_evaluator_get_sub_expression (evaluator, "SUB_EXP"); g_assert_cmpstr (sub_expression, ==, "2*X"); arv_evaluator_set_sub_expression (evaluator, "SUB_EXP", "2 + X"); v_double = arv_evaluator_evaluate_as_double (evaluator, &error); g_assert_cmpfloat (v_double, ==, 8.5); g_assert (error == NULL); arv_evaluator_set_sub_expression (evaluator, "SUB_EXP", NULL); v_double = arv_evaluator_evaluate_as_double (evaluator, &error); g_assert (error != NULL); g_clear_error (&error); sub_expression = arv_evaluator_get_sub_expression (evaluator, "SUB_EXP"); g_assert (sub_expression == NULL); arv_evaluator_set_sub_expression (evaluator, "SUB_EXP", "SUB_EXP"); v_double = arv_evaluator_evaluate_as_double (evaluator, &error); g_assert (error != NULL); g_clear_error (&error); g_object_unref (evaluator); } static void constant_test (void) { ArvEvaluator *evaluator; GError *error = NULL; double v_double; const char *constant; evaluator = arv_evaluator_new ("ZERO5 + TEN * X"); arv_evaluator_set_constant (evaluator, "ZERO5", "0.5"); arv_evaluator_set_constant (evaluator, "TEN", "10"); arv_evaluator_set_int64_variable (evaluator, "X", 6); v_double = arv_evaluator_evaluate_as_double (evaluator, &error); g_assert_cmpfloat (v_double, ==, 60.5); g_assert (error == NULL); constant = arv_evaluator_get_constant (evaluator, "TEN"); g_assert_cmpstr (constant, ==, "10"); arv_evaluator_set_constant (evaluator, "TEN", "20"); v_double = arv_evaluator_evaluate_as_double (evaluator, &error); g_assert_cmpfloat (v_double, ==, 120.5); g_assert (error == NULL); arv_evaluator_set_constant (evaluator, "TEN", NULL); v_double = arv_evaluator_evaluate_as_double (evaluator, &error); g_assert (error != NULL); g_clear_error (&error); constant = arv_evaluator_get_constant (evaluator, "TEN"); g_assert (constant == NULL); g_object_unref (evaluator); } static void empty_test (void) { ArvEvaluator *evaluator; GError *error = NULL; gint64 v_int64; evaluator = arv_evaluator_new (NULL); arv_evaluator_evaluate_as_double (evaluator, &error); g_assert (error != NULL); g_clear_error (&error); arv_evaluator_set_expression (evaluator, "10 * 3"); v_int64 = arv_evaluator_evaluate_as_int64 (evaluator, &error); g_assert_cmpint (v_int64, ==, 30); g_assert (error == NULL); arv_evaluator_set_expression (evaluator, NULL); arv_evaluator_evaluate_as_double (evaluator, &error); g_assert (error != NULL); g_clear_error (&error); g_object_unref (evaluator); } static void error_test (void) { ArvEvaluator *evaluator; GError *error = NULL; evaluator = arv_evaluator_new ("("); arv_evaluator_evaluate_as_double (evaluator, &error); g_assert (error != NULL); g_clear_error (&error); arv_evaluator_evaluate_as_int64 (evaluator, &error); g_assert (error != NULL); g_clear_error (&error); g_object_unref (evaluator); evaluator = arv_evaluator_new ("UNKNOWN("); arv_evaluator_evaluate_as_double (evaluator, &error); g_assert (error != NULL); g_clear_error (&error); arv_evaluator_evaluate_as_int64 (evaluator, &error); g_assert (error != NULL); g_clear_error (&error); g_object_unref (evaluator); } int main (int argc, char *argv[]) { int result; int i; g_test_init (&argc, &argv, NULL); for (i = 0; i < G_N_ELEMENTS (expression_test_data); i++) g_test_add_data_func (expression_test_data[i].test_name, &expression_test_data[i], (void *) expression_test); g_test_add_func ("/evaluator/set-get-expression", set_get_expression_test); g_test_add_func ("/evaluator/double-variable", set_double_variable_test); g_test_add_func ("/evaluator/int64-variable", set_int64_variable_test); g_test_add_func ("/evaluator/sub-expression", sub_expression_test); g_test_add_func ("/evaluator/constant", constant_test); g_test_add_func ("/evaluator/empty", empty_test); g_test_add_func ("/evaluator/error", error_test); result = g_test_run(); arv_shutdown (); return result; } aravis-ARAVIS_0_6_0/tests/fake.c000066400000000000000000000264611334570641500164460ustar00rootroot00000000000000#include #include static void load_fake_camera_genicam_test (void) { const char *genicam_xml; size_t size; genicam_xml = arv_get_fake_camera_genicam_xml (&size); g_assert (genicam_xml != NULL); g_assert (size != 0); genicam_xml = arv_get_fake_camera_genicam_xml (NULL); g_assert (genicam_xml != NULL); } static void trigger_registers_test (void) { ArvDevice *device; ArvGc *genicam; ArvGcNode *node; gint64 address; device = arv_fake_device_new ("TEST0"); g_assert (ARV_IS_FAKE_DEVICE (device)); genicam = arv_device_get_genicam (device); g_assert (ARV_IS_GC (genicam)); node = arv_gc_get_node (genicam, "TriggerModeRegister"); g_assert (ARV_IS_GC_NODE (node)); address = arv_gc_register_get_address (ARV_GC_REGISTER (node), NULL); g_assert_cmpint (address, ==, ARV_FAKE_CAMERA_REGISTER_TRIGGER_MODE); address = arv_gc_register_get_address (ARV_GC_REGISTER (arv_gc_get_node (genicam, "TriggerSourceRegister")), NULL); g_assert_cmpint (address, ==, ARV_FAKE_CAMERA_REGISTER_TRIGGER_SOURCE); address = arv_gc_register_get_address (ARV_GC_REGISTER (arv_gc_get_node (genicam, "TriggerActivationRegister")), NULL); g_assert_cmpint (address, ==, ARV_FAKE_CAMERA_REGISTER_TRIGGER_ACTIVATION); arv_device_set_string_feature_value (device, "TriggerSelector", "AcquisitionStart"); address = arv_gc_register_get_address (ARV_GC_REGISTER (node), NULL); g_assert_cmpint (address, ==, ARV_FAKE_CAMERA_REGISTER_TRIGGER_MODE + ARV_FAKE_CAMERA_REGISTER_ACQUISITION_START_OFFSET); g_object_unref (device); } static void registers_test (void) { ArvDevice *device; ArvGc *genicam; ArvGcNode *node; ArvGcNode *node_a; ArvGcNode *node_b; ArvGcNode *node_c; gint64 value; gint64 address; device = arv_fake_device_new ("TEST0"); g_assert (ARV_IS_FAKE_DEVICE (device)); genicam = arv_device_get_genicam (device); g_assert (ARV_IS_GC (genicam)); node = arv_gc_get_node (genicam, "TestRegister"); g_assert (ARV_IS_GC_NODE (node)); address = arv_gc_register_get_address (ARV_GC_REGISTER (node), NULL); g_assert_cmpint (address, ==, 0x1f0); arv_gc_integer_set_value (ARV_GC_INTEGER (node), 0x12345678, NULL); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (value, ==, 0x12345678); node_a = arv_gc_get_node (genicam, "StructEntry_0_15"); g_assert (ARV_IS_GC_NODE (node_a)); node_b = arv_gc_get_node (genicam, "StructEntry_16_31"); g_assert (ARV_IS_GC_NODE (node_b)); node_c = arv_gc_get_node (genicam, "StructEntry_16"); g_assert (ARV_IS_GC_NODE (node_c)); value = arv_gc_register_get_address (ARV_GC_REGISTER (node_a), NULL); g_assert_cmpint (value, ==, address); value = arv_gc_register_get_address (ARV_GC_REGISTER (node_b), NULL); g_assert_cmpint (value, ==, address); value = arv_gc_register_get_address (ARV_GC_REGISTER (node_c), NULL); g_assert_cmpint (value, ==, address); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node_a), NULL); g_assert_cmpint (value, ==, 0x5678); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node_b), NULL); g_assert_cmpint (value, ==, 0x1234); arv_gc_integer_set_value (ARV_GC_INTEGER (node_b), 0x10101010, NULL); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node_a), NULL); g_assert_cmpint (value, ==, 0x5678); arv_gc_integer_set_value (ARV_GC_INTEGER (node_a), 0xabcdefaa, NULL); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node_a), NULL); g_assert_cmpint (value, ==, -4182); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node_b), NULL); g_assert_cmpint (value, ==, 0x1010); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node_c), NULL); g_assert_cmpint (value, ==, 0x0); arv_gc_integer_set_value (ARV_GC_INTEGER (node_c), 0xff, NULL); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node_c), NULL); g_assert_cmpint (value, ==, 1); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node_b), NULL); g_assert_cmpint (value, ==, 0x1011); arv_gc_integer_set_value (ARV_GC_INTEGER (node_b), 0xff, NULL); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node_b), NULL); g_assert_cmpint (value, ==, 0xff); arv_gc_integer_set_value (ARV_GC_INTEGER (node_c), 0x0, NULL); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node_c), NULL); g_assert_cmpint (value, ==, 0); g_object_unref (device); } static void fake_device_test (void) { ArvDevice *device; ArvDeviceStatus status; int int_value; double dbl_value; double boolean_value; gint64 minimum, maximum; gint64 *values; const char **string_values; const char *string_value; guint n_values; double float_minimum, float_maximum; const char *genicam; gsize size; device = arv_fake_device_new ("TEST0"); g_assert (ARV_IS_FAKE_DEVICE (device)); genicam = arv_device_get_genicam_xml (device, &size); g_assert (genicam != NULL); /* Check default */ int_value = arv_device_get_integer_feature_value (device, "Width"); g_assert_cmpint (int_value, ==, ARV_FAKE_CAMERA_WIDTH_DEFAULT); arv_device_set_integer_feature_value (device, "Width", 1024); int_value = arv_device_get_integer_feature_value (device, "Width"); g_assert_cmpint (int_value, ==, 1024); /* Check default */ int_value = arv_device_get_integer_feature_value (device, "Height"); g_assert_cmpint (int_value, ==, ARV_FAKE_CAMERA_HEIGHT_DEFAULT); arv_device_set_integer_feature_value (device, "Height", 1024); int_value = arv_device_get_integer_feature_value (device, "Height"); g_assert_cmpint (int_value, ==, 1024); int_value = arv_device_get_integer_feature_value (device, "BinningHorizontal"); g_assert_cmpint (int_value, ==, ARV_FAKE_CAMERA_BINNING_HORIZONTAL_DEFAULT); int_value = arv_device_get_integer_feature_value (device, "BinningVertical"); g_assert_cmpint (int_value, ==, ARV_FAKE_CAMERA_BINNING_VERTICAL_DEFAULT); int_value = arv_device_get_integer_feature_value (device, "PixelFormat"); g_assert_cmpint (int_value, ==, ARV_FAKE_CAMERA_PIXEL_FORMAT_DEFAULT); dbl_value = arv_device_get_float_feature_value (device, "AcquisitionFrameRate"); g_assert_cmpfloat (dbl_value, ==, ARV_FAKE_CAMERA_ACQUISITION_FRAME_RATE_DEFAULT); dbl_value = arv_device_get_float_feature_value (device, "ExposureTimeAbs"); g_assert_cmpfloat (dbl_value, ==, ARV_FAKE_CAMERA_EXPOSURE_TIME_US_DEFAULT); int_value = arv_device_get_integer_feature_value (device, "GainRaw"); g_assert_cmpint (int_value, ==, 0); int_value = arv_device_get_integer_feature_value (device, "GainAuto"); g_assert_cmpint (int_value, ==, 1); int_value = arv_device_get_integer_feature_value (device, "PayloadSize"); g_assert_cmpint (int_value, ==, 1024 * 1024); arv_device_set_boolean_feature_value (device, "TestBoolean", FALSE); boolean_value = arv_device_get_boolean_feature_value (device, "TestBoolean"); g_assert_cmpint (boolean_value, ==, FALSE); int_value = arv_device_get_integer_feature_value (device, "TestRegister"); g_assert_cmpint (int_value, ==, 123); arv_device_set_boolean_feature_value (device, "TestBoolean", TRUE); boolean_value = arv_device_get_boolean_feature_value (device, "TestBoolean"); g_assert_cmpint (boolean_value, ==, TRUE); int_value = arv_device_get_integer_feature_value (device, "TestRegister"); g_assert_cmpint (int_value, ==, 321); arv_device_get_integer_feature_bounds (device, "Width", &minimum, &maximum); g_assert_cmpint (minimum, ==, 1); g_assert_cmpint (maximum, ==, 2048); arv_device_get_float_feature_bounds (device, "ExposureTimeAbs", &float_minimum, &float_maximum); g_assert_cmpfloat (float_minimum, ==, 10.0); g_assert_cmpfloat (float_maximum, ==, 10000000.0); arv_device_set_float_feature_value (device, "ExposureTimeAbs", 20.0); dbl_value = arv_device_get_float_feature_value (device, "ExposureTimeAbs"); g_assert_cmpfloat (dbl_value, ==, 20.0); values = arv_device_get_available_enumeration_feature_values (device, "GainAuto", &n_values); g_assert (values != NULL); g_assert_cmpint (n_values, ==, 3); g_free (values); string_values = arv_device_get_available_enumeration_feature_values_as_strings (device, "GainAuto", &n_values); g_assert (string_values != NULL); g_assert_cmpint (n_values, ==, 3); g_free (string_values); arv_device_set_string_feature_value (device, "TestStringReg", "String"); string_value = arv_device_get_string_feature_value (device, "TestStringReg"); g_assert_cmpstr (string_value, ==, "String"); status = arv_device_get_status (device); g_assert_cmpint (status, ==, ARV_DEVICE_STATUS_SUCCESS); g_object_unref (device); } static void fake_device_error_test (void) { ArvDevice *device; ArvDeviceStatus status; int int_value; double boolean_value; device = arv_fake_device_new ("TEST0"); g_assert (ARV_IS_FAKE_DEVICE (device)); int_value = arv_device_get_integer_feature_value (device, "Unknown"); g_assert_cmpint (int_value, ==, 0); boolean_value = arv_device_get_boolean_feature_value (device, "Unknown"); g_assert_cmpint (boolean_value, ==, 0); status = arv_device_get_status (device); g_assert_cmpint (status, ==, ARV_DEVICE_STATUS_SUCCESS); g_object_unref (device); } static void fill_pattern_cb (ArvBuffer *buffer, void *fill_pattern_data, guint32 exposure_time_us, guint32 gain, ArvPixelFormat pixel_format) { gint *counter = fill_pattern_data; (*counter)++; } static void fake_stream_test (void) { ArvCamera *camera; ArvDevice *device; ArvFakeCamera *fake_camera; ArvStream *stream; ArvBuffer *buffer; guint64 n_completed_buffers; guint64 n_failures; guint64 n_underruns; gint n_input_buffers; gint n_output_buffers; gint payload; gint counter = 0; camera = arv_camera_new ("Fake_1"); g_assert (ARV_IS_CAMERA (camera)); device = arv_camera_get_device (camera); g_assert (ARV_IS_DEVICE (device)); fake_camera = arv_fake_device_get_fake_camera (ARV_FAKE_DEVICE (device)); g_assert (ARV_IS_FAKE_CAMERA (fake_camera)); stream = arv_camera_create_stream (camera, NULL, NULL); g_assert (ARV_IS_STREAM (stream)); arv_fake_camera_set_fill_pattern (fake_camera, fill_pattern_cb, &counter); payload = arv_camera_get_payload (camera); arv_stream_push_buffer (stream, arv_buffer_new (payload, NULL)); arv_camera_set_acquisition_mode (camera, ARV_ACQUISITION_MODE_SINGLE_FRAME); arv_camera_start_acquisition (camera); buffer = arv_stream_pop_buffer (stream); arv_camera_stop_acquisition (camera); arv_fake_camera_set_fill_pattern (fake_camera, NULL, NULL); g_assert_cmpint (counter, ==, 1); g_assert (ARV_IS_BUFFER (buffer)); arv_stream_get_statistics (stream, &n_completed_buffers, &n_failures, &n_underruns); g_assert_cmpint (n_completed_buffers, == ,1); g_assert_cmpint (n_failures, ==, 0); g_assert_cmpint (n_underruns, ==, 0); arv_stream_get_n_buffers (stream, &n_input_buffers, &n_output_buffers); g_assert_cmpint (n_input_buffers, ==, 0); g_assert_cmpint (n_output_buffers, ==, 0); g_clear_object (&buffer); g_clear_object (&stream); g_clear_object (&camera); } int main (int argc, char *argv[]) { int result; g_test_init (&argc, &argv, NULL); arv_enable_interface ("Fake"); arv_update_device_list (); arv_set_fake_camera_genicam_filename (GENICAM_FILENAME); g_test_add_func ("/fake/load-fake-camera-genicam", load_fake_camera_genicam_test); g_test_add_func ("/fake/trigger-registers", trigger_registers_test); g_test_add_func ("/fake/registers", registers_test); g_test_add_func ("/fake/fake-device", fake_device_test); g_test_add_func ("/fake/fake-device-error", fake_device_error_test); g_test_add_func ("/fake/fake-stream", fake_stream_test); result = g_test_run(); arv_shutdown (); return result; } aravis-ARAVIS_0_6_0/tests/fakegv.c000066400000000000000000000131351334570641500167750ustar00rootroot00000000000000#include #include static ArvCamera *camera = NULL; static void register_test (void) { ArvDevice *device; int int_value; double dbl_value; double boolean_value; device = arv_camera_get_device (camera); g_assert (ARV_IS_GV_DEVICE (device)); /* Check default */ int_value = arv_device_get_integer_feature_value (device, "Width"); g_assert_cmpint (int_value, ==, ARV_FAKE_CAMERA_WIDTH_DEFAULT); arv_device_set_integer_feature_value (device, "Width", 1024); int_value = arv_device_get_integer_feature_value (device, "Width"); g_assert_cmpint (int_value, ==, 1024); /* Check default */ int_value = arv_device_get_integer_feature_value (device, "Height"); g_assert_cmpint (int_value, ==, ARV_FAKE_CAMERA_HEIGHT_DEFAULT); arv_device_set_integer_feature_value (device, "Height", 1024); int_value = arv_device_get_integer_feature_value (device, "Height"); g_assert_cmpint (int_value, ==, 1024); int_value = arv_device_get_integer_feature_value (device, "BinningHorizontal"); g_assert_cmpint (int_value, ==, ARV_FAKE_CAMERA_BINNING_HORIZONTAL_DEFAULT); int_value = arv_device_get_integer_feature_value (device, "BinningVertical"); g_assert_cmpint (int_value, ==, ARV_FAKE_CAMERA_BINNING_VERTICAL_DEFAULT); int_value = arv_device_get_integer_feature_value (device, "PixelFormat"); g_assert_cmpint (int_value, ==, ARV_FAKE_CAMERA_PIXEL_FORMAT_DEFAULT); dbl_value = arv_device_get_float_feature_value (device, "AcquisitionFrameRate"); g_assert_cmpfloat (dbl_value, ==, ARV_FAKE_CAMERA_ACQUISITION_FRAME_RATE_DEFAULT); dbl_value = arv_device_get_float_feature_value (device, "ExposureTimeAbs"); g_assert_cmpfloat (dbl_value, ==, ARV_FAKE_CAMERA_EXPOSURE_TIME_US_DEFAULT); int_value = arv_device_get_integer_feature_value (device, "GainRaw"); g_assert_cmpint (int_value, ==, 0); int_value = arv_device_get_integer_feature_value (device, "GainAuto"); g_assert_cmpint (int_value, ==, 1); int_value = arv_device_get_integer_feature_value (device, "PayloadSize"); g_assert_cmpint (int_value, ==, 1024 * 1024); arv_device_set_boolean_feature_value (device, "TestBoolean", FALSE); boolean_value = arv_device_get_boolean_feature_value (device, "TestBoolean"); g_assert_cmpint (boolean_value, ==, FALSE); int_value = arv_device_get_integer_feature_value (device, "TestRegister"); g_assert_cmpint (int_value, ==, 123); arv_device_set_boolean_feature_value (device, "TestBoolean", TRUE); boolean_value = arv_device_get_boolean_feature_value (device, "TestBoolean"); g_assert_cmpint (boolean_value, ==, TRUE); int_value = arv_device_get_integer_feature_value (device, "TestRegister"); g_assert_cmpint (int_value, ==, 321); } static void acquisition_test (void) { ArvBuffer *buffer; gint x, y, width, height; buffer = arv_camera_acquisition (camera, 0); g_assert (ARV_IS_BUFFER (buffer)); arv_buffer_get_image_region (buffer, &x, &y, &width, &height); g_assert_cmpint (x, ==, 0); g_assert_cmpint (y, ==, 0); g_assert_cmpint (width, ==, 1024); g_assert_cmpint (height, ==, 1024); g_assert_cmpint (arv_buffer_get_image_x (buffer), ==, 0); g_assert_cmpint (arv_buffer_get_image_y (buffer), ==, 0); g_assert_cmpint (arv_buffer_get_image_width (buffer), ==, 1024); g_assert_cmpint (arv_buffer_get_image_height (buffer), ==, 1024); g_assert (arv_buffer_get_image_pixel_format (buffer) == ARV_PIXEL_FORMAT_MONO_8); g_clear_object (&buffer); } static void new_buffer_cb (ArvStream *stream, unsigned *buffer_count) { ArvBuffer *buffer; buffer = arv_stream_try_pop_buffer (stream); if (buffer != NULL) { (*buffer_count)++; if (*buffer_count == 10) { /* Sleep after the last buffer was received, in order * to keep a reference to stream while the main loop * ends. If the main is able to unref stream while * this signal callback is still waiting, stream will * be finalized in its stream thread contex (because * g_signal_emit holds a reference to stream), leading * to a deadlock. */ sleep (1); } arv_stream_push_buffer (stream, buffer); } } static void stream_test (void) { ArvStream *stream; size_t payload; unsigned buffer_count = 0; unsigned i; stream = arv_camera_create_stream (camera, NULL, NULL); g_assert (ARV_IS_STREAM (stream)); payload = arv_camera_get_payload (camera); for (i = 0; i < 5; i++) arv_stream_push_buffer (stream, arv_buffer_new (payload, NULL)); g_signal_connect (stream, "new-buffer", G_CALLBACK (new_buffer_cb), &buffer_count); arv_stream_set_emit_signals (stream, TRUE); arv_camera_start_acquisition (camera); while (buffer_count < 10) usleep (1000); arv_camera_stop_acquisition (camera); /* The following will block until the signal callback returns * which avoids a race and possible deadlock. */ arv_stream_set_emit_signals (stream, FALSE); g_clear_object (&stream); /* For actually testing the deadlock condition (see comment in * new_buffer_cb), one must wait a bit before leaving this test, * because otherwise the stream thread will be killed while sleeping. */ sleep (2); } int main (int argc, char *argv[]) { ArvGvFakeCamera *simulator; int result; g_test_init (&argc, &argv, NULL); arv_set_fake_camera_genicam_filename (GENICAM_FILENAME); simulator = arv_gv_fake_camera_new ("lo"); arv_gv_fake_camera_start (simulator); camera = arv_camera_new ("Aravis-GV01"); g_assert (ARV_IS_CAMERA (camera)); g_test_add_func ("/fakegv/device_registers", register_test); g_test_add_func ("/fakegv/acquisition", acquisition_test); g_test_add_func ("/fakegv/stream", stream_test); result = g_test_run(); g_object_unref (camera); arv_gv_fake_camera_stop (simulator); g_object_unref (simulator); arv_shutdown (); return result; } aravis-ARAVIS_0_6_0/tests/genicam.c000066400000000000000000000554531334570641500171460ustar00rootroot00000000000000#include #include #include #define ARAVIS_COMPILATION #include "../src/arvbufferprivate.h" typedef struct { const char *name; GType value_type; } NodeTypes; NodeTypes node_value_types[] = { {"RWFloat", G_TYPE_DOUBLE}, {"P_RWFloat_Min", G_TYPE_DOUBLE}, {"P_RWFloat_Max", G_TYPE_DOUBLE}, {"P_RWFloat_Inc", G_TYPE_DOUBLE}, {"P_RWFloat", G_TYPE_DOUBLE}, {"RWBoolean", G_TYPE_BOOLEAN}, {"P_RWBoolean", G_TYPE_BOOLEAN}, {"RWInteger", G_TYPE_INT64}, {"P_RWInteger", G_TYPE_INT64}, {"P_RWInteger_Min", G_TYPE_INT64}, {"P_RWInteger_Max", G_TYPE_INT64}, {"P_RWInteger_Inc", G_TYPE_INT64}, {"Enumeration", G_TYPE_INT64}, {"EnumerationValue", G_TYPE_INT64}, {"IntRegisterA", G_TYPE_INT64}, {"IntRegisterB", G_TYPE_INT64}, {"IntSwissKnifeTest", G_TYPE_INT64}, {"DeviceUserID", G_TYPE_STRING} }; static void node_value_type_test (void) { ArvDevice *device; ArvGc *genicam; ArvGcNode *node; int i; device = arv_fake_device_new ("TEST0"); g_assert (ARV_IS_FAKE_DEVICE (device)); genicam = arv_device_get_genicam (device); g_assert (ARV_IS_GC (genicam)); for (i = 0; i < G_N_ELEMENTS (node_value_types); i++) { node = arv_gc_get_node (genicam, node_value_types[i].name); g_assert (arv_gc_feature_node_get_value_type (ARV_GC_FEATURE_NODE (node)) == node_value_types[i].value_type); } g_object_unref (device); } static void integer_test (void) { ArvDevice *device; ArvGc *genicam; ArvGcNode *node; gint64 v_int64; const char *v_string; device = arv_fake_device_new ("TEST0"); g_assert (ARV_IS_FAKE_DEVICE (device)); genicam = arv_device_get_genicam (device); g_assert (ARV_IS_GC (genicam)); node = arv_gc_get_node (genicam, "RWInteger"); g_assert (ARV_IS_GC_INTEGER_NODE (node)); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 1); v_int64 = arv_gc_integer_get_min (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, -10); v_int64 = arv_gc_integer_get_max (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 10); v_int64 = arv_gc_integer_get_inc (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 2); v_string = arv_gc_feature_node_get_value_as_string (ARV_GC_FEATURE_NODE (node), NULL); g_assert_cmpstr (v_string, ==, "1"); arv_gc_integer_set_value (ARV_GC_INTEGER (node), 2, NULL); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 2); node = arv_gc_get_node (genicam, "P_RWInteger"); g_assert (ARV_IS_GC_INTEGER_NODE (node)); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 2); v_int64 = arv_gc_integer_get_min (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, -20); v_int64 = arv_gc_integer_get_max (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 20); v_int64 = arv_gc_integer_get_inc (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 3); g_object_unref (device); } static void indexed_test (void) { ArvDevice *device; ArvGc *genicam; ArvGcNode *node; ArvGcNode *selector; gint64 v_int64; double v_double; device = arv_fake_device_new ("TEST0"); g_assert (ARV_IS_FAKE_DEVICE (device)); genicam = arv_device_get_genicam (device); g_assert (ARV_IS_GC (genicam)); node = arv_gc_get_node (genicam, "Table"); g_assert (ARV_IS_GC_INTEGER_NODE (node)); selector = arv_gc_get_node (genicam, "TableSelector"); g_assert (ARV_IS_GC_INTEGER_NODE (selector)); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 200); arv_gc_integer_set_value (ARV_GC_INTEGER (node), 150, NULL); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 150); arv_gc_integer_set_value (ARV_GC_INTEGER (selector), -1, NULL); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 600); arv_gc_integer_set_value (ARV_GC_INTEGER (selector), 10, NULL); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 100); arv_gc_integer_set_value (ARV_GC_INTEGER (selector), 20, NULL); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 150); node = arv_gc_get_node (genicam, "Multiplexer"); g_assert (ARV_IS_GC_INTEGER_NODE (node)); selector = arv_gc_get_node (genicam, "MultiplexerSelector"); g_assert (ARV_IS_GC_INTEGER_NODE (selector)); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (selector), NULL); g_assert_cmpint (v_int64, ==, 20); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 200); arv_gc_integer_set_value (ARV_GC_INTEGER (node), 150, NULL); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 150); arv_gc_integer_set_value (ARV_GC_INTEGER (selector), -1, NULL); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 600); arv_gc_integer_set_value (ARV_GC_INTEGER (selector), 10, NULL); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 100); arv_gc_integer_set_value (ARV_GC_INTEGER (selector), 20, NULL); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 150); node = arv_gc_get_node (genicam, "FloatTable"); g_assert (ARV_IS_GC_FLOAT_NODE (node)); selector = arv_gc_get_node (genicam, "FloatTableSelector"); g_assert (ARV_IS_GC_INTEGER_NODE (selector)); v_double = arv_gc_float_get_value (ARV_GC_FLOAT (node), NULL); g_assert_cmpfloat (v_double, ==, 200.2); arv_gc_float_set_value (ARV_GC_FLOAT (node), 150.15, NULL); v_double = arv_gc_float_get_value (ARV_GC_FLOAT (node), NULL); g_assert_cmpfloat (v_double, ==, 150.15); arv_gc_integer_set_value (ARV_GC_INTEGER (selector), -1, NULL); v_double = arv_gc_float_get_value (ARV_GC_FLOAT (node), NULL); g_assert_cmpfloat (v_double, ==, 600.6); arv_gc_integer_set_value (ARV_GC_INTEGER (selector), 10, NULL); v_double = arv_gc_float_get_value (ARV_GC_FLOAT (node), NULL); g_assert_cmpfloat (v_double, ==, 100.1); arv_gc_integer_set_value (ARV_GC_INTEGER (selector), 20, NULL); v_double = arv_gc_float_get_value (ARV_GC_FLOAT (node), NULL); g_assert_cmpint (v_double, ==, 150.15); node = arv_gc_get_node (genicam, "FloatMultiplexer"); g_assert (ARV_IS_GC_FLOAT_NODE (node)); selector = arv_gc_get_node (genicam, "FloatMultiplexerSelector"); g_assert (ARV_IS_GC_INTEGER_NODE (selector)); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (selector), NULL); g_assert_cmpint (v_int64, ==, 20); v_double = arv_gc_float_get_value (ARV_GC_FLOAT (node), NULL); g_assert_cmpfloat (v_double, ==, 200.2); arv_gc_float_set_value (ARV_GC_FLOAT (node), 150.15, NULL); v_double = arv_gc_float_get_value (ARV_GC_FLOAT (node), NULL); g_assert_cmpfloat (v_double, ==, 150.15); arv_gc_integer_set_value (ARV_GC_INTEGER (selector), -1, NULL); v_double = arv_gc_float_get_value (ARV_GC_FLOAT (node), NULL); g_assert_cmpfloat (v_double, ==, 600.6); arv_gc_integer_set_value (ARV_GC_INTEGER (selector), 10, NULL); v_double = arv_gc_float_get_value (ARV_GC_FLOAT (node), NULL); g_assert_cmpfloat (v_double, ==, 100.1); arv_gc_integer_set_value (ARV_GC_INTEGER (selector), 20, NULL); v_double = arv_gc_float_get_value (ARV_GC_FLOAT (node), NULL); g_assert_cmpfloat (v_double, ==, 150.15); g_object_unref (device); } static void boolean_test (void) { ArvDevice *device; ArvGc *genicam; ArvGcNode *node; ArvGcNode *node_b; gboolean v_boolean; const char *v_string; gint64 v_int64; device = arv_fake_device_new ("TEST0"); g_assert (ARV_IS_FAKE_DEVICE (device)); genicam = arv_device_get_genicam (device); g_assert (ARV_IS_GC (genicam)); node = arv_gc_get_node (genicam, "RWBoolean"); g_assert (ARV_IS_GC_BOOLEAN (node)); g_assert (ARV_IS_GC_INTEGER (node)); v_boolean = arv_gc_boolean_get_value (ARV_GC_BOOLEAN (node), NULL); g_assert_cmpint (v_boolean, ==, TRUE); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 1); v_string = arv_gc_feature_node_get_value_as_string (ARV_GC_FEATURE_NODE (node), NULL); g_assert_cmpstr (v_string, ==, "true"); arv_gc_boolean_set_value (ARV_GC_BOOLEAN (node), 0, NULL); v_boolean = arv_gc_boolean_get_value (ARV_GC_BOOLEAN (node), NULL); g_assert_cmpint (v_boolean, ==, FALSE); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 0); v_string = arv_gc_feature_node_get_value_as_string (ARV_GC_FEATURE_NODE (node), NULL); g_assert_cmpstr (v_string, ==, "false"); node = arv_gc_get_node (genicam, "P_RWBoolean"); g_assert (ARV_IS_GC_BOOLEAN (node)); v_boolean = arv_gc_boolean_get_value (ARV_GC_BOOLEAN (node), NULL); g_assert_cmpint (v_boolean, ==, TRUE); node_b = arv_gc_get_node (genicam, "RWBooleanValue"); g_assert (ARV_IS_GC_INTEGER (node_b)); arv_gc_integer_set_value (ARV_GC_INTEGER (node_b), 42, NULL); v_boolean = arv_gc_boolean_get_value (ARV_GC_BOOLEAN (node), NULL); g_assert_cmpint (v_boolean, ==, FALSE); g_object_unref (device); } static void float_test (void) { ArvDevice *device; ArvGc *genicam; ArvGcNode *node; double v_double; const char *v_string; device = arv_fake_device_new ("TEST0"); g_assert (ARV_IS_FAKE_DEVICE (device)); genicam = arv_device_get_genicam (device); g_assert (ARV_IS_GC (genicam)); node = arv_gc_get_node (genicam, "RWFloat"); g_assert (ARV_IS_GC_FLOAT_NODE (node)); v_double = arv_gc_float_get_value (ARV_GC_FLOAT (node), NULL); g_assert_cmpfloat (v_double, ==, 0.1); v_double = arv_gc_float_get_min (ARV_GC_FLOAT (node), NULL); g_assert_cmpfloat (v_double, ==, -10.0); v_double = arv_gc_float_get_max (ARV_GC_FLOAT (node), NULL); g_assert_cmpfloat (v_double, ==, 10.0); v_double = arv_gc_float_get_inc (ARV_GC_FLOAT (node), NULL); g_assert_cmpfloat (v_double, ==, 2.0); v_string = arv_gc_feature_node_get_value_as_string (ARV_GC_FEATURE_NODE (node), NULL); g_assert_cmpstr (v_string, ==, "0.1"); arv_gc_float_set_value (ARV_GC_FLOAT (node), 0.2, NULL); v_double = arv_gc_float_get_value (ARV_GC_FLOAT (node), NULL); g_assert_cmpfloat (v_double, ==, 0.2); node = arv_gc_get_node (genicam, "P_RWFloat"); g_assert (ARV_IS_GC_FLOAT_NODE (node)); v_double = arv_gc_float_get_value (ARV_GC_FLOAT (node), NULL); g_assert_cmpfloat (v_double, ==, 0.2); v_double = arv_gc_float_get_min (ARV_GC_FLOAT (node), NULL); g_assert_cmpfloat (v_double, ==, -20.0); v_double = arv_gc_float_get_max (ARV_GC_FLOAT (node), NULL); g_assert_cmpfloat (v_double, ==, 20.0); v_double = arv_gc_float_get_inc (ARV_GC_FLOAT (node), NULL); g_assert_cmpfloat (v_double, ==, 3.0); g_object_unref (device); } static void enumeration_test (void) { ArvDevice *device; ArvGc *genicam; ArvGcNode *node; gint64 v_int64; gint64 *values; guint n_values; const char *v_string; device = arv_fake_device_new ("TEST0"); g_assert (ARV_IS_FAKE_DEVICE (device)); genicam = arv_device_get_genicam (device); g_assert (ARV_IS_GC (genicam)); node = arv_gc_get_node (genicam, "Enumeration"); g_assert (ARV_IS_GC_ENUMERATION (node)); g_assert (ARV_IS_GC_INTEGER (node)); g_assert (ARV_IS_GC_STRING (node)); v_int64 = arv_gc_enumeration_get_int_value (ARV_GC_ENUMERATION (node), NULL); g_assert_cmpint (v_int64, ==, 0); values = arv_gc_enumeration_get_available_int_values (ARV_GC_ENUMERATION (node), &n_values, NULL); g_assert_cmpint (n_values, ==, 2); g_assert (values != NULL); g_free (values); arv_gc_enumeration_set_string_value (ARV_GC_ENUMERATION (node), "Entry1", NULL); v_int64 = arv_gc_enumeration_get_int_value (ARV_GC_ENUMERATION (node), NULL); g_assert_cmpint (v_int64, ==, 1); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 1); v_string = arv_gc_string_get_value (ARV_GC_STRING (node), NULL); g_assert_cmpstr (v_string, ==, "Entry1"); arv_gc_string_set_value (ARV_GC_STRING (node), "Entry0", NULL); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 0); v_string = arv_gc_string_get_value (ARV_GC_STRING (node), NULL); g_assert_cmpstr (v_string, ==, "Entry0"); v_int64 = arv_gc_string_get_max_length (ARV_GC_STRING (node), NULL); g_assert_cmpint (v_int64, ==, strlen ("EntryNotImplemented")); g_object_unref (device); } static void swiss_knife_test (void) { ArvDevice *device; ArvGc *genicam; ArvGcNode *node; gint64 value; device = arv_fake_device_new ("TEST0"); g_assert (ARV_IS_FAKE_DEVICE (device)); genicam = arv_device_get_genicam (device); g_assert (ARV_IS_GC (genicam)); node = arv_gc_get_node (genicam, "IntSwissKnifeTest"); g_assert (ARV_IS_GC_SWISS_KNIFE (node)); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (value, ==, 0x1234); node = arv_gc_get_node (genicam, "IntSwissKnifeTestEntity"); g_assert (ARV_IS_GC_SWISS_KNIFE (node)); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (value, ==, 0x10305070); node = arv_gc_get_node (genicam, "IntSwissKnifeTestEntity2"); g_assert (ARV_IS_GC_SWISS_KNIFE (node)); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (value, ==, 3); node = arv_gc_get_node (genicam, "IntSwissKnifeBug699228"); g_assert (ARV_IS_GC_SWISS_KNIFE (node)); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (value, ==, 4); node = arv_gc_get_node (genicam, "IntSwissKnifeTestSubAndConstant"); g_assert (ARV_IS_GC_SWISS_KNIFE (node)); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (value, ==, 140); g_object_unref (device); } static void converter_test (void) { ArvDevice *device; ArvGc *genicam; ArvGcNode *node; double v_double; gint64 v_int64; device = arv_fake_device_new ("TEST0"); g_assert (ARV_IS_FAKE_DEVICE (device)); genicam = arv_device_get_genicam (device); g_assert (ARV_IS_GC (genicam)); node = arv_gc_get_node (genicam, "Converter"); g_assert (ARV_IS_GC_CONVERTER (node)); v_double = arv_gc_float_get_value (ARV_GC_FLOAT (node), NULL); g_assert_cmpfloat (v_double, ==, 200.0); arv_gc_feature_node_set_value_from_string (ARV_GC_FEATURE_NODE (node), "100.0", NULL); v_double = arv_gc_float_get_value (ARV_GC_FLOAT (node), NULL); g_assert_cmpfloat (v_double, ==, 100.0); node = arv_gc_get_node (genicam, "IntConverter"); g_assert (ARV_IS_GC_CONVERTER (node)); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 5); arv_gc_feature_node_set_value_from_string (ARV_GC_FEATURE_NODE (node), "100", NULL); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 100); node = arv_gc_get_node (genicam, "Enumeration"); g_assert (ARV_IS_GC_ENUMERATION (node)); arv_gc_integer_set_value (ARV_GC_INTEGER (node), 1, NULL); node = arv_gc_get_node (genicam, "ConverterEnumeration"); g_assert (ARV_IS_GC_CONVERTER (node)); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 5); node = arv_gc_get_node (genicam, "IntConverterTestSubAndConstant"); g_assert (ARV_IS_GC_CONVERTER (node)); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 10000); arv_gc_integer_set_value (ARV_GC_INTEGER (node), 100, NULL); v_int64 = arv_gc_integer_get_value (ARV_GC_INTEGER (node), NULL); g_assert_cmpint (v_int64, ==, 1000); g_object_unref (device); } static void register_test (void) { ArvDevice *device; ArvGc *genicam; ArvGcNode *node_a; ArvGcNode *node_b; ArvGcNode *node_c; ArvGcNode *node_sc; gint64 value; device = arv_fake_device_new ("TEST0"); g_assert (ARV_IS_FAKE_DEVICE (device)); genicam = arv_device_get_genicam (device); g_assert (ARV_IS_GC (genicam)); node_a = arv_gc_get_node (genicam, "IntRegisterA"); g_assert (ARV_IS_GC_REGISTER (node_a)); value = arv_gc_register_get_address (ARV_GC_REGISTER (node_a), NULL); g_assert_cmpint (value, ==, 0x1050); node_b = arv_gc_get_node (genicam, "IntRegisterB"); g_assert (ARV_IS_GC_REGISTER (node_b)); value = arv_gc_register_get_address (ARV_GC_REGISTER (node_b), NULL); g_assert_cmpint (value, ==, 0x20ff); node_c = arv_gc_get_node (genicam, "IntRegisterC"); g_assert (ARV_IS_GC_REGISTER (node_c)); arv_gc_integer_set_value (ARV_GC_INTEGER (node_c), 0, NULL); node_sc = arv_gc_get_node (genicam, "IntSignedRegisterC"); g_assert (ARV_IS_GC_REGISTER (node_sc)); arv_gc_integer_set_value (ARV_GC_INTEGER (node_sc), -1, NULL); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node_sc), NULL); g_assert_cmpint (value, ==, -1); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node_c), NULL); g_assert_cmpint (value, ==, 0x00000000ffffffff); arv_gc_integer_set_value (ARV_GC_INTEGER (node_sc), 0x7fffffff, NULL); value = arv_gc_integer_get_value (ARV_GC_INTEGER (node_sc), NULL); g_assert_cmpint (value, ==, 0x7fffffff); g_object_unref (device); } GRegex *arv_gv_device_get_url_regex (void); static void url_test (void) { char **tokens; tokens = g_regex_split (arv_gv_device_get_url_regex (), "Local:Basler_Ace_GigE_e7c9b87e_Version_3_3.zip;c0000000;10cca", 0); g_assert_cmpint (g_strv_length (tokens), ==, 6); g_assert_cmpstr (tokens[0], ==, ""); g_assert_cmpstr (tokens[1], ==, "Local:"); g_assert_cmpstr (tokens[2], ==, "Basler_Ace_GigE_e7c9b87e_Version_3_3.zip"); g_assert_cmpstr (tokens[3], ==, "c0000000"); g_assert_cmpstr (tokens[4], ==, "10cca"); g_strfreev (tokens); tokens = g_regex_split (arv_gv_device_get_url_regex (), "Local:C4_2040_GigE_1.0.0.zip;0x8C400904;0x4D30", 0); g_assert_cmpint (g_strv_length (tokens), ==, 6); g_assert_cmpstr (tokens[0], ==, ""); g_assert_cmpstr (tokens[1], ==, "Local:"); g_assert_cmpstr (tokens[2], ==, "C4_2040_GigE_1.0.0.zip"); g_assert_cmpstr (tokens[3], ==, "8C400904"); g_assert_cmpstr (tokens[4], ==, "4D30"); g_strfreev (tokens); } static void mandatory_test (void) { ArvDevice *device; ArvGc *genicam; ArvGcNode *node; device = arv_fake_device_new ("TEST0"); g_assert (ARV_IS_FAKE_DEVICE (device)); genicam = arv_device_get_genicam (device); g_assert (ARV_IS_GC (genicam)); node = arv_gc_get_node (genicam, "TLParamsLocked"); g_assert (ARV_IS_GC_INTEGER (node)); g_object_unref (device); } typedef struct __attribute__((__packed__)) { guint32 id; guint32 size; } ArvChunkInfos; static ArvBuffer * create_buffer_with_chunk_data (void) { ArvBuffer *buffer; ArvChunkInfos *chunk_infos; char *data; size_t size; guint32 *int_value; guint offset; double float_value; int i; size = 64 + 8 + 64 + 8 + 4 * sizeof (ArvChunkInfos); buffer = arv_buffer_new (size, NULL); buffer->priv->payload_type = ARV_BUFFER_PAYLOAD_TYPE_CHUNK_DATA; buffer->priv->status = ARV_BUFFER_STATUS_SUCCESS; data = (char *) arv_buffer_get_data (buffer, &size); memset ((char *) data, '\0', size); offset = size - sizeof (ArvChunkInfos); chunk_infos = (ArvChunkInfos *) &data[offset]; chunk_infos->id = GUINT32_TO_BE (0x12345678); chunk_infos->size = GUINT32_TO_BE (8); int_value = (guint32 *) &data[offset - 8]; *int_value = GUINT32_TO_BE (0x11223344); offset -= 8 + sizeof (ArvChunkInfos); chunk_infos = (ArvChunkInfos *) &data[offset]; chunk_infos->id = GUINT32_TO_BE (0x87654321); chunk_infos->size = GUINT32_TO_BE (64); memcpy ((char *) &data[offset - 64], "Hello" ,sizeof ("Hello")); offset -= 64 + sizeof (ArvChunkInfos); chunk_infos = (ArvChunkInfos *) &data[offset]; chunk_infos->id = GUINT32_TO_BE (0x12345679); chunk_infos->size = GUINT32_TO_BE (8); float_value = 1.1; for (i = 0; i < sizeof (float_value); i++) data[offset - i - 1] = ((char *) &float_value)[i]; offset -= 8 + sizeof (ArvChunkInfos); chunk_infos = (ArvChunkInfos *) &data[offset]; chunk_infos->id = GUINT32_TO_BE (0x44444444); chunk_infos->size = GUINT32_TO_BE (64); g_assert (offset == 64); #if 0 { GString *string; string= g_string_new (""); arv_g_string_append_hex_dump (string, data, size); printf ("%s\n", string->str); g_string_free (string, TRUE); } #endif return buffer; } static void chunk_data_test (void) { ArvDevice *device; ArvChunkParser *parser; ArvBuffer *buffer; ArvGc *genicam; guint32 int_value; double float_value; const char *chunk_data; const char *data; const char *string_value; size_t size; size_t chunk_data_size; device = arv_fake_device_new ("TEST0"); g_assert (ARV_IS_FAKE_DEVICE (device)); parser = arv_device_create_chunk_parser (device); g_assert (ARV_IS_CHUNK_PARSER (parser)); g_object_get (parser, "genicam", &genicam, NULL); g_object_unref (genicam); buffer = create_buffer_with_chunk_data (); g_assert (ARV_IS_BUFFER (buffer)); data = arv_buffer_get_data (buffer, &size); chunk_data = arv_buffer_get_chunk_data (buffer, 0x12345678, &chunk_data_size); g_assert (chunk_data != NULL); g_assert_cmpint (chunk_data_size, ==, 8); g_assert_cmpint (chunk_data - data, ==, 64 + 64 + 8 + 3 * sizeof (ArvChunkInfos)); chunk_data = arv_buffer_get_chunk_data (buffer, 0x12345679, &chunk_data_size); g_assert (chunk_data != NULL); g_assert_cmpint (chunk_data_size, ==, 8); g_assert_cmpint (chunk_data - data, ==, 64 + sizeof (ArvChunkInfos)); chunk_data = arv_buffer_get_chunk_data (buffer, 0x87654321, &chunk_data_size); g_assert (chunk_data != NULL); g_assert_cmpint (chunk_data_size, ==, 64); g_assert_cmpint (chunk_data - data, ==, 64 + 8 + 2 * sizeof (ArvChunkInfos)); chunk_data = arv_buffer_get_chunk_data (buffer, 0x01020304, &chunk_data_size); g_assert (chunk_data == NULL); g_assert_cmpint (chunk_data_size, ==, 0); int_value = arv_chunk_parser_get_integer_value (parser, buffer, "ChunkInt"); g_assert_cmpint (int_value, ==, 0x11223344); float_value = arv_chunk_parser_get_float_value (parser, buffer, "ChunkFloat"); g_assert_cmpfloat (float_value, ==, 1.1); string_value = arv_chunk_parser_get_string_value (parser, buffer, "ChunkString"); g_assert_cmpstr (string_value, ==, "Hello"); arv_chunk_parser_get_integer_value (parser, buffer, "Dummy"); arv_chunk_parser_get_float_value (parser, buffer, "Dummy"); arv_chunk_parser_get_string_value (parser, buffer, "Dummy"); g_object_unref (buffer); g_object_unref (parser); g_object_unref (device); } int main (int argc, char *argv[]) { int result; g_test_init (&argc, &argv, NULL); arv_set_fake_camera_genicam_filename (GENICAM_FILENAME); g_test_add_func ("/genicam/value-type", node_value_type_test); g_test_add_func ("/genicam/integer", integer_test); g_test_add_func ("/genicam/boolean", boolean_test); g_test_add_func ("/genicam/float", float_test); g_test_add_func ("/genicam/enumeration", enumeration_test); g_test_add_func ("/genicam/swissknife", swiss_knife_test); g_test_add_func ("/genicam/converter", converter_test); g_test_add_func ("/genicam/register", register_test); g_test_add_func ("/genicam/url", url_test); g_test_add_func ("/genicam/mandatory", mandatory_test); g_test_add_func ("/genicam/chunk-data", chunk_data_test); g_test_add_func ("/genicam/indexed", indexed_test); result = g_test_run(); arv_shutdown (); return result; } aravis-ARAVIS_0_6_0/tests/js/000077500000000000000000000000001334570641500157775ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/tests/js/arv-camera-test.js000066400000000000000000000034041334570641500213310ustar00rootroot00000000000000#!/usr/bin/env gjs /* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /* If you have installed aravis in a non standard location, you may need to make GI_TYPELIB_PATH point to the correct location. For example: export GI_TYPELIB_PATH=$GI_TYPELIB_PATH:/opt/bin/lib/girepositry-1.0/ You may also have to give the path to libaravis.so, using LD_PRELOAD or LD_LIBRARY_PATH. */ const GLib = imports.gi.GLib; const Aravis = imports.gi.Aravis; let camera = Aravis.Camera.new (null); camera.set_region (0,0,128,128); camera.set_pixel_format (Aravis.PIXEL_FORMAT_MONO_8); camera.set_frame_rate (10.0); let [x,y,width,height] = camera.get_region (); let payload = camera.get_payload (); log (payload); let stream = camera.create_stream (null, null); for (var i = 0; i < 100; i++) stream.push_buffer (Aravis.Buffer.new_allocate (payload)); camera.start_acquisition (); let buffer = stream.pop_buffer (); log (buffer); camera.stop_acquisition (); aravis-ARAVIS_0_6_0/tests/js/arv-evaluator-test.js000066400000000000000000000031331334570641500221020ustar00rootroot00000000000000#!/usr/bin/env gjs /* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /* If you have installed aravis in a non standard location, you may need to make GI_TYPELIB_PATH point to the correct location. For example: export GI_TYPELIB_PATH=$GI_TYPELIB_PATH:/opt/bin/lib/girepositry-1.0/ You may also have to give the path to libaravis.so, using LD_PRELOAD or LD_LIBRARY_PATH. */ const GLib = imports.gi.GLib; const Aravis = imports.gi.Aravis; let evaluator = Aravis.Evaluator.new ("1+2*4.4"); let int_result = evaluator.evaluate_as_int64 (); let dbl_result = evaluator.evaluate_as_double (); log (int_result); log (dbl_result); evaluator.set_expression ("VAR+10"); evaluator.set_double_variable ("VAR", 1.2); let dbl_result = evaluator.evaluate_as_double (); log (dbl_result); aravis-ARAVIS_0_6_0/tests/js/arv-fake-test.js000066400000000000000000000030741334570641500210120ustar00rootroot00000000000000#!/usr/bin/env gjs /* Aravis - Digital camera library * * Copyright © 2009-2010 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ /* If you have installed aravis in a non standard location, you may need to make GI_TYPELIB_PATH point to the correct location. For example: export GI_TYPELIB_PATH=$GI_TYPELIB_PATH:/opt/bin/lib/girepositry-1.0/ You may also have to give the path to libaravis.so, using LD_PRELOAD or LD_LIBRARY_PATH. */ const GLib = imports.gi.GLib; const Aravis = imports.gi.Aravis; let device = Aravis.FakeDevice.new ("TEST0"); let genicam = device.get_genicam (); let payload = genicam.get_node ("PayloadSize").get_value (); let width = genicam.get_node ("SensorWidth").get_value (); let height = genicam.get_node ("SensorHeight").get_value (); log (payload); log (width); log (height); aravis-ARAVIS_0_6_0/tests/js/launch000077500000000000000000000001541334570641500171770ustar00rootroot00000000000000#!/bin/sh export GI_TYPELIB_PATH=$GI_TYPELIB_PATH:../../src export LD_LIBRARY_PATH=../../src/.libs gjs $* aravis-ARAVIS_0_6_0/tests/loadhttptest.c000066400000000000000000000020711334570641500202460ustar00rootroot00000000000000#include #include #include #include #include int main (int argc, char **argv) { GFile *file; GFileInputStream *stream; const char *filename; char *genicam = NULL; char **tokens; gsize len = 0; if (argc != 2) { printf ("Usage: load-http-test \n"); return EXIT_FAILURE; } filename = argv[1]; tokens = g_regex_split (arv_gv_device_get_url_regex (), filename, 0); if (tokens[0] != NULL && tokens[1] != NULL) { if (g_ascii_strcasecmp (tokens[1], "http:") == 0) { file = g_file_new_for_uri (filename); stream = g_file_read (file, NULL, NULL); if(stream) { GDataInputStream *data_stream; data_stream = g_data_input_stream_new (G_INPUT_STREAM (stream)); genicam = g_data_input_stream_read_upto (data_stream, "", 0, &len, NULL, NULL); g_object_unref (data_stream); g_object_unref (stream); } g_object_unref (file); } } g_strfreev (tokens); printf ("size = %lu\n", len); printf ("%s\n", genicam != NULL ? genicam : "NULL"); g_free (genicam); return EXIT_SUCCESS; } aravis-ARAVIS_0_6_0/tests/meson.build000066400000000000000000000027021334570641500175260ustar00rootroot00000000000000tests = [ ['evaluator', []], ['buffer', []], ['misc', []], ['fake', ['-DGENICAM_FILENAME="@0@/src/arv-fake-camera.xml"'.format (meson.source_root ())]], ['fakegv', ['-DGENICAM_FILENAME="@0@/src/arv-fake-camera.xml"'.format (meson.source_root ())]], ['genicam', ['-DGENICAM_FILENAME="@0@/tests/data/genicam.xml"'.format (meson.source_root ())]] ] foreach t: tests exe = executable (t[0], '@0@.c'.format (t[0]), c_args: [t[1]], link_with: aravis_library, dependencies: aravis_dependencies, include_directories: [configuration_inc, library_inc]) test (t[0], exe) endforeach examples = [ ['arv-device-test', 'arvdevicetest.c'], ['arv-genicam-test', 'arvgenicamtest.c'], ['arv-evaluator-test', 'arvevaluatortest.c'], ['arv-zip-test', 'arvziptest.c'], ['arv-camera-test', 'arvcameratest.c'], ['arv-chunk-parser-test', 'arvchunkparsertest.c'], ['arv-heartbeat-test', 'arvheartbeattest.c'], ['arv-acquisition-test', 'arvacquisitiontest.c'], ['arv-example', 'arvexample.c'], ['arv-auto-packet-size-test', 'arvautopacketsizetest.c'], ['arv-device-scan-test', 'arvdevicescantest.c'], ['time-test', 'timetest.c'], ['realtime-test', 'realtimetest.c'], ['load-http-test', 'loadhttptest.c'], ['cpp-test', 'cpp.cc'] ] foreach example: examples exe = executable (example[0], example[1], link_with: aravis_library, dependencies: aravis_dependencies, include_directories: [configuration_inc, library_inc]) endforeach aravis-ARAVIS_0_6_0/tests/misc.c000066400000000000000000000120771334570641500164710ustar00rootroot00000000000000#include #include #include #include #if !ARAVIS_CHECK_VERSION (ARAVIS_MAJOR_VERSION, ARAVIS_MINOR_VERSION, ARAVIS_MICRO_VERSION) #error #endif static void unaligned_from_le_ptr_test (void) { char test[]= {'\x11', '\x22', '\x33', '\x44','\x55', '\x66', '\x77', '\x88', '\x99', '\xaa', '\xbb', '\xcc'}; guint32 v_uint32; guint16 v_uint16; v_uint32 = ARV_GUINT32_FROM_LE_PTR (&test[0], 0); g_assert_cmpuint (v_uint32, ==, 0x44332211); v_uint32 = ARV_GUINT32_FROM_LE_PTR (&test[1], 0); g_assert_cmpuint (v_uint32, ==, 0x55443322); v_uint32 = ARV_GUINT32_FROM_LE_PTR (&test[2], 0); g_assert_cmpuint (v_uint32, ==, 0x66554433); v_uint32 = ARV_GUINT32_FROM_LE_PTR (&test[3], 0); g_assert_cmpuint (v_uint32, ==, 0x77665544); v_uint16 = ARV_GUINT16_FROM_LE_PTR (&test[0], 0); g_assert_cmpuint (v_uint16, ==, 0x2211); v_uint16 = ARV_GUINT16_FROM_LE_PTR (&test[1], 0); g_assert_cmpuint (v_uint16, ==, 0x3322); v_uint16 = ARV_GUINT16_FROM_LE_PTR (&test[2], 0); g_assert_cmpuint (v_uint16, ==, 0x4433); v_uint16 = ARV_GUINT16_FROM_LE_PTR (&test[3], 0); g_assert_cmpuint (v_uint16, ==, 0x5544); } #define ILLEGAL_CHARACTERS "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" \ "\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" \ " _-" #define REPLACEMENT_CHARACTER '-' struct { char *before; char *after; } strip_strings[] = { {"\n\tHello\r\nworld!\n\t", "Hello-world!"}, {"\n\tHello", "Hello"}, {"Hello\r\t", "Hello"}, {"Hello\rworld!", "Hello-world!"}, {"Hello\r- -_\rworld!", "Hello-world!"}, {"", ""}, {"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f", ""}, {"\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f", ""}, {"\r", ""}, {"\n\n", ""}, {"Hétéroclite", "Hétéroclite"} }; static void arv_str_strip_test (void) { unsigned i; char *string; for (i = 0; i < G_N_ELEMENTS (strip_strings); i++) { string = g_strdup (strip_strings[i].before); arv_str_strip (string, ILLEGAL_CHARACTERS, REPLACEMENT_CHARACTER); g_assert_cmpstr (string, ==, strip_strings[i].after); g_free (string); } string = g_strdup ("Hello\r\n world"); arv_str_strip (string, ILLEGAL_CHARACTERS, '\0'); g_assert_cmpstr (string, ==, "Helloworld"); g_free (string); g_assert (arv_str_strip (NULL, ILLEGAL_CHARACTERS, REPLACEMENT_CHARACTER) == NULL); g_assert (arv_str_strip (NULL, NULL, REPLACEMENT_CHARACTER) == NULL); } struct { char *uri; gboolean is_valid; } uris[] = { {"http://www.gnome/org", TRUE}, {"file:///file.txtx", TRUE}, {"", FALSE} }; static void arv_str_uri_test (void) { char *uri; unsigned i; gboolean success; for (i = 0; i < G_N_ELEMENTS (uris); i++) { success = arv_str_is_uri (uris[i].uri); g_assert (success == uris[i].is_valid); } uri = arv_str_to_uri ("http://www.gnome.org/test"); g_assert_cmpstr (uri, ==, "http://www.gnome.org/test"); g_free (uri); uri = arv_str_to_uri ("/test.txt"); g_assert_cmpstr (uri, ==, "file:///test.txt"); g_free (uri); uri = arv_str_to_uri ("test.txt"); g_assert (g_str_has_suffix (uri, "test.txt")); g_assert (g_str_has_prefix (uri, "file:///")); g_free (uri); } static void arv_str_parse_double_test (void) { gboolean success; char *test1 = "-10.0"; char *test2 = "+10.0"; char *test3 = "11.0a"; double value; success = arv_str_parse_double (&test1, &value); g_assert (success); g_assert_cmpfloat (value, ==, -10.0); g_assert_cmpint (test1[0], ==, '\0'); success = arv_str_parse_double (&test2, &value); g_assert (success); g_assert_cmpfloat (value, ==, 10.0); g_assert_cmpint (test2[0], ==, '\0'); success = arv_str_parse_double (&test3, &value); g_assert (success); g_assert_cmpfloat (value, ==, 11.0); g_assert_cmpint (test3[0], ==, 'a'); } static void arv_str_parse_double_list_test (void) { char *test1 = " -10.0 +20.0 "; double value[2]; unsigned n_values; n_values = arv_str_parse_double_list (&test1, 2, value); g_assert_cmpint (n_values, ==, 2); g_assert_cmpfloat (value[0], ==, -10.0); g_assert_cmpfloat (value[1], ==, 20.0); g_assert_cmpint (test1[0], ==, '\0'); } static void arv_vendor_alias_lookup_test (void) { const char *vendor_a = "The Imaging Source Europe GmbH"; const char *vendor_b = "Unknown Vendor"; const char *alias; alias = arv_vendor_alias_lookup (NULL); g_assert (alias == NULL); alias = arv_vendor_alias_lookup (vendor_a); g_assert_cmpstr (alias, == ,"TIS"); alias = arv_vendor_alias_lookup (vendor_b); g_assert (alias == vendor_b); } int main (int argc, char *argv[]) { int result; g_test_init (&argc, &argv, NULL); g_test_add_func ("/buffer/unaligned-from-le", unaligned_from_le_ptr_test); g_test_add_func ("/str/arv-str-strip", arv_str_strip_test); g_test_add_func ("/str/arv-str-uri", arv_str_uri_test); g_test_add_func ("/str/arv-str-parse-double", arv_str_parse_double_test); g_test_add_func ("/str/arv-str-parse-double-list", arv_str_parse_double_list_test); g_test_add_func ("/misc/arv-vendor-alias-lookup", arv_vendor_alias_lookup_test); result = g_test_run(); arv_shutdown (); return result; } aravis-ARAVIS_0_6_0/tests/python/000077500000000000000000000000001334570641500167045ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/tests/python/arv-buffer-test.py000066400000000000000000000013601334570641500222720ustar00rootroot00000000000000#!/usr/bin/env python # If you have installed aravis in a non standard location, you may need # to make GI_TYPELIB_PATH point to the correct location. For example: # # export GI_TYPELIB_PATH=$GI_TYPELIB_PATH:/opt/bin/lib/girepositry-1.0/ # # You may also have to give the path to libaravis.so, using LD_PRELOAD or # LD_LIBRARY_PATH. import sys import time from gi.repository import Aravis buffer_a = Aravis.Buffer.new_allocate (1024) buffer_b = Aravis.Buffer.new_allocate (1024) print "Buffer a refcount : %d" %(buffer_a.__grefcount__) print "Buffer a is preallocated : %d" %(buffer_a.is_preallocated) print "Buffer b refcount : %d" %(buffer_b.__grefcount__) print "Buffer b is preallocated : %d" %(buffer_b.is_preallocated) aravis-ARAVIS_0_6_0/tests/python/arv-camera-test.py000066400000000000000000000027141334570641500222550ustar00rootroot00000000000000#!/usr/bin/env python # If you have installed aravis in a non standard location, you may need # to make GI_TYPELIB_PATH point to the correct location. For example: # # export GI_TYPELIB_PATH=$GI_TYPELIB_PATH:/opt/bin/lib/girepositry-1.0/ # # You may also have to give the path to libaravis.so, using LD_PRELOAD or # LD_LIBRARY_PATH. import sys import time from gi.repository import Aravis Aravis.enable_interface ("Fake") try: if len(sys.argv) > 1: camera = Aravis.Camera.new (sys.argv[1]) else: camera = Aravis.Camera.new (None) except: print ("No camera found") exit () camera.set_region (0,0,128,128) camera.set_frame_rate (10.0) camera.set_pixel_format (Aravis.PIXEL_FORMAT_MONO_8) payload = camera.get_payload () [x,y,width,height] = camera.get_region () print "Camera vendor : %s" %(camera.get_vendor_name ()) print "Camera model : %s" %(camera.get_model_name ()) print "Camera id : %s" %(camera.get_device_id ()) print "ROI : %dx%d at %d,%d" %(width, height, x, y) print "Payload : %d" %(payload) print "Pixel format : %s" %(camera.get_pixel_format_as_string ()) stream = camera.create_stream (None, None) for i in range(0,10): stream.push_buffer (Aravis.Buffer.new_allocate (payload)) print "Start acquisition" camera.start_acquisition () print "Acquisition" for i in range(0,20): buffer = stream.pop_buffer () print buffer if buffer: stream.push_buffer (buffer) print "Stop acquisition" camera.stop_acquisition () aravis-ARAVIS_0_6_0/tests/python/arv-enum-test.py000066400000000000000000000011741334570641500217700ustar00rootroot00000000000000#!/usr/bin/env python # If you have installed aravis in a non standard location, you may need # to make GI_TYPELIB_PATH point to the correct location. For example: # # export GI_TYPELIB_PATH=$GI_TYPELIB_PATH:/opt/bin/lib/girepositry-1.0/ # # You may also have to give the path to libaravis.so, using LD_PRELOAD or # LD_LIBRARY_PATH. import gi gi.require_version ('Aravis', '0.2') from gi.repository import Aravis print Aravis.Auto print Aravis.Auto.OFF print Aravis.BufferStatus print Aravis.DebugLevel print Aravis.DomNodeType print Aravis.GvStreamPacketResend print Aravis.GvspPacketType print Aravis.PIXEL_FORMAT_MONO_8 aravis-ARAVIS_0_6_0/tests/python/arv-evaluator-test.py000066400000000000000000000012611334570641500230230ustar00rootroot00000000000000#!/usr/bin/env python # If you have installed aravis in a non standard location, you may need # to make GI_TYPELIB_PATH point to the correct location. For example: # # export GI_TYPELIB_PATH=$GI_TYPELIB_PATH:/opt/bin/lib/girepositry-1.0/ # # You may also have to give the path to libaravis.so, using LD_PRELOAD or # LD_LIBRARY_PATH. from gi.repository import Aravis evaluator = Aravis.Evaluator.new ("1+2*4.4") int_result = evaluator.evaluate_as_int64 () dbl_result = evaluator.evaluate_as_double () print int_result print dbl_result evaluator.set_expression ("VAR+10") evaluator.set_double_variable ("VAR", 1.2) dbl_result = evaluator.evaluate_as_double() print dbl_result aravis-ARAVIS_0_6_0/tests/python/arv-feature-test.py000066400000000000000000000012421334570641500224530ustar00rootroot00000000000000#!/usr/bin/env python # If you have installed aravis in a non standard location, you may need # to make GI_TYPELIB_PATH point to the correct location. For example: # # export GI_TYPELIB_PATH=$GI_TYPELIB_PATH:/opt/bin/lib/girepositry-1.0/ # # You may also have to give the path to libaravis.so, using LD_PRELOAD or # LD_LIBRARY_PATH. from gi.repository import Aravis camera = Aravis.Camera.new (None) device = camera.get_device () device.set_integer_feature_value ("Width", 1024) device.set_integer_feature_value ("Height", 1024) print "Width = %d" %(device.get_integer_feature_value ("Width")) print "Height = %d" %(device.get_integer_feature_value ("Height")) aravis-ARAVIS_0_6_0/tests/python/arv-genicam-test.py000066400000000000000000000012441334570641500224250ustar00rootroot00000000000000#!/usr/bin/env python # If you have installed aravis in a non standard location, you may need # to make GI_TYPELIB_PATH point to the correct location. For example: # # export GI_TYPELIB_PATH=$GI_TYPELIB_PATH:/opt/bin/lib/girepositry-1.0/ # # You may also have to give the path to libaravis.so, using LD_PRELOAD or # LD_LIBRARY_PATH. import sys import time from gi.repository import Aravis Aravis.enable_interface ("Fake") try: if len(sys.argv) > 1: camera = Aravis.Camera.new (sys.argv[1]) else: camera = Aravis.Camera.new (None) except: print ("No camera found") exit () device = camera.get_device () genicam = device.get_genicam_xml (); print genicam; aravis-ARAVIS_0_6_0/tests/python/arv-single-buffer-test.py000066400000000000000000000040171334570641500235530ustar00rootroot00000000000000#!/usr/bin/env python # If you have installed aravis in a non standard location, you may need # to make GI_TYPELIB_PATH point to the correct location. For example: # # export GI_TYPELIB_PATH=$GI_TYPELIB_PATH:/opt/bin/lib/girepositry-1.0/ # # You may also have to give the path to libaravis.so, using LD_PRELOAD or # LD_LIBRARY_PATH. import sys import time from gi.repository import Aravis # Hexadecimal dump code from http://www.alexonlinux.com/hex-dump-functions def DumpBuffer (buf, length, caption="", dest=sys.stdout): def GetPrintableChar(str): if str.isalpha(): return str else: return '.' dest.write('---------> %s <--------- (%d bytes)\n' % (caption, length)) dest.write(' +0 +4 +8 +c 0 4 8 c\n') i = 0 while i < length: if length - i > 16: l = 16 else: l = length - i dest.write('+%04x ' % i) s = ' '.join(["%02x" % ord(c) for c in buf[i:i + l]]) dest.write(s) sp = 49 - len(s) dest.write(' ' * sp) s = ''.join(["%c" % GetPrintableChar(c) for c in buf[i:i + l]]) dest.write(s) dest.write('\n') i = i + 16 Aravis.enable_interface ("Fake") try: if len(sys.argv) > 1: camera = Aravis.Camera.new (sys.argv[1]) else: camera = Aravis.Camera.new (None) except: print ("No camera found") exit () payload = camera.get_payload () [x,y,width,height] = camera.get_region () print "Camera vendor : %s" %(camera.get_vendor_name ()) print "Camera model : %s" %(camera.get_model_name ()) print "Camera id : %s" %(camera.get_device_id ()) print "ROI : %dx%d at %d,%d" %(width, height, x, y) print "Payload : %d" %(payload) print "Pixel format : %s" %(camera.get_pixel_format_as_string ()) stream = camera.create_stream (None, None) stream.push_buffer (Aravis.Buffer.new_allocate (payload)) print "Start acquisition" camera.start_acquisition () print "Acquisition" buffer = stream.pop_buffer () data = buffer.get_data () DumpBuffer (data, len(data), "Image buffer") print "Stop acquisition" camera.stop_acquisition () aravis-ARAVIS_0_6_0/tests/python/launch000077500000000000000000000001571334570641500201070ustar00rootroot00000000000000#!/bin/sh export GI_TYPELIB_PATH=$GI_TYPELIB_PATH:../../src export LD_LIBRARY_PATH=../../src/.libs python $* aravis-ARAVIS_0_6_0/tests/python/launch-dbg000077500000000000000000000002021334570641500206300ustar00rootroot00000000000000#!/bin/sh export GI_TYPELIB_PATH=$GI_TYPELIB_PATH:../../src export LD_LIBRARY_PATH=../../src/.libs gdb -ex run --args python $* aravis-ARAVIS_0_6_0/tests/realtimetest.c000066400000000000000000000110301334570641500202240ustar00rootroot00000000000000/*** Copyright 2009 Lennart Poettering Copyright 2010 David Henningsson Copyright 2014 Emmanuel Pacaud Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ***/ #include #include #include #include #include #include #include #include #define ARAVIS_COMPILATION #include <../src/arvrealtimeprivate.h> #ifndef SCHED_RESET_ON_FORK #define SCHED_RESET_ON_FORK 0x40000000 #endif #ifndef RLIMIT_RTTIME #define RLIMIT_RTTIME 15 #endif static void print_status(const char *t) { #ifndef __APPLE__ int ret; if ((ret = sched_getscheduler(0)) < 0) { fprintf(stderr, "sched_getscheduler() failed: %s\n", strerror(errno)); return; } printf("%s:\n" "\tSCHED_RESET_ON_FORK: %s\n", t, (ret & SCHED_RESET_ON_FORK) ? "yes" : "no"); if ((ret & ~SCHED_RESET_ON_FORK) == SCHED_RR) { struct sched_param param; if (sched_getparam(0, ¶m) < 0) { fprintf(stderr, "sched_getschedparam() failed: %s\n", strerror(errno)); return; } printf("\tSCHED_RR with priority %i\n", param.sched_priority); } else if ((ret & ~SCHED_RESET_ON_FORK) == SCHED_OTHER) { errno = 0; ret = getpriority(PRIO_PROCESS, 0); if (errno != 0) { fprintf(stderr, "getpriority() failed: %s\n", strerror(errno)); return; } printf("\tSCHED_OTHER with nice level: %i\n", ret); } else fprintf(stderr, "Neither SCHED_RR nor SCHED_OTHER.\n"); #else printf ("SCHED API not supported on OSX\n"); #endif } int main(int argc, char *argv[]) { GDBusConnection *bus; GError *error = NULL; int max_realtime_priority, min_nice_level; long long rttime_usec_max; struct rlimit rlim; bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); if (!G_IS_DBUS_CONNECTION (bus)) { fprintf (stderr, "Failed to connect to system bus: %s\n", error->message); g_error_free (error); return EXIT_FAILURE; } max_realtime_priority = arv_rtkit_get_max_realtime_priority (bus, &error); if (error != NULL) { fprintf (stderr, "Failed to get MaxRealtimePriority: %s\n", error->message); g_error_free (error); error = NULL; } else printf ("MaxRealtimePriority = %d\n", max_realtime_priority); min_nice_level = arv_rtkit_get_min_nice_level (bus, &error); if (error != NULL) { fprintf (stderr, "Failed to get MinNiceLevel: %s\n", error->message); g_error_free (error); error = NULL; } else printf ("MinNiceLevel = %d\n", min_nice_level); rttime_usec_max = arv_rtkit_get_rttime_usec_max (bus, &error); if (error != NULL) { fprintf (stderr, "Failed to get RTTimeUSecMax: %s\n", error->message); g_error_free (error); error = NULL; } else printf ("RTTimeUSecMax = %Ld\n", rttime_usec_max); memset(&rlim, 0, sizeof(rlim)); rlim.rlim_cur = rlim.rlim_max = 100000000ULL; /* 100ms */ if ((setrlimit(RLIMIT_RTTIME, &rlim) < 0)) fprintf(stderr, "Failed to set RLIMIT_RTTIME: %s\n", strerror(errno)); print_status("before"); arv_rtkit_make_high_priority (bus, 0, -10, &error); if (error != NULL) { fprintf (stderr, "Failed to become high priority: %s\n", error->message); g_error_free (error); error = NULL; } else printf ("Successfully became high priority\n"); print_status("after high priority"); arv_rtkit_make_realtime (bus, 0, 10, &error); if (error != NULL) { fprintf (stderr, "Failed to get become realtime: %s\n", error->message); g_error_free (error); error = NULL; } else printf ("Successfully became realtime\n"); print_status("after realtime"); g_object_unref (bus); return EXIT_SUCCESS; } aravis-ARAVIS_0_6_0/tests/timetest.c000066400000000000000000000027411334570641500173710ustar00rootroot00000000000000#include #include #include #include #include #include static gint64 get_time_us (void) { GTimeVal time; g_get_current_time (&time); return time.tv_sec * 1000000LL + time.tv_usec; } static gint64 time_wait (gint64 usec ) { gint64 wt, st, tt; gint64 i; st = get_time_us (); wt = st + usec; for (i = 0, tt = get_time_us(); tt < wt; i++ ) tt = get_time_us (); return tt-st; } static gint64 sleep_meas (gint64 usec) { gint64 tt; tt = get_time_us (); g_usleep (usec); tt = get_time_us () - tt; return tt; } #define MAX_TIME_US 200000 #define N_ITERS 100 int main (int argc, char **argv) { gint64 i, j; double val, wt, min, max, swt; for( i = 1; i < MAX_TIME_US; i = i*2 ) { max = wt = swt = 0.; min = MAX_TIME_US; for (j = 0; j < N_ITERS; j++ ) { val = sleep_meas (i); wt += val; swt += val*val; if (val < min) min = val; if (val > max) max = val; } wt /= j; printf ("SleepMeas: %6" G_GINT64_FORMAT " - Mean %7g Max %5g Min %5g rms %g\n", i, wt, max, min, sqrt(swt/j - wt*wt)); } for( i = 1; i < MAX_TIME_US; i = i*2 ) { max = wt = swt = 0.; min = MAX_TIME_US; for (j = 0; j < N_ITERS; j++ ) { val = time_wait (i); wt += val; swt += val*val; if( val < min ) min = val; if( val > max ) max = val; } wt /= j; printf ("TimeWait: %6" G_GINT64_FORMAT " - Mean %7g Max %5g Min %5g rms %g\n", i, wt, max, min, sqrt(swt/j - wt*wt)); } return EXIT_SUCCESS; } aravis-ARAVIS_0_6_0/tests/valgrind-memcheck000077500000000000000000000002031334570641500206640ustar00rootroot00000000000000#!/bin/sh meson test --wrap="valgrind --tool=memcheck --leak-check=yes --suppressions=../tests/aravis.supp --error-exitcode=1" $@ aravis-ARAVIS_0_6_0/tools/000077500000000000000000000000001334570641500153615ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/tools/gvcp.README000066400000000000000000000013111334570641500171730ustar00rootroot00000000000000gvcp.lua is a wireshark dissector for the gigabit ethernet camera control protocol, written in lua. To use it, you first have to enable lua script in the wireshark configuration (assuming you have wireshark compiled with lua scripting support). Edit the /etc/wireshark/init.lua file and comment the following line: disable_lua = true; do return end; If you want to run wireshark as root, you also need to modify the line: run_user_scripts_when_superuser = false to: run_user_scripts_when_superuser = true And discard the superuser test by changing the line: if running_superuser then by: if false then You are now able to run wireshark with the gvcp dissector: sudo wireshark -X lua_script:gvcp.lua aravis-ARAVIS_0_6_0/tools/gvcp.lua000066400000000000000000000051121334570641500170220ustar00rootroot00000000000000-- dissects the Gvcp Protocol gvcp_proto = Proto("gvcp", "Gigabit ethernet camera control protocol") local f = gvcp_proto.fields local packet_types = { [0x0000] = "Acknowledge", [0x4201] = "Command" } local commands = { [0x0002] = "DiscoverCmd", [0x0003] = "DiscoverAck", [0x0004] = "ByeCmd", [0x0005] = "ByeAck", [0x0040] = "PacketResendCmd", [0x0041] = "PacketResendAck", [0x0080] = "RegisterReadCmd", [0x0081] = "RegisterReadAck", [0x0082] = "RegisterWriteCmd", [0x0083] = "RegisterWriteAck", [0x0084] = "MemoryReadCmd", [0x0085] = "MemoryReadAck", [0x0086] = "MemoryWriteCmd", [0x0087] = "MemoryWriteAck" } f.packet_type = ProtoField.uint16 ("gvcp.packet_type", "PacketType", nil, packet_types) f.command = ProtoField.uint16 ("gvcp.command", "Command", nil, commands) f.size = ProtoField.uint16 ("gvcp.size", "Size"); f.count = ProtoField.uint16 ("gvcp.count", "Count"); f.register_address = ProtoField.uint32 ("gvcp.register_address", "RegisterAddress"); f.register_value = ProtoField.uint32 ("gvcp.register_value", "RegisterValue"); f.memory_address = ProtoField.uint32 ("gvcp.memory_address", "MemoryAddress"); f.memory_size = ProtoField.uint32 ("gvcp.memory_size", "MemorySize"); f.memory_value = ProtoField.string ("gvcp.memory_value", "MemoryValue"); local packet_counter function gvcp_proto.init () packet_counter = 0 end -- create a function to dissect it function gvcp_proto.dissector(buffer,pinfo,tree) local subtree = tree:add (gvcp_proto, buffer()) local offset = 0 local packet_type = buffer (offset, 2) subtree:add (f.packet_type, packet_type) offset = offset + 2 local command = buffer (offset, 2) cmd = command:uint() subtree:add (f.command, command) offset = offset + 2 subtree:add (f.size, buffer (offset, 2)) offset = offset + 2 subtree:add (f.count, buffer (offset, 2)) offset = offset + 2 if cmd == 0x80 then -- Register read cmd subtree:add (f.register_address, buffer (offset, 4)) offset = offset + 4 elseif cmd == 0x81 then -- Register read ans subtree:add (f.register_value, buffer (offset, 4)) offset = offset + 4 elseif cmd == 0x84 then -- Memory read cmd subtree:add (f.memory_address, buffer (offset, 4)) offset = offset + 4 subtree:add (f.memory_size, buffer (offset, 4)) offset = offset + 4 elseif cmd == 0x85 then -- Memory read ans subtree:add (f.memory_address, buffer (offset, 4)) offset = offset + 4 subtree:add (f.memory_value, buffer (offset, 16):string()) end end -- load the tcp.port table udp_table = DissectorTable.get("udp.port") -- register our protocol to handle udp port 3956 udp_table:add(3956,gvcp_proto) aravis-ARAVIS_0_6_0/tools/render-icon-theme.py000077500000000000000000000132741334570641500212520ustar00rootroot00000000000000#!/usr/bin/env python # # Script from the GNOME icon theme project # GNOME icon theme is distributed under the terms of # either GNU LGPL v.3 or Creative Commons BY-SA 3.0 license. import os import sys import xml.sax import subprocess INKSCAPE = '/usr/bin/inkscape' OPTIPNG = '/usr/bin/optipng' SRC = os.path.join('.', 'src') inkscape_process = None def optimize_png(png_file): if os.path.exists(OPTIPNG): process = subprocess.Popen([OPTIPNG, '-quiet', '-o7', png_file]) process.wait() def wait_for_prompt(process, command=None): if command is not None: process.stdin.write(command+'\n') # This is kinda ugly ... # Wait for just a '>', or '\n>' if some other char appearead first output = process.stdout.read(1) if output == '>': return output += process.stdout.read(1) while output != "\n>": output += process.stdout.read(1) output = output[1:] def start_inkscape(): process = subprocess.Popen([INKSCAPE, '--shell'], bufsize=0, stdin=subprocess.PIPE, stdout=subprocess.PIPE) wait_for_prompt(process) return process def inkscape_render_rect(icon_file, rect, output_file): global inkscape_process if inkscape_process is None: inkscape_process = start_inkscape() wait_for_prompt(inkscape_process, '%s -i %s -e %s' % (icon_file, rect, output_file)) optimize_png(output_file) class ContentHandler(xml.sax.ContentHandler): ROOT = 0 SVG = 1 LAYER = 2 OTHER = 3 TEXT = 4 def __init__(self, path, force=False, filter=None): self.stack = [self.ROOT] self.inside = [self.ROOT] self.path = path self.rects = [] self.state = self.ROOT self.chars = "" self.force = force self.filter = filter def endDocument(self): pass def startElement(self, name, attrs): if self.inside[-1] == self.ROOT: if name == "svg": self.stack.append(self.SVG) self.inside.append(self.SVG) return elif self.inside[-1] == self.SVG: if (name == "g" and attrs.has_key('inkscape:groupmode') and attrs.has_key('inkscape:label') and attrs['inkscape:groupmode'] == 'layer' and attrs['inkscape:label'].startswith('baseplate')): self.stack.append(self.LAYER) self.inside.append(self.LAYER) self.context = None self.icon_name = None self.rects = [] return elif self.inside[-1] == self.LAYER: if name == "text" and attrs.has_key('inkscape:label') and attrs['inkscape:label'] == 'context': self.stack.append(self.TEXT) self.inside.append(self.TEXT) self.text='context' self.chars = "" return elif name == "text" and attrs.has_key('inkscape:label') and attrs['inkscape:label'] == 'icon-name': self.stack.append(self.TEXT) self.inside.append(self.TEXT) self.text='icon-name' self.chars = "" return elif name == "rect": self.rects.append(attrs) self.stack.append(self.OTHER) def endElement(self, name): stacked = self.stack.pop() if self.inside[-1] == stacked: self.inside.pop() if stacked == self.TEXT and self.text is not None: assert self.text in ['context', 'icon-name'] if self.text == 'context': self.context = self.chars elif self.text == 'icon-name': self.icon_name = self.chars self.text = None elif stacked == self.LAYER: assert self.icon_name assert self.context if self.filter is not None and not self.icon_name in self.filter: return print '%s %s' % (self.context, self.icon_name) for rect in self.rects: width = rect['width'] height = rect['height'] id = rect['id'] dir = os.path.join("gnome", "%sx%s" % (width, height), self.context) outfile = os.path.join(dir, self.icon_name+'.png') if not os.path.exists(dir): os.makedirs(dir) # Do a time based check! if self.force or not os.path.exists(outfile): inkscape_render_rect(self.path, id, outfile) sys.stdout.write('.') else: stat_in = os.stat(self.path) stat_out = os.stat(outfile) if stat_in.st_mtime > stat_out.st_mtime: inkscape_render_rect(self.path, id, outfile) sys.stdout.write('.') else: sys.stdout.write('-') sys.stdout.flush() sys.stdout.write('\n') sys.stdout.flush() def characters(self, chars): self.chars += chars.strip() if len(sys.argv) == 1: if not os.path.exists('gnome'): os.mkdir('gnome') print 'Rendering from SVGs in %s' % SRC for file in os.listdir(SRC): if file[-4:] == '.svg': file = os.path.join(SRC, file) handler = ContentHandler(file) xml.sax.parse(open(file), handler) else: file = os.path.join(SRC, sys.argv[1] + '.svg') if len(sys.argv) > 2: icons = sys.argv[2:] else: icons = None if os.path.exists(os.path.join(file)): handler = ContentHandler(file, True, filter=icons) xml.sax.parse(open(file), handler) else: print "Error: No such file %s" % file sys.exit(1) aravis-ARAVIS_0_6_0/tools/render-symbolic.rb000077500000000000000000000054601334570641500210140ustar00rootroot00000000000000#!/usr/bin/env ruby require "rexml/document" require "fileutils" include REXML INKSCAPE = '/usr/bin/inkscape' #INKSCAPE = '/usr/bin/inkscape' # like this works for me, while using `which` inkscape hangs SRC = "src/symbolic/gnome-stencils.svg" PREFIX = "Adwaita/scalable" def chopSVG(icon) FileUtils.mkdir_p(icon[:dir]) unless File.exists?(icon[:dir]) unless (File.exists?(icon[:file]) && !icon[:forcerender]) FileUtils.cp(SRC,icon[:file]) puts " >> #{icon[:name]}" cmd = "#{INKSCAPE} -f #{icon[:file]} --select #{icon[:id]} --verb=FitCanvasToSelection --verb=EditInvertInAllLayers " cmd += "--verb=EditDelete --verb=EditSelectAll --verb=SelectionUnGroup --verb=SelectionUnGroup --verb=SelectionUnGroup --verb=StrokeToPath --verb=FileVacuum " cmd += "--verb=FileSave --verb=FileQuit > /dev/null 2>&1" system(cmd) #saving as plain SVG gets rid of the classes :/ #cmd = "#{INKSCAPE} -f #{icon[:file]} -z --vacuum-defs -l #{icon[:file]} > /dev/null 2>&1" #system(cmd) svgcrop = Document.new(File.new(icon[:file], 'r')) svgcrop.root.each_element("//rect") do |rect| w = ((rect.attributes["width"].to_f * 10).round / 10.0).to_i #get rid of 16 vs 15.99999 h = ((rect.attributes["width"].to_f * 10).round / 10.0).to_i #Inkscape bugs if w == 16 && h == 16 rect.remove end end icon_f = File.new(icon[:file],'w+') icon_f.puts svgcrop icon_f.close else puts " -- #{icon[:name]} already exists" end end #end of function def get_output_filename(d,n) if (/rtl$/.match(n)) outfile = "#{d}/#{n.chomp('-rtl')}-symbolic-rtl.svg" else outfile = "#{d}/#{n}-symbolic.svg" end return outfile end #main # Open SVG file. svg = Document.new(File.new(SRC, 'r')) if (ARGV[0].nil?) #render all SVGs puts "Rendering from icons in #{SRC}" # Go through every layer. svg.root.each_element("/svg/g[@inkscape:groupmode='layer']") do |context| context_name = context.attributes.get_attribute("inkscape:label").value puts "Going through layer '" + context_name + "'" context.each_element("g") do |icon| #puts "DEBUG #{icon.attributes.get_attribute('id')}" dir = "#{PREFIX}/#{context_name}" icon_name = icon.attributes.get_attribute("inkscape:label").value chopSVG({ :name => icon_name, :id => icon.attributes.get_attribute("id"), :dir => dir, :file => get_output_filename(dir, icon_name)}) end end puts "\nrendered all SVGs" else #only render the icons passed icons = ARGV ARGV.each do |icon_name| icon = svg.root.elements["//g[@inkscape:label='#{icon_name}']"] dir = "#{PREFIX}/#{icon.parent.attributes['inkscape:label']}" chopSVG({ :name => icon_name, :id => icon.attributes["id"], :dir => dir, :file => get_output_filename(dir, icon_name), :forcerender => true}) end puts "\nrendered #{ARGV.length} icons" end aravis-ARAVIS_0_6_0/tools/wireshark-dissectors/000077500000000000000000000000001334570641500215405ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/tools/wireshark-dissectors/packet-gvcp.c000066400000000000000000004107331334570641500241200ustar00rootroot00000000000000/* packet-gvcp.c * Routines for AIA GigE Vision (TM) Control Protocol dissection * Copyright 2012, AIA All rights reserved * * GigE Vision (TM): GigE Vision a standard developed under the sponsorship of the AIA for * the benefit of the machine vision industry. GVCP stands for GigE Vision (TM) Control * Protocol. * * Wireshark - Network traffic analyzer * By Gerald Combs * Copyright 1998 Gerald Combs * * SPDX-License-Identifier: GPL-2.0-or-later */ #include "config.h" #include #include #define GVCP_MIN_PACKET_SIZE 8 /* header fields to show the relations between request and response as well as the response time */ static int hf_gvcp_response_in = -1; static int hf_gvcp_response_to = -1; /* structure to hold info to remember between the requests and responses */ typedef struct _gvcp_transaction_t { guint32 req_frame; guint32 rep_frame; wmem_array_t *addr_list; guint32 addr_count; } gvcp_transaction_t; wmem_array_t* gvcp_trans_array; /* structure to hold persistent info for each conversation */ typedef struct _gvcp_conv_info_t { wmem_map_t *pdus; } gvcp_conv_info_t; /* Bootstrap registers addresses */ #define GVCP_VERSION (0x00000000) #define GVCP_DEVICE_MODE (0x00000004) #define GVCP_DEVICE_MAC_HIGH_0 (0x00000008) #define GVCP_DEVICE_MAC_LOW_0 (0x0000000C) #define GVCP_SUPPORTED_IP_CONFIGURATION_0 (0x00000010) #define GVCP_CURIPCFG_0 (0x00000014) #define GVCP_CURRENT_IP_ADDRESS_0 (0x00000024) #define GVCP_CURRENT_SUBNET_MASK_0 (0x00000034) #define GVCP_CURRENT_DEFAULT_GATEWAY_0 (0x00000044) #define GVCP_MANUFACTURER_NAME (0x00000048) #define GVCP_MODEL_NAME (0x00000068) #define GVCP_DEVICE_VERSION (0x00000088) #define GVCP_MANUFACTURER_INFO (0x000000A8) #define GVCP_SERIAL_NUMBER (0x000000d8) #define GVCP_USER_DEFINED_NAME (0x000000E8) #define GVCP_FIRST_URL (0x00000200) #define GVCP_SECOND_URL (0x00000400) #define GVCP_NUMBER_OF_NETWORK_INTERFACES (0x00000600) #define GVCP_PERSISTENT_IP_ADDRESS_0 (0x0000064C) #define GVCP_PERSISTENT_SUBNET_MASK_0 (0x0000065C) #define GVCP_PERSISTENT_DEFAULT_GATEWAY_0 (0x0000066C) #define GVCP_LINK_SPEED_0 (0x00000670) #define GVCP_DEVICE_MAC_HIGH_1 (0x00000680) #define GVCP_DEVICE_MAC_LOW_1 (0x00000684) #define GVCP_SUPPORTED_IP_CONFIGURATION_1 (0x00000688) #define GVCP_CURIPCFG_1 (0x0000068C) #define GVCP_CURRENT_IP_ADDRESS_1 (0x0000069C) #define GVCP_CURRENT_SUBNET_MASK_1 (0x000006AC) #define GVCP_CURRENT_DEFAULT_GATEWAY_1 (0x000006BC) #define GVCP_PERSISTENT_IP_ADDRESS_1 (0x000006CC) #define GVCP_PERSISTENT_SUBNET_MASK_1 (0x000006DC) #define GVCP_PERSISTENT_DEFAULT_GATEWAY_1 (0x000006EC) #define GVCP_LINK_SPEED_1 (0x000006F0) #define GVCP_DEVICE_MAC_HIGH_2 (0x00000700) #define GVCP_DEVICE_MAC_LOW_2 (0x00000704) #define GVCP_SUPPORTED_IP_CONFIGURATION_2 (0x00000708) #define GVCP_CURIPCFG_2 (0x0000070C) #define GVCP_CURRENT_IP_ADDRESS_2 (0x0000071C) #define GVCP_CURRENT_SUBNET_MASK_2 (0x0000072C) #define GVCP_CURRENT_DEFAULT_GATEWAY_2 (0x0000073C) #define GVCP_PERSISTENT_IP_ADDRESS_2 (0x0000074C) #define GVCP_PERSISTENT_SUBNET_MASK_2 (0x0000075C) #define GVCP_PERSISTENT_DEFAULT_GATEWAY_2 (0x0000076C) #define GVCP_LINK_SPEED_2 (0x00000770) #define GVCP_DEVICE_MAC_HIGH_3 (0x00000780) #define GVCP_DEVICE_MAC_LOW_3 (0x00000784) #define GVCP_SUPPORTED_IP_CONFIGURATION_3 (0x00000788) #define GVCP_CURIPCFG_3 (0x0000078C) #define GVCP_CURRENT_IP_ADDRESS_3 (0x0000079C) #define GVCP_CURRENT_SUBNET_MASK_3 (0x000007AC) #define GVCP_CURRENT_DEFAULT_GATEWAY_3 (0x000007BC) #define GVCP_PERSISTENT_IP_ADDRESS_3 (0x000007CC) #define GVCP_PERSISTENT_SUBNET_MASK_3 (0x000007DC) #define GVCP_PERSISTENT_DEFAULT_GATEWAY_3 (0x000007EC) #define GVCP_LINK_SPEED_3 (0x000007F0) #define GVCP_NUMBER_OF_MESSAGE_CHANNELS (0x00000900) #define GVCP_NUMBER_OF_STREAM_CHANNELS (0x00000904) #define GVCP_NUMBER_OF_ACTION_SIGNALS (0x00000908) #define GVCP_ACTION_DEVICE_KEY (0x0000090C) #define GVCP_NUMBER_OF_ACTIVE_LINKS (0x00000910) #define GVCP_SC_CAPS (0x0000092C) #define GVCP_MESSAGE_CHANNEL_CAPS (0x00000930) #define GVCP_CAPABILITY (0x00000934) #define GVCP_HEARTBEAT_TIMEOUT (0x00000938) #define GVCP_TIMESTAMP_TICK_FREQUENCY_HIGH (0x0000093C) #define GVCP_TIMESTAMP_TICK_FREQUENCY_LOW (0x00000940) #define GVCP_TIMESTAMP_CONTROL (0x00000944) #define GVCP_TIMESTAMP_VALUE_HIGH (0x00000948) #define GVCP_TIMESTAMP_VALUE_LOW (0x0000094C) #define GVCP_DISCOVERY_ACK_DELAY (0x00000950) #define GVCP_CONFIGURATION (0x00000954) #define GVCP_PENDING_TIMEOUT (0x00000958) #define GVCP_CONTROL_SWITCHOVER_KEY (0x0000095C) #define GVCP_GVSCP_CONFIGURATION (0x00000960) #define GVCP_PHYSICAL_LINK_CAPABILITY (0x00000964) #define GVCP_PHYSICAL_LINK_CONFIGURATION (0x00000968) #define GVCP_IEEE_1588_STATUS (0x0000096C) #define GVCP_SCHEDULED_ACTION_COMMAND_QUEUE_SIZE (0x00000970) #define GVCP_IEEE_1588_EXTENDED_CAPABILITY (0x00000974) #define GVCP_IEEE_1588_SUPPORTED_PROFILES (0x00000978) #define GVCP_IEEE_1588_SELECTED_PROFILE (0x0000097C) #define GVCP_CCP (0x00000A00) #define GVCP_PRIMARY_APPLICATION_PORT (0x00000A04) #define GVCP_PRIMARY_APPLICATION_IP_ADDRESS (0x00000A14) #define GVCP_MC_DESTINATION_PORT (0x00000B00) #define GVCP_MC_DESTINATION_ADDRESS (0x00000B10) #define GVCP_MC_TIMEOUT (0x00000B14) #define GVCP_MC_RETRY_COUNT (0x00000B18) #define GVCP_MC_SOURCE_PORT (0x00000B1C) #define GVCP_MANIFEST_TABLE (0x00009000) #define GVCP_SC_DESTINATION_PORT(I) (0x0d00+(0x40*I)) #define GVCP_SC_PACKET_SIZE(I) (0x0d04+(0x40*I)) #define GVCP_SC_PACKET_DELAY(I) (0x0d08+(0x40*I)) #define GVCP_SC_DESTINATION_ADDRESS(I) (0x0d18+(0x40*I)) #define GVCP_SC_SOURCE_PORT(I) (0x0d1c+(0x40*I)) #define GVCP_SC_CAPABILITY(I) (0x0d20+(0x40*I)) #define GVCP_SC_CONFIGURATION(I) (0x0d24+(0x40*I)) #define GVCP_SC_ZONE(I) (0x0d28+(0x40*I)) #define GVCP_SC_ZONE_DIRECTION(I) (0x0d2c+(0x40*I)) #define GVCP_ACTION_GROUP_KEY(I) (0x9800+(0x10*I)) #define GVCP_ACTION_GROUP_MASK(I) (0x9804+(0x10*I)) /* Command and acknowledge IDs */ #define GVCP_DISCOVERY_CMD (0x0002) #define GVCP_DISCOVERY_ACK (0x0003) #define GVCP_FORCEIP_CMD (0x0004) #define GVCP_FORCEIP_ACK (0x0005) #define GVCP_PACKETRESEND_CMD (0x0040) #define GVCP_PACKETRESEND_ACK (0x0041) #define GVCP_READREG_CMD (0x0080) #define GVCP_READREG_ACK (0x0081) #define GVCP_WRITEREG_CMD (0x0082) #define GVCP_WRITEREG_ACK (0x0083) #define GVCP_READMEM_CMD (0x0084) #define GVCP_READMEM_ACK (0x0085) #define GVCP_WRITEMEM_CMD (0x0086) #define GVCP_WRITEMEM_ACK (0x0087) #define GVCP_PENDING_ACK (0x0089) #define GVCP_EVENT_CMD (0x00C0) #define GVCP_EVENT_ACK (0x00C1) #define GVCP_EVENTDATA_CMD (0x00C2) #define GVCP_EVENTDATA_ACK (0x00C3) #define GVCP_ACTION_CMD (0x0100) #define GVCP_ACTION_ACK (0x0101) /* GVCP statuses */ #define GEV_STATUS_SUCCESS (0x0000) #define GEV_STATUS_PACKET_RESEND (0x0100) #define GEV_STATUS_NOT_IMPLEMENTED (0x8001) #define GEV_STATUS_INVALID_PARAMETER (0x8002) #define GEV_STATUS_INVALID_ADDRESS (0x8003) #define GEV_STATUS_WRITE_PROTECT (0x8004) #define GEV_STATUS_BAD_ALIGNMENT (0x8005) #define GEV_STATUS_ACCESS_DENIED (0x8006) #define GEV_STATUS_BUSY (0x8007) #define GEV_STATUS_LOCAL_PROBLEM (0x8008) /* deprecated */ #define GEV_STATUS_MSG_MISMATCH (0x8009) /* deprecated */ #define GEV_STATUS_INVALID_PROTOCOL (0x800A) /* deprecated */ #define GEV_STATUS_NO_MSG (0x800B) /* deprecated */ #define GEV_STATUS_PACKET_UNAVAILABLE (0x800C) #define GEV_STATUS_DATA_OVERRUN (0x800D) #define GEV_STATUS_INVALID_HEADER (0x800E) #define GEV_STATUS_WRONG_CONFIG (0x800F) /* deprecated */ #define GEV_STATUS_PACKET_NOT_YET_AVAILABLE (0x8010) #define GEV_STATUS_PACKET_AND_PREV_REMOVED_FROM_MEMORY (0x8011) #define GEV_STATUS_PACKET_REMOVED_FROM_MEMORY (0x8012) #define GEV_STATUS_NO_REF_TIME (0x8013) /* GEV 2.0 */ #define GEV_STATUS_PACKET_TEMPORARILY_UNAVAILABLE (0x8014) /* GEV 2.0 */ #define GEV_STATUS_OVERFLOW (0x8015) /* GEV 2.0 */ #define GEV_STATUS_ACTION_LATE (0x8016) /* GEV 2.0 */ #define GEV_STATUS_LEADER_TRAILER_OVERFLOW (0x8017) /* GEV 2.1 */ #define GEV_STATUS_ERROR (0x8FFF) /* Device modes */ #define GEV_DEVICEMODE_TRANSMITTER (0x00 ) #define GEV_DEVICEMODE_RECEIVER (0x01) #define GEV_DEVICEMODE_TRANSCEIVER (0x02) #define GEV_DEVICEMODE_PERIPHERAL (0x03) /* Event IDs */ #define GEV_EVENT_TRIGGER (0x0002) /* deprecated */ #define GEV_EVENT_START_OF_EXPOSURE (0x0003) /* deprecated */ #define GEV_EVENT_END_OF_EXPOSURE (0x0004) /* deprecated */ #define GEV_EVENT_START_OF_TRANSFER (0x0005) /* deprecated */ #define GEV_EVENT_END_OF_TRANSFER (0x0006) /* deprecated */ #define GEV_EVENT_PRIMARY_APP_SWITCH (0x0007) #define GEV_EVENT_EVENT_LINK_SPEED_CHANGE (0x0008) #define GEV_EVENT_ACTION_LATE (0x0009) #define GEV_EVENT_ERROR_001 (0x8001) /* Link configurations */ #define GEV_LINKCONFIG_SINGLELINK (0x00) #define GEV_LINKCONFIG_MULTIPLELINKS (0x01) #define GEV_LINKCONFIG_STATICLAG (0x02) #define GEV_LINKCONFIG_DYNAMICLAG (0x03) void proto_register_gvcp(void); void proto_reg_handoff_gvcp(void); /* Define the gvcp proto */ static int proto_gvcp = -1; static int global_gvcp_port = 3956; static int hf_gvcp_custom_register_addr = -1; static int hf_gvcp_custom_memory_addr = -1; /* \brief IDs used for bootstrap dissection */ static int hf_gvcp_message_key_code = -1; static int hf_gvcp_flag = -1; static int hf_gvcp_acknowledge_required_flag = -1; static int hf_gvcp_allow_broadcast_acknowledge_flag = -1; static int hf_gvcp_command = -1; static int hf_gvcp_length = -1; static int hf_gvcp_request_id = -1; static int hf_gvcp_status = -1; static int hf_gvcp_acknowledge = -1; static int hf_gvcp_spec_version_major = -1; static int hf_gvcp_spec_version_minor = -1; static int hf_gvcp_devicemodediscovery = -1; static int hf_gvcp_device_mac_address = -1; static int hf_gvcp_ip_config_persistent_ip = -1; static int hf_gvcp_ip_config_dhcp = -1; static int hf_gvcp_ip_config_lla = -1; static int hf_gvcp_current_IP = -1; static int hf_gvcp_current_subnet_mask = -1; static int hf_gvcp_current_default_gateway = -1; static int hf_gvcp_manufacturer_name = -1; static int hf_gvcp_model_name = -1; static int hf_gvcp_device_version = -1; static int hf_gvcp_manufacturer_specific_info = -1; static int hf_gvcp_serial_number = -1; static int hf_gvcp_user_defined_name = -1; static int hf_gvcp_first_xml_device_description_file = -1; static int hf_gvcp_second_xml_device_description_file = -1; static int hf_gvcp_readregcmd_bootstrap_register = -1; static int hf_gvcp_writeregcmd_bootstrap_register = -1; static int hf_gvcp_writeregcmd_data = -1; static int hf_gvcp_writeregcmd_data_index = -1; static int hf_gvcp_readmemcmd_address = -1; static int hf_gvcp_readmemcmd_bootstrap_register = -1; static int hf_gvcp_readmemcmd_count = -1; static int hf_gvcp_writememcmd_data = -1; static int hf_gvcp_writememcmd_data_index = -1; static int hf_gvcp_forceip_mac_address = -1; static int hf_gvcp_forceip_static_IP = -1; static int hf_gvcp_forceip_static_subnet_mask = -1; static int hf_gvcp_forceip_static_default_gateway = -1; static int hf_gvcp_resendcmd_stream_channel_index = -1; static int hf_gvcp_resendcmd_block_id = -1; static int hf_gvcp_resendcmd_first_packet_id = -1; static int hf_gvcp_resendcmd_last_packet_id = -1; static int hf_gvcp_eventcmd_id = -1; static int hf_gvcp_eventcmd_error_id = -1; static int hf_gvcp_eventcmd_extid_length = -1; static int hf_gvcp_eventcmd_device_specific_id = -1; static int hf_gvcp_eventcmd_stream_channel_index = -1; static int hf_gvcp_eventcmd_block_id = -1; static int hf_gvcp_eventcmd_timestamp = -1; static int hf_gvcp_eventcmd_data = -1; static int hf_gvcp_actioncmd_device_key = -1; static int hf_gvcp_actioncmd_group_key = -1; static int hf_gvcp_actioncmd_group_mask = -1; static int hf_gvcp_time_to_completion = -1; static int hf_gvcp_devicemode_endianness = -1; static int hf_gvcp_devicemode_deviceclass = -1; static int hf_gvcp_devicemode_characterset = -1; static int hf_gvcp_machigh = -1; static int hf_gvcp_maclow = -1; static int hf_gvcp_persistent_ip = -1; static int hf_gvcp_persistent_subnet = -1; static int hf_gvcp_persistent_gateway = -1; static int hf_gvcp_link_speed = -1; static int hf_gvcp_number_message_channels = -1; static int hf_gvcp_number_stream_channels = -1; static int hf_gvcp_number_action_signals = -1; static int hf_gvcp_capability_user_defined = -1; static int hf_gvcp_capability_serial_number = -1; static int hf_gvcp_capability_heartbeat_disable = -1; static int hf_gvcp_capability_link_speed = -1; static int hf_gvcp_capability_extended_status_code_v1_1 = -1; static int hf_gvcp_capability_ccp_application_portip = -1; static int hf_gvcp_capability_manifest_table = -1; static int hf_gvcp_capability_test_data = -1; static int hf_gvcp_capability_discovery_ACK_delay = -1; static int hf_gvcp_capability_writable_discovery_ACK_delay = -1; static int hf_gvcp_capability_primary_application_switchover = -1; static int hf_gvcp_capability_unconditional_action_command = -1; static int hf_gvcp_capability_pending = -1; static int hf_gvcp_capability_evendata = -1; static int hf_gvcp_capability_event = -1; static int hf_gvcp_capability_packetresend = -1; static int hf_gvcp_capability_writemem = -1; static int hf_gvcp_capability_concatenation = -1; static int hf_gvcp_heartbeat = -1; static int hf_gvcp_high_timestamp_frequency = -1; static int hf_gvcp_low_timestamp_frequency = -1; static int hf_gvcp_high_timestamp_value = -1; static int hf_gvcp_low_timestamp_value = -1; static int hf_gvcp_discovery_ACK_delay = -1; static int hf_gvcp_configuration_pending_ack_enable = -1; static int hf_gvcp_configuration_heartbeat_disable = -1; static int hf_gvcp_pending_timeout_max_execution = -1; static int hf_gvcp_control_switchover_key_register = -1; static int hf_gvcp_control_switchover_key = -1; static int hf_gvcp_control_switchover_en = -1; static int hf_gvcp_control_access = -1; static int hf_gvcp_exclusive_access = -1; static int hf_gvcp_primary_application_host_port = -1; static int hf_gvcp_primary_application_ip_address = -1; static int hf_gvcp_network_interface_index = -1; static int hf_gvcp_host_port = -1; static int hf_gvcp_channel_destination_ip = -1; static int hf_gvcp_message_channel_transmission_timeout = -1; static int hf_gvcp_message_channel_retry_count = -1; static int hf_gvcp_message_channel_source_port = -1; static int hf_gvcp_sc_host_port = -1; static int hf_gvcp_sc_ni_index = -1; static int hf_gvcp_sc_direction = -1; static int hf_gvcp_sc_fire_test_packet = -1; static int hf_gvcp_sc_do_not_fragment = -1; static int hf_gvcp_sc_pixel_endianness = -1; static int hf_gvcp_sc_packet_size = -1; static int hf_gvcp_sc_packet_delay = -1; static int hf_gvcp_sc_destination_ip = -1; static int hf_gvcp_sc_source_port = -1; static int hf_gvcp_sc_big_little_endian_supported = -1; static int hf_gvcp_sc_ip_reassembly_supported = -1; static int hf_gvcp_sc_unconditional_streaming_supported = -1; static int hf_gvcp_sc_extended_chunk_data_supported = -1; static int hf_gvcp_sc_unconditional_streaming_enabled = -1; static int hf_gvcp_configuration_extended_status_codes_enable_v1_1 = -1; static int hf_gvcp_sc_extended_chunk_data_enabled = -1; static int hf_gvcp_action_group_key = -1; static int hf_gvcp_action_group_mask = -1; static int hf_gvcp_timestamp_control_latch = -1; static int hf_gvcp_timestamp_control_reset = -1; static int hf_gvcp_payloaddata = -1; static int hf_gvcp_number_interfaces = -1; static int hf_gvcp_supportedipconfig = -1; static int hf_gvcp_currentipconfig = -1; static int hf_gvcp_spec_version = -1; /* Added for 2.0 support */ static int hf_gvcp_devicemode_current_link_configuration_v2_0 = -1; static int hf_gvcp_ip_config_can_handle_pause_frames_v2_0 = -1; static int hf_gvcp_ip_config_can_generate_pause_frames_v2_0 = -1; static int hf_gvcp_number_of_active_links_v2_0 = -1; static int hf_gvcp_sccaps_scspx_register_supported = -1; static int hf_gvcp_sccaps_legacy_16bit_blockid_supported_v2_0 = -1; static int hf_gvcp_mcsp_supported = -1; static int hf_gvcp_capability_1588_v2_0 = -1; static int hf_gvcp_capability_extended_status_code_v2_0 = -1; static int hf_gvcp_capability_scheduled_action_command_v2_0 = -1; static int hf_gvcp_capability_action_command = -1; static int hf_gvcp_configuration_1588_enable_v2_0 = -1; static int hf_gvcp_configuration_extended_status_codes_enable_v2_0 = -1; static int hf_gvcp_configuration_unconditional_action_command_enable_v2_0 = -1; static int hf_gvcp_gvsp_configuration_64bit_blockid_enable_v2_0 = -1; static int hf_gvcp_link_dlag_v2_0 = -1; static int hf_gvcp_link_slag_v2_0 = -1; static int hf_gvcp_link_ml_v2_0 = -1; static int hf_gvcp_link_sl_v2_0 = -1; static int hf_gvcp_ieee1588_clock_status_v2_0 = -1; static int hf_gvcp_scheduled_action_command_queue_size_v2_0 = -1; static int hf_gvcp_sc_multizone_supported_v2_0 = -1; static int hf_gvcp_sc_packet_resend_destination_option_supported_v2_0 = -1; static int hf_gvcp_sc_packet_resend_all_in_transmission_supported_v2_0 = -1; static int hf_gvcp_sc_packet_resend_destination_option_enabled_v2_0 = -1; static int hf_gvcp_sc_packet_resend_all_in_transmission_enabled_v2_0 = -1; static int hf_gvcp_sc_additional_zones_v2_0 = -1; static int hf_gvcp_sc_zone0_direction_v2_0 = -1; static int hf_gvcp_sc_zone1_direction_v2_0 = -1; static int hf_gvcp_sc_zone2_direction_v2_0 = -1; static int hf_gvcp_sc_zone3_direction_v2_0 = -1; static int hf_gvcp_sc_zone4_direction_v2_0 = -1; static int hf_gvcp_sc_zone5_direction_v2_0 = -1; static int hf_gvcp_sc_zone6_direction_v2_0 = -1; static int hf_gvcp_sc_zone7_direction_v2_0 = -1; static int hf_gvcp_sc_zone8_direction_v2_0 = -1; static int hf_gvcp_sc_zone9_direction_v2_0 = -1; static int hf_gvcp_sc_zone10_direction_v2_0 = -1; static int hf_gvcp_sc_zone11_direction_v2_0 = -1; static int hf_gvcp_sc_zone12_direction_v2_0 = -1; static int hf_gvcp_sc_zone13_direction_v2_0 = -1; static int hf_gvcp_sc_zone14_direction_v2_0 = -1; static int hf_gvcp_sc_zone15_direction_v2_0 = -1; static int hf_gvcp_sc_zone16_direction_v2_0 = -1; static int hf_gvcp_sc_zone17_direction_v2_0 = -1; static int hf_gvcp_sc_zone18_direction_v2_0 = -1; static int hf_gvcp_sc_zone19_direction_v2_0 = -1; static int hf_gvcp_sc_zone20_direction_v2_0 = -1; static int hf_gvcp_sc_zone21_direction_v2_0 = -1; static int hf_gvcp_sc_zone22_direction_v2_0 = -1; static int hf_gvcp_sc_zone23_direction_v2_0 = -1; static int hf_gvcp_sc_zone24_direction_v2_0 = -1; static int hf_gvcp_sc_zone25_direction_v2_0 = -1; static int hf_gvcp_sc_zone26_direction_v2_0 = -1; static int hf_gvcp_sc_zone27_direction_v2_0 = -1; static int hf_gvcp_sc_zone28_direction_v2_0 = -1; static int hf_gvcp_sc_zone29_direction_v2_0 = -1; static int hf_gvcp_sc_zone30_direction_v2_0 = -1; static int hf_gvcp_sc_zone31_direction_v2_0 = -1; static int hf_gvcp_scheduledactioncommand_flag_v2_0 = -1; static int hf_gvcp_64bitid_flag_v2_0 = -1; static int hf_gvcp_resendcmd_extended_block_id_v2_0 = -1; static int hf_gvcp_resendcmd_extended_first_packet_id_v2_0 = -1; static int hf_gvcp_resendcmd_extended_last_packet_id_v2_0 = -1; static int hf_gvcp_actioncmd_time_v2_0 = -1; static int hf_gvcp_eventcmd_block_id_64bit_v2_0 = -1; /* Added for 2.1 support */ static int hf_gvcp_selected_ieee1588_profile_v2_1 = -1; static int hf_gvcp_capability_ieee1588_extended_capabilities_v2_1 = -1; static int hf_gvcp_ieee1588_profile_registers_present_v2_1 = -1; static int hf_gvcp_ieee1588_ptp_profile_supported_v2_1 = -1; static int hf_gvcp_ieee1588_802dot1as_profile_supported_v2_1 = -1; static int hf_gvcp_sc_multi_part_supported_v2_1 = -1; static int hf_gvcp_sc_large_leader_trailer_supported_v2_1 = -1; static int hf_gvcp_sc_multi_part_enabled_v2_1 = -1; static int hf_gvcp_sc_large_leader_trailer_enabled_v2_1 = -1; /* Generated from convert_proto_tree_add_text.pl */ static int hf_gvcp_custom_register_value = -1; static int hf_gvcp_custom_read_register_addr = -1; static int hf_gvcp_readmemcmd_data_read = -1; static int hf_gvcp_custom_read_register_value = -1; static int hf_gvcp_manifest_table = -1; static int hf_gvcp_reserved_bit = -1; /*Define the tree for gvcp*/ static int ett_gvcp = -1; static int ett_gvcp_cmd = -1; static int ett_gvcp_flags = -1; static int ett_gvcp_ack = -1; static int ett_gvcp_payload_cmd = -1; static int ett_gvcp_payload_ack = -1; static int ett_gvcp_payload_cmd_subtree = -1; static int ett_gvcp_payload_ack_subtree = -1; static int ett_gvcp_bootstrap_fields = -1; static dissector_handle_t gvcp_handle; static dissector_handle_t gvsp_handle; /*Device Mode*/ static const value_string devicemodenames_class[] = { { GEV_DEVICEMODE_TRANSMITTER, "Transmitter" }, { GEV_DEVICEMODE_RECEIVER, "Receiver" }, { GEV_DEVICEMODE_TRANSCEIVER, "Transceiver" }, { GEV_DEVICEMODE_PERIPHERAL, "Peripheral" }, {0, NULL}, }; /*Current Link Configuration*/ static const value_string linkconfiguration_class[] = { { GEV_LINKCONFIG_SINGLELINK, "Single Link" }, { GEV_LINKCONFIG_MULTIPLELINKS, "Multiple Links" }, { GEV_LINKCONFIG_STATICLAG, "Static LAG" }, { GEV_LINKCONFIG_DYNAMICLAG, "Dynamic LAG" }, {0, NULL}, }; static const value_string devicemodenames_characterset[] = { { 0x01, "UTF-8 Character Set" }, { 0x00, "Reserved" }, { 0, NULL }, }; static const value_string commandnames[] = { { GVCP_DISCOVERY_CMD, "DISCOVERY_CMD" }, { GVCP_FORCEIP_CMD, "FORCEIP_CMD" }, { GVCP_PACKETRESEND_CMD, "PACKETRESEND_CMD" }, { GVCP_READREG_CMD, "READREG_CMD" }, { GVCP_WRITEREG_CMD, "WRITEREG_CMD" }, { GVCP_READMEM_CMD, "READMEM_CMD" }, { GVCP_WRITEMEM_CMD, "WRITEMEM_CMD" }, { GVCP_EVENT_CMD, "EVENT_CMD" }, { GVCP_EVENTDATA_CMD, "EVENTDATA_CMD" }, { GVCP_ACTION_CMD, "ACTION_CMD" }, { 0, NULL } }; static const value_string acknowledgenames[] = { { GVCP_DISCOVERY_ACK, "DISCOVERY_ACK" }, { GVCP_FORCEIP_ACK, "FORCEIP_ACK" }, { GVCP_PACKETRESEND_ACK, "PACKETRESEND_ACK" }, { GVCP_READREG_ACK, "READREG_ACK" }, { GVCP_WRITEREG_ACK, "WRITEREG_ACK" }, { GVCP_READMEM_ACK, "READMEM_ACK" }, { GVCP_WRITEMEM_ACK, "WRITEMEM_ACK" }, { GVCP_PENDING_ACK, "PENDING_ACK" }, { GVCP_EVENT_ACK, "EVENT_ACK" }, { GVCP_EVENTDATA_ACK, "EVENTDATA_ACK" }, { GVCP_ACTION_ACK, "ACTION_ACK" }, { 0, NULL }, }; static const value_string eventidnames[] = { { GEV_EVENT_TRIGGER, "GEV_EVENT_TRIGGER (deprecated)" }, { GEV_EVENT_START_OF_EXPOSURE, "GEV_EVENT_START_OF_EXPOSURE (deprecated)" }, { GEV_EVENT_END_OF_EXPOSURE, "GEV_EVENT_END_OF_EXPOSURE (deprecated)" }, { GEV_EVENT_START_OF_TRANSFER, "GEV_EVENT_START_OF_TRANSFER (deprecated)" }, { GEV_EVENT_END_OF_TRANSFER, "GEV_EVENT_END_OF_TRANSFER (deprecated)" }, { GEV_EVENT_PRIMARY_APP_SWITCH, "GEV_EVENT_PRIMARY_APP_SWITCH" }, { GEV_EVENT_EVENT_LINK_SPEED_CHANGE, "GEV_EVENT_EVENT_LINK_SPEED_CHANGE" }, { GEV_EVENT_ACTION_LATE, "GEV_EVENT_ACTION_LATE" }, { GEV_EVENT_ERROR_001, "GEV_EVENT_ERROR_001" }, { 0, NULL }, }; static const value_string statusnames[] = { { GEV_STATUS_SUCCESS, "GEV_STATUS_SUCCESS" }, { GEV_STATUS_PACKET_RESEND, "GEV_STATUS_PACKET_RESEND" }, { GEV_STATUS_NOT_IMPLEMENTED, "GEV_STATUS_NOT_IMPLEMENTED" }, { GEV_STATUS_INVALID_PARAMETER, "GEV_STATUS_INVALID_PARAMETER" }, { GEV_STATUS_INVALID_ADDRESS, "GEV_STATUS_INVALID_ADDRESS" }, { GEV_STATUS_WRITE_PROTECT, "GEV_STATUS_WRITE_PROTECT" }, { GEV_STATUS_BAD_ALIGNMENT, "GEV_STATUS_BAD_ALIGNMENT" }, { GEV_STATUS_ACCESS_DENIED, "GEV_STATUS_ACCESS_DENIED" }, { GEV_STATUS_BUSY, "GEV_STATUS_BUSY" }, { GEV_STATUS_LOCAL_PROBLEM, "GEV_STATUS_LOCAL_PROBLEM (deprecated)" }, { GEV_STATUS_MSG_MISMATCH, "GEV_STATUS_MSG_MISMATCH (deprecated)" }, { GEV_STATUS_INVALID_PROTOCOL, "GEV_STATUS_INVALID_PROTOCOL (deprecated)" }, { GEV_STATUS_NO_MSG, "GEV_STATUS_NO_MSG (deprecated)" }, { GEV_STATUS_PACKET_UNAVAILABLE, "GEV_STATUS_PACKET_UNAVAILABLE" }, { GEV_STATUS_DATA_OVERRUN, "GEV_STATUS_DATA_OVERRUN" }, { GEV_STATUS_INVALID_HEADER, "GEV_STATUS_INVALID_HEADER" }, { GEV_STATUS_WRONG_CONFIG, "GEV_STATUS_WRONG_CONFIG (deprecated)" }, { GEV_STATUS_PACKET_NOT_YET_AVAILABLE, "GEV_STATUS_PACKET_NOT_YET_AVAILABLE" }, { GEV_STATUS_PACKET_AND_PREV_REMOVED_FROM_MEMORY, "GEV_STATUS_PACKET_AND_PREV_REMOVED_FROM_MEMORY" }, { GEV_STATUS_PACKET_REMOVED_FROM_MEMORY, "GEV_STATUS_PACKET_REMOVED_FROM_MEMORY" }, { GEV_STATUS_NO_REF_TIME, "GEV_STATUS_NO_REF_TIME" }, { GEV_STATUS_PACKET_TEMPORARILY_UNAVAILABLE, "GEV_STATUS_PACKET_TEMPORARILY_UNAVAILABLE" }, { GEV_STATUS_OVERFLOW, "GEV_STATUS_OVERFLOW" }, { GEV_STATUS_ACTION_LATE, "GEV_STATUS_ACTION_LATE" }, { GEV_STATUS_LEADER_TRAILER_OVERFLOW, "GEV_STATUS_LEADER_TRAILER_OVERFLOW" }, { GEV_STATUS_ERROR, "GEV_STATUS_ERROR" }, { 0, NULL }, }; static const value_string statusnames_short[] = { { GEV_STATUS_SUCCESS, "" }, { GEV_STATUS_PACKET_RESEND, "(Packet Resend) " }, { GEV_STATUS_NOT_IMPLEMENTED, "(Not Implemented) " }, { GEV_STATUS_INVALID_PARAMETER, "(Invalid Parameter) " }, { GEV_STATUS_INVALID_ADDRESS, "(Invalid Address) " }, { GEV_STATUS_WRITE_PROTECT, "(Write Protect) " }, { GEV_STATUS_BAD_ALIGNMENT, "(Bad Alignment) " }, { GEV_STATUS_ACCESS_DENIED, "(Access Denied) " }, { GEV_STATUS_BUSY, "(Busy) " }, { GEV_STATUS_LOCAL_PROBLEM, "(Local Problem) " }, { GEV_STATUS_MSG_MISMATCH, "(Message Mismatch) " }, { GEV_STATUS_INVALID_PROTOCOL, "(Invalid Protocol) " }, { GEV_STATUS_NO_MSG, "(No Message) " }, { GEV_STATUS_PACKET_UNAVAILABLE, "(Packet Unavailable) " }, { GEV_STATUS_DATA_OVERRUN, "(Data Overrun) " }, { GEV_STATUS_INVALID_HEADER, "(Invalid Header) " }, { GEV_STATUS_WRONG_CONFIG, "(Wrong Configuration) " }, { GEV_STATUS_PACKET_NOT_YET_AVAILABLE, "(Packet not yet available) " }, { GEV_STATUS_PACKET_AND_PREV_REMOVED_FROM_MEMORY, "(Packet and previous removed from memory) " }, { GEV_STATUS_PACKET_REMOVED_FROM_MEMORY, "(Packet removed from memory) " }, { GEV_STATUS_NO_REF_TIME, "(No reference time)" }, { GEV_STATUS_PACKET_TEMPORARILY_UNAVAILABLE, "(Packet temp. unavailable)" }, { GEV_STATUS_OVERFLOW, "(overflow)" }, { GEV_STATUS_ACTION_LATE, "(Action late)" }, { GEV_STATUS_LEADER_TRAILER_OVERFLOW, "(Leader/Trailer overflow)" }, { GEV_STATUS_ERROR, "(Error) " }, { 0, NULL }, }; static const true_false_string directionnames = { "Receiver", "Transmitter" }; static const true_false_string zonedirectionnames = { "Bottom-Up", "Top-Down" }; /* brief Register name to address mappings */ const value_string bootstrapregisternames[] = { { GVCP_VERSION, "[Version]" }, { GVCP_DEVICE_MODE, "[Device Mode]" }, { GVCP_DEVICE_MAC_HIGH_0, "[Device MAC address High (Net #0)]" }, { GVCP_DEVICE_MAC_LOW_0, "[Device MAC address Low (Net #0)]" }, { GVCP_SUPPORTED_IP_CONFIGURATION_0, "[Supported IP Configuration (Net #0)]" }, { GVCP_CURIPCFG_0, "[Current IP Configuration (Net #0)]" }, { GVCP_CURRENT_IP_ADDRESS_0, "[Current IP Address (Net #0)]" }, { GVCP_CURRENT_SUBNET_MASK_0, "[Current Subnet Mask (Net #0)]" }, { GVCP_CURRENT_DEFAULT_GATEWAY_0, "[Current Default Gateway (Net #0)]" }, { GVCP_MANUFACTURER_NAME, "[Manufacturer Name]" }, { GVCP_MODEL_NAME, "[Model Name]" }, { GVCP_DEVICE_VERSION, "[Device Version]" }, { GVCP_MANUFACTURER_INFO, "[Manufacturer Specific Information]" }, { GVCP_SERIAL_NUMBER, "[Serial Number]" }, { GVCP_USER_DEFINED_NAME, "[User-defined Name]" }, { GVCP_FIRST_URL, "[First Choice of URL for XML device description file]" }, { GVCP_SECOND_URL, "[Second Choice of URL for XML device description file]" }, { GVCP_NUMBER_OF_NETWORK_INTERFACES, "[Number of network interfaces]" }, { GVCP_PERSISTENT_IP_ADDRESS_0, "[Persistent IP address (Net #0)]" }, { GVCP_PERSISTENT_SUBNET_MASK_0, "[Persistent subnet mask (Net #0)]" }, { GVCP_PERSISTENT_DEFAULT_GATEWAY_0, "[Persistent default gateway (Net# 0)]" }, { GVCP_LINK_SPEED_0, "[Link Speed (Net #0)]" }, { GVCP_DEVICE_MAC_HIGH_1, "[Device MAC address High (Net #1)]" }, { GVCP_DEVICE_MAC_LOW_1, "[Device MAC address Low (Net #1)]" }, { GVCP_SUPPORTED_IP_CONFIGURATION_1, "[Supported IP Configuration (Net #1)]" }, { GVCP_CURIPCFG_1, "[Current IP Configuration (Net #1)]" }, { GVCP_CURRENT_IP_ADDRESS_1, "[Current IP Address (Net #1)]" }, { GVCP_CURRENT_SUBNET_MASK_1, "[Current Subnet Mask (Net #1)]" }, { GVCP_CURRENT_DEFAULT_GATEWAY_1, "[Current Default Gateway (Net #1)]" }, { GVCP_PERSISTENT_IP_ADDRESS_1, "[Persistent IP address (Net #1)]" }, { GVCP_PERSISTENT_SUBNET_MASK_1, "[Persistent subnet mask (Net#1)]" }, { GVCP_PERSISTENT_DEFAULT_GATEWAY_1, "[Persistent default gateway (Net #1)]" }, { GVCP_LINK_SPEED_1, "[Link Speed (Net #1)]" }, { GVCP_DEVICE_MAC_HIGH_2, "[Device MAC address High (Net #2)]" }, { GVCP_DEVICE_MAC_LOW_2, "[Device MAC address Low (Net #2)]" }, { GVCP_SUPPORTED_IP_CONFIGURATION_2, "[Supported IP Configuration (Net #2)]" }, { GVCP_CURIPCFG_2, "[Current IP Configuration (Net #2)]" }, { GVCP_CURRENT_IP_ADDRESS_2, "[Current IP Address (Net #2)]" }, { GVCP_CURRENT_SUBNET_MASK_2, "[Current Subnet Mask (Net #2)]" }, { GVCP_CURRENT_DEFAULT_GATEWAY_2, "[Current Default Gateway (Net #2)]" }, { GVCP_PERSISTENT_IP_ADDRESS_2, "[Persistent IP address (Net #2)]" }, { GVCP_PERSISTENT_SUBNET_MASK_2, "[Persistent subnet mask (Net #2)]" }, { GVCP_PERSISTENT_DEFAULT_GATEWAY_2, "[Persistent default gateway (Net #2)]" }, { GVCP_LINK_SPEED_2, "[Link Speed (Net #2)]" }, { GVCP_DEVICE_MAC_HIGH_3, "[Device MAC address High (Net #3)]" }, { GVCP_DEVICE_MAC_LOW_3, "[Device MAC address Low (Net #3)]" }, { GVCP_SUPPORTED_IP_CONFIGURATION_3, "[Supported IP Configuration (Net #3)]" }, { GVCP_CURIPCFG_3, "[Current IP Configuration (Net #3)]" }, { GVCP_CURRENT_IP_ADDRESS_3, "[Current IP Address (Net #3)]" }, { GVCP_CURRENT_SUBNET_MASK_3, "[Current Subnet Mask (Net #3)]" }, { GVCP_CURRENT_DEFAULT_GATEWAY_3, "[Current Default Gateway (Net #3)]" }, { GVCP_PERSISTENT_IP_ADDRESS_3, "[Persistent IP address (Net #3)]" }, { GVCP_PERSISTENT_SUBNET_MASK_3, "[Persistent subnet mask (Net #3)]" }, { GVCP_PERSISTENT_DEFAULT_GATEWAY_3, "[Persistent default gateway (Net #3)]" }, { GVCP_LINK_SPEED_3, "[Link Speed (Net #3)]" }, { GVCP_NUMBER_OF_MESSAGE_CHANNELS, "[Number of Message Channels]" }, { GVCP_NUMBER_OF_STREAM_CHANNELS, "[Number of Stream Channels]" }, { GVCP_NUMBER_OF_ACTION_SIGNALS, "[Number of Action Signals]" }, { GVCP_ACTION_DEVICE_KEY, "[Action Device Key]" }, { GVCP_SC_CAPS, "[Stream channels Capability]" }, { GVCP_MESSAGE_CHANNEL_CAPS, "[Message channel Capability]" }, { GVCP_CAPABILITY, "[GVCP Capability]" }, { GVCP_HEARTBEAT_TIMEOUT, "[Heartbeat timeout]" }, { GVCP_TIMESTAMP_TICK_FREQUENCY_HIGH, "[Timestamp tick frequency - High]" }, { GVCP_TIMESTAMP_TICK_FREQUENCY_LOW, "[Timestamp tick frequency - Low]" }, { GVCP_TIMESTAMP_CONTROL, "[Timestamp control]" }, { GVCP_TIMESTAMP_VALUE_HIGH, "[Timestamp value (latched) - High]" }, { GVCP_TIMESTAMP_VALUE_LOW, "[Timestamp value (latched) - Low]" }, { GVCP_DISCOVERY_ACK_DELAY, "[Discovery ACK delay]" }, { GVCP_CONFIGURATION, "[GVCP Configuration]" }, { GVCP_PENDING_TIMEOUT, "[Pending Timeout]" }, { GVCP_CONTROL_SWITCHOVER_KEY, "[Control switchover key]" }, { GVCP_GVSCP_CONFIGURATION, "[GVSP Configuration]" }, { GVCP_PHYSICAL_LINK_CAPABILITY, "[Physical link capability]" }, { GVCP_PHYSICAL_LINK_CONFIGURATION, "[Physical link configuration]" }, { GVCP_IEEE_1588_STATUS, "[IEEE1588 status]" }, { GVCP_SCHEDULED_ACTION_COMMAND_QUEUE_SIZE, "[Scheduled action command queue size]" }, { GVCP_IEEE_1588_EXTENDED_CAPABILITY, "[IEEE1588 extended capabilities]" }, { GVCP_IEEE_1588_SUPPORTED_PROFILES, "[IEEE1588 supported profiles]" }, { GVCP_IEEE_1588_SELECTED_PROFILE, "[IEEE1588 selected profile]" }, { GVCP_CCP, "[CCP (Control Channel Privilege)]" }, { GVCP_PRIMARY_APPLICATION_PORT, "[Primary Application Port]" }, { GVCP_PRIMARY_APPLICATION_IP_ADDRESS, "[Primary Application IP address]" }, { GVCP_MC_DESTINATION_PORT, "[MCP (Message Channel Port)]" }, { GVCP_MC_DESTINATION_ADDRESS, "[MCDA (Message Channel Destination Address)]" }, { GVCP_MC_TIMEOUT, "[MCTT (Message Channel Transmission Timeout in ms)]" }, { GVCP_MC_RETRY_COUNT, "[MCRC (Message Channel Retry Count)]" }, { GVCP_MC_SOURCE_PORT, "[MCSP (Message Channel Source Port)]" }, { GVCP_SC_DESTINATION_PORT(0), "[SCP0 (Stream Channel #0 Port)]" }, { GVCP_SC_PACKET_SIZE(0), "[SCPS0 (Stream Channel #0 Packet Size)]" }, { GVCP_SC_PACKET_DELAY(0), "[SCPD0 (Stream Channel #0 Packet Delay)]" }, { GVCP_SC_DESTINATION_ADDRESS(0), "[SCDA0 (Stream Channel #0 Destination Address)]" }, { GVCP_SC_SOURCE_PORT(0), "[SCSP0 (Stream Channel #0 Source Port)]" }, { GVCP_SC_CAPABILITY(0), "[SCC0 (Stream Channel #0 Capability)]" }, { GVCP_SC_CONFIGURATION(0), "[SCCONF0 (Stream Channel #0 Configuration)]" }, { GVCP_SC_DESTINATION_PORT(1), "[SCP1 (Stream Channel #1 Port)]" }, { GVCP_SC_PACKET_SIZE(1), "[SCPS1 (Stream Channel #1 Packet Size)]" }, { GVCP_SC_PACKET_DELAY(1), "[SCPD1 (Stream Channel #1 Packet Delay)]" }, { GVCP_SC_DESTINATION_ADDRESS(1), "[SCDA1 (Stream Channel #1 Destination Address)]" }, { GVCP_SC_SOURCE_PORT(1), "[SCSP1 (Stream Channel #1 Source Port)]" }, { GVCP_SC_CAPABILITY(1), "[SCC1 (Stream Channel #1 Capability)]" }, { GVCP_SC_CONFIGURATION(1), "[SCCONF1 (Stream Channel #1 Configuration)]" }, { GVCP_SC_DESTINATION_PORT(2), "[SCP2 (Stream Channel #2 Port)]" }, { GVCP_SC_PACKET_SIZE(2), "[SCPS2 (Stream Channel #2 Packet Size)]" }, { GVCP_SC_PACKET_DELAY(2), "[SCPD2 (Stream Channel #2 Packet Delay)]" }, { GVCP_SC_DESTINATION_ADDRESS(2), "[SCDA2 (Stream Channel #2 Destination Address)]" }, { GVCP_SC_SOURCE_PORT(2), "[SCSP2 (Stream Channel #2 Source Port)]" }, { GVCP_SC_CAPABILITY(2), "[SCC2 (Stream Channel #2 Capability)]" }, { GVCP_SC_CONFIGURATION(2), "[SCCONF2 (Stream Channel #2 Configuration)]" }, { GVCP_SC_DESTINATION_PORT(3), "[SCP3 (Stream Channel #3 Port)]" }, { GVCP_SC_PACKET_SIZE(3), "[SCPS3 (Stream Channel #3 Packet Size)]" }, { GVCP_SC_PACKET_DELAY(3), "[SCPD3 (Stream Channel #3 Packet Delay)]" }, { GVCP_SC_DESTINATION_ADDRESS(3), "[SCDA3 (Stream Channel #3 Destination Address)]" }, { GVCP_SC_SOURCE_PORT(3), "[SCSP3 (Stream Channel #3 Source Port)]" }, { GVCP_SC_CAPABILITY(3), "[SCC3 (Stream Channel #3 Capability)]" }, { GVCP_SC_CONFIGURATION(3), "[SCCONF3 (Stream Channel #3 Configuration)]" }, { GVCP_MANIFEST_TABLE, "[Manifest Table]" }, { GVCP_ACTION_GROUP_KEY(0), "[Action Group Key #0]" }, { GVCP_ACTION_GROUP_MASK(0), "[Action Group Mask #0]" }, { GVCP_ACTION_GROUP_KEY(1), "[Action Group Key #1]" }, { GVCP_ACTION_GROUP_MASK(1), "[Action Group Mask #1]" }, { GVCP_ACTION_GROUP_KEY(2), "[Action Group Key #2]" }, { GVCP_ACTION_GROUP_MASK(2), "[Action Group Mask #2]" }, { GVCP_ACTION_GROUP_KEY(3), "[Action Group Key #3]" }, { GVCP_ACTION_GROUP_MASK(3), "[Action Group Mask #3]" }, { GVCP_ACTION_GROUP_KEY(4), "[Action Group Key #4]" }, { GVCP_ACTION_GROUP_MASK(4), "[Action Group Mask #4]" }, { GVCP_ACTION_GROUP_KEY(5), "[Action Group Key #5]" }, { GVCP_ACTION_GROUP_MASK(5), "[Action Group Mask #5]" }, { GVCP_ACTION_GROUP_KEY(6), "[Action Group Key #6]" }, { GVCP_ACTION_GROUP_MASK(6), "[Action Group Mask #6]" }, { GVCP_ACTION_GROUP_KEY(7), "[Action Group Key #7]" }, { GVCP_ACTION_GROUP_MASK(7), "[Action Group Mask #7]" }, { GVCP_ACTION_GROUP_KEY(8), "[Action Group Key #8]" }, { GVCP_ACTION_GROUP_MASK(8), "[Action Group Mask #8]" }, { GVCP_ACTION_GROUP_KEY(9), "[Action Group Key #9]" }, { GVCP_ACTION_GROUP_MASK(9), "[Action Group Mask #9]" }, { 0, NULL }, }; /* \brief Returns a register name based on its address */ static const gchar* get_register_name_from_address(guint32 addr, gboolean* is_custom_register) { const gchar* address_string = NULL; if (is_custom_register != NULL) { *is_custom_register = FALSE; } address_string = try_val_to_str(addr, bootstrapregisternames); if (!address_string) { address_string = wmem_strdup_printf(wmem_packet_scope(),"[Addr:0x%08X]", addr); if (is_custom_register != NULL) { *is_custom_register = TRUE; } } return address_string; } /* \brief Attempts to dissect a bootstrap register */ static int dissect_register(guint32 addr, proto_tree *branch, tvbuff_t *tvb, gint offset, gint length) { switch (addr) { case GVCP_VERSION: proto_tree_add_item(branch, hf_gvcp_spec_version_major, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_spec_version_minor, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_DEVICE_MODE: proto_tree_add_item(branch, hf_gvcp_devicemode_endianness, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_devicemode_deviceclass, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_devicemode_current_link_configuration_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_devicemode_characterset, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_DEVICE_MAC_HIGH_0: case GVCP_DEVICE_MAC_HIGH_1: case GVCP_DEVICE_MAC_HIGH_2: case GVCP_DEVICE_MAC_HIGH_3: proto_tree_add_item(branch, hf_gvcp_machigh, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_DEVICE_MAC_LOW_0: case GVCP_DEVICE_MAC_LOW_1: case GVCP_DEVICE_MAC_LOW_2: case GVCP_DEVICE_MAC_LOW_3: proto_tree_add_item(branch, hf_gvcp_maclow, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_SUPPORTED_IP_CONFIGURATION_0: case GVCP_SUPPORTED_IP_CONFIGURATION_1: case GVCP_SUPPORTED_IP_CONFIGURATION_2: case GVCP_SUPPORTED_IP_CONFIGURATION_3: proto_tree_add_item(branch, hf_gvcp_ip_config_can_handle_pause_frames_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_ip_config_can_generate_pause_frames_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_ip_config_lla, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_ip_config_dhcp, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_ip_config_persistent_ip, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_CURIPCFG_0: case GVCP_CURIPCFG_1: case GVCP_CURIPCFG_2: case GVCP_CURIPCFG_3: proto_tree_add_item(branch, hf_gvcp_ip_config_can_handle_pause_frames_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_ip_config_can_generate_pause_frames_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_ip_config_lla, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_ip_config_dhcp, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_ip_config_persistent_ip, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_CURRENT_IP_ADDRESS_0: case GVCP_CURRENT_IP_ADDRESS_1: case GVCP_CURRENT_IP_ADDRESS_2: case GVCP_CURRENT_IP_ADDRESS_3: proto_tree_add_item(branch, hf_gvcp_current_IP, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_CURRENT_SUBNET_MASK_0: case GVCP_CURRENT_SUBNET_MASK_1: case GVCP_CURRENT_SUBNET_MASK_2: case GVCP_CURRENT_SUBNET_MASK_3: proto_tree_add_item(branch, hf_gvcp_current_subnet_mask, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_CURRENT_DEFAULT_GATEWAY_0: case GVCP_CURRENT_DEFAULT_GATEWAY_1: case GVCP_CURRENT_DEFAULT_GATEWAY_2: case GVCP_CURRENT_DEFAULT_GATEWAY_3: proto_tree_add_item(branch, hf_gvcp_current_default_gateway, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_MANUFACTURER_NAME: proto_tree_add_item(branch, hf_gvcp_reserved_bit, tvb, 0, length, ENC_NA); /*? */ break; case GVCP_MODEL_NAME: proto_tree_add_item(branch, hf_gvcp_reserved_bit, tvb, 0, length, ENC_NA); /*? */ break; case GVCP_DEVICE_VERSION: proto_tree_add_item(branch, hf_gvcp_reserved_bit, tvb, 0, length, ENC_NA); /*? */ break; case GVCP_MANUFACTURER_INFO: proto_tree_add_item(branch, hf_gvcp_reserved_bit, tvb, 0, length, ENC_NA); /*? */ break; case GVCP_SERIAL_NUMBER: proto_tree_add_item(branch, hf_gvcp_reserved_bit, tvb, 0, length, ENC_NA); /*? */ break; case GVCP_USER_DEFINED_NAME: proto_tree_add_item(branch, hf_gvcp_user_defined_name, tvb, offset, 4, ENC_ASCII|ENC_NA); /*? */ break; case GVCP_FIRST_URL: proto_tree_add_item(branch, hf_gvcp_reserved_bit, tvb, 0, length, ENC_NA); /*? */ break; case GVCP_SECOND_URL: proto_tree_add_item(branch, hf_gvcp_reserved_bit, tvb, 0, length, ENC_NA); /*? */ break; case GVCP_NUMBER_OF_NETWORK_INTERFACES: proto_tree_add_item(branch, hf_gvcp_number_interfaces, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_PERSISTENT_IP_ADDRESS_0: case GVCP_PERSISTENT_IP_ADDRESS_1: case GVCP_PERSISTENT_IP_ADDRESS_2: case GVCP_PERSISTENT_IP_ADDRESS_3: proto_tree_add_item(branch, hf_gvcp_persistent_ip, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_PERSISTENT_SUBNET_MASK_0: case GVCP_PERSISTENT_SUBNET_MASK_1: case GVCP_PERSISTENT_SUBNET_MASK_2: case GVCP_PERSISTENT_SUBNET_MASK_3: proto_tree_add_item(branch, hf_gvcp_persistent_subnet, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_PERSISTENT_DEFAULT_GATEWAY_0: case GVCP_PERSISTENT_DEFAULT_GATEWAY_1: case GVCP_PERSISTENT_DEFAULT_GATEWAY_2: case GVCP_PERSISTENT_DEFAULT_GATEWAY_3: proto_tree_add_item(branch, hf_gvcp_persistent_gateway, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_LINK_SPEED_0: case GVCP_LINK_SPEED_1: case GVCP_LINK_SPEED_2: case GVCP_LINK_SPEED_3: proto_tree_add_item(branch, hf_gvcp_link_speed, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_NUMBER_OF_MESSAGE_CHANNELS: proto_tree_add_item(branch, hf_gvcp_number_message_channels, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_NUMBER_OF_STREAM_CHANNELS: proto_tree_add_item(branch, hf_gvcp_number_stream_channels, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_NUMBER_OF_ACTION_SIGNALS: proto_tree_add_item(branch, hf_gvcp_number_action_signals, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_ACTION_DEVICE_KEY: proto_tree_add_item(branch, hf_gvcp_writeregcmd_data, tvb, offset, 4, ENC_BIG_ENDIAN); /*? */ break; case GVCP_NUMBER_OF_ACTIVE_LINKS: proto_tree_add_item(branch, hf_gvcp_number_of_active_links_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_SC_CAPS: proto_tree_add_item(branch, hf_gvcp_sccaps_scspx_register_supported, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sccaps_legacy_16bit_blockid_supported_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_MESSAGE_CHANNEL_CAPS: proto_tree_add_item(branch, hf_gvcp_mcsp_supported, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_CAPABILITY: proto_tree_add_item(branch, hf_gvcp_capability_user_defined, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_serial_number, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_heartbeat_disable, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_link_speed, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_ccp_application_portip, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_manifest_table, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_test_data, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_discovery_ACK_delay, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_writable_discovery_ACK_delay, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_extended_status_code_v1_1, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_primary_application_switchover, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_unconditional_action_command, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_1588_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_extended_status_code_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_scheduled_action_command_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_ieee1588_extended_capabilities_v2_1, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_action_command, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_pending, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_evendata, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_event, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_packetresend, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_writemem, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_capability_concatenation, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_HEARTBEAT_TIMEOUT: proto_tree_add_item(branch, hf_gvcp_heartbeat, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_TIMESTAMP_TICK_FREQUENCY_HIGH: proto_tree_add_item(branch, hf_gvcp_high_timestamp_frequency, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_TIMESTAMP_TICK_FREQUENCY_LOW: proto_tree_add_item(branch, hf_gvcp_low_timestamp_frequency, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_TIMESTAMP_CONTROL: proto_tree_add_item(branch, hf_gvcp_timestamp_control_latch, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_timestamp_control_reset, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_TIMESTAMP_VALUE_HIGH: proto_tree_add_item(branch, hf_gvcp_high_timestamp_value, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_TIMESTAMP_VALUE_LOW: proto_tree_add_item(branch, hf_gvcp_low_timestamp_value, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_DISCOVERY_ACK_DELAY: proto_tree_add_item(branch, hf_gvcp_discovery_ACK_delay, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_CONFIGURATION: proto_tree_add_item(branch, hf_gvcp_configuration_1588_enable_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_configuration_extended_status_codes_enable_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_configuration_unconditional_action_command_enable_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_configuration_extended_status_codes_enable_v1_1, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_configuration_pending_ack_enable, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_configuration_heartbeat_disable, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_PENDING_TIMEOUT: proto_tree_add_item(branch, hf_gvcp_pending_timeout_max_execution, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_CONTROL_SWITCHOVER_KEY: proto_tree_add_item(branch, hf_gvcp_control_switchover_key_register, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_GVSCP_CONFIGURATION: proto_tree_add_item(branch, hf_gvcp_gvsp_configuration_64bit_blockid_enable_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_PHYSICAL_LINK_CAPABILITY: proto_tree_add_item(branch, hf_gvcp_link_dlag_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_link_slag_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_link_ml_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_link_sl_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_PHYSICAL_LINK_CONFIGURATION: proto_tree_add_item(branch, hf_gvcp_link_dlag_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_link_slag_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_link_ml_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_link_sl_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_IEEE_1588_STATUS: proto_tree_add_item(branch, hf_gvcp_ieee1588_clock_status_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_SCHEDULED_ACTION_COMMAND_QUEUE_SIZE: proto_tree_add_item(branch, hf_gvcp_scheduled_action_command_queue_size_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_IEEE_1588_EXTENDED_CAPABILITY: proto_tree_add_item(branch, hf_gvcp_ieee1588_profile_registers_present_v2_1, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_IEEE_1588_SUPPORTED_PROFILES: proto_tree_add_item(branch, hf_gvcp_ieee1588_ptp_profile_supported_v2_1, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_ieee1588_802dot1as_profile_supported_v2_1, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_IEEE_1588_SELECTED_PROFILE: proto_tree_add_item(branch, hf_gvcp_selected_ieee1588_profile_v2_1, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_CCP: proto_tree_add_item(branch, hf_gvcp_control_switchover_key, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_control_switchover_en, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_control_access, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_exclusive_access, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_PRIMARY_APPLICATION_PORT: proto_tree_add_item(branch, hf_gvcp_primary_application_host_port, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_PRIMARY_APPLICATION_IP_ADDRESS: proto_tree_add_item(branch, hf_gvcp_primary_application_ip_address, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_MC_DESTINATION_PORT: proto_tree_add_item(branch, hf_gvcp_network_interface_index, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_host_port, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_MC_DESTINATION_ADDRESS: proto_tree_add_item(branch, hf_gvcp_channel_destination_ip, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_MC_TIMEOUT: proto_tree_add_item(branch, hf_gvcp_message_channel_transmission_timeout, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_MC_RETRY_COUNT: proto_tree_add_item(branch, hf_gvcp_message_channel_retry_count, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_MC_SOURCE_PORT: proto_tree_add_item(branch, hf_gvcp_message_channel_source_port, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_SC_DESTINATION_PORT(0): case GVCP_SC_DESTINATION_PORT(1): case GVCP_SC_DESTINATION_PORT(2): case GVCP_SC_DESTINATION_PORT(3): proto_tree_add_item(branch, hf_gvcp_sc_direction, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_ni_index, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_host_port, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_SC_PACKET_SIZE(0): case GVCP_SC_PACKET_SIZE(1): case GVCP_SC_PACKET_SIZE(2): case GVCP_SC_PACKET_SIZE(3): proto_tree_add_item(branch, hf_gvcp_sc_fire_test_packet, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_do_not_fragment, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_pixel_endianness, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_packet_size, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_SC_PACKET_DELAY(0): case GVCP_SC_PACKET_DELAY(1): case GVCP_SC_PACKET_DELAY(2): case GVCP_SC_PACKET_DELAY(3): proto_tree_add_item(branch, hf_gvcp_sc_packet_delay, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_SC_DESTINATION_ADDRESS(0): case GVCP_SC_DESTINATION_ADDRESS(1): case GVCP_SC_DESTINATION_ADDRESS(2): case GVCP_SC_DESTINATION_ADDRESS(3): { guint32 value = 0; value = tvb_get_letohl(tvb, offset); proto_tree_add_ipv4(branch, hf_gvcp_sc_destination_ip, tvb, offset, 4, value); } break; case GVCP_SC_SOURCE_PORT(0): case GVCP_SC_SOURCE_PORT(1): case GVCP_SC_SOURCE_PORT(2): case GVCP_SC_SOURCE_PORT(3): proto_tree_add_item(branch, hf_gvcp_sc_source_port, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_SC_CAPABILITY(0): case GVCP_SC_CAPABILITY(1): case GVCP_SC_CAPABILITY(2): case GVCP_SC_CAPABILITY(3): proto_tree_add_item(branch, hf_gvcp_sc_big_little_endian_supported, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_ip_reassembly_supported, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_multi_part_supported_v2_1, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_large_leader_trailer_supported_v2_1, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_multizone_supported_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_packet_resend_destination_option_supported_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_packet_resend_all_in_transmission_supported_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_unconditional_streaming_supported, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_extended_chunk_data_supported, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_SC_CONFIGURATION(0): case GVCP_SC_CONFIGURATION(1): case GVCP_SC_CONFIGURATION(2): case GVCP_SC_CONFIGURATION(3): proto_tree_add_item(branch, hf_gvcp_sc_multi_part_enabled_v2_1, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_large_leader_trailer_enabled_v2_1, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_packet_resend_destination_option_enabled_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_packet_resend_all_in_transmission_enabled_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_unconditional_streaming_enabled, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_extended_chunk_data_enabled, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_SC_ZONE(0): case GVCP_SC_ZONE(1): case GVCP_SC_ZONE(2): case GVCP_SC_ZONE(3): proto_tree_add_item(branch, hf_gvcp_sc_additional_zones_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_SC_ZONE_DIRECTION(0): case GVCP_SC_ZONE_DIRECTION(1): case GVCP_SC_ZONE_DIRECTION(2): case GVCP_SC_ZONE_DIRECTION(3): proto_tree_add_item(branch, hf_gvcp_sc_zone0_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone1_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone2_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone3_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone4_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone5_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone6_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone7_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone8_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone9_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone10_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone11_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone12_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone13_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone14_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone15_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone16_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone17_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone18_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone19_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone20_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone21_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone22_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone23_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone24_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone25_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone26_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone27_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone28_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone29_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone30_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(branch, hf_gvcp_sc_zone31_direction_v2_0, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_MANIFEST_TABLE: proto_tree_add_item(branch, hf_gvcp_manifest_table, tvb, 0, length, ENC_NA); break; case GVCP_ACTION_GROUP_KEY(0): case GVCP_ACTION_GROUP_KEY(1): case GVCP_ACTION_GROUP_KEY(2): case GVCP_ACTION_GROUP_KEY(3): case GVCP_ACTION_GROUP_KEY(4): case GVCP_ACTION_GROUP_KEY(5): case GVCP_ACTION_GROUP_KEY(6): case GVCP_ACTION_GROUP_KEY(7): case GVCP_ACTION_GROUP_KEY(8): case GVCP_ACTION_GROUP_KEY(9): proto_tree_add_item(branch, hf_gvcp_action_group_key, tvb, offset, 4, ENC_BIG_ENDIAN); break; case GVCP_ACTION_GROUP_MASK(0): case GVCP_ACTION_GROUP_MASK(1): case GVCP_ACTION_GROUP_MASK(2): case GVCP_ACTION_GROUP_MASK(3): case GVCP_ACTION_GROUP_MASK(4): case GVCP_ACTION_GROUP_MASK(5): case GVCP_ACTION_GROUP_MASK(6): case GVCP_ACTION_GROUP_MASK(7): case GVCP_ACTION_GROUP_MASK(8): case GVCP_ACTION_GROUP_MASK(9): proto_tree_add_item(branch, hf_gvcp_action_group_mask, tvb, offset, 4, ENC_BIG_ENDIAN); break; default: return 0; } return 1; } /* Attempts to dissect a bootstrap register (readmem context) */ static int dissect_register_data(guint32 addr, proto_tree *branch, tvbuff_t *tvb, gint offset, gint length) { switch (addr) { case GVCP_MANUFACTURER_NAME: if (length == 32) { proto_tree_add_item(branch, hf_gvcp_manufacturer_name, tvb, offset, -1, ENC_ASCII|ENC_NA); } break; case GVCP_MODEL_NAME: if (length == 32) { proto_tree_add_item(branch, hf_gvcp_model_name, tvb, offset, -1, ENC_ASCII|ENC_NA); } break; case GVCP_DEVICE_VERSION: if (length == 32) { proto_tree_add_item(branch, hf_gvcp_device_version, tvb, offset, -1, ENC_ASCII|ENC_NA); } break; case GVCP_MANUFACTURER_INFO: if (length == 48) { proto_tree_add_item(branch, hf_gvcp_manufacturer_specific_info, tvb, offset, -1, ENC_ASCII|ENC_NA); } break; case GVCP_SERIAL_NUMBER: if (length == 16) { proto_tree_add_item(branch, hf_gvcp_serial_number, tvb, offset, -1, ENC_ASCII|ENC_NA); } break; case GVCP_USER_DEFINED_NAME: if (length == 16) { proto_tree_add_item(branch, hf_gvcp_user_defined_name, tvb, offset, -1, ENC_ASCII|ENC_NA); } break; case GVCP_FIRST_URL: if (length == 512) { proto_tree_add_item(branch, hf_gvcp_first_xml_device_description_file, tvb, offset, -1, ENC_ASCII|ENC_NA); } break; case GVCP_SECOND_URL: if (length == 512) { proto_tree_add_item(branch, hf_gvcp_second_xml_device_description_file, tvb, offset, -1, ENC_ASCII|ENC_NA); } break; default: return 0; } return 1; } /* \brief DISSECT: Force IP command */ static void dissect_forceip_cmd(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint startoffset, gint length) { const gint mac_offset = startoffset + 2; const gint ip_offset = startoffset + 20; const gint mask_offset = startoffset + 36; const gint gateway_offset = startoffset + 52; if (gvcp_telegram_tree != NULL) { gvcp_telegram_tree = proto_tree_add_subtree(gvcp_telegram_tree, tvb, startoffset, length, ett_gvcp_payload_cmd, NULL, "FORCEIP_CMD Options"); proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_forceip_mac_address, tvb, mac_offset, 6, ENC_NA); proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_forceip_static_IP, tvb, ip_offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_forceip_static_subnet_mask, tvb, mask_offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_forceip_static_default_gateway, tvb, gateway_offset, 4, ENC_BIG_ENDIAN); } } /* \brief DISSECT: Packet resend command */ static void dissect_packetresend_cmd(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, packet_info *pinfo, gint startoffset, gint length, int extendedblockid) { guint64 block_id = 0; guint32 first_packet = 0; guint32 last_packet = 0; gint offset; offset = startoffset; /* Get block ID to generate summary - supports 16 and 64 bits */ if (extendedblockid == 0) { block_id = tvb_get_ntohs(tvb, offset + 2); } else { guint64 highid; guint64 lowid; highid = tvb_get_ntohl(tvb, offset + 12); lowid = tvb_get_ntohl(tvb, offset + 16); block_id = lowid | (highid << 32); } /* Get first and last packet IDs for summary - supports 24 and 32 bits */ if (extendedblockid == 0) { /* in GEV1.2 and prior we use only 24 bit packet IDs */ first_packet = tvb_get_ntohl(tvb, offset + 4) & 0x00FFFFFF; last_packet = tvb_get_ntohl(tvb, offset + 8) & 0x00FFFFFF; } else { first_packet = tvb_get_ntohl(tvb, offset + 4); last_packet = tvb_get_ntohl(tvb, offset + 8); } col_append_fstr(pinfo->cinfo, COL_INFO, "Block %" G_GINT64_MODIFIER "u, Packets %d->%d", (gint64)block_id, first_packet, last_packet); if (gvcp_telegram_tree != NULL) { /* Command header/tree */ gvcp_telegram_tree = proto_tree_add_subtree(gvcp_telegram_tree, tvb, startoffset, length, ett_gvcp_payload_cmd, NULL, "PACKETRESEND_CMD Values"); /* Stream channel */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_resendcmd_stream_channel_index, tvb, offset, 2, ENC_BIG_ENDIAN); /* First, last packet IDs - supports 24 and 32 bits */ if (extendedblockid == 0) { /* Block ID (16 bits) only if extended block ID disabled */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_resendcmd_block_id, tvb, offset + 2, 2, ENC_BIG_ENDIAN); /* in GEV1.2 and prior we use only 24 bit packet IDs */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_resendcmd_first_packet_id, tvb, offset + 5, 3, ENC_BIG_ENDIAN); proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_resendcmd_last_packet_id, tvb, offset + 9, 3, ENC_BIG_ENDIAN); } else { /* Extended block ID (64 bits) only if enabled (from GVCP header flags) */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_resendcmd_extended_block_id_v2_0, tvb, offset + 12, 8, ENC_BIG_ENDIAN); /* Extended packed ID (32 bits) only if enabled */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_resendcmd_extended_first_packet_id_v2_0, tvb, offset + 4, 4, ENC_BIG_ENDIAN); proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_resendcmd_extended_last_packet_id_v2_0, tvb, offset + 8, 4, ENC_BIG_ENDIAN); } } } /* \brief DISSECT: Read register command */ static void dissect_readreg_cmd(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, packet_info *pinfo, gint startoffset, gint length, gvcp_transaction_t* gvcp_trans) { proto_item *item = NULL; guint32 addr = 0; const gchar* address_string = NULL; gboolean is_custom_register = FALSE; gint offset; gint i; gint num_registers; offset = startoffset; num_registers = length / 4; addr = tvb_get_ntohl(tvb, offset); address_string = get_register_name_from_address(addr, &is_custom_register); if (num_registers > 1) { col_append_fstr(pinfo->cinfo, COL_INFO, "[Multiple Register Read Command]"); } else { col_append_str(pinfo->cinfo, COL_INFO, address_string); } if (!pinfo->fd->flags.visited) { gvcp_trans->addr_list = wmem_array_new(wmem_file_scope(), sizeof(guint32)); } /* Subtree Initialization for Payload Data: READREG_CMD */ if (gvcp_telegram_tree != NULL) { if (num_registers > 1) { gvcp_telegram_tree = proto_tree_add_subtree(gvcp_telegram_tree, tvb, startoffset, length, ett_gvcp_payload_cmd, &item, "READREG_CMD Address List"); } } for (i = 0; i < num_registers; i++) { /* For block read register request, address gets re-initialized here in the for loop */ addr = tvb_get_ntohl(tvb, offset); if (gvcp_trans && (!pinfo->fd->flags.visited)) { wmem_array_append_one(gvcp_trans->addr_list, addr); } if (gvcp_telegram_tree != NULL) { if (try_val_to_str(addr, bootstrapregisternames) != NULL) { /* Use known bootstrap register */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_readregcmd_bootstrap_register, tvb, offset, 4, ENC_BIG_ENDIAN); } else { /* Insert data as generic register */ item = proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_custom_register_addr, tvb, offset, 4, ENC_BIG_ENDIAN); /* Use generic register name */ proto_item_append_text(item, " [Unknown Register]"); } } offset +=4; } } /* \brief DISSECT: Write register command */ static void dissect_writereg_cmd(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, packet_info *pinfo, gint startoffset, gint length, gvcp_transaction_t* gvcp_trans) { gint offset; gint i; proto_item *item = NULL; guint32 addr = 0; guint32 value = 0; const gchar *address_string = NULL; gboolean is_custom_register = FALSE; gint num_registers; proto_tree *subtree = NULL; offset = startoffset; num_registers = length / 8; /* divide by 8 because we are counting register-value pairs */ if (gvcp_trans) { gvcp_trans->addr_count = num_registers; } addr = tvb_get_ntohl(tvb, offset); /* first register address to be read from WRITEREG_CMD */ value = tvb_get_ntohl(tvb, offset+4); address_string = get_register_name_from_address(addr, &is_custom_register); /* Automatically learn stream port. Dissect as external GVSP. */ if ((addr == GVCP_SC_DESTINATION_PORT(0)) || (addr == GVCP_SC_DESTINATION_PORT(1)) || (addr == GVCP_SC_DESTINATION_PORT(2)) || (addr == GVCP_SC_DESTINATION_PORT(3))) { /* For now we simply (always) add ports. Maybe we should remove when the dissector gets unloaded? */ dissector_add_uint("udp.port", value, gvsp_handle); } /* Automatically learn messaging channel port. Dissect as GVCP. */ if (addr == GVCP_MC_DESTINATION_PORT) { /* XXX For now we simply (always) add ports. Maybe we should remove when the dissector gets unloaded? */ dissector_add_uint("udp.port", value, gvcp_handle); } if (num_registers > 1) { col_append_fstr(pinfo->cinfo, COL_INFO, "[Multiple Register Write Command]"); } else { col_append_fstr(pinfo->cinfo, COL_INFO, "%s Value=0x%08X", address_string, value); } if (gvcp_telegram_tree != NULL) { if (num_registers > 1) { gvcp_telegram_tree = proto_tree_add_subtree(gvcp_telegram_tree, tvb, startoffset, length, ett_gvcp_payload_cmd, &item, "WRITEREG_CMD Address List"); } for (i = 0; i < num_registers; i++) { /* For block write register request, address gets re-initialized here in the for loop */ addr = tvb_get_ntohl(tvb, offset); if (try_val_to_str(addr, bootstrapregisternames) != NULL) { /* Read the WRITEREG_CMD requested register address */ item = proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_writeregcmd_bootstrap_register, tvb, offset, 4, ENC_BIG_ENDIAN); subtree = proto_item_add_subtree(item, ett_gvcp_payload_cmd_subtree); /* Skip 32bit to dissect the value to be written to the specified address */ offset += 4; /* Read the value to be written to the specified register address */ dissect_register(addr, subtree, tvb, offset, 4); } else { proto_tree* temp_tree = NULL; item = proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_custom_register_addr, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; temp_tree = proto_item_add_subtree(item, ett_gvcp_payload_cmd_subtree); proto_tree_add_item(temp_tree, hf_gvcp_custom_register_value, tvb, offset, 4, ENC_BIG_ENDIAN); } offset += 4; } } } /* \brief DISSECT: Read memory command */ static void dissect_readmem_cmd(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, packet_info *pinfo, gint startoffset) { guint32 addr = 0; guint16 count = 0; gint offset; offset = startoffset; addr = tvb_get_ntohl(tvb, offset); count = tvb_get_ntohs(tvb, offset + 6); /* Number of bytes to read from memory */ col_append_fstr(pinfo->cinfo, COL_INFO, " (0x%08X (%d) bytes)", addr, count); if (gvcp_telegram_tree != NULL) { proto_item *item = NULL; if (try_val_to_str(addr, bootstrapregisternames) != NULL) { proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_readmemcmd_bootstrap_register, tvb, offset, 4, ENC_BIG_ENDIAN); } else { item = proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_custom_memory_addr, tvb, offset, 4, ENC_BIG_ENDIAN); proto_item_append_text(item, " [Unknown Register]"); } proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_readmemcmd_count, tvb, (offset + 6), 2, ENC_BIG_ENDIAN); } } /* \brief DISSECT: Write memory command */ static void dissect_writemem_cmd(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, packet_info *pinfo, gint startoffset, gint length, gvcp_transaction_t* gvcp_trans) { const gchar* address_string = NULL; gboolean is_custom_register = FALSE; guint32 addr = 0; addr = tvb_get_ntohl(tvb, startoffset); address_string = get_register_name_from_address(addr, &is_custom_register); /* fill in Info column in Wireshark GUI */ col_append_fstr(pinfo->cinfo, COL_INFO, "%s: %d bytes", address_string, (length - 4)); if (gvcp_trans && (!pinfo->fd->flags.visited)) { gvcp_trans->addr_list = wmem_array_new(wmem_file_scope(), sizeof(guint32)); wmem_array_append_one(gvcp_trans->addr_list, addr); } if (gvcp_telegram_tree != NULL) { guint offset; guint byte_count; offset = startoffset + 4; byte_count = (length - 4); if (gvcp_trans && (gvcp_trans->rep_frame)) { proto_item *item = NULL; item = proto_tree_add_uint(gvcp_telegram_tree, hf_gvcp_response_in, tvb, 0, 0, gvcp_trans->rep_frame); PROTO_ITEM_SET_GENERATED(item); } if (try_val_to_str(addr, bootstrapregisternames) != NULL) { dissect_register_data(addr, gvcp_telegram_tree, tvb, offset, byte_count); } else { /* Generic, unknown value */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_writememcmd_data, tvb, offset, byte_count, ENC_NA); } } } /* \brief DISSECT: Event command */ static void dissect_event_cmd(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, packet_info *pinfo, gint startoffset, gint length, gint extendedblockids) { gint32 eventid; gint offset; offset = startoffset; /* Get event ID */ eventid = tvb_get_ntohs(tvb, offset + 2); /* fill in Info column in Wireshark GUI */ col_append_fstr(pinfo->cinfo, COL_INFO, "[ID: 0x%04X]", eventid); if (gvcp_telegram_tree != NULL) { gint i; gint event_count = 0; /* Compute event count based on data length */ if (extendedblockids == 0) { /* No enhanced block id */ event_count = length / 16; } else { /* Enhanced block id adds */ event_count = length / 24; } if (event_count > 1) { gvcp_telegram_tree = proto_tree_add_subtree(gvcp_telegram_tree, tvb, offset, length, ett_gvcp_payload_cmd, NULL, "EVENT_CMD Event List"); } for (i = 0; i < event_count; i++) { offset += 2; /* Get event ID */ eventid = tvb_get_ntohs(tvb, offset); /* Use range to determine type of event */ if ((eventid >= 0x0000) && (eventid <= 0x8000)) { /* Standard ID */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_eventcmd_id, tvb, offset, 2, ENC_BIG_ENDIAN); } else if ((eventid >= 0x8001) && (eventid <= 0x8FFF)) { /* Error */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_eventcmd_error_id, tvb, offset, 2, ENC_BIG_ENDIAN); } else if ((eventid >= 0x9000) && (eventid <= 0xFFFF)) { /* Device specific */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_eventcmd_device_specific_id, tvb, offset, 2, ENC_BIG_ENDIAN); } offset += 2; /* Stream channel (possibly) associated with event */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_eventcmd_stream_channel_index, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; if (extendedblockids == 0) { /* Block id (16 bit) associated with event */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_eventcmd_block_id, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; } else { offset += 2; /* Block id (64 bit) only if reported by gvcp flag */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_eventcmd_block_id_64bit_v2_0, tvb, offset, 8, ENC_BIG_ENDIAN); offset += 8; } /* Timestamp (64 bit) associated with event */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_eventcmd_timestamp, tvb, offset, 8, ENC_BIG_ENDIAN); offset += 8; } } } /* \brief DISSECT: Event data command */ static void dissect_eventdata_cmd(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, packet_info *pinfo, gint startoffset, gint extendedblockids) { gint32 eventid; gint offset; gint data_length = 0; offset = startoffset; /* Get event ID */ eventid = tvb_get_ntohs(tvb, offset + 2); /* fill in Info column in Wireshark GUI */ col_append_fstr(pinfo->cinfo, COL_INFO, "[ID: 0x%04X]", eventid); if (gvcp_telegram_tree != NULL) { /* If extended ID, then we have event_size here (2.1) */ if (extendedblockids) { proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_eventcmd_extid_length, tvb, offset, 2, ENC_BIG_ENDIAN); data_length = tvb_get_ntohs(tvb, offset); // We get the data length here } /* skip reserved field */ offset += 2; /* Use range to determine type of event */ if ((eventid >= 0x0000) && (eventid <= 0x8000)) { /* Standard ID */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_eventcmd_id, tvb, offset, 2, ENC_BIG_ENDIAN); } else if ((eventid >= 0x8001) && (eventid <= 0x8FFF)) { /* Error */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_eventcmd_error_id, tvb, offset, 2, ENC_BIG_ENDIAN); } else if ((eventid >= 0x9000) && (eventid <= 0xFFFF)) { /* Device specific */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_eventcmd_device_specific_id, tvb, offset, 2, ENC_BIG_ENDIAN); } offset += 2; /* Stream channel (possibly) associated with event */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_eventcmd_stream_channel_index, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; if (extendedblockids == 0) { /* Block id (16 bit) associated with event */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_eventcmd_block_id, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; } else { offset += 2; /* Block id (64 bit) only if reported by gvcp flag */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_eventcmd_block_id_64bit_v2_0, tvb, offset, 8, ENC_BIG_ENDIAN); offset += 8; } /* Timestamp (64 bit) associated with event */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_eventcmd_timestamp, tvb, offset, 8, ENC_BIG_ENDIAN); offset += 8; if ((data_length == 24) && (extendedblockids)) { /* "no data" this is an ok case for extended id, eventcmd to be deprecated */ return; } /* Data */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_eventcmd_data, tvb, offset, -1, ENC_NA); } } /* \brief DISSECT: Action command */ static void dissect_action_cmd(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint startoffset, gint scheduledactioncommand) { if (gvcp_telegram_tree != NULL) { gint offset; offset = startoffset; /* Device key */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_actioncmd_device_key, tvb, offset, 4, ENC_BIG_ENDIAN); /* Group key */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_actioncmd_group_key, tvb, offset + 4, 4, ENC_BIG_ENDIAN); /* Group mask */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_actioncmd_group_mask, tvb, offset + 8, 4, ENC_BIG_ENDIAN); if (scheduledactioncommand != 0) { /* 64 bits timestamp (optional) if gvcp header flag is set */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_actioncmd_time_v2_0, tvb, offset + 12, 8, ENC_BIG_ENDIAN); } } } /* \brief DISSECT: Discovery acknowledge */ static void dissect_discovery_ack(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, packet_info *pinfo, gint startoffset, gint length) { proto_item *item = NULL; gint offset; const guint8* string_manufacturer_name = NULL; const guint8* string_serial_number = NULL; gint string_length = 0; proto_tree *tree = NULL; offset = startoffset; string_manufacturer_name = tvb_get_const_stringz(tvb, 80, &string_length); string_serial_number = tvb_get_const_stringz(tvb, 224, &string_length); col_append_fstr(pinfo->cinfo, COL_INFO, "(%s, %s)",string_manufacturer_name, string_serial_number); if (gvcp_telegram_tree != NULL) { gvcp_telegram_tree = proto_tree_add_subtree(gvcp_telegram_tree, tvb, offset, length, ett_gvcp_payload_cmd, NULL, "DISCOVERY_ACK Payload"); /* Version */ item = proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_spec_version, tvb, offset, 4, ENC_BIG_ENDIAN); tree = proto_item_add_subtree(item, ett_gvcp_bootstrap_fields); dissect_register(GVCP_VERSION, tree, tvb, offset, 4 ); /* Device mode */ item = proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_devicemodediscovery, tvb, offset + 4, 4, ENC_BIG_ENDIAN); tree = proto_item_add_subtree(item, ett_gvcp_bootstrap_fields); dissect_register(GVCP_DEVICE_MODE, tree, tvb, offset + 4, 4 ); /* MAC address */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_device_mac_address, tvb, offset + 10, 6, ENC_NA); /* Supported IP configuration */ item = proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_supportedipconfig, tvb, offset + 16, 4, ENC_BIG_ENDIAN); tree = proto_item_add_subtree(item, ett_gvcp_bootstrap_fields); dissect_register(GVCP_SUPPORTED_IP_CONFIGURATION_0, tree, tvb, offset + 16, 4); /* Current IP configuration */ item = proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_currentipconfig, tvb, offset + 20, 4, ENC_BIG_ENDIAN); tree = proto_item_add_subtree(item, ett_gvcp_bootstrap_fields); dissect_register(GVCP_CURIPCFG_0, tree, tvb, offset + 20, 4); /* Current IP address */ dissect_register(GVCP_CURRENT_IP_ADDRESS_0, gvcp_telegram_tree, tvb, offset + 36, 4); /* Current subnet mask */ dissect_register(GVCP_CURRENT_SUBNET_MASK_0, gvcp_telegram_tree, tvb, offset + 52, 4); /* Current default gateway */ dissect_register(GVCP_CURRENT_DEFAULT_GATEWAY_0, gvcp_telegram_tree, tvb, offset + 68, 4); /* Manufacturer name */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_manufacturer_name, tvb, offset + 72, -1, ENC_ASCII|ENC_NA); /* Model name */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_model_name, tvb, offset + 104, -1, ENC_ASCII|ENC_NA); /* Device version */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_device_version, tvb, offset + 136, -1, ENC_ASCII|ENC_NA); /* Manufacturer specific information */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_manufacturer_specific_info, tvb, offset + 168, -1, ENC_ASCII|ENC_NA); /* Serial number */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_serial_number, tvb, offset + 216, -1, ENC_ASCII|ENC_NA); /* User defined name */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_user_defined_name, tvb, offset + 232, -1, ENC_ASCII|ENC_NA); } } /* \brief DISSECT: Read register acknowledge */ static void dissect_readreg_ack(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, packet_info *pinfo, gint startoffset, gint length, gvcp_transaction_t *gvcp_trans) { guint i; gboolean is_custom_register = FALSE; const gchar* address_string = NULL; guint num_registers; gint offset; gboolean valid_trans = FALSE; guint addr_list_size = 0; offset = startoffset; num_registers = length / 4; if (gvcp_trans && gvcp_trans->addr_list) { valid_trans = TRUE; addr_list_size = wmem_array_get_count(gvcp_trans->addr_list); } if (num_registers > 1) { col_append_fstr(pinfo->cinfo, COL_INFO, "[Multiple ReadReg Ack]"); } else { if (valid_trans) { if (addr_list_size > 0) { address_string = get_register_name_from_address(*((guint32*)wmem_array_index(gvcp_trans->addr_list, 0)), &is_custom_register); } if (num_registers) { col_append_fstr(pinfo->cinfo, COL_INFO, "%s Value=0x%08X", address_string, tvb_get_ntohl(tvb, offset)); } else { col_append_str(pinfo->cinfo, COL_INFO, address_string); } } } if (gvcp_telegram_tree != NULL) { /* Subtree initialization for Payload Data: READREG_ACK */ if (num_registers > 1) { gvcp_telegram_tree = proto_tree_add_subtree(gvcp_telegram_tree, tvb, offset, length, ett_gvcp_payload_ack, NULL, "Register Value List"); } for (i = 0; i < num_registers; i++) { guint32 curr_register = 0; if (valid_trans && i < addr_list_size) { curr_register = *((guint32*)wmem_array_index(gvcp_trans->addr_list, i)); address_string = get_register_name_from_address(curr_register, &is_custom_register); if (!is_custom_register) /* bootstrap register */ { proto_tree_add_uint(gvcp_telegram_tree, hf_gvcp_readregcmd_bootstrap_register, tvb, 0, 4, curr_register); dissect_register(curr_register, gvcp_telegram_tree, tvb, offset, length); } else { proto_tree_add_uint_format_value(gvcp_telegram_tree, hf_gvcp_custom_read_register_addr, tvb, offset, 4, curr_register, "%s (0x%08X)", address_string, curr_register); proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_custom_read_register_value, tvb, offset, 4, ENC_BIG_ENDIAN); } } else { proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_custom_register_value, tvb, offset, 4, ENC_BIG_ENDIAN); } offset += 4; } } } /* \brief DISSECT: Write register acknowledge */ static void dissect_writereg_ack(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, packet_info *pinfo, gint startoffset, gvcp_transaction_t* gvcp_trans) { proto_item *item = NULL; guint16 ack_index = 0; if (gvcp_telegram_tree != NULL) { item = proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_writeregcmd_data_index, tvb, (startoffset + 2), 2, ENC_BIG_ENDIAN); } ack_index = tvb_get_ntohs(tvb, 10); if (gvcp_trans) { gint num_registers = 0; num_registers = gvcp_trans->addr_count; if (num_registers > 1) { col_append_fstr(pinfo->cinfo, COL_INFO, "[Multiple WriteReg Ack] (%d/%d) %s ", ack_index, num_registers, (ack_index == num_registers ? "(Success)" : "(Failed)")); } else { col_append_fstr(pinfo->cinfo, COL_INFO, "%s ", (ack_index == num_registers ? "(Success)" : "(Failed)")); } if (gvcp_telegram_tree != NULL) { proto_item_append_text(item, " %s", (ack_index == num_registers ? "(Success)" : "(Failed)")); } } else { col_append_str(pinfo->cinfo, COL_INFO, "[Cannot find requesting packet]"); } } /* \brief DISSECT: Read memory acknowledge */ static void dissect_readmem_ack(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, packet_info *pinfo, gint startoffset, gint length) { guint32 addr = 0; const gchar *address_string = NULL; gboolean is_custom_register = FALSE; addr = tvb_get_ntohl(tvb, startoffset); address_string = get_register_name_from_address(addr, &is_custom_register); /* Fill in Wireshark GUI Info column */ col_append_str(pinfo->cinfo, COL_INFO, address_string); if (gvcp_telegram_tree != NULL) { guint offset; guint byte_count; offset = startoffset + 4; byte_count = (length - 4); /* Bootstrap register known address */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_readmemcmd_address, tvb, startoffset, 4, ENC_BIG_ENDIAN); if (try_val_to_str(addr, bootstrapregisternames) != NULL) { dissect_register_data(addr, gvcp_telegram_tree, tvb, offset, byte_count); } else { /* Generic, unknown value */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_readmemcmd_data_read, tvb, offset, byte_count, ENC_NA); } } } /* \brief DISSECT: Write memory acknowledge */ static void dissect_writemem_ack(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, packet_info *pinfo, gint startoffset, gint length, gvcp_transaction_t* gvcp_trans) { if (gvcp_trans && gvcp_trans->addr_list) { if (wmem_array_get_count(gvcp_trans->addr_list) > 0) { const gchar *address_string = NULL; address_string = get_register_name_from_address((*((guint32*)wmem_array_index(gvcp_trans->addr_list, 0))), NULL); col_append_str(pinfo->cinfo, COL_INFO, address_string); } } if (gvcp_telegram_tree != NULL) { proto_item *item; if (gvcp_trans && gvcp_trans->req_frame) { item = proto_tree_add_uint(gvcp_telegram_tree, hf_gvcp_response_to, tvb, 0, 0, gvcp_trans->req_frame); PROTO_ITEM_SET_GENERATED(item); } gvcp_telegram_tree = proto_tree_add_subtree(gvcp_telegram_tree, tvb, startoffset, length, ett_gvcp_payload_cmd, NULL, "Payload Data: WRITEMEM_ACK"); proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_writememcmd_data_index, tvb, (startoffset +2), 2, ENC_BIG_ENDIAN); } } /* \brief DISSECT: Pending acknowledge */ static void dissect_pending_ack(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint startoffset, gint length) { if (gvcp_telegram_tree != NULL) { gvcp_telegram_tree = proto_tree_add_subtree(gvcp_telegram_tree, tvb, startoffset, length, ett_gvcp_payload_cmd, NULL, "Payload Data: PENDING_ACK"); proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_time_to_completion, tvb, (startoffset + 2), 2, ENC_BIG_ENDIAN); } } /* \brief Point of entry of all GVCP packet dissection */ static int dissect_gvcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) { gint offset = 0; proto_tree *gvcp_tree = NULL; proto_tree *gvcp_tree_flag = NULL; proto_tree *gvcp_telegram_tree = NULL; gint data_length = 0; gint command = -1; const gchar* command_string = NULL; gint status = 0; gint flags = -1; gint extendedblockids = -1; gint scheduledactioncommand = -1; gint ack_code = -1; const gchar* ack_string = NULL; gint request_id = 0; gchar key_code = 0; proto_item *ti = NULL; proto_item *item = NULL; conversation_t *conversation = 0; gvcp_conv_info_t *gvcp_info = 0; gvcp_transaction_t *gvcp_trans = 0; if (tvb_captured_length(tvb) < GVCP_MIN_PACKET_SIZE) { return 0; } /* check for valid key/ack code */ key_code = (gchar) tvb_get_guint8(tvb, offset); ack_code = tvb_get_ntohs(tvb, offset+2); ack_string = try_val_to_str(ack_code, acknowledgenames); if ((key_code != 0x42) && !ack_string) { return 0; } /* Set the protocol column */ col_set_str(pinfo->cinfo, COL_PROTOCOL, "GVCP"); /* Clear out stuff in the info column */ col_clear(pinfo->cinfo, COL_INFO); /* Adds "Gigabit-Ethernet Control Protocol" heading to protocol tree */ /* We will add fields to this using the gvcp_tree pointer */ ti = proto_tree_add_item(tree, proto_gvcp, tvb, offset, -1, ENC_NA); gvcp_tree = proto_item_add_subtree(ti, ett_gvcp); /* Is this a command message? */ if (key_code == 0x42) { command = tvb_get_ntohs(tvb, offset+2); command_string = val_to_str(command, commandnames,"Unknown Command (0x%x)"); /* Add the Command name string to the Info column */ col_append_fstr(pinfo->cinfo, COL_INFO, "> %s ", command_string); gvcp_tree = proto_tree_add_subtree_format(gvcp_tree, tvb, offset, 8, ett_gvcp_cmd, NULL, "Command Header: %s", command_string); /* Add the message key code: */ proto_tree_add_item(gvcp_tree, hf_gvcp_message_key_code, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; /* Add the flags */ flags = (gchar) tvb_get_guint8(tvb, offset); item = proto_tree_add_item(gvcp_tree, hf_gvcp_flag, tvb, offset, 1, ENC_BIG_ENDIAN); gvcp_tree_flag = proto_item_add_subtree(item, ett_gvcp_flags); if (command == GVCP_ACTION_CMD) { proto_tree_add_item(gvcp_tree_flag, hf_gvcp_scheduledactioncommand_flag_v2_0, tvb, offset, 1, ENC_BIG_ENDIAN); scheduledactioncommand = (flags & 0x80); } if ((command == GVCP_EVENTDATA_CMD) || (command == GVCP_EVENT_CMD) || (command == GVCP_PACKETRESEND_CMD)) { proto_tree_add_item(gvcp_tree_flag, hf_gvcp_64bitid_flag_v2_0, tvb, offset, 1, ENC_BIG_ENDIAN); flags = (gchar) tvb_get_guint8(tvb, offset ); extendedblockids = (flags & 0x10); } if ((command == GVCP_DISCOVERY_CMD) || (command == GVCP_FORCEIP_CMD)) { proto_tree_add_item(gvcp_tree_flag, hf_gvcp_allow_broadcast_acknowledge_flag, tvb, offset, 1, ENC_BIG_ENDIAN); } proto_tree_add_item(gvcp_tree_flag, hf_gvcp_acknowledge_required_flag, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; /* Add the command */ proto_tree_add_item(gvcp_tree, hf_gvcp_command, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; } else /* ... or else it is an acknowledge */ { status = tvb_get_ntohs(tvb, offset); col_append_fstr(pinfo->cinfo, COL_INFO, "< %s %s", ack_string, val_to_str(status, statusnames_short, "Unknown status (0x%04X)")); gvcp_tree = proto_tree_add_subtree_format(gvcp_tree, tvb, offset+2, tvb_captured_length(tvb)-2, ett_gvcp_ack, NULL, "Acknowledge Header: %s", ack_string); /* Add the status: */ proto_tree_add_item(gvcp_tree, hf_gvcp_status, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; /* Add the acknowledge */ proto_tree_add_item(gvcp_tree, hf_gvcp_acknowledge, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; } /* Parse the second part of both the command and the acknowledge header: 0 15 16 31 -------- -------- -------- -------- | status | acknowledge | -------- -------- -------- -------- | length | req_id | -------- -------- -------- -------- Add the data length Number of valid data bytes in this message, not including this header. This represents the number of bytes of payload appended after this header */ proto_tree_add_item(gvcp_tree, hf_gvcp_length, tvb, offset, 2, ENC_BIG_ENDIAN); data_length = tvb_get_ntohs(tvb, offset); offset += 2; /* Add the request ID */ proto_tree_add_item(gvcp_tree, hf_gvcp_request_id, tvb, offset, 2, ENC_BIG_ENDIAN); request_id = tvb_get_ntohs(tvb, offset); offset += 2; conversation = find_or_create_conversation(pinfo); gvcp_info = (gvcp_conv_info_t*)conversation_get_proto_data(conversation, proto_gvcp); if (!gvcp_info) { gvcp_info = (gvcp_conv_info_t*)wmem_alloc(wmem_file_scope(), sizeof(gvcp_conv_info_t)); gvcp_info->pdus = wmem_map_new(wmem_file_scope(), g_direct_hash, g_direct_equal); conversation_add_proto_data(conversation, proto_gvcp, gvcp_info); } if (!pinfo->fd->flags.visited) { if (key_code == 0x42) { /* This is a request */ gvcp_trans = (gvcp_transaction_t*)wmem_alloc(wmem_packet_scope(), sizeof(gvcp_transaction_t)); gvcp_trans->req_frame = pinfo->num; gvcp_trans->rep_frame = 0; gvcp_trans->addr_list = 0; gvcp_trans->addr_count = 0; } else { if (ack_string && ( ack_code != GVCP_PENDING_ACK ) ) { /* this is a response, so update trans info with ack's frame number */ /* get list of transactions for given request id */ gvcp_trans_array = (wmem_array_t*)wmem_map_lookup(gvcp_info->pdus, GUINT_TO_POINTER(request_id)); if (gvcp_trans_array) { gint i; guint array_size = wmem_array_get_count(gvcp_trans_array); for (i = array_size-1; i >= 0; i--) { gvcp_trans = (gvcp_transaction_t*)wmem_array_index(gvcp_trans_array, i); if (gvcp_trans && (gvcp_trans->req_frame < pinfo->num)) { if (gvcp_trans->rep_frame != 0) { gvcp_trans = 0; } else { gvcp_trans->rep_frame = pinfo->num; } break; } gvcp_trans = 0; } } } } } else { gvcp_trans = 0; gvcp_trans_array = (wmem_array_t*)wmem_map_lookup(gvcp_info->pdus, GUINT_TO_POINTER(request_id)); if (gvcp_trans_array) { guint i; guint array_size = wmem_array_get_count(gvcp_trans_array); for (i = 0; i < array_size; ++i) { gvcp_trans = (gvcp_transaction_t*)wmem_array_index(gvcp_trans_array, i); if (gvcp_trans && (pinfo->num == gvcp_trans->req_frame || pinfo->num == gvcp_trans->rep_frame)) { break; } gvcp_trans = 0; } } } if (!gvcp_trans) { gvcp_trans = wmem_new0(wmem_packet_scope(), gvcp_transaction_t); } /* Add telegram subtree */ gvcp_telegram_tree = proto_item_add_subtree(gvcp_tree, ett_gvcp); /* Is this a command? */ if (key_code == 0x42) { if (gvcp_telegram_tree != NULL) { if (gvcp_trans->rep_frame) { item = proto_tree_add_uint(gvcp_telegram_tree, hf_gvcp_response_in, tvb, 0, 0, gvcp_trans->rep_frame); PROTO_ITEM_SET_GENERATED(item); } } switch (command) { case GVCP_FORCEIP_CMD: dissect_forceip_cmd(gvcp_telegram_tree, tvb, pinfo, offset, data_length); break; case GVCP_PACKETRESEND_CMD: dissect_packetresend_cmd(gvcp_telegram_tree, tvb, pinfo, offset, data_length, extendedblockids); break; case GVCP_READREG_CMD: dissect_readreg_cmd(gvcp_telegram_tree, tvb, pinfo, offset, data_length, gvcp_trans); break; case GVCP_WRITEREG_CMD: dissect_writereg_cmd(gvcp_telegram_tree, tvb, pinfo, offset, data_length, gvcp_trans); break; case GVCP_READMEM_CMD: dissect_readmem_cmd(gvcp_telegram_tree, tvb, pinfo, offset); break; case GVCP_WRITEMEM_CMD: dissect_writemem_cmd(gvcp_telegram_tree, tvb, pinfo, offset, data_length, gvcp_trans); break; case GVCP_EVENT_CMD: dissect_event_cmd(gvcp_telegram_tree, tvb, pinfo, offset, data_length, extendedblockids); break; case GVCP_EVENTDATA_CMD: dissect_eventdata_cmd(gvcp_telegram_tree, tvb, pinfo, offset, extendedblockids); break; case GVCP_ACTION_CMD: dissect_action_cmd(gvcp_telegram_tree, tvb, pinfo, offset, scheduledactioncommand); break; case GVCP_DISCOVERY_CMD: default: break; } if (!pinfo->fd->flags.visited) { if (key_code == 0x42) { gvcp_trans_array = (wmem_array_t*)wmem_map_lookup(gvcp_info->pdus, GUINT_TO_POINTER(request_id)); if(gvcp_trans_array) { wmem_array_append(gvcp_trans_array, gvcp_trans, 1); } else { gvcp_trans_array = wmem_array_new(wmem_file_scope(), sizeof(gvcp_transaction_t)); wmem_array_append(gvcp_trans_array, gvcp_trans, 1); wmem_map_insert(gvcp_info->pdus, GUINT_TO_POINTER(request_id), (void *)gvcp_trans_array); } } } } else { if (gvcp_telegram_tree != NULL) { if (gvcp_trans->req_frame) { item = proto_tree_add_uint(gvcp_telegram_tree, hf_gvcp_response_to, tvb, 0, 0, gvcp_trans->req_frame); PROTO_ITEM_SET_GENERATED(item); } } switch (ack_code) { case GVCP_DISCOVERY_ACK: dissect_discovery_ack(gvcp_telegram_tree, tvb, pinfo, offset, data_length); break; case GVCP_READREG_ACK: dissect_readreg_ack(gvcp_telegram_tree, tvb, pinfo, offset, data_length, gvcp_trans); break; case GVCP_WRITEREG_ACK: dissect_writereg_ack(gvcp_telegram_tree, tvb, pinfo, offset, gvcp_trans); break; case GVCP_READMEM_ACK: dissect_readmem_ack(gvcp_telegram_tree, tvb, pinfo, offset, data_length); break; case GVCP_WRITEMEM_ACK: dissect_writemem_ack(gvcp_telegram_tree, tvb, pinfo, offset, data_length, gvcp_trans); break; case GVCP_PENDING_ACK: dissect_pending_ack(gvcp_telegram_tree, tvb, pinfo, offset, data_length); break; case GVCP_FORCEIP_ACK: break; case GVCP_PACKETRESEND_ACK: case GVCP_EVENT_ACK: case GVCP_EVENTDATA_ACK: case GVCP_ACTION_ACK: default: proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_payloaddata, tvb, offset, data_length, ENC_NA); break; } } return tvb_captured_length(tvb); } void proto_register_gvcp(void) { /* \brief Structures for register dissection */ static hf_register_info hf[] = { /* Common GVCP data */ { &hf_gvcp_message_key_code, { "Message Key Code", "gvcp.message_key_code", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_flag, { "Flags", "gvcp.cmd.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_acknowledge_required_flag, { "Acknowledge Required", "gvcp.cmd.flag.acq_required", FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }}, { &hf_gvcp_scheduledactioncommand_flag_v2_0, { "Scheduled Action Command", "gvcp.cmd.flag.scheduledactioncommand", FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }}, { &hf_gvcp_64bitid_flag_v2_0, { "64 bit ID", "gvcp.cmd.flag.64bitid", FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }}, { &hf_gvcp_allow_broadcast_acknowledge_flag, { "Allow Broadcast Acknowledge", "gvcp.cmd.flag.allowbroadcastacq", FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }}, { &hf_gvcp_command, { "Command", "gvcp.cmd.command", FT_UINT16, BASE_HEX, VALS(commandnames), 0x0, NULL, HFILL }}, { &hf_gvcp_length, { "Payload Length", "gvcp.cmd.payloadlength", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_request_id, { "Request ID", "gvcp.cmd.req_id", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_payloaddata, { "Payload Data", "gvcp.cmd.payloaddata", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_status, { "Status", "gvcp.cmd.status", FT_UINT16, BASE_HEX, VALS(statusnames), 0x0, NULL, HFILL }}, { &hf_gvcp_acknowledge, { "Acknowledge", "gvcp.ack", FT_UINT16, BASE_HEX, VALS(acknowledgenames), 0x0, NULL, HFILL }}, { &hf_gvcp_devicemodediscovery, { "Device Mode", "gvcp.ack.discovery.devicemode", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }}, /* Force IP */ { &hf_gvcp_forceip_mac_address, { "MAC Address", "gvcp.cmd.forceip.macaddress", FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_forceip_static_IP, { "IP address", "gvcp.cmd.forceip.ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_forceip_static_subnet_mask, { "Subnet Mask", "gvcp.cmd.forceip.subnetmask", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_forceip_static_default_gateway, { "Default Gateway", "gvcp.cmd.forceip.defaultgateway", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, /* Discovery specific */ { &hf_gvcp_device_mac_address, { "Device MAC Address", "gvcp.cmd.discovery.devicemacaddress", FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL }}, /* Read register */ { &hf_gvcp_readregcmd_bootstrap_register, { "Bootstrap Register", "gvcp.cmd.readreg.bootstrapregister", FT_UINT32, BASE_HEX_DEC, VALS(bootstrapregisternames), 0x0, NULL, HFILL }}, /* Write register */ { &hf_gvcp_writeregcmd_data, { "DataX", "gvcp.cmd.writereg.data", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_writeregcmd_bootstrap_register, { "Bootstrap Register", "gvcp.cmd.writereg.bootstrapregister", FT_UINT32, BASE_HEX_DEC, VALS(bootstrapregisternames), 0x0, NULL, HFILL }}, { &hf_gvcp_writeregcmd_data_index, { "Data Index", "gvcp.cmd.writereg.dataindex", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, /* Read memory */ { &hf_gvcp_readmemcmd_address, { "Register Address", "gvcp.cmd.readmem.address", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_readmemcmd_bootstrap_register, { "Memory Bootstrap Register", "gvcp.cmd.readmem.bootstrapregister", FT_UINT32, BASE_HEX_DEC, VALS(bootstrapregisternames), 0x0, NULL, HFILL }}, { &hf_gvcp_readmemcmd_count, { "Count", "gvcp.cmd.readmem.count", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, /* Write memory */ { &hf_gvcp_writememcmd_data, { "DataY", "gvcp.cmd.writemem.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_writememcmd_data_index, { "Data Index", "gvcp.cmd.writemem.dataindex", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, /* Resend request */ { &hf_gvcp_resendcmd_stream_channel_index, { "Resend Stream Channel Index", "gvcp.cmd.resend.streamchannelindex", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_resendcmd_block_id, { "Resend Block ID 16 bits", "gvcp.cmd.resend.blockid", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_resendcmd_first_packet_id, { "Resend First Packet ID 24 bits", "gvcp.cmd.resend.firstpacketid", FT_UINT24, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_resendcmd_last_packet_id, { "Resend Last Packet ID 24 bits", "gvcp.cmd.resend.lastpacketid", FT_UINT24, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_resendcmd_extended_block_id_v2_0, { "Resend Block ID 64 bits", "gvcp.cmd.resend.extendedblockid", FT_UINT64, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_resendcmd_extended_first_packet_id_v2_0, { "Resend First Packet ID 32 bits", "gvcp.cmd.resend.firstpacketid", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_resendcmd_extended_last_packet_id_v2_0, { "Resend Last Packet ID 32 bits", "gvcp.cmd.resend.lastpacketid", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, /* Event */ { &hf_gvcp_eventcmd_id, { "ID", "gvcp.cmd.event.id", FT_UINT16, BASE_HEX_DEC, VALS(eventidnames), 0x0, NULL, HFILL }}, { &hf_gvcp_eventcmd_error_id, { "Error ID", "gvcp.cmd.event.errorid", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_eventcmd_extid_length, { "Event Size", "gvcp.cmd.event.eventsize", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_eventcmd_device_specific_id, { "Device Specific ID", "gvcp.cmd.event.devicespecificid", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_eventcmd_stream_channel_index, { "Stream Channel Index", "gvcp.cmd.event.streamchannelindex", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_eventcmd_block_id, { "Block ID (16 bit)", "gvcp.cmd.event.blockid", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_eventcmd_timestamp, { "Timestamp", "gvcp.cmd.event.timestamp", FT_UINT64, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_eventcmd_block_id_64bit_v2_0, { "Block ID 64 bit", "gvcp.event_timestamp", FT_UINT64, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, /* Event data */ { &hf_gvcp_eventcmd_data, { "Event Data", "gvcp.cmd.eventdata.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, /* Action */ { &hf_gvcp_actioncmd_device_key, { "Action Device Key", "gvcp.cmd.action.devicekey", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_actioncmd_group_key, { "Action Group Key", "gvcp.cmd.action.groupkey", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_actioncmd_group_mask, { "Action Group Mask", "gvcp.cmd.action.groupmask", FT_UINT32, BASE_HEX_DEC, NULL, 0xFFFFFFFF, NULL, HFILL }}, { &hf_gvcp_actioncmd_time_v2_0, { "Action Scheduled Time", "gvcp.cmd.action.time", FT_UINT64, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, /* Pending acknowledge */ { &hf_gvcp_time_to_completion, { "Time to completion", "gvcp.ack.pendingack.timetocompletion", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, /* GVCP_VERSION */ { &hf_gvcp_spec_version_major, { "Version Major", "gvcp.bootstrap.specversion.major", FT_UINT32, BASE_HEX, NULL, 0xFFFF0000, NULL, HFILL }}, { &hf_gvcp_spec_version_minor, { "Version Minor", "gvcp.bootstrap.specversion.minor", FT_UINT32, BASE_HEX, NULL, 0x0000FFFF, NULL, HFILL }}, { &hf_gvcp_spec_version, { "Spec Version", "gvcp.bootstrap.specversion", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }}, /* GVCP_devicemode */ { &hf_gvcp_devicemode_endianness, { "Endianness", "gvcp.bootstrap.devicemode.endianness", FT_BOOLEAN, 32, NULL, 0x80000000, NULL, HFILL }}, { &hf_gvcp_devicemode_deviceclass, { "Device Class", "gvcp.bootstrap.devicemode.deviceclass", FT_UINT32, BASE_HEX, VALS(devicemodenames_class), 0x70000000, NULL, HFILL }}, { &hf_gvcp_devicemode_current_link_configuration_v2_0, { "Current Link Configuration", "gvcp.bootstrap.devicemode.currentlinkconfiguration", FT_UINT32, BASE_HEX, VALS(linkconfiguration_class), 0x03000000, NULL, HFILL }}, {& hf_gvcp_devicemode_characterset, { "Character Set", "gvcp.bootstrap.devicemode.characterset", FT_UINT32, BASE_HEX, VALS(devicemodenames_characterset), 0x0000000F, NULL, HFILL }}, /* GVCP_MAC_HIGH_0, 1, 2, 3 */ { &hf_gvcp_machigh, { "MAC High", "gvcp.bootstrap.machigh", FT_UINT32, BASE_HEX, NULL, 0x0000FFFF, NULL, HFILL }}, /* GVCP_MAC_LOW_0, 1, 2, 3 */ { &hf_gvcp_maclow, { "MAC Low", "gvcp.bootstrap.maclow", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }}, /* GVCP_SUPPORTED_IP_CONFIGURATION_0, 1, 2, 3 */ /* GVCP_CURIPCFG_0, 1, 2, 3 */ { &hf_gvcp_ip_config_can_handle_pause_frames_v2_0, { "IP Config Can Handle Pause Frames", "gvcp.bootstrap.ipconfig.canhandlepauseframes", FT_BOOLEAN, 32, NULL, 0x80000000, NULL, HFILL }}, { &hf_gvcp_ip_config_can_generate_pause_frames_v2_0, { "Can Generate Pause Frames", "gvcp.bootstrap.ipconfig.cangeneratepauseframes", FT_BOOLEAN, 32, NULL, 0x40000000, NULL, HFILL }}, { &hf_gvcp_ip_config_lla, { "LLA", "gvcp.bootstrap.ipconfig.lla", FT_BOOLEAN, 32, NULL, 0x00000004, NULL, HFILL }}, { &hf_gvcp_ip_config_dhcp, { "DHCP", "gvcp.bootstrap.ipconfig.dhcp", FT_BOOLEAN, 32, NULL, 0x00000002, NULL, HFILL }}, { &hf_gvcp_ip_config_persistent_ip, { "Persistent IP", "gvcp.bootstrap.ipconfig.persistentip", FT_BOOLEAN, 32, NULL, 0x00000001, NULL, HFILL }}, { &hf_gvcp_supportedipconfig, { "Supported IP Configuration", "gvcp.bootstrap.supportedipconfig", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }}, { &hf_gvcp_currentipconfig, { "Current IP Configuration", "gvcp.bootstrap.currentipconfig", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }}, /* GVCP_CURRENT_IP_ADDRESS_0, 1, 2, 3 */ { &hf_gvcp_current_IP, { "Current IP", "gvcp.bootstrap.currentip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, /* GVCP_CURRENT_SUBNET_MASK_0, 1, 2, 3 */ { &hf_gvcp_current_subnet_mask, { "Subnet Mask", "gvcp.bootstrap.currentsubnetmask", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, /* GVCP_CURRENT_DEFAULT_GATEWAY_0, 1, 2, 3 */ { &hf_gvcp_current_default_gateway, { "Default Gateway", "gvcp.bootstrap.currentdefaultgateway", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, /* GVCP_MANUFACTURER_NAME */ { &hf_gvcp_manufacturer_name, { "Manufacturer Name", "gvcp.bootstrap.manufacturername", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }}, /* GVCP_MODEL_NAME */ { &hf_gvcp_model_name, { "Model Name", "gvcp.bootstrap.modelname", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }}, /* GVCP_DEVICE_VERSION */ { &hf_gvcp_device_version, { "Device Version", "gvcp.bootstrap.deviceversion", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }}, /* GVCP_MANUFACTURER_INFO */ { &hf_gvcp_manufacturer_specific_info, { "Manufacturer Specific Info", "gvcp.bootstrap.manufacturerspecificinfo", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }}, /* GVCP_SERIAL_NUMBER */ { &hf_gvcp_serial_number, { "Serial Number", "gvcp.bootstrap.serialnumber", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }}, /* GVCP_USER_DEFINED_NAME */ { &hf_gvcp_user_defined_name, { "User-defined Name", "gvcp.bootstrap.userdefinedname", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }}, /* GVCP_FIRST_URL */ { &hf_gvcp_first_xml_device_description_file, { "First URL", "gvcp.bootstrap.firsturl", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }}, /* GVCP_SECOND_URL */ { &hf_gvcp_second_xml_device_description_file, { "Second URL", "gvcp.bootstrap.secondurl", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }}, /* GVCP_NUMBER_OF_NETWORK_INTERFACES */ {& hf_gvcp_number_interfaces, { "Number of Network Interfaces", "gvcp.bootstrap.numberofnetworminterfaces", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, /* GVCP_PERSISTENT_IP_ADDRESS_0, 1, 2, 3 */ {& hf_gvcp_persistent_ip, { "Persistent IP", "gvcp.bootstrap.persistentip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, /* GVCP_PERSISTENT_SUBNET_MASK_0, 1, 2, 3 */ {& hf_gvcp_persistent_subnet, { "Persistent Subnet Mask", "gvcp.bootstrap.persistentsubnetmask", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, /* GVCP_PERSISTENT_DEFAULT_GATEWAY_0, 1, 2, 3 */ {& hf_gvcp_persistent_gateway, { "Persistent GateWay", "gvcp.bootstrap.persistentgateway", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, /* GVCP_LINK_SPEED_0, 1, 2, 3 */ {& hf_gvcp_link_speed, { "Link Speed (in Mbs)", "gvcp.bootstrap.linkspeed", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, /* GVCP_NUMBER_OF_MESSAGE_CHANNELS */ {& hf_gvcp_number_message_channels, { "Number of Message Channels", "gvcp.bootstrap.numberofmessagechannels", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, /* GVCP_NUMBER_OF_STREAM_CHANNELS */ {& hf_gvcp_number_stream_channels, { "Number of Stream Channels", "gvcp.bootstrap.numberofstreamchannels", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, /* GVCP_NUMBER_OF_ACTION_SIGNALS */ {& hf_gvcp_number_action_signals, { "Number of Action Signals", "gvcp.bootstrap.numberofactionsignals", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, /* GVCP_NUMBER_OF_ACTIVE_LINKS */ {& hf_gvcp_number_of_active_links_v2_0, { "Number of Active Links", "gvcp.bootstrap.numberofactivelinks", FT_UINT32, BASE_DEC, NULL, 0x0000000F, NULL, HFILL }}, /* GVCP_IEEE_1588_SELECTED_PROFILE */ {& hf_gvcp_selected_ieee1588_profile_v2_1, { "IEEE 1588 Selected Profile", "gvcp.bootstrap.ieee1588selectedprofile", FT_UINT32, BASE_DEC, NULL, 0x0000001F, NULL, HFILL }}, /* GVCP_SC_CAPS */ {& hf_gvcp_sccaps_scspx_register_supported, { "SCSPx Register Supported", "gvcp.bootstrap.sccaps.scspxregistersupported", FT_BOOLEAN, 32, NULL, 0x80000000, NULL, HFILL }}, {& hf_gvcp_sccaps_legacy_16bit_blockid_supported_v2_0, { "16 bit Block ID Supported", "gvcp.bootstrap.sccaps.16bitblockidsupported", FT_BOOLEAN, 32, NULL, 0x40000000, NULL, HFILL }}, /* GVCP_MESSAGE_CHANNEL_CAPS */ {& hf_gvcp_mcsp_supported, { "MCSP Supported", "gvcp.bootstrap.mccaps.mcspsupported", FT_BOOLEAN, 32, NULL, 0x80000000, NULL, HFILL }}, /* GVCP_IEEE_1588_EXTENDED_CAPABILITY */ {& hf_gvcp_ieee1588_profile_registers_present_v2_1, { "IEEE 1588 Profile Registers Present", "gvcp.bootstrap.ieee1588extendedcapabilities.profileregisterspresent", FT_BOOLEAN, 32, NULL, 0x80000000, NULL, HFILL }}, /* GVCP_IEEE_1588_SUPPORTED_PROFILES */ {& hf_gvcp_ieee1588_ptp_profile_supported_v2_1, { "IEEE 1588 PTP Profile Supported", "gvcp.bootstrap.ieee1588supportedprofiles.ptp", FT_BOOLEAN, 32, NULL, 0x80000000, NULL, HFILL }}, {& hf_gvcp_ieee1588_802dot1as_profile_supported_v2_1, { "IEEE 1588 802.1as Profile Supported", "gvcp.bootstrap.ieee1588supportedprofiles.802dot1as", FT_BOOLEAN, 32, NULL, 0x40000000, NULL, HFILL }}, /* GVCP_CAPABILITY */ {& hf_gvcp_capability_user_defined, { "User Defined Name Supported", "gvcp.bootstrap.capability.userdefined", FT_BOOLEAN, 32, NULL, 0x80000000, NULL, HFILL }}, {& hf_gvcp_capability_serial_number, { "Serial Number Supported", "gvcp.bootstrap.capability.serialnumber", FT_BOOLEAN, 32, NULL, 0x40000000, NULL, HFILL }}, {& hf_gvcp_capability_heartbeat_disable, { "Heartbeat Disable Supported", "gvcp.bootstrap.capability.heartbeatdisabled", FT_BOOLEAN, 32, NULL, 0x20000000, NULL, HFILL }}, {& hf_gvcp_capability_link_speed, { "Link Speed Supported", "gvcp.bootstrap.capability.linkspeed", FT_BOOLEAN, 32, NULL, 0x10000000, NULL, HFILL }}, {& hf_gvcp_capability_ccp_application_portip, { "CCP Application Port/IP Supported", "gvcp.bootstrap.capability.ccpapplicationportip", FT_BOOLEAN, 32, NULL, 0x08000000, NULL, HFILL }}, {& hf_gvcp_capability_manifest_table, { "Manifest Table Supported", "gvcp.bootstrap.capability.manifesttable", FT_BOOLEAN, 32, NULL, 0x04000000, NULL, HFILL }}, {& hf_gvcp_capability_test_data, { "Test Data Supported", "gvcp.bootstrap.capability.testdata", FT_BOOLEAN, 32, NULL, 0x02000000, NULL, HFILL }}, {& hf_gvcp_capability_discovery_ACK_delay, { "Discovery ACK Delay Supported", "gvcp.bootstrap.capability.discoveryackdelay", FT_BOOLEAN, 32, NULL, 0x01000000, NULL, HFILL }}, {& hf_gvcp_capability_writable_discovery_ACK_delay, { "Writable Discovery ACK Delay Supported", "gvcp.bootstrap.capability.writablediscoveryackdelay", FT_BOOLEAN, 32, NULL, 0x00800000, NULL, HFILL }}, {& hf_gvcp_capability_extended_status_code_v1_1, { "Extended Status Code Supported (v1.1)", "gvcp.bootstrap.capability.extendedstatuscodesupportedv1_1", FT_BOOLEAN, 32, NULL, 0x00400000, NULL, HFILL }}, {& hf_gvcp_capability_primary_application_switchover, { "Primary Application Switchover Supported", "gvcp.bootstrap.capability.primaryapplicationswitchover", FT_BOOLEAN, 32, NULL, 0x00200000, NULL, HFILL }}, {& hf_gvcp_capability_unconditional_action_command, { "Unconditional Action Command Supported", "gvcp.bootstrap.capability.unconditionalactioncommand", FT_BOOLEAN, 32, NULL, 0x00100000, NULL, HFILL }}, {& hf_gvcp_capability_1588_v2_0, { "Capability 1588", "gvcp.bootstrap.capability.ieee1588", FT_BOOLEAN, 32, NULL, 0x00080000, NULL, HFILL }}, {& hf_gvcp_capability_extended_status_code_v2_0, { "Status Code", "gvcp.bootstrap.capability.pendingextendedstatuscodev2_0", FT_BOOLEAN, 32, NULL, 0x00040000, NULL, HFILL }}, {& hf_gvcp_capability_scheduled_action_command_v2_0, { "Scheduled Action Command", "gvcp.bootstrap.capability.scheduledactioncommand", FT_BOOLEAN, 32, NULL, 0x00020000, NULL, HFILL }}, {& hf_gvcp_capability_ieee1588_extended_capabilities_v2_1, { "IEEE1588 Extended Capabilities", "gvcp.bootstrap.capability.ieee1588extendedcapabilities", FT_BOOLEAN, 32, NULL, 0x00010000, NULL, HFILL }}, {& hf_gvcp_capability_action_command, { "Action Command", "gvcp.bootstrap.capability.actioncommand", FT_BOOLEAN, 32, NULL, 0x00000040, NULL, HFILL }}, {& hf_gvcp_capability_pending, { "Pending ACK Supported", "gvcp.bootstrap.capability.pendingack", FT_BOOLEAN, 32, NULL, 0x00000020, NULL, HFILL }}, {& hf_gvcp_capability_evendata, { "Event Data Supported", "gvcp.bootstrap.capability.eventdata", FT_BOOLEAN, 32, NULL, 0x00000010, NULL, HFILL }}, {& hf_gvcp_capability_event, { "Event Signal Supported", "gvcp.bootstrap.capability.eventsignal", FT_BOOLEAN, 32, NULL, 0x00000008, NULL, HFILL }}, {& hf_gvcp_capability_packetresend, { "Packet Resend CMD Supported", "gvcp.bootstrap.capability.packetresendcmd", FT_BOOLEAN, 32, NULL, 0x00000004, NULL, HFILL }}, {& hf_gvcp_capability_writemem, { "WRITEMEM Supported", "gvcp.bootstrap.capability.writemem", FT_BOOLEAN, 32, NULL, 0x00000002, NULL, HFILL }}, {& hf_gvcp_capability_concatenation, { "Concatenation Supported", "gvcp.bootstrap.capability.concatenation", FT_BOOLEAN, 32, NULL, 0x00000001, NULL, HFILL }}, /* GVCP_HEARTBEAT_TIMEOUT */ {& hf_gvcp_heartbeat, { "Heartbeat Timeout (in ms)", "gvcp.bootstrap.heartbeattimeout", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, /* GVCP_TIMESTAMP_TICK_FREQUENCY_HIGH */ {& hf_gvcp_high_timestamp_frequency, { "Timestamp Tick High Frequency (in Hz)", "gvcp.bootstrap.timestamptickfrequencyhigh", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, /* GVCP_TIMESTAMP_TICK_FREQUENCY_LOW */ {& hf_gvcp_low_timestamp_frequency, { "Timestamp Tick Low Frequency (in Hz)", "gvcp.bootstrap.timestamptickfrequencylow", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, /* GVCP_TIMESTAMP_CONTROL */ {& hf_gvcp_timestamp_control_latch, { "Timestamp Control Latch", "gvcp.bootstrap.timestampcontrol.latch", FT_BOOLEAN, 32, NULL, 0x00000002, NULL, HFILL }}, {& hf_gvcp_timestamp_control_reset, { "Timestamp Control Reset", "gvcp.bootstrap.timestampcontrol.reset", FT_BOOLEAN, 32, NULL, 0x00000001, NULL, HFILL }}, /* GVCP_TIMESTAMP_VALUE_HIGH */ {& hf_gvcp_high_timestamp_value, { "Timestamp Value High", "gvcp.bootstrap.timestampvaluehigh", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, /* GVCP_TIMESTAMP_VALUE_LOW */ {& hf_gvcp_low_timestamp_value, { "Timestamp Value Low", "gvcp.bootstrap.timestampvaluelow", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, /* GVCP_DISCOVERY_ACK_DELAY */ {& hf_gvcp_discovery_ACK_delay, { "Discovery ACK Delay (in ms)", "gvcp.bootstrap.discoveryackdelay", FT_UINT32, BASE_DEC, NULL, 0x0000FFFF, NULL, HFILL }}, /* GVCP_CONFIGURATION */ {& hf_gvcp_configuration_1588_enable_v2_0, { "IEEE 1588 Enable", "gvcp.bootstrap.config.ieee1588enable", FT_BOOLEAN, 32, NULL, 0x00080000, NULL, HFILL }}, {& hf_gvcp_configuration_extended_status_codes_enable_v2_0, { "Status Codes v2.0 Enable", "gvcp.bootstrap.config.statuscodesv2_0enable", FT_BOOLEAN, 32, NULL, 0x00040000, NULL, HFILL }}, {& hf_gvcp_configuration_unconditional_action_command_enable_v2_0, { "Unconditional Action Command Enable", "gvcp.bootstrap.config.unconditionalactioncommandenable", FT_BOOLEAN, 32, NULL, 0x00000008, NULL, HFILL }}, {& hf_gvcp_configuration_extended_status_codes_enable_v1_1, { "Status Codes v1.1 Enable", "gvcp.bootstrap.config.statuscodesv1_1enable", FT_BOOLEAN, 32, NULL, 0x00000004, NULL, HFILL }}, {& hf_gvcp_configuration_pending_ack_enable, { "Pending_ACK Enable", "gvcp.bootstrap.config.pendingackenable", FT_BOOLEAN, 32, NULL, 0x00000002, NULL, HFILL }}, {& hf_gvcp_configuration_heartbeat_disable, { "Heartbeat Disable", "gvcp.bootstrap.config.heartbeatdisable", FT_BOOLEAN, 32, NULL, 0x00000001, NULL, HFILL }}, /* GVCP_PENDING_TIMEOUT */ {& hf_gvcp_pending_timeout_max_execution, { "Pending Timeout (in ms)", "gvcp.bootstrap.pending.timeout", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, /* GVCP_CONTROL_SWITCHOVER_KEY */ {& hf_gvcp_control_switchover_key_register, { "Control Switchover Key", "gvcp.bootstrap.controlswitchoverkey", FT_UINT32, BASE_DEC, NULL, 0x0000FFFF, NULL, HFILL }}, /* GVCP_GVSCP_CONFIGURATION */ {& hf_gvcp_gvsp_configuration_64bit_blockid_enable_v2_0, { "GVSP Configuration 64 bit Block ID", "gvcp.bootstrap.gvcspconfig.64bitblockidenable", FT_BOOLEAN, 32, NULL, 0x40000000, NULL, HFILL }}, /* GVCP_PHYSICAL_LINK_CAPABILITY, GVCP_PHYSICAL_LINK_CONFIGURATION */ {& hf_gvcp_link_dlag_v2_0, { "Link dLAG", "gvcp.bootstrap.link.dlag", FT_BOOLEAN, 32, NULL, 0x00000008, NULL, HFILL }}, {& hf_gvcp_link_slag_v2_0, { "Link sLAG", "gvcp.bootstrap.link.slag", FT_BOOLEAN, 32, NULL, 0x00000004, NULL, HFILL }}, {& hf_gvcp_link_ml_v2_0, { "Link ML", "gvcp.bootstrap.link.ml", FT_BOOLEAN, 32, NULL, 0x00000002, NULL, HFILL }}, {& hf_gvcp_link_sl_v2_0, { "Link SL", "gvcp.bootstrap.link.sl", FT_BOOLEAN, 32, NULL, 0x00000001, NULL, HFILL }}, /* GVCP_IEEE_1588_STATUS */ {& hf_gvcp_ieee1588_clock_status_v2_0, { "IEEE 1588 Clock Status", "gvcp.bootstrap.ieee1588.clockstatus", FT_UINT32, BASE_HEX, NULL, 0x0000000F, NULL, HFILL }}, /* GVCP_SCHEDULED_ACTION_COMMAND_QUEUE_SIZE */ {& hf_gvcp_scheduled_action_command_queue_size_v2_0, { "Scheduled Action Command Queue Size", "gvcp.bootstrap.scheduledactioncommandqueuesize", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }}, /* GVCP_CCP */ {& hf_gvcp_control_switchover_key, { "Control Switchover Key", "gvcp.bootstrap.control.switchoverkey", FT_UINT32, BASE_HEX, NULL, 0xFFFF0000, NULL, HFILL }}, {& hf_gvcp_control_switchover_en, { "Control Switchover Enable", "gvcp.bootstrap.control.switchoverenable", FT_BOOLEAN, 32, NULL, 0x00000004, NULL, HFILL }}, {& hf_gvcp_control_access, { "Control Access", "gvcp.bootstrap.control.controlaccess", FT_BOOLEAN, 32, NULL, 0x00000002, NULL, HFILL }}, {& hf_gvcp_exclusive_access, { "Exclusive Access", "gvcp.bootstrap.control.exclusiveaccess", FT_BOOLEAN, 32, NULL, 0x00000001, NULL, HFILL }}, /* GVCP_PRIMARY_APPLICATION_PORT */ {& hf_gvcp_primary_application_host_port, { "Primary Application Port", "gvcp.bootstrap.primaryapplicationport", FT_UINT32, BASE_DEC, NULL, 0x0000FFFF, NULL, HFILL }}, /* GVCP_PRIMARY_APPLICATION_IP_ADDRESS */ {& hf_gvcp_primary_application_ip_address, { "Primary Application IP Address", "gvcp.bootstrap.primaryapplicationipaddress", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, /* GVCP_MC_DESTINATION_PORT */ {& hf_gvcp_network_interface_index, { "Network Interface Index", "gvcp.bootstrap.mcp.networkinterfaceindex", FT_UINT32, BASE_DEC, NULL, 0x000F0000, NULL, HFILL }}, {& hf_gvcp_host_port, { "Host Port", "gvcp.bootstrap.mcp.hostport", FT_UINT32, BASE_DEC, NULL, 0x0000FFFF, NULL, HFILL }}, /* GVCP_MC_DESTINATION_ADDRESS */ {& hf_gvcp_channel_destination_ip, { "Destination IP Address", "gvcp.bootstrap.mcda", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, /* GVCP_MC_TIMEOUT */ {& hf_gvcp_message_channel_transmission_timeout, { "Transmission Timeout (in ms)", "gvcp.bootstrap.mctt", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, /* GVCP_MC_RETRY_COUNT */ {& hf_gvcp_message_channel_retry_count, { "Retry Count", "gvcp.bootstrap.mcrc", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, /* GVCP_MC_SOURCE_PORT */ {& hf_gvcp_message_channel_source_port, { "Source Port", "gvcp.bootstrap.mcsp", FT_UINT32, BASE_DEC, NULL, 0x0000FFFF, NULL, HFILL }}, /* GVCP_SC_DESTINATION_PORT(0), 1, 2, 3 */ {& hf_gvcp_sc_direction, { "Direction", "gvcp.bootstrap.scpx.direction", FT_BOOLEAN, 32, TFS(&directionnames), 0x80000000, NULL, HFILL }}, {& hf_gvcp_sc_ni_index, { "Network Interface Index", "gvcp.bootstrap.scpx.networkinterfaceindex", FT_UINT32, BASE_DEC, NULL, 0x000F0000, NULL, HFILL }}, {& hf_gvcp_sc_host_port, { "Host Port", "gvcp.bootstrap.scpx.hostport", FT_UINT32, BASE_DEC, NULL, 0x0000FFFF, NULL, HFILL }}, /* GVCP_SC_PACKET_SIZE(0), 1, 2, 3 */ {& hf_gvcp_sc_fire_test_packet, { "Fire Test Packet", "gvcp.bootstrap.scpsx.firetestpacket", FT_BOOLEAN, 32, NULL, 0x80000000, NULL, HFILL }}, {& hf_gvcp_sc_do_not_fragment, { "Do Not Fragment", "gvcp.bootstrap.scpsx.donotfragment", FT_BOOLEAN, 32, NULL, 0x40000000, NULL, HFILL }}, {& hf_gvcp_sc_pixel_endianness, { "Pixel Endianness", "gvcp.bootstrap.scpsx.pixelendianness", FT_BOOLEAN, 32, NULL, 0x20000000, NULL, HFILL }}, {& hf_gvcp_sc_packet_size, { "Packet Size", "gvcp.bootstrap.scpsx.packetsize", FT_UINT32, BASE_DEC, NULL, 0x0000FFFF, NULL, HFILL }}, /* GVCP_SC_PACKET_DELAY(0), 1, 2, 3 */ {& hf_gvcp_sc_packet_delay, { "Packet Delay", "gvcp.bootstrap.scpdx", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, /* GVCP_SC_DESTINATION_ADDRESS(0), 1, 2, 3 */ {& hf_gvcp_sc_destination_ip, { "Destination Address", "gvcp.bootstrap.scdax", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }}, /* GVCP_SC_SOURCE_PORT(0), 1, 2, 3 */ {& hf_gvcp_sc_source_port, { "Source Port", "gvcp.bootstrap.scspx", FT_UINT32, BASE_DEC, NULL, 0x0000FFFF, NULL, HFILL }}, /* GVCP_SC_CAPABILITY(0), 1, 2, 3 */ {& hf_gvcp_sc_big_little_endian_supported, { "Big/Little Endian Supported", "gvcp.bootstrap.sccx.biglittleendiansupported", FT_BOOLEAN, 32, NULL, 0x80000000, NULL, HFILL }}, {& hf_gvcp_sc_ip_reassembly_supported, { "IP Reassembly Supported", "gvcp.bootstrap.sccx.ipreassemblysupported", FT_BOOLEAN, 32, NULL, 0x40000000, NULL, HFILL }}, {& hf_gvcp_sc_multi_part_supported_v2_1, { "Multi-part Supported", "gvcp.bootstrap.sccx.multipartsupported", FT_BOOLEAN, 32, NULL, 0x00000040, NULL, HFILL }}, {& hf_gvcp_sc_large_leader_trailer_supported_v2_1, { "Large Leader/Trailer Supported", "gvcp.bootstrap.sccx.largeleadertrailersupported", FT_BOOLEAN, 32, NULL, 0x00000020, NULL, HFILL }}, {& hf_gvcp_sc_multizone_supported_v2_0, { "Multi-zone Supported", "gvcp.bootstrap.sccx.multizonesupported", FT_BOOLEAN, 32, NULL, 0x00000010, NULL, HFILL }}, {& hf_gvcp_sc_packet_resend_destination_option_supported_v2_0, { "Resend Destination Option Supported", "gvcp.bootstrap.sccx.resenddestinationoptionsupported", FT_BOOLEAN, 32, NULL, 0x8, NULL, HFILL }}, {& hf_gvcp_sc_packet_resend_all_in_transmission_supported_v2_0, { "All In Transmission Supported", "gvcp.bootstrap.sccx.allintransmissionsupported", FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL }}, {& hf_gvcp_sc_unconditional_streaming_supported, { "Unconditional Streaming Supported", "gvcp.bootstrap.sccx.unconditionalstreamingsupported", FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL }}, {& hf_gvcp_sc_extended_chunk_data_supported, { "Extended Chunk Data Supported", "gvcp.bootstrap.sccx.extendedchunkdatasupported", FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL }}, /* GVCP_SC_CONFIGURATION(0), 1, 2, 3 */ {& hf_gvcp_sc_multi_part_enabled_v2_1, { "Multi-part Enabled", "gvcp.bootstrap.sccfgx.multipartenabled", FT_BOOLEAN, 32, NULL, 0x40, NULL, HFILL }}, {& hf_gvcp_sc_large_leader_trailer_enabled_v2_1, { "Large Leader/Trailer Enabled", "gvcp.bootstrap.sccfgx.largeleadertrailerenabled", FT_BOOLEAN, 32, NULL, 0x20, NULL, HFILL }}, {& hf_gvcp_sc_packet_resend_destination_option_enabled_v2_0, { "Resend Destination Option Enabled", "gvcp.bootstrap.sccfgx.resenddestinationoptionenabled", FT_BOOLEAN, 32, NULL, 0x8, NULL, HFILL }}, {& hf_gvcp_sc_packet_resend_all_in_transmission_enabled_v2_0, { "All In Transmission Enabled", "gvcp.bootstrap.sccfgx.allintransmissionenabled", FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL }}, {& hf_gvcp_sc_unconditional_streaming_enabled, { "Unconditional Streaming Enabled", "gvcp.bootstrap.sccfgx.unconditionalstreamingenabled", FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL }}, {& hf_gvcp_sc_extended_chunk_data_enabled, { "Extended Chunk Data Enabled", "gvcp.bootstrap.sccfgx.extendedchunkdataenabled", FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL }}, /* GVCP_SC_ZONE(0), 1, 2, 3 */ {& hf_gvcp_sc_additional_zones_v2_0, { "Additional Zones", "gvcp.bootstrap.sczx.additionalzones", FT_UINT32, BASE_DEC, NULL, 0x0000000F, NULL, HFILL }}, /* GVCP_SC_ZONE_DIRECTION(0), 1, 2, 3 */ {& hf_gvcp_sc_zone0_direction_v2_0, { "Zone 0 Direction", "gvcp.bootstrap.sczdx.zone0direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x80000000, NULL, HFILL }}, {& hf_gvcp_sc_zone1_direction_v2_0, { "Zone 1 Direction", "gvcp.bootstrap.sczdx.zone1direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x40000000, NULL, HFILL }}, {& hf_gvcp_sc_zone2_direction_v2_0, { "Zone 2 Direction", "gvcp.bootstrap.sczdx.zone2direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x20000000, NULL, HFILL }}, {& hf_gvcp_sc_zone3_direction_v2_0, { "Zone 3 Direction", "gvcp.bootstrap.sczdx.zone3direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x10000000, NULL, HFILL }}, {& hf_gvcp_sc_zone4_direction_v2_0, { "Zone 4 Direction", "gvcp.bootstrap.sczdx.zone4direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x08000000, NULL, HFILL }}, {& hf_gvcp_sc_zone5_direction_v2_0, { "Zone 5 Direction", "gvcp.bootstrap.sczdx.zone5direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x04000000, NULL, HFILL }}, {& hf_gvcp_sc_zone6_direction_v2_0, { "Zone 6 Direction", "gvcp.bootstrap.sczdx.zone6direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x02000000, NULL, HFILL }}, {& hf_gvcp_sc_zone7_direction_v2_0, { "Zone 7 Direction", "gvcp.bootstrap.sczdx.zone7direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x01000000, NULL, HFILL }}, {& hf_gvcp_sc_zone8_direction_v2_0, { "Zone 8 Direction", "gvcp.bootstrap.sczdx.zone8direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00800000, NULL, HFILL }}, {& hf_gvcp_sc_zone9_direction_v2_0, { "Zone 9 Direction", "gvcp.bootstrap.sczdx.zone9direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00400000, NULL, HFILL }}, {& hf_gvcp_sc_zone10_direction_v2_0, { "Zone 10 Direction", "gvcp.bootstrap.sczdx.zone10direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00200000, NULL, HFILL }}, {& hf_gvcp_sc_zone11_direction_v2_0, { "Zone 11 Direction", "gvcp.bootstrap.sczdx.zone1direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00100000, NULL, HFILL }}, {& hf_gvcp_sc_zone12_direction_v2_0, { "Zone 12 Direction", "gvcp.bootstrap.sczdx.zone12direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00080000, NULL, HFILL }}, {& hf_gvcp_sc_zone13_direction_v2_0, { "Zone 13 Direction", "gvcp.bootstrap.sczdx.zone13direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00040000, NULL, HFILL }}, {& hf_gvcp_sc_zone14_direction_v2_0, { "Zone 14 Direction", "gvcp.bootstrap.sczdx.zone14direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00020000, NULL, HFILL }}, {& hf_gvcp_sc_zone15_direction_v2_0, { "Zone 15 Direction", "gvcp.bootstrap.sczdx.zone15direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00010000, NULL, HFILL }}, {& hf_gvcp_sc_zone16_direction_v2_0, { "Zone 16 Direction", "gvcp.bootstrap.sczdx.zone16direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00008000, NULL, HFILL }}, {& hf_gvcp_sc_zone17_direction_v2_0, { "Zone 17 Direction", "gvcp.bootstrap.sczdx.zone17direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00004000, NULL, HFILL }}, {& hf_gvcp_sc_zone18_direction_v2_0, { "Zone 18 Direction", "gvcp.bootstrap.sczdx.zone18direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00002000, NULL, HFILL }}, {& hf_gvcp_sc_zone19_direction_v2_0, { "Zone 19 Direction", "gvcp.bootstrap.sczdx.zone19direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00001000, NULL, HFILL }}, {& hf_gvcp_sc_zone20_direction_v2_0, { "Zone 20 Direction", "gvcp.bootstrap.sczdx.zone20direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000800, NULL, HFILL }}, {& hf_gvcp_sc_zone21_direction_v2_0, { "Zone 21 Direction", "gvcp.bootstrap.sczdx.zone21direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000400, NULL, HFILL }}, {& hf_gvcp_sc_zone22_direction_v2_0, { "Zone 22 Direction", "gvcp.bootstrap.sczdx.zone22direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000200, NULL, HFILL }}, {& hf_gvcp_sc_zone23_direction_v2_0, { "Zone 23 Direction", "gvcp.bootstrap.sczdx.zone23direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000100, NULL, HFILL }}, {& hf_gvcp_sc_zone24_direction_v2_0, { "Zone 24 Direction", "gvcp.bootstrap.sczdx.zone24direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000080, NULL, HFILL }}, {& hf_gvcp_sc_zone25_direction_v2_0, { "Zone 25 Direction", "gvcp.bootstrap.sczdx.zone25direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000040, NULL, HFILL }}, {& hf_gvcp_sc_zone26_direction_v2_0, { "Zone 26 Direction", "gvcp.bootstrap.sczdx.zone26direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000020, NULL, HFILL }}, {& hf_gvcp_sc_zone27_direction_v2_0, { "Zone 27 Direction", "gvcp.bootstrap.sczdx.zone27direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000010, NULL, HFILL }}, {& hf_gvcp_sc_zone28_direction_v2_0, { "Zone 28 Direction", "gvcp.bootstrap.sczdx.zone28direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000008, NULL, HFILL }}, {& hf_gvcp_sc_zone29_direction_v2_0, { "Zone 29 Direction", "gvcp.bootstrap.sczdx.zone29direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000004, NULL, HFILL }}, {& hf_gvcp_sc_zone30_direction_v2_0, { "Zone 30 Direction", "gvcp.bootstrap.sczdx.zone30direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000002, NULL, HFILL }}, {& hf_gvcp_sc_zone31_direction_v2_0, { "Zone 31 Direction", "gvcp.bootstrap.sczdx.zone31direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000001, NULL, HFILL }}, /* GVCP_ACTION_GROUP_KEY(0), 1, 2, 3, 4, 5, 6, 7, 8, 9 */ {& hf_gvcp_action_group_key, { "Action Group Key", "gvcp.bootstrap.actiongroupkey", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, /* GVCP_ACTION_GROUP_MASK(0), 1, 2, 3, 4, 5, 6, 7, 8, 9 */ {& hf_gvcp_action_group_mask, { "Action Group Mask", "gvcp.bootstrap.actiongroupmask", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }}, /* {& hf_gvcp_latency, { "Latency Value (in us)", "gvcp.bootstrap.latency", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, */ {& hf_gvcp_custom_register_addr, { "Custom Register Address", "gvcp.bootstrap.custom.register.write", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }}, {& hf_gvcp_custom_memory_addr, { "Custom Memory Address", "gvcp.bootstrap.custom.register.write", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }}, /* Request/Response tracking */ {& hf_gvcp_response_in, { "Response In", "gvcp.response_in", FT_FRAMENUM, BASE_NONE, NULL, 0x0, "The response to this GVCP request is in this frame", HFILL }}, {& hf_gvcp_response_to, { "Request In", "gvcp.response_to", FT_FRAMENUM, BASE_NONE, NULL, 0x0, "This is a response to the GVCP request in this frame", HFILL }}, /* Generated from convert_proto_tree_add_text.pl */ { &hf_gvcp_reserved_bit, { "Reserved Bit", "gvcp.reserved_bit", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_manifest_table, { "Manifest Table", "gvcp.manifest_table", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_custom_register_value, { "Value", "gvcp.bootstrap.custom.register.value", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_custom_read_register_addr, { "Custom Register Address", "gvcp.bootstrap.custom.register.read", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_custom_read_register_value, { "Custom Register Value", "gvcp.bootstrap.custom.register.read_value", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }}, { &hf_gvcp_readmemcmd_data_read, { "Data read", "gvcp.cmd.readmem.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, }; static gint *ett[] = { &ett_gvcp, &ett_gvcp_cmd, &ett_gvcp_flags, &ett_gvcp_ack, &ett_gvcp_payload_cmd, &ett_gvcp_payload_ack, &ett_gvcp_payload_ack_subtree, &ett_gvcp_payload_cmd_subtree, &ett_gvcp_bootstrap_fields }; proto_gvcp = proto_register_protocol("GigE Vision Control Protocol", "GVCP", "gvcp"); gvcp_handle = register_dissector("gvcp", dissect_gvcp, proto_gvcp); proto_register_field_array(proto_gvcp, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); } /* The registration hand-off routing */ void proto_reg_handoff_gvcp(void) { dissector_add_uint("udp.port", global_gvcp_port, gvcp_handle); gvsp_handle = find_dissector("gvsp"); } /* * Editor modelines - http://www.wireshark.org/tools/modelines.html * * Local variables: * c-basic-offset: 8 * tab-width: 8 * indent-tabs-mode: t * End: * * vi: set shiftwidth=8 tabstop=8 noexpandtab: * :indentSize=8:tabSize=8:noTabs=false: */ aravis-ARAVIS_0_6_0/tools/wireshark-dissectors/packet-gvsp.c000066400000000000000000003005071334570641500241350ustar00rootroot00000000000000/* packet-gvsp.c * Routines for AIA GigE Vision (TM) Streaming Protocol dissection * Copyright 2012, AIA All rights reserved * * GigE Vision (TM): GigE Vision a standard developed under the sponsorship of the AIA for * the benefit of the machine vision industry. GVSP stands for GigE Vision (TM) Streaming * Protocol. * * Wireshark - Network traffic analyzer * By Gerald Combs * Copyright 1998 Gerald Combs * * SPDX-License-Identifier: GPL-2.0-or-later */ #include "config.h" #include #include #include void proto_register_gvsp(void); void proto_reg_handoff_gvsp(void); #define GVSP_MIN_PACKET_SIZE 8 #define GVSP_V2_MIN_PACKET_SIZE 20 #define GVSP_EXTENDED_ID_BIT 0x80 #define GVSP_EXTENDED_CHUNK_BIT 0x4000 #define GVSP_SIZE_OF_PART_INFO_LEADER ( 48 ) #define GVSP_SIZE_OF_PART_INFO_TRAILER ( 16 ) /* Payload types */ #define GVSP_PAYLOAD_IMAGE ( 0x0001 ) #define GVSP_PAYLOAD_RAWDATA ( 0x0002 ) #define GVSP_PAYLOAD_FILE ( 0x0003 ) #define GVSP_PAYLOAD_CHUNKDATA ( 0x0004 ) #define GVSP_PAYLOAD_EXTENDEDCHUNKDATA ( 0x0005 ) /* Deprecated with GEV 2.0 */ #define GVSP_PAYLOAD_JPEG ( 0x0006 ) /* GEV 2.0 */ #define GVSP_PAYLOAD_JPEG2000 ( 0x0007 ) /* GEV 2.0 */ #define GVSP_PAYLOAD_H264 ( 0x0008 ) /* GEV 2.0 */ #define GVSP_PAYLOAD_MULTIZONEIMAGE ( 0x0009 ) /* GEV 2.0 */ #define GVSP_PAYLOAD_MULTIPART ( 0x000A ) /* GEV 2.1 */ #define GVSP_PAYLOAD_DEVICEPSECIFICSTART ( 0x8000 ) /* GVSP packet types */ #define GVSP_PACKET_LEADER ( 1 ) #define GVSP_PACKET_TRAILER ( 2 ) #define GVSP_PACKET_PAYLOAD ( 3 ) #define GVSP_PACKET_ALLIN ( 4 ) #define GVSP_PACKET_PAYLOAD_H264 ( 5 ) #define GVSP_PACKET_PAYLOAD_MULTIZONE ( 6 ) #define GVSP_PACKET_PAYLOAD_MULTIPART ( 7 ) /* GEV 2.1 */ #define GVSP_PACKET_PAYLOAD_LAST ( 7 ) /* GVSP Multi-Part data types (GEV 2.1) */ #define GVSP_MULTIPART_DATA_TYPE_2DIMAGE ( 0x0001 ) #define GVSP_MULTIPART_DATA_TYPE_2DPLANEBIPLANAR ( 0x0002 ) #define GVSP_MULTIPART_DATA_TYPE_2DPLANETRIPLANAR ( 0x0003 ) #define GVSP_MULTIPART_DATA_TYPE_2DPLANEQUADPLANAR ( 0x0004 ) #define GVSP_MULTIPART_DATA_TYPE_3DIMAGE ( 0x0005 ) #define GVSP_MULTIPART_DATA_TYPE_3DPLANEBIPLANAR ( 0x0006 ) #define GVSP_MULTIPART_DATA_TYPE_3DPLANETRIPLANAR ( 0x0007 ) #define GVSP_MULTIPART_DATA_TYPE_3DPLANEQUADPLANAR ( 0x0008 ) #define GVSP_MULTIPART_DATA_TYPE_CONFIDENCEMAP ( 0x0009 ) #define GVSP_MULTIPART_DATA_TYPE_CHUNKDATA ( 0x000A ) #define GVSP_MULTIPART_DATA_TYPE_JPEG ( 0x000B ) #define GVSP_MULTIPART_DATA_TYPE_JPEG2000 ( 0x000C ) #define GVSP_MULTIPART_DATA_TYPE_DEVICESPECIFIC ( 0x8000 ) /* GVSP statuses */ #define GEV_STATUS_SUCCESS (0x0000) #define GEV_STATUS_PACKET_RESEND (0x0100) #define GEV_STATUS_NOT_IMPLEMENTED (0x8001) #define GEV_STATUS_INVALID_PARAMETER (0x8002) #define GEV_STATUS_INVALID_ADDRESS (0x8003) #define GEV_STATUS_WRITE_PROTECT (0x8004) #define GEV_STATUS_BAD_ALIGNMENT (0x8005) #define GEV_STATUS_ACCESS_DENIED (0x8006) #define GEV_STATUS_BUSY (0x8007) #define GEV_STATUS_LOCAL_PROBLEM (0x8008) /* deprecated */ #define GEV_STATUS_MSG_MISMATCH (0x8009) /* deprecated */ #define GEV_STATUS_INVALID_PROTOCOL (0x800A) /* deprecated */ #define GEV_STATUS_NO_MSG (0x800B) /* deprecated */ #define GEV_STATUS_PACKET_UNAVAILABLE (0x800C) #define GEV_STATUS_DATA_OVERRUN (0x800D) #define GEV_STATUS_INVALID_HEADER (0x800E) #define GEV_STATUS_WRONG_CONFIG (0x800F) /* deprecated */ #define GEV_STATUS_PACKET_NOT_YET_AVAILABLE (0x8010) #define GEV_STATUS_PACKET_AND_PREV_REMOVED_FROM_MEMORY (0x8011) #define GEV_STATUS_PACKET_REMOVED_FROM_MEMORY (0x8012) #define GEV_STATUS_NO_REF_TIME (0x8013) /* GEV 2.0 */ #define GEV_STATUS_PACKET_TEMPORARILY_UNAVAILABLE (0x8014) /* GEV 2.0 */ #define GEV_STATUS_OVERFLOW (0x8015) /* GEV 2.0 */ #define GEV_STATUS_ACTION_LATE (0x8016) /* GEV 2.0 */ #define GEV_STATUS_LEADER_TRAILER_OVERFLOW (0x8017) /* GEV 2.1 */ #define GEV_STATUS_LAST (0x8017) #define GEV_STATUS_ERROR (0x8FFF) /* Pixel type color */ #define GVSP_PIX_MONO (0x01000000) #define GVSP_PIX_COLOR (0x02000000) #define GVSP_PIX_CUSTOM (0x80000000) /* Pixel types */ #define GVSP_PIX_MONO1P 0x01010037 #define GVSP_PIX_MONO2P 0x01020038 #define GVSP_PIX_MONO4P 0x01040039 #define GVSP_PIX_MONO8 0x01080001 #define GVSP_PIX_MONO8S 0x01080002 #define GVSP_PIX_MONO10 0x01100003 #define GVSP_PIX_MONO10P 0x010A0046 #define GVSP_PIX_MONO12 0x01100005 #define GVSP_PIX_MONO12P 0x010C0047 #define GVSP_PIX_MONO14 0x01100025 #define GVSP_PIX_MONO16 0x01100007 #define GVSP_PIX_BAYERBG8 0x0108000B #define GVSP_PIX_BAYERBG10 0x0110000F #define GVSP_PIX_BAYERBG10P 0x010A0052 #define GVSP_PIX_BAYERBG12 0x01100013 #define GVSP_PIX_BAYERBG12P 0x010C0053 #define GVSP_PIX_BAYERBG16 0x01100031 #define GVSP_PIX_BAYERGB8 0x0108000A #define GVSP_PIX_BAYERGB10 0x0110000E #define GVSP_PIX_BAYERGB10P 0x010A0054 #define GVSP_PIX_BAYERGB12 0x01100012 #define GVSP_PIX_BAYERGB12P 0x010C0055 #define GVSP_PIX_BAYERGB16 0x01100030 #define GVSP_PIX_BAYERGR8 0x01080008 #define GVSP_PIX_BAYERGR10 0x0110000C #define GVSP_PIX_BAYERGR10P 0x010A0056 #define GVSP_PIX_BAYERGR12 0x01100010 #define GVSP_PIX_BAYERGR12P 0x010C0057 #define GVSP_PIX_BAYERGR16 0x0110002E #define GVSP_PIX_BAYERRG8 0x01080009 #define GVSP_PIX_BAYERRG10 0x0110000D #define GVSP_PIX_BAYERRG10P 0x010A0058 #define GVSP_PIX_BAYERRG12 0x01100011 #define GVSP_PIX_BAYERRG12P 0x010C0059 #define GVSP_PIX_BAYERRG16 0x0110002F #define GVSP_PIX_RGBA8 0x02200016 #define GVSP_PIX_RGBA10 0x0240005F #define GVSP_PIX_RGBA10P 0x02280060 #define GVSP_PIX_RGBA12 0x02400061 #define GVSP_PIX_RGBA12P 0x02300062 #define GVSP_PIX_RGBA14 0x02400063 #define GVSP_PIX_RGBA16 0x02400064 #define GVSP_PIX_RGB8 0x02180014 #define GVSP_PIX_RGB8_PLANAR 0x02180021 #define GVSP_PIX_RGB10 0x02300018 #define GVSP_PIX_RGB10_PLANAR 0x02300022 #define GVSP_PIX_RGB10P 0x021E005C #define GVSP_PIX_RGB10P32 0x0220001D #define GVSP_PIX_RGB12 0x0230001A #define GVSP_PIX_RGB12_PLANAR 0x02300023 #define GVSP_PIX_RGB12P 0x0224005D #define GVSP_PIX_RGB14 0x0230005E #define GVSP_PIX_RGB16 0x02300033 #define GVSP_PIX_RGB16_PLANAR 0x02300024 #define GVSP_PIX_RGB565P 0x02100035 #define GVSP_PIX_BGRA8 0x02200017 #define GVSP_PIX_BGRA10 0x0240004C #define GVSP_PIX_BGRA10P 0x0228004D #define GVSP_PIX_BGRA12 0x0240004E #define GVSP_PIX_BGRA12P 0x0230004F #define GVSP_PIX_BGRA14 0x02400050 #define GVSP_PIX_BGRA16 0x02400051 #define GVSP_PIX_BGR8 0x02180015 #define GVSP_PIX_BGR10 0x02300019 #define GVSP_PIX_BGR10P 0x021E0048 #define GVSP_PIX_BGR12 0x0230001B #define GVSP_PIX_BGR12P 0x02240049 #define GVSP_PIX_BGR14 0x0230004A #define GVSP_PIX_BGR16 0x0230004B #define GVSP_PIX_BGR565P 0x02100036 #define GVSP_PIX_R8 0x010800C9 #define GVSP_PIX_R10 0x010A00CA #define GVSP_PIX_R12 0x010C00CB #define GVSP_PIX_R16 0x011000CC #define GVSP_PIX_G8 0x010800CD #define GVSP_PIX_G10 0x010A00CE #define GVSP_PIX_G12 0x010C00CF #define GVSP_PIX_G16 0x011000D0 #define GVSP_PIX_B8 0x010800D1 #define GVSP_PIX_B10 0x010A00D2 #define GVSP_PIX_B12 0x010C00D3 #define GVSP_PIX_B16 0x011000D4 #define GVSP_PIX_COORD3D_ABC8 0x021800B2 #define GVSP_PIX_COORD3D_ABC8_PLANAR 0x021800B3 #define GVSP_PIX_COORD3D_ABC10P 0x021E00DB #define GVSP_PIX_COORD3D_ABC10P_PLANAR 0x021E00DC #define GVSP_PIX_COORD3D_ABC12P 0x022400DE #define GVSP_PIX_COORD3D_ABC12P_PLANAR 0x022400DF #define GVSP_PIX_COORD3D_ABC16 0x023000B9 #define GVSP_PIX_COORD3D_ABC16_PLANAR 0x023000BA #define GVSP_PIX_COORD3D_ABC32F 0x026000C0 #define GVSP_PIX_COORD3D_ABC32F_PLANAR 0x026000C1 #define GVSP_PIX_COORD3D_AC8 0x021000B4 #define GVSP_PIX_COORD3D_AC8_PLANAR 0x021000B5 #define GVSP_PIX_COORD3D_AC10P 0x021400F0 #define GVSP_PIX_COORD3D_AC10P_PLANAR 0x021400F1 #define GVSP_PIX_COORD3D_AC12P 0x021800F2 #define GVSP_PIX_COORD3D_AC12P_PLANAR 0x021800F3 #define GVSP_PIX_COORD3D_AC16 0x022000BB #define GVSP_PIX_COORD3D_AC16_PLANAR 0x022000BC #define GVSP_PIX_COORD3D_AC32F 0x024000C2 #define GVSP_PIX_COORD3D_AC32F_PLANAR 0x024000C3 #define GVSP_PIX_COORD3D_A8 0x010800AF #define GVSP_PIX_COORD3D_A10P 0x010A00D5 #define GVSP_PIX_COORD3D_A12P 0x010C00D8 #define GVSP_PIX_COORD3D_A16 0x011000B6 #define GVSP_PIX_COORD3D_A32F 0x012000BD #define GVSP_PIX_COORD3D_B8 0x010800B0 #define GVSP_PIX_COORD3D_B10P 0x010A00D6 #define GVSP_PIX_COORD3D_B12P 0x010C00D9 #define GVSP_PIX_COORD3D_B16 0x011000B7 #define GVSP_PIX_COORD3D_B32F 0x012000BE #define GVSP_PIX_COORD3D_C8 0x010800B1 #define GVSP_PIX_COORD3D_C10P 0x010A00D7 #define GVSP_PIX_COORD3D_C12P 0x010C00DA #define GVSP_PIX_COORD3D_C16 0x011000B8 #define GVSP_PIX_COORD3D_C32F 0x012000BF #define GVSP_PIX_CONFIDENCE1 0x010800C4 #define GVSP_PIX_CONFIDENCE1P 0x010100C5 #define GVSP_PIX_CONFIDENCE8 0x010800C6 #define GVSP_PIX_CONFIDENCE16 0x011000C7 #define GVSP_PIX_CONFIDENCE32F 0x012000C8 #define GVSP_PIX_BICOLORBGRG8 0x021000A6 #define GVSP_PIX_BICOLORBGRG10 0x022000A9 #define GVSP_PIX_BICOLORBGRG10P 0x021400AA #define GVSP_PIX_BICOLORBGRG12 0x022000AD #define GVSP_PIX_BICOLORBGRG12P 0x021800AE #define GVSP_PIX_BICOLORRGBG8 0x021000A5 #define GVSP_PIX_BICOLORRGBG10 0x022000A7 #define GVSP_PIX_BICOLORRGBG10P 0x021400A8 #define GVSP_PIX_BICOLORRGBG12 0x022000AB #define GVSP_PIX_BICOLORRGBG12P 0x021800AC #define GVSP_PIX_SCF1WBWG8 0x01080067 #define GVSP_PIX_SCF1WBWG10 0x01100068 #define GVSP_PIX_SCF1WBWG10P 0x010A0069 #define GVSP_PIX_SCF1WBWG12 0x0110006A #define GVSP_PIX_SCF1WBWG12P 0x010C006B #define GVSP_PIX_SCF1WBWG14 0x0110006C #define GVSP_PIX_SCF1WBWG16 0x0110006D #define GVSP_PIX_SCF1WGWB8 0x0108006E #define GVSP_PIX_SCF1WGWB10 0x0110006F #define GVSP_PIX_SCF1WGWB10P 0x010A0070 #define GVSP_PIX_SCF1WGWB12 0x01100071 #define GVSP_PIX_SCF1WGWB12P 0x010C0072 #define GVSP_PIX_SCF1WGWB14 0x01100073 #define GVSP_PIX_SCF1WGWB16 0x01100074 #define GVSP_PIX_SCF1WGWR8 0x01080075 #define GVSP_PIX_SCF1WGWR10 0x01100076 #define GVSP_PIX_SCF1WGWR10P 0x010A0077 #define GVSP_PIX_SCF1WGWR12 0x01100078 #define GVSP_PIX_SCF1WGWR12P 0x010C0079 #define GVSP_PIX_SCF1WGWR14 0x0110007A #define GVSP_PIX_SCF1WGWR16 0x0110007B #define GVSP_PIX_SCF1WRWG8 0x0108007C #define GVSP_PIX_SCF1WRWG10 0x0110007D #define GVSP_PIX_SCF1WRWG10P 0x010A007E #define GVSP_PIX_SCF1WRWG12 0x0110007F #define GVSP_PIX_SCF1WRWG12P 0x010C0080 #define GVSP_PIX_SCF1WRWG14 0x01100081 #define GVSP_PIX_SCF1WRWG16 0x01100082 #define GVSP_PIX_YCBCR8 0x0218005B #define GVSP_PIX_YCBCR8_CBYCR 0x0218003A #define GVSP_PIX_YCBCR10_CBYCR 0x02300083 #define GVSP_PIX_YCBCR10P_CBYCR 0x021E0084 #define GVSP_PIX_YCBCR12_CBYCR 0x02300085 #define GVSP_PIX_YCBCR12P_CBYCR 0x02240086 #define GVSP_PIX_YCBCR411_8 0x020C005A #define GVSP_PIX_YCBCR411_8_CBYYCRYY 0x020C003C #define GVSP_PIX_YCBCR422_8 0x0210003B #define GVSP_PIX_YCBCR422_8_CBYCRY 0x02100043 #define GVSP_PIX_YCBCR422_10 0x02200065 #define GVSP_PIX_YCBCR422_10_CBYCRY 0x02200099 #define GVSP_PIX_YCBCR422_10P 0x02140087 #define GVSP_PIX_YCBCR422_10P_CBYCRY 0x0214009A #define GVSP_PIX_YCBCR422_12 0x02200066 #define GVSP_PIX_YCBCR422_12_CBYCRY 0x0220009B #define GVSP_PIX_YCBCR422_12P 0x02180088 #define GVSP_PIX_YCBCR422_12P_CBYCRY 0x0218009C #define GVSP_PIX_YCBCR601_8_CBYCR 0x0218003D #define GVSP_PIX_YCBCR601_10_CBYCR 0x02300089 #define GVSP_PIX_YCBCR601_10P_CBYCR 0x021E008A #define GVSP_PIX_YCBCR601_12_CBYCR 0x0230008B #define GVSP_PIX_YCBCR601_12P_CBYCR 0x0224008C #define GVSP_PIX_YCBCR601_411_8_CBYYCRYY 0x020C003F #define GVSP_PIX_YCBCR601_422_8 0x0210003E #define GVSP_PIX_YCBCR601_422_8_CBYCRY 0x02100044 #define GVSP_PIX_YCBCR601_422_10 0x0220008D #define GVSP_PIX_YCBCR601_422_10_CBYCRY 0x0220009D #define GVSP_PIX_YCBCR601_422_10P 0x0214008E #define GVSP_PIX_YCBCR601_422_10P_CBYCRY 0x0214009E #define GVSP_PIX_YCBCR601_422_12 0x0220008F #define GVSP_PIX_YCBCR601_422_12_CBYCRY 0x0220009F #define GVSP_PIX_YCBCR601_422_12P 0x02180090 #define GVSP_PIX_YCBCR601_422_12P_CBYCRY 0x021800A0 #define GVSP_PIX_YCBCR709_8_CBYCR 0x02180040 #define GVSP_PIX_YCBCR709_10_CBYCR 0x02300091 #define GVSP_PIX_YCBCR709_10P_CBYCR 0x021E0092 #define GVSP_PIX_YCBCR709_12_CBYCR 0x02300093 #define GVSP_PIX_YCBCR709_12P_CBYCR 0x02240094 #define GVSP_PIX_YCBCR709_411_8_CBYYCRYY 0x020C0042 #define GVSP_PIX_YCBCR709_422_8 0x02100041 #define GVSP_PIX_YCBCR709_422_8_CBYCRY 0x02100045 #define GVSP_PIX_YCBCR709_422_10 0x02200095 #define GVSP_PIX_YCBCR709_422_10_CBYCRY 0x022000A1 #define GVSP_PIX_YCBCR709_422_10P 0x02140096 #define GVSP_PIX_YCBCR709_422_10P_CBYCRY 0x021400A2 #define GVSP_PIX_YCBCR709_422_12 0x02200097 #define GVSP_PIX_YCBCR709_422_12_CBYCRY 0x022000A3 #define GVSP_PIX_YCBCR709_422_12P 0x02180098 #define GVSP_PIX_YCBCR709_422_12P_CBYCRY 0x021800A4 #define GVSP_PIX_YUV8_UYV 0x02180020 #define GVSP_PIX_YUV411_8_UYYVYY 0x020C001E #define GVSP_PIX_YUV422_8 0x02100032 #define GVSP_PIX_YUV422_8_UYVY 0x0210001F #define GVSP_PIX_MONO10PACKED 0x010C0004 #define GVSP_PIX_MONO12PACKED 0x010C0006 #define GVSP_PIX_BAYERBG10PACKED 0x010C0029 #define GVSP_PIX_BAYERBG12PACKED 0x010C002D #define GVSP_PIX_BAYERGB10PACKED 0x010C0028 #define GVSP_PIX_BAYERGB12PACKED 0x010C002C #define GVSP_PIX_BAYERGR10PACKED 0x010C0026 #define GVSP_PIX_BAYERGR12PACKED 0x010C002A #define GVSP_PIX_BAYERRG10PACKED 0x010C0027 #define GVSP_PIX_BAYERRG12PACKED 0x010C002B #define GVSP_PIX_RGB10V1PACKED 0x0220001C #define GVSP_PIX_RGB12V1PACKED 0x02240034 /* Structure to hold GVSP packet information */ typedef struct _gvsp_packet_info { gint chunk; guint8 format; guint16 status; guint16 payloadtype; guint64 blockid; guint32 packetid; gint enhanced; gint flag_resendrangeerror; gint flag_previousblockdropped; gint flag_packetresend; } gvsp_packet_info; /*Define the gvsp proto */ static int proto_gvsp = -1; /*static int global_gvsp_port = 20202;*/ static dissector_handle_t gvsp_handle; /* Define the tree for gvsp */ static int ett_gvsp = -1; static int ett_gvsp_flags = -1; static int ett_gvsp_header = -1; static int ett_gvsp_payload = -1; static int ett_gvsp_trailer = -1; static int ett_gvsp_pixelformat = -1; static int ett_gvsp_fieldinfo = -1; static int ett_gvsp_cs = -1; static int ett_gvsp_sc_zone_direction = -1; static int ett_gvsp_zoneinfo = -1; static int ett_gvsp_zoneinfo_multipart = -1; static int ett_gvsp_partinfo_leader = -1; static int ett_gvsp_partinfo_trailer = -1; static const value_string statusnames[] = { { GEV_STATUS_SUCCESS, "GEV_STATUS_SUCCESS" }, { GEV_STATUS_PACKET_RESEND, "GEV_STATUS_PACKET_RESEND" }, { GEV_STATUS_NOT_IMPLEMENTED, "GEV_STATUS_NOT_IMPLEMENTED" }, { GEV_STATUS_INVALID_PARAMETER, "GEV_STATUS_INVALID_PARAMETER" }, { GEV_STATUS_INVALID_ADDRESS, "GEV_STATUS_INVALID_ADDRESS" }, { GEV_STATUS_WRITE_PROTECT, "GEV_STATUS_WRITE_PROTECT" }, { GEV_STATUS_BAD_ALIGNMENT, "GEV_STATUS_BAD_ALIGNMENT" }, { GEV_STATUS_ACCESS_DENIED, "GEV_STATUS_ACCESS_DENIED" }, { GEV_STATUS_BUSY, "GEV_STATUS_BUSY" }, { GEV_STATUS_LOCAL_PROBLEM, "GEV_STATUS_LOCAL_PROBLEM (deprecated)" }, { GEV_STATUS_MSG_MISMATCH, "GEV_STATUS_MSG_MISMATCH (deprecated)" }, { GEV_STATUS_INVALID_PROTOCOL, "GEV_STATUS_INVALID_PROTOCOL (deprecated)" }, { GEV_STATUS_NO_MSG, "GEV_STATUS_NO_MSG (deprecated)" }, { GEV_STATUS_PACKET_UNAVAILABLE, "GEV_STATUS_PACKET_UNAVAILABLE" }, { GEV_STATUS_DATA_OVERRUN, "GEV_STATUS_DATA_OVERRUN" }, { GEV_STATUS_INVALID_HEADER, "GEV_STATUS_INVALID_HEADER" }, { GEV_STATUS_WRONG_CONFIG, "GEV_STATUS_WRONG_CONFIG (deprecated)" }, { GEV_STATUS_PACKET_NOT_YET_AVAILABLE, "GEV_STATUS_PACKET_NOT_YET_AVAILABLE" }, { GEV_STATUS_PACKET_AND_PREV_REMOVED_FROM_MEMORY, "GEV_STATUS_PACKET_AND_PREV_REMOVED_FROM_MEMORY" }, { GEV_STATUS_PACKET_REMOVED_FROM_MEMORY, "GEV_STATUS_PACKET_REMOVED_FROM_MEMORY" }, { GEV_STATUS_NO_REF_TIME, "GEV_STATUS_NO_REF_TIME" }, { GEV_STATUS_PACKET_TEMPORARILY_UNAVAILABLE, "GEV_STATUS_PACKET_TEMPORARILY_UNAVAILABLE" }, { GEV_STATUS_OVERFLOW, "GEV_STATUS_OVERFLOW" }, { GEV_STATUS_ACTION_LATE, "GEV_STATUS_ACTION_LATE" }, { GEV_STATUS_LEADER_TRAILER_OVERFLOW, "GEV_STATUS_LEADER_TRAILER_OVERFLOW" }, { GEV_STATUS_ERROR, "GEV_STATUS_ERROR" }, { 0, NULL }, }; static value_string_ext statusnames_ext = VALUE_STRING_EXT_INIT(statusnames); static const value_string formatnames[] = { { GVSP_PACKET_LEADER, "LEADER" }, { GVSP_PACKET_TRAILER, "TRAILER" }, { GVSP_PACKET_PAYLOAD, "PAYLOAD" }, { GVSP_PACKET_ALLIN, "ALLIN" }, { GVSP_PACKET_PAYLOAD_H264, "H264" }, { GVSP_PACKET_PAYLOAD_MULTIZONE, "MULTI-ZONE" }, { GVSP_PACKET_PAYLOAD_MULTIPART, "MULTI-PART" }, { GVSP_EXTENDED_ID_BIT | GVSP_PACKET_LEADER, "LEADER (ext IDs)" }, { GVSP_EXTENDED_ID_BIT | GVSP_PACKET_TRAILER, "TRAILER (ext IDs)" }, { GVSP_EXTENDED_ID_BIT | GVSP_PACKET_PAYLOAD, "PAYLOAD (ext IDs)" }, { GVSP_EXTENDED_ID_BIT | GVSP_PACKET_ALLIN, "ALL-IN (ext IDs)" }, { GVSP_EXTENDED_ID_BIT | GVSP_PACKET_PAYLOAD_H264, "H264 (ext IDs)" }, { GVSP_EXTENDED_ID_BIT | GVSP_PACKET_PAYLOAD_MULTIZONE, "MULTI-ZONE (ext IDs)" }, { GVSP_EXTENDED_ID_BIT | GVSP_PACKET_PAYLOAD_MULTIPART, "MULTI-PART (ext IDs)" }, { 0, NULL }, }; static const value_string payloadtypenames[] = { { GVSP_PAYLOAD_IMAGE, "IMAGE" }, { GVSP_PAYLOAD_RAWDATA, "RAW DATA" }, { GVSP_PAYLOAD_FILE, "FILE" }, { GVSP_PAYLOAD_CHUNKDATA, "CHUNK DATA" }, { GVSP_PAYLOAD_EXTENDEDCHUNKDATA, "EXTENDED CHUNK DATA (obsolete with v2.0)" }, { GVSP_PAYLOAD_JPEG, "JPEG" }, { GVSP_PAYLOAD_JPEG2000, "JPEG 2000" }, { GVSP_PAYLOAD_H264, "H264" }, { GVSP_PAYLOAD_MULTIZONEIMAGE, "MULTI-ZONE IMAGE" }, { GVSP_PAYLOAD_MULTIPART, "MULTI-PART" }, { GVSP_EXTENDED_CHUNK_BIT | GVSP_PAYLOAD_IMAGE, "IMAGE (v2.0 chunks)" }, { GVSP_EXTENDED_CHUNK_BIT | GVSP_PAYLOAD_RAWDATA, "RAW DATA (v2.0 Chunks)" }, { GVSP_EXTENDED_CHUNK_BIT | GVSP_PAYLOAD_FILE, "FILE (v2.0 Chunks)" }, { GVSP_EXTENDED_CHUNK_BIT | GVSP_PAYLOAD_CHUNKDATA, "CHUNK DATA (v2.0 Chunks)" }, { GVSP_EXTENDED_CHUNK_BIT | GVSP_PAYLOAD_EXTENDEDCHUNKDATA, "EXTENDED CHUNK DATA (v2.0 chunks?)" }, { GVSP_EXTENDED_CHUNK_BIT | GVSP_PAYLOAD_JPEG, "JPEG (v2.0 Chunks)" }, { GVSP_EXTENDED_CHUNK_BIT | GVSP_PAYLOAD_JPEG2000, "JPEG 2000 (v2.0 Chunks)" }, { GVSP_EXTENDED_CHUNK_BIT | GVSP_PAYLOAD_H264, "H264 (v2.0 Chunks)" }, { GVSP_EXTENDED_CHUNK_BIT | GVSP_PAYLOAD_MULTIZONEIMAGE, "MULTI-ZONE IMAGE (v2.0 Chunks)" }, { GVSP_EXTENDED_CHUNK_BIT | GVSP_PAYLOAD_MULTIPART, "MULTI-PART (v2.0 Chunks)" }, { 0, NULL }, }; static value_string_ext payloadtypenames_ext = VALUE_STRING_EXT_INIT(payloadtypenames); static const value_string multipartdatatypenames[] = { { GVSP_MULTIPART_DATA_TYPE_2DIMAGE, "2D IMAGE" }, { GVSP_MULTIPART_DATA_TYPE_2DPLANEBIPLANAR, "2D PLANE BI-PLANAR" }, { GVSP_MULTIPART_DATA_TYPE_2DPLANETRIPLANAR, "2D PLANE TRI-PLANAR" }, { GVSP_MULTIPART_DATA_TYPE_2DPLANEQUADPLANAR, "2D PLANE QUAD-PLANAR" }, { GVSP_MULTIPART_DATA_TYPE_3DIMAGE, "3D IMAGE" }, { GVSP_MULTIPART_DATA_TYPE_3DPLANEBIPLANAR, "3D PLANE BI-PLANAR" }, { GVSP_MULTIPART_DATA_TYPE_3DPLANETRIPLANAR, "3D PLANE TRI-PLANAR" }, { GVSP_MULTIPART_DATA_TYPE_3DPLANEQUADPLANAR, "3D PLANE QUAD-PLANAR" }, { GVSP_MULTIPART_DATA_TYPE_CONFIDENCEMAP, "CONFIDENCE MAP" }, { GVSP_MULTIPART_DATA_TYPE_CHUNKDATA, "CHUNK DATA" }, { GVSP_MULTIPART_DATA_TYPE_JPEG, "JPEG" }, { GVSP_MULTIPART_DATA_TYPE_JPEG2000, "JPEG 2000" }, { GVSP_MULTIPART_DATA_TYPE_DEVICESPECIFIC, "DEVICE SPECIFIC" }, { 0, NULL }, }; static value_string_ext multipartdatatypenames_ext = VALUE_STRING_EXT_INIT(multipartdatatypenames); static const value_string pixeltypenames[] = { { GVSP_PIX_MONO1P, "Monochrome 1-bit packed" }, { GVSP_PIX_CONFIDENCE1P, "Confidence 1-bit packed" }, { GVSP_PIX_MONO2P, "Monochrome 2-bit packed" }, { GVSP_PIX_MONO4P, "Monochrome 4-bit packed" }, { GVSP_PIX_MONO8, "Monochrome 8-bit" }, { GVSP_PIX_MONO8S, "Monochrome 8-bit signed" }, { GVSP_PIX_BAYERGR8, "Bayer Green-Red 8-bit" }, { GVSP_PIX_BAYERRG8, "Bayer Red-Green 8-bit" }, { GVSP_PIX_BAYERGB8, "Bayer Green-Blue 8-bit" }, { GVSP_PIX_BAYERBG8, "Bayer Blue-Green 8-bit" }, { GVSP_PIX_SCF1WBWG8, "Sparse Color Filter #1 White-Blue-White-Green 8-bit" }, { GVSP_PIX_SCF1WGWB8, "Sparse Color Filter #1 White-Green-White-Blue 8-bit" }, { GVSP_PIX_SCF1WGWR8, "Sparse Color Filter #1 White-Green-White-Red 8-bit" }, { GVSP_PIX_SCF1WRWG8, "Sparse Color Filter #1 White-Red-White-Green 8-bit" }, { GVSP_PIX_COORD3D_A8, "3D coordinate A 8-bit" }, { GVSP_PIX_COORD3D_B8, "3D coordinate B 8-bit" }, { GVSP_PIX_COORD3D_C8, "3D coordinate C 8-bit" }, { GVSP_PIX_CONFIDENCE1, "Confidence 1-bit unpacked" }, { GVSP_PIX_CONFIDENCE8, "Confidence 8-bit" }, { GVSP_PIX_R8, "Red 8-bit" }, { GVSP_PIX_G8, "Green 8-bit" }, { GVSP_PIX_B8, "Blue 8-bit" }, { GVSP_PIX_MONO10P, "Monochrome 10-bit packed" }, { GVSP_PIX_BAYERBG10P, "Bayer Blue-Green 10-bit packed" }, { GVSP_PIX_BAYERGB10P, "Bayer Green-Blue 10-bit packed" }, { GVSP_PIX_BAYERGR10P, "Bayer Green-Red 10-bit packed" }, { GVSP_PIX_BAYERRG10P, "Bayer Red-Green 10-bit packed" }, { GVSP_PIX_SCF1WBWG10P, "Sparse Color Filter #1 White-Blue-White-Green 10-bit packed" }, { GVSP_PIX_SCF1WGWB10P, "Sparse Color Filter #1 White-Green-White-Blue 10-bit packed" }, { GVSP_PIX_SCF1WGWR10P, "Sparse Color Filter #1 White-Green-White-Red 10-bit packed" }, { GVSP_PIX_SCF1WRWG10P, "Sparse Color Filter #1 White-Red-White-Green 10-bit packed" }, { GVSP_PIX_R10, "Red 10-bit" }, { GVSP_PIX_G10, "Green 10-bit" }, { GVSP_PIX_B10, "Blue 10-bit" }, { GVSP_PIX_COORD3D_A10P, "3D coordinate A 10-bit packed" }, { GVSP_PIX_COORD3D_B10P, "3D coordinate B 10-bit packed" }, { GVSP_PIX_COORD3D_C10P, "3D coordinate C 10-bit packed" }, { GVSP_PIX_MONO10PACKED, "GigE Vision specific format, Monochrome 10-bit packed" }, { GVSP_PIX_MONO12PACKED, "GigE Vision specific format, Monochrome 12-bit packed" }, { GVSP_PIX_BAYERGR10PACKED, "GigE Vision specific format, Bayer Green-Red 10-bit packed" }, { GVSP_PIX_BAYERRG10PACKED, "GigE Vision specific format, Bayer Red-Green 10-bit packed" }, { GVSP_PIX_BAYERGB10PACKED, "GigE Vision specific format, Bayer Green-Blue 10-bit packed" }, { GVSP_PIX_BAYERBG10PACKED, "GigE Vision specific format, Bayer Blue-Green 10-bit packed" }, { GVSP_PIX_BAYERGR12PACKED, "GigE Vision specific format, Bayer Green-Red 12-bit packed" }, { GVSP_PIX_BAYERRG12PACKED, "GigE Vision specific format, Bayer Red-Green 12-bit packed" }, { GVSP_PIX_BAYERGB12PACKED, "GigE Vision specific format, Bayer Green-Blue 12-bit packed" }, { GVSP_PIX_BAYERBG12PACKED, "GigE Vision specific format, Bayer Blue-Green 12-bit packed" }, { GVSP_PIX_MONO12P, "Monochrome 12-bit packed" }, { GVSP_PIX_BAYERBG12P, "Bayer Blue-Green 12-bit packed" }, { GVSP_PIX_BAYERGB12P, "Bayer Green-Blue 12-bit packed" }, { GVSP_PIX_BAYERGR12P, "Bayer Green-Red 12-bit packed" }, { GVSP_PIX_BAYERRG12P, "Bayer Red-Green 12-bit packed" }, { GVSP_PIX_SCF1WBWG12P, "Sparse Color Filter #1 White-Blue-White-Green 12-bit packed" }, { GVSP_PIX_SCF1WGWB12P, "Sparse Color Filter #1 White-Green-White-Blue 12-bit packed" }, { GVSP_PIX_SCF1WGWR12P, "Sparse Color Filter #1 White-Green-White-Red 12-bit packed" }, { GVSP_PIX_SCF1WRWG12P, "Sparse Color Filter #1 White-Red-White-Green 12-bit packed" }, { GVSP_PIX_R12, "Red 12-bit" }, { GVSP_PIX_G12, "Green 12-bit" }, { GVSP_PIX_B12, "Blue 12-bit" }, { GVSP_PIX_COORD3D_A12P, "3D coordinate A 12-bit packed" }, { GVSP_PIX_COORD3D_B12P, "3D coordinate B 12-bit packed" }, { GVSP_PIX_COORD3D_C12P, "3D coordinate C 12-bit packed" }, { GVSP_PIX_MONO10, "Monochrome 10-bit unpacked" }, { GVSP_PIX_MONO12, "Monochrome 12-bit unpacked" }, { GVSP_PIX_MONO16, "Monochrome 16-bit" }, { GVSP_PIX_BAYERGR10, "Bayer Green-Red 10-bit unpacked" }, { GVSP_PIX_BAYERRG10, "Bayer Red-Green 10-bit unpacked" }, { GVSP_PIX_BAYERGB10, "Bayer Green-Blue 10-bit unpacked" }, { GVSP_PIX_BAYERBG10, "Bayer Blue-Green 10-bit unpacked" }, { GVSP_PIX_BAYERGR12, "Bayer Green-Red 12-bit unpacked" }, { GVSP_PIX_BAYERRG12, "Bayer Red-Green 12-bit unpacked" }, { GVSP_PIX_BAYERGB12, "Bayer Green-Blue 12-bit unpacked" }, { GVSP_PIX_BAYERBG12, "Bayer Blue-Green 12-bit unpacked" }, { GVSP_PIX_MONO14, "Monochrome 14-bit unpacked" }, { GVSP_PIX_BAYERGR16, "Bayer Green-Red 16-bit" }, { GVSP_PIX_BAYERRG16, "Bayer Red-Green 16-bit" }, { GVSP_PIX_BAYERGB16, "Bayer Green-Blue 16-bit" }, { GVSP_PIX_BAYERBG16, "Bayer Blue-Green 16-bit" }, { GVSP_PIX_SCF1WBWG10, "Sparse Color Filter #1 White-Blue-White-Green 10-bit unpacked" }, { GVSP_PIX_SCF1WBWG12, "Sparse Color Filter #1 White-Blue-White-Green 12-bit unpacked" }, { GVSP_PIX_SCF1WBWG14, "Sparse Color Filter #1 White-Blue-White-Green 14-bit unpacked" }, { GVSP_PIX_SCF1WBWG16, "Sparse Color Filter #1 White-Blue-White-Green 16-bit unpacked" }, { GVSP_PIX_SCF1WGWB10, "Sparse Color Filter #1 White-Green-White-Blue 10-bit unpacked" }, { GVSP_PIX_SCF1WGWB12, "Sparse Color Filter #1 White-Green-White-Blue 12-bit unpacked" }, { GVSP_PIX_SCF1WGWB14, "Sparse Color Filter #1 White-Green-White-Blue 14-bit unpacked" }, { GVSP_PIX_SCF1WGWB16, "Sparse Color Filter #1 White-Green-White-Blue 16-bit" }, { GVSP_PIX_SCF1WGWR10, "Sparse Color Filter #1 White-Green-White-Red 10-bit unpacked" }, { GVSP_PIX_SCF1WGWR12, "Sparse Color Filter #1 White-Green-White-Red 12-bit unpacked" }, { GVSP_PIX_SCF1WGWR14, "Sparse Color Filter #1 White-Green-White-Red 14-bit unpacked" }, { GVSP_PIX_SCF1WGWR16, "Sparse Color Filter #1 White-Green-White-Red 16-bit" }, { GVSP_PIX_SCF1WRWG10, "Sparse Color Filter #1 White-Red-White-Green 10-bit unpacked" }, { GVSP_PIX_SCF1WRWG12, "Sparse Color Filter #1 White-Red-White-Green 12-bit unpacked" }, { GVSP_PIX_SCF1WRWG14, "Sparse Color Filter #1 White-Red-White-Green 14-bit unpacked" }, { GVSP_PIX_SCF1WRWG16, "Sparse Color Filter #1 White-Red-White-Green 16-bit" }, { GVSP_PIX_COORD3D_A16, "3D coordinate A 16-bit" }, { GVSP_PIX_COORD3D_B16, "3D coordinate B 16-bit" }, { GVSP_PIX_COORD3D_C16, "3D coordinate C 16-bit" }, { GVSP_PIX_CONFIDENCE16, "Confidence 16-bit" }, { GVSP_PIX_R16, "Red 16-bit" }, { GVSP_PIX_G16, "Green 16-bit" }, { GVSP_PIX_B16, "Blue 16-bit" }, { GVSP_PIX_COORD3D_A32F, "3D coordinate A 32-bit floating point" }, { GVSP_PIX_COORD3D_B32F, "3D coordinate B 32-bit floating point" }, { GVSP_PIX_COORD3D_C32F, "3D coordinate C 32-bit floating point" }, { GVSP_PIX_CONFIDENCE32F, "Confidence 32-bit floating point" }, { GVSP_PIX_YUV411_8_UYYVYY, "YUV 4:1:1 8-bit" }, { GVSP_PIX_YCBCR411_8_CBYYCRYY, "YCbCr 4:1:1 8-bit" }, { GVSP_PIX_YCBCR601_411_8_CBYYCRYY, "YCbCr 4:1:1 8-bit BT.601" }, { GVSP_PIX_YCBCR709_411_8_CBYYCRYY, "YCbCr 4:1:1 8-bit BT.709" }, { GVSP_PIX_YCBCR411_8, "YCbCr 4:1:1 8-bit" }, { GVSP_PIX_YUV422_8_UYVY, "YUV 4:2:2 8-bit" }, { GVSP_PIX_YUV422_8, "YUV 4:2:2 8-bit" }, { GVSP_PIX_RGB565P, "Red-Green-Blue 5/6/5-bit packed" }, { GVSP_PIX_BGR565P, "Blue-Green-Red 5/6/5-bit packed" }, { GVSP_PIX_YCBCR422_8, "YCbCr 4:2:2 8-bit" }, { GVSP_PIX_YCBCR601_422_8, "YCbCr 4:2:2 8-bit BT.601" }, { GVSP_PIX_YCBCR709_422_8, "YCbCr 4:2:2 8-bit BT.709" }, { GVSP_PIX_YCBCR422_8_CBYCRY, "YCbCr 4:2:2 8-bit" }, { GVSP_PIX_YCBCR601_422_8_CBYCRY, "YCbCr 4:2:2 8-bit BT.601" }, { GVSP_PIX_YCBCR709_422_8_CBYCRY, "YCbCr 4:2:2 8-bit BT.709" }, { GVSP_PIX_BICOLORRGBG8, "Bi-color Red/Green - Blue/Green 8-bit" }, { GVSP_PIX_BICOLORBGRG8, "Bi-color Blue/Green - Red/Green 8-bit" }, { GVSP_PIX_COORD3D_AC8, "3D coordinate A-C 8-bit" }, { GVSP_PIX_COORD3D_AC8_PLANAR, "3D coordinate A-C 8-bit planar" }, { GVSP_PIX_YCBCR422_10P, "YCbCr 4:2:2 10-bit packed" }, { GVSP_PIX_YCBCR601_422_10P, "YCbCr 4:2:2 10-bit packed BT.601" }, { GVSP_PIX_YCBCR709_422_10P, "YCbCr 4:2:2 10-bit packed BT.709" }, { GVSP_PIX_YCBCR422_10P_CBYCRY, "YCbCr 4:2:2 10-bit packed" }, { GVSP_PIX_YCBCR601_422_10P_CBYCRY, "YCbCr 4:2:2 10-bit packed BT.601" }, { GVSP_PIX_YCBCR709_422_10P_CBYCRY, "YCbCr 4:2:2 10-bit packed BT.709" }, { GVSP_PIX_BICOLORRGBG10P, "Bi-color Red/Green - Blue/Green 10-bit packed" }, { GVSP_PIX_BICOLORBGRG10P, "Bi-color Blue/Green - Red/Green 10-bit packed" }, { GVSP_PIX_COORD3D_AC10P, "3D coordinate A-C 10-bit packed" }, { GVSP_PIX_COORD3D_AC10P_PLANAR, "3D coordinate A-C 10-bit packed planar" }, { GVSP_PIX_RGB8, "Red-Green-Blue 8-bit" }, { GVSP_PIX_BGR8, "Blue-Green-Red 8-bit" }, { GVSP_PIX_YUV8_UYV, "YUV 4:4:4 8-bit" }, { GVSP_PIX_RGB8_PLANAR, "Red-Green-Blue 8-bit planar" }, { GVSP_PIX_YCBCR8_CBYCR, "YCbCr 4:4:4 8-bit" }, { GVSP_PIX_YCBCR601_8_CBYCR, "YCbCr 4:4:4 8-bit BT.601" }, { GVSP_PIX_YCBCR709_8_CBYCR, "YCbCr 4:4:4 8-bit BT.709" }, { GVSP_PIX_YCBCR8, "YCbCr 4:4:4 8-bit" }, { GVSP_PIX_YCBCR422_12P, "YCbCr 4:2:2 12-bit packed" }, { GVSP_PIX_YCBCR601_422_12P, "YCbCr 4:2:2 12-bit packed BT.601" }, { GVSP_PIX_YCBCR709_422_12P, "YCbCr 4:2:2 12-bit packed BT.709" }, { GVSP_PIX_YCBCR422_12P_CBYCRY, "YCbCr 4:2:2 12-bit packed" }, { GVSP_PIX_YCBCR601_422_12P_CBYCRY, "YCbCr 4:2:2 12-bit packed BT.601" }, { GVSP_PIX_YCBCR709_422_12P_CBYCRY, "YCbCr 4:2:2 12-bit packed BT.709" }, { GVSP_PIX_BICOLORRGBG12P, "Bi-color Red/Green - Blue/Green 12-bit packed" }, { GVSP_PIX_BICOLORBGRG12P, "Bi-color Blue/Green - Red/Green 12-bit packed" }, { GVSP_PIX_COORD3D_ABC8, "3D coordinate A-B-C 8-bit" }, { GVSP_PIX_COORD3D_ABC8_PLANAR, "3D coordinate A-B-C 8-bit planar" }, { GVSP_PIX_COORD3D_AC12P, "3D coordinate A-C 12-bit packed" }, { GVSP_PIX_COORD3D_AC12P_PLANAR, "3D coordinate A-C 12-bit packed planar" }, { GVSP_PIX_BGR10P, "Blue-Green-Red 10-bit packed" }, { GVSP_PIX_RGB10P, "Red-Green-Blue 10-bit packed" }, { GVSP_PIX_YCBCR10P_CBYCR, "YCbCr 4:4:4 10-bit packed" }, { GVSP_PIX_YCBCR601_10P_CBYCR, "YCbCr 4:4:4 10-bit packed BT.601" }, { GVSP_PIX_YCBCR709_10P_CBYCR, "YCbCr 4:4:4 10-bit packed BT.709" }, { GVSP_PIX_COORD3D_ABC10P, "3D coordinate A-B-C 10-bit packed" }, { GVSP_PIX_COORD3D_ABC10P_PLANAR, "3D coordinate A-B-C 10-bit packed planar" }, { GVSP_PIX_RGBA8, "Red-Green-Blue-alpha 8-bit" }, { GVSP_PIX_BGRA8, "Blue-Green-Red-alpha 8-bit" }, { GVSP_PIX_RGB10V1PACKED, "GigE Vision specific format, Red-Green-Blue 10-bit packed - variant 1" }, { GVSP_PIX_RGB10P32, "Red-Green-Blue 10-bit packed into 32-bit" }, { GVSP_PIX_YCBCR422_10, "YCbCr 4:2:2 10-bit unpacked" }, { GVSP_PIX_YCBCR422_12, "YCbCr 4:2:2 12-bit unpacked" }, { GVSP_PIX_YCBCR601_422_10, "YCbCr 4:2:2 10-bit unpacked BT.601" }, { GVSP_PIX_YCBCR601_422_12, "YCbCr 4:2:2 12-bit unpacked BT.601" }, { GVSP_PIX_YCBCR709_422_10, "YCbCr 4:2:2 10-bit unpacked BT.709" }, { GVSP_PIX_YCBCR709_422_12, "YCbCr 4:2:2 12-bit unpacked BT.709" }, { GVSP_PIX_YCBCR422_10_CBYCRY, "YCbCr 4:2:2 10-bit unpacked" }, { GVSP_PIX_YCBCR422_12_CBYCRY, "YCbCr 4:2:2 12-bit unpacked" }, { GVSP_PIX_YCBCR601_422_10_CBYCRY, "YCbCr 4:2:2 10-bit unpacked BT.601" }, { GVSP_PIX_YCBCR601_422_12_CBYCRY, "YCbCr 4:2:2 12-bit unpacked BT.601" }, { GVSP_PIX_YCBCR709_422_10_CBYCRY, "YCbCr 4:2:2 10-bit unpacked BT.709" }, { GVSP_PIX_YCBCR709_422_12_CBYCRY, "YCbCr 4:2:2 12-bit unpacked BT.709" }, { GVSP_PIX_BICOLORRGBG10, "Bi-color Red/Green - Blue/Green 10-bit unpacked" }, { GVSP_PIX_BICOLORBGRG10, "Bi-color Blue/Green - Red/Green 10-bit unpacked" }, { GVSP_PIX_BICOLORRGBG12, "Bi-color Red/Green - Blue/Green 12-bit unpacked" }, { GVSP_PIX_BICOLORBGRG12, "Bi-color Blue/Green - Red/Green 12-bit unpacked" }, { GVSP_PIX_COORD3D_AC16, "3D coordinate A-C 16-bit" }, { GVSP_PIX_COORD3D_AC16_PLANAR, "3D coordinate A-C 16-bit planar" }, { GVSP_PIX_RGB12V1PACKED, "GigE Vision specific format, Red-Green-Blue 12-bit packed - variant 1" }, { GVSP_PIX_BGR12P, "Blue-Green-Red 12-bit packed" }, { GVSP_PIX_RGB12P, "Red-Green-Blue 12-bit packed" }, { GVSP_PIX_YCBCR12P_CBYCR, "YCbCr 4:4:4 12-bit packed" }, { GVSP_PIX_YCBCR601_12P_CBYCR, "YCbCr 4:4:4 12-bit packed BT.601" }, { GVSP_PIX_YCBCR709_12P_CBYCR, "YCbCr 4:4:4 12-bit packed BT.709" }, { GVSP_PIX_COORD3D_ABC12P, "3D coordinate A-B-C 12-bit packed" }, { GVSP_PIX_COORD3D_ABC12P_PLANAR, "3D coordinate A-B-C 12-bit packed planar" }, { GVSP_PIX_BGRA10P, "Blue-Green-Red-alpha 10-bit packed" }, { GVSP_PIX_RGBA10P, "Red-Green-Blue-alpha 10-bit packed" }, { GVSP_PIX_RGB10, "Red-Green-Blue 10-bit unpacked" }, { GVSP_PIX_BGR10, "Blue-Green-Red 10-bit unpacked" }, { GVSP_PIX_RGB12, "Red-Green-Blue 12-bit unpacked" }, { GVSP_PIX_BGR12, "Blue-Green-Red 12-bit unpacked" }, { GVSP_PIX_RGB10_PLANAR, "Red-Green-Blue 10-bit unpacked planar" }, { GVSP_PIX_RGB12_PLANAR, "Red-Green-Blue 12-bit unpacked planar" }, { GVSP_PIX_RGB16_PLANAR, "Red-Green-Blue 16-bit planar" }, { GVSP_PIX_RGB16, "Red-Green-Blue 16-bit" }, { GVSP_PIX_BGR14, "Blue-Green-Red 14-bit unpacked" }, { GVSP_PIX_BGR16, "Blue-Green-Red 16-bit" }, { GVSP_PIX_BGRA12P, "Blue-Green-Red-alpha 12-bit packed" }, { GVSP_PIX_RGB14, "Red-Green-Blue 14-bit unpacked" }, { GVSP_PIX_RGBA12P, "Red-Green-Blue-alpha 12-bit packed" }, { GVSP_PIX_YCBCR10_CBYCR, "YCbCr 4:4:4 10-bit unpacked" }, { GVSP_PIX_YCBCR12_CBYCR, "YCbCr 4:4:4 12-bit unpacked" }, { GVSP_PIX_YCBCR601_10_CBYCR, "YCbCr 4:4:4 10-bit unpacked BT.601" }, { GVSP_PIX_YCBCR601_12_CBYCR, "YCbCr 4:4:4 12-bit unpacked BT.601" }, { GVSP_PIX_YCBCR709_10_CBYCR, "YCbCr 4:4:4 10-bit unpacked BT.709" }, { GVSP_PIX_YCBCR709_12_CBYCR, "YCbCr 4:4:4 12-bit unpacked BT.709" }, { GVSP_PIX_COORD3D_ABC16, "3D coordinate A-B-C 16-bit" }, { GVSP_PIX_COORD3D_ABC16_PLANAR, "3D coordinate A-B-C 16-bit planar" }, { GVSP_PIX_BGRA10, "Blue-Green-Red-alpha 10-bit unpacked" }, { GVSP_PIX_BGRA12, "Blue-Green-Red-alpha 12-bit unpacked" }, { GVSP_PIX_BGRA14, "Blue-Green-Red-alpha 14-bit unpacked" }, { GVSP_PIX_BGRA16, "Blue-Green-Red-alpha 16-bit" }, { GVSP_PIX_RGBA10, "Red-Green-Blue-alpha 10-bit unpacked" }, { GVSP_PIX_RGBA12, "Red-Green-Blue-alpha 12-bit unpacked" }, { GVSP_PIX_RGBA14, "Red-Green-Blue-alpha 14-bit unpacked" }, { GVSP_PIX_RGBA16, "Red-Green-Blue-alpha 16-bit" }, { GVSP_PIX_COORD3D_AC32F, "3D coordinate A-C 32-bit floating point" }, { GVSP_PIX_COORD3D_AC32F_PLANAR, "3D coordinate A-C 32-bit floating point planar" }, { GVSP_PIX_COORD3D_ABC32F, "3D coordinate A-B-C 32-bit floating point" }, { GVSP_PIX_COORD3D_ABC32F_PLANAR, "3D coordinate A-B-C 32-bit floating point planar" }, { 0, NULL } }; static value_string_ext pixeltypenames_ext = VALUE_STRING_EXT_INIT(pixeltypenames); static const value_string colornames[] = { { GVSP_PIX_MONO >> 24, "Mono" }, { GVSP_PIX_COLOR >> 24, "Color" }, { GVSP_PIX_CUSTOM >> 24, "Custom" }, { 0, NULL }, }; static const true_false_string zonedirectionnames = { "Bottom Up", "Top-Down" }; static int hf_gvsp_status = -1; static int hf_gvsp_blockid16 = -1; static int hf_gvsp_flags = -1; static int hf_gvsp_flagdevicespecific0 = -1; static int hf_gvsp_flagdevicespecific1 = -1; static int hf_gvsp_flagdevicespecific2 = -1; static int hf_gvsp_flagdevicespecific3 = -1; static int hf_gvsp_flagdevicespecific4 = -1; static int hf_gvsp_flagdevicespecific5 = -1; static int hf_gvsp_flagdevicespecific6 = -1; static int hf_gvsp_flagdevicespecific7 = -1; static int hf_gvsp_flagresendrangeerror = -1; static int hf_gvsp_flagpreviousblockdropped = -1; static int hf_gvsp_flagpacketresend = -1; static int hf_gvsp_format = -1; static int hf_gvsp_packetid24 = -1; static int hf_gvsp_blockid64 = -1; static int hf_gvsp_packetid32 = -1; static int hf_gvsp_payloadtype = -1; static int hf_gvsp_payloaddata = -1; static int hf_gvsp_timestamp = -1; static int hf_gvsp_pixelformat = -1; static int hf_gvsp_sizex = -1; static int hf_gvsp_sizey = -1; static int hf_gvsp_offsetx = -1; static int hf_gvsp_offsety = -1; static int hf_gvsp_paddingx = -1; static int hf_gvsp_paddingy = -1; static int hf_gvsp_payloaddatasize = -1; static int hf_gvsp_pixelcolor = -1; static int hf_gvsp_pixeloccupy = -1; static int hf_gvsp_pixelid = -1; static int hf_gvsp_filename = -1; static int hf_gvsp_payloadlength = -1; static int hf_gvsp_fieldinfo = -1; static int hf_gvsp_fieldid = -1; static int hf_gvsp_fieldcount = -1; static int hf_gvsp_genericflags = -1; static int hf_gvsp_timestamptickfrequency = -1; static int hf_gvsp_dataformat = -1; static int hf_gvsp_packetizationmode = -1; static int hf_gvsp_packetsize = -1; static int hf_gvsp_profileidc = -1; static int hf_gvsp_cs = -1; static int hf_gvsp_cs0 = -1; static int hf_gvsp_cs1 = -1; static int hf_gvsp_cs2 = -1; static int hf_gvsp_cs3 = -1; static int hf_gvsp_levelidc = -1; static int hf_gvsp_sropinterleavingdepth = -1; static int hf_gvsp_sropmaxdondiff = -1; static int hf_gvsp_sropdeintbufreq = -1; static int hf_gvsp_sropinitbuftime = -1; static int hf_gvsp_add_zones = -1; static int hf_gvsp_zoneinfo = -1; static int hf_gvsp_zoneid = -1; static int hf_gvsp_endofzone = -1; static int hf_gvsp_addressoffset = -1; static int hf_gvsp_sc_zone_direction = -1; static int hf_gvsp_sc_zone0_direction = -1; static int hf_gvsp_sc_zone1_direction = -1; static int hf_gvsp_sc_zone2_direction = -1; static int hf_gvsp_sc_zone3_direction = -1; static int hf_gvsp_sc_zone4_direction = -1; static int hf_gvsp_sc_zone5_direction = -1; static int hf_gvsp_sc_zone6_direction = -1; static int hf_gvsp_sc_zone7_direction = -1; static int hf_gvsp_sc_zone8_direction = -1; static int hf_gvsp_sc_zone9_direction = -1; static int hf_gvsp_sc_zone10_direction = -1; static int hf_gvsp_sc_zone11_direction = -1; static int hf_gvsp_sc_zone12_direction = -1; static int hf_gvsp_sc_zone13_direction = -1; static int hf_gvsp_sc_zone14_direction = -1; static int hf_gvsp_sc_zone15_direction = -1; static int hf_gvsp_sc_zone16_direction = -1; static int hf_gvsp_sc_zone17_direction = -1; static int hf_gvsp_sc_zone18_direction = -1; static int hf_gvsp_sc_zone19_direction = -1; static int hf_gvsp_sc_zone20_direction = -1; static int hf_gvsp_sc_zone21_direction = -1; static int hf_gvsp_sc_zone22_direction = -1; static int hf_gvsp_sc_zone23_direction = -1; static int hf_gvsp_sc_zone24_direction = -1; static int hf_gvsp_sc_zone25_direction = -1; static int hf_gvsp_sc_zone26_direction = -1; static int hf_gvsp_sc_zone27_direction = -1; static int hf_gvsp_sc_zone28_direction = -1; static int hf_gvsp_sc_zone29_direction = -1; static int hf_gvsp_sc_zone30_direction = -1; static int hf_gvsp_sc_zone31_direction = -1; static int hf_gvsp_numparts = -1; static int hf_gvsp_multipartdatatype = -1; static int hf_gvsp_partlength = -1; static int hf_gvsp_multi_part_source_id = -1; static int hf_gvsp_data_purpose_id = -1; static int hf_gvsp_region_id = -1; static int hf_gvsp_endofpart = -1; static int hf_gvsp_add_zones_multipart = -1; static int hf_gvsp_zoneinfo_multipart = -1; static int hf_gvsp_multi_part_part_id = -1; static int hf_gvsp_data_type_specific = -1; static int hf_gvsp_chunkdatapayloadlengthex = -1; static int hf_gvsp_chunklayoutidex = -1; static const int *pixelformat_fields[] = { &hf_gvsp_pixelcolor, &hf_gvsp_pixeloccupy, &hf_gvsp_pixelid, NULL }; static const int *fieldinfo_fields[] = { &hf_gvsp_fieldid, &hf_gvsp_fieldcount, NULL }; static const int *cs_fields[] = { &hf_gvsp_cs0, &hf_gvsp_cs1, &hf_gvsp_cs2, &hf_gvsp_cs3, NULL }; static const int *sc_zone_direction_fields[] = { &hf_gvsp_sc_zone0_direction, &hf_gvsp_sc_zone1_direction, &hf_gvsp_sc_zone2_direction, &hf_gvsp_sc_zone3_direction, &hf_gvsp_sc_zone4_direction, &hf_gvsp_sc_zone5_direction, &hf_gvsp_sc_zone6_direction, &hf_gvsp_sc_zone7_direction, &hf_gvsp_sc_zone8_direction, &hf_gvsp_sc_zone9_direction, &hf_gvsp_sc_zone10_direction, &hf_gvsp_sc_zone11_direction, &hf_gvsp_sc_zone12_direction, &hf_gvsp_sc_zone13_direction, &hf_gvsp_sc_zone14_direction, &hf_gvsp_sc_zone15_direction, &hf_gvsp_sc_zone16_direction, &hf_gvsp_sc_zone17_direction, &hf_gvsp_sc_zone18_direction, &hf_gvsp_sc_zone19_direction, &hf_gvsp_sc_zone20_direction, &hf_gvsp_sc_zone21_direction, &hf_gvsp_sc_zone22_direction, &hf_gvsp_sc_zone23_direction, &hf_gvsp_sc_zone24_direction, &hf_gvsp_sc_zone25_direction, &hf_gvsp_sc_zone26_direction, &hf_gvsp_sc_zone27_direction, &hf_gvsp_sc_zone28_direction, &hf_gvsp_sc_zone29_direction, &hf_gvsp_sc_zone30_direction, &hf_gvsp_sc_zone31_direction, NULL }; static const int *zoneinfo_fields[] = { &hf_gvsp_zoneid, &hf_gvsp_endofzone, NULL }; static const int *zoneinfo_multipart_fields[] = { &hf_gvsp_endofpart, &hf_gvsp_zoneid, &hf_gvsp_endofzone, NULL }; static const int *flags_fields[] = { &hf_gvsp_flagdevicespecific0, &hf_gvsp_flagdevicespecific1, &hf_gvsp_flagdevicespecific2, &hf_gvsp_flagdevicespecific3, &hf_gvsp_flagdevicespecific4, &hf_gvsp_flagdevicespecific5, &hf_gvsp_flagdevicespecific6, &hf_gvsp_flagdevicespecific7, &hf_gvsp_flagresendrangeerror, &hf_gvsp_flagpreviousblockdropped, &hf_gvsp_flagpacketresend, NULL }; /* \brief Dissects the image AOI */ static void dissect_image_aoi(proto_tree *gvsp_tree, tvbuff_t *tvb, gint offset) { /* Size X */ proto_tree_add_item(gvsp_tree, hf_gvsp_sizex, tvb, offset, 4, ENC_BIG_ENDIAN); /* Size Y */ proto_tree_add_item(gvsp_tree, hf_gvsp_sizey, tvb, offset + 4, 4, ENC_BIG_ENDIAN); /* Offset X */ proto_tree_add_item(gvsp_tree, hf_gvsp_offsetx, tvb, offset + 8, 4, ENC_BIG_ENDIAN); /* Offset Y */ proto_tree_add_item(gvsp_tree, hf_gvsp_offsety, tvb, offset + 12, 4, ENC_BIG_ENDIAN); /* Padding X */ proto_tree_add_item(gvsp_tree, hf_gvsp_paddingx, tvb, offset + 16, 2, ENC_BIG_ENDIAN); /* Padding Y */ proto_tree_add_item(gvsp_tree, hf_gvsp_paddingy, tvb, offset + 18, 2, ENC_BIG_ENDIAN); } /* \brief Dissects the image leader */ static gint dissect_image_leader(proto_tree *gvsp_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint offset) { /* Field info */ proto_tree_add_bitmask(gvsp_tree, tvb, offset, hf_gvsp_fieldinfo, ett_gvsp_fieldinfo, fieldinfo_fields, ENC_BIG_ENDIAN); /* Payload type */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloadtype, tvb, offset + 2, 2, ENC_BIG_ENDIAN); /* Timestamp */ proto_tree_add_item(gvsp_tree, hf_gvsp_timestamp, tvb, offset + 4, 8, ENC_BIG_ENDIAN); /* Pixel format */ proto_tree_add_bitmask(gvsp_tree, tvb, offset + 12, hf_gvsp_pixelformat, ett_gvsp_pixelformat, pixelformat_fields, ENC_BIG_ENDIAN); /* AOI */ dissect_image_aoi(gvsp_tree, tvb, offset + 16); /* Return dissected byte count (for all-in dissection) */ return 36; } /* \brief Dissects the image trailer */ static gint dissect_image_trailer(proto_tree *gvsp_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint offset) { /* Payload type */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloadtype, tvb, offset + 2, 2, ENC_BIG_ENDIAN); /* Size Y */ proto_tree_add_item(gvsp_tree, hf_gvsp_sizey, tvb, offset + 4, 4, ENC_BIG_ENDIAN); /* Return dissected byte count (for all-in and extended chunk mode dissection) */ return 8; } /* \brief Dissects the multi-part trailer */ static gint dissect_multi_part_trailer(proto_tree *gvsp_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint offset) { gint part_count = tvb_reported_length_remaining(tvb, offset + 4) / GVSP_SIZE_OF_PART_INFO_TRAILER; gint i = 0; gint j = 0; /* Payload type */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloadtype, tvb, offset + 2, 2, ENC_BIG_ENDIAN); for (i = 0; i < part_count; i++) { guint16 multi_part_data_type = tvb_get_ntohs(tvb, offset + 4 + i * GVSP_SIZE_OF_PART_INFO_TRAILER); /* Add a tree per part */ proto_tree* gvsp_part_tree = proto_tree_add_subtree(gvsp_tree, tvb, offset + 4 + i * GVSP_SIZE_OF_PART_INFO_TRAILER, GVSP_SIZE_OF_PART_INFO_TRAILER, ett_gvsp_partinfo_trailer, NULL, "Part Specific Data"); /* Multi-Part data type */ proto_tree_add_item(gvsp_part_tree, hf_gvsp_multipartdatatype, tvb, offset + 4 + i * GVSP_SIZE_OF_PART_INFO_TRAILER, 2, ENC_BIG_ENDIAN); /* Part Length */ proto_tree_add_item(gvsp_part_tree, hf_gvsp_partlength, tvb, offset + 6 + i * GVSP_SIZE_OF_PART_INFO_TRAILER, 6, ENC_BIG_ENDIAN); switch( multi_part_data_type ) { case GVSP_MULTIPART_DATA_TYPE_2DIMAGE: case GVSP_MULTIPART_DATA_TYPE_2DPLANEBIPLANAR: case GVSP_MULTIPART_DATA_TYPE_2DPLANETRIPLANAR: case GVSP_MULTIPART_DATA_TYPE_2DPLANEQUADPLANAR: case GVSP_MULTIPART_DATA_TYPE_3DIMAGE: case GVSP_MULTIPART_DATA_TYPE_3DPLANEBIPLANAR: case GVSP_MULTIPART_DATA_TYPE_3DPLANETRIPLANAR: case GVSP_MULTIPART_DATA_TYPE_3DPLANEQUADPLANAR: case GVSP_MULTIPART_DATA_TYPE_CONFIDENCEMAP: /* Size Y */ proto_tree_add_item(gvsp_part_tree, hf_gvsp_sizey, tvb, offset + 12 + i * GVSP_SIZE_OF_PART_INFO_TRAILER, 4, ENC_BIG_ENDIAN); break; default: /* 2 DWORDS of data type specific data */ for (j = 0; j < 2; j++) { proto_tree_add_item(gvsp_part_tree, hf_gvsp_data_type_specific, tvb, offset + 12 + i * GVSP_SIZE_OF_PART_INFO_TRAILER + 4 * j, 4, ENC_BIG_ENDIAN); } break; } } /* Return dissected byte count (for all-in and extended chunk mode dissection) */ return 4 + part_count * GVSP_SIZE_OF_PART_INFO_TRAILER; } /* \brief Dissects the raw data leader */ static gint dissect_raw_data_leader(proto_tree *gvsp_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint offset) { /* Payload type */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloadtype, tvb, offset + 2, 2, ENC_BIG_ENDIAN); /* Timestamp */ proto_tree_add_item(gvsp_tree, hf_gvsp_timestamp, tvb, offset + 4, 8, ENC_BIG_ENDIAN); /* Payload data size */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloaddatasize, tvb, offset + 12, 8, ENC_BIG_ENDIAN); /* Return dissected byte count (for all-in dissection) */ return 20; } /* \brief Dissects a file leader */ static gint dissect_file_leader(proto_tree *gvsp_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint offset) { guint file_length = 0; /* Payload type */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloadtype, tvb, offset + 2, 2, ENC_BIG_ENDIAN); /* Timestamp */ proto_tree_add_item(gvsp_tree, hf_gvsp_timestamp, tvb, offset + 4, 8, ENC_BIG_ENDIAN); /* Payload data size */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloaddatasize, tvb, offset + 12, 8, ENC_BIG_ENDIAN); /* Filename */ file_length = tvb_strsize(tvb, offset + 20); proto_tree_add_item(gvsp_tree, hf_gvsp_filename, tvb, offset + 20, file_length, ENC_ASCII|ENC_NA); if (20 + file_length > G_MAXINT) return -1; /* Return dissected byte count (for all-in dissection) */ return (gint)(20 + file_length); } /* \brief Dissects a chunk data leader */ static gint dissect_chunk_data_leader(proto_tree *gvsp_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint offset) { /* Payload type */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloadtype, tvb, offset + 2, 2, ENC_BIG_ENDIAN); /* Timestamp */ proto_tree_add_item(gvsp_tree, hf_gvsp_timestamp, tvb, offset + 4, 8, ENC_BIG_ENDIAN); /* Return dissected byte count (for all-in dissection) */ return 12; } /* \brief Dissects a chunk data trailer */ static gint dissect_chunk_data_trailer(proto_tree *gvsp_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint offset) { /* Payload type */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloadtype, tvb, offset + 2, 2, ENC_BIG_ENDIAN); /* Payload data length */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloadlength, tvb, offset + 4, 4, ENC_BIG_ENDIAN); /* Return dissected byte count (for all-in dissection) */ return 8; } /* \brief Dissects extended chunk data leader */ static gint dissect_extended_chunk_data_leader(proto_tree *gvsp_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint offset) { /* Field info */ proto_tree_add_bitmask(gvsp_tree, tvb, offset, hf_gvsp_fieldinfo, ett_gvsp_fieldinfo, fieldinfo_fields, ENC_BIG_ENDIAN); /* Generic flags */ proto_tree_add_item(gvsp_tree, hf_gvsp_genericflags, tvb, offset + 1, 1, ENC_BIG_ENDIAN); /* Payload type */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloadtype, tvb, offset + 2, 2, ENC_BIG_ENDIAN); /* Timestamp */ proto_tree_add_item(gvsp_tree, hf_gvsp_timestamp, tvb, offset + 4, 8, ENC_BIG_ENDIAN); /* Pixel format */ proto_tree_add_bitmask(gvsp_tree, tvb, offset + 12, hf_gvsp_pixelformat, ett_gvsp_pixelformat, pixelformat_fields, ENC_BIG_ENDIAN); /* AOI */ dissect_image_aoi(gvsp_tree, tvb, offset + 16); /* Return dissected byte count (for all-in dissection) */ return 36; } /* \brief Dissects extended chunk data trailer */ static gint dissect_extended_chunk_data_trailer(proto_tree *gvsp_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint offset) { /* Payload type */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloadtype, tvb, offset + 2, 2, ENC_BIG_ENDIAN); /* Payload data length */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloadlength, tvb, offset + 4, 4, ENC_BIG_ENDIAN); /* Size Y */ proto_tree_add_item(gvsp_tree, hf_gvsp_sizey, tvb, offset + 8, 4, ENC_BIG_ENDIAN); /* Chunk layout ID */ proto_tree_add_item(gvsp_tree, hf_gvsp_chunklayoutidex, tvb, offset + 12, 4, ENC_BIG_ENDIAN); /* Return dissected byte count (for all-in dissection) */ return 16; } /* \brief Dissects a JPEG leader */ static gint dissect_jpeg_leader(proto_tree *gvsp_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint offset) { /* Field info */ proto_tree_add_bitmask(gvsp_tree, tvb, offset, hf_gvsp_fieldinfo, ett_gvsp_fieldinfo, fieldinfo_fields, ENC_BIG_ENDIAN); /* Generic flags */ proto_tree_add_item(gvsp_tree, hf_gvsp_genericflags, tvb, offset + 1, 1, ENC_BIG_ENDIAN); /* Payload type */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloadtype, tvb, offset + 2, 2, ENC_BIG_ENDIAN); /* Timestamp */ proto_tree_add_item(gvsp_tree, hf_gvsp_timestamp, tvb, offset + 4, 8, ENC_BIG_ENDIAN); /* Payload data size */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloaddatasize, tvb, offset + 12, 8, ENC_BIG_ENDIAN); /* Timestamp tick frequency */ proto_tree_add_item(gvsp_tree, hf_gvsp_timestamptickfrequency, tvb, offset + 20, 8, ENC_BIG_ENDIAN); /* Data format */ proto_tree_add_item(gvsp_tree, hf_gvsp_dataformat, tvb, offset + 28, 4, ENC_BIG_ENDIAN); /* Return dissected byte count (for all-in dissection) */ return 32; } /* \brief Dissects a H264 leader */ static gint dissect_h264_leader(proto_tree *gvsp_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint offset) { /* Field info */ proto_tree_add_bitmask(gvsp_tree, tvb, offset, hf_gvsp_fieldinfo, ett_gvsp_fieldinfo, fieldinfo_fields, ENC_BIG_ENDIAN); /* Payload type */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloadtype, tvb, offset + 2, 2, ENC_BIG_ENDIAN); /* Payload data size */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloaddatasize, tvb, offset + 4, 8, ENC_BIG_ENDIAN); /* packetization_mode */ proto_tree_add_item(gvsp_tree, hf_gvsp_packetizationmode, tvb, offset + 13, 1, ENC_BIG_ENDIAN); /* packet_size */ proto_tree_add_item(gvsp_tree, hf_gvsp_packetsize, tvb, offset + 14, 2, ENC_BIG_ENDIAN); /* profile_idc */ proto_tree_add_item(gvsp_tree, hf_gvsp_profileidc, tvb, offset + 17, 1, ENC_BIG_ENDIAN); /* cs0, 1, 2 ,3 */ proto_tree_add_bitmask(gvsp_tree, tvb, offset + 18, hf_gvsp_cs, ett_gvsp_cs, cs_fields, ENC_BIG_ENDIAN); /* level_idc */ proto_tree_add_item(gvsp_tree, hf_gvsp_levelidc, tvb, offset + 19, 1, ENC_BIG_ENDIAN); /* srop_interleaving_depth */ proto_tree_add_item(gvsp_tree, hf_gvsp_sropinterleavingdepth, tvb, offset + 20, 2, ENC_BIG_ENDIAN); /* srop_max_don_diff */ proto_tree_add_item(gvsp_tree, hf_gvsp_sropmaxdondiff, tvb, offset + 22, 2, ENC_BIG_ENDIAN); /* srop_deint_buf_req */ proto_tree_add_item(gvsp_tree, hf_gvsp_sropdeintbufreq, tvb, offset + 24, 4, ENC_BIG_ENDIAN); /* srop_init_buf_time */ proto_tree_add_item(gvsp_tree, hf_gvsp_sropinitbuftime, tvb, offset + 28, 4, ENC_BIG_ENDIAN); /* Return dissected byte count (for all-in dissection) */ return 32; } /* \brief Dissects the multi-zone image leader */ static gint dissect_multizone_image_leader(proto_tree *gvsp_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint offset) { /* Field info */ proto_tree_add_bitmask(gvsp_tree, tvb, offset, hf_gvsp_fieldinfo, ett_gvsp_fieldinfo, fieldinfo_fields, ENC_BIG_ENDIAN); /* Payload type */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloadtype, tvb, offset + 2, 2, ENC_BIG_ENDIAN); /* Timestamp */ proto_tree_add_item(gvsp_tree, hf_gvsp_timestamp, tvb, offset + 4, 8, ENC_BIG_ENDIAN); /* Zone direction */ proto_tree_add_bitmask(gvsp_tree, tvb, offset + 12, hf_gvsp_sc_zone_direction, ett_gvsp_sc_zone_direction, sc_zone_direction_fields, ENC_BIG_ENDIAN); /* Pixel format */ proto_tree_add_bitmask(gvsp_tree, tvb, offset + 16, hf_gvsp_pixelformat, ett_gvsp_pixelformat, pixelformat_fields, ENC_BIG_ENDIAN); /* AOI */ dissect_image_aoi(gvsp_tree, tvb, offset + 20); /* Return dissected byte count (for all-in dissection) */ return 40; } /* \brief Dissects the multi-part leader */ static gint dissect_multi_part_leader(proto_tree *gvsp_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint offset) { /* Get the number of parts from the header. As we are already looking at the beginning of the sixth DWORD here we must step back */ gint part_count_from_leader = tvb_get_guint8(tvb, offset - 13); gint part_count_from_remaining_bytes = tvb_reported_length_remaining(tvb, offset + 12) / GVSP_SIZE_OF_PART_INFO_LEADER; /* In case the leader contains incorrect data rely on the number of reported bytes instead */ gint part_count = part_count_from_leader <= part_count_from_remaining_bytes ? part_count_from_leader : part_count_from_remaining_bytes; gint i = 0; gint j = 0; /* Payload type */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloadtype, tvb, offset + 2, 2, ENC_BIG_ENDIAN); /* Timestamp */ proto_tree_add_item(gvsp_tree, hf_gvsp_timestamp, tvb, offset + 4, 8, ENC_BIG_ENDIAN); for (i = 0; i < part_count; i++) { guint16 multi_part_data_type = tvb_get_ntohs(tvb, offset + 12 + i * GVSP_SIZE_OF_PART_INFO_LEADER); /* Add a tree per part */ proto_tree* gvsp_part_tree = proto_tree_add_subtree(gvsp_tree, tvb, offset + 12 + i * GVSP_SIZE_OF_PART_INFO_LEADER, GVSP_SIZE_OF_PART_INFO_LEADER, ett_gvsp_partinfo_leader, NULL, "Part Specific Data"); /* Multi-Part data type */ proto_tree_add_item(gvsp_part_tree, hf_gvsp_multipartdatatype, tvb, offset + 12 + i * GVSP_SIZE_OF_PART_INFO_LEADER, 2, ENC_BIG_ENDIAN); /* Part Length */ proto_tree_add_item(gvsp_part_tree, hf_gvsp_partlength, tvb, offset + 14 + i * GVSP_SIZE_OF_PART_INFO_LEADER, 6, ENC_BIG_ENDIAN); switch( multi_part_data_type ) { case GVSP_MULTIPART_DATA_TYPE_2DIMAGE: case GVSP_MULTIPART_DATA_TYPE_2DPLANEBIPLANAR: case GVSP_MULTIPART_DATA_TYPE_2DPLANETRIPLANAR: case GVSP_MULTIPART_DATA_TYPE_2DPLANEQUADPLANAR: case GVSP_MULTIPART_DATA_TYPE_3DIMAGE: case GVSP_MULTIPART_DATA_TYPE_3DPLANEBIPLANAR: case GVSP_MULTIPART_DATA_TYPE_3DPLANETRIPLANAR: case GVSP_MULTIPART_DATA_TYPE_3DPLANEQUADPLANAR: case GVSP_MULTIPART_DATA_TYPE_CONFIDENCEMAP: /* Pixel format */ proto_tree_add_bitmask(gvsp_part_tree, tvb, offset + 20 + i * GVSP_SIZE_OF_PART_INFO_LEADER, hf_gvsp_pixelformat, ett_gvsp_pixelformat, pixelformat_fields, ENC_BIG_ENDIAN); break; case GVSP_MULTIPART_DATA_TYPE_JPEG: case GVSP_MULTIPART_DATA_TYPE_JPEG2000: default: /* Data Format */ proto_tree_add_item(gvsp_part_tree, hf_gvsp_dataformat, tvb, offset + 20 + i * GVSP_SIZE_OF_PART_INFO_LEADER, 4, ENC_BIG_ENDIAN); break; } /* Source ID */ proto_tree_add_item(gvsp_part_tree, hf_gvsp_multi_part_source_id, tvb, offset + 26 + i * GVSP_SIZE_OF_PART_INFO_LEADER, 1, ENC_BIG_ENDIAN); /* Additional Zones */ proto_tree_add_item(gvsp_part_tree, hf_gvsp_add_zones_multipart, tvb, offset + 27 + i * GVSP_SIZE_OF_PART_INFO_LEADER, 1, ENC_BIG_ENDIAN); /* Zone direction */ proto_tree_add_bitmask(gvsp_part_tree, tvb, offset + 28 + i * GVSP_SIZE_OF_PART_INFO_LEADER, hf_gvsp_sc_zone_direction, ett_gvsp_sc_zone_direction, sc_zone_direction_fields, ENC_BIG_ENDIAN); /* Data Purpose */ proto_tree_add_item(gvsp_part_tree, hf_gvsp_data_purpose_id, tvb, offset + 32 + i * GVSP_SIZE_OF_PART_INFO_LEADER, 2, ENC_BIG_ENDIAN); /* Region ID */ proto_tree_add_item(gvsp_part_tree, hf_gvsp_region_id, tvb, offset + 34 + i * GVSP_SIZE_OF_PART_INFO_LEADER, 2, ENC_BIG_ENDIAN); switch( multi_part_data_type ) { case GVSP_MULTIPART_DATA_TYPE_2DIMAGE: case GVSP_MULTIPART_DATA_TYPE_2DPLANEBIPLANAR: case GVSP_MULTIPART_DATA_TYPE_2DPLANETRIPLANAR: case GVSP_MULTIPART_DATA_TYPE_2DPLANEQUADPLANAR: case GVSP_MULTIPART_DATA_TYPE_3DIMAGE: case GVSP_MULTIPART_DATA_TYPE_3DPLANEBIPLANAR: case GVSP_MULTIPART_DATA_TYPE_3DPLANETRIPLANAR: case GVSP_MULTIPART_DATA_TYPE_3DPLANEQUADPLANAR: case GVSP_MULTIPART_DATA_TYPE_CONFIDENCEMAP: dissect_image_aoi(gvsp_part_tree, tvb, offset + 36 + i * GVSP_SIZE_OF_PART_INFO_LEADER); break; case GVSP_MULTIPART_DATA_TYPE_JPEG: case GVSP_MULTIPART_DATA_TYPE_JPEG2000: /* Generic flags */ proto_tree_add_item(gvsp_part_tree, hf_gvsp_genericflags, tvb, offset + 36 + i * GVSP_SIZE_OF_PART_INFO_LEADER, 1, ENC_BIG_ENDIAN); /* Timestamp tick frequency */ proto_tree_add_item(gvsp_part_tree, hf_gvsp_timestamptickfrequency, tvb, offset + 36 + i * GVSP_SIZE_OF_PART_INFO_LEADER + 4, 8, ENC_BIG_ENDIAN); /* Data format */ proto_tree_add_item(gvsp_part_tree, hf_gvsp_dataformat, tvb, offset + 36 + i * GVSP_SIZE_OF_PART_INFO_LEADER + 12, 4, ENC_BIG_ENDIAN); break; default: /* 6 DWORDS of data type specific data */ for (j = 0; j < 6; j++) { proto_tree_add_item(gvsp_part_tree, hf_gvsp_data_type_specific, tvb, offset + 36 + i * GVSP_SIZE_OF_PART_INFO_LEADER + 4 * j, 4, ENC_BIG_ENDIAN); } break; } } /* Return dissected byte count (for all-in dissection) */ return 12 + part_count * GVSP_SIZE_OF_PART_INFO_LEADER; } /* \brief Dissects a generic trailer (contains just the payload type) */ static gint dissect_generic_trailer(proto_tree *gvsp_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint offset) { /* Payload type */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloadtype, tvb, offset + 2, 2, ENC_BIG_ENDIAN); /* Return dissected byte count (for all-in dissection) */ return 4; } /* \brief Dissects a generic trailer (contains just the payload type) */ static gint dissect_extra_chunk_info(proto_tree *gvsp_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint offset) { /* Chunk data payload length */ proto_tree_add_item(gvsp_tree, hf_gvsp_chunkdatapayloadlengthex, tvb, offset, 4, ENC_BIG_ENDIAN); /* Chunk layout id */ proto_tree_add_item(gvsp_tree, hf_gvsp_chunklayoutidex, tvb, offset + 4, 4, ENC_BIG_ENDIAN); /* Return dissected byte count (for all-in dissection) */ return 8; } /* \brief Check if a packet with given status has payload */ static gboolean status_with_payload(gvsp_packet_info *info){ return info->status == GEV_STATUS_SUCCESS || ( info->enhanced && info->status == GEV_STATUS_PACKET_RESEND); } /* \brief Dissects a packet payload */ static void dissect_packet_payload(proto_tree *gvsp_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint offset, gvsp_packet_info *info) { if (status_with_payload(info) && tvb_reported_length_remaining(tvb, offset)) { proto_tree_add_item(gvsp_tree, hf_gvsp_payloaddata, tvb, offset, -1, ENC_NA); } } /* \brief Dissects a packet payload for H264 */ static void dissect_packet_payload_h264(proto_tree *gvsp_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint offset, gvsp_packet_info *info) { if (status_with_payload(info) && tvb_reported_length_remaining(tvb, offset)) { /* Timestamp */ proto_tree_add_item(gvsp_tree, hf_gvsp_timestamp, tvb, offset, 8, ENC_BIG_ENDIAN); /* Data */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloaddata, tvb, offset + 8, -1, ENC_NA); } } /* \brief Dissects a packet payload for multi-zone */ static void dissect_packet_payload_multizone(proto_tree *gvsp_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint offset, gvsp_packet_info *info) { if (status_with_payload(info) && tvb_reported_length_remaining(tvb, offset)) { /* Zone information */ proto_tree_add_bitmask(gvsp_tree, tvb, offset + 1, hf_gvsp_zoneinfo, ett_gvsp_zoneinfo, zoneinfo_fields, ENC_BIG_ENDIAN); /* Address offset */ proto_tree_add_item(gvsp_tree, hf_gvsp_addressoffset, tvb, offset + 2, 6, ENC_BIG_ENDIAN); /* Data */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloaddata, tvb, offset + 8, -1, ENC_NA); } } /* \brief Dissects a packet payload for multi-part */ static void dissect_packet_payload_multipart(proto_tree *gvsp_tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint offset, gvsp_packet_info *info) { if (status_with_payload(info) && tvb_reported_length_remaining(tvb, offset)) { /* Part ID */ proto_tree_add_item(gvsp_tree, hf_gvsp_multi_part_part_id, tvb, offset, 1, ENC_BIG_ENDIAN); /* Zone information */ proto_tree_add_bitmask(gvsp_tree, tvb, offset + 1, hf_gvsp_zoneinfo_multipart, ett_gvsp_zoneinfo_multipart, zoneinfo_multipart_fields, ENC_BIG_ENDIAN); /* Address offset high */ proto_tree_add_item(gvsp_tree, hf_gvsp_addressoffset, tvb, offset + 2, 6, ENC_BIG_ENDIAN); /* Data */ proto_tree_add_item(gvsp_tree, hf_gvsp_payloaddata, tvb, offset + 8, -1, ENC_NA); } } /* \brief Dissects an all in packet */ static void dissect_packet_all_in(proto_tree *gvsp_tree, tvbuff_t *tvb, gint offset, packet_info *pinfo, gvsp_packet_info *info) { gint ret; switch (info->payloadtype) { case GVSP_PAYLOAD_IMAGE: offset += dissect_image_leader(gvsp_tree, tvb, pinfo, offset); offset += dissect_image_trailer(gvsp_tree, tvb, pinfo, offset); if (info->chunk != 0) { offset += dissect_extra_chunk_info(gvsp_tree, tvb, pinfo, offset); } dissect_packet_payload(gvsp_tree, tvb, pinfo, offset, info); break; case GVSP_PAYLOAD_RAWDATA: offset += dissect_raw_data_leader(gvsp_tree, tvb, pinfo, offset); offset += dissect_generic_trailer(gvsp_tree, tvb, pinfo, offset); if (info->chunk != 0) { offset += dissect_extra_chunk_info(gvsp_tree, tvb, pinfo, offset); } dissect_packet_payload(gvsp_tree, tvb, pinfo, offset, info); break; case GVSP_PAYLOAD_FILE: ret = dissect_file_leader(gvsp_tree, tvb, pinfo, offset); if (ret < 0) break; offset += ret; offset += dissect_generic_trailer(gvsp_tree, tvb, pinfo, offset); if (info->chunk != 0) { offset += dissect_extra_chunk_info(gvsp_tree, tvb, pinfo, offset); } dissect_packet_payload(gvsp_tree, tvb, pinfo, offset, info); break; case GVSP_PAYLOAD_CHUNKDATA: offset += dissect_chunk_data_leader(gvsp_tree, tvb, pinfo, offset); offset += dissect_chunk_data_trailer(gvsp_tree, tvb, pinfo, offset); if (info->chunk != 0) { offset += dissect_extra_chunk_info(gvsp_tree, tvb, pinfo, offset); } dissect_packet_payload(gvsp_tree, tvb, pinfo, offset, info); break; case GVSP_PAYLOAD_EXTENDEDCHUNKDATA: offset += dissect_extended_chunk_data_leader(gvsp_tree, tvb, pinfo, offset); offset += dissect_extended_chunk_data_trailer(gvsp_tree, tvb, pinfo, offset); if (info->chunk != 0) { offset += dissect_extra_chunk_info(gvsp_tree, tvb, pinfo, offset); } dissect_packet_payload(gvsp_tree, tvb, pinfo, offset, info); break; case GVSP_PAYLOAD_JPEG: case GVSP_PAYLOAD_JPEG2000: offset += dissect_jpeg_leader(gvsp_tree, tvb, pinfo, offset); offset += dissect_generic_trailer(gvsp_tree, tvb, pinfo, offset); if (info->chunk != 0) { offset += dissect_extra_chunk_info(gvsp_tree, tvb, pinfo, offset); } dissect_packet_payload(gvsp_tree, tvb, pinfo, offset, info); break; case GVSP_PAYLOAD_H264: offset += dissect_h264_leader(gvsp_tree, tvb, pinfo, offset); offset += dissect_generic_trailer(gvsp_tree, tvb, pinfo, offset); if (info->chunk != 0) { offset += dissect_extra_chunk_info(gvsp_tree, tvb, pinfo, offset); } dissect_packet_payload_h264(gvsp_tree, tvb, pinfo, offset, info); break; case GVSP_PAYLOAD_MULTIZONEIMAGE: offset += dissect_multizone_image_leader(gvsp_tree, tvb, pinfo, offset); offset += dissect_image_trailer(gvsp_tree, tvb, pinfo, offset); if (info->chunk != 0) { offset += dissect_extra_chunk_info(gvsp_tree, tvb, pinfo, offset); } dissect_packet_payload_multizone(gvsp_tree, tvb, pinfo, offset, info); break; /* case GVSP_PAYLOAD_MULTIPART: */ /* By definition, Multi-part cannot support All-in Packet since it requires at least one data packet per part. */ /* Therefore, it is not possible to use All-in Transmission mode for Multi-part payload type. */ } } /* \brief Dissects a leader packet */ static void dissect_packet_leader(proto_tree *gvsp_tree, tvbuff_t *tvb, gint offset, packet_info *pinfo, gvsp_packet_info *info) { switch (info->payloadtype) { case GVSP_PAYLOAD_IMAGE: dissect_image_leader(gvsp_tree, tvb, pinfo, offset); break; case GVSP_PAYLOAD_RAWDATA: dissect_raw_data_leader(gvsp_tree, tvb, pinfo, offset); break; case GVSP_PAYLOAD_FILE: dissect_file_leader(gvsp_tree, tvb, pinfo, offset); break; case GVSP_PAYLOAD_CHUNKDATA: dissect_chunk_data_leader(gvsp_tree, tvb, pinfo, offset); break; case GVSP_PAYLOAD_EXTENDEDCHUNKDATA: dissect_extended_chunk_data_leader(gvsp_tree, tvb, pinfo, offset); break; case GVSP_PAYLOAD_JPEG: case GVSP_PAYLOAD_JPEG2000: dissect_jpeg_leader(gvsp_tree, tvb, pinfo, offset); break; case GVSP_PAYLOAD_H264: dissect_h264_leader(gvsp_tree, tvb, pinfo, offset); break; case GVSP_PAYLOAD_MULTIZONEIMAGE: dissect_multizone_image_leader(gvsp_tree, tvb, pinfo, offset); break; case GVSP_PAYLOAD_MULTIPART: dissect_multi_part_leader(gvsp_tree, tvb, pinfo, offset); break; default: break; } } /* \brief Dissects a trailer packet */ static void dissect_packet_trailer(proto_tree *gvsp_tree, tvbuff_t *tvb, gint offset, packet_info *pinfo, gvsp_packet_info *info) { switch (info->payloadtype) { case GVSP_PAYLOAD_IMAGE: case GVSP_PAYLOAD_MULTIZONEIMAGE: offset += dissect_image_trailer(gvsp_tree, tvb, pinfo, offset); break; case GVSP_PAYLOAD_CHUNKDATA: offset += dissect_chunk_data_trailer(gvsp_tree, tvb, pinfo, offset); break; case GVSP_PAYLOAD_EXTENDEDCHUNKDATA: offset += dissect_extended_chunk_data_trailer(gvsp_tree, tvb, pinfo, offset); break; case GVSP_PAYLOAD_RAWDATA: case GVSP_PAYLOAD_FILE: case GVSP_PAYLOAD_JPEG: case GVSP_PAYLOAD_JPEG2000: case GVSP_PAYLOAD_H264: offset += dissect_generic_trailer(gvsp_tree, tvb, pinfo, offset); break; case GVSP_PAYLOAD_MULTIPART: offset += dissect_multi_part_trailer(gvsp_tree, tvb, pinfo, offset); break; default: break; } if (info->chunk != 0) { dissect_extra_chunk_info(gvsp_tree, tvb, pinfo, offset); } } /* \brief Point of entry of all GVSP dissection */ static int dissect_gvsp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) { proto_item *ti = NULL; gint offset = 0; proto_tree *gvsp_tree = NULL; gvsp_packet_info info; if ((tvb_reported_length(tvb) < GVSP_MIN_PACKET_SIZE) || (tvb_captured_length(tvb) < 5)) { return 0; } memset(&info, 0x00, sizeof(info)); info.format = tvb_get_guint8(tvb, 4); if ((info.format & GVSP_EXTENDED_ID_BIT) && tvb_reported_length(tvb) < GVSP_V2_MIN_PACKET_SIZE) { return 0; } /* Set the protocol column */ col_set_str(pinfo->cinfo, COL_PROTOCOL, "GVSP"); /* Clear out stuff in the info column */ col_clear(pinfo->cinfo, COL_INFO); /* Adds "Gigabit-Ethernet Streaming Protocol" heading to protocol tree */ /* We will add fields to this using the gvsp_tree pointer */ ti = proto_tree_add_item(tree, proto_gvsp, tvb, offset, -1, ENC_NA); gvsp_tree = proto_item_add_subtree(ti, ett_gvsp); /* Look for extended ID flag and then clear it */ info.enhanced = info.format & GVSP_EXTENDED_ID_BIT; info.format &= 0x7F; /* Add packet format to info string */ col_append_fstr(pinfo->cinfo, COL_INFO, "%s ", val_to_str(info.format, formatnames, "Unknown Format (0x%x)")); /* Dissect status */ info.status = tvb_get_ntohs(tvb, offset); proto_tree_add_item(gvsp_tree, hf_gvsp_status, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; if (info.enhanced == 0) { info.blockid = tvb_get_ntohs(tvb, offset); proto_tree_add_item(gvsp_tree, hf_gvsp_blockid16, tvb, offset, 2, ENC_BIG_ENDIAN); } else { guint8 flags; flags = tvb_get_guint8(tvb, offset + 1); info.flag_resendrangeerror = flags & 0x04; info.flag_previousblockdropped = flags & 0x02; info.flag_packetresend = flags & 0x01; proto_tree_add_bitmask(gvsp_tree, tvb, offset, hf_gvsp_flags, ett_gvsp_flags, flags_fields, ENC_BIG_ENDIAN); } offset += 2; proto_tree_add_item(gvsp_tree, hf_gvsp_format, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; info.packetid = tvb_get_ntohl(tvb, offset - 1); info.packetid &= 0x00FFFFFF; if (info.enhanced == 0) { proto_tree_add_item(gvsp_tree, hf_gvsp_packetid24, tvb, offset, 3, ENC_BIG_ENDIAN); offset += 3; } else { offset += 2; if (info.format == GVSP_PACKET_LEADER) { if (tvb_get_guint8(tvb, 23) == GVSP_PAYLOAD_MULTIZONEIMAGE) { /* packet id contains the number of additional zones for multi-zone */ proto_tree_add_item(gvsp_tree, hf_gvsp_add_zones, tvb, offset, 1, ENC_BIG_ENDIAN); } else if (tvb_get_guint8(tvb, 23) == GVSP_PAYLOAD_MULTIPART) { /* packet id contains the number of parts for multi-part */ proto_tree_add_item(gvsp_tree, hf_gvsp_numparts, tvb, offset, 1, ENC_BIG_ENDIAN); } } offset += 1; } if (info.enhanced != 0) { info.blockid = tvb_get_ntoh64(tvb, offset); /* Dissect 64 bit block ID */ proto_tree_add_item(gvsp_tree, hf_gvsp_blockid64, tvb, offset, 8, ENC_BIG_ENDIAN); offset += 8; /* Dissect 32 bit packet ID */ info.packetid = tvb_get_ntohl(tvb, offset); proto_tree_add_item(gvsp_tree, hf_gvsp_packetid32, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; } /* At this point offset is pointing to end of packet */ col_append_fstr(pinfo->cinfo, COL_INFO, "[Block ID: %" G_GINT64_MODIFIER "u Packet ID: %d] ", (guint64)info.blockid, info.packetid); if (info.flag_resendrangeerror != 0) { /* Add range error to info string */ col_append_fstr(pinfo->cinfo, COL_INFO, "[RANGE_ERROR] "); } if (info.flag_previousblockdropped != 0) { /* Add block dropped to info string */ col_append_fstr(pinfo->cinfo, COL_INFO, "[BLOCK_DROPPED] "); } if (info.flag_packetresend != 0) { /* Add packet resend to info string */ col_append_fstr(pinfo->cinfo, COL_INFO, "[PACKET_RESEND] "); } /* Process packet types that are payload agnostic */ switch (info.format) { case GVSP_PACKET_PAYLOAD: dissect_packet_payload(gvsp_tree, tvb, pinfo, offset, &info); return tvb_captured_length(tvb); case GVSP_PACKET_PAYLOAD_H264: dissect_packet_payload_h264(gvsp_tree, tvb, pinfo, offset, &info); return tvb_captured_length(tvb); case GVSP_PACKET_PAYLOAD_MULTIZONE: dissect_packet_payload_multizone(gvsp_tree, tvb, pinfo, offset, &info); return tvb_captured_length(tvb); case GVSP_PACKET_PAYLOAD_MULTIPART: dissect_packet_payload_multipart(gvsp_tree, tvb, pinfo, offset, &info); return tvb_captured_length(tvb); default: break; } /* Get payload type, clear chunk bit */ if (tvb_captured_length_remaining(tvb, offset) >= 2) { info.payloadtype = tvb_get_ntohs(tvb, offset + 2); } info.chunk = info.payloadtype & 0x4000; info.payloadtype &= 0x3FFF; /* Add payload type to information string */ col_append_fstr(pinfo->cinfo, COL_INFO, "%s ", val_to_str_ext(info.payloadtype, &payloadtypenames_ext, "Unknown Payload Type (0x%x)")); /* Process packet types for specific payload types */ switch (info.format) { case GVSP_PACKET_ALLIN: dissect_packet_all_in(gvsp_tree, tvb, offset, pinfo, &info); break; case GVSP_PACKET_LEADER: dissect_packet_leader(gvsp_tree, tvb, offset, pinfo, &info); break; case GVSP_PACKET_TRAILER: dissect_packet_trailer(gvsp_tree, tvb, offset, pinfo, &info); break; default: break; } return tvb_captured_length(tvb); } static gboolean dissect_gvsp_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { conversation_t *conversation = NULL; guint16 status_code = 0; guint8 format = 0; /* Verify packet size */ if ((tvb_reported_length(tvb) < GVSP_MIN_PACKET_SIZE) || (tvb_captured_length(tvb) < 5)) { return FALSE; } /* Larger packet size if Extended ID flag is set */ format = tvb_get_guint8(tvb, 4); if ((format & GVSP_EXTENDED_ID_BIT) && tvb_reported_length(tvb) < GVSP_V2_MIN_PACKET_SIZE) { return FALSE; } /* Check for valid status codes */ status_code = tvb_get_ntohs(tvb, 0); if (status_code == GEV_STATUS_SUCCESS || status_code == GEV_STATUS_PACKET_RESEND || (status_code >= GEV_STATUS_NOT_IMPLEMENTED && status_code <= GEV_STATUS_LAST) || status_code == GEV_STATUS_ERROR) { format &= 0x7F; /* Check for valid format types */ if (format >= GVSP_PACKET_LEADER && format <= GVSP_PACKET_PAYLOAD_LAST) { if(format == GVSP_PACKET_LEADER && tvb_captured_length_remaining(tvb, 8) >= 2) { guint32 payloadtype; payloadtype = tvb_get_ntohs(tvb, 8); payloadtype &= 0x3FFF; if (try_val_to_str_ext(payloadtype, &payloadtypenames_ext) == NULL ){ return FALSE; } } conversation = find_or_create_conversation(pinfo); conversation_set_dissector(conversation, gvsp_handle); dissect_gvsp(tvb, pinfo, tree, data); return TRUE; } } return FALSE; } /* \brief Registers the dissector. Invoked at program startup. */ void proto_register_gvsp(void) { module_t *gvsp_module; static hf_register_info hfgvsp[] = { {& hf_gvsp_status, { "Status", "gvsp.status", FT_UINT16, BASE_HEX|BASE_EXT_STRING, &statusnames_ext, 0x0, NULL, HFILL }}, {& hf_gvsp_blockid16, { "Block ID (16 bits)", "gvsp.blockid16", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, {& hf_gvsp_flags, { "Flags", "gvsp.flags", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }}, {& hf_gvsp_flagdevicespecific0, { "Flag Device Specific 0", "gvsp.flag.devicespecific0", FT_UINT16, BASE_HEX, NULL, 0x8000, NULL, HFILL }}, {& hf_gvsp_flagdevicespecific1, { "Flag Device Specific 1", "gvsp.flag.devicespecific1", FT_UINT16, BASE_HEX, NULL, 0x4000, NULL, HFILL }}, {& hf_gvsp_flagdevicespecific2, { "Flag Device Specific 2", "gvsp.flag.devicespecific2", FT_UINT16, BASE_HEX, NULL, 0x2000, NULL, HFILL }}, {& hf_gvsp_flagdevicespecific3, { "Flag Device Specific 3", "gvsp.flag.devicespecific3", FT_UINT16, BASE_HEX, NULL, 0x1000, NULL, HFILL }}, {& hf_gvsp_flagdevicespecific4, { "Flag Device Specific 4", "gvsp.flag.devicespecific4", FT_UINT16, BASE_HEX, NULL, 0x0800, NULL, HFILL }}, {& hf_gvsp_flagdevicespecific5, { "Flag Device Specific 5", "gvsp.flag.devicespecific5", FT_UINT16, BASE_HEX, NULL, 0x0400, NULL, HFILL }}, {& hf_gvsp_flagdevicespecific6, { "Flag Device Specific 6", "gvsp.flag.devicespecific6", FT_UINT16, BASE_HEX, NULL, 0x0200, NULL, HFILL }}, {& hf_gvsp_flagdevicespecific7, { "Flag Device Specific 7", "gvsp.flag.devicespecific7", FT_UINT16, BASE_HEX, NULL, 0x0100, NULL, HFILL }}, {& hf_gvsp_flagresendrangeerror, { "Flag Resend Range Error", "gvsp.flag.resendrangeerror", FT_UINT16, BASE_HEX, NULL, 0x0004, NULL, HFILL }}, {& hf_gvsp_flagpreviousblockdropped, { "Flag Previous Block Dropped", "gvsp.flag.previousblockdropped", FT_UINT16, BASE_HEX, NULL, 0x0002, NULL, HFILL }}, {& hf_gvsp_flagpacketresend, { "Flag Packet Resend", "gvsp.flag.packetresend", FT_UINT16, BASE_HEX, NULL, 0x0001, NULL, HFILL }}, {& hf_gvsp_format, { "Format", "gvsp.format", FT_UINT8, BASE_HEX, VALS(formatnames), 0, NULL, HFILL }}, {& hf_gvsp_packetid24, { "Packet ID (24 bits)", "gvsp.packetid24", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }}, {& hf_gvsp_blockid64, { "Block ID (64 bits v2.0)", "gvsp.blockid64", FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL }}, {& hf_gvsp_packetid32, { "Packet ID (32 bits v2.0)", "gvsp.packetid32", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, {& hf_gvsp_payloadtype, { "Payload Type", "gvsp.payloadtype", FT_UINT16, BASE_HEX|BASE_EXT_STRING, &payloadtypenames_ext, 0x0, NULL, HFILL }}, {& hf_gvsp_payloaddata, { "Payload Data", "gvsp.payloaddata", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, {& hf_gvsp_timestamp, { "Timestamp", "gvsp.timestamp", FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL }}, {& hf_gvsp_pixelformat, { "Pixel Format", "gvsp.pixel", FT_UINT32, BASE_HEX|BASE_EXT_STRING, &pixeltypenames_ext, 0x0, NULL, HFILL }}, {& hf_gvsp_sizex, { "Size X", "gvsp.sizex", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, {& hf_gvsp_sizey, { "Size Y", "gvsp.sizey", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, {& hf_gvsp_offsetx, { "Offset X", "gvsp.offsetx", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, {& hf_gvsp_offsety, { "Offset Y", "gvsp.offsety", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, {& hf_gvsp_paddingx, { "Padding X", "gvsp.paddingx", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, {& hf_gvsp_paddingy, { "Padding Y", "gvsp.paddingy", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, {& hf_gvsp_payloaddatasize, { "Payload Data Size", "gvsp.payloaddatasize", FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL }}, {& hf_gvsp_pixelcolor, { "Monochrome or Color", "gvsp.pixel.color", FT_UINT32, BASE_HEX, VALS(colornames), 0xFF000000, NULL, HFILL }}, {& hf_gvsp_pixeloccupy, { "Occupy Bits", "gvsp.pixel.occupy", FT_UINT32, BASE_DEC, NULL, 0x00FF0000, NULL, HFILL }}, {& hf_gvsp_pixelid, { "ID", "gvsp.pixel.id", FT_UINT32, BASE_HEX, NULL, 0x0000FFFF, NULL, HFILL }}, {& hf_gvsp_filename, { "ID", "gvsp.filename", FT_STRINGZ, BASE_NONE, NULL, 0, NULL, HFILL }}, {& hf_gvsp_payloadlength, { "Payload Length", "gvsp.payloadlength", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }}, {& hf_gvsp_fieldinfo, { "Field Info", "gvsp.fieldinfo", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }}, {& hf_gvsp_fieldid, { "Field ID", "gvsp.fieldid", FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL }}, {& hf_gvsp_fieldcount, { "Field Count", "gvsp.fieldcount", FT_UINT8, BASE_HEX, NULL, 0x0F, NULL, HFILL }}, {& hf_gvsp_genericflags, { "Generic Flag", "gvsp.genericflag", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }}, {& hf_gvsp_timestamptickfrequency , { "Timestamp Tick Frequency", "gvsp.timestamptickfrequency", FT_UINT64, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, {& hf_gvsp_dataformat, { "Data Format", "gvsp.dataformat", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }}, {& hf_gvsp_packetizationmode, { "packetization_mode", "gvsp.packetizationmode", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }}, {& hf_gvsp_packetsize, { "packet_size", "gvsp.packetsize", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }}, {& hf_gvsp_profileidc, { "profile_idc", "gvsp.profileidc", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }}, {& hf_gvsp_cs, { "cs", "gvsp.cs", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }}, {& hf_gvsp_cs0, { "cs0", "gvsp.cs0", FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL }}, {& hf_gvsp_cs1, { "cs1", "gvsp.cs1", FT_UINT8, BASE_HEX, NULL, 0x40, NULL, HFILL }}, {& hf_gvsp_cs2, { "cs2", "gvsp.cs2", FT_UINT8, BASE_HEX, NULL, 0x20, NULL, HFILL }}, {& hf_gvsp_cs3, { "cs3", "gvsp.cs3", FT_UINT8, BASE_HEX, NULL, 0x10, NULL, HFILL }}, {& hf_gvsp_levelidc, { "level_idc", "gvsp.levelidc", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }}, {& hf_gvsp_sropinterleavingdepth, { "srop_interlaving_depth", "gvsp.sropinterleavingdepth", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }}, {& hf_gvsp_sropmaxdondiff, { "srop_max_don_diff", "gvsp.sropmaxdondiff", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }}, {& hf_gvsp_sropdeintbufreq, { "srop_deint_buf_req", "gvsp.sropdeintbufreq", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }}, {& hf_gvsp_sropinitbuftime, { "srop_init_buf_time", "gvsp.sropinitbuftime", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }}, {& hf_gvsp_add_zones, { "Additional Zones (Multi-Zone)", "gvsp.addzones", FT_UINT8, BASE_HEX, NULL, 0x1F, NULL, HFILL }}, {& hf_gvsp_zoneinfo, { "Zone Info (Multi-Zone)", "gvsp.multizoneinfo", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }}, {& hf_gvsp_zoneid, { "Zone ID", "gvsp.zoneid", FT_UINT8, BASE_HEX, NULL, 0x3E, NULL, HFILL }}, {& hf_gvsp_endofzone, { "End of Zone", "gvsp.endofzone", FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }}, {& hf_gvsp_addressoffset, { "Address Offset", "gvsp.addressoffset", FT_UINT64, BASE_HEX_DEC, NULL, 0, NULL, HFILL }}, {& hf_gvsp_sc_zone_direction, { "Zone Directions Mask", "gvsp.zonedirection", FT_UINT32, BASE_HEX_DEC, NULL, 0, NULL, HFILL }}, {& hf_gvsp_sc_zone0_direction, { "Zone 0 Direction", "gvsp.zone0direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x80000000, NULL, HFILL }}, {& hf_gvsp_sc_zone1_direction, { "Zone 1 Direction", "gvsp.zone1direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x40000000, NULL, HFILL }}, {& hf_gvsp_sc_zone2_direction, { "Zone 2 Direction", "gvsp.zone2direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x20000000, NULL, HFILL }}, {& hf_gvsp_sc_zone3_direction, { "Zone 3 Direction", "gvsp.zone3direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x10000000, NULL, HFILL }}, {& hf_gvsp_sc_zone4_direction, { "Zone 4 Direction", "gvsp.zone4direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x08000000, NULL, HFILL }}, {& hf_gvsp_sc_zone5_direction, { "Zone 5 Direction", "gvsp.zone5direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x04000000, NULL, HFILL }}, {& hf_gvsp_sc_zone6_direction, { "Zone 6 Direction", "gvsp.zone6direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x02000000, NULL, HFILL }}, {& hf_gvsp_sc_zone7_direction, { "Zone 7 Direction", "gvsp.zone7direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x01000000, NULL, HFILL }}, {& hf_gvsp_sc_zone8_direction, { "Zone 8 Direction", "gvsp.zone8direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00800000, NULL, HFILL }}, {& hf_gvsp_sc_zone9_direction, { "Zone 9 Direction", "gvsp.zone9direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00400000, NULL, HFILL }}, {& hf_gvsp_sc_zone10_direction, { "Zone 10 Direction", "gvsp.zone10direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00200000, NULL, HFILL }}, {& hf_gvsp_sc_zone11_direction, { "Zone 11 Direction", "gvsp.zone1direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00100000, NULL, HFILL }}, {& hf_gvsp_sc_zone12_direction, { "Zone 12 Direction", "gvsp.zone12direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00080000, NULL, HFILL }}, {& hf_gvsp_sc_zone13_direction, { "Zone 13 Direction", "gvsp.zone13direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00040000, NULL, HFILL }}, {& hf_gvsp_sc_zone14_direction, { "Zone 14 Direction", "gvsp.zone14direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00020000, NULL, HFILL }}, {& hf_gvsp_sc_zone15_direction, { "Zone 15 Direction", "gvsp.zone15direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00010000, NULL, HFILL }}, {& hf_gvsp_sc_zone16_direction, { "Zone 16 Direction", "gvsp.zone16direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00008000, NULL, HFILL }}, {& hf_gvsp_sc_zone17_direction, { "Zone 17 Direction", "gvsp.zone17direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00004000, NULL, HFILL }}, {& hf_gvsp_sc_zone18_direction, { "Zone 18 Direction", "gvsp.zone18direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00002000, NULL, HFILL }}, {& hf_gvsp_sc_zone19_direction, { "Zone 19 Direction", "gvsp.zone19direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00001000, NULL, HFILL }}, {& hf_gvsp_sc_zone20_direction, { "Zone 20 Direction", "gvsp.zone20direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000800, NULL, HFILL }}, {& hf_gvsp_sc_zone21_direction, { "Zone 21 Direction", "gvsp.zone21direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000400, NULL, HFILL }}, {& hf_gvsp_sc_zone22_direction, { "Zone 22 Direction", "gvsp.zone22direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000200, NULL, HFILL }}, {& hf_gvsp_sc_zone23_direction, { "Zone 23 Direction", "gvsp.zone23direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000100, NULL, HFILL }}, {& hf_gvsp_sc_zone24_direction, { "Zone 24 Direction", "gvsp.zone24direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000080, NULL, HFILL }}, {& hf_gvsp_sc_zone25_direction, { "Zone 25 Direction", "gvsp.zone25direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000040, NULL, HFILL }}, {& hf_gvsp_sc_zone26_direction, { "Zone 26 Direction", "gvsp.zone26direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000020, NULL, HFILL }}, {& hf_gvsp_sc_zone27_direction, { "Zone 27 Direction", "gvsp.zone27direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000010, NULL, HFILL }}, {& hf_gvsp_sc_zone28_direction, { "Zone 28 Direction", "gvsp.zone28direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000008, NULL, HFILL }}, {& hf_gvsp_sc_zone29_direction, { "Zone 29 Direction", "gvsp.zone29direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000004, NULL, HFILL }}, {& hf_gvsp_sc_zone30_direction, { "Zone 30 Direction", "gvsp.zone30direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000002, NULL, HFILL }}, {& hf_gvsp_sc_zone31_direction, { "Zone 31 Direction", "gvsp.zone31direction", FT_BOOLEAN, 32, TFS(&zonedirectionnames), 0x00000001, NULL, HFILL }}, {& hf_gvsp_numparts, { "Multi-part number of parts", "gvsp.numparts", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }}, {& hf_gvsp_multipartdatatype, { "Data Type", "gvsp.multipartdatatype", FT_UINT16, BASE_HEX|BASE_EXT_STRING, &multipartdatatypenames_ext, 0, NULL, HFILL }}, {& hf_gvsp_partlength, { "Part Length", "gvsp.partlength", FT_UINT64, BASE_HEX_DEC, NULL, 0, NULL, HFILL }}, {& hf_gvsp_multi_part_source_id, { "Source ID", "gvsp.sourceid", FT_UINT8, BASE_HEX_DEC, NULL, 0, NULL, HFILL }}, {& hf_gvsp_data_purpose_id, { "Data Purpose ID", "gvsp.datapurposeid", FT_UINT16, BASE_HEX_DEC, NULL, 0, NULL, HFILL }}, {& hf_gvsp_region_id, { "Region ID", "gvsp.regionid", FT_UINT16, BASE_HEX_DEC, NULL, 0, NULL, HFILL }}, {& hf_gvsp_data_type_specific, { "Data Type Specific", "gvsp.datatypespecific", FT_UINT32, BASE_HEX_DEC, NULL, 0, NULL, HFILL }}, {& hf_gvsp_endofpart, { "End of Part", "gvsp.endofpart", FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }}, {& hf_gvsp_add_zones_multipart, { "Additional Zones (Multi-Part)", "gvsp.multipartaddzones", FT_UINT8, BASE_HEX, NULL, 0x1F, NULL, HFILL }}, {& hf_gvsp_zoneinfo_multipart, { "Zone Info (Multi-Part)", "gvsp.multipartzoneinfo", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }}, {& hf_gvsp_multi_part_part_id, { "Part ID", "gvsp.partid", FT_UINT8, BASE_HEX_DEC, NULL, 0, NULL, HFILL }}, {& hf_gvsp_chunkdatapayloadlengthex, { "Chunk Data Payload Length", "gvsp.chunkdatapayloadlengthex", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, {& hf_gvsp_chunklayoutidex, { "Chunk Layout ID", "gvsp.chunklayoutidex", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }}, }; static gint *ett[] = { &ett_gvsp, &ett_gvsp_flags, &ett_gvsp_header, &ett_gvsp_payload, &ett_gvsp_trailer, &ett_gvsp_pixelformat, &ett_gvsp_fieldinfo, &ett_gvsp_cs, &ett_gvsp_sc_zone_direction, &ett_gvsp_zoneinfo, &ett_gvsp_zoneinfo_multipart, &ett_gvsp_partinfo_leader, &ett_gvsp_partinfo_trailer }; proto_gvsp = proto_register_protocol("GigE Vision Streaming Protocol", "GVSP", "gvsp"); gvsp_handle = register_dissector("gvsp", dissect_gvsp, proto_gvsp); proto_register_field_array(proto_gvsp, hfgvsp, array_length(hfgvsp)); proto_register_subtree_array(ett, array_length(ett)); gvsp_module = prefs_register_protocol(proto_gvsp, NULL); prefs_register_obsolete_preference(gvsp_module, "enable_heuristic"); } void proto_reg_handoff_gvsp(void) { dissector_add_for_decode_as_with_preference("udp.port", gvsp_handle); heur_dissector_add("udp", dissect_gvsp_heur, "GigE Vision over UDP", "gvsp_udp", proto_gvsp, HEURISTIC_DISABLE); } /* * Editor modelines - http://www.wireshark.org/tools/modelines.html * * Local variables: * c-basic-offset: 4 * tab-width: 8 * indent-tabs-mode: nil * End: * * vi: set shiftwidth=4 tabstop=8 expandtab: * :indentSize=4:tabSize=8:noTabs=true: */ aravis-ARAVIS_0_6_0/tools/wireshark-snapshots/000077500000000000000000000000001334570641500214005ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/tools/wireshark-snapshots/Basler-acA1300-chunk-data.pcapng000066400000000000000000002473141334570641500270200ustar00rootroot00000000000000 tM<+Linux 3.15.7-200.fc20.x86_64-Dumpcap 1.10.7 (Git Rev Unknown from unknown)tLwlp12s0  Linux 3.15.7-200.fc20.x86_64LBRN30055C3C8A43.local% vEFreebox-Player.local)Freebox-Player.localFreebox-Server.local1CEOL-piccolo.local,*P@ 2.client-channel.google.com B2.client-channel.google.com)Freebox-Player.local)Freebox-Player.local-Btalkgadget.l.google.com-Atalkgadget.l.google.com-@talkgadget.l.google.com-Italkgadget.l.google.com-Ctalkgadget.l.google.com-Ntalkgadget.l.google.com-Dtalkgadget.l.google.com-Etalkgadget.l.google.com-Gtalkgadget.l.google.com-Ftalkgadget.l.google.com-Htalkgadget.l.google.com(*P@talkgadget.l.google.com)Freebox-Player.localFreebox-Server.locali8hobbes.local hobbes.local!!jÚlappc-p348.local!lappc-p348.local1CEOL-piccolo.localelappexch03.lapp.in2p3.frJ}iwww.google.comJ}cwww.google.comJ}Γwww.google.comJ}jwww.google.comJ}gwww.google.comJ}hwww.google.com*P@ iwww.google.comerlapp-owncloud02.in2p3.frXS;a1711.g.akamai.netXSJa1711.g.akamai.net apicache.met.noEhccpnvx.in2p3.frEccpntc3.in2p3.fr)Freebox-Player.localFreebox-Server.local1CEOL-piccolo.localLh**!jÚ0SE9H!t0SBasleracA1300-30gc105413-01none21025233L\+h::0S!jÚE,]@@2!tZDB\X ,h66!jÚ0SE(8<!t Local:Basler_Ace_GigE_Version_3_0.zip;c0000000;c394X\ ,h::0S!jÚE,^@@2!tBB\X%,h66!jÚ0SE(8<!tPKn<~o0$ Basler_Ace_GigE_Version_3_0.xmlks80}kMr-dv6S|ul?LN*-Q27!)_q!A)˓LXF/0˃t/Ȇi8$Q<$á?]K ޙ?iF_m\zr^w[?>_ o*܏OGI-EK_Q?+ԟf?ygi2y8O[;?o`4z~ck7vw~n_Gg__̯@`j3L%P.$ giϢ `!CxaL0%xlŬ=|Gu?{j{ջλWw߾yE"_2:dt*hrz_0|D˚0\IOy<$X\&,h::0S!jÚE,_@@2!tAB\X;,h66!jÚ0SE(8<!tZRr$O+>ښ~>O 4~}]RkQ2ͲvGS$5N4?j/p2 {$T32r(hou0ӥō? I{Olq~44pcQym< ~EloyFl wq6Km0 v @,ۘv'x@<m@q8 uٿi?fkU{*t0d*6^"~/W,XwFap}-}aVuk.oŒHT&|d^o2pCtoxCp<$016bm5Pi&~r7_w<-.D!չ1?vXVҏ@WrCP_oy1zZڙө:NϏpk7~D>#;}dX\=<,h::0S!jÚE,`@@2!t@B\XT,h66!jÚ0SE(8<!t槹`ͩț@1Ԛ~[1\y ~=xD\ȽȻ S^DKL1BD:bK&38 %]꤬ܻLb۹È@i(+~8+T]NQm@jSrڟ%3޾1\5L6T ]F%U0zxj#' " Af)8C3MBay;cGvc`6'aˢW(M:[i<~FMld4'Q-+0AVlafp622zo)Ly`&3 /֩ql#Ps/ن%ʙF<6CF@`#pbu[ՖޱM'oaB7,F\&K+ Y!SvFw  e=x U<#dqDբջ ΤF㡄UݪM \cmj\a\xUQ JjӌSVaf6a-g v)X\m,h::0S!jÚE,b@@2!t>B\X],h66!jÚ0SE(8<!tѣzC-OTq\Ӈ4E7Pc&ɲ4|%i4bf=25 c|6'#Q3(57A-{y|ƞE3✂P.;U>Aoq_z4UL7Ϩ DxNsj~ fMp,򈽯אnFK[,ik#/"xkp,M 54ŒfPX\ ,h::0S!jÚE,e@@2!t;B\X,h66!jÚ0SE(8<!tO7Cgs|RК eaMM%ywtdK秿n~۲g3-L3ӵG_~悐]:LWk;skl~툜+Dd%}Wam#c`M]tshZ 2Յv4^ۖ4v%*Ѵ> M.Fӷ4vC6۽ Q1E7ۥtan-4Z%ۘ [[Evtknc2.&w,^t{ htjp7}d* hvitǫrRяILq2nS" ~tvH?Cd+@)=Թ]f}u~+a1燯w%\9yw5 ϕ@}iG(];}}~2u"=6I yϻ%U"t,"﹥DNųKX\i,h::0S!jÚE,f@@2!t:B\XQ,h66!jÚ0SE(8<!t9e:‹wR8Z9NF8GmGRLv,QNvMAWyyy$תxjLV(N<̇Rnvg$>&q yxxdNA>",$!֛i,e޹"0^C=,B B&$MM3OȔhrj'GNrB%#7rPNg߼,J -s't4y)r -l-4m1$N"e$ ĐEel~=ǕS $A&7+nژ,il~(ZLmeb#f*@)Ւ~M5+v_{W$''=kMLL07K,*5e9K -ު65I,թ ϱQy4#T:$4DMP,M߻0Bdl90 0JhJ29*X\,h::0S!jÚE,g@@2!t9B\X,h66!jÚ0SE(8<!t RusȓFn<aֵϷL00K%%ʍ!6Y9LrV`ȥ:"<5 Uq#b c. XwCE&)eb[2pQaUMVv㩚ϜSjю/9 L 3G$1GY-ŰqD5P385V4Jfxuh 7[Q3|y,E\W%HؚПaiRF 9 )YFWNO^ZdHf| )[<-)oVω̨w"“#'lٌSw(uY:_b(\nW֎{NK׭U]zV.`kGt^nunw+Q~\Yq@WL`lP^Gt} t}F׷=ܕ?/?]v=g]Y&7*y(E}b5\MsX\,h::0S!jÚE,h@@2!t8B \X-h66!jÚ0SE(8<!t3 A\%C{Ux,0r&f/ցSbγG귌Z6A8Ԩv`B炢4 Ԭyeb>T*2m&7Z>&'?&8'z𢐞4xHldI<`(_ }+uCnz, kgd5{OT9=Bi+x /8M1a(ӌ2b.BDf Dpz [ߪm~?5XM=k1 ScQ[fKqJת:-FMG5nbf/E?c]]̰l]4ε[ux]xpV"Gʎ|fݕY96Z_٢/ގ ݼQ0sd8PBP?K/\ ^,%K: ,>,IUpMH4~>ƍЋ {Ai^iKh=!ڶ)&-Bjj- XxX\-h::0S!jÚE,i@@2!t7B!\X-h66!jÚ0SE(8<!t)!nvXN _,-##?Չv&Ujfg#Ά@'AK {rJU{+ ݹ왇195zىWKgĘi!p(+\%MM ϓy% Q@ 5.fD]TiKܴs>HS8"вIQvR]i2B5ট0]xȓŜܙ RsNL'EdɲtF:(I37&KfHKfwSрʟ!5X\S4-h::0S!jÚE,k@@2!t5B#\XlB-h66!jÚ0SE(8<!t#<S3Yldfu3TMJY=)4㸱qziYl,4(Z CuL ;[;tffSe-d}08p-JyƵ O3=Umrd#Ҟv`~Vw44M*qۨo-"K',񳑢W檂2iPS(sȳoPg-ޱԿIG<ʗ{{ш aa!&Lgv[3%)ͩA^r"оX\;C-h::0S!jÚE,l@@2!t4B$\XX-h66!jÚ0SE(8<!t$#o5:XJw6KLBJBѴP uS<}ecYba?̥PtSjͥRdIdA6 CX'DR "d l[RN jRdKdE,f!zZR)KdEQ6'' aGoJX Sk6(֎"4aD8yKdRE~)"zȻR")Ύ"l =^Fe .AH/;"&B|yDDAzY^moA|yT\7`yذvpx GNȁ ˗`>"oNvaŜLbѴfн~8X~Z>=YCM  $D<[J2FmcAY5fw%jxɏ 0%p5 Q8("(#vqQ,lsȬ΢mg)8 s)vc`6@ ˢWOguAÙX\+k-h::0S!jÚE,n@@2!t|2B& \X-h66!jÚ0SE(8<!t[& qpʘq%d[gX̧xhW~9 WUN-݄Q [ei0 (K%8aSHF$nPa"U:J2eO+AkC5jw-oYՕPO-w^}Ez9^JAzBPFgVIYOi ,Zmk/tm+T3zNȅQkvIՄ`Af:TEjh]BUZxU-2T*-#/5, yo +XpQJٚCt<; h/NDi)\g]C欑|R-'?%OͶIkci`t1&f{*4@am-0,4Gi1iGR3)eFbSL75@v]iAl=5B@hU>&s݁кA(]Vv)befP ,Ŭj 4&- -X\-h::0S!jÚE,o@@2!tz1B'"\Xߡ-h66!jÚ0SE(8<!tܩ'"^r4_wn&WemV_jхfedCPL^**x^Ai"-2SNb)M&hHٜYŔW"X2gqkeydXB %m PfBZCjyKbU'oU5&l 1i)/|ڰb3ޑ̎+a4|vm'a<.W)YΕzמʹfON5r<&xT,R2~dq:t&_3QDpP7!SLK{p5:)a ?c0\)ȅ.(V)LL6-fi7;>sW/ &G1RR Zm 5%Q_KE]p:_-,2fHiL˔jF0܎\JZm2&g_ɜ\#eӇ9 2s"g] ss mf8A|Í}96.=}sr~X\-h::0S!jÚE,p@@2!tx0B($\X-h66!jÚ0SE(8<!t($mu'SwO(MmL"MMD:ׁf fֆ 'ԎTԡbSP jRa0Z+}.x"gkݸƴ28L+Xw-˽jc jyjrb(Y+'8#MX'ZeA[ѲZv_\ rn~fw@J C:A1!)Lb-{"$ٕTPqJ#i*YR{m2RL\xSdbp3"gU[zPSʆ5]Yw>gf=?Oys{׬suj+lш6y ?#ePv@o2* ^)b CR֣x}!fIix$X&̲?r6d`&H^<JHD6`CBДy)f0eFey˃c!u+A0dԏ)lH۹bA#6#tݬ93X\-h::0S!jÚE,s@@2!tr-B+*\Xw-h66!jÚ0SE(8<!tW+*s6ou֧7ePk'y[b27j>UfH\)JoЂgbR+s|2;}kNmO8U}G99aI+?S[ \dZ//OoBUn= TGz&ԑx -][tv场Ud%mWVKͻ|W/ HjLgаCqIJO~`D^No tˋN0ǘ[T[^,abBƱq[Wr^I$e{V0CūM+0K,O^ 9aQ 5+:[Fj,24FO)9$ډG$PǦ$RLܥu =fX_x#ι]-k>˱bB@ù5uk0y6*`2hmCP,.맴OfJz-X\8-h::0S!jÚE,t@@2!tp,B,,\X.h66!jÚ0SE(8<!t',, g&Lj`(Gl!6c^6@+n^4cp֟sWF#bbhԇ@\ik/0,9Au0IG@֜]pN+٠>&C0*QP.9֍Z}M+/Nȕv؀|͇A5P5]L[zOO8D I ޠEͲÒM=]V,LOK_eDR\Zx@֜Xr6B2M0AL%-k37'w4 VmBRLlʲXo;PJ775^ڳȹ;-:-+kS`Ş1{ m\8Z kFoc&GפFle1zj.\L!Yp[c^ŸzUumIkma)hmn4Qzm0aiwmhL" ec#, =5(OIږ.!b];EX\.h::0S!jÚE,u@@2!tn+B-.\Xt.h66!jÚ0SE(8<!t,-.zCKdM4K:QQZ'W-6頖o\Uv/55W.^;Y]1Fޛ(ZXY-Dt}|hg1jP:!뼪m?z+!ګвJƈ+*~9 * $)E[UDF!*4%S9v$fԾT+nFҎ51_PHjgf+fUSaZًŭpHh&Jo,ZN6hO :TPڋ߹bPPP_s6{vaF*/S9(̗GۖwrwO_vt!D&֮503R;BhJ: ۧ3IJ}Ӑ%qF{:ʃc RRp6]p ڻ}fw+΂-Zmؼ]=eO3#S^#!āؚ6k"$@4_ǟ@E|MGop\X\6 .h::0S!jÚE,v@@2!tl*B.0\X2.h66!jÚ0SE(8<!t y.0 o.^`kK FaN ޜn=F6Iw9v=dqu0{ #w#.Ӕ(WRpqVayi9 NE"$tr72WUBHi頲0pfG^$Oux' 2MnQtg!"Jѿ_N3.|9uV921[5cEIm>XHs2sF6tYDyD.(4mr{m iha_^  ƜA`ΜAXvo fglX\f2.h::0S!jÚE,w@@2!tj)B/2\X>.h66!jÚ0SE(8<!t/2mZLѴȲHzi?(C .dL-Aopiqn,RIjSMԜc((ӀN%._e|2ncU4`CrTc6eHIː f+tDE>&5JcHF1, Ed7և_p4jaz]9Dݣ~s/X<P鯍D_1).aТw?p{iðt3յQ6xտ,7Dr] () )d?}" "Cx cX\>.h::0S!jÚE,x@@2!th(B04\XK.h66!jÚ0SE(8<!t)04Ajr60ٔ43!"E!00uasLRP=7~3< F΀f\A0::xǩ3g #= uu`7_AϾaZﱊ@YO9Ŭ,˃Afc=i+s:.ZM6K5G'Auy|sT7SgO.v.Aݭ_'{n]֛l/_๛6YOgAy~>Hâ $eEY{ zzăߓ,*7f@4KN 'ָZ>ijBKS/& ~1hkQ8qBpW^ٶSs.}KttqtytzrX\K.h::0S!jÚE,y@@2!tf'B16\Xd.h66!jÚ0SE(8<!t163<Ӈ  {?Y<'<"msMb/7oppM AVy7?" ï6,FSTT k+YQwIH gjC[.f{ZtWS.loJ?z8O Klݼvf__o5ޱM 5ªX[GT;DMV6eҐUŒ&ҵfЁh :p 7>jzbl%֌nShݲ\7%f`ig$8դ) #jb3yܽF^Gu͝OL/9l=:>b|]kl&0ߣoky`=BT1PLp!O<,] Q4d8;Sm4bMjXuGkVе9]J@~]e;J{@5fv;r('WGVi(%j;FۻJ/iGxk˂/~)$L\\ͪZF)3-EiuCuEYBDUS(Ӳሙޔtxjڍ&'CǬ]ӳZ:b} (%^aX\ar.h::0S!jÚE,{@@2!tb%B3:\X!.h66!jÚ0SE(8<!t3:'pUXyn%4X5H+7XS<+/-u#XLQs9c8Yc!Z+w]!V<Ԓ$V:z$̡c]@6.WyJx }C+4?|<`T:$ͨ ȁ\_h(7eDbF6z*AKհF_SzC`7]/B/O(Hәجf6ϾX",I+u$}[>Hqx<mtl![HAQ AB$OآPxe~L;eƻ*[|NYΟsb ]0ȉ֑#M=<PGj}_l-~z9ٕ10s 7z4 #ao6E*aL@pfsMِzfaD٭ENW@ZxXB3o*?Dh394˝ҙ.8fzotW 8Qi%X\.h::0S!jÚE,}@@2!t^#B5>\X.h66!jÚ0SE(8<!t95>b1-b[׭>keӖ%R:T-P L+zDF&Pm]'2T"%mPW ~T )w* - M)M夏{&,͞1ildnòD mXHT> NkUY&~1SNgq(IZKD!jG|:m6%0q }"ɼ81 ? 6J@ھouFwXa:VL(lH%uq?5 @K6oA*]qzAm׌s^ɰNx\tX\.h::0S!jÚE,~@@2!t\"B6@\X.h66!jÚ0SE(8<!t6@v!w4,!*DV͛vy>JЏuj*F%J+.FY9#.Яz v0laOt >$SH243 x*:w =ZYՉ6{Hiא6 r#le1axN˱.++)e!xFǔSpcɪQ{w<23MXpmAC|z4s:œ4% ٪0cty&\baа?&rdb2) ԤPe !Q~+&*Gȧkj9OCQ7:QFD~WP5[ÆZS"Zf&6T]PWf,KtR_?z0lp+`#J|5i> EncѣHֺqיwQKr jZ9Y%:Bp0i(meSvz*д{^X0f41`RvDOzHEZUŹr`g58yJAux_xy/&| Iͤ*)(#v bVȵӧ]M,(-9D~`[dL_XkX)j"^ψmt2H R#i\fjjӴY`*6D7_mS|qAPS,#e_T" _R^ U*q! qvXTm)+I1l!I\JX[d̏q6ެ&HgpNs"gm➲z ψk`-99hl~$>҉]O͇TBTjQk+8娮 m?9{T٤}bl"1&7ya$҂ZuSm|gJ)n*5iWU]$wr8"%b>,gi'$! 6w?+M¿/Mm9QEI2X\.h::0S!jÚE,@@2!tVB9F\X6.h66!jÚ0SE(8<!ty/9FXV4(gnι- T[1g34v`"N@Z2bzmMwOp`i+C"Y^MN|]uZᓣcm:4*eÛ`* bKxy @Kp@nP5ۚ6]Q]V$q8N~TB_IBve`*n5.n[-+W<~'lHYQꖚխ~Vg8s% *p~]Mv#./I揕9WvQOU᪝-4\3x婹gpQOIf9of!r{akn>=c[@-I*_탦[?hHӢjtAC\\JT1A +O4 Gr[ܹ :=3l@EU<"kNW1Y65aR!:5)o tTzMqAP'#|?aph8W*C2G%"Genbpy+%*8=Q|:>f8 U1kR+%>ob9o<:ٯ{)Dd+[Ѩ@ !' +BIOi6;4PU`-kN3YMBP:!UI (cMKx$-ɷmyp<Xdd/_ +EaM_^ƫ=ZCqІ//#֌_&W Li>M73Gڊpё28%zmuEFS4&#YzXS]]#x 0&lPn@H;&6/@ju OV y8;T?62 ps=61Bv%zg2ӡ$%Od64e+m?Aj܆7U2B?9E ּZC5iYh߻D>}#Ќ_0v6Ea1b :c]08x.UEIHYف֫~Xpdb3+~Ye/t& $F%/ PxZo)~ ɡ$HZG{ό+fsOG~ͳL4JTc #ճ*^ ΰ!TbbI=FO~2^,FGV;vMΧqM-KH|)%b 59%H`S>kѲX\,/h::0S!jÚE,@@2!tNB=N\X8/h66!jÚ0SE(8<!t=NOT%zi2.,'y3tGDgϳ&^q 55Ѷ0C >P ҖÉ7mΜrh=L A|!}!Tȼ\#iSxK}WnKM/7A\j>le%,֒L2oS@l}(i/RB;+G&! tgyA2;:9:89XnB׿qBEߚ\C>U`Ɋ7bP\Xa/h66!jÚ0SE(8<!tR>Pf7`fg!! rw^Nc%ri) .S2lfԇ|R#9TQ{'*AM!+.Y-T\.QeUvfbek?fr].7D ȸ&a)17m8s37b>'b)!q>G]\ڹ텴6(ö~v'Pdo{/5r4Onf{I1fa< fA \=yϓ6~#t6X#yK<9;MAن`Wc<ص+{d,K>Ȼ{rYe">KЩۏj?v`wC֕K~ Ye9ًx:pP%RL[(O륻c6U?u~y$'jܮς QrGs :!xcL*X\mb/h::0S!jÚE,@@2!tJB?R\X}/h66!jÚ0SE(8<!t ?R_}ͲD:xSn<8,`ސG DUS逍/"!E‡FC={E\F.` #ma-I߄Z.:q|(:MGRJ37;djAìr%=Xʼ3nA=UZg)TwóLc|D)**QpS )^1~.63}J%=_BF'&W3:X\*~/h::0S!jÚE,@@2!tHB@T\X/h66!jÚ0SE(8<!t_@T^Ң4 dS~`mȘ|L dx$le5ז|dT yt q~Y'VaL Z {C+fSZyƋ@ڦYCq+½*C"|}^j6/e7Xgϓ99ɑU Af)dVtWIC#(NJWRh{ }r /KC[訍`+; 5 250@ pפ\dY@y 4(ε^YSݟο '|!t V\vtC+BABAB i_b0t8n [t HWE;9|>c¥3h# NPָ2[BӪA*ߊ 2duIJո& ʋ8j/Ce8QjN!ڱ(Ѓ8 ?PACa:6$KX\/h::0S!jÚE,@@2!tFBAV\Xh/h66!jÚ0SE(8<!tYAVX@ކ6 M5_F4ϛC席6]h- ʢj#7FGZ1,7&~PܮexέF4^P,{.vCaC?QބƓ˕b]]C&푾3ϓy<d(HvX8&:*b h~(ğ?5 $-\&g8ٝ"uR^?}*P\.t.w 7pf3TYPj:ÎRM ,MadXhszi=;wB$b8[Z+eL,b=vj<(O:(g">e)sD#Xd,!}R|G~zI5Ƽy1qdvDcGYB{M_Yn9KĽNǤsou7CX FŭF_n>WaB1U!_h+X\*/h::0S!jÚE,@@2!tDBBX\Xi/h66!jÚ0SE(8<!tuBX)5=8e8Vuk8۷l@l؋pOsE).uoG"R@gھ{. +MvÖV9쉹J`.ڸ沃f.vD..檵60Wuwu%`+YU!Y@~6 2@=ө:ۋ9U|\ÈʉxQa2:`О'Ju^rN91{{5mk5S

r҉jl2v}9J `7k1r '*PԽ.ʩ5VU>"bÊ7G߼6tF';CMXN ɐRGĒ\$$uiDi7s.8K?WFcXr45$=p*X*~ubVr ƪ.a+~]~ucԯ֌՚Qvʨf3}[z*?چi^k\*< _gg5St(rhJњYq糱8tkn!#l.pC(C~CxP38i -] '򀨠xktUmۡ1]J˩$;*q$I:sEޤ^ ~_<ĨV9HN-2zahiQwibX\/h::0S!jÚE,@@2!t@BD\\Xh/h66!jÚ0SE(8<!t[D\F%*P%3jޕA`({cuJsĶ?;<(Nyt짩`!$hHuRXk"'"h'ekU#)^R2n6y.Ƞ*%mXpz: ^0 hFhN%jL1T$ނhl1ޞԌ.gi_umT7:`(L1 k|Xfn}3Mv"nM~g']UơtT-;Ga#[9!qqِ2 thhPmd`TD߱\I/DDtfAr4q:`2T,2#W gb~O|#ijfmsY(k-Bk 3ey1@޴080T/ Hn^-xU`B@V:UۖU=j UYؔCs֎dzzw㤗Suj`Mٴ *۶8ښψq2X\ /h::0S!jÚE,@@2!t>BE^\Xp/h66!jÚ0SE(8<!t ~E^^ٚŪxcZڌ&Ոza]rж!EF-c ֮ b?(IvJ%!&ɘҌNV Lw~m~gjinu1ˇqMuyDih(cLqdG(ւAh4DxPYsB`lr՛11#C(rkQ~ʃ{Mh/^ ;q{Û>Vwpk UCb';P\E _Qγ0; FT>OR:eX~z}BDf 9aZ;dO+NNv>#pb/Ho{y&lVp9Šm<@ : RVKj!O(pe|aSKt9D@qU:If6qxj $ _`n~("uͼŀ{y~OxCK_@!R/5y6zJ~_P=-NΖA_xkl$WGJ]ӆ DMT57.ݧ*@ɝNq>=9?.pJ~j#m{}·,^7{KX\0h::0S!jÚE,@@2!t:BGb\X0h66!jÚ0SE(8<!t_Gb6 +}U#wGܪ ʯՌtrҷaD0ʼ~VSyJ0vJ=Գd ojEʔJӄUЫĨ e+lk,[v8L. 2puNDt @'jB'2Quo>m@inQܑLUy8BgRE\B!e]7VCAhlvGgL;K5 A!֜I\^\EK0y˳&sSPA2v5dNex.oȩA EYZ> @1K;F#d'GpӐgy~(pLL۟stoV-摹-gvvlnS:6hpe ĒylN ௃ .x E%‡SʟBo6VUˣ\jd<%yƬ48q$2Ah.wxQJgT YPI ʆY lB56X\"0h::0S!jÚE,@@2!t8BHd\X-0h66!jÚ0SE(8<!tHdN IFе?#@\!Yؒ6(FoeMjhƶe\`*9HWm!X(!)VFb@5(nެi|fd@~`<> {@5-X6^ϫ+-F'~D vD+8qvV'հVZhPT[8w+0P^Tns1%r5H U-x-&kaeRW hv@\4<TĠBo|vD)ēn;eKX=jLTp7X*?J͊3.Bw[t2)<>,CQ^=b^K)]3E8j~ i#M-mhրi3&[Y$A|`v d 2 lΰ 3nqŢ7jǹtSH\ vc qϟX\W.0h::0S!jÚE,@@2!t6BIf\XC0h66!jÚ0SE(8<!tIfgC#Zt:$>:!,\-/==B~$xWd?9(}{# u"IDZ}SED%hw~! 5;3;wq&s@5 08tey _da<LVawDṓMKKaQ&qX\D0h::0S!jÚE,@@2!t4BJh\X4Y0h66!jÚ0SE(8<!tlJh *J2`SiTh,͖u솾L-nâElw$nG%moǣ˄ CVn'˄M hD7j;91; EVy@WoN36:8ln%[6&0 p0.v" O$1kX;_wjcNO_?`Hތ=`cv4Y#S JBjhe`Oۘ3zW36uikɐjh)5ۘiBmy[@@W(,ѢG/n:Gx.A s|_BvxH%)- jC-ʺ AL8k;x򇐏B&YָZ:hh|3y y/ȴ`-+NzE NICH K]n]kĸ5s;Wk}+ZqFk<2HjtKE !YhgX\Y0h::0S!jÚE,@@2!t2 BKj\XKk0h66!jÚ0SE(8<!tWKjkf_Tsg%Qnu ǶCp[0ij|bA]Ø!+H!kAl#ڰ͓?`9R\E-ѮthGo@{6Y܃r𹡼%#,$l؝_+2ra4;p&Ag*Y+kwn}} @o/돌bX#4ͬK E؈ߴE|Km'|Y*ِO> 9.;.4]>]}v`+,;T"YƖM`FBY+XQcjw ;u{0Dj>M1 EE( l!]}KAR?\@M̹mu|hgs5L6D9EϺi9Bv=RӄmTPfk-p4m̼*Ա9 EeIc``h4YM#Ƣ_bR̪+A2~XTAC/Er=WFd7'IK HtBuL|YTgteL;JDЄhH%P%_N ъ/lj E9ݮ>zjezRxs>tX\J0h::0S!jÚE,@@2!t. BMn\X#0h66!jÚ0SE(8<!tMnUnSK8(h)'/jh{q!ưZdST^G&x d?MT{\Ɣy*2W/Ua;M <("u۾ϺˍKjjW+St0D頩iO}KIrWQx `V_L{(4Ȅ t `8*SOt=4y?)1ʾ bhV'ы0ZD)! .UjIX~ܿkyxNy{ay)=^{ wr$oxHxkTЫ$jϖm4\pѶB`¢_Y`i|A>mc2"l3zX|OM˽?V~Vj=7FWaBI;fr97]ce; {X\0h::0S!jÚE,@@2!t, BNp\X0h66!jÚ0SE(8<!t]Npptk @Ā m-JuN<!~d"mh/V5?6HFAtBádd!uT`yhNe?A38*;^\f†٩䡷?xE=abm$< n7+pD87AkA}J-֖)(QU Vjŧ EyYe X\0h::0S!jÚE,@@2!t(BPt\X0h66!jÚ0SE(8<!tPtxfo%u6+)ې|dvƚS75/vt;X&|"\tmRO~Ծ'g-տpj6;l `k:89oۡ6sr?q#ۑkMi.l0rP>uۧ˳nw ;xN^ڻ`e^j/=SmN a?Qc M 6g m??s p;9{ᅤoӤVRrY1NtĨsw'ɯIߴm}{dl~5_eYߣg 5QktDh;R,VR xoۯ;y+o-\<O5-kVj[S6FOunnM8Zp[YVnfOz'W7usBnIKp)Aݭ>WtsxPcB>oFrz끙MwǷ'Rju]Yu*{^df -ZcIww!X\0h::0S!jÚE,@@2!t&BQv\X0h66!jÚ0SE(8<!tǻQv,EaPpC>;Ί,0 } ҷ*֤Q 2ALLc'W+xUjkӌ?}nͽz/߼ oݘ8L⋽6(%أ&mO< ƒU]? ~Wa2dCcT!-5z'od-9@Mv< V{4 X[x@~R@2 9;Wf4ґ0iONhd5Zch#0]m7 o:eksRp}׵6CwS m09Y߈~Զyqsb ?>=קebpr{ܶ~~*3I"E+J>m9qgd'9/.ZmVˤgWHJwDz'!E\և`>p«ϳO {*Layc}ߨ-1@-|X\0h::0S!jÚE,@@2!t$BRx\X1h66!jÚ0SE(8<!tRxL-qj~9QB^6<(m%/Wk_(5/a_kh#s!p*adc{n1Lf#hyڬ(׻/v9g$e'swh'mZ@_jo%pS*BrWy&&}0`b1ێ朂}NG/0}H>Azɞ+>,;eId=cG_d4mDF#aH&8m_~ZnhڿV\TFo4+k}06<MmE2}*Fܹ_.m+*m*mli"wZOcS,0Wr8L7 MNRn➚M_gIe[-fjgMt1P#w"t_/%k{؏ax !k #]9;b" y'5{IcQ,Oygd9FVڽ1{\X\$1h::0S!jÚE,@@2!t"BSz\XF1h66!jÚ0SE(8<!tm SzQ9xgl[I:("|zr`dbVNodL47rip +(#GC-1Mq_09Ҵ]4O* 7,mLA|P.$kf<fAi9FX oK9< 56D}=WWV2<}aʶO~^lZXĐC[oV63w^ͩ_Ss YKHv=_ <ѦUf 햙MvV:}ʄSM,^F^X~Vc"q1qAf.&Րu~R{ -Ӟ+oA#t0^]"۫Wy5)A$ђ} t^uߢ]Xj-B~4Wн5(ƢI9c!Uiyq?$ nW O|pMQqyy} L%r5{D fTtrdAFe"sI(ȏY!m&- e_cD8!F K+K\hf.@_Ha D%?z+2 -4m$ViayݜۑQ3wXۧՃ Ԯl |C[,mx,E(ȑ4Q[rX\1h::0S!jÚE,@@2!tBU~\X'1h66!jÚ0SE(8<!tU~G8P4 e pd\]FD 8Y[)DWBO= k|CzOxm ! ӔD $7)atBt|?SAKj"z+dA%&Ի,xjn@Y+oWtP{y Ӑʱ8V *+$ IVx#8Lf]3LӶpteU7v;U.MC*,N[B|H NVu_UXC*17 X&] ܵa&x`0+/50+mܪZ|d2k4qw^zEOr#ch|,  a#UA +2\j+ &icTrثHu^3bvU90[e PUOr:eL6S&9Pӏvw0z[z Q>>̀ow~쮮X ұRa|Lh xuc^A;dx/lg ɓ8 ^TmL Gv(ݟɑ'BZ+ƻCK(qK}di]g: gW 'fG+S 8'=bd,uŰXg͸ )n=Qy^^R ۂ(&X\O1h::0S!jÚE,@@2!tBY\XZ1h66!jÚ0SE(8<!t"Y3[h8oمG~0 ȱE>9HԿzQ/X0/<F+j?obr]bFn3]wga;/@#f{M]߯ |5. +\NggET1*S!IX4E|TRfp#YF:o\*|ɑ$h(j:srC@!pu45UQg<|=|._ea$PKG.}0.g|082N 9/ya-"z VdRa$~MOx8GǾJL lvtvUxNɲybspޚ")NOx+xS^A8 FO d+-+^'[&rְrm8L5B%XA+Â+~Yط=vyчy{pœ VMU=n/`{bX\([1h::0S!jÚE,@@2!tBZ\Xh1h66!jÚ0SE(8<!tZ8aεh'jo3m1}{{k?Vm믭b=Y\uَ̿l&gnE@g_qb *쨯zN1I-jLd~s+OpY^gtj<4&r+YZ_:VP Voܾt.ۦ?m9MXq \ue;ZV?nz;0nrs_C %v_^t)  -ϡӰmV|uKU|?_'|mWIC {-ӯ>VUĊ£snESp]MFGT$;Qղaj puTNwn2_:|<,X!Ɉ|HHLpHڢz=ƣ(`" ݃"p8!}}:?^Ry҄_/n],k͇^X\h1h::0S!jÚE,@@2!tB[\XM|1h66!jÚ0SE(8<!tY[5r}={db!9O1.FڹË֞ᓣNwFSù8 MzEoh8EJ^6'"ۛM p O>5^(lchjatҳF6fxWva9B FH3uEb/DNbvw_EkU )w0x@@y"c !{Lou|>x[FEƌdUKTITqﱕ9Cp*ڗw<|_+la=6@U`5VeW#{d!f~~ C}dW f";$H 1? O53vqV]o6zUQ^-7Wv[wX\|1h::0S!jÚE,@@2!tB\\XL1h66!jÚ0SE(8<!t4\51U}2.(@}wuF股l* VY:lk܁Ta.u>Tft?QmQ's.g|tya{g gu3C db5Y v ]ًp)LG/$CQW-W6"NsyGF'nig v3qHqG8aS܍4W](ު'7 FٝWjZXdg/ 5~y[_Ə Zʧd_@%ChX='6bUN ,n_(P-%{Ň#9ɧ)E)߆wK &X\N1h::0S!jÚE,@@2!t B^\XL1h66!jÚ0SE(8<!tk^nģłl{\7iEfxmd/_kk]3[ ыsF3 pӻ^7 q8쀊)[ =cnA:t L[V~G/Ã^,遽UىW{9Ow @DYB?, er"#(>0_ӳ }> ڛ :OAy˓Zla:VlI0s%}e(gc?eGo"nG&RѶ_E }L`UL=b5UWr$=;3S,UT_pzq7uwƸ~̆ҏ1qM})xN/-%YcOkE'͍.H乇&ks@Pm^_?%̦(v8^*"\\ C͓juYQO5U9\nqW|߫oep݀A]>QW=(Q})vOh3n-<"5d hW@Qz U>pI]g߈m>8=t}0`n*m!{d( ^ \ج ۾GzIwi[:{0c$\" ѻd@ӄUX\1h::0S!jÚE,@@2!tBb\XJ1h66!jÚ0SE(8<!tbH{QlXڈ؊;2+T2ۂm6ip*cP7:N.x.qEu}_j3W[e4ZiiXJkvYy'*]ˮ. s#SCUE#]C W7kJ2UclfP:^Uk݁D}soYiCbew:K5YjG{]}ϯN?ϫ?7ڇ+^˹TݧϮ|z3KJfA970WA1K90.eW 3rz B؅r7 Y*%&77tXKn*1b AJOtQ`fvﶻ06}g7ߠaLhYlw6XxzG9?UMX\1h::0S!jÚE,@@2!tBc\X1h66!jÚ0SE(8<!t&c_[WbYJYkw}V^DlkY: /go.>e ߍ߈mmn]ŋ,n)vt'*^Ke٤R b'3h?[df~l$xrpmt0W]epacXnnBSp-*K ~9KnKO\/6`>d_Ѵ 6a$ fWq}mZ7&SʩSBf9Tg[F}݁ h2|]w.Gw$R=w@,JoaZLee|eEoQNyIˋp\=@7W' o.:M~ 1کwfiF9Jǖm3]>ZCK4v.[e*?F8JS> X\1h::0S!jÚE,@@2!tBd\X1h66!jÚ0SE(8<!t/2dUAlf]`&%0"q4u~{}iL7"Y'?fR,"0gy}^8GKRV1K#9b#t]~/Oa Wm>Ja^0xZ$qtiisO'pl6?\- |vyuy:^^_\_eG?2WIw0lVWB԰bIݣa#xGܘ' =Ԇ*\ȧ6H#;rD+򮞡^xM졸}:z%\qc/fWwe@CdYfY# af>`;w^/ܕ=cFѷJ U*ெM./^ LW+嗋$s$n' R8$0m .8}aV?S$Ho&%q_*)J2e#yS4H}FX\b1h::0S!jÚE,@@2!tBe\XI2h66!jÚ0SE(8<!tde#7@G`"KFr~ ~~<EzݵwoքӚlKfb%ƒQ.l>IV( JIӑ9,hK 5@MPHpT€\n L]9l}1* J)%3Ih $nf |v4_-/8ܯ߶oz(,|~9cab6"7p&9=8:V,c_|m`PG@ m TS.1AלoiRgc斣)bu_j4wq S=;@}M6a;:%N;@@dd~Lƾ N9];fa!C 3DMd0W3p&OoZa buKb:TX *p v곂&4|&`/f` Dv%`F>6 7$tNH J@lCPLPL^LRI&&3X\2h::0S!jÚE,@@2!tBf\X2h66!jÚ0SE(8<!tLfz,nlWw;bgpWPzoοΰG_\Dq|δ鼼'>|fdkz,{^Kϛ B0'p`mm}vxޚ56Lޮ;ݮ j,M8uP 8s]zO2^E>rKhewxA媉~e%ry`+@`10NQfZiGdr < 9J8-GeHAa -/-ߺ]-Y0? `ZkfW]wo޿;I7Lhs+\Ey"9\GI|) ?\u۬O *XFYT9_BK7aEWŮ<* J/vOn蚒w@!BU?箁HlŻ)v3k,4B9,2*(&GX\2h::0S!jÚE,@@2!tBg\X*2h66!jÚ0SE(8<!t4g]/R)wպ1溹zk5!<|{hb_`~5ұ(m㢌S3H@;t/}T%3!jאBj8dl1"Lf?g1G1>GܯN2:OxcC}`PW+ /)z>q96ЩSI04T$ ,7>XT򡣅$bXa)8.tNtB,,SKo?uqH\L$X\*2h::0S!jÚE,@@2!tBh\XOB2h66!jÚ0SE(8<!thp?"dw%zˁr; >4nb`zi=$XZoE\`IUE=:m{m[o%`tY{A]e2,ỬZ@RyZ{oތ5=xBQBGK1WO)xDd KȢ37?9VcN%g6op5c̀XVrhҒ6Ih oS(G@B>B# .UTTh1v{_|o quY/nQ2'>F'ܘ`MVn Q 9n03/x3[ If,p[D H[V52`K4]=i7KN\vds0rlb`آ D]7UON5DP``jac^İk&b[ĴVYٛ-2.E!Du;;QTώys=b: lSoh< 5H`> HuPȨ%H"FvoHج^oed[?JoW-~G~֏ ֏q_FFD*h"'Tg aد~~$ l֏C22%RANj _!U[?6ǡ[֏;Uӭq_5a0Y?Ȩ~HE߮Z_U~$ l֏C22%RQ뷪Эq_5a0Y?Ȩ~HE?-rD~W(}%=g_G?Ev_Eգ)lNm~yWm_Gb>m^0x퐞1_ɷ~el`y+lCz6WH|%|,6߯X\O2h::0S!jÚE,@@2!tBj\X$\2h66!jÚ0SE(8<!t.jegZ>6JO'м1X{ ScqQdDa)7|s؍cܺ7AR `3~.GUt bF](7A]3z<lDCųw:sW+a# :=[1ROdhM_=WP` 2=GQx![H]x?Gg"l@CgB9$~ 1gO$488eO41Z.cթrMֺYabb( *QǠ b샏%|vweOzF[G{ ^d;4wkOz4Gbe.Ҭ+r3?nEaz"g^=-Dv@֦5oߛ`&r\GPUV#C"=>]s}xFqi \dܗcmK`6ٺg!n^X\\2h::0S!jÚE,@@2!tBk\Xh2h66!jÚ0SE(8<!t}Ek>^;voF7g4?ڿqo7 7wұG(;/XPP!jFQ 9>P5ޯ=XmA=f ۸Pؙ`u ['Xn\dp+3eUz.1~ _e2/SݪUaPF]z16cx&Cl18C MYdfv^ ^qC! eZB6 +3֏yՐ&kq`5rHZ}Z_U6^,jѝ$"n#5ֈy-f$h%#A+Nȉ((^#Rjs"$YZ, \AY]!Nځ GZT;'q=ę4 <I rkW륾v?C*UxׯAy;{3u2:2CBć1ifa~11:u vxwX\;i2h::0S!jÚE,@@2!tBl\X2h66!jÚ0SE(8<!tǝlFv$XhX^MfsthskacҵUWƋz}EKO( %LWz<pPMoKa؁O2N⸆KxDH(>xU*8f+0!2BE֘iv_г""ܵl7*-lcQ?" kq<j~4,uNp-l6:Mn}S1"Թ g" lQ[^kԽU<ʵ![5s+U3zzyt:d6R6@Qo%1۫6}dVDW~+fUŦ7(̪(Fs )֭kĭ\ެrp%aV.6lX}xJ1^$[ASf*EO> au{=[km3Pgm }\p-1ZXB7|RE$G$֢!2룾,{hs糨QX\t2h::0S!jÚE,@@2!tBm\X2h66!jÚ0SE(8<!t{m,"h~ƊUk橤 V4{yכKn31ޒqi0g3? Z]2hdVoHx41Ny5Venد0b~Ƌ^[oQF5`_bX8TTHlEJk? bě^Cv`MP Zpٯ}]) ~&th: :ƢC~n35Y4d,3Tx+2H n ЌhXB.ܮm/OF˦G)j-l.[ +NsV+ dp^ɩA}!Ǣ׏! NDDҏѰ"^?ѩDDz%aA4) 'obQ)qq1&6ZccWQA{HM .xT&:GmuYX-tҹ&8Îb//\lcYrfyy'X E^Pyڢ ,>- wtٜR+X\2h::0S!jÚE,@@2!tBo\X2h66!jÚ0SE(8<!tLjo"ryhJ^Nw @"Y;t8&v[sV\#Gw XERi&YͳR(v%N)U[Te?='@To cQެ1bc}7ٻqVv8a% %!H/T rR>+࿹9Vf> K)n3okSgˤ)tvzs4Um{8 O"(|d@Bjj*'"iT*O{zk>jFvmEFq ŸEe`Y.u DbĪaMV:YQmbzR&d}GedKOstP)ߘ~m4B/V" >uWpOwTf9=_)PklucM޶&KTo>EPrʽs[̾@sX\2h::0S!jÚE,@@2!tBq\X2h66!jÚ0SE(8<!tFqu2Њt;;"eD7)&qb;  zvp|_x.&{L(Dž؁-R=>&IUn>OK=Gwe4ʝτ?q>OG¦0]?<@ Ty?QFPa'j^S~a?:'_7Dd_pəug? gױ#">OV1ܜnɢdWIg>x9xX]`wф1oxK5ޝ([a`X\2h::0S!jÚE,@@2~!tBr\XJ2h66!jÚ0SE(8<!tWr$jw:x79AfoxKh5޽([ak X ^`-x` -X7-7CGI^jUC¿Qr.Wŀe}a~QR`B +~-ff49R$A_&5axO @kŒ'heKS},fY~cA8(QUaƤvފ,OgϠq:Knis6'Vwp+Ԕh a]:1^Gkؕ/sԈ]|~I1jewSk*"7Tkخ|D=4}wDd5To|qE=3>z~;wCw66~g7tqfHI-dw#w66~g7.CɊ}7(zWՑF0}m}Rl( (8x Zц9iaiFӐaHy"KX;Y0}F`HԲ|_lʚDPɑpﯭ7{axqTz1</Ÿ1u Qo77SF9oP-U7K܂ ߔI@lQ;i;6):ys ߔ7f[ո 8^GLvBR->~DL9=/>?Orj>k/ߗoOϝ`Gߟ;Y9[=wrG6E$vY"eQtύ}܍2 g/ًp ̈́I_<$ ?BvQϪsҊy){t~YT )ʦ*2O. -=Yk (SԫT [Z# gJ훽r ~C,dLbv yK'R)7QI*YӶ@UFw!ibHYHrz{"4z*/Xt"-ʇU}K4Һʝ9/כȻOWgOxxz={~xE#t*reS蓁Iw Vfqy1}qoE6E>|A*WC+X\3h::0S!jÚE,@@2y!tLBw\(3h!jÚ0SE8!tXwE;$UT +5Z@!YD2Cjg)XJAByW3KW'iN) g_?blf/:V/f_loWծ+./.S.+"q-#>}\Ga)ow@[1W4tBK=SbL:(խ(E(j*k\/l׏<?&?'A w'$W_>h?hQȑi$s}y~^s#+Gz6u m~gPKn<~o0$ Basler_Ace_GigE_Version_3_0.xmlPKM1\~X4h::0S!jÚE,@@2x!tSBx \\^d4h<<!jÚ0SE(:<!tx\Xd4h660S!jÚE(@@2{!tTBy 4X\p4h<<!jÚ0SE(:<!ty\\p4h::0S!jÚE,@@2v!t]wBzH \x|4hVV!jÚ0SEH:!t4$zHBaslerx\|4h::0S!jÚE,@@2u!t]VB{h \x4hVV!jÚ0SEH:!t4${hacA1300-30gcx\4h::0S!jÚE,@@2t!t[B|D\\̔4h<<!jÚ0SE(:<!t|\\@4h::0S!jÚE,@@2s!t[wB}d\\o4h<<!jÚ0SE(:<!t}\\4h::0S!jÚE,@@2r!t[B~ \\54h<<!jÚ0SE(:<!t~\\®4h::0S!jÚE,@@2q!t[B$\\4h<<!jÚ0SE(:<!t\X%4h660S!jÚE(@@2t!t[BDX\4h<<!jÚ0SE(:<!t\X4h660S!jÚE(@@2s!t[BdX\4h<<!jÚ0SE(:<!t\X4h660S!jÚE(@@2r!t[BX\4h<<!jÚ0SE(:<!t \X 4h660S!jÚE(@@2q!t[B$X\4h<<!jÚ0SE(:<!t\X4h660S!jÚE(@@2p!tZB$X\4h<<!jÚ0SE(:<!t\XJ4h660S!jÚE(@@2o!tZBDX\2 5h<<!jÚ0SE(:<!t\X 5h660S!jÚE(@@2n!tYBHX\5h<<!jÚ0SE(:<!t\Xj5h660S!jÚE(@@2m!tYB@X\z#5h<<!jÚ0SE(:<!t\X#5h660S!jÚE(@@2l!tYyBdX\/5h<<!jÚ0SE(:<!t \X;05h660S!jÚE(@@2k!t]WBX\*<5h<<!jÚ0SE(:<!t\X<5h660S!jÚE(@@2j!t]B$X\H5h<<!jÚ0SE(:<!t,,,,,,,\X*I5h660S!jÚE(@@2i!t]B$X\/U5h<<!jÚ0SE(:<!t,,,,,,,\\U5h::0S!jÚE,@@2d!t]eBH \xe5hVV!jÚ0SEH:!t4$HBaslerx\6f5h::0S!jÚE,@@2c!t]DBh \xr5hVV!jÚ0SEH:!t4$hacA1300-30gcx\s5h::0S!jÚE,@@2b!t\B\h5hFF!jÚ0SE8:,!t$21025233hX>5h660S!jÚE(@@2e!tTB X\5h<<!jÚ0SE(:<!t\X 5h660S!jÚE(@@2d!tPB X\5h<<!jÚ0SE(:<!t\X5h660S!jÚE(@@2c!tPB X\5h<<!jÚ0SE(:<!t\X5h660S!jÚE(@@2b!tTB <X\j5h<<!jÚ0SE(:<!t\X5h660S!jÚE(@@2a!tTB @X\55h<<!jÚ0SE(:<!t?#sY@@@@@@@\\]5h::0S!jÚE,@@2\!tB !\\85h<<!jÚ0SE(:<!t\\5h::0S!jÚE,@@2[!t7B \\x5h<<!jÚ0SE(:<!t\\|5h::0S!jÚE,@@2Z!t]B\\=5h<<!jÚ0SE(:<!t\X5h660S!jÚE(@@2]!tYBHX\6h<<!jÚ0SE(:<!t\XV6h660S!jÚE(@@2\!tY!BX\i!6h<<!jÚ0SE(:<!t\X@"6h660S!jÚE(@@2[!tYBHX\B.6h<<!jÚ0SE(:<!t\X.6h660S!jÚE(@@2Z!tY#BX\:6h<<!jÚ0SE(:<!t\X;6h660S!jÚE(@@2Y!t\BX\G6h<<!jÚ0SE(:<!t\\DH6h::0S!jÚE,@@2T!t\B\\S6h<<!jÚ0SE(:<!t\X{T6h660S!jÚE(@@2W!t[BX\d`6h<<!jÚ0SE(:<!t\\a6h::0S!jÚE,@@2R!t[B\\m6h<<!jÚ0SE(:<!t\Xm6h660S!jÚE(@@2U!tYBBX\~6h<<!jÚ0SE(:<!t5555555\\@6h::0S!jÚE,@@2P!tPB5\\)6h<<!jÚ0SE(:<!t\X؋6h660S!jÚE(@@2S!tY|BHX\6h<<!jÚ0SE(:<!t\\O6h::0S!jÚE,@@2N!tBB@\\6h<<!jÚ0SE(:<!t\X6h660S!jÚE(@@2Q!t]B$X\6h<<!jÚ0SE(:<!t\\&6h::0S!jÚE,@@2L!t]B$\\J6h<<!jÚ0SE(:<!t\`6h>>!jÚ0SE0@u!"NA`P6h..!jÚ0SE @t! a} ,AN"P\6h<<!jÚ0SE,@u!\XYCh660S!jÚE(@@2O!tSB X\̴Ch<<!jÚ0SE(:<!t\`+Fh>>!jÚ0SE0@u!#`P5,Fh..!jÚ0SE @t! a} ,§#P\O,Fh<<!jÚ0SE,@u!\XORh660S!jÚE(@@2N!tSB X\>Sh<<!jÚ0SE(:<!t\`ghUh>>!jÚ0SE0@u!#C`PsUh..!jÚ0SE @t! a} ,C#P\ZUh<<!jÚ0SE,@u!\XGbh660S!jÚE(@@2M!tSB X\STbh<<!jÚ0SE(:<!t\`dh>>!jÚ0SE0@u!#Z`Pdh..!jÚ0SE @t! a} ,Z#P\dh<<!jÚ0SE,@u!\Xqh660S!jÚE(@@2L!tSB X\qh<<!jÚ0SE(:<!t\`+sh>>!jÚ0SE0@u}!#xE`Psh..!jÚ0SE @t! a} ,Ex#P\sh<<!jÚ0SE,@u!\Xh660S!jÚE(@@2K!tSB X\'h<<!jÚ0SE(:<!t\`5h>>!jÚ0SE0@uz!# `P^5h..!jÚ0SE @t! a} , #P\y5h<<!jÚ0SE,@u|!\XDh660S!jÚE(@@2J!tSB X\Ph<<!jÚ0SE(:<!t\`zh>>!jÚ0SE0@uw!#%_gG`P*{h..!jÚ0SE @t! a} ,Gg_%#P\F{h<<!jÚ0SE,@uy!\Xh660S!jÚE(@@2I!tSB X\_h<<!jÚ0SE(:<!t\`h>>!jÚ0SE0@ut!#,`PIh..!jÚ0SE @t! a} ,,#P\yh<<!jÚ0SE,@uv!\Xh660S!jÚE(@@2H!tSB X\+h<<!jÚ0SE(:<!t\`Hh>>!jÚ0SE0@uq! #4FI`Ph..!jÚ0SE @t! a} ,IF4#P\h<<!jÚ0SE,@us! \Xѹh660S!jÚE(@@2G!t]tBDX\h<<!jÚ0SE(:<!t\\oh::0S!jÚE,@@2B!t]eBD\\]h<<!jÚ0SE(:<!t\XPDh660S!jÚE(@@2E!tSB X\Ph<<!jÚ0SE(:<!t\X{h660S!jÚE(@@2D!tSB X\Ġh<<!jÚ0SE(:<!t\\֡h::0S!jÚE,@@2?!tSB \\h<<!jÚ0SE(:<!t\aravis-ARAVIS_0_6_0/tools/wireshark-snapshots/Basler-acA1920-5-image-acquisition.pcapng000066400000000000000000060162201334570641500305570ustar00rootroot00000000000000 |M<+Linux 4.6.4-301.fc24.x86_648Dumpcap (Wireshark) 2.1.1 (Git Rev Unknown from unknown)|Xusbmon3  Linux 4.6.4-301.fc24.x86_64X`9@@jKS W\ ``9@@AS W_ 0``9@@AC ->W ``9@@ASW #``9 @@AC->W ``9@@AS W 1``90@@AC ->W ``9]@@AS W ``9@@AC ->W' `h9FFAS W- 0 h`9@@AC ->Wa ``9 @@ASW #2``9@@AC->W ``9@@AS W 0``9<@@AC ->W `h9AFFAS W 0 h`9q@@AC ->W ``9@@ASW #(``9@@AC->W" ``9@@AS W, 1``9@@AC ->WN ``9 @@AS W ``9@@AC ->W ``9@@AS -W ``9@@AS W ``9~@@AC ->W `t9TTAS -W Provoke Pipe Errort`9@@AC ->W9 `t9TTcKS -W Provoke Pipe Errort`9@@cKC ->W ``94@@fKS W ``9m@@fKC ->W `x9XXfKS -W U3VC@ x`9@@fKC ->W ``9@@oKS -W ``9a@@@bKS -W ``9@@lKS -W, ``9@@lKS -W ``9^@@lKS -W ``9@@`KS -WG ``9@@`KS -W ``9@@`KS -W ``9@@`KS -W ``9@@`KS -W ``9o@@`KS -W ``9'@@f^eS -W ``9@@f^eS -W] `x9XX@e^eS -Wi U3VC@ x`9@@@e^eC ->W ``9@@a^eS -W1 ``9@@@n^eS -W ``9f@@iKS -]"mx9 XXmKS -W U3VC@ x`9 @@mKC ->W ``9$ @@j^eS -&>Vl` X3}$9mo`}mݥP# zgmNy>A67:+ۺ|;=3ޚYlziގ/k~e!̝.MMܒrݞ߽ʉU>hlA@B&o]'ޅvFUaERg K^:X;g1dmwqvQ?r#m[y~Is_; qmXxuĎ///~vnBǏAp|~.j?N_\zl'_[7.s7I?HܕO &˛;/"R2׻iQ:6gE]Ce|d /ڮXBв:ezMܧ+^Ir ' -Y[Bz'5kw!Y uPr;%|tbvz9f!I{ mxMhPܮ "s|hzI94{j6<2#<.^~ x_oȑL/OevQl(`x9!XXa^eS -W U3VC@ x`9!@@a^eC ->W3 ``9!@@@e^eS -`b[rU7AI⻗֏/n5Ya%., a<ڄ!;/Fxx>G ඹ_x×K kJ 8^w@cb5EPPBUB-n%PI8Ի ;pjܒq%6߅!aðA#=ռI rmj_LG,rXOGV+_^@Ȏ4);Ș&iJY#/?>?#heGv|NCfv>P~~~'w䶩ip:~S'^& S|)<yu1Cdfõf{[g{pƒۢ㕾VϬIZu8އ\[p iXf*瞪*f/K,6 W$"/VΆWϠfd?_DOwʶ:YFmdeHuȦy`x9#XXf^eS -W U3VC@ x`96#@@f^eC ->W ``9E#@@f^eS -8UųVUCQf.Zd*?h՗1^ OF^n ކp I+ڈi(wk+';:1h2ߓ_%I? \ 챲z|D;e*K| 84ad=OZUuxQ)d `N&d 펌&;ouFD`*Qūl8R$E`2Krdo,!1Cr:Im|X.si2 -6dT# ,kr >\h(y:x 9AxK79w(]R`!h?oLg?==gᙄoI(RSq(j^U KĨtz efBƙg.xUiЀz2JoDct4av;=F3@ +XGx luBhw5Ew|M,ݐ/>ؠ' bȷk(W͘KV71:xh`x9$XX@e^eS -W" U3VC@  x`9$@@@e^eC ->W8 ``9$@@a^eS -NkwCG' 5+݈nP y@/)6Vtlѭ{V |Uflf.c$w9# [2FwtYBu:'W[5og[k_YaDe_֝,)TRDt %sd\hD]%ީv7b :dn Z jn-tKU-֡B:1%#tN>QC#j7lƙg.ۢkϙp\{΄5҂9rD qCPS4v >KSOw@FEn!m`*8$N9^#m/>{gg)Z@d"">ri|S_@u̽AS'_3|9p v<x,P:_WR7(N2.]Env][ʉUYpo ] :5ʽXP?_ny0xm/5RG}Fhfx^g۷BpW [wWn\ou׷|oF6DOe5+=X{ K0t<va#__0rNZv|}u׌$>{u%M^ | %-_?ƛ_;UZHƍbzrj\_Gze u'O/}qRw"-cBq-#I# 8BՅ`x94&XXj^eS -W U3VC@ x`9K&@@j^eC ->W ``9Z&@@@n^eS -?d֥^a%<9kd>CrE5zǴ\"T#E۬ NU>RLvr+=; NxLG"ԙNugfvg5R?>U!d|SNmv́jT:䤦G2/>y.0ۆt0_Y|rϩo)qtVeBp.w0q_$F g0G} D")88HR L׹D$6"+pwV ŦEZ?'UPs;=k gvmT:KKءc& '_L5|F~v.D@چ{͢KIC1b-.7~ a.!OM`k>xfW?2͍/^j@SSU?Q\^ш.pMsĩU7˶§ aYⴌ&y_pJ> |oH9TpJ7xb!/{5^h:XF[F >6yì>ј2#3O 7ƙKP@ =@Hfrdc]h8_d`B-W+]}zC9՘i2N~yҒؚ,{>oȣ&ׯ ]jz}&t:9u>s<\7y̹nuǜ)dUÜhFPFwi4LѦj3| -[!?ra98!U=D~CP[&s;ޑ[["C"o DG[bCft5<]`/3tC `x9'XX@n^eS -W7 U3VC@ x`9'@@@n^eC ->WK ``9'@@j^eS -U19k }_chU,X(Uo S0h.cC%N[ǝi SV+EM]g~=SzM=|u3; Eɝ\-QlL. jo"'sc,ܺNkKʉ7t7'^u:y[ٺQf*Og8Zk5?k }_hv,v\K<Ǚ 0?'q !.pS?7 *s57)zBΑCh`xA{7p19;pĵVբf.{cDtJdW蝷1t&9 n0&& g@:O5W%7 {a[ -x: aeX]-w&G*Mn},]!Ü2)!Üuas8sPN4\PQnBOv}X9\i *-DVa9 tsR|#f3UɰVbU{([)XXmKS -W U3VC@ x`9O)@@mKC ->W ``9])@@mKS - ;`|w0%^Pm捿2[ :W`K7G˒IKAhqц,y7"->[2c$2|j@lw1̗IdlEZxZh;|$&j`M8iAaj7qxCB?LED#<ѦeWN h wPsH8 B ࠄ֐,xmJPQ~:^d )vtchEPGNU hãhѶm$Mh>Ô.7|w}-G]z!Ծq۸18Vni\]k WW"p-jR Zլѹl\]E eli˶1KsuXmp/e@?Y325s`>0!y2P6O8I2V Ǎxwm1lKWf5?c5+gLUeP@Yg 3֐?l<3"Ɛ z.eP@Yg *3vyإ;v;o3f6WKg8ޱKw첋wlsSu :k, KHu:\a䍠RYjC˔"T`xQ}~{u* I#C x CSֶmTU U3VC@ x`9*@@mKC ->WS ``9*@@a^eS -ql Oı9N!$C!^)k>ĭ &._>BN|WLJ x~NK~سR7d: ]*1-6 x j%а4RglLMCAo{҂󛢅0|ֱZ 8G 2"a E[oaQo pCֽ/x%^K:AZ3+{ KoQ0Kr\ eB@a-c =| "(H 'q6dݵ0r5Rfq3 ,ha됗w/]h k̅ l [2FQN.–AV`5E6>W/. WփJE00\];pp= ,dуx1|@ a-I~9MgXSRoP 6: ce pazBzR6:xk_?{~enmȷb`^U-rRJFj4l"?f5U*ӥV~E0Vo玤ck:v;_鸭*ѱ:J1qU;|F{M>k*R CchH'C8R$%0|7f'UitYZ."BUD̊Bm (̦ɯ[#MyVh#"i쏏r{ GRL£|RٴŸKb7)I"F‹`bݹIWXy]9zВ`x9C,XXmKS -W U3VC@ x`9X,@@mKC ->W ``9i,@@mKS - nWАN[PMO?=Kɏ?ӤYw˟r9)F?m:|-r_Y5+:.}l?]l:hi&lq3m tg6ǣO*}t 7AsIT2 #Eiq8>u0lnf7gm~9[l^+g'a>FqhYC886-8/sh"ESxTK:غ/"5=O{/{K7=B2SꐉU͇+G&֦YHLJv-~jo֨Ew{,_+H c|x.ȺO{˵U_/w-iV4fbg[VPpVuHXSBGڹy05CF8AaKfQ6# d*sq&Ys=z9t [9S=`&֠uC!*Sci̧ t$ko^|z{]g~.t팄nhҫ[CȼáUZAўHZ0Eɟc tţC,qI`x9-XX@e^eS -WT U3VC@ #x`9-@@@e^eC ->Wk ``9-@@f^eS -(-'6bb90g_*c"^ѓ#s<+?JͿh?||0FO0?L7^?GZ`f؏hTO^/[)\7) }sUν>=;SC{N0M[|FlQ"/E S&m^wbtBz>gE>[yM>j.ϞA= ?_pc&d+ՙ%:/ε襘^A,v7*en>VY.]+ ra22p~>F/u[a{hZw8e1@)%ZUcŕݭ_?cy*i_[M4ґS'{.Sj= t)Z/8Lj~!BF3<u2^zDJQea3C*EI%w4O`x9Z/XXmKS -W U3VC@ 'x`9n/@@mKC ->W ``9}/@@mKS -FaiF".U4VՌ&AtJ‡A%EWa&ZA4'ٝcZ5wΘ{92!S+=HyҚX/(,vXA vtJvr^1;2j_,\ZQWpϖBQM/_G&-FZ׷/2|Rv.~pJIEjHc䚊sټbp(fho ^C-b[fٻ/7ejaYmbDA(^=ز-39;އflV~2rIc҃!L<߇4UVlRÊ[4l;@Y.8%%VG%#=yIi|-GѵHl ,.?B]c:]=0z'PCuQ%^(v}c6ddr/Aa:OZr*i*tfdIe3*#c[M˥Klp2$NwLzAZ8]aP"Ji{B)@-n%2cܒīozjl,>R`x90XXmKS -WZ U3VC@ |+x`90@@mKC ->Wr ``91@@f^eS -ĢtVMݍ߲K!:rڧCsIGoTDQ Du9%|>{J3IӤz7OZS k G n'',\JiwWQm +m?XKіc=.B1@ݧ8쭺λl1xnMm@*>?d໤6L,;XJh)d(P^]*9VՒ ׮ KZXwM%Àe.(Ը+ՔHHB3c$2;|9L5%tG3=yx$?rvmwlօ p%1֑ުuʑ4 ($5a"pKp?wЏ%mX &̬D уjn;aA-3EmϏKn:uN'1YbV%Yy]4ń_`x9V2XX@e^eS -W! U3VC@ p/x`9l2@@@e^eC ->W! ``9}2@@a^eS -r 43a~F 2 U^`N}~PyE] sb`Mu Ң-9~c:;FM[,^^Y`$$loLQáE.e5UuS[%y0;Pw5]M8tW}ƺ Z8dډ}Đuj"t*&uTdryOkyUQ8K-zYs :论5KꃬVZY" BLLU{&m8wJ>&9C4·Vs)2e>3j(U@r\`M13bkZhq{'nW#=&0v%^uydB|#k&C!ea{]wD_F+Pٺ>]槤ܘ.$/%Jx D|e?/`՗n#}>oC,Q#x"T9P.U,&Ř(tn0!ӚՐwq@g.`C遀G:64 kiMsD5(eu|J7( ;%J=}%Ӱ>_>ݺIWZNfW4 6ق"&h$:d;>B8Mhx);GMB#`JZZ^Bjn$QozDjh@["Gh3 Fa#dx uVE#6<ºk?( jDֻ=MGPxeqH< n2<Vߡ#6Wo# ``94@@@n^eS -ErUBvoU҉T+!Ƽ%+++(Lw#\nD} *&VueSgKѬZܸppkX.8O=@EidcGmҺ5_uy{ w$P6GboUczƅ^YQn۴ 6p\PPвJJiC$""H|DZ{IO0%5q?#zOsmK3Ѯr 6aƪ7 acEd~%bZk% b;{-QTDE`@`Ȱzz 3 A]xd TR#rÈgF DZqDZe.s""OZ2ur3^2?rU"ǏΩAY>\κ~ò-ccxcc i>S*1U*|a 48&&mxcƜ!/`x9l5XX@n^eS -W$ U3VC@ X7x`95@@@n^eC ->W% ``95@@j^eS -7m #G%YkHT"zX '$F̙VdCBlkc>.0~cW>c3ӛӬ>TW\-eGT;}2QVv]{8S)?G5eu{%ӔS ݭ 7Nh,OUA [)mEQ4JBEx%”Z0T1ZٰfM2Kӗp^c9dX^oPD"ZrBH``zE GJ/SgDrLO/} u>,cJy 18hX4Rq92n{?:Qfm *X}G6q!H(+9 I$sb,!mZ&p~dZ5Re#М & cΙz7_~8%?1(MJE"; iuɿ~~im Ywm,AgN0,溜;'Ndo_=nQ6< "ܧ s͇SWY:8;b(ec3 y15_+j| -EkآO/>9+?o6.#p$>VimJĉJ.8ޚO&yR4.,I T%IiIJd_)+G`x96XXa^eS -Wn& U3VC@ L;x`97@@a^eC ->W& ``97@@@e^eS -4:)VO NzH!}渍)(M斌LӚ̹nocit0Xl -IsH ͸)=,MY:nDV\9'}[Xq}la-#` kݞ\u*%R*!hyUe/긅Rusɷg1\:i$H'sj$YY_VRv-*=2h=-}iCfPuD'y=u Na/tÀ827n}][N4e TK斯A5ĕCjmظ[Ρx;tA(9'i4p=@G?6 # e $ŠijJ[ ŔՔ*u1J+m J7?}@ 9EI=G} ;qvFe둏z+S9OiV尨 !k_)ĴMhf+Zr,W^CrxqU͋S"CL\JUj?US{KPS(c2m%䂠;^GLY<֜z>W( ``98@@f^eS -nH G)Rj[1-Qqd4JU X Ӓ4c&욂̖(RB )(>S8"b2W-+ỉ-aN*{eD{^6(diq1DeMI4q$0v;y= CXa4FiZӺ{FugC-A66M^xs0td-A|F=>ƙ@Oc1kmLegZ>1wd }Q E=$(X@ x sꝷAlGo<aeF{PN"j([aPZGs鋂&XQ/  5lp;BS8!o7><.BtP|4QIr&&u  nE%IG$i\(LMA")Zt$MM<5=6IA;X5 \md>Qt@:~wECtیp=d>\l@>k2Y#8x<6>-Sh.#w;4XuH!\Hطr$cK6(,DJ CiiC/DGr$!꽝_OJX\wdKV!XV!]slfaY)]3w;-ΐL]Ϊr98zLU+G1C ~03 +gኦ3Mg5Lʕ[' 4ÚZa\J3鰆9jV(KPΰ(xT[ `A FGg~4ÚZ{"qUhfa s P0Zc5v1U78 )\*#_kA6j0е`x99XXmKS -Ww) U3VC@ 4Cx`9:@@mKC ->W) ``9:@@mKS -O9}rI9ṟdLK>[kiU`n%qdW+ ``9;@@a^eS -hVQaWbb@U-& L )xO])dpNwHƆвJVd9Y(t~ucQȵ r"OBݻJr21t>KgORHV$~R ѣ~aqe CT2K>6ѮZ^rFBڷ$NS8PV$ݻ! E`#ŀ_~_,e2_~AMȇ6 PJ:g(`l``잜Їɩr(`]y@[PNDN[ul~JWw2Sr]Ku@R ]{W7!lO<H`qowXW!5at$ϟw 7ҼD/0IdZk[&j7Nr@;9`Q;?n%mnQmS)}󤛽>&EM{ɖCy8@>2rl̺"@ eJ&YP0Y@7+AP?fbw6WWi"wO]\^DQԎ)T$ XrR^IG5^cTN*FK|^:Z0pBgObd&J!+GEw/< WTB c@9ChiW6b>zZ%&+ vA[|lqY`>bd[[W&P&kj%9dN d~k`x9=XXj^eS -W, U3VC@ "Kx`9,=@@j^eC ->W, ``9:=@@@n^eS -@@@n^eC -W. U3VC" gw%c: o2[F ֮`Se5½1v,+tŇ1EE­h]:OYX xg/"̀ug8)[Bz%^O9n1nӚ=w2ENdvtOl i4.4."/(xںtqCAٔk칰?^D:%_RU8yY h"U zT x}qVq8 g[*: 5tK7`0s3馴D5&Мvm{o ?ʋ9ϕ,_Whҿ+'/ѓ'?2 l|zF&``O/'6~hV1m^fZzT3JeW1\UόFHUs wQhWA}&^72oHPfƑ)J|7,n鴦Z`]V&*Mbe,#8JGpy52+2+2W^h1Z]2%jݦ~DLGOA>BzO82ISZgp?-b\h;/v/K?Wkd YOIrBJ\ze=^@r6T\]% }}S1|'fȀCXX@n^eS -W. U3VC@ #Ox`9>@@@n^eC ->W/. ``9>@@j^eS -NM<X݇!=AmߠyTuI0tUx Jb"nҧ VX/Ip'ܽAyo$$Y.ZteNU)+hK(sevG"h(S.}q]:Wz BT6Xa%/ 4k䫹^_(^_^_(^_(^_4rh%Ʈ utYS8̍BٍK7ݸ/sPvhߍP7!=2 E U e en΅Я%vݻu-kw5S͓wsc=>kiO=N[kv3nӛ{~߶Ap76'!-cR_׫O\B+:Slj/}w6e%f%ć_nx1cpTn2%l lIV#T ~m*luh;'n]'$jz"_҃g%*9Ir1_2h,'@~WB1r)+>`x9$@XXa^eS -W/ U3VC@ $Sx`9/@@@a^eC ->W/ ``9?@@@@e^eS -dSS*B5_ߕ䙎qK-Jձt㵷bg@ʎ_{U /n,sP*2(BAZa |VUs >6V`GdȐ8Oj\ tD!x'.Bh|~ܐ-R}[԰)GE:Z%5P$.Uѿ@)Z L : nu9@#Uˡ]Qb4 X"tQ&`1; TXCx`,QQ`D`1ԄzfJyaʽv^ظvZUUpؐx{Sww.{ 4oAD G򾂘䬟kޑ5ynvK(iI{XӤ٭cpAhGT%@XHדp4p11;;He^@gfANm2nn)EaGJ L С|IR/I)62UxyO|[knG_oMJ)5S?0:j!:H2%d_  )3!Rd V|y+R [pAH:ӻ`x9AXXf^eS -WA1 U3VC@ %Vx`9A@@f^eC ->WN1 ``9A@@f^eS -|J37{T&{"'3xFx.cEemB sSwa֎TKcS{U+'s1*}G td{Fbd)acbz_\ C]W0lS,\%?⦏V\ןƀA?? Ci֥<Чm<] r'V2,JL 2ɡ LIy 2ȹ !k$yȢ{扰dg8ԘBԌ\ՀRyźPb}ZreɄ'͝'hl%4+ׇd捔qaOjVy2k8wHqb*q\%r*IӉ0d6iyi.AeX 3`04ZMVnaRQ=r0P=h8 Z|w_B.8Gd8x܅Q`PYNnNl >nf,ΌQ&TnGNIUFv-Vvd"JYIQl%2_mÙ%~TixA%\tE6#mixA%˧ Exf6k4sr2i"j|H4U۵^,JGcpXKx4kb)CgU#w/%4䂆 4ڟ(`4msa!lhң>/`x9?CXX@e^eS -W2 U3VC@ &Zx`9UC@@@e^eC ->W2 ``9dC@@a^eS -4 U3VC&1c7>GNN D ڄD Յ=u_اc&pj#  8UORR\pz^?L45TΌ0c~4JLGKGCrNj9D;ݹ..p+z, R6< "w Dq:pbG27˷ן~^w G[0ؼ"߆~+qtO`Eh.ۀ"7` wxBwEyK S<'<E`DX4uxތVӓaPUrJcpTJN6DZ>gs,~:ZrFNY[#ZsX%K m/%#N h7Krjͣj2=.E{ +}:c/>yE ,\u_;2:K3%=s1VCޭ]'2s[0:'KN,%K yZmsT{A4F NO0^4ڗ"ipYs4axM1V5 D/dyMkEIhxMkEE{.8Y XKׇY5 vԼfUG_L`0`͓9 !ZND2ANkkVDKS\ʢ?1 Lu+B=Ϩ4ؓtu[$=ؑ_9;v<х<*X3r쭜;ښ9hFVIs5̶[q+MVF`mq l&~Z-ْ?uͭPE}Js Wg4 ``9D@@@n^eS -p*KjLM$ĒsYWu/x k0\Ǵ4aMHxaRQ^R0o( QzZ(-TnMia%NQKzgDR2wB3EdliouQdtWZRu xS7 sgT$" cTjhKs^"Uz^;H{/hu<]ɨÓ%K 'L#ZuL)sRfX%sI$9!eU˓=ח4|p;A kԖJ ^ڊO){R@Wr@sńɺh>YNERRUu̦yX1 Q>Et Pܪ| e L1"5"7TuO@ [$pH -7'y˼녞t# ܟMa2R0P5ir%a9Xoxs %zw5?If*߽C7g ٽ}<`'.ܶŌ]|UC=A떩D㏦1s1v/t#.0C%I%7M`%upAAcPu~O[}6?7}6?alGSAq2F'owbIR;ad1AZr}gXVms ?]xѬm)s).E;꟪X7PZF F+U4IUh:UsxdLUuLע /%:bV5`x9UFXX@n^eS -W5 U3VC@ (bx`9kF@@@n^eC ->W5 ``9yF@@j^eS -м<`K5Q@K~0jr)u3C|&Ѐ[Q|lnZEce1P|Z.xJ/y'w8UT]Y,Ra:[\i쓢J; ƙ'ENƴ h!Sbܪ"P ZȦ"DBS74aP}kUpOciRՌCAdnXXp׉/{#OzdY #ܪi:(- %pbYUmjұධF*י * bH@+ \Y蛣h!U*@S k8̺5-!EYlU~ӻO{HH:uFn8.Ch7< AGf8`)?kX ʑcgy>죀iكz&u֠ht0ֻwok(@kqicژrkcmIד{l~O{ySVN-pjvcbA)kc()xw4\}c=z!d)틂´6| F{M;b=z!$ZR8kω 97sncsODRP0snvwhI}?ghI}?w0Zu$͎MD8;6Ik(| -:f&u C$t< `x9GXXa^eS -WS7 U3VC@ )fx`9G@@a^eC ->Wl7 ``9G@@@e^eS -6Y|)QO}3KnBh(T2wL#]B\Z㌠N.RrP0ixWG';gWG';oWD e~uAU-U8l^4/v7I"(i=(-Aʚ!h5`H|qY nHJ3-NUxhQ{[<,|jyҤYH}&ې6z.ݺTdTZ;^eex)S-]\Љͭ+R]]7s""B~|96s&2Val/Uemr۵M{HŮbDUn>\i&X?T'VgEhND nVPeDvِG( K#x#A 8{QP`x9hIXXmKS -W8 U3VC@ *jx`9vI@@mKC ->W8 ``9I@@mKS -}8+nN8u%i|(JT?~UU>W`%p438GRAI!(jq9\x^GzLyˬ!NQ_K ﶸo6vSኞ^?Sγw!m'/P{wHo{7$ +d6T+ &i4SGjy>stj<2}{Wm!3tσMĈ`Ȍ/=r*Nu[!dKidM 2cMO&¿[Koݲ`l6h˂ 9,\cxLOuDo#&q(6BK.X%ma֔B?;ןS+u_QKQS rݩS:Yx|Ɏ'76ʥ'ƞ4I{ 'L y&JI(u9OFD/^篚E \O8b@E';\?LXojf^˿ &ݵTd0K1Fxƃi8 (@դtu5UkT|n= U L37Wpm<Y&L}=UzW%AytR@mWLִw^bRv `x9JXXmKS -We: U3VC@ +nx`9J@@mKC ->Wz: ``9 K@@mKS -p ^8k(A"=FEيO^/E(Do|s4=W|WM`E?"]*T—tZJI_ṯM2BKÚU9J郸Z{˭<Uw~dҫjeWKk^Ec:~<Xb2W 5.*\z m9Ow-#o͗'qnAFEyf׷@[+:~ddpec\iHsy!,_b]2ށ!oF&׹^|WQtsz"^oA U󷻘&9 v1>Ad&LuaHtvpVfl/ xDZ^)7а0*Yd`"uiY2Pdv#ۢ.֩T[c݈j =)E!(<2ʡjDhQuTy0EcE%P8jG:P2g8RoqyRhtgg`x9oLXXf^eS -W; U3VC@ ,rx`9L@@f^eC ->W< ``9L@@f^eS -%l]J=hO_NgR @Wȑ<.um~D13,SuDCʔuqiАkF7 vjP!QhdKmƲOA@dgRJ"C@Dѽc쩭вtv؇a p(lh)%k-؏THo7Oi.r Y5bQRdWQUTy \7N[dA[CarkM]('P>-raA@0}saK_726rR: dKBwE`@t_[g>?+hžfbթ[a$uJ"֗:u;w/7 Fj޿~RSU \ d>)wk$S}jiW KG $ 0'vPnmC ]voVs)A߿S4ɨɋǯ+=QJud)aLms*{8-*X>eߣ!S_7R[fR>3ErWbQf("U"~r`x9NXXmKS -W= U3VC@ -vx`9N@@mKC ->W= ``9&N@@mKS - U3VC-~mnAXDp`U4S*(>b^n*!]3,$n;g逈d4 eWtb\tNqѵSщ+)oyd&N=xLX}C1s ndfzUfk5✁8.[!ߥ~`x=ŽYX1y?ve8+pjceNڭӉʫ2ˑ .DJ\cy\nnfCM[>isҮ^M:HǦ~ )2"}F`OezoQ?@(tPהeQݧ=r;6TG S Qr}lj*oi[d0ZP))\ۯB) {bA'gGO.{W6WpL;2&+Nwjne6E%*. egܱdɘ6xo+dߦI#¬$*'{"@chfZ1K=>;;`-࣡:zXsLh}[yֹO&ȜjUn8v/ {'Ae$ >ܶD#O02& dG'.[.Gb^ cY< e{|d\0\7<ѡmVƢC? 6y( j0m;Ǧh({3Y&rRšuvj5Fg"mx_nտN'š_wLǦ>Sʫ!€ J##2pv!/Ѡ6U3cSThW=? ``9O@@mKS -wzvxn&;B+V{R<~+ãi"PY'aܕۖ!FMJ3;rA/:GʗcPWSW ۳%=$_ŷ| לKK4RJw޸͙~ԐRyzy:<}<ϼrHyNϝ2)Vp㚪Dgas_5Hbe Bt 4kiYI-F *X7dBH;`-~In +}ٟwdo-.FָAi )},S( ~٦>{Loxh)EMS/z+ v*i C<܇GUd̀c,Nyȋ q0F[4g9u$w*ywi5JWe3wرH4[=],4.[@r'm\C],w:)d[v[fZ @H?aυe\*%˻i=Ӽ%-t_}O6 Y;pyi#TLiΒu_X9kŶ- tWV3Q5_+!_pK_ZV/y ݢv1#DBUtkfF`l]0W@ ``9cQ@@mKS -LгtO УsYL ,S]2kwX`5 ?23ͣDݪdX5XfWB ``94S@@mKS -ZzM [hP><&݊ =֯9Zô*5rH `PoO ldYYӉ3ޤ{IUē됆}[PB¡|{EG˵}k{v9qEBo7oҐSJԖ _l v9 wd((0 Yȗ}(cXJN eVn_5!y#>~Ayp60:o #~ 'H(D`YeOJ5 YWcvO^w~av n*ȓjaovHP@!B zwtNj_ȵ>-!JhQpDžG~F]_\.y!\y{9E1!v|41Ңqc c=|'r)P_WD ``9NU@@mKS -흔f)k)y*YxJ4cs׭Eʼ| ްjb \=,XV p~/&Ɔka\;<[9pA [0mx?5Hg6.t̰?{d{ۆw Ӓu.=&sv<OHDj>ڑ]ȧ.YBAzMlxWF ``9W@@mKS -hԕ*UZ+ @mjvMiJ-SJ@:nleK@k+Ж5Mzz8@z޽IK'e -ѯ0bk7I2 ׎X:H: X&;_:UTB-hz6LռnFj$60̰N8g*9 >4۬=!>P(PZQbā1(T?m SDDH욛&l@6̖tDIF̐L­P%gp7*D8&>nզ+ɿ.yUYRA]$,9;dny+q_q9\L7A)4!+ޱpq7yWav˅+ȱ4^ܢ1ohsIz@D UE,<gTtM:!|*_:˚'ˈv0j]),PL`x9qYXXmKS -WH U3VC@ 3Px`9~Y@@mKC ->WH ``9Y@@mKS -Zpzuz4J󾫎inGQ*/+mbLG ]RaX8~\UB'Mdn{MO47|56wt7Ji3nW_!T"Q̱C1 𧥦'UxHm*9y" JN '=0`*yDm̎S3'?33&?#㓟S31R>PA@n|FR,br rbvr-9qRүJQJ~TɪK.0#` #Ḥ5k!]ƜS*~<.U,ǀ8n#\K|Ҳ1k=y ۇBSW$ |yOާ “iWW˪HwŜj%d<בpG"jS]r]BC5%F>.H/ncmb-}Ggx1:MIfzzB+eぷOn]ۛƴXs:( N`?O᝖w{w; c^xTPK`x9[XXmKS -WJ U3VC@ 4D|x`9*[@@mKC ->WJ ``99[@@mKS -W ``9@@`KS W 0``9H@@`KC ->W ``9T@@`KSW #``9\@@`KC->W ``9_@@`KS W 1``9@@`KC ->W ``9@@`KS W5 ``9@@`KC ->W `h9 FF`KS W 0 h`9E@@`KC ->W ``9s@@`KSW #2``9y@@`KC->W ``9{@@`KS W 0``9@@`KC ->W `h9FF`KS W' 0 h`9@@`KC ->W\ ``9 @@`KSW #(``9@@`KC->W ``9@@`KS W 1``95@@`KC ->W ``9s@@@bKS W ``9Y@@@bKC ->W ``9t@@@bKS -W ``9e@@@bKS W ``9_@@@bKC ->W `t9TT@bKS -W Provoke Pipe Errort`9 @@@bKC ->W, `t9 TTcKS -Wn Provoke Pipe Errort`9@@cKC ->W ``9@@cKS W ``9T@@cKC ->W `x9kXXcKS -W U3VC@ x`9}@@cKC ->W ``9@@@e^eS -W ``9A@@j^eS -We ``9@@@n^eS -W ``9@@a^eS -W ``9E@@f^eS -We ``9@@a^eS -W ``9@@@n^eS -W ``9H@@j^eS -Wl ``9@@cKS -W ``9@@cKS -W ``9<@@cKS -WE ``9@@cKS -W ``9S@@oKS -W$ `x9"XXoKS -W@ U3VC@ x`9"@@oKC ->WT ``9"@@a^eS -W ``9$@@@S -W ``9&@@@S -WN ``9'@@@e^eS -W ``96)@@j^eS -W ``9*@@oKS -W  `x9+XX@n^eS -W: U3VC@ x`9+@@@n^eC ->WF ``9+@@@n^eS -W ``9,@@a^eS -W ``9R0@@@e^eS -W4 `x90XXa^eS -W< U3VC@ x`90@@a^eC ->W] ``90@@j^eS -W! ``91@@@n^eS -W! ``9O2@@a^eS -Wv" ``93@@@e^eS -W# ``93@@j^eS -W# ``9O4@@oKS -Wg$ ``94@@@n^eS -W % ``95@@a^eS -@@iS -@@S -@@@S -@@S -@@@S -@@S -@@S -@@S -@@@S -@@S --S --S --S --S -W/ ``9@@@*;S --C -W U3VT `9`*@@@^;S --C -W44U3VL4H`9B@@@h>-C -W,``9ː@@g>-C -W >``9q@@@*;C -WO``9d@@*;C -W``9z``*;C -W` U3VT `9X@@@[;S -@@̱S -@@/S -@@!S -@@&S -@@ S -@@@.S -Wd``9A?@@@%S -W``9Z@@oKS -W`x9XXoKS -WU3VC@ x`9@@oKC ->W``9@@@S -W``9@@@S -W``9@@S -W^`x9'XX@S -WgU3VC@ x`9H@@@C ->W``9V@@@S -W2``9@@@S -@@C ->W~``9V@@S -W7``9@@oKS -e W``:04@@CvSe W# ``:09@@CvSe WT ``:0P@@CvSe WT #``:0V@@CvC->e WT ``:0W@@CvSe WT #``:0Z@@CvC->e WT ``:0\@@CvSe WT #``:0_@@CvC->e WT ``:0`@@CvSg Wj`h:0TΝFF7_S g W0 h`:0Ν@@7_C ->g W``:0Ν@@7_Sg W#2``:0Ν@@7_C->g W``:0Ν@@7_S g W0``:0ϝ@@7_C ->g WF`h:0ϝFF7_S g WN0 h`:0Tϝ@@7_C ->g W``:0nϝ@@7_Sg W#(``:0sϝ@@7_C->g W``:0tϝ@@7_S g W1``:0ϝ@@7_C ->g W``:0@@S nDDCsC -` W>K d`:0xn@@CsS <` WxK `|:0nZZCsC -` WKacA1920-25um|`:0n@@CsS` WL#``:0n@@CsC->` WL``:0n@@@!S ` WL0``:0&n@@@!C ->` W&O``:0*n@@@!S` W*O#``:0/n@@@!C->` W/O``:03n@@GsS ` W3O1``:0Tn@@GsC ->` WTO``:0n@@GsS ` WO ``:0n@@GsC ->` WO`h:0nFFGsS ` WO0 h`:0n@@GsC ->` WP``:0-n@@GsS` W-P#2``:04n@@GsC->` W4P``:0;n@@!S ` W;P0``:0_n@@!C ->` W_P`h:0cnFF!S ` WcP0 h`:0n@@!C ->` WP``:0n@@!S` WP#(``:0n@@!C->` WP``:0n@@JsS ` WP1``:0n@@JsC ->` WP``:0n@@JsS` WP#``:0n@@JsC->` WQ``:0n@@!S ` WQ0``:0'n@@!C ->` W'Q``:0*n@@!S` W*Q#``:00n@@!C->` W0Q``:03n@@JsS ` W3Q1``:0Sn@@JsC ->` WSQ`h:0nFFJsS ` WQ0 h`:0n@@JsC ->` WQ``:0n@@JsS` WQ#2``:0n@@JsC->` WQ``:0n@@S ` WQ0``:0n@@C ->` WR`h:0nFFS ` WR0 h`:0Qn@@C ->` WQR``:0}n@@S` W}R#(``:0n@@C->` WR``:0n@@ݚS ` WR1``:0n@@ݚC ->` WR``:0n@@ܚS ` WR``:0n@@ܚC ->` WS``:0n@@ךS -<` WS``:0n@@ךC -` WS``:0n@@@՚S ` WS``:0n@@@՚C ->` WW``:0 n@@@՚S ` W W``:0n@@@՚C ->` WX`t:0nTTКS -` WXProvoke Pipe Errort`:00n@@КC ->` W0X``:0Gn@@ӚS ` WGX``:0n@@ӚC ->` WZ`x:0nXXӚS -` WZU3VC@ x`:0 n@@ӚC ->` W [``:0n@@њS -<` W[`p:0nPPњC -` W[U3VC2px:0nXX@ؚS -` W[U3VC@ x`:0n@@@ؚC ->` W[``:0n@@КS -<` W[`t:0RnTTКC -` WR\U3VC tx:0knXX@ޚS -` Wk\U3VC@ x`:0|n@@@ޚC ->` W|\``:0n@@֚S -<` W\`t:0nTT֚C -` W\U3VCtx:0nXXܚS -` W]U3VC@ x`:0!n@@ܚC ->` W!]``:0-n@@ӚS -<` W-]`p:0nPPӚC -` W]U3VCpx:0nXXߚS -` W]U3VC@ x`:0n@@ߚC ->` W]``:0n@@@ۚS -<` W]`p:02nPP@ۚC -` W2^U3VCp`:0?n@@@ҚS` W?^#``:0Hn@@@ҚC->` WH^``:0Nn@@@S ` WN^0``:0tn@@@C ->` Wt^``:0yn@@@S` Wy^#``:0}n@@@C->` W}^``:0n@@@ҚS ` W^1``:0n@@@ҚC ->` W^`h:0nFF@ҚS ` W^0 h`:0n@@@ҚC ->` W_``:0Bn@@@ҚS` WB_#2``:0Gn@@@ҚC->` WG_``:0Kn@@S ` WK_0``:0pn@@C ->` Wp_`h:0snFFS ` Ws_0 h`:0n@@C ->` W_``:0n@@S` W_#(``:0n@@C->` W_``:0n@@@ۚS ` W_1``:0n@@@ۚC ->` W_``:0n@@@ۚS` W`#``:0n@@@ۚC->` W```:0 n@@S ` W `0``:0.n@@C ->` W.```:01n@@S` W1`#``:05n@@C->` W5```:09n@@ߚS ` W9`1``:0[n@@ߚC ->` W[``h:0nFFߚS ` W`0 h`:0n@@ߚC ->` W```:0n@@!S` W`#2``:0n@@!C->` W```:0n@@GsS ` W`0``:0n@@GsC ->` Wa`h:0nFFGsS ` Wa0 h`:0Nn@@GsC ->` WNa``:0zn@@GsS` Wza#(``:0n@@GsC->` Wa``:0n@@!S ` Wa1``:0n@@!C ->` Wa`x:0nXX!S -` WaU3VC@ x`:0n@@!C ->` Wa``:0n@@S -<` Wa`t:0SnTTC -` WSbU3VCtx:0bnXX!S -` WbbU3VC@ x`:0}n@@!C ->` W}b``:0n@@S -<` Wb`t:0nTTC -` WbU3VCtx:0 nXX!S -` W cU3VC@  x`:0'n@@!C ->` W'c``:03n@@S -<` W3c`t:0nTTC -` WcU3VCtx:0nXX!S -` WcU3VC@ x`:0n@@!C ->` Wc``:0n@@CsS -<` Wc`p:0.nPPCsC -` W.dU3VCpx:0` WXd``:0dn@@GsS -<` Wdd`p:0nPPGsC -` WdU3VC px:0nXXJsS -` WdU3VC@ x`:0n@@JsC ->` Wd``:0n@@JsS -<` Wd`p:0^nPPJsC -` W^eU3VC px:0inXXGsS -` WieU3VC@ x`:0n@@GsC ->` We``:0n@@CsS -<` We`p:0nPPCsC -` WeU3VC p`:0n@@GsS ` Wf``:0n@@GsC ->` Wg``:0n@@JsS -<` Wg``:0n@@JsC -` Wg``:0n@@JsS ` Wg``:0Ao@@JsC ->` WAh`x:0JoXXJsS -` WJhU3VC@ x`:0io@@JsC ->` Wih``:0vo@@GsS -<` Wvh`t:0oTTGsC -` WhU3VC tx:0oXXGsS -` WhU3VC@ x`:0o@@GsC ->` Wi``:0o@@JsS -<` Wi`t:0oTTJsC -` WiU3VC tx:0oXXJsS -` WiU3VC@ @x`:0o@@JsC ->` Wi``:0o@@GsS -<` Wi`:0FoGsC -` WFjLLU3VC@܃B]nA>]"mx:0foXXGsS -` WfjU3VC@ x`:0oo@@GsC ->` Woj``:0yo@@JsS -<` Wyj``:0o@@JsC -` WkU3VCPKEPUߑiQ'Basler_Ace_USB_5508e950_Version_1_0.xmlGCV0}i ?DAt=˪Ҿuz K\$Vg`AJ]=3}u־aG4ן _/7oM˿x(vn4mLZk8{sg<W/޹{O6z5 Mqy~;Nw&;2Ϟ0"lܿKt:WNlﴫ0X񻝷wcg:Ҳ&Ϭh1vb۩5"ñTM>&>Vl` X3}$9mo`}mݥP# zgmNy>A67:+ۺ|;=3ޚYlziގ/k~e!̝.MMܒrݞ߽ʉU>hlA@B&o]'ޅvFUaERg K^:X;g1dmwqvQ?r#m[y~Is_; qmXxuĎ///~vnBǏAp|~.j?N_\zl'_[7.s7I?HܕO &˛;/"R2׻iQ:6gE]Ce|d /ڮXBв:ezMܧ+^Ir ' -Y[Bz'5kw!Y uPr;%|tbvz9f!I{ mxMhPܮ "s|hzI94{j6<2#<.^~ x_oȑL/OevQl(`x:0oXXJsS -` WkU3VC@ x`:0o@@JsC ->` Wk``:0o@@GsS -<` Wl``:0co@@GsC -` WcmU3VC8Tf%p@刀"@@|`b[rU7AI⻗֏/n5Ya%., a<ڄ!;/Fxx>G ඹ_x×K kJ 8^w@cb5EPPBUB-n%PI8Ի ;pjܒq%6߅!aðA#=ռI rmj_LG,rXOGV+_^@Ȏ4);Ș&iJY#/?>?#heGv|NCfv>P~~~'w䶩ip:~S'^& S|)<yu1Cdfõf{[g{pƒۢ㕾VϬIZu8އ\[p iXf*瞪*f/K,6 W$"/VΆWϠfd?_DOwʶ:YFmdeHuȦy`x:0qoXXGsS -` WqmU3VC@ x`:0{o@@GsC ->` W{m``:0o@@JsS -<` Wm``:0o@@JsC -` WnU3VC-%:Nmz=yh [hS65Ar@%i/ (h=u@9xދjۖ= ^E^K֝{K/y||ҭu}Zϻ+h,z{J3ƒ tZ'pPyMX\ҹ'Kp{8 +_b+FQ´Ƥ+mָU7mGx0'>8UųVUCQf.Zd*?h՗1^ OF^n ކp I+ڈi(wk+';:1h2ߓ_%I? \ 챲z|D;e*K| 84ad=OZUuxQ)d `N&d 펌&;ouFD`*Qūl8R$E`2Krdo,!1Cr:Im|X.si2 -6dT# ,kr >\h(y:x 9AxK79w(]R`!h?oLg?==gᙄoI(RSq(j^U KĨtz efBƙg.xUiЀz2JoDct4av;=F3@ +XGx luBhw5Ew|M,ݐ/>ؠ' bȷk(W͘KV71:xh`x:0oXXJsS -` WoU3VC@  x`:0o@@JsC ->` Wo``:0o@@GsS -<` Wo``:0o@@GsC -` WpU3VC2>NkwCG' 5+݈nP y@/)6Vtlѭ{V |Uflf.c$w9# [2FwtYBu:'W[5og[k_YaDe_֝,)TRDt %sd\hD]%ީv7b :dn Z jn-tKU-֡B:1%#tN>QC#j7lƙg.ۢkϙp\{΄5҂9rD qCPS4v >KSOw@FEn!m`*8$N9^#m/>{gg)Z@d"">ri|S_@u̽AS'_3|9p v<x,P:_WR7(N2.]Env][ʉUYpo ] :5ʽXP?_ny0xm/5RG}Fhfx^g۷BpW [wWn\ou׷|oF6DOe5+=X{ K0t<va#__0rNZv|}u׌$>{u%M^ | %-_?ƛ_;UZHƍbzrj\_Gze u'O/}qRw"-cBq-#I# 8BՅ`x:0oXXGsS -` WpU3VC@ x`:0o@@GsC ->` Wp``:0o@@JsS -<` Wp``:0+ o@@JsC -` W+rU3VC'kV4>?d֥^a%<9kd>CrE5zǴ\"T#E۬ NU>RLvr+=; NxLG"ԙNugfvg5R?>U!d|SNmv́jT:䤦G2/>y.0ۆt0_Y|rϩo)qtVeBp.w0q_$F g0G} D")88HR L׹D$6"+pwV ŦEZ?'UPs;=k gvmT:KKءc& '_L5|F~v.D@چ{͢KIC1b-.7~ a.!OM`k>xfW?2͍/^j@SSU?Q\^ш.pMsĩU7˶§ aYⴌ&y_pJ> |oH9TpJ7xb!/{5^h:XF[F >6yì>ј2#3O 7ƙKP@ =@Hfrdc]h8_d`B-W+]}zC9՘i2N~yҒؚ,{>oȣ&ׯ ]jz}&t:9u>s<\7y̹nuǜ)dUÜhFPFwi4LѦj3| -[!?ra98!U=D~CP[&s;ޑ[["C"o DG[bCft5<]`/3tC `x:0: oXXJsS -` W:rU3VC@ x`:0L o@@JsC ->` WLr``:0[ o@@GsS -<` W[r``:0 o@@GsC -` WsU3VCAYqhM}6%{ D'Zdȱc^oQع$LuGTxG8db6Pd!rߞ%Kc.bL<j?Hnf;iUqoԆ8j86 swZy&a1|(~=Agn@Ӧs*&V ]e)^e_Ӌ,0,56>U19k }_chU,X(Uo S0h.cC%N[ǝi SV+EM]g~=SzM=|u3; Eɝ\-QlL. jo"'sc,ܺNkKʉ7t7'^u:y[ٺQf*Og8Zk5?k }_hv,v\K<Ǚ 0?'q !.pS?7 *s57)zBΑCh`xA{7p19;pĵVբf.{cDtJdW蝷1t&9 n0&& g@:O5W%7 {a[ -x: aeX]-w&G*Mn},]!Ü2)!Üuas8sPN4\PQnBOv}X9\i *-DVa9 tsR|#f3UɰVbU{([` Ws``:0 o@@JsS -<` Ws``:0F o@@JsC -` WFuU3VC3㑔!d)$ 1c1h9hgPh_=? ;`|w0%^Pm捿2[ :W`K7G˒IKAhqц,y7"->[2c$2|j@lw1̗IdlEZxZh;|$&j`M8iAaj7qxCB?LED#<ѦeWN h wPsH8 B ࠄ֐,xmJPQ~:^d )vtchEPGNU hãhѶm$Mh>Ô.7|w}-G]z!Ծq۸18Vni\]k WW"p-jR Zլѹl\]E eli˶1KsuXmp/e@?Y325s`>0!y2P6O8I2V Ǎxwm1lKWf5?c5+gLUeP@Yg 3֐?l<3"Ɛ z.eP@Yg *3vyإ;v;o3f6WKg8ޱKw첋wlsSu :k, KHu:\a䍠RYjC˔"T`xQ}~{u* I#C x CSֶmTU` Wbu``:0m o@@GsS -<` Wmu``:0o@@GsC -` WvU3VC!'Xޠ0Ľ0:?ިAaru= PFc(9徠0ql>ql Oı9N!$C!^)k>ĭ &._>BN|WLJ x~NK~سR7d: ]*1-6 x j%а4RglLMCAo{҂󛢅0|ֱZ 8G 2"a E[oaQo pCֽ/x%^K:AZ3+{ KoQ0Kr\ eB@a-c =| "(H 'q6dݵ0r5Rfq3 ,ha됗w/]h k̅ l [2FQN.–AV`5E6>W/. WփJE00\];pp= ,dуx1|@ a-I~9MgXSRoP 6: ce pazBzR6:xk_?{~enmȷb`^U-rRJFj4l"?f5U*ӥV~E0Vo玤ck:v;_鸭*ѱ:J1qU;|F{M>k*R CchH'C8R$%0|7f'UitYZ."BUD̊Bm (̦ɯ[#MyVh#"i쏏r{ GRL£|RٴŸKb7)I"F‹`bݹIWXy]9zВ`x:0oXXGsS -` WvU3VC@ x`:0o@@GsC ->` Wv``:0 o@@JsS -<` W w``:0So@@JsC -` WSxU3VCbeiZ EBWm$d " tG gL'tLhIQX*0dd O*NV8 <T?_œ,R7Ọ́ O&O2B7ÓsAxOV3 nWАN[PMO?=Kɏ?ӤYw˟r9)F?m:|-r_Y5+:.}l?]l:hi&lq3m tg6ǣO*}t 7AsIT2 #Eiq8>u0lnf7gm~9[l^+g'a>FqhYC886-8/sh"ESxTK:غ/"5=O{/{K7=B2SꐉU͇+G&֦YHLJv-~jo֨Ew{,_+H c|x.ȺO{˵U_/w-iV4fbg[VPpVuHXSBGڹy05CF8AaKfQ6# d*sq&Ys=z9t [9S=`&֠uC!*Sci̧ t$ko^|z{]g~.t팄nhҫ[CȼáUZAўHZ0Eɟc tţC,qI`x:0poXXJsS -` WpxU3VC@ #x`:0o@@JsC ->` Wx``:0o@@JsS -<` Wx``:0o@@JsC -` WyU3VCˢ1XkHSFt_v LZf;J vCH&d O9a) ui|,3VO{lkYAew+@5̤? = bgI.ק)ᥤ[( n;ov5'=^`cX-=/ad LtOKD'.ڥ4w!0rǙ@;qdV G-In~d}ʛjEI4 p7HnB^+:Eޭ-Skm3g5Xѳ5@̰=Ba3 ptohxE#n G kpExӻ.}k_$lLV!Ȑ2NW<bDD+[sy5y]2ұq]a/Fmٳ$M;_oM?yd| \MLb VRL;):Ϩ@f%2r8q>(-'6bb90g_*c"^ѓ#s<+?JͿh?||0FO0?L7^?GZ`f؏hTO^/[)\7) }sUν>=;SC{N0M[|FlQ"/E S&m^wbtBz>gE>[yM>j.ϞA= ?_pc&d+ՙ%:/ε襘^A,v7*en>VY.]+ ra22p~>F/u[a{hZw8e1@)%ZUcŕݭ_?cy*i_[M4ґS'{.Sj= t)Z/8Lj~!BF3<u2^zDJQea3C*EI%w4O`x:0 oXXJsS -` W zU3VC@ 'x`:0o@@JsC ->` Wz``:0*o@@JsS -<` W*z``:0o@@JsC -` W{U3VCRC`LHIB-r T:}ҁ0}$A a= H]OuM^'߃'O~xOg$TJ#RSUJPrQJXyҺ!2uHɗA6J2R [IZ7pa+c ~@t08uLH 0cԳ`:Hj(+`b8(^ _ aLeI-fGnz[#GW ?; ] օ1]ʏX 3gN݇ lM4enCmu1vnF}a4i5a,ɿ+]bK58b-YV7VlFaiF".U4VՌ&AtJ‡A%EWa&ZA4'ٝcZ5wΘ{92!S+=HyҚX/(,vXA vtJvr^1;2j_,\ZQWpϖBQM/_G&-FZ׷/2|Rv.~pJIEjHc䚊sټbp(fho ^C-b[fٻ/7ejaYmbDA(^=ز-39;އflV~2rIc҃!L<߇4UVlRÊ[4l;@Y.8%%VG%#=yIi|-GѵHl ,.?B]c:]=0z'PCuQ%^(v}c6ddr/Aa:OZr*i*tfdIe3*#c[M˥Klp2$NwLzAZ8]aP"Ji{B)@-n%2cܒīozjl,>R`x:0oXXS -` W{U3VC@ |+x`:0o@@C ->` W{``:0o@@S -<` W{``:04o@@C -` W4}U3VCiht(#=y,!F=za?MJ EQ]ʹ@iu4-C4H3&ПmhaLA^kT 'vdެPr*b Wl,QZ&G{:ѝ>ĢtVMݍ߲K!:rڧCsIGoTDQ Du9%|>{J3IӤz7OZS k G n'',\JiwWQm +m?XKіc=.B1@ݧ8쭺λl1xnMm@*>?d໤6L,;XJh)d(P^]*9VՒ ׮ KZXwM%Àe.(Ը+ՔHHB3c$2;|9L5%tG3=yx$?rvmwlօ p%1֑ުuʑ4 ($5a"pKp?wЏ%mX &̬D уjn;aA-3EmϏKn:uN'1YbV%Yy]4ń_`x:0FoXX@S -` WF}U3VC@ p/x`:0`o@@@C ->` W`}``:0qo@@S -<` Wq}``:0o@@C -` W~U3VC/7tz!]lL$;XvMvĶ6N%J(?S{Jha:s:T7tPX68,@dk89IS +2w2d>r 43a~F 2 U^`N}~PyE] sb`Mu Ң-9~c:;FM[,^^Y`$$loLQáE.e5UuS[%y0;Pw5]M8tW}ƺ Z8dډ}Đuj"t*&uTdryOkyUQ8K-zYs :论5KꃬVZY" BLLU{&m8wJ>&9C4·Vs)2e>3j(U@r\`M13bkZhq{'nW#=&0v%^uydB|#k&C!ea{]wD_F+Pٺ>]槤ܘ.$/%Jx D|e?/`՗n#}>oC,Q#x"T9P.U,&Ř(tn0!ӚՐwq@g.`C遀G:64 kiMsD5(eu|J7( ;%J=}%Ӱ>_>ݺIWZNfW4 6ق"&h$:d;>B8Mhx);GMB#`JZZ^Bjn$QozDjh@["Gh3 Fa#dx uVE#6<ºk?( jDֻ=MGPxeqH< n2<Vߡ#6` W``:0o@@S -<` W``:0so@@C -` WsU3VCopQI6ErUBvoU҉T+!Ƽ%+++(Lw#\nD} *&VueSgKѬZܸppkX.8O=@EidcGmҺ5_uy{ w$P6GboUczƅ^YQn۴ 6p\PPвJJiC$""H|DZ{IO0%5q?#zOsmK3Ѯr 6aƪ7 acEd~%bZk% b;{-QTDE`@`Ȱzz 3 A]xd TR#rÈgF DZqDZe.s""OZ2ur3^2?rU"ǏΩAY>\κ~ò-ccxcc i>S*1U*|a 48&&mxcƜ!/`x:0oXXS -` WU3VC@ X7x`:0o@@C ->` W``:0o@@S -<` WĀ``:0o@@C -` WU3VCD%bbd!S΄d\KE)A,P({NtKsU:Q:GSlcp8'r Dt'FCg ƬOoBr%oSgJ*~Rw:ihsHۂNх_iasf!QFJDy҂H;H zl-oƕGYkmm<2 Yq+BKdU7m #G%YkHT"zX '$F̙VdCBlkc>.0~cW>c3ӛӬ>TW\-eGT;}2QVv]{8S)?G5eu{%ӔS ݭ 7Nh,OUA [)mEQ4JBEx%”Z0T1ZٰfM2Kӗp^c9dX^oPD"ZrBH``zE GJ/SgDrLO/} u>,cJy 18hX4Rq92n{?:Qfm *X}G6q!H(+9 I$sb,!mZ&p~dZ5Re#М & cΙz7_~8%?1(MJE"; iuɿ~~im Ywm,AgN0,溜;'Ndo_=nQ6< "ܧ s͇SWY:8;b(ec3 y15_+j| -EkآO/>9+?o6.#p$>VimJĉJ.8ޚO&yR4.,I T%IiIJd_)+G`x:05oXXS -` W5U3VC@ L;x`:0No@@C ->` WN``:0^o@@S -<` W^``:0o@@C -` WƒU3VC~L0u Y2N!F)dHTDxIRT _4֩R0ڸ2кj=f!w7wa[mwl⨼{}"Nr J*n\ l,(&_}XK6ZF`,nV_H?,+FJv8q"~޲<}x{a6Me&fmYZ0-`r<҂9J S0SLów0sA d&rJ(3H=5>4:)VO NzH!}渍)(M斌LӚ̹nocit0Xl -IsH ͸)=,MY:nDV\9'}[Xq}la-#` kݞ\u*%R*!hyUe/긅Rusɷg1\:i$H'sj$YY_VRv-*=2h=-}iCfPuD'y=u Na/tÀ827n}][N4e TK斯A5ĕCjmظ[Ρx;tA(9'i4p=@G?6 # e $ŠijJ[ ŔՔ*u1J+m J7?}@ 9EI=G} ;qvFe둏z+S9OiV尨 !k_)ĴMhf+Zr,W^CrxqU͋S"CL\JUj?US{KPS(c2m%䂠;^GLY<֜z>` W``:0o@@S -<` W``:0bo@@C -` WbU3VC@nH G)Rj[1-Qqd4JU X Ӓ4c&욂̖(RB )(>S8"b2W-+ỉ-aN*{eD{^6(diq1DeMI4q$0v;y= CXa4FiZӺ{FugC-A66M^xs0td-A|F=>ƙ@Oc1kmLegZ>1wd }Q E=$(X@ x sꝷAlGo<aeF{PN"j([aPZGs鋂&XQ/  5lp;BS8!o7><.BtP|4QIr&&u  nE%IG$i\(LMA")Zt$MM<5=6IA;X5 \md>Qt@:~wECtیp=d>\l@>k2Y#8x<6>-Sh.#w;4XuH!\Hطr$cK6(,DJ CiiC/DGr$!꽝_OJX\wdKV!XV!]slfaY)]3w;-ΐL]Ϊr98zLU+G1C ~03 +gኦ3Mg5Lʕ[' 4ÚZa\J3鰆9jV(KPΰ(xT[ `A FGg~4ÚZ{"qUhfa s P0Zc5v1U78 )\*#_kA6j0е`x:0soXXS -` WsU3VC@ 4Cx`:0o@@C ->` W``:0o@@S -<` W``:0o@@C -` WU3VC |kTmwqy$ÂBwY[w..U@4/Fm(@E+lVʐzoé=ŖZ{t);Qy(PKs +S`.4 *L-ktzA P@KJp,I ) ;y(eՙ )B']ۮzqЬNL6s#aQZޠXaxhXx۳ԍ ȹdьpۛWRNk& p<߇4 iBkĬg XB:[38d:lS G:W9<MXw im-4+S?J%Gؾa)+}O9}rI9ṟdLK>[kiU`n%qd` W``:0.o@@S -<` W.``:0 o@@C -` WU3VC!þAfOϹA$gqD=0kVCkhB䩗@ e鲀Fc/\J{ZP%b'^ҧYhVQaWbb@U-& L )xO])dpNwHƆвJVd9Y(t~ucQȵ r"OBݻJr21t>KgORHV$~R ѣ~aqe CT2K>6ѮZ^rFBڷ$NS8PV$ݻ! E`#ŀ_~_,e2_~AMȇ6 PJ:g(`l``잜Їɩr(`]y@[PNDN[ul~JWw2Sr]Ku@R ]{W7!lO<H`qowXW!5at$ϟw 7ҼD/0IdZk[&j7Nr@;9`Q;?n%mnQmS)}󤛽>&EM{ɖCy8@>2rl̺"@ eJ&YP0Y@7+AP?fbw6WWi"wO]\^DQԎ)T$ XrR^IG5^cTN*FK|^:Z0pBgObd&J!+GEw/< WTB c@9ChiW6b>zZ%&+ vA[|lqY`>bd[[W&P&kj%9dN d~k`x:0 oXXS -` WU3VC@ "Kx`:0 o@@C ->` W``:0 o@@S -<` Wˈ``:06"o@@C -` W6U3VC" gw%c: o2[F ֮`Se5½1v,+tŇ1EE­h]:OYX xg/"̀ug8)[Bz%^O9n1nӚ=w2ENdvtOl i4.4."/(xںtqCAٔk칰?^D:%_RU8yY h"U zT x}qVq8 g[*: 5tK7`0s3馴D5&Мvm{o ?ʋ9ϕ,_Whҿ+'/ѓ'?2 l|zF&``O/'6~hV1m^fZzT3JeW1\UόFHUs wQhWA}&^72oHPfƑ)J|7,n鴦Z`]V&*Mbe,#8JGpy52+2+2W^h1Z]2%jݦ~DLGOA>BzO82ISZgp?-b\h;/v/K?Wkd YOIrBJ\ze=^@r6T\]% }}S1|'fȀC` W_``:0n"o@@@S -<` Wn``:0#o@@@C -` WՋU3VC#$W5G|y%Se_ONM<X݇!=AmߠyTuI0tUx Jb"nҧ VX/Ip'ܽAyo$$Y.ZteNU)+hK(sevG"h(S.}q]:Wz BT6Xa%/ 4k䫹^_(^_^_(^_(^_4rh%Ʈ utYS8̍BٍK7ݸ/sPvhߍP7!=2 E U e en΅Я%vݻu-kw5S͓wsc=>kiO=N[kv3nӛ{~߶Ap76'!-cR_׫O\B+:Slj/}w6e%f%ć_nx1cpTn2%l lIV#T ~m*luh;'n]'$jz"_҃g%*9Ir1_2h,'@~WB1r)+>`x:0#oXXS -` WU3VC@ $Sx`:0#o@@C ->` W``:0 $o@@S -<` W ``:0s%o@@C -` WsU3VC$YJHCsڗn5ZEEڰn z|C~@Vj/Os(;Ϣ6鉖agZ,l͚F:dRQfPmFч`;-94{ڎ3Rg˄6z:{,+39$N!aN_^瀒 & b5`ۚ ;s-sP$ y0tP6.qN+:[75xuSo i52'iAN}<ՐMP?ZqK I*Ggv$pJ@@O=9?"2<9f(˚ݟ\ѺmN;͝ǒoeF'78%|>dSS*B5_ߕ䙎qK-Jձt㵷bg@ʎ_{U /n,sP*2(BAZa |VUs >6V`GdȐ8Oj\ tD!x'.Bh|~ܐ-R}[԰)GE:Z%5P$.Uѿ@)Z L : nu9@#Uˡ]Qb4 X"tQ&`1; TXCx`,QQ`D`1ԄzfJyaʽv^ظvZUUpؐx{Sww.{ 4oAD G򾂘䬟kޑ5ynvK(iI{XӤ٭cpAhGT%@XHדp4p11;;He^@gfANm2nn)EaGJ L С|IR/I)62UxyO|[knG_oMJ)5S?0:j!:H2%d_  )3!Rd V|y+R [pAH:ӻ`x:0%oXXS -` WU3VC@ %Vx`:0%o@@C ->` W``:0%o@@S -<` W``:0'o@@C -` WU3VC%#V#\QQSypH(9@3 ZIT4%ݖ `l YX>|J37{T&{"'3xFx.cEemB sSwa֎TKcS{U+'s1*}G td{Fbd)acbz_\ C]W0lS,\%?⦏V\ןƀA?? Ci֥<Чm<] r'V2,JL 2ɡ LIy 2ȹ !k$yȢ{扰dg8ԘBԌ\ՀRyźPb}ZreɄ'͝'hl%4+ׇd捔qaOjVy2k8wHqb*q\%r*IӉ0d6iyi.AeX 3`04ZMVnaRQ=r0P=h8 Z|w_B.8Gd8x܅Q`PYNnNl >nf,ΌQ&TnGNIUFv-Vvd"JYIQl%2_mÙ%~TixA%\tE6#mixA%˧ Exf6k4sr2i"j|H4U۵^,JGcpXKx4kb)CgU#w/%4䂆 4ڟ(`4msa!lhң>/`x:0$'oXX@S -` W$U3VC@ &Zx`:0='o@@@C ->` W=``:0L'o@@S -<` WL``:0(o@@C -` WU3VC&1c7>GNN D ڄD Յ=u_اc&pj#  8UORR\pz^?L45TΌ0c~4JLGKGCrNj9D;ݹ..p+z, R6< "w Dq:pbG27˷ן~^w G[0ؼ"߆~+qtO`Eh.ۀ"7` wxBwEyK S<'<E`DX4uxތVӓaPUrJcpTJN6DZ>gs,~:ZrFNY[#ZsX%K m/%#N h7Krjͣj2=.E{ +}:c/>yE ,\u_;2:K3%=s1VCޭ]'2s[0:'KN,%K yZmsT{A4F NO0^4ڗ"ipYs4axM1V5 D/dyMkEIhxMkEE{.8Y XKׇY5 vԼfUG_L`0`͓9 !ZND2ANkkVDKS\ʢ?1 Lu+B=Ϩ4ؓtu[$=ؑ_9;v<х<*X3r쭜;ښ9hFVIs5̶[q+MVF`mq l&~Z-ْ?uͭPE}Js ` W``:0(o@@S -<` WА``:0D*o@@C -` WDU3VC' z"ht ÛKS)c$֖AZvyZmI |Qpf2D7zeZ5%>p*KjLM$ĒsYWu/x k0\Ǵ4aMHxaRQ^R0o( QzZ(-TnMia%NQKzgDR2wB3EdliouQdtWZRu xS7 sgT$" cTjhKs^"Uz^;H{/hu<]ɨÓ%K 'L#ZuL)sRfX%sI$9!eU˓=ח4|p;A kԖJ ^ڊO){R@Wr@sńɺh>YNERRUu̦yX1 Q>Et Pܪ| e L1"5"7TuO@ [$pH -7'y˼녞t# ܟMa2R0P5ir%a9Xoxs %zw5?If*߽C7g ٽ}<`'.ܶŌ]|UC=A떩D㏦1s1v/t#.0C%I%7M`%upAAcPu~O[}6?7}6?alGSAq2F'owbIR;ad1AZr}gXVms ?]xѬm)s).E;꟪X7PZF F+U4IUh:UsxdLUuLע /%:bV5`x:0S*oXXS -` WSU3VC@ (bx`:0m*o@@C ->` Wm``:0|*o@@S -<` W|``:0+o@@C -` WU3VC(ZL!RrmF|*5M=s9YݸvM'` +0Geߴ|}Ca{coO)TPKThJc^&U0; ] ]qM3tqAǕ!g菦L8U VeT2#H?cQU$AtDX͠slXcUo׌ִy%uS7R3#Bм<`K5Q@K~0jr)u3C|&Ѐ[Q|lnZEce1P|Z.xJ/y'w8UT]Y,Ra:[\i쓢J; ƙ'ENƴ h!Sbܪ"P ZȦ"DBS74aP}kUpOciRՌCAdnXXp׉/{#OzdY #ܪi:(- %pbYUmjұධF*י * bH@+ \Y蛣h!U*@S k8̺5-!EYlU~ӻO{HH:uFn8.Ch7< AGf8`)?kX ʑcgy>죀iكz&u֠ht0ֻwok(@kqicژrkcmIד{l~O{ySVN-pjvcbA)kc()xw4\}c=z!d)틂´6| F{M;b=z!$ZR8kω 97sncsODRP0snvwhI}?ghI}?w0Zu$͎MD8;6Ik(| -:f&u C$t< `x:0+oXXS -` WU3VC@ )fx`:0 ,o@@C ->` W ``:0,o@@S -<` W``:0-o@@C -` WU3VC)VצВܬ#Invl\=:6In .BGhInv$' ',Q"w6Ei$^F!QY1$Ecڃo+l$)KBsKѡ4uて"ؾ4X9E^$"ׁ[bʕX% djK#D"w3J.RNT( GA)Vm{ԨQZ Ak Α.NorvO rsP_e)#v0WL\ӴI\nO[wSQW(Jʥ-TK:-UT{uB~jk^JRy͹$_ay6lWas6j.s#06Y>6Y|)QO}3KnBh(T2wL#]B\Z㌠N.RrP0ixWG';gWG';oWD e~uAU-U8l^4/v7I"(i=(-Aʚ!h5`H|qY nHJ3-NUxhQ{[<,|jyҤYH}&ې6z.ݺTdTZ;^eex)S-]\Љͭ+R]]7s""B~|96s&2Val/Uemr۵M{HŮbDUn>\i&X?T'VgEhND nVPeDvِG( K#x#A 8{QP`x:0-oXXS -` WU3VC@ *jx`:0-o@@C ->` W``:0-o@@S -<` WÕ``:0)/o@@C -` W)U3VC*=ppo봪r(Ja UD4R"K&Z݀oߩ2tϭ9jd b2hV)🕗PPʑufH_Wt7dLߪBk+jifV>}8+nN8u%i|(JT?~UU>W`%p438GRAI!(jq9\x^GzLyˬ!NQ_K ﶸo6vSኞ^?Sγw!m'/P{wHo{7$ +d6T+ &i4SGjy>stj<2}{Wm!3tσMĈ`Ȍ/=r*Nu[!dKidM 2cMO&¿[Koݲ`l6h˂ 9,\cxLOuDo#&q(6BK.X%ma֔B?;ןS+u_QKQS rݩS:Yx|Ɏ'76ʥ'ƞ4I{ 'L y&JI(u9OFD/^篚E \O8b@E';\?LXojf^˿ &ݵTd0K1Fxƃi8 (@դtu5UkT|n= U L37Wpm<Y&L}=UzW%AytR@mWLִw^bRv `x:0N/oXXS -` WNU3VC@ +nx`:0n/o@@C ->` Wn``:0/o@@S -<` W``:00o@@C -` WU3VC+n@1`H *F@t}j1q Ge=P~`!mT̆dSaO;9H 8;#I^ihշp:͠s"?Y%|rtT?F.Տ ?/6b'}O ;o4Y&Ytb fI,!'BV;  zFP@ȬsVSjI->p ^8k(A"=FEيO^/E(Do|s4=W|WM`E?"]*T—tZJI_ṯM2BKÚU9J郸Z{˭<Uw~dҫjeWKk^Ec:~<Xb2W 5.*\z m9Ow-#o͗'qnAFEyf׷@[+:~ddpec\iHsy!,_b]2ށ!oF&׹^|WQtsz"^oA U󷻘&9 v1>Ad&LuaHtvpVfl/ xDZ^)7а0*Yd`"uiY2Pdv#ۢ.֩T[c݈j =)E!(<2ʡjDhQuTy0EcE%P8jG:P2g8RoqyRhtgg`x:01oXXS -` WU3VC@ ,rx`:0$1o@@C ->` W$``:061o@@S -<` W6``:02o@@C -` WU3VC,Ji[pTK@| w^vI,آu\[ ѯ7bO]!\UH(N.793z7J(OZS&XS Z%Jsd ?Z9FB@Y:N&+DGDMIbӈS:< 6.-]&Vҡ=n/4U5Y~ )U?C>%l]J=hO_NgR @Wȑ<.um~D13,SuDCʔuqiАkF7 vjP!QhdKmƲOA@dgRJ"C@Dѽc쩭вtv؇a p(lh)%k-؏THo7Oi.r Y5bQRdWQUTy \7N[dA[CarkM]('P>-raA@0}saK_726rR: dKBwE`@t_[g>?+hžfbթ[a$uJ"֗:u;w/7 Fj޿~RSU \ d>)wk$S}jiW KG $ 0'vPnmC ]voVs)A߿S4ɨɋǯ+=QJud)aLms*{8-*X>eߣ!S_7R[fR>3ErWbQf("U"~r`x:02oXXS -` WU3VC@ -vx`:02o@@C ->` Wƚ``:02o@@S -<` W՚``:0:4o@@C -` W:U3VC-~mnAXDp`U4S*(>b^n*!]3,$n;g逈d4 eWtb\tNqѵSщ+)oyd&N=xLX}C1s ndfzUfk5✁8.[!ߥ~`x=ŽYX1y?ve8+pjceNڭӉʫ2ˑ .DJ\cy\nnfCM[>isҮ^M:HǦ~ )2"}F`OezoQ?@(tPהeQݧ=r;6TG S Qr}lj*oi[d0ZP))\ۯB) {bA'gGO.{W6WpL;2&+Nwjne6E%*. egܱdɘ6xo+dߦI#¬$*'{"@chfZ1K=>;;`-࣡:zXsLh}[yֹO&ȜjUn8v/ {'Ae$ >ܶD#O02& dG'.[.Gb^ cY< e{|d\0\7<ѡmVƢC? 6y( j0m;Ǧh({3Y&rRšuvj5Fg"mx_nտN'š_wLǦ>Sʫ!€ J##2pv!/Ѡ6U3cSTh` Wc``:0r4o@@@S -<` Wr``:05o@@@C -` WНU3VC.U6s-`;Yfl(c~ K1l 8 ADЂͫ]+h\@6:PNF%EE,64I&({4QҵU8O?iRvKTZpAAjE",TReu@Up&m.!84DA) I)4>wzvxn&;B+V{R<~+ãi"PY'aܕۖ!FMJ3;rA/:GʗcPWSW ۳%=$_ŷ| לKK4RJw޸͙~ԐRyzy:<}<ϼrHyNϝ2)Vp㚪Dgas_5Hbe Bt 4kiYI-F *X7dBH;`-~In +}ٟwdo-.FָAi )},S( ~٦>{Loxh)EMS/z+ v*i C<܇GUd̀c,Nyȋ q0F[4g9u$w*ywi5JWe3wرH4[=],4.[@r'm\C],w:)d[v[fZ @H?aυe\*%˻i=Ӽ%-t_}O6 Y;pyi#TLiΒu_X9kŶ- tWV3Q5_+!_pK_ZV/y ݢv1#DBUtkfF`l]0` W``:05o@@S -<` W``:07o@@C -` WU3VC/rx=M>LгtO УsYL ,S]2kwX`5 ?23ͣDݪdX5Xf` W``:07o@@S -<` W``:09o@@C -` WU3VC0.͹J)2=E[U 6^Nqs1jw;TAEAi>ZzM [hP><&݊ =֯9Zô*5rH `PoO ldYYӉ3ޤ{IUē됆}[PB¡|{EG˵}k{v9qEBo7oҐSJԖ _l v9 wd((0 Yȗ}(cXJN eVn_5!y#>~Ayp60:o #~ 'H(D`YeOJ5 YWcvO^w~av n*ȓjaovHP@!B zwtNj_ȵ>-!JhQpDžG~F]_\.y!\y{9E1!v|41Ңqc c=|'r)P_` W``:09o@@S -<` Wš``:0;o@@C -` WU3VC1khz5$ tY5F7.J Z6 qLp}'EJwY,MmNH]K+];YI[T6Iip !r>흔f)k)y*YxJ4cs׭Eʼ| ްjb \=,XV p~/&Ɔka\;<[9pA [0mx?5Hg6.t̰?{d{ۆw Ӓu.=&sv<OHDj>ڑ]ȧ.YBAzMlx` W``:0hԕ*UZ+ @mjvMiJ-SJ@:nleK@k+Ж5Mzz8@z޽IK'e -ѯ0bk7I2 ׎X:H: X&;_:UTB-hz6LռnFj$60̰N8g*9 >4۬=!>P(PZQbā1(T?m SDDH욛&l@6̖tDIF̐L­P%gp7*D8&>nզ+ɿ.yUYRA]$,9;dny+q_q9\L7A)4!+ޱpq7yWav˅+ȱ4^ܢ1ohsIz@D UE,<gTtM:!|*_:˚'ˈv0j]),PL`x:0=oXXS -` WU3VC@ 3Px`:0=o@@C ->` W``:0 >o@@S -<` W ``:0?o@@C -` WU3VC3nZ٫s+'VJ*Q/Γ\OMɶMF!wS`DlBY P7Sdhv!_)IIPj q 08UeRm)jcJ&hɬێ+`,RV}Y[0\50+Ҝ0KP  kj !qHd@@i8;R6Kr?m#7)E]oKuEpmb#.9K/M^?b PeatޓCX:7#JF֨]=Eߑz:h&赉[>Zpzuz4J󾫎inGQ*/+mbLG ]RaX8~\UB'Mdn{MO47|56wt7Ji3nW_!T"Q̱C1 𧥦'UxHm*9y" JN '=0`*yDm̎S3'?33&?#㓟S31R>PA@n|FR,br rbvr-9qRүJQJ~TɪK.0#` #Ḥ5k!]ƜS*~<.U,ǀ8n#\K|Ҳ1k=y ۇBSW$ |yOާ “iWW˪HwŜj%d<בpG"jS]r]BC5%F>.H/ncmb-}Ggx1:MIfzzB+eぷOn]ۛƴXs:( N`?O᝖w{w; c^xTPK`x:0?oXXS -` WU3VC@ 4D|x`:0?o@@C ->` W``:0?o@@S -<` W`:0@oC -` WU3VC|4EPUߑiQ'Basler_Ace_USB_5508e950_Version_1_0.xmlGCV0PKi8 `:0Ho@@S` W#``:0Ho@@C->` Wư``:0Ho@@!S ` W۰0``:0Io@@!C ->` W``:0Io@@!S` W#``:0Io@@!C->` W``:0"Io@@JsS ` W"1``:0CIo@@JsC ->` WC`h:0qIoFFJsS ` Wq0 h`:0Io@@JsC ->` W``:0Io@@JsS` Wұ#2``:0Io@@JsC->` Wر``:0Io@@JsS ` Wܱ0``:0Io@@JsC ->` W`h:0JoFFJsS ` W0 h`:03Jo@@JsC ->` W3``:0^Jo@@JsS` W^#(``:0dJo@@JsC->` Wd``:0fJo@@JsS ` Wf1``:0Jo@@JsC ->` W``:0Jo@@JsS` W#``:0Jo@@JsC->` W``:0Jo@@JsS ` W0``:0Jo@@JsC ->` WŲ``:0Jo@@JsS` WDz#``:0Jo@@JsC->` W˲``:0Jo@@JsS ` WͲ1``:0Jo@@JsC ->` W`h:0KoFFJsS ` W0 h`:0NKo@@JsC ->` WN``:0zKo@@JsS` Wz#2``:0Ko@@JsC->` W``:0Ko@@JsS ` W0``:0Ko@@JsC ->` W`h:0KoFFJsS ` W0 h`:0Ko@@JsC ->` W``:0Lo@@JsS` W#(``:0 Lo@@JsC->` W ``:0#Lo@@JsS ` W#1``:0FLo@@JsC ->` WF``:0kLo@@CsS` Wk#``:0sLo@@CsC->` Ws``:0uLo@@CsS ` Wu0``:0Lo@@CsC ->` W``:0Lo@@CsS` W#``:0Lo@@CsC->` W``:0Lo@@CsS ` W1``:0Lo@@CsC ->` WĴ`h:0LoFFCsS ` W0 h`:0#Mo@@CsC ->` W#``:0OMo@@CsS` WO#2``:0TMo@@CsC->` WT``:0VMo@@CsS ` WV0``:0xMo@@CsC ->` Wx`h:0zMoFFCsS ` Wz0 h`:0Mo@@CsC ->` W``:0Mo@@CsS` W#(``:0Mo@@CsC->` W``:0Mo@@CsS ` W1``:0No@@CsC ->` W``:0$o@@ӚS` W$#``:03o@@ӚC->` W3``:09o@@ӚS ` W90``:0oo@@ӚC ->` Wo``:0xo@@ӚS` Wx#``:0o@@ӚC->` W``:0o@@ӚS ` W1``:0o@@ӚC ->` W``:0o@@ӚS ` W ``:0>o@@ӚC ->` W> `h:0WoFFӚS ` WW 0 h`:0o@@ӚC ->` W ``:0o@@ӚS` W #2``:0ɡo@@ӚC->` W ``:0Сo@@S ` W 0``:0o@@C ->` W `h:0oFFS ` W 0 h`:0+o@@C ->` W+ ``:0Xo@@S` WX #(``:0]o@@C->` W] ``:0bo@@ܚS ` Wb 1``:0o@@ܚC ->` W ``:0o@@ܚS` W #``:0o@@ܚC->` W ``:0o@@S ` W 0``:0ɢo@@C ->` W ``:0͢o@@S` W #``:0Ѣo@@C->` W ``:0բo@@֚S ` W 1``:0o@@֚C ->` W `h:0,oFF֚S ` W, 0 h`:0_o@@֚C ->` W_ ``:0o@@֚S` W #2``:0o@@֚C->` W ``:0o@@S ` W 0``:0o@@C ->` W `h:0oFFS ` W 0 h`:0o@@C ->` W ``:0o@@S` W #(``:0o@@C->` W ``:0o@@@ޚS ` W 1``:0?o@@@ޚC ->` W? ``:0Qo@@@ؚS ` WQ ``:08o@@@ؚC ->` W8 ``:0Jo@@њS -<` WJ ``:0o@@њC -` W``:0Ͳo@@ӚS -<` W``:0o@@ӚC -` W``:0o@@КS ` W``:0No@@КC ->` WN``:0_o@@КS ` W_``:0Ho@@КC ->` WH`t:0aoTT@՚S -` WaProvoke Pipe Errort`:0ho@@@՚C ->` Wh)`t:0oTTךS -` W)Provoke Pipe Errort`:0o@@ךC ->` W)``:0o@@ܚS ` W)``:0o@@ܚC ->` W)`x:0oXXܚS -` W*U3VC@ x`:0o@@ܚC ->` W*``:05o@@ܚS -<` W5*`p:0oPPܚC -` W*U3VC2px:0oXXךS -` W*U3VC@ x`:0o@@ךC ->` W*``:0o@@@՚S -<` W*`t:0qoTT@՚C -` Wq+U3VC tx:0oXXКS -` W+U3VC@ x`:0o@@КC ->` W+``:0o@@ӚS -<` W+`t:0,oTTӚC -` W,,U3VCtx:0UoXXњS -` WU,U3VC@ x`:0ao@@њC ->` Wa,``:0yo@@@ؚS -<` Wy,`p:0oPP@ؚC -` W,U3VCpx:0 oXX֚S -` W -U3VC@ x`:0o@@֚C ->` W-``:0'o@@ܚS -<` W'-`p:0oPPܚC -` W-U3VCp`:0o@@ӚS` W-#``:0o@@ӚC->` W-``:0o@@S ` W-0``:0o@@C ->` W.``:0+o@@S` W+.#``:06o@@C->` W6.``:0>o@@ԚS ` W>.1``:0bo@@ԚC ->` Wb.`h:0oFFԚS ` W.0 h`:0o@@ԚC ->` W.``:0o@@ԚS` W.#2``:0o@@ԚC->` W/``:0 o@@S ` W /0``:00o@@C ->` W0/`h:05oFFS ` W5/0 h`:0fo@@C ->` Wf/``:0o@@S` W/#(``:0o@@C->` W/``:0o@@ݚS ` W/1``:0o@@ݚC ->` W/``:0o@@ݚS` W/#``:0o@@ݚC->` W/``:0o@@S ` W/0``:0o@@C ->` W/``:0o@@S` W/#``:0o@@C->` W/``:0o@@@ۚS ` W01``:0#o@@@ۚC ->` W#0`h:0UoFF@ۚS ` WU00 h`:0o@@@ۚC ->` W0``:0o@@@ۚS` W0#2``:0o@@@ۚC->` W0``:0o@@S ` W00``:0o@@C ->` W0`h:0oFFS ` W00 h`:0o@@C ->` W1``:0@o@@S` W@1#(``:0Eo@@C->` WE1``:0Io@@@ҚS ` WI11``:0lo@@@ҚC ->` Wl1`x:0|oXX@ۚS -` W|1U3VC@ x`:0o@@@ۚC ->` W1``:0o@@ݚS -<` W1`t:0oTTݚC -` W2U3VCtx:0"oXXԚS -` W"2U3VC@ x`:0?o@@ԚC ->` W?2``:0Io@@ӚS -<` WI2`t:0oTTӚC -` W2U3VCtx:0oXXܚS -` W2U3VC@  x`:0o@@ܚC ->` W2``:0o@@֚S -<` W2`t:0LoTT֚C -` WL3U3VCtx:0XoXX@ؚS -` WX3U3VC@ x`:0uo@@@ؚC ->` Wu3``:0o@@њS -<` W3`p:0oPPњC -` W3U3VCpx:0oXXӚS -` W3U3VC@ x`:0 o@@ӚC ->` W 4``:0o@@КS -<` W4`p:0yoPPКC -` Wy4U3VC px:0oXX@՚S -` W4U3VC@ x`:0o@@@՚C ->` W4``:0o@@ךS -<` W4`p:0oPPךC -` W5U3VC px:0oXXܚS -` W5U3VC@ x`:0` W<5``:0Fo@@ܚS -<` WF5`p:0oPPܚC -` W5U3VC p`:0o@@@՚S ` W5``:0o@@@՚C ->` W7``:0o@@КS -<` W7``:0o@@КC -` W7``:0o@@ӚS ` W7``:0o@@ӚC ->` W8`x:0oXXӚS -` W9U3VC@ @x`:0o@@ӚC ->` W9``:0o@@њS -<` W9`:0soњC -` Ws:LLU3VC@ 106228-09x:0oXX@ؚS -` W:U3VC@ x`:0o@@@ؚC ->` W:``:0o@@֚S -<` W:`X:0o88֚C -` W;U3VC 106228-09;U;acA1920_25u;V1.1-8;0Xx:0oXXܚS -` W;U3VC@ \x`:0o@@ܚC ->` W;``:0 o@@ӚS -<` W <`p:0|oPPӚC -` W|]U3VCpx:0oXXԚS -` W]U3VC@ `x`:0o@@ԚC ->` W]``:0o@@ݚS -<` W]`p:0pPPݚC -` W~U3VCpx:0$pXX@ۚS -` W$U3VC@ dx`:01p@@@ۚC ->` W1``:0Ip@@@ۚS -<` WI`p:0v8pPP@ۚC -` WvU3VCpx:0QpXXݚS -` WйU3VC@  x`:0Qp@@ݚC ->` W``:0Qp@@ԚS -<` W`p:0SpPPԚC -` WU3VCpx:0_SpXXӚS -` W_U3VC@ x`:0xSp@@ӚC ->` Wx``:0Sp@@ܚS -<` W`p:0|TpPPܚC -` W|U3VCpx:0TpXX֚S -` WU3VC@ x`:0Tp@@֚C ->` W``:0Tp@@@ؚS -<` W`p:0UpPP@ؚC -` WU3VCpx:0UpXXњS -` WٽU3VC@ \x`:0Up@@њC ->` W``:04Vp@@ӚS -<` W4`p:0TwpPPӚC -` WTU3VCpx:0wpXXКS -` WU3VC@ `x`:0wp@@КC ->` W``:0wp@@@՚S -<` W`p:0fpPP@՚C -` WfU3VCpx:0ƙpXXܚS -` WU3VC@ dx`:0p@@ܚC ->` W``:0p@@ܚS -<` W`p:0dpPPܚC -` Wd#U3VCpx:0¼pXX@՚S -` W$U3VC@ Px`:0ټp@@@՚C ->` W$``:0p@@КS -<` W%`p:0 pPPКC -` W &U3VCpx:0pXXӚS -` W&U3VC@ x`:0p@@ӚC ->` W&``:0;p@@њS -<` W&`p:0տpPPњC -` W'U3VCpx:0BpXX@ؚS -` WB(U3VC@ x`:0cp@@@ؚC ->` Wc(``:0p@@֚S -<` W(`p:0MpPP֚C -` WM)U3VCpx:0pXXܚS -` W)U3VC@  x`:0p@@ܚC ->` W)``:0p@@ӚS -<` W)`p:0pPPӚC -` W*U3VCpx:0pXXԚS -` W*U3VC@ `x`:0p@@ԚC ->` W+``:0p@@ݚS -<` W+`p:0pPPݚC -` W,U3VCpx:0PpXX@ۚS -` WP,U3VC@ @x`:0ap@@@ۚC ->` Wa,``:0up@@@ۚS -<` Wu,`p:0KpPP@ۚC -` WK-U3VCpx:0pXXݚS -` W-U3VC@ x`:0p@@ݚC ->` W-``:0p@@ԚS -<` W-`p:0pPPԚC -` W.U3VCpx:0pXXӚS -` W.U3VC@ `x`:0p@@ӚC ->` W.``:0p@@ܚS -<` W/`p:0pPPܚC -` W/U3VCpx:0pXX֚S -` W0U3VC@ x`:0*p@@֚C ->` W*0``:0bp@@@ؚS -<` Wb0`p:0pPP@ؚC -` W1U3VCpx:03pXXњS -` W31U3VC@ `x`:0>p@@њC ->` W>1``:0\p@@ӚS -<` W\1`p:0-pPPӚC -` W-2U3VC px:0IpXXКS -` WI2U3VC@ ! x`:0Up@@КC ->` WU2``:0tp@@@՚S -<` Wt2`p:0PpPP@՚C -` WP3U3VC!px:0kpXXܚS -` Wk3U3VC@ "x`:0xp@@ܚC ->` Wx3``:0p@@ܚS -<` W3`p:0rpPPܚC -` Wr4U3VC"px:0pXX@՚S -` W4U3VC@ #x`:0p@@@՚C ->` W4``:0p@@КS -<` W4`p:0pPPКC -` W5U3VC#px:0pXXӚS -` W5U3VC@ $@x`:0p@@ӚC ->` W5``:0p@@њS -<` W5`p:0pPPњC -` W6U3VC$px:0pXX@ؚS -` W6U3VC@ %x`:0p@@@ؚC ->` W6``:0p@@֚S -<` W6`p:0pPP֚C -` W7U3VC%px:0pXXܚS -` W7U3VC@ &@x`:0p@@ܚC ->` W7``:0p@@ӚS -<` W8`p:0pPPӚC -` W8U3VC&px:0pXXԚS -` W8U3VC@ 'x`:0 p@@ԚC ->` W 9``:0p@@ݚS -<` W9`p:0pPPݚC -` W9U3VC'px:0pXX@ۚS -` W9U3VC@ (x`:0p@@@ۚC ->` W:``:0#p@@@ۚS -<` W#:`p:0pPP@ۚC -` W;U3VC(px:04pXXݚS -` W4;U3VC@ )x`:0` W<;``:0Gp@@ԚS -<` WG;`p:04pPPԚC -` W4<U3VC)px:0DpXXӚS -` WD<U3VC@ *x`:0_p@@ӚC ->` W_<``:0jp@@ܚS -<` Wj<`p:09pPPܚC -` W9=U3VC*px:0HpXX֚S -` WH=U3VC@ +x`:0cp@@֚C ->` Wc=``:0mp@@@ؚS -<` Wm=`p:0MpPP@ؚC -` WM>U3VC+px:0[pXXњS -` W[>U3VC@ ,x`:0vp@@њC ->` Wv>``:0p@@ӚS -<` W>`p:0bpPPӚC -` Wb?U3VC,px:0ppXXКS -` Wp?U3VC@ -x`:0p@@КC ->` W?``:0p@@@՚S -<` W?`p:0spPP@՚C -` Ws@U3VC-px:0pXXܚS -` W@U3VC@ .@x`:0p@@ܚC ->` W@``:0p@@ܚS -<` W@`p:0xpPPܚC -` WxAU3VC.px:0pXX@՚S -` WAU3VC@ / x`:0p@@@՚C ->` WA``:0p@@КS -<` WA`p:0pPPКC -` WBU3VC/px:0pXXӚS -` WBU3VC@ 0 x`:0p@@ӚC ->` WB``:0p@@њS -<` WB`p:0pPPњC -` WCU3VC0px:0pXX@ؚS -` WCU3VC@ 1`x`:0p@@@ؚC ->` WC``:0p@@֚S -<` WC`p:0pPP֚C -` WDU3VC1px:0pXXܚS -` WEU3VC@ 2x`:0p@@ܚC ->` WE``:0p@@ӚS -<` WE`p:0pPPӚC -` WFU3VC2px:0pXXԚS -` WFU3VC@ 30px`:0p@@ԚC ->` WF``:0p@@ݚS -<` WF`p:0pPPݚC -` WGU3VC3px:0pXX@ۚS -` WGU3VC@ 44px`:0p@@@ۚC ->` WG``:0p@@@ۚS -<` WG`p:0pPP@ۚC -` WHU3VC4px:0pXXݚS -` WHU3VC@ 5x`:0p@@ݚC ->` WH``:0p@@ԚS -<` WI`p:0pPPԚC -` WIU3VC5pl:0+Counters provided by dumpcap:0G:0+laravis-ARAVIS_0_6_0/tools/wireshark-snapshots/PtGrey-Flea3-USB-Properties.txt000066400000000000000000000113571334570641500270730ustar00rootroot00000000000000 Bus 006 Device 009: ID 1e10:3300 Point Grey Research, Inc. Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 3.00 bDeviceClass 239 Miscellaneous Device bDeviceSubClass 2 bDeviceProtocol 1 Interface Association bMaxPacketSize0 9 idVendor 0x1e10 Point Grey Research, Inc. idProduct 0x3300 bcdDevice 0.00 iManufacturer 1 Point Grey Research iProduct 2 Flea3 FL3-U3-13Y3M iSerial 3 00D9BC3D bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 116 bNumInterfaces 3 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 224mA Interface Association: bLength 8 bDescriptorType 11 bFirstInterface 0 bInterfaceCount 3 bFunctionClass 239 Miscellaneous Device bFunctionSubClass 5 USB3 Vision bFunctionProtocol 0 iFunction 4 USB3 Vision Device Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 239 Miscellaneous Device bInterfaceSubClass 5 USB3 Vision bInterfaceProtocol 0 iInterface 0 ** UNRECOGNIZED: 14 24 01 00 00 01 00 00 00 01 00 05 06 07 08 09 0a 0b 0c 0c Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x02 EP 2 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0400 1x 1024 bytes bInterval 0 bMaxBurst 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0400 1x 1024 bytes bInterval 0 bMaxBurst 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 239 Miscellaneous Device bInterfaceSubClass 5 USB3 Vision bInterfaceProtocol 1 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0400 1x 1024 bytes bInterval 0 bMaxBurst 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 2 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 239 Miscellaneous Device bInterfaceSubClass 5 USB3 Vision bInterfaceProtocol 2 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0400 1x 1024 bytes bInterval 0 bMaxBurst 15 Binary Object Store Descriptor: bLength 5 bDescriptorType 15 wTotalLength 22 bNumDeviceCaps 2 USB 2.0 Extension Device Capability: bLength 7 bDescriptorType 16 bDevCapabilityType 2 bmAttributes 0x00000002 HIRD Link Power Management (LPM) Supported SuperSpeed USB Device Capability: bLength 10 bDescriptorType 16 bDevCapabilityType 3 bmAttributes 0x00 wSpeedsSupported 0x000c Device can operate at High Speed (480Mbps) Device can operate at SuperSpeed (5Gbps) bFunctionalitySupport 2 Lowest fully-functional device speed is High Speed (480Mbps) bU1DevExitLat 10 micro seconds bU2DevExitLat 512 micro seconds Device Status: 0x0000 (Bus Powered) aravis-ARAVIS_0_6_0/tools/wireshark-snapshots/Ximea-MQ013MG-ON-USB-Properties.txt000066400000000000000000000113761334570641500272720ustar00rootroot00000000000000 Bus 006 Device 008: ID 20f7:30b3 XIMEA Camera with CMOS sensor in Vision mode [MQ] Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 3.10 bDeviceClass 239 Miscellaneous Device bDeviceSubClass 2 bDeviceProtocol 1 Interface Association bMaxPacketSize0 9 idVendor 0x20f7 XIMEA idProduct 0x30b3 Camera with CMOS sensor in Vision mode [MQ] bcdDevice 0.00 iManufacturer 1 XIMEA iProduct 2 xiQ iSerial 10 39310250 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 116 bNumInterfaces 3 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 100mA Interface Association: bLength 8 bDescriptorType 11 bFirstInterface 0 bInterfaceCount 3 bFunctionClass 239 Miscellaneous Device bFunctionSubClass 5 USB3 Vision bFunctionProtocol 0 iFunction 3 USB3 Vision Device Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 239 Miscellaneous Device bInterfaceSubClass 5 USB3 Vision bInterfaceProtocol 0 iInterface 0 ** UNRECOGNIZED: 14 24 01 00 00 01 00 00 00 01 00 04 05 06 07 08 09 0a 00 0c Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x02 EP 2 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0400 1x 1024 bytes bInterval 0 bMaxBurst 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0400 1x 1024 bytes bInterval 0 bMaxBurst 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 239 Miscellaneous Device bInterfaceSubClass 5 USB3 Vision bInterfaceProtocol 2 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0400 1x 1024 bytes bInterval 0 bMaxBurst 15 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 2 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 239 Miscellaneous Device bInterfaceSubClass 5 USB3 Vision bInterfaceProtocol 1 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0400 1x 1024 bytes bInterval 0 bMaxBurst 0 Binary Object Store Descriptor: bLength 5 bDescriptorType 15 wTotalLength 22 bNumDeviceCaps 2 USB 2.0 Extension Device Capability: bLength 7 bDescriptorType 16 bDevCapabilityType 2 bmAttributes 0x00000002 HIRD Link Power Management (LPM) Supported SuperSpeed USB Device Capability: bLength 10 bDescriptorType 16 bDevCapabilityType 3 bmAttributes 0x00 wSpeedsSupported 0x000c Device can operate at High Speed (480Mbps) Device can operate at SuperSpeed (5Gbps) bFunctionalitySupport 3 Lowest fully-functional device speed is SuperSpeed (5Gbps) bU1DevExitLat 0 micro seconds bU2DevExitLat 0 micro seconds Device Status: 0x0000 (Bus Powered) aravis-ARAVIS_0_6_0/tools/wireshark-snapshots/gc1380-10x20image.wsk000066400000000000000000001073241334570641500246150ustar00rootroot00000000000000òᭃK22?lE$@@ *+\t5LBᭃK**?l1SE3 O *+ *+t\1S *+ *+ProsilicaGC1380H (02-2142A)1.36.0 02-2142A-06241lapp-vicam02ᭃK661S?lE(@@f *+ *+ dtjB ᭃK<<?l1SE(3 B *+ *+tdᭃK661S?lE(@@f *+ *+ dtjB 8ᭃK<<?l1SE(3 A *+ *+tdpᭃKv661S?lE(@@f *+ *+ dtjB 4ᭃK<<?l1SE(3 @ *+ *+tdᭃK661S?lE(@@f *+ *+ dtjB ᭃK4<<?l1SE(3 ? *+ *+td ᭃK661S?lE(@@f *+ *+ dtjB <ᭃK<<?l1SE(3 > *+ *+tdᭃK661S?lE(@@f *+ *+ dtjB @ᭃK;<<?l1SE(3! = *+ *+tdBw ᭃK661S?lE(@@f *+ *+ dtjB ᭃK<<?l1SE(3" < *+ *+td@ᭃK661S?lE(@@f *+ *+ dtjB$ᭃK><<?l1SE(3# ; *+ *+tdPᭃK661S?lE(@@f *+ *+ dtjB (ᭃK<<?l1SE(3$ : *+ *+td ᭃK::1S?lE,@@b *+ *+ dtjB ᭃK66?l1SE(3% 9 *+ *+td S^AAa ?H h4|hm>mR m| h| 1Xhdhm>mRm| mR h h! mnB!,o'h`Y^Nm4c6 h>h"  ,ᭃKd661S?lE(@@f *+ *+ dtjB ᭃK<<?l1SE(3& 8 *+ *+td ᭃK::1S?lE,@@b *+ *+ dtjB ᭃKFF?l1SE83' ' *+ *+td$ lapp-vicam02⭃K]::1S?lE,@@b *+ *+ \tjB ⭃K<<?l1SE,3( 2 *+ *+t\1S㭃K::1S?lE,@@b *+ *+ \tjB 㭃K22?lE$@@ *+\t5LB㭃K<<?l1SE,3) 1 *+ *+t\1S㭃K@**?l1SE3* @ *+ *+t\1S *+ *+ProsilicaGC1380H (02-2142A)1.36.0 02-2142A-06241lapp-vicam02䭃K::1S?lE,@@b *+ *+ \tjB 䭃K<<?l1SE,3+ / *+ *+t\1S孃K22?lE$@@ *+\t5LB孃Kp::1S?lE,@@b *+ *+ \tjB 孃K**?l1SE3, > *+ *+t\1S *+ *+ProsilicaGC1380H (02-2142A)1.36.0 02-2142A-06241lapp-vicam02孃K<<?l1SE,3- - *+ *+t\1S歃K6::1S?lE,@@b *+ *+ \tjB 歃Kn<<?l1SE,3. , *+ *+t\1S筃K::1S?lE,@@b *+ *+ \tjB 筃KЇ22?lE$@@ *+\t5LB 筃K<<?l1SE,3/ + *+ *+t\ 1S筃KQ**?l1SE30 : *+ *+t\ 1S *+ *+ProsilicaGC1380H (02-2142A)1.36.0 02-2142A-06241lapp-vicam02譃K6::1S?lE,@@b *+ *+ \tjB 譃K<<?l1SE,31 ) *+ *+t\ 1S魃K::1S?lE,@@b *+ *+ \tjB 魃K22?lE$@@ *+\t5LB 魃K<<?l1SE,32 ( *+ *+t\ 1S魃K**?l1SE33 7 *+ *+t\ 1S *+ *+ProsilicaGC1380H (02-2142A)1.36.0 02-2142A-06241lapp-vicam02ꭃK^**1S?l?l *+ *+ ꭃK:<<?l1S1S *+ ?l *+ꭃK8::1S?lE,@@b *+ *+ \tjB ꭃKr<<?l1SE,34 & *+ *+t\1S뭃K::1S?lE,@@b *+ *+ \tjB 뭃K22?lE$@@ *+\t5LB뭃K<<?l1SE,35 % *+ *+t\1S뭃K**?l1SE36 4 *+ *+t\1S *+ *+ProsilicaGC1380H (02-2142A)1.36.0 02-2142A-06241lapp-vicam02쭃KƄ::1S?lE,@@b *+ *+ \tjB 쭃K<<?l1SE,37 # *+ *+t\1S쭃K"661S?lE(@@f *+ *+ AtjB 쭃K*$<<?l1SE(38 & *+ *+tA쭃K$661S?lE(@@f *+ *+ AtjB 8쭃K%<<?l1SE(39 % *+ *+tAp쭃K&661S?lE(@@f *+ *+ AtjB 쭃KB'<<?l1SE(3: $ *+ *+tA 쭃K'661S?lE(@@f *+ *+ AtjB <쭃K(<<?l1SE(3; # *+ *+tA쭃K)661S?lE(@@f *+ *+ AtjB @쭃KD*<<?l1SE(3< " *+ *+tABw 쭃K*661S?lE(@@f *+ *+ AtjB 4쭃K+<<?l1SE(3= ! *+ *+tA쭃K,::1S?lE,@@b *+ *+ AtjB 쭃KX-<<?l1SE(3>  *+ *+tA쭃K-661S?lE(@@f *+ *+ AtjB 쭃K.<<?l1SE(3?  *+ *+tA@쭃K:/661S?lE(@@f *+ *+ AtjB $쭃Kw0<<?l1SE(3@  *+ *+tA P쭃K0661S?lE(@@f *+ *+ AtjB (쭃K 2<<?l1SE(3A  *+ *+tA 쭃K2::1S?lE,@@b *+ *+ AtjB 쭃KP4<<?l1SE,3B  *+ *+tA lapp쭃K4661S?lE(@@f *+ *+ AtjB 1쭃K)6<<?l1SE(3C  *+ *+tA 쭃K6661S?lE(@@f *+ *+ AtjB 0쭃K7<<?l1SE(3D  *+ *+tA 쭃K%8661S?lE(@@f *+ *+ AtjB0쭃Kb9<<?l1SE(3E  *+ *+tA쭃K9661S?lE(@@f *+ *+ AtjB0쭃K:<<?l1SE(3F  *+ *+tA쭃Ke;661S?lE(@@f *+ *+ AtjB14쭃K<<<?l1SE(3G  *+ *+tA_`쭃K=661S?lE(@@f *+ *+ AtjB10쭃K;><<?l1SE(3H  *+ *+tA$쭃K>661S?lE(@@f *+ *+ AtjB0쭃K?<<?l1SE(3I  *+ *+tAY쭃K0@661S?lE(@@f *+ *+ AtjB1쭃KpA<<?l1SE(3J  *+ *+tA쭃KA661S?lE(@@f *+ *+ AtjB1쭃KC<<?l1SE(3K  *+ *+tA쭃KC661S?lE(@@f *+ *+ AtjB!쭃KD<<?l1SE(3L  *+ *+tA"쭃KE661S?lE(@@f *+ *+ AtjB!쭃K^F<<?l1SE(3M  *+ *+tA쭃KF661S?lE(@@f *+ *+ AtjB!쭃K H<<?l1SE(3N  *+ *+tAP쭃KoH661S?lE(@@f *+ *+ AtjB!쭃KI<<?l1SE(3O  *+ *+tA쭃K J661S?lE(@@f *+ *+ AtjB!쭃KIK<<?l1SE(3P  *+ *+tAP쭃KK661S?lE(@@f *+ *+ AtjB!쭃KL<<?l1SE(3Q  *+ *+tA쭃KOM661S?lE(@@f *+ *+ AtjB쭃KN<<?l1SE(3R  *+ *+tA쭃KO661S?lE(@@f *+ *+ AtjB쭃KP<<?l1SE(3S  *+ *+tA쭃K6Q661S?lE(@@f *+ *+ AtjB쭃KtR<<?l1SE(3T  *+ *+tA쭃KR661S?lE(@@f *+ *+ AtjB쭃KT<<?l1SE(3U  *+ *+tA쭃KT661S?lE(@@f *+ *+ AtjB 쭃KU<<?l1SE(3V  *+ *+tA쭃KV661S?lE(@@f *+ *+ AtjB $쭃KWW<<?l1SE(3W  *+ *+tA 쭃KW661S?lE(@@f *+ *+ AtjB! 쭃KX<<?l1SE(3X  *+ *+tA!쭃KVY661S?lE(@@f *+ *+ AtjB"@쭃KZ<<?l1SE(3Y  *+ *+tA"쭃K661S?lE(@@f *+ *+ AtjB#A쭃K#<<?l1SE(3Z  *+ *+tA# 쭃K661S?lE(@@f *+ *+ AtjB$A 쭃K<<?l1SE(3[  *+ *+tA$쭃K)661S?lE(@@f *+ *+ AtjB%A쭃Ke<<?l1SE(3\  *+ *+tA%쭃K661S?lE(@@f *+ *+ AtjB&A쭃K<<?l1SE(3]  *+ *+tA& 쭃K^661S?lE(@@f *+ *+ AtjB'A 쭃K<<?l1SE(3^  *+ *+tA'쭃K661S?lE(@@f *+ *+ AtjB(A쭃KB<<?l1SE(3_  *+ *+tA( 쭃K661S?lE(@@f *+ *+ AtjB)A 쭃K<<?l1SE(3`  *+ *+tA)쭃K@661S?lE(@@f *+ *+ AtjB*A쭃K~<<?l1SE(3a  *+ *+tA*쭃K1661S?lE(@@f *+ *+ AtjB+AH쭃Km<<?l1SE(3b  *+ *+tA+쭃K661S?lE(@@f *+ *+ AtjB,AL쭃K<<?l1SE(3c  *+ *+tA,!쭃Ko661S?lE(@@f *+ *+ AtjB-A@쭃K<<?l1SE(3d  *+ *+tA-쭃K 661S?lE(@@f *+ *+ AtjB.AH쭃KG<<?l1SE(3e  *+ *+tA.쭃K661S?lE(@@f *+ *+ AtjB/AL쭃K<<?l1SE(3f  *+ *+tA/!쭃K@661S?lE(@@f *+ *+ AtjB0AH쭃K|<<?l1SE(3g  *+ *+tA0쭃K661S?lE(@@f *+ *+ AtjB1AL쭃K <<?l1SE(3h  *+ *+tA1!쭃K661S?lE(@@f *+ *+ AtjB2P쭃K<<?l1SE(3i  *+ *+tA23쭃Ka661S?lE(@@f *+ *+ AtjB3Q@쭃K<<?l1SE(3j  *+ *+tA3쭃K661S?lE(@@f *+ *+ AtjB4QH쭃KA<<?l1SE(3k  *+ *+tA4쭃K661S?lE(@@f *+ *+ AtjB5P쭃K<<?l1SE(3l  *+ *+tA53쭃Ku661S?lE(@@f *+ *+ AtjB6P쭃K<<?l1SE(3m  *+ *+tA63쭃K661S?lE(@@f *+ *+ AtjB7Qp쭃KX<<?l1SE(3n  *+ *+tA7쭃K661S?lE(@@f *+ *+ AtjB8Q`쭃K <<?l1SE(3o  *+ *+tA8W/쭃Kq661S?lE(@@f *+ *+ AtjB9Q`쭃K<<?l1SE(3p  *+ *+tA9W/쭃K-661S?lE(@@f *+ *+ AtjB:@쭃Kj<<?l1SE(3q  *+ *+tA:쭃K661S?lE(@@f *+ *+ AtjB;@쭃K1<<?l1SE(3r  *+ *+tA;쭃K661S?lE(@@f *+ *+ AtjB<쭃K<<?l1SE(3s  *+ *+tA<쭃K661S?lE(@@f *+ *+ AtjB=p쭃KZ<<?l1SE(3t  *+ *+tA=쭃K661S?lE(@@f *+ *+ AtjB>q쭃K<<?l1SE(3u  *+ *+tA>쭃KS661S?lE(@@f *+ *+ AtjB?q쭃K<<?l1SE(3v  *+ *+tA?쭃K 661S?lE(@@f *+ *+ AtjB@@쭃KQ<<?l1SE(3w  *+ *+tA@쭃K661S?lE(@@f *+ *+ AtjBAB쭃K<<?l1SE(3x  *+ *+tAA쭃K661S?lE(@@f *+ *+ AtjBB@쭃K<<?l1SE(3y  *+ *+tAB쭃K661S?lE(@@f *+ *+ AtjBC@쭃Kb<<?l1SE(3z  *+ *+tAC쭃K661S?lE(@@f *+ *+ AtjBD0쭃K<<?l1SE(3{  *+ *+tADY쭃KG661S?lE(@@f *+ *+ AtjBE0쭃K~<<?l1SE(3|  *+ *+tAEY쭃K 661S?lE(@@f *+ *+ AtjBF4쭃K^<<?l1SE(3}  *+ *+tAFg쭃K661S?lE(@@f *+ *+ AtjBG4쭃K<<?l1SE(3~  *+ *+tAG쭃KT661S?lE(@@f *+ *+ AtjBH4쭃K <<?l1SE(3  *+ *+tAH쭃K 661S?lE(@@f *+ *+ AtjBI4쭃K- <<?l1SE(3  *+ *+tAI쭃K 661S?lE(@@f *+ *+ AtjBJ1d쭃K <<?l1SE(3  *+ *+tAJW/쭃K\ 661S?lE(@@f *+ *+ AtjBK0쭃K <<?l1SE(3  *+ *+tAKY쭃K 661S?lE(@@f *+ *+ AtjBL4쭃K1 <<?l1SE(3  *+ *+tAL쭃K 661S?lE(@@f *+ *+ AtjBM4쭃K <<?l1SE(3  *+ *+tAM쭃K 661S?lE(@@f *+ *+ AtjBN4쭃K <<?l1SE(3  *+ *+tAN쭃K8 661S?lE(@@f *+ *+ AtjBO4쭃Kr <<?l1SE(3  *+ *+tAO쭃K 661S?lE(@@f *+ *+ AtjBP0쭃K <<?l1SE(3  *+ *+tAPY쭃Kt 661S?lE(@@f *+ *+ AtjBQ5쭃K <<?l1SE(3  *+ *+tAQ쭃K 661S?lE(@@f *+ *+ AtjBR5쭃KN <<?l1SE(3  *+ *+tAR쭃K 661S?lE(@@f *+ *+ AtjBS5쭃K <<?l1SE(3  *+ *+tAS쭃KD 661S?lE(@@f *+ *+ AtjBT5쭃K <<?l1SE(3  *+ *+tAT쭃K 661S?lE(@@f *+ *+ AtjBU0쭃K? <<?l1SE(3  *+ *+tAUY쭃K 661S?lE(@@f *+ *+ AtjBV5쭃K <<?l1SE(3  *+ *+tAV쭃K6 661S?lE(@@f *+ *+ AtjBW5쭃Kv <<?l1SE(3  *+ *+tAW쭃K 661S?lE(@@f *+ *+ AtjBX5쭃K  <<?l1SE(3  *+ *+tAX쭃Kl 661S?lE(@@f *+ *+ AtjBY5쭃K <<?l1SE(3  *+ *+tAY쭃K7 661S?lE(@@f *+ *+ AtjBZ쭃Kw <<?l1SE(3  *+ *+tAZ쭃K 661S?lE(@@f *+ *+ AtjB[@쭃K <<?l1SE(3  *+ *+tA[d쭃Kz 661S?lE(@@f *+ *+ AtjB\쭃K! <<?l1SE(3  *+ *+tA\쭃K" 661S?lE(@@f *+ *+ AtjB]쭃KO# <<?l1SE(3  *+ *+tA]쭃K# 661S?lE(@@f *+ *+ AtjB^쭃K$ <<?l1SE(3  *+ *+tA^쭃Ki% 661S?lE(@@f *+ *+ AtjB_d쭃K& <<?l1SE(3  *+ *+tA_쭃K*( 661S?lE(@@f *+ *+ AtjB` 쭃Ki) <<?l1SE(3  *+ *+tA`@쭃K) 661S?lE(@@f *+ *+ AtjBa@쭃K+ <<?l1SE(3  *+ *+tAad쭃K, ::1S?lE,@@b *+ *+ AtjBb  *+쭃K- <<?l1SE(3  *+ *+tAb쭃K1. ::1S?lE,@@b *+ *+ AtjBc 쭃K0 <<?l1SE(3  *+ *+tAc쭃Kr0 ::1S?lE,@@b *+ *+ AtjBd 쭃Km1 ?l1SE܇@@B *+ *+'UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU쭃K1 <<?l1SE(3  *+ *+tAd쭃KC2 ::1S?lE,@@b *+ *+ AtjBe 쭃K43 ?l1SE܇@@B *+ *+'UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU쭃K3 <<?l1SE(3  *+ *+tAe쭃K3 ::1S?lE,@@b *+ *+ AtjBf 쭃K4 ?l1SE܇@@B *+ *+'UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU쭃K45 <<?l1SE(3  *+ *+tAf쭃K5 ::1S?lE,@@b *+ *+ AtjBg @쭃K6 <<?l1SE(3  *+ *+tAg쭃K 661S?lE(@@f *+ *+ AtjBh 쭃K <<?l1SE(3  *+ *+tAh쭃KM ::1S?lE,@@b *+ *+ AtjBi @쭃K <<?l1SE(3  *+ *+tAi쭃K ::1S?lE,@@b *+ *+ AtjBj  *+쭃K <<?l1SE(3  *+ *+tAj쭃K: ::1S?lE,@@b *+ *+ AtjBk :쭃Km <<?l1SE(3  *+ *+tAk쭃K 661S?lE(@@f *+ *+ AtjBl!$쭃K <<?l1SE(3  *+ *+tAl쭃Kz 661S?lE(@@f *+ *+ AtjBm!(쭃K <<?l1SE(3  *+ *+tAm 쭃K 661S?lE(@@f *+ *+ AtjBn! 쭃K <<?l1SE(3  *+ *+tAn쭃K1 661S?lE(@@f *+ *+ AtjBo!,쭃K^ <<?l1SE(3  *+ *+tAo쭃K 661S?lE(@@f *+ *+ AtjBp!0쭃K <<?l1SE(3  *+ *+tAp쭃K6 661S?lE(@@f *+ *+ AtjBq"쭃Ke <<?l1SE(3  *+ *+tAq쭃K 661S?lE(@@f *+ *+ AtjBr!$쭃K <<?l1SE(3  *+ *+tAr쭃K 661S?lE(@@f *+ *+ AtjBs14쭃K. <<?l1SE(3  *+ *+tAs_`쭃K[ 661S?lE(@@f *+ *+ AtjBt10쭃K <<?l1SE(3  *+ *+tAt$쭃K 661S?lE(@@f *+ *+ AtjBu!(쭃K <<?l1SE(3  *+ *+tAu 쭃K! 661S?lE(@@f *+ *+ AtjBv14쭃K^ <<?l1SE(3  *+ *+tAv_`쭃K 661S?lE(@@f *+ *+ AtjBw10쭃K <<?l1SE(3  *+ *+tAw$쭃K ::1S?lE,@@b *+ *+ AtjBx0쭃K <<?l1SE(3  *+ *+tAx쭃KH2 VV?l1SEH@@Hr *+ *+':4Rq 쭃K3 ?l1SE@@G *+ *+':쭃K3 <<?l1SE,@@H *+ *+': UUK22?lE$@@ *+\t5LBK7**?l1SE3  *+ *+t\1S *+ *+ProsilicaGC1380H (02-2142A)1.36.0 02-2142A-06241lapp-vicam02K2 VV?l1SEH@@Ho *+ *+':4Rt% K3 ?l1SE@@G *+ *+':K3 <<?l1SE,@@H *+ *+': UUK2 VV?l1SEH@@Hl *+ *+':4Rx  K3 ?l1SE@@G *+ *+':K3 <<?l1SE,@@H *+ *+': UUףּK22?lE$@@ *+\t5LBףּK**?l1SE3  *+ *+t\1S *+ *+ProsilicaGC1380H (02-2142A)1.36.0 02-2142A-06241lapp-vicam02ףּK2 VV?l1SEH@@Hi *+ *+':4R{H ףּK3 ?l1SE@@G *+ *+':ףּK3 <<?l1SE,@@H *+ *+': UUKV661S?lE(@@f *+ *+ AtjBy KW<<?l1SE(3  *+ *+tAyKv2 VV?l1SEH@@Hf *+ *+':4R~+ K3 ?l1SE@@G *+ *+':K3 <<?l1SE,@@H *+ *+': UUK22?lE$@@ *+\t5LBKÔ**?l1SE3  *+ *+t\1S *+ *+ProsilicaGC1380H (02-2142A)1.36.0 02-2142A-06241lapp-vicam02K1 VV?l1SEH@@Hc *+ *+':4R: K3 ?l1SE@@G *+ *+':K3 <<?l1SE,@@H} *+ *+': UUKU2 VV?l1SEH@@H` *+ *+':4RyI K3 ?l1SE@@G *+ *+':K3 <<?l1SE,@@Hz *+ *+': UUK22?lE$@@ *+\t5LBK**?l1SE3  *+ *+t\1S *+ *+ProsilicaGC1380H (02-2142A)1.36.0 02-2142A-06241lapp-vicam02K 661S?lE(@@f *+ *+ AtjBz KK <<?l1SE(3  *+ *+tAzK82 VV?l1SEH@@H] *+ *+':4RQX Km3 ?l1SE@@G *+ *+':K{3 <<?l1SE,@@Hw *+ *+': UUK1 VV?l1SEH@@HZ *+ *+':4 Rgg K[3 ?l1SE@@G *+ *+': Kk3 <<?l1SE,@@Ht *+ *+':  UUK ::1S?lE,@@b *+ *+ AtjB{0K; <<?l1SE(3  *+ *+tA{K ::1S?lE,@@b *+ *+ AtjB| KQ <<?l1SE(3  *+ *+tA|K ::1S?lE,@@b *+ *+ AtjB} Kӫ <<?l1SE(3  *+ *+tA}K ::1S?lE,@@b *+ *+ AtjB~ K <<?l1SE(3  *+ *+tA~Kc::1S?lE,@@b *+ *+ \tjB K{22?lE$@@ *+\t5LBK<<?l1SE,3  *+ *+t\1SKz**?l1SE3  *+ *+t\1S *+ *+ProsilicaGC1380H (02-2142A)1.36.0 02-2142A-06241lapp-vicam02K˄::1S?lE,@@b *+ *+ \tjB K <<?l1SE,3  *+ *+t\1SK::1S?lE,@@b *+ *+ \tjB K22?lE$@@ *+\t5LBK<<?l1SE,3  *+ *+t\1SK3**?l1SE3  *+ *+t\1S *+ *+ProsilicaGC1380H (02-2142A)1.36.0 02-2142A-06241lapp-vicam02Kʄ::1S?lE,@@b *+ *+ \tjB K<<?l1SE,3  *+ *+t\1SK::1S?lE,@@b *+ *+ \tjB K22?lE$@@ *+\t5LBK<<?l1SE,3  *+ *+t\1SK**?l1SE3  *+ *+t\1S *+ *+ProsilicaGC1380H (02-2142A)1.36.0 02-2142A-06241lapp-vicam02aravis-ARAVIS_0_6_0/tools/wireshark-snapshots/gc1380-snap-320x200.wsk000066400000000000000000464017061334570641500247300ustar00rootroot00000000000000òφKwB22?lE$@@ *+t5LBφKmR m| h| 1Xhdhm>mRm| mR h h! mnB!,o'h`Y^Nm4c6 h>h"  ,φKa661S?lE(@@f *+ *+ CtjB φKb<<?l1SE( u *+ *+tC φKc::1S?lE,@@b *+ *+ CtjB φKeFF?l1SE8 d *+ *+tC$ lapp-vicam02φKn661S?lE(@@f *+ *+ (tjB φK<<?l1SE( s *+ *+t(φK661S?lE(@@f *+ *+ (tjB 8φK<<?l1SE( r *+ *+t(pφKU661S?lE(@@f *+ *+ (tjB φK <<?l1SE( q *+ *+t( φK 661S?lE(@@f *+ *+ (tjB <φK!<<?l1SE( p *+ *+t(φK#"661S?lE(@@f *+ *+ (tjB @φKM#<<?l1SE( o *+ *+t(Bw φK#661S?lE(@@f *+ *+ (tjB 4φK$<<?l1SE( n *+ *+t(φK$::1S?lE,@@b *+ *+ (tjB φK&<<?l1SE( m *+ *+t(φKB&661S?lE(@@f *+ *+ (tjB φKy'<<?l1SE( l *+ *+t(@φK'661S?lE(@@f *+ *+ (tjB $φKM)<<?l1SE( k *+ *+t( PφKv)661S?lE(@@f *+ *+ (tjB (φK*<<?l1SE( j *+ *+t( φK,+::1S?lE,@@b *+ *+ (tjB φK,<<?l1SE, e *+ *+t( lappφK/661S?lE(@@f *+ *+ (tjB 1φK90<<?l1SE( h *+ *+t( φKm0661S?lE(@@f *+ *+ (tjB 0φK1<<?l1SE( g *+ *+t( φK1661S?lE(@@f *+ *+ (tjB0φK3<<?l1SE( f *+ *+t(φK;3661S?lE(@@f *+ *+ (tjB0φKr4<<?l1SE( e *+ *+t(φK4661S?lE(@@f *+ *+ (tjB14φK5<<?l1SE( d *+ *+t(_`φK6661S?lE(@@f *+ *+ (tjB10φK7<<?l1SE( c *+ *+t(5φK8661S?lE(@@f *+ *+ (tjB0φK9<<?l1SE( b *+ *+t(YφK:661S?lE(@@f *+ *+ (tjB1φK<<<?l1SE( a *+ *+t(φK<661S?lE(@@f *+ *+ (tjB1φK=<<?l1SE( ` *+ *+t(φKh>661S?lE(@@f *+ *+ (tjB!φK?<<?l1SE( _ *+ *+t("φK?661S?lE(@@f *+ *+ (tjB!φK A<<?l1SE( ^ *+ *+t(φKJA661S?lE(@@f *+ *+ (tjB!φKB<<?l1SE( ] *+ *+t(PφK4C661S?lE(@@f *+ *+ (tjB!φKkD<<?l1SE( \ *+ *+t(φKD661S?lE(@@f *+ *+ (tjB!φKE<<?l1SE( [ *+ *+t(PφK F661S?lE(@@f *+ *+ (tjB!φKDG<<?l1SE( Z *+ *+t(φKwG661S?lE(@@f *+ *+ (tjBφKH<<?l1SE( Y *+ *+t(φKH661S?lE(@@f *+ *+ (tjBφKJ<<?l1SE( X *+ *+t(φKKJ661S?lE(@@f *+ *+ (tjBφKK<<?l1SE( W *+ *+t(φKK661S?lE(@@f *+ *+ (tjBφKL<<?l1SE( V *+ *+t(φKM661S?lE(@@f *+ *+ (tjB φKQN<<?l1SE( U *+ *+t(φK|N661S?lE(@@f *+ *+ (tjB $φKO<<?l1SE( T *+ *+t( φKO661S?lE(@@f *+ *+ (tjB! φK$Q<<?l1SE( S *+ *+t(!φKXQ661S?lE(@@f *+ *+ (tjB"@φKR<<?l1SE( R *+ *+t("φKR661S?lE(@@f *+ *+ (tjB#AφKT<<?l1SE( Q *+ *+t(# φK4T661S?lE(@@f *+ *+ (tjB$A φKlU<<?l1SE( P *+ *+t($φKU661S?lE(@@f *+ *+ (tjB%AφKV<<?l1SE( O *+ *+t(%φK&W661S?lE(@@f *+ *+ (tjB&AφKeX<<?l1SE( N *+ *+t(& φKX661S?lE(@@f *+ *+ (tjB'A φKY<<?l1SE( M *+ *+t('φKZ661S?lE(@@f *+ *+ (tjB(AφK9[<<?l1SE( L *+ *+t(( φKe[661S?lE(@@f *+ *+ (tjB)A φK\<<?l1SE( K *+ *+t()φK\661S?lE(@@f *+ *+ (tjB*AφK^<<?l1SE( J *+ *+t(*φK]^661S?lE(@@f *+ *+ (tjB+AHφK_<<?l1SE( I *+ *+t(+φK_661S?lE(@@f *+ *+ (tjB,ALφK`<<?l1SE( H *+ *+t(,!φK&a661S?lE(@@f *+ *+ (tjB-A@φKZb<<?l1SE( G *+ *+t(-φKb661S?lE(@@f *+ *+ (tjB.AHφKc<<?l1SE( F *+ *+t(.φKc661S?lE(@@f *+ *+ (tjB/ALφK)e<<?l1SE( E *+ *+t(/!φK]e661S?lE(@@f *+ *+ (tjB0AHφKf<<?l1SE( D *+ *+t(0φKf661S?lE(@@f *+ *+ (tjB1ALφKg<<?l1SE( C *+ *+t(1!φKOh661S?lE(@@f *+ *+ (tjB2PφKi<<?l1SE( B *+ *+t(23φKi661S?lE(@@f *+ *+ (tjB3Q@φKj<<?l1SE( A *+ *+t(3φK%k661S?lE(@@f *+ *+ (tjB4QHφK[l<<?l1SE( @ *+ *+t(4φKl661S?lE(@@f *+ *+ (tjB5PφKm<<?l1SE( ? *+ *+t(53φKn661S?lE(@@f *+ *+ (tjB6PφK;o<<?l1SE(! > *+ *+t(63φKBr661S?lE(@@f *+ *+ (tjB7QpφKs<<?l1SE(" = *+ *+t(7φKs661S?lE(@@f *+ *+ (tjB8Q`φKIu<<?l1SE(# < *+ *+t(8W/φKu661S?lE(@@f *+ *+ (tjB9Q`φKw<<?l1SE($ ; *+ *+t(9W/φKw661S?lE(@@f *+ *+ (tjB:@φKx<<?l1SE(% : *+ *+t(:φKLy661S?lE(@@f *+ *+ (tjB;@φKz<<?l1SE(& 9 *+ *+t(;φKz661S?lE(@@f *+ *+ (tjB<φK&|<<?l1SE(' 8 *+ *+t(<φK|661S?lE(@@f *+ *+ (tjB=pφK}<<?l1SE(( 7 *+ *+t(=φK~661S?lE(@@f *+ *+ (tjB>qφK\<<?l1SE() 6 *+ *+t(>φK661S?lE(@@f *+ *+ (tjB?qφK<<?l1SE(* 5 *+ *+t(?φK661S?lE(@@f *+ *+ (tjB@@φK˂<<?l1SE(+ 4 *+ *+t(@φK0661S?lE(@@f *+ *+ (tjBABφKs<<?l1SE(, 3 *+ *+t(AφK661S?lE(@@f *+ *+ (tjBB@φKN<<?l1SE(- 2 *+ *+t(BφKЊ661S?lE(@@f *+ *+ (tjBC@φK<<?l1SE(. 1 *+ *+t(CφKЌ661S?lE(@@f *+ *+ (tjBD0φK<<?l1SE(/ 0 *+ *+t(DYφKt661S?lE(@@f *+ *+ (tjBE0φK<<?l1SE(0 / *+ *+t(EYφK 661S?lE(@@f *+ *+ (tjBF4φK֑<<?l1SE(1 . *+ *+t(FgφK;661S?lE(@@f *+ *+ (tjBG4φKz<<?l1SE(2 - *+ *+t(GφKٓ661S?lE(@@f *+ *+ (tjBH4φK<<?l1SE(3 , *+ *+t(HφK661S?lE(@@f *+ *+ (tjBI4φKǖ<<?l1SE(4 + *+ *+t(IφK)661S?lE(@@f *+ *+ (tjBJ1dφKp<<?l1SE(5 * *+ *+t(JW/φK661S?lE(@@f *+ *+ (tjBK0φK-<<?l1SE(6 ) *+ *+t(KYφK661S?lE(@@f *+ *+ (tjBL4φKΛ<<?l1SE(7 ( *+ *+t(LφK7661S?lE(@@f *+ *+ (tjBM4φKv<<?l1SE(8 ' *+ *+t(MφKѝ661S?lE(@@f *+ *+ (tjBN4φK <<?l1SE(9 & *+ *+t(NφKk661S?lE(@@f *+ *+ (tjBO4φK<<?l1SE(: % *+ *+t(OφK661S?lE(@@f *+ *+ (tjBP0φKZ<<?l1SE(; $ *+ *+t(PYφK661S?lE(@@f *+ *+ (tjBQ5φK<<?l1SE(< # *+ *+t(QφKY661S?lE(@@f *+ *+ (tjBR5φK<<?l1SE(= " *+ *+t(RφK661S?lE(@@f *+ *+ (tjBS5φK4<<?l1SE(> ! *+ *+t(SφK661S?lE(@@f *+ *+ (tjBT5φKӨ<<?l1SE(?  *+ *+t(TφK>661S?lE(@@f *+ *+ (tjBU0φK<<?l1SE(@  *+ *+t(UYφK661S?lE(@@f *+ *+ (tjBV5φK"<<?l1SE(A  *+ *+t(VφK661S?lE(@@f *+ *+ (tjBW5φKɭ<<?l1SE(B  *+ *+t(WφK#661S?lE(@@f *+ *+ (tjBX5φKa<<?l1SE(C  *+ *+t(XφKٯ661S?lE(@@f *+ *+ (tjBY5φK<<?l1SE(D  *+ *+t(YφK661S?lE(@@f *+ *+ (tjBZφKݲ<<?l1SE(E  *+ *+t(ZφK>661S?lE(@@f *+ *+ (tjB[@φK~<<?l1SE(F  *+ *+t([dφK661S?lE(@@f *+ *+ (tjB\φK<<?l1SE(G  *+ *+t(\φK{661S?lE(@@f *+ *+ (tjB]φK<<?l1SE(H  *+ *+t(]φK661S?lE(@@f *+ *+ (tjB^φK`<<?l1SE(I  *+ *+t(^φK˹661S?lE(@@f *+ *+ (tjB_dφK<<?l1SE(J  *+ *+t(_φK661S?lE(@@f *+ *+ (tjB`"φKѽ<<?l1SE(K  *+ *+t(`φKR661S?lE(@@f *+ *+ (tjBa φK<<?l1SE(L  *+ *+t(aφK::1S?lE,@@b *+ *+ (tjBb @φKN<<?l1SE(M  *+ *+t(bφK::1S?lE,@@b *+ *+ (tjBc  *+φKZ<<?l1SE(N  *+ *+t(cφK::1S?lE,@@b *+ *+ (tjBd φK<<?l1SE(O  *+ *+t(dφK661S?lE(@@f *+ *+ (tjBe!$φKT<<?l1SE(P  *+ *+t(eφK661S?lE(@@f *+ *+ (tjBf!(φK<<?l1SE(Q  *+ *+t(f@φKp661S?lE(@@f *+ *+ (tjBg! φK<<?l1SE(R  *+ *+t(gφK 661S?lE(@@f *+ *+ (tjBh!,φKD<<?l1SE(S  *+ *+t(hφK661S?lE(@@f *+ *+ (tjBi!0φK<<?l1SE(T  *+ *+t(iφK::1S?lE,@@b *+ *+ (tjBj4φKU<<?l1SE(U  *+ *+t(jφK::1S?lE,@@b *+ *+ (tjBk0φKA<<?l1SE(V  *+ *+t(kφKVV?l1SEH?@@ *+ *+'4!ST@φK?l1SE@@@E *+ *+'φK_?l1SEA@@D *+ *+'φK?l1SEB@@C *+ *+'φK?l1SEC@@B *+ *+'φKB?l1SED@@A *+ *+'φK?l1SEE@@@ *+ *+'φK?l1SEF@@? *+ *+'φK@?l1SEG@@> *+ *+'φK?l1SEH@@= *+ *+' φK?l1SEI@@< *+ *+' φK*?l1SEJ@@; *+ *+' φKd?l1SEK@@: *+ *+' φK?l1SEL@@9 *+ *+' φK?l1SEM@@8 *+ *+'φKF?l1SEN@@7 *+ *+'φK?l1SEO@@6 *+ *+'φK?l1SEP@@5 *+ *+'φK; ?l1SEQ@@4 *+ *+'φK ?l1SER@@3 *+ *+'φK ?l1SES@@2 *+ *+'φK !?l1SET@@1 *+ *+'φKj!?l1SEU@@0 *+ *+'φK!?l1SEV@@/ *+ *+'φK"?l1SEW@@. *+ *+'φKJ"?l1SEX@@- *+ *+'φK"?l1SEY@@, *+ *+'φK"?l1SEZ@@+ *+ *+'φK,#?l1SE[@@* *+ *+'φK#?l1SE\@@) *+ *+'φK#?l1SE]@@( *+ *+'φK!$?l1SE^@@' *+ *+'φKq$?l1SE_@@& *+ *+' φK$?l1SE`@@% *+ *+'!φK$?l1SEa@@$ *+ *+'"φKW%?l1SEb@@# *+ *+'#φK%?l1SEc@@" *+ *+'$φK%?l1SEd@@! *+ *+'%φK0&?l1SEe@@ *+ *+'&φKr&?l1SEf@@ *+ *+''φK&?l1SEg@@ *+ *+'(φK'?l1SEh@@ *+ *+')φKX'?l1SEi@@ *+ *+'*φK'?l1SEj@@ *+ *+'+φK'?l1SEk@@ *+ *+',φKg(?l1SEl@@ *+ *+'-φK(?l1SEm@@ *+ *+'.φK(?l1SEn@@ *+ *+'/φK=)?l1SEo@@ *+ *+'0φKv)?l1SEp@@ *+ *+'1φK)?l1SEq@@ *+ *+'2φK*?l1SEr@@ *+ *+'3φKZ*?l1SEs@@ *+ *+'4φK*?l1SEt@@ *+ *+'5φK*?l1SEu@@ *+ *+'6φKN+?l1SEv@@ *+ *+'7φK+?l1SEw@@ *+ *+'8φK+?l1SEx@@ *+ *+'9φKB,?l1SEy@@ *+ *+':φK|,?l1SEz@@ *+ *+';φK,?l1SE{@@ *+ *+'<φK$-?l1SE|@@ *+ *+'=φK]-?l1SE}@@ *+ *+'>φK-?l1SE~@@ *+ *+'?φK.?l1SE@@ *+ *+'@φK@.?l1SE@@ *+ *+'AφK.?l1SE@@ *+ *+'BφK.?l1SE@@ *+ *+'CφK%/?l1SE@@ *+ *+'DφK/?l1SE@@ *+ *+'EφK/?l1SE@@ *+ *+'FφK0?l1SE@@ *+ *+'GφKi0?l1SE@@ *+ *+'HφK0?l1SE@@ *+ *+'IφK1?l1SE@@ *+ *+'JφKE1?l1SE@@ *+ *+'KφK1?l1SE@@ *+ *+'LφK1?l1SE@@ *+ *+'MφK&2?l1SE@@ *+ *+'NφK2?l1SE@@ *+ *+'OφK2?l1SE@@ *+ *+'PφK3?l1SE@@ *+ *+'QφK{3?l1SE@@ *+ *+'RφK3?l1SE@@ *+ *+'SφK3?l1SE@@ *+ *+'TφKQ4?l1SE@@ *+ *+'UφK4?l1SE@@ *+ *+'VφK4?l1SE@@ *+ *+'WφK*5?l1SE@@ *+ *+'XφKn5?l1SE@@ *+ *+'YφK5?l1SE@@ *+ *+'ZφK 6?l1SE@@ *+ *+'[φKN6?l1SE@@ *+ *+'\φK6?l1SE@@ *+ *+']φK6?l1SE@@ *+ *+'^φKU7?l1SE@@ *+ *+'_φK7?l1SE@@ *+ *+'`φK7?l1SE@@ *+ *+'aφKD8?l1SE@@ *+ *+'bφKq8?l1SE@@ *+ *+'cφK8?l1SE@@ *+ *+'dφK9?l1SE@@ *+ *+'eφKW9?l1SE@@ *+ *+'fφK9?l1SE@@ *+ *+'gφK9?l1SE@@ *+ *+'hφK5:?l1SE@@ *+ *+'iφK:?l1SE@@ *+ *+'jφK:?l1SE@@ *+ *+'kφK;;?l1SE@@ *+ *+'lφKu;?l1SE@@ *+ *+'mφK;?l1SE@@ *+ *+'nφK<?l1SE@@ *+ *+'oφKX<?l1SE@@ *+ *+'pφK<?l1SE@@ *+ *+'qφK=?l1SE@@ *+ *+'rφK8=?l1SE@@ *+ *+'sφK=?l1SE@@ *+ *+'tφK=?l1SE@@ *+ *+'uφK.>?l1SE@@ *+ *+'vφK~>?l1SE@@ *+ *+'wφK>?l1SE@@ *+ *+'xφK??l1SE@@ *+ *+'yφKe??l1SE@@ *+ *+'zφK??l1SE@@ *+ *+'{φK@?l1SE@@ *+ *+'|φK=@?l1SE@@ *+ *+'}φK@?l1SE@@ *+ *+'~φK@?l1SE@@ *+ *+'φK#A?l1SE@@ *+ *+'φKA?l1SE@@ *+ *+'φKA?l1SE@@ *+ *+'φKB?l1SE@@ *+ *+'φKfB?l1SE@@ *+ *+'φKB?l1SE@@ *+ *+'φKB?l1SE@@ *+ *+'φKC  ?l1SE@@ *+ *+'φK#C<<?l1SE,@@ޒ *+ *+'@UUφKVUVV?l1SEH@@u *+ *+'4!@φK V?l1SE@@ܼ *+ *+'φKGV?l1SE@@ܻ *+ *+'φKV?l1SE@@ܺ *+ *+'φKV?l1SE@@ܹ *+ *+'φK'W?l1SE@@ܸ *+ *+'φKW?l1SE@@ܷ *+ *+'φKW?l1SE@@ܶ *+ *+'φK(X?l1SE@@ܵ *+ *+'φKhX?l1SE@@ܴ *+ *+' φKX?l1SE@@ܳ *+ *+' φKY?l1SE@@ܲ *+ *+' φKJY?l1SE@@ܱ *+ *+' φKY?l1SE@@ܰ *+ *+' φKY?l1SE@@ܯ *+ *+'φK.Z?l1SE@@ܮ *+ *+'φKZ?l1SE@@ܭ *+ *+'φKZ?l1SE@@ܬ *+ *+'φK[?l1SE@@ܫ *+ *+'φKx[?l1SE@@ܪ *+ *+'φK[?l1SE@@ܩ *+ *+'φK[?l1SE@@ܨ *+ *+'φKP\?l1SE@@ܧ *+ *+'φK\?l1SE@@ܦ *+ *+'φK\?l1SE@@ܥ *+ *+'φK1]?l1SE@@ܤ *+ *+'φK]?l1SE@@ܣ *+ *+'φK]?l1SE@@ܢ *+ *+'φK^?l1SE@@ܡ *+ *+'φKz^?l1SE@@ܠ *+ *+'φK^?l1SE@@ܟ *+ *+'φK^?l1SE@@ܞ *+ *+'φK\_?l1SE@@ܝ *+ *+' φK_?l1SE@@ܜ *+ *+'!φK_?l1SE@@ܛ *+ *+'"φK<`?l1SE@@ܚ *+ *+'#φKx`?l1SE@@ܙ *+ *+'$φK`?l1SE@@ܘ *+ *+'%φKa?l1SE@@ܗ *+ *+'&φKYa?l1SE@@ܖ *+ *+''φKa?l1SE@@ܕ *+ *+'(φKa?l1SE@@ܔ *+ *+')φKOb?l1SE@@ܓ *+ *+'*φKb?l1SE@@ܒ *+ *+'+φKb?l1SE@@ܑ *+ *+',φK;c?l1SE@@ܐ *+ *+'-φKc?l1SE@@܏ *+ *+'.φKc?l1SE@@܎ *+ *+'/φK&d?l1SE@@܍ *+ *+'0φK]d?l1SE@@܌ *+ *+'1φKd?l1SE@@܋ *+ *+'2φKd?l1SE@@܊ *+ *+'3φKAe?l1SE@@܉ *+ *+'4φKe?l1SE@@܈ *+ *+'5φKe?l1SE@@܇ *+ *+'6φK*f?l1SE@@܆ *+ *+'7φKf?l1SE@@܅ *+ *+'8φKf?l1SE@@܄ *+ *+'9φK*g?l1SE@@܃ *+ *+':φKbg?l1SE@@܂ *+ *+';φKg?l1SE@@܁ *+ *+'<φKh?l1SE@@܀ *+ *+'=φKDh?l1SE@@ *+ *+'>φKh?l1SE@@~ *+ *+'?φKh?l1SE@@} *+ *+'@φK'i?l1SE @@| *+ *+'AφKi?l1SE @@{ *+ *+'BφKi?l1SE @@z *+ *+'CφK j?l1SE @@y *+ *+'DφKyj?l1SE @@x *+ *+'EφKj?l1SE@@w *+ *+'FφKj?l1SE@@v *+ *+'GφKJk?l1SE@@u *+ *+'HφKk?l1SE@@t *+ *+'IφKk?l1SE@@s *+ *+'JφK+l?l1SE@@r *+ *+'KφKml?l1SE@@q *+ *+'LφKl?l1SE@@p *+ *+'MφK m?l1SE@@o *+ *+'NφKtm?l1SE@@n *+ *+'OφKm?l1SE@@m *+ *+'PφKn?l1SE@@l *+ *+'QφKQn?l1SE@@k *+ *+'RφKn?l1SE@@j *+ *+'SφKn?l1SE@@i *+ *+'TφK8o?l1SE@@h *+ *+'UφKro?l1SE@@g *+ *+'VφKo?l1SE@@f *+ *+'WφKp?l1SE @@e *+ *+'XφKgp?l1SE!@@d *+ *+'YφKp?l1SE"@@c *+ *+'ZφKp?l1SE#@@b *+ *+'[φK6q?l1SE$@@a *+ *+'\φKq?l1SE%@@` *+ *+']φKq?l1SE&@@_ *+ *+'^φK@@G *+ *+'vφKiy?l1SE?@@F *+ *+'wφKy?l1SE@@@E *+ *+'xφKy?l1SEA@@D *+ *+'yφKLz?l1SEB@@C *+ *+'zφKz?l1SEC@@B *+ *+'{φKz?l1SED@@A *+ *+'|φK%{?l1SEE@@@ *+ *+'}φKz{?l1SEF@@? *+ *+'~φK{?l1SEG@@> *+ *+'φK|?l1SEH@@= *+ *+'φKs|?l1SEI@@< *+ *+'φK|?l1SEJ@@; *+ *+'φK|?l1SEK@@: *+ *+'φKP}?l1SEL@@9 *+ *+'φK}?l1SEM@@8 *+ *+'φK}?l1SEN@@7 *+ *+'φK}  ?l1SEO@@: *+ *+'φK~<<?l1SE,P@@ *+ *+'@UUφKVV?l1SEHQ@@ *+ *+'4!~ @φK?l1SER@@3 *+ *+'φK6?l1SES@@2 *+ *+'φK?l1SET@@1 *+ *+'φKΑ?l1SEU@@0 *+ *+'φK#?l1SEV@@/ *+ *+'φKs?l1SEW@@. *+ *+'φK?l1SEX@@- *+ *+'φK?l1SEY@@, *+ *+'φKQ?l1SEZ@@+ *+ *+' φK?l1SE[@@* *+ *+' φK?l1SE\@@) *+ *+' φK1?l1SE]@@( *+ *+' φK?l1SE^@@' *+ *+' φKؔ?l1SE_@@& *+ *+'φK?l1SE`@@% *+ *+'φKt?l1SEa@@$ *+ *+'φK?l1SEb@@# *+ *+'φK?l1SEc@@" *+ *+'φK]?l1SEd@@! *+ *+'φK?l1SEe@@ *+ *+'φK?l1SEf@@ *+ *+'φK<?l1SEg@@ *+ *+'φKy?l1SEh@@ *+ *+'φK?l1SEi@@ *+ *+'φK?l1SEj@@ *+ *+'φKb?l1SEk@@ *+ *+'φK˜?l1SEl@@ *+ *+'φK?l1SEm@@ *+ *+'φKb?l1SEn@@ *+ *+'φK?l1SEo@@ *+ *+'φKޙ?l1SEp@@ *+ *+'φK<?l1SEq@@ *+ *+' φK?l1SEr@@ *+ *+'!φK?l1SEs@@ *+ *+'"φK&?l1SEt@@ *+ *+'#φK_?l1SEu@@ *+ *+'$φKś?l1SEv@@ *+ *+'%φK?l1SEw@@ *+ *+'&φKB?l1SEx@@ *+ *+''φK?l1SEy@@ *+ *+'(φK?l1SEz@@ *+ *+')φK*?l1SE{@@ *+ *+'*φK?l1SE|@@ *+ *+'+φKÝ?l1SE}@@ *+ *+',φK*?l1SE~@@ *+ *+'-φKf?l1SE@@ *+ *+'.φK?l1SE@@ *+ *+'/φK ?l1SE@@ *+ *+'0φKE?l1SE@@ *+ *+'1φK?l1SE@@ *+ *+'2φK?l1SE@@ *+ *+'3φK;?l1SE@@ *+ *+'4φK?l1SE@@ *+ *+'5φKȠ?l1SE@@ *+ *+'6φK ?l1SE@@ *+ *+'7φKp?l1SE@@ *+ *+'8φK?l1SE@@ *+ *+'9φK?l1SE@@ *+ *+':φKK?l1SE@@ *+ *+';φK?l1SE@@ *+ *+'<φK?l1SE@@ *+ *+'=φK,?l1SE@@ *+ *+'>φKw?l1SE@@ *+ *+'?φK֣?l1SE@@ *+ *+'@φK ?l1SE@@ *+ *+'AφKu?l1SE@@ *+ *+'BφK?l1SE@@ *+ *+'CφK?l1SE@@ *+ *+'DφKO?l1SE@@ *+ *+'EφK?l1SE@@ *+ *+'FφKԥ?l1SE@@ *+ *+'GφK:?l1SE@@ *+ *+'HφKs?l1SE@@ *+ *+'IφK٦?l1SE@@ *+ *+'JφK?l1SE@@ *+ *+'KφKU?l1SE@@ *+ *+'LφKƧ?l1SE@@ *+ *+'MφK?l1SE@@ *+ *+'NφK\?l1SE@@ *+ *+'OφK?l1SE@@ *+ *+'PφK?l1SE@@ *+ *+'QφK;?l1SE@@ *+ *+'RφKw?l1SE@@ *+ *+'SφK?l1SE@@ *+ *+'TφK?l1SE@@ *+ *+'UφK]?l1SE@@ *+ *+'VφK?l1SE@@ *+ *+'WφK?l1SE@@ *+ *+'XφKM?l1SE@@ *+ *+'YφK?l1SE@@ *+ *+'ZφKܫ?l1SE@@ *+ *+'[φK?l1SE@@ *+ *+'\φK?l1SE@@ *+ *+']φK?l1SE@@ *+ *+'^φK$?l1SE@@ *+ *+'_φK]?l1SE@@ *+ *+'`φK?l1SE@@ *+ *+'aφK?l1SE@@ *+ *+'bφK@?l1SE@@ *+ *+'cφK?l1SE@@ *+ *+'dφKޮ?l1SE@@ *+ *+'eφK&?l1SE@@ *+ *+'fφK?l1SE@@ *+ *+'gφK¯?l1SE@@ *+ *+'hφK?l1SE@@ *+ *+'iφKg?l1SE@@ *+ *+'jφK?l1SE@@ *+ *+'kφK?l1SE@@ *+ *+'lφKF?l1SE@@ *+ *+'mφK?l1SE@@ *+ *+'nφK?l1SE@@ *+ *+'oφK(?l1SE@@ *+ *+'pφK|?l1SE@@ *+ *+'qφKȲ?l1SE@@ *+ *+'rφK ?l1SE@@ *+ *+'sφKo?l1SE@@ *+ *+'tφK?l1SE@@ۿ *+ *+'uφK?l1SE@@۾ *+ *+'vφKO?l1SE@@۽ *+ *+'wφK?l1SE@@ۼ *+ *+'xφKδ?l1SE@@ۻ *+ *+'yφK.?l1SE@@ۺ *+ *+'zφKm?l1SE@@۹ *+ *+'{φKӵ?l1SE@@۸ *+ *+'|φK ?l1SE@@۷ *+ *+'}φKS?l1SE@@۶ *+ *+'~φK?l1SE@@۵ *+ *+'φK?l1SE@@۴ *+ *+'φKX?l1SE@@۳ *+ *+'φK?l1SE@@۲ *+ *+'φK׷?l1SE@@۱ *+ *+'φK7?l1SE@@۰ *+ *+'φKr?l1SE@@ۯ *+ *+'φK?l1SE@@ۮ *+ *+'φK  ?l1SE@@ܱ *+ *+'φK<<?l1SE,@@݀ *+ *+'@UUφKVV?l1SEH@@c *+ *+'4! @φK?l1SE@@۪ *+ *+'φK?l1SE@@۩ *+ *+'φKa?l1SE@@ۨ *+ *+'φK?l1SE@@ۧ *+ *+'φK?l1SE@@ۦ *+ *+'φK8?l1SE@@ۥ *+ *+'φKq?l1SE@@ۤ *+ *+'φK?l1SE@@ۣ *+ *+'φK?l1SE@@ۢ *+ *+' φKS?l1SE@@ۡ *+ *+' φK?l1SE@@۠ *+ *+' φK?l1SE@@۟ *+ *+' φK:?l1SE@@۞ *+ *+' φK?l1SE@@۝ *+ *+'φK?l1SE@@ۜ *+ *+'φK=?l1SE@@ۛ *+ *+'φKw?l1SE@@ۚ *+ *+'φK?l1SE@@ۙ *+ *+'φK?l1SE@@ۘ *+ *+'φKX?l1SE@@ۗ *+ *+'φK?l1SE@@ۖ *+ *+'φK?l1SE@@ە *+ *+'φK:?l1SE@@۔ *+ *+'φK?l1SE@@ۓ *+ *+'φK?l1SE@@ے *+ *+'φK?l1SE@@ۑ *+ *+'φK?l1SE@@ې *+ *+'φK?l1SE@@ۏ *+ *+'φK$?l1SE@@ێ *+ *+'φK\?l1SE@@ۍ *+ *+'φK?l1SE@@ی *+ *+'φK?l1SE@@ۋ *+ *+' φK>?l1SE@@ۊ *+ *+'!φK?l1SE@@ۉ *+ *+'"φK?l1SE@@ۈ *+ *+'#φK!?l1SE@@ۇ *+ *+'$φK?l1SE@@ۆ *+ *+'%φK?l1SE@@ۅ *+ *+'&φK?l1SE@@ۄ *+ *+''φKb?l1SE@@ۃ *+ *+'(φK?l1SE@@ۂ *+ *+')φK?l1SE@@ہ *+ *+'*φKK?l1SE@@ۀ *+ *+'+φK?l1SE@@ *+ *+',φK?l1SE@@~ *+ *+'-φK&?l1SE@@} *+ *+'.φKg?l1SE @@| *+ *+'/φK?l1SE @@{ *+ *+'0φK?l1SE @@z *+ *+'1φKn?l1SE @@y *+ *+'2φK?l1SE @@x *+ *+'3φK?l1SE@@w *+ *+'4φKP?l1SE@@v *+ *+'5φK?l1SE@@u *+ *+'6φK?l1SE@@t *+ *+'7φK6?l1SE@@s *+ *+'8φKk?l1SE@@r *+ *+'9φK?l1SE@@q *+ *+':φK ?l1SE@@p *+ *+';φKS?l1SE@@o *+ *+'<φK?l1SE@@n *+ *+'=φK?l1SE@@m *+ *+'>φK0?l1SE@@l *+ *+'?φK?l1SE@@k *+ *+'@φK?l1SE@@j *+ *+'AφK6?l1SE@@i *+ *+'BφKp?l1SE@@h *+ *+'CφK?l1SE@@g *+ *+'DφK?l1SE@@f *+ *+'EφKS?l1SE @@e *+ *+'FφK?l1SE!@@d *+ *+'GφK?l1SE"@@c *+ *+'HφK4?l1SE#@@b *+ *+'IφK?l1SE$@@a *+ *+'JφK?l1SE%@@` *+ *+'KφK?l1SE&@@_ *+ *+'LφKu?l1SE'@@^ *+ *+'MφK?l1SE(@@] *+ *+'NφK?l1SE)@@\ *+ *+'OφKW?l1SE*@@[ *+ *+'PφK?l1SE+@@Z *+ *+'QφK?l1SE,@@Y *+ *+'RφK8?l1SE-@@X *+ *+'SφK?l1SE.@@W *+ *+'TφK?l1SE/@@V *+ *+'UφK?l1SE0@@U *+ *+'VφK?l1SE1@@T *+ *+'WφK?l1SE2@@S *+ *+'XφK?l1SE3@@R *+ *+'YφKd?l1SE4@@Q *+ *+'ZφK?l1SE5@@P *+ *+'[φK?l1SE6@@O *+ *+'\φK>?l1SE7@@N *+ *+']φK?l1SE8@@M *+ *+'^φK?l1SE9@@L *+ *+'_φK!?l1SE:@@K *+ *+'`φKc?l1SE;@@J *+ *+'aφK?l1SE<@@I *+ *+'bφK?l1SE=@@H *+ *+'cφKb?l1SE>@@G *+ *+'dφK?l1SE?@@F *+ *+'eφK?l1SE@@@E *+ *+'fφKJ?l1SEA@@D *+ *+'gφK?l1SEB@@C *+ *+'hφK?l1SEC@@B *+ *+'iφK,?l1SED@@A *+ *+'jφKe?l1SEE@@@ *+ *+'kφK?l1SEF@@? *+ *+'lφK?l1SEG@@> *+ *+'mφK\?l1SEH@@= *+ *+'nφK?l1SEI@@< *+ *+'oφK?l1SEJ@@; *+ *+'pφK)?l1SEK@@: *+ *+'qφK?l1SEL@@9 *+ *+'rφK?l1SEM@@8 *+ *+'sφK:?l1SEN@@7 *+ *+'tφKi?l1SEO@@6 *+ *+'uφK?l1SEP@@5 *+ *+'vφK?l1SEQ@@4 *+ *+'wφKL?l1SER@@3 *+ *+'xφK?l1SES@@2 *+ *+'yφK?l1SET@@1 *+ *+'zφK2?l1SEU@@0 *+ *+'{φK?l1SEV@@/ *+ *+'|φK?l1SEW@@. *+ *+'}φK?l1SEX@@- *+ *+'~φKw?l1SEY@@, *+ *+'φK?l1SEZ@@+ *+ *+'φK?l1SE[@@* *+ *+'φKQ?l1SE\@@) *+ *+'φK?l1SE]@@( *+ *+'φK?l1SE^@@' *+ *+'φK3?l1SE_@@& *+ *+'φKz?l1SE`@@% *+ *+'φK  ?l1SEa@@( *+ *+'φK<<?l1SE,b@@ *+ *+'@UUφK_VV?l1SEHc@@ *+ *+'4!@φK?l1SEd@@! *+ *+'φK?l1SEe@@ *+ *+'φK6?l1SEf@@ *+ *+'φKx?l1SEg@@ *+ *+'φK?l1SEh@@ *+ *+'φK ?l1SEi@@ *+ *+'φKY?l1SEj@@ *+ *+'φK?l1SEk@@ *+ *+'φK?l1SEl@@ *+ *+' φK@ ?l1SEm@@ *+ *+' φK ?l1SEn@@ *+ *+' φK ?l1SEo@@ *+ *+' φK ?l1SEp@@ *+ *+' φK ?l1SEq@@ *+ *+'φK ?l1SEr@@ *+ *+'φK$ ?l1SEs@@ *+ *+'φK^ ?l1SEt@@ *+ *+'φK ?l1SEu@@ *+ *+'φK ?l1SEv@@ *+ *+'φK? ?l1SEw@@ *+ *+'φK ?l1SEx@@ *+ *+'φK ?l1SEy@@ *+ *+'φK! ?l1SEz@@ *+ *+'φK ?l1SE{@@ *+ *+'φK ?l1SE|@@ *+ *+'φK?l1SE}@@ *+ *+'φKk?l1SE~@@ *+ *+'φK?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φKD?l1SE@@ *+ *+'φK?l1SE@@ *+ *+'φK?l1SE@@ *+ *+' φK&?l1SE@@ *+ *+'!φKi?l1SE@@ *+ *+'"φK?l1SE@@ *+ *+'#φK ?l1SE@@ *+ *+'$φKo?l1SE@@ *+ *+'%φK?l1SE@@ *+ *+'&φK?l1SE@@ *+ *+''φKQ?l1SE@@ *+ *+'(φK?l1SE@@ *+ *+')φK?l1SE@@ *+ *+'*φK3?l1SE@@ *+ *+'+φKl?l1SE@@ *+ *+',φK?l1SE@@ *+ *+'-φK ?l1SE@@ *+ *+'.φKS?l1SE@@ *+ *+'/φK?l1SE@@ *+ *+'0φK?l1SE@@ *+ *+'1φKU?l1SE@@ *+ *+'2φK?l1SE@@ *+ *+'3φK?l1SE@@ *+ *+'4φK8?l1SE@@ *+ *+'5φKp?l1SE@@ *+ *+'6φK?l1SE@@ *+ *+'7φK?l1SE@@ *+ *+'8φKT?l1SE@@ *+ *+'9φK?l1SE@@ *+ *+':φK?l1SE@@ *+ *+';φK;?l1SE@@ *+ *+'<φK?l1SE@@ *+ *+'=φK?l1SE@@ *+ *+'>φK?l1SE@@ *+ *+'?φKv?l1SE@@ *+ *+'@φK?l1SE@@ *+ *+'AφK?l1SE@@ *+ *+'BφKV?l1SE@@ *+ *+'CφK?l1SE@@ *+ *+'DφK?l1SE@@ *+ *+'EφK<?l1SE@@ *+ *+'FφK}?l1SE@@ *+ *+'GφK?l1SE@@ *+ *+'HφK?l1SE@@ *+ *+'IφK?l1SE@@ *+ *+'JφK?l1SE@@ *+ *+'KφK?l1SE@@ *+ *+'LφKd?l1SE@@ *+ *+'MφK?l1SE@@ *+ *+'NφK?l1SE@@ *+ *+'OφK>?l1SE@@ *+ *+'PφK?l1SE@@ *+ *+'QφK?l1SE@@ *+ *+'RφK!?l1SE@@ *+ *+'SφKg?l1SE@@ *+ *+'TφK?l1SE@@ *+ *+'UφK ?l1SE@@ *+ *+'VφKs ?l1SE@@ *+ *+'WφK ?l1SE@@ *+ *+'XφK ?l1SE@@ *+ *+'YφKJ!?l1SE@@ *+ *+'ZφK!?l1SE@@ *+ *+'[φK!?l1SE@@ *+ *+'\φK-"?l1SE@@ *+ *+']φKj"?l1SE@@ *+ *+'^φK"?l1SE@@ *+ *+'_φK#?l1SE@@ *+ *+'`φKH#?l1SE@@ *+ *+'aφK#?l1SE@@ *+ *+'bφK#?l1SE@@ڿ *+ *+'cφKP$?l1SE@@ھ *+ *+'dφK$?l1SE@@ڽ *+ *+'eφK$?l1SE@@ڼ *+ *+'fφK1%?l1SE@@ڻ *+ *+'gφKk%?l1SE@@ں *+ *+'hφK%?l1SE@@ڹ *+ *+'iφK&?l1SE@@ڸ *+ *+'jφKM&?l1SE@@ڷ *+ *+'kφK&?l1SE@@ڶ *+ *+'lφK&?l1SE@@ڵ *+ *+'mφK/'?l1SE@@ڴ *+ *+'nφK'?l1SE@@ڳ *+ *+'oφK'?l1SE@@ڲ *+ *+'pφK(?l1SE@@ڱ *+ *+'qφKx(?l1SE@@ڰ *+ *+'rφK(?l1SE@@گ *+ *+'sφK)?l1SE@@ڮ *+ *+'tφKS)?l1SE@@ڭ *+ *+'uφK)?l1SE@@ڬ *+ *+'vφK)?l1SE@@ګ *+ *+'wφK3*?l1SE@@ڪ *+ *+'xφKz*?l1SE@@ک *+ *+'yφK*?l1SE@@ڨ *+ *+'zφK+?l1SE@@ڧ *+ *+'{φK}+?l1SE@@ڦ *+ *+'|φK+?l1SE@@ڥ *+ *+'}φK+?l1SE@@ڤ *+ *+'~φK_,?l1SE@@ڣ *+ *+'φK,?l1SE@@ڢ *+ *+'φK,?l1SE@@ڡ *+ *+'φK8-?l1SE@@ڠ *+ *+'φK-?l1SE@@ڟ *+ *+'φK-?l1SE@@ڞ *+ *+'φK.?l1SE@@ڝ *+ *+'φK^.?l1SE@@ڜ *+ *+'φK.  ?l1SE@@۟ *+ *+'φK.<<?l1SE,@@n *+ *+'@UUφK@VV?l1SEH@@Q *+ *+'4!/P@φKdA?l1SE@@ژ *+ *+'φKA?l1SE@@ڗ *+ *+'φKB?l1SE@@ږ *+ *+'φK>B?l1SE@@ڕ *+ *+'φKB?l1SE@@ڔ *+ *+'φKB?l1SE@@ړ *+ *+'φK!C?l1SE@@ڒ *+ *+'φKC?l1SE@@ڑ *+ *+'φKC?l1SE@@ڐ *+ *+' φKD?l1SE@@ڏ *+ *+' φKiD?l1SE@@ڎ *+ *+' φKD?l1SE@@ڍ *+ *+' φKD?l1SE@@ڌ *+ *+' φKLE?l1SE@@ڋ *+ *+'φKE?l1SE@@ڊ *+ *+'φKE?l1SE@@ډ *+ *+'φK$F?l1SE@@ڈ *+ *+'φKlF?l1SE@@ڇ *+ *+'φKF?l1SE@@چ *+ *+'φK G?l1SE@@څ *+ *+'φKIG?l1SE@@ڄ *+ *+'φKG?l1SE@@ڃ *+ *+'φKG?l1SE@@ڂ *+ *+'φKPH?l1SE@@ځ *+ *+'φKH?l1SE@@ڀ *+ *+'φKH?l1SE@@ *+ *+'φK*I?l1SE@@~ *+ *+'φKmI?l1SE@@} *+ *+'φKI?l1SE @@| *+ *+'φK J?l1SE @@{ *+ *+'φKRJ?l1SE @@z *+ *+'φKJ?l1SE @@y *+ *+' φKJ?l1SE @@x *+ *+'!φK0K?l1SE@@w *+ *+'"φKK?l1SE@@v *+ *+'#φKK?l1SE@@u *+ *+'$φK6L?l1SE@@t *+ *+'%φKoL?l1SE@@s *+ *+'&φKL?l1SE@@r *+ *+''φKM?l1SE@@q *+ *+'(φKRM?l1SE@@p *+ *+')φKM?l1SE@@o *+ *+'*φKM?l1SE@@n *+ *+'+φK3N?l1SE@@m *+ *+',φKN?l1SE@@l *+ *+'-φKN?l1SE@@k *+ *+'.φKO?l1SE@@j *+ *+'/φK|O?l1SE@@i *+ *+'0φKO?l1SE@@h *+ *+'1φKP?l1SE@@g *+ *+'2φKWP?l1SE@@f *+ *+'3φKP?l1SE @@e *+ *+'4φKQ?l1SE!@@d *+ *+'5φK7Q?l1SE"@@c *+ *+'6φKQ?l1SE#@@b *+ *+'7φKQ?l1SE$@@a *+ *+'8φKR?l1SE%@@` *+ *+'9φKR?l1SE&@@_ *+ *+':φKR?l1SE'@@^ *+ *+';φKS?l1SE(@@] *+ *+'<φKcS?l1SE)@@\ *+ *+'=φKS?l1SE*@@[ *+ *+'>φKS?l1SE+@@Z *+ *+'?φKFT?l1SE,@@Y *+ *+'@φKT?l1SE-@@X *+ *+'AφKT?l1SE.@@W *+ *+'BφKU?l1SE/@@V *+ *+'CφKhU?l1SE0@@U *+ *+'DφKU?l1SE1@@T *+ *+'EφKV?l1SE2@@S *+ *+'FφKHV?l1SE3@@R *+ *+'GφKV?l1SE4@@Q *+ *+'HφKV?l1SE5@@P *+ *+'IφKJW?l1SE6@@O *+ *+'JφKW?l1SE7@@N *+ *+'KφKW?l1SE8@@M *+ *+'LφK,X?l1SE9@@L *+ *+'MφKeX?l1SE:@@K *+ *+'NφKX?l1SE;@@J *+ *+'OφKY?l1SE<@@I *+ *+'PφKHY?l1SE=@@H *+ *+'QφKY?l1SE>@@G *+ *+'RφKY?l1SE?@@F *+ *+'SφK/Z?l1SE@@@E *+ *+'TφKZ?l1SEA@@D *+ *+'UφKZ?l1SEB@@C *+ *+'VφK0[?l1SEC@@B *+ *+'WφKi[?l1SED@@A *+ *+'XφK[?l1SEE@@@ *+ *+'YφK\?l1SEF@@? *+ *+'ZφKM\?l1SEG@@> *+ *+'[φK\?l1SEH@@= *+ *+'\φK\?l1SEI@@< *+ *+']φK.]?l1SEJ@@; *+ *+'^φK]?l1SEK@@: *+ *+'_φK]?l1SEL@@9 *+ *+'`φK^?l1SEM@@8 *+ *+'aφKw^?l1SEN@@7 *+ *+'bφK^?l1SEO@@6 *+ *+'cφK_?l1SEP@@5 *+ *+'dφKP_?l1SEQ@@4 *+ *+'eφK_?l1SER@@3 *+ *+'fφK_?l1SES@@2 *+ *+'gφK3`?l1SET@@1 *+ *+'hφKv`?l1SEU@@0 *+ *+'iφK`?l1SEV@@/ *+ *+'jφKa?l1SEW@@. *+ *+'kφK|a?l1SEX@@- *+ *+'lφKa?l1SEY@@, *+ *+'mφKa?l1SEZ@@+ *+ *+'nφK]b?l1SE[@@* *+ *+'oφKb?l1SE\@@) *+ *+'pφKb?l1SE]@@( *+ *+'qφK?c?l1SE^@@' *+ *+'rφKyc?l1SE_@@& *+ *+'sφKc?l1SE`@@% *+ *+'tφKd?l1SEa@@$ *+ *+'uφK\d?l1SEb@@# *+ *+'vφKd?l1SEc@@" *+ *+'wφKd?l1SEd@@! *+ *+'xφK?l1SE@@ *+ *+'3φK?l1SE@@ *+ *+'4φK?l1SE@@ *+ *+'5φK ?l1SE@@ *+ *+'6φKg?l1SE@@ *+ *+'7φKɌ?l1SE@@ *+ *+'8φK?l1SE@@ *+ *+'9φKj?l1SE@@ *+ *+':φK?l1SE@@ *+ *+';φK?l1SE@@ *+ *+'<φKK?l1SE@@ *+ *+'=φK?l1SE@@ *+ *+'>φK͎?l1SE@@ *+ *+'?φK,?l1SE@@ *+ *+'@φKg?l1SE@@ *+ *+'AφK͏?l1SE@@ *+ *+'BφK?l1SE@@ *+ *+'CφK]?l1SE@@ *+ *+'DφK?l1SE@@ *+ *+'EφK?l1SE@@ *+ *+'FφK*?l1SE@@ *+ *+'GφK?l1SE@@ *+ *+'HφKˑ?l1SE@@ *+ *+'IφK:?l1SE@@ *+ *+'JφKl?l1SE@@ *+ *+'KφK?l1SE@@ *+ *+'LφK?l1SE@@ *+ *+'MφKM?l1SE@@ *+ *+'NφK?l1SE@@ *+ *+'OφK?l1SE@@ *+ *+'PφK/?l1SE@@ٿ *+ *+'QφK?l1SE@@پ *+ *+'RφKϔ?l1SE@@ٽ *+ *+'SφK?l1SE@@ټ *+ *+'TφKw?l1SE@@ٻ *+ *+'UφK?l1SE@@ٺ *+ *+'VφK?l1SE@@ٹ *+ *+'WφKQ?l1SE@@ٸ *+ *+'XφK?l1SE@@ٷ *+ *+'YφK?l1SE@@ٶ *+ *+'ZφK3?l1SE@@ٵ *+ *+'[φKz?l1SE@@ٴ *+ *+'\φKۗ?l1SE@@ٳ *+ *+']φK?l1SE@@ٲ *+ *+'^φK|?l1SE@@ٱ *+ *+'_φK?l1SE@@ٰ *+ *+'`φK?l1SE@@ٯ *+ *+'aφK_?l1SE@@ٮ *+ *+'bφK?l1SE@@٭ *+ *+'cφK?l1SE@@٬ *+ *+'dφK7?l1SE@@٫ *+ *+'eφK~?l1SE@@٪ *+ *+'fφK?l1SE@@٩ *+ *+'gφK?l1SE@@٨ *+ *+'hφK\?l1SE@@٧ *+ *+'iφK›?l1SE@@٦ *+ *+'jφK?l1SE@@٥ *+ *+'kφKb?l1SE@@٤ *+ *+'lφK?l1SE@@٣ *+ *+'mφK?l1SE@@٢ *+ *+'nφK>?l1SE@@١ *+ *+'oφK?l1SE@@٠ *+ *+'pφK?l1SE@@ٟ *+ *+'qφK'?l1SE@@ٞ *+ *+'rφK_?l1SE@@ٝ *+ *+'sφKǞ?l1SE@@ٜ *+ *+'tφK?l1SE@@ٛ *+ *+'uφKG?l1SE@@ٚ *+ *+'vφK?l1SE@@ٙ *+ *+'wφK?l1SE@@٘ *+ *+'xφK-?l1SE@@ٗ *+ *+'yφK?l1SE@@ٖ *+ *+'zφKĠ?l1SE@@ٕ *+ *+'{φK,?l1SE@@ٔ *+ *+'|φKe?l1SE@@ٓ *+ *+'}φK?l1SE@@ْ *+ *+'~φK?l1SE@@ّ *+ *+'φKG?l1SE@@ِ *+ *+'φK?l1SE@@ُ *+ *+'φK?l1SE@@َ *+ *+'φK.?l1SE@@ٍ *+ *+'φK?l1SE@@ٌ *+ *+'φKȣ?l1SE@@ً *+ *+'φK ?l1SE@@ي *+ *+'φK>  ?l1SE@@ڍ *+ *+'φKJ<<?l1SE,@@\ *+ *+'@UUφK^VV?l1SEH@@? *+ *+'4!S:@φK?l1SE@@ن *+ *+'φKM?l1SE@@م *+ *+'φK?l1SE@@ل *+ *+'φK?l1SE@@ك *+ *+'φK4?l1SE@@ق *+ *+'φK?l1SE@@ف *+ *+'φKи?l1SE@@ـ *+ *+'φK.?l1SE@@ *+ *+'φKq?l1SE@@~ *+ *+' φK?l1SE@@} *+ *+' φK?l1SE @@| *+ *+' φKR?l1SE @@{ *+ *+' φK?l1SE @@z *+ *+' φK?l1SE @@y *+ *+'φK5?l1SE @@x *+ *+'φK?l1SE@@w *+ *+'φKӻ?l1SE@@v *+ *+'φK?l1SE@@u *+ *+'φK|?l1SE@@t *+ *+'φK?l1SE@@s *+ *+'φK?l1SE@@r *+ *+'φKW?l1SE@@q *+ *+'φK?l1SE@@p *+ *+'φK?l1SE@@o *+ *+'φK9?l1SE@@n *+ *+'φK?l1SE@@m *+ *+'φK?l1SE@@l *+ *+'φK?l1SE@@k *+ *+'φK?l1SE@@j *+ *+'φK?l1SE@@i *+ *+'φK?l1SE@@h *+ *+'φKc?l1SE@@g *+ *+' φK?l1SE@@f *+ *+'!φK?l1SE @@e *+ *+'"φKE?l1SE!@@d *+ *+'#φK?l1SE"@@c *+ *+'$φK?l1SE#@@b *+ *+'%φK?l1SE$@@a *+ *+'&φKe?l1SE%@@` *+ *+''φK?l1SE&@@_ *+ *+'(φK?l1SE'@@^ *+ *+')φKG?l1SE(@@] *+ *+'*φK?l1SE)@@\ *+ *+'+φK?l1SE*@@[ *+ *+',φKT?l1SE+@@Z *+ *+'-φK?l1SE,@@Y *+ *+'.φK?l1SE-@@X *+ *+'/φK+?l1SE.@@W *+ *+'0φKe?l1SE/@@V *+ *+'1φK?l1SE0@@U *+ *+'2φK?l1SE1@@T *+ *+'3φKI?l1SE2@@S *+ *+'4φK?l1SE3@@R *+ *+'5φK?l1SE4@@Q *+ *+'6φK-?l1SE5@@P *+ *+'7φK?l1SE6@@O *+ *+'8φK?l1SE7@@N *+ *+'9φK1?l1SE8@@M *+ *+':φKj?l1SE9@@L *+ *+';φK?l1SE:@@K *+ *+'<φK?l1SE;@@J *+ *+'=φKK?l1SE<@@I *+ *+'>φK?l1SE=@@H *+ *+'?φK?l1SE>@@G *+ *+'@φK.?l1SE?@@F *+ *+'AφK?l1SE@@@E *+ *+'BφK?l1SEA@@D *+ *+'CφK?l1SEB@@C *+ *+'DφKw?l1SEC@@B *+ *+'EφK?l1SED@@A *+ *+'FφK?l1SEE@@@ *+ *+'GφKX?l1SEF@@? *+ *+'HφK?l1SEG@@> *+ *+'IφK?l1SEH@@= *+ *+'JφK2?l1SEI@@< *+ *+'KφKu?l1SEJ@@; *+ *+'LφK?l1SEK@@: *+ *+'MφK?l1SEL@@9 *+ *+'NφKz?l1SEM@@8 *+ *+'OφK?l1SEN@@7 *+ *+'PφK?l1SEO@@6 *+ *+'QφKV?l1SEP@@5 *+ *+'RφK?l1SEQ@@4 *+ *+'SφK?l1SER@@3 *+ *+'TφK??l1SES@@2 *+ *+'UφKw?l1SET@@1 *+ *+'VφK?l1SEU@@0 *+ *+'WφK?l1SEV@@/ *+ *+'XφKo?l1SEW@@. *+ *+'YφK?l1SEX@@- *+ *+'ZφK?l1SEY@@, *+ *+'[φK>?l1SEZ@@+ *+ *+'\φK?l1SE[@@* *+ *+']φK?l1SE\@@) *+ *+'^φKD?l1SE]@@( *+ *+'_φK|?l1SE^@@' *+ *+'`φK?l1SE_@@& *+ *+'aφK%?l1SE`@@% *+ *+'bφK_?l1SEa@@$ *+ *+'cφK?l1SEb@@# *+ *+'dφK?l1SEc@@" *+ *+'eφKE?l1SEd@@! *+ *+'fφK?l1SEe@@ *+ *+'gφK?l1SEf@@ *+ *+'hφK$?l1SEg@@ *+ *+'iφK?l1SEh@@ *+ *+'jφK?l1SEi@@ *+ *+'kφK*?l1SEj@@ *+ *+'lφKb?l1SEk@@ *+ *+'mφK?l1SEl@@ *+ *+'nφK ?l1SEm@@ *+ *+'oφKF?l1SEn@@ *+ *+'pφK?l1SEo@@ *+ *+'qφK?l1SEp@@ *+ *+'rφK'?l1SEq@@ *+ *+'sφK?l1SEr@@ *+ *+'tφK?l1SEs@@ *+ *+'uφK?l1SEt@@ *+ *+'vφKp?l1SEu@@ *+ *+'wφK?l1SEv@@ *+ *+'xφK?l1SEw@@ *+ *+'yφKT?l1SEx@@ *+ *+'zφK?l1SEy@@ *+ *+'{φK?l1SEz@@ *+ *+'|φK,?l1SE{@@ *+ *+'}φKr?l1SE|@@ *+ *+'~φK?l1SE}@@ *+ *+'φK?l1SE~@@ *+ *+'φK~?l1SE@@ *+ *+'φK?l1SE@@ *+ *+'φK?l1SE@@ *+ *+'φKY?l1SE@@ *+ *+'φK?l1SE@@ *+ *+'φK?l1SE@@ *+ *+'φK  ?l1SE@@ *+ *+'φK<<?l1SE,@@ *+ *+'@UUφKVV?l1SEH@@ڶ *+ *+'4 !@φK?l1SE@@ *+ *+' φK9?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK ?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK\?l1SE@@ *+ *+'  φK?l1SE@@ *+ *+'  φK?l1SE@@ *+ *+'  φK<?l1SE@@ *+ *+'  φK?l1SE@@ *+ *+'  φK?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK ?l1SE@@ *+ *+' φKh?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φKJ?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK%?l1SE@@ *+ *+' φKe?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φKl?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φKO?l1SE@@ *+ *+'  φK?l1SE@@ *+ *+' !φK?l1SE@@ *+ *+' "φK0?l1SE@@ *+ *+' #φKj?l1SE@@ *+ *+' $φK?l1SE@@ *+ *+' %φK ?l1SE@@ *+ *+' &φKM?l1SE@@ *+ *+' 'φK?l1SE@@ *+ *+' (φK?l1SE@@ *+ *+' )φK4?l1SE@@ *+ *+' *φK?l1SE@@ *+ *+' +φK?l1SE@@ *+ *+' ,φK5?l1SE@@ *+ *+' -φKo?l1SE@@ *+ *+' .φK?l1SE@@ *+ *+' /φK?l1SE@@ *+ *+' 0φKP?l1SE@@ *+ *+' 1φK?l1SE@@ *+ *+' 2φK?l1SE@@ *+ *+' 3φK8?l1SE@@ *+ *+' 4φK?l1SE@@ *+ *+' 5φK?l1SE@@ *+ *+' 6φK?l1SE@@ *+ *+' 7φK{?l1SE@@ *+ *+' 8φK?l1SE@@ *+ *+' 9φK?l1SE@@ *+ *+' :φKT?l1SE@@ *+ *+' ;φK?l1SE@@ *+ *+' <φK?l1SE@@ *+ *+' =φK7?l1SE@@ *+ *+' >φKz?l1SE@@ؿ *+ *+' ?φK?l1SE@@ؾ *+ *+' @φK?l1SE@@ؽ *+ *+' AφK?l1SE@@ؼ *+ *+' BφK?l1SE@@ػ *+ *+' CφK?l1SE@@غ *+ *+' DφKb?l1SE@@ع *+ *+' EφK?l1SE@@ظ *+ *+' FφK?l1SE@@ط *+ *+' GφKC?l1SE@@ض *+ *+' HφK~?l1SE@@ص *+ *+' IφK?l1SE@@ش *+ *+' JφK?l1SE@@س *+ *+' KφK`?l1SE@@ز *+ *+' LφK?l1SE@@ر *+ *+' MφK?l1SE@@ذ *+ *+' NφKf ?l1SE@@د *+ *+' OφK ?l1SE@@خ *+ *+' PφK ?l1SE@@ح *+ *+' QφKH ?l1SE@@ج *+ *+' RφK ?l1SE@@ث *+ *+' SφK ?l1SE@@ت *+ *+' TφK, ?l1SE@@ة *+ *+' UφKd ?l1SE@@ب *+ *+' VφK ?l1SE@@ا *+ *+' WφK ?l1SE@@ئ *+ *+' XφKK ?l1SE@@إ *+ *+' YφK ?l1SE@@ؤ *+ *+' ZφK ?l1SE@@أ *+ *+' [φK) ?l1SE@@آ *+ *+' \φK ?l1SE@@ء *+ *+' ]φK ?l1SE@@ؠ *+ *+' ^φK.?l1SE@@؟ *+ *+' _φKh?l1SE@@؞ *+ *+' `φK?l1SE@@؝ *+ *+' aφK ?l1SE@@؜ *+ *+' bφKK?l1SE@@؛ *+ *+' cφK?l1SE@@ؚ *+ *+' dφK?l1SE@@ؙ *+ *+' eφK2?l1SE@@ؘ *+ *+' fφK?l1SE@@ؗ *+ *+' gφK?l1SE@@ؖ *+ *+' hφK?l1SE@@ؕ *+ *+' iφKm?l1SE@@ؔ *+ *+' jφK?l1SE@@ؓ *+ *+' kφK?l1SE@@ؒ *+ *+' lφKN?l1SE@@ؑ *+ *+' mφK?l1SE@@ؐ *+ *+' nφK?l1SE@@؏ *+ *+' oφK1?l1SE@@؎ *+ *+' pφKx?l1SE@@؍ *+ *+' qφK?l1SE@@، *+ *+' rφK?l1SE@@؋ *+ *+' sφKz?l1SE@@؊ *+ *+' tφK?l1SE@@؉ *+ *+' uφK?l1SE@@؈ *+ *+' vφK\?l1SE@@؇ *+ *+' wφK?l1SE@@؆ *+ *+' xφK?l1SE@@؅ *+ *+' yφK>?l1SE@@؄ *+ *+' zφKv?l1SE@@؃ *+ *+' {φK?l1SE@@؂ *+ *+' |φK?l1SE@@؁ *+ *+' }φK]?l1SE@@؀ *+ *+' ~φK?l1SE@@ *+ *+' φK?l1SE@@~ *+ *+' φKY?l1SE@@} *+ *+' φK?l1SE @@| *+ *+' φK?l1SE @@{ *+ *+' φKC?l1SE @@z *+ *+' φK{?l1SE @@y *+ *+' φK?l1SE @@x *+ *+' φK  ?l1SE@@{ *+ *+' φK<<?l1SE,@@J *+ *+' @UUφK,VV?l1SEH@@- *+ *+'4 !w@φK,?l1SE@@t *+ *+' φK-?l1SE@@s *+ *+' φK_-?l1SE@@r *+ *+' φK-?l1SE@@q *+ *+' φK-?l1SE@@p *+ *+' φKN.?l1SE@@o *+ *+' φK.?l1SE@@n *+ *+' φK.?l1SE@@m *+ *+' φK"/?l1SE@@l *+ *+'  φKe/?l1SE@@k *+ *+'  φK/?l1SE@@j *+ *+'  φK0?l1SE@@i *+ *+'  φKF0?l1SE@@h *+ *+'  φK0?l1SE@@g *+ *+' φK0?l1SE@@f *+ *+' φKM1?l1SE @@e *+ *+' φK1?l1SE!@@d *+ *+' φK1?l1SE"@@c *+ *+' φK/2?l1SE#@@b *+ *+' φKh2?l1SE$@@a *+ *+' φK2?l1SE%@@` *+ *+' φK3?l1SE&@@_ *+ *+' φKJ3?l1SE'@@^ *+ *+' φK3?l1SE(@@] *+ *+' φK3?l1SE)@@\ *+ *+' φK14?l1SE*@@[ *+ *+' φK4?l1SE+@@Z *+ *+' φK4?l1SE,@@Y *+ *+' φK35?l1SE-@@X *+ *+' φKm5?l1SE.@@W *+ *+' φK5?l1SE/@@V *+ *+' φK6?l1SE0@@U *+ *+'  φKQ6?l1SE1@@T *+ *+' !φK6?l1SE2@@S *+ *+' "φK6?l1SE3@@R *+ *+' #φK07?l1SE4@@Q *+ *+' $φK7?l1SE5@@P *+ *+' %φK7?l1SE6@@O *+ *+' &φK8?l1SE7@@N *+ *+' 'φKz8?l1SE8@@M *+ *+' (φK8?l1SE9@@L *+ *+' )φK8?l1SE:@@K *+ *+' *φK[9?l1SE;@@J *+ *+' +φK9?l1SE<@@I *+ *+' ,φK9?l1SE=@@H *+ *+' -φK5:?l1SE>@@G *+ *+' .φKy:?l1SE?@@F *+ *+' /φK:?l1SE@@@E *+ *+' 0φK;?l1SEA@@D *+ *+' 1φK~;?l1SEB@@C *+ *+' 2φK;?l1SEC@@B *+ *+' 3φK<?l1SED@@A *+ *+' 4φK^<?l1SEE@@@ *+ *+' 5φK<?l1SEF@@? *+ *+' 6φK<?l1SEG@@> *+ *+' 7φKC=?l1SEH@@= *+ *+' 8φK{=?l1SEI@@< *+ *+' 9φK=?l1SEJ@@; *+ *+' :φK>?l1SEK@@: *+ *+' ;φKc>?l1SEL@@9 *+ *+' <φK>?l1SEM@@8 *+ *+' =φK>?l1SEN@@7 *+ *+' >φKA??l1SEO@@6 *+ *+' ?φK??l1SEP@@5 *+ *+' @φK??l1SEQ@@4 *+ *+' AφKG@?l1SER@@3 *+ *+' BφK@?l1SES@@2 *+ *+' CφK@?l1SET@@1 *+ *+' DφK"A?l1SEU@@0 *+ *+' EφKjA?l1SEV@@/ *+ *+' FφKA?l1SEW@@. *+ *+' GφK B?l1SEX@@- *+ *+' HφKDB?l1SEY@@, *+ *+' IφKB?l1SEZ@@+ *+ *+' JφKB?l1SE[@@* *+ *+' KφK+C?l1SE\@@) *+ *+' LφKC?l1SE]@@( *+ *+' MφKC?l1SE^@@' *+ *+' NφK.D?l1SE_@@& *+ *+' OφKgD?l1SE`@@% *+ *+' PφKD?l1SEa@@$ *+ *+' QφKE?l1SEb@@# *+ *+' RφKHE?l1SEc@@" *+ *+' SφKE?l1SEd@@! *+ *+' TφKE?l1SEe@@ *+ *+' UφK,F?l1SEf@@ *+ *+' VφKF?l1SEg@@ *+ *+' WφKF?l1SEh@@ *+ *+' XφKG?l1SEi@@ *+ *+' YφKtG?l1SEj@@ *+ *+' ZφKG?l1SEk@@ *+ *+' [φKG?l1SEl@@ *+ *+' \φKVH?l1SEm@@ *+ *+' ]φKH?l1SEn@@ *+ *+' ^φKH?l1SEo@@ *+ *+' _φK/I?l1SEp@@ *+ *+' `φKI?l1SEq@@ *+ *+' aφKI?l1SEr@@ *+ *+' bφKJ?l1SEs@@ *+ *+' cφKqJ?l1SEt@@ *+ *+' dφKJ?l1SEu@@ *+ *+' eφKJ?l1SEv@@ *+ *+' fφKZK?l1SEw@@ *+ *+' gφKK?l1SEx@@ *+ *+' hφKK?l1SEy@@ *+ *+' iφKφK-z?l1SE@@׭ *+ *+' ?φKz?l1SE@@׬ *+ *+' @φKz?l1SE@@׫ *+ *+' AφK2{?l1SE@@ת *+ *+' BφKk{?l1SE@@ש *+ *+' CφK{?l1SE@@ר *+ *+' DφK|?l1SE@@ק *+ *+' EφKQ|?l1SE@@צ *+ *+' FφK|?l1SE@@ץ *+ *+' GφK|?l1SE@@פ *+ *+' HφK0}?l1SE@@ף *+ *+' IφK}?l1SE@@ע *+ *+' JφK}?l1SE@@ס *+ *+' KφK~?l1SE@@נ *+ *+' LφKq~?l1SE@@ן *+ *+' MφK~?l1SE@@מ *+ *+' NφK?l1SE@@ם *+ *+' OφKR?l1SE@@ל *+ *+' PφK?l1SE@@כ *+ *+' QφK?l1SE@@ך *+ *+' RφK5?l1SE@@י *+ *+' SφK{?l1SE@@ט *+ *+' TφK݀?l1SE@@ח *+ *+' UφK?l1SE@@ז *+ *+' VφK?l1SE@@ו *+ *+' WφK?l1SE@@ה *+ *+' XφK?l1SE@@ד *+ *+' YφK_?l1SE@@ג *+ *+' ZφK?l1SE@@ב *+ *+' [φK߂?l1SE@@א *+ *+' \φK9?l1SE@@׏ *+ *+' ]φK|?l1SE@@׎ *+ *+' ^φK?l1SE@@׍ *+ *+' _φK?l1SE@@׌ *+ *+' `φKc?l1SE@@׋ *+ *+' aφKÄ?l1SE@@׊ *+ *+' bφK?l1SE@@׉ *+ *+' cφKd?l1SE@@׈ *+ *+' dφK?l1SE@@ׇ *+ *+' eφK?l1SE@@׆ *+ *+' fφKF?l1SE@@ׅ *+ *+' gφK?l1SE@@ׄ *+ *+' hφKņ?l1SE@@׃ *+ *+' iφK(?l1SE@@ׂ *+ *+' jφKa?l1SE@@ׁ *+ *+' kφKȇ?l1SE@@׀ *+ *+' lφK?l1SE@@ *+ *+' mφKX?l1SE@@~ *+ *+' nφK?l1SE@@} *+ *+' oφK?l1SE @@| *+ *+' pφK&?l1SE @@{ *+ *+' qφK?l1SE @@z *+ *+' rφKƉ?l1SE @@y *+ *+' sφK%?l1SE @@x *+ *+' tφKh?l1SE@@w *+ *+' uφK?l1SE@@v *+ *+' vφK?l1SE@@u *+ *+' wφKG?l1SE@@t *+ *+' xφK?l1SE@@s *+ *+' yφK?l1SE@@r *+ *+' zφK*?l1SE@@q *+ *+' {φK?l1SE@@p *+ *+' |φKˌ?l1SE@@o *+ *+' }φK!?l1SE@@n *+ *+' ~φKq?l1SE@@m *+ *+' φK?l1SE@@l *+ *+' φK ?l1SE@@k *+ *+' φKO?l1SE@@j *+ *+' φK?l1SE@@i *+ *+' φK?l1SE@@h *+ *+' φK.?l1SE@@g *+ *+' φKx?l1SE@@f *+ *+' φK  ?l1SE @@i *+ *+' φK<<?l1SE,!@@8 *+ *+' @UUφK:VV?l1SEH"@@ *+ *+'4 !@φKp?l1SE#@@b *+ *+' φK?l1SE$@@a *+ *+' φK?l1SE%@@` *+ *+' φKS?l1SE&@@_ *+ *+' φK?l1SE'@@^ *+ *+' φK?l1SE(@@] *+ *+' φK4?l1SE)@@\ *+ *+' φK?l1SE*@@[ *+ *+' φKդ?l1SE+@@Z *+ *+'  φK?l1SE,@@Y *+ *+'  φKw?l1SE-@@X *+ *+'  φK?l1SE.@@W *+ *+'  φK?l1SE/@@V *+ *+'  φK`?l1SE0@@U *+ *+' φK?l1SE1@@T *+ *+' φK?l1SE2@@S *+ *+' φK9?l1SE3@@R *+ *+' φK?l1SE4@@Q *+ *+' φKڧ?l1SE5@@P *+ *+' φK?l1SE6@@O *+ *+' φK_?l1SE7@@N *+ *+' φKĨ?l1SE8@@M *+ *+' φK?l1SE9@@L *+ *+' φKd?l1SE:@@K *+ *+' φK?l1SE;@@J *+ *+' φK?l1SE<@@I *+ *+' φKF?l1SE=@@H *+ *+' φK~?l1SE>@@G *+ *+' φK?l1SE?@@F *+ *+' φK?l1SE@@@E *+ *+' φKf?l1SEA@@D *+ *+' φK˫?l1SEB@@C *+ *+'  φK?l1SEC@@B *+ *+' !φKD?l1SED@@A *+ *+' "φK?l1SEE@@@ *+ *+' #φK?l1SEF@@? *+ *+' $φKL?l1SEG@@> *+ *+' %φK?l1SEH@@= *+ *+' &φK˭?l1SEI@@< *+ *+' 'φK,?l1SEJ@@; *+ *+' (φKg?l1SEK@@: *+ *+' )φK?l1SEL@@9 *+ *+' *φK?l1SEM@@8 *+ *+' +φKG?l1SEN@@7 *+ *+' ,φK?l1SEO@@6 *+ *+' -φK?l1SEP@@5 *+ *+' .φK.?l1SEQ@@4 *+ *+' /φK?l1SER@@3 *+ *+' 0φK˰?l1SES@@2 *+ *+' 1φK9?l1SET@@1 *+ *+' 2φKj?l1SEU@@0 *+ *+' 3φK?l1SEV@@/ *+ *+' 4φK?l1SEW@@. *+ *+' 5φKM?l1SEX@@- *+ *+' 6φK?l1SEY@@, *+ *+' 7φK?l1SEZ@@+ *+ *+' 8φK/?l1SE[@@* *+ *+' 9φK?l1SE\@@) *+ *+' :φKγ?l1SE]@@( *+ *+' ;φK?l1SE^@@' *+ *+' <φKx?l1SE_@@& *+ *+' =φK?l1SE`@@% *+ *+' >φK?l1SEa@@$ *+ *+' ?φKR?l1SEb@@# *+ *+' @φK?l1SEc@@" *+ *+' AφK?l1SEd@@! *+ *+' BφK3?l1SEe@@ *+ *+' CφK{?l1SEf@@ *+ *+' DφKܶ?l1SEg@@ *+ *+' EφK?l1SEh@@ *+ *+' FφK_?l1SEi@@ *+ *+' GφK?l1SEj@@ *+ *+' HφK?l1SEk@@ *+ *+' IφKb?l1SEl@@ *+ *+' JφK?l1SEm@@ *+ *+' KφK?l1SEn@@ *+ *+' LφK@?l1SEo@@ *+ *+' MφKy?l1SEp@@ *+ *+' NφK߹?l1SEq@@ *+ *+' OφK?l1SEr@@ *+ *+' PφKo?l1SEs@@ *+ *+' QφK?l1SEt@@ *+ *+' RφK?l1SEu@@ *+ *+' SφK>?l1SEv@@ *+ *+' TφK?l1SEw@@ *+ *+' UφK޻?l1SEx@@ *+ *+' VφKE?l1SEy@@ *+ *+' WφK~?l1SEz@@ *+ *+' XφK׼?l1SE{@@ *+ *+' YφK?l1SE|@@ *+ *+' ZφKi?l1SE}@@ *+ *+' [φK?l1SE~@@ *+ *+' \φK?l1SE@@ *+ *+' ]φKC?l1SE@@ *+ *+' ^φK?l1SE@@ *+ *+' _φK?l1SE@@ *+ *+' `φK*?l1SE@@ *+ *+' aφK?l1SE@@ *+ *+' bφKĿ?l1SE@@ *+ *+' cφK,?l1SE@@ *+ *+' dφKe?l1SE@@ *+ *+' eφK?l1SE@@ *+ *+' fφK ?l1SE@@ *+ *+' gφKG?l1SE@@ *+ *+' hφK?l1SE@@ *+ *+' iφK?l1SE@@ *+ *+' jφK)?l1SE@@ *+ *+' kφK?l1SE@@ *+ *+' lφK?l1SE@@ *+ *+' mφK ?l1SE@@ *+ *+' nφKr?l1SE@@ *+ *+' oφK?l1SE@@ *+ *+' pφK?l1SE@@ *+ *+' qφKS?l1SE@@ *+ *+' rφK?l1SE@@ *+ *+' sφK?l1SE@@ *+ *+' tφK.?l1SE@@ *+ *+' uφKp?l1SE@@ *+ *+' vφK?l1SE@@ *+ *+' wφK?l1SE@@ *+ *+' xφKV?l1SE@@ *+ *+' yφK?l1SE@@ *+ *+' zφK?l1SE@@ *+ *+' {φKX?l1SE@@ *+ *+' |φK?l1SE@@ *+ *+' }φK?l1SE@@ *+ *+' ~φK:?l1SE@@ *+ *+' φKt?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φKZ?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK9?l1SE@@ *+ *+' φKl  ?l1SE@@ *+ *+' φKw<<?l1SE,@@د *+ *+' @UUφKVV?l1SEH@@ؒ *+ *+'4 !2@φKd?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK>?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK ?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK?l1SE@@ *+ *+'  φK?l1SE@@ *+ *+'  φKi?l1SE@@ *+ *+'  φK?l1SE@@ *+ *+'  φK?l1SE@@ *+ *+'  φKJ?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK$?l1SE@@ *+ *+' φKz?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φKH?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φKO?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK?l1SE@@ *+ *+' φK2?l1SE@@ֿ *+ *+' φKk?l1SE@@־ *+ *+' φK?l1SE@@ֽ *+ *+' φK ?l1SE@@ּ *+ *+' φKM?l1SE@@ֻ *+ *+' φK?l1SE@@ֺ *+ *+'  φK?l1SE@@ֹ *+ *+' !φK4?l1SE@@ָ *+ *+' "φK?l1SE@@ַ *+ *+' #φK?l1SE@@ֶ *+ *+' $φK6?l1SE@@ֵ *+ *+' %φKp?l1SE@@ִ *+ *+' &φK?l1SE@@ֳ *+ *+' 'φK?l1SE@@ֲ *+ *+' (φKQ?l1SE@@ֱ *+ *+' )φK?l1SE@@ְ *+ *+' *φK?l1SE@@֯ *+ *+' +φK4?l1SE@@֮ *+ *+' ,φK?l1SE@@֭ *+ *+' -φK?l1SE@@֬ *+ *+' .φK?l1SE@@֫ *+ *+' /φK|?l1SE@@֪ *+ *+' 0φK?l1SE@@֩ *+ *+' 1φK?l1SE@@֨ *+ *+' 2φKW?l1SE@@֧ *+ *+' 3φK?l1SE@@֦ *+ *+' 4φK?l1SE@@֥ *+ *+' 5φK8?l1SE@@֤ *+ *+' 6φK?l1SE@@֣ *+ *+' 7φK?l1SE@@֢ *+ *+' 8φK?l1SE@@֡ *+ *+' 9φK?l1SE@@֠ *+ *+' :φK?l1SE@@֟ *+ *+' ;φK?l1SE@@֞ *+ *+' <φKc?l1SE@@֝ *+ *+' =φK?l1SE@@֜ *+ *+' >φK?l1SE@@֛ *+ *+' ?φKE?l1SE@@֚ *+ *+' @φK?l1SE@@֙ *+ *+' AφK?l1SE@@֘ *+ *+' BφK?l1SE@@֗ *+ *+' CφKa?l1SE@@֖ *+ *+' DφK?l1SE@@֕ *+ *+' EφK?l1SE@@֔ *+ *+' FφKW?l1SE@@֓ *+ *+' GφK?l1SE@@֒ *+ *+' HφK?l1SE@@֑ *+ *+' IφKR?l1SE@@֐ *+ *+' JφK?l1SE@@֏ *+ *+' KφK?l1SE@@֎ *+ *+' LφK,?l1SE@@֍ *+ *+' MφKd?l1SE@@֌ *+ *+' NφK?l1SE@@֋ *+ *+' OφK?l1SE@@֊ *+ *+' PφKI?l1SE@@։ *+ *+' QφK?l1SE@@ֈ *+ *+' RφK?l1SE@@և *+ *+' SφK0?l1SE@@ֆ *+ *+' TφK?l1SE@@օ *+ *+' UφK?l1SE@@ք *+ *+' VφK0?l1SE@@փ *+ *+' WφKj?l1SE@@ւ *+ *+' XφK?l1SE@@ց *+ *+' YφK?l1SE@@ր *+ *+' ZφKL?l1SE@@ *+ *+' [φK?l1SE@@~ *+ *+' \φK?l1SE@@} *+ *+' ]φK-?l1SE @@| *+ *+' ^φK?l1SE @@{ *+ *+' _φK?l1SE @@z *+ *+' `φK?l1SE @@y *+ *+' aφKw?l1SE @@x *+ *+' bφK?l1SE@@w *+ *+' cφK?l1SE@@v *+ *+' dφK_?l1SE@@u *+ *+' eφK?l1SE@@t *+ *+' fφK?l1SE@@s *+ *+' gφK2?l1SE@@r *+ *+' hφK}?l1SE@@q *+ *+' iφK?l1SE@@p *+ *+' jφK?l1SE@@o *+ *+' kφK{?l1SE@@n *+ *+' lφK?l1SE@@m *+ *+' mφK?l1SE@@l *+ *+' nφKU?l1SE@@k *+ *+' oφK?l1SE@@j *+ *+' pφK?l1SE@@i *+ *+' qφK@?l1SE@@h *+ *+' rφKw?l1SE@@g *+ *+' sφK?l1SE@@f *+ *+' tφK ?l1SE @@e *+ *+' uφK\ ?l1SE!@@d *+ *+' vφK ?l1SE"@@c *+ *+' wφK ?l1SE#@@b *+ *+' xφKB ?l1SE$@@a *+ *+' yφK ?l1SE%@@` *+ *+' zφK ?l1SE&@@_ *+ *+' {φKC ?l1SE'@@^ *+ *+' |φK~ ?l1SE(@@] *+ *+' }φK ?l1SE)@@\ *+ *+' ~φK& ?l1SE*@@[ *+ *+' φK^ ?l1SE+@@Z *+ *+' φK ?l1SE,@@Y *+ *+' φK ?l1SE-@@X *+ *+' φKG ?l1SE.@@W *+ *+' φK ?l1SE/@@V *+ *+' φK ?l1SE0@@U *+ *+' φK$ ?l1SE1@@T *+ *+' φKV  ?l1SE2@@W *+ *+' φKa <<?l1SE,3@@& *+ *+' @UUφK VV?l1SEH4@@ *+ *+'4!'M@φK ?l1SE5@@P *+ *+'φKg ?l1SE6@@O *+ *+'φK ?l1SE7@@N *+ *+'φK ?l1SE8@@M *+ *+'φKG ?l1SE9@@L *+ *+'φK ?l1SE:@@K *+ *+'φK ?l1SE;@@J *+ *+'φKJ ?l1SE<@@I *+ *+'φK ?l1SE=@@H *+ *+' φK ?l1SE>@@G *+ *+' φK+ ?l1SE?@@F *+ *+' φKd ?l1SE@@@E *+ *+' φK ?l1SEA@@D *+ *+' φK ?l1SEB@@C *+ *+'φKN ?l1SEC@@B *+ *+'φK ?l1SED@@A *+ *+'φK ?l1SEE@@@ *+ *+'φK/ ?l1SEF@@? *+ *+'φK ?l1SEG@@> *+ *+'φK ?l1SEH@@= *+ *+'φK  ?l1SEI@@< *+ *+'φKq ?l1SEJ@@; *+ *+'φK ?l1SEK@@: *+ *+'φK ?l1SEL@@9 *+ *+'φKJ ?l1SEM@@8 *+ *+'φK ?l1SEN@@7 *+ *+'φK ?l1SEO@@6 *+ *+'φK. ?l1SEP@@5 *+ *+'φK ?l1SEQ@@4 *+ *+'φK ?l1SER@@3 *+ *+'φK! ?l1SES@@2 *+ *+'φKv! ?l1SET@@1 *+ *+' φK! ?l1SEU@@0 *+ *+'!φK! ?l1SEV@@/ *+ *+'"φKW" ?l1SEW@@. *+ *+'#φK" ?l1SEX@@- *+ *+'$φK# ?l1SEY@@, *+ *+'%φK1# ?l1SEZ@@+ *+ *+'&φK{# ?l1SE[@@* *+ *+''φK# ?l1SE\@@) *+ *+'(φK$ ?l1SE]@@( *+ *+')φK[$ ?l1SE^@@' *+ *+'*φK$ ?l1SE_@@& *+ *+'+φK$ ?l1SE`@@% *+ *+',φKY% ?l1SEa@@$ *+ *+'-φK% ?l1SEb@@# *+ *+'.φK% ?l1SEc@@" *+ *+'/φK>& ?l1SEd@@! *+ *+'0φKy& ?l1SEe@@ *+ *+'1φK& ?l1SEf@@ *+ *+'2φK' ?l1SEg@@ *+ *+'3φKZ' ?l1SEh@@ *+ *+'4φK' ?l1SEi@@ *+ *+'5φK' ?l1SEj@@ *+ *+'6φKA( ?l1SEk@@ *+ *+'7φK( ?l1SEl@@ *+ *+'8φK( ?l1SEm@@ *+ *+'9φKC) ?l1SEn@@ *+ *+':φK|) ?l1SEo@@ *+ *+';φK) ?l1SEp@@ *+ *+'<φK$* ?l1SEq@@ *+ *+'=φK`* ?l1SEr@@ *+ *+'>φK* ?l1SEs@@ *+ *+'?φK+ ?l1SEt@@ *+ *+'@φK@+ ?l1SEu@@ *+ *+'AφK+ ?l1SEv@@ *+ *+'BφK+ ?l1SEw@@ *+ *+'CφK", ?l1SEx@@ *+ *+'DφK, ?l1SEy@@ *+ *+'EφK, ?l1SEz@@ *+ *+'FφK - ?l1SE{@@ *+ *+'GφKp- ?l1SE|@@ *+ *+'HφK- ?l1SE}@@ *+ *+'IφK. ?l1SE~@@ *+ *+'JφKG. ?l1SE@@ *+ *+'KφK. ?l1SE@@ *+ *+'LφK. ?l1SE@@ *+ *+'MφK'/ ?l1SE@@ *+ *+'NφK/ ?l1SE@@ *+ *+'OφK/ ?l1SE@@ *+ *+'PφK0 ?l1SE@@ *+ *+'QφKh0 ?l1SE@@ *+ *+'RφK0 ?l1SE@@ *+ *+'SφK0 ?l1SE@@ *+ *+'TφKR1 ?l1SE@@ *+ *+'UφK1 ?l1SE@@ *+ *+'VφK1 ?l1SE@@ *+ *+'WφK+2 ?l1SE@@ *+ *+'XφKm2 ?l1SE@@ *+ *+'YφK2 ?l1SE@@ *+ *+'ZφK 3 ?l1SE@@ *+ *+'[φKT3 ?l1SE@@ *+ *+'\φK3 ?l1SE@@ *+ *+']φK3 ?l1SE@@ *+ *+'^φKW4 ?l1SE@@ *+ *+'_φK4 ?l1SE@@ *+ *+'`φK4 ?l1SE@@ *+ *+'aφK95 ?l1SE@@ *+ *+'bφKq5 ?l1SE@@ *+ *+'cφK5 ?l1SE@@ *+ *+'dφK6 ?l1SE@@ *+ *+'eφKY6 ?l1SE@@ *+ *+'fφK6 ?l1SE@@ *+ *+'gφK6 ?l1SE@@ *+ *+'hφK77 ?l1SE@@ *+ *+'iφK7 ?l1SE@@ *+ *+'jφK7 ?l1SE@@ *+ *+'kφK>8 ?l1SE@@ *+ *+'lφKv8 ?l1SE@@ *+ *+'mφK8 ?l1SE@@ *+ *+'nφK9 ?l1SE@@ *+ *+'oφKY9 ?l1SE@@ *+ *+'pφK9 ?l1SE@@ *+ *+'qφK9 ?l1SE@@ *+ *+'rφK<: ?l1SE@@ *+ *+'sφK: ?l1SE@@ *+ *+'tφK: ?l1SE@@ *+ *+'uφK"; ?l1SE@@ *+ *+'vφK; ?l1SE@@ *+ *+'wφK; ?l1SE@@ *+ *+'xφK; ?l1SE@@ *+ *+'yφKf< ?l1SE@@ *+ *+'zφK< ?l1SE@@ *+ *+'{φK= ?l1SE@@ *+ *+'|φK?= ?l1SE@@ *+ *+'}φK= ?l1SE@@ *+ *+'~φK= ?l1SE@@ *+ *+'φK"> ?l1SE@@ *+ *+'φK> ?l1SE@@ *+ *+'φK> ?l1SE@@ *+ *+'φK ? ?l1SE@@ *+ *+'φKj? ?l1SE@@ *+ *+'φK? ?l1SE@@ *+ *+'φK? ?l1SE@@ *+ *+'φK@  ?l1SE@@ *+ *+'φK"@ <<?l1SE,@@ם *+ *+'@UUφK\R VV?l1SEH@@׀ *+ *+'4!4U@φKS ?l1SE@@ *+ *+'φKKS ?l1SE@@ *+ *+'φKS ?l1SE@@ *+ *+'φKS ?l1SE@@ *+ *+'φK3T ?l1SE@@ *+ *+'φKT ?l1SE@@ *+ *+'φKT ?l1SE@@ *+ *+'φK6U ?l1SE@@ *+ *+'φKnU ?l1SE@@տ *+ *+' φKU ?l1SE@@վ *+ *+' φKV ?l1SE@@ս *+ *+' φKOV ?l1SE@@ռ *+ *+' φKV ?l1SE@@ջ *+ *+' φKV ?l1SE@@պ *+ *+'φK5W ?l1SE@@չ *+ *+'φKW ?l1SE@@ո *+ *+'φKW ?l1SE@@շ *+ *+'φKX ?l1SE@@ն *+ *+'φK{X ?l1SE@@յ *+ *+'φKX ?l1SE@@մ *+ *+'φKX ?l1SE@@ճ *+ *+'φKWY ?l1SE@@ղ *+ *+'φKY ?l1SE@@ձ *+ *+'φKY ?l1SE@@հ *+ *+'φK6Z ?l1SE@@կ *+ *+'φK}Z ?l1SE@@ծ *+ *+'φKZ ?l1SE@@խ *+ *+'φK[ ?l1SE@@լ *+ *+'φK[ ?l1SE@@ի *+ *+'φK[ ?l1SE@@ժ *+ *+'φK[ ?l1SE@@թ *+ *+'φKb\ ?l1SE@@ը *+ *+' φK\ ?l1SE@@է *+ *+'!φK\ ?l1SE@@զ *+ *+'"φKC] ?l1SE@@ե *+ *+'#φK}] ?l1SE@@դ *+ *+'$φK] ?l1SE@@գ *+ *+'%φK^ ?l1SE@@բ *+ *+'&φK_^ ?l1SE@@ա *+ *+''φK^ ?l1SE@@ՠ *+ *+'(φK^ ?l1SE@@՟ *+ *+')φKF_ ?l1SE@@՞ *+ *+'*φK_ ?l1SE@@՝ *+ *+'+φK_ ?l1SE@@՜ *+ *+',φK@` ?l1SE@@՛ *+ *+'-φK` ?l1SE@@՚ *+ *+'.φK` ?l1SE@@ՙ *+ *+'/φK+a ?l1SE@@՘ *+ *+'0φKba ?l1SE@@՗ *+ *+'1φKa ?l1SE@@Ֆ *+ *+'2φKb ?l1SE@@Օ *+ *+'3φKJb ?l1SE@@Ք *+ *+'4φKb ?l1SE@@Փ *+ *+'5φKb ?l1SE@@Ւ *+ *+'6φK(c ?l1SE@@Ց *+ *+'7φKc ?l1SE@@Ր *+ *+'8φKc ?l1SE@@Տ *+ *+'9φK.d ?l1SE@@Վ *+ *+':φKhd ?l1SE@@Ս *+ *+';φKd ?l1SE@@Ռ *+ *+'<φKe ?l1SE@@Ջ *+ *+'=φKIe ?l1SE@@Պ *+ *+'>φKe ?l1SE@@Չ *+ *+'?φKe ?l1SE@@Ո *+ *+'@φK,f ?l1SE@@Շ *+ *+'AφKf ?l1SE@@Ն *+ *+'BφKf ?l1SE@@Յ *+ *+'CφKg ?l1SE@@Մ *+ *+'DφKvg ?l1SE@@Ճ *+ *+'EφKg ?l1SE@@Ղ *+ *+'FφKg ?l1SE@@Ձ *+ *+'GφKVh ?l1SE@@Հ *+ *+'HφKh ?l1SE@@ *+ *+'IφKi ?l1SE@@~ *+ *+'JφK1i ?l1SE@@} *+ *+'KφKvi ?l1SE @@| *+ *+'LφKi ?l1SE @@{ *+ *+'MφKj ?l1SE @@z *+ *+'NφKxj ?l1SE @@y *+ *+'OφKj ?l1SE @@x *+ *+'PφKj ?l1SE@@w *+ *+'QφK[k ?l1SE@@v *+ *+'RφKk ?l1SE@@u *+ *+'SφKk ?l1SE@@t *+ *+'TφK>l ?l1SE@@s *+ *+'UφKwl ?l1SE@@r *+ *+'VφKl ?l1SE@@q *+ *+'WφKm ?l1SE@@p *+ *+'XφK^m ?l1SE@@o *+ *+'YφKm ?l1SE@@n *+ *+'ZφKm ?l1SE@@m *+ *+'[φK@@G *+ *+'φKy ?l1SE?@@F *+ *+'φKy ?l1SE@@@E *+ *+'φKXz ?l1SEA@@D *+ *+'φKz ?l1SEB@@C *+ *+'φKz ?l1SEC@@B *+ *+'φK{  ?l1SED@@E *+ *+'φK{ <<?l1SE,E@@ *+ *+'@UUφK VV?l1SEHF@@ *+ *+'4!@@φKэ ?l1SEG@@> *+ *+'φK ?l1SEH@@= *+ *+'φK{ ?l1SEI@@< *+ *+'φK ?l1SEJ@@; *+ *+'φK ?l1SEK@@: *+ *+'φK\ ?l1SEL@@9 *+ *+'φK ?l1SEM@@8 *+ *+'φK ?l1SEN@@7 *+ *+'φK5 ?l1SEO@@6 *+ *+' φKw ?l1SEP@@5 *+ *+' φKߐ ?l1SEQ@@4 *+ *+' φK ?l1SER@@3 *+ *+' φK_ ?l1SES@@2 *+ *+' φK ?l1SET@@1 *+ *+'φK ?l1SEU@@0 *+ *+'φKa ?l1SEV@@/ *+ *+'φK ?l1SEW@@. *+ *+'φKߒ ?l1SEX@@- *+ *+'φKB ?l1SEY@@, *+ *+'φK{ ?l1SEZ@@+ *+ *+'φK“ ?l1SE[@@* *+ *+'φK$ ?l1SE\@@) *+ *+'φK\ ?l1SE]@@( *+ *+'φKŔ ?l1SE^@@' *+ *+'φK ?l1SE_@@& *+ *+'φKD ?l1SE`@@% *+ *+'φK ?l1SEa@@$ *+ *+'φK ?l1SEb@@# *+ *+'φKG ?l1SEc@@" *+ *+'φK ?l1SEd@@! *+ *+'φK– ?l1SEe@@ *+ *+'φK) ?l1SEf@@ *+ *+' φKb ?l1SEg@@ *+ *+'!φK ?l1SEh@@ *+ *+'"φK ?l1SEi@@ *+ *+'#φKD ?l1SEj@@ *+ *+'$φK ?l1SEk@@ *+ *+'%φK ?l1SEl@@ *+ *+'&φK' ?l1SEm@@ *+ *+''φK ?l1SEn@@ *+ *+'(φKƙ ?l1SEo@@ *+ *+')φK ?l1SEp@@ *+ *+'*φKo ?l1SEq@@ *+ *+'+φK ?l1SEr@@ *+ *+',φK ?l1SEs@@ *+ *+'-φKI ?l1SEt@@ *+ *+'.φK ?l1SEu@@ *+ *+'/φK ?l1SEv@@ *+ *+'0φK+ ?l1SEw@@ *+ *+'1φK ?l1SEx@@ *+ *+'2φK˜ ?l1SEy@@ *+ *+'3φK ?l1SEz@@ *+ *+'4φKs ?l1SE{@@ *+ *+'5φK ?l1SE|@@ *+ *+'6φK ?l1SE}@@ *+ *+'7φKV ?l1SE~@@ *+ *+'8φK ?l1SE@@ *+ *+'9φK ?l1SE@@ *+ *+':φK0 ?l1SE@@ *+ *+';φKw ?l1SE@@ *+ *+'<φKП ?l1SE@@ *+ *+'=φK ?l1SE@@ *+ *+'>φKS ?l1SE@@ *+ *+'?φK ?l1SE@@ *+ *+'@φK ?l1SE@@ *+ *+'AφKZ ?l1SE@@ *+ *+'BφK ?l1SE@@ *+ *+'CφK ?l1SE@@ *+ *+'DφK5 ?l1SE@@ *+ *+'EφKv ?l1SE@@ *+ *+'FφK ?l1SE@@ *+ *+'GφK ?l1SE@@ *+ *+'HφKW ?l1SE@@ *+ *+'IφK ?l1SE@@ *+ *+'JφK ?l1SE@@ *+ *+'KφK= ?l1SE@@ *+ *+'LφK ?l1SE@@ *+ *+'MφKڤ ?l1SE@@ *+ *+'NφK@ ?l1SE@@ *+ *+'OφKz ?l1SE@@ *+ *+'PφK¥ ?l1SE@@ *+ *+'QφK# ?l1SE@@ *+ *+'RφK\ ?l1SE@@ *+ *+'SφK ?l1SE@@ *+ *+'TφK ?l1SE@@ *+ *+'UφK@ ?l1SE@@ *+ *+'VφK ?l1SE@@ *+ *+'WφKާ ?l1SE@@ *+ *+'XφK3 ?l1SE@@ *+ *+'YφK ?l1SE@@ *+ *+'ZφK ?l1SE@@ *+ *+'[φK ?l1SE@@ *+ *+'\φKj ?l1SE@@ *+ *+']φK ?l1SE@@ *+ *+'^φK ?l1SE@@ *+ *+'_φKC ?l1SE@@ *+ *+'`φK ?l1SE@@ *+ *+'aφK ?l1SE@@ *+ *+'bφK$ ?l1SE@@ *+ *+'cφK ?l1SE@@ *+ *+'dφKū ?l1SE@@ *+ *+'eφK ?l1SE@@ *+ *+'fφKm ?l1SE@@ *+ *+'gφK ?l1SE@@ *+ *+'hφK ?l1SE@@ *+ *+'iφKZ ?l1SE@@ *+ *+'jφK ?l1SE@@ *+ *+'kφK ?l1SE@@ *+ *+'lφK( ?l1SE@@ *+ *+'mφKm ?l1SE@@ *+ *+'nφKҮ ?l1SE@@ *+ *+'oφK ?l1SE@@ *+ *+'pφK\ ?l1SE@@ *+ *+'qφK ?l1SE@@ *+ *+'rφK ?l1SE@@ *+ *+'sφKT ?l1SE@@ *+ *+'tφK ?l1SE@@ *+ *+'uφKް ?l1SE@@ *+ *+'vφK8 ?l1SE@@ *+ *+'wφKo ?l1SE@@ *+ *+'xφK ?l1SE@@ *+ *+'yφK ?l1SE@@ *+ *+'zφKR ?l1SE@@ *+ *+'{φK ?l1SE@@ *+ *+'|φK ?l1SE@@ *+ *+'}φKA ?l1SE@@ *+ *+'~φK ?l1SE@@ *+ *+'φKԳ ?l1SE@@Կ *+ *+'φK8 ?l1SE@@Ծ *+ *+'φKt ?l1SE@@Խ *+ *+'φK ?l1SE@@Լ *+ *+'φK ?l1SE@@Ի *+ *+'φKW ?l1SE@@Ժ *+ *+'φK ?l1SE@@Թ *+ *+'φKʵ  ?l1SE@@ռ *+ *+'φKյ <<?l1SE,@@֋ *+ *+'@UUφK VV?l1SEH@@n *+ *+'4!Mzm@φK ?l1SE@@Ե *+ *+'φK ?l1SE@@Դ *+ *+'φK^ ?l1SE@@Գ *+ *+'φK ?l1SE@@Բ *+ *+'φK ?l1SE@@Ա *+ *+'φKG ?l1SE@@԰ *+ *+'φK ?l1SE@@ԯ *+ *+'φK ?l1SE@@Ԯ *+ *+'φK ?l1SE@@ԭ *+ *+' φKc ?l1SE@@Ԭ *+ *+' φK ?l1SE@@ԫ *+ *+' φK ?l1SE@@Ԫ *+ *+' φKJ ?l1SE@@ԩ *+ *+' φK ?l1SE@@Ԩ *+ *+'φK ?l1SE@@ԧ *+ *+'φKL ?l1SE@@Ԧ *+ *+'φK ?l1SE@@ԥ *+ *+'φK ?l1SE@@Ԥ *+ *+'φK- ?l1SE@@ԣ *+ *+'φKf ?l1SE@@Ԣ *+ *+'φK ?l1SE@@ԡ *+ *+'φK ?l1SE@@Ԡ *+ *+'φKI ?l1SE@@ԟ *+ *+'φK ?l1SE@@Ԟ *+ *+'φK ?l1SE@@ԝ *+ *+'φK, ?l1SE@@Ԝ *+ *+'φK ?l1SE@@ԛ *+ *+'φK ?l1SE@@Ԛ *+ *+'φK2 ?l1SE@@ԙ *+ *+'φKk ?l1SE@@Ԙ *+ *+'φK ?l1SE@@ԗ *+ *+'φK ?l1SE@@Ԗ *+ *+' φKN ?l1SE@@ԕ *+ *+'!φK ?l1SE@@Ԕ *+ *+'"φK ?l1SE@@ԓ *+ *+'#φK/ ?l1SE@@Ԓ *+ *+'$φK ?l1SE@@ԑ *+ *+'%φK ?l1SE@@Ԑ *+ *+'&φK ?l1SE@@ԏ *+ *+''φKp ?l1SE@@Ԏ *+ *+'(φK ?l1SE@@ԍ *+ *+')φK ?l1SE@@Ԍ *+ *+'*φKZ ?l1SE@@ԋ *+ *+'+φK ?l1SE@@Ԋ *+ *+',φK ?l1SE@@ԉ *+ *+'-φK4 ?l1SE@@Ԉ *+ *+'.φKw ?l1SE@@ԇ *+ *+'/φK ?l1SE@@Ԇ *+ *+'0φK ?l1SE@@ԅ *+ *+'1φK} ?l1SE@@Ԅ *+ *+'2φK ?l1SE@@ԃ *+ *+'3φK ?l1SE@@Ԃ *+ *+'4φK_ ?l1SE@@ԁ *+ *+'5φK ?l1SE@@Ԁ *+ *+'6φK ?l1SE@@ *+ *+'7φKB ?l1SE@@~ *+ *+'8φKz ?l1SE@@} *+ *+'9φK ?l1SE @@| *+ *+':φK ?l1SE @@{ *+ *+';φKa ?l1SE @@z *+ *+'<φK ?l1SE @@y *+ *+'=φK ?l1SE @@x *+ *+'>φK@ ?l1SE@@w *+ *+'?φK ?l1SE@@v *+ *+'@φK ?l1SE@@u *+ *+'AφKE ?l1SE@@t *+ *+'BφK ?l1SE@@s *+ *+'CφK ?l1SE@@r *+ *+'DφK( ?l1SE@@q *+ *+'EφKb ?l1SE@@p *+ *+'FφK ?l1SE@@o *+ *+'GφK ?l1SE@@n *+ *+'HφKB ?l1SE@@m *+ *+'IφK ?l1SE@@l *+ *+'JφK ?l1SE@@k *+ *+'KφK* ?l1SE@@j *+ *+'LφK ?l1SE@@i *+ *+'MφK ?l1SE@@h *+ *+'NφK6 ?l1SE@@g *+ *+'OφKg ?l1SE@@f *+ *+'PφK ?l1SE @@e *+ *+'QφK ?l1SE!@@d *+ *+'RφKG ?l1SE"@@c *+ *+'SφK ?l1SE#@@b *+ *+'TφK ?l1SE$@@a *+ *+'UφK, ?l1SE%@@` *+ *+'VφK ?l1SE&@@_ *+ *+'WφK ?l1SE'@@^ *+ *+'XφK ?l1SE(@@] *+ *+'YφKr ?l1SE)@@\ *+ *+'ZφK ?l1SE*@@[ *+ *+'[φK ?l1SE+@@Z *+ *+'\φKO ?l1SE,@@Y *+ *+']φK ?l1SE-@@X *+ *+'^φK ?l1SE.@@W *+ *+'_φK- ?l1SE/@@V *+ *+'`φKu ?l1SE0@@U *+ *+'aφK ?l1SE1@@T *+ *+'bφK ?l1SE2@@S *+ *+'cφKo ?l1SE3@@R *+ *+'dφK ?l1SE4@@Q *+ *+'eφK ?l1SE5@@P *+ *+'fφKY ?l1SE6@@O *+ *+'gφK ?l1SE7@@N *+ *+'hφK ?l1SE8@@M *+ *+'iφK; ?l1SE9@@L *+ *+'jφKs ?l1SE:@@K *+ *+'kφK ?l1SE;@@J *+ *+'lφK ?l1SE<@@I *+ *+'mφKk ?l1SE=@@H *+ *+'nφK ?l1SE>@@G *+ *+'oφK ?l1SE?@@F *+ *+'pφK9 ?l1SE@@@E *+ *+'qφK ?l1SEA@@D *+ *+'rφK ?l1SEB@@C *+ *+'sφKJ ?l1SEC@@B *+ *+'tφKy ?l1SED@@A *+ *+'uφK ?l1SEE@@@ *+ *+'vφK! ?l1SEF@@? *+ *+'wφK[ ?l1SEG@@> *+ *+'xφK ?l1SEH@@= *+ *+'yφK ?l1SEI@@< *+ *+'zφK= ?l1SEJ@@; *+ *+'{φK ?l1SEK@@: *+ *+'|φK ?l1SEL@@9 *+ *+'}φK ?l1SEM@@8 *+ *+'~φK ?l1SEN@@7 *+ *+'φK ?l1SEO@@6 *+ *+'φK& ?l1SEP@@5 *+ *+'φK_ ?l1SEQ@@4 *+ *+'φK ?l1SER@@3 *+ *+'φK ?l1SES@@2 *+ *+'φKA ?l1SET@@1 *+ *+'φK ?l1SEU@@0 *+ *+'φK  ?l1SEV@@3 *+ *+'φK <<?l1SE,W@@ *+ *+'@UUφK VV?l1SEHX@@ *+ *+'4!Z @φK ?l1SEY@@, *+ *+'φK ?l1SEZ@@+ *+ *+'φK& ?l1SE[@@* *+ *+'φKf ?l1SE\@@) *+ *+'φK ?l1SE]@@( *+ *+'φK ?l1SE^@@' *+ *+'φKG ?l1SE_@@& *+ *+'φK ?l1SE`@@% *+ *+'φK ?l1SEa@@$ *+ *+' φK. ?l1SEb@@# *+ *+' φK ?l1SEc@@" *+ *+' φK ?l1SEd@@! *+ *+' φK  ?l1SEe@@ *+ *+' φKs ?l1SEf@@ *+ *+'φK ?l1SEg@@ *+ *+'φK ?l1SEh@@ *+ *+'φKK ?l1SEi@@ *+ *+'φK ?l1SEj@@ *+ *+'φK ?l1SEk@@ *+ *+'φK. ?l1SEl@@ *+ *+'φKu ?l1SEm@@ *+ *+'φK ?l1SEn@@ *+ *+'φK ?l1SEo@@ *+ *+'φKw ?l1SEp@@ *+ *+'φK ?l1SEq@@ *+ *+'φK ?l1SEr@@ *+ *+'φKY ?l1SEs@@ *+ *+'φK ?l1SEt@@ *+ *+'φK ?l1SEu@@ *+ *+'φK3 ?l1SEv@@ *+ *+'φKz ?l1SEw@@ *+ *+'φK ?l1SEx@@ *+ *+' φK ?l1SEy@@ *+ *+'!φKX ?l1SEz@@ *+ *+'"φK ?l1SE{@@ *+ *+'#φK ?l1SE|@@ *+ *+'$φK] ?l1SE}@@ *+ *+'%φK ?l1SE~@@ *+ *+'&φK ?l1SE@@ *+ *+''φK@ ?l1SE@@ *+ *+'(φKz ?l1SE@@ *+ *+')φK ?l1SE@@ *+ *+'*φK! ?l1SE@@ *+ *+'+φKZ ?l1SE@@ *+ *+',φK ?l1SE@@ *+ *+'-φK ?l1SE@@ *+ *+'.φKB ?l1SE@@ *+ *+'/φK ?l1SE@@ *+ *+'0φK ?l1SE@@ *+ *+'1φKN ?l1SE@@ *+ *+'2φK} ?l1SE@@ *+ *+'3φK ?l1SE@@ *+ *+'4φK& ?l1SE@@ *+ *+'5φK` ?l1SE@@ *+ *+'6φK ?l1SE@@ *+ *+'7φK ?l1SE@@ *+ *+'8φKD ?l1SE@@ *+ *+'9φK ?l1SE@@ *+ *+':φK ?l1SE@@ *+ *+';φK) ?l1SE@@ *+ *+'<φK ?l1SE@@ *+ *+'=φK ?l1SE@@ *+ *+'>φK  ?l1SE@@ *+ *+'?φKd ?l1SE@@ *+ *+'@φK ?l1SE@@ *+ *+'AφK  ?l1SE@@ *+ *+'BφKF ?l1SE@@ *+ *+'CφK ?l1SE@@ *+ *+'DφK ?l1SE@@ *+ *+'EφK( ?l1SE@@ *+ *+'FφKj ?l1SE@@ *+ *+'GφK ?l1SE@@ *+ *+'HφK  ?l1SE@@ *+ *+'IφKr ?l1SE@@ *+ *+'JφK ?l1SE@@ *+ *+'KφK ?l1SE@@ *+ *+'LφKR ?l1SE@@ *+ *+'MφK ?l1SE@@ *+ *+'NφK ?l1SE@@ *+ *+'OφK- ?l1SE@@ *+ *+'PφK ?l1SE@@ *+ *+'QφK ?l1SE@@ *+ *+'RφK ?l1SE@@ *+ *+'SφKQ ?l1SE@@ *+ *+'TφK ?l1SE@@ *+ *+'UφK ?l1SE@@ *+ *+'VφKa ?l1SE@@ *+ *+'WφK ?l1SE@@ *+ *+'XφK ?l1SE@@ *+ *+'YφK9 ?l1SE@@ *+ *+'ZφKs ?l1SE@@ *+ *+'[φK ?l1SE@@ *+ *+'\φK ?l1SE@@ *+ *+']φKV ?l1SE@@ *+ *+'^φK ?l1SE@@ *+ *+'_φK ?l1SE@@ *+ *+'`φK7 ?l1SE@@ *+ *+'aφK ?l1SE@@ *+ *+'bφK ?l1SE@@ *+ *+'cφK>! ?l1SE@@ *+ *+'dφKx! ?l1SE@@ *+ *+'eφK! ?l1SE@@ *+ *+'fφK!" ?l1SE@@ *+ *+'gφKZ" ?l1SE@@ *+ *+'hφK" ?l1SE@@ *+ *+'iφK# ?l1SE@@ *+ *+'jφK;# ?l1SE@@ *+ *+'kφK# ?l1SE@@ *+ *+'lφK# ?l1SE@@ *+ *+'mφK$ ?l1SE@@ӿ *+ *+'nφK$ ?l1SE@@Ӿ *+ *+'oφK$ ?l1SE@@ӽ *+ *+'pφK% ?l1SE@@Ӽ *+ *+'qφKf% ?l1SE@@ӻ *+ *+'rφK% ?l1SE@@Ӻ *+ *+'sφK& ?l1SE@@ӹ *+ *+'tφK@& ?l1SE@@Ӹ *+ *+'uφK& ?l1SE@@ӷ *+ *+'vφK& ?l1SE@@Ӷ *+ *+'wφK"' ?l1SE@@ӵ *+ *+'xφKj' ?l1SE@@Ӵ *+ *+'yφK' ?l1SE@@ӳ *+ *+'zφK( ?l1SE@@Ӳ *+ *+'{φKk( ?l1SE@@ӱ *+ *+'|φK( ?l1SE@@Ӱ *+ *+'}φK( ?l1SE@@ӯ *+ *+'~φKL) ?l1SE@@Ӯ *+ *+'φK) ?l1SE@@ӭ *+ *+'φK) ?l1SE@@Ӭ *+ *+'φK&* ?l1SE@@ӫ *+ *+'φKn* ?l1SE@@Ӫ *+ *+'φK* ?l1SE@@ө *+ *+'φK + ?l1SE@@Ө *+ *+'φKK+ ?l1SE@@ӧ *+ *+'φK}+  ?l1SE@@Ԫ *+ *+'φK+ <<?l1SE,@@y *+ *+'@UUφK2> VV?l1SEH@@\ *+ *+'4!f'@φKo> ?l1SE@@ӣ *+ *+'φK> ?l1SE@@Ӣ *+ *+'φK? ?l1SE@@ӡ *+ *+'φKQ? ?l1SE@@Ӡ *+ *+'φK? ?l1SE@@ӟ *+ *+'φK? ?l1SE@@Ӟ *+ *+'φK2@ ?l1SE@@ӝ *+ *+'φK@ ?l1SE@@Ӝ *+ *+'φK@ ?l1SE@@ӛ *+ *+' φKA ?l1SE@@Ӛ *+ *+' φK}A ?l1SE@@ә *+ *+' φKA ?l1SE@@Ә *+ *+' φKA ?l1SE@@ӗ *+ *+' φK^B ?l1SE@@Ӗ *+ *+'φKB ?l1SE@@ӕ *+ *+'φKB ?l1SE@@Ӕ *+ *+'φK7C ?l1SE@@ӓ *+ *+'φKC ?l1SE@@Ӓ *+ *+'φKC ?l1SE@@ӑ *+ *+'φKD ?l1SE@@Ӑ *+ *+'φK^D ?l1SE@@ӏ *+ *+'φKD ?l1SE@@ӎ *+ *+'φKD ?l1SE@@Ӎ *+ *+'φKcE ?l1SE@@ӌ *+ *+'φKE ?l1SE@@Ӌ *+ *+'φKE ?l1SE@@ӊ *+ *+'φK=F ?l1SE@@Ӊ *+ *+'φK~F ?l1SE@@ӈ *+ *+'φKF ?l1SE@@Ӈ *+ *+'φKG ?l1SE@@ӆ *+ *+'φKdG ?l1SE@@Ӆ *+ *+'φKG ?l1SE@@ӄ *+ *+' φKH ?l1SE@@Ӄ *+ *+'!φKGH ?l1SE@@ӂ *+ *+'"φKH ?l1SE@@Ӂ *+ *+'#φKH ?l1SE@@Ӏ *+ *+'$φKJI ?l1SE@@ *+ *+'%φKI ?l1SE@@~ *+ *+'&φKI ?l1SE@@} *+ *+''φK+J ?l1SE @@| *+ *+'(φKdJ ?l1SE @@{ *+ *+')φKJ ?l1SE @@z *+ *+'*φKK ?l1SE @@y *+ *+'+φKFK ?l1SE @@x *+ *+',φKK ?l1SE@@w *+ *+'-φKK ?l1SE@@v *+ *+'.φK.L ?l1SE@@u *+ *+'/φKL ?l1SE@@t *+ *+'0φKL ?l1SE@@s *+ *+'1φK1M ?l1SE@@r *+ *+'2φKhM ?l1SE@@q *+ *+'3φKM ?l1SE@@p *+ *+'4φKN ?l1SE@@o *+ *+'5φKKN ?l1SE@@n *+ *+'6φKN ?l1SE@@m *+ *+'7φKN ?l1SE@@l *+ *+'8φK2O ?l1SE@@k *+ *+'9φKO ?l1SE@@j *+ *+':φKO ?l1SE@@i *+ *+';φKP ?l1SE@@h *+ *+'<φKvP ?l1SE@@g *+ *+'=φKP ?l1SE@@f *+ *+'>φKP ?l1SE @@e *+ *+'?φKWQ ?l1SE!@@d *+ *+'@φKQ ?l1SE"@@c *+ *+'AφKR ?l1SE#@@b *+ *+'BφK0R ?l1SE$@@a *+ *+'CφKuR ?l1SE%@@` *+ *+'DφKR ?l1SE&@@_ *+ *+'EφK S ?l1SE'@@^ *+ *+'FφKUS ?l1SE(@@] *+ *+'GφKS ?l1SE)@@\ *+ *+'HφKS ?l1SE*@@[ *+ *+'IφKhT ?l1SE+@@Z *+ *+'JφKT ?l1SE,@@Y *+ *+'KφKT ?l1SE-@@X *+ *+'LφK?U ?l1SE.@@W *+ *+'MφKxU ?l1SE/@@V *+ *+'NφKU ?l1SE0@@U *+ *+'OφKV ?l1SE1@@T *+ *+'PφKYV ?l1SE2@@S *+ *+'QφKV ?l1SE3@@R *+ *+'RφKV ?l1SE4@@Q *+ *+'SφKAW ?l1SE5@@P *+ *+'TφKW ?l1SE6@@O *+ *+'UφKW ?l1SE7@@N *+ *+'VφKDX ?l1SE8@@M *+ *+'WφK}X ?l1SE9@@L *+ *+'XφKX ?l1SE:@@K *+ *+'YφK%Y ?l1SE;@@J *+ *+'ZφK^Y ?l1SE<@@I *+ *+'[φKY ?l1SE=@@H *+ *+'\φKZ ?l1SE>@@G *+ *+']φKAZ ?l1SE?@@F *+ *+'^φKZ ?l1SE@@@E *+ *+'_φKZ ?l1SEA@@D *+ *+'`φK'[ ?l1SEB@@C *+ *+'aφK[ ?l1SEC@@B *+ *+'bφK[ ?l1SED@@A *+ *+'cφK*\ ?l1SEE@@@ *+ *+'dφKb\ ?l1SEF@@? *+ *+'eφK\ ?l1SEG@@> *+ *+'fφK] ?l1SEH@@= *+ *+'gφKE] ?l1SEI@@< *+ *+'hφK] ?l1SEJ@@; *+ *+'iφK] ?l1SEK@@: *+ *+'jφK'^ ?l1SEL@@9 *+ *+'kφK^ ?l1SEM@@8 *+ *+'lφK^ ?l1SEN@@7 *+ *+'mφK _ ?l1SEO@@6 *+ *+'nφKq_ ?l1SEP@@5 *+ *+'oφK_ ?l1SEQ@@4 *+ *+'pφK_ ?l1SER@@3 *+ *+'qφKQ` ?l1SES@@2 *+ *+'rφK` ?l1SET@@1 *+ *+'sφK` ?l1SEU@@0 *+ *+'tφK.a ?l1SEV@@/ *+ *+'uφKoa ?l1SEW@@. *+ *+'vφKa ?l1SEX@@- *+ *+'wφK b ?l1SEY@@, *+ *+'xφKUb ?l1SEZ@@+ *+ *+'yφKb ?l1SE[@@* *+ *+'zφKb ?l1SE\@@) *+ *+'{φKWc ?l1SE]@@( *+ *+'|φKc ?l1SE^@@' *+ *+'}φKc ?l1SE_@@& *+ *+'~φK9d ?l1SE`@@% *+ *+'φKrd ?l1SEa@@$ *+ *+'φKd ?l1SEb@@# *+ *+'φKe ?l1SEc@@" *+ *+'φKYe ?l1SEd@@! *+ *+'φKe ?l1SEe@@ *+ *+'φKe ?l1SEf@@ *+ *+'φK6f ?l1SEg@@ *+ *+'φKhf  ?l1SEh@@! *+ *+'φKtf <<?l1SE,i@@ *+ *+'@UUφKx VV?l1SEHj@@ *+ *+'4!s-`@φK:y ?l1SEk@@ *+ *+'φKsy ?l1SEl@@ *+ *+'φKy ?l1SEm@@ *+ *+'φKz ?l1SEn@@ *+ *+'φKZz ?l1SEo@@ *+ *+'φKz ?l1SEp@@ *+ *+'φKz ?l1SEq@@ *+ *+'φK\{ ?l1SEr@@ *+ *+'φK{ ?l1SEs@@ *+ *+' φK{ ?l1SEt@@ *+ *+' φK=| ?l1SEu@@ *+ *+' φKw| ?l1SEv@@ *+ *+' φK| ?l1SEw@@ *+ *+' φK!} ?l1SEx@@ *+ *+'φKY} ?l1SEy@@ *+ *+'φK} ?l1SEz@@ *+ *+'φK} ?l1SE{@@ *+ *+'φK@~ ?l1SE|@@ *+ *+'φK~ ?l1SE}@@ *+ *+'φK~ ?l1SE~@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK$ ?l1SE@@ *+ *+'φK^ ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK@ ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK! ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+' φK ?l1SE@@ *+ *+'!φK ?l1SE@@ *+ *+'"φKk ?l1SE@@ *+ *+'#φK ?l1SE@@ *+ *+'$φK ?l1SE@@ *+ *+'%φKD ?l1SE@@ *+ *+'&φK ?l1SE@@ *+ *+''φK ?l1SE@@ *+ *+'(φK& ?l1SE@@ *+ *+')φK} ?l1SE@@ *+ *+'*φKȅ ?l1SE@@ *+ *+'+φK ?l1SE@@ *+ *+',φKo ?l1SE@@ *+ *+'-φK ?l1SE@@ *+ *+'.φK ?l1SE@@ *+ *+'/φKR ?l1SE@@ *+ *+'0φK ?l1SE@@ *+ *+'1φK ?l1SE@@ *+ *+'2φK, ?l1SE@@ *+ *+'3φKl ?l1SE@@ *+ *+'4φKԈ ?l1SE@@ *+ *+'5φK ?l1SE@@ *+ *+'6φKT ?l1SE@@ *+ *+'7φK ?l1SE@@ *+ *+'8φK ?l1SE@@ *+ *+'9φKW ?l1SE@@ *+ *+':φK ?l1SE@@ *+ *+';φKъ ?l1SE@@ *+ *+'<φK8 ?l1SE@@ *+ *+'=φKq ?l1SE@@ *+ *+'>φK ?l1SE@@ *+ *+'?φK ?l1SE@@ *+ *+'@φKT ?l1SE@@ *+ *+'AφK ?l1SE@@ *+ *+'BφK ?l1SE@@ *+ *+'CφK; ?l1SE@@ *+ *+'DφK ?l1SE@@ *+ *+'EφKՍ ?l1SE@@ *+ *+'FφK ?l1SE@@ *+ *+'GφK~ ?l1SE@@ *+ *+'HφK ?l1SE@@ *+ *+'IφK ?l1SE@@ *+ *+'JφKW ?l1SE@@ *+ *+'KφK ?l1SE@@ *+ *+'LφK ?l1SE@@ *+ *+'MφK: ?l1SE@@ *+ *+'NφK ?l1SE@@ *+ *+'OφKڐ ?l1SE@@ *+ *+'PφK ?l1SE@@ *+ *+'QφK ?l1SE@@ *+ *+'RφK ?l1SE@@ *+ *+'SφK ?l1SE@@ *+ *+'TφKe ?l1SE@@ *+ *+'UφK ?l1SE@@ *+ *+'VφK ?l1SE@@ *+ *+'WφK? ?l1SE@@ *+ *+'XφK ?l1SE@@ *+ *+'YφK ?l1SE@@ *+ *+'ZφK ?l1SE@@ *+ *+'[φKg ?l1SE@@ҿ *+ *+'\φKɔ ?l1SE@@Ҿ *+ *+']φK ?l1SE@@ҽ *+ *+'^φKj ?l1SE@@Ҽ *+ *+'_φK ?l1SE@@һ *+ *+'`φK ?l1SE@@Һ *+ *+'aφKK ?l1SE@@ҹ *+ *+'bφK ?l1SE@@Ҹ *+ *+'cφK ?l1SE@@ҷ *+ *+'dφK& ?l1SE@@Ҷ *+ *+'eφK{ ?l1SE@@ҵ *+ *+'fφK͗ ?l1SE@@Ҵ *+ *+'gφK ?l1SE@@ҳ *+ *+'hφKI ?l1SE@@Ҳ *+ *+'iφK ?l1SE@@ұ *+ *+'jφK ?l1SE@@Ұ *+ *+'kφKO ?l1SE@@ү *+ *+'lφK ?l1SE@@Ү *+ *+'mφKЙ ?l1SE@@ҭ *+ *+'nφK+ ?l1SE@@Ҭ *+ *+'oφKm ?l1SE@@ҫ *+ *+'pφK ?l1SE@@Ҫ *+ *+'qφK ?l1SE@@ҩ *+ *+'rφKM ?l1SE@@Ҩ *+ *+'sφK ?l1SE@@ҧ *+ *+'tφK ?l1SE@@Ҧ *+ *+'uφK4 ?l1SE@@ҥ *+ *+'vφK ?l1SE@@Ҥ *+ *+'wφKМ ?l1SE@@ң *+ *+'xφK ?l1SE@@Ң *+ *+'yφKz ?l1SE@@ҡ *+ *+'zφK ?l1SE@@Ҡ *+ *+'{φK ?l1SE@@ҟ *+ *+'|φKR ?l1SE@@Ҟ *+ *+'}φK ?l1SE@@ҝ *+ *+'~φK ?l1SE@@Ҝ *+ *+'φK4 ?l1SE@@қ *+ *+'φK ?l1SE@@Қ *+ *+'φK՟ ?l1SE@@ҙ *+ *+'φK ?l1SE@@Ҙ *+ *+'φK| ?l1SE@@җ *+ *+'φK ?l1SE@@Җ *+ *+'φK ?l1SE@@ҕ *+ *+'φK;  ?l1SE@@Ә *+ *+'φKF <<?l1SE,@@g *+ *+'@UUφK VV?l1SEH@@J *+ *+'4!@φK ?l1SE@@ґ *+ *+'φKb ?l1SE@@Ґ *+ *+'φK ?l1SE@@ҏ *+ *+'φK ?l1SE@@Ҏ *+ *+'φKA ?l1SE@@ҍ *+ *+'φK ?l1SE@@Ҍ *+ *+'φK޵ ?l1SE@@ҋ *+ *+'φKO ?l1SE@@Ҋ *+ *+'φK| ?l1SE@@҉ *+ *+' φKĶ ?l1SE@@҈ *+ *+' φK% ?l1SE@@҇ *+ *+' φK^ ?l1SE@@҆ *+ *+' φK ?l1SE@@҅ *+ *+' φK ?l1SE@@҄ *+ *+'φKB ?l1SE@@҃ *+ *+'φK ?l1SE@@҂ *+ *+'φK ?l1SE@@ҁ *+ *+'φK) ?l1SE@@Ҁ *+ *+'φK ?l1SE@@ *+ *+'φKù ?l1SE@@~ *+ *+'φK ?l1SE@@} *+ *+'φKd ?l1SE @@| *+ *+'φK ?l1SE @@{ *+ *+'φK ?l1SE @@z *+ *+'φKF ?l1SE @@y *+ *+'φK ?l1SE @@x *+ *+'φK ?l1SE@@w *+ *+'φK' ?l1SE@@v *+ *+'φK ?l1SE@@u *+ *+'φKȼ ?l1SE@@t *+ *+'φK ?l1SE@@s *+ *+'φKp ?l1SE@@r *+ *+' φK ?l1SE@@q *+ *+'!φK ?l1SE@@p *+ *+'"φKR ?l1SE@@o *+ *+'#φK ?l1SE@@n *+ *+'$φK ?l1SE@@m *+ *+'%φK- ?l1SE@@l *+ *+'&φKt ?l1SE@@k *+ *+''φKտ ?l1SE@@j *+ *+'(φK ?l1SE@@i *+ *+')φKT ?l1SE@@h *+ *+'*φK ?l1SE@@g *+ *+'+φK ?l1SE@@f *+ *+',φKQ ?l1SE @@e *+ *+'-φK ?l1SE!@@d *+ *+'.φK ?l1SE"@@c *+ *+'/φK: ?l1SE#@@b *+ *+'0φKr ?l1SE$@@a *+ *+'1φK ?l1SE%@@` *+ *+'2φK ?l1SE&@@_ *+ *+'3φKU ?l1SE'@@^ *+ *+'4φK ?l1SE(@@] *+ *+'5φK ?l1SE)@@\ *+ *+'6φK= ?l1SE*@@[ *+ *+'7φK ?l1SE+@@Z *+ *+'8φK ?l1SE,@@Y *+ *+'9φK= ?l1SE-@@X *+ *+':φKx ?l1SE.@@W *+ *+';φK ?l1SE/@@V *+ *+'<φK ?l1SE0@@U *+ *+'=φKX ?l1SE1@@T *+ *+'>φK ?l1SE2@@S *+ *+'?φK ?l1SE3@@R *+ *+'@φK: ?l1SE4@@Q *+ *+'AφK ?l1SE5@@P *+ *+'BφK ?l1SE6@@O *+ *+'CφK ?l1SE7@@N *+ *+'DφK ?l1SE8@@M *+ *+'EφK ?l1SE9@@L *+ *+'FφK ?l1SE:@@K *+ *+'GφKk ?l1SE;@@J *+ *+'HφK ?l1SE<@@I *+ *+'IφK ?l1SE=@@H *+ *+'JφKA ?l1SE>@@G *+ *+'KφK ?l1SE?@@F *+ *+'LφK ?l1SE@@@E *+ *+'MφK! ?l1SEA@@D *+ *+'NφK ?l1SEB@@C *+ *+'OφK ?l1SEC@@B *+ *+'PφK ?l1SED@@A *+ *+'QφKc ?l1SEE@@@ *+ *+'RφK ?l1SEF@@? *+ *+'SφK ?l1SEG@@> *+ *+'TφKL ?l1SEH@@= *+ *+'UφK ?l1SEI@@< *+ *+'VφK ?l1SEJ@@; *+ *+'WφK& ?l1SEK@@: *+ *+'XφKl ?l1SEL@@9 *+ *+'YφK ?l1SEM@@8 *+ *+'ZφK ?l1SEN@@7 *+ *+'[φKS ?l1SEO@@6 *+ *+'\φK ?l1SEP@@5 *+ *+']φK ?l1SEQ@@4 *+ *+'^φK\ ?l1SER@@3 *+ *+'_φK ?l1SES@@2 *+ *+'`φK ?l1SET@@1 *+ *+'aφK+ ?l1SEU@@0 *+ *+'bφKt ?l1SEV@@/ *+ *+'cφK ?l1SEW@@. *+ *+'dφK ?l1SEX@@- *+ *+'eφKT ?l1SEY@@, *+ *+'fφK ?l1SEZ@@+ *+ *+'gφK ?l1SE[@@* *+ *+'hφK2 ?l1SE\@@) *+ *+'iφK ?l1SE]@@( *+ *+'jφK ?l1SE^@@' *+ *+'kφK8 ?l1SE_@@& *+ *+'lφKo ?l1SE`@@% *+ *+'mφK ?l1SEa@@$ *+ *+'nφK ?l1SEb@@# *+ *+'oφKS ?l1SEc@@" *+ *+'pφK ?l1SEd@@! *+ *+'qφK ?l1SEe@@ *+ *+'rφK4 ?l1SEf@@ *+ *+'sφK ?l1SEg@@ *+ *+'tφK ?l1SEh@@ *+ *+'uφK ?l1SEi@@ *+ *+'vφK} ?l1SEj@@ *+ *+'wφK ?l1SEk@@ *+ *+'xφK ?l1SEl@@ *+ *+'yφK` ?l1SEm@@ *+ *+'zφK ?l1SEn@@ *+ *+'{φK ?l1SEo@@ *+ *+'|φK: ?l1SEp@@ *+ *+'}φK ?l1SEq@@ *+ *+'~φK ?l1SEr@@ *+ *+'φK ?l1SEs@@ *+ *+'φK ?l1SEt@@ *+ *+'φK ?l1SEu@@ *+ *+'φK ?l1SEv@@ *+ *+'φKd ?l1SEw@@ *+ *+'φK ?l1SEx@@ *+ *+'φK ?l1SEy@@ *+ *+'φK  ?l1SEz@@ *+ *+'φK <<?l1SE,{@@ *+ *+'@UUφKX VV?l1SEH|@@ *+ *+'4!X,@φK ?l1SE}@@ *+ *+'φKQ ?l1SE~@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK. ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK( ?l1SE@@ *+ *+'φKh ?l1SE@@ *+ *+' φK ?l1SE@@ *+ *+' φK ?l1SE@@ *+ *+' φKJ ?l1SE@@ *+ *+' φK ?l1SE@@ *+ *+' φK ?l1SE@@ *+ *+'φK, ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φKt ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φKW ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK0 ?l1SE@@ *+ *+'φKz ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φKy ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK\ ?l1SE@@ *+ *+' φK ?l1SE@@ *+ *+'!φK ?l1SE@@ *+ *+'"φK> ?l1SE@@ *+ *+'#φKw ?l1SE@@ *+ *+'$φK ?l1SE@@ *+ *+'%φK ?l1SE@@ *+ *+'&φKY ?l1SE@@ *+ *+''φK ?l1SE@@ *+ *+'(φK ?l1SE@@ *+ *+')φK@ ?l1SE@@ *+ *+'*φK ?l1SE@@ *+ *+'+φK ?l1SE@@ *+ *+',φKC ?l1SE@@ *+ *+'-φK| ?l1SE@@ *+ *+'.φK ?l1SE@@ *+ *+'/φK$ ?l1SE@@ *+ *+'0φK] ?l1SE@@ *+ *+'1φK ?l1SE@@ *+ *+'2φK ?l1SE@@ *+ *+'3φKD ?l1SE@@ *+ *+'4φK ?l1SE@@ *+ *+'5φK ?l1SE@@ *+ *+'6φK" ?l1SE@@ *+ *+'7φK ?l1SE@@ *+ *+'8φK ?l1SE@@ *+ *+'9φK) ?l1SE@@ *+ *+':φKb ?l1SE@@ *+ *+';φK ?l1SE@@ *+ *+'<φK ?l1SE@@ *+ *+'=φKL ?l1SE@@ *+ *+'>φK ?l1SE@@ *+ *+'?φK ?l1SE@@ *+ *+'@φK' ?l1SE@@ *+ *+'AφK ?l1SE@@ *+ *+'BφK ?l1SE@@ *+ *+'CφK  ?l1SE@@ *+ *+'DφKh ?l1SE@@ *+ *+'EφK ?l1SE@@ *+ *+'FφK ?l1SE@@ *+ *+'GφKQ ?l1SE@@ *+ *+'HφK ?l1SE@@ *+ *+'IφK ?l1SE@@ѿ *+ *+'JφK, ?l1SE@@Ѿ *+ *+'KφKn ?l1SE@@ѽ *+ *+'LφK ?l1SE@@Ѽ *+ *+'MφK  ?l1SE@@ѻ *+ *+'NφKt ?l1SE@@Ѻ *+ *+'OφK ?l1SE@@ѹ *+ *+'PφK ?l1SE@@Ѹ *+ *+'QφKV ?l1SE@@ѷ *+ *+'RφK ?l1SE@@Ѷ *+ *+'SφK ?l1SE@@ѵ *+ *+'TφK8 ?l1SE@@Ѵ *+ *+'UφKq ?l1SE@@ѳ *+ *+'VφK ?l1SE@@Ѳ *+ *+'WφK ?l1SE@@ѱ *+ *+'XφKX ?l1SE@@Ѱ *+ *+'YφK ?l1SE@@ѯ *+ *+'ZφK ?l1SE@@Ѯ *+ *+'[φK6 ?l1SE@@ѭ *+ *+'\φK ?l1SE@@Ѭ *+ *+']φK ?l1SE@@ѫ *+ *+'^φK< ?l1SE@@Ѫ *+ *+'_φKu ?l1SE@@ѩ *+ *+'`φK ?l1SE@@Ѩ *+ *+'aφK ?l1SE@@ѧ *+ *+'bφKY ?l1SE@@Ѧ *+ *+'cφK ?l1SE@@ѥ *+ *+'dφK ?l1SE@@Ѥ *+ *+'eφK; ?l1SE@@ѣ *+ *+'fφK ?l1SE@@Ѣ *+ *+'gφK ?l1SE@@ѡ *+ *+'hφK1 ?l1SE@@Ѡ *+ *+'iφKz ?l1SE@@џ *+ *+'jφK ?l1SE@@ў *+ *+'kφK# ?l1SE@@ѝ *+ *+'lφK\ ?l1SE@@ќ *+ *+'mφK ?l1SE@@ћ *+ *+'nφK ?l1SE@@њ *+ *+'oφK> ?l1SE@@љ *+ *+'pφK ?l1SE@@ј *+ *+'qφK ?l1SE@@ї *+ *+'rφK( ?l1SE@@і *+ *+'sφK ?l1SE@@ѕ *+ *+'tφK ?l1SE@@є *+ *+'uφK ?l1SE@@ѓ *+ *+'vφKi ?l1SE@@ђ *+ *+'wφK ?l1SE@@ё *+ *+'xφK ?l1SE@@ѐ *+ *+'yφKL ?l1SE@@я *+ *+'zφK ?l1SE@@ю *+ *+'{φK ?l1SE@@э *+ *+'|φK$ ?l1SE@@ь *+ *+'}φKk ?l1SE@@ы *+ *+'~φK ?l1SE@@ъ *+ *+'φK ?l1SE@@щ *+ *+'φKf ?l1SE@@ш *+ *+'φK ?l1SE@@ч *+ *+'φK ?l1SE@@ц *+ *+'φKP ?l1SE@@х *+ *+'φK ?l1SE@@ф *+ *+'φK ?l1SE@@у *+ *+'φK  ?l1SE@@҆ *+ *+'φK  <<?l1SE,@@U *+ *+'@UUφK) VV?l1SEH@@8 *+ *+'4!@φK) ?l1SE@@ *+ *+'φK* ?l1SE@@~ *+ *+'φKj* ?l1SE@@} *+ *+'φK* ?l1SE @@| *+ *+'φK* ?l1SE @@{ *+ *+'φKK+ ?l1SE @@z *+ *+'φK+ ?l1SE @@y *+ *+'φK+ ?l1SE @@x *+ *+'φK%, ?l1SE@@w *+ *+' φKh, ?l1SE@@v *+ *+' φK, ?l1SE@@u *+ *+' φK- ?l1SE@@t *+ *+' φKO- ?l1SE@@s *+ *+' φK- ?l1SE@@r *+ *+'φK- ?l1SE@@q *+ *+'φKQ. ?l1SE@@p *+ *+'φK. ?l1SE@@o *+ *+'φK. ?l1SE@@n *+ *+'φK2/ ?l1SE@@m *+ *+'φKk/ ?l1SE@@l *+ *+'φK/ ?l1SE@@k *+ *+'φK0 ?l1SE@@j *+ *+'φKM0 ?l1SE@@i *+ *+'φK0 ?l1SE@@h *+ *+'φK0 ?l1SE@@g *+ *+'φKD1 ?l1SE@@f *+ *+'φK1 ?l1SE @@e *+ *+'φK1 ?l1SE!@@d *+ *+'φK72 ?l1SE"@@c *+ *+'φKo2 ?l1SE#@@b *+ *+'φK2 ?l1SE$@@a *+ *+'φK3 ?l1SE%@@` *+ *+' φKT3 ?l1SE&@@_ *+ *+'!φK3 ?l1SE'@@^ *+ *+'"φK3 ?l1SE(@@] *+ *+'#φK44 ?l1SE)@@\ *+ *+'$φK4 ?l1SE*@@[ *+ *+'%φK4 ?l1SE+@@Z *+ *+'&φK5 ?l1SE,@@Y *+ *+''φK}5 ?l1SE-@@X *+ *+'(φK5 ?l1SE.@@W *+ *+')φK5 ?l1SE/@@V *+ *+'*φK^6 ?l1SE0@@U *+ *+'+φK6 ?l1SE1@@T *+ *+',φK6 ?l1SE2@@S *+ *+'-φK97 ?l1SE3@@R *+ *+'.φK{7 ?l1SE4@@Q *+ *+'/φK7 ?l1SE5@@P *+ *+'0φK8 ?l1SE6@@O *+ *+'1φK8 ?l1SE7@@N *+ *+'2φK8 ?l1SE8@@M *+ *+'3φK9 ?l1SE9@@L *+ *+'4φKc9 ?l1SE:@@K *+ *+'5φK9 ?l1SE;@@J *+ *+'6φK9 ?l1SE<@@I *+ *+'7φKF: ?l1SE=@@H *+ *+'8φK: ?l1SE>@@G *+ *+'9φK: ?l1SE?@@F *+ *+':φK ; ?l1SE@@@E *+ *+';φKg; ?l1SEA@@D *+ *+'<φK; ?l1SEB@@C *+ *+'=φK< ?l1SEC@@B *+ *+'>φKD< ?l1SED@@A *+ *+'?φK< ?l1SEE@@@ *+ *+'@φK< ?l1SEF@@? *+ *+'AφKJ= ?l1SEG@@> *+ *+'BφK= ?l1SEH@@= *+ *+'CφK= ?l1SEI@@< *+ *+'DφK-> ?l1SEJ@@; *+ *+'EφKf> ?l1SEK@@: *+ *+'FφK> ?l1SEL@@9 *+ *+'GφK? ?l1SEM@@8 *+ *+'HφKG? ?l1SEN@@7 *+ *+'IφK? ?l1SEO@@6 *+ *+'JφK? ?l1SEP@@5 *+ *+'KφK/@ ?l1SEQ@@4 *+ *+'LφK@ ?l1SER@@3 *+ *+'MφK@ ?l1SES@@2 *+ *+'NφK1A ?l1SET@@1 *+ *+'OφKjA ?l1SEU@@0 *+ *+'PφKA ?l1SEV@@/ *+ *+'QφKB ?l1SEW@@. *+ *+'RφKLB ?l1SEX@@- *+ *+'SφKB ?l1SEY@@, *+ *+'TφKB ?l1SEZ@@+ *+ *+'UφK/C ?l1SE[@@* *+ *+'VφKC ?l1SE\@@) *+ *+'WφKC ?l1SE]@@( *+ *+'XφKD ?l1SE^@@' *+ *+'YφKxD ?l1SE_@@& *+ *+'ZφKD ?l1SE`@@% *+ *+'[φKD ?l1SEa@@$ *+ *+'\φKYE ?l1SEb@@# *+ *+']φKE ?l1SEc@@" *+ *+'^φKE ?l1SEd@@! *+ *+'_φK2F ?l1SEe@@ *+ *+'`φKzF ?l1SEf@@ *+ *+'aφKF ?l1SEg@@ *+ *+'bφKG ?l1SEh@@ *+ *+'cφKvG ?l1SEi@@ *+ *+'dφKG ?l1SEj@@ *+ *+'eφKG ?l1SEk@@ *+ *+'fφK^H ?l1SEl@@ *+ *+'gφKH ?l1SEm@@ *+ *+'hφKH ?l1SEn@@ *+ *+'iφK@I ?l1SEo@@ *+ *+'jφK{I ?l1SEp@@ *+ *+'kφKI ?l1SEq@@ *+ *+'lφKJ ?l1SEr@@ *+ *+'mφKbJ ?l1SEs@@ *+ *+'nφKJ ?l1SEt@@ *+ *+'oφKJ ?l1SEu@@ *+ *+'pφKCK ?l1SEv@@ *+ *+'qφKK ?l1SEw@@ *+ *+'rφKK ?l1SEx@@ *+ *+'sφKPL ?l1SEy@@ *+ *+'tφK}L ?l1SEz@@ *+ *+'uφKL ?l1SE{@@ *+ *+'vφK(M ?l1SE|@@ *+ *+'wφK`M ?l1SE}@@ *+ *+'xφKM ?l1SE~@@ *+ *+'yφKN ?l1SE@@ *+ *+'zφKBN ?l1SE@@ *+ *+'{φKN ?l1SE@@ *+ *+'|φKN ?l1SE@@ *+ *+'}φK%O ?l1SE@@ *+ *+'~φKO ?l1SE@@ *+ *+'φKO ?l1SE@@ *+ *+'φK*P ?l1SE@@ *+ *+'φKdP ?l1SE@@ *+ *+'φKP ?l1SE@@ *+ *+'φK Q ?l1SE@@ *+ *+'φKGQ ?l1SE@@ *+ *+'φKQ ?l1SE@@ *+ *+'φKQ  ?l1SE@@ *+ *+'φKQ <<?l1SE,@@ *+ *+'@UUφKpd VV?l1SEH@@ү *+ *+'4!z@φKd ?l1SE@@ *+ *+'φKd ?l1SE@@ *+ *+'φKIe ?l1SE@@ *+ *+'φKe ?l1SE@@ *+ *+'φKe ?l1SE@@ *+ *+'φK4f ?l1SE@@ *+ *+'φKlf ?l1SE@@ *+ *+'φKf ?l1SE@@ *+ *+'φK g ?l1SE@@ *+ *+' φKPg ?l1SE@@ *+ *+' φKg ?l1SE@@ *+ *+' φKg ?l1SE@@ *+ *+' φK5h ?l1SE@@ *+ *+' φKh ?l1SE@@ *+ *+'φKh ?l1SE@@ *+ *+'φK9i ?l1SE@@ *+ *+'φKqi ?l1SE@@ *+ *+'φKi ?l1SE@@ *+ *+'φKj ?l1SE@@ *+ *+'φKSj ?l1SE@@ *+ *+'φKj ?l1SE@@ *+ *+'φKj ?l1SE@@ *+ *+'φK6k ?l1SE@@ *+ *+'φKk ?l1SE@@ *+ *+'φKk ?l1SE@@ *+ *+'φKl ?l1SE@@ *+ *+'φKl ?l1SE@@ *+ *+'φKl ?l1SE@@ *+ *+'φKm ?l1SE@@ *+ *+'φKXm ?l1SE@@ *+ *+'φKm ?l1SE@@ *+ *+'φKm ?l1SE@@ *+ *+' φK;n ?l1SE@@ *+ *+'!φK|n ?l1SE@@ *+ *+'"φKn ?l1SE@@ *+ *+'#φKo ?l1SE@@ *+ *+'$φKo ?l1SE@@ *+ *+'%φKo ?l1SE@@ *+ *+'&φKp ?l1SE@@ *+ *+''φKep ?l1SE@@ *+ *+'(φKp ?l1SE@@ *+ *+')φKp ?l1SE@@ *+ *+'*φKFq ?l1SE@@ *+ *+'+φKq ?l1SE@@ *+ *+',φKq ?l1SE@@ *+ *+'-φK r ?l1SE@@ *+ *+'.φKvr ?l1SE@@ *+ *+'/φKr ?l1SE@@ *+ *+'0φKs ?l1SE@@ *+ *+'1φKjs ?l1SE@@ *+ *+'2φKs ?l1SE@@ *+ *+'3φKs ?l1SE@@ *+ *+'4φKKt ?l1SE@@ *+ *+'5φKt ?l1SE@@ *+ *+'6φKt ?l1SE@@ *+ *+'7φK%u ?l1SE@@п *+ *+'8φKlu ?l1SE@@о *+ *+'9φKu ?l1SE@@н *+ *+':φKv ?l1SE@@м *+ *+';φKMv ?l1SE@@л *+ *+'<φKv ?l1SE@@к *+ *+'=φKv ?l1SE@@й *+ *+'>φK+w ?l1SE@@и *+ *+'?φKw ?l1SE@@з *+ *+'@φKw ?l1SE@@ж *+ *+'AφK1x ?l1SE@@е *+ *+'BφKjx ?l1SE@@д *+ *+'CφKx ?l1SE@@г *+ *+'DφKy ?l1SE@@в *+ *+'EφKMy ?l1SE@@б *+ *+'FφKy ?l1SE@@а *+ *+'GφKy ?l1SE@@Я *+ *+'HφK/z ?l1SE@@Ю *+ *+'IφKz ?l1SE@@Э *+ *+'JφKz ?l1SE@@Ь *+ *+'KφK{ ?l1SE@@Ы *+ *+'LφKx{ ?l1SE@@Ъ *+ *+'MφK{ ?l1SE@@Щ *+ *+'NφK| ?l1SE@@Ш *+ *+'OφKR| ?l1SE@@Ч *+ *+'PφK| ?l1SE@@Ц *+ *+'QφK| ?l1SE@@Х *+ *+'RφK3} ?l1SE@@Ф *+ *+'SφK|} ?l1SE@@У *+ *+'TφK} ?l1SE@@Т *+ *+'UφK~ ?l1SE@@С *+ *+'VφK}~ ?l1SE@@Р *+ *+'WφK~ ?l1SE@@П *+ *+'XφK  ?l1SE@@О *+ *+'YφK^ ?l1SE@@Н *+ *+'ZφK ?l1SE@@М *+ *+'[φK ?l1SE@@Л *+ *+'\φKA ?l1SE@@К *+ *+']φK{ ?l1SE@@Й *+ *+'^φK ?l1SE@@И *+ *+'_φK ?l1SE@@З *+ *+'`φK] ?l1SE@@Ж *+ *+'aφKÁ ?l1SE@@Е *+ *+'bφK ?l1SE@@Д *+ *+'cφKc ?l1SE@@Г *+ *+'dφK ?l1SE@@В *+ *+'eφK߂ ?l1SE@@Б *+ *+'fφKF ?l1SE@@А *+ *+'gφK ?l1SE@@Џ *+ *+'hφKƃ ?l1SE@@Ў *+ *+'iφK' ?l1SE@@Ѝ *+ *+'jφKa ?l1SE@@Ќ *+ *+'kφKDŽ ?l1SE@@Ћ *+ *+'lφK ?l1SE@@Њ *+ *+'mφKC ?l1SE@@Љ *+ *+'nφK ?l1SE@@Ј *+ *+'oφK ?l1SE@@Ї *+ *+'pφK, ?l1SE@@І *+ *+'qφK ?l1SE@@Ѕ *+ *+'rφKĆ ?l1SE@@Є *+ *+'sφK, ?l1SE@@Ѓ *+ *+'tφKe ?l1SE@@Ђ *+ *+'uφK ?l1SE@@Ё *+ *+'vφK ?l1SE@@Ѐ *+ *+'wφKG ?l1SE@@ *+ *+'xφK ?l1SE@@~ *+ *+'yφK ?l1SE@@} *+ *+'zφK) ?l1SE @@| *+ *+'{φK ?l1SE @@{ *+ *+'|φKɉ ?l1SE @@z *+ *+'}φK ?l1SE @@y *+ *+'~φKq ?l1SE @@x *+ *+'φK ?l1SE@@w *+ *+'φK ?l1SE@@v *+ *+'φKK ?l1SE@@u *+ *+'φK ?l1SE@@t *+ *+'φK ?l1SE@@s *+ *+'φK. ?l1SE@@r *+ *+'φKo ?l1SE@@q *+ *+'φK  ?l1SE@@t *+ *+'φK <<?l1SE,@@C *+ *+'@UUφK> VV?l1SEH@@& *+ *+'4! 9@φKt ?l1SE@@m *+ *+'φK ?l1SE@@l *+ *+'φK ?l1SE@@k *+ *+'φKV ?l1SE@@j *+ *+'φK ?l1SE@@i *+ *+'φK ?l1SE@@h *+ *+'φK8 ?l1SE@@g *+ *+'φK ?l1SE@@f *+ *+'φKס ?l1SE @@e *+ *+' φK ?l1SE!@@d *+ *+' φK ?l1SE"@@c *+ *+' φK ?l1SE#@@b *+ *+' φK ?l1SE$@@a *+ *+' φKb ?l1SE%@@` *+ *+'φK ?l1SE&@@_ *+ *+'φK ?l1SE'@@^ *+ *+'φK; ?l1SE(@@] *+ *+'φK ?l1SE)@@\ *+ *+'φKݤ ?l1SE*@@[ *+ *+'φK ?l1SE+@@Z *+ *+'φK` ?l1SE,@@Y *+ *+'φKǥ ?l1SE-@@X *+ *+'φK ?l1SE.@@W *+ *+'φKh ?l1SE/@@V *+ *+'φK ?l1SE0@@U *+ *+'φK ?l1SE1@@T *+ *+'φKA ?l1SE2@@S *+ *+'φK ?l1SE3@@R *+ *+'φK ?l1SE4@@Q *+ *+'φK# ?l1SE5@@P *+ *+'φKk ?l1SE6@@O *+ *+'φK˨ ?l1SE7@@N *+ *+' φK ?l1SE8@@M *+ *+'!φKG ?l1SE9@@L *+ *+'"φK ?l1SE:@@K *+ *+'#φK ?l1SE;@@J *+ *+'$φKN ?l1SE<@@I *+ *+'%φK ?l1SE=@@H *+ *+'&φKͪ ?l1SE>@@G *+ *+''φK/ ?l1SE?@@F *+ *+'(φKi ?l1SE@@@E *+ *+')φK ?l1SEA@@D *+ *+'*φK ?l1SEB@@C *+ *+'+φKK ?l1SEC@@B *+ *+',φK ?l1SED@@A *+ *+'-φK ?l1SEE@@@ *+ *+'.φK3 ?l1SEF@@? *+ *+'/φK ?l1SEG@@> *+ *+'0φKέ ?l1SEH@@= *+ *+'1φK? ?l1SEI@@< *+ *+'2φKm ?l1SEJ@@; *+ *+'3φK ?l1SEK@@: *+ *+'4φK ?l1SEL@@9 *+ *+'5φKP ?l1SEM@@8 *+ *+'6φK ?l1SEN@@7 *+ *+'7φK ?l1SEO@@6 *+ *+'8φK2 ?l1SEP@@5 *+ *+'9φK ?l1SEQ@@4 *+ *+':φK԰ ?l1SER@@3 *+ *+';φK ?l1SES@@2 *+ *+'<φKz ?l1SET@@1 *+ *+'=φK ?l1SEU@@0 *+ *+'>φK ?l1SEV@@/ *+ *+'?φKU ?l1SEW@@. *+ *+'@φK ?l1SEX@@- *+ *+'AφK ?l1SEY@@, *+ *+'BφK7 ?l1SEZ@@+ *+ *+'CφK~ ?l1SE[@@* *+ *+'DφK߳ ?l1SE\@@) *+ *+'EφK ?l1SE]@@( *+ *+'FφKb ?l1SE^@@' *+ *+'GφK ?l1SE_@@& *+ *+'HφK ?l1SE`@@% *+ *+'IφKg ?l1SEa@@$ *+ *+'JφK ?l1SEb@@# *+ *+'KφKݵ ?l1SEc@@" *+ *+'LφKC ?l1SEd@@! *+ *+'MφK} ?l1SEe@@ *+ *+'NφK ?l1SEf@@ *+ *+'OφK ?l1SEg@@ *+ *+'PφK^ ?l1SEh@@ *+ *+'QφKŷ ?l1SEi@@ *+ *+'RφK ?l1SEj@@ *+ *+'SφKF ?l1SEk@@ *+ *+'TφK ?l1SEl@@ *+ *+'UφK ?l1SEm@@ *+ *+'VφKH ?l1SEn@@ *+ *+'WφK ?l1SEo@@ *+ *+'XφKع ?l1SEp@@ *+ *+'YφK) ?l1SEq@@ *+ *+'ZφKc ?l1SEr@@ *+ *+'[φK ?l1SEs@@ *+ *+'\φK ?l1SEt@@ *+ *+']φKF ?l1SEu@@ *+ *+'^φK ?l1SEv@@ *+ *+'_φK ?l1SEw@@ *+ *+'`φK) ?l1SEx@@ *+ *+'aφK ?l1SEy@@ *+ *+'bφKȼ ?l1SEz@@ *+ *+'cφK/ ?l1SE{@@ *+ *+'dφKh ?l1SE|@@ *+ *+'eφK ?l1SE}@@ *+ *+'fφK ?l1SE~@@ *+ *+'gφKI ?l1SE@@ *+ *+'hφK ?l1SE@@ *+ *+'iφK ?l1SE@@ *+ *+'jφK, ?l1SE@@ *+ *+'kφK ?l1SE@@ *+ *+'lφK̿ ?l1SE@@ *+ *+'mφK ?l1SE@@ *+ *+'nφKu ?l1SE@@ *+ *+'oφK ?l1SE@@ *+ *+'pφK ?l1SE@@ *+ *+'qφKW ?l1SE@@ *+ *+'rφK ?l1SE@@ *+ *+'sφK ?l1SE@@ *+ *+'tφK0 ?l1SE@@ *+ *+'uφKs ?l1SE@@ *+ *+'vφK ?l1SE@@ *+ *+'wφK ?l1SE@@ *+ *+'xφK[ ?l1SE@@ *+ *+'yφK ?l1SE@@ *+ *+'zφK ?l1SE@@ *+ *+'{φK\ ?l1SE@@ *+ *+'|φK ?l1SE@@ *+ *+'}φK ?l1SE@@ *+ *+'~φK> ?l1SE@@ *+ *+'φKw ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK^ ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK: ?l1SE@@ *+ *+'φKm  ?l1SE@@ *+ *+'φKy <<?l1SE,@@Ѻ *+ *+'@UUφK VV?l1SEH@@ѝ *+ *+'4!o@φKc ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK> ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+' φK ?l1SE@@ *+ *+' φKh ?l1SE@@ *+ *+' φK ?l1SE@@ *+ *+' φK ?l1SE@@ *+ *+' φKJ ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK$ ?l1SE@@ *+ *+'φKu ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φKH ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φKO ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK2 ?l1SE@@ *+ *+'φKj ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+'φKQ ?l1SE@@ *+ *+'φK ?l1SE@@ *+ *+' φK ?l1SE@@ *+ *+'!φK= ?l1SE@@ *+ *+'"φK ?l1SE@@ *+ *+'#φK ?l1SE@@ *+ *+'$φK6 ?l1SE@@ *+ *+'%φKo ?l1SE@@Ͽ *+ *+'&φK ?l1SE@@Ͼ *+ *+''φK ?l1SE@@Ͻ *+ *+'(φKP ?l1SE@@ϼ *+ *+')φK ?l1SE@@ϻ *+ *+'*φK ?l1SE@@Ϻ *+ *+'+φK3 ?l1SE@@Ϲ *+ *+',φK ?l1SE@@ϸ *+ *+'-φK ?l1SE@@Ϸ *+ *+'.φK ?l1SE@@϶ *+ *+'/φKs ?l1SE@@ϵ *+ *+'0φK ?l1SE@@ϴ *+ *+'1φK ?l1SE@@ϳ *+ *+'2φK ?l1SE@@ϲ *+ *+'3φK ?l1SE@@ϱ *+ *+'4φK ?l1SE@@ϰ *+ *+'5φK7 ?l1SE@@ϯ *+ *+'6φKw ?l1SE@@Ϯ *+ *+'7φK ?l1SE@@ϭ *+ *+'8φK ?l1SE@@Ϭ *+ *+'9φKz ?l1SE@@ϫ *+ *+':φK ?l1SE@@Ϫ *+ *+';φK ?l1SE@@ϩ *+ *+'<φKZ ?l1SE@@Ϩ *+ *+'=φK ?l1SE@@ϧ *+ *+'>φK ?l1SE@@Ϧ *+ *+'?φK< ?l1SE@@ϥ *+ *+'@φK~ ?l1SE@@Ϥ *+ *+'AφK ?l1SE@@ϣ *+ *+'BφK ?l1SE@@Ϣ *+ *+'CφK` ?l1SE@@ϡ *+ *+'DφK ?l1SE@@Ϡ *+ *+'EφK ?l1SE@@ϟ *+ *+'FφKC ?l1SE@@Ϟ *+ *+'GφK ?l1SE@@ϝ *+ *+'HφK ?l1SE@@Ϝ *+ *+'IφKA ?l1SE@@ϛ *+ *+'JφK ?l1SE@@Ϛ *+ *+'KφK ?l1SE@@ϙ *+ *+'LφK# ?l1SE@@Ϙ *+ *+'MφKd ?l1SE@@ϗ *+ *+'NφK ?l1SE@@ϖ *+ *+'OφK ?l1SE@@ϕ *+ *+'PφKG ?l1SE@@ϔ *+ *+'QφK ?l1SE@@ϓ *+ *+'RφK ?l1SE@@ϒ *+ *+'SφK( ?l1SE@@ϑ *+ *+'TφK ?l1SE@@ϐ *+ *+'UφK ?l1SE@@Ϗ *+ *+'VφKn ?l1SE@@ώ *+ *+'WφK ?l1SE@@ύ *+ *+'XφK ?l1SE@@ό *+ *+'YφK ?l1SE@@ϋ *+ *+'ZφKK ?l1SE@@ϊ *+ *+'[φK ?l1SE@@ω *+ *+'\φK ?l1SE@@ψ *+ *+']φK- ?l1SE@@χ *+ *+'^φK ?l1SE@@φ *+ *+'_φK ?l1SE@@υ *+ *+'`φK ?l1SE@@τ *+ *+'aφKm ?l1SE@@σ *+ *+'bφK ?l1SE@@ς *+ *+'cφK ?l1SE@@ρ *+ *+'dφKP ?l1SE@@π *+ *+'eφK ?l1SE@@ *+ *+'fφK ?l1SE@@~ *+ *+'gφK3 ?l1SE@@} *+ *+'hφKs ?l1SE @@| *+ *+'iφK ?l1SE @@{ *+ *+'jφK ?l1SE @@z *+ *+'kφKr ?l1SE @@y *+ *+'lφK ?l1SE @@x *+ *+'mφK ?l1SE@@w *+ *+'nφKU ?l1SE@@v *+ *+'oφK ?l1SE@@u *+ *+'pφK ?l1SE@@t *+ *+'qφK ?l1SE@@s *+ *+'rφK ?l1SE@@r *+ *+'sφK ?l1SE@@q *+ *+'tφK ?l1SE@@p *+ *+'uφK ?l1SE@@o *+ *+'vφK ?l1SE@@n *+ *+'wφK% ?l1SE@@m *+ *+'xφK= ?l1SE@@l *+ *+'yφK ?l1SE@@k *+ *+'zφK ?l1SE@@j *+ *+'{φK= ?l1SE@@i *+ *+'|φK} ?l1SE@@h *+ *+'}φK ?l1SE@@g *+ *+'~φK ?l1SE@@f *+ *+'φK^ ?l1SE @@e *+ *+'φK ?l1SE!@@d *+ *+'φK ?l1SE"@@c *+ *+'φKA ?l1SE#@@b *+ *+'φK ?l1SE$@@a *+ *+'φK ?l1SE%@@` *+ *+'φK$ ?l1SE&@@_ *+ *+'φKT  ?l1SE'@@b *+ *+'φK_ <<?l1SE,(@@1 *+ *+'@UUφKl VV?l1SEH)@@ *+ *+'4!,@φK! ?l1SE*@@[ *+ *+'φK` ?l1SE+@@Z *+ *+'φK ?l1SE,@@Y *+ *+'φK ?l1SE-@@X *+ *+'φKB ?l1SE.@@W *+ *+'φK ?l1SE/@@V *+ *+'φK ?l1SE0@@U *+ *+'φKB ?l1SE1@@T *+ *+'φK ?l1SE2@@S *+ *+' φK ?l1SE3@@R *+ *+' φK# ?l1SE4@@Q *+ *+' φKc ?l1SE5@@P *+ *+' φK ?l1SE6@@O *+ *+' φK ?l1SE7@@N *+ *+'φKF ?l1SE8@@M *+ *+'φK ?l1SE9@@L *+ *+'φK ?l1SE:@@K *+ *+'φK) ?l1SE;@@J *+ *+'φK ?l1SE<@@I *+ *+'φK ?l1SE=@@H *+ *+'φK  ?l1SE>@@G *+ *+'φKi ?l1SE?@@F *+ *+'φK ?l1SE@@@E *+ *+'φK  ?l1SEA@@D *+ *+'φKL ?l1SEB@@C *+ *+'φK ?l1SEC@@B *+ *+'φK ?l1SED@@A *+ *+'φK, ?l1SEE@@@ *+ *+'φK ?l1SEF@@? *+ *+'φK ?l1SEG@@> *+ *+'φK ?l1SEH@@= *+ *+'φKn ?l1SEI@@< *+ *+' φK ?l1SEJ@@; *+ *+'!φK ?l1SEK@@: *+ *+'"φKP ?l1SEL@@9 *+ *+'#φK ?l1SEM@@8 *+ *+'$φK ?l1SEN@@7 *+ *+'%φK0 ?l1SEO@@6 *+ *+'&φKs ?l1SEP@@5 *+ *+''φK ?l1SEQ@@4 *+ *+'(φK! ?l1SER@@3 *+ *+')φK@( ?l1SEj@@ *+ *+'AφK( ?l1SEk@@ *+ *+'BφK( ?l1SEl@@ *+ *+'CφK*) ?l1SEm@@ *+ *+'DφK|) ?l1SEn@@ *+ *+'EφK) ?l1SEo@@ *+ *+'FφK* ?l1SEp@@ *+ *+'GφK]* ?l1SEq@@ *+ *+'HφK* ?l1SEr@@ *+ *+'IφK* ?l1SEs@@ *+ *+'JφKA+ ?l1SEt@@ *+ *+'KφK+ ?l1SEu@@ *+ *+'LφK+ ?l1SEv@@ *+ *+'MφK#, ?l1SEw@@ *+ *+'NφK, ?l1SEx@@ *+ *+'OφK, ?l1SEy@@ *+ *+'PφK- ?l1SEz@@ *+ *+'QφKd- ?l1SE{@@ *+ *+'RφK- ?l1SE|@@ *+ *+'SφK- ?l1SE}@@ *+ *+'TφKF. ?l1SE~@@ *+ *+'UφK. ?l1SE@@ *+ *+'VφK. ?l1SE@@ *+ *+'WφK'/ ?l1SE@@ *+ *+'XφKi/ ?l1SE@@ *+ *+'YφK/ ?l1SE@@ *+ *+'ZφK 0 ?l1SE@@ *+ *+'[φKL0 ?l1SE@@ *+ *+'\φK0 ?l1SE@@ *+ *+']φK0 ?l1SE@@ *+ *+'^φKQ1 ?l1SE@@ *+ *+'_φK1 ?l1SE@@ *+ *+'`φK1 ?l1SE@@ *+ *+'aφK22 ?l1SE@@ *+ *+'bφKs2 ?l1SE@@ *+ *+'cφK2 ?l1SE@@ *+ *+'dφK3 ?l1SE@@ *+ *+'eφKV3 ?l1SE@@ *+ *+'fφK3 ?l1SE@@ *+ *+'gφK3 ?l1SE@@ *+ *+'hφKB4 ?l1SE@@ *+ *+'iφK4 ?l1SE@@ *+ *+'jφK4 ?l1SE@@ *+ *+'kφK05 ?l1SE@@ *+ *+'lφKq5 ?l1SE@@ *+ *+'mφK5 ?l1SE@@ *+ *+'nφK6 ?l1SE@@ *+ *+'oφKT6 ?l1SE@@ *+ *+'pφK6 ?l1SE@@ *+ *+'qφK6 ?l1SE@@ *+ *+'rφK67 ?l1SE@@ *+ *+'sφK7 ?l1SE@@ *+ *+'tφK7 ?l1SE@@ *+ *+'uφK8 ?l1SE@@ *+ *+'vφKw8 ?l1SE@@ *+ *+'wφK8 ?l1SE@@ *+ *+'xφK8 ?l1SE@@ *+ *+'yφKX9 ?l1SE@@ *+ *+'zφK9 ?l1SE@@ *+ *+'{φK9 ?l1SE@@ *+ *+'|φK;: ?l1SE@@ *+ *+'}φK~: ?l1SE@@ *+ *+'~φK: ?l1SE@@ *+ *+'φK; ?l1SE@@ *+ *+'φK|; ?l1SE@@ *+ *+'φK; ?l1SE@@ *+ *+'φK; ?l1SE@@ *+ *+'φK]< ?l1SE@@ *+ *+'φK< ?l1SE@@ *+ *+'φK< ?l1SE@@ *+ *+'φK=  ?l1SE@@ *+ *+'φK= <<?l1SE,@@Ш *+ *+'@UUφKLO VV?l1SEH@@Ћ *+ *+'4!>@φKP ?l1SE@@ *+ *+'φKCP ?l1SE@@ *+ *+'φKP ?l1SE@@ *+ *+'φKP ?l1SE@@ *+ *+'φK%Q ?l1SE@@ *+ *+'φKQ ?l1SE@@ *+ *+'φKQ ?l1SE@@ *+ *+'φK$R ?l1SE@@ *+ *+'φKfR ?l1SE@@ *+ *+' φKR ?l1SE@@ *+ *+' φKS ?l1SE@@ *+ *+' φKHS ?l1SE@@ *+ *+' φKS ?l1SE@@ *+ *+' φKS ?l1SE@@ *+ *+'φK(T ?l1SE@@ *+ *+'φKT ?l1SE@@ *+ *+'φKT ?l1SE@@ *+ *+'φKU ?l1SE@@ *+ *+'φKlU ?l1SE@@ *+ *+'φKU ?l1SE@@ο *+ *+'φKU ?l1SE@@ξ *+ *+'φKLV ?l1SE@@ν *+ *+'φKV ?l1SE@@μ *+ *+'φKV ?l1SE@@λ *+ *+'φK.W ?l1SE@@κ *+ *+'φKpW ?l1SE@@ι *+ *+'φKW ?l1SE@@θ *+ *+'φKX ?l1SE@@η *+ *+'φKoX ?l1SE@@ζ *+ *+'φKX ?l1SE@@ε *+ *+'φKX ?l1SE@@δ *+ *+'φKQY ?l1SE@@γ *+ *+' φKY ?l1SE@@β *+ *+'!φKY ?l1SE@@α *+ *+'"φK3Z ?l1SE@@ΰ *+ *+'#φKtZ ?l1SE@@ί *+ *+'$φKZ ?l1SE@@ή *+ *+'%φK[ ?l1SE@@έ *+ *+'&φKV[ ?l1SE@@ά *+ *+''φK[ ?l1SE@@Ϋ *+ *+'(φK[ ?l1SE@@Ϊ *+ *+')φK8\ ?l1SE@@Ω *+ *+'*φK\ ?l1SE@@Ψ *+ *+'+φK\ ?l1SE@@Χ *+ *+',φK8] ?l1SE@@Φ *+ *+'-φKy] ?l1SE@@Υ *+ *+'.φK] ?l1SE@@Τ *+ *+'/φK^ ?l1SE@@Σ *+ *+'0φK\^ ?l1SE@@΢ *+ *+'1φK^ ?l1SE@@Ρ *+ *+'2φK^ ?l1SE@@Π *+ *+'3φK=_ ?l1SE@@Ο *+ *+'4φK_ ?l1SE@@Ξ *+ *+'5φK_ ?l1SE@@Ν *+ *+'6φK` ?l1SE@@Μ *+ *+'7φK}` ?l1SE@@Λ *+ *+'8φK` ?l1SE@@Κ *+ *+'9φKa ?l1SE@@Ι *+ *+':φK^a ?l1SE@@Θ *+ *+';φKa ?l1SE@@Η *+ *+'<φKa ?l1SE@@Ζ *+ *+'=φKBb ?l1SE@@Ε *+ *+'>φKb ?l1SE@@Δ *+ *+'?φKb ?l1SE@@Γ *+ *+'@φK%c ?l1SE@@Β *+ *+'AφKc ?l1SE@@Α *+ *+'BφKc ?l1SE@@ΐ *+ *+'CφKd ?l1SE@@Ώ *+ *+'DφKcd ?l1SE@@Ύ *+ *+'EφKd ?l1SE@@΍ *+ *+'FφKd ?l1SE@@Ό *+ *+'GφKFe ?l1SE@@΋ *+ *+'HφKe ?l1SE@@Ί *+ *+'IφKe ?l1SE@@Ή *+ *+'JφK(f ?l1SE@@Έ *+ *+'KφKjf ?l1SE@@· *+ *+'LφKf ?l1SE@@Ά *+ *+'MφK g ?l1SE@@N *+ *+'NφKhg ?l1SE@@N *+ *+'OφKg ?l1SE@@N *+ *+'PφKg ?l1SE@@N *+ *+'QφKJh ?l1SE@@N *+ *+'RφKh ?l1SE@@N *+ *+'SφKh ?l1SE@@N *+ *+'TφK-i ?l1SE@@N *+ *+'UφKni ?l1SE@@N~ *+ *+'VφKi ?l1SE @@N} *+ *+'WφKj ?l1SE @@N| *+ *+'XφKPj ?l1SE @@N{ *+ *+'YφKj ?l1SE @@Nz *+ *+'ZφKj ?l1SE @@Ny *+ *+'[φK3k ?l1SE@@Nx *+ *+'\φKk ?l1SE@@Nw *+ *+']φKk ?l1SE@@Nv *+ *+'^φK2l ?l1SE@@Nu *+ *+'_φKsl ?l1SE@@Nt *+ *+'`φKl ?l1SE@@Ns *+ *+'aφKm ?l1SE@@Nr *+ *+'bφKUm ?l1SE@@Nq *+ *+'cφKm ?l1SE@@Np *+ *+'dφKm ?l1SE@@No *+ *+'eφK8n ?l1SE@@Nn *+ *+'fφKn ?l1SE@@Nm *+ *+'gφKn ?l1SE@@Nl *+ *+'hφKo ?l1SE@@Nk *+ *+'iφKxo ?l1SE@@Nj *+ *+'jφKo ?l1SE@@Ni *+ *+'kφKp ?l1SE@@Nh *+ *+'lφKZp ?l1SE@@Ng *+ *+'mφKp ?l1SE @@Nf *+ *+'nφKp ?l1SE!@@Ne *+ *+'oφK;q ?l1SE"@@Nd *+ *+'pφK~q ?l1SE#@@Nc *+ *+'qφKq ?l1SE$@@Nb *+ *+'rφKr ?l1SE%@@Na *+ *+'sφK{r ?l1SE&@@N` *+ *+'tφKr ?l1SE'@@N_ *+ *+'uφKs ?l1SE(@@N^ *+ *+'vφK_s ?l1SE)@@N] *+ *+'wφKs ?l1SE*@@N\ *+ *+'xφKs ?l1SE+@@N[ *+ *+'yφKAt ?l1SE,@@NZ *+ *+'zφKt ?l1SE-@@NY *+ *+'{φKt ?l1SE.@@NX *+ *+'|φK#u ?l1SE/@@NW *+ *+'}φKdu ?l1SE0@@NV *+ *+'~φKu ?l1SE1@@NU *+ *+'φKv ?l1SE2@@NT *+ *+'φKcv ?l1SE3@@NS *+ *+'φKv ?l1SE4@@NR *+ *+'φKv ?l1SE5@@NQ *+ *+'φKDw ?l1SE6@@NP *+ *+'φKw ?l1SE7@@NO *+ *+'φKw ?l1SE8@@NN *+ *+'φKw  ?l1SE9@@OQ *+ *+'φKx <<?l1SE,:@@P *+ *+'@UUφK4 VV?l1SEH;@@P *+ *+'4!W@φK ?l1SE<@@NJ *+ *+'φK, ?l1SE=@@NI *+ *+'φK ?l1SE>@@NH *+ *+'φKʋ ?l1SE?@@NG *+ *+'φK ?l1SE@@@NF *+ *+'φKk ?l1SEA@@NE *+ *+'φK ?l1SEB@@ND *+ *+'φK ?l1SEC@@NC *+ *+'φKN ?l1SED@@NB *+ *+' φK ?l1SEE@@NA *+ *+' φK ?l1SEF@@N@ *+ *+' φK0 ?l1SEG@@N? *+ *+' φKq ?l1SEH@@N> *+ *+' φKώ ?l1SEI@@N= *+ *+'φK ?l1SEJ@@N< *+ *+'φKp ?l1SEK@@N; *+ *+'φK ?l1SEL@@N: *+ *+'φK ?l1SEM@@N9 *+ *+'φKR ?l1SEN@@N8 *+ *+'φK ?l1SEO@@N7 *+ *+'φK֐ ?l1SEP@@N6 *+ *+'φK5 ?l1SEQ@@N5 *+ *+'φKu ?l1SER@@N4 *+ *+'φKՑ ?l1SES@@N3 *+ *+'φK ?l1SET@@N2 *+ *+'φKX ?l1SEU@@N1 *+ *+'φK ?l1SEV@@N0 *+ *+'φK ?l1SEW@@N/ *+ *+'φKW ?l1SEX@@N. *+ *+'φK ?l1SEY@@N- *+ *+'φKۓ ?l1SEZ@@N, *+ *+'φK8 ?l1SE[@@N+ *+ *+' φKz ?l1SE\@@N* *+ *+'!φK ?l1SE]@@N) *+ *+'"φK ?l1SE^@@N( *+ *+'#φK\ ?l1SE_@@N' *+ *+'$φK ?l1SE`@@N& *+ *+'%φK ?l1SEa@@N% *+ *+'&φK= ?l1SEb@@N$ *+ *+''φK ?l1SEc@@N# *+ *+'(φKߖ ?l1SEd@@N" *+ *+')φK! ?l1SEe@@N! *+ *+'*φK ?l1SEf@@N *+ *+'+φK ?l1SEg@@N *+ *+',φK ?l1SEh@@N *+ *+'-φKa ?l1SEi@@N *+ *+'.φK ?l1SEj@@N *+ *+'/φK ?l1SEk@@N *+ *+'0φKB ?l1SEl@@N *+ *+'1φK ?l1SEm@@N *+ *+'2φK ?l1SEn@@N *+ *+'3φK% ?l1SEo@@N *+ *+'4φK ?l1SEp@@N *+ *+'5φKŚ ?l1SEq@@N *+ *+'6φK ?l1SEr@@N *+ *+'7φKe ?l1SEs@@N *+ *+'8φK ?l1SEt@@N *+ *+'9φK ?l1SEu@@N *+ *+':φKG ?l1SEv@@N *+ *+';φK ?l1SEw@@N *+ *+'<φK ?l1SEx@@N *+ *+'=φK) ?l1SEy@@N *+ *+'>φKj ?l1SEz@@N *+ *+'?φKʝ ?l1SE{@@N *+ *+'@φK ?l1SE|@@N *+ *+'AφKj ?l1SE}@@N *+ *+'BφK ?l1SE~@@N *+ *+'CφK ?l1SE@@N *+ *+'DφKL ?l1SE@@N *+ *+'EφK ?l1SE@@N *+ *+'FφKП ?l1SE@@N *+ *+'GφK- ?l1SE@@N *+ *+'HφKp ?l1SE@@N *+ *+'IφKΠ ?l1SE@@N *+ *+'JφK ?l1SE@@N *+ *+'KφKR ?l1SE@@M *+ *+'LφK ?l1SE@@M *+ *+'MφK ?l1SE@@M *+ *+'NφKQ ?l1SE@@M *+ *+'OφK ?l1SE@@M *+ *+'PφKԢ ?l1SE@@M *+ *+'QφK3 ?l1SE@@M *+ *+'RφKt ?l1SE@@M *+ *+'SφK ?l1SE@@M *+ *+'TφK ?l1SE@@M *+ *+'UφKW ?l1SE@@M *+ *+'VφK ?l1SE@@M *+ *+'WφK ?l1SE@@M *+ *+'XφK8 ?l1SE@@M *+ *+'YφK ?l1SE@@M *+ *+'ZφKإ ?l1SE@@M *+ *+'[φK ?l1SE@@M *+ *+'\φKy ?l1SE@@M *+ *+']φK ?l1SE@@M *+ *+'^φK ?l1SE@@M *+ *+'_φK[ ?l1SE@@M *+ *+'`φK ?l1SE@@M *+ *+'aφK ?l1SE@@M *+ *+'bφK= ?l1SE@@M *+ *+'cφK ?l1SE@@M *+ *+'dφKݨ ?l1SE@@M *+ *+'eφK ?l1SE@@M *+ *+'fφK~ ?l1SE@@M *+ *+'gφK ?l1SE@@M *+ *+'hφK ?l1SE@@M *+ *+'iφK_ ?l1SE@@M *+ *+'jφK ?l1SE@@M *+ *+'kφK ?l1SE@@M *+ *+'lφKA ?l1SE@@M *+ *+'mφK ?l1SE@@M *+ *+'nφK ?l1SE@@M *+ *+'oφK# ?l1SE@@M *+ *+'pφKd ?l1SE@@M *+ *+'qφKĬ ?l1SE@@M *+ *+'rφK ?l1SE@@M *+ *+'sφKd ?l1SE@@M *+ *+'tφK ?l1SE@@M *+ *+'uφK ?l1SE@@M *+ *+'vφKF ?l1SE@@M *+ *+'wφK ?l1SE@@M *+ *+'xφKɮ ?l1SE@@M *+ *+'yφK( ?l1SE@@M *+ *+'zφKi ?l1SE@@M *+ *+'{φKȯ ?l1SE@@M *+ *+'|φK ?l1SE@@M *+ *+'}φKL ?l1SE@@M *+ *+'~φK ?l1SE@@M *+ *+'φK ?l1SE@@M *+ *+'φKJ ?l1SE@@M *+ *+'φK ?l1SE@@M *+ *+'φKα ?l1SE@@M *+ *+'φK- ?l1SE@@M *+ *+'φKm ?l1SE@@M *+ *+'φK ?l1SE@@M *+ *+'φK  ?l1SE@@N *+ *+'φK <<?l1SE,@@O *+ *+'@UUφK VV?l1SEH@@Oz *+ *+'4!@φK ?l1SE@@M *+ *+'φK ?l1SE@@M *+ *+'φKK ?l1SE@@M *+ *+'φK ?l1SE@@M *+ *+'φK ?l1SE@@M *+ *+'φK, ?l1SE@@M *+ *+'φKo ?l1SE@@M *+ *+'φK ?l1SE@@M *+ *+'φK ?l1SE@@M *+ *+' φKS ?l1SE@@M *+ *+' φK ?l1SE@@M *+ *+' φK ?l1SE@@M *+ *+' φK8 ?l1SE@@M *+ *+' φK ?l1SE@@M *+ *+'φK ?l1SE@@M *+ *+'φK7 ?l1SE@@M *+ *+'φKy ?l1SE@@M *+ *+'φK ?l1SE@@M *+ *+'φK ?l1SE@@M *+ *+'φK[ ?l1SE@@M *+ *+'φK ?l1SE@@M *+ *+'φK ?l1SE@@M *+ *+'φK= ?l1SE@@M *+ *+'φK ?l1SE@@M *+ *+'φK ?l1SE@@M *+ *+'φK ?l1SE@@M *+ *+'φK~ ?l1SE@@M *+ *+'φK ?l1SE@@M *+ *+'φK ?l1SE@@M *+ *+'φK` ?l1SE@@M *+ *+'φK ?l1SE@@M *+ *+'φK ?l1SE@@M *+ *+' φK> ?l1SE@@M *+ *+'!φK ?l1SE@@M *+ *+'"φK ?l1SE@@M *+ *+'#φK# ?l1SE@@M *+ *+'$φK ?l1SE@@M *+ *+'%φK ?l1SE@@M *+ *+'&φK ?l1SE@@M *+ *+''φKd ?l1SE@@M *+ *+'(φK ?l1SE@@M *+ *+')φK ?l1SE@@M *+ *+'*φKH ?l1SE@@M *+ *+'+φK ?l1SE@@M *+ *+',φK ?l1SE@@M *+ *+'-φK( ?l1SE@@M *+ *+'.φKj ?l1SE@@M *+ *+'/φK ?l1SE@@M *+ *+'0φK ?l1SE@@M *+ *+'1φKi ?l1SE@@M *+ *+'2φK ?l1SE@@M *+ *+'3φK ?l1SE@@M *+ *+'4φKK ?l1SE@@M *+ *+'5φK ?l1SE@@M *+ *+'6φK ?l1SE@@M *+ *+'7φK- ?l1SE@@M *+ *+'8φKn ?l1SE@@M *+ *+'9φK ?l1SE@@M *+ *+':φK ?l1SE@@M *+ *+';φKQ ?l1SE@@M *+ *+'<φK ?l1SE@@M *+ *+'=φK ?l1SE@@M *+ *+'>φK< ?l1SE@@M *+ *+'?φK ?l1SE@@M *+ *+'@φK ?l1SE@@M *+ *+'AφK, ?l1SE@@M *+ *+'BφKm ?l1SE@@M *+ *+'CφK ?l1SE@@M~ *+ *+'DφK ?l1SE @@M} *+ *+'EφKO ?l1SE @@M| *+ *+'FφK ?l1SE @@M{ *+ *+'GφK ?l1SE @@Mz *+ *+'HφK2 ?l1SE @@My *+ *+'IφK ?l1SE@@Mx *+ *+'JφK ?l1SE@@Mw *+ *+'KφK ?l1SE@@Mv *+ *+'LφKq ?l1SE@@Mu *+ *+'MφK ?l1SE@@Mt *+ *+'NφK ?l1SE@@Ms *+ *+'OφKT ?l1SE@@Mr *+ *+'PφK ?l1SE@@Mq *+ *+'QφK ?l1SE@@Mp *+ *+'RφK6 ?l1SE@@Mo *+ *+'SφKx ?l1SE@@Mn *+ *+'TφK ?l1SE@@Mm *+ *+'UφK ?l1SE@@Ml *+ *+'VφKv ?l1SE@@Mk *+ *+'WφK ?l1SE@@Mj *+ *+'XφK ?l1SE@@Mi *+ *+'YφKY ?l1SE@@Mh *+ *+'ZφK ?l1SE@@Mg *+ *+'[φK ?l1SE @@Mf *+ *+'\φK: ?l1SE!@@Me *+ *+']φK| ?l1SE"@@Md *+ *+'^φK ?l1SE#@@Mc *+ *+'_φK ?l1SE$@@Mb *+ *+'`φK^ ?l1SE%@@Ma *+ *+'aφK ?l1SE&@@M` *+ *+'bφK ?l1SE'@@M_ *+ *+'cφK] ?l1SE(@@M^ *+ *+'dφK ?l1SE)@@M] *+ *+'eφK ?l1SE*@@M\ *+ *+'fφK? ?l1SE+@@M[ *+ *+'gφK ?l1SE,@@MZ *+ *+'hφK ?l1SE-@@MY *+ *+'iφK! ?l1SE.@@MX *+ *+'jφKc ?l1SE/@@MW *+ *+'kφK ?l1SE0@@MV *+ *+'lφK ?l1SE1@@MU *+ *+'mφKD ?l1SE2@@MT *+ *+'nφK ?l1SE3@@MS *+ *+'oφK ?l1SE4@@MR *+ *+'pφK' ?l1SE5@@MQ *+ *+'qφK ?l1SE6@@MP *+ *+'rφK ?l1SE7@@MO *+ *+'sφK% ?l1SE8@@MN *+ *+'tφKg ?l1SE9@@MM *+ *+'uφK ?l1SE:@@ML *+ *+'vφK ?l1SE;@@MK *+ *+'wφKI ?l1SE<@@MJ *+ *+'xφK ?l1SE=@@MI *+ *+'yφK ?l1SE>@@MH *+ *+'zφK* ?l1SE?@@MG *+ *+'{φK ?l1SE@@@MF *+ *+'|φK ?l1SEA@@ME *+ *+'}φK ?l1SEB@@MD *+ *+'~φKl ?l1SEC@@MC *+ *+'φK ?l1SED@@MB *+ *+'φK ?l1SEE@@MA *+ *+'φKM ?l1SEF@@M@ *+ *+'φK ?l1SEG@@M? *+ *+'φK ?l1SEH@@M> *+ *+'φK/ ?l1SEI@@M= *+ *+'φKr ?l1SEJ@@M< *+ *+'φK  ?l1SEK@@N? *+ *+'φK <<?l1SE,L@@O *+ *+'@UUφKQ VV?l1SEHM@@N *+ *+'4!zP@φK ?l1SEN@@M8 *+ *+'φK ?l1SEO@@M7 *+ *+'φK6 ?l1SEP@@M6 *+ *+'φKx ?l1SEQ@@M5 *+ *+'φK ?l1SER@@M4 *+ *+'φK ?l1SES@@M3 *+ *+'φKW ?l1SET@@M2 *+ *+'φK ?l1SEU@@M1 *+ *+'φK ?l1SEV@@M0 *+ *+' φK; ?l1SEW@@M/ *+ *+' φK ?l1SEX@@M. *+ *+' φK ?l1SEY@@M- *+ *+' φK ?l1SEZ@@M, *+ *+' φK} ?l1SE[@@M+ *+ *+'φK ?l1SE\@@M* *+ *+'φK ?l1SE]@@M) *+ *+'φK_ ?l1SE^@@M( *+ *+'φK ?l1SE_@@M' *+ *+'φK ?l1SE`@@M& *+ *+'φK@ ?l1SEa@@M% *+ *+'φK ?l1SEb@@M$ *+ *+'φK ?l1SEc@@M# *+ *+'φK$ ?l1SEd@@M" *+ *+'φK ?l1SEe@@M! *+ *+'φK ?l1SEf@@M *+ *+'φK ?l1SEg@@M *+ *+'φKc ?l1SEh@@M *+ *+'φK ?l1SEi@@M *+ *+'φK ?l1SEj@@M *+ *+'φKD ?l1SEk@@M *+ *+'φK ?l1SEl@@M *+ *+'φK ?l1SEm@@M *+ *+' φK& ?l1SEn@@M *+ *+'!φKi ?l1SEo@@M *+ *+'"φK ?l1SEp@@M *+ *+'#φK ?l1SEq@@M *+ *+'$φKf ?l1SEr@@M *+ *+'%φK ?l1SEs@@M *+ *+'&φK ?l1SEt@@M *+ *+''φKJ ?l1SEu@@M *+ *+'(φK ?l1SEv@@M *+ *+')φK ?l1SEw@@M *+ *+'*φK+ ?l1SEx@@M *+ *+'+φKm ?l1SEy@@M *+ *+',φK ?l1SEz@@M *+ *+'-φK ?l1SE{@@M *+ *+'.φKO ?l1SE|@@M *+ *+'/φK ?l1SE}@@M *+ *+'0φK ?l1SE~@@M *+ *+'1φKP ?l1SE@@M *+ *+'2φK ?l1SE@@M *+ *+'3φK ?l1SE@@M *+ *+'4φK0 ?l1SE@@M *+ *+'5φKq ?l1SE@@M *+ *+'6φK ?l1SE@@M *+ *+'7φK ?l1SE@@M *+ *+'8φKU ?l1SE@@M *+ *+'9φK ?l1SE@@L *+ *+':φK ?l1SE@@L *+ *+';φK9 ?l1SE@@L *+ *+'<φK ?l1SE@@L *+ *+'=φK ?l1SE@@L *+ *+'>φK ?l1SE@@L *+ *+'?φKv ?l1SE@@L *+ *+'@φK ?l1SE@@L *+ *+'AφK ?l1SE@@L *+ *+'BφKX ?l1SE@@L *+ *+'CφK ?l1SE@@L *+ *+'DφK ?l1SE@@L *+ *+'EφK; ?l1SE@@L *+ *+'FφK} ?l1SE@@L *+ *+'GφK ?l1SE@@L *+ *+'HφK ?l1SE@@L *+ *+'IφKz ?l1SE@@L *+ *+'JφK ?l1SE@@L *+ *+'KφK ?l1SE@@L *+ *+'LφK] ?l1SE@@L *+ *+'MφK ?l1SE@@L *+ *+'NφK ?l1SE@@L *+ *+'OφK@ ?l1SE@@L *+ *+'PφK ?l1SE@@L *+ *+'QφK ?l1SE@@L *+ *+'RφK  ?l1SE@@L *+ *+'SφKb ?l1SE@@L *+ *+'TφK ?l1SE@@L *+ *+'UφK ?l1SE@@L *+ *+'VφKb ?l1SE@@L *+ *+'WφK ?l1SE@@L *+ *+'XφK ?l1SE@@L *+ *+'YφKC ?l1SE@@L *+ *+'ZφK ?l1SE@@L *+ *+'[φK ?l1SE@@L *+ *+'\φK% ?l1SE@@L *+ *+']φKg ?l1SE@@L *+ *+'^φK ?l1SE@@L *+ *+'_φK ?l1SE@@L *+ *+'`φKI ?l1SE@@L *+ *+'aφK ?l1SE@@L *+ *+'bφK ?l1SE@@L *+ *+'cφKH ?l1SE@@L *+ *+'dφK ?l1SE@@L *+ *+'eφK ?l1SE@@L *+ *+'fφK+ ?l1SE@@L *+ *+'gφKl ?l1SE@@L *+ *+'hφK ?l1SE@@L *+ *+'iφK ?l1SE@@L *+ *+'jφKM ?l1SE@@L *+ *+'kφK ?l1SE@@L *+ *+'lφK ?l1SE@@L *+ *+'mφK0! ?l1SE@@L *+ *+'nφK! ?l1SE@@L *+ *+'oφK! ?l1SE@@L *+ *+'pφK" ?l1SE@@L *+ *+'qφKp" ?l1SE@@L *+ *+'rφK" ?l1SE@@L *+ *+'sφK# ?l1SE@@L *+ *+'tφKR# ?l1SE@@L *+ *+'uφK# ?l1SE@@L *+ *+'vφK# ?l1SE@@L *+ *+'wφK3$ ?l1SE@@L *+ *+'xφKw$ ?l1SE@@L *+ *+'yφK$ ?l1SE@@L *+ *+'zφK% ?l1SE@@L *+ *+'{φKu% ?l1SE@@L *+ *+'|φK% ?l1SE@@L *+ *+'}φK% ?l1SE@@L *+ *+'~φKV& ?l1SE@@L *+ *+'φK& ?l1SE@@L *+ *+'φK& ?l1SE@@L *+ *+'φK8' ?l1SE@@L *+ *+'φK|' ?l1SE@@L *+ *+'φK' ?l1SE@@L *+ *+'φK( ?l1SE@@L *+ *+'φK\( ?l1SE@@L *+ *+'φK(  ?l1SE@@M *+ *+'φK( <<?l1SE,@@N *+ *+'@UUφK: VV?l1SEH@@Nh *+ *+'4 ! @φK\; ?l1SE@@L *+ *+' φK; ?l1SE@@L *+ *+' φK; ?l1SE@@L *+ *+' φK>< ?l1SE@@L *+ *+' φK< ?l1SE@@L *+ *+' φK< ?l1SE@@L *+ *+' φK= ?l1SE@@L *+ *+' φK}= ?l1SE@@L *+ *+' φK= ?l1SE@@L *+ *+'  φK> ?l1SE@@L *+ *+'  φK`> ?l1SE@@L *+ *+'  φK> ?l1SE@@L *+ *+'  φK> ?l1SE@@L *+ *+'  φKB? ?l1SE@@L *+ *+' φK? ?l1SE@@L *+ *+' φK? ?l1SE@@L *+ *+' φK$@ ?l1SE@@L *+ *+' φKg@ ?l1SE@@L *+ *+' φK@ ?l1SE@@L *+ *+' φKA ?l1SE@@L *+ *+' φKHA ?l1SE@@L *+ *+' φKA ?l1SE@@L *+ *+' φKA ?l1SE@@L *+ *+' φKFB ?l1SE@@L *+ *+' φKB ?l1SE@@L *+ *+' φKB ?l1SE@@L *+ *+' φK)C ?l1SE@@L *+ *+' φKjC ?l1SE@@L *+ *+' φKC ?l1SE@@L *+ *+' φK D ?l1SE@@L *+ *+' φKMD ?l1SE@@L *+ *+' φKD ?l1SE@@L *+ *+'  φKD ?l1SE@@L *+ *+' !φK.E ?l1SE@@L *+ *+' "φKE ?l1SE@@L *+ *+' #φKE ?l1SE@@L *+ *+' $φK.F ?l1SE@@L *+ *+' %φKoF ?l1SE@@L *+ *+' &φKF ?l1SE@@L *+ *+' 'φKG ?l1SE@@L *+ *+' (φKRG ?l1SE@@L *+ *+' )φKG ?l1SE@@L *+ *+' *φKG ?l1SE@@L *+ *+' +φK3H ?l1SE@@L *+ *+' ,φKH ?l1SE@@L *+ *+' -φKH ?l1SE@@L *+ *+' .φKI ?l1SE@@L *+ *+' /φKtI ?l1SE@@L *+ *+' 0φKI ?l1SE@@L *+ *+' 1φKJ ?l1SE@@L~ *+ *+' 2φKVJ ?l1SE @@L} *+ *+' 3φKJ ?l1SE @@L| *+ *+' 4φKJ ?l1SE @@L{ *+ *+' 5φKGK ?l1SE @@Lz *+ *+' 6φKK ?l1SE @@Ly *+ *+' 7φKK ?l1SE@@Lx *+ *+' 8φK L ?l1SE@@Lw *+ *+' 9φKL ?l1SE@@Lv *+ *+' :φKL ?l1SE@@Lu *+ *+' ;φKM ?l1SE@@Lt *+ *+' <φK`M ?l1SE@@Ls *+ *+' =φKM ?l1SE@@Lr *+ *+' >φKM ?l1SE@@Lq *+ *+' ?φKVN ?l1SE@@Lp *+ *+' @φK~N ?l1SE@@Lo *+ *+' AφKN ?l1SE@@Ln *+ *+' BφK"O ?l1SE@@Lm *+ *+' CφKbO ?l1SE@@Ll *+ *+' DφKO ?l1SE@@Lk *+ *+' EφKP ?l1SE@@Lj *+ *+' FφKBP ?l1SE@@Li *+ *+' GφKP ?l1SE@@Lh *+ *+' HφKP ?l1SE@@Lg *+ *+' IφK@Q ?l1SE @@Lf *+ *+' JφKQ ?l1SE!@@Le *+ *+' KφKQ ?l1SE"@@Ld *+ *+' LφK#R ?l1SE#@@Lc *+ *+' MφKdR ?l1SE$@@Lb *+ *+' NφKR ?l1SE%@@La *+ *+' OφKS ?l1SE&@@L` *+ *+' PφKGS ?l1SE'@@L_ *+ *+' QφKS ?l1SE(@@L^ *+ *+' RφKS ?l1SE)@@L] *+ *+' SφK)T ?l1SE*@@L\ *+ *+' TφKT ?l1SE+@@L[ *+ *+' UφKT ?l1SE,@@LZ *+ *+' VφK(U ?l1SE-@@LY *+ *+' WφKiU ?l1SE.@@LX *+ *+' XφKU ?l1SE/@@LW *+ *+' YφK V ?l1SE0@@LV *+ *+' ZφKJV ?l1SE1@@LU *+ *+' [φKV ?l1SE2@@LT *+ *+' \φKV ?l1SE3@@LS *+ *+' ]φK.W ?l1SE4@@LR *+ *+' ^φKW ?l1SE5@@LQ *+ *+' _φKW ?l1SE6@@LP *+ *+' `φKX ?l1SE7@@LO *+ *+' aφKoX ?l1SE8@@LN *+ *+' bφKX ?l1SE9@@LM *+ *+' cφKY ?l1SE:@@LL *+ *+' dφKPY ?l1SE;@@LK *+ *+' eφKY ?l1SE<@@LJ *+ *+' fφKY ?l1SE=@@LI *+ *+' gφK8Z ?l1SE>@@LH *+ *+' hφKzZ ?l1SE?@@LG *+ *+' iφKZ ?l1SE@@@LF *+ *+' jφK[ ?l1SEA@@LE *+ *+' kφKx[ ?l1SEB@@LD *+ *+' lφK[ ?l1SEC@@LC *+ *+' mφK[ ?l1SED@@LB *+ *+' nφK[\ ?l1SEE@@LA *+ *+' oφK\ ?l1SEF@@L@ *+ *+' pφK\ ?l1SEG@@L? *+ *+' qφK<] ?l1SEH@@L> *+ *+' rφK] ?l1SEI@@L= *+ *+' sφK] ?l1SEJ@@L< *+ *+' tφK^ ?l1SEK@@L; *+ *+' uφKe^ ?l1SEL@@L: *+ *+' vφK^ ?l1SEM@@L9 *+ *+' wφK_ ?l1SEN@@L8 *+ *+' xφKB_ ?l1SEO@@L7 *+ *+' yφK_ ?l1SEP@@L6 *+ *+' zφK_ ?l1SEQ@@L5 *+ *+' {φKA` ?l1SER@@L4 *+ *+' |φK` ?l1SES@@L3 *+ *+' }φK` ?l1SET@@L2 *+ *+' ~φK!a ?l1SEU@@L1 *+ *+' φKda ?l1SEV@@L0 *+ *+' φKa ?l1SEW@@L/ *+ *+' φKb ?l1SEX@@L. *+ *+' φKEb ?l1SEY@@L- *+ *+' φKb ?l1SEZ@@L, *+ *+' φKb ?l1SE[@@L+ *+ *+' φK#c ?l1SE\@@L* *+ *+' φKUc  ?l1SE]@@M- *+ *+' φK[c <<?l1SE,^@@M *+ *+' @UUφKu VV?l1SEH_@@M *+ *+'4!!@φKJv ?l1SE`@@L& *+ *+'!φKv ?l1SEa@@L% *+ *+'!φKv ?l1SEb@@L$ *+ *+'!φK+w ?l1SEc@@L# *+ *+'!φKlw ?l1SEd@@L" *+ *+'!φKw ?l1SEe@@L! *+ *+'!φK x ?l1SEf@@L *+ *+'!φKkx ?l1SEg@@L *+ *+'!φKx ?l1SEh@@L *+ *+'! φKx ?l1SEi@@L *+ *+'! φKLy ?l1SEj@@L *+ *+'! φKy ?l1SEk@@L *+ *+'! φKy ?l1SEl@@L *+ *+'! φK0z ?l1SEm@@L *+ *+'!φKpz ?l1SEn@@L *+ *+'!φKz ?l1SEo@@L *+ *+'!φK{ ?l1SEp@@L *+ *+'!φKS{ ?l1SEq@@L *+ *+'!φK{ ?l1SEr@@L *+ *+'!φK{ ?l1SEs@@L *+ *+'!φK;| ?l1SEt@@L *+ *+'!φK| ?l1SEu@@L *+ *+'!φK| ?l1SEv@@L *+ *+'!φK/} ?l1SEw@@L *+ *+'!φKp} ?l1SEx@@L *+ *+'!φK} ?l1SEy@@L *+ *+'!φK~ ?l1SEz@@L *+ *+'!φKR~ ?l1SE{@@L *+ *+'!φK~ ?l1SE|@@L *+ *+'!φK~ ?l1SE}@@L *+ *+'!φK; ?l1SE~@@L *+ *+'!φK ?l1SE@@L *+ *+'! φK ?l1SE@@L *+ *+'!!φK" ?l1SE@@L *+ *+'!"φK ?l1SE@@L *+ *+'!#φK ?l1SE@@L *+ *+'!$φK ?l1SE@@L *+ *+'!%φK] ?l1SE@@L *+ *+'!&φK ?l1SE@@L *+ *+'!'φK ?l1SE@@K *+ *+'!(φK? ?l1SE@@K *+ *+'!)φK ?l1SE@@K *+ *+'!*φKނ ?l1SE@@K *+ *+'!+φK* ?l1SE@@K *+ *+'!,φK ?l1SE@@K *+ *+'!-φK ?l1SE@@K *+ *+'!.φK ?l1SE@@K *+ *+'!/φKa ?l1SE@@K *+ *+'!0φK ?l1SE@@K *+ *+'!1φK ?l1SE@@K *+ *+'!2φKC ?l1SE@@K *+ *+'!3φK ?l1SE@@K *+ *+'!4φK ?l1SE@@K *+ *+'!5φK% ?l1SE@@K *+ *+'!6φKg ?l1SE@@K *+ *+'!7φKƆ ?l1SE@@K *+ *+'!8φK ?l1SE@@K *+ *+'!9φKf ?l1SE@@K *+ *+'!:φK ?l1SE@@K *+ *+'!;φK ?l1SE@@K *+ *+'!<φKI ?l1SE@@K *+ *+'!=φK ?l1SE@@K *+ *+'!>φK̈ ?l1SE@@K *+ *+'!?φK* ?l1SE@@K *+ *+'!@φKl ?l1SE@@K *+ *+'!AφKɉ ?l1SE@@K *+ *+'!BφK ?l1SE@@K *+ *+'!CφKQ ?l1SE@@K *+ *+'!DφK ?l1SE@@K *+ *+'!EφK ?l1SE@@K *+ *+'!FφK0 ?l1SE@@K *+ *+'!GφK ?l1SE@@K *+ *+'!HφKϋ ?l1SE@@K *+ *+'!IφK/ ?l1SE@@K *+ *+'!JφKp ?l1SE@@K *+ *+'!KφK ?l1SE@@K *+ *+'!LφK ?l1SE@@K *+ *+'!MφKR ?l1SE@@K *+ *+'!NφK ?l1SE@@K *+ *+'!OφK ?l1SE@@K *+ *+'!PφK4 ?l1SE@@K *+ *+'!QφK ?l1SE@@K *+ *+'!RφKՎ ?l1SE@@K *+ *+'!SφK ?l1SE@@K *+ *+'!TφKv ?l1SE@@K *+ *+'!UφK ?l1SE@@K *+ *+'!VφK ?l1SE@@K *+ *+'!WφKS ?l1SE@@K *+ *+'!XφK ?l1SE@@K *+ *+'!YφK ?l1SE@@K *+ *+'!ZφK5 ?l1SE@@K *+ *+'![φK ?l1SE@@K *+ *+'!\φKݑ ?l1SE@@K *+ *+'!]φK ?l1SE@@K *+ *+'!^φK} ?l1SE@@K *+ *+'!_φK ?l1SE@@K *+ *+'!`φK ?l1SE@@K *+ *+'!aφK^ ?l1SE@@K *+ *+'!bφK ?l1SE@@K *+ *+'!cφK ?l1SE@@K *+ *+'!dφKA ?l1SE@@K *+ *+'!eφK ?l1SE@@K *+ *+'!fφK ?l1SE@@K *+ *+'!gφK ?l1SE@@K *+ *+'!hφKb ?l1SE@@K *+ *+'!iφK ?l1SE@@K *+ *+'!jφK ?l1SE@@K *+ *+'!kφK] ?l1SE@@K *+ *+'!lφK ?l1SE@@K *+ *+'!mφK ?l1SE@@K *+ *+'!nφKI ?l1SE@@K *+ *+'!oφK ?l1SE@@K *+ *+'!pφK× ?l1SE@@K *+ *+'!qφK ?l1SE@@K *+ *+'!rφKb ?l1SE@@K *+ *+'!sφK ?l1SE@@K *+ *+'!tφK ?l1SE@@K *+ *+'!uφKE ?l1SE@@K *+ *+'!vφK ?l1SE@@K *+ *+'!wφK ?l1SE@@K *+ *+'!xφK& ?l1SE@@K *+ *+'!yφK ?l1SE@@K *+ *+'!zφKǚ ?l1SE@@K *+ *+'!{φK% ?l1SE@@K *+ *+'!|φKg ?l1SE@@K *+ *+'!}φK ?l1SE@@K *+ *+'!~φK ?l1SE@@K *+ *+'!φKH ?l1SE@@K *+ *+'!φK ?l1SE@@K *+ *+'!φK ?l1SE@@K *+ *+'!φK* ?l1SE@@K *+ *+'!φK ?l1SE@@K *+ *+'!φK˝ ?l1SE@@K *+ *+'!φK ?l1SE@@K *+ *+'!φK@  ?l1SE@@L *+ *+'!φKI <<?l1SE,@@Ms *+ *+'!@UUφKڰ VV?l1SEH@@MV *+ *+'4"!#-C@φK ?l1SE@@K *+ *+'"φKa ?l1SE@@K *+ *+'"φK ?l1SE@@K *+ *+'"φK ?l1SE@@K *+ *+'"φK> ?l1SE@@K *+ *+'"φK ?l1SE@@K *+ *+'"φKղ ?l1SE@@K *+ *+'"φK: ?l1SE@@K *+ *+'"φKv ?l1SE@@K *+ *+'" φK ?l1SE@@K *+ *+'" φK ?l1SE@@K *+ *+'" φK] ?l1SE@@K *+ *+'" φK ?l1SE@@K *+ *+'" φK ?l1SE@@K *+ *+'"φK9 ?l1SE@@K *+ *+'"φK ?l1SE@@K *+ *+'"φKص ?l1SE@@K *+ *+'"φK# ?l1SE@@K *+ *+'"φK ?l1SE@@K *+ *+'"φK ?l1SE@@K *+ *+'"φK ?l1SE@@K *+ *+'"φKc ?l1SE@@K *+ *+'"φK ?l1SE@@K *+ *+'"φK ?l1SE@@K *+ *+'"φK? ?l1SE@@K *+ *+'"φK ?l1SE@@K *+ *+'"φK ?l1SE@@K *+ *+'"φK% ?l1SE@@K *+ *+'"φK ?l1SE@@K *+ *+'"φK ?l1SE@@K *+ *+'"φK ?l1SE@@K *+ *+'"φKh ?l1SE@@K~ *+ *+'" φK ?l1SE @@K} *+ *+'"!φK ?l1SE @@K| *+ *+'""φKI ?l1SE @@K{ *+ *+'"#φK ?l1SE @@Kz *+ *+'"$φK ?l1SE @@Ky *+ *+'"%φK$ ?l1SE@@Kx *+ *+'"&φKg ?l1SE@@Kw *+ *+'"'φK˼ ?l1SE@@Kv *+ *+'"(φK ?l1SE@@Ku *+ *+'")φKJ ?l1SE@@Kt *+ *+'"*φK ?l1SE@@Ks *+ *+'"+φK ?l1SE@@Kr *+ *+'",φKI ?l1SE@@Kq *+ *+'"-φK ?l1SE@@Kp *+ *+'".φK˾ ?l1SE@@Ko *+ *+'"/φK2 ?l1SE@@Kn *+ *+'"0φKn ?l1SE@@Km *+ *+'"1φKҿ ?l1SE@@Kl *+ *+'"2φK ?l1SE@@Kk *+ *+'"3φKN ?l1SE@@Kj *+ *+'"4φK ?l1SE@@Ki *+ *+'"5φK ?l1SE@@Kh *+ *+'"6φK6 ?l1SE@@Kg *+ *+'"7φK ?l1SE @@Kf *+ *+'"8φK ?l1SE!@@Ke *+ *+'"9φK7 ?l1SE"@@Kd *+ *+'":φKr ?l1SE#@@Kc *+ *+'";φK ?l1SE$@@Kb *+ *+'"<φK ?l1SE%@@Ka *+ *+'"=φKV ?l1SE&@@K` *+ *+'">φK ?l1SE'@@K_ *+ *+'"?φK ?l1SE(@@K^ *+ *+'"@φK6 ?l1SE)@@K] *+ *+'"AφK ?l1SE*@@K\ *+ *+'"BφK ?l1SE+@@K[ *+ *+'"CφK ?l1SE,@@KZ *+ *+'"DφK} ?l1SE-@@KY *+ *+'"EφK ?l1SE.@@KX *+ *+'"FφK ?l1SE/@@KW *+ *+'"GφK` ?l1SE0@@KV *+ *+'"HφK ?l1SE1@@KU *+ *+'"IφK ?l1SE2@@KT *+ *+'"JφK; ?l1SE3@@KS *+ *+'"KφK| ?l1SE4@@KR *+ *+'"LφK ?l1SE5@@KQ *+ *+'"MφK ?l1SE6@@KP *+ *+'"NφK ?l1SE7@@KO *+ *+'"OφK ?l1SE8@@KN *+ *+'"PφK ?l1SE9@@KM *+ *+'"QφKc ?l1SE:@@KL *+ *+'"RφK ?l1SE;@@KK *+ *+'"SφK ?l1SE<@@KJ *+ *+'"TφKG ?l1SE=@@KI *+ *+'"UφK ?l1SE>@@KH *+ *+'"VφK ?l1SE?@@KG *+ *+'"WφK" ?l1SE@@@KF *+ *+'"XφKb ?l1SEA@@KE *+ *+'"YφK ?l1SEB@@KD *+ *+'"ZφK ?l1SEC@@KC *+ *+'"[φKG ?l1SED@@KB *+ *+'"\φK ?l1SEE@@KA *+ *+'"]φK ?l1SEF@@K@ *+ *+'"^φKK ?l1SEG@@K? *+ *+'"_φK ?l1SEH@@K> *+ *+'"`φK ?l1SEI@@K= *+ *+'"aφK& ?l1SEJ@@K< *+ *+'"bφKe ?l1SEK@@K; *+ *+'"cφK ?l1SEL@@K: *+ *+'"dφK ?l1SEM@@K9 *+ *+'"eφKJ ?l1SEN@@K8 *+ *+'"fφK ?l1SEO@@K7 *+ *+'"gφK ?l1SEP@@K6 *+ *+'"hφK* ?l1SEQ@@K5 *+ *+'"iφK ?l1SER@@K4 *+ *+'"jφK ?l1SES@@K3 *+ *+'"kφK1 ?l1SET@@K2 *+ *+'"lφKl ?l1SEU@@K1 *+ *+'"mφK ?l1SEV@@K0 *+ *+'"nφK ?l1SEW@@K/ *+ *+'"oφKN ?l1SEX@@K. *+ *+'"pφK ?l1SEY@@K- *+ *+'"qφK ?l1SEZ@@K, *+ *+'"rφK0 ?l1SE[@@K+ *+ *+'"sφK ?l1SE\@@K* *+ *+'"tφK ?l1SE]@@K) *+ *+'"uφK ?l1SE^@@K( *+ *+'"vφKx ?l1SE_@@K' *+ *+'"wφK ?l1SE`@@K& *+ *+'"xφK ?l1SEa@@K% *+ *+'"yφKZ ?l1SEb@@K$ *+ *+'"zφK ?l1SEc@@K# *+ *+'"{φK ?l1SEd@@K" *+ *+'"|φK4 ?l1SEe@@K! *+ *+'"}φKu ?l1SEf@@K *+ *+'"~φK ?l1SEg@@K *+ *+'"φK ?l1SEh@@K *+ *+'"φKu ?l1SEi@@K *+ *+'"φK ?l1SEj@@K *+ *+'"φK ?l1SEk@@K *+ *+'"φK^ ?l1SEl@@K *+ *+'"φK ?l1SEm@@K *+ *+'"φK ?l1SEn@@K *+ *+'"φK  ?l1SEo@@L *+ *+'"φK <<?l1SE,p@@L *+ *+'"@UUφKL VV?l1SEHq@@L *+ *+'4#!/y@φK ?l1SEr@@K *+ *+'#φK= ?l1SEs@@K *+ *+'#φK ?l1SEt@@K *+ *+'#φK ?l1SEu@@K *+ *+'#φK ?l1SEv@@K *+ *+'#φK ?l1SEw@@K *+ *+'#φK ?l1SEx@@K *+ *+'#φK$ ?l1SEy@@K *+ *+'#φK^ ?l1SEz@@K *+ *+'# φK ?l1SE{@@K *+ *+'# φK ?l1SE|@@K *+ *+'# φKA ?l1SE}@@K *+ *+'# φK ?l1SE~@@K *+ *+'# φK ?l1SE@@K *+ *+'#φK# ?l1SE@@K *+ *+'#φK ?l1SE@@K *+ *+'#φK ?l1SE@@K *+ *+'#φK ?l1SE@@K *+ *+'#φKk ?l1SE@@K *+ *+'#φK ?l1SE@@K *+ *+'#φK ?l1SE@@K *+ *+'#φKN ?l1SE@@J *+ *+'#φK ?l1SE@@J *+ *+'#φK ?l1SE@@J *+ *+'#φK' ?l1SE@@J *+ *+'#φKm ?l1SE@@J *+ *+'#φK ?l1SE@@J *+ *+'#φK ?l1SE@@J *+ *+'#φKo ?l1SE@@J *+ *+'#φK ?l1SE@@J *+ *+'#φK ?l1SE@@J *+ *+'#φKQ ?l1SE@@J *+ *+'# φK ?l1SE@@J *+ *+'#!φK ?l1SE@@J *+ *+'#"φK3 ?l1SE@@J *+ *+'##φKm ?l1SE@@J *+ *+'#$φK ?l1SE@@J *+ *+'#%φK ?l1SE@@J *+ *+'#&φKO ?l1SE@@J *+ *+'#'φK ?l1SE@@J *+ *+'#(φK ?l1SE@@J *+ *+'#)φK1 ?l1SE@@J *+ *+'#*φK ?l1SE@@J *+ *+'#+φK ?l1SE@@J *+ *+'#,φK9 ?l1SE@@J *+ *+'#-φKs ?l1SE@@J *+ *+'#.φK ?l1SE@@J *+ *+'#/φK ?l1SE@@J *+ *+'#0φKT ?l1SE@@J *+ *+'#1φK ?l1SE@@J *+ *+'#2φK ?l1SE@@J *+ *+'#3φK6 ?l1SE@@J *+ *+'#4φK ?l1SE@@J *+ *+'#5φK ?l1SE@@J *+ *+'#6φK ?l1SE@@J *+ *+'#7φK ?l1SE@@J *+ *+'#8φK ?l1SE@@J *+ *+'#9φK ?l1SE@@J *+ *+'#:φKZ ?l1SE@@J *+ *+'#;φK ?l1SE@@J *+ *+'#<φK ?l1SE@@J *+ *+'#=φK; ?l1SE@@J *+ *+'#>φK} ?l1SE@@J *+ *+'#?φK ?l1SE@@J *+ *+'#@φK ?l1SE@@J *+ *+'#AφK ?l1SE@@J *+ *+'#BφK ?l1SE@@J *+ *+'#CφK ?l1SE@@J *+ *+'#DφKf?l1SE@@J *+ *+'#EφK?l1SE@@J *+ *+'#FφK?l1SE@@J *+ *+'#GφKG?l1SE@@J *+ *+'#HφK?l1SE@@J *+ *+'#IφK?l1SE@@J *+ *+'#JφK!?l1SE@@J *+ *+'#KφKc?l1SE@@J *+ *+'#LφK?l1SE@@J *+ *+'#MφK?l1SE@@J *+ *+'#NφKj?l1SE@@J *+ *+'#OφK?l1SE@@J *+ *+'#PφK?l1SE@@J *+ *+'#QφKK?l1SE@@J *+ *+'#RφK?l1SE@@J *+ *+'#SφK?l1SE@@J *+ *+'#TφK.?l1SE@@J *+ *+'#UφKi?l1SE@@J *+ *+'#VφK?l1SE@@J *+ *+'#WφK?l1SE@@J *+ *+'#XφKI?l1SE@@J *+ *+'#YφK?l1SE@@J *+ *+'#ZφK?l1SE@@J *+ *+'#[φK+?l1SE@@J *+ *+'#\φK?l1SE@@J *+ *+'#]φK?l1SE@@J *+ *+'#^φK1?l1SE@@J *+ *+'#_φKk?l1SE@@J *+ *+'#`φK?l1SE@@J *+ *+'#aφK ?l1SE@@J *+ *+'#bφKP ?l1SE@@J *+ *+'#cφK ?l1SE@@J *+ *+'#dφK ?l1SE@@J *+ *+'#eφK5 ?l1SE@@J *+ *+'#fφK ?l1SE@@J *+ *+'#gφK ?l1SE@@J *+ *+'#hφK ?l1SE@@J *+ *+'#iφKx ?l1SE@@J *+ *+'#jφK ?l1SE@@J *+ *+'#kφK ?l1SE@@J *+ *+'#lφKR ?l1SE@@J *+ *+'#mφK ?l1SE@@J *+ *+'#nφK ?l1SE@@J *+ *+'#oφK5 ?l1SE@@J *+ *+'#pφKu ?l1SE@@J *+ *+'#qφK ?l1SE@@J *+ *+'#rφK?l1SE@@J *+ *+'#sφK}?l1SE@@J *+ *+'#tφK?l1SE@@J *+ *+'#uφK?l1SE@@J *+ *+'#vφK`?l1SE@@J *+ *+'#wφK?l1SE@@J *+ *+'#xφK?l1SE@@J *+ *+'#yφK;?l1SE@@J *+ *+'#zφKz?l1SE@@J *+ *+'#{φK?l1SE@@J *+ *+'#|φK?l1SE@@J *+ *+'#}φK^?l1SE@@J *+ *+'#~φK?l1SE@@J *+ *+'#φK?l1SE@@J *+ *+'#φKc?l1SE@@J *+ *+'#φK?l1SE@@J *+ *+'#φK?l1SE@@J *+ *+'#φKF?l1SE@@J *+ *+'#φK?l1SE@@J *+ *+'#φK?l1SE@@J *+ *+'#φK  ?l1SE@@K *+ *+'#φK<<?l1SE,@@La *+ *+'#@UUφK&VV?l1SEH@@LD *+ *+'4$!φKB9?l1SE9@@JM *+ *+'$?φK9?l1SE:@@JL *+ *+'$@φK9?l1SE;@@JK *+ *+'$AφKI:?l1SE<@@JJ *+ *+'$BφK:?l1SE=@@JI *+ *+'$CφK:?l1SE>@@JH *+ *+'$DφK,;?l1SE?@@JG *+ *+'$EφKg;?l1SE@@@JF *+ *+'$FφK;?l1SEA@@JE *+ *+'$GφK<?l1SEB@@JD *+ *+'$HφKF<?l1SEC@@JC *+ *+'$IφK<?l1SED@@JB *+ *+'$JφK<?l1SEE@@JA *+ *+'$KφK(=?l1SEF@@J@ *+ *+'$LφK=?l1SEG@@J? *+ *+'$MφK=?l1SEH@@J> *+ *+'$NφK(>?l1SEI@@J= *+ *+'$OφKh>?l1SEJ@@J< *+ *+'$PφK>?l1SEK@@J; *+ *+'$QφK??l1SEL@@J: *+ *+'$RφKM??l1SEM@@J9 *+ *+'$SφK??l1SEN@@J8 *+ *+'$TφK??l1SEO@@J7 *+ *+'$UφK.@?l1SEP@@J6 *+ *+'$VφK@?l1SEQ@@J5 *+ *+'$WφK@?l1SER@@J4 *+ *+'$XφKA?l1SES@@J3 *+ *+'$YφKvA?l1SET@@J2 *+ *+'$ZφKA?l1SEU@@J1 *+ *+'$[φKA?l1SEV@@J0 *+ *+'$\φKWB?l1SEW@@J/ *+ *+'$]φKB?l1SEX@@J. *+ *+'$^φKB?l1SEY@@J- *+ *+'$_φK3C?l1SEZ@@J, *+ *+'$`φKsC?l1SE[@@J+ *+ *+'$aφKC?l1SE\@@J* *+ *+'$bφKD?l1SE]@@J) *+ *+'$cφKsD?l1SE^@@J( *+ *+'$dφKD?l1SE_@@J' *+ *+'$eφKD?l1SE`@@J& *+ *+'$fφK]E?l1SEa@@J% *+ *+'$gφKE?l1SEb@@J$ *+ *+'$hφKE?l1SEc@@J# *+ *+'$iφK>F?l1SEd@@J" *+ *+'$jφKyF?l1SEe@@J! *+ *+'$kφKF?l1SEf@@J *+ *+'$lφKG?l1SEg@@J *+ *+'$mφK_G?l1SEh@@J *+ *+'$nφKG?l1SEi@@J *+ *+'$oφKG?l1SEj@@J *+ *+'$pφKφK)t?l1SE@@I *+ *+'%?φKt?l1SE@@I *+ *+'%@φKt?l1SE@@I *+ *+'%AφK1u?l1SE@@I *+ *+'%BφKku?l1SE@@I *+ *+'%CφKu?l1SE@@I *+ *+'%DφKv?l1SE@@I *+ *+'%EφKLv?l1SE@@I *+ *+'%FφKv?l1SE@@I *+ *+'%GφKv?l1SE@@I *+ *+'%HφK/w?l1SE@@I *+ *+'%IφKw?l1SE@@I *+ *+'%JφKw?l1SE@@I *+ *+'%KφKx?l1SE@@I *+ *+'%LφKwx?l1SE@@I *+ *+'%MφKx?l1SE@@I *+ *+'%NφKy?l1SE@@I *+ *+'%OφKPy?l1SE@@I *+ *+'%PφKy?l1SE@@I *+ *+'%QφKy?l1SE@@I *+ *+'%RφK2z?l1SE@@I *+ *+'%SφKtz?l1SE@@I *+ *+'%TφKz?l1SE@@I *+ *+'%UφK{?l1SE@@I *+ *+'%VφKt{?l1SE@@I *+ *+'%WφK{?l1SE@@I *+ *+'%XφK{?l1SE@@I *+ *+'%YφKW|?l1SE@@I *+ *+'%ZφK|?l1SE@@I *+ *+'%[φK|?l1SE@@I *+ *+'%\φK6}?l1SE@@I *+ *+'%]φKy}?l1SE@@I *+ *+'%^φK}?l1SE@@I *+ *+'%_φK~?l1SE@@I *+ *+'%`φKZ~?l1SE@@I *+ *+'%aφK~?l1SE@@I *+ *+'%bφK~?l1SE@@I *+ *+'%cφKb?l1SE@@I *+ *+'%dφK?l1SE@@I *+ *+'%eφK?l1SE@@I *+ *+'%fφKF?l1SE@@I *+ *+'%gφK}?l1SE@@I *+ *+'%hφK?l1SE@@I *+ *+'%iφK&?l1SE@@I *+ *+'%jφKa?l1SE@@I *+ *+'%kφKǁ?l1SE@@I *+ *+'%lφK?l1SE@@I *+ *+'%mφKA?l1SE@@I *+ *+'%nφK?l1SE@@I *+ *+'%oφK?l1SE@@I *+ *+'%pφK$?l1SE@@I *+ *+'%qφK?l1SE@@I *+ *+'%rφKă?l1SE@@I *+ *+'%sφK*?l1SE@@I *+ *+'%tφKd?l1SE@@I *+ *+'%uφK?l1SE@@I *+ *+'%vφK ?l1SE@@I *+ *+'%wφKH?l1SE@@I *+ *+'%xφK?l1SE@@I *+ *+'%yφK?l1SE@@I *+ *+'%zφK)?l1SE@@I *+ *+'%{φK?l1SE@@I *+ *+'%|φKdž?l1SE@@I *+ *+'%}φK?l1SE@@I *+ *+'%~φKp?l1SE@@I *+ *+'%φK?l1SE@@I *+ *+'%φK?l1SE@@I *+ *+'%φKK?l1SE@@I *+ *+'%φK?l1SE@@I *+ *+'%φK?l1SE@@I *+ *+'%φK=?l1SE@@I~ *+ *+'%φKm?l1SE @@I} *+ *+'%φK  ?l1SE @@J *+ *+'%φK<<?l1SE, @@KO *+ *+'%@UUφKVV?l1SEH @@K2 *+ *+'4&!Uu@φKw?l1SE @@Iy *+ *+'&φK?l1SE@@Ix *+ *+'&φK?l1SE@@Iw *+ *+'&φKR?l1SE@@Iv *+ *+'&φK?l1SE@@Iu *+ *+'&φK?l1SE@@It *+ *+'&φK3?l1SE@@Is *+ *+'&φK?l1SE@@Ir *+ *+'&φKԞ?l1SE@@Iq *+ *+'& φK?l1SE@@Ip *+ *+'& φK{?l1SE@@Io *+ *+'& φK?l1SE@@In *+ *+'& φK?l1SE@@Im *+ *+'& φK^?l1SE@@Il *+ *+'&φK?l1SE@@Ik *+ *+'&φK?l1SE@@Ij *+ *+'&φK8?l1SE@@Ii *+ *+'&φKz?l1SE@@Ih *+ *+'&φKߡ?l1SE@@Ig *+ *+'&φK?l1SE @@If *+ *+'&φK[?l1SE!@@Ie *+ *+'&φK¢?l1SE"@@Id *+ *+'&φK?l1SE#@@Ic *+ *+'&φKc?l1SE$@@Ib *+ *+'&φK?l1SE%@@Ia *+ *+'&φKޣ?l1SE&@@I` *+ *+'&φK>?l1SE'@@I_ *+ *+'&φK~?l1SE(@@I^ *+ *+'&φK?l1SE)@@I] *+ *+'&φK?l1SE*@@I\ *+ *+'&φK`?l1SE+@@I[ *+ *+'&φKť?l1SE,@@IZ *+ *+'& φK?l1SE-@@IY *+ *+'&!φKB?l1SE.@@IX *+ *+'&"φK?l1SE/@@IW *+ *+'&#φK?l1SE0@@IV *+ *+'&$φKI?l1SE1@@IU *+ *+'&%φK?l1SE2@@IT *+ *+'&&φKç?l1SE3@@IS *+ *+'&'φK*?l1SE4@@IR *+ *+'&(φKr?l1SE5@@IQ *+ *+'&)φK?l1SE6@@IP *+ *+'&*φK?l1SE7@@IO *+ *+'&+φKF?l1SE8@@IN *+ *+'&,φK?l1SE9@@IM *+ *+'&-φK?l1SE:@@IL *+ *+'&.φK(?l1SE;@@IK *+ *+'&/φK?l1SE<@@IJ *+ *+'&0φKɪ?l1SE=@@II *+ *+'&1φK(?l1SE>@@IH *+ *+'&2φKh?l1SE?@@IG *+ *+'&3φK?l1SE@@@IF *+ *+'&4φK?l1SEA@@IE *+ *+'&5φKK?l1SEB@@ID *+ *+'&6φK?l1SEC@@IC *+ *+'&7φK?l1SED@@IB *+ *+'&8φK.?l1SEE@@IA *+ *+'&9φK?l1SEF@@I@ *+ *+'&:φKϭ?l1SEG@@I? *+ *+'&;φK?l1SEH@@I> *+ *+'&<φKv?l1SEI@@I= *+ *+'&=φK?l1SEJ@@I< *+ *+'&>φK?l1SEK@@I; *+ *+'&?φKV?l1SEL@@I: *+ *+'&@φK?l1SEM@@I9 *+ *+'&AφK?l1SEN@@I8 *+ *+'&BφK2?l1SEO@@I7 *+ *+'&CφKx?l1SEP@@I6 *+ *+'&DφKڰ?l1SEQ@@I5 *+ *+'&EφK?l1SER@@I4 *+ *+'&FφKU?l1SES@@I3 *+ *+'&GφK?l1SET@@I2 *+ *+'&HφK?l1SEU@@I1 *+ *+'&IφKT?l1SEV@@I0 *+ *+'&JφK?l1SEW@@I/ *+ *+'&KφK߲?l1SEX@@I. *+ *+'&LφK??l1SEY@@I- *+ *+'&MφKy?l1SEZ@@I, *+ *+'&NφK߳?l1SE[@@I+ *+ *+'&OφK?l1SE\@@I* *+ *+'&PφKZ?l1SE]@@I) *+ *+'&QφK?l1SE^@@I( *+ *+'&RφK?l1SE_@@I' *+ *+'&SφK<?l1SE`@@I& *+ *+'&TφK?l1SEa@@I% *+ *+'&UφKܵ?l1SEb@@I$ *+ *+'&VφKB?l1SEc@@I# *+ *+'&WφK|?l1SEd@@I" *+ *+'&XφK?l1SEe@@I! *+ *+'&YφK%?l1SEf@@I *+ *+'&ZφK`?l1SEg@@I *+ *+'&[φK?l1SEh@@I *+ *+'&\φK?l1SEi@@I *+ *+'&]φK@?l1SEj@@I *+ *+'&^φK?l1SEk@@I *+ *+'&_φK?l1SEl@@I *+ *+'&`φK$?l1SEm@@I *+ *+'&aφK?l1SEn@@I *+ *+'&bφKĹ?l1SEo@@I *+ *+'&cφK)?l1SEp@@I *+ *+'&dφKc?l1SEq@@I *+ *+'&eφK?l1SEr@@I *+ *+'&fφK ?l1SEs@@I *+ *+'&gφKE?l1SEt@@I *+ *+'&hφK?l1SEu@@I *+ *+'&iφK?l1SEv@@I *+ *+'&jφK'?l1SEw@@I *+ *+'&kφK?l1SEx@@I *+ *+'&lφKǼ?l1SEy@@I *+ *+'&mφK ?l1SEz@@I *+ *+'&nφKp?l1SE{@@I *+ *+'&oφK?l1SE|@@I *+ *+'&pφK?l1SE}@@I *+ *+'&qφKQ?l1SE~@@I *+ *+'&rφK?l1SE@@I *+ *+'&sφK?l1SE@@I *+ *+'&tφK-?l1SE@@I *+ *+'&uφKn?l1SE@@I *+ *+'&vφKٿ?l1SE@@I *+ *+'&wφK?l1SE@@I *+ *+'&xφKO?l1SE@@I *+ *+'&yφK?l1SE@@I *+ *+'&zφK?l1SE@@H *+ *+'&{φKU?l1SE@@H *+ *+'&|φK?l1SE@@H *+ *+'&}φK?l1SE@@H *+ *+'&~φK8?l1SE@@H *+ *+'&φKs?l1SE@@H *+ *+'&φK?l1SE@@H *+ *+'&φK?l1SE@@H *+ *+'&φKT?l1SE@@H *+ *+'&φK?l1SE@@H *+ *+'&φK?l1SE@@H *+ *+'&φK6?l1SE@@H *+ *+'&φKg  ?l1SE@@I *+ *+'&φKs<<?l1SE,@@J *+ *+'&@UUφKVV?l1SEH@@J *+ *+'4'!b @φKf?l1SE@@H *+ *+''φK?l1SE@@H *+ *+''φK?l1SE@@H *+ *+''φK8?l1SE@@H *+ *+''φKz?l1SE@@H *+ *+''φK?l1SE@@H *+ *+''φK?l1SE@@H *+ *+''φK?l1SE@@H *+ *+''φK?l1SE@@H *+ *+'' φK?l1SE@@H *+ *+'' φKb?l1SE@@H *+ *+'' φK?l1SE@@H *+ *+'' φK?l1SE@@H *+ *+'' φKE?l1SE@@H *+ *+''φK?l1SE@@H *+ *+''φK?l1SE@@H *+ *+''φK ?l1SE@@H *+ *+''φK`?l1SE@@H *+ *+''φK?l1SE@@H *+ *+''φK?l1SE@@H *+ *+''φKD?l1SE@@H *+ *+''φK?l1SE@@H *+ *+''φK?l1SE@@H *+ *+''φKI?l1SE@@H *+ *+''φK?l1SE@@H *+ *+''φK?l1SE@@H *+ *+''φK+?l1SE@@H *+ *+''φKf?l1SE@@H *+ *+''φK?l1SE@@H *+ *+''φK?l1SE@@H *+ *+''φKK?l1SE@@H *+ *+''φK?l1SE@@H *+ *+'' φK?l1SE@@H *+ *+''!φK*?l1SE@@H *+ *+''"φK?l1SE@@H *+ *+''#φK?l1SE@@H *+ *+''$φK)?l1SE@@H *+ *+''%φKj?l1SE@@H *+ *+''&φK?l1SE@@H *+ *+'''φK?l1SE@@H *+ *+''(φKL?l1SE@@H *+ *+'')φK?l1SE@@H *+ *+''*φK?l1SE@@H *+ *+''+φK.?l1SE@@H *+ *+'',φK?l1SE@@H *+ *+''-φK?l1SE@@H *+ *+''.φK?l1SE@@H *+ *+''/φKw?l1SE@@H *+ *+''0φK?l1SE@@H *+ *+''1φK?l1SE@@H *+ *+''2φKQ?l1SE@@H *+ *+''3φK?l1SE@@H *+ *+''4φK?l1SE@@H *+ *+''5φK1?l1SE@@H *+ *+''6φK|?l1SE@@H *+ *+''7φK?l1SE@@H *+ *+''8φK?l1SE@@H *+ *+''9φKz?l1SE@@H *+ *+'':φK?l1SE@@H *+ *+'';φK?l1SE@@H *+ *+''<φK]?l1SE@@H *+ *+''=φK?l1SE@@H *+ *+''>φK?l1SE@@H *+ *+''?φK>?l1SE@@H *+ *+''@φKx?l1SE@@H *+ *+''AφK?l1SE@@H *+ *+''BφK?l1SE@@H *+ *+''CφK[?l1SE@@H *+ *+''DφK?l1SE@@H *+ *+''EφK?l1SE@@H *+ *+''FφK=?l1SE@@H *+ *+''GφK?l1SE@@H *+ *+''HφK?l1SE@@H *+ *+''IφK<?l1SE@@H *+ *+''JφK}?l1SE@@H *+ *+''KφK?l1SE@@H *+ *+''LφK%?l1SE@@H *+ *+''MφK`?l1SE@@H *+ *+''NφK?l1SE@@H *+ *+''OφK?l1SE@@H *+ *+''PφKB?l1SE@@H *+ *+''QφK?l1SE@@H *+ *+''RφK?l1SE@@H *+ *+''SφK"?l1SE@@H *+ *+''TφK?l1SE@@H *+ *+''UφK?l1SE@@H *+ *+''VφK*?l1SE@@H *+ *+''WφKd?l1SE@@H *+ *+''XφK?l1SE@@H *+ *+''YφK ?l1SE@@H *+ *+''ZφKH?l1SE@@H *+ *+''[φK?l1SE@@H *+ *+''\φK?l1SE@@H *+ *+'']φK)?l1SE@@H *+ *+''^φK?l1SE@@H *+ *+''_φK?l1SE@@H *+ *+''`φK ?l1SE@@H *+ *+''aφKp?l1SE@@H *+ *+''bφK?l1SE@@H *+ *+''cφK?l1SE@@H *+ *+''dφKJ?l1SE@@H *+ *+''eφK?l1SE@@H *+ *+''fφK?l1SE@@H *+ *+''gφK-?l1SE@@H *+ *+''hφKo?l1SE@@H *+ *+''iφK?l1SE@@H *+ *+''jφK?l1SE@@H *+ *+''kφKu?l1SE@@H *+ *+''lφK?l1SE@@H *+ *+''mφK?l1SE@@H *+ *+''nφKV?l1SE@@H *+ *+''oφK?l1SE@@H *+ *+''pφK?l1SE@@H *+ *+''qφK9?l1SE@@H *+ *+''rφKt?l1SE@@H~ *+ *+''sφK?l1SE @@H} *+ *+''tφK?l1SE @@H| *+ *+''uφKT?l1SE @@H{ *+ *+''vφK?l1SE @@Hz *+ *+''wφK?l1SE @@Hy *+ *+''xφK7?l1SE@@Hx *+ *+''yφK?l1SE@@Hw *+ *+''zφK?l1SE@@Hv *+ *+''{φK>?l1SE@@Hu *+ *+''|φKy?l1SE@@Ht *+ *+''}φK?l1SE@@Hs *+ *+''~φK?l1SE@@Hr *+ *+''φKX?l1SE@@Hq *+ *+''φK?l1SE@@Hp *+ *+''φK?l1SE@@Ho *+ *+''φK;?l1SE@@Hn *+ *+''φK?l1SE@@Hm *+ *+''φK?l1SE@@Hl *+ *+''φK?l1SE@@Hk *+ *+''φKO  ?l1SE@@In *+ *+''φK[<<?l1SE,@@J= *+ *+''@UUφKVV?l1SEH@@J *+ *+'4(!nh@φKF?l1SE@@Hg *+ *+'(φK?l1SE @@Hf *+ *+'(φK?l1SE!@@He *+ *+'(φK!?l1SE"@@Hd *+ *+'(φKb?l1SE#@@Hc *+ *+'(φK?l1SE$@@Hb *+ *+'(φK?l1SE%@@Ha *+ *+'(φKa?l1SE&@@H` *+ *+'(φK?l1SE'@@H_ *+ *+'( φK?l1SE(@@H^ *+ *+'( φKJ?l1SE)@@H] *+ *+'( φK?l1SE*@@H\ *+ *+'( φK?l1SE+@@H[ *+ *+'( φK)?l1SE,@@HZ *+ *+'(φKf?l1SE-@@HY *+ *+'(φK?l1SE.@@HX *+ *+'(φK?l1SE/@@HW *+ *+'(φKH?l1SE0@@HV *+ *+'(φK?l1SE1@@HU *+ *+'(φK?l1SE2@@HT *+ *+'(φK+?l1SE3@@HS *+ *+'(φK?l1SE4@@HR *+ *+'(φK?l1SE5@@HQ *+ *+'(φK1?l1SE6@@HP *+ *+'(φKk?l1SE7@@HO *+ *+'(φK?l1SE8@@HN *+ *+'(φK?l1SE9@@HM *+ *+'(φKM?l1SE:@@HL *+ *+'(φK?l1SE;@@HK *+ *+'(φK?l1SE<@@HJ *+ *+'(φK/?l1SE=@@HI *+ *+'(φK?l1SE>@@HH *+ *+'( φK?l1SE?@@HG *+ *+'(!φK?l1SE@@@HF *+ *+'("φKw?l1SEA@@HE *+ *+'(#φK?l1SEB@@HD *+ *+'($φK?l1SEC@@HC *+ *+'(%φKR?l1SED@@HB *+ *+'(&φK?l1SEE@@HA *+ *+'('φK?l1SEF@@H@ *+ *+'((φK4?l1SEG@@H? *+ *+'()φKt?l1SEH@@H> *+ *+'(*φK?l1SEI@@H= *+ *+'(+φK?l1SEJ@@H< *+ *+'(,φKu?l1SEK@@H; *+ *+'(-φK?l1SEL@@H: *+ *+'(.φK ?l1SEM@@H9 *+ *+'(/φK\ ?l1SEN@@H8 *+ *+'(0φK ?l1SEO@@H7 *+ *+'(1φK ?l1SEP@@H6 *+ *+'(2φK7!?l1SEQ@@H5 *+ *+'(3φKz!?l1SER@@H4 *+ *+'(4φK!?l1SES@@H3 *+ *+'(5φK"?l1SET@@H2 *+ *+'(6φK\"?l1SEU@@H1 *+ *+'(7φK"?l1SEV@@H0 *+ *+'(8φK"?l1SEW@@H/ *+ *+'(9φKc#?l1SEX@@H. *+ *+'(:φK#?l1SEY@@H- *+ *+'(;φK#?l1SEZ@@H, *+ *+'(<φKO$?l1SE[@@H+ *+ *+'(=φK~$?l1SE\@@H* *+ *+'(>φK$?l1SE]@@H) *+ *+'(?φK'%?l1SE^@@H( *+ *+'(@φKb%?l1SE_@@H' *+ *+'(AφK%?l1SE`@@H& *+ *+'(BφK&?l1SEa@@H% *+ *+'(CφKC&?l1SEb@@H$ *+ *+'(DφK&?l1SEc@@H# *+ *+'(EφK&?l1SEd@@H" *+ *+'(FφK%'?l1SEe@@H! *+ *+'(GφK'?l1SEf@@H *+ *+'(HφK'?l1SEg@@H *+ *+'(IφK+(?l1SEh@@H *+ *+'(JφKd(?l1SEi@@H *+ *+'(KφK(?l1SEj@@H *+ *+'(LφK )?l1SEk@@H *+ *+'(MφKG)?l1SEl@@H *+ *+'(NφK)?l1SEm@@H *+ *+'(OφK)?l1SEn@@H *+ *+'(PφK)*?l1SEo@@H *+ *+'(QφK*?l1SEp@@H *+ *+'(RφK*?l1SEq@@H *+ *+'(SφK +?l1SEr@@H *+ *+'(TφKt+?l1SEs@@H *+ *+'(UφK+?l1SEt@@H *+ *+'(VφK,?l1SEu@@H *+ *+'(WφKL,?l1SEv@@H *+ *+'(XφK,?l1SEw@@H *+ *+'(YφK,?l1SEx@@H *+ *+'(ZφK--?l1SEy@@H *+ *+'([φKo-?l1SEz@@H *+ *+'(\φK-?l1SE{@@H *+ *+'(]φK.?l1SE|@@H *+ *+'(^φKw.?l1SE}@@H *+ *+'(_φK.?l1SE~@@H *+ *+'(`φK.?l1SE@@H *+ *+'(aφKQ/?l1SE@@H *+ *+'(bφK/?l1SE@@H *+ *+'(cφK/?l1SE@@H *+ *+'(dφK30?l1SE@@H *+ *+'(eφKt0?l1SE@@H *+ *+'(fφK0?l1SE@@H *+ *+'(gφK1?l1SE@@H *+ *+'(hφKV1?l1SE@@G *+ *+'(iφK1?l1SE@@G *+ *+'(jφK1?l1SE@@G *+ *+'(kφK]2?l1SE@@G *+ *+'(lφK2?l1SE@@G *+ *+'(mφK2?l1SE@@G *+ *+'(nφK>3?l1SE@@G *+ *+'(oφKx3?l1SE@@G *+ *+'(pφK3?l1SE@@G *+ *+'(qφK$4?l1SE@@G *+ *+'(rφK[4?l1SE@@G *+ *+'(sφK4?l1SE@@G *+ *+'(tφK4?l1SE@@G *+ *+'(uφK<5?l1SE@@G *+ *+'(vφK5?l1SE@@G *+ *+'(wφK5?l1SE@@G *+ *+'(xφK6?l1SE@@G *+ *+'(yφK6?l1SE@@G *+ *+'(zφK6?l1SE@@G *+ *+'({φK%7?l1SE@@G *+ *+'(|φK_7?l1SE@@G *+ *+'(}φK7?l1SE@@G *+ *+'(~φK8?l1SE@@G *+ *+'(φKB8?l1SE@@G *+ *+'(φK8?l1SE@@G *+ *+'(φK8?l1SE@@G *+ *+'(φK(9?l1SE@@G *+ *+'(φK9?l1SE@@G *+ *+'(φK9?l1SE@@G *+ *+'(φK:?l1SE@@G *+ *+'(φK8:  ?l1SE@@H *+ *+'(φKE:<<?l1SE,@@I *+ *+'(@UUІK VV?l1SEH@@I *+ *+'4)!{+@ІK ?l1SE@@G *+ *+')ІK ?l1SE@@G *+ *+')ІKU ?l1SE@@G *+ *+')ІK ?l1SE@@G *+ *+')ІK ?l1SE@@G *+ *+')ІK; ?l1SE@@G *+ *+')ІKz ?l1SE@@G *+ *+')ІK ?l1SE@@G *+ *+')ІK ?l1SE@@G *+ *+') ІK] ?l1SE@@G *+ *+') ІK ?l1SE@@G *+ *+') ІK ?l1SE@@G *+ *+') ІK=?l1SE@@G *+ *+') ІK?l1SE@@G *+ *+')ІK?l1SE@@G *+ *+')ІKC?l1SE@@G *+ *+')ІK?l1SE@@G *+ *+')ІK?l1SE@@G *+ *+')ІK!?l1SE@@G *+ *+')ІKa?l1SE@@G *+ *+')ІK?l1SE@@G *+ *+')ІK?l1SE@@G *+ *+')ІKE?l1SE@@G *+ *+')ІK?l1SE@@G *+ *+')ІK?l1SE@@G *+ *+')ІK&?l1SE@@G *+ *+')ІK?l1SE@@G *+ *+')ІK?l1SE@@G *+ *+')ІK%?l1SE@@G *+ *+')ІKe?l1SE@@G *+ *+')ІK&?l1SE@@G *+ *+')_ІKDVV?l1SEH0@@I *+ *+'4*!Q@ІKE?l1SE1@@GU *+ *+'*ІKE?l1SE2@@GT *+ *+'*ІK?F?l1SE3@@GS *+ *+'*ІKF?l1SE4@@GR *+ *+'*ІKF?l1SE5@@GQ *+ *+'*ІK"G?l1SE6@@GP *+ *+'*ІKfG?l1SE7@@GO *+ *+'*ІKG?l1SE8@@GN *+ *+'*ІKH?l1SE9@@GM *+ *+'* ІKDH?l1SE:@@GL *+ *+'* ІKH?l1SE;@@GK *+ *+'* ІKH?l1SE<@@GJ *+ *+'* ІK(I?l1SE=@@GI *+ *+'* ІKI?l1SE>@@GH *+ *+'*ІKI?l1SE?@@GG *+ *+'*ІK&J?l1SE@@@GF *+ *+'*ІKgJ?l1SEA@@GE *+ *+'*ІKJ?l1SEB@@GD *+ *+'*ІKK?l1SEC@@GC *+ *+'*ІKKK?l1SED@@GB *+ *+'*ІKK?l1SEE@@GA *+ *+'*ІKK?l1SEF@@G@ *+ *+'*ІK+L?l1SEG@@G? *+ *+'*ІKL?l1SEH@@G> *+ *+'*ІKL?l1SEI@@G= *+ *+'*ІKM?l1SEJ@@G< *+ *+'*ІKkM?l1SEK@@G; *+ *+'*ІKM?l1SEL@@G: *+ *+'*ІK N?l1SEM@@G9 *+ *+'*ІKNN?l1SEN@@G8 *+ *+'*ІKN?l1SEO@@G7 *+ *+'*ІKN?l1SEP@@G6 *+ *+'* ІK0O?l1SEQ@@G5 *+ *+'*!ІKrO?l1SER@@G4 *+ *+'*"ІKO?l1SES@@G3 *+ *+'*#ІKP?l1SET@@G2 *+ *+'*$ІKpP?l1SEU@@G1 *+ *+'*%ІKP?l1SEV@@G0 *+ *+'*&ІKP?l1SEW@@G/ *+ *+'*'ІKSQ?l1SEX@@G. *+ *+'*(ІKQ?l1SEY@@G- *+ *+'*)ІKQ?l1SEZ@@G, *+ *+'**ІK3R?l1SE[@@G+ *+ *+'*+ІKqR?l1SE\@@G* *+ *+'*,ІKR?l1SE]@@G) *+ *+'*-ІKS?l1SE^@@G( *+ *+'*.ІKTS?l1SE_@@G' *+ *+'*/ІKS?l1SE`@@G& *+ *+'*0ІKS?l1SEa@@G% *+ *+'*1ІKST?l1SEb@@G$ *+ *+'*2ІKT?l1SEc@@G# *+ *+'*3ІKT?l1SEd@@G" *+ *+'*4ІK5U?l1SEe@@G! *+ *+'*5ІKwU?l1SEf@@G *+ *+'*6ІKU?l1SEg@@G *+ *+'*7ІKV?l1SEh@@G *+ *+'*8ІKXV?l1SEi@@G *+ *+'*9ІKV?l1SEj@@G *+ *+'*:ІKV?l1SEk@@G *+ *+'*;ІK;W?l1SEl@@G *+ *+'*<ІKW?l1SEm@@G *+ *+'*=ІKW?l1SEn@@G *+ *+'*>ІKX?l1SEo@@G *+ *+'*?ІK|X?l1SEp@@G *+ *+'*@ІKX?l1SEq@@G *+ *+'*AІKY?l1SEr@@G *+ *+'*BІK^Y?l1SEs@@G *+ *+'*CІKY?l1SEt@@G *+ *+'*DІKY?l1SEu@@G *+ *+'*EІK@Z?l1SEv@@G *+ *+'*FІKZ?l1SEw@@G *+ *+'*GІKZ?l1SEx@@G *+ *+'*HІK![?l1SEy@@G *+ *+'*IІK[?l1SEz@@G *+ *+'*JІK[?l1SE{@@G *+ *+'*KІK\?l1SE|@@G *+ *+'*LІKa\?l1SE}@@G *+ *+'*MІK\?l1SE~@@G *+ *+'*NІK]?l1SE@@G *+ *+'*OІKC]?l1SE@@G *+ *+'*PІK]?l1SE@@G *+ *+'*QІK]?l1SE@@G *+ *+'*RІK&^?l1SE@@G *+ *+'*SІKh^?l1SE@@G *+ *+'*TІK^?l1SE@@G *+ *+'*UІK_?l1SE@@G *+ *+'*VІKg_?l1SE@@F *+ *+'*WІK_?l1SE@@F *+ *+'*XІK_?l1SE@@F *+ *+'*YІK{`?l1SE@@F *+ *+'*ZІK`?l1SE@@F *+ *+'*[ІK`?l1SE@@F *+ *+'*\ІK+a?l1SE@@F *+ *+'*]ІKla?l1SE@@F *+ *+'*^ІKa?l1SE@@F *+ *+'*_ІK b?l1SE@@F *+ *+'*`ІKNb?l1SE@@F *+ *+'*aІKb?l1SE@@F *+ *+'*bІKb?l1SE@@F *+ *+'*cІKLc?l1SE@@F *+ *+'*dІKc?l1SE@@F *+ *+'*eІKc?l1SE@@F *+ *+'*fІK/d?l1SE@@F *+ *+'*gІKqd?l1SE@@F *+ *+'*hІKd?l1SE@@F *+ *+'*iІKe?l1SE@@F *+ *+'*jІKSe?l1SE@@F *+ *+'*kІKe?l1SE@@F *+ *+'*lІKe?l1SE@@F *+ *+'*mІK4f?l1SE@@F *+ *+'*nІKf?l1SE@@F *+ *+'*oІKf?l1SE@@F *+ *+'*pІKg?l1SE@@F *+ *+'*qІKvg?l1SE@@F *+ *+'*rІKg?l1SE@@F *+ *+'*sІKh?l1SE@@F *+ *+'*tІKWh?l1SE@@F *+ *+'*uІKh?l1SE@@F *+ *+'*vІKh?l1SE@@F *+ *+'*wІK9i?l1SE@@F *+ *+'*xІK|i?l1SE@@F *+ *+'*yІKi?l1SE@@F *+ *+'*zІKj?l1SE@@F *+ *+'*{ІKyj?l1SE@@F *+ *+'*|ІKj?l1SE@@F *+ *+'*}ІKj?l1SE@@F *+ *+'*~ІK]k?l1SE@@F *+ *+'*ІKk?l1SE@@F *+ *+'*ІKk?l1SE@@F *+ *+'*ІK>l?l1SE@@F *+ *+'*ІKl?l1SE@@F *+ *+'*ІKl?l1SE@@F *+ *+'*ІK m?l1SE@@F *+ *+'*ІKbm?l1SE@@F *+ *+'*ІKm  ?l1SE@@G *+ *+'*ІKm<<?l1SE,@@H *+ *+'*@UUІKVV?l1SEH@@H *+ *+'4+!V@ІK?l1SE@@F *+ *+'+ІKĀ?l1SE@@F *+ *+'+ІK$?l1SE@@F *+ *+'+ІKd?l1SE@@F *+ *+'+ІK?l1SE@@F *+ *+'+ІK?l1SE@@F *+ *+'+ІKG?l1SE@@F *+ *+'+ІK?l1SE@@F *+ *+'+ІK?l1SE@@F *+ *+'+ ІK)?l1SE@@F *+ *+'+ ІK?l1SE@@F *+ *+'+ ІKɃ?l1SE@@F *+ *+'+ ІK ?l1SE@@F *+ *+'+ ІKi?l1SE@@F *+ *+'+ІK?l1SE@@F *+ *+'+ІK ?l1SE@@F *+ *+'+ІKK?l1SE@@F *+ *+'+ІK?l1SE@@F *+ *+'+ІK?l1SE@@F *+ *+'+ІK-?l1SE@@F *+ *+'+ІKo?l1SE@@F *+ *+'+ІK͆?l1SE@@F *+ *+'+ІK?l1SE@@F *+ *+'+ІKn?l1SE@@F *+ *+'+ІK?l1SE@@F *+ *+'+ІK?l1SE@@F *+ *+'+ІKP?l1SE@@F *+ *+'+ІK?l1SE@@F *+ *+'+ІK?l1SE@@F *+ *+'+ІK2?l1SE@@F *+ *+'+ІKs?l1SE@@F *+ *+'+ІKӉ?l1SE@@F *+ *+'+ ІK?l1SE@@F *+ *+'+!ІKU?l1SE@@F *+ *+'+"ІK?l1SE@@F *+ *+'+#ІK?l1SE@@F *+ *+'+$ІKT?l1SE@@F *+ *+'+%ІK?l1SE@@F *+ *+'+&ІK؋?l1SE@@F *+ *+'+'ІK6?l1SE@@F *+ *+'+(ІKx?l1SE@@F *+ *+'+)ІK?l1SE@@F *+ *+'+*ІK?l1SE@@F *+ *+'++ІKZ?l1SE@@F *+ *+'+,ІK?l1SE@@F *+ *+'+-ІK?l1SE@@F *+ *+'+.ІK<?l1SE@@F *+ *+'+/ІK?l1SE@@F *+ *+'+0ІKێ?l1SE@@F *+ *+'+1ІK;?l1SE@@F *+ *+'+2ІK}?l1SE@@F *+ *+'+3ІK?l1SE@@F *+ *+'+4ІK?l1SE@@F *+ *+'+5ІK_?l1SE@@F *+ *+'+6ІK?l1SE@@F *+ *+'+7ІK?l1SE@@F *+ *+'+8ІK@?l1SE@@F *+ *+'+9ІK?l1SE@@F *+ *+'+:ІK?l1SE@@F *+ *+'+;ІK#?l1SE@@F *+ *+'+<ІK?l1SE@@F *+ *+'+=ІKÒ?l1SE@@F *+ *+'+>ІK?l1SE@@F *+ *+'+?ІKd?l1SE@@F *+ *+'+@ІK?l1SE@@F *+ *+'+AІK?l1SE@@F *+ *+'+BІKE?l1SE@@F *+ *+'+CІK?l1SE@@F *+ *+'+DІK?l1SE@@F *+ *+'+EІK'?l1SE@@F *+ *+'+FІKi?l1SE@@F *+ *+'+GІKǕ?l1SE@@F *+ *+'+HІK ?l1SE@@F *+ *+'+IІKg?l1SE@@F *+ *+'+JІK?l1SE@@F *+ *+'+KІK?l1SE@@F *+ *+'+LІKJ?l1SE@@F *+ *+'+MІK?l1SE@@F *+ *+'+NІK?l1SE@@F~ *+ *+'+OІK+?l1SE @@F} *+ *+'+PІKm?l1SE @@F| *+ *+'+QІK˘?l1SE @@F{ *+ *+'+RІK?l1SE @@Fz *+ *+'+SІKO?l1SE @@Fy *+ *+'+TІK?l1SE@@Fx *+ *+'+UІK?l1SE@@Fw *+ *+'+VІKN?l1SE@@Fv *+ *+'+WІK?l1SE@@Fu *+ *+'+XІKњ?l1SE@@Ft *+ *+'+YІK1?l1SE@@Fs *+ *+'+ZІKr?l1SE@@Fr *+ *+'+[ІK?l1SE@@Fq *+ *+'+\ІK?l1SE@@Fp *+ *+'+]ІKT?l1SE@@Fo *+ *+'+^ІK?l1SE@@Fn *+ *+'+_ІK?l1SE@@Fm *+ *+'+`ІK6?l1SE@@Fl *+ *+'+aІK?l1SE@@Fk *+ *+'+bІK֝?l1SE@@Fj *+ *+'+cІK5?l1SE@@Fi *+ *+'+dІKv?l1SE@@Fh *+ *+'+eІK?l1SE@@Fg *+ *+'+fІK?l1SE @@Ff *+ *+'+gІKY?l1SE!@@Fe *+ *+'+hІK?l1SE"@@Fd *+ *+'+iІK?l1SE#@@Fc *+ *+'+jІK;?l1SE$@@Fb *+ *+'+kІK?l1SE%@@Fa *+ *+'+lІKڠ?l1SE&@@F` *+ *+'+mІK?l1SE'@@F_ *+ *+'+nІK{?l1SE(@@F^ *+ *+'+oІK?l1SE)@@F] *+ *+'+pІK?l1SE*@@F\ *+ *+'+qІK\?l1SE+@@F[ *+ *+'+rІK?l1SE,@@FZ *+ *+'+sІK?l1SE-@@FY *+ *+'+tІK??l1SE.@@FX *+ *+'+uІK?l1SE/@@FW *+ *+'+vІK?l1SE0@@FV *+ *+'+wІK ?l1SE1@@FU *+ *+'+xІKc?l1SE2@@FT *+ *+'+yІK?l1SE3@@FS *+ *+'+zІK?l1SE4@@FR *+ *+'+{ІKb?l1SE5@@FQ *+ *+'+|ІK?l1SE6@@FP *+ *+'+}ІK?l1SE7@@FO *+ *+'+~ІKC?l1SE8@@FN *+ *+'+ІK?l1SE9@@FM *+ *+'+ІK?l1SE:@@FL *+ *+'+ІK&?l1SE;@@FK *+ *+'+ІKg?l1SE<@@FJ *+ *+'+ІKŧ?l1SE=@@FI *+ *+'+ІK?l1SE>@@FH *+ *+'+ІKI?l1SE?@@FG *+ *+'+ІK|  ?l1SE@@@GJ *+ *+'+ІK<<?l1SE,A@@H *+ *+'+@UUІKVV?l1SEHB@@G *+ *+'4,!-@ІK@?l1SEC@@FC *+ *+',ІK?l1SED@@FB *+ *+',ІK?l1SEE@@FA *+ *+',ІK"?l1SEF@@F@ *+ *+',ІKd?l1SEG@@F? *+ *+',ІKļ?l1SEH@@F> *+ *+',ІK?l1SEI@@F= *+ *+',ІKb?l1SEJ@@F< *+ *+',ІK?l1SEK@@F; *+ *+', ІK?l1SEL@@F: *+ *+', ІKD?l1SEM@@F9 *+ *+', ІK?l1SEN@@F8 *+ *+', ІKȾ?l1SEO@@F7 *+ *+', ІK'?l1SEP@@F6 *+ *+',ІKh?l1SEQ@@F5 *+ *+',ІKȿ?l1SER@@F4 *+ *+',ІK?l1SES@@F3 *+ *+',ІKJ?l1SET@@F2 *+ *+',ІK?l1SEU@@F1 *+ *+',ІK?l1SEV@@F0 *+ *+',ІK-?l1SEW@@F/ *+ *+',ІK?l1SEX@@F. *+ *+',ІK?l1SEY@@F- *+ *+',ІK*?l1SEZ@@F, *+ *+',ІKm?l1SE[@@F+ *+ *+',ІK?l1SE\@@F* *+ *+',ІK ?l1SE]@@F) *+ *+',ІKO?l1SE^@@F( *+ *+',ІK?l1SE_@@F' *+ *+',ІK?l1SE`@@F& *+ *+',ІK1?l1SEa@@F% *+ *+',ІK?l1SEb@@F$ *+ *+', ІK?l1SEc@@F# *+ *+',!ІK?l1SEd@@F" *+ *+',"ІKr?l1SEe@@F! *+ *+',#ІK?l1SEf@@F *+ *+',$ІK?l1SEg@@F *+ *+',%ІKT?l1SEh@@F *+ *+',&ІK?l1SEi@@F *+ *+','ІK?l1SEj@@F *+ *+',(ІK5?l1SEk@@F *+ *+',)ІKw?l1SEl@@F *+ *+',*ІK?l1SEm@@F *+ *+',+ІK?l1SEn@@F *+ *+',,ІKv?l1SEo@@F *+ *+',-ІK?l1SEp@@F *+ *+',.ІK?l1SEq@@F *+ *+',/ІKY?l1SEr@@F *+ *+',0ІK?l1SEs@@F *+ *+',1ІK?l1SEt@@F *+ *+',2ІK:?l1SEu@@F *+ *+',3ІK|?l1SEv@@F *+ *+',4ІK?l1SEw@@F *+ *+',5ІK?l1SEx@@F *+ *+',6ІK^?l1SEy@@F *+ *+',7ІK?l1SEz@@F *+ *+',8ІK?l1SE{@@F *+ *+',9ІK\?l1SE|@@F *+ *+',:ІK?l1SE}@@F *+ *+',;ІK?l1SE~@@F *+ *+',<ІK>?l1SE@@F *+ *+',=ІK?l1SE@@F *+ *+',>ІK?l1SE@@F *+ *+',?ІK ?l1SE@@F *+ *+',@ІKb?l1SE@@F *+ *+',AІK?l1SE@@F *+ *+',BІK?l1SE@@F *+ *+',CІKD?l1SE@@F *+ *+',DІK?l1SE@@E *+ *+',EІK?l1SE@@E *+ *+',FІK&?l1SE@@E *+ *+',GІK?l1SE@@E *+ *+',HІK?l1SE@@E *+ *+',IІK$?l1SE@@E *+ *+',JІKf?l1SE@@E *+ *+',KІK?l1SE@@E *+ *+',LІK?l1SE@@E *+ *+',MІKI?l1SE@@E *+ *+',NІK?l1SE@@E *+ *+',OІK?l1SE@@E *+ *+',PІK+?l1SE@@E *+ *+',QІK?l1SE@@E *+ *+',RІK?l1SE@@E *+ *+',SІK ?l1SE@@E *+ *+',TІKl?l1SE@@E *+ *+',UІK?l1SE@@E *+ *+',VІK ?l1SE@@E *+ *+',WІKM?l1SE@@E *+ *+',XІK?l1SE@@E *+ *+',YІK?l1SE@@E *+ *+',ZІK0?l1SE@@E *+ *+',[ІKq?l1SE@@E *+ *+',\ІK?l1SE@@E *+ *+',]ІK?l1SE@@E *+ *+',^ІKp?l1SE@@E *+ *+',_ІK?l1SE@@E *+ *+',`ІK?l1SE@@E *+ *+',aІKR?l1SE@@E *+ *+',bІK?l1SE@@E *+ *+',cІK?l1SE@@E *+ *+',dІK5?l1SE@@E *+ *+',eІKv?l1SE@@E *+ *+',fІK?l1SE@@E *+ *+',gІK?l1SE@@E *+ *+',hІKX?l1SE@@E *+ *+',iІK?l1SE@@E *+ *+',jІK?l1SE@@E *+ *+',kІKW?l1SE@@E *+ *+',lІK?l1SE@@E *+ *+',mІK?l1SE@@E *+ *+',nІK9?l1SE@@E *+ *+',oІK{?l1SE@@E *+ *+',pІK?l1SE@@E *+ *+',qІK?l1SE@@E *+ *+',rІK\?l1SE@@E *+ *+',sІK?l1SE@@E *+ *+',tІK?l1SE@@E *+ *+',uІK>?l1SE@@E *+ *+',vІK?l1SE@@E *+ *+',wІK?l1SE@@E *+ *+',xІK!?l1SE@@E *+ *+',yІK?l1SE@@E *+ *+',zІK?l1SE@@E *+ *+',{ІK!?l1SE@@E *+ *+',|ІKa?l1SE@@E *+ *+',}ІK?l1SE@@E *+ *+',~ІK?l1SE@@E *+ *+',ІKB?l1SE@@E *+ *+',ІK?l1SE@@E *+ *+',ІK?l1SE@@E *+ *+',ІK%?l1SE@@E *+ *+',ІK?l1SE@@E *+ *+',ІK?l1SE@@E *+ *+',ІK?l1SE@@E *+ *+',ІK9  ?l1SE@@F *+ *+',ІKA<<?l1SE,@@G *+ *+',@UUІKpVV?l1SEH@@Gs *+ *+'4-!x@ІK(?l1SE@@E *+ *+'-ІKi?l1SE@@E *+ *+'-ІK?l1SE@@E *+ *+'-ІK ?l1SE@@E *+ *+'-ІKK?l1SE@@E *+ *+'-ІK?l1SE@@E *+ *+'-ІK?l1SE@@E *+ *+'-ІKK?l1SE@@E *+ *+'-ІK?l1SE@@E *+ *+'- ІK?l1SE@@E *+ *+'- ІK,?l1SE@@E *+ *+'- ІKn?l1SE@@E *+ *+'- ІK?l1SE@@E *+ *+'- ІK?l1SE@@E *+ *+'-ІKP?l1SE@@E *+ *+'-ІK?l1SE@@E *+ *+'-ІK?l1SE@@E *+ *+'-ІK4?l1SE@@E *+ *+'-ІK?l1SE@@E *+ *+'-ІK?l1SE@@E *+ *+'-ІK?l1SE@@E *+ *+'-ІKz?l1SE@@E *+ *+'-ІK?l1SE@@E *+ *+'-ІK?l1SE@@E *+ *+'-ІKT?l1SE@@E *+ *+'-ІK?l1SE@@E *+ *+'-ІK?l1SE@@E *+ *+'-ІK8?l1SE@@E *+ *+'-ІK?l1SE@@E *+ *+'-ІK?l1SE@@E *+ *+'-ІK?l1SE@@E *+ *+'-ІKw?l1SE@@E *+ *+'- ІK?l1SE@@E *+ *+'-!ІK?l1SE@@E *+ *+'-"ІKY?l1SE@@E *+ *+'-#ІK?l1SE@@E *+ *+'-$ІK?l1SE@@E *+ *+'-%ІK<?l1SE@@E *+ *+'-&ІK}?l1SE@@E *+ *+'-'ІK?l1SE@@E *+ *+'-(ІK?l1SE@@E *+ *+'-)ІK^?l1SE@@E *+ *+'-*ІK?l1SE@@E *+ *+'-+ІK?l1SE@@E *+ *+'-,ІK^?l1SE@@E *+ *+'--ІK?l1SE@@E *+ *+'-.ІK?l1SE@@E *+ *+'-/ІK??l1SE@@E *+ *+'-0ІK?l1SE@@E *+ *+'-1ІK?l1SE@@E *+ *+'-2ІK"?l1SE@@E *+ *+'-3ІKc?l1SE@@E *+ *+'-4ІK?l1SE@@E *+ *+'-5ІK?l1SE@@E *+ *+'-6ІKF?l1SE@@E *+ *+'-7ІK?l1SE@@E *+ *+'-8ІK?l1SE@@E *+ *+'-9ІKD?l1SE@@E *+ *+'-:ІK?l1SE@@E *+ *+'-;ІK?l1SE@@E *+ *+'-<ІK'?l1SE@@E~ *+ *+'-=ІKh?l1SE @@E} *+ *+'->ІK?l1SE @@E| *+ *+'-?ІK ?l1SE @@E{ *+ *+'-@ІKJ ?l1SE @@Ez *+ *+'-AІK ?l1SE @@Ey *+ *+'-BІK ?l1SE@@Ex *+ *+'-CІK, ?l1SE@@Ew *+ *+'-DІK ?l1SE@@Ev *+ *+'-EІK ?l1SE@@Eu *+ *+'-FІK ?l1SE@@Et *+ *+'-GІKm ?l1SE@@Es *+ *+'-HІK ?l1SE@@Er *+ *+'-IІK ?l1SE@@Eq *+ *+'-JІKN ?l1SE@@Ep *+ *+'-KІK ?l1SE@@Eo *+ *+'-LІK ?l1SE@@En *+ *+'-MІK0 ?l1SE@@Em *+ *+'-NІK ?l1SE@@El *+ *+'-OІK ?l1SE@@Ek *+ *+'-PІK?l1SE@@Ej *+ *+'-QІKq?l1SE@@Ei *+ *+'-RІK?l1SE@@Eh *+ *+'-SІK?l1SE@@Eg *+ *+'-TІKS?l1SE @@Ef *+ *+'-UІK?l1SE!@@Ee *+ *+'-VІK?l1SE"@@Ed *+ *+'-WІK5?l1SE#@@Ec *+ *+'-XІKw?l1SE$@@Eb *+ *+'-YІK?l1SE%@@Ea *+ *+'-ZІK?l1SE&@@E` *+ *+'-[ІKY?l1SE'@@E_ *+ *+'-\ІK?l1SE(@@E^ *+ *+'-]ІK?l1SE)@@E] *+ *+'-^ІKY?l1SE*@@E\ *+ *+'-_ІK?l1SE+@@E[ *+ *+'-`ІK?l1SE,@@EZ *+ *+'-aІK:?l1SE-@@EY *+ *+'-bІK{?l1SE.@@EX *+ *+'-cІK?l1SE/@@EW *+ *+'-dІK?l1SE0@@EV *+ *+'-eІK^?l1SE1@@EU *+ *+'-fІK?l1SE2@@ET *+ *+'-gІK?l1SE3@@ES *+ *+'-hІK@?l1SE4@@ER *+ *+'-iІK?l1SE5@@EQ *+ *+'-jІK?l1SE6@@EP *+ *+'-kІK??l1SE7@@EO *+ *+'-lІK?l1SE8@@EN *+ *+'-mІK?l1SE9@@EM *+ *+'-nІK ?l1SE:@@EL *+ *+'-oІKc?l1SE;@@EK *+ *+'-pІK?l1SE<@@EJ *+ *+'-qІK?l1SE=@@EI *+ *+'-rІKD?l1SE>@@EH *+ *+'-sІK?l1SE?@@EG *+ *+'-tІK?l1SE@@@EF *+ *+'-uІK&?l1SEA@@EE *+ *+'-vІK?l1SEB@@ED *+ *+'-wІK?l1SEC@@EC *+ *+'-xІK?l1SED@@EB *+ *+'-yІKg?l1SEE@@EA *+ *+'-zІK?l1SEF@@E@ *+ *+'-{ІK?l1SEG@@E? *+ *+'-|ІKI?l1SEH@@E> *+ *+'-}ІK?l1SEI@@E= *+ *+'-~ІK?l1SEJ@@E< *+ *+'-ІK*?l1SEK@@E; *+ *+'-ІK?l1SEL@@E: *+ *+'-ІK?l1SEM@@E9 *+ *+'-ІK ?l1SEN@@E8 *+ *+'-ІKk?l1SEO@@E7 *+ *+'-ІK?l1SEP@@E6 *+ *+'-ІK?l1SEQ@@E5 *+ *+'-ІK"  ?l1SER@@F8 *+ *+'-ІK)<<?l1SE,S@@G *+ *+'-@UUІK70VV?l1SEHT@@F *+ *+'4.!@ІK0?l1SEU@@E1 *+ *+'.ІK01?l1SEV@@E0 *+ *+'.ІK1?l1SEW@@E/ *+ *+'.ІK1?l1SEX@@E. *+ *+'.ІK2?l1SEY@@E- *+ *+'.ІKq2?l1SEZ@@E, *+ *+'.ІK2?l1SE[@@E+ *+ *+'.ІK3?l1SE\@@E* *+ *+'.ІKT3?l1SE]@@E) *+ *+'. ІK3?l1SE^@@E( *+ *+'. ІK3?l1SE_@@E' *+ *+'. ІK54?l1SE`@@E& *+ *+'. ІKw4?l1SEa@@E% *+ *+'. ІK4?l1SEb@@E$ *+ *+'.ІK5?l1SEc@@E# *+ *+'.ІKv5?l1SEd@@E" *+ *+'.ІK5?l1SEe@@E! *+ *+'.ІK5?l1SEf@@E *+ *+'.ІKW6?l1SEg@@E *+ *+'.ІK6?l1SEh@@E *+ *+'.ІK6?l1SEi@@E *+ *+'.ІK:7?l1SEj@@E *+ *+'.ІK{7?l1SEk@@E *+ *+'.ІK7?l1SEl@@E *+ *+'.ІK8?l1SEm@@E *+ *+'.ІK]8?l1SEn@@E *+ *+'.ІK8?l1SEo@@E *+ *+'.ІK8?l1SEp@@E *+ *+'.ІK\9?l1SEq@@E *+ *+'.ІK9?l1SEr@@E *+ *+'.ІK9?l1SEs@@E *+ *+'.ІK?:?l1SEt@@E *+ *+'. ІK:?l1SEu@@E *+ *+'.!ІK:?l1SEv@@E *+ *+'."ІK!;?l1SEw@@E *+ *+'.#ІKb;?l1SEx@@E *+ *+'.$ІK;?l1SEy@@E *+ *+'.%ІK<?l1SEz@@E *+ *+'.&ІKD<?l1SE{@@E *+ *+'.'ІK<?l1SE|@@E *+ *+'.(ІK<?l1SE}@@E *+ *+'.)ІK&=?l1SE~@@E *+ *+'.*ІK=?l1SE@@E *+ *+'.+ІK=?l1SE@@E *+ *+'.,ІK%>?l1SE@@E *+ *+'.-ІKg>?l1SE@@E *+ *+'..ІK>?l1SE@@E *+ *+'./ІK??l1SE@@E *+ *+'.0ІKI??l1SE@@E *+ *+'.1ІK??l1SE@@E *+ *+'.2ІK??l1SE@@D *+ *+'.3ІK+@?l1SE@@D *+ *+'.4ІK@?l1SE@@D *+ *+'.5ІK@?l1SE@@D *+ *+'.6ІK A?l1SE@@D *+ *+'.7ІKlA?l1SE@@D *+ *+'.8ІKA?l1SE@@D *+ *+'.9ІK B?l1SE@@D *+ *+'.:ІKLB?l1SE@@D *+ *+'.;ІKB?l1SE@@D *+ *+'.<ІKB?l1SE@@D *+ *+'.=ІK0C?l1SE@@D *+ *+'.>ІKqC?l1SE@@D *+ *+'.?ІKC?l1SE@@D *+ *+'.@ІKD?l1SE@@D *+ *+'.AІKqD?l1SE@@D *+ *+'.BІKD?l1SE@@D *+ *+'.CІKD?l1SE@@D *+ *+'.DІKRE?l1SE@@D *+ *+'.EІKE?l1SE@@D *+ *+'.FІKE?l1SE@@D *+ *+'.GІK3F?l1SE@@D *+ *+'.HІKuF?l1SE@@D *+ *+'.IІKF?l1SE@@D *+ *+'.JІKG?l1SE@@D *+ *+'.KІKWG?l1SE@@D *+ *+'.LІKG?l1SE@@D *+ *+'.MІKG?l1SE@@D *+ *+'.NІKWH?l1SE@@D *+ *+'.OІKH?l1SE@@D *+ *+'.PІKH?l1SE@@D *+ *+'.QІK8I?l1SE@@D *+ *+'.RІK{I?l1SE@@D *+ *+'.SІKI?l1SE@@D *+ *+'.TІKJ?l1SE@@D *+ *+'.UІK]J?l1SE@@D *+ *+'.VІKJ?l1SE@@D *+ *+'.WІKJ?l1SE@@D *+ *+'.XІK>K?l1SE@@D *+ *+'.YІKK?l1SE@@D *+ *+'.ZІKK?l1SE@@D *+ *+'.[ІK L?l1SE@@D *+ *+'.\ІK~L?l1SE@@D *+ *+'.]ІKL?l1SE@@D *+ *+'.^ІKM?l1SE@@D *+ *+'._ІKaM?l1SE@@D *+ *+'.`ІKM?l1SE@@D *+ *+'.aІKN?l1SE@@D *+ *+'.bІKCN?l1SE@@D *+ *+'.cІKN?l1SE@@D *+ *+'.dІKN?l1SE@@D *+ *+'.eІK$O?l1SE@@D *+ *+'.fІKO?l1SE@@D *+ *+'.gІKO?l1SE@@D *+ *+'.hІKP?l1SE@@D *+ *+'.iІKfP?l1SE@@D *+ *+'.jІKP?l1SE@@D *+ *+'.kІKQ?l1SE@@D *+ *+'.lІKGQ?l1SE@@D *+ *+'.mІKQ?l1SE@@D *+ *+'.nІKQ?l1SE@@D *+ *+'.oІK*R?l1SE@@D *+ *+'.pІKlR?l1SE@@D *+ *+'.qІKR?l1SE@@D *+ *+'.rІK S?l1SE@@D *+ *+'.sІKjS?l1SE@@D *+ *+'.tІKS?l1SE@@D *+ *+'.uІKS?l1SE@@D *+ *+'.vІKLT?l1SE@@D *+ *+'.wІKT?l1SE@@D *+ *+'.xІKT?l1SE@@D *+ *+'.yІK-U?l1SE@@D *+ *+'.zІKoU?l1SE@@D *+ *+'.{ІKU?l1SE@@D *+ *+'.|ІKV?l1SE@@D *+ *+'.}ІKQV?l1SE@@D *+ *+'.~ІKV?l1SE@@D *+ *+'.ІKV?l1SE@@D *+ *+'.ІKQW?l1SE@@D *+ *+'.ІKW?l1SE@@D *+ *+'.ІKW?l1SE@@D *+ *+'.ІK3X?l1SE@@D *+ *+'.ІKtX?l1SE@@D *+ *+'.ІKX?l1SE@@D *+ *+'.ІKX  ?l1SE@@E *+ *+'.ІKX<<?l1SE,@@F~ *+ *+'.@UUІKkVV?l1SEH@@Fa *+ *+'4/!Ɯ}@ІKk?l1SE@@D *+ *+'/ІKl?l1SE@@D *+ *+'/ІKwl?l1SE@@D *+ *+'/ІKl?l1SE@@D *+ *+'/ІKl?l1SE@@D *+ *+'/ІKYm?l1SE@@D *+ *+'/ІKm?l1SE@@D *+ *+'/ІKm?l1SE@@D *+ *+'/ІK:n?l1SE@@D *+ *+'/ ІK|n?l1SE@@D *+ *+'/ ІKn?l1SE@@D *+ *+'/ ІKo?l1SE@@D *+ *+'/ ІK^o?l1SE@@D *+ *+'/ ІKo?l1SE@@D *+ *+'/ІKo?l1SE@@D *+ *+'/ІK]p?l1SE@@D *+ *+'/ІKp?l1SE@@D *+ *+'/ІKp?l1SE@@D *+ *+'/ІK?q?l1SE@@D *+ *+'/ІKq?l1SE@@D *+ *+'/ІKq?l1SE@@D *+ *+'/ІK"r?l1SE@@D *+ *+'/ІKcr?l1SE@@D *+ *+'/ІKr?l1SE@@D *+ *+'/ІKs?l1SE@@D *+ *+'/ІKEs?l1SE@@D *+ *+'/ІKs?l1SE@@D *+ *+'/ІKs?l1SE@@D *+ *+'/ІKDt?l1SE@@D *+ *+'/ІKt?l1SE@@D *+ *+'/ІKt?l1SE@@D *+ *+'/ІK&u?l1SE@@D *+ *+'/ ІKhu?l1SE@@D *+ *+'/!ІKu?l1SE@@D *+ *+'/"ІKv?l1SE@@D *+ *+'/#ІKJv?l1SE@@D *+ *+'/$ІKv?l1SE@@D *+ *+'/%ІKv?l1SE@@D *+ *+'/&ІK+w?l1SE@@D *+ *+'/'ІKw?l1SE@@D *+ *+'/(ІKw?l1SE@@D *+ *+'/)ІKx?l1SE@@D *+ *+'/*ІKox?l1SE@@D~ *+ *+'/+ІKx?l1SE @@D} *+ *+'/,ІK y?l1SE @@D| *+ *+'/-ІKNy?l1SE @@D{ *+ *+'/.ІKy?l1SE @@Dz *+ *+'//ІKy?l1SE @@Dy *+ *+'/0ІK0z?l1SE@@Dx *+ *+'/1ІKz?l1SE@@Dw *+ *+'/2ІKz?l1SE@@Dv *+ *+'/3ІK{?l1SE@@Du *+ *+'/4ІKr{?l1SE@@Dt *+ *+'/5ІK{?l1SE@@Ds *+ *+'/6ІK{?l1SE@@Dr *+ *+'/7ІKS|?l1SE@@Dq *+ *+'/8ІK|?l1SE@@Dp *+ *+'/9ІK|?l1SE@@Do *+ *+'/:ІK4}?l1SE@@Dn *+ *+'/;ІKv}?l1SE@@Dm *+ *+'/<ІK}?l1SE@@Dl *+ *+'/=ІK~?l1SE@@Dk *+ *+'/>ІKY~?l1SE@@Dj *+ *+'/?ІK~?l1SE@@Di *+ *+'/@ІK~?l1SE@@Dh *+ *+'/AІKW?l1SE@@Dg *+ *+'/BІK?l1SE @@Df *+ *+'/CІK?l1SE!@@De *+ *+'/DІK:?l1SE"@@Dd *+ *+'/EІK{?l1SE#@@Dc *+ *+'/FІK?l1SE$@@Db *+ *+'/GІK?l1SE%@@Da *+ *+'/HІK^?l1SE&@@D` *+ *+'/IІK?l1SE'@@D_ *+ *+'/JІK?l1SE(@@D^ *+ *+'/KІK??l1SE)@@D] *+ *+'/LІK?l1SE*@@D\ *+ *+'/MІK߂?l1SE+@@D[ *+ *+'/NІK>?l1SE,@@DZ *+ *+'/OІK?l1SE-@@DY *+ *+'/PІK?l1SE.@@DX *+ *+'/QІK ?l1SE/@@DW *+ *+'/RІKa?l1SE0@@DV *+ *+'/SІK?l1SE1@@DU *+ *+'/TІK?l1SE2@@DT *+ *+'/UІKD?l1SE3@@DS *+ *+'/VІK?l1SE4@@DR *+ *+'/WІK?l1SE5@@DQ *+ *+'/XІK&?l1SE6@@DP *+ *+'/YІK?l1SE7@@DO *+ *+'/ZІKƆ?l1SE8@@DN *+ *+'/[ІK?l1SE9@@DM *+ *+'/\ІKf?l1SE:@@DL *+ *+'/]ІK?l1SE;@@DK *+ *+'/^ІK?l1SE<@@DJ *+ *+'/_ІKH?l1SE=@@DI *+ *+'/`ІK?l1SE>@@DH *+ *+'/aІK?l1SE?@@DG *+ *+'/bІK+?l1SE@@@DF *+ *+'/cІK?l1SEA@@DE *+ *+'/dІKˉ?l1SEB@@DD *+ *+'/eІK ?l1SEC@@DC *+ *+'/fІKk?l1SED@@DB *+ *+'/gІK?l1SEE@@DA *+ *+'/hІK?l1SEF@@D@ *+ *+'/iІKL?l1SEG@@D? *+ *+'/jІK?l1SEH@@D> *+ *+'/kІK?l1SEI@@D= *+ *+'/lІK/?l1SEJ@@D< *+ *+'/mІKq?l1SEK@@D; *+ *+'/nІKό?l1SEL@@D: *+ *+'/oІK?l1SEM@@D9 *+ *+'/pІKR?l1SEN@@D8 *+ *+'/qІK?l1SEO@@D7 *+ *+'/rІK?l1SEP@@D6 *+ *+'/sІKQ?l1SEQ@@D5 *+ *+'/tІK?l1SER@@D4 *+ *+'/uІKՎ?l1SES@@D3 *+ *+'/vІK3?l1SET@@D2 *+ *+'/wІKu?l1SEU@@D1 *+ *+'/xІK?l1SEV@@D0 *+ *+'/yІK?l1SEW@@D/ *+ *+'/zІKW?l1SEX@@D. *+ *+'/{ІK?l1SEY@@D- *+ *+'/|ІK?l1SEZ@@D, *+ *+'/}ІK9?l1SE[@@D+ *+ *+'/~ІK?l1SE\@@D* *+ *+'/ІKّ?l1SE]@@D) *+ *+'/ІK8?l1SE^@@D( *+ *+'/ІKz?l1SE_@@D' *+ *+'/ІK?l1SE`@@D& *+ *+'/ІK?l1SEa@@D% *+ *+'/ІK\?l1SEb@@D$ *+ *+'/ІK?l1SEc@@D# *+ *+'/ІKГ  ?l1SEd@@E& *+ *+'/ІK֓<<?l1SE,e@@E *+ *+'/@UUІK VV?l1SEHf@@E *+ *+'40!1@ІK¦?l1SEg@@D *+ *+'0ІK?l1SEh@@D *+ *+'0ІKb?l1SEi@@D *+ *+'0ІK?l1SEj@@D *+ *+'0ІK?l1SEk@@D *+ *+'0ІKD?l1SEl@@D *+ *+'0ІK?l1SEm@@D *+ *+'0ІK?l1SEn@@D *+ *+'0ІK&?l1SEo@@D *+ *+'0 ІKh?l1SEp@@D *+ *+'0 ІKƩ?l1SEq@@D *+ *+'0 ІK?l1SEr@@D *+ *+'0 ІKJ?l1SEs@@D *+ *+'0 ІK?l1SEt@@D *+ *+'0ІK?l1SEu@@D *+ *+'0ІKI?l1SEv@@D *+ *+'0ІK?l1SEw@@D *+ *+'0ІK̫?l1SEx@@D *+ *+'0ІK+?l1SEy@@D *+ *+'0ІKm?l1SEz@@D *+ *+'0ІK?l1SE{@@D *+ *+'0ІK ?l1SE|@@D *+ *+'0ІKN?l1SE}@@D *+ *+'0ІK?l1SE~@@D *+ *+'0ІK?l1SE@@D *+ *+'0ІK0?l1SE@@D *+ *+'0ІK?l1SE@@D *+ *+'0ІKѮ?l1SE@@D *+ *+'0ІK/?l1SE@@D *+ *+'0ІKq?l1SE@@D *+ *+'0ІK?l1SE@@D *+ *+'0ІK?l1SE@@D *+ *+'0 ІKS?l1SE@@C *+ *+'0!ІK?l1SE@@C *+ *+'0"ІK?l1SE@@C *+ *+'0#ІK5?l1SE@@C *+ *+'0$ІK?l1SE@@C *+ *+'0%ІKֱ?l1SE@@C *+ *+'0&ІK?l1SE@@C *+ *+'0'ІKw?l1SE@@C *+ *+'0(ІK?l1SE@@C *+ *+'0)ІK?l1SE@@C *+ *+'0*ІKX?l1SE@@C *+ *+'0+ІK?l1SE@@C *+ *+'0,ІK?l1SE@@C *+ *+'0-ІK:?l1SE@@C *+ *+'0.ІK|?l1SE@@C *+ *+'0/ІKڴ?l1SE@@C *+ *+'00ІK?l1SE@@C *+ *+'01ІK{?l1SE@@C *+ *+'02ІK?l1SE@@C *+ *+'03ІK?l1SE@@C *+ *+'04ІK]?l1SE@@C *+ *+'05ІK?l1SE@@C *+ *+'06ІK?l1SE@@C *+ *+'07ІK>?l1SE@@C *+ *+'08ІK?l1SE@@C *+ *+'09ІK޷?l1SE@@C *+ *+'0:ІK?l1SE@@C *+ *+'0;ІKb?l1SE@@C *+ *+'0<ІK?l1SE@@C *+ *+'0=ІK?l1SE@@C *+ *+'0>ІKD?l1SE@@C *+ *+'0?ІK?l1SE@@C *+ *+'0@ІK?l1SE@@C *+ *+'0AІKC?l1SE@@C *+ *+'0BІK?l1SE@@C *+ *+'0CІKƺ?l1SE@@C *+ *+'0DІK%?l1SE@@C *+ *+'0EІKg?l1SE@@C *+ *+'0FІK?l1SE@@C *+ *+'0GІK?l1SE@@C *+ *+'0HІKI?l1SE@@C *+ *+'0IІK?l1SE@@C *+ *+'0JІK?l1SE@@C *+ *+'0KІK*?l1SE@@C *+ *+'0LІK?l1SE@@C *+ *+'0MІKʽ?l1SE@@C *+ *+'0NІK)?l1SE@@C *+ *+'0OІKk?l1SE@@C *+ *+'0PІK?l1SE@@C *+ *+'0QІK ?l1SE@@C *+ *+'0RІKM?l1SE@@C *+ *+'0SІK?l1SE@@C *+ *+'0TІK?l1SE@@C *+ *+'0UІK/?l1SE@@C *+ *+'0VІK?l1SE@@C *+ *+'0WІK?l1SE@@C *+ *+'0XІK?l1SE@@C *+ *+'0YІKo?l1SE@@C *+ *+'0ZІK?l1SE@@C *+ *+'0[ІK?l1SE@@C *+ *+'0\ІKR?l1SE@@C *+ *+'0]ІK?l1SE@@C *+ *+'0^ІK?l1SE@@C *+ *+'0_ІK4?l1SE@@C *+ *+'0`ІKu?l1SE@@C *+ *+'0aІK?l1SE@@C *+ *+'0bІK?l1SE@@C *+ *+'0cІKt?l1SE@@C *+ *+'0dІK?l1SE@@C *+ *+'0eІK?l1SE@@C *+ *+'0fІKV?l1SE@@C *+ *+'0gІK?l1SE@@C *+ *+'0hІK?l1SE@@C *+ *+'0iІK9?l1SE@@C *+ *+'0jІKz?l1SE@@C *+ *+'0kІK?l1SE@@C *+ *+'0lІK?l1SE@@C *+ *+'0mІK\?l1SE@@C *+ *+'0nІK?l1SE@@C *+ *+'0oІK?l1SE@@C *+ *+'0pІK??l1SE@@C *+ *+'0qІK?l1SE@@C *+ *+'0rІK?l1SE@@C *+ *+'0sІK=?l1SE@@C *+ *+'0tІK?l1SE@@C *+ *+'0uІK?l1SE@@C *+ *+'0vІK?l1SE@@C *+ *+'0wІKa?l1SE@@C *+ *+'0xІK?l1SE@@C *+ *+'0yІK?l1SE@@C *+ *+'0zІKC?l1SE@@C *+ *+'0{ІK?l1SE@@C *+ *+'0|ІK?l1SE@@C *+ *+'0}ІK%?l1SE@@C *+ *+'0~ІK?l1SE@@C *+ *+'0ІK?l1SE@@C *+ *+'0ІK$?l1SE@@C *+ *+'0ІKe?l1SE@@C *+ *+'0ІK?l1SE@@C *+ *+'0ІK?l1SE@@C *+ *+'0ІKG?l1SE@@C *+ *+'0ІK?l1SE@@C *+ *+'0ІK  ?l1SE@@D *+ *+'0ІK<<?l1SE,@@El *+ *+'0@UUІKVV?l1SEH@@EO *+ *+'41!߾6@ІK{?l1SE@@C *+ *+'1ІK?l1SE@@C *+ *+'1ІK?l1SE@@C *+ *+'1ІK]?l1SE@@C *+ *+'1ІK?l1SE@@C *+ *+'1ІK?l1SE@@C *+ *+'1ІK??l1SE@@C *+ *+'1ІK?l1SE@@C *+ *+'1ІK?l1SE@@C *+ *+'1 ІK"?l1SE@@C *+ *+'1 ІK?l1SE@@C *+ *+'1 ІK?l1SE@@C *+ *+'1 ІK?l1SE@@C *+ *+'1 ІKa?l1SE@@C *+ *+'1ІK?l1SE@@C *+ *+'1ІK?l1SE@@C *+ *+'1ІKD?l1SE@@C *+ *+'1ІK?l1SE@@C *+ *+'1ІK?l1SE@@C *+ *+'1ІK&?l1SE@@C *+ *+'1ІKg?l1SE@@C *+ *+'1ІK?l1SE@@C *+ *+'1ІK?l1SE@@C *+ *+'1ІKf?l1SE@@C *+ *+'1ІK?l1SE@@C~ *+ *+'1ІK?l1SE @@C} *+ *+'1ІKI?l1SE @@C| *+ *+'1ІK?l1SE @@C{ *+ *+'1ІK?l1SE @@Cz *+ *+'1ІK*?l1SE @@Cy *+ *+'1ІKl?l1SE@@Cx *+ *+'1ІK?l1SE@@Cw *+ *+'1 ІK ?l1SE@@Cv *+ *+'1!ІKO?l1SE@@Cu *+ *+'1"ІK?l1SE@@Ct *+ *+'1#ІK?l1SE@@Cs *+ *+'1$ІKM?l1SE@@Cr *+ *+'1%ІK?l1SE@@Cq *+ *+'1&ІK?l1SE@@Cp *+ *+'1'ІK/?l1SE@@Co *+ *+'1(ІKp?l1SE@@Cn *+ *+'1)ІK?l1SE@@Cm *+ *+'1*ІK?l1SE@@Cl *+ *+'1+ІKS?l1SE@@Ck *+ *+'1,ІK?l1SE@@Cj *+ *+'1-ІK?l1SE@@Ci *+ *+'1.ІK5?l1SE@@Ch *+ *+'1/ІK?l1SE@@Cg *+ *+'10ІK?l1SE @@Cf *+ *+'11ІK4?l1SE!@@Ce *+ *+'12ІKu?l1SE"@@Cd *+ *+'13ІK?l1SE#@@Cc *+ *+'14ІK?l1SE$@@Cb *+ *+'15ІKW?l1SE%@@Ca *+ *+'16ІK?l1SE&@@C` *+ *+'17ІK?l1SE'@@C_ *+ *+'18ІK:?l1SE(@@C^ *+ *+'19ІK?l1SE)@@C] *+ *+'1:ІK?l1SE*@@C\ *+ *+'1;ІK?l1SE+@@C[ *+ *+'1<ІKz?l1SE,@@CZ *+ *+'1=ІK?l1SE-@@CY *+ *+'1>ІK?l1SE.@@CX *+ *+'1?ІK\?l1SE/@@CW *+ *+'1@ІK?l1SE0@@CV *+ *+'1AІK?l1SE1@@CU *+ *+'1BІK??l1SE2@@CT *+ *+'1CІK?l1SE3@@CS *+ *+'1DІK?l1SE4@@CR *+ *+'1EІK ?l1SE5@@CQ *+ *+'1FІKa?l1SE6@@CP *+ *+'1GІK?l1SE7@@CO *+ *+'1HІK?l1SE8@@CN *+ *+'1IІK`?l1SE9@@CM *+ *+'1JІK?l1SE:@@CL *+ *+'1KІK?l1SE;@@CK *+ *+'1LІKC?l1SE<@@CJ *+ *+'1MІK?l1SE=@@CI *+ *+'1NІK?l1SE>@@CH *+ *+'1OІK%?l1SE?@@CG *+ *+'1PІKf?l1SE@@@CF *+ *+'1QІK?l1SEA@@CE *+ *+'1RІK?l1SEB@@CD *+ *+'1SІKG?l1SEC@@CC *+ *+'1TІK?l1SED@@CB *+ *+'1UІK?l1SEE@@CA *+ *+'1VІKF?l1SEF@@C@ *+ *+'1WІK?l1SEG@@C? *+ *+'1XІK?l1SEH@@C> *+ *+'1YІK)?l1SEI@@C= *+ *+'1ZІKk?l1SEJ@@C< *+ *+'1[ІK?l1SEK@@C; *+ *+'1\ІK ?l1SEL@@C: *+ *+'1]ІKM?l1SEM@@C9 *+ *+'1^ІK?l1SEN@@C8 *+ *+'1_ІK?l1SEO@@C7 *+ *+'1`ІK-?l1SEP@@C6 *+ *+'1aІK?l1SEQ@@C5 *+ *+'1bІK?l1SER@@C4 *+ *+'1cІK.?l1SES@@C3 *+ *+'1dІKp?l1SET@@C2 *+ *+'1eІK?l1SEU@@C1 *+ *+'1fІK?l1SEV@@C0 *+ *+'1gІKQ?l1SEW@@C/ *+ *+'1hІK?l1SEX@@C. *+ *+'1iІK?l1SEY@@C- *+ *+'1jІK3?l1SEZ@@C, *+ *+'1kІK?l1SE[@@C+ *+ *+'1lІK?l1SE\@@C* *+ *+'1mІK?l1SE]@@C) *+ *+'1nІKt?l1SE^@@C( *+ *+'1oІK?l1SE_@@C' *+ *+'1pІK?l1SE`@@C& *+ *+'1qІKW?l1SEa@@C% *+ *+'1rІK?l1SEb@@C$ *+ *+'1sІK?l1SEc@@C# *+ *+'1tІK7?l1SEd@@C" *+ *+'1uІKy?l1SEe@@C! *+ *+'1vІK?l1SEf@@C *+ *+'1wІK?l1SEg@@C *+ *+'1xІK\?l1SEh@@C *+ *+'1yІK?l1SEi@@C *+ *+'1zІK?l1SEj@@C *+ *+'1{ІK[?l1SEk@@C *+ *+'1|ІK?l1SEl@@C *+ *+'1}ІK?l1SEm@@C *+ *+'1~ІK=?l1SEn@@C *+ *+'1ІK~?l1SEo@@C *+ *+'1ІK?l1SEp@@C *+ *+'1ІK?l1SEq@@C *+ *+'1ІKb?l1SEr@@C *+ *+'1ІK?l1SEs@@C *+ *+'1ІK ?l1SEt@@C *+ *+'1ІKB ?l1SEu@@C *+ *+'1ІKu   ?l1SEv@@D *+ *+'1ІK| <<?l1SE,w@@D *+ *+'1@UUІKVV?l1SEHx@@D *+ *+'42!S@ІKc?l1SEy@@C *+ *+'2ІK?l1SEz@@C *+ *+'2ІK?l1SE{@@C *+ *+'2ІKD?l1SE|@@C *+ *+'2ІK?l1SE}@@C *+ *+'2ІK?l1SE~@@C *+ *+'2ІK&?l1SE@@C *+ *+'2ІK?l1SE@@C *+ *+'2ІK?l1SE@@C *+ *+'2 ІK ?l1SE@@C *+ *+'2 ІKg?l1SE@@C *+ *+'2 ІK?l1SE@@C *+ *+'2 ІK?l1SE@@C *+ *+'2 ІKI ?l1SE@@C *+ *+'2ІK ?l1SE@@B *+ *+'2ІK ?l1SE@@B *+ *+'2ІK,!?l1SE@@B *+ *+'2ІKm!?l1SE@@B *+ *+'2ІK!?l1SE@@B *+ *+'2ІK"?l1SE@@B *+ *+'2ІKN"?l1SE@@B *+ *+'2ІK"?l1SE@@B *+ *+'2ІK"?l1SE@@B *+ *+'2ІKN#?l1SE@@B *+ *+'2ІK#?l1SE@@B *+ *+'2ІK#?l1SE@@B *+ *+'2ІK0$?l1SE@@B *+ *+'2ІKr$?l1SE@@B *+ *+'2ІK$?l1SE@@B *+ *+'2ІK%?l1SE@@B *+ *+'2ІK[%?l1SE@@B *+ *+'2ІK%?l1SE@@B *+ *+'2 ІK%?l1SE@@B *+ *+'2!ІK5&?l1SE@@B *+ *+'2"ІK&?l1SE@@B *+ *+'2#ІK&?l1SE@@B *+ *+'2$ІK4'?l1SE@@B *+ *+'2%ІKw'?l1SE@@B *+ *+'2&ІK'?l1SE@@B *+ *+'2'ІK(?l1SE@@B *+ *+'2(ІKX(?l1SE@@B *+ *+'2)ІK(?l1SE@@B *+ *+'2*ІK(?l1SE@@B *+ *+'2+ІK:)?l1SE@@B *+ *+'2,ІK)?l1SE@@B *+ *+'2-ІK)?l1SE@@B *+ *+'2.ІK*?l1SE@@B *+ *+'2/ІKz*?l1SE@@B *+ *+'20ІK*?l1SE@@B *+ *+'21ІK+?l1SE@@B *+ *+'22ІK]+?l1SE@@B *+ *+'23ІK+?l1SE@@B *+ *+'24ІK+?l1SE@@B *+ *+'25ІK?,?l1SE@@B *+ *+'26ІK,?l1SE@@B *+ *+'27ІK,?l1SE@@B *+ *+'28ІK!-?l1SE@@B *+ *+'29ІK-?l1SE@@B *+ *+'2:ІK-?l1SE@@B *+ *+'2;ІK.?l1SE@@B *+ *+'2<ІKa.?l1SE@@B *+ *+'2=ІK.?l1SE@@B *+ *+'2>ІK.?l1SE@@B *+ *+'2?ІKD/?l1SE@@B *+ *+'2@ІK/?l1SE@@B *+ *+'2AІK/?l1SE@@B *+ *+'2BІK%0?l1SE@@B *+ *+'2CІKf0?l1SE@@B *+ *+'2DІK0?l1SE@@B *+ *+'2EІK1?l1SE@@B *+ *+'2FІKJ1?l1SE@@B *+ *+'2GІK1?l1SE@@B *+ *+'2HІK1?l1SE@@B *+ *+'2IІKI2?l1SE@@B *+ *+'2JІK2?l1SE@@B *+ *+'2KІK2?l1SE@@B *+ *+'2LІK*3?l1SE@@B *+ *+'2MІKk3?l1SE@@B *+ *+'2NІK3?l1SE@@B *+ *+'2OІK 4?l1SE@@B *+ *+'2PІKN4?l1SE@@B *+ *+'2QІK4?l1SE@@B *+ *+'2RІK4?l1SE@@B *+ *+'2SІK05?l1SE@@B *+ *+'2TІK5?l1SE@@B *+ *+'2UІK5?l1SE@@B *+ *+'2VІK.6?l1SE@@B *+ *+'2WІKp6?l1SE@@B *+ *+'2XІK6?l1SE@@B *+ *+'2YІK7?l1SE@@B *+ *+'2ZІKR7?l1SE@@B *+ *+'2[ІK7?l1SE@@B *+ *+'2\ІK7?l1SE@@B *+ *+'2]ІK48?l1SE@@B *+ *+'2^ІK8?l1SE@@B *+ *+'2_ІK8?l1SE@@B *+ *+'2`ІK9?l1SE@@B *+ *+'2aІKu9?l1SE@@B *+ *+'2bІK9?l1SE@@B *+ *+'2cІK:?l1SE@@B *+ *+'2dІKW:?l1SE@@B *+ *+'2eІK:?l1SE@@B *+ *+'2fІK:?l1SE@@B *+ *+'2gІK9;?l1SE@@B *+ *+'2hІKz;?l1SE@@B *+ *+'2iІK;?l1SE@@B *+ *+'2jІK<?l1SE@@B *+ *+'2kІKy<?l1SE@@B *+ *+'2lІK<?l1SE@@B *+ *+'2mІK<?l1SE@@B *+ *+'2nІK[=?l1SE@@B *+ *+'2oІK=?l1SE@@B *+ *+'2pІK=?l1SE@@B *+ *+'2qІK=>?l1SE@@B *+ *+'2rІK>?l1SE@@B *+ *+'2sІK>?l1SE@@B *+ *+'2tІK ??l1SE@@B *+ *+'2uІKb??l1SE@@B *+ *+'2vІK??l1SE@@B *+ *+'2wІK@?l1SE@@B *+ *+'2xІKC@?l1SE@@B *+ *+'2yІK@?l1SE@@B *+ *+'2zІK@?l1SE@@B *+ *+'2{ІKBA?l1SE@@B *+ *+'2|ІKA?l1SE@@B *+ *+'2}ІKA?l1SE@@B *+ *+'2~ІK$B?l1SE@@B *+ *+'2ІKeB?l1SE@@B *+ *+'2ІKB?l1SE@@B *+ *+'2ІKC?l1SE@@B *+ *+'2ІKGC?l1SE@@B *+ *+'2ІKC?l1SE@@B *+ *+'2ІKC?l1SE@@B *+ *+'2ІK*D?l1SE@@B *+ *+'2ІK\D  ?l1SE@@C *+ *+'2ІKcD<<?l1SE,@@DZ *+ *+'2@UUІKzVVV?l1SEH@@D= *+ *+'43! @ІK-W?l1SE@@B *+ *+'3ІKoW?l1SE@@B *+ *+'3ІKW?l1SE@@B *+ *+'3ІKX?l1SE@@B *+ *+'3ІKRX?l1SE@@B *+ *+'3ІKX?l1SE@@B *+ *+'3ІKX?l1SE@@B~ *+ *+'3ІKQY?l1SE @@B} *+ *+'3ІKY?l1SE @@B| *+ *+'3 ІKY?l1SE @@B{ *+ *+'3 ІK2Z?l1SE @@Bz *+ *+'3 ІKtZ?l1SE @@By *+ *+'3 ІKZ?l1SE@@Bx *+ *+'3 ІK[?l1SE@@Bw *+ *+'3ІKV[?l1SE@@Bv *+ *+'3ІK[?l1SE@@Bu *+ *+'3ІK[?l1SE@@Bt *+ *+'3ІK8\?l1SE@@Bs *+ *+'3ІK\?l1SE@@Br *+ *+'3ІK\?l1SE@@Bq *+ *+'3ІK]?l1SE@@Bp *+ *+'3ІKy]?l1SE@@Bo *+ *+'3ІK]?l1SE@@Bn *+ *+'3ІK^?l1SE@@Bm *+ *+'3ІK[^?l1SE@@Bl *+ *+'3ІK^?l1SE@@Bk *+ *+'3ІK^?l1SE@@Bj *+ *+'3ІK<_?l1SE@@Bi *+ *+'3ІK_?l1SE@@Bh *+ *+'3ІK_?l1SE@@Bg *+ *+'3ІK`?l1SE @@Bf *+ *+'3ІK}`?l1SE!@@Be *+ *+'3 ІK`?l1SE"@@Bd *+ *+'3!ІKa?l1SE#@@Bc *+ *+'3"ІK`a?l1SE$@@Bb *+ *+'3#ІKa?l1SE%@@Ba *+ *+'3$ІKb?l1SE&@@B` *+ *+'3%ІKAb?l1SE'@@B_ *+ *+'3&ІKb?l1SE(@@B^ *+ *+'3'ІKb?l1SE)@@B] *+ *+'3(ІK#c?l1SE*@@B\ *+ *+'3)ІKfc?l1SE+@@B[ *+ *+'3*ІKc?l1SE,@@BZ *+ *+'3+ІKd?l1SE-@@BY *+ *+'3,ІKcd?l1SE.@@BX *+ *+'3-ІKd?l1SE/@@BW *+ *+'3.ІKd?l1SE0@@BV *+ *+'3/ІKFe?l1SE1@@BU *+ *+'30ІKe?l1SE2@@BT *+ *+'31ІKe?l1SE3@@BS *+ *+'32ІK(f?l1SE4@@BR *+ *+'33ІKjf?l1SE5@@BQ *+ *+'34ІKf?l1SE6@@BP *+ *+'35ІK g?l1SE7@@BO *+ *+'36ІKMg?l1SE8@@BN *+ *+'37ІKg?l1SE9@@BM *+ *+'38ІKg?l1SE:@@BL *+ *+'39ІKKh?l1SE;@@BK *+ *+'3:ІKh?l1SE<@@BJ *+ *+'3;ІKh?l1SE=@@BI *+ *+'3<ІK,i?l1SE>@@BH *+ *+'3=ІKni?l1SE?@@BG *+ *+'3>ІKi?l1SE@@@BF *+ *+'3?ІKj?l1SEA@@BE *+ *+'3@ІKPj?l1SEB@@BD *+ *+'3AІKj?l1SEC@@BC *+ *+'3BІKj?l1SED@@BB *+ *+'3CІK2k?l1SEE@@BA *+ *+'3DІKk?l1SEF@@B@ *+ *+'3EІKk?l1SEG@@B? *+ *+'3FІKl?l1SEH@@B> *+ *+'3GІKsl?l1SEI@@B= *+ *+'3HІKl?l1SEJ@@B< *+ *+'3IІKm?l1SEK@@B; *+ *+'3JІKTm?l1SEL@@B: *+ *+'3KІKm?l1SEM@@B9 *+ *+'3LІKm?l1SEN@@B8 *+ *+'3MІK7n?l1SEO@@B7 *+ *+'3NІKn?l1SEP@@B6 *+ *+'3OІKn?l1SEQ@@B5 *+ *+'3PІKo?l1SER@@B4 *+ *+'3QІKwo?l1SES@@B3 *+ *+'3RІKo?l1SET@@B2 *+ *+'3SІKo?l1SEU@@B1 *+ *+'3TІKYp?l1SEV@@B0 *+ *+'3UІKp?l1SEW@@B/ *+ *+'3VІKp?l1SEX@@B. *+ *+'3WІK?l1SE@@A *+ *+'4ІK?l1SE@@A *+ *+'4ІKޖ?l1SE@@A *+ *+'4ІK ?l1SE@@A *+ *+'4ІK?l1SE@@A *+ *+'4ІK?l1SE@@A *+ *+'4ІK?l1SE@@A *+ *+'4ІK`?l1SE@@A *+ *+'4ІK?l1SE@@A *+ *+'4ІK?l1SE@@A *+ *+'4ІKC?l1SE@@A *+ *+'4ІK?l1SE@@A *+ *+'4ІK?l1SE@@A *+ *+'4ІK%?l1SE@@A *+ *+'4ІK?l1SE@@A *+ *+'4ІKŚ?l1SE@@A *+ *+'4ІK?l1SE@@A *+ *+'4ІKe?l1SE@@A *+ *+'4 ІK?l1SE@@A *+ *+'4!ІK?l1SE@@A *+ *+'4"ІKG?l1SE@@A *+ *+'4#ІK?l1SE@@A *+ *+'4$ІK?l1SE@@A *+ *+'4%ІK)?l1SE@@A *+ *+'4&ІKk?l1SE@@A *+ *+'4'ІKʝ?l1SE@@A *+ *+'4(ІK ?l1SE@@A *+ *+'4)ІKL?l1SE@@A *+ *+'4*ІK?l1SE@@A *+ *+'4+ІK?l1SE@@A *+ *+'4,ІKL?l1SE@@A *+ *+'4-ІK?l1SE@@A *+ *+'4.ІKП?l1SE@@A *+ *+'4/ІK-?l1SE@@A *+ *+'40ІKo?l1SE@@A *+ *+'41ІKϠ?l1SE@@A *+ *+'42ІK?l1SE@@A *+ *+'43ІKQ?l1SE@@A *+ *+'44ІK?l1SE@@A *+ *+'45ІK?l1SE@@A *+ *+'46ІK3?l1SE@@A *+ *+'47ІK?l1SE@@A *+ *+'48ІKԢ?l1SE@@A *+ *+'49ІK2?l1SE@@A *+ *+'4:ІKu?l1SE@@A *+ *+'4;ІK?l1SE@@A *+ *+'4<ІK?l1SE@@A *+ *+'4=ІKW?l1SE@@A *+ *+'4>ІK?l1SE@@A *+ *+'4?ІK?l1SE@@A *+ *+'4@ІK7?l1SE@@A *+ *+'4AІK?l1SE@@A *+ *+'4BІKإ?l1SE@@A *+ *+'4CІK?l1SE@@A *+ *+'4DІKx?l1SE@@A *+ *+'4EІK?l1SE@@A *+ *+'4FІK?l1SE@@A *+ *+'4GІK[?l1SE@@A *+ *+'4HІK?l1SE@@A *+ *+'4IІK?l1SE@@A *+ *+'4JІK=?l1SE@@A *+ *+'4KІK~?l1SE@@A *+ *+'4LІKܨ?l1SE@@A *+ *+'4MІK?l1SE@@A *+ *+'4NІK}?l1SE@@A *+ *+'4OІK?l1SE@@A *+ *+'4PІK?l1SE@@A *+ *+'4QІK`?l1SE@@A *+ *+'4RІK?l1SE@@A *+ *+'4SІK?l1SE@@A *+ *+'4TІKA?l1SE@@A *+ *+'4UІK?l1SE@@A *+ *+'4VІK?l1SE@@A *+ *+'4WІK"?l1SE@@A *+ *+'4XІKe?l1SE@@A *+ *+'4YІKì?l1SE@@A *+ *+'4ZІK?l1SE@@A *+ *+'4[ІKG?l1SE@@A *+ *+'4\ІK?l1SE@@A *+ *+'4]ІK?l1SE@@A *+ *+'4^ІKF?l1SE@@A *+ *+'4_ІK?l1SE@@A *+ *+'4`ІKɮ?l1SE@@A *+ *+'4aІK'?l1SE@@A *+ *+'4bІKi?l1SE@@A *+ *+'4cІKǯ?l1SE@@A *+ *+'4dІK ?l1SE@@A *+ *+'4eІKK?l1SE@@A *+ *+'4fІK?l1SE@@A *+ *+'4gІK?l1SE@@A *+ *+'4hІK.?l1SE@@A *+ *+'4iІK?l1SE@@A *+ *+'4jІKα?l1SE@@A *+ *+'4kІK,?l1SE@@A *+ *+'4lІKn?l1SE@@A *+ *+'4mІK?l1SE@@A *+ *+'4nІK?l1SE@@A *+ *+'4oІKP?l1SE@@A *+ *+'4pІK?l1SE@@A *+ *+'4qІK?l1SE@@A *+ *+'4rІK1?l1SE@@A *+ *+'4sІK?l1SE@@A *+ *+'4tІKҴ?l1SE@@A *+ *+'4uІK?l1SE@@A *+ *+'4vІKr?l1SE@@A *+ *+'4wІK?l1SE@@A *+ *+'4xІK?l1SE@@A *+ *+'4yІKU?l1SE@@A *+ *+'4zІK?l1SE@@A *+ *+'4{ІK?l1SE@@A *+ *+'4|ІK7?l1SE@@A *+ *+'4}ІKx?l1SE@@A~ *+ *+'4~ІK׷?l1SE @@A} *+ *+'4ІK?l1SE @@A| *+ *+'4ІKw?l1SE @@A{ *+ *+'4ІK?l1SE @@Az *+ *+'4ІK?l1SE @@Ay *+ *+'4ІKX?l1SE@@Ax *+ *+'4ІK?l1SE@@Aw *+ *+'4ІKܹ?l1SE@@Av *+ *+'4ІK  ?l1SE@@By *+ *+'4ІK<<?l1SE,@@CH *+ *+'4@UUІK*VV?l1SEH@@C+ *+ *+'45!@ІK?l1SE@@Ar *+ *+'5ІK"?l1SE@@Aq *+ *+'5ІK?l1SE@@Ap *+ *+'5ІK?l1SE@@Ao *+ *+'5ІK?l1SE@@An *+ *+'5ІKb?l1SE@@Am *+ *+'5ІK?l1SE@@Al *+ *+'5ІK?l1SE@@Ak *+ *+'5ІKE?l1SE@@Aj *+ *+'5 ІK?l1SE@@Ai *+ *+'5 ІK?l1SE@@Ah *+ *+'5 ІK'?l1SE@@Ag *+ *+'5 ІKi?l1SE @@Af *+ *+'5 ІK?l1SE!@@Ae *+ *+'5ІK ?l1SE"@@Ad *+ *+'5ІKh?l1SE#@@Ac *+ *+'5ІK?l1SE$@@Ab *+ *+'5ІK?l1SE%@@Aa *+ *+'5ІKI?l1SE&@@A` *+ *+'5ІK?l1SE'@@A_ *+ *+'5ІK?l1SE(@@A^ *+ *+'5ІK,?l1SE)@@A] *+ *+'5ІKm?l1SE*@@A\ *+ *+'5ІK?l1SE+@@A[ *+ *+'5ІK ?l1SE,@@AZ *+ *+'5ІKO?l1SE-@@AY *+ *+'5ІK?l1SE.@@AX *+ *+'5ІK?l1SE/@@AW *+ *+'5ІKN?l1SE0@@AV *+ *+'5ІK?l1SE1@@AU *+ *+'5ІK?l1SE2@@AT *+ *+'5ІK/?l1SE3@@AS *+ *+'5 ІKs?l1SE4@@AR *+ *+'5!ІK?l1SE5@@AQ *+ *+'5"ІK?l1SE6@@AP *+ *+'5#ІKT?l1SE7@@AO *+ *+'5$ІK?l1SE8@@AN *+ *+'5%ІK?l1SE9@@AM *+ *+'5&ІK5?l1SE:@@AL *+ *+'5'ІK?l1SE;@@AK *+ *+'5(ІK?l1SE<@@AJ *+ *+'5)ІK?l1SE=@@AI *+ *+'5*ІKw?l1SE>@@AH *+ *+'5+ІK?l1SE?@@AG *+ *+'5,ІK?l1SE@@@AF *+ *+'5-ІKY?l1SEA@@AE *+ *+'5.ІK?l1SEB@@AD *+ *+'5/ІK?l1SEC@@AC *+ *+'50ІK:?l1SED@@AB *+ *+'51ІK?l1SEE@@AA *+ *+'52ІK?l1SEF@@A@ *+ *+'53ІK?l1SEG@@A? *+ *+'54ІKz?l1SEH@@A> *+ *+'55ІK?l1SEI@@A= *+ *+'56ІK?l1SEJ@@A< *+ *+'57ІK]?l1SEK@@A; *+ *+'58ІK?l1SEL@@A: *+ *+'59ІK?l1SEM@@A9 *+ *+'5:ІK??l1SEN@@A8 *+ *+'5;ІK?l1SEO@@A7 *+ *+'5<ІK?l1SEP@@A6 *+ *+'5=ІK!?l1SEQ@@A5 *+ *+'5>ІKd?l1SER@@A4 *+ *+'5?ІK?l1SES@@A3 *+ *+'5@ІK?l1SET@@A2 *+ *+'5AІKa?l1SEU@@A1 *+ *+'5BІK?l1SEV@@A0 *+ *+'5CІK?l1SEW@@A/ *+ *+'5DІKD?l1SEX@@A. *+ *+'5EІK?l1SEY@@A- *+ *+'5FІK?l1SEZ@@A, *+ *+'5GІK%?l1SE[@@A+ *+ *+'5HІKg?l1SE\@@A* *+ *+'5IІK?l1SE]@@A) *+ *+'5JІK?l1SE^@@A( *+ *+'5KІKI?l1SE_@@A' *+ *+'5LІK?l1SE`@@A& *+ *+'5MІK?l1SEa@@A% *+ *+'5NІKH?l1SEb@@A$ *+ *+'5OІK?l1SEc@@A# *+ *+'5PІK?l1SEd@@A" *+ *+'5QІK*?l1SEe@@A! *+ *+'5RІKk?l1SEf@@A *+ *+'5SІK?l1SEg@@A *+ *+'5TІK ?l1SEh@@A *+ *+'5UІKN?l1SEi@@A *+ *+'5VІK?l1SEj@@A *+ *+'5WІK?l1SEk@@A *+ *+'5XІK/?l1SEl@@A *+ *+'5YІK?l1SEm@@A *+ *+'5ZІK?l1SEn@@A *+ *+'5[ІK?l1SEo@@A *+ *+'5\ІKp?l1SEp@@A *+ *+'5]ІK?l1SEq@@A *+ *+'5^ІK?l1SEr@@A *+ *+'5_ІKR?l1SEs@@A *+ *+'5`ІK?l1SEt@@A *+ *+'5aІK?l1SEu@@A *+ *+'5bІK5?l1SEv@@A *+ *+'5cІK?l1SEw@@A *+ *+'5dІK?l1SEx@@A *+ *+'5eІK?l1SEy@@A *+ *+'5fІKu?l1SEz@@A *+ *+'5gІK?l1SE{@@A *+ *+'5hІK?l1SE|@@A *+ *+'5iІKW?l1SE}@@A *+ *+'5jІK?l1SE~@@A *+ *+'5kІK?l1SE@@A *+ *+'5lІK:?l1SE@@A *+ *+'5mІK{?l1SE@@A *+ *+'5nІK?l1SE@@A *+ *+'5oІK?l1SE@@A *+ *+'5pІK]?l1SE@@A *+ *+'5qІK?l1SE@@A *+ *+'5rІK?l1SE@@A *+ *+'5sІK]?l1SE@@@ *+ *+'5tІK?l1SE@@@ *+ *+'5uІK?l1SE@@@ *+ *+'5vІK=?l1SE@@@ *+ *+'5wІK?l1SE@@@ *+ *+'5xІK?l1SE@@@ *+ *+'5yІK?l1SE@@@ *+ *+'5zІK`?l1SE@@@ *+ *+'5{ІK?l1SE@@@ *+ *+'5|ІK?l1SE@@@ *+ *+'5}ІKD?l1SE@@@ *+ *+'5~ІK?l1SE@@@ *+ *+'5ІK?l1SE@@@ *+ *+'5ІKB?l1SE@@@ *+ *+'5ІK?l1SE@@@ *+ *+'5ІK?l1SE@@@ *+ *+'5ІK%?l1SE@@@ *+ *+'5ІKf?l1SE@@@ *+ *+'5ІK?l1SE@@@ *+ *+'5ІK  ?l1SE@@A *+ *+'5ІK<<?l1SE,@@B *+ *+'5@UUІKVV?l1SEH@@B *+ *+'46!@ІK?l1SE@@@ *+ *+'6ІK?l1SE@@@ *+ *+'6ІKl?l1SE@@@ *+ *+'6ІK?l1SE@@@ *+ *+'6ІK?l1SE@@@ *+ *+'6ІKN ?l1SE@@@ *+ *+'6ІK ?l1SE@@@ *+ *+'6ІK ?l1SE@@@ *+ *+'6ІK0 ?l1SE@@@ *+ *+'6 ІKr ?l1SE@@@ *+ *+'6 ІK ?l1SE@@@ *+ *+'6 ІK ?l1SE@@@ *+ *+'6 ІKT ?l1SE@@@ *+ *+'6 ІK ?l1SE@@@ *+ *+'6ІK ?l1SE@@@ *+ *+'6ІKR ?l1SE@@@ *+ *+'6ІK ?l1SE@@@ *+ *+'6ІK ?l1SE@@@ *+ *+'6ІK5 ?l1SE@@@ *+ *+'6ІKv ?l1SE@@@ *+ *+'6ІK ?l1SE@@@ *+ *+'6ІK?l1SE@@@ *+ *+'6ІKX?l1SE@@@ *+ *+'6ІK?l1SE@@@ *+ *+'6ІK?l1SE@@@ *+ *+'6ІK;?l1SE@@@ *+ *+'6ІK?l1SE@@@ *+ *+'6ІK?l1SE@@@ *+ *+'6ІK9?l1SE@@@ *+ *+'6ІK{?l1SE@@@ *+ *+'6ІK?l1SE@@@ *+ *+'6ІK?l1SE@@@ *+ *+'6 ІK]?l1SE@@@ *+ *+'6!ІK?l1SE@@@ *+ *+'6"ІK?l1SE@@@ *+ *+'6#ІK??l1SE@@@ *+ *+'6$ІK?l1SE@@@ *+ *+'6%ІK?l1SE@@@ *+ *+'6&ІK!?l1SE@@@ *+ *+'6'ІK?l1SE@@@ *+ *+'6(ІK?l1SE@@@ *+ *+'6)ІK?l1SE@@@ *+ *+'6*ІKb?l1SE@@@ *+ *+'6+ІK?l1SE@@@ *+ *+'6,ІK?l1SE@@@ *+ *+'6-ІKD?l1SE@@@ *+ *+'6.ІK?l1SE@@@ *+ *+'6/ІK?l1SE@@@ *+ *+'60ІK&?l1SE@@@ *+ *+'61ІK?l1SE@@@ *+ *+'62ІK?l1SE@@@ *+ *+'63ІK?l1SE@@@ *+ *+'64ІKf?l1SE@@@ *+ *+'65ІK?l1SE@@@ *+ *+'66ІK?l1SE@@@ *+ *+'67ІKH?l1SE@@@ *+ *+'68ІK?l1SE@@@ *+ *+'69ІK?l1SE@@@ *+ *+'6:ІK*?l1SE@@@ *+ *+'6;ІKl?l1SE@@@ *+ *+'6<ІK?l1SE@@@ *+ *+'6=ІK ?l1SE@@@ *+ *+'6>ІKO?l1SE@@@ *+ *+'6?ІK?l1SE@@@ *+ *+'6@ІK?l1SE@@@ *+ *+'6AІKM?l1SE@@@ *+ *+'6BІK?l1SE@@@ *+ *+'6CІK?l1SE@@@ *+ *+'6DІK.?l1SE@@@ *+ *+'6EІKq?l1SE@@@ *+ *+'6FІK?l1SE@@@ *+ *+'6GІK?l1SE@@@ *+ *+'6HІKS?l1SE@@@ *+ *+'6IІK?l1SE@@@ *+ *+'6JІK?l1SE@@@ *+ *+'6KІK5?l1SE@@@ *+ *+'6LІK?l1SE@@@ *+ *+'6MІK?l1SE@@@ *+ *+'6NІK4?l1SE@@@ *+ *+'6OІKt?l1SE@@@ *+ *+'6PІK?l1SE@@@ *+ *+'6QІK ?l1SE@@@ *+ *+'6RІKW ?l1SE@@@ *+ *+'6SІK ?l1SE@@@ *+ *+'6TІK ?l1SE@@@ *+ *+'6UІK9!?l1SE@@@ *+ *+'6VІK!?l1SE@@@ *+ *+'6WІK!?l1SE@@@ *+ *+'6XІK"?l1SE@@@ *+ *+'6YІKz"?l1SE@@@ *+ *+'6ZІK"?l1SE@@@ *+ *+'6[ІK"?l1SE@@@ *+ *+'6\ІK\#?l1SE@@@ *+ *+'6]ІK#?l1SE@@@ *+ *+'6^ІK#?l1SE@@@ *+ *+'6_ІK?$?l1SE@@@ *+ *+'6`ІK$?l1SE@@@ *+ *+'6aІK$?l1SE@@@ *+ *+'6bІK%?l1SE@@@ *+ *+'6cІK~%?l1SE@@@ *+ *+'6dІK%?l1SE@@@ *+ *+'6eІK&?l1SE@@@ *+ *+'6fІK`&?l1SE@@@ *+ *+'6gІK&?l1SE@@@ *+ *+'6hІK&?l1SE@@@ *+ *+'6iІKB'?l1SE@@@ *+ *+'6jІK'?l1SE@@@ *+ *+'6kІK'?l1SE@@@~ *+ *+'6lІK$(?l1SE @@@} *+ *+'6mІKf(?l1SE @@@| *+ *+'6nІK(?l1SE @@@{ *+ *+'6oІK)?l1SE @@@z *+ *+'6pІKI)?l1SE @@@y *+ *+'6qІK)?l1SE@@@x *+ *+'6rІK)?l1SE@@@w *+ *+'6sІKH*?l1SE@@@v *+ *+'6tІK*?l1SE@@@u *+ *+'6uІK*?l1SE@@@t *+ *+'6vІK)+?l1SE@@@s *+ *+'6wІKj+?l1SE@@@r *+ *+'6xІK+?l1SE@@@q *+ *+'6yІK ,?l1SE@@@p *+ *+'6zІKM,?l1SE@@@o *+ *+'6{ІK,?l1SE@@@n *+ *+'6|ІK,?l1SE@@@m *+ *+'6}ІK/-?l1SE@@@l *+ *+'6~ІK-?l1SE@@@k *+ *+'6ІK-?l1SE@@@j *+ *+'6ІK/.?l1SE@@@i *+ *+'6ІKo.?l1SE@@@h *+ *+'6ІK.?l1SE@@@g *+ *+'6ІK/?l1SE @@@f *+ *+'6ІKP/?l1SE!@@@e *+ *+'6ІK/?l1SE"@@@d *+ *+'6ІK/  ?l1SE#@@Ag *+ *+'6ІK/<<?l1SE,$@@B6 *+ *+'6@UUІKAVV?l1SEH%@@B *+ *+'47!++I@ІKB?l1SE&@@@` *+ *+'7ІKB?l1SE'@@@_ *+ *+'7ІK/C?l1SE(@@@^ *+ *+'7ІKoC?l1SE)@@@] *+ *+'7ІKC?l1SE*@@@\ *+ *+'7ІKD?l1SE+@@@[ *+ *+'7ІKSD?l1SE,@@@Z *+ *+'7ІKD?l1SE-@@@Y *+ *+'7ІKD?l1SE.@@@X *+ *+'7 ІK4E?l1SE/@@@W *+ *+'7 ІKE?l1SE0@@@V *+ *+'7 ІKE?l1SE1@@@U *+ *+'7 ІKF?l1SE2@@@T *+ *+'7 ІKtF?l1SE3@@@S *+ *+'7ІKF?l1SE4@@@R *+ *+'7ІKG?l1SE5@@@Q *+ *+'7ІKWG?l1SE6@@@P *+ *+'7ІKG?l1SE7@@@O *+ *+'7ІKG?l1SE8@@@N *+ *+'7ІK9H?l1SE9@@@M *+ *+'7ІK{H?l1SE:@@@L *+ *+'7ІKH?l1SE;@@@K *+ *+'7ІKI?l1SE<@@@J *+ *+'7ІKyI?l1SE=@@@I *+ *+'7ІKI?l1SE>@@@H *+ *+'7ІKI?l1SE?@@@G *+ *+'7ІK[J?l1SE@@@@F *+ *+'7ІKJ?l1SEA@@@E *+ *+'7ІKJ?l1SEB@@@D *+ *+'7ІK=K?l1SEC@@@C *+ *+'7ІKK?l1SED@@@B *+ *+'7ІKK?l1SEE@@@A *+ *+'7 ІKL?l1SEF@@@@ *+ *+'7!ІKaL?l1SEG@@@? *+ *+'7"ІKL?l1SEH@@@> *+ *+'7#ІKM?l1SEI@@@= *+ *+'7$ІK`M?l1SEJ@@@< *+ *+'7%ІKM?l1SEK@@@; *+ *+'7&ІKM?l1SEL@@@: *+ *+'7'ІKAN?l1SEM@@@9 *+ *+'7(ІKN?l1SEN@@@8 *+ *+'7)ІKN?l1SEO@@@7 *+ *+'7*ІK$O?l1SEP@@@6 *+ *+'7+ІKeO?l1SEQ@@@5 *+ *+'7,ІKO?l1SER@@@4 *+ *+'7-ІKP?l1SES@@@3 *+ *+'7.ІKGP?l1SET@@@2 *+ *+'7/ІKP?l1SEU@@@1 *+ *+'70ІKP?l1SEV@@@0 *+ *+'71ІKFQ?l1SEW@@@/ *+ *+'72ІKQ?l1SEX@@@. *+ *+'73ІKQ?l1SEY@@@- *+ *+'74ІK)R?l1SEZ@@@, *+ *+'75ІKkR?l1SE[@@@+ *+ *+'76ІKR?l1SE\@@@* *+ *+'77ІK S?l1SE]@@@) *+ *+'78ІKLS?l1SE^@@@( *+ *+'79ІKS?l1SE_@@@' *+ *+'7:ІKS?l1SE`@@@& *+ *+'7;ІK/T?l1SEa@@@% *+ *+'7<ІKT?l1SEb@@@$ *+ *+'7=ІKT?l1SEc@@@# *+ *+'7>ІKU?l1SEd@@@" *+ *+'7?ІKoU?l1SEe@@@! *+ *+'7@ІKU?l1SEf@@@ *+ *+'7AІKV?l1SEg@@@ *+ *+'7BІKQV?l1SEh@@@ *+ *+'7CІKV?l1SEi@@@ *+ *+'7DІKV?l1SEj@@@ *+ *+'7EІK2W?l1SEk@@@ *+ *+'7FІKuW?l1SEl@@@ *+ *+'7GІKW?l1SEm@@@ *+ *+'7HІKX?l1SEn@@@ *+ *+'7IІKsX?l1SEo@@@ *+ *+'7JІKX?l1SEp@@@ *+ *+'7KІKX?l1SEq@@@ *+ *+'7LІKVY?l1SEr@@@ *+ *+'7MІKY?l1SEs@@@ *+ *+'7NІKY?l1SEt@@@ *+ *+'7OІK7Z?l1SEu@@@ *+ *+'7PІKxZ?l1SEv@@@ *+ *+'7QІKZ?l1SEw@@@ *+ *+'7RІK[?l1SEx@@@ *+ *+'7SІK\[?l1SEy@@@ *+ *+'7TІK[?l1SEz@@@ *+ *+'7UІK[?l1SE{@@@ *+ *+'7VІK[\?l1SE|@@@ *+ *+'7WІK\?l1SE}@@@ *+ *+'7XІK\?l1SE~@@@ *+ *+'7YІK;]?l1SE@@@ *+ *+'7ZІK}]?l1SE@@@ *+ *+'7[ІK]?l1SE@@@ *+ *+'7\ІK^?l1SE@@@ *+ *+'7]ІK_^?l1SE@@@ *+ *+'7^ІK^?l1SE@@@ *+ *+'7_ІK_?l1SE@@@ *+ *+'7`ІKB_?l1SE@@@ *+ *+'7aІK_?l1SE@@? *+ *+'7bІK_?l1SE@@? *+ *+'7cІKA`?l1SE@@? *+ *+'7dІK`?l1SE@@? *+ *+'7eІK`?l1SE@@? *+ *+'7fІK"a?l1SE@@? *+ *+'7gІKca?l1SE@@? *+ *+'7hІKa?l1SE@@? *+ *+'7iІKb?l1SE@@? *+ *+'7jІKFb?l1SE@@? *+ *+'7kІKb?l1SE@@? *+ *+'7lІKb?l1SE@@? *+ *+'7mІK(c?l1SE@@? *+ *+'7nІKc?l1SE@@? *+ *+'7oІKc?l1SE@@? *+ *+'7pІK d?l1SE@@? *+ *+'7qІKid?l1SE@@? *+ *+'7rІKd?l1SE@@? *+ *+'7sІK e?l1SE@@? *+ *+'7tІKKe?l1SE@@? *+ *+'7uІKe?l1SE@@? *+ *+'7vІKe?l1SE@@? *+ *+'7wІK-f?l1SE@@? *+ *+'7xІKnf?l1SE@@? *+ *+'7yІKf?l1SE@@? *+ *+'7zІKg?l1SE@@? *+ *+'7{ІKmg?l1SE@@? *+ *+'7|ІKg?l1SE@@? *+ *+'7}ІKg?l1SE@@? *+ *+'7~ІKOh?l1SE@@? *+ *+'7ІKh?l1SE@@? *+ *+'7ІKh?l1SE@@? *+ *+'7ІK1i?l1SE@@? *+ *+'7ІKsi?l1SE@@? *+ *+'7ІKi?l1SE@@? *+ *+'7ІKj?l1SE@@? *+ *+'7ІKUj?l1SE@@? *+ *+'7ІKj  ?l1SE@@@ *+ *+'7ІKj<<?l1SE,@@A *+ *+'7@UUІK|VV?l1SEH@@A *+ *+'48!7@ІKz}?l1SE@@? *+ *+'8ІK}?l1SE@@? *+ *+'8ІK~?l1SE@@? *+ *+'8ІK\~?l1SE@@? *+ *+'8ІK~?l1SE@@? *+ *+'8ІK~?l1SE@@? *+ *+'8ІK=?l1SE@@? *+ *+'8ІK?l1SE@@? *+ *+'8ІK?l1SE@@? *+ *+'8 ІK?l1SE@@? *+ *+'8 ІK~?l1SE@@? *+ *+'8 ІK?l1SE@@? *+ *+'8 ІK?l1SE@@? *+ *+'8 ІK`?l1SE@@? *+ *+'8ІK?l1SE@@? *+ *+'8ІK?l1SE@@? *+ *+'8ІKC?l1SE@@? *+ *+'8ІK?l1SE@@? *+ *+'8ІK?l1SE@@? *+ *+'8ІK$?l1SE@@? *+ *+'8ІKe?l1SE@@? *+ *+'8ІKă?l1SE@@? *+ *+'8ІK?l1SE@@? *+ *+'8ІKd?l1SE@@? *+ *+'8ІK?l1SE@@? *+ *+'8ІK?l1SE@@? *+ *+'8ІKG?l1SE@@? *+ *+'8ІK?l1SE@@? *+ *+'8ІK?l1SE@@? *+ *+'8ІK)?l1SE@@? *+ *+'8ІKj?l1SE@@? *+ *+'8ІKʆ?l1SE@@? *+ *+'8 ІK ?l1SE@@? *+ *+'8!ІKM?l1SE@@? *+ *+'8"ІK?l1SE@@? *+ *+'8#ІK?l1SE@@? *+ *+'8$ІKK?l1SE@@? *+ *+'8%ІK?l1SE@@? *+ *+'8&ІKψ?l1SE@@? *+ *+'8'ІK-?l1SE@@? *+ *+'8(ІKo?l1SE@@? *+ *+'8)ІK?l1SE@@? *+ *+'8*ІK?l1SE@@? *+ *+'8+ІKQ?l1SE@@? *+ *+'8,ІK?l1SE@@? *+ *+'8-ІK?l1SE@@? *+ *+'8.ІK3?l1SE@@? *+ *+'8/ІK?l1SE@@? *+ *+'80ІKӋ?l1SE@@? *+ *+'81ІK2?l1SE@@? *+ *+'82ІKt?l1SE@@? *+ *+'83ІK?l1SE@@? *+ *+'84ІK?l1SE@@? *+ *+'85ІKU?l1SE@@? *+ *+'86ІK?l1SE@@? *+ *+'87ІK?l1SE@@? *+ *+'88ІK8?l1SE@@? *+ *+'89ІK?l1SE@@? *+ *+'8:ІK؎?l1SE@@? *+ *+'8;ІK?l1SE@@? *+ *+'8<ІKx?l1SE@@? *+ *+'8=ІK?l1SE@@? *+ *+'8>ІK?l1SE@@? *+ *+'8?ІKZ?l1SE@@? *+ *+'8@ІK?l1SE@@? *+ *+'8AІK?l1SE@@? *+ *+'8BІK<?l1SE@@? *+ *+'8CІK~?l1SE@@? *+ *+'8DІKۑ?l1SE@@? *+ *+'8EІK?l1SE@@? *+ *+'8FІK`?l1SE@@? *+ *+'8GІK?l1SE@@? *+ *+'8HІK?l1SE@@? *+ *+'8IІK_?l1SE@@? *+ *+'8JІK?l1SE@@? *+ *+'8KІK?l1SE@@? *+ *+'8LІK@?l1SE@@? *+ *+'8MІK?l1SE@@? *+ *+'8NІK?l1SE@@? *+ *+'8OІK#?l1SE@@? *+ *+'8PІKe?l1SE@@? *+ *+'8QІKÕ?l1SE@@? *+ *+'8RІK?l1SE@@? *+ *+'8SІKG?l1SE@@? *+ *+'8TІK?l1SE@@? *+ *+'8UІK?l1SE@@? *+ *+'8VІKF?l1SE@@? *+ *+'8WІK?l1SE@@? *+ *+'8XІKʗ?l1SE@@? *+ *+'8YІK&?l1SE@@?~ *+ *+'8ZІKi?l1SE @@?} *+ *+'8[ІK?l1SE @@?| *+ *+'8\ІK ?l1SE @@?{ *+ *+'8]ІKK?l1SE @@?z *+ *+'8^ІK?l1SE @@?y *+ *+'8_ІK?l1SE@@?x *+ *+'8`ІK-?l1SE@@?w *+ *+'8aІK?l1SE@@?v *+ *+'8bІK͚?l1SE@@?u *+ *+'8cІK,?l1SE@@?t *+ *+'8dІKm?l1SE@@?s *+ *+'8eІK?l1SE@@?r *+ *+'8fІK?l1SE@@?q *+ *+'8gІK]?l1SE@@?p *+ *+'8hІK?l1SE@@?o *+ *+'8iІK?l1SE@@?n *+ *+'8jІK1?l1SE@@?m *+ *+'8kІK?l1SE@@?l *+ *+'8lІKѝ?l1SE@@?k *+ *+'8mІK?l1SE@@?j *+ *+'8nІKr?l1SE@@?i *+ *+'8oІK?l1SE@@?h *+ *+'8pІK?l1SE@@?g *+ *+'8qІKT?l1SE @@?f *+ *+'8rІK?l1SE!@@?e *+ *+'8sІK?l1SE"@@?d *+ *+'8tІK6?l1SE#@@?c *+ *+'8uІKx?l1SE$@@?b *+ *+'8vІKנ?l1SE%@@?a *+ *+'8wІK?l1SE&@@?` *+ *+'8xІK[?l1SE'@@?_ *+ *+'8yІK?l1SE(@@?^ *+ *+'8zІK?l1SE)@@?] *+ *+'8{ІKX?l1SE*@@?\ *+ *+'8|ІK?l1SE+@@?[ *+ *+'8}ІKܢ?l1SE,@@?Z *+ *+'8~ІK:?l1SE-@@?Y *+ *+'8ІK|?l1SE.@@?X *+ *+'8ІKۣ?l1SE/@@?W *+ *+'8ІK?l1SE0@@?V *+ *+'8ІK^?l1SE1@@?U *+ *+'8ІK?l1SE2@@?T *+ *+'8ІK?l1SE3@@?S *+ *+'8ІK@?l1SE4@@?R *+ *+'8ІKs  ?l1SE5@@@U *+ *+'8ІKy<<?l1SE,6@@A$ *+ *+'8@UUІKVV?l1SEH7@@A *+ *+'49!DP@ІKA?l1SE8@@?N *+ *+'9ІK?l1SE9@@?M *+ *+'9ІK?l1SE:@@?L *+ *+'9ІK"?l1SE;@@?K *+ *+'9ІKe?l1SE<@@?J *+ *+'9ІKù?l1SE=@@?I *+ *+'9ІK?l1SE>@@?H *+ *+'9ІKc?l1SE?@@?G *+ *+'9ІK?l1SE@@@?F *+ *+'9 ІK?l1SEA@@?E *+ *+'9 ІKF?l1SEB@@?D *+ *+'9 ІK?l1SEC@@?C *+ *+'9 ІKȻ?l1SED@@?B *+ *+'9 ІK'?l1SEE@@?A *+ *+'9ІKi?l1SEF@@?@ *+ *+'9ІKǼ?l1SEG@@?? *+ *+'9ІK ?l1SEH@@?> *+ *+'9ІKL?l1SEI@@?= *+ *+'9ІK?l1SEJ@@?< *+ *+'9ІK?l1SEK@@?; *+ *+'9ІK-?l1SEL@@?: *+ *+'9ІK?l1SEM@@?9 *+ *+'9ІKξ?l1SEN@@?8 *+ *+'9ІK,?l1SEO@@?7 *+ *+'9ІKn?l1SEP@@?6 *+ *+'9ІK?l1SEQ@@?5 *+ *+'9ІK?l1SER@@?4 *+ *+'9ІKP?l1SES@@?3 *+ *+'9ІK?l1SET@@?2 *+ *+'9ІK?l1SEU@@?1 *+ *+'9ІK2?l1SEV@@?0 *+ *+'9ІK?l1SEW@@?/ *+ *+'9 ІK?l1SEX@@?. *+ *+'9!ІK?l1SEY@@?- *+ *+'9"ІKr?l1SEZ@@?, *+ *+'9#ІK?l1SE[@@?+ *+ *+'9$ІK?l1SE\@@?* *+ *+'9%ІKT?l1SE]@@?) *+ *+'9&ІK?l1SE^@@?( *+ *+'9'ІK?l1SE_@@?' *+ *+'9(ІK7?l1SE`@@?& *+ *+'9)ІKx?l1SEa@@?% *+ *+'9*ІK?l1SEb@@?$ *+ *+'9+ІK?l1SEc@@?# *+ *+'9,ІKx?l1SEd@@?" *+ *+'9-ІK?l1SEe@@?! *+ *+'9.ІK?l1SEf@@? *+ *+'9/ІKX?l1SEg@@? *+ *+'90ІK?l1SEh@@? *+ *+'91ІK?l1SEi@@? *+ *+'92ІK;?l1SEj@@? *+ *+'93ІK}?l1SEk@@? *+ *+'94ІK?l1SEl@@? *+ *+'95ІK?l1SEm@@? *+ *+'96ІK^?l1SEn@@? *+ *+'97ІK?l1SEo@@? *+ *+'98ІK?l1SEp@@? *+ *+'99ІK^?l1SEq@@? *+ *+'9:ІK?l1SEr@@? *+ *+'9;ІK?l1SEs@@? *+ *+'9<ІK??l1SEt@@? *+ *+'9=ІK?l1SEu@@? *+ *+'9>ІK?l1SEv@@? *+ *+'9?ІK"?l1SEw@@? *+ *+'9@ІKc?l1SEx@@? *+ *+'9AІK?l1SEy@@? *+ *+'9BІK?l1SEz@@? *+ *+'9CІKE?l1SE{@@? *+ *+'9DІK?l1SE|@@? *+ *+'9EІK?l1SE}@@? *+ *+'9FІK'?l1SE~@@? *+ *+'9GІK?l1SE@@? *+ *+'9HІK?l1SE@@? *+ *+'9IІK'?l1SE@@? *+ *+'9JІKh?l1SE@@? *+ *+'9KІK?l1SE@@? *+ *+'9LІK?l1SE@@? *+ *+'9MІKI?l1SE@@? *+ *+'9NІK?l1SE@@? *+ *+'9OІK?l1SE@@> *+ *+'9PІK,?l1SE@@> *+ *+'9QІK?l1SE@@> *+ *+'9RІK?l1SE@@> *+ *+'9SІK?l1SE@@> *+ *+'9TІKm?l1SE@@> *+ *+'9UІK?l1SE@@> *+ *+'9VІK ?l1SE@@> *+ *+'9WІKN?l1SE@@> *+ *+'9XІK?l1SE@@> *+ *+'9YІK?l1SE@@> *+ *+'9ZІK1?l1SE@@> *+ *+'9[ІKr?l1SE@@> *+ *+'9\ІK?l1SE@@> *+ *+'9]ІK?l1SE@@> *+ *+'9^ІKr?l1SE@@> *+ *+'9_ІK?l1SE@@> *+ *+'9`ІK?l1SE@@> *+ *+'9aІKS?l1SE@@> *+ *+'9bІK?l1SE@@> *+ *+'9cІK?l1SE@@> *+ *+'9dІK4?l1SE@@> *+ *+'9eІKw?l1SE@@> *+ *+'9fІK?l1SE@@> *+ *+'9gІK?l1SE@@> *+ *+'9hІKY?l1SE@@> *+ *+'9iІK?l1SE@@> *+ *+'9jІK?l1SE@@> *+ *+'9kІKX?l1SE@@> *+ *+'9lІK?l1SE@@> *+ *+'9mІK?l1SE@@> *+ *+'9nІK:?l1SE@@> *+ *+'9oІK{?l1SE@@> *+ *+'9pІK?l1SE@@> *+ *+'9qІK?l1SE@@> *+ *+'9rІK^?l1SE@@> *+ *+'9sІK?l1SE@@> *+ *+'9tІK?l1SE@@> *+ *+'9uІK??l1SE@@> *+ *+'9vІK?l1SE@@> *+ *+'9wІK?l1SE@@> *+ *+'9xІK!?l1SE@@> *+ *+'9yІK?l1SE@@> *+ *+'9zІK?l1SE@@> *+ *+'9{ІK ?l1SE@@> *+ *+'9|ІKc?l1SE@@> *+ *+'9}ІK?l1SE@@> *+ *+'9~ІK?l1SE@@> *+ *+'9ІKD?l1SE@@> *+ *+'9ІK?l1SE@@> *+ *+'9ІK?l1SE@@> *+ *+'9ІK&?l1SE@@> *+ *+'9ІK?l1SE@@> *+ *+'9ІK?l1SE@@> *+ *+'9ІK?l1SE@@> *+ *+'9ІK;  ?l1SE@@? *+ *+'9ІKB<<?l1SE,@@@ *+ *+'9@UUІKrVV?l1SEH@@@~ *+ *+'4:!Pi@ІK)?l1SE@@> *+ *+':ІKj?l1SE@@> *+ *+':ІK?l1SE@@> *+ *+':ІK ?l1SE@@> *+ *+':ІKL?l1SE@@> *+ *+':ІK?l1SE@@> *+ *+':ІK?l1SE@@> *+ *+':ІKK?l1SE@@> *+ *+':ІK?l1SE@@> *+ *+': ІK?l1SE@@> *+ *+': ІK-?l1SE@@> *+ *+': ІKo?l1SE@@> *+ *+': ІK?l1SE@@> *+ *+': ІK?l1SE@@> *+ *+':ІKQ?l1SE@@> *+ *+':ІK?l1SE@@> *+ *+':ІK?l1SE@@> *+ *+':ІK3?l1SE@@> *+ *+':ІK?l1SE@@> *+ *+':ІK?l1SE@@> *+ *+':ІK?l1SE@@> *+ *+':ІKs?l1SE@@> *+ *+':ІK?l1SE@@> *+ *+':ІK?l1SE@@> *+ *+':ІKU?l1SE@@> *+ *+':ІK?l1SE@@> *+ *+':ІK?l1SE@@> *+ *+':ІK7?l1SE@@> *+ *+':ІK?l1SE@@> *+ *+':ІK?l1SE@@> *+ *+':ІK?l1SE@@> *+ *+':ІKy?l1SE@@> *+ *+': ІK?l1SE@@> *+ *+':!ІK?l1SE@@> *+ *+':"ІKZ?l1SE@@> *+ *+':#ІK?l1SE@@> *+ *+':$ІK?l1SE@@> *+ *+':%ІK;?l1SE@@> *+ *+':&ІK~?l1SE@@> *+ *+':'ІK?l1SE@@> *+ *+':(ІK?l1SE@@> *+ *+':)ІK`?l1SE@@> *+ *+':*ІK?l1SE@@> *+ *+':+ІK?l1SE@@> *+ *+':,ІK_?l1SE@@> *+ *+':-ІK?l1SE@@> *+ *+':.ІK?l1SE@@> *+ *+':/ІKA?l1SE@@> *+ *+':0ІK?l1SE@@> *+ *+':1ІK?l1SE@@> *+ *+':2ІK"?l1SE@@> *+ *+':3ІKe?l1SE@@> *+ *+':4ІK?l1SE@@> *+ *+':5ІK?l1SE@@> *+ *+':6ІKF?l1SE@@> *+ *+':7ІK?l1SE@@> *+ *+':8ІK?l1SE@@> *+ *+':9ІKE?l1SE@@> *+ *+'::ІK?l1SE@@> *+ *+':;ІK?l1SE@@> *+ *+':<ІK'?l1SE@@> *+ *+':=ІKj?l1SE@@> *+ *+':>ІK?l1SE@@> *+ *+':?ІK ?l1SE@@> *+ *+':@ІKK?l1SE@@> *+ *+':AІK?l1SE@@> *+ *+':BІK?l1SE@@> *+ *+':CІK,?l1SE@@> *+ *+':DІK?l1SE@@> *+ *+':EІK?l1SE@@> *+ *+':FІK?l1SE@@> *+ *+':GІKm?l1SE@@>~ *+ *+':HІK?l1SE @@>} *+ *+':IІK ?l1SE @@>| *+ *+':JІKO ?l1SE @@>{ *+ *+':KІK ?l1SE @@>z *+ *+':LІK ?l1SE @@>y *+ *+':MІK1 ?l1SE@@>x *+ *+':NІK ?l1SE@@>w *+ *+':OІK ?l1SE@@>v *+ *+':PІK ?l1SE@@>u *+ *+':QІKr ?l1SE@@>t *+ *+':RІK ?l1SE@@>s *+ *+':SІK ?l1SE@@>r *+ *+':TІKS ?l1SE@@>q *+ *+':UІK ?l1SE@@>p *+ *+':VІK ?l1SE@@>o *+ *+':WІK5 ?l1SE@@>n *+ *+':XІKx ?l1SE@@>m *+ *+':YІK ?l1SE@@>l *+ *+':ZІK?l1SE@@>k *+ *+':[ІKY?l1SE@@>j *+ *+':\ІK?l1SE@@>i *+ *+':]ІK?l1SE@@>h *+ *+':^ІKY?l1SE@@>g *+ *+':_ІK?l1SE @@>f *+ *+':`ІK?l1SE!@@>e *+ *+':aІK;?l1SE"@@>d *+ *+':bІK|?l1SE#@@>c *+ *+':cІK?l1SE$@@>b *+ *+':dІK?l1SE%@@>a *+ *+':eІK]?l1SE&@@>` *+ *+':fІK?l1SE'@@>_ *+ *+':gІK?l1SE(@@>^ *+ *+':hІK@?l1SE)@@>] *+ *+':iІK?l1SE*@@>\ *+ *+':jІK?l1SE+@@>[ *+ *+':kІK??l1SE,@@>Z *+ *+':lІK?l1SE-@@>Y *+ *+':mІK?l1SE.@@>X *+ *+':nІK"?l1SE/@@>W *+ *+':oІKc?l1SE0@@>V *+ *+':pІK?l1SE1@@>U *+ *+':qІK?l1SE2@@>T *+ *+':rІKC?l1SE3@@>S *+ *+':sІK?l1SE4@@>R *+ *+':tІK?l1SE5@@>Q *+ *+':uІK'?l1SE6@@>P *+ *+':vІK?l1SE7@@>O *+ *+':wІK?l1SE8@@>N *+ *+':xІK?l1SE9@@>M *+ *+':yІKg?l1SE:@@>L *+ *+':zІK?l1SE;@@>K *+ *+':{ІK?l1SE<@@>J *+ *+':|ІKI?l1SE=@@>I *+ *+':}ІK?l1SE>@@>H *+ *+':~ІK?l1SE?@@>G *+ *+':ІK+?l1SE@@@>F *+ *+':ІK?l1SEA@@>E *+ *+':ІK?l1SEB@@>D *+ *+':ІK?l1SEC@@>C *+ *+':ІKl?l1SED@@>B *+ *+':ІK?l1SEE@@>A *+ *+':ІK?l1SEF@@>@ *+ *+':ІK"  ?l1SEG@@?C *+ *+':ІK*<<?l1SE,H@@@ *+ *+':@UUІK:-VV?l1SEHI@@? *+ *+'4;!]s@ІK-?l1SEJ@@>< *+ *+';ІK1.?l1SEK@@>; *+ *+';ІK.?l1SEL@@>: *+ *+';ІK.?l1SEM@@>9 *+ *+';ІK/?l1SEN@@>8 *+ *+';ІKr/?l1SEO@@>7 *+ *+';ІK/?l1SEP@@>6 *+ *+';ІK0?l1SEQ@@>5 *+ *+';ІKT0?l1SER@@>4 *+ *+'; ІK0?l1SES@@>3 *+ *+'; ІK0?l1SET@@>2 *+ *+'; ІK71?l1SEU@@>1 *+ *+'; ІKx1?l1SEV@@>0 *+ *+'; ІK1?l1SEW@@>/ *+ *+';ІK2?l1SEX@@>. *+ *+';ІKw2?l1SEY@@>- *+ *+';ІK2?l1SEZ@@>, *+ *+';ІK2?l1SE[@@>+ *+ *+';ІKX3?l1SE\@@>* *+ *+';ІK3?l1SE]@@>) *+ *+';ІK3?l1SE^@@>( *+ *+';ІK:4?l1SE_@@>' *+ *+';ІK}4?l1SE`@@>& *+ *+';ІK4?l1SEa@@>% *+ *+';ІK5?l1SEb@@>$ *+ *+';ІK_5?l1SEc@@># *+ *+';ІK5?l1SEd@@>" *+ *+';ІK5?l1SEe@@>! *+ *+';ІK^6?l1SEf@@> *+ *+';ІK6?l1SEg@@> *+ *+';ІK6?l1SEh@@> *+ *+';ІK?7?l1SEi@@> *+ *+'; ІK7?l1SEj@@> *+ *+';!ІK7?l1SEk@@> *+ *+';"ІK!8?l1SEl@@> *+ *+';#ІKc8?l1SEm@@> *+ *+';$ІK8?l1SEn@@> *+ *+';%ІK9?l1SEo@@> *+ *+';&ІKE9?l1SEp@@> *+ *+';'ІK9?l1SEq@@> *+ *+';(ІK9?l1SEr@@> *+ *+';)ІK':?l1SEs@@> *+ *+';*ІK:?l1SEt@@> *+ *+';+ІK:?l1SEu@@> *+ *+';,ІK%;?l1SEv@@> *+ *+';-ІKh;?l1SEw@@> *+ *+';.ІK;?l1SEx@@> *+ *+';/ІK<?l1SEy@@> *+ *+';0ІKI<?l1SEz@@> *+ *+';1ІK<?l1SE{@@> *+ *+';2ІK<?l1SE|@@> *+ *+';3ІK+=?l1SE}@@> *+ *+';4ІK=?l1SE~@@> *+ *+';5ІK=?l1SE@@> *+ *+';6ІK>?l1SE@@> *+ *+';7ІKl>?l1SE@@> *+ *+';8ІK>?l1SE@@> *+ *+';9ІK ??l1SE@@> *+ *+';:ІKO??l1SE@@> *+ *+';;ІK??l1SE@@> *+ *+';<ІK??l1SE@@> *+ *+';=ІK0@?l1SE@@= *+ *+';>ІKs@?l1SE@@= *+ *+';?ІK@?l1SE@@= *+ *+';@ІKA?l1SE@@= *+ *+';AІKpA?l1SE@@= *+ *+';BІKA?l1SE@@= *+ *+';CІKA?l1SE@@= *+ *+';DІKSB?l1SE@@= *+ *+';EІKB?l1SE@@= *+ *+';FІKB?l1SE@@= *+ *+';GІK5C?l1SE@@= *+ *+';HІKvC?l1SE@@= *+ *+';IІKC?l1SE@@= *+ *+';JІKD?l1SE@@= *+ *+';KІKYD?l1SE@@= *+ *+';LІKD?l1SE@@= *+ *+';MІKD?l1SE@@= *+ *+';NІKXE?l1SE@@= *+ *+';OІKE?l1SE@@= *+ *+';PІKE?l1SE@@= *+ *+';QІK9F?l1SE@@= *+ *+';RІK{F?l1SE@@= *+ *+';SІKF?l1SE@@= *+ *+';TІKG?l1SE@@= *+ *+';UІK\G?l1SE@@= *+ *+';VІKG?l1SE@@= *+ *+';WІKG?l1SE@@= *+ *+';XІK?H?l1SE@@= *+ *+';YІKH?l1SE@@= *+ *+';ZІKH?l1SE@@= *+ *+';[ІK!I?l1SE@@= *+ *+';\ІKI?l1SE@@= *+ *+';]ІKI?l1SE@@= *+ *+';^ІK J?l1SE@@= *+ *+';_ІKaJ?l1SE@@= *+ *+';`ІKJ?l1SE@@= *+ *+';aІKK?l1SE@@= *+ *+';bІKDK?l1SE@@= *+ *+';cІKK?l1SE@@= *+ *+';dІKK?l1SE@@= *+ *+';eІK%L?l1SE@@= *+ *+';fІKL?l1SE@@= *+ *+';gІKL?l1SE@@= *+ *+';hІKM?l1SE@@= *+ *+';iІKfM?l1SE@@= *+ *+';jІKM?l1SE@@= *+ *+';kІKN?l1SE@@= *+ *+';lІKHN?l1SE@@= *+ *+';mІKN?l1SE@@= *+ *+';nІKN?l1SE@@= *+ *+';oІK+O?l1SE@@= *+ *+';pІKkO?l1SE@@= *+ *+';qІKO?l1SE@@= *+ *+';rІK P?l1SE@@= *+ *+';sІKjP?l1SE@@= *+ *+';tІKP?l1SE@@= *+ *+';uІKP?l1SE@@= *+ *+';vІKLQ?l1SE@@= *+ *+';wІKQ?l1SE@@= *+ *+';xІKQ?l1SE@@= *+ *+';yІK/R?l1SE@@= *+ *+';zІKqR?l1SE@@= *+ *+';{ІKR?l1SE@@= *+ *+';|ІKS?l1SE@@= *+ *+';}ІKQS?l1SE@@= *+ *+';~ІKS?l1SE@@= *+ *+';ІKS?l1SE@@= *+ *+';ІKQT?l1SE@@= *+ *+';ІKT?l1SE@@= *+ *+';ІKT?l1SE@@= *+ *+';ІK4U?l1SE@@= *+ *+';ІKuU?l1SE@@= *+ *+';ІKU?l1SE@@= *+ *+';ІKU  ?l1SE@@> *+ *+';ІKU<<?l1SE,@@? *+ *+';@UUІK!hVV?l1SEH@@?l *+ *+'4<!j S@ІKh?l1SE@@= *+ *+'<ІKi?l1SE@@= *+ *+'<ІKwi?l1SE@@= *+ *+'<ІKi?l1SE@@= *+ *+'<ІKi?l1SE@@= *+ *+'<ІKZj?l1SE@@= *+ *+'<ІKj?l1SE@@= *+ *+'<ІKj?l1SE@@= *+ *+'<ІK;k?l1SE@@= *+ *+'< ІK}k?l1SE@@= *+ *+'< ІKk?l1SE@@= *+ *+'< ІKl?l1SE@@= *+ *+'< ІK_l?l1SE@@= *+ *+'< ІKl?l1SE@@= *+ *+'<ІKm?l1SE@@= *+ *+'<ІK_m?l1SE@@= *+ *+'<ІKm?l1SE@@= *+ *+'<ІKm?l1SE@@= *+ *+'<ІK@n?l1SE@@= *+ *+'<ІKn?l1SE@@= *+ *+'<ІKn?l1SE@@= *+ *+'<ІK"o?l1SE@@= *+ *+'<ІKdo?l1SE@@= *+ *+'<ІKo?l1SE@@= *+ *+'<ІKp?l1SE@@= *+ *+'<ІKFp?l1SE@@= *+ *+'<ІKp?l1SE@@= *+ *+'<ІKp?l1SE@@= *+ *+'<ІKEq?l1SE@@= *+ *+'<ІKq?l1SE@@= *+ *+'<ІKq?l1SE@@= *+ *+'<ІK'r?l1SE@@= *+ *+'< ІKgr?l1SE@@= *+ *+'<!ІKr?l1SE@@= *+ *+'<"ІKs?l1SE@@= *+ *+'<#ІKKs?l1SE@@= *+ *+'<$ІKs?l1SE@@= *+ *+'<%ІKs?l1SE@@= *+ *+'<&ІK-t?l1SE@@= *+ *+'<'ІKt?l1SE@@= *+ *+'<(ІKt?l1SE@@= *+ *+'<)ІKu?l1SE@@= *+ *+'<*ІKmu?l1SE@@= *+ *+'<+ІKu?l1SE@@= *+ *+'<,ІK v?l1SE@@= *+ *+'<-ІKOv?l1SE@@= *+ *+'<.ІKv?l1SE@@= *+ *+'</ІKv?l1SE@@= *+ *+'<0ІK1w?l1SE@@= *+ *+'<1ІKw?l1SE@@= *+ *+'<2ІKw?l1SE@@= *+ *+'<3ІKx?l1SE@@= *+ *+'<4ІKqx?l1SE@@= *+ *+'<5ІKx?l1SE@@=~ *+ *+'<6ІKx?l1SE @@=} *+ *+'<7ІKSy?l1SE @@=| *+ *+'<8ІKy?l1SE @@={ *+ *+'<9ІKy?l1SE @@=z *+ *+'<:ІK6z?l1SE @@=y *+ *+'<;ІKxz?l1SE@@=x *+ *+'<<ІKz?l1SE@@=w *+ *+'<=ІK{?l1SE@@=v *+ *+'<>ІKY{?l1SE@@=u *+ *+'<?ІK{?l1SE@@=t *+ *+'<@ІK{?l1SE@@=s *+ *+'<AІKY|?l1SE@@=r *+ *+'<BІK|?l1SE@@=q *+ *+'<CІK|?l1SE@@=p *+ *+'<DІK:}?l1SE@@=o *+ *+'<EІK|}?l1SE@@=n *+ *+'<FІK}?l1SE@@=m *+ *+'<GІK~?l1SE@@=l *+ *+'<HІK^~?l1SE@@=k *+ *+'<IІK~?l1SE@@=j *+ *+'<JІK~?l1SE@@=i *+ *+'<KІK@?l1SE@@=h *+ *+'<LІK?l1SE@@=g *+ *+'<MІK?l1SE @@=f *+ *+'<NІK??l1SE!@@=e *+ *+'<OІK?l1SE"@@=d *+ *+'<PІK€?l1SE#@@=c *+ *+'<QІK!?l1SE$@@=b *+ *+'<RІKc?l1SE%@@=a *+ *+'<SІK?l1SE&@@=` *+ *+'<TІK?l1SE'@@=_ *+ *+'<UІKD?l1SE(@@=^ *+ *+'<VІK?l1SE)@@=] *+ *+'<WІK?l1SE*@@=\ *+ *+'<XІK'?l1SE+@@=[ *+ *+'<YІK?l1SE,@@=Z *+ *+'<ZІKǃ?l1SE-@@=Y *+ *+'<[ІK ?l1SE.@@=X *+ *+'<\ІKg?l1SE/@@=W *+ *+'<]ІK?l1SE0@@=V *+ *+'<^ІK?l1SE1@@=U *+ *+'<_ІKI?l1SE2@@=T *+ *+'<`ІK?l1SE3@@=S *+ *+'<aІK?l1SE4@@=R *+ *+'<bІK*?l1SE5@@=Q *+ *+'<cІK?l1SE6@@=P *+ *+'<dІK̆?l1SE7@@=O *+ *+'<eІK ?l1SE8@@=N *+ *+'<fІKl?l1SE9@@=M *+ *+'<gІK?l1SE:@@=L *+ *+'<hІK?l1SE;@@=K *+ *+'<iІKN?l1SE<@@=J *+ *+'<jІK?l1SE=@@=I *+ *+'<kІK?l1SE>@@=H *+ *+'<lІK/?l1SE?@@=G *+ *+'<mІKr?l1SE@@@=F *+ *+'<nІKЉ?l1SEA@@=E *+ *+'<oІK?l1SEB@@=D *+ *+'<pІKT?l1SEC@@=C *+ *+'<qІK?l1SED@@=B *+ *+'<rІK?l1SEE@@=A *+ *+'<sІKS?l1SEF@@=@ *+ *+'<tІK?l1SEG@@=? *+ *+'<uІKՋ?l1SEH@@=> *+ *+'<vІK4?l1SEI@@== *+ *+'<wІKu?l1SEJ@@=< *+ *+'<xІK?l1SEK@@=; *+ *+'<yІK?l1SEL@@=: *+ *+'<zІKX?l1SEM@@=9 *+ *+'<{ІK?l1SEN@@=8 *+ *+'<|ІK?l1SEO@@=7 *+ *+'<}ІK:?l1SEP@@=6 *+ *+'<~ІK?l1SEQ@@=5 *+ *+'<ІKڎ?l1SER@@=4 *+ *+'<ІK9?l1SES@@=3 *+ *+'<ІK{?l1SET@@=2 *+ *+'<ІK?l1SEU@@=1 *+ *+'<ІK?l1SEV@@=0 *+ *+'<ІK]?l1SEW@@=/ *+ *+'<ІK?l1SEX@@=. *+ *+'<ІKѐ  ?l1SEY@@>1 *+ *+'<ІKؐ<<?l1SE,Z@@? *+ *+'<@UUІK VV?l1SEH[@@> *+ *+'4=!v@ІKã?l1SE\@@=* *+ *+'=ІK?l1SE]@@=) *+ *+'=ІKc?l1SE^@@=( *+ *+'=ІK?l1SE_@@=' *+ *+'=ІK?l1SE`@@=& *+ *+'=ІKF?l1SEa@@=% *+ *+'=ІK?l1SEb@@=$ *+ *+'=ІK?l1SEc@@=# *+ *+'=ІK&?l1SEd@@=" *+ *+'= ІKi?l1SEe@@=! *+ *+'= ІKȦ?l1SEf@@= *+ *+'= ІK ?l1SEg@@= *+ *+'= ІKK?l1SEh@@= *+ *+'= ІK?l1SEi@@= *+ *+'=ІK?l1SEj@@= *+ *+'=ІKJ?l1SEk@@= *+ *+'=ІK?l1SEl@@= *+ *+'=ІKͨ?l1SEm@@= *+ *+'=ІK+?l1SEn@@= *+ *+'=ІKm?l1SEo@@= *+ *+'=ІK?l1SEp@@= *+ *+'=ІK ?l1SEq@@= *+ *+'=ІKO?l1SEr@@= *+ *+'=ІK?l1SEs@@= *+ *+'=ІK?l1SEt@@= *+ *+'=ІK1?l1SEu@@= *+ *+'=ІK?l1SEv@@= *+ *+'=ІKҫ?l1SEw@@= *+ *+'=ІK1?l1SEx@@= *+ *+'=ІKq?l1SEy@@= *+ *+'=ІK?l1SEz@@= *+ *+'=ІK?l1SE{@@= *+ *+'= ІKT?l1SE|@@= *+ *+'=!ІK?l1SE}@@= *+ *+'="ІK?l1SE~@@= *+ *+'=#ІK5?l1SE@@= *+ *+'=$ІK?l1SE@@= *+ *+'=%ІK֮?l1SE@@= *+ *+'=&ІK?l1SE@@= *+ *+'='ІKv?l1SE@@= *+ *+'=(ІK?l1SE@@= *+ *+'=)ІK?l1SE@@= *+ *+'=*ІKY?l1SE@@= *+ *+'=+ІK?l1SE@@< *+ *+'=,ІK?l1SE@@< *+ *+'=-ІK:?l1SE@@< *+ *+'=.ІK|?l1SE@@< *+ *+'=/ІK۱?l1SE@@< *+ *+'=0ІK?l1SE@@< *+ *+'=1ІKz?l1SE@@< *+ *+'=2ІK?l1SE@@< *+ *+'=3ІK?l1SE@@< *+ *+'=4ІK]?l1SE@@< *+ *+'=5ІK?l1SE@@< *+ *+'=6ІK?l1SE@@< *+ *+'=7ІK??l1SE@@< *+ *+'=8ІK?l1SE@@< *+ *+'=9ІK?l1SE@@< *+ *+'=:ІK!?l1SE@@< *+ *+'=;ІKb?l1SE@@< *+ *+'=<ІK?l1SE@@< *+ *+'==ІK?l1SE@@< *+ *+'=>ІKE?l1SE@@< *+ *+'=?ІK?l1SE@@< *+ *+'=@ІK?l1SE@@< *+ *+'=AІKE?l1SE@@< *+ *+'=BІK?l1SE@@< *+ *+'=CІKǷ?l1SE@@< *+ *+'=DІK%?l1SE@@< *+ *+'=EІKg?l1SE@@< *+ *+'=FІK?l1SE@@< *+ *+'=GІK?l1SE@@< *+ *+'=HІKI?l1SE@@< *+ *+'=IІK?l1SE@@< *+ *+'=JІK?l1SE@@< *+ *+'=KІK,?l1SE@@< *+ *+'=LІK?l1SE@@< *+ *+'=MІK̺?l1SE@@< *+ *+'=NІK*?l1SE@@< *+ *+'=OІKl?l1SE@@< *+ *+'=PІK?l1SE@@< *+ *+'=QІK ?l1SE@@< *+ *+'=RІKM?l1SE@@< *+ *+'=SІK?l1SE@@< *+ *+'=TІK?l1SE@@< *+ *+'=UІK0?l1SE@@< *+ *+'=VІK?l1SE@@< *+ *+'=WІKн?l1SE@@< *+ *+'=XІK?l1SE@@< *+ *+'=YІKq?l1SE@@< *+ *+'=ZІK?l1SE@@< *+ *+'=[ІK?l1SE@@< *+ *+'=\ІKR?l1SE@@< *+ *+'=]ІK?l1SE@@< *+ *+'=^ІK?l1SE@@< *+ *+'=_ІK6?l1SE@@< *+ *+'=`ІKv?l1SE@@< *+ *+'=aІK?l1SE@@< *+ *+'=bІK?l1SE@@< *+ *+'=cІKv?l1SE@@< *+ *+'=dІK?l1SE@@< *+ *+'=eІK?l1SE@@< *+ *+'=fІKW?l1SE@@< *+ *+'=gІK?l1SE@@< *+ *+'=hІK?l1SE@@< *+ *+'=iІK9?l1SE@@< *+ *+'=jІK{?l1SE@@< *+ *+'=kІK?l1SE@@< *+ *+'=lІK?l1SE@@< *+ *+'=mІK]?l1SE@@< *+ *+'=nІK?l1SE@@< *+ *+'=oІK?l1SE@@< *+ *+'=pІK>?l1SE@@< *+ *+'=qІK?l1SE@@< *+ *+'=rІK?l1SE@@< *+ *+'=sІK=?l1SE@@< *+ *+'=tІK?l1SE@@< *+ *+'=uІK?l1SE@@< *+ *+'=vІK ?l1SE@@< *+ *+'=wІKb?l1SE@@< *+ *+'=xІK?l1SE@@< *+ *+'=yІK?l1SE@@< *+ *+'=zІKC?l1SE@@< *+ *+'={ІK?l1SE@@< *+ *+'=|ІK?l1SE@@< *+ *+'=}ІK&?l1SE@@< *+ *+'=~ІK?l1SE@@< *+ *+'=ІK?l1SE@@< *+ *+'=ІK$?l1SE@@< *+ *+'=ІKg?l1SE@@< *+ *+'=ІK?l1SE@@< *+ *+'=ІK?l1SE@@< *+ *+'=ІKG?l1SE@@< *+ *+'=ІK?l1SE@@< *+ *+'=ІK  ?l1SE@@= *+ *+'=ІK<<?l1SE,@@>w *+ *+'=@UUІKVV?l1SEH@@>Z *+ *+'4>!+ @ІK?l1SE@@< *+ *+'>ІK?l1SE@@< *+ *+'>ІK!?l1SE@@< *+ *+'>ІKa?l1SE@@< *+ *+'>ІK?l1SE@@< *+ *+'>ІK?l1SE@@< *+ *+'>ІKD?l1SE@@< *+ *+'>ІK?l1SE@@< *+ *+'>ІK?l1SE@@< *+ *+'> ІK&?l1SE@@< *+ *+'> ІK?l1SE@@< *+ *+'> ІK?l1SE@@< *+ *+'> ІK?l1SE@@< *+ *+'> ІKg?l1SE@@< *+ *+'>ІK?l1SE@@< *+ *+'>ІK?l1SE@@< *+ *+'>ІKH?l1SE@@< *+ *+'>ІK?l1SE@@< *+ *+'>ІK?l1SE@@< *+ *+'>ІK)?l1SE@@< *+ *+'>ІKw?l1SE@@< *+ *+'>ІK?l1SE@@< *+ *+'>ІK ?l1SE@@< *+ *+'>ІKk?l1SE@@< *+ *+'>ІK?l1SE@@< *+ *+'>ІK?l1SE@@< *+ *+'>ІKM?l1SE@@< *+ *+'>ІK?l1SE@@< *+ *+'>ІK?l1SE@@< *+ *+'>ІK/?l1SE@@< *+ *+'>ІKq?l1SE@@< *+ *+'>ІK?l1SE@@< *+ *+'> ІK?l1SE@@< *+ *+'>!ІKT?l1SE@@< *+ *+'>"ІK?l1SE@@< *+ *+'>#ІK?l1SE@@<~ *+ *+'>$ІKR?l1SE @@<} *+ *+'>%ІK?l1SE @@<| *+ *+'>&ІK?l1SE @@<{ *+ *+'>'ІK3?l1SE @@(ІKu?l1SE @@)ІK?l1SE@@*ІK?l1SE@@+ІKW?l1SE@@,ІK?l1SE@@-ІK?l1SE@@.ІK9?l1SE@@/ІK?l1SE@@0ІK?l1SE@@1ІK8?l1SE@@

2ІKy?l1SE@@3ІK?l1SE@@4ІK?l1SE@@5ІK\?l1SE@@6ІK?l1SE@@7ІK?l1SE@@8ІK>?l1SE@@9ІK?l1SE@@:ІK?l1SE@@;ІK?l1SE @@<ІK~?l1SE!@@=ІK?l1SE"@@>ІK?l1SE#@@?ІK`?l1SE$@@@ІK?l1SE%@@AІK?l1SE&@@<` *+ *+'>BІKC?l1SE'@@<_ *+ *+'>CІK?l1SE(@@<^ *+ *+'>DІK?l1SE)@@<] *+ *+'>EІK$?l1SE*@@<\ *+ *+'>FІKf?l1SE+@@<[ *+ *+'>GІK?l1SE,@@HІK?l1SE-@@IІKd?l1SE.@@JІK?l1SE/@@KІK?l1SE0@@LІKG?l1SE1@@MІK?l1SE2@@NІK?l1SE3@@OІK)?l1SE4@@PІKj?l1SE5@@QІK?l1SE6@@

RІK ?l1SE7@@SІKN?l1SE8@@TІK?l1SE9@@UІK?l1SE:@@VІKK?l1SE;@@WІK?l1SE<@@XІK?l1SE=@@YІK.?l1SE>@@ZІKo?l1SE?@@[ІK?l1SE@@@\ІK?l1SEA@@]ІKQ?l1SEB@@^ІK?l1SEC@@_ІK?l1SED@@`ІK4?l1SEE@@aІK?l1SEF@@<@ *+ *+'>bІK?l1SEG@@cІK2?l1SEH@@<> *+ *+'>dІKt?l1SEI@@<= *+ *+'>eІK?l1SEJ@@<< *+ *+'>fІK?l1SEK@@<; *+ *+'>gІKU?l1SEL@@<: *+ *+'>hІK?l1SEM@@<9 *+ *+'>iІK?l1SEN@@<8 *+ *+'>jІK8?l1SEO@@<7 *+ *+'>kІK?l1SEP@@<6 *+ *+'>lІK?l1SEQ@@<5 *+ *+'>mІK?l1SER@@<4 *+ *+'>nІKx?l1SES@@<3 *+ *+'>oІK?l1SET@@<2 *+ *+'>pІK?l1SEU@@<1 *+ *+'>qІK[?l1SEV@@<0 *+ *+'>rІK?l1SEW@@sІK?l1SEX@@<. *+ *+'>tІK;?l1SEY@@<- *+ *+'>uІK~?l1SEZ@@<, *+ *+'>vІK?l1SE[@@<+ *+ *+'>wІK?l1SE\@@<* *+ *+'>xІK`?l1SE]@@<) *+ *+'>yІK?l1SE^@@<( *+ *+'>zІK?l1SE_@@<' *+ *+'>{ІK_?l1SE`@@<& *+ *+'>|ІK?l1SEa@@<% *+ *+'>}ІK?l1SEb@@<$ *+ *+'>~ІKA?l1SEc@@<# *+ *+'>ІK?l1SEd@@<" *+ *+'>ІK?l1SEe@@ІK#?l1SEf@@< *+ *+'>ІKe?l1SEg@@< *+ *+'>ІK?l1SEh@@< *+ *+'>ІK?l1SEi@@< *+ *+'>ІKF?l1SEj@@< *+ *+'>ІKy  ?l1SEk@@= *+ *+'>ІK<<?l1SE,l@@= *+ *+'>@UUІKVV?l1SEHm@@= *+ *+'4?!B@ІKh?l1SEn@@< *+ *+'?ІK?l1SEo@@< *+ *+'?ІK?l1SEp@@< *+ *+'?ІKI?l1SEq@@< *+ *+'?ІK?l1SEr@@< *+ *+'?ІK?l1SEs@@< *+ *+'?ІK+?l1SEt@@< *+ *+'?ІK?l1SEu@@< *+ *+'?ІK?l1SEv@@< *+ *+'? ІK ?l1SEw@@< *+ *+'? ІKl?l1SEx@@< *+ *+'? ІK?l1SEy@@< *+ *+'? ІK?l1SEz@@< *+ *+'? ІKN?l1SE{@@< *+ *+'?ІK?l1SE|@@< *+ *+'?ІK?l1SE}@@< *+ *+'?ІK0?l1SE~@@< *+ *+'?ІKq?l1SE@@< *+ *+'?ІK?l1SE@@< *+ *+'?ІK?l1SE@@< *+ *+'?ІKU?l1SE@@< *+ *+'?ІK?l1SE@@< *+ *+'?ІK?l1SE@@< *+ *+'?ІKR ?l1SE@@< *+ *+'?ІK ?l1SE@@< *+ *+'?ІK ?l1SE@@; *+ *+'?ІK4!?l1SE@@; *+ *+'?ІKv!?l1SE@@; *+ *+'?ІK!?l1SE@@; *+ *+'?ІK"?l1SE@@; *+ *+'?ІKX"?l1SE@@; *+ *+'?ІK"?l1SE@@; *+ *+'? ІK"?l1SE@@; *+ *+'?!ІK:#?l1SE@@; *+ *+'?"ІK#?l1SE@@; *+ *+'?#ІK#?l1SE@@; *+ *+'?$ІK9$?l1SE@@; *+ *+'?%ІK{$?l1SE@@; *+ *+'?&ІK$?l1SE@@; *+ *+'?'ІK%?l1SE@@; *+ *+'?(ІK\%?l1SE@@; *+ *+'?)ІK%?l1SE@@; *+ *+'?*ІK%?l1SE@@; *+ *+'?+ІK>&?l1SE@@; *+ *+'?,ІK&?l1SE@@; *+ *+'?-ІK&?l1SE@@; *+ *+'?.ІK!'?l1SE@@; *+ *+'?/ІK'?l1SE@@; *+ *+'?0ІK'?l1SE@@; *+ *+'?1ІK (?l1SE@@; *+ *+'?2ІKb(?l1SE@@; *+ *+'?3ІK(?l1SE@@; *+ *+'?4ІK)?l1SE@@; *+ *+'?5ІKC)?l1SE@@; *+ *+'?6ІK)?l1SE@@; *+ *+'?7ІK)?l1SE@@; *+ *+'?8ІK&*?l1SE@@; *+ *+'?9ІK*?l1SE@@; *+ *+'?:ІK*?l1SE@@; *+ *+'?;ІK+?l1SE@@; *+ *+'?<ІKf+?l1SE@@; *+ *+'?=ІK+?l1SE@@; *+ *+'?>ІK+?l1SE@@; *+ *+'??ІKH,?l1SE@@; *+ *+'?@ІK,?l1SE@@; *+ *+'?AІK,?l1SE@@; *+ *+'?BІK)-?l1SE@@; *+ *+'?CІKl-?l1SE@@; *+ *+'?DІK-?l1SE@@; *+ *+'?EІK .?l1SE@@; *+ *+'?FІKN.?l1SE@@; *+ *+'?GІK.?l1SE@@; *+ *+'?HІK.?l1SE@@; *+ *+'?IІKM/?l1SE@@; *+ *+'?JІK/?l1SE@@; *+ *+'?KІK/?l1SE@@; *+ *+'?LІK.0?l1SE@@; *+ *+'?MІKp0?l1SE@@; *+ *+'?NІK0?l1SE@@; *+ *+'?OІK1?l1SE@@; *+ *+'?PІKR1?l1SE@@; *+ *+'?QІK1?l1SE@@; *+ *+'?RІK1?l1SE@@; *+ *+'?SІK42?l1SE@@; *+ *+'?TІK2?l1SE@@; *+ *+'?UІK2?l1SE@@; *+ *+'?VІK33?l1SE@@; *+ *+'?WІKt3?l1SE@@; *+ *+'?XІK3?l1SE@@; *+ *+'?YІK4?l1SE@@; *+ *+'?ZІKX4?l1SE@@; *+ *+'?[ІK4?l1SE@@; *+ *+'?\ІK4?l1SE@@; *+ *+'?]ІK85?l1SE@@; *+ *+'?^ІK5?l1SE@@; *+ *+'?_ІK5?l1SE@@; *+ *+'?`ІK6?l1SE@@; *+ *+'?aІKy6?l1SE@@; *+ *+'?bІK6?l1SE@@; *+ *+'?cІK7?l1SE@@; *+ *+'?dІK\7?l1SE@@; *+ *+'?eІK7?l1SE@@; *+ *+'?fІK7?l1SE@@; *+ *+'?gІK>8?l1SE@@; *+ *+'?hІK~8?l1SE@@; *+ *+'?iІK8?l1SE@@; *+ *+'?jІK9?l1SE@@; *+ *+'?kІK~9?l1SE@@; *+ *+'?lІK9?l1SE@@; *+ *+'?mІK:?l1SE@@; *+ *+'?nІK_:?l1SE@@; *+ *+'?oІK:?l1SE@@; *+ *+'?pІK:?l1SE@@; *+ *+'?qІKB;?l1SE@@; *+ *+'?rІK;?l1SE@@; *+ *+'?sІK;?l1SE@@; *+ *+'?tІK$<?l1SE@@; *+ *+'?uІKe<?l1SE@@; *+ *+'?vІK<?l1SE@@; *+ *+'?wІK=?l1SE@@; *+ *+'?xІKH=?l1SE@@; *+ *+'?yІK=?l1SE@@; *+ *+'?zІK=?l1SE@@; *+ *+'?{ІKG>?l1SE@@; *+ *+'?|ІK>?l1SE@@; *+ *+'?}ІK>?l1SE@@; *+ *+'?~ІK)??l1SE@@; *+ *+'?ІKj??l1SE@@; *+ *+'?ІK??l1SE@@; *+ *+'?ІK @?l1SE@@; *+ *+'?ІKM@?l1SE@@; *+ *+'?ІK@?l1SE@@; *+ *+'?ІK@?l1SE@@; *+ *+'?ІK/A?l1SE@@; *+ *+'?ІKaA  ?l1SE@@< *+ *+'?ІKhA<<?l1SE,@@=e *+ *+'?@UUІKySVV?l1SEH@@=H *+ *+'4@!N@ІK.T?l1SE@@; *+ *+'@ІKoT?l1SE@@; *+ *+'@ІKT?l1SE@@; *+ *+'@ІKU?l1SE@@; *+ *+'@ІKPU?l1SE@@; *+ *+'@ІKU?l1SE@@; *+ *+'@ІKU?l1SE@@; *+ *+'@ІKOV?l1SE@@; *+ *+'@ІKV?l1SE@@; *+ *+'@ ІKV?l1SE@@; *+ *+'@ ІK2W?l1SE@@; *+ *+'@ ІKsW?l1SE@@; *+ *+'@ ІKW?l1SE@@; *+ *+'@ ІKX?l1SE@@; *+ *+'@ІKUX?l1SE@@; *+ *+'@ІKX?l1SE@@; *+ *+'@ІKX?l1SE@@; *+ *+'@ІK8Y?l1SE@@;~ *+ *+'@ІKY?l1SE @@;} *+ *+'@ІKY?l1SE @@;| *+ *+'@ІKZ?l1SE @@;{ *+ *+'@ІKxZ?l1SE @@;z *+ *+'@ІKZ?l1SE @@;y *+ *+'@ІK[?l1SE@@;x *+ *+'@ІKZ[?l1SE@@;w *+ *+'@ІK[?l1SE@@;v *+ *+'@ІK[?l1SE@@;u *+ *+'@ІK<\?l1SE@@;t *+ *+'@ІK\?l1SE@@;s *+ *+'@ІK\?l1SE@@;r *+ *+'@ІK]?l1SE@@;q *+ *+'@ІK}]?l1SE@@;p *+ *+'@ ІK]?l1SE@@;o *+ *+'@!ІK^?l1SE@@;n *+ *+'@"ІK_^?l1SE@@;m *+ *+'@#ІK^?l1SE@@;l *+ *+'@$ІK^?l1SE@@;k *+ *+'@%ІK@_?l1SE@@;j *+ *+'@&ІK_?l1SE@@;i *+ *+'@'ІK_?l1SE@@;h *+ *+'@(ІK#`?l1SE@@;g *+ *+'@)ІKd`?l1SE @@;f *+ *+'@*ІK`?l1SE!@@;e *+ *+'@+ІKa?l1SE"@@;d *+ *+'@,ІKca?l1SE#@@;c *+ *+'@-ІKa?l1SE$@@;b *+ *+'@.ІKa?l1SE%@@;a *+ *+'@/ІKFb?l1SE&@@;` *+ *+'@0ІKb?l1SE'@@;_ *+ *+'@1ІKb?l1SE(@@;^ *+ *+'@2ІK'c?l1SE)@@;] *+ *+'@3ІKjc?l1SE*@@;\ *+ *+'@4ІKc?l1SE+@@;[ *+ *+'@5ІK d?l1SE,@@;Z *+ *+'@6ІKKd?l1SE-@@;Y *+ *+'@7ІKd?l1SE.@@;X *+ *+'@8ІKd?l1SE/@@;W *+ *+'@9ІKKe?l1SE0@@;V *+ *+'@:ІKe?l1SE1@@;U *+ *+'@;ІKe?l1SE2@@;T *+ *+'@<ІK+f?l1SE3@@;S *+ *+'@=ІKmf?l1SE4@@;R *+ *+'@>ІKf?l1SE5@@;Q *+ *+'@?ІKg?l1SE6@@;P *+ *+'@@ІKOg?l1SE7@@;O *+ *+'@AІKg?l1SE8@@;N *+ *+'@BІKg?l1SE9@@;M *+ *+'@CІK2h?l1SE:@@;L *+ *+'@DІKh?l1SE;@@;K *+ *+'@EІKh?l1SE<@@;J *+ *+'@FІKi?l1SE=@@;I *+ *+'@GІKsi?l1SE>@@;H *+ *+'@HІKi?l1SE?@@;G *+ *+'@IІKj?l1SE@@@;F *+ *+'@JІKUj?l1SEA@@;E *+ *+'@KІKj?l1SEB@@;D *+ *+'@LІKj?l1SEC@@;C *+ *+'@MІK6k?l1SED@@;B *+ *+'@NІKk?l1SEE@@;A *+ *+'@OІKk?l1SEF@@;@ *+ *+'@PІKl?l1SEG@@;? *+ *+'@QІKwl?l1SEH@@;> *+ *+'@RІKl?l1SEI@@;= *+ *+'@SІKl?l1SEJ@@;< *+ *+'@TІKYm?l1SEK@@;; *+ *+'@UІKm?l1SEL@@;: *+ *+'@VІKm?l1SEM@@;9 *+ *+'@WІK;n?l1SEN@@;8 *+ *+'@XІK}n?l1SEO@@;7 *+ *+'@YІKn?l1SEP@@;6 *+ *+'@ZІKo?l1SEQ@@;5 *+ *+'@[ІK]o?l1SER@@;4 *+ *+'@\ІKo?l1SES@@;3 *+ *+'@]ІKo?l1SET@@;2 *+ *+'@^ІK]p?l1SEU@@;1 *+ *+'@_ІKp?l1SEV@@;0 *+ *+'@`ІKp?l1SEW@@;/ *+ *+'@aІK?q?l1SEX@@;. *+ *+'@bІKq?l1SEY@@;- *+ *+'@cІKq?l1SEZ@@;, *+ *+'@dІK"r?l1SE[@@;+ *+ *+'@eІKcr?l1SE\@@;* *+ *+'@fІKr?l1SE]@@;) *+ *+'@gІKs?l1SE^@@;( *+ *+'@hІKEs?l1SE_@@;' *+ *+'@iІKs?l1SE`@@;& *+ *+'@jІKs?l1SEa@@;% *+ *+'@kІKCt?l1SEb@@;$ *+ *+'@lІKt?l1SEc@@;# *+ *+'@mІKt?l1SEd@@;" *+ *+'@nІK&u?l1SEe@@;! *+ *+'@oІKhu?l1SEf@@; *+ *+'@pІKu?l1SEg@@; *+ *+'@qІKv?l1SEh@@; *+ *+'@rІKJv?l1SEi@@; *+ *+'@sІKv?l1SEj@@; *+ *+'@tІKv?l1SEk@@; *+ *+'@uІK,w?l1SEl@@; *+ *+'@vІKw?l1SEm@@; *+ *+'@wІKw?l1SEn@@; *+ *+'@xІKx?l1SEo@@; *+ *+'@yІKmx?l1SEp@@; *+ *+'@zІKx?l1SEq@@; *+ *+'@{ІK y?l1SEr@@; *+ *+'@|ІKMy?l1SEs@@; *+ *+'@}ІKy?l1SEt@@; *+ *+'@~ІKy?l1SEu@@; *+ *+'@ІK0z?l1SEv@@; *+ *+'@ІKz?l1SEw@@; *+ *+'@ІKz?l1SEx@@; *+ *+'@ІK{?l1SEy@@; *+ *+'@ІKq{?l1SEz@@; *+ *+'@ІK{?l1SE{@@; *+ *+'@ІK{?l1SE|@@; *+ *+'@ІK(|  ?l1SE}@@< *+ *+'@ІK0|<<?l1SE,~@@< *+ *+'@@UUІK^VV?l1SEH@@< *+ *+'4A!@ІK?l1SE@@; *+ *+'AІKV?l1SE@@; *+ *+'AІK?l1SE@@; *+ *+'AІK?l1SE@@; *+ *+'AІK8?l1SE@@; *+ *+'AІK?l1SE@@; *+ *+'AІKِ?l1SE@@; *+ *+'AІK8?l1SE@@: *+ *+'AІKy?l1SE@@: *+ *+'A ІK?l1SE@@: *+ *+'A ІK?l1SE@@: *+ *+'A ІK\?l1SE@@: *+ *+'A ІK?l1SE@@: *+ *+'A ІK?l1SE@@: *+ *+'AІK=?l1SE@@: *+ *+'AІK?l1SE@@: *+ *+'AІKݓ?l1SE@@: *+ *+'AІK?l1SE@@: *+ *+'AІK~?l1SE@@: *+ *+'AІK?l1SE@@: *+ *+'AІK?l1SE@@: *+ *+'AІK`?l1SE@@: *+ *+'AІK?l1SE@@: *+ *+'AІK?l1SE@@: *+ *+'AІKB?l1SE@@: *+ *+'AІK?l1SE@@: *+ *+'AІK?l1SE@@: *+ *+'AІK#?l1SE@@: *+ *+'AІK?l1SE@@: *+ *+'AІKė?l1SE@@: *+ *+'AІK?l1SE@@: *+ *+'AІKd?l1SE@@: *+ *+'A ІK?l1SE@@: *+ *+'A!ІK?l1SE@@: *+ *+'A"ІKG?l1SE@@: *+ *+'A#ІK?l1SE@@: *+ *+'A$ІK?l1SE@@: *+ *+'A%ІK(?l1SE@@: *+ *+'A&ІKi?l1SE@@: *+ *+'A'ІKȚ?l1SE@@: *+ *+'A(ІK ?l1SE@@: *+ *+'A)ІKM?l1SE@@: *+ *+'A*ІK?l1SE@@: *+ *+'A+ІK?l1SE@@: *+ *+'A,ІKJ?l1SE@@: *+ *+'A-ІK?l1SE@@: *+ *+'A.ІKΜ?l1SE@@: *+ *+'A/ІK-?l1SE@@: *+ *+'A0ІKn?l1SE@@: *+ *+'A1ІK͝?l1SE@@: *+ *+'A2ІK?l1SE@@: *+ *+'A3ІKP?l1SE@@: *+ *+'A4ІK?l1SE@@: *+ *+'A5ІK?l1SE@@: *+ *+'A6ІK5?l1SE@@: *+ *+'A7ІK?l1SE@@: *+ *+'A8ІKӟ?l1SE@@: *+ *+'A9ІK1?l1SE@@: *+ *+'A:ІKt?l1SE@@: *+ *+'A;ІK?l1SE@@: *+ *+'A<ІK?l1SE@@: *+ *+'A=ІKT?l1SE@@: *+ *+'A>ІK?l1SE@@: *+ *+'A?ІK?l1SE@@: *+ *+'A@ІK7?l1SE@@: *+ *+'AAІK?l1SE@@: *+ *+'ABІKע?l1SE@@: *+ *+'ACІK?l1SE@@: *+ *+'ADІKx?l1SE@@: *+ *+'AEІK?l1SE@@: *+ *+'AFІK?l1SE@@: *+ *+'AGІKZ?l1SE@@: *+ *+'AHІK?l1SE@@: *+ *+'AIІK?l1SE@@: *+ *+'AJІK;?l1SE@@: *+ *+'AKІK~?l1SE@@: *+ *+'ALІKܥ?l1SE@@: *+ *+'AMІK?l1SE@@: *+ *+'ANІK}?l1SE@@: *+ *+'AOІK?l1SE@@: *+ *+'APІK?l1SE@@: *+ *+'AQІK^?l1SE@@: *+ *+'ARІK?l1SE@@: *+ *+'ASІK?l1SE@@: *+ *+'ATІK@?l1SE@@: *+ *+'AUІK?l1SE@@: *+ *+'AVІK?l1SE@@: *+ *+'AWІK#?l1SE@@: *+ *+'AXІKd?l1SE@@: *+ *+'AYІKé?l1SE@@: *+ *+'AZІK?l1SE@@: *+ *+'A[ІKF?l1SE@@: *+ *+'A\ІK?l1SE@@: *+ *+'A]ІK?l1SE@@: *+ *+'A^ІKE?l1SE@@: *+ *+'A_ІK?l1SE@@: *+ *+'A`ІKɫ?l1SE@@: *+ *+'AaІK&?l1SE@@: *+ *+'AbІKh?l1SE@@: *+ *+'AcІKǬ?l1SE@@: *+ *+'AdІK ?l1SE@@: *+ *+'AeІKJ?l1SE@@: *+ *+'AfІK?l1SE@@: *+ *+'AgІK?l1SE@@: *+ *+'AhІK,?l1SE@@: *+ *+'AiІK?l1SE@@: *+ *+'AjІKͮ?l1SE@@: *+ *+'AkІK+?l1SE@@: *+ *+'AlІKn?l1SE@@: *+ *+'AmІK?l1SE@@: *+ *+'AnІK?l1SE@@: *+ *+'AoІKO?l1SE@@: *+ *+'ApІK?l1SE@@: *+ *+'AqІK?l1SE@@: *+ *+'ArІK1?l1SE@@: *+ *+'AsІK?l1SE@@: *+ *+'AtІKѱ?l1SE@@: *+ *+'AuІK?l1SE@@: *+ *+'AvІKq?l1SE@@: *+ *+'AwІK?l1SE@@: *+ *+'AxІK?l1SE@@: *+ *+'AyІKT?l1SE@@: *+ *+'AzІK?l1SE@@: *+ *+'A{ІK?l1SE@@: *+ *+'A|ІK6?l1SE@@: *+ *+'A}ІKw?l1SE@@: *+ *+'A~ІKִ?l1SE@@: *+ *+'AІK?l1SE@@: *+ *+'AІKv?l1SE@@: *+ *+'AІK?l1SE@@: *+ *+'AІK?l1SE@@: *+ *+'AІKY?l1SE@@: *+ *+'AІK?l1SE@@: *+ *+'AІK۶?l1SE@@: *+ *+'AІK  ?l1SE@@; *+ *+'AІK<<?l1SE,@@@@:H *+ *+'B6ІK?l1SE?@@:G *+ *+'B7ІKX?l1SE@@@:F *+ *+'B8ІK?l1SEA@@:E *+ *+'B9ІK?l1SEB@@:D *+ *+'B:ІK;?l1SEC@@:C *+ *+'B;ІK|?l1SED@@:B *+ *+'B<ІK?l1SEE@@:A *+ *+'B=ІK?l1SEF@@:@ *+ *+'B>ІK^?l1SEG@@:? *+ *+'B?ІK?l1SEH@@:> *+ *+'B@ІK?l1SEI@@:= *+ *+'BAІK]?l1SEJ@@:< *+ *+'BBІK?l1SEK@@:; *+ *+'BCІK?l1SEL@@:: *+ *+'BDІK??l1SEM@@:9 *+ *+'BEІK?l1SEN@@:8 *+ *+'BFІK?l1SEO@@:7 *+ *+'BGІK"?l1SEP@@:6 *+ *+'BHІKb?l1SEQ@@:5 *+ *+'BIІK?l1SER@@:4 *+ *+'BJІK?l1SES@@:3 *+ *+'BKІKE?l1SET@@:2 *+ *+'BLІK?l1SEU@@:1 *+ *+'BMІK?l1SEV@@:0 *+ *+'BNІKD?l1SEW@@:/ *+ *+'BOІK?l1SEX@@:. *+ *+'BPІK?l1SEY@@:- *+ *+'BQІK&?l1SEZ@@:, *+ *+'BRІKg?l1SE[@@:+ *+ *+'BSІK?l1SE\@@:* *+ *+'BTІK?l1SE]@@:) *+ *+'BUІKI?l1SE^@@:( *+ *+'BVІK?l1SE_@@:' *+ *+'BWІK?l1SE`@@:& *+ *+'BXІK,?l1SEa@@:% *+ *+'BYІK?l1SEb@@:$ *+ *+'BZІK?l1SEc@@:# *+ *+'B[ІK ?l1SEd@@:" *+ *+'B\ІKl?l1SEe@@:! *+ *+'B]ІK?l1SEf@@: *+ *+'B^ІK ?l1SEg@@: *+ *+'B_ІKN?l1SEh@@: *+ *+'B`ІK?l1SEi@@: *+ *+'BaІK?l1SEj@@: *+ *+'BbІK/?l1SEk@@: *+ *+'BcІK?l1SEl@@: *+ *+'BdІK?l1SEm@@: *+ *+'BeІK?l1SEn@@: *+ *+'BfІKq?l1SEo@@: *+ *+'BgІK?l1SEp@@: *+ *+'BhІK?l1SEq@@: *+ *+'BiІKS?l1SEr@@: *+ *+'BjІK?l1SEs@@: *+ *+'BkІK?l1SEt@@: *+ *+'BlІK4?l1SEu@@: *+ *+'BmІKv?l1SEv@@: *+ *+'BnІK?l1SEw@@: *+ *+'BoІK?l1SEx@@: *+ *+'BpІKX?l1SEy@@: *+ *+'BqІK?l1SEz@@: *+ *+'BrІK?l1SE{@@: *+ *+'BsІKW?l1SE|@@: *+ *+'BtІK?l1SE}@@: *+ *+'BuІK?l1SE~@@: *+ *+'BvІK9?l1SE@@: *+ *+'BwІKz?l1SE@@: *+ *+'BxІK?l1SE@@: *+ *+'ByІK?l1SE@@: *+ *+'BzІK]?l1SE@@: *+ *+'B{ІK?l1SE@@: *+ *+'B|ІK?l1SE@@: *+ *+'B}ІK??l1SE@@: *+ *+'B~ІK?l1SE@@9 *+ *+'BІK?l1SE@@9 *+ *+'BІK>?l1SE@@9 *+ *+'BІK?l1SE@@9 *+ *+'BІK?l1SE@@9 *+ *+'BІK ?l1SE@@9 *+ *+'BІKa?l1SE@@9 *+ *+'BІK?l1SE@@9 *+ *+'BІK  ?l1SE@@: *+ *+'BІK<<?l1SE,@@; *+ *+'B@UUІK VV?l1SEH@@; *+ *+'4C!@ІK?l1SE@@9 *+ *+'CІK?l1SE@@9 *+ *+'CІKd?l1SE@@9 *+ *+'CІK?l1SE@@9 *+ *+'CІK?l1SE@@9 *+ *+'CІKF?l1SE@@9 *+ *+'CІK?l1SE@@9 *+ *+'CІK?l1SE@@9 *+ *+'CІK(?l1SE@@9 *+ *+'C ІKi?l1SE@@9 *+ *+'C ІK?l1SE@@9 *+ *+'C ІK ?l1SE@@9 *+ *+'C ІKK?l1SE@@9 *+ *+'C ІK?l1SE@@9 *+ *+'CІK?l1SE@@9 *+ *+'CІKK ?l1SE@@9 *+ *+'CІK ?l1SE@@9 *+ *+'CІK ?l1SE@@9 *+ *+'CІK- ?l1SE@@9 *+ *+'CІKo ?l1SE@@9 *+ *+'CІK ?l1SE@@9 *+ *+'CІK ?l1SE@@9 *+ *+'CІKQ ?l1SE@@9 *+ *+'CІK ?l1SE@@9 *+ *+'CІK ?l1SE@@9 *+ *+'CІK3 ?l1SE@@9 *+ *+'CІK ?l1SE@@9 *+ *+'CІK ?l1SE@@9 *+ *+'CІK0 ?l1SE@@9 *+ *+'CІKs ?l1SE@@9 *+ *+'CІK ?l1SE@@9 *+ *+'CІK?l1SE@@9 *+ *+'C ІKU?l1SE@@9 *+ *+'C!ІK?l1SE@@9 *+ *+'C"ІK?l1SE@@9 *+ *+'C#ІK6?l1SE@@9 *+ *+'C$ІK?l1SE@@9 *+ *+'C%ІK?l1SE@@9 *+ *+'C&ІK?l1SE@@9 *+ *+'C'ІKx?l1SE@@9 *+ *+'C(ІK?l1SE@@9 *+ *+'C)ІK?l1SE@@9 *+ *+'C*ІKZ?l1SE@@9 *+ *+'C+ІK?l1SE@@9 *+ *+'C,ІK?l1SE@@9 *+ *+'C-ІK;?l1SE@@9 *+ *+'C.ІK}?l1SE@@9 *+ *+'C/ІK?l1SE@@9 *+ *+'C0ІK?l1SE@@9 *+ *+'C1ІK{?l1SE@@9 *+ *+'C2ІK?l1SE@@9 *+ *+'C3ІK?l1SE@@9 *+ *+'C4ІK^?l1SE@@9 *+ *+'C5ІK?l1SE@@9 *+ *+'C6ІK?l1SE@@9 *+ *+'C7ІKA?l1SE@@9 *+ *+'C8ІK?l1SE@@9 *+ *+'C9ІK?l1SE@@9 *+ *+'C:ІK!?l1SE@@9 *+ *+'C;ІKe?l1SE@@9 *+ *+'C<ІK?l1SE@@9 *+ *+'C=ІK?l1SE@@9 *+ *+'C>ІKE?l1SE@@9 *+ *+'C?ІK?l1SE@@9 *+ *+'C@ІK?l1SE@@9 *+ *+'CAІKE?l1SE@@9 *+ *+'CBІK?l1SE@@9 *+ *+'CCІK?l1SE@@9 *+ *+'CDІK&?l1SE@@9 *+ *+'CEІKi?l1SE@@9 *+ *+'CFІK?l1SE@@9 *+ *+'CGІK ?l1SE@@9 *+ *+'CHІKK?l1SE@@9 *+ *+'CIІK?l1SE@@9 *+ *+'CJІK?l1SE@@9 *+ *+'CKІK,?l1SE@@9 *+ *+'CLІK?l1SE@@9 *+ *+'CMІK?l1SE@@9 *+ *+'CNІK,?l1SE@@9 *+ *+'COІKl?l1SE@@9 *+ *+'CPІK?l1SE@@9 *+ *+'CQІK ?l1SE@@9 *+ *+'CRІKO?l1SE@@9 *+ *+'CSІK?l1SE@@9 *+ *+'CTІK?l1SE@@9 *+ *+'CUІK1?l1SE@@9 *+ *+'CVІK?l1SE@@9 *+ *+'CWІK?l1SE@@9 *+ *+'CXІK?l1SE@@9 *+ *+'CYІKr?l1SE@@9 *+ *+'CZІK?l1SE@@9 *+ *+'C[ІK?l1SE@@9 *+ *+'C\ІKT ?l1SE@@9 *+ *+'C]ІK ?l1SE@@9 *+ *+'C^ІK ?l1SE@@9 *+ *+'C_ІK5!?l1SE@@9 *+ *+'C`ІKw!?l1SE@@9 *+ *+'CaІK!?l1SE@@9 *+ *+'CbІK"?l1SE@@9 *+ *+'CcІKv"?l1SE@@9 *+ *+'CdІK"?l1SE@@9 *+ *+'CeІK"?l1SE@@9 *+ *+'CfІKX#?l1SE@@9 *+ *+'CgІK#?l1SE@@9 *+ *+'ChІK#?l1SE@@9 *+ *+'CiІK;$?l1SE@@9 *+ *+'CjІK|$?l1SE@@9 *+ *+'CkІK$?l1SE@@9 *+ *+'ClІK%?l1SE@@9 *+ *+'CmІK]%?l1SE@@9 *+ *+'CnІK%?l1SE@@9 *+ *+'CoІK%?l1SE@@9 *+ *+'CpІK@&?l1SE@@9 *+ *+'CqІK&?l1SE@@9 *+ *+'CrІK&?l1SE@@9 *+ *+'CsІK>'?l1SE@@9 *+ *+'CtІK'?l1SE@@9 *+ *+'CuІK'?l1SE@@9 *+ *+'CvІK!(?l1SE@@9~ *+ *+'CwІKb(?l1SE @@9} *+ *+'CxІK(?l1SE @@9| *+ *+'CyІK)?l1SE @@9{ *+ *+'CzІKD)?l1SE @@9z *+ *+'C{ІK)?l1SE @@9y *+ *+'C|ІK)?l1SE@@9x *+ *+'C}ІK'*?l1SE@@9w *+ *+'C~ІK*?l1SE@@9v *+ *+'CІK*?l1SE@@9u *+ *+'CІK&+?l1SE@@9t *+ *+'CІKg+?l1SE@@9s *+ *+'CІK+?l1SE@@9r *+ *+'CІK,?l1SE@@9q *+ *+'CІKH,?l1SE@@9p *+ *+'CІK,?l1SE@@9o *+ *+'CІK,  ?l1SE@@:r *+ *+'CІK,<<?l1SE,@@;A *+ *+'C@UUІK>VV?l1SEH@@;$ *+ *+'4D!Ξ1@ІK??l1SE@@9k *+ *+'DІK??l1SE@@9j *+ *+'DІKK@?l1SE@@9i *+ *+'DІK@?l1SE@@9h *+ *+'DІK@?l1SE@@9g *+ *+'DІK-A?l1SE @@9f *+ *+'DІKpA?l1SE!@@9e *+ *+'DІKA?l1SE"@@9d *+ *+'DІKB?l1SE#@@9c *+ *+'D ІKRB?l1SE$@@9b *+ *+'D ІKB?l1SE%@@9a *+ *+'D ІKB?l1SE&@@9` *+ *+'D ІK3C?l1SE'@@9_ *+ *+'D ІKC?l1SE(@@9^ *+ *+'DІKC?l1SE)@@9] *+ *+'DІK2D?l1SE*@@9\ *+ *+'DІKsD?l1SE+@@9[ *+ *+'DІKD?l1SE,@@9Z *+ *+'DІKE?l1SE-@@9Y *+ *+'DІKVE?l1SE.@@9X *+ *+'DІKE?l1SE/@@9W *+ *+'DІKE?l1SE0@@9V *+ *+'DІK8F?l1SE1@@9U *+ *+'DІKF?l1SE2@@9T *+ *+'DІKF?l1SE3@@9S *+ *+'DІKG?l1SE4@@9R *+ *+'DІKxG?l1SE5@@9Q *+ *+'DІKG?l1SE6@@9P *+ *+'DІKH?l1SE7@@9O *+ *+'DІKZH?l1SE8@@9N *+ *+'DІKH?l1SE9@@9M *+ *+'DІKH?l1SE:@@9L *+ *+'D ІK@@9H *+ *+'D$ІK}J?l1SE?@@9G *+ *+'D%ІKJ?l1SE@@@9F *+ *+'D&ІKK?l1SEA@@9E *+ *+'D'ІK_K?l1SEB@@9D *+ *+'D(ІKK?l1SEC@@9C *+ *+'D)ІKK?l1SED@@9B *+ *+'D*ІKBL?l1SEE@@9A *+ *+'D+ІKL?l1SEF@@9@ *+ *+'D,ІKL?l1SEG@@9? *+ *+'D-ІK#M?l1SEH@@9> *+ *+'D.ІKdM?l1SEI@@9= *+ *+'D/ІKM?l1SEJ@@9< *+ *+'D0ІKN?l1SEK@@9; *+ *+'D1ІKcN?l1SEL@@9: *+ *+'D2ІKN?l1SEM@@99 *+ *+'D3ІKN?l1SEN@@98 *+ *+'D4ІKEO?l1SEO@@97 *+ *+'D5ІKO?l1SEP@@96 *+ *+'D6ІKO?l1SEQ@@95 *+ *+'D7ІK(P?l1SER@@94 *+ *+'D8ІKiP?l1SES@@93 *+ *+'D9ІKP?l1SET@@92 *+ *+'D:ІK Q?l1SEU@@91 *+ *+'D;ІKKQ?l1SEV@@90 *+ *+'D<ІKQ?l1SEW@@9/ *+ *+'D=ІKQ?l1SEX@@9. *+ *+'D>ІK.R?l1SEY@@9- *+ *+'D?ІKR?l1SEZ@@9, *+ *+'D@ІKR?l1SE[@@9+ *+ *+'DAІK-S?l1SE\@@9* *+ *+'DBІKmS?l1SE]@@9) *+ *+'DCІKS?l1SE^@@9( *+ *+'DDІKT?l1SE_@@9' *+ *+'DEІKPT?l1SE`@@9& *+ *+'DFІKT?l1SEa@@9% *+ *+'DGІKT?l1SEb@@9$ *+ *+'DHІK2U?l1SEc@@9# *+ *+'DIІKU?l1SEd@@9" *+ *+'DJІKU?l1SEe@@9! *+ *+'DKІKV?l1SEf@@9 *+ *+'DLІKrV?l1SEg@@9 *+ *+'DMІKV?l1SEh@@9 *+ *+'DNІKW?l1SEi@@9 *+ *+'DOІKTW?l1SEj@@9 *+ *+'DPІKW?l1SEk@@9 *+ *+'DQІKW?l1SEl@@9 *+ *+'DRІK6X?l1SEm@@9 *+ *+'DSІKxX?l1SEn@@9 *+ *+'DTІKX?l1SEo@@9 *+ *+'DUІKY?l1SEp@@9 *+ *+'DVІKwY?l1SEq@@9 *+ *+'DWІKY?l1SEr@@9 *+ *+'DXІKY?l1SEs@@9 *+ *+'DYІKYZ?l1SEt@@9 *+ *+'DZІKZ?l1SEu@@9 *+ *+'D[ІKZ?l1SEv@@9 *+ *+'D\ІK;[?l1SEw@@9 *+ *+'D]ІK}[?l1SEx@@9 *+ *+'D^ІK[?l1SEy@@9 *+ *+'D_ІK\?l1SEz@@9 *+ *+'D`ІK_\?l1SE{@@9 *+ *+'DaІK\?l1SE|@@9 *+ *+'DbІK\?l1SE}@@9 *+ *+'DcІK^]?l1SE~@@9 *+ *+'DdІK]?l1SE@@9 *+ *+'DeІK]?l1SE@@9 *+ *+'DfІK?^?l1SE@@9 *+ *+'DgІK^?l1SE@@9 *+ *+'DhІK^?l1SE@@9 *+ *+'DiІK"_?l1SE@@9 *+ *+'DjІKc_?l1SE@@9 *+ *+'DkІK_?l1SE@@9 *+ *+'DlІK`?l1SE@@8 *+ *+'DmІKF`?l1SE@@8 *+ *+'DnІK`?l1SE@@8 *+ *+'DoІK`?l1SE@@8 *+ *+'DpІK'a?l1SE@@8 *+ *+'DqІKa?l1SE@@8 *+ *+'DrІKa?l1SE@@8 *+ *+'DsІK%b?l1SE@@8 *+ *+'DtІKib?l1SE@@8 *+ *+'DuІKb?l1SE@@8 *+ *+'DvІKc?l1SE@@8 *+ *+'DwІKJc?l1SE@@8 *+ *+'DxІKc?l1SE@@8 *+ *+'DyІKc?l1SE@@8 *+ *+'DzІK,d?l1SE@@8 *+ *+'D{ІKd?l1SE@@8 *+ *+'D|ІKd?l1SE@@8 *+ *+'D}ІKe?l1SE@@8 *+ *+'D~ІKle?l1SE@@8 *+ *+'DІKe?l1SE@@8 *+ *+'DІK f?l1SE@@8 *+ *+'DІKNf?l1SE@@8 *+ *+'DІKf?l1SE@@8 *+ *+'DІKf?l1SE@@8 *+ *+'DІK1g?l1SE@@8 *+ *+'DІKqg?l1SE@@8 *+ *+'DІKg  ?l1SE@@9 *+ *+'DІKg<<?l1SE,@@: *+ *+'D@UUІKyVV?l1SEH@@: *+ *+'4E!)@ІKez?l1SE@@8 *+ *+'EІKz?l1SE@@8 *+ *+'EІK{?l1SE@@8 *+ *+'EІKF{?l1SE@@8 *+ *+'EІK{?l1SE@@8 *+ *+'EІK{?l1SE@@8 *+ *+'EІK)|?l1SE@@8 *+ *+'EІK|?l1SE@@8 *+ *+'EІK|?l1SE@@8 *+ *+'E ІK }?l1SE@@8 *+ *+'E ІKi}?l1SE@@8 *+ *+'E ІK}?l1SE@@8 *+ *+'E ІK}?l1SE@@8 *+ *+'E ІKK~?l1SE@@8 *+ *+'EІK~?l1SE@@8 *+ *+'EІK~?l1SE@@8 *+ *+'EІK-?l1SE@@8 *+ *+'EІKo?l1SE@@8 *+ *+'EІK?l1SE@@8 *+ *+'EІK?l1SE@@8 *+ *+'EІKQ?l1SE@@8 *+ *+'EІK?l1SE@@8 *+ *+'EІK?l1SE@@8 *+ *+'EІKP?l1SE@@8 *+ *+'EІK?l1SE@@8 *+ *+'EІKԁ?l1SE@@8 *+ *+'EІK1?l1SE@@8 *+ *+'EІKt?l1SE@@8 *+ *+'EІK҂?l1SE@@8 *+ *+'EІK?l1SE@@8 *+ *+'EІKU?l1SE@@8 *+ *+'EІK?l1SE@@8 *+ *+'E ІK?l1SE@@8 *+ *+'E!ІK7?l1SE@@8 *+ *+'E"ІK?l1SE@@8 *+ *+'E#ІKׄ?l1SE@@8 *+ *+'E$ІK6?l1SE@@8 *+ *+'E%ІKx?l1SE@@8 *+ *+'E&ІK?l1SE@@8 *+ *+'E'ІK?l1SE@@8 *+ *+'E(ІKZ?l1SE@@8 *+ *+'E)ІK?l1SE@@8 *+ *+'E*ІK?l1SE@@8 *+ *+'E+ІK;?l1SE@@8 *+ *+'E,ІK?l1SE@@8 *+ *+'E-ІK܇?l1SE@@8 *+ *+'E.ІK?l1SE@@8 *+ *+'E/ІK|?l1SE@@8 *+ *+'E0ІK?l1SE@@8 *+ *+'E1ІK?l1SE@@8 *+ *+'E2ІK_?l1SE@@8 *+ *+'E3ІK?l1SE@@8 *+ *+'E4ІK?l1SE@@8 *+ *+'E5ІKA?l1SE@@8 *+ *+'E6ІK?l1SE@@8 *+ *+'E7ІK?l1SE@@8 *+ *+'E8ІK"?l1SE@@8 *+ *+'E9ІK?l1SE@@8 *+ *+'E:ІK‹?l1SE@@8 *+ *+'E;ІK?l1SE@@8 *+ *+'E<ІKc?l1SE@@8 *+ *+'E=ІK?l1SE@@8 *+ *+'E>ІK?l1SE@@8 *+ *+'E?ІKE?l1SE@@8 *+ *+'E@ІK?l1SE@@8 *+ *+'EAІK?l1SE@@8 *+ *+'EBІK'?l1SE@@8 *+ *+'ECІKi?l1SE@@8 *+ *+'EDІKȎ?l1SE@@8 *+ *+'EEІK ?l1SE@@8 *+ *+'EFІKK?l1SE@@8 *+ *+'EGІK?l1SE@@8 *+ *+'EHІK?l1SE@@8 *+ *+'EIІKJ?l1SE@@8 *+ *+'EJІK?l1SE@@8 *+ *+'EKІK͐?l1SE@@8 *+ *+'ELІK,?l1SE@@8 *+ *+'EMІKm?l1SE@@8 *+ *+'ENІKˑ?l1SE@@8 *+ *+'EOІK ?l1SE@@8 *+ *+'EPІKO?l1SE@@8 *+ *+'EQІK?l1SE@@8 *+ *+'ERІK?l1SE@@8 *+ *+'ESІK2?l1SE@@8 *+ *+'ETІK?l1SE@@8 *+ *+'EUІKғ?l1SE@@8 *+ *+'EVІK0?l1SE@@8 *+ *+'EWІKr?l1SE@@8 *+ *+'EXІK?l1SE@@8 *+ *+'EYІK?l1SE@@8 *+ *+'EZІKS?l1SE@@8 *+ *+'E[ІK?l1SE@@8 *+ *+'E\ІK?l1SE@@8 *+ *+'E]ІK5?l1SE@@8 *+ *+'E^ІK?l1SE@@8 *+ *+'E_ІK֖?l1SE@@8 *+ *+'E`ІK?l1SE@@8 *+ *+'EaІKw?l1SE@@8 *+ *+'EbІK?l1SE@@8 *+ *+'EcІK?l1SE@@8 *+ *+'EdІKX?l1SE@@8~ *+ *+'EeІK?l1SE @@8} *+ *+'EfІK?l1SE @@8| *+ *+'EgІK<?l1SE @@8{ *+ *+'EhІK}?l1SE @@8z *+ *+'EiІKۙ?l1SE @@8y *+ *+'EjІK?l1SE@@8x *+ *+'EkІK{?l1SE@@8w *+ *+'ElІK?l1SE@@8v *+ *+'EmІK?l1SE@@8u *+ *+'EnІK]?l1SE@@8t *+ *+'EoІK?l1SE@@8s *+ *+'EpІK?l1SE@@8r *+ *+'EqІK??l1SE@@8q *+ *+'ErІK?l1SE@@8p *+ *+'EsІK?l1SE@@8o *+ *+'EtІK!?l1SE@@8n *+ *+'EuІKc?l1SE@@8m *+ *+'EvІK?l1SE@@8l *+ *+'EwІK?l1SE@@8k *+ *+'ExІKE?l1SE@@8j *+ *+'EyІK?l1SE@@8i *+ *+'EzІK?l1SE@@8h *+ *+'E{ІKC?l1SE@@8g *+ *+'E|ІK?l1SE @@8f *+ *+'E}ІKȟ?l1SE!@@8e *+ *+'E~ІK'?l1SE"@@8d *+ *+'EІKg?l1SE#@@8c *+ *+'EІKǠ?l1SE$@@8b *+ *+'EІK?l1SE%@@8a *+ *+'EІKI?l1SE&@@8` *+ *+'EІK?l1SE'@@8_ *+ *+'EІK?l1SE(@@8^ *+ *+'EІK,?l1SE)@@8] *+ *+'EІK_  ?l1SE*@@9` *+ *+'EІKf<<?l1SE,+@@:/ *+ *+'E@UUІKVV?l1SEH,@@: *+ *+'4F!@ІKM?l1SE-@@8Y *+ *+'FІK?l1SE.@@8X *+ *+'FІK?l1SE/@@8W *+ *+'FІK.?l1SE0@@8V *+ *+'FІKp?l1SE1@@8U *+ *+'FІKζ?l1SE2@@8T *+ *+'FІK?l1SE3@@8S *+ *+'FІKo?l1SE4@@8R *+ *+'FІK?l1SE5@@8Q *+ *+'F ІK?l1SE6@@8P *+ *+'F ІKQ?l1SE7@@8O *+ *+'F ІK?l1SE8@@8N *+ *+'F ІKԸ?l1SE9@@8M *+ *+'F ІK:?l1SE:@@8L *+ *+'FІKs?l1SE;@@8K *+ *+'FІKӹ?l1SE<@@8J *+ *+'FІK?l1SE=@@8I *+ *+'FІKV?l1SE>@@8H *+ *+'FІK?l1SE?@@8G *+ *+'FІK?l1SE@@@8F *+ *+'FІK8?l1SEA@@8E *+ *+'FІK?l1SEB@@8D *+ *+'FІKٻ?l1SEC@@8C *+ *+'FІK8?l1SED@@8B *+ *+'FІKy?l1SEE@@8A *+ *+'FІK?l1SEF@@8@ *+ *+'FІK?l1SEG@@8? *+ *+'FІKZ?l1SEH@@8> *+ *+'FІK?l1SEI@@8= *+ *+'FІK?l1SEJ@@8< *+ *+'FІK>?l1SEK@@8; *+ *+'FІK?l1SEL@@8: *+ *+'F ІKݾ?l1SEM@@89 *+ *+'F!ІK?l1SEN@@88 *+ *+'F"ІK~?l1SEO@@87 *+ *+'F#ІK?l1SEP@@86 *+ *+'F$ІK?l1SEQ@@85 *+ *+'F%ІK_?l1SER@@84 *+ *+'F&ІK?l1SES@@83 *+ *+'F'ІK?l1SET@@82 *+ *+'F(ІKB?l1SEU@@81 *+ *+'F)ІK?l1SEV@@80 *+ *+'F*ІK?l1SEW@@8/ *+ *+'F+ІK$?l1SEX@@8. *+ *+'F,ІK?l1SEY@@8- *+ *+'F-ІK?l1SEZ@@8, *+ *+'F.ІK?l1SE[@@8+ *+ *+'F/ІKd?l1SE\@@8* *+ *+'F0ІK?l1SE]@@8) *+ *+'F1ІK?l1SE^@@8( *+ *+'F2ІKF?l1SE_@@8' *+ *+'F3ІK?l1SE`@@8& *+ *+'F4ІK?l1SEa@@8% *+ *+'F5ІK(?l1SEb@@8$ *+ *+'F6ІKj?l1SEc@@8# *+ *+'F7ІK?l1SEd@@8" *+ *+'F8ІK ?l1SEe@@8! *+ *+'F9ІKi?l1SEf@@8 *+ *+'F:ІK?l1SEg@@8 *+ *+'F;ІK?l1SEh@@8 *+ *+'F<ІKK?l1SEi@@8 *+ *+'F=ІK?l1SEj@@8 *+ *+'F>ІK?l1SEk@@8 *+ *+'F?ІK.?l1SEl@@8 *+ *+'F@ІKn?l1SEm@@8 *+ *+'FAІK?l1SEn@@8 *+ *+'FBІK?l1SEo@@8 *+ *+'FCІKP?l1SEp@@8 *+ *+'FDІK?l1SEq@@8 *+ *+'FEІK?l1SEr@@8 *+ *+'FFІK3?l1SEs@@8 *+ *+'FGІK?l1SEt@@8 *+ *+'FHІK?l1SEu@@8 *+ *+'FIІK1?l1SEv@@8 *+ *+'FJІKs?l1SEw@@8 *+ *+'FKІK?l1SEx@@8 *+ *+'FLІK?l1SEy@@8 *+ *+'FMІKU?l1SEz@@8 *+ *+'FNІK?l1SE{@@8 *+ *+'FOІK?l1SE|@@8 *+ *+'FPІK6?l1SE}@@8 *+ *+'FQІK?l1SE~@@8 *+ *+'FRІK?l1SE@@8 *+ *+'FSІK?l1SE@@8 *+ *+'FTІKx?l1SE@@8 *+ *+'FUІK?l1SE@@8 *+ *+'FVІK?l1SE@@8 *+ *+'FWІKY?l1SE@@8 *+ *+'FXІK?l1SE@@8 *+ *+'FYІK?l1SE@@8 *+ *+'FZІK;?l1SE@@7 *+ *+'F[ІK~?l1SE@@7 *+ *+'F\ІK?l1SE@@7 *+ *+'F]ІK?l1SE@@7 *+ *+'F^ІK|?l1SE@@7 *+ *+'F_ІK?l1SE@@7 *+ *+'F`ІK?l1SE@@7 *+ *+'FaІK_?l1SE@@7 *+ *+'FbІK?l1SE@@7 *+ *+'FcІK?l1SE@@7 *+ *+'FdІK@?l1SE@@7 *+ *+'FeІK?l1SE@@7 *+ *+'FfІK?l1SE@@7 *+ *+'FgІK!?l1SE@@7 *+ *+'FhІKd?l1SE@@7 *+ *+'FiІK?l1SE@@7 *+ *+'FjІK?l1SE@@7 *+ *+'FkІKc?l1SE@@7 *+ *+'FlІK?l1SE@@7 *+ *+'FmІK?l1SE@@7 *+ *+'FnІKF?l1SE@@7 *+ *+'FoІK?l1SE@@7 *+ *+'FpІK?l1SE@@7 *+ *+'FqІK&?l1SE@@7 *+ *+'FrІKg?l1SE@@7 *+ *+'FsІK?l1SE@@7 *+ *+'FtІK ?l1SE@@7 *+ *+'FuІKJ?l1SE@@7 *+ *+'FvІK?l1SE@@7 *+ *+'FwІK?l1SE@@7 *+ *+'FxІK-?l1SE@@7 *+ *+'FyІK?l1SE@@7 *+ *+'FzІK?l1SE@@7 *+ *+'F{ІK+?l1SE@@7 *+ *+'F|ІKm?l1SE@@7 *+ *+'F}ІK?l1SE@@7 *+ *+'F~ІK?l1SE@@7 *+ *+'FІKP?l1SE@@7 *+ *+'FІK?l1SE@@7 *+ *+'FІK?l1SE@@7 *+ *+'FІK0?l1SE@@7 *+ *+'FІK?l1SE@@7 *+ *+'FІK?l1SE@@7 *+ *+'FІK?l1SE@@7 *+ *+'FІKG  ?l1SE@@8 *+ *+'FІKN<<?l1SE,@@9 *+ *+'F@UUІK}VV?l1SEH@@9 *+ *+'4G!T@ІK5?l1SE@@7 *+ *+'GІKv?l1SE@@7 *+ *+'GІK?l1SE@@7 *+ *+'GІK?l1SE@@7 *+ *+'GІKW?l1SE@@7 *+ *+'GІK?l1SE@@7 *+ *+'GІK?l1SE@@7 *+ *+'GІKV?l1SE@@7 *+ *+'GІK?l1SE@@7 *+ *+'G ІK?l1SE@@7 *+ *+'G ІK7?l1SE@@7 *+ *+'G ІKz?l1SE@@7 *+ *+'G ІK?l1SE@@7 *+ *+'G ІK?l1SE@@7 *+ *+'GІK]?l1SE@@7 *+ *+'GІK?l1SE@@7 *+ *+'GІK?l1SE@@7 *+ *+'GІK=?l1SE@@7 *+ *+'GІK?l1SE@@7 *+ *+'GІK?l1SE@@7 *+ *+'GІK ?l1SE@@7 *+ *+'GІK~?l1SE@@7 *+ *+'GІK?l1SE@@7 *+ *+'GІK?l1SE@@7 *+ *+'GІK`?l1SE@@7 *+ *+'GІK?l1SE@@7 *+ *+'GІK?l1SE@@7 *+ *+'GІKC?l1SE@@7 *+ *+'GІK?l1SE@@7 *+ *+'GІK?l1SE@@7 *+ *+'GІK#?l1SE@@7 *+ *+'GІK?l1SE@@7 *+ *+'G ІK?l1SE@@7 *+ *+'G!ІK?l1SE@@7 *+ *+'G"ІKf?l1SE@@7 *+ *+'G#ІK?l1SE@@7 *+ *+'G$ІK?l1SE@@7 *+ *+'G%ІKG?l1SE@@7 *+ *+'G&ІK?l1SE@@7 *+ *+'G'ІK?l1SE@@7 *+ *+'G(ІK)?l1SE@@7 *+ *+'G)ІKk?l1SE@@7 *+ *+'G*ІK?l1SE@@7 *+ *+'G+ІK ?l1SE@@7 *+ *+'G,ІKj?l1SE@@7 *+ *+'G-ІK?l1SE@@7 *+ *+'G.ІK?l1SE@@7 *+ *+'G/ІKL?l1SE@@7 *+ *+'G0ІK?l1SE@@7 *+ *+'G1ІK?l1SE@@7 *+ *+'G2ІK-?l1SE@@7 *+ *+'G3ІKo?l1SE@@7 *+ *+'G4ІK?l1SE@@7 *+ *+'G5ІK?l1SE@@7 *+ *+'G6ІKQ?l1SE@@7 *+ *+'G7ІK?l1SE@@7 *+ *+'G8ІK?l1SE@@7 *+ *+'G9ІKP?l1SE@@7 *+ *+'G:ІK?l1SE@@7 *+ *+'G;ІK?l1SE@@7 *+ *+'G<ІK2?l1SE@@7 *+ *+'G=ІKt?l1SE@@7 *+ *+'G>ІK?l1SE@@7 *+ *+'G?ІK?l1SE@@7 *+ *+'G@ІKV?l1SE@@7 *+ *+'GAІK?l1SE@@7 *+ *+'GBІK?l1SE@@7 *+ *+'GCІK7?l1SE@@7 *+ *+'GDІK?l1SE@@7 *+ *+'GEІK?l1SE@@7 *+ *+'GFІK?l1SE@@7 *+ *+'GGІKy?l1SE@@7 *+ *+'GHІK?l1SE@@7 *+ *+'GIІK?l1SE@@7 *+ *+'GJІKZ?l1SE@@7 *+ *+'GKІK?l1SE@@7 *+ *+'GLІK?l1SE@@7 *+ *+'GMІK=?l1SE@@7 *+ *+'GNІK?l1SE@@7 *+ *+'GOІK?l1SE@@7 *+ *+'GPІK?l1SE@@7 *+ *+'GQІK}?l1SE@@7 *+ *+'GRІK?l1SE@@7~ *+ *+'GSІK ?l1SE @@7} *+ *+'GTІK_ ?l1SE @@7| *+ *+'GUІK ?l1SE @@7{ *+ *+'GVІK ?l1SE @@7z *+ *+'GWІKB ?l1SE @@7y *+ *+'GXІK ?l1SE@@7x *+ *+'GYІK ?l1SE@@7w *+ *+'GZІK# ?l1SE@@7v *+ *+'G[ІKe ?l1SE@@7u *+ *+'G\ІK ?l1SE@@7t *+ *+'G]ІK ?l1SE@@7s *+ *+'G^ІKd ?l1SE@@7r *+ *+'G_ІK ?l1SE@@7q *+ *+'G`ІK ?l1SE@@7p *+ *+'GaІKF ?l1SE@@7o *+ *+'GbІK ?l1SE@@7n *+ *+'GcІK ?l1SE@@7m *+ *+'GdІK(?l1SE@@7l *+ *+'GeІKi?l1SE@@7k *+ *+'GfІK?l1SE@@7j *+ *+'GgІK ?l1SE@@7i *+ *+'GhІKK?l1SE@@7h *+ *+'GiІK?l1SE@@7g *+ *+'GjІK?l1SE @@7f *+ *+'GkІKJ?l1SE!@@7e *+ *+'GlІK?l1SE"@@7d *+ *+'GmІK?l1SE#@@7c *+ *+'GnІK-?l1SE$@@7b *+ *+'GoІKn?l1SE%@@7a *+ *+'GpІK?l1SE&@@7` *+ *+'GqІK?l1SE'@@7_ *+ *+'GrІKQ?l1SE(@@7^ *+ *+'GsІK?l1SE)@@7] *+ *+'GtІK?l1SE*@@7\ *+ *+'GuІK3?l1SE+@@7[ *+ *+'GvІK?l1SE,@@7Z *+ *+'GwІK?l1SE-@@7Y *+ *+'GxІK?l1SE.@@7X *+ *+'GyІKt?l1SE/@@7W *+ *+'GzІK?l1SE0@@7V *+ *+'G{ІK?l1SE1@@7U *+ *+'G|ІKT?l1SE2@@7T *+ *+'G}ІK?l1SE3@@7S *+ *+'G~ІK?l1SE4@@7R *+ *+'GІK7?l1SE5@@7Q *+ *+'GІK?l1SE6@@7P *+ *+'GІK?l1SE7@@7O *+ *+'GІK?l1SE8@@7N *+ *+'GІKx?l1SE9@@7M *+ *+'GІK?l1SE:@@7L *+ *+'GІK?l1SE;@@7K *+ *+'GІK-  ?l1SE<@@8N *+ *+'GІK5<<?l1SE,=@@9 *+ *+'G@UUІK:*VV?l1SEH>@@9 *+ *+'4H!@ІK*?l1SE?@@7G *+ *+'HІK3+?l1SE@@@7F *+ *+'HІK+?l1SEA@@7E *+ *+'HІK+?l1SEB@@7D *+ *+'HІK,?l1SEC@@7C *+ *+'HІKt,?l1SED@@7B *+ *+'HІK,?l1SEE@@7A *+ *+'HІK-?l1SEF@@7@ *+ *+'HІKV-?l1SEG@@7? *+ *+'H ІK-?l1SEH@@7> *+ *+'H ІK-?l1SEI@@7= *+ *+'H ІK7.?l1SEJ@@7< *+ *+'H ІKy.?l1SEK@@7; *+ *+'H ІK.?l1SEL@@7: *+ *+'HІK/?l1SEM@@79 *+ *+'HІKx/?l1SEN@@78 *+ *+'HІK/?l1SEO@@77 *+ *+'HІK/?l1SEP@@76 *+ *+'HІKZ0?l1SEQ@@75 *+ *+'HІK0?l1SER@@74 *+ *+'HІK0?l1SES@@73 *+ *+'HІK=1?l1SET@@72 *+ *+'HІK~1?l1SEU@@71 *+ *+'HІK1?l1SEV@@70 *+ *+'HІK2?l1SEW@@7/ *+ *+'HІKa2?l1SEX@@7. *+ *+'HІK2?l1SEY@@7- *+ *+'HІK3?l1SEZ@@7, *+ *+'HІK^3?l1SE[@@7+ *+ *+'HІK3?l1SE\@@7* *+ *+'HІK3?l1SE]@@7) *+ *+'HІKA4?l1SE^@@7( *+ *+'H ІK4?l1SE_@@7' *+ *+'H!ІK4?l1SE`@@7& *+ *+'H"ІK#5?l1SEa@@7% *+ *+'H#ІKd5?l1SEb@@7$ *+ *+'H$ІK5?l1SEc@@7# *+ *+'H%ІK6?l1SEd@@7" *+ *+'H&ІKG6?l1SEe@@7! *+ *+'H'ІK6?l1SEf@@7 *+ *+'H(ІK6?l1SEg@@7 *+ *+'H)ІK(7?l1SEh@@7 *+ *+'H*ІK7?l1SEi@@7 *+ *+'H+ІK7?l1SEj@@7 *+ *+'H,ІK'8?l1SEk@@7 *+ *+'H-ІKh8?l1SEl@@7 *+ *+'H.ІK8?l1SEm@@7 *+ *+'H/ІK 9?l1SEn@@7 *+ *+'H0ІKL9?l1SEo@@7 *+ *+'H1ІK9?l1SEp@@7 *+ *+'H2ІK9?l1SEq@@7 *+ *+'H3ІK-:?l1SEr@@7 *+ *+'H4ІK:?l1SEs@@7 *+ *+'H5ІK:?l1SEt@@7 *+ *+'H6ІK;?l1SEu@@7 *+ *+'H7ІKn;?l1SEv@@7 *+ *+'H8ІK;?l1SEw@@7 *+ *+'H9ІK<?l1SEx@@7 *+ *+'H:ІKO<?l1SEy@@7 *+ *+'H;ІK<?l1SEz@@7 *+ *+'H<ІK<?l1SE{@@7 *+ *+'H=ІK2=?l1SE|@@7 *+ *+'H>ІKt=?l1SE}@@7 *+ *+'H?ІK=?l1SE~@@7 *+ *+'H@ІK>?l1SE@@7 *+ *+'HAІKr>?l1SE@@7 *+ *+'HBІK>?l1SE@@7 *+ *+'HCІK>?l1SE@@7 *+ *+'HDІKT??l1SE@@7 *+ *+'HEІK??l1SE@@7 *+ *+'HFІK??l1SE@@7 *+ *+'HGІK7@?l1SE@@7 *+ *+'HHІKx@?l1SE@@6 *+ *+'HIІK@?l1SE@@6 *+ *+'HJІKA?l1SE@@6 *+ *+'HKІKYA?l1SE@@6 *+ *+'HLІKA?l1SE@@6 *+ *+'HMІKA?l1SE@@6 *+ *+'HNІKXB?l1SE@@6 *+ *+'HOІKB?l1SE@@6 *+ *+'HPІKB?l1SE@@6 *+ *+'HQІK;C?l1SE@@6 *+ *+'HRІK}C?l1SE@@6 *+ *+'HSІKC?l1SE@@6 *+ *+'HTІKD?l1SE@@6 *+ *+'HUІK^D?l1SE@@6 *+ *+'HVІKD?l1SE@@6 *+ *+'HWІKD?l1SE@@6 *+ *+'HXІK@E?l1SE@@6 *+ *+'HYІKE?l1SE@@6 *+ *+'HZІKE?l1SE@@6 *+ *+'H[ІK#F?l1SE@@6 *+ *+'H\ІKF?l1SE@@6 *+ *+'H]ІKF?l1SE@@6 *+ *+'H^ІK"G?l1SE@@6 *+ *+'H_ІKbG?l1SE@@6 *+ *+'H`ІKG?l1SE@@6 *+ *+'HaІKH?l1SE@@6 *+ *+'HbІKEH?l1SE@@6 *+ *+'HcІKH?l1SE@@6 *+ *+'HdІKH?l1SE@@6 *+ *+'HeІK'I?l1SE@@6 *+ *+'HfІKI?l1SE@@6 *+ *+'HgІKI?l1SE@@6 *+ *+'HhІK J?l1SE@@6 *+ *+'HiІKhJ?l1SE@@6 *+ *+'HjІKJ?l1SE@@6 *+ *+'HkІKK?l1SE@@6 *+ *+'HlІKJK?l1SE@@6 *+ *+'HmІKK?l1SE@@6 *+ *+'HnІKK?l1SE@@6 *+ *+'HoІK+L?l1SE@@6 *+ *+'HpІKnL?l1SE@@6 *+ *+'HqІKL?l1SE@@6 *+ *+'HrІKM?l1SE@@6 *+ *+'HsІKlM?l1SE@@6 *+ *+'HtІKM?l1SE@@6 *+ *+'HuІKM?l1SE@@6 *+ *+'HvІKNN?l1SE@@6 *+ *+'HwІKN?l1SE@@6 *+ *+'HxІKN?l1SE@@6 *+ *+'HyІK0O?l1SE@@6 *+ *+'HzІKrO?l1SE@@6 *+ *+'H{ІKO?l1SE@@6 *+ *+'H|ІKP?l1SE@@6 *+ *+'H}ІKUP?l1SE@@6 *+ *+'H~ІKP?l1SE@@6 *+ *+'HІKP?l1SE@@6 *+ *+'HІKTQ?l1SE@@6 *+ *+'HІKQ?l1SE@@6 *+ *+'HІKQ?l1SE@@6 *+ *+'HІK5R?l1SE@@6 *+ *+'HІKvR?l1SE@@6 *+ *+'HІKR?l1SE@@6 *+ *+'HІKR  ?l1SE@@7 *+ *+'HІKR<<?l1SE,@@8 *+ *+'H@UUІK#eVV?l1SEH@@8w *+ *+'4I! v\@ІKe?l1SE@@6 *+ *+'IІKf?l1SE@@6 *+ *+'IІKyf?l1SE@@6 *+ *+'IІKf?l1SE@@6 *+ *+'IІKf?l1SE@@6 *+ *+'IІK[g?l1SE@@6 *+ *+'IІKg?l1SE@@6 *+ *+'IІKg?l1SE@@6 *+ *+'IІK>h?l1SE@@6 *+ *+'I ІKh?l1SE@@6 *+ *+'I ІKh?l1SE@@6 *+ *+'I ІK i?l1SE@@6 *+ *+'I ІK`i?l1SE@@6 *+ *+'I ІKi?l1SE@@6 *+ *+'IІKj?l1SE@@6 *+ *+'IІK_j?l1SE@@6 *+ *+'IІKj?l1SE@@6 *+ *+'IІKj?l1SE@@6 *+ *+'IІKAk?l1SE@@6 *+ *+'IІKk?l1SE@@6 *+ *+'IІKk?l1SE@@6 *+ *+'IІK$l?l1SE@@6 *+ *+'IІKel?l1SE@@6 *+ *+'IІKl?l1SE@@6 *+ *+'IІKm?l1SE@@6 *+ *+'IІKHm?l1SE@@6 *+ *+'IІKm?l1SE@@6 *+ *+'IІKm?l1SE@@6 *+ *+'IІKGn?l1SE@@6 *+ *+'IІKn?l1SE@@6 *+ *+'IІKn?l1SE@@6 *+ *+'IІK)o?l1SE@@6 *+ *+'I ІKjo?l1SE@@6 *+ *+'I!ІKo?l1SE@@6 *+ *+'I"ІK p?l1SE@@6 *+ *+'I#ІKLp?l1SE@@6 *+ *+'I$ІKp?l1SE@@6 *+ *+'I%ІKp?l1SE@@6 *+ *+'I&ІK.q?l1SE@@6 *+ *+'I'ІKq?l1SE@@6 *+ *+'I(ІKq?l1SE@@6 *+ *+'I)ІKr?l1SE@@6 *+ *+'I*ІKor?l1SE@@6 *+ *+'I+ІKr?l1SE@@6 *+ *+'I,ІKs?l1SE@@6 *+ *+'I-ІKQs?l1SE@@6 *+ *+'I.ІKs?l1SE@@6 *+ *+'I/ІKs?l1SE@@6 *+ *+'I0ІK2t?l1SE@@6 *+ *+'I1ІKt?l1SE@@6 *+ *+'I2ІKt?l1SE@@6 *+ *+'I3ІKu?l1SE@@6 *+ *+'I4ІKru?l1SE@@6 *+ *+'I5ІKu?l1SE@@6 *+ *+'I6ІKu?l1SE@@6 *+ *+'I7ІKVv?l1SE@@6 *+ *+'I8ІKv?l1SE@@6 *+ *+'I9ІKv?l1SE@@6 *+ *+'I:ІK8w?l1SE@@6 *+ *+'I;ІKyw?l1SE@@6 *+ *+'I<ІKw?l1SE@@6 *+ *+'I=ІKx?l1SE@@6 *+ *+'I>ІK[x?l1SE@@6 *+ *+'I?ІKx?l1SE@@6 *+ *+'I@ІKx?l1SE@@6~ *+ *+'IAІKZy?l1SE @@6} *+ *+'IBІKy?l1SE @@6| *+ *+'ICІKy?l1SE @@6{ *+ *+'IDІK;z?l1SE @@6z *+ *+'IEІK}z?l1SE @@6y *+ *+'IFІKz?l1SE@@6x *+ *+'IGІK{?l1SE@@6w *+ *+'IHІK`{?l1SE@@6v *+ *+'IIІK{?l1SE@@6u *+ *+'IJІK|?l1SE@@6t *+ *+'IKІKB|?l1SE@@6s *+ *+'ILІK|?l1SE@@6r *+ *+'IMІK|?l1SE@@6q *+ *+'INІK@}?l1SE@@6p *+ *+'IOІK}?l1SE@@6o *+ *+'IPІK}?l1SE@@6n *+ *+'IQІK"~?l1SE@@6m *+ *+'IRІKc~?l1SE@@6l *+ *+'ISІK~?l1SE@@6k *+ *+'ITІK?l1SE@@6j *+ *+'IUІKF?l1SE@@6i *+ *+'IVІK?l1SE@@6h *+ *+'IWІK?l1SE@@6g *+ *+'IXІK(?l1SE @@6f *+ *+'IYІK?l1SE!@@6e *+ *+'IZІKȀ?l1SE"@@6d *+ *+'I[ІK ?l1SE#@@6c *+ *+'I\ІKi?l1SE$@@6b *+ *+'I]ІK?l1SE%@@6a *+ *+'I^ІK ?l1SE&@@6` *+ *+'I_ІKK?l1SE'@@6_ *+ *+'I`ІK?l1SE(@@6^ *+ *+'IaІK?l1SE)@@6] *+ *+'IbІK,?l1SE*@@6\ *+ *+'IcІK?l1SE+@@6[ *+ *+'IdІK̃?l1SE,@@6Z *+ *+'IeІK?l1SE-@@6Y *+ *+'IfІKm?l1SE.@@6X *+ *+'IgІK?l1SE/@@6W *+ *+'IhІK?l1SE0@@6V *+ *+'IiІKN?l1SE1@@6U *+ *+'IjІK?l1SE2@@6T *+ *+'IkІK?l1SE3@@6S *+ *+'IlІK2?l1SE4@@6R *+ *+'ImІKs?l1SE5@@6Q *+ *+'InІK҆?l1SE6@@6P *+ *+'IoІK?l1SE7@@6O *+ *+'IpІKT?l1SE8@@6N *+ *+'IqІK?l1SE9@@6M *+ *+'IrІK?l1SE:@@6L *+ *+'IsІKS?l1SE;@@6K *+ *+'ItІK?l1SE<@@6J *+ *+'IuІK׈?l1SE=@@6I *+ *+'IvІK6?l1SE>@@6H *+ *+'IwІKw?l1SE?@@6G *+ *+'IxІK?l1SE@@@6F *+ *+'IyІK?l1SEA@@6E *+ *+'IzІKZ?l1SEB@@6D *+ *+'I{ІK?l1SEC@@6C *+ *+'I|ІK?l1SED@@6B *+ *+'I}ІK<?l1SEE@@6A *+ *+'I~ІK?l1SEF@@6@ *+ *+'IІK܋?l1SEG@@6? *+ *+'IІK:?l1SEH@@6> *+ *+'IІK|?l1SEI@@6= *+ *+'IІK?l1SEJ@@6< *+ *+'IІK?l1SEK@@6; *+ *+'IІK^?l1SEL@@6: *+ *+'IІK?l1SEM@@69 *+ *+'IІKӍ  ?l1SEN@@7< *+ *+'IІKٍ<<?l1SE,O@@8 *+ *+'I@UUІKVV?l1SEHP@@7 *+ *+'4J!@ІK?l1SEQ@@65 *+ *+'JІK?l1SER@@64 *+ *+'JІKD?l1SES@@63 *+ *+'JІK?l1SET@@62 *+ *+'JІKȡ?l1SEU@@61 *+ *+'JІK'?l1SEV@@60 *+ *+'JІKh?l1SEW@@6/ *+ *+'JІKǢ?l1SEX@@6. *+ *+'JІK?l1SEY@@6- *+ *+'J ІKJ?l1SEZ@@6, *+ *+'J ІK?l1SE[@@6+ *+ *+'J ІK?l1SE\@@6* *+ *+'J ІK-?l1SE]@@6) *+ *+'J ІK?l1SE^@@6( *+ *+'JІKͤ?l1SE_@@6' *+ *+'JІK+?l1SE`@@6& *+ *+'JІKm?l1SEa@@6% *+ *+'JІK?l1SEb@@6$ *+ *+'JІK?l1SEc@@6# *+ *+'JІKN?l1SEd@@6" *+ *+'JІK?l1SEe@@6! *+ *+'JІK?l1SEf@@6 *+ *+'JІK0?l1SEg@@6 *+ *+'JІK?l1SEh@@6 *+ *+'JІKѧ?l1SEi@@6 *+ *+'JІK?l1SEj@@6 *+ *+'JІKr?l1SEk@@6 *+ *+'JІK?l1SEl@@6 *+ *+'JІK?l1SEm@@6 *+ *+'JІKS?l1SEn@@6 *+ *+'JІK?l1SEo@@6 *+ *+'JІK?l1SEp@@6 *+ *+'J ІK5?l1SEq@@6 *+ *+'J!ІKx?l1SEr@@6 *+ *+'J"ІKժ?l1SEs@@6 *+ *+'J#ІK?l1SEt@@6 *+ *+'J$ІKu?l1SEu@@6 *+ *+'J%ІK?l1SEv@@6 *+ *+'J&ІK?l1SEw@@6 *+ *+'J'ІKW?l1SEx@@6 *+ *+'J(ІK?l1SEy@@6 *+ *+'J)ІK۬?l1SEz@@6 *+ *+'J*ІK:?l1SE{@@6 *+ *+'J+ІK{?l1SE|@@6 *+ *+'J,ІKڭ?l1SE}@@6 *+ *+'J-ІK?l1SE~@@6 *+ *+'J.ІK^?l1SE@@6 *+ *+'J/ІK?l1SE@@6 *+ *+'J0ІK?l1SE@@6 *+ *+'J1ІK]?l1SE@@6 *+ *+'J2ІK?l1SE@@6 *+ *+'J3ІK?l1SE@@6 *+ *+'J4ІK??l1SE@@6 *+ *+'J5ІK?l1SE@@6 *+ *+'J6ІK?l1SE@@5 *+ *+'J7ІK ?l1SE@@5 *+ *+'J8ІKb?l1SE@@5 *+ *+'J9ІK?l1SE@@5 *+ *+'J:ІK?l1SE@@5 *+ *+'J;ІKD?l1SE@@5 *+ *+'J<ІK?l1SE@@5 *+ *+'J=ІK?l1SE@@5 *+ *+'J>ІK0?l1SE@@5 *+ *+'J?ІK?l1SE@@5 *+ *+'J@ІKƳ?l1SE@@5 *+ *+'JAІK%?l1SE@@5 *+ *+'JBІKf?l1SE@@5 *+ *+'JCІK?l1SE@@5 *+ *+'JDІK?l1SE@@5 *+ *+'JEІKJ?l1SE@@5 *+ *+'JFІK?l1SE@@5 *+ *+'JGІK?l1SE@@5 *+ *+'JHІK+?l1SE@@5 *+ *+'JIІK?l1SE@@5 *+ *+'JJІK˶?l1SE@@5 *+ *+'JKІK ?l1SE@@5 *+ *+'JLІKk?l1SE@@5 *+ *+'JMІK?l1SE@@5 *+ *+'JNІK ?l1SE@@5 *+ *+'JOІKN?l1SE@@5 *+ *+'JPІK?l1SE@@5 *+ *+'JQІK?l1SE@@5 *+ *+'JRІK0?l1SE@@5 *+ *+'JSІKp?l1SE@@5 *+ *+'JTІKй?l1SE@@5 *+ *+'JUІK?l1SE@@5 *+ *+'JVІKo?l1SE@@5 *+ *+'JWІK?l1SE@@5 *+ *+'JXІK?l1SE@@5 *+ *+'JYІKQ?l1SE@@5 *+ *+'JZІK?l1SE@@5 *+ *+'J[ІKջ?l1SE@@5 *+ *+'J\ІK4?l1SE@@5 *+ *+'J]ІKv?l1SE@@5 *+ *+'J^ІKԼ?l1SE@@5 *+ *+'J_ІK?l1SE@@5 *+ *+'J`ІKW?l1SE@@5 *+ *+'JaІK?l1SE@@5 *+ *+'JbІK?l1SE@@5 *+ *+'JcІKV?l1SE@@5 *+ *+'JdІK?l1SE@@5 *+ *+'JeІK۾?l1SE@@5 *+ *+'JfІK9?l1SE@@5 *+ *+'JgІKz?l1SE@@5 *+ *+'JhІK?l1SE@@5 *+ *+'JiІK?l1SE@@5 *+ *+'JjІK\?l1SE@@5 *+ *+'JkІK?l1SE@@5 *+ *+'JlІK?l1SE@@5 *+ *+'JmІK>?l1SE@@5 *+ *+'JnІK?l1SE@@5 *+ *+'JoІK?l1SE@@5 *+ *+'JpІK!?l1SE@@5 *+ *+'JqІK?l1SE@@5 *+ *+'JrІK?l1SE@@5 *+ *+'JsІK?l1SE@@5 *+ *+'JtІKa?l1SE@@5 *+ *+'JuІK?l1SE@@5 *+ *+'JvІK?l1SE@@5 *+ *+'JwІKB?l1SE@@5 *+ *+'JxІK?l1SE@@5 *+ *+'JyІK?l1SE@@5 *+ *+'JzІK%?l1SE@@5 *+ *+'J{ІK?l1SE@@5 *+ *+'J|ІK?l1SE@@5 *+ *+'J}ІK?l1SE@@5 *+ *+'J~ІKf?l1SE@@5 *+ *+'JІK?l1SE@@5 *+ *+'JІK?l1SE@@5 *+ *+'JІKG?l1SE@@5 *+ *+'JІK?l1SE@@5 *+ *+'JІK?l1SE@@5 *+ *+'JІK*?l1SE@@5 *+ *+'JІKl?l1SE@@5 *+ *+'JІK  ?l1SE@@6 *+ *+'JІK<<?l1SE,@@7 *+ *+'J@UUІKVV?l1SEH@@7e *+ *+'4K!&@ІK?l1SE@@5 *+ *+'KІK?l1SE@@5 *+ *+'KІK,?l1SE@@5 *+ *+'KІKm?l1SE@@5 *+ *+'KІK?l1SE@@5 *+ *+'KІK?l1SE@@5 *+ *+'KІKP?l1SE@@5 *+ *+'KІK?l1SE@@5 *+ *+'KІK?l1SE@@5 *+ *+'K ІK2?l1SE@@5 *+ *+'K ІK?l1SE@@5 *+ *+'K ІK?l1SE@@5 *+ *+'K ІK?l1SE@@5 *+ *+'K ІKr?l1SE@@5 *+ *+'KІK?l1SE@@5 *+ *+'KІK?l1SE@@5 *+ *+'KІKT?l1SE@@5 *+ *+'KІK?l1SE@@5 *+ *+'KІK?l1SE@@5 *+ *+'KІK6?l1SE@@5 *+ *+'KІKy?l1SE@@5 *+ *+'KІK?l1SE@@5 *+ *+'KІK?l1SE@@5 *+ *+'KІKw?l1SE@@5 *+ *+'KІK?l1SE@@5 *+ *+'KІK?l1SE@@5 *+ *+'KІKX?l1SE@@5 *+ *+'KІK?l1SE@@5 *+ *+'KІK?l1SE@@5 *+ *+'KІK;?l1SE@@5 *+ *+'KІK|?l1SE@@5 *+ *+'KІK?l1SE@@5 *+ *+'K ІK?l1SE@@5 *+ *+'K!ІK^?l1SE@@5 *+ *+'K"ІK?l1SE@@5 *+ *+'K#ІK?l1SE@@5 *+ *+'K$ІK]?l1SE@@5 *+ *+'K%ІK?l1SE@@5 *+ *+'K&ІK?l1SE@@5 *+ *+'K'ІK>?l1SE@@5 *+ *+'K(ІK?l1SE@@5 *+ *+'K)ІK?l1SE@@5 *+ *+'K*ІK!?l1SE@@5 *+ *+'K+ІKb?l1SE@@5 *+ *+'K,ІK?l1SE@@5 *+ *+'K-ІK?l1SE@@5 *+ *+'K.ІKE?l1SE@@5~ *+ *+'K/ІK?l1SE @@5} *+ *+'K0ІK?l1SE @@5| *+ *+'K1ІKD?l1SE @@5{ *+ *+'K2ІK?l1SE @@5z *+ *+'K3ІK?l1SE @@5y *+ *+'K4ІK'?l1SE@@5x *+ *+'K5ІKh?l1SE@@5w *+ *+'K6ІK?l1SE@@5v *+ *+'K7ІK?l1SE@@5u *+ *+'K8ІKI?l1SE@@5t *+ *+'K9ІK?l1SE@@5s *+ *+'K:ІK?l1SE@@5r *+ *+'K;ІK,?l1SE@@5q *+ *+'K<ІK?l1SE@@5p *+ *+'K=ІK?l1SE@@5o *+ *+'K>ІK?l1SE@@5n *+ *+'K?ІKl?l1SE@@5m *+ *+'K@ІK?l1SE@@5l *+ *+'KAІK ?l1SE@@5k *+ *+'KBІKN?l1SE@@5j *+ *+'KCІK?l1SE@@5i *+ *+'KDІK?l1SE@@5h *+ *+'KEІK/?l1SE@@5g *+ *+'KFІKs?l1SE @@5f *+ *+'KGІK?l1SE!@@5e *+ *+'KHІK?l1SE"@@5d *+ *+'KIІKr?l1SE#@@5c *+ *+'KJІK?l1SE$@@5b *+ *+'KKІK?l1SE%@@5a *+ *+'KLІKS?l1SE&@@5` *+ *+'KMІK?l1SE'@@5_ *+ *+'KNІK?l1SE(@@5^ *+ *+'KOІK5?l1SE)@@5] *+ *+'KPІKw?l1SE*@@5\ *+ *+'KQІK?l1SE+@@5[ *+ *+'KRІK?l1SE,@@5Z *+ *+'KSІKY?l1SE-@@5Y *+ *+'KTІK?l1SE.@@5X *+ *+'KUІK?l1SE/@@5W *+ *+'KVІKX?l1SE0@@5V *+ *+'KWІK?l1SE1@@5U *+ *+'KXІK?l1SE2@@5T *+ *+'KYІK:?l1SE3@@5S *+ *+'KZІKz?l1SE4@@5R *+ *+'K[ІK?l1SE5@@5Q *+ *+'K\ІK?l1SE6@@5P *+ *+'K]ІK]?l1SE7@@5O *+ *+'K^ІK?l1SE8@@5N *+ *+'K_ІK?l1SE9@@5M *+ *+'K`ІK??l1SE:@@5L *+ *+'KaІK?l1SE;@@5K *+ *+'KbІK?l1SE<@@5J *+ *+'KcІK>?l1SE=@@5I *+ *+'KdІK?l1SE>@@5H *+ *+'KeІK?l1SE?@@5G *+ *+'KfІK ?l1SE@@@5F *+ *+'KgІKb?l1SEA@@5E *+ *+'KhІK?l1SEB@@5D *+ *+'KiІK?l1SEC@@5C *+ *+'KjІKD?l1SED@@5B *+ *+'KkІK?l1SEE@@5A *+ *+'KlІK?l1SEF@@5@ *+ *+'KmІK%?l1SEG@@5? *+ *+'KnІK?l1SEH@@5> *+ *+'KoІK?l1SEI@@5= *+ *+'KpІK?l1SEJ@@5< *+ *+'KqІKf?l1SEK@@5; *+ *+'KrІK?l1SEL@@5: *+ *+'KsІK?l1SEM@@59 *+ *+'KtІKI?l1SEN@@58 *+ *+'KuІK?l1SEO@@57 *+ *+'KvІK?l1SEP@@56 *+ *+'KwІK+?l1SEQ@@55 *+ *+'KxІKl?l1SER@@54 *+ *+'KyІK?l1SES@@53 *+ *+'KzІK ?l1SET@@52 *+ *+'K{ІKj?l1SEU@@51 *+ *+'K|ІK?l1SEV@@50 *+ *+'K}ІK?l1SEW@@5/ *+ *+'K~ІKX?l1SEX@@5. *+ *+'KІK?l1SEY@@5- *+ *+'KІK?l1SEZ@@5, *+ *+'KІK/?l1SE[@@5+ *+ *+'KІKq?l1SE\@@5* *+ *+'KІK?l1SE]@@5) *+ *+'KІK?l1SE^@@5( *+ *+'KІKR?l1SE_@@5' *+ *+'KІK  ?l1SE`@@6* *+ *+'KІK<<?l1SE,a@@6 *+ *+'K@UUІKVV?l1SEHb@@6 *+ *+'4L!3)@ІKT?l1SEc@@5# *+ *+'LІK?l1SEd@@5" *+ *+'LІK?l1SEe@@5! *+ *+'LІK5?l1SEf@@5 *+ *+'LІKw?l1SEg@@5 *+ *+'LІK?l1SEh@@5 *+ *+'LІK?l1SEi@@5 *+ *+'LІKu?l1SEj@@5 *+ *+'LІK?l1SEk@@5 *+ *+'L ІK?l1SEl@@5 *+ *+'L ІKX?l1SEm@@5 *+ *+'L ІK?l1SEn@@5 *+ *+'L ІK?l1SEo@@5 *+ *+'L ІK:?l1SEp@@5 *+ *+'LІK{?l1SEq@@5 *+ *+'LІK?l1SEr@@5 *+ *+'LІK?l1SEs@@5 *+ *+'LІK^?l1SEt@@5 *+ *+'LІK?l1SEu@@5 *+ *+'LІK?l1SEv@@5 *+ *+'LІK??l1SEw@@5 *+ *+'LІK?l1SEx@@5 *+ *+'LІK?l1SEy@@5 *+ *+'LІK>?l1SEz@@5 *+ *+'LІK?l1SE{@@5 *+ *+'LІK?l1SE|@@5 *+ *+'LІK ?l1SE}@@5 *+ *+'LІKb?l1SE~@@5 *+ *+'LІK?l1SE@@5 *+ *+'LІK?l1SE@@5 *+ *+'LІKD?l1SE@@5 *+ *+'LІK?l1SE@@5 *+ *+'L ІK?l1SE@@5 *+ *+'L!ІK& ?l1SE@@5 *+ *+'L"ІK ?l1SE@@5 *+ *+'L#ІK ?l1SE@@5 *+ *+'L$ІK%!?l1SE@@4 *+ *+'L%ІKf!?l1SE@@4 *+ *+'L&ІK!?l1SE@@4 *+ *+'L'ІK"?l1SE@@4 *+ *+'L(ІKI"?l1SE@@4 *+ *+'L)ІK"?l1SE@@4 *+ *+'L*ІK"?l1SE@@4 *+ *+'L+ІK*#?l1SE@@4 *+ *+'L,ІK#?l1SE@@4 *+ *+'L-ІK#?l1SE@@4 *+ *+'L.ІK $?l1SE@@4 *+ *+'L/ІKk$?l1SE@@4 *+ *+'L0ІK$?l1SE@@4 *+ *+'L1ІK %?l1SE@@4 *+ *+'L2ІKL%?l1SE@@4 *+ *+'L3ІK%?l1SE@@4 *+ *+'L4ІK%?l1SE@@4 *+ *+'L5ІK/&?l1SE@@4 *+ *+'L6ІKp&?l1SE@@4 *+ *+'L7ІK&?l1SE@@4 *+ *+'L8ІK'?l1SE@@4 *+ *+'L9ІKo'?l1SE@@4 *+ *+'L:ІK'?l1SE@@4 *+ *+'L;ІK'?l1SE@@4 *+ *+'L<ІKR(?l1SE@@4 *+ *+'L=ІK(?l1SE@@4 *+ *+'L>ІK(?l1SE@@4 *+ *+'L?ІK4)?l1SE@@4 *+ *+'L@ІKv)?l1SE@@4 *+ *+'LAІK)?l1SE@@4 *+ *+'LBІK*?l1SE@@4 *+ *+'LCІKV*?l1SE@@4 *+ *+'LDІK*?l1SE@@4 *+ *+'LEІK*?l1SE@@4 *+ *+'LFІK:+?l1SE@@4 *+ *+'LGІK+?l1SE@@4 *+ *+'LHІK+?l1SE@@4 *+ *+'LIІK8,?l1SE@@4 *+ *+'LJІKz,?l1SE@@4 *+ *+'LKІK,?l1SE@@4 *+ *+'LLІK-?l1SE@@4 *+ *+'LMІK\-?l1SE@@4 *+ *+'LNІK-?l1SE@@4 *+ *+'LOІK-?l1SE@@4 *+ *+'LPІK=.?l1SE@@4 *+ *+'LQІK.?l1SE@@4 *+ *+'LRІK.?l1SE@@4 *+ *+'LSІK!/?l1SE@@4 *+ *+'LTІK~/?l1SE@@4 *+ *+'LUІK/?l1SE@@4 *+ *+'LVІK 0?l1SE@@4 *+ *+'LWІK_0?l1SE@@4 *+ *+'LXІK0?l1SE@@4 *+ *+'LYІK1?l1SE@@4 *+ *+'LZІKB1?l1SE@@4 *+ *+'L[ІK1?l1SE@@4 *+ *+'L\ІK1?l1SE@@4 *+ *+'L]ІK%2?l1SE@@4 *+ *+'L^ІK2?l1SE@@4 *+ *+'L_ІK2?l1SE@@4 *+ *+'L`ІK3?l1SE@@4 *+ *+'LaІKe3?l1SE@@4 *+ *+'LbІK3?l1SE@@4 *+ *+'LcІK4?l1SE@@4 *+ *+'LdІKF4?l1SE@@4 *+ *+'LeІK4?l1SE@@4 *+ *+'LfІK4?l1SE@@4 *+ *+'LgІK(5?l1SE@@4 *+ *+'LhІKk5?l1SE@@4 *+ *+'LiІK5?l1SE@@4 *+ *+'LjІK 6?l1SE@@4 *+ *+'LkІKi6?l1SE@@4 *+ *+'LlІK6?l1SE@@4 *+ *+'LmІK6?l1SE@@4 *+ *+'LnІKL7?l1SE@@4 *+ *+'LoІK7?l1SE@@4 *+ *+'LpІK7?l1SE@@4 *+ *+'LqІK.8?l1SE@@4 *+ *+'LrІKo8?l1SE@@4 *+ *+'LsІK8?l1SE@@4 *+ *+'LtІK9?l1SE@@4 *+ *+'LuІKR9?l1SE@@4 *+ *+'LvІK9?l1SE@@4 *+ *+'LwІK9?l1SE@@4 *+ *+'LxІK3:?l1SE@@4 *+ *+'LyІK:?l1SE@@4 *+ *+'LzІK:?l1SE@@4 *+ *+'L{ІK2;?l1SE@@4 *+ *+'L|ІKt;?l1SE@@4 *+ *+'L}ІK;?l1SE@@4 *+ *+'L~ІK<?l1SE@@4 *+ *+'LІKV<?l1SE@@4 *+ *+'LІK<?l1SE@@4 *+ *+'LІK<?l1SE@@4 *+ *+'LІK8=?l1SE@@4 *+ *+'LІK=?l1SE@@4 *+ *+'LІK=?l1SE@@4 *+ *+'LІK>?l1SE@@4 *+ *+'LІKL>  ?l1SE@@5 *+ *+'LІKT><<?l1SE,@@6p *+ *+'L@UUІKPVV?l1SEH@@6S *+ *+'4M!?@ІK>Q?l1SE@@4 *+ *+'MІKQ?l1SE@@4 *+ *+'MІKQ?l1SE@@4 *+ *+'MІK R?l1SE@@4 *+ *+'MІKbR?l1SE@@4 *+ *+'MІKR?l1SE@@4 *+ *+'MІKS?l1SE@@4 *+ *+'MІKaS?l1SE@@4 *+ *+'MІKS?l1SE@@4 *+ *+'M ІKS?l1SE@@4 *+ *+'M ІKCT?l1SE@@4 *+ *+'M ІKT?l1SE@@4 *+ *+'M ІKT?l1SE@@4 *+ *+'M ІK%U?l1SE@@4 *+ *+'MІKgU?l1SE@@4 *+ *+'MІKU?l1SE@@4 *+ *+'MІKV?l1SE@@4 *+ *+'MІKIV?l1SE@@4 *+ *+'MІKV?l1SE@@4 *+ *+'MІKV?l1SE@@4 *+ *+'MІK+W?l1SE@@4 *+ *+'MІKW?l1SE@@4 *+ *+'MІKW?l1SE@@4 *+ *+'MІK*X?l1SE@@4 *+ *+'MІKkX?l1SE@@4 *+ *+'MІKX?l1SE@@4 *+ *+'MІK Y?l1SE@@4 *+ *+'MІKNY?l1SE@@4 *+ *+'MІKY?l1SE@@4~ *+ *+'MІKY?l1SE @@4} *+ *+'MІK/Z?l1SE @@4| *+ *+'MІKZ?l1SE @@4{ *+ *+'M ІKZ?l1SE @@4z *+ *+'M!ІK[?l1SE @@4y *+ *+'M"ІKo[?l1SE@@4x *+ *+'M#ІK[?l1SE@@4w *+ *+'M$ІK\?l1SE@@4v *+ *+'M%ІKR\?l1SE@@4u *+ *+'M&ІK\?l1SE@@4t *+ *+'M'ІK\?l1SE@@4s *+ *+'M(ІK3]?l1SE@@4r *+ *+'M)ІKu]?l1SE@@4q *+ *+'M*ІK]?l1SE@@4p *+ *+'M+ІK^?l1SE@@4o *+ *+'M,ІKu^?l1SE@@4n *+ *+'M-ІK^?l1SE@@4m *+ *+'M.ІK^?l1SE@@4l *+ *+'M/ІKU_?l1SE@@4k *+ *+'M0ІK_?l1SE@@4j *+ *+'M1ІK_?l1SE@@4i *+ *+'M2ІK8`?l1SE@@4h *+ *+'M3ІKz`?l1SE@@4g *+ *+'M4ІK`?l1SE @@4f *+ *+'M5ІKa?l1SE!@@4e *+ *+'M6ІK\a?l1SE"@@4d *+ *+'M7ІKa?l1SE#@@4c *+ *+'M8ІKa?l1SE$@@4b *+ *+'M9ІK[b?l1SE%@@4a *+ *+'M:ІKb?l1SE&@@4` *+ *+'M;ІKb?l1SE'@@4_ *+ *+'M<ІK=c?l1SE(@@4^ *+ *+'M=ІKc?l1SE)@@4] *+ *+'M>ІKc?l1SE*@@4\ *+ *+'M?ІKd?l1SE+@@4[ *+ *+'M@ІK`d?l1SE,@@4Z *+ *+'MAІKd?l1SE-@@4Y *+ *+'MBІKe?l1SE.@@4X *+ *+'MCІKBe?l1SE/@@4W *+ *+'MDІKe?l1SE0@@4V *+ *+'MEІKe?l1SE1@@4U *+ *+'MFІK$f?l1SE2@@4T *+ *+'MGІKf?l1SE3@@4S *+ *+'MHІKf?l1SE4@@4R *+ *+'MIІK$g?l1SE5@@4Q *+ *+'MJІKeg?l1SE6@@4P *+ *+'MKІKg?l1SE7@@4O *+ *+'MLІKh?l1SE8@@4N *+ *+'MMІKGh?l1SE9@@4M *+ *+'MNІKh?l1SE:@@4L *+ *+'MOІKh?l1SE;@@4K *+ *+'MPІK*i?l1SE<@@4J *+ *+'MQІKi?l1SE=@@4I *+ *+'MRІKi?l1SE>@@4H *+ *+'MSІK j?l1SE?@@4G *+ *+'MTІKjj?l1SE@@@4F *+ *+'MUІKj?l1SEA@@4E *+ *+'MVІK k?l1SEB@@4D *+ *+'MWІKLk?l1SEC@@4C *+ *+'MXІKk?l1SED@@4B *+ *+'MYІKk?l1SEE@@4A *+ *+'MZІK.l?l1SEF@@4@ *+ *+'M[ІKpl?l1SEG@@4? *+ *+'M\ІKl?l1SEH@@4> *+ *+'M]ІKm?l1SEI@@4= *+ *+'M^ІKom?l1SEJ@@4< *+ *+'M_ІKm?l1SEK@@4; *+ *+'M`ІKm?l1SEL@@4: *+ *+'MaІKQn?l1SEM@@49 *+ *+'MbІKn?l1SEN@@48 *+ *+'McІKn?l1SEO@@47 *+ *+'MdІK2o?l1SEP@@46 *+ *+'MeІKto?l1SEQ@@45 *+ *+'MfІKo?l1SER@@44 *+ *+'MgІKp?l1SES@@43 *+ *+'MhІKVp?l1SET@@42 *+ *+'MiІKp?l1SEU@@41 *+ *+'MjІKp?l1SEV@@40 *+ *+'MkІKUq?l1SEW@@4/ *+ *+'MlІKq?l1SEX@@4. *+ *+'MmІKq?l1SEY@@4- *+ *+'MnІK7r?l1SEZ@@4, *+ *+'MoІKxr?l1SE[@@4+ *+ *+'MpІKr?l1SE\@@4* *+ *+'MqІKs?l1SE]@@4) *+ *+'MrІK[s?l1SE^@@4( *+ *+'MsІKs?l1SE_@@4' *+ *+'MtІKs?l1SE`@@4& *+ *+'MuІK=t?l1SEa@@4% *+ *+'MvІKt?l1SEb@@4$ *+ *+'MwІKt?l1SEc@@4# *+ *+'MxІKu?l1SEd@@4" *+ *+'MyІK}u?l1SEe@@4! *+ *+'MzІKu?l1SEf@@4 *+ *+'M{ІKv?l1SEg@@4 *+ *+'M|ІK_v?l1SEh@@4 *+ *+'M}ІKv?l1SEi@@4 *+ *+'M~ІKw?l1SEj@@4 *+ *+'MІKBw?l1SEk@@4 *+ *+'MІKw?l1SEl@@4 *+ *+'MІKw?l1SEm@@4 *+ *+'MІK#x?l1SEn@@4 *+ *+'MІKx?l1SEo@@4 *+ *+'MІKx?l1SEp@@4 *+ *+'MІKy?l1SEq@@4 *+ *+'MІK8y  ?l1SEr@@5 *+ *+'MІK@y<<?l1SE,s@@5 *+ *+'M@UUІKOVV?l1SEHt@@5 *+ *+'4N!LNT@ІK?l1SEu@@4 *+ *+'NІKG?l1SEv@@4 *+ *+'NІK?l1SEw@@4 *+ *+'NІK?l1SEx@@4 *+ *+'NІK*?l1SEy@@4 *+ *+'NІK?l1SEz@@4 *+ *+'NІKʍ?l1SE{@@4 *+ *+'NІK(?l1SE|@@4 *+ *+'NІKj?l1SE}@@4 *+ *+'N ІK?l1SE~@@4 *+ *+'N ІK ?l1SE@@4 *+ *+'N ІKK?l1SE@@4 *+ *+'N ІK?l1SE@@4 *+ *+'N ІK?l1SE@@4 *+ *+'NІK.?l1SE@@4 *+ *+'NІK?l1SE@@4 *+ *+'NІK͐?l1SE@@4 *+ *+'NІK?l1SE@@4 *+ *+'NІKn?l1SE@@3 *+ *+'NІK?l1SE@@3 *+ *+'NІK?l1SE@@3 *+ *+'NІKQ?l1SE@@3 *+ *+'NІK?l1SE@@3 *+ *+'NІK?l1SE@@3 *+ *+'NІK2?l1SE@@3 *+ *+'NІKs?l1SE@@3 *+ *+'NІKғ?l1SE@@3 *+ *+'NІK?l1SE@@3 *+ *+'NІKr?l1SE@@3 *+ *+'NІK?l1SE@@3 *+ *+'NІK?l1SE@@3 *+ *+'NІKU?l1SE@@3 *+ *+'N ІK?l1SE@@3 *+ *+'N!ІKٕ?l1SE@@3 *+ *+'N"ІK8?l1SE@@3 *+ *+'N#ІKy?l1SE@@3 *+ *+'N$ІKז?l1SE@@3 *+ *+'N%ІK?l1SE@@3 *+ *+'N&ІK\?l1SE@@3 *+ *+'N'ІK?l1SE@@3 *+ *+'N(ІK?l1SE@@3 *+ *+'N)ІK=?l1SE@@3 *+ *+'N*ІK?l1SE@@3 *+ *+'N+ІKݘ?l1SE@@3 *+ *+'N,ІK<?l1SE@@3 *+ *+'N-ІK}?l1SE@@3 *+ *+'N.ІK?l1SE@@3 *+ *+'N/ІK?l1SE@@3 *+ *+'N0ІK_?l1SE@@3 *+ *+'N1ІK?l1SE@@3 *+ *+'N2ІK?l1SE@@3 *+ *+'N3ІKB?l1SE@@3 *+ *+'N4ІK?l1SE@@3 *+ *+'N5ІK?l1SE@@3 *+ *+'N6ІK$?l1SE@@3 *+ *+'N7ІK?l1SE@@3 *+ *+'N8ІKÜ?l1SE@@3 *+ *+'N9ІK"?l1SE@@3 *+ *+'N:ІKc?l1SE@@3 *+ *+'N;ІK?l1SE@@3 *+ *+'N<ІK?l1SE@@3 *+ *+'N=ІKF?l1SE@@3 *+ *+'N>ІK?l1SE@@3 *+ *+'N?ІK?l1SE@@3 *+ *+'N@ІK(?l1SE@@3 *+ *+'NAІK?l1SE@@3 *+ *+'NBІKȟ?l1SE@@3 *+ *+'NCІK ?l1SE@@3 *+ *+'NDІKi?l1SE@@3 *+ *+'NEІK?l1SE@@3 *+ *+'NFІK?l1SE@@3 *+ *+'NGІKK?l1SE@@3 *+ *+'NHІK?l1SE@@3 *+ *+'NIІK?l1SE@@3 *+ *+'NJІK-?l1SE@@3 *+ *+'NKІKo?l1SE@@3 *+ *+'NLІK͢?l1SE@@3 *+ *+'NMІK?l1SE@@3 *+ *+'NNІKm?l1SE@@3 *+ *+'NOІK?l1SE@@3 *+ *+'NPІK?l1SE@@3 *+ *+'NQІKO?l1SE@@3 *+ *+'NRІK?l1SE@@3 *+ *+'NSІKӤ?l1SE@@3 *+ *+'NTІK2?l1SE@@3 *+ *+'NUІKs?l1SE@@3 *+ *+'NVІKҥ?l1SE@@3 *+ *+'NWІK?l1SE@@3 *+ *+'NXІKT?l1SE@@3 *+ *+'NYІK?l1SE@@3 *+ *+'NZІK?l1SE@@3 *+ *+'N[ІK8?l1SE@@3 *+ *+'N\ІK?l1SE@@3 *+ *+'N]ІKا?l1SE@@3 *+ *+'N^ІK5?l1SE@@3 *+ *+'N_ІKw?l1SE@@3 *+ *+'N`ІK?l1SE@@3 *+ *+'NaІK?l1SE@@3 *+ *+'NbІKY?l1SE@@3 *+ *+'NcІK?l1SE@@3 *+ *+'NdІK?l1SE@@3 *+ *+'NeІK;?l1SE@@3 *+ *+'NfІK?l1SE@@3 *+ *+'NgІKܪ?l1SE@@3 *+ *+'NhІK?l1SE@@3 *+ *+'NiІK}?l1SE@@3 *+ *+'NjІK?l1SE@@3 *+ *+'NkІK?l1SE@@3 *+ *+'NlІK^?l1SE@@3 *+ *+'NmІK?l1SE@@3 *+ *+'NnІK?l1SE@@3 *+ *+'NoІK??l1SE@@3 *+ *+'NpІK?l1SE@@3 *+ *+'NqІK?l1SE@@3 *+ *+'NrІK"?l1SE@@3 *+ *+'NsІK?l1SE@@3 *+ *+'NtІKî?l1SE@@3 *+ *+'NuІK?l1SE@@3 *+ *+'NvІKc?l1SE@@3 *+ *+'NwІK?l1SE@@3 *+ *+'NxІK?l1SE@@3 *+ *+'NyІKE?l1SE@@3 *+ *+'NzІK?l1SE@@3 *+ *+'N{ІK?l1SE@@3 *+ *+'N|ІK&?l1SE@@3 *+ *+'N}ІKi?l1SE@@3 *+ *+'N~ІKƱ?l1SE@@3 *+ *+'NІK?l1SE@@3 *+ *+'NІKh?l1SE@@3 *+ *+'NІK?l1SE@@3 *+ *+'NІK?l1SE@@3 *+ *+'NІKI?l1SE@@3 *+ *+'NІK?l1SE@@3 *+ *+'NІK̳?l1SE@@3 *+ *+'NІK  ?l1SE@@4 *+ *+'NІK<<?l1SE,@@5^ *+ *+'N@UUІK9VV?l1SEH@@5A *+ *+'4O!X@ІK?l1SE@@3 *+ *+'OІK3?l1SE@@3 *+ *+'OІK?l1SE@@3 *+ *+'OІK?l1SE@@3 *+ *+'OІK?l1SE@@3 *+ *+'OІKt?l1SE@@3 *+ *+'OІK?l1SE@@3 *+ *+'OІK?l1SE@@3 *+ *+'OІKU?l1SE@@3 *+ *+'O ІK?l1SE@@3 *+ *+'O ІK?l1SE@@3~ *+ *+'O ІK8?l1SE @@3} *+ *+'O ІKy?l1SE @@3| *+ *+'O ІK?l1SE @@3{ *+ *+'OІK?l1SE @@3z *+ *+'OІKx?l1SE @@3y *+ *+'OІK?l1SE@@3x *+ *+'OІK?l1SE@@3w *+ *+'OІKZ?l1SE@@3v *+ *+'OІK?l1SE@@3u *+ *+'OІK?l1SE@@3t *+ *+'OІK<?l1SE@@3s *+ *+'OІK~?l1SE@@3r *+ *+'OІK?l1SE@@3q *+ *+'OІK?l1SE@@3p *+ *+'OІK`?l1SE@@3o *+ *+'OІK?l1SE@@3n *+ *+'OІK?l1SE@@3m *+ *+'OІK_?l1SE@@3l *+ *+'OІK?l1SE@@3k *+ *+'OІK?l1SE@@3j *+ *+'OІK@?l1SE@@3i *+ *+'O ІK?l1SE@@3h *+ *+'O!ІK?l1SE@@3g *+ *+'O"ІK#?l1SE @@3f *+ *+'O#ІKd?l1SE!@@3e *+ *+'O$ІK?l1SE"@@3d *+ *+'O%ІK?l1SE#@@3c *+ *+'O&ІKG?l1SE$@@3b *+ *+'O'ІK?l1SE%@@3a *+ *+'O(ІK?l1SE&@@3` *+ *+'O)ІK(?l1SE'@@3_ *+ *+'O*ІK?l1SE(@@3^ *+ *+'O+ІK?l1SE)@@3] *+ *+'O,ІK'?l1SE*@@3\ *+ *+'O-ІKi?l1SE+@@3[ *+ *+'O.ІK?l1SE,@@3Z *+ *+'O/ІK ?l1SE-@@3Y *+ *+'O0ІKK?l1SE.@@3X *+ *+'O1ІK?l1SE/@@3W *+ *+'O2ІK?l1SE0@@3V *+ *+'O3ІK,?l1SE1@@3U *+ *+'O4ІK?l1SE2@@3T *+ *+'O5ІK?l1SE3@@3S *+ *+'O6ІK?l1SE4@@3R *+ *+'O7ІKm?l1SE5@@3Q *+ *+'O8ІK?l1SE6@@3P *+ *+'O9ІK ?l1SE7@@3O *+ *+'O:ІKO?l1SE8@@3N *+ *+'O;ІK?l1SE9@@3M *+ *+'O<ІK?l1SE:@@3L *+ *+'O=ІK1?l1SE;@@3K *+ *+'O>ІKs?l1SE<@@3J *+ *+'O?ІK?l1SE=@@3I *+ *+'O@ІK?l1SE>@@3H *+ *+'OAІKr?l1SE?@@3G *+ *+'OBІK?l1SE@@@3F *+ *+'OCІK?l1SEA@@3E *+ *+'ODІKT?l1SEB@@3D *+ *+'OEІK?l1SEC@@3C *+ *+'OFІK?l1SED@@3B *+ *+'OGІK6?l1SEE@@3A *+ *+'OHІKw?l1SEF@@3@ *+ *+'OIІK?l1SEG@@3? *+ *+'OJІK?l1SEH@@3> *+ *+'OKІKZ?l1SEI@@3= *+ *+'OLІK?l1SEJ@@3< *+ *+'OMІK?l1SEK@@3; *+ *+'ONІKX?l1SEL@@3: *+ *+'OOІK?l1SEM@@39 *+ *+'OPІK?l1SEN@@38 *+ *+'OQІK;?l1SEO@@37 *+ *+'ORІK|?l1SEP@@36 *+ *+'OSІK?l1SEQ@@35 *+ *+'OTІK?l1SER@@34 *+ *+'OUІK^?l1SES@@33 *+ *+'OVІK?l1SET@@32 *+ *+'OWІK?l1SEU@@31 *+ *+'OXІKA?l1SEV@@30 *+ *+'OYІK?l1SEW@@3/ *+ *+'OZІK?l1SEX@@3. *+ *+'O[ІK"?l1SEY@@3- *+ *+'O\ІK?l1SEZ@@3, *+ *+'O]ІK?l1SE[@@3+ *+ *+'O^ІK!?l1SE\@@3* *+ *+'O_ІKb?l1SE]@@3) *+ *+'O`ІK?l1SE^@@3( *+ *+'OaІK?l1SE_@@3' *+ *+'ObІKD?l1SE`@@3& *+ *+'OcІK?l1SEa@@3% *+ *+'OdІK?l1SEb@@3$ *+ *+'OeІK'?l1SEc@@3# *+ *+'OfІK?l1SEd@@3" *+ *+'OgІK?l1SEe@@3! *+ *+'OhІK ?l1SEf@@3 *+ *+'OiІKh?l1SEg@@3 *+ *+'OjІK?l1SEh@@3 *+ *+'OkІK?l1SEi@@3 *+ *+'OlІKI?l1SEj@@3 *+ *+'OmІK?l1SEk@@3 *+ *+'OnІK?l1SEl@@3 *+ *+'OoІK,?l1SEm@@3 *+ *+'OpІKn?l1SEn@@3 *+ *+'OqІK?l1SEo@@3 *+ *+'OrІK?l1SEp@@3 *+ *+'OsІKl?l1SEq@@3 *+ *+'OtІK?l1SEr@@3 *+ *+'OuІK?l1SEs@@3 *+ *+'OvІKN?l1SEt@@3 *+ *+'OwІK?l1SEu@@3 *+ *+'OxІK?l1SEv@@3 *+ *+'OyІK/?l1SEw@@3 *+ *+'OzІKs?l1SEx@@3 *+ *+'O{ІK?l1SEy@@3 *+ *+'O|ІK?l1SEz@@3 *+ *+'O}ІKT?l1SE{@@3 *+ *+'O~ІK?l1SE|@@3 *+ *+'OІK?l1SE}@@3 *+ *+'OІKR?l1SE~@@3 *+ *+'OІK?l1SE@@3 *+ *+'OІK?l1SE@@3 *+ *+'OІK4?l1SE@@3 *+ *+'OІKw?l1SE@@3 *+ *+'OІK?l1SE@@3 *+ *+'OІK  ?l1SE@@4 *+ *+'OІK<<?l1SE,@@4 *+ *+'O@UUІK VV?l1SEH@@4 *+ *+'4P!es@ІK ?l1SE@@2 *+ *+'PІK ?l1SE@@2 *+ *+'PІK\ ?l1SE@@2 *+ *+'PІK ?l1SE@@2 *+ *+'PІK ?l1SE@@2 *+ *+'PІK> ?l1SE@@2 *+ *+'PІK ?l1SE@@2 *+ *+'PІK ?l1SE@@2 *+ *+'PІK  ?l1SE@@2 *+ *+'P ІKc ?l1SE@@2 *+ *+'P ІK ?l1SE@@2 *+ *+'P ІK ?l1SE@@2 *+ *+'P ІKD ?l1SE@@2 *+ *+'P ІK ?l1SE@@2 *+ *+'PІK ?l1SE@@2 *+ *+'PІKC ?l1SE@@2 *+ *+'PІK ?l1SE@@2 *+ *+'PІK ?l1SE@@2 *+ *+'PІK% ?l1SE@@2 *+ *+'PІKg ?l1SE@@2 *+ *+'PІK ?l1SE@@2 *+ *+'PІK ?l1SE@@2 *+ *+'PІKH ?l1SE@@2 *+ *+'PІK ?l1SE@@2 *+ *+'PІK ?l1SE@@2 *+ *+'PІK* ?l1SE@@2 *+ *+'PІK ?l1SE@@2 *+ *+'PІK ?l1SE@@2 *+ *+'PІK) ?l1SE@@2 *+ *+'PІKl ?l1SE@@2 *+ *+'PІK ?l1SE@@2 *+ *+'PІK ?l1SE@@2 *+ *+'P ІKM ?l1SE@@2 *+ *+'P!ІK ?l1SE@@2 *+ *+'P"ІK ?l1SE@@2 *+ *+'P#ІK/ ?l1SE@@2 *+ *+'P$ІK ?l1SE@@2 *+ *+'P%ІK ?l1SE@@2 *+ *+'P&ІK ?l1SE@@2 *+ *+'P'ІKp ?l1SE@@2 *+ *+'P(ІK ?l1SE@@2 *+ *+'P)ІK ?l1SE@@2 *+ *+'P*ІKS ?l1SE@@2 *+ *+'P+ІK ?l1SE@@2 *+ *+'P,ІK ?l1SE@@2 *+ *+'P-ІK4 ?l1SE@@2 *+ *+'P.ІKu ?l1SE@@2 *+ *+'P/ІK ?l1SE@@2 *+ *+'P0ІK ?l1SE@@2 *+ *+'P1ІKt ?l1SE@@2 *+ *+'P2ІK ?l1SE@@2 *+ *+'P3ІK ?l1SE@@2 *+ *+'P4ІKV ?l1SE@@2 *+ *+'P5ІK ?l1SE@@2 *+ *+'P6ІK ?l1SE@@2 *+ *+'P7ІK9 ?l1SE@@2 *+ *+'P8ІK{ ?l1SE@@2 *+ *+'P9ІK ?l1SE@@2 *+ *+'P:ІK ?l1SE@@2 *+ *+'P;ІK\ ?l1SE@@2 *+ *+'P<ІK ?l1SE@@2 *+ *+'P=ІK ?l1SE@@2 *+ *+'P>ІK> ?l1SE@@2 *+ *+'P?ІK ?l1SE@@2 *+ *+'P@ІK ?l1SE@@2 *+ *+'PAІK> ?l1SE@@2 *+ *+'PBІK ?l1SE@@2 *+ *+'PCІK ?l1SE@@2 *+ *+'PDІK ?l1SE@@2 *+ *+'PEІK` ?l1SE@@2 *+ *+'PFІK ?l1SE@@2 *+ *+'PGІK ?l1SE@@2 *+ *+'PHІKD ?l1SE@@2 *+ *+'PIІK ?l1SE@@2 *+ *+'PJІK ?l1SE@@2 *+ *+'PKІK& ?l1SE@@2 *+ *+'PLІK ?l1SE@@2 *+ *+'PMІK ?l1SE@@2 *+ *+'PNІK$ ?l1SE@@2 *+ *+'POІKe ?l1SE@@2 *+ *+'PPІK ?l1SE@@2 *+ *+'PQІK ?l1SE@@2 *+ *+'PRІKG ?l1SE@@2 *+ *+'PSІK ?l1SE@@2 *+ *+'PTІK ?l1SE@@2 *+ *+'PUІK* ?l1SE@@2 *+ *+'PVІK ?l1SE@@2 *+ *+'PWІK ?l1SE@@2 *+ *+'PXІK  ?l1SE@@2 *+ *+'PYІKj ?l1SE@@2 *+ *+'PZІK ?l1SE@@2 *+ *+'P[ІK ?l1SE@@2 *+ *+'P\ІKK ?l1SE@@2 *+ *+'P]ІK ?l1SE@@2 *+ *+'P^ІK ?l1SE@@2 *+ *+'P_ІK. ?l1SE@@2 *+ *+'P`ІKp ?l1SE@@2 *+ *+'PaІK ?l1SE@@2 *+ *+'PbІK ?l1SE@@2 *+ *+'PcІKo ?l1SE@@2 *+ *+'PdІK ?l1SE@@2 *+ *+'PeІK ?l1SE@@2 *+ *+'PfІKP ?l1SE@@2 *+ *+'PgІK ?l1SE@@2 *+ *+'PhІK ?l1SE@@2 *+ *+'PiІK2! ?l1SE@@2 *+ *+'PjІKu! ?l1SE@@2 *+ *+'PkІK! ?l1SE@@2 *+ *+'PlІK" ?l1SE@@2 *+ *+'PmІKW" ?l1SE@@2 *+ *+'PnІK" ?l1SE@@2 *+ *+'PoІK" ?l1SE@@2 *+ *+'PpІK8# ?l1SE@@2 *+ *+'PqІK# ?l1SE@@2 *+ *+'PrІK# ?l1SE@@2 *+ *+'PsІK7$ ?l1SE@@2 *+ *+'PtІKx$ ?l1SE@@2 *+ *+'PuІK$ ?l1SE@@2 *+ *+'PvІK% ?l1SE@@2 *+ *+'PwІK[% ?l1SE@@2 *+ *+'PxІK% ?l1SE@@2 *+ *+'PyІK% ?l1SE@@2 *+ *+'PzІK=& ?l1SE@@2 *+ *+'P{ІK& ?l1SE@@2 *+ *+'P|ІK& ?l1SE@@2 *+ *+'P}ІK' ?l1SE@@2 *+ *+'P~ІK}' ?l1SE@@2 *+ *+'PІK' ?l1SE@@2 *+ *+'PІK( ?l1SE@@2 *+ *+'PІK`( ?l1SE@@2~ *+ *+'PІK( ?l1SE @@2} *+ *+'PІK) ?l1SE @@2| *+ *+'PІKA) ?l1SE @@2{ *+ *+'PІK) ?l1SE @@2z *+ *+'PІK)  ?l1SE @@3} *+ *+'PІK) <<?l1SE,@@4L *+ *+'P@UUІK; VV?l1SEH@@4/ *+ *+'4Q!r D@ІK< ?l1SE@@2v *+ *+'QІK< ?l1SE@@2u *+ *+'QІKD= ?l1SE@@2t *+ *+'QІK= ?l1SE@@2s *+ *+'QІK= ?l1SE@@2r *+ *+'QІK&> ?l1SE@@2q *+ *+'QІKh> ?l1SE@@2p *+ *+'QІK> ?l1SE@@2o *+ *+'QІK? ?l1SE@@2n *+ *+'Q ІKJ? ?l1SE@@2m *+ *+'Q ІK? ?l1SE@@2l *+ *+'Q ІK? ?l1SE@@2k *+ *+'Q ІK,@ ?l1SE@@2j *+ *+'Q ІK@ ?l1SE@@2i *+ *+'QІK@ ?l1SE@@2h *+ *+'QІK+A ?l1SE@@2g *+ *+'QІKlA ?l1SE @@2f *+ *+'QІKA ?l1SE!@@2e *+ *+'QІK B ?l1SE"@@2d *+ *+'QІKNB ?l1SE#@@2c *+ *+'QІKB ?l1SE$@@2b *+ *+'QІKB ?l1SE%@@2a *+ *+'QІK1C ?l1SE&@@2` *+ *+'QІKC ?l1SE'@@2_ *+ *+'QІKC ?l1SE(@@2^ *+ *+'QІKD ?l1SE)@@2] *+ *+'QІKqD ?l1SE*@@2\ *+ *+'QІKD ?l1SE+@@2[ *+ *+'QІKE ?l1SE,@@2Z *+ *+'QІKSE ?l1SE-@@2Y *+ *+'QІKE ?l1SE.@@2X *+ *+'QІKE ?l1SE/@@2W *+ *+'Q ІK6F ?l1SE0@@2V *+ *+'Q!ІKwF ?l1SE1@@2U *+ *+'Q"ІKF ?l1SE2@@2T *+ *+'Q#ІKG ?l1SE3@@2S *+ *+'Q$ІKwG ?l1SE4@@2R *+ *+'Q%ІKG ?l1SE5@@2Q *+ *+'Q&ІKG ?l1SE6@@2P *+ *+'Q'ІKWH ?l1SE7@@2O *+ *+'Q(ІKH ?l1SE8@@2N *+ *+'Q)ІKH ?l1SE9@@2M *+ *+'Q*ІK:I ?l1SE:@@2L *+ *+'Q+ІK{I ?l1SE;@@2K *+ *+'Q,ІKI ?l1SE<@@2J *+ *+'Q-ІKJ ?l1SE=@@2I *+ *+'Q.ІK^J ?l1SE>@@2H *+ *+'Q/ІKJ ?l1SE?@@2G *+ *+'Q0ІKJ ?l1SE@@@2F *+ *+'Q1ІK]K ?l1SEA@@2E *+ *+'Q2ІKK ?l1SEB@@2D *+ *+'Q3ІKK ?l1SEC@@2C *+ *+'Q4ІK>L ?l1SED@@2B *+ *+'Q5ІKL ?l1SEE@@2A *+ *+'Q6ІKL ?l1SEF@@2@ *+ *+'Q7ІK M ?l1SEG@@2? *+ *+'Q8ІKbM ?l1SEH@@2> *+ *+'Q9ІKM ?l1SEI@@2= *+ *+'Q:ІKN ?l1SEJ@@2< *+ *+'Q;ІKDN ?l1SEK@@2; *+ *+'Q<ІKN ?l1SEL@@2: *+ *+'Q=ІKN ?l1SEM@@29 *+ *+'Q>ІK&O ?l1SEN@@28 *+ *+'Q?ІKO ?l1SEO@@27 *+ *+'Q@ІKO ?l1SEP@@26 *+ *+'QAІK$P ?l1SEQ@@25 *+ *+'QBІKgP ?l1SER@@24 *+ *+'QCІKP ?l1SES@@23 *+ *+'QDІKQ ?l1SET@@22 *+ *+'QEІKHQ ?l1SEU@@21 *+ *+'QFІKQ ?l1SEV@@20 *+ *+'QGІKQ ?l1SEW@@2/ *+ *+'QHІK*R ?l1SEX@@2. *+ *+'QIІKR ?l1SEY@@2- *+ *+'QJІKR ?l1SEZ@@2, *+ *+'QKІK S ?l1SE[@@2+ *+ *+'QLІKkS ?l1SE\@@2* *+ *+'QMІKS ?l1SE]@@2) *+ *+'QNІK T ?l1SE^@@2( *+ *+'QOІKMT ?l1SE_@@2' *+ *+'QPІKT ?l1SE`@@2& *+ *+'QQІKT ?l1SEa@@2% *+ *+'QRІK.U ?l1SEb@@2$ *+ *+'QSІKpU ?l1SEc@@2# *+ *+'QTІKU ?l1SEd@@2" *+ *+'QUІKV ?l1SEe@@2! *+ *+'QVІKoV ?l1SEf@@2 *+ *+'QWІKV ?l1SEg@@2 *+ *+'QXІKV ?l1SEh@@2 *+ *+'QYІKRW ?l1SEi@@2 *+ *+'QZІKW ?l1SEj@@2 *+ *+'Q[ІKW ?l1SEk@@2 *+ *+'Q\ІK4X ?l1SEl@@2 *+ *+'Q]ІKuX ?l1SEm@@2 *+ *+'Q^ІKX ?l1SEn@@2 *+ *+'Q_ІKY ?l1SEo@@2 *+ *+'Q`ІKXY ?l1SEp@@2 *+ *+'QaІKY ?l1SEq@@2 *+ *+'QbІKY ?l1SEr@@2 *+ *+'QcІKUZ ?l1SEs@@2 *+ *+'QdІKZ ?l1SEt@@2 *+ *+'QeІKZ ?l1SEu@@2 *+ *+'QfІK8[ ?l1SEv@@2 *+ *+'QgІKz[ ?l1SEw@@2 *+ *+'QhІK[ ?l1SEx@@2 *+ *+'QiІK\ ?l1SEy@@2 *+ *+'QjІK\\ ?l1SEz@@2 *+ *+'QkІK\ ?l1SE{@@2 *+ *+'QlІK\ ?l1SE|@@2 *+ *+'QmІK>] ?l1SE}@@2 *+ *+'QnІK] ?l1SE~@@2 *+ *+'QoІK] ?l1SE@@2 *+ *+'QpІK ^ ?l1SE@@2 *+ *+'QqІK^ ?l1SE@@2 *+ *+'QrІK^ ?l1SE@@2 *+ *+'QsІK_ ?l1SE@@2 *+ *+'QtІK`_ ?l1SE@@2 *+ *+'QuІK_ ?l1SE@@2 *+ *+'QvІK` ?l1SE@@2 *+ *+'QwІKB` ?l1SE@@1 *+ *+'QxІK` ?l1SE@@1 *+ *+'QyІK` ?l1SE@@1 *+ *+'QzІK$a ?l1SE@@1 *+ *+'Q{ІKa ?l1SE@@1 *+ *+'Q|ІKa ?l1SE@@1 *+ *+'Q}ІKb ?l1SE@@1 *+ *+'Q~ІKeb ?l1SE@@1 *+ *+'QІKb ?l1SE@@1 *+ *+'QІKc ?l1SE@@1 *+ *+'QІKFc ?l1SE@@1 *+ *+'QІKc ?l1SE@@1 *+ *+'QІKc ?l1SE@@1 *+ *+'QІK*d ?l1SE@@1 *+ *+'QІKjd ?l1SE@@1 *+ *+'QІKd  ?l1SE@@2 *+ *+'QІKd <<?l1SE,@@3 *+ *+'Q@UUІKv VV?l1SEH@@3 *+ *+'4R!~@ІKjw ?l1SE@@1 *+ *+'RІKw ?l1SE@@1 *+ *+'RІK x ?l1SE@@1 *+ *+'RІKWx ?l1SE@@1 *+ *+'RІKx ?l1SE@@1 *+ *+'RІKx ?l1SE@@1 *+ *+'RІK.y ?l1SE@@1 *+ *+'RІKy ?l1SE@@1 *+ *+'RІKy ?l1SE@@1 *+ *+'R ІKz ?l1SE@@1 *+ *+'R ІKoz ?l1SE@@1 *+ *+'R ІKz ?l1SE@@1 *+ *+'R ІKz ?l1SE@@1 *+ *+'R ІKQ{ ?l1SE@@1 *+ *+'RІK{ ?l1SE@@1 *+ *+'RІK{ ?l1SE@@1 *+ *+'RІK2| ?l1SE@@1 *+ *+'RІKt| ?l1SE@@1 *+ *+'RІK| ?l1SE@@1 *+ *+'RІK} ?l1SE@@1 *+ *+'RІKV} ?l1SE@@1 *+ *+'RІK} ?l1SE@@1 *+ *+'RІK} ?l1SE@@1 *+ *+'RІKU~ ?l1SE@@1 *+ *+'RІK~ ?l1SE@@1 *+ *+'RІK~ ?l1SE@@1 *+ *+'RІK6 ?l1SE@@1 *+ *+'RІKy ?l1SE@@1 *+ *+'RІK ?l1SE@@1 *+ *+'RІK ?l1SE@@1 *+ *+'RІK[ ?l1SE@@1 *+ *+'RІK ?l1SE@@1 *+ *+'R ІK ?l1SE@@1 *+ *+'R!ІK= ?l1SE@@1 *+ *+'R"ІK ?l1SE@@1 *+ *+'R#ІK܁ ?l1SE@@1 *+ *+'R$ІK; ?l1SE@@1 *+ *+'R%ІK} ?l1SE@@1 *+ *+'R&ІK ?l1SE@@1 *+ *+'R'ІK ?l1SE@@1 *+ *+'R(ІK_ ?l1SE@@1 *+ *+'R)ІK ?l1SE@@1 *+ *+'R*ІK ?l1SE@@1 *+ *+'R+ІKA ?l1SE@@1 *+ *+'R,ІK ?l1SE@@1 *+ *+'R-ІK ?l1SE@@1 *+ *+'R.ІK" ?l1SE@@1 *+ *+'R/ІK ?l1SE@@1 *+ *+'R0ІKą ?l1SE@@1 *+ *+'R1ІK" ?l1SE@@1 *+ *+'R2ІKd ?l1SE@@1 *+ *+'R3ІK ?l1SE@@1 *+ *+'R4ІK ?l1SE@@1 *+ *+'R5ІKG ?l1SE@@1 *+ *+'R6ІK ?l1SE@@1 *+ *+'R7ІK ?l1SE@@1 *+ *+'R8ІK' ?l1SE@@1 *+ *+'R9ІK ?l1SE@@1 *+ *+'R:ІKLj ?l1SE@@1 *+ *+'R;ІK ?l1SE@@1 *+ *+'R<ІKh ?l1SE@@1 *+ *+'R=ІK ?l1SE@@1 *+ *+'R>ІK ?l1SE@@1 *+ *+'R?ІKK ?l1SE@@1 *+ *+'R@ІK ?l1SE@@1 *+ *+'RAІK ?l1SE@@1 *+ *+'RBІK, ?l1SE@@1 *+ *+'RCІKn ?l1SE@@1 *+ *+'RDІK̋ ?l1SE@@1 *+ *+'REІK ?l1SE@@1 *+ *+'RFІKQ ?l1SE@@1 *+ *+'RGІK ?l1SE@@1 *+ *+'RHІK ?l1SE@@1 *+ *+'RIІKO ?l1SE@@1 *+ *+'RJІK ?l1SE@@1 *+ *+'RKІKҍ ?l1SE@@1 *+ *+'RLІK1 ?l1SE@@1 *+ *+'RMІKs ?l1SE@@1 *+ *+'RNІKю ?l1SE@@1 *+ *+'ROІK ?l1SE@@1 *+ *+'RPІKU ?l1SE@@1 *+ *+'RQІK ?l1SE@@1 *+ *+'RRІK ?l1SE@@1 *+ *+'RSІK7 ?l1SE@@1 *+ *+'RTІK ?l1SE@@1 *+ *+'RUІK֐ ?l1SE@@1 *+ *+'RVІK5 ?l1SE@@1 *+ *+'RWІKw ?l1SE@@1 *+ *+'RXІK ?l1SE@@1 *+ *+'RYІK ?l1SE@@1 *+ *+'RZІKY ?l1SE@@1 *+ *+'R[ІK ?l1SE@@1 *+ *+'R\ІK ?l1SE@@1 *+ *+'R]ІK; ?l1SE@@1 *+ *+'R^ІK ?l1SE@@1 *+ *+'R_ІKܓ ?l1SE@@1 *+ *+'R`ІK ?l1SE@@1 *+ *+'RaІK| ?l1SE@@1 *+ *+'RbІK ?l1SE@@1 *+ *+'RcІK ?l1SE@@1 *+ *+'RdІK] ?l1SE@@1 *+ *+'ReІK ?l1SE@@1 *+ *+'RfІK ?l1SE@@1 *+ *+'RgІK@ ?l1SE@@1 *+ *+'RhІK ?l1SE@@1 *+ *+'RiІK ?l1SE@@1 *+ *+'RjІK" ?l1SE@@1 *+ *+'RkІK ?l1SE@@1 *+ *+'RlІK— ?l1SE@@1 *+ *+'RmІK ?l1SE@@1 *+ *+'RnІKc ?l1SE@@1 *+ *+'RoІK ?l1SE@@1~ *+ *+'RpІK ?l1SE @@1} *+ *+'RqІKD ?l1SE @@1| *+ *+'RrІK ?l1SE @@1{ *+ *+'RsІK ?l1SE @@1z *+ *+'RtІK' ?l1SE @@1y *+ *+'RuІKh ?l1SE@@1x *+ *+'RvІKǚ ?l1SE@@1w *+ *+'RwІK ?l1SE@@1v *+ *+'RxІKJ ?l1SE@@1u *+ *+'RyІK ?l1SE@@1t *+ *+'RzІK ?l1SE@@1s *+ *+'R{ІKI ?l1SE@@1r *+ *+'R|ІK ?l1SE@@1q *+ *+'R}ІK̜ ?l1SE@@1p *+ *+'R~ІK+ ?l1SE@@1o *+ *+'RІKm ?l1SE@@1n *+ *+'RІK˝ ?l1SE@@1m *+ *+'RІK ?l1SE@@1l *+ *+'RІKO ?l1SE@@1k *+ *+'RІK ?l1SE@@1j *+ *+'RІK ?l1SE@@1i *+ *+'RІK0 ?l1SE@@1h *+ *+'RІKd  ?l1SE@@2k *+ *+'RІKk <<?l1SE, @@3: *+ *+'R@UUІK VV?l1SEH!@@3 *+ *+'4S!,@ІKR ?l1SE"@@1d *+ *+'SІK ?l1SE#@@1c *+ *+'SІK ?l1SE$@@1b *+ *+'SІK2 ?l1SE%@@1a *+ *+'SІKu ?l1SE&@@1` *+ *+'SІKӳ ?l1SE'@@1_ *+ *+'SІK ?l1SE(@@1^ *+ *+'SІKs ?l1SE)@@1] *+ *+'SІK ?l1SE*@@1\ *+ *+'S ІK ?l1SE+@@1[ *+ *+'S ІKU ?l1SE,@@1Z *+ *+'S ІK ?l1SE-@@1Y *+ *+'S ІKٵ ?l1SE.@@1X *+ *+'S ІK8 ?l1SE/@@1W *+ *+'SІKz ?l1SE0@@1V *+ *+'SІKٶ ?l1SE1@@1U *+ *+'SІK ?l1SE2@@1T *+ *+'SІK[ ?l1SE3@@1S *+ *+'SІK ?l1SE4@@1R *+ *+'SІK ?l1SE5@@1Q *+ *+'SІK> ?l1SE6@@1P *+ *+'SІK ?l1SE7@@1O *+ *+'SІK޸ ?l1SE8@@1N *+ *+'SІK< ?l1SE9@@1M *+ *+'SІK~ ?l1SE:@@1L *+ *+'SІK ?l1SE;@@1K *+ *+'SІK ?l1SE<@@1J *+ *+'SІK` ?l1SE=@@1I *+ *+'SІK ?l1SE>@@1H *+ *+'SІK ?l1SE?@@1G *+ *+'SІKC ?l1SE@@@1F *+ *+'SІK ?l1SEA@@1E *+ *+'S ІK ?l1SEB@@1D *+ *+'S!ІK% ?l1SEC@@1C *+ *+'S"ІK ?l1SED@@1B *+ *+'S#ІKż ?l1SEE@@1A *+ *+'S$ІK# ?l1SEF@@1@ *+ *+'S%ІKd ?l1SEG@@1? *+ *+'S&ІK ?l1SEH@@1> *+ *+'S'ІK ?l1SEI@@1= *+ *+'S(ІKF ?l1SEJ@@1< *+ *+'S)ІK ?l1SEK@@1; *+ *+'S*ІK ?l1SEL@@1: *+ *+'S+ІK) ?l1SEM@@19 *+ *+'S,ІK ?l1SEN@@18 *+ *+'S-ІKɿ ?l1SEO@@17 *+ *+'S.ІK ?l1SEP@@16 *+ *+'S/ІKi ?l1SEQ@@15 *+ *+'S0ІK ?l1SER@@14 *+ *+'S1ІK ?l1SES@@13 *+ *+'S2ІKK ?l1SET@@12 *+ *+'S3ІK ?l1SEU@@11 *+ *+'S4ІK ?l1SEV@@10 *+ *+'S5ІK. ?l1SEW@@1/ *+ *+'S6ІKo ?l1SEX@@1. *+ *+'S7ІK ?l1SEY@@1- *+ *+'S8ІK ?l1SEZ@@1, *+ *+'S9ІKn ?l1SE[@@1+ *+ *+'S:ІK ?l1SE\@@1* *+ *+'S;ІK ?l1SE]@@1) *+ *+'S<ІKQ ?l1SE^@@1( *+ *+'S=ІK ?l1SE_@@1' *+ *+'S>ІK ?l1SE`@@1& *+ *+'S?ІK2 ?l1SEa@@1% *+ *+'S@ІKt ?l1SEb@@1$ *+ *+'SAІK ?l1SEc@@1# *+ *+'SBІK ?l1SEd@@1" *+ *+'SCІKV ?l1SEe@@1! *+ *+'SDІK ?l1SEf@@1 *+ *+'SEІK ?l1SEg@@1 *+ *+'SFІK8 ?l1SEh@@1 *+ *+'SGІK ?l1SEi@@1 *+ *+'SHІK ?l1SEj@@1 *+ *+'SIІK6 ?l1SEk@@1 *+ *+'SJІKx ?l1SEl@@1 *+ *+'SKІK ?l1SEm@@1 *+ *+'SLІK ?l1SEn@@1 *+ *+'SMІK[ ?l1SEo@@1 *+ *+'SNІK ?l1SEp@@1 *+ *+'SOІK ?l1SEq@@1 *+ *+'SPІK< ?l1SEr@@1 *+ *+'SQІK ?l1SEs@@1 *+ *+'SRІK ?l1SEt@@1 *+ *+'SSІK ?l1SEu@@1 *+ *+'STІK| ?l1SEv@@1 *+ *+'SUІK ?l1SEw@@1 *+ *+'SVІK ?l1SEx@@1 *+ *+'SWІK_ ?l1SEy@@1 *+ *+'SXІK ?l1SEz@@1 *+ *+'SYІK ?l1SE{@@1 *+ *+'SZІKA ?l1SE|@@1 *+ *+'S[ІK ?l1SE}@@1 *+ *+'S\ІK ?l1SE~@@1 *+ *+'S]ІK" ?l1SE@@1 *+ *+'S^ІK ?l1SE@@1 *+ *+'S_ІK ?l1SE@@1 *+ *+'S`ІK ?l1SE@@1 *+ *+'SaІKd ?l1SE@@1 *+ *+'SbІK ?l1SE@@1 *+ *+'ScІK ?l1SE@@1 *+ *+'SdІKF ?l1SE@@1 *+ *+'SeІK ?l1SE@@0 *+ *+'SfІK ?l1SE@@0 *+ *+'SgІK& ?l1SE@@0 *+ *+'ShІKj ?l1SE@@0 *+ *+'SiІK ?l1SE@@0 *+ *+'SjІK ?l1SE@@0 *+ *+'SkІKg ?l1SE@@0 *+ *+'SlІK ?l1SE@@0 *+ *+'SmІK ?l1SE@@0 *+ *+'SnІKJ ?l1SE@@0 *+ *+'SoІK ?l1SE@@0 *+ *+'SpІK ?l1SE@@0 *+ *+'SqІK, ?l1SE@@0 *+ *+'SrІKn ?l1SE@@0 *+ *+'SsІK ?l1SE@@0 *+ *+'StІK ?l1SE@@0 *+ *+'SuІKO ?l1SE@@0 *+ *+'SvІK ?l1SE@@0 *+ *+'SwІK ?l1SE@@0 *+ *+'SxІK1 ?l1SE@@0 *+ *+'SyІK ?l1SE@@0 *+ *+'SzІK ?l1SE@@0 *+ *+'S{ІK0 ?l1SE@@0 *+ *+'S|ІKr ?l1SE@@0 *+ *+'S}ІK ?l1SE@@0 *+ *+'S~ІK ?l1SE@@0 *+ *+'SІKU ?l1SE@@0 *+ *+'SІK ?l1SE@@0 *+ *+'SІK ?l1SE@@0 *+ *+'SІK7 ?l1SE@@0 *+ *+'SІK ?l1SE@@0 *+ *+'SІK ?l1SE@@0 *+ *+'SІK ?l1SE@@0 *+ *+'SІKK  ?l1SE@@1 *+ *+'SІKR <<?l1SE,@@2 *+ *+'S@UUІKb VV?l1SEH@@2 *+ *+'4T!g@ІK ?l1SE@@0 *+ *+'TІK[ ?l1SE@@0 *+ *+'TІK ?l1SE@@0 *+ *+'TІK ?l1SE@@0 *+ *+'TІK= ?l1SE@@0 *+ *+'TІK ?l1SE@@0 *+ *+'TІK ?l1SE@@0 *+ *+'TІK; ?l1SE@@0 *+ *+'TІK} ?l1SE@@0 *+ *+'T ІK ?l1SE@@0 *+ *+'T ІK ?l1SE@@0 *+ *+'T ІK_ ?l1SE@@0 *+ *+'T ІK ?l1SE@@0 *+ *+'T ІK ?l1SE@@0 *+ *+'TІKA ?l1SE@@0 *+ *+'TІK ?l1SE@@0 *+ *+'TІK ?l1SE@@0 *+ *+'TІK" ?l1SE@@0 *+ *+'TІK ?l1SE@@0 *+ *+'TІK ?l1SE@@0 *+ *+'TІK ?l1SE@@0 *+ *+'TІKd ?l1SE@@0 *+ *+'TІK ?l1SE@@0 *+ *+'TІK ?l1SE@@0 *+ *+'TІKF ?l1SE@@0 *+ *+'TІK ?l1SE@@0 *+ *+'TІK ?l1SE@@0 *+ *+'TІK( ?l1SE@@0 *+ *+'TІK ?l1SE@@0 *+ *+'TІK ?l1SE@@0 *+ *+'TІK ?l1SE@@0 *+ *+'TІKg ?l1SE@@0 *+ *+'T ІK ?l1SE@@0 *+ *+'T!ІK ?l1SE@@0 *+ *+'T"ІKJ ?l1SE@@0 *+ *+'T#ІK ?l1SE@@0 *+ *+'T$ІK ?l1SE@@0 *+ *+'T%ІK, ?l1SE@@0 *+ *+'T&ІKm ?l1SE@@0 *+ *+'T'ІK ?l1SE@@0 *+ *+'T(ІK ?l1SE@@0 *+ *+'T)ІKP ?l1SE@@0 *+ *+'T*ІK ?l1SE@@0 *+ *+'T+ІK ?l1SE@@0 *+ *+'T,ІKN ?l1SE@@0 *+ *+'T-ІK ?l1SE@@0 *+ *+'T.ІK ?l1SE@@0 *+ *+'T/ІK1 ?l1SE@@0 *+ *+'T0ІKr ?l1SE@@0 *+ *+'T1ІK ?l1SE@@0 *+ *+'T2ІK ?l1SE@@0 *+ *+'T3ІKT ?l1SE@@0 *+ *+'T4ІK ?l1SE@@0 *+ *+'T5ІK ?l1SE@@0 *+ *+'T6ІK6 ?l1SE@@0 *+ *+'T7ІK ?l1SE@@0 *+ *+'T8ІK ?l1SE@@0 *+ *+'T9ІK5 ?l1SE@@0 *+ *+'T:ІKw ?l1SE@@0 *+ *+'T;ІK ?l1SE@@0 *+ *+'T<ІK ?l1SE@@0 *+ *+'T=ІKY ?l1SE@@0 *+ *+'T>ІK ?l1SE@@0 *+ *+'T?ІK ?l1SE@@0 *+ *+'T@ІK< ?l1SE@@0 *+ *+'TAІK ?l1SE@@0 *+ *+'TBІK ?l1SE@@0 *+ *+'TCІK ?l1SE@@0 *+ *+'TDІK| ?l1SE@@0 *+ *+'TEІK ?l1SE@@0 *+ *+'TFІK ?l1SE@@0 *+ *+'TGІK^ ?l1SE@@0 *+ *+'THІK ?l1SE@@0 *+ *+'TIІK ?l1SE@@0 *+ *+'TJІK? ?l1SE@@0 *+ *+'TKІK ?l1SE@@0 *+ *+'TLІK ?l1SE@@0 *+ *+'TMІK" ?l1SE@@0 *+ *+'TNІK ?l1SE@@0 *+ *+'TOІK ?l1SE@@0 *+ *+'TPІK ?l1SE@@0 *+ *+'TQІKc ?l1SE@@0 *+ *+'TRІK ?l1SE@@0 *+ *+'TSІK ?l1SE@@0 *+ *+'TTІKD ?l1SE@@0 *+ *+'TUІK ?l1SE@@0 *+ *+'TVІK ?l1SE@@0 *+ *+'TWІK& ?l1SE@@0 *+ *+'TXІKh ?l1SE@@0 *+ *+'TYІK ?l1SE@@0 *+ *+'TZІK ?l1SE@@0 *+ *+'T[ІKJ ?l1SE@@0 *+ *+'T\ІK ?l1SE@@0 *+ *+'T]ІK ?l1SE@@0~ *+ *+'T^ІKI ?l1SE @@0} *+ *+'T_ІK ?l1SE @@0| *+ *+'T`ІK ?l1SE @@0{ *+ *+'TaІK* ?l1SE @@0z *+ *+'TbІKm ?l1SE @@0y *+ *+'TcІK ?l1SE@@0x *+ *+'TdІK ?l1SE@@0w *+ *+'TeІKO ?l1SE@@0v *+ *+'TfІK ?l1SE@@0u *+ *+'TgІK ?l1SE@@0t *+ *+'ThІK0 ?l1SE@@0s *+ *+'TiІK ?l1SE@@0r *+ *+'TjІK ?l1SE@@0q *+ *+'TkІK/ ?l1SE@@0p *+ *+'TlІKq ?l1SE@@0o *+ *+'TmІK ?l1SE@@0n *+ *+'TnІK ?l1SE@@0m *+ *+'ToІKS ?l1SE@@0l *+ *+'TpІK ?l1SE@@0k *+ *+'TqІK ?l1SE@@0j *+ *+'TrІK5 ?l1SE@@0i *+ *+'TsІK ?l1SE@@0h *+ *+'TtІK ?l1SE@@0g *+ *+'TuІK ?l1SE @@0f *+ *+'TvІKu ?l1SE!@@0e *+ *+'TwІK ?l1SE"@@0d *+ *+'TxІK ?l1SE#@@0c *+ *+'TyІKX ?l1SE$@@0b *+ *+'TzІK ?l1SE%@@0a *+ *+'T{ІK ?l1SE&@@0` *+ *+'T|ІK9 ?l1SE'@@0_ *+ *+'T}ІK{ ?l1SE(@@0^ *+ *+'T~ІK ?l1SE)@@0] *+ *+'TІK ?l1SE*@@0\ *+ *+'TІKz ?l1SE+@@0[ *+ *+'TІK ?l1SE,@@0Z *+ *+'TІK ?l1SE-@@0Y *+ *+'TІK[ ?l1SE.@@0X *+ *+'TІK ?l1SE/@@0W *+ *+'TІK ?l1SE0@@0V *+ *+'TІK  ?l1SE1@@1Y *+ *+'TІK <<?l1SE,2@@2( *+ *+'T@UUІKH' VV?l1SEH3@@2 *+ *+'4U!P@ІK( ?l1SE4@@0R *+ *+'UІKA( ?l1SE5@@0Q *+ *+'UІK( ?l1SE6@@0P *+ *+'UІK( ?l1SE7@@0O *+ *+'UІK$) ?l1SE8@@0N *+ *+'UІK) ?l1SE9@@0M *+ *+'UІK) ?l1SE:@@0L *+ *+'UІK#* ?l1SE;@@0K *+ *+'UІKd* ?l1SE<@@0J *+ *+'U ІK* ?l1SE=@@0I *+ *+'U ІK+ ?l1SE>@@0H *+ *+'U ІKF+ ?l1SE?@@0G *+ *+'U ІK+ ?l1SE@@@0F *+ *+'U ІK+ ?l1SEA@@0E *+ *+'UІK), ?l1SEB@@0D *+ *+'UІK, ?l1SEC@@0C *+ *+'UІK, ?l1SED@@0B *+ *+'UІK - ?l1SEE@@0A *+ *+'UІKi- ?l1SEF@@0@ *+ *+'UІK- ?l1SEG@@0? *+ *+'UІK- ?l1SEH@@0> *+ *+'UІKK. ?l1SEI@@0= *+ *+'UІK. ?l1SEJ@@0< *+ *+'UІK. ?l1SEK@@0; *+ *+'UІK,/ ?l1SEL@@0: *+ *+'UІKo/ ?l1SEM@@09 *+ *+'UІK/ ?l1SEN@@08 *+ *+'UІK0 ?l1SEO@@07 *+ *+'UІKn0 ?l1SEP@@06 *+ *+'UІK0 ?l1SEQ@@05 *+ *+'UІK0 ?l1SER@@04 *+ *+'UІKP1 ?l1SES@@03 *+ *+'U ІK1 ?l1SET@@02 *+ *+'U!ІK1 ?l1SEU@@01 *+ *+'U"ІK12 ?l1SEV@@00 *+ *+'U#ІKt2 ?l1SEW@@0/ *+ *+'U$ІK2 ?l1SEX@@0. *+ *+'U%ІK3 ?l1SEY@@0- *+ *+'U&ІKU3 ?l1SEZ@@0, *+ *+'U'ІK3 ?l1SE[@@0+ *+ *+'U(ІK3 ?l1SE\@@0* *+ *+'U)ІK74 ?l1SE]@@0) *+ *+'U*ІK4 ?l1SE^@@0( *+ *+'U+ІK4 ?l1SE_@@0' *+ *+'U,ІK65 ?l1SE`@@0& *+ *+'U-ІKx5 ?l1SEa@@0% *+ *+'U.ІK5 ?l1SEb@@0$ *+ *+'U/ІK6 ?l1SEc@@0# *+ *+'U0ІK[6 ?l1SEd@@0" *+ *+'U1ІK6 ?l1SEe@@0! *+ *+'U2ІK6 ?l1SEf@@0 *+ *+'U3ІK;7 ?l1SEg@@0 *+ *+'U4ІK7 ?l1SEh@@0 *+ *+'U5ІK7 ?l1SEi@@0 *+ *+'U6ІK8 ?l1SEj@@0 *+ *+'U7ІK|8 ?l1SEk@@0 *+ *+'U8ІK8 ?l1SEl@@0 *+ *+'U9ІK9 ?l1SEm@@0 *+ *+'U:ІK^9 ?l1SEn@@0 *+ *+'U;ІK9 ?l1SEo@@0 *+ *+'U<ІK9 ?l1SEp@@0 *+ *+'U=ІKA: ?l1SEq@@0 *+ *+'U>ІK: ?l1SEr@@0 *+ *+'U?ІK: ?l1SEs@@0 *+ *+'U@ІK"; ?l1SEt@@0 *+ *+'UAІK; ?l1SEu@@0 *+ *+'UBІK; ?l1SEv@@0 *+ *+'UCІK< ?l1SEw@@0 *+ *+'UDІKb< ?l1SEx@@0 *+ *+'UEІK< ?l1SEy@@0 *+ *+'UFІK< ?l1SEz@@0 *+ *+'UGІKE= ?l1SE{@@0 *+ *+'UHІK= ?l1SE|@@0 *+ *+'UIІK= ?l1SE}@@0 *+ *+'UJІK'> ?l1SE~@@0 *+ *+'UKІKi> ?l1SE@@0 *+ *+'ULІK> ?l1SE@@0 *+ *+'UMІK ? ?l1SE@@0 *+ *+'UNІKg? ?l1SE@@0 *+ *+'UOІK? ?l1SE@@0 *+ *+'UPІK? ?l1SE@@0 *+ *+'UQІKJ@ ?l1SE@@0 *+ *+'URІK@ ?l1SE@@0 *+ *+'USІK@ ?l1SE@@/ *+ *+'UTІK.A ?l1SE@@/ *+ *+'UUІKmA ?l1SE@@/ *+ *+'UVІKA ?l1SE@@/ *+ *+'UWІK B ?l1SE@@/ *+ *+'UXІKPB ?l1SE@@/ *+ *+'UYІKB ?l1SE@@/ *+ *+'UZІKB ?l1SE@@/ *+ *+'U[ІK1C ?l1SE@@/ *+ *+'U\ІKC ?l1SE@@/ *+ *+'U]ІKC ?l1SE@@/ *+ *+'U^ІK1D ?l1SE@@/ *+ *+'U_ІKrD ?l1SE@@/ *+ *+'U`ІKD ?l1SE@@/ *+ *+'UaІKE ?l1SE@@/ *+ *+'UbІKTE ?l1SE@@/ *+ *+'UcІKE ?l1SE@@/ *+ *+'UdІKE ?l1SE@@/ *+ *+'UeІK7F ?l1SE@@/ *+ *+'UfІKF ?l1SE@@/ *+ *+'UgІKF ?l1SE@@/ *+ *+'UhІKG ?l1SE@@/ *+ *+'UiІKwG ?l1SE@@/ *+ *+'UjІKG ?l1SE@@/ *+ *+'UkІKH ?l1SE@@/ *+ *+'UlІKXH ?l1SE@@/ *+ *+'UmІKH ?l1SE@@/ *+ *+'UnІKH ?l1SE@@/ *+ *+'UoІK;I ?l1SE@@/ *+ *+'UpІK}I ?l1SE@@/ *+ *+'UqІKI ?l1SE@@/ *+ *+'UrІKJ ?l1SE@@/ *+ *+'UsІK|J ?l1SE@@/ *+ *+'UtІKJ ?l1SE@@/ *+ *+'UuІKJ ?l1SE@@/ *+ *+'UvІK]K ?l1SE@@/ *+ *+'UwІKK ?l1SE@@/ *+ *+'UxІKK ?l1SE@@/ *+ *+'UyІK>L ?l1SE@@/ *+ *+'UzІKL ?l1SE@@/ *+ *+'U{ІKL ?l1SE@@/ *+ *+'U|ІK!M ?l1SE@@/ *+ *+'U}ІKcM ?l1SE@@/ *+ *+'U~ІKM ?l1SE@@/ *+ *+'UІKN ?l1SE@@/ *+ *+'UІKbN ?l1SE@@/ *+ *+'UІKN ?l1SE@@/ *+ *+'UІKN ?l1SE@@/ *+ *+'UІKDO ?l1SE@@/ *+ *+'UІKO ?l1SE@@/ *+ *+'UІKO ?l1SE@@/ *+ *+'UІKO  ?l1SE@@0 *+ *+'UІKP <<?l1SE,@@1 *+ *+'U@UUІKb VV?l1SEH@@1 *+ *+'4V!Q@ІKb ?l1SE@@/ *+ *+'VІK c ?l1SE@@/ *+ *+'VІKhc ?l1SE@@/ *+ *+'VІKc ?l1SE@@/ *+ *+'VІKc ?l1SE@@/ *+ *+'VІKJd ?l1SE@@/ *+ *+'VІKd ?l1SE@@/ *+ *+'VІKd ?l1SE@@/ *+ *+'VІK,e ?l1SE@@/ *+ *+'V ІKne ?l1SE@@/ *+ *+'V ІKe ?l1SE@@/ *+ *+'V ІK f ?l1SE@@/ *+ *+'V ІKOf ?l1SE@@/ *+ *+'V ІKf ?l1SE@@/ *+ *+'VІKf ?l1SE@@/ *+ *+'VІKNg ?l1SE@@/ *+ *+'VІKg ?l1SE@@/ *+ *+'VІKg ?l1SE@@/ *+ *+'VІK1h ?l1SE@@/ *+ *+'VІKrh ?l1SE@@/ *+ *+'VІKh ?l1SE@@/ *+ *+'VІKi ?l1SE@@/ *+ *+'VІKTi ?l1SE@@/ *+ *+'VІKi ?l1SE@@/ *+ *+'VІKi ?l1SE@@/ *+ *+'VІK7j ?l1SE@@/ *+ *+'VІKj ?l1SE@@/ *+ *+'VІKj ?l1SE@@/ *+ *+'VІK4k ?l1SE@@/ *+ *+'VІKwk ?l1SE@@/ *+ *+'VІKk ?l1SE@@/ *+ *+'VІKl ?l1SE@@/ *+ *+'V ІKXl ?l1SE@@/ *+ *+'V!ІKl ?l1SE@@/ *+ *+'V"ІKl ?l1SE@@/ *+ *+'V#ІK;m ?l1SE@@/ *+ *+'V$ІKm ?l1SE@@/ *+ *+'V%ІKm ?l1SE@@/ *+ *+'V&ІKn ?l1SE@@/ *+ *+'V'ІK{n ?l1SE@@/ *+ *+'V(ІKn ?l1SE@@/ *+ *+'V)ІKn ?l1SE@@/ *+ *+'V*ІK^o ?l1SE@@/ *+ *+'V+ІKo ?l1SE@@/ *+ *+'V,ІKo ?l1SE@@/ *+ *+'V-ІK?p ?l1SE@@/ *+ *+'V.ІKp ?l1SE@@/ *+ *+'V/ІKp ?l1SE@@/ *+ *+'V0ІK q ?l1SE@@/ *+ *+'V1ІKq ?l1SE@@/ *+ *+'V2ІKq ?l1SE@@/ *+ *+'V3ІKr ?l1SE@@/ *+ *+'V4ІKbr ?l1SE@@/ *+ *+'V5ІKr ?l1SE@@/ *+ *+'V6ІKr ?l1SE@@/ *+ *+'V7ІKEs ?l1SE@@/ *+ *+'V8ІKs ?l1SE@@/ *+ *+'V9ІKs ?l1SE@@/ *+ *+'V:ІK&t ?l1SE@@/ *+ *+'V;ІKht ?l1SE@@/ *+ *+'V<ІKt ?l1SE@@/ *+ *+'V=ІK u ?l1SE@@/ *+ *+'V>ІKIu ?l1SE@@/ *+ *+'V?ІKu ?l1SE@@/ *+ *+'V@ІKu ?l1SE@@/ *+ *+'VAІKHv ?l1SE@@/ *+ *+'VBІKv ?l1SE@@/ *+ *+'VCІKv ?l1SE@@/ *+ *+'VDІK*w ?l1SE@@/ *+ *+'VEІKkw ?l1SE@@/ *+ *+'VFІKw ?l1SE@@/ *+ *+'VGІK x ?l1SE@@/ *+ *+'VHІKNx ?l1SE@@/ *+ *+'VIІKx ?l1SE@@/ *+ *+'VJІKx ?l1SE@@/ *+ *+'VKІK0y ?l1SE@@/~ *+ *+'VLІKy ?l1SE @@/} *+ *+'VMІKy ?l1SE @@/| *+ *+'VNІK/z ?l1SE @@/{ *+ *+'VOІKpz ?l1SE @@/z *+ *+'VPІKz ?l1SE @@/y *+ *+'VQІK{ ?l1SE@@/x *+ *+'VRІKR{ ?l1SE@@/w *+ *+'VSІK{ ?l1SE@@/v *+ *+'VTІK{ ?l1SE@@/u *+ *+'VUІK5| ?l1SE@@/t *+ *+'VVІK| ?l1SE@@/s *+ *+'VWІK| ?l1SE@@/r *+ *+'VXІK} ?l1SE@@/q *+ *+'VYІKu} ?l1SE@@/p *+ *+'VZІK} ?l1SE@@/o *+ *+'V[ІK} ?l1SE@@/n *+ *+'V\ІKW~ ?l1SE@@/m *+ *+'V]ІK~ ?l1SE@@/l *+ *+'V^ІK~ ?l1SE@@/k *+ *+'V_ІK9 ?l1SE@@/j *+ *+'V`ІKz ?l1SE@@/i *+ *+'VaІK ?l1SE@@/h *+ *+'VbІK ?l1SE@@/g *+ *+'VcІKz ?l1SE @@/f *+ *+'VdІK ?l1SE!@@/e *+ *+'VeІK ?l1SE"@@/d *+ *+'VfІK^ ?l1SE#@@/c *+ *+'VgІK ?l1SE$@@/b *+ *+'VhІK ?l1SE%@@/a *+ *+'ViІK> ?l1SE&@@/` *+ *+'VjІK ?l1SE'@@/_ *+ *+'VkІK߂ ?l1SE(@@/^ *+ *+'VlІK ?l1SE)@@/] *+ *+'VmІKa ?l1SE*@@/\ *+ *+'VnІK ?l1SE+@@/[ *+ *+'VoІK ?l1SE,@@/Z *+ *+'VpІKE ?l1SE-@@/Y *+ *+'VqІK ?l1SE.@@/X *+ *+'VrІK ?l1SE/@@/W *+ *+'VsІKB ?l1SE0@@/V *+ *+'VtІK ?l1SE1@@/U *+ *+'VuІKŅ ?l1SE2@@/T *+ *+'VvІK$ ?l1SE3@@/S *+ *+'VwІKf ?l1SE4@@/R *+ *+'VxІK ?l1SE5@@/Q *+ *+'VyІK ?l1SE6@@/P *+ *+'VzІKH ?l1SE7@@/O *+ *+'V{ІK ?l1SE8@@/N *+ *+'V|ІK ?l1SE9@@/M *+ *+'V}ІK+ ?l1SE:@@/L *+ *+'V~ІK ?l1SE;@@/K *+ *+'VІKˈ ?l1SE<@@/J *+ *+'VІK* ?l1SE=@@/I *+ *+'VІKk ?l1SE>@@/H *+ *+'VІK ?l1SE?@@/G *+ *+'VІK ?l1SE@@@/F *+ *+'VІKL ?l1SEA@@/E *+ *+'VІK ?l1SEB@@/D *+ *+'VІK  ?l1SEC@@0G *+ *+'VІKȊ <<?l1SE,D@@1 *+ *+'V@UUІK VV?l1SEHE@@0 *+ *+'4W!t@ІK ?l1SEF@@/@ *+ *+'WІK ?l1SEG@@/? *+ *+'WІKO ?l1SEH@@/> *+ *+'WІK ?l1SEI@@/= *+ *+'WІKӞ ?l1SEJ@@/< *+ *+'WІK1 ?l1SEK@@/; *+ *+'WІKs ?l1SEL@@/: *+ *+'WІKџ ?l1SEM@@/9 *+ *+'WІK ?l1SEN@@/8 *+ *+'W ІKU ?l1SEO@@/7 *+ *+'W ІK ?l1SEP@@/6 *+ *+'W ІK ?l1SEQ@@/5 *+ *+'W ІK9 ?l1SER@@/4 *+ *+'W ІK ?l1SES@@/3 *+ *+'WІKء ?l1SET@@/2 *+ *+'WІK7 ?l1SEU@@/1 *+ *+'WІKw ?l1SEV@@/0 *+ *+'WІK ?l1SEW@@// *+ *+'WІK ?l1SEX@@/. *+ *+'WІKZ ?l1SEY@@/- *+ *+'WІK ?l1SEZ@@/, *+ *+'WІK ?l1SE[@@/+ *+ *+'WІK; ?l1SE\@@/* *+ *+'WІK ?l1SE]@@/) *+ *+'WІKۤ ?l1SE^@@/( *+ *+'WІK ?l1SE_@@/' *+ *+'WІK| ?l1SE`@@/& *+ *+'WІK ?l1SEa@@/% *+ *+'WІK ?l1SEb@@/$ *+ *+'WІK^ ?l1SEc@@/# *+ *+'WІK ?l1SEd@@/" *+ *+'WІK ?l1SEe@@/! *+ *+'W ІKA ?l1SEf@@/ *+ *+'W!ІK ?l1SEg@@/ *+ *+'W"ІK ?l1SEh@@/ *+ *+'W#ІK" ?l1SEi@@/ *+ *+'W$ІK ?l1SEj@@/ *+ *+'W%ІK¨ ?l1SEk@@/ *+ *+'W&ІK ?l1SEl@@/ *+ *+'W'ІKc ?l1SEm@@/ *+ *+'W(ІK ?l1SEn@@/ *+ *+'W)ІK ?l1SEo@@/ *+ *+'W*ІKE ?l1SEp@@/ *+ *+'W+ІK ?l1SEq@@/ *+ *+'W,ІK ?l1SEr@@/ *+ *+'W-ІK' ?l1SEs@@/ *+ *+'W.ІKh ?l1SEt@@/ *+ *+'W/ІKǫ ?l1SEu@@/ *+ *+'W0ІK ?l1SEv@@/ *+ *+'W1ІKh ?l1SEw@@/ *+ *+'W2ІK ?l1SEx@@/ *+ *+'W3ІK ?l1SEy@@/ *+ *+'W4ІKI ?l1SEz@@/ *+ *+'W5ІK ?l1SE{@@/ *+ *+'W6ІKͭ ?l1SE|@@/ *+ *+'W7ІK+ ?l1SE}@@/ *+ *+'W8ІKm ?l1SE~@@/ *+ *+'W9ІK̮ ?l1SE@@/ *+ *+'W:ІK ?l1SE@@/ *+ *+'W;ІKO ?l1SE@@/ *+ *+'W<ІK ?l1SE@@/ *+ *+'W=ІK ?l1SE@@/ *+ *+'W>ІK2 ?l1SE@@/ *+ *+'W?ІK ?l1SE@@/ *+ *+'W@ІKٰ ?l1SE@@/ *+ *+'WAІK1 ?l1SE@@. *+ *+'WBІKr ?l1SE@@. *+ *+'WCІK ?l1SE@@. *+ *+'WDІK ?l1SE@@. *+ *+'WEІKS ?l1SE@@. *+ *+'WFІK ?l1SE@@. *+ *+'WGІK ?l1SE@@. *+ *+'WHІK6 ?l1SE@@. *+ *+'WIІK ?l1SE@@. *+ *+'WJІKֳ ?l1SE@@. *+ *+'WKІK ?l1SE@@. *+ *+'WLІKw ?l1SE@@. *+ *+'WMІK ?l1SE@@. *+ *+'WNІK ?l1SE@@. *+ *+'WOІKX ?l1SE@@. *+ *+'WPІK ?l1SE@@. *+ *+'WQІK ?l1SE@@. *+ *+'WRІK9 ?l1SE@@. *+ *+'WSІK} ?l1SE@@. *+ *+'WTІKڶ ?l1SE@@. *+ *+'WUІK ?l1SE@@. *+ *+'WVІKz ?l1SE@@. *+ *+'WWІK ?l1SE@@. *+ *+'WXІK ?l1SE@@. *+ *+'WYІK] ?l1SE@@. *+ *+'WZІK ?l1SE@@. *+ *+'W[ІK ?l1SE@@. *+ *+'W\ІK? ?l1SE@@. *+ *+'W]ІK ?l1SE@@. *+ *+'W^ІK߹ ?l1SE@@. *+ *+'W_ІK! ?l1SE@@. *+ *+'W`ІKc ?l1SE@@. *+ *+'WaІKº ?l1SE@@. *+ *+'WbІK ?l1SE@@. *+ *+'WcІKa ?l1SE@@. *+ *+'WdІK ?l1SE@@. *+ *+'WeІK ?l1SE@@. *+ *+'WfІKC ?l1SE@@. *+ *+'WgІK ?l1SE@@. *+ *+'WhІKǼ ?l1SE@@. *+ *+'WiІK% ?l1SE@@. *+ *+'WjІKg ?l1SE@@. *+ *+'WkІKŽ ?l1SE@@. *+ *+'WlІK ?l1SE@@. *+ *+'WmІKJ ?l1SE@@. *+ *+'WnІK ?l1SE@@. *+ *+'WoІK ?l1SE@@. *+ *+'WpІK+ ?l1SE@@. *+ *+'WqІK ?l1SE@@. *+ *+'WrІK˿ ?l1SE@@. *+ *+'WsІK, ?l1SE@@. *+ *+'WtІKv ?l1SE@@. *+ *+'WuІK ?l1SE@@. *+ *+'WvІK ?l1SE@@. *+ *+'WwІKN ?l1SE@@. *+ *+'WxІK ?l1SE@@. *+ *+'WyІK ?l1SE@@. *+ *+'WzІK0 ?l1SE@@. *+ *+'W{ІK ?l1SE@@. *+ *+'W|ІK ?l1SE@@. *+ *+'W}ІK ?l1SE@@. *+ *+'W~ІKp ?l1SE@@. *+ *+'WІK ?l1SE@@. *+ *+'WІK ?l1SE@@. *+ *+'WІKS ?l1SE@@. *+ *+'WІK ?l1SE@@. *+ *+'WІK ?l1SE@@. *+ *+'WІK5 ?l1SE@@. *+ *+'WІKv ?l1SE@@. *+ *+'WІK  ?l1SE@@/ *+ *+'WІK <<?l1SE,@@0 *+ *+'W@UUІK VV?l1SEH@@0p *+ *+'4X! @ІK ?l1SE@@. *+ *+'XІK ?l1SE@@. *+ *+'XІK6 ?l1SE@@. *+ *+'XІKy ?l1SE@@. *+ *+'XІK ?l1SE@@. *+ *+'XІK ?l1SE@@. *+ *+'XІKZ ?l1SE@@. *+ *+'XІK ?l1SE@@. *+ *+'XІK ?l1SE@@. *+ *+'X ІK= ?l1SE@@. *+ *+'X ІK ?l1SE@@. *+ *+'X ІK ?l1SE@@. *+ *+'X ІK ?l1SE@@. *+ *+'X ІK~ ?l1SE@@. *+ *+'XІK ?l1SE@@. *+ *+'XІK ?l1SE@@. *+ *+'XІK_ ?l1SE@@. *+ *+'XІK ?l1SE@@. *+ *+'XІK ?l1SE@@. *+ *+'XІKA ?l1SE@@. *+ *+'XІK ?l1SE@@. *+ *+'XІK ?l1SE@@. *+ *+'XІK# ?l1SE@@. *+ *+'XІK ?l1SE@@. *+ *+'XІK ?l1SE@@. *+ *+'XІK ?l1SE@@. *+ *+'XІKd ?l1SE@@. *+ *+'XІK ?l1SE@@. *+ *+'XІK ?l1SE@@. *+ *+'XІKE ?l1SE@@. *+ *+'XІK ?l1SE@@. *+ *+'XІK ?l1SE@@. *+ *+'X ІK' ?l1SE@@. *+ *+'X!ІKj ?l1SE@@. *+ *+'X"ІK ?l1SE@@. *+ *+'X#ІK ?l1SE@@. *+ *+'X$ІKi ?l1SE@@. *+ *+'X%ІK ?l1SE@@. *+ *+'X&ІK ?l1SE@@. *+ *+'X'ІKJ ?l1SE@@. *+ *+'X(ІK ?l1SE@@. *+ *+'X)ІK ?l1SE@@. *+ *+'X*ІK, ?l1SE@@. *+ *+'X+ІKn ?l1SE@@. *+ *+'X,ІK ?l1SE@@. *+ *+'X-ІK ?l1SE@@. *+ *+'X.ІKP ?l1SE@@. *+ *+'X/ІK ?l1SE@@. *+ *+'X0ІK ?l1SE@@. *+ *+'X1ІKO ?l1SE@@. *+ *+'X2ІK ?l1SE@@. *+ *+'X3ІK ?l1SE@@. *+ *+'X4ІK1 ?l1SE@@. *+ *+'X5ІKr ?l1SE@@. *+ *+'X6ІK ?l1SE@@. *+ *+'X7ІK ?l1SE@@. *+ *+'X8ІKT ?l1SE@@. *+ *+'X9ІK ?l1SE@@.~ *+ *+'X:ІK ?l1SE @@.} *+ *+'X;ІK6 ?l1SE @@.| *+ *+'X<ІK ?l1SE @@.{ *+ *+'X=ІK ?l1SE @@.z *+ *+'X>ІK ?l1SE @@.y *+ *+'X?ІKw ?l1SE@@.x *+ *+'X@ІK ?l1SE@@.w *+ *+'XAІK ?l1SE@@.v *+ *+'XBІKY ?l1SE@@.u *+ *+'XCІK ?l1SE@@.t *+ *+'XDІK ?l1SE@@.s *+ *+'XEІK< ?l1SE@@.r *+ *+'XFІK| ?l1SE@@.q *+ *+'XGІK ?l1SE@@.p *+ *+'XHІK ?l1SE@@.o *+ *+'XIІK| ?l1SE@@.n *+ *+'XJІK ?l1SE@@.m *+ *+'XKІK ?l1SE@@.l *+ *+'XLІK^ ?l1SE@@.k *+ *+'XMІK ?l1SE@@.j *+ *+'XNІK ?l1SE@@.i *+ *+'XOІK@ ?l1SE@@.h *+ *+'XPІK ?l1SE@@.g *+ *+'XQІK ?l1SE @@.f *+ *+'XRІK" ?l1SE!@@.e *+ *+'XSІKd ?l1SE"@@.d *+ *+'XTІK ?l1SE#@@.c *+ *+'XUІK ?l1SE$@@.b *+ *+'XVІKc ?l1SE%@@.a *+ *+'XWІK ?l1SE&@@.` *+ *+'XXІK ?l1SE'@@._ *+ *+'XYІKE ?l1SE(@@.^ *+ *+'XZІK ?l1SE)@@.] *+ *+'X[ІK ?l1SE*@@.\ *+ *+'X\ІK& ?l1SE+@@.[ *+ *+'X]ІKh ?l1SE,@@.Z *+ *+'X^ІK ?l1SE-@@.Y *+ *+'X_ІK ?l1SE.@@.X *+ *+'X`ІKJ ?l1SE/@@.W *+ *+'XaІK ?l1SE0@@.V *+ *+'XbІK ?l1SE1@@.U *+ *+'XcІKI ?l1SE2@@.T *+ *+'XdІK ?l1SE3@@.S *+ *+'XeІK ?l1SE4@@.R *+ *+'XfІK+ ?l1SE5@@.Q *+ *+'XgІKm ?l1SE6@@.P *+ *+'XhІK ?l1SE7@@.O *+ *+'XiІK ?l1SE8@@.N *+ *+'XjІKO ?l1SE9@@.M *+ *+'XkІK ?l1SE:@@.L *+ *+'XlІK ?l1SE;@@.K *+ *+'XmІK1 ?l1SE<@@.J *+ *+'XnІK ?l1SE=@@.I *+ *+'XoІK ?l1SE>@@.H *+ *+'XpІK ?l1SE?@@.G *+ *+'XqІKq ?l1SE@@@.F *+ *+'XrІK ?l1SEA@@.E *+ *+'XsІK ?l1SEB@@.D *+ *+'XtІKS ?l1SEC@@.C *+ *+'XuІK ?l1SED@@.B *+ *+'XvІK ?l1SEE@@.A *+ *+'XwІK6 ?l1SEF@@.@ *+ *+'XxІKw ?l1SEG@@.? *+ *+'XyІK ?l1SEH@@.> *+ *+'XzІK ?l1SEI@@.= *+ *+'X{ІKv ?l1SEJ@@.< *+ *+'X|ІK ?l1SEK@@.; *+ *+'X}ІK ?l1SEL@@.: *+ *+'X~ІKY ?l1SEM@@.9 *+ *+'XІK ?l1SEN@@.8 *+ *+'XІK ?l1SEO@@.7 *+ *+'XІK: ?l1SEP@@.6 *+ *+'XІK| ?l1SEQ@@.5 *+ *+'XІK ?l1SER@@.4 *+ *+'XІK ?l1SES@@.3 *+ *+'XІK^ ?l1SET@@.2 *+ *+'XІK  ?l1SEU@@/5 *+ *+'XІK <<?l1SE,V@@0 *+ *+'X@UUІK VV?l1SEHW@@/ *+ *+'4Y!֖@ІKT ?l1SEX@@.. *+ *+'YІK ?l1SEY@@.- *+ *+'YІK ?l1SEZ@@., *+ *+'YІK6 ?l1SE[@@.+ *+ *+'YІKy ?l1SE\@@.* *+ *+'YІK ?l1SE]@@.) *+ *+'YІK ?l1SE^@@.( *+ *+'YІKv ?l1SE_@@.' *+ *+'YІK ?l1SE`@@.& *+ *+'Y ІK ?l1SEa@@.% *+ *+'Y ІKY ?l1SEb@@.$ *+ *+'Y ІK ?l1SEc@@.# *+ *+'Y ІK ?l1SEd@@." *+ *+'Y ІK; ?l1SEe@@.! *+ *+'YІK| ?l1SEf@@. *+ *+'YІK ?l1SEg@@. *+ *+'YІK ?l1SEh@@. *+ *+'YІK_ ?l1SEi@@. *+ *+'YІK ?l1SEj@@. *+ *+'YІK ?l1SEk@@. *+ *+'YІKA ?l1SEl@@. *+ *+'YІK ?l1SEm@@. *+ *+'YІK ?l1SEn@@. *+ *+'YІK@ ?l1SEo@@. *+ *+'YІK ?l1SEp@@. *+ *+'YІK ?l1SEq@@. *+ *+'YІK! ?l1SEr@@. *+ *+'YІKd ?l1SEs@@. *+ *+'YІK ?l1SEt@@. *+ *+'YІK ?l1SEu@@. *+ *+'YІKE ?l1SEv@@. *+ *+'YІK ?l1SEw@@. *+ *+'Y ІK ?l1SEx@@. *+ *+'Y!ІK' ?l1SEy@@. *+ *+'Y"ІK ?l1SEz@@. *+ *+'Y#ІK ?l1SE{@@. *+ *+'Y$ІK/ ?l1SE|@@. *+ *+'Y%ІKg ?l1SE}@@. *+ *+'Y&ІK ?l1SE~@@. *+ *+'Y'ІK ?l1SE@@. *+ *+'Y(ІKJ ?l1SE@@. *+ *+'Y)ІK ?l1SE@@. *+ *+'Y*ІK ?l1SE@@. *+ *+'Y+ІK, ?l1SE@@. *+ *+'Y,ІK ?l1SE@@. *+ *+'Y-ІK ?l1SE@@. *+ *+'Y.ІK ! ?l1SE@@. *+ *+'Y/ІKl! ?l1SE@@- *+ *+'Y0ІK! ?l1SE@@- *+ *+'Y1ІK " ?l1SE@@- *+ *+'Y2ІKO" ?l1SE@@- *+ *+'Y3ІK" ?l1SE@@- *+ *+'Y4ІK" ?l1SE@@- *+ *+'Y5ІK0# ?l1SE@@- *+ *+'Y6ІKq# ?l1SE@@- *+ *+'Y7ІK# ?l1SE@@- *+ *+'Y8ІK$ ?l1SE@@- *+ *+'Y9ІKq$ ?l1SE@@- *+ *+'Y:ІK$ ?l1SE@@- *+ *+'Y;ІK$ ?l1SE@@- *+ *+'Y<ІKS% ?l1SE@@- *+ *+'Y=ІK% ?l1SE@@- *+ *+'Y>ІK% ?l1SE@@- *+ *+'Y?ІK6& ?l1SE@@- *+ *+'Y@ІKv& ?l1SE@@- *+ *+'YAІK& ?l1SE@@- *+ *+'YBІK' ?l1SE@@- *+ *+'YCІKX' ?l1SE@@- *+ *+'YDІK' ?l1SE@@- *+ *+'YEІK' ?l1SE@@- *+ *+'YFІK;( ?l1SE@@- *+ *+'YGІK( ?l1SE@@- *+ *+'YHІK( ?l1SE@@- *+ *+'YIІK:) ?l1SE@@- *+ *+'YJІK|) ?l1SE@@- *+ *+'YKІK) ?l1SE@@- *+ *+'YLІK* ?l1SE@@- *+ *+'YMІK]* ?l1SE@@- *+ *+'YNІK* ?l1SE@@- *+ *+'YOІK* ?l1SE@@- *+ *+'YPІK@+ ?l1SE@@- *+ *+'YQІK+ ?l1SE@@- *+ *+'YRІK+ ?l1SE@@- *+ *+'YSІK!, ?l1SE@@- *+ *+'YTІK, ?l1SE@@- *+ *+'YUІK, ?l1SE@@- *+ *+'YVІK - ?l1SE@@- *+ *+'YWІKa- ?l1SE@@- *+ *+'YXІK- ?l1SE@@- *+ *+'YYІK. ?l1SE@@- *+ *+'YZІKD. ?l1SE@@- *+ *+'Y[ІK. ?l1SE@@- *+ *+'Y\ІK. ?l1SE@@- *+ *+'Y]ІK&/ ?l1SE@@- *+ *+'Y^ІK/ ?l1SE@@- *+ *+'Y_ІK/ ?l1SE@@- *+ *+'Y`ІK0 ?l1SE@@- *+ *+'YaІKg0 ?l1SE@@- *+ *+'YbІK0 ?l1SE@@- *+ *+'YcІK1 ?l1SE@@- *+ *+'YdІKH1 ?l1SE@@- *+ *+'YeІK1 ?l1SE@@- *+ *+'YfІK1 ?l1SE@@- *+ *+'YgІK+2 ?l1SE@@- *+ *+'YhІKl2 ?l1SE@@- *+ *+'YiІK2 ?l1SE@@- *+ *+'YjІK 3 ?l1SE@@- *+ *+'YkІKk3 ?l1SE@@- *+ *+'YlІK3 ?l1SE@@- *+ *+'YmІK3 ?l1SE@@- *+ *+'YnІKM4 ?l1SE@@- *+ *+'YoІK4 ?l1SE@@- *+ *+'YpІK4 ?l1SE@@- *+ *+'YqІK.5 ?l1SE@@- *+ *+'YrІKq5 ?l1SE@@- *+ *+'YsІK5 ?l1SE@@- *+ *+'YtІK6 ?l1SE@@- *+ *+'YuІKR6 ?l1SE@@- *+ *+'YvІK6 ?l1SE@@- *+ *+'YwІK6 ?l1SE@@- *+ *+'YxІK47 ?l1SE@@- *+ *+'YyІK7 ?l1SE@@- *+ *+'YzІK7 ?l1SE@@- *+ *+'Y{ІK48 ?l1SE@@- *+ *+'Y|ІKu8 ?l1SE@@- *+ *+'Y}ІK8 ?l1SE@@- *+ *+'Y~ІK9 ?l1SE@@- *+ *+'YІKX9 ?l1SE@@- *+ *+'YІK9 ?l1SE@@- *+ *+'YІK9 ?l1SE@@- *+ *+'YІK9: ?l1SE@@- *+ *+'YІK: ?l1SE@@- *+ *+'YІK: ?l1SE@@- *+ *+'YІK; ?l1SE@@- *+ *+'YІKP;  ?l1SE@@. *+ *+'YІKW; <<?l1SE,@@/{ *+ *+'Y@UUІKM VV?l1SEH@@/^ *+ *+'4Z!+@ІK>N ?l1SE@@- *+ *+'ZІK~N ?l1SE@@- *+ *+'ZІKN ?l1SE@@- *+ *+'ZІKO ?l1SE@@- *+ *+'ZІK`O ?l1SE@@- *+ *+'ZІKO ?l1SE@@- *+ *+'ZІKP ?l1SE@@- *+ *+'ZІK_P ?l1SE@@- *+ *+'ZІKP ?l1SE@@- *+ *+'Z ІKP ?l1SE@@- *+ *+'Z ІKAQ ?l1SE@@- *+ *+'Z ІKQ ?l1SE@@- *+ *+'Z ІKQ ?l1SE@@- *+ *+'Z ІK#R ?l1SE@@- *+ *+'ZІKdR ?l1SE@@- *+ *+'ZІKR ?l1SE@@- *+ *+'ZІKS ?l1SE@@- *+ *+'ZІKGS ?l1SE@@- *+ *+'ZІKS ?l1SE@@- *+ *+'ZІKS ?l1SE@@- *+ *+'ZІK(T ?l1SE@@- *+ *+'ZІKT ?l1SE@@- *+ *+'ZІKT ?l1SE@@- *+ *+'ZІK'U ?l1SE@@- *+ *+'ZІKiU ?l1SE@@- *+ *+'ZІKU ?l1SE@@- *+ *+'ZІK V ?l1SE@@- *+ *+'ZІKKV ?l1SE@@- *+ *+'ZІKV ?l1SE@@- *+ *+'ZІKV ?l1SE@@- *+ *+'ZІK-W ?l1SE@@- *+ *+'ZІKW ?l1SE@@- *+ *+'Z ІKW ?l1SE@@- *+ *+'Z!ІKX ?l1SE@@- *+ *+'Z"ІKnX ?l1SE@@- *+ *+'Z#ІKX ?l1SE@@- *+ *+'Z$ІKY ?l1SE@@- *+ *+'Z%ІKOY ?l1SE@@- *+ *+'Z&ІKY ?l1SE@@- *+ *+'Z'ІKY ?l1SE@@-~ *+ *+'Z(ІK1Z ?l1SE @@-} *+ *+'Z)ІKsZ ?l1SE @@-| *+ *+'Z*ІKZ ?l1SE @@-{ *+ *+'Z+ІK[ ?l1SE @@-z *+ *+'Z,ІKr[ ?l1SE @@-y *+ *+'Z-ІK[ ?l1SE@@-x *+ *+'Z.ІK[ ?l1SE@@-w *+ *+'Z/ІKU\ ?l1SE@@-v *+ *+'Z0ІK\ ?l1SE@@-u *+ *+'Z1ІK\ ?l1SE@@-t *+ *+'Z2ІK5] ?l1SE@@-s *+ *+'Z3ІKx] ?l1SE@@-r *+ *+'Z4ІK] ?l1SE@@-q *+ *+'Z5ІK^ ?l1SE@@-p *+ *+'Z6ІKY^ ?l1SE@@-o *+ *+'Z7ІK^ ?l1SE@@-n *+ *+'Z8ІK^ ?l1SE@@-m *+ *+'Z9ІKW_ ?l1SE@@-l *+ *+'Z:ІK_ ?l1SE@@-k *+ *+'Z;ІK_ ?l1SE@@-j *+ *+'Z<ІK;` ?l1SE@@-i *+ *+'Z=ІK|` ?l1SE@@-h *+ *+'Z>ІK` ?l1SE@@-g *+ *+'Z?ІKa ?l1SE @@-f *+ *+'Z@ІK^a ?l1SE!@@-e *+ *+'ZAІKa ?l1SE"@@-d *+ *+'ZBІKa ?l1SE#@@-c *+ *+'ZCІK@b ?l1SE$@@-b *+ *+'ZDІKb ?l1SE%@@-a *+ *+'ZEІKb ?l1SE&@@-` *+ *+'ZFІK"c ?l1SE'@@-_ *+ *+'ZGІKc ?l1SE(@@-^ *+ *+'ZHІKc ?l1SE)@@-] *+ *+'ZIІK!d ?l1SE*@@-\ *+ *+'ZJІKcd ?l1SE+@@-[ *+ *+'ZKІKd ?l1SE,@@-Z *+ *+'ZLІKe ?l1SE-@@-Y *+ *+'ZMІKEe ?l1SE.@@-X *+ *+'ZNІKe ?l1SE/@@-W *+ *+'ZOІKe ?l1SE0@@-V *+ *+'ZPІK'f ?l1SE1@@-U *+ *+'ZQІKf ?l1SE2@@-T *+ *+'ZRІKf ?l1SE3@@-S *+ *+'ZSІK g ?l1SE4@@-R *+ *+'ZTІKgg ?l1SE5@@-Q *+ *+'ZUІKg ?l1SE6@@-P *+ *+'ZVІKh ?l1SE7@@-O *+ *+'ZWІKJh ?l1SE8@@-N *+ *+'ZXІKh ?l1SE9@@-M *+ *+'ZYІKh ?l1SE:@@-L *+ *+'ZZІK+i ?l1SE;@@-K *+ *+'Z[ІKmi ?l1SE<@@-J *+ *+'Z\ІKi ?l1SE=@@-I *+ *+'Z]ІK j ?l1SE>@@-H *+ *+'Z^ІKlj ?l1SE?@@-G *+ *+'Z_ІKj ?l1SE@@@-F *+ *+'Z`ІKj ?l1SEA@@-E *+ *+'ZaІKOk ?l1SEB@@-D *+ *+'ZbІKk ?l1SEC@@-C *+ *+'ZcІKk ?l1SED@@-B *+ *+'ZdІK0l ?l1SEE@@-A *+ *+'ZeІKql ?l1SEF@@-@ *+ *+'ZfІKl ?l1SEG@@-? *+ *+'ZgІKm ?l1SEH@@-> *+ *+'ZhІKSm ?l1SEI@@-= *+ *+'ZiІKm ?l1SEJ@@-< *+ *+'ZjІKm ?l1SEK@@-; *+ *+'ZkІKRn ?l1SEL@@-: *+ *+'ZlІKn ?l1SEM@@-9 *+ *+'ZmІKn ?l1SEN@@-8 *+ *+'ZnІK5o ?l1SEO@@-7 *+ *+'ZoІKvo ?l1SEP@@-6 *+ *+'ZpІKo ?l1SEQ@@-5 *+ *+'ZqІKp ?l1SER@@-4 *+ *+'ZrІKWp ?l1SES@@-3 *+ *+'ZsІKp ?l1SET@@-2 *+ *+'ZtІKp ?l1SEU@@-1 *+ *+'ZuІK;q ?l1SEV@@-0 *+ *+'ZvІKq ?l1SEW@@-/ *+ *+'ZwІKq ?l1SEX@@-. *+ *+'ZxІKr ?l1SEY@@-- *+ *+'ZyІK{r ?l1SEZ@@-, *+ *+'ZzІKr ?l1SE[@@-+ *+ *+'Z{ІKs ?l1SE\@@-* *+ *+'Z|ІK[s ?l1SE]@@-) *+ *+'Z}ІKs ?l1SE^@@-( *+ *+'Z~ІKs ?l1SE_@@-' *+ *+'ZІKAt ?l1SE`@@-& *+ *+'ZІKt ?l1SEa@@-% *+ *+'ZІKt ?l1SEb@@-$ *+ *+'ZІK u ?l1SEc@@-# *+ *+'ZІK~u ?l1SEd@@-" *+ *+'ZІKu ?l1SEe@@-! *+ *+'ZІKv ?l1SEf@@- *+ *+'ZІK4v  ?l1SEg@@.# *+ *+'ZІK9v <<?l1SE,h@@. *+ *+'Z@UUІKS VV?l1SEHi@@. *+ *+'4[!}@ІK ?l1SEj@@- *+ *+'[ІKH ?l1SEk@@- *+ *+'[ІK ?l1SEl@@- *+ *+'[ІK ?l1SEm@@- *+ *+'[ІK+ ?l1SEn@@- *+ *+'[ІK ?l1SEo@@- *+ *+'[ІKˊ ?l1SEp@@- *+ *+'[ІK* ?l1SEq@@- *+ *+'[ІKk ?l1SEr@@- *+ *+'[ ІK ?l1SEs@@- *+ *+'[ ІK ?l1SEt@@- *+ *+'[ ІKM ?l1SEu@@- *+ *+'[ ІK ?l1SEv@@- *+ *+'[ ІK ?l1SEw@@- *+ *+'[ІK0 ?l1SEx@@- *+ *+'[ІK ?l1SEy@@- *+ *+'[ІKЍ ?l1SEz@@- *+ *+'[ІK ?l1SE{@@- *+ *+'[ІKq ?l1SE|@@- *+ *+'[ІK ?l1SE}@@- *+ *+'[ІK ?l1SE~@@- *+ *+'[ІKR ?l1SE@@- *+ *+'[ІK ?l1SE@@- *+ *+'[ІK ?l1SE@@- *+ *+'[ІK4 ?l1SE@@- *+ *+'[ІKv ?l1SE@@- *+ *+'[ІKԐ ?l1SE@@- *+ *+'[ІK ?l1SE@@- *+ *+'[ІKu ?l1SE@@- *+ *+'[ІK ?l1SE@@, *+ *+'[ІK ?l1SE@@, *+ *+'[ІKW ?l1SE@@, *+ *+'[ ІK ?l1SE@@, *+ *+'[!ІKڒ ?l1SE@@, *+ *+'["ІK9 ?l1SE@@, *+ *+'[#ІK{ ?l1SE@@, *+ *+'[$ІKٓ ?l1SE@@, *+ *+'[%ІK ?l1SE@@, *+ *+'[&ІK\ ?l1SE@@, *+ *+'['ІK ?l1SE@@, *+ *+'[(ІK ?l1SE@@, *+ *+'[)ІK> ?l1SE@@, *+ *+'[*ІK ?l1SE@@, *+ *+'[+ІKޕ ?l1SE@@, *+ *+'[,ІK= ?l1SE@@, *+ *+'[-ІK~ ?l1SE@@, *+ *+'[.ІK– ?l1SE@@, *+ *+'[/ІK ?l1SE@@, *+ *+'[0ІKa ?l1SE@@, *+ *+'[1ІK ?l1SE@@, *+ *+'[2ІK ?l1SE@@, *+ *+'[3ІKC ?l1SE@@, *+ *+'[4ІK ?l1SE@@, *+ *+'[5ІK ?l1SE@@, *+ *+'[6ІK# ?l1SE@@, *+ *+'[7ІK ?l1SE@@, *+ *+'[8ІKę ?l1SE@@, *+ *+'[9ІK# ?l1SE@@, *+ *+'[:ІKe ?l1SE@@, *+ *+'[;ІK ?l1SE@@, *+ *+'[<ІK ?l1SE@@, *+ *+'[=ІKG ?l1SE@@, *+ *+'[>ІK ?l1SE@@, *+ *+'[?ІK ?l1SE@@, *+ *+'[@ІK) ?l1SE@@, *+ *+'[AІK ?l1SE@@, *+ *+'[BІKʜ ?l1SE@@, *+ *+'[CІK ?l1SE@@, *+ *+'[DІKj ?l1SE@@, *+ *+'[EІK ?l1SE@@, *+ *+'[FІK ?l1SE@@, *+ *+'[GІKM ?l1SE@@, *+ *+'[HІK ?l1SE@@, *+ *+'[IІK ?l1SE@@, *+ *+'[JІK. ?l1SE@@, *+ *+'[KІKo ?l1SE@@, *+ *+'[LІKΟ ?l1SE@@, *+ *+'[MІK ?l1SE@@, *+ *+'[NІKo ?l1SE@@, *+ *+'[OІK ?l1SE@@, *+ *+'[PІK ?l1SE@@, *+ *+'[QІKR ?l1SE@@, *+ *+'[RІK ?l1SE@@, *+ *+'[SІKա ?l1SE@@, *+ *+'[TІK3 ?l1SE@@, *+ *+'[UІKt ?l1SE@@, *+ *+'[VІKӢ ?l1SE@@, *+ *+'[WІK ?l1SE@@, *+ *+'[XІKW ?l1SE@@, *+ *+'[YІK ?l1SE@@, *+ *+'[ZІK ?l1SE@@, *+ *+'[[ІK8 ?l1SE@@, *+ *+'[\ІK ?l1SE@@, *+ *+'[]ІK٤ ?l1SE@@, *+ *+'[^ІK8 ?l1SE@@, *+ *+'[_ІKy ?l1SE@@, *+ *+'[`ІK ?l1SE@@, *+ *+'[aІK ?l1SE@@, *+ *+'[bІK[ ?l1SE@@, *+ *+'[cІK ?l1SE@@, *+ *+'[dІK ?l1SE@@, *+ *+'[eІK> ?l1SE@@, *+ *+'[fІK ?l1SE@@, *+ *+'[gІKާ ?l1SE@@, *+ *+'[hІK ?l1SE@@, *+ *+'[iІK~ ?l1SE@@, *+ *+'[jІK ?l1SE@@, *+ *+'[kІK ?l1SE@@, *+ *+'[lІK_ ?l1SE@@, *+ *+'[mІK ?l1SE@@, *+ *+'[nІK ?l1SE@@, *+ *+'[oІKA ?l1SE@@, *+ *+'[pІK ?l1SE@@, *+ *+'[qІK ?l1SE@@, *+ *+'[rІK$ ?l1SE@@, *+ *+'[sІK ?l1SE@@, *+ *+'[tІKë ?l1SE@@, *+ *+'[uІK ?l1SE@@, *+ *+'[vІKd ?l1SE@@, *+ *+'[wІK ?l1SE@@, *+ *+'[xІK ?l1SE@@, *+ *+'[yІKF ?l1SE@@, *+ *+'[zІK ?l1SE@@, *+ *+'[{ІK ?l1SE@@, *+ *+'[|ІK( ?l1SE@@, *+ *+'[}ІKi ?l1SE@@, *+ *+'[~ІKȮ ?l1SE@@, *+ *+'[ІK ?l1SE@@, *+ *+'[ІKi ?l1SE@@, *+ *+'[ІK ?l1SE@@, *+ *+'[ІK ?l1SE@@, *+ *+'[ІKJ ?l1SE@@, *+ *+'[ІK ?l1SE@@, *+ *+'[ІKΰ ?l1SE@@, *+ *+'[ІK  ?l1SE@@- *+ *+'[ІK <<?l1SE,@@.i *+ *+'[@UUІKD VV?l1SEH@@.L *+ *+'4\!P@ІK ?l1SE@@, *+ *+'\ІK5 ?l1SE@@, *+ *+'\ІK ?l1SE@@, *+ *+'\ІK ?l1SE@@, *+ *+'\ІK ?l1SE@@, *+ *+'\ІKu ?l1SE@@, *+ *+'\ІK ?l1SE@@, *+ *+'\ІK ?l1SE@@, *+ *+'\ІKV ?l1SE@@, *+ *+'\ ІK ?l1SE@@, *+ *+'\ ІK ?l1SE@@, *+ *+'\ ІK8 ?l1SE@@, *+ *+'\ ІKz ?l1SE@@, *+ *+'\ ІK ?l1SE@@, *+ *+'\ІK ?l1SE@@, *+ *+'\ІKy ?l1SE@@, *+ *+'\ІK ?l1SE@@, *+ *+'\ІK ?l1SE@@, *+ *+'\ІK[ ?l1SE@@, *+ *+'\ІK ?l1SE@@, *+ *+'\ІK ?l1SE@@, *+ *+'\ІK= ?l1SE@@,~ *+ *+'\ІK ?l1SE @@,} *+ *+'\ІK ?l1SE @@,| *+ *+'\ІK ?l1SE @@,{ *+ *+'\ІKa ?l1SE @@,z *+ *+'\ІK ?l1SE @@,y *+ *+'\ІK ?l1SE@@,x *+ *+'\ІK` ?l1SE@@,w *+ *+'\ІK ?l1SE@@,v *+ *+'\ІK ?l1SE@@,u *+ *+'\ІKA ?l1SE@@,t *+ *+'\ ІK ?l1SE@@,s *+ *+'\!ІK ?l1SE@@,r *+ *+'\"ІK% ?l1SE@@,q *+ *+'\#ІKf ?l1SE@@,p *+ *+'\$ІK ?l1SE@@,o *+ *+'\%ІK ?l1SE@@,n *+ *+'\&ІKG ?l1SE@@,m *+ *+'\'ІK ?l1SE@@,l *+ *+'\(ІK ?l1SE@@,k *+ *+'\)ІK* ?l1SE@@,j *+ *+'\*ІK ?l1SE@@,i *+ *+'\+ІK ?l1SE@@,h *+ *+'\,ІK( ?l1SE@@,g *+ *+'\-ІKj ?l1SE @@,f *+ *+'\.ІK ?l1SE!@@,e *+ *+'\/ІK ?l1SE"@@,d *+ *+'\0ІKM ?l1SE#@@,c *+ *+'\1ІK ?l1SE$@@,b *+ *+'\2ІK ?l1SE%@@,a *+ *+'\3ІK. ?l1SE&@@,` *+ *+'\4ІK ?l1SE'@@,_ *+ *+'\5ІK ?l1SE(@@,^ *+ *+'\6ІK ?l1SE)@@,] *+ *+'\7ІKo ?l1SE*@@,\ *+ *+'\8ІK ?l1SE+@@,[ *+ *+'\9ІK ?l1SE,@@,Z *+ *+'\:ІKP ?l1SE-@@,Y *+ *+'\;ІK ?l1SE.@@,X *+ *+'\<ІK ?l1SE/@@,W *+ *+'\=ІK2 ?l1SE0@@,V *+ *+'\>ІKu ?l1SE1@@,U *+ *+'\?ІK ?l1SE2@@,T *+ *+'\@ІK ?l1SE3@@,S *+ *+'\AІKs ?l1SE4@@,R *+ *+'\BІK ?l1SE5@@,Q *+ *+'\CІK ?l1SE6@@,P *+ *+'\DІKV ?l1SE7@@,O *+ *+'\EІK ?l1SE8@@,N *+ *+'\FІK ?l1SE9@@,M *+ *+'\GІK6 ?l1SE:@@,L *+ *+'\HІKw ?l1SE;@@,K *+ *+'\IІK ?l1SE<@@,J *+ *+'\JІK ?l1SE=@@,I *+ *+'\KІK[ ?l1SE>@@,H *+ *+'\LІK ?l1SE?@@,G *+ *+'\MІK ?l1SE@@@,F *+ *+'\NІKZ ?l1SEA@@,E *+ *+'\OІK ?l1SEB@@,D *+ *+'\PІK ?l1SEC@@,C *+ *+'\QІK< ?l1SED@@,B *+ *+'\RІK~ ?l1SEE@@,A *+ *+'\SІK ?l1SEF@@,@ *+ *+'\TІK$ ?l1SEG@@,? *+ *+'\UІKt ?l1SEH@@,> *+ *+'\VІK ?l1SEI@@,= *+ *+'\WІK ?l1SEJ@@,< *+ *+'\XІKH ?l1SEK@@,; *+ *+'\YІK ?l1SEL@@,: *+ *+'\ZІK ?l1SEM@@,9 *+ *+'\[ІK* ?l1SEN@@,8 *+ *+'\\ІK ?l1SEO@@,7 *+ *+'\]ІK ?l1SEP@@,6 *+ *+'\^ІK) ?l1SEQ@@,5 *+ *+'\_ІKk ?l1SER@@,4 *+ *+'\`ІK ?l1SES@@,3 *+ *+'\aІK ?l1SET@@,2 *+ *+'\bІKF ?l1SEU@@,1 *+ *+'\cІK ?l1SEV@@,0 *+ *+'\dІK ?l1SEW@@,/ *+ *+'\eІK( ?l1SEX@@,. *+ *+'\fІK ?l1SEY@@,- *+ *+'\gІK ?l1SEZ@@,, *+ *+'\hІK ?l1SE[@@,+ *+ *+'\iІKi ?l1SE\@@,* *+ *+'\jІK ?l1SE]@@,) *+ *+'\kІK ?l1SE^@@,( *+ *+'\lІKK ?l1SE_@@,' *+ *+'\mІK ?l1SE`@@,& *+ *+'\nІK ?l1SEa@@,% *+ *+'\oІK- ?l1SEb@@,$ *+ *+'\pІKo ?l1SEc@@,# *+ *+'\qІK ?l1SEd@@," *+ *+'\rІK ?l1SEe@@,! *+ *+'\sІKm ?l1SEf@@, *+ *+'\tІK ?l1SEg@@, *+ *+'\uІK ?l1SEh@@, *+ *+'\vІKN ?l1SEi@@, *+ *+'\wІK ?l1SEj@@, *+ *+'\xІK ?l1SEk@@, *+ *+'\yІK2 ?l1SEl@@, *+ *+'\zІKs ?l1SEm@@, *+ *+'\{ІK ?l1SEn@@, *+ *+'\|ІK ?l1SEo@@, *+ *+'\}ІK] ?l1SEp@@, *+ *+'\~ІK ?l1SEq@@, *+ *+'\ІK ?l1SEr@@, *+ *+'\ІKT ?l1SEs@@, *+ *+'\ІK ?l1SEt@@, *+ *+'\ІK ?l1SEu@@, *+ *+'\ІK6 ?l1SEv@@, *+ *+'\ІKx ?l1SEw@@, *+ *+'\ІK ?l1SEx@@, *+ *+'\ІK  ?l1SEy@@- *+ *+'\ІK <<?l1SE,z@@- *+ *+'\@UUІK VV?l1SEH{@@- *+ *+'4]!@ІK ?l1SE|@@, *+ *+']ІK ?l1SE}@@, *+ *+']ІK ?l1SE~@@, *+ *+']ІK ?l1SE@@, *+ *+']ІK ?l1SE@@, *+ *+']ІK ?l1SE@@, *+ *+']ІK ?l1SE@@, *+ *+']ІK ?l1SE@@, *+ *+']ІK ?l1SE@@, *+ *+'] ІKZ ?l1SE@@, *+ *+'] ІK ?l1SE@@, *+ *+'] ІK ?l1SE@@+ *+ *+'] ІK= ?l1SE@@+ *+ *+'] ІK ?l1SE@@+ *+ *+']ІK ?l1SE@@+ *+ *+']ІKg ?l1SE@@+ *+ *+']ІK{ ?l1SE@@+ *+ *+']ІK ?l1SE@@+ *+ *+']ІK ?l1SE@@+ *+ *+']ІK_ ?l1SE@@+ *+ *+']ІK ?l1SE@@+ *+ *+']ІK ?l1SE@@+ *+ *+']ІKB ?l1SE@@+ *+ *+']ІK ?l1SE@@+ *+ *+']ІK ?l1SE@@+ *+ *+']ІK# ?l1SE@@+ *+ *+']ІK ?l1SE@@+ *+ *+']ІK ?l1SE@@+ *+ *+']ІK" ?l1SE@@+ *+ *+']ІKc ?l1SE@@+ *+ *+']ІK ?l1SE@@+ *+ *+']ІK ?l1SE@@+ *+ *+'] ІKE ?l1SE@@+ *+ *+']!ІK ?l1SE@@+ *+ *+']"ІK ?l1SE@@+ *+ *+']#ІK) ?l1SE@@+ *+ *+']$ІK ?l1SE@@+ *+ *+']%ІK ?l1SE@@+ *+ *+']&ІK ?l1SE@@+ *+ *+']'ІKj ?l1SE@@+ *+ *+'](ІK ?l1SE@@+ *+ *+'])ІK ?l1SE@@+ *+ *+']*ІKJ ?l1SE@@+ *+ *+']+ІK ?l1SE@@+ *+ *+'],ІK ?l1SE@@+ *+ *+']-ІK. ?l1SE@@+ *+ *+'].ІKo ?l1SE@@+ *+ *+']/ІK ?l1SE@@+ *+ *+']0ІK ?l1SE@@+ *+ *+']1ІKn ?l1SE@@+ *+ *+']2ІK ?l1SE@@+ *+ *+']3ІK ?l1SE@@+ *+ *+']4ІKP ?l1SE@@+ *+ *+']5ІK ?l1SE@@+ *+ *+']6ІK ?l1SE@@+ *+ *+']7ІK1 ?l1SE@@+ *+ *+']8ІKs ?l1SE@@+ *+ *+']9ІK ?l1SE@@+ *+ *+']:ІK ?l1SE@@+ *+ *+'];ІKU ?l1SE@@+ *+ *+']<ІK ?l1SE@@+ *+ *+']=ІK ?l1SE@@+ *+ *+']>ІK7 ?l1SE@@+ *+ *+']?ІK ?l1SE@@+ *+ *+']@ІK ?l1SE@@+ *+ *+']AІK6 ?l1SE@@+ *+ *+']BІKw ?l1SE@@+ *+ *+']CІK ?l1SE@@+ *+ *+']DІK ?l1SE@@+ *+ *+']EІKZ ?l1SE@@+ *+ *+']FІK ?l1SE@@+ *+ *+']GІK ?l1SE@@+ *+ *+']HІKN ?l1SE@@+ *+ *+']IІK ?l1SE@@+ *+ *+']JІK ?l1SE@@+ *+ *+']KІK ?l1SE@@+ *+ *+']LІK ?l1SE@@+ *+ *+']MІK ?l1SE@@+ *+ *+']NІK" ?l1SE@@+ *+ *+']OІKe ?l1SE@@+ *+ *+']PІK ?l1SE@@+ *+ *+']QІK ?l1SE@@+ *+ *+']RІK? ?l1SE@@+ *+ *+']SІK ?l1SE@@+ *+ *+']TІK ?l1SE@@+ *+ *+']UІK( ?l1SE@@+ *+ *+']VІK ?l1SE@@+ *+ *+']WІK ?l1SE@@+ *+ *+']XІK  ?l1SE@@+ *+ *+']YІKg ?l1SE@@+ *+ *+']ZІK ?l1SE@@+ *+ *+'][ІK ?l1SE@@+ *+ *+']\ІKK ?l1SE@@+ *+ *+']]ІK ?l1SE@@+ *+ *+']^ІK ?l1SE@@+ *+ *+']_ІK- ?l1SE@@+ *+ *+']`ІKh ?l1SE@@+ *+ *+']aІK ?l1SE@@+ *+ *+']bІK ?l1SE@@+ *+ *+']cІKg ?l1SE@@+ *+ *+']dІK ?l1SE@@+ *+ *+']eІK ?l1SE@@+ *+ *+']fІKI ?l1SE@@+ *+ *+']gІK ?l1SE@@+ *+ *+']hІK ?l1SE@@+ *+ *+']iІK+ ?l1SE@@+ *+ *+']jІKm ?l1SE@@+ *+ *+']kІK ?l1SE@@+ *+ *+']lІK  ?l1SE@@+ *+ *+']mІKP ?l1SE@@+ *+ *+']nІK ?l1SE@@+ *+ *+']oІK ?l1SE@@+ *+ *+']pІK1 ?l1SE@@+ *+ *+']qІK ?l1SE@@+ *+ *+']rІK ?l1SE@@+ *+ *+']sІK0! ?l1SE@@+ *+ *+']tІKq! ?l1SE@@+ *+ *+']uІK! ?l1SE@@+ *+ *+']vІK" ?l1SE@@+ *+ *+']wІKS" ?l1SE@@+ *+ *+']xІK" ?l1SE@@+ *+ *+']yІK" ?l1SE@@+ *+ *+']zІK6# ?l1SE@@+ *+ *+']{ІK# ?l1SE@@+ *+ *+']|ІK# ?l1SE@@+ *+ *+']}ІK$ ?l1SE@@+ *+ *+']~ІKw$ ?l1SE@@+ *+ *+']ІK$ ?l1SE@@+ *+ *+']ІK% ?l1SE@@+ *+ *+']ІKX% ?l1SE@@+ *+ *+']ІK% ?l1SE@@+ *+ *+']ІK% ?l1SE@@+ *+ *+']ІK:& ?l1SE@@+ *+ *+']ІK|& ?l1SE@@+ *+ *+']ІK&  ?l1SE@@, *+ *+']ІK& <<?l1SE,@@-W *+ *+']@UUІKe9 VV?l1SEH@@-: *+ *+'4^!tR@ІK9 ?l1SE@@+ *+ *+'^ІK9 ?l1SE@@+ *+ *+'^ІKC: ?l1SE@@+ *+ *+'^ІK: ?l1SE@@+~ *+ *+'^ІK: ?l1SE @@+} *+ *+'^ІK$; ?l1SE @@+| *+ *+'^ІKg; ?l1SE @@+{ *+ *+'^ІK; ?l1SE @@+z *+ *+'^ІK< ?l1SE @@+y *+ *+'^ ІKI< ?l1SE@@+x *+ *+'^ ІK< ?l1SE@@+w *+ *+'^ ІK< ?l1SE@@+v *+ *+'^ ІK$= ?l1SE@@+u *+ *+'^ ІK= ?l1SE@@+t *+ *+'^ІK= ?l1SE@@+s *+ *+'^ІK#> ?l1SE@@+r *+ *+'^ІKf> ?l1SE@@+q *+ *+'^ІK> ?l1SE@@+p *+ *+'^ІK? ?l1SE@@+o *+ *+'^ІKG? ?l1SE@@+n *+ *+'^ІK? ?l1SE@@+m *+ *+'^ІK? ?l1SE@@+l *+ *+'^ІK+@ ?l1SE@@+k *+ *+'^ІK@ ?l1SE@@+j *+ *+'^ІK@ ?l1SE@@+i *+ *+'^ІK A ?l1SE@@+h *+ *+'^ІKiA ?l1SE@@+g *+ *+'^ІKA ?l1SE @@+f *+ *+'^ІK B ?l1SE!@@+e *+ *+'^ІKLB ?l1SE"@@+d *+ *+'^ІKB ?l1SE#@@+c *+ *+'^ІKB ?l1SE$@@+b *+ *+'^ ІK.C ?l1SE%@@+a *+ *+'^!ІKoC ?l1SE&@@+` *+ *+'^"ІKC ?l1SE'@@+_ *+ *+'^#ІKD ?l1SE(@@+^ *+ *+'^$ІKoD ?l1SE)@@+] *+ *+'^%ІKD ?l1SE*@@+\ *+ *+'^&ІKD ?l1SE+@@+[ *+ *+'^'ІKQE ?l1SE,@@+Z *+ *+'^(ІKE ?l1SE-@@+Y *+ *+'^)ІKE ?l1SE.@@+X *+ *+'^*ІK5F ?l1SE/@@+W *+ *+'^+ІKtF ?l1SE0@@+V *+ *+'^,ІKF ?l1SE1@@+U *+ *+'^-ІKG ?l1SE2@@+T *+ *+'^.ІKWG ?l1SE3@@+S *+ *+'^/ІKG ?l1SE4@@+R *+ *+'^0ІKG ?l1SE5@@+Q *+ *+'^1ІKUH ?l1SE6@@+P *+ *+'^2ІKH ?l1SE7@@+O *+ *+'^3ІKH ?l1SE8@@+N *+ *+'^4ІK7I ?l1SE9@@+M *+ *+'^5ІKzI ?l1SE:@@+L *+ *+'^6ІKI ?l1SE;@@+K *+ *+'^7ІK!J ?l1SE<@@+J *+ *+'^8ІKiJ ?l1SE=@@+I *+ *+'^9ІKJ ?l1SE>@@+H *+ *+'^:ІKJ ?l1SE?@@+G *+ *+'^;ІKDK ?l1SE@@@+F *+ *+'^<ІKK ?l1SEA@@+E *+ *+'^=ІKK ?l1SEB@@+D *+ *+'^>ІK&L ?l1SEC@@+C *+ *+'^?ІKL ?l1SED@@+B *+ *+'^@ІKL ?l1SEE@@+A *+ *+'^AІK)M ?l1SEF@@+@ *+ *+'^BІKpM ?l1SEG@@+? *+ *+'^CІKM ?l1SEH@@+> *+ *+'^DІKN ?l1SEI@@+= *+ *+'^EІKBN ?l1SEJ@@+< *+ *+'^FІKN ?l1SEK@@+; *+ *+'^GІKN ?l1SEL@@+: *+ *+'^HІK/O ?l1SEM@@+9 *+ *+'^IІKO ?l1SEN@@+8 *+ *+'^JІKO ?l1SEO@@+7 *+ *+'^KІK P ?l1SEP@@+6 *+ *+'^LІKkP ?l1SEQ@@+5 *+ *+'^MІKP ?l1SER@@+4 *+ *+'^NІKQ ?l1SES@@+3 *+ *+'^OІKHQ ?l1SET@@+2 *+ *+'^PІKQ ?l1SEU@@+1 *+ *+'^QІKQ ?l1SEV@@+0 *+ *+'^RІK4R ?l1SEW@@+/ *+ *+'^SІKmR ?l1SEX@@+. *+ *+'^TІKR ?l1SEY@@+- *+ *+'^UІKS ?l1SEZ@@+, *+ *+'^VІKuS ?l1SE[@@++ *+ *+'^WІKS ?l1SE\@@+* *+ *+'^XІKS ?l1SE]@@+) *+ *+'^YІKQT ?l1SE^@@+( *+ *+'^ZІKT ?l1SE_@@+' *+ *+'^[ІKT ?l1SE`@@+& *+ *+'^\ІK4U ?l1SEa@@+% *+ *+'^]ІKzU ?l1SEb@@+$ *+ *+'^^ІKU ?l1SEc@@+# *+ *+'^_ІKV ?l1SEd@@+" *+ *+'^`ІKSV ?l1SEe@@+! *+ *+'^aІKV ?l1SEf@@+ *+ *+'^bІKV ?l1SEg@@+ *+ *+'^cІKYW ?l1SEh@@+ *+ *+'^dІKW ?l1SEi@@+ *+ *+'^eІKW ?l1SEj@@+ *+ *+'^fІKІK ?l1SE@@* *+ *+'_?ІKq ?l1SE@@* *+ *+'_@ІK ?l1SE@@* *+ *+'_AІK ?l1SE@@* *+ *+'_BІKR ?l1SE@@* *+ *+'_CІK ?l1SE@@* *+ *+'_DІK ?l1SE@@* *+ *+'_EІK. ?l1SE@@* *+ *+'_FІKp ?l1SE@@* *+ *+'_GІK։ ?l1SE@@* *+ *+'_HІK ?l1SE@@* *+ *+'_IІKv ?l1SE@@* *+ *+'_JІK ?l1SE@@* *+ *+'_KІK ?l1SE@@* *+ *+'_LІKW ?l1SE@@* *+ *+'_MІK ?l1SE@@* *+ *+'_NІK ?l1SE@@* *+ *+'_OІK: ?l1SE@@* *+ *+'_PІKy ?l1SE@@* *+ *+'_QІKڌ ?l1SE@@* *+ *+'_RІK ?l1SE@@* *+ *+'_SІKZ ?l1SE@@* *+ *+'_TІK ?l1SE@@* *+ *+'_UІK ?l1SE@@* *+ *+'_VІK\ ?l1SE@@* *+ *+'_WІK ?l1SE@@* *+ *+'_XІK ?l1SE@@* *+ *+'_YІK? ?l1SE@@* *+ *+'_ZІK ?l1SE@@* *+ *+'_[ІK ?l1SE@@* *+ *+'_\ІK% ?l1SE@@* *+ *+'_]ІK[ ?l1SE@@* *+ *+'_^ІK ?l1SE@@* *+ *+'__ІK ?l1SE@@* *+ *+'_`ІKO ?l1SE@@* *+ *+'_aІK ?l1SE@@* *+ *+'_bІK ?l1SE@@* *+ *+'_cІKB ?l1SE@@* *+ *+'_dІK} ?l1SE@@* *+ *+'_eІK˒ ?l1SE@@* *+ *+'_fІK$ ?l1SE@@* *+ *+'_gІKe ?l1SE@@* *+ *+'_hІK ?l1SE@@* *+ *+'_iІK ?l1SE@@* *+ *+'_jІKG ?l1SE@@* *+ *+'_kІK ?l1SE@@* *+ *+'_lІK ?l1SE@@* *+ *+'_mІK. ?l1SE@@* *+ *+'_nІK ?l1SE@@* *+ *+'_oІK˕ ?l1SE@@* *+ *+'_pІK ?l1SE@@* *+ *+'_qІKk ?l1SE@@* *+ *+'_rІK ?l1SE@@* *+ *+'_sІK ?l1SE@@* *+ *+'_tІKF ?l1SE@@* *+ *+'_uІK ?l1SE@@* *+ *+'_vІK ?l1SE@@* *+ *+'_wІK( ?l1SE@@* *+ *+'_xІKt ?l1SE@@* *+ *+'_yІKИ ?l1SE@@* *+ *+'_zІK ?l1SE@@*~ *+ *+'_{ІKx ?l1SE @@*} *+ *+'_|ІK ?l1SE @@*| *+ *+'_}ІK ?l1SE @@*{ *+ *+'_~ІKR ?l1SE @@*z *+ *+'_ІK ?l1SE @@*y *+ *+'_ІK ?l1SE@@*x *+ *+'_ІK2 ?l1SE@@*w *+ *+'_ІKo ?l1SE@@*v *+ *+'_ІKԛ ?l1SE@@*u *+ *+'_ІK ?l1SE@@*t *+ *+'_ІKb ?l1SE@@*s *+ *+'_ІK  ?l1SE@@+v *+ *+'_ІK <<?l1SE,@@,E *+ *+'_@UUІK VV?l1SEH@@,( *+ *+'4`!. @ІKJ ?l1SE@@*o *+ *+'`ІK ?l1SE@@*n *+ *+'`ІK ?l1SE@@*m *+ *+'`ІK% ?l1SE@@*l *+ *+'`ІKy ?l1SE@@*k *+ *+'`ІK̰ ?l1SE@@*j *+ *+'`ІK ?l1SE@@*i *+ *+'`ІKl ?l1SE@@*h *+ *+'`ІK ?l1SE@@*g *+ *+'` ІK ?l1SE @@*f *+ *+'` ІKK ?l1SE!@@*e *+ *+'` ІK ?l1SE"@@*d *+ *+'` ІK˲ ?l1SE#@@*c *+ *+'` ІK0 ?l1SE$@@*b *+ *+'`ІKq ?l1SE%@@*a *+ *+'`ІKг ?l1SE&@@*` *+ *+'`ІK ?l1SE'@@*_ *+ *+'`ІKS ?l1SE(@@*^ *+ *+'`ІK ?l1SE)@@*] *+ *+'`ІK ?l1SE*@@*\ *+ *+'`ІK1 ?l1SE+@@*[ *+ *+'`ІK ?l1SE,@@*Z *+ *+'`ІKѵ ?l1SE-@@*Y *+ *+'`ІK8 ?l1SE.@@*X *+ *+'`ІKq ?l1SE/@@*W *+ *+'`ІKǶ ?l1SE0@@*V *+ *+'`ІK ?l1SE1@@*U *+ *+'`ІKS ?l1SE2@@*T *+ *+'`ІK ?l1SE3@@*S *+ *+'`ІK ?l1SE4@@*R *+ *+'`ІKH ?l1SE5@@*Q *+ *+'`ІK ?l1SE6@@*P *+ *+'` ІKָ ?l1SE7@@*O *+ *+'`!ІK ?l1SE8@@*N *+ *+'`"ІK{ ?l1SE9@@*M *+ *+'`#ІK ?l1SE:@@*L *+ *+'`$ІK ?l1SE;@@*K *+ *+'`%ІKX ?l1SE<@@*J *+ *+'`&ІK ?l1SE=@@*I *+ *+'`'ІK ?l1SE>@@*H *+ *+'`(ІK; ?l1SE?@@*G *+ *+'`)ІK| ?l1SE@@@*F *+ *+'`*ІK ?l1SEA@@*E *+ *+'`+ІK ?l1SEB@@*D *+ *+'`,ІK ?l1SEC@@*C *+ *+'`-ІK ?l1SED@@*B *+ *+'`.ІK ?l1SEE@@*A *+ *+'`/ІKp ?l1SEF@@*@ *+ *+'`0ІK ?l1SEG@@*? *+ *+'`1ІK ?l1SEH@@*> *+ *+'`2ІK= ?l1SEI@@*= *+ *+'`3ІK ?l1SEJ@@*< *+ *+'`4ІK ?l1SEK@@*; *+ *+'`5ІK ?l1SEL@@*: *+ *+'`6ІKg ?l1SEM@@*9 *+ *+'`7ІKȿ ?l1SEN@@*8 *+ *+'`8ІK ?l1SEO@@*7 *+ *+'`9ІKq ?l1SEP@@*6 *+ *+'`:ІK ?l1SEQ@@*5 *+ *+'`;ІK ?l1SER@@*4 *+ *+'`<ІKK ?l1SES@@*3 *+ *+'`=ІK ?l1SET@@*2 *+ *+'`>ІK ?l1SEU@@*1 *+ *+'`?ІK( ?l1SEV@@*0 *+ *+'`@ІKg ?l1SEW@@*/ *+ *+'`AІK ?l1SEX@@*. *+ *+'`BІK ?l1SEY@@*- *+ *+'`CІK[ ?l1SEZ@@*, *+ *+'`DІK ?l1SE[@@*+ *+ *+'`EІK ?l1SE\@@** *+ *+'`FІK, ?l1SE]@@*) *+ *+'`GІK ?l1SE^@@*( *+ *+'`HІK ?l1SE_@@*' *+ *+'`IІK2 ?l1SE`@@*& *+ *+'`JІKk ?l1SEa@@*% *+ *+'`KІK ?l1SEb@@*$ *+ *+'`LІK ?l1SEc@@*# *+ *+'`MІKM ?l1SEd@@*" *+ *+'`NІK ?l1SEe@@*! *+ *+'`OІK ?l1SEf@@* *+ *+'`PІK/ ?l1SEg@@* *+ *+'`QІK ?l1SEh@@* *+ *+'`RІK ?l1SEi@@* *+ *+'`SІK% ?l1SEj@@* *+ *+'`TІKv ?l1SEk@@* *+ *+'`UІK ?l1SEl@@* *+ *+'`VІK ?l1SEm@@* *+ *+'`WІKR ?l1SEn@@* *+ *+'`XІK ?l1SEo@@* *+ *+'`YІK ?l1SEp@@* *+ *+'`ZІK3 ?l1SEq@@* *+ *+'`[ІK{ ?l1SEr@@* *+ *+'`\ІK ?l1SEs@@* *+ *+'`]ІK ?l1SEt@@* *+ *+'`^ІK} ?l1SEu@@* *+ *+'`_ІK ?l1SEv@@* *+ *+'``ІK ?l1SEw@@* *+ *+'`aІK` ?l1SEx@@* *+ *+'`bІK ?l1SEy@@* *+ *+'`cІK ?l1SEz@@* *+ *+'`dІK8 ?l1SE{@@* *+ *+'`eІK{ ?l1SE|@@* *+ *+'`fІK ?l1SE}@@* *+ *+'`gІK ?l1SE~@@* *+ *+'`hІKb ?l1SE@@* *+ *+'`iІK ?l1SE@@* *+ *+'`jІK ?l1SE@@* *+ *+'`kІKc ?l1SE@@* *+ *+'`lІK ?l1SE@@* *+ *+'`mІK ?l1SE@@* *+ *+'`nІKE ?l1SE@@* *+ *+'`oІK~ ?l1SE@@* *+ *+'`pІK ?l1SE@@) *+ *+'`qІK' ?l1SE@@) *+ *+'`rІK` ?l1SE@@) *+ *+'`sІK ?l1SE@@) *+ *+'`tІK ?l1SE@@) *+ *+'`uІKC ?l1SE@@) *+ *+'`vІK ?l1SE@@) *+ *+'`wІK ?l1SE@@) *+ *+'`xІK* ?l1SE@@) *+ *+'`yІK ?l1SE@@) *+ *+'`zІK ?l1SE@@) *+ *+'`{ІK+ ?l1SE@@) *+ *+'`|ІKe ?l1SE@@) *+ *+'`}ІK ?l1SE@@) *+ *+'`~ІK ?l1SE@@) *+ *+'`ІKG ?l1SE@@) *+ *+'`ІK ?l1SE@@) *+ *+'`ІK ?l1SE@@) *+ *+'`ІK/ ?l1SE@@) *+ *+'`ІK ?l1SE@@) *+ *+'`ІK ?l1SE@@) *+ *+'`ІK ?l1SE@@) *+ *+'`ІK>  ?l1SE@@* *+ *+'`ІKJ <<?l1SE,@@+ *+ *+'`@UUІK VV?l1SEH@@+ *+ *+'4a!;+q@ІK+ ?l1SE@@) *+ *+'aІKs ?l1SE@@) *+ *+'aІK ?l1SE@@) *+ *+'aІK ?l1SE@@) *+ *+'aІKP ?l1SE@@) *+ *+'aІK ?l1SE@@) *+ *+'aІK ?l1SE@@) *+ *+'aІKW ?l1SE@@) *+ *+'aІK ?l1SE@@) *+ *+'a ІK ?l1SE@@) *+ *+'a ІK9 ?l1SE@@) *+ *+'a ІKs ?l1SE@@) *+ *+'a ІK ?l1SE@@) *+ *+'a ІK ?l1SE@@) *+ *+'aІKT ?l1SE@@) *+ *+'aІK ?l1SE@@) *+ *+'aІK ?l1SE@@) *+ *+'aІK< ?l1SE@@) *+ *+'aІK ?l1SE@@) *+ *+'aІK ?l1SE@@) *+ *+'aІK ?l1SE@@) *+ *+'aІK ?l1SE@@) *+ *+'aІK ?l1SE@@) *+ *+'aІK ?l1SE@@) *+ *+'aІKY ?l1SE@@) *+ *+'aІK ?l1SE@@) *+ *+'aІK ?l1SE@@) *+ *+'aІK; ?l1SE@@) *+ *+'aІK ?l1SE@@) *+ *+'aІK ?l1SE@@) *+ *+'aІK ?l1SE@@) *+ *+'aІK ?l1SE@@) *+ *+'a ІK ?l1SE@@) *+ *+'a!ІK ?l1SE@@) *+ *+'a"ІK^ ?l1SE@@) *+ *+'a#ІK ?l1SE@@) *+ *+'a$ІK ?l1SE@@) *+ *+'a%ІK? ?l1SE@@) *+ *+'a&ІK ?l1SE@@) *+ *+'a'ІK ?l1SE@@) *+ *+'a(ІK! ?l1SE@@) *+ *+'a)ІKx ?l1SE@@) *+ *+'a*ІK ?l1SE@@) *+ *+'a+ІK ?l1SE@@) *+ *+'a,ІKi ?l1SE@@) *+ *+'a-ІK ?l1SE@@) *+ *+'a.ІK ?l1SE@@) *+ *+'a/ІKM ?l1SE@@) *+ *+'a0ІK ?l1SE@@) *+ *+'a1ІK ?l1SE@@) *+ *+'a2ІK& ?l1SE@@) *+ *+'a3ІKm ?l1SE@@) *+ *+'a4ІK ?l1SE@@) *+ *+'a5ІK ?l1SE@@) *+ *+'a6ІKO ?l1SE@@) *+ *+'a7ІK ?l1SE@@) *+ *+'a8ІK ?l1SE@@) *+ *+'a9ІKP ?l1SE@@) *+ *+'a:ІK ?l1SE@@) *+ *+'a;ІK ?l1SE@@) *+ *+'a<ІK3 ?l1SE@@) *+ *+'a=ІKk ?l1SE@@) *+ *+'a>ІK ?l1SE@@) *+ *+'a?ІK ?l1SE@@) *+ *+'a@ІKN ?l1SE@@) *+ *+'aAІK ?l1SE@@) *+ *+'aBІK ?l1SE@@) *+ *+'aCІK2 ?l1SE@@) *+ *+'aDІK ?l1SE@@) *+ *+'aEІK ?l1SE@@) *+ *+'aFІK ?l1SE@@) *+ *+'aGІK| ?l1SE@@) *+ *+'aHІK ?l1SE@@) *+ *+'aIІK% ?l1SE@@) *+ *+'aJІKS ?l1SE@@) *+ *+'aKІK ?l1SE@@) *+ *+'aLІK ?l1SE@@) *+ *+'aMІK5 ?l1SE@@) *+ *+'aNІK ?l1SE@@) *+ *+'aOІK ?l1SE@@) *+ *+'aPІK ?l1SE@@) *+ *+'aQІK~ ?l1SE@@) *+ *+'aRІK ?l1SE@@) *+ *+'aSІK ?l1SE@@) *+ *+'aTІK_ ?l1SE@@) *+ *+'aUІK ?l1SE@@) *+ *+'aVІK ?l1SE@@) *+ *+'aWІK: ?l1SE@@) *+ *+'aXІK| ?l1SE@@) *+ *+'aYІK ?l1SE@@) *+ *+'aZІK ?l1SE@@) *+ *+'a[ІKc ?l1SE@@) *+ *+'a\ІK ?l1SE@@) *+ *+'a]ІK ?l1SE@@) *+ *+'a^ІKd ?l1SE@@) *+ *+'a_ІK ?l1SE@@) *+ *+'a`ІK ?l1SE@@) *+ *+'aaІKF ?l1SE@@) *+ *+'abІK ?l1SE@@) *+ *+'acІK ?l1SE@@) *+ *+'adІK ?l1SE@@) *+ *+'aeІKv ?l1SE@@) *+ *+'afІK ?l1SE@@) *+ *+'agІK ?l1SE@@) *+ *+'ahІKF ?l1SE@@)~ *+ *+'aiІK ?l1SE @@)} *+ *+'ajІK ?l1SE @@)| *+ *+'akІKK ?l1SE @@){ *+ *+'alІK ?l1SE @@)z *+ *+'amІK ?l1SE @@)y *+ *+'anІK& ?l1SE@@)x *+ *+'aoІKg ?l1SE@@)w *+ *+'apІK ?l1SE@@)v *+ *+'aqІK ?l1SE@@)u *+ *+'arІKG ?l1SE@@)t *+ *+'asІK ?l1SE@@)s *+ *+'atІK ?l1SE@@)r *+ *+'auІK+ ?l1SE@@)q *+ *+'avІK ?l1SE@@)p *+ *+'awІK ?l1SE@@)o *+ *+'axІK ?l1SE@@)n *+ *+'ayІKs ?l1SE@@)m *+ *+'azІK ?l1SE@@)l *+ *+'a{ІK ?l1SE@@)k *+ *+'a|ІKM ?l1SE@@)j *+ *+'a}ІK ?l1SE@@)i *+ *+'a~ІK ?l1SE@@)h *+ *+'aІK. ?l1SE@@)g *+ *+'aІK ?l1SE @@)f *+ *+'aІK ?l1SE!@@)e *+ *+'aІK ?l1SE"@@)d *+ *+'aІKw ?l1SE#@@)c *+ *+'aІK ?l1SE$@@)b *+ *+'aІK ?l1SE%@@)a *+ *+'aІK1  ?l1SE&@@*d *+ *+'aІK? <<?l1SE,'@@+3 *+ *+'a@UUІKE$ VV?l1SEH(@@+ *+ *+'4b!G@ІK$ ?l1SE)@@)] *+ *+'bІK5% ?l1SE*@@)\ *+ *+'bІK% ?l1SE+@@)[ *+ *+'bІK% ?l1SE,@@)Z *+ *+'bІK& ?l1SE-@@)Y *+ *+'bІKw& ?l1SE.@@)X *+ *+'bІK& ?l1SE/@@)W *+ *+'bІK' ?l1SE0@@)V *+ *+'bІKW' ?l1SE1@@)U *+ *+'b ІK' ?l1SE2@@)T *+ *+'b ІK( ?l1SE3@@)S *+ *+'b ІK9( ?l1SE4@@)R *+ *+'b ІK( ?l1SE5@@)Q *+ *+'b ІK( ?l1SE6@@)P *+ *+'bІK) ?l1SE7@@)O *+ *+'bІK) ?l1SE8@@)N *+ *+'bІK) ?l1SE9@@)M *+ *+'bІK* ?l1SE:@@)L *+ *+'bІKe* ?l1SE;@@)K *+ *+'bІK* ?l1SE<@@)J *+ *+'bІK* ?l1SE=@@)I *+ *+'bІKF+ ?l1SE>@@)H *+ *+'bІK+ ?l1SE?@@)G *+ *+'bІK+ ?l1SE@@@)F *+ *+'bІK , ?l1SEA@@)E *+ *+'bІKg, ?l1SEB@@)D *+ *+'bІK, ?l1SEC@@)C *+ *+'bІK- ?l1SED@@)B *+ *+'bІKj- ?l1SEE@@)A *+ *+'bІK- ?l1SEF@@)@ *+ *+'bІK- ?l1SEG@@)? *+ *+'bІKK. ?l1SEH@@)> *+ *+'b ІK. ?l1SEI@@)= *+ *+'b!ІK. ?l1SEJ@@)< *+ *+'b"ІK,/ ?l1SEK@@); *+ *+'b#ІKg/ ?l1SEL@@): *+ *+'b$ІK/ ?l1SEM@@)9 *+ *+'b%ІK0 ?l1SEN@@)8 *+ *+'b&ІKH0 ?l1SEO@@)7 *+ *+'b'ІK0 ?l1SEP@@)6 *+ *+'b(ІK0 ?l1SEQ@@)5 *+ *+'b)ІK21 ?l1SER@@)4 *+ *+'b*ІK1 ?l1SES@@)3 *+ *+'b+ІK1 ?l1SET@@)2 *+ *+'b,ІK22 ?l1SEU@@)1 *+ *+'b-ІKj2 ?l1SEV@@)0 *+ *+'b.ІK2 ?l1SEW@@)/ *+ *+'b/ІK3 ?l1SEX@@). *+ *+'b0ІKM3 ?l1SEY@@)- *+ *+'b1ІK3 ?l1SEZ@@), *+ *+'b2ІK3 ?l1SE[@@)+ *+ *+'b3ІK04 ?l1SE\@@)* *+ *+'b4ІK4 ?l1SE]@@)) *+ *+'b5ІK4 ?l1SE^@@)( *+ *+'b6ІK5 ?l1SE_@@)' *+ *+'b7ІKw5 ?l1SE`@@)& *+ *+'b8ІK5 ?l1SEa@@)% *+ *+'b9ІK6 ?l1SEb@@)$ *+ *+'b:ІKR6 ?l1SEc@@)# *+ *+'b;ІK6 ?l1SEd@@)" *+ *+'b<ІK6 ?l1SEe@@)! *+ *+'b=ІK37 ?l1SEf@@) *+ *+'b>ІK{7 ?l1SEg@@) *+ *+'b?ІK7 ?l1SEh@@) *+ *+'b@ІK8 ?l1SEi@@) *+ *+'bAІK}8 ?l1SEj@@) *+ *+'bBІK8 ?l1SEk@@) *+ *+'bCІK8 ?l1SEl@@) *+ *+'bDІK^9 ?l1SEm@@) *+ *+'bEІK9 ?l1SEn@@) *+ *+'bFІK9 ?l1SEo@@) *+ *+'bGІK@: ?l1SEp@@) *+ *+'bHІKy: ?l1SEq@@) *+ *+'bIІK: ?l1SEr@@) *+ *+'bJІK; ?l1SEs@@) *+ *+'bKІK`; ?l1SEt@@) *+ *+'bLІK; ?l1SEu@@) *+ *+'bMІK; ?l1SEv@@) *+ *+'bNІKb< ?l1SEw@@) *+ *+'bOІK< ?l1SEx@@) *+ *+'bPІK< ?l1SEy@@) *+ *+'bQІK>= ?l1SEz@@) *+ *+'bRІK= ?l1SE{@@) *+ *+'bSІK= ?l1SE|@@) *+ *+'bTІK'> ?l1SE}@@) *+ *+'bUІKa> ?l1SE~@@) *+ *+'bVІK> ?l1SE@@) *+ *+'bWІK? ?l1SE@@) *+ *+'bXІKE? ?l1SE@@) *+ *+'bYІK? ?l1SE@@) *+ *+'bZІK? ?l1SE@@) *+ *+'b[ІK)@ ?l1SE@@) *+ *+'b\ІK@ ?l1SE@@) *+ *+'b]ІK@ ?l1SE@@) *+ *+'b^ІK.A ?l1SE@@( *+ *+'b_ІKeA ?l1SE@@( *+ *+'b`ІKA ?l1SE@@( *+ *+'baІKB ?l1SE@@( *+ *+'bbІKGB ?l1SE@@( *+ *+'bcІKB ?l1SE@@( *+ *+'bdІKB ?l1SE@@( *+ *+'beІK/C ?l1SE@@( *+ *+'bfІKC ?l1SE@@( *+ *+'bgІKC ?l1SE@@( *+ *+'bhІK D ?l1SE@@( *+ *+'biІKrD ?l1SE@@( *+ *+'bjІKD ?l1SE@@( *+ *+'bkІKE ?l1SE@@( *+ *+'blІKKE ?l1SE@@( *+ *+'bmІKE ?l1SE@@( *+ *+'bnІKE ?l1SE@@( *+ *+'boІK.F ?l1SE@@( *+ *+'bpІKpF ?l1SE@@( *+ *+'bqІKF ?l1SE@@( *+ *+'brІKG ?l1SE@@( *+ *+'bsІKwG ?l1SE@@( *+ *+'btІKG ?l1SE@@( *+ *+'buІKG ?l1SE@@( *+ *+'bvІKXH ?l1SE@@( *+ *+'bwІKH ?l1SE@@( *+ *+'bxІKH ?l1SE@@( *+ *+'byІK:I ?l1SE@@( *+ *+'bzІKtI ?l1SE@@( *+ *+'b{ІKI ?l1SE@@( *+ *+'b|ІKJ ?l1SE@@( *+ *+'b}ІKZJ ?l1SE@@( *+ *+'b~ІKJ ?l1SE@@( *+ *+'bІKJ ?l1SE@@( *+ *+'bІK]K ?l1SE@@( *+ *+'bІKK ?l1SE@@( *+ *+'bІKK ?l1SE@@( *+ *+'bІK?L ?l1SE@@( *+ *+'bІKxL ?l1SE@@( *+ *+'bІKL ?l1SE@@( *+ *+'bІKL  ?l1SE@@) *+ *+'bІKL <<?l1SE,@@* *+ *+'b@UUІK_ VV?l1SEH@@* *+ *+'4c!TO[@ІK_ ?l1SE@@( *+ *+'cІK(` ?l1SE@@( *+ *+'cІK` ?l1SE@@( *+ *+'cІK` ?l1SE@@( *+ *+'cІKa ?l1SE@@( *+ *+'cІKha ?l1SE@@( *+ *+'cІKa ?l1SE@@( *+ *+'cІKb ?l1SE@@( *+ *+'cІKBb ?l1SE@@( *+ *+'c ІKb ?l1SE@@( *+ *+'c ІKb ?l1SE@@( *+ *+'c ІK%c ?l1SE@@( *+ *+'c ІKfc ?l1SE@@( *+ *+'c ІKc ?l1SE@@( *+ *+'cІKd ?l1SE@@( *+ *+'cІKmd ?l1SE@@( *+ *+'cІKd ?l1SE@@( *+ *+'cІKd ?l1SE@@( *+ *+'cІKNe ?l1SE@@( *+ *+'cІKe ?l1SE@@( *+ *+'cІKe ?l1SE@@( *+ *+'cІK1f ?l1SE@@( *+ *+'cІKlf ?l1SE@@( *+ *+'cІKf ?l1SE@@( *+ *+'cІK g ?l1SE@@( *+ *+'cІKLg ?l1SE@@( *+ *+'cІKg ?l1SE@@( *+ *+'cІKg ?l1SE@@( *+ *+'cІK\h ?l1SE@@( *+ *+'cІKh ?l1SE@@( *+ *+'cІKh ?l1SE@@( *+ *+'cІK-i ?l1SE@@( *+ *+'c ІKmi ?l1SE@@( *+ *+'c!ІKi ?l1SE@@( *+ *+'c"ІKj ?l1SE@@( *+ *+'c#ІKRj ?l1SE@@( *+ *+'c$ІKj ?l1SE@@( *+ *+'c%ІKj ?l1SE@@( *+ *+'c&ІK3k ?l1SE@@( *+ *+'c'ІKk ?l1SE@@( *+ *+'c(ІKk ?l1SE@@( *+ *+'c)ІKl ?l1SE@@( *+ *+'c*ІKul ?l1SE@@( *+ *+'c+ІKl ?l1SE@@( *+ *+'c,ІKm ?l1SE@@( *+ *+'c-ІKWm ?l1SE@@( *+ *+'c.ІKm ?l1SE@@( *+ *+'c/ІKm ?l1SE@@( *+ *+'c0ІK9n ?l1SE@@( *+ *+'c1ІKn ?l1SE@@( *+ *+'c2ІKn ?l1SE@@( *+ *+'c3ІKo ?l1SE@@( *+ *+'c4ІKyo ?l1SE@@( *+ *+'c5ІKo ?l1SE@@( *+ *+'c6ІK p ?l1SE@@( *+ *+'c7ІK]p ?l1SE@@( *+ *+'c8ІKp ?l1SE@@( *+ *+'c9ІKp ?l1SE@@( *+ *+'c:ІK=q ?l1SE@@( *+ *+'c;ІKq ?l1SE@@( *+ *+'c<ІKq ?l1SE@@( *+ *+'c=ІKr ?l1SE@@( *+ *+'c>ІKar ?l1SE@@( *+ *+'c?ІKr ?l1SE@@( *+ *+'c@ІKs ?l1SE@@( *+ *+'cAІK_s ?l1SE@@( *+ *+'cBІKs ?l1SE@@( *+ *+'cCІKs ?l1SE@@( *+ *+'cDІKCt ?l1SE@@( *+ *+'cEІKt ?l1SE@@( *+ *+'cFІKt ?l1SE@@( *+ *+'cGІK#u ?l1SE@@( *+ *+'cHІKeu ?l1SE@@( *+ *+'cIІKu ?l1SE@@( *+ *+'cJІKv ?l1SE@@( *+ *+'cKІKGv ?l1SE@@( *+ *+'cLІKv ?l1SE@@( *+ *+'cMІKv ?l1SE@@( *+ *+'cNІKGw ?l1SE@@( *+ *+'cOІKw ?l1SE@@( *+ *+'cPІKw ?l1SE@@( *+ *+'cQІK)x ?l1SE@@( *+ *+'cRІKkx ?l1SE@@( *+ *+'cSІKx ?l1SE@@( *+ *+'cTІK y ?l1SE@@( *+ *+'cUІKMy ?l1SE@@( *+ *+'cVІKy ?l1SE@@(~ *+ *+'cWІKy ?l1SE @@(} *+ *+'cXІK-z ?l1SE @@(| *+ *+'cYІKz ?l1SE @@({ *+ *+'cZІKz ?l1SE @@(z *+ *+'c[ІK{ ?l1SE @@(y *+ *+'c\ІKo{ ?l1SE@@(x *+ *+'c]ІK{ ?l1SE@@(w *+ *+'c^ІK| ?l1SE@@(v *+ *+'c_ІKP| ?l1SE@@(u *+ *+'c`ІK| ?l1SE@@(t *+ *+'caІK| ?l1SE@@(s *+ *+'cbІK3} ?l1SE@@(r *+ *+'ccІK} ?l1SE@@(q *+ *+'cdІK} ?l1SE@@(p *+ *+'ceІK~ ?l1SE@@(o *+ *+'cfІKs~ ?l1SE@@(n *+ *+'cgІK~ ?l1SE@@(m *+ *+'chІK~ ?l1SE@@(l *+ *+'ciІKU ?l1SE@@(k *+ *+'cjІK ?l1SE@@(j *+ *+'ckІK ?l1SE@@(i *+ *+'clІK8 ?l1SE@@(h *+ *+'cmІKy ?l1SE@@(g *+ *+'cnІK׀ ?l1SE @@(f *+ *+'coІK ?l1SE!@@(e *+ *+'cpІKW ?l1SE"@@(d *+ *+'cqІK ?l1SE#@@(c *+ *+'crІK ?l1SE$@@(b *+ *+'csІKV ?l1SE%@@(a *+ *+'ctІK ?l1SE&@@(` *+ *+'cuІKڂ ?l1SE'@@(_ *+ *+'cvІK6 ?l1SE(@@(^ *+ *+'cwІKz ?l1SE)@@(] *+ *+'cxІK ?l1SE*@@(\ *+ *+'cyІK ?l1SE+@@([ *+ *+'czІK[ ?l1SE,@@(Z *+ *+'c{ІK ?l1SE-@@(Y *+ *+'c|ІK ?l1SE.@@(X *+ *+'c}ІK= ?l1SE/@@(W *+ *+'c~ІK ?l1SE0@@(V *+ *+'cІKޅ ?l1SE1@@(U *+ *+'cІK< ?l1SE2@@(T *+ *+'cІK~ ?l1SE3@@(S *+ *+'cІK ?l1SE4@@(R *+ *+'cІK ?l1SE5@@(Q *+ *+'cІK` ?l1SE6@@(P *+ *+'cІK ?l1SE7@@(O *+ *+'cІKԇ  ?l1SE8@@)R *+ *+'cІKۇ <<?l1SE,9@@*! *+ *+'c@UUІK VV?l1SEH:@@* *+ *+'4d!`ޯ@ІK ?l1SE;@@(K *+ *+'dІK ?l1SE<@@(J *+ *+'dІKG ?l1SE=@@(I *+ *+'dІK ?l1SE>@@(H *+ *+'dІKʛ ?l1SE?@@(G *+ *+'dІK) ?l1SE@@@(F *+ *+'dІKk ?l1SEA@@(E *+ *+'dІKʜ ?l1SEB@@(D *+ *+'dІK ?l1SEC@@(C *+ *+'d ІKM ?l1SED@@(B *+ *+'d ІK ?l1SEE@@(A *+ *+'d ІK ?l1SEF@@(@ *+ *+'d ІK/ ?l1SEG@@(? *+ *+'d ІK ?l1SEH@@(> *+ *+'dІK؞ ?l1SEI@@(= *+ *+'dІK0 ?l1SEJ@@(< *+ *+'dІKq ?l1SEK@@(; *+ *+'dІK ?l1SEL@@(: *+ *+'dІK ?l1SEM@@(9 *+ *+'dІKS ?l1SEN@@(8 *+ *+'dІK ?l1SEO@@(7 *+ *+'dІK ?l1SEP@@(6 *+ *+'dІK5 ?l1SEQ@@(5 *+ *+'dІK ?l1SER@@(4 *+ *+'dІK֡ ?l1SES@@(3 *+ *+'dІK ?l1SET@@(2 *+ *+'dІKv ?l1SEU@@(1 *+ *+'dІK ?l1SEV@@(0 *+ *+'dІK ?l1SEW@@(/ *+ *+'dІKW ?l1SEX@@(. *+ *+'dІK ?l1SEY@@(- *+ *+'dІK ?l1SEZ@@(, *+ *+'d ІK9 ?l1SE[@@(+ *+ *+'d!ІK| ?l1SE\@@(* *+ *+'d"ІKؤ ?l1SE]@@() *+ *+'d#ІK ?l1SE^@@(( *+ *+'d$ІK{ ?l1SE_@@(' *+ *+'d%ІK ?l1SE`@@(& *+ *+'d&ІK ?l1SEa@@(% *+ *+'d'ІK\ ?l1SEb@@($ *+ *+'d(ІK ?l1SEc@@(# *+ *+'d)ІKߦ ?l1SEd@@(" *+ *+'d*ІK> ?l1SEe@@(! *+ *+'d+ІK ?l1SEf@@( *+ *+'d,ІKާ ?l1SEg@@( *+ *+'d-ІK( ?l1SEh@@( *+ *+'d.ІKe ?l1SEi@@( *+ *+'d/ІK ?l1SEj@@( *+ *+'d0ІK ?l1SEk@@( *+ *+'d1ІKa ?l1SEl@@( *+ *+'d2ІK ?l1SEm@@( *+ *+'d3ІK ?l1SEn@@( *+ *+'d4ІKB ?l1SEo@@( *+ *+'d5ІK ?l1SEp@@( *+ *+'d6ІKɪ ?l1SEq@@( *+ *+'d7ІK$ ?l1SEr@@( *+ *+'d8ІKf ?l1SEs@@( *+ *+'d9ІKī ?l1SEt@@( *+ *+'d:ІK ?l1SEu@@( *+ *+'d;ІKH ?l1SEv@@( *+ *+'d<ІK ?l1SEw@@( *+ *+'d=ІK ?l1SEx@@( *+ *+'d>ІK* ?l1SEy@@( *+ *+'d?ІK ?l1SEz@@( *+ *+'d@ІKʭ ?l1SE{@@( *+ *+'dAІK* ?l1SE|@@( *+ *+'dBІKl ?l1SE}@@( *+ *+'dCІK ?l1SE~@@( *+ *+'dDІK ?l1SE@@( *+ *+'dEІKL ?l1SE@@( *+ *+'dFІK ?l1SE@@( *+ *+'dGІK ?l1SE@@( *+ *+'dHІK. ?l1SE@@( *+ *+'dIІK ?l1SE@@( *+ *+'dJІKϰ ?l1SE@@( *+ *+'dKІK ?l1SE@@( *+ *+'dLІKo ?l1SE@@' *+ *+'dMІK ?l1SE@@' *+ *+'dNІK ?l1SE@@' *+ *+'dOІKR ?l1SE@@' *+ *+'dPІK ?l1SE@@' *+ *+'dQІK ?l1SE@@' *+ *+'dRІK3 ?l1SE@@' *+ *+'dSІK~ ?l1SE@@' *+ *+'dTІK ?l1SE@@' *+ *+'dUІK ?l1SE@@' *+ *+'dVІKt ?l1SE@@' *+ *+'dWІK ?l1SE@@' *+ *+'dXІK ?l1SE@@' *+ *+'dYІKV ?l1SE@@' *+ *+'dZІK ?l1SE@@' *+ *+'d[ІKص ?l1SE@@' *+ *+'d\ІK8 ?l1SE@@' *+ *+'d]ІKz ?l1SE@@' *+ *+'d^ІKض ?l1SE@@' *+ *+'d_ІK ?l1SE@@' *+ *+'d`ІK\ ?l1SE@@' *+ *+'daІK ?l1SE@@' *+ *+'dbІK ?l1SE@@' *+ *+'dcІKZ ?l1SE@@' *+ *+'ddІK ?l1SE@@' *+ *+'deІK޸ ?l1SE@@' *+ *+'dfІK= ?l1SE@@' *+ *+'dgІK~ ?l1SE@@' *+ *+'dhІK ?l1SE@@' *+ *+'diІK ?l1SE@@' *+ *+'djІKj ?l1SE@@' *+ *+'dkІK ?l1SE@@' *+ *+'dlІK ?l1SE@@' *+ *+'dmІKC ?l1SE@@' *+ *+'dnІK ?l1SE@@' *+ *+'doІK ?l1SE@@' *+ *+'dpІK% ?l1SE@@' *+ *+'dqІK ?l1SE@@' *+ *+'drІKż ?l1SE@@' *+ *+'dsІK# ?l1SE@@' *+ *+'dtІKd ?l1SE@@' *+ *+'duІK ?l1SE@@' *+ *+'dvІK ?l1SE@@' *+ *+'dwІKG ?l1SE@@' *+ *+'dxІK ?l1SE@@' *+ *+'dyІK ?l1SE@@' *+ *+'dzІK* ?l1SE@@' *+ *+'d{ІK ?l1SE@@' *+ *+'d|ІKɿ ?l1SE@@' *+ *+'d}ІK ?l1SE@@' *+ *+'d~ІKj ?l1SE@@' *+ *+'dІK ?l1SE@@' *+ *+'dІK ?l1SE@@' *+ *+'dІKK ?l1SE@@' *+ *+'dІK ?l1SE@@' *+ *+'dІK ?l1SE@@' *+ *+'dІK. ?l1SE@@' *+ *+'dІKo ?l1SE@@' *+ *+'dІK  ?l1SE@@( *+ *+'dІK <<?l1SE,@@) *+ *+'d@UUІKN VV?l1SEH@@){ *+ *+'4e!mt@ІK ?l1SE@@' *+ *+'eІK ?l1SE@@' *+ *+'eІK/ ?l1SE@@' *+ *+'eІKq ?l1SE@@' *+ *+'eІK ?l1SE@@' *+ *+'eІK ?l1SE@@' *+ *+'eІKT ?l1SE@@' *+ *+'eІK ?l1SE@@' *+ *+'eІK ?l1SE@@' *+ *+'e ІK? ?l1SE@@' *+ *+'e ІK ?l1SE@@' *+ *+'e ІK ?l1SE@@' *+ *+'e ІK ?l1SE@@' *+ *+'e ІKv ?l1SE@@' *+ *+'eІK ?l1SE@@' *+ *+'eІK ?l1SE@@' *+ *+'eІKa ?l1SE@@' *+ *+'eІK ?l1SE@@' *+ *+'eІK ?l1SE@@' *+ *+'eІK: ?l1SE@@' *+ *+'eІK| ?l1SE@@' *+ *+'eІK ?l1SE@@' *+ *+'eІK ?l1SE@@' *+ *+'eІK{ ?l1SE@@' *+ *+'eІK ?l1SE@@' *+ *+'eІK ?l1SE@@' *+ *+'eІK^ ?l1SE@@' *+ *+'eІK ?l1SE@@' *+ *+'eІK ?l1SE@@' *+ *+'eІK? ?l1SE@@' *+ *+'eІK ?l1SE@@' *+ *+'eІK ?l1SE@@' *+ *+'e ІK! ?l1SE@@' *+ *+'e!ІKc ?l1SE@@' *+ *+'e"ІK ?l1SE@@' *+ *+'e#ІK ?l1SE@@' *+ *+'e$ІKa ?l1SE@@' *+ *+'e%ІK ?l1SE@@' *+ *+'e&ІK ?l1SE@@' *+ *+'e'ІKD ?l1SE@@' *+ *+'e(ІK ?l1SE@@' *+ *+'e)ІK ?l1SE@@' *+ *+'e*ІK& ?l1SE@@' *+ *+'e+ІKg ?l1SE@@' *+ *+'e,ІK ?l1SE@@' *+ *+'e-ІK ?l1SE@@' *+ *+'e.ІKI ?l1SE@@' *+ *+'e/ІK ?l1SE@@' *+ *+'e0ІK ?l1SE@@' *+ *+'e1ІKH ?l1SE@@' *+ *+'e2ІK ?l1SE@@' *+ *+'e3ІK ?l1SE@@' *+ *+'e4ІK* ?l1SE@@' *+ *+'e5ІKk ?l1SE@@' *+ *+'e6ІK ?l1SE@@' *+ *+'e7ІK ?l1SE@@' *+ *+'e8ІKG ?l1SE@@' *+ *+'e9ІK ?l1SE@@' *+ *+'e:ІK ?l1SE@@' *+ *+'e;ІK0 ?l1SE@@' *+ *+'e<ІK ?l1SE@@' *+ *+'e=ІK ?l1SE@@' *+ *+'e>ІK ?l1SE@@' *+ *+'e?ІKp ?l1SE@@' *+ *+'e@ІK ?l1SE@@' *+ *+'eAІK ?l1SE@@' *+ *+'eBІKR ?l1SE@@' *+ *+'eCІK ?l1SE@@' *+ *+'eDІK ?l1SE@@'~ *+ *+'eEІKC ?l1SE @@'} *+ *+'eFІK~ ?l1SE @@'| *+ *+'eGІK ?l1SE @@'{ *+ *+'eHІK ?l1SE @@'z *+ *+'eIІKu ?l1SE @@'y *+ *+'eJІK ?l1SE@@'x *+ *+'eKІK ?l1SE@@'w *+ *+'eLІKW ?l1SE@@'v *+ *+'eMІK ?l1SE@@'u *+ *+'eNІK ?l1SE@@'t *+ *+'eOІK8 ?l1SE@@'s *+ *+'ePІK{ ?l1SE@@'r *+ *+'eQІK ?l1SE@@'q *+ *+'eRІK ?l1SE@@'p *+ *+'eSІK] ?l1SE@@'o *+ *+'eTІK ?l1SE@@'n *+ *+'eUІK ?l1SE@@'m *+ *+'eVІK[ ?l1SE@@'l *+ *+'eWІK ?l1SE@@'k *+ *+'eXІK ?l1SE@@'j *+ *+'eYІK= ?l1SE@@'i *+ *+'eZІK ?l1SE@@'h *+ *+'e[ІK ?l1SE@@'g *+ *+'e\ІK ?l1SE @@'f *+ *+'e]ІKa ?l1SE!@@'e *+ *+'e^ІK ?l1SE"@@'d *+ *+'e_ІK ?l1SE#@@'c *+ *+'e`ІKC ?l1SE$@@'b *+ *+'eaІK ?l1SE%@@'a *+ *+'ebІK ?l1SE&@@'` *+ *+'ecІKB ?l1SE'@@'_ *+ *+'edІK ?l1SE(@@'^ *+ *+'eeІK ?l1SE)@@'] *+ *+'efІK$ ?l1SE*@@'\ *+ *+'egІKf ?l1SE+@@'[ *+ *+'ehІK ?l1SE,@@'Z *+ *+'eiІK ?l1SE-@@'Y *+ *+'ejІKH ?l1SE.@@'X *+ *+'ekІK ?l1SE/@@'W *+ *+'elІK ?l1SE0@@'V *+ *+'emІK) ?l1SE1@@'U *+ *+'enІK ?l1SE2@@'T *+ *+'eoІK ?l1SE3@@'S *+ *+'epІK ?l1SE4@@'R *+ *+'eqІKj ?l1SE5@@'Q *+ *+'erІK ?l1SE6@@'P *+ *+'esІK ?l1SE7@@'O *+ *+'etІKM ?l1SE8@@'N *+ *+'euІK ?l1SE9@@'M *+ *+'evІK ?l1SE:@@'L *+ *+'ewІK. ?l1SE;@@'K *+ *+'exІKq ?l1SE<@@'J *+ *+'eyІK ?l1SE=@@'I *+ *+'ezІK ?l1SE>@@'H *+ *+'e{ІK ?l1SE?@@'G *+ *+'e|ІK ?l1SE@@@'F *+ *+'e}ІK ?l1SEA@@'E *+ *+'e~ІKQ ?l1SEB@@'D *+ *+'eІK ?l1SEC@@'C *+ *+'eІK ?l1SED@@'B *+ *+'eІK3 ?l1SEE@@'A *+ *+'eІK} ?l1SEF@@'@ *+ *+'eІK ?l1SEG@@'? *+ *+'eІK ?l1SEH@@'> *+ *+'eІKW ?l1SEI@@'= *+ *+'eІK  ?l1SEJ@@(@ *+ *+'eІK <<?l1SE,K@@) *+ *+'e@UUІK6VV?l1SEHL@@( *+ *+'4f!z {@ІKw?l1SEM@@'9 *+ *+'fІK?l1SEN@@'8 *+ *+'fІK?l1SEO@@'7 *+ *+'fІKY?l1SEP@@'6 *+ *+'fІK?l1SEQ@@'5 *+ *+'fІK?l1SER@@'4 *+ *+'fІK<?l1SES@@'3 *+ *+'fІK?l1SET@@'2 *+ *+'fІK?l1SEU@@'1 *+ *+'f ІK?l1SEV@@'0 *+ *+'f ІK}?l1SEW@@'/ *+ *+'f ІK?l1SEX@@'. *+ *+'f ІK?l1SEY@@'- *+ *+'f ІK]?l1SEZ@@', *+ *+'fІK?l1SE[@@'+ *+ *+'fІK?l1SE\@@'* *+ *+'fІK??l1SE]@@') *+ *+'fІK?l1SE^@@'( *+ *+'fІK?l1SE_@@'' *+ *+'fІK?l1SE`@@'& *+ *+'fІKd?l1SEa@@'% *+ *+'fІK?l1SEb@@'$ *+ *+'fІK?l1SEc@@'# *+ *+'fІKb?l1SEd@@'" *+ *+'fІK?l1SEe@@'! *+ *+'fІK?l1SEf@@' *+ *+'fІKD?l1SEg@@' *+ *+'fІK?l1SEh@@' *+ *+'fІK?l1SEi@@' *+ *+'fІK&?l1SEj@@' *+ *+'fІKh?l1SEk@@' *+ *+'fІK?l1SEl@@' *+ *+'f ІK ?l1SEm@@' *+ *+'f!ІKJ?l1SEn@@' *+ *+'f"ІK?l1SEo@@' *+ *+'f#ІK?l1SEp@@' *+ *+'f$ІKI?l1SEq@@' *+ *+'f%ІK?l1SEr@@' *+ *+'f&ІK?l1SEs@@' *+ *+'f'ІK+?l1SEt@@' *+ *+'f(ІKw?l1SEu@@' *+ *+'f)ІK?l1SEv@@' *+ *+'f*ІK ?l1SEw@@' *+ *+'f+ІKN?l1SEx@@' *+ *+'f,ІK?l1SEy@@' *+ *+'f-ІK?l1SEz@@' *+ *+'f.ІK0?l1SE{@@' *+ *+'f/ІK?l1SE|@@' *+ *+'f0ІK?l1SE}@@' *+ *+'f1ІKD?l1SE~@@' *+ *+'f2ІKl?l1SE@@' *+ *+'f3ІK?l1SE@@' *+ *+'f4ІK ?l1SE@@' *+ *+'f5ІKS ?l1SE@@' *+ *+'f6ІK ?l1SE@@' *+ *+'f7ІK ?l1SE@@' *+ *+'f8ІK5!?l1SE@@' *+ *+'f9ІK!?l1SE@@' *+ *+'f:ІK!?l1SE@@& *+ *+'f;ІK"?l1SE@@& *+ *+'f<ІKu"?l1SE@@& *+ *+'f=ІK"?l1SE@@& *+ *+'f>ІK"?l1SE@@& *+ *+'f?ІKY#?l1SE@@& *+ *+'f@ІK#?l1SE@@& *+ *+'fAІK#?l1SE@@& *+ *+'fBІK9$?l1SE@@& *+ *+'fCІK{$?l1SE@@& *+ *+'fDІK$?l1SE@@& *+ *+'fEІK%?l1SE@@& *+ *+'fFІKe%?l1SE@@& *+ *+'fGІK%?l1SE@@& *+ *+'fHІK%?l1SE@@& *+ *+'fIІK[&?l1SE@@& *+ *+'fJІK&?l1SE@@& *+ *+'fKІK&?l1SE@@& *+ *+'fLІK>'?l1SE@@& *+ *+'fMІK'?l1SE@@& *+ *+'fNІK'?l1SE@@& *+ *+'fOІK (?l1SE@@& *+ *+'fPІKb(?l1SE@@& *+ *+'fQІK(?l1SE@@& *+ *+'fRІK)?l1SE@@& *+ *+'fSІKE)?l1SE@@& *+ *+'fTІK)?l1SE@@& *+ *+'fUІK)?l1SE@@& *+ *+'fVІKC*?l1SE@@& *+ *+'fWІK*?l1SE@@& *+ *+'fXІK*?l1SE@@& *+ *+'fYІK&+?l1SE@@& *+ *+'fZІKh+?l1SE@@& *+ *+'f[ІK+?l1SE@@& *+ *+'f\ІK,?l1SE@@& *+ *+'f]ІKR,?l1SE@@& *+ *+'f^ІK,?l1SE@@& *+ *+'f_ІK,?l1SE@@& *+ *+'f`ІK+-?l1SE@@& *+ *+'faІK-?l1SE@@& *+ *+'fbІK-?l1SE@@& *+ *+'fcІK).?l1SE@@& *+ *+'fdІKk.?l1SE@@& *+ *+'feІK.?l1SE@@& *+ *+'ffІK /?l1SE@@& *+ *+'fgІKM/?l1SE@@& *+ *+'fhІK/?l1SE@@& *+ *+'fiІK/?l1SE@@& *+ *+'fjІK/0?l1SE@@& *+ *+'fkІK0?l1SE@@& *+ *+'flІK0?l1SE@@& *+ *+'fmІK1?l1SE@@& *+ *+'fnІKp1?l1SE@@& *+ *+'foІK1?l1SE@@& *+ *+'fpІK1?l1SE@@& *+ *+'fqІKQ2?l1SE@@& *+ *+'frІK2?l1SE@@& *+ *+'fsІK2?l1SE@@& *+ *+'ftІK;3?l1SE@@& *+ *+'fuІKw3?l1SE@@& *+ *+'fvІK3?l1SE@@& *+ *+'fwІK4?l1SE@@& *+ *+'fxІKW4?l1SE@@& *+ *+'fyІK4?l1SE@@& *+ *+'fzІK4?l1SE@@& *+ *+'f{ІKW5?l1SE@@& *+ *+'f|ІK5?l1SE@@& *+ *+'f}ІK5?l1SE@@& *+ *+'f~ІK86?l1SE@@& *+ *+'fІK{6?l1SE@@& *+ *+'fІK6?l1SE@@& *+ *+'fІK7?l1SE@@& *+ *+'fІK\7?l1SE@@& *+ *+'fІK7?l1SE@@& *+ *+'fІK7?l1SE@@& *+ *+'fІK>8?l1SE@@& *+ *+'fІKy8  ?l1SE@@' *+ *+'fІK8<<?l1SE,@@( *+ *+'f@UUІKJVV?l1SEH@@(i *+ *+'4g!@ІK0K?l1SE@@& *+ *+'gІKrK?l1SE@@& *+ *+'gІKK?l1SE@@& *+ *+'gІKL?l1SE@@& *+ *+'gІKRL?l1SE@@& *+ *+'gІKL?l1SE@@& *+ *+'gІKL?l1SE@@& *+ *+'gІKSM?l1SE@@& *+ *+'gІKM?l1SE@@& *+ *+'g ІKM?l1SE@@& *+ *+'g ІK5N?l1SE@@& *+ *+'g ІKN?l1SE@@& *+ *+'g ІKN?l1SE@@& *+ *+'g ІKO?l1SE@@& *+ *+'gІKYO?l1SE@@& *+ *+'gІKO?l1SE@@& *+ *+'gІKO?l1SE@@& *+ *+'gІK;P?l1SE@@& *+ *+'gІKP?l1SE@@& *+ *+'gІKP?l1SE@@& *+ *+'gІK Q?l1SE@@& *+ *+'gІK{Q?l1SE@@& *+ *+'gІKQ?l1SE@@& *+ *+'gІKR?l1SE@@& *+ *+'gІK]R?l1SE@@& *+ *+'gІKR?l1SE@@& *+ *+'gІKR?l1SE@@& *+ *+'gІK@S?l1SE@@& *+ *+'gІKS?l1SE@@& *+ *+'gІKS?l1SE@@& *+ *+'gІK!T?l1SE@@& *+ *+'gІKT?l1SE@@& *+ *+'g ІKT?l1SE@@& *+ *+'g!ІKU?l1SE@@& *+ *+'g"ІKbU?l1SE@@& *+ *+'g#ІKU?l1SE@@& *+ *+'g$ІKV?l1SE@@& *+ *+'g%ІKDV?l1SE@@& *+ *+'g&ІKV?l1SE@@& *+ *+'g'ІKV?l1SE@@& *+ *+'g(ІK&W?l1SE@@& *+ *+'g)ІKpW?l1SE@@& *+ *+'g*ІKW?l1SE@@& *+ *+'g+ІKX?l1SE@@& *+ *+'g,ІKgX?l1SE@@& *+ *+'g-ІKX?l1SE@@& *+ *+'g.ІKX?l1SE@@& *+ *+'g/ІKHY?l1SE@@& *+ *+'g0ІKY?l1SE@@& *+ *+'g1ІKY?l1SE@@& *+ *+'g2ІK+Z?l1SE@@&~ *+ *+'g3ІKeZ?l1SE @@&} *+ *+'g4ІKZ?l1SE @@&| *+ *+'g5ІK [?l1SE @@&{ *+ *+'g6ІKV[?l1SE @@&z *+ *+'g7ІK[?l1SE @@&y *+ *+'g8ІK[?l1SE@@&x *+ *+'g9ІKO\?l1SE@@&w *+ *+'g:ІK\?l1SE@@&v *+ *+'g;ІK\?l1SE@@&u *+ *+'g<ІK3]?l1SE@@&t *+ *+'g=ІKs]?l1SE@@&s *+ *+'g>ІK]?l1SE@@&r *+ *+'g?ІK^?l1SE@@&q *+ *+'g@ІKO^?l1SE@@&p *+ *+'gAІK^?l1SE@@&o *+ *+'gBІK^?l1SE@@&n *+ *+'gCІK:_?l1SE@@&m *+ *+'gDІK_?l1SE@@&l *+ *+'gEІK_?l1SE@@&k *+ *+'gFІK`?l1SE@@&j *+ *+'gGІKy`?l1SE@@&i *+ *+'gHІK`?l1SE@@&h *+ *+'gIІKa?l1SE@@&g *+ *+'gJІKYa?l1SE @@&f *+ *+'gKІKa?l1SE!@@&e *+ *+'gLІKa?l1SE"@@&d *+ *+'gMІK@@&H *+ *+'giІKj?l1SE?@@&G *+ *+'gjІKj?l1SE@@@&F *+ *+'gkІKKk?l1SEA@@&E *+ *+'glІKk?l1SEB@@&D *+ *+'gmІKk?l1SEC@@&C *+ *+'gnІK,l?l1SED@@&B *+ *+'goІKnl?l1SEE@@&A *+ *+'gpІKl?l1SEF@@&@ *+ *+'gqІKm?l1SEG@@&? *+ *+'grІKOm?l1SEH@@&> *+ *+'gsІKm?l1SEI@@&= *+ *+'gtІKm?l1SEJ@@&< *+ *+'guІK,n?l1SEK@@&; *+ *+'gvІKn?l1SEL@@&: *+ *+'gwІKn?l1SEM@@&9 *+ *+'gxІKo?l1SEN@@&8 *+ *+'gyІKro?l1SEO@@&7 *+ *+'gzІKo?l1SEP@@&6 *+ *+'g{ІKp?l1SEQ@@&5 *+ *+'g|ІKNp?l1SER@@&4 *+ *+'g}ІKp?l1SES@@&3 *+ *+'g~ІKp?l1SET@@&2 *+ *+'gІK6q?l1SEU@@&1 *+ *+'gІKq?l1SEV@@&0 *+ *+'gІKq?l1SEW@@&/ *+ *+'gІKr?l1SEX@@&. *+ *+'gІKwr?l1SEY@@&- *+ *+'gІKr?l1SEZ@@&, *+ *+'gІKs?l1SE[@@&+ *+ *+'gІK's  ?l1SE\@@'. *+ *+'gІK.s<<?l1SE,]@@' *+ *+'g@UUІKiVV?l1SEH^@@' *+ *+'4h!*d@ІK ?l1SE_@@&' *+ *+'hІKZ?l1SE`@@&& *+ *+'hІK?l1SEa@@&% *+ *+'hІK?l1SEb@@&$ *+ *+'hІKH?l1SEc@@&# *+ *+'hІK?l1SEd@@&" *+ *+'hІK?l1SEe@@&! *+ *+'hІKA?l1SEf@@& *+ *+'hІK?l1SEg@@& *+ *+'h ІKш?l1SEh@@& *+ *+'h ІK$?l1SEi@@& *+ *+'h ІK_?l1SEj@@& *+ *+'h ІK?l1SEk@@& *+ *+'h ІK?l1SEl@@& *+ *+'hІKA?l1SEm@@& *+ *+'hІK?l1SEn@@& *+ *+'hІK?l1SEo@@& *+ *+'hІK+?l1SEp@@& *+ *+'hІK?l1SEq@@& *+ *+'hІKË?l1SEr@@& *+ *+'hІK?l1SEs@@& *+ *+'hІKj?l1SEt@@& *+ *+'hІK?l1SEu@@& *+ *+'hІK ?l1SEv@@& *+ *+'hІKK?l1SEw@@& *+ *+'hІK?l1SEx@@& *+ *+'hІK?l1SEy@@& *+ *+'hІK(?l1SEz@@& *+ *+'hІK?l1SE{@@& *+ *+'hІKǎ?l1SE|@@& *+ *+'hІK?l1SE}@@& *+ *+'hІKo?l1SE~@@& *+ *+'h ІK?l1SE@@& *+ *+'h!ІK?l1SE@@& *+ *+'h"ІKQ?l1SE@@& *+ *+'h#ІK?l1SE@@& *+ *+'h$ІK?l1SE@@& *+ *+'h%ІK,?l1SE@@& *+ *+'h&ІKw?l1SE@@& *+ *+'h'ІKӑ?l1SE@@& *+ *+'h(ІK?l1SE@@% *+ *+'h)ІKb?l1SE@@% *+ *+'h*ІK?l1SE@@% *+ *+'h+ІK?l1SE@@% *+ *+'h,ІKU?l1SE@@% *+ *+'h-ІK?l1SE@@% *+ *+'h.ІK?l1SE@@% *+ *+'h/ІK8?l1SE@@% *+ *+'h0ІKq?l1SE@@% *+ *+'h1ІKؔ?l1SE@@% *+ *+'h2ІK?l1SE@@% *+ *+'h3ІK`?l1SE@@% *+ *+'h4ІK?l1SE@@% *+ *+'h5ІK?l1SE@@% *+ *+'h6ІK9?l1SE@@% *+ *+'h7ІK?l1SE@@% *+ *+'h8ІKܖ?l1SE@@% *+ *+'h9ІK<?l1SE@@% *+ *+'h:ІKw?l1SE@@% *+ *+'h;ІKė?l1SE@@% *+ *+'h<ІK?l1SE@@% *+ *+'h=ІK^?l1SE@@% *+ *+'h>ІK?l1SE@@% *+ *+'h?ІK?l1SE@@% *+ *+'h@ІK=?l1SE@@% *+ *+'hAІK?l1SE@@% *+ *+'hBІKݙ?l1SE@@% *+ *+'hCІK ?l1SE@@% *+ *+'hDІK?l1SE@@% *+ *+'hEІK?l1SE@@% *+ *+'hFІK?l1SE@@% *+ *+'hGІKg?l1SE@@% *+ *+'hHІK?l1SE@@% *+ *+'hIІK?l1SE@@% *+ *+'hJІK@?l1SE@@% *+ *+'hKІK?l1SE@@% *+ *+'hLІK?l1SE@@% *+ *+'hMІK#?l1SE@@% *+ *+'hNІK?l1SE@@% *+ *+'hOІKÝ?l1SE@@% *+ *+'hPІK?l1SE@@% *+ *+'hQІKk?l1SE@@% *+ *+'hRІK?l1SE@@% *+ *+'hSІK?l1SE@@% *+ *+'hTІKM?l1SE@@% *+ *+'hUІK?l1SE@@% *+ *+'hVІK?l1SE@@% *+ *+'hWІK'?l1SE@@% *+ *+'hXІKk?l1SE@@% *+ *+'hYІKР?l1SE@@% *+ *+'hZІK ?l1SE@@% *+ *+'h[ІKQ?l1SE@@% *+ *+'h\ІK?l1SE@@% *+ *+'h]ІK?l1SE@@% *+ *+'h^ІKR?l1SE@@% *+ *+'h_ІK?l1SE@@% *+ *+'h`ІK΢?l1SE@@% *+ *+'haІK4?l1SE@@% *+ *+'hbІKn?l1SE@@% *+ *+'hcІKԣ?l1SE@@% *+ *+'hdІK ?l1SE@@% *+ *+'heІKU?l1SE@@% *+ *+'hfІK?l1SE@@% *+ *+'hgІK?l1SE@@% *+ *+'hhІK2?l1SE@@% *+ *+'hiІK?l1SE@@% *+ *+'hjІKѥ?l1SE@@% *+ *+'hkІK8?l1SE@@% *+ *+'hlІKr?l1SE@@% *+ *+'hmІK?l1SE@@% *+ *+'hnІK?l1SE@@% *+ *+'hoІKU?l1SE@@% *+ *+'hpІK?l1SE@@% *+ *+'hqІK?l1SE@@% *+ *+'hrІK7?l1SE@@% *+ *+'hsІK?l1SE@@% *+ *+'htІK֨?l1SE@@% *+ *+'huІK?l1SE@@% *+ *+'hvІKw?l1SE@@% *+ *+'hwІK?l1SE@@% *+ *+'hxІK?l1SE@@% *+ *+'hyІKa?l1SE@@% *+ *+'hzІK?l1SE@@% *+ *+'h{ІK?l1SE@@% *+ *+'h|ІK:?l1SE@@% *+ *+'h}ІK?l1SE@@% *+ *+'h~ІK۫?l1SE@@% *+ *+'hІK?l1SE@@% *+ *+'hІK?l1SE@@% *+ *+'hІK?l1SE@@% *+ *+'hІK?l1SE@@% *+ *+'hІKf?l1SE@@% *+ *+'hІK?l1SE@@% *+ *+'hІK?l1SE@@% *+ *+'hІK  ?l1SE@@& *+ *+'hІK<<?l1SE,@@'t *+ *+'h@UUІKVV?l1SEH@@'W *+ *+'4i!@ІK?l1SE@@% *+ *+'iІK*?l1SE@@% *+ *+'iІK?l1SE@@% *+ *+'iІK?l1SE@@% *+ *+'iІK ?l1SE@@% *+ *+'iІKl?l1SE@@% *+ *+'iІK?l1SE@@% *+ *+'iІK?l1SE@@% *+ *+'iІKE?l1SE@@% *+ *+'i ІK?l1SE@@% *+ *+'i ІK?l1SE@@% *+ *+'i ІK'?l1SE@@% *+ *+'i ІKo?l1SE@@% *+ *+'i ІK?l1SE@@% *+ *+'iІK ?l1SE@@% *+ *+'iІKp?l1SE@@% *+ *+'iІK?l1SE@@% *+ *+'iІK?l1SE@@% *+ *+'iІKR?l1SE@@% *+ *+'iІK?l1SE@@% *+ *+'iІK?l1SE@@% *+ *+'iІK-?l1SE@@% *+ *+'iІKo?l1SE@@% *+ *+'iІK?l1SE@@% *+ *+'iІK?l1SE@@% *+ *+'iІKV?l1SE@@% *+ *+'iІK?l1SE@@% *+ *+'iІK?l1SE@@% *+ *+'iІKW?l1SE@@% *+ *+'iІK?l1SE@@% *+ *+'iІK?l1SE@@% *+ *+'iІK8?l1SE@@% *+ *+'i ІKr?l1SE@@%~ *+ *+'i!ІK?l1SE @@%} *+ *+'i"ІK?l1SE @@%| *+ *+'i#ІKT?l1SE @@%{ *+ *+'i$ІK?l1SE @@%z *+ *+'i%ІK?l1SE @@%y *+ *+'i&ІK;?l1SE@@%x *+ *+'i'ІK?l1SE@@%w *+ *+'i(ІK?l1SE@@%v *+ *+'i)ІK?l1SE@@%u *+ *+'i*ІK?l1SE@@%t *+ *+'i+ІK?l1SE@@%s *+ *+'i,ІK ?l1SE@@%r *+ *+'i-ІKY?l1SE@@%q *+ *+'i.ІK?l1SE@@%p *+ *+'i/ІK?l1SE@@%o *+ *+'i0ІK;?l1SE@@%n *+ *+'i1ІK?l1SE@@%m *+ *+'i2ІK?l1SE@@%l *+ *+'i3ІK?l1SE@@%k *+ *+'i4ІK?l1SE@@%j *+ *+'i5ІK?l1SE@@%i *+ *+'i6ІK?l1SE@@%h *+ *+'i7ІKe?l1SE@@%g *+ *+'i8ІK?l1SE @@%f *+ *+'i9ІK?l1SE!@@%e *+ *+'i:ІK@?l1SE"@@%d *+ *+'i;ІK?l1SE#@@%c *+ *+'i<ІK?l1SE$@@%b *+ *+'i=ІK!?l1SE%@@%a *+ *+'i>ІKh?l1SE&@@%` *+ *+'i?ІK?l1SE'@@%_ *+ *+'i@ІK?l1SE(@@%^ *+ *+'iAІKj?l1SE)@@%] *+ *+'iBІK?l1SE*@@%\ *+ *+'iCІK?l1SE+@@%[ *+ *+'iDІKL?l1SE,@@%Z *+ *+'iEІK?l1SE-@@%Y *+ *+'iFІK?l1SE.@@%X *+ *+'iGІK.?l1SE/@@%W *+ *+'iHІKg?l1SE0@@%V *+ *+'iIІK?l1SE1@@%U *+ *+'iJІK?l1SE2@@%T *+ *+'iKІKU?l1SE3@@%S *+ *+'iLІK?l1SE4@@%R *+ *+'iMІK?l1SE5@@%Q *+ *+'iNІKQ?l1SE6@@%P *+ *+'iOІK?l1SE7@@%O *+ *+'iPІK?l1SE8@@%N *+ *+'iQІK+?l1SE9@@%M *+ *+'iRІKl?l1SE:@@%L *+ *+'iSІK?l1SE;@@%K *+ *+'iTІK?l1SE<@@%J *+ *+'iUІKm?l1SE=@@%I *+ *+'iVІK?l1SE>@@%H *+ *+'iWІK?l1SE?@@%G *+ *+'iXІK4?l1SE@@@%F *+ *+'iYІK?l1SEA@@%E *+ *+'iZІK?l1SEB@@%D *+ *+'i[ІK?l1SEC@@%C *+ *+'i\ІKq?l1SED@@%B *+ *+'i]ІK?l1SEE@@%A *+ *+'i^ІK?l1SEF@@%@ *+ *+'i_ІKT?l1SEG@@%? *+ *+'i`ІK?l1SEH@@%> *+ *+'iaІK?l1SEI@@%= *+ *+'ibІK4?l1SEJ@@%< *+ *+'icІK?l1SEK@@%; *+ *+'idІK?l1SEL@@%: *+ *+'ieІK"?l1SEM@@%9 *+ *+'ifІKv?l1SEN@@%8 *+ *+'igІK?l1SEO@@%7 *+ *+'ihІK?l1SEP@@%6 *+ *+'iiІKY?l1SEQ@@%5 *+ *+'ijІK?l1SER@@%4 *+ *+'ikІK ?l1SES@@%3 *+ *+'ilІK8?l1SET@@%2 *+ *+'imІK?l1SEU@@%1 *+ *+'inІK?l1SEV@@%0 *+ *+'ioІK?l1SEW@@%/ *+ *+'ipІK^?l1SEX@@%. *+ *+'iqІK?l1SEY@@%- *+ *+'irІK?l1SEZ@@%, *+ *+'isІKe?l1SE[@@%+ *+ *+'itІK?l1SE\@@%* *+ *+'iuІK?l1SE]@@%) *+ *+'ivІKF?l1SE^@@%( *+ *+'iwІK?l1SE_@@%' *+ *+'ixІK?l1SE`@@%& *+ *+'iyІK)?l1SEa@@%% *+ *+'izІKb?l1SEb@@%$ *+ *+'i{ІK?l1SEc@@%# *+ *+'i|ІK?l1SEd@@%" *+ *+'i}ІKH?l1SEe@@%! *+ *+'i~ІK?l1SEf@@% *+ *+'iІK?l1SEg@@% *+ *+'iІKC?l1SEh@@% *+ *+'iІK?l1SEi@@% *+ *+'iІK?l1SEj@@% *+ *+'iІK,?l1SEk@@% *+ *+'iІKf?l1SEl@@% *+ *+'iІK?l1SEm@@% *+ *+'iІK  ?l1SEn@@& *+ *+'iІK<<?l1SE,o@@& *+ *+'i@UUІKVV?l1SEHp@@& *+ *+'4j!O@ІK?l1SEq@@% *+ *+'jІK ?l1SEr@@% *+ *+'jІKq?l1SEs@@% *+ *+'jІK?l1SEt@@% *+ *+'jІK?l1SEu@@% *+ *+'jІKW?l1SEv@@% *+ *+'jІK?l1SEw@@% *+ *+'jІK?l1SEx@@% *+ *+'jІK.?l1SEy@@% *+ *+'j ІKp?l1SEz@@% *+ *+'j ІK?l1SE{@@% *+ *+'j ІK?l1SE|@@% *+ *+'j ІKW?l1SE}@@% *+ *+'j ІK?l1SE~@@% *+ *+'jІK?l1SE@@% *+ *+'jІKP?l1SE@@% *+ *+'jІK?l1SE@@% *+ *+'jІK?l1SE@@% *+ *+'jІK:?l1SE@@% *+ *+'jІKs?l1SE@@% *+ *+'jІK?l1SE@@% *+ *+'jІK?l1SE@@% *+ *+'jІKV?l1SE@@$ *+ *+'jІK?l1SE@@$ *+ *+'jІK?l1SE@@$ *+ *+'jІK:?l1SE@@$ *+ *+'jІK?l1SE@@$ *+ *+'jІK?l1SE@@$ *+ *+'jІK>?l1SE@@$ *+ *+'jІKx?l1SE@@$ *+ *+'jІK?l1SE@@$ *+ *+'jІK!?l1SE@@$ *+ *+'j ІKY?l1SE@@$ *+ *+'j!ІK?l1SE@@$ *+ *+'j"ІK?l1SE@@$ *+ *+'j#ІKD?l1SE@@$ *+ *+'j$ІK?l1SE@@$ *+ *+'j%ІK?l1SE@@$ *+ *+'j&ІK?l1SE@@$ *+ *+'j'ІK?l1SE@@$ *+ *+'j(ІK?l1SE@@$ *+ *+'j)ІK?l1SE@@$ *+ *+'j*ІKg?l1SE@@$ *+ *+'j+ІK?l1SE@@$ *+ *+'j,ІK ?l1SE@@$ *+ *+'j-ІKA ?l1SE@@$ *+ *+'j.ІK ?l1SE@@$ *+ *+'j/ІK ?l1SE@@$ *+ *+'j0ІK# ?l1SE@@$ *+ *+'j1ІK ?l1SE@@$ *+ *+'j2ІK ?l1SE@@$ *+ *+'j3ІK ?l1SE@@$ *+ *+'j4ІKc ?l1SE@@$ *+ *+'j5ІK ?l1SE@@$ *+ *+'j6ІK ?l1SE@@$ *+ *+'j7ІKM ?l1SE@@$ *+ *+'j8ІK ?l1SE@@$ *+ *+'j9ІK ?l1SE@@$ *+ *+'j:ІK' ?l1SE@@$ *+ *+'j;ІKn ?l1SE@@$ *+ *+'j<ІK ?l1SE@@$ *+ *+'j=ІK?l1SE@@$ *+ *+'j>ІKK?l1SE@@$ *+ *+'j?ІK?l1SE@@$ *+ *+'j@ІK?l1SE@@$ *+ *+'jAІKR?l1SE@@$ *+ *+'jBІK?l1SE@@$ *+ *+'jCІK?l1SE@@$ *+ *+'jDІK,?l1SE@@$ *+ *+'jEІKn?l1SE@@$ *+ *+'jFІK?l1SE@@$ *+ *+'jGІK?l1SE@@$ *+ *+'jHІKO?l1SE@@$ *+ *+'jIІK?l1SE@@$ *+ *+'jJІK?l1SE@@$ *+ *+'jKІK2?l1SE@@$ *+ *+'jLІK?l1SE@@$ *+ *+'jMІK?l1SE@@$ *+ *+'jNІK7?l1SE@@$ *+ *+'jOІKq?l1SE@@$ *+ *+'jPІK?l1SE@@$ *+ *+'jQІK?l1SE@@$ *+ *+'jRІKT?l1SE@@$ *+ *+'jSІK?l1SE@@$ *+ *+'jTІK?l1SE@@$ *+ *+'jUІK6?l1SE@@$ *+ *+'jVІK?l1SE@@$ *+ *+'jWІK?l1SE@@$ *+ *+'jXІK?l1SE@@$ *+ *+'jYІK~?l1SE@@$ *+ *+'jZІK?l1SE@@$ *+ *+'j[ІK?l1SE@@$ *+ *+'j\ІKa?l1SE@@$ *+ *+'j]ІK?l1SE@@$ *+ *+'j^ІK?l1SE@@$ *+ *+'j_ІK;?l1SE@@$ *+ *+'j`ІK?l1SE@@$ *+ *+'jaІK?l1SE@@$ *+ *+'jbІK?l1SE@@$ *+ *+'jcІK?l1SE@@$ *+ *+'jdІK?l1SE@@$ *+ *+'jeІK?l1SE@@$ *+ *+'jfІKe?l1SE@@$ *+ *+'jgІK?l1SE@@$ *+ *+'jhІK?l1SE@@$ *+ *+'jiІK@?l1SE@@$ *+ *+'jjІK?l1SE@@$ *+ *+'jkІK?l1SE@@$ *+ *+'jlІK ?l1SE@@$ *+ *+'jmІKi?l1SE@@$ *+ *+'jnІK?l1SE@@$ *+ *+'joІK?l1SE@@$ *+ *+'jpІKJ?l1SE@@$ *+ *+'jqІK?l1SE@@$ *+ *+'jrІK?l1SE@@$ *+ *+'jsІKM?l1SE@@$ *+ *+'jtІK?l1SE@@$ *+ *+'juІK?l1SE@@$ *+ *+'jvІK-?l1SE@@$ *+ *+'jwІKg?l1SE@@$ *+ *+'jxІK?l1SE@@$ *+ *+'jyІK ?l1SE@@$ *+ *+'jzІKI ?l1SE@@$ *+ *+'j{ІK ?l1SE@@$ *+ *+'j|ІK ?l1SE@@$ *+ *+'j}ІK0!?l1SE@@$ *+ *+'j~ІK!?l1SE@@$ *+ *+'jІK!?l1SE@@$ *+ *+'jІK2"?l1SE@@$ *+ *+'jІKk"?l1SE@@$ *+ *+'jІK"?l1SE@@$ *+ *+'jІK#?l1SE@@$ *+ *+'jІKM#?l1SE@@$ *+ *+'jІK#?l1SE@@$ *+ *+'jІK#  ?l1SE@@% *+ *+'jІK#<<?l1SE,@@&b *+ *+'j@UUІK{6VV?l1SEH@@&E *+ *+'4k!@ІK6?l1SE@@$ *+ *+'kІK6?l1SE@@$ *+ *+'kІKZ7?l1SE@@$ *+ *+'kІK7?l1SE@@$ *+ *+'kІK7?l1SE@@$ *+ *+'kІK:8?l1SE@@$ *+ *+'kІKs8?l1SE@@$ *+ *+'kІK8?l1SE@@$ *+ *+'kІK9?l1SE@@$ *+ *+'k ІKW9?l1SE@@$ *+ *+'k ІK9?l1SE@@$ *+ *+'k ІK9?l1SE@@$ *+ *+'k ІK>:?l1SE@@$ *+ *+'k ІK:?l1SE@@$ *+ *+'kІK:?l1SE@@$~ *+ *+'kІK?;?l1SE @@$} *+ *+'kІKx;?l1SE @@$| *+ *+'kІK;?l1SE @@${ *+ *+'kІK!<?l1SE @@$z *+ *+'kІK\<?l1SE @@$y *+ *+'kІK<?l1SE@@$x *+ *+'kІK=?l1SE@@$w *+ *+'kІK<=?l1SE@@$v *+ *+'kІK=?l1SE@@$u *+ *+'kІK=?l1SE@@$t *+ *+'kІK>?l1SE@@$s *+ *+'kІK>?l1SE@@$r *+ *+'kІK>?l1SE@@$q *+ *+'kІK&??l1SE@@$p *+ *+'kІK_??l1SE@@$o *+ *+'kІK??l1SE@@$n *+ *+'kІK@?l1SE@@$m *+ *+'k ІKB@?l1SE@@$l *+ *+'k!ІK@?l1SE@@$k *+ *+'k"ІK@?l1SE@@$j *+ *+'k#ІK"A?l1SE@@$i *+ *+'k$ІKA?l1SE@@$h *+ *+'k%ІKA?l1SE@@$g *+ *+'k&ІK B?l1SE @@$f *+ *+'k'цK#?l1SE!@@$e *+ *+'k(цKf?l1SE"@@$d *+ *+'k)цK?l1SE#@@$c *+ *+'k*цK?l1SE$@@$b *+ *+'k+цKG?l1SE%@@$a *+ *+'k,цK?l1SE&@@$` *+ *+'k-цK?l1SE'@@$_ *+ *+'k.цK+?l1SE(@@$^ *+ *+'k/цK?l1SE)@@$] *+ *+'k0цK?l1SE*@@$\ *+ *+'k1цK)?l1SE+@@$[ *+ *+'k2цKj?l1SE,@@$Z *+ *+'k3цK?l1SE-@@$Y *+ *+'k4цK ?l1SE.@@$X *+ *+'k5цKL?l1SE/@@$W *+ *+'k6цK?l1SE0@@$V *+ *+'k7цK?l1SE1@@$U *+ *+'k8цK.?l1SE2@@$T *+ *+'k9цK?l1SE3@@$S *+ *+'k:цK?l1SE4@@$R *+ *+'k;цK?l1SE5@@$Q *+ *+'k<цKp?l1SE6@@$P *+ *+'k=цK?l1SE7@@$O *+ *+'k>цK?l1SE8@@$N *+ *+'k?цKQ?l1SE9@@$M *+ *+'k@цK?l1SE:@@$L *+ *+'kAцK?l1SE;@@$K *+ *+'kBцK3?l1SE<@@$J *+ *+'kCцKu?l1SE=@@$I *+ *+'kDцK?l1SE>@@$H *+ *+'kEцK ?l1SE?@@$G *+ *+'kFцKV ?l1SE@@@$F *+ *+'kGцK ?l1SEA@@$E *+ *+'kHцK ?l1SEB@@$D *+ *+'kIцKV ?l1SEC@@$C *+ *+'kJцK ?l1SED@@$B *+ *+'kKцK ?l1SEE@@$A *+ *+'kLцK8 ?l1SEF@@$@ *+ *+'kMцKz ?l1SEG@@$? *+ *+'kNцK ?l1SEH@@$> *+ *+'kOцK ?l1SEI@@$= *+ *+'kPцKl?l1SEh@@$ *+ *+'koцK?l1SEi@@$ *+ *+'kpцK?l1SEj@@$ *+ *+'kqцKK?l1SEk@@$ *+ *+'krцK?l1SEl@@$ *+ *+'ksцK?l1SEm@@$ *+ *+'ktцK-?l1SEn@@$ *+ *+'kuцKo?l1SEo@@$ *+ *+'kvцK?l1SEp@@$ *+ *+'kwцK?l1SEq@@$ *+ *+'kxцK?l1SEr@@$ *+ *+'kyцK?l1SEs@@$ *+ *+'kzцK?l1SEt@@$ *+ *+'k{цK?l1SEu@@$ *+ *+'k|цK?l1SEv@@$ *+ *+'k}цK?l1SEw@@$ *+ *+'k~цK6?l1SEx@@$ *+ *+'kцKt?l1SEy@@$ *+ *+'kцK?l1SEz@@$ *+ *+'kцK?l1SE{@@$ *+ *+'kцKU?l1SE|@@$ *+ *+'kцK?l1SE}@@$ *+ *+'kцK?l1SE~@@$ *+ *+'kцK6?l1SE@@$ *+ *+'kцKj  ?l1SE@@% *+ *+'kцKu<<?l1SE,@@% *+ *+'k@UUцKx.VV?l1SEH@@% *+ *+'4l!p@цK,/?l1SE@@$ *+ *+'lцKj/?l1SE@@$ *+ *+'lцK/?l1SE@@$ *+ *+'lцK 0?l1SE@@$ *+ *+'lцKN0?l1SE@@# *+ *+'lцK0?l1SE@@# *+ *+'lцK0?l1SE@@# *+ *+'lцK[1?l1SE@@# *+ *+'lцK1?l1SE@@# *+ *+'l цK1?l1SE@@# *+ *+'l цK.2?l1SE@@# *+ *+'l цKp2?l1SE@@# *+ *+'l цK2?l1SE@@# *+ *+'l цK3?l1SE@@# *+ *+'lцKP3?l1SE@@# *+ *+'lцK3?l1SE@@# *+ *+'lцK3?l1SE@@# *+ *+'lцK44?l1SE@@# *+ *+'lцK4?l1SE@@# *+ *+'lцK4?l1SE@@# *+ *+'lцK5?l1SE@@# *+ *+'lцKu5?l1SE@@# *+ *+'lцK5?l1SE@@# *+ *+'lцK6?l1SE@@# *+ *+'lцKV6?l1SE@@# *+ *+'lцK6?l1SE@@# *+ *+'lцK6?l1SE@@# *+ *+'lцK97?l1SE@@# *+ *+'lцK7?l1SE@@# *+ *+'lцK7?l1SE@@# *+ *+'lцK8?l1SE@@# *+ *+'lцK{8?l1SE@@# *+ *+'l цK8?l1SE@@# *+ *+'l!цK8?l1SE@@# *+ *+'l"цK[9?l1SE@@# *+ *+'l#цK9?l1SE@@# *+ *+'l$цK9?l1SE@@# *+ *+'l%цK<:?l1SE@@# *+ *+'l&цK:?l1SE@@# *+ *+'l'цK:?l1SE@@# *+ *+'l(цK ;?l1SE@@# *+ *+'l)цKa;?l1SE@@# *+ *+'l*цK;?l1SE@@# *+ *+'l+цK<?l1SE@@# *+ *+'l,цKa<?l1SE@@# *+ *+'l-цK<?l1SE@@# *+ *+'l.цK<?l1SE@@# *+ *+'l/цKC=?l1SE@@# *+ *+'l0цK=?l1SE@@# *+ *+'l1цK=?l1SE@@# *+ *+'l2цK$>?l1SE@@# *+ *+'l3цKg>?l1SE@@# *+ *+'l4цK>?l1SE@@# *+ *+'l5цK??l1SE@@# *+ *+'l6цKG??l1SE@@# *+ *+'l7цK??l1SE@@# *+ *+'l8цK??l1SE@@# *+ *+'l9цKG@?l1SE@@# *+ *+'l:цK@?l1SE@@# *+ *+'l;цK@?l1SE@@# *+ *+'l<цK(A?l1SE@@# *+ *+'l=цKjA?l1SE@@# *+ *+'l>цKA?l1SE@@# *+ *+'l?цK B?l1SE@@# *+ *+'l@цKGB?l1SE@@# *+ *+'lAцKB?l1SE@@# *+ *+'lBцKB?l1SE@@# *+ *+'lCцK*C?l1SE@@# *+ *+'lDцKC?l1SE@@# *+ *+'lEцKC?l1SE@@# *+ *+'lFцK D?l1SE@@# *+ *+'lGцKkD?l1SE@@# *+ *+'lHцKD?l1SE@@# *+ *+'lIцK E?l1SE@@# *+ *+'lJцKME?l1SE@@# *+ *+'lKцKE?l1SE@@# *+ *+'lLцKE?l1SE@@# *+ *+'lMцK.F?l1SE@@# *+ *+'lNцKF?l1SE@@# *+ *+'lOцKF?l1SE@@# *+ *+'lPцKG?l1SE@@# *+ *+'lQцKoG?l1SE@@# *+ *+'lRцKG?l1SE@@# *+ *+'lSцKG?l1SE@@# *+ *+'lTцKRH?l1SE@@# *+ *+'lUцKH?l1SE@@# *+ *+'lVцKH?l1SE@@# *+ *+'lWцK3I?l1SE@@# *+ *+'lXцKuI?l1SE@@# *+ *+'lYцKI?l1SE@@# *+ *+'lZцKJ?l1SE@@# *+ *+'l[цKWJ?l1SE@@# *+ *+'l\цKJ?l1SE@@# *+ *+'l]цKJ?l1SE@@# *+ *+'l^цKVK?l1SE@@# *+ *+'l_цKK?l1SE@@# *+ *+'l`цKK?l1SE@@# *+ *+'laцK8L?l1SE@@# *+ *+'lbцKzL?l1SE@@# *+ *+'lcцKL?l1SE@@# *+ *+'ldцKM?l1SE@@# *+ *+'leцK\M?l1SE@@# *+ *+'lfцKM?l1SE@@# *+ *+'lgцKM?l1SE@@# *+ *+'lhцK=N?l1SE@@# *+ *+'liцKN?l1SE@@# *+ *+'ljцKN?l1SE@@# *+ *+'lkцKq?l1SE$@@#b *+ *+'mцKq?l1SE%@@#a *+ *+'mцKq?l1SE&@@#` *+ *+'mцK r?l1SE'@@#_ *+ *+'mцKr?l1SE(@@#^ *+ *+'mцKr?l1SE)@@#] *+ *+'mцKs?l1SE*@@#\ *+ *+'mцKas?l1SE+@@#[ *+ *+'m цKs?l1SE,@@#Z *+ *+'m!цKs?l1SE-@@#Y *+ *+'m"цKDt?l1SE.@@#X *+ *+'m#цKt?l1SE/@@#W *+ *+'m$цKt?l1SE0@@#V *+ *+'m%цK%u?l1SE1@@#U *+ *+'m&цKfu?l1SE2@@#T *+ *+'m'цKu?l1SE3@@#S *+ *+'m(цKv?l1SE4@@#R *+ *+'m)цKIv?l1SE5@@#Q *+ *+'m*цKv?l1SE6@@#P *+ *+'m+цKv?l1SE7@@#O *+ *+'m,цKGw?l1SE8@@#N *+ *+'m-цKw?l1SE9@@#M *+ *+'m.цKw?l1SE:@@#L *+ *+'m/цK)x?l1SE;@@#K *+ *+'m0цKkx?l1SE<@@#J *+ *+'m1цKx?l1SE=@@#I *+ *+'m2цK y?l1SE>@@#H *+ *+'m3цKMy?l1SE?@@#G *+ *+'m4цKy?l1SE@@@#F *+ *+'m5цKy?l1SEA@@#E *+ *+'m6цK/z?l1SEB@@#D *+ *+'m7цKz?l1SEC@@#C *+ *+'m8цKz?l1SED@@#B *+ *+'m9цK.{?l1SEE@@#A *+ *+'m:цKp{?l1SEF@@#@ *+ *+'m;цK{?l1SEG@@#? *+ *+'m<цK|?l1SEH@@#> *+ *+'m=цKR|?l1SEI@@#= *+ *+'m>цK|?l1SEJ@@#< *+ *+'m?цK|?l1SEK@@#; *+ *+'m@цK4}?l1SEL@@#: *+ *+'mAцK}?l1SEM@@#9 *+ *+'mBцK}?l1SEN@@#8 *+ *+'mCцK~?l1SEO@@#7 *+ *+'mDцKu~?l1SEP@@#6 *+ *+'mEцK~?l1SEQ@@#5 *+ *+'mFцK~?l1SER@@#4 *+ *+'mGцKV?l1SES@@#3 *+ *+'mHцK?l1SET@@#2 *+ *+'mIцK?l1SEU@@#1 *+ *+'mJцK8?l1SEV@@#0 *+ *+'mKцKz?l1SEW@@#/ *+ *+'mLцK؀?l1SEX@@#. *+ *+'mMцK?l1SEY@@#- *+ *+'mNцKx?l1SEZ@@#, *+ *+'mOцK?l1SE[@@#+ *+ *+'mPцK?l1SE\@@#* *+ *+'mQцK[?l1SE]@@#) *+ *+'mRцK?l1SE^@@#( *+ *+'mSцKނ?l1SE_@@#' *+ *+'mTцK<?l1SE`@@#& *+ *+'mUцK}?l1SEa@@#% *+ *+'mVцK݃?l1SEb@@#$ *+ *+'mWцK?l1SEc@@## *+ *+'mXцK`?l1SEd@@#" *+ *+'mYцK?l1SEe@@#! *+ *+'mZцK?l1SEf@@# *+ *+'m[цKB?l1SEg@@# *+ *+'m\цK?l1SEh@@# *+ *+'m]цK?l1SEi@@# *+ *+'m^цKA?l1SEj@@# *+ *+'m_цK?l1SEk@@# *+ *+'m`цKņ?l1SEl@@# *+ *+'maцK#?l1SEm@@# *+ *+'mbцKe?l1SEn@@# *+ *+'mcцKÇ?l1SEo@@# *+ *+'mdцK?l1SEp@@# *+ *+'meцKG?l1SEq@@# *+ *+'mfцK?l1SEr@@# *+ *+'mgцK?l1SEs@@# *+ *+'mhцK)?l1SEt@@# *+ *+'miцK?l1SEu@@# *+ *+'mjцKɉ?l1SEv@@# *+ *+'mkцK'?l1SEw@@# *+ *+'mlцKi?l1SEx@@# *+ *+'mmцK?l1SEy@@# *+ *+'mnцK ?l1SEz@@# *+ *+'moцKL?l1SE{@@# *+ *+'mpцK?l1SE|@@# *+ *+'mqцK?l1SE}@@# *+ *+'mrцK.?l1SE~@@# *+ *+'msцK?l1SE@@# *+ *+'mtцK͌?l1SE@@# *+ *+'muцK?l1SE@@# *+ *+'mvцKn?l1SE@@# *+ *+'mwцK?l1SE@@# *+ *+'mxцK?l1SE@@# *+ *+'myцKP?l1SE@@# *+ *+'mzцK?l1SE@@# *+ *+'m{цK?l1SE@@" *+ *+'m|цK2?l1SE@@" *+ *+'m}цKs?l1SE@@" *+ *+'m~цKҏ?l1SE@@" *+ *+'mцK?l1SE@@" *+ *+'mцKr?l1SE@@" *+ *+'mцK?l1SE@@" *+ *+'mцK?l1SE@@" *+ *+'mцKT?l1SE@@" *+ *+'mцK?l1SE@@" *+ *+'mцKؑ?l1SE@@" *+ *+'mцK  ?l1SE@@# *+ *+'mцK<<?l1SE,@@$ *+ *+'m@UUцK!VV?l1SEH@@$ *+ *+'4n!ޔ@цKؤ?l1SE@@" *+ *+'nцK?l1SE@@" *+ *+'nцKx?l1SE@@" *+ *+'nцK?l1SE@@" *+ *+'nцK?l1SE@@" *+ *+'nцK[?l1SE@@" *+ *+'nцK?l1SE@@" *+ *+'nцK?l1SE@@" *+ *+'nцK>?l1SE@@" *+ *+'n цK~?l1SE@@" *+ *+'n цKܧ?l1SE@@" *+ *+'n цK?l1SE@@" *+ *+'n цKa?l1SE@@" *+ *+'n цK?l1SE@@" *+ *+'nцK?l1SE@@" *+ *+'nцK_?l1SE@@" *+ *+'nцK?l1SE@@" *+ *+'nцK?l1SE@@" *+ *+'nцKA?l1SE@@" *+ *+'nцK?l1SE@@" *+ *+'nцKĪ?l1SE@@" *+ *+'nцK#?l1SE@@" *+ *+'nцKe?l1SE@@" *+ *+'nцKë?l1SE@@" *+ *+'nцK?l1SE@@" *+ *+'nцKH?l1SE@@" *+ *+'nцK?l1SE@@" *+ *+'nцK?l1SE@@" *+ *+'nцKG?l1SE@@" *+ *+'nцK?l1SE@@" *+ *+'nцKɭ?l1SE@@" *+ *+'nцK'?l1SE@@" *+ *+'n цKi?l1SE@@" *+ *+'n!цK?l1SE@@" *+ *+'n"цK ?l1SE@@" *+ *+'n#цKL?l1SE@@" *+ *+'n$цK?l1SE@@" *+ *+'n%цK?l1SE@@" *+ *+'n&цK.?l1SE@@" *+ *+'n'цK?l1SE@@" *+ *+'n(цKΰ?l1SE@@" *+ *+'n)цK?l1SE@@" *+ *+'n*цKn?l1SE@@" *+ *+'n+цK?l1SE@@" *+ *+'n,цK?l1SE@@" *+ *+'n-цKP?l1SE@@" *+ *+'n.цK?l1SE@@" *+ *+'n/цK?l1SE@@" *+ *+'n0цK2?l1SE@@" *+ *+'n1цK?l1SE@@" *+ *+'n2цKҳ?l1SE@@" *+ *+'n3цK?l1SE@@" *+ *+'n4цKs?l1SE@@" *+ *+'n5цK?l1SE@@" *+ *+'n6цK?l1SE@@" *+ *+'n7цKU?l1SE@@" *+ *+'n8цK?l1SE@@" *+ *+'n9цK?l1SE@@" *+ *+'n:цK7?l1SE@@" *+ *+'n;цKy?l1SE@@" *+ *+'n<цKض?l1SE@@" *+ *+'n=цK?l1SE@@" *+ *+'n>цKZ?l1SE@@" *+ *+'n?цK?l1SE@@" *+ *+'n@цK?l1SE@@" *+ *+'nAцKY?l1SE@@" *+ *+'nBцK?l1SE@@" *+ *+'nCцKݸ?l1SE@@" *+ *+'nDцK;?l1SE@@" *+ *+'nEцK}?l1SE@@" *+ *+'nFцK?l1SE@@" *+ *+'nGцK?l1SE@@" *+ *+'nHцK_?l1SE@@" *+ *+'nIцK?l1SE@@" *+ *+'nJцK?l1SE@@" *+ *+'nKцK@?l1SE@@" *+ *+'nLцK?l1SE@@" *+ *+'nMцK?l1SE@@" *+ *+'nNцK@?l1SE@@" *+ *+'nOцK?l1SE@@" *+ *+'nPцKü?l1SE@@" *+ *+'nQцK"?l1SE@@" *+ *+'nRцKc?l1SE@@" *+ *+'nSцK?l1SE@@" *+ *+'nTцK?l1SE@@" *+ *+'nUцKE?l1SE@@" *+ *+'nVцK?l1SE@@" *+ *+'nWцK?l1SE@@" *+ *+'nXцK(?l1SE@@" *+ *+'nYцK?l1SE@@" *+ *+'nZцKȿ?l1SE@@" *+ *+'n[цK ?l1SE@@" *+ *+'n\цKi?l1SE@@" *+ *+'n]цK?l1SE@@" *+ *+'n^цK ?l1SE@@" *+ *+'n_цKJ?l1SE@@" *+ *+'n`цK?l1SE@@" *+ *+'naцK?l1SE@@" *+ *+'nbцK,?l1SE@@" *+ *+'ncцK?l1SE@@" *+ *+'ndцK?l1SE@@" *+ *+'neцK?l1SE@@" *+ *+'nfцKm?l1SE@@" *+ *+'ngцK?l1SE@@" *+ *+'nhцK?l1SE@@" *+ *+'niцKO?l1SE@@" *+ *+'njцK?l1SE@@" *+ *+'nkцK?l1SE@@" *+ *+'nlцK1?l1SE@@" *+ *+'nmцKr?l1SE@@" *+ *+'nnцK?l1SE@@" *+ *+'noцK?l1SE@@" *+ *+'npцKU?l1SE@@" *+ *+'nqцK?l1SE@@" *+ *+'nrцK?l1SE@@" *+ *+'nsцKS?l1SE@@"~ *+ *+'ntцK?l1SE @@"} *+ *+'nuцK?l1SE @@"| *+ *+'nvцK5?l1SE @@"{ *+ *+'nwцKv?l1SE @@"z *+ *+'nxцK?l1SE @@"y *+ *+'nyцK?l1SE@@"x *+ *+'nzцKZ?l1SE@@"w *+ *+'n{цK?l1SE@@"v *+ *+'n|цK?l1SE@@"u *+ *+'n}цK;?l1SE@@"t *+ *+'n~цK?l1SE@@"s *+ *+'nцK?l1SE@@"r *+ *+'nцK:?l1SE@@"q *+ *+'nцK|?l1SE@@"p *+ *+'nцK?l1SE@@"o *+ *+'nцK?l1SE@@"n *+ *+'nцK^?l1SE@@"m *+ *+'nцK?l1SE@@"l *+ *+'nцK  ?l1SE@@#o *+ *+'nцK<<?l1SE,@@$> *+ *+'n@UUцK VV?l1SEH@@$! *+ *+'4o!*'@цK?l1SE@@"h *+ *+'oцK?l1SE@@"g *+ *+'oцK`?l1SE @@"f *+ *+'oцK?l1SE!@@"e *+ *+'oцK?l1SE"@@"d *+ *+'oцKB?l1SE#@@"c *+ *+'oцK?l1SE$@@"b *+ *+'oцK?l1SE%@@"a *+ *+'oцK$?l1SE&@@"` *+ *+'o цKg?l1SE'@@"_ *+ *+'o цK?l1SE(@@"^ *+ *+'o цK?l1SE)@@"] *+ *+'o цKG?l1SE*@@"\ *+ *+'o цK?l1SE+@@"[ *+ *+'oцK?l1SE,@@"Z *+ *+'oцKF?l1SE-@@"Y *+ *+'oцK?l1SE.@@"X *+ *+'oцK?l1SE/@@"W *+ *+'oцK)?l1SE0@@"V *+ *+'oцKj?l1SE1@@"U *+ *+'oцK?l1SE2@@"T *+ *+'oцK ?l1SE3@@"S *+ *+'oцKL?l1SE4@@"R *+ *+'oцK?l1SE5@@"Q *+ *+'oцK?l1SE6@@"P *+ *+'oцK/?l1SE7@@"O *+ *+'oцK?l1SE8@@"N *+ *+'oцK?l1SE9@@"M *+ *+'oцK-?l1SE:@@"L *+ *+'oцKp?l1SE;@@"K *+ *+'oцK?l1SE<@@"J *+ *+'oцK?l1SE=@@"I *+ *+'o цKQ?l1SE>@@"H *+ *+'o!цK?l1SE?@@"G *+ *+'o"цK?l1SE@@@"F *+ *+'o#цK3?l1SEA@@"E *+ *+'o$цK?l1SEB@@"D *+ *+'o%цK?l1SEC@@"C *+ *+'o&цK?l1SED@@"B *+ *+'o'цKs?l1SEE@@"A *+ *+'o(цK?l1SEF@@"@ *+ *+'o)цK?l1SEG@@"? *+ *+'o*цKV?l1SEH@@"> *+ *+'o+цK?l1SEI@@"= *+ *+'o,цK?l1SEJ@@"< *+ *+'o-цK8?l1SEK@@"; *+ *+'o.цKy?l1SEL@@": *+ *+'o/цK?l1SEM@@"9 *+ *+'o0цK?l1SEN@@"8 *+ *+'o1цKx?l1SEO@@"7 *+ *+'o2цK?l1SEP@@"6 *+ *+'o3цK?l1SEQ@@"5 *+ *+'o4цKZ?l1SER@@"4 *+ *+'o5цK?l1SES@@"3 *+ *+'o6цK?l1SET@@"2 *+ *+'o7цK<?l1SEU@@"1 *+ *+'o8цK}?l1SEV@@"0 *+ *+'o9цK?l1SEW@@"/ *+ *+'o:цK?l1SEX@@". *+ *+'o;цK`?l1SEY@@"- *+ *+'o<цK?l1SEZ@@", *+ *+'o=цK?l1SE[@@"+ *+ *+'o>цKC?l1SE\@@"* *+ *+'o?цK?l1SE]@@") *+ *+'o@цK?l1SE^@@"( *+ *+'oAцKB?l1SE_@@"' *+ *+'oBцK?l1SE`@@"& *+ *+'oCцK?l1SEa@@"% *+ *+'oDцK#?l1SEb@@"$ *+ *+'oEцKd?l1SEc@@"# *+ *+'oFцK?l1SEd@@"" *+ *+'oGцK?l1SEe@@"! *+ *+'oHцKF?l1SEf@@" *+ *+'oIцK?l1SEg@@" *+ *+'oJцK?l1SEh@@" *+ *+'oKцK)?l1SEi@@" *+ *+'oLцK?l1SEj@@" *+ *+'oMцK?l1SEk@@" *+ *+'oNцK'?l1SEl@@" *+ *+'oOцKh?l1SEm@@" *+ *+'oPцK?l1SEn@@" *+ *+'oQцK?l1SEo@@" *+ *+'oRцKL?l1SEp@@" *+ *+'oSцK?l1SEq@@" *+ *+'oTцK?l1SEr@@" *+ *+'oUцK-?l1SEs@@" *+ *+'oVцK?l1SEt@@" *+ *+'oWцK?l1SEu@@" *+ *+'oXцK?l1SEv@@" *+ *+'oYцKn?l1SEw@@" *+ *+'oZцK?l1SEx@@" *+ *+'o[цK?l1SEy@@" *+ *+'o\цKO?l1SEz@@" *+ *+'o]цK?l1SE{@@" *+ *+'o^цK?l1SE|@@" *+ *+'o_цK2?l1SE}@@" *+ *+'o`цK{?l1SE~@@" *+ *+'oaцK?l1SE@@" *+ *+'obцK?l1SE@@" *+ *+'ocцKr?l1SE@@" *+ *+'odцK?l1SE@@" *+ *+'oeцK?l1SE@@" *+ *+'ofцKT?l1SE@@" *+ *+'ogцK?l1SE@@" *+ *+'ohцK?l1SE@@" *+ *+'oiцK6?l1SE@@! *+ *+'ojцKx?l1SE@@! *+ *+'okцK?l1SE@@! *+ *+'olцK?l1SE@@! *+ *+'omцKZ?l1SE@@! *+ *+'onцK?l1SE@@! *+ *+'ooцK?l1SE@@! *+ *+'opцK=?l1SE@@! *+ *+'oqцK?l1SE@@! *+ *+'orцK?l1SE@@! *+ *+'osцK:?l1SE@@! *+ *+'otцK|?l1SE@@! *+ *+'ouцK?l1SE@@! *+ *+'ovцK?l1SE@@! *+ *+'owцK^?l1SE@@! *+ *+'oxцK?l1SE@@! *+ *+'oyцK?l1SE@@! *+ *+'ozцK@?l1SE@@! *+ *+'o{цK?l1SE@@! *+ *+'o|цK?l1SE@@! *+ *+'o}цK#?l1SE@@! *+ *+'o~цK?l1SE@@! *+ *+'oцK?l1SE@@! *+ *+'oцK"?l1SE@@! *+ *+'oцKd?l1SE@@! *+ *+'oцK?l1SE@@! *+ *+'oцK?l1SE@@! *+ *+'oцKD?l1SE@@! *+ *+'oцK?l1SE@@! *+ *+'oцK  ?l1SE@@" *+ *+'oцK<<?l1SE,@@# *+ *+'o@UUцKVV?l1SEH@@# *+ *+'4p!@цK?l1SE@@! *+ *+'pцK?l1SE@@! *+ *+'pцKL?l1SE@@! *+ *+'pцK?l1SE@@! *+ *+'pцK?l1SE@@! *+ *+'pцK.?l1SE@@! *+ *+'pцKp?l1SE@@! *+ *+'pцK?l1SE@@! *+ *+'pцK?l1SE@@! *+ *+'p цKP?l1SE@@! *+ *+'p цK?l1SE@@! *+ *+'p цK?l1SE@@! *+ *+'p цK4?l1SE@@! *+ *+'p цK?l1SE@@! *+ *+'pцK?l1SE@@! *+ *+'pцK3?l1SE@@! *+ *+'pцKt?l1SE@@! *+ *+'pцK?l1SE@@! *+ *+'pцK ?l1SE@@! *+ *+'pцKU ?l1SE@@! *+ *+'pцK ?l1SE@@! *+ *+'pцK ?l1SE@@! *+ *+'pцK9!?l1SE@@! *+ *+'pцK!?l1SE@@! *+ *+'pцK!?l1SE@@! *+ *+'pцK"?l1SE@@! *+ *+'pцKy"?l1SE@@! *+ *+'pцK"?l1SE@@! *+ *+'pцK#?l1SE@@! *+ *+'pцKZ#?l1SE@@! *+ *+'pцK#?l1SE@@! *+ *+'pцK#?l1SE@@! *+ *+'p цK<$?l1SE@@! *+ *+'p!цK$?l1SE@@! *+ *+'p"цK$?l1SE@@! *+ *+'p#цK%?l1SE@@! *+ *+'p$цK~%?l1SE@@! *+ *+'p%цK%?l1SE@@! *+ *+'p&цK&?l1SE@@! *+ *+'p'цK_&?l1SE@@! *+ *+'p(цK&?l1SE@@! *+ *+'p)цK&?l1SE@@! *+ *+'p*цKA'?l1SE@@! *+ *+'p+цK'?l1SE@@! *+ *+'p,цK'?l1SE@@! *+ *+'p-цK$(?l1SE@@! *+ *+'p.цKd(?l1SE@@! *+ *+'p/цK(?l1SE@@! *+ *+'p0цK)?l1SE@@! *+ *+'p1цKd)?l1SE@@! *+ *+'p2цK)?l1SE@@! *+ *+'p3цK)?l1SE@@! *+ *+'p4цKF*?l1SE@@! *+ *+'p5цK*?l1SE@@! *+ *+'p6цK*?l1SE@@! *+ *+'p7цK(+?l1SE@@! *+ *+'p8цKi+?l1SE@@! *+ *+'p9цK+?l1SE@@! *+ *+'p:цK ,?l1SE@@! *+ *+'p;цKK,?l1SE@@! *+ *+'p<цK,?l1SE@@! *+ *+'p=цK,?l1SE@@! *+ *+'p>цK,-?l1SE@@! *+ *+'p?цK-?l1SE@@! *+ *+'p@цK-?l1SE@@! *+ *+'pAцK,.?l1SE@@! *+ *+'pBцKm.?l1SE@@! *+ *+'pCцK.?l1SE@@! *+ *+'pDцK/?l1SE@@! *+ *+'pEцKP/?l1SE@@! *+ *+'pFцK/?l1SE@@! *+ *+'pGцK/?l1SE@@! *+ *+'pHцK10?l1SE@@! *+ *+'pIцK0?l1SE@@! *+ *+'pJцK0?l1SE@@! *+ *+'pKцK1?l1SE@@! *+ *+'pLцKr1?l1SE@@! *+ *+'pMцK1?l1SE@@! *+ *+'pNцK2?l1SE@@! *+ *+'pOцKU2?l1SE@@! *+ *+'pPцK2?l1SE@@! *+ *+'pQцK2?l1SE@@! *+ *+'pRцK63?l1SE@@! *+ *+'pSцKx3?l1SE@@! *+ *+'pTцK3?l1SE@@! *+ *+'pUцK4?l1SE@@! *+ *+'pVцKw4?l1SE@@! *+ *+'pWцK4?l1SE@@! *+ *+'pXцK4?l1SE@@! *+ *+'pYцKZ5?l1SE@@! *+ *+'pZцK5?l1SE@@! *+ *+'p[цK5?l1SE@@! *+ *+'p\цK;6?l1SE@@! *+ *+'p]цK}6?l1SE@@! *+ *+'p^цK6?l1SE@@! *+ *+'p_цK7?l1SE@@! *+ *+'p`цK`7?l1SE@@! *+ *+'paцK7?l1SE@@!~ *+ *+'pbцK8?l1SE @@!} *+ *+'pcцK]8?l1SE @@!| *+ *+'pdцK8?l1SE @@!{ *+ *+'peцK8?l1SE @@!z *+ *+'pfцK@9?l1SE @@!y *+ *+'pgцK9?l1SE@@!x *+ *+'phцK9?l1SE@@!w *+ *+'piцK":?l1SE@@!v *+ *+'pjцKc:?l1SE@@!u *+ *+'pkцK:?l1SE@@!t *+ *+'plцK;?l1SE@@!s *+ *+'pmцKF;?l1SE@@!r *+ *+'pnцK;?l1SE@@!q *+ *+'poцK;?l1SE@@!p *+ *+'ppцK'<?l1SE@@!o *+ *+'pqцK<?l1SE@@!n *+ *+'prцK<?l1SE@@!m *+ *+'psцK'=?l1SE@@!l *+ *+'ptцKh=?l1SE@@!k *+ *+'puцK=?l1SE@@!j *+ *+'pvцK>?l1SE@@!i *+ *+'pwцKI>?l1SE@@!h *+ *+'pxцK>?l1SE@@!g *+ *+'pyцK>?l1SE @@!f *+ *+'pzцK,??l1SE!@@!e *+ *+'p{цK??l1SE"@@!d *+ *+'p|цK??l1SE#@@!c *+ *+'p}цK@?l1SE$@@!b *+ *+'p~цKm@?l1SE%@@!a *+ *+'pцK@?l1SE&@@!` *+ *+'pцK A?l1SE'@@!_ *+ *+'pцKNA?l1SE(@@!^ *+ *+'pцKA?l1SE)@@!] *+ *+'pцKA?l1SE*@@!\ *+ *+'pцK6B?l1SE+@@![ *+ *+'pцKrB?l1SE,@@!Z *+ *+'pцKB  ?l1SE-@@"] *+ *+'pцKB<<?l1SE,.@@#, *+ *+'p@UUцKC22?lE$@@ *+t5LBцKP**?l1SEW  *+ *+t1S *+ *+ProsilicaGC1380H (02-2142A)1.36.0 02-2142A-06241lapp-vicam02цKTVV?l1SEH/@@# *+ *+'4q!K@цKeU?l1SE0@@!V *+ *+'qцKU?l1SE1@@!U *+ *+'qцKV?l1SE2@@!T *+ *+'qцKGV?l1SE3@@!S *+ *+'qцKV?l1SE4@@!R *+ *+'qцKV?l1SE5@@!Q *+ *+'qцK(W?l1SE6@@!P *+ *+'qцKW?l1SE7@@!O *+ *+'qцKW?l1SE8@@!N *+ *+'q цK X?l1SE9@@!M *+ *+'q цKiX?l1SE:@@!L *+ *+'q цKX?l1SE;@@!K *+ *+'q цKX?l1SE<@@!J *+ *+'q цKKY?l1SE=@@!I *+ *+'qцKY?l1SE>@@!H *+ *+'qцKY?l1SE?@@!G *+ *+'qцK:Z?l1SE@@@!F *+ *+'qцKoZ?l1SEA@@!E *+ *+'qцKZ?l1SEB@@!D *+ *+'qцK[?l1SEC@@!C *+ *+'qцKR[?l1SED@@!B *+ *+'qцK[?l1SEE@@!A *+ *+'qцK[?l1SEF@@!@ *+ *+'qцKQ\?l1SEG@@!? *+ *+'qцK\?l1SEH@@!> *+ *+'qцK\?l1SEI@@!= *+ *+'qцK3]?l1SEJ@@!< *+ *+'qцKs]?l1SEK@@!; *+ *+'qцK]?l1SEL@@!: *+ *+'qцK^?l1SEM@@!9 *+ *+'qцKV^?l1SEN@@!8 *+ *+'qцK^?l1SEO@@!7 *+ *+'q цK^?l1SEP@@!6 *+ *+'q!цK8_?l1SEQ@@!5 *+ *+'q"цK_?l1SER@@!4 *+ *+'q#цK_?l1SES@@!3 *+ *+'q$цK7`?l1SET@@!2 *+ *+'q%цKx`?l1SEU@@!1 *+ *+'q&цK`?l1SEV@@!0 *+ *+'q'цKa?l1SEW@@!/ *+ *+'q(цKZa?l1SEX@@!. *+ *+'q)цKa?l1SEY@@!- *+ *+'q*цKa?l1SEZ@@!, *+ *+'q+цKцKg?l1SEn@@! *+ *+'q?цKEh?l1SEo@@! *+ *+'q@цKh?l1SEp@@! *+ *+'qAцKh?l1SEq@@! *+ *+'qBцK'i?l1SEr@@! *+ *+'qCцKii?l1SEs@@! *+ *+'qDцKi?l1SEt@@! *+ *+'qEцK j?l1SEu@@! *+ *+'qFцKKj?l1SEv@@! *+ *+'qGцKj?l1SEw@@! *+ *+'qHцKj?l1SEx@@! *+ *+'qIцKIk?l1SEy@@! *+ *+'qJцKk?l1SEz@@! *+ *+'qKцKk?l1SE{@@! *+ *+'qLцK,l?l1SE|@@! *+ *+'qMцKnl?l1SE}@@! *+ *+'qNцKl?l1SE~@@! *+ *+'qOцKm?l1SE@@! *+ *+'qPцKPm?l1SE@@! *+ *+'qQцKm?l1SE@@! *+ *+'qRцKm?l1SE@@! *+ *+'qSцK2n?l1SE@@! *+ *+'qTцKn?l1SE@@! *+ *+'qUцKn?l1SE@@! *+ *+'qVцK0o?l1SE@@! *+ *+'qWцKro?l1SE@@ *+ *+'qXцKo?l1SE@@ *+ *+'qYцKp?l1SE@@ *+ *+'qZцKTp?l1SE@@ *+ *+'q[цKp?l1SE@@ *+ *+'q\цKp?l1SE@@ *+ *+'q]цK6q?l1SE@@ *+ *+'q^цKq?l1SE@@ *+ *+'q_цKq?l1SE@@ *+ *+'q`цKr?l1SE@@ *+ *+'qaцKwr?l1SE@@ *+ *+'qbцKr?l1SE@@ *+ *+'qcцKs?l1SE@@ *+ *+'qdцKYs?l1SE@@ *+ *+'qeцKs?l1SE@@ *+ *+'qfцKs?l1SE@@ *+ *+'qgцK;t?l1SE@@ *+ *+'qhцK}t?l1SE@@ *+ *+'qiцKt?l1SE@@ *+ *+'qjцKu?l1SE@@ *+ *+'qkцKzu?l1SE@@ *+ *+'qlцKu?l1SE@@ *+ *+'qmцKu?l1SE@@ *+ *+'qnцK]v?l1SE@@ *+ *+'qoцKv?l1SE@@ *+ *+'qpцKv?l1SE@@ *+ *+'qqцK?w?l1SE@@ *+ *+'qrцKw?l1SE@@ *+ *+'qsцKw?l1SE@@ *+ *+'qtцK!x?l1SE@@ *+ *+'quцKcx?l1SE@@ *+ *+'qvцKx?l1SE@@ *+ *+'qwцKy?l1SE@@ *+ *+'qxцKEy?l1SE@@ *+ *+'qyцKy?l1SE@@ *+ *+'qzцKy?l1SE@@ *+ *+'q{цKEz?l1SE@@ *+ *+'q|цKz?l1SE@@ *+ *+'q}цKz?l1SE@@ *+ *+'q~цK&{?l1SE@@ *+ *+'qцKg{?l1SE@@ *+ *+'qцK{?l1SE@@ *+ *+'qцK|?l1SE@@ *+ *+'qцKJ|?l1SE@@ *+ *+'qцK|?l1SE@@ *+ *+'qцK|?l1SE@@ *+ *+'qцK+}?l1SE@@ *+ *+'qцK^}  ?l1SE@@! *+ *+'qцKe}<<?l1SE,@@" *+ *+'q@UUцKVV?l1SEH@@" *+ *+'4r!F@цKL?l1SE@@ *+ *+'rцK?l1SE@@ *+ *+'rцK?l1SE@@ *+ *+'rцK.?l1SE@@ *+ *+'rцKp?l1SE@@ *+ *+'rцKϑ?l1SE@@ *+ *+'rцK?l1SE@@ *+ *+'rцKo?l1SE@@ *+ *+'rцK?l1SE@@ *+ *+'r цK?l1SE@@ *+ *+'r цKP?l1SE@@ *+ *+'r цK?l1SE@@ *+ *+'r цKԓ?l1SE@@ *+ *+'r цK3?l1SE@@ *+ *+'rцKt?l1SE@@ *+ *+'rцKҔ?l1SE@@ *+ *+'rцK?l1SE@@ *+ *+'rцKW?l1SE@@ *+ *+'rцK?l1SE@@ *+ *+'rцK?l1SE@@ *+ *+'rцK9?l1SE@@ *+ *+'rцK?l1SE@@ *+ *+'rцKٖ?l1SE@@ *+ *+'rцK7?l1SE@@ *+ *+'rцKy?l1SE@@ *+ *+'rцK?l1SE@@ *+ *+'rцK?l1SE@@ *+ *+'rцK[?l1SE@@ *+ *+'rцK?l1SE@@ *+ *+'rцK?l1SE@@ *+ *+'rцK=?l1SE@@ *+ *+'rцK?l1SE@@ *+ *+'r цKݙ?l1SE@@ *+ *+'r!цK?l1SE@@ *+ *+'r"цK}?l1SE@@ *+ *+'r#цK?l1SE@@ *+ *+'r$цK?l1SE@@ *+ *+'r%цK_?l1SE@@ *+ *+'r&цK?l1SE@@ *+ *+'r'цK?l1SE@@ *+ *+'r(цKA?l1SE@@ *+ *+'r)цK?l1SE@@ *+ *+'r*цK?l1SE@@ *+ *+'r+цK#?l1SE@@ *+ *+'r,цK?l1SE@@ *+ *+'r-цKĝ?l1SE@@ *+ *+'r.цK?l1SE@@ *+ *+'r/цKe?l1SE@@ *+ *+'r0цK?l1SE@@ *+ *+'r1цK?l1SE@@ *+ *+'r2цKF?l1SE@@ *+ *+'r3цK?l1SE@@ *+ *+'r4цK?l1SE@@ *+ *+'r5цK(?l1SE@@ *+ *+'r6цKj?l1SE@@ *+ *+'r7цKȠ?l1SE@@ *+ *+'r8цK ?l1SE@@ *+ *+'r9цKh?l1SE@@ *+ *+'r:цK?l1SE@@ *+ *+'r;цK?l1SE@@ *+ *+'r<цKK?l1SE@@ *+ *+'r=цK?l1SE@@ *+ *+'r>цK͢?l1SE@@ *+ *+'r?цK,?l1SE@@ *+ *+'r@цKn?l1SE@@ *+ *+'rAцḲ?l1SE@@ *+ *+'rBцK?l1SE@@ *+ *+'rCцKQ?l1SE@@ *+ *+'rDцK?l1SE@@ *+ *+'rEцK?l1SE@@ *+ *+'rFцK2?l1SE@@ *+ *+'rGцK?l1SE@@ *+ *+'rHцKӥ?l1SE@@ *+ *+'rIцK2?l1SE@@ *+ *+'rJцKs?l1SE@@ *+ *+'rKцK?l1SE@@ *+ *+'rLцK?l1SE@@ *+ *+'rMцKV?l1SE@@ *+ *+'rNцK?l1SE@@  *+ *+'rOцK?l1SE@@ ~ *+ *+'rPцK7?l1SE @@ } *+ *+'rQцK?l1SE @@ | *+ *+'rRцKר?l1SE @@ { *+ *+'rSцK?l1SE @@ z *+ *+'rTцKw?l1SE @@ y *+ *+'rUцK?l1SE@@ x *+ *+'rVцK?l1SE@@ w *+ *+'rWцKY?l1SE@@ v *+ *+'rXцK?l1SE@@ u *+ *+'rYцK?l1SE@@ t *+ *+'rZцK<?l1SE@@ s *+ *+'r[цK~?l1SE@@ r *+ *+'r\цKܫ?l1SE@@ q *+ *+'r]цK?l1SE@@ p *+ *+'r^цK}?l1SE@@ o *+ *+'r_цK?l1SE@@ n *+ *+'r`цK?l1SE@@ m *+ *+'raцK^?l1SE@@ l *+ *+'rbцK?l1SE@@ k *+ *+'rcцK?l1SE@@ j *+ *+'rdцK@?l1SE@@ i *+ *+'reцK?l1SE@@ h *+ *+'rfцK?l1SE@@ g *+ *+'rgцK"?l1SE @@ f *+ *+'rhцKd?l1SE!@@ e *+ *+'riцKï?l1SE"@@ d *+ *+'rjцK?l1SE#@@ c *+ *+'rkцKc?l1SE$@@ b *+ *+'rlцK?l1SE%@@ a *+ *+'rmцK?l1SE&@@ ` *+ *+'rnцKD?l1SE'@@ _ *+ *+'roцK?l1SE(@@ ^ *+ *+'rpцKȱ?l1SE)@@ ] *+ *+'rqцK&?l1SE*@@ \ *+ *+'rrцKh?l1SE+@@ [ *+ *+'rsцKDz?l1SE,@@ Z *+ *+'rtцK?l1SE-@@ Y *+ *+'ruцKJ?l1SE.@@ X *+ *+'rvцK?l1SE/@@ W *+ *+'rwцK?l1SE0@@ V *+ *+'rxцK-?l1SE1@@ U *+ *+'ryцK?l1SE2@@ T *+ *+'rzцKʹ?l1SE3@@ S *+ *+'r{цK,?l1SE4@@ R *+ *+'r|цKm?l1SE5@@ Q *+ *+'r}цK?l1SE6@@ P *+ *+'r~цK?l1SE7@@ O *+ *+'rцKO?l1SE8@@ N *+ *+'rцK?l1SE9@@ M *+ *+'rцK?l1SE:@@ L *+ *+'rцK2?l1SE;@@ K *+ *+'rцK?l1SE<@@ J *+ *+'rцKѷ?l1SE=@@ I *+ *+'rцK?l1SE>@@ H *+ *+'rцKG  ?l1SE?@@!K *+ *+'rцKO<<?l1SE,@@@" *+ *+'r@UUцK\VV?l1SEHA@@! *+ *+'4s!o@цK?l1SEB@@ D *+ *+'sцKT?l1SEC@@ C *+ *+'sцK?l1SED@@ B *+ *+'sцK?l1SEE@@ A *+ *+'sцK8?l1SEF@@ @ *+ *+'sцK?l1SEG@@ ? *+ *+'sцK?l1SEH@@ > *+ *+'sцK7?l1SEI@@ = *+ *+'sцKx?l1SEJ@@ < *+ *+'s цK?l1SEK@@ ; *+ *+'s цK?l1SEL@@ : *+ *+'s цKZ?l1SEM@@ 9 *+ *+'s цK?l1SEN@@ 8 *+ *+'s цK?l1SEO@@ 7 *+ *+'sцK<?l1SEP@@ 6 *+ *+'sцK?l1SEQ@@ 5 *+ *+'sцK?l1SER@@ 4 *+ *+'sцK?l1SES@@ 3 *+ *+'sцK}?l1SET@@ 2 *+ *+'sцK?l1SEU@@ 1 *+ *+'sцK?l1SEV@@ 0 *+ *+'sцK^?l1SEW@@ / *+ *+'sцK?l1SEX@@ . *+ *+'sцK?l1SEY@@ - *+ *+'sцK@?l1SEZ@@ , *+ *+'sцK?l1SE[@@ + *+ *+'sцK?l1SE\@@ * *+ *+'sцK"?l1SE]@@ ) *+ *+'sцK?l1SE^@@ ( *+ *+'sцK?l1SE_@@ ' *+ *+'sцK?l1SE`@@ & *+ *+'sцKc?l1SEa@@ % *+ *+'s цK?l1SEb@@ $ *+ *+'s!цK?l1SEc@@ # *+ *+'s"цKE?l1SEd@@ " *+ *+'s#цK?l1SEe@@ ! *+ *+'s$цK?l1SEf@@ *+ *+'s%цK(?l1SEg@@  *+ *+'s&цKh?l1SEh@@  *+ *+'s'цK?l1SEi@@  *+ *+'s(цK ?l1SEj@@  *+ *+'s)цKK?l1SEk@@  *+ *+'s*цK?l1SEl@@  *+ *+'s+цK?l1SEm@@  *+ *+'s,цKI?l1SEn@@  *+ *+'s-цK?l1SEo@@  *+ *+'s.цK?l1SEp@@  *+ *+'s/цK+?l1SEq@@  *+ *+'s0цKn?l1SEr@@  *+ *+'s1цK?l1SEs@@  *+ *+'s2цK?l1SEt@@  *+ *+'s3цKO?l1SEu@@  *+ *+'s4цK?l1SEv@@  *+ *+'s5цK?l1SEw@@  *+ *+'s6цK1?l1SEx@@  *+ *+'s7цK?l1SEy@@ *+ *+'s8цK?l1SEz@@ *+ *+'s9цK0?l1SE{@@ *+ *+'s:цKr?l1SE|@@ *+ *+'s;цK?l1SE}@@ *+ *+'s<цK?l1SE~@@  *+ *+'s=цKT?l1SE@@  *+ *+'s>цK?l1SE@@  *+ *+'s?цK?l1SE@@  *+ *+'s@цK6?l1SE@@  *+ *+'sAцK?l1SE@@  *+ *+'sBцK?l1SE@@  *+ *+'sCцK?l1SE@@  *+ *+'sDцKv?l1SE@@ *+ *+'sEцK?l1SE@@ *+ *+'sFцK?l1SE@@ *+ *+'sGцKY?l1SE@@ *+ *+'sHцK?l1SE@@ *+ *+'sIцK?l1SE@@ *+ *+'sJцK:?l1SE@@ *+ *+'sKцK|?l1SE@@ *+ *+'sLцK?l1SE@@ *+ *+'sMцK?l1SE@@ *+ *+'sNцK{?l1SE@@ *+ *+'sOцK?l1SE@@ *+ *+'sPцK?l1SE@@ *+ *+'sQцK]?l1SE@@ *+ *+'sRцK?l1SE@@ *+ *+'sSцK?l1SE@@ *+ *+'sTцK??l1SE@@ *+ *+'sUцK?l1SE@@ *+ *+'sVцK?l1SE@@ *+ *+'sWцK ?l1SE@@ *+ *+'sXцKb?l1SE@@ *+ *+'sYцK?l1SE@@ *+ *+'sZцK?l1SE@@ *+ *+'s[цKE?l1SE@@ *+ *+'s\цK?l1SE@@ *+ *+'s]цK?l1SE@@ *+ *+'s^цKD?l1SE@@ *+ *+'s_цK?l1SE@@ *+ *+'s`цK?l1SE@@ *+ *+'saцK&?l1SE@@ *+ *+'sbцKh?l1SE@@ *+ *+'scцK?l1SE@@ *+ *+'sdцK?l1SE@@ *+ *+'seцKI?l1SE@@ *+ *+'sfцK?l1SE@@ *+ *+'sgцK?l1SE@@ *+ *+'shцK+?l1SE@@ *+ *+'siцK?l1SE@@ *+ *+'sjцK?l1SE@@ *+ *+'skцK*?l1SE@@ *+ *+'slцKk?l1SE@@ *+ *+'smцK?l1SE@@ *+ *+'snцK ?l1SE@@ *+ *+'soцKM?l1SE@@ *+ *+'spцK?l1SE@@ *+ *+'sqцK?l1SE@@ *+ *+'srцK0?l1SE@@ *+ *+'ssцK?l1SE@@ *+ *+'stцK?l1SE@@ *+ *+'suцK?l1SE@@ *+ *+'svцKp?l1SE@@ *+ *+'swцK?l1SE@@ *+ *+'sxцK?l1SE@@ *+ *+'syцKQ?l1SE@@ *+ *+'szцK?l1SE@@ *+ *+'s{цK?l1SE@@ *+ *+'s|цK4?l1SE@@ *+ *+'s}цKv?l1SE@@ *+ *+'s~цK?l1SE@@ *+ *+'sцK?l1SE@@ *+ *+'sцKu?l1SE@@ *+ *+'sцK?l1SE@@ *+ *+'sцK?l1SE@@ *+ *+'sцKW?l1SE@@ *+ *+'sцK?l1SE@@ *+ *+'sцK?l1SE@@ *+ *+'sцK   ?l1SE@@ *+ *+'sцK<<?l1SE,@@! *+ *+'s@UUцKCVV?l1SEH@@!t *+ *+'4t!*0@цK?l1SE@@ *+ *+'tцK=?l1SE@@ *+ *+'tцK?l1SE@@ *+ *+'tцK?l1SE@@ *+ *+'tцK?l1SE@@ *+ *+'tцK}?l1SE@@ *+ *+'tцK?l1SE@@ *+ *+'tцK?l1SE@@ *+ *+'tцK`?l1SE@@ *+ *+'t цK?l1SE@@ *+ *+'t цK ?l1SE@@ *+ *+'t цKA ?l1SE@@ *+ *+'t цK ?l1SE@@ *+ *+'t цK ?l1SE@@ *+ *+'tцK# ?l1SE@@ *+ *+'tцK ?l1SE@@ *+ *+'tцK ?l1SE@@ *+ *+'tцK ?l1SE@@ *+ *+'tцKc ?l1SE@@ *+ *+'tцK ?l1SE@@ *+ *+'tцK ?l1SE@@ *+ *+'tцKF ?l1SE@@ *+ *+'tцK ?l1SE@@ *+ *+'tцK ?l1SE@@ *+ *+'tцK( ?l1SE@@ *+ *+'tцKi ?l1SE@@ *+ *+'tцK ?l1SE@@ *+ *+'tцK ?l1SE@@ *+ *+'tцKh?l1SE@@ *+ *+'tцK?l1SE@@ *+ *+'tцK?l1SE@@ *+ *+'tцKK?l1SE@@ *+ *+'t цK?l1SE@@ *+ *+'t!цK?l1SE@@ *+ *+'t"цK,?l1SE@@ *+ *+'t#цKo?l1SE@@ *+ *+'t$цK?l1SE@@ *+ *+'t%цK?l1SE@@ *+ *+'t&цKQ?l1SE@@ *+ *+'t'цK?l1SE@@ *+ *+'t(цK?l1SE@@ *+ *+'t)цK2?l1SE@@ *+ *+'t*цK?l1SE@@ *+ *+'t+цK?l1SE@@ *+ *+'t,цK2?l1SE@@ *+ *+'t-цKr?l1SE@@ *+ *+'t.цK?l1SE@@ *+ *+'t/цK?l1SE@@ *+ *+'t0цKU?l1SE@@ *+ *+'t1цK?l1SE@@ *+ *+'t2цK?l1SE@@ *+ *+'t3цK7?l1SE@@ *+ *+'t4цK?l1SE@@ *+ *+'t5цK?l1SE@@ *+ *+'t6цK?l1SE@@ *+ *+'t7цKx?l1SE@@ *+ *+'t8цK?l1SE@@ *+ *+'t9цK?l1SE@@ *+ *+'t:цKX?l1SE@@ *+ *+'t;цK?l1SE@@ *+ *+'t<цK?l1SE@@ *+ *+'t=цK<?l1SE@@~ *+ *+'t>цK~?l1SE @@} *+ *+'t?цK?l1SE @@| *+ *+'t@цK?l1SE @@{ *+ *+'tAцK|?l1SE @@z *+ *+'tBцK?l1SE @@y *+ *+'tCцK?l1SE@@x *+ *+'tDцK^?l1SE@@w *+ *+'tEцK?l1SE@@v *+ *+'tFцK?l1SE@@u *+ *+'tGцK@?l1SE@@t *+ *+'tHцK?l1SE@@s *+ *+'tIцK?l1SE@@r *+ *+'tJцK#?l1SE@@q *+ *+'tKцKc?l1SE@@p *+ *+'tLцK?l1SE@@o *+ *+'tMцK?l1SE@@n *+ *+'tNцKb?l1SE@@m *+ *+'tOцK?l1SE@@l *+ *+'tPцK?l1SE@@k *+ *+'tQцKE?l1SE@@j *+ *+'tRцK?l1SE@@i *+ *+'tSцK?l1SE@@h *+ *+'tTцK'?l1SE@@g *+ *+'tUцKh?l1SE @@f *+ *+'tVцK?l1SE!@@e *+ *+'tWцK ?l1SE"@@d *+ *+'tXцKJ ?l1SE#@@c *+ *+'tYцK ?l1SE$@@b *+ *+'tZцK ?l1SE%@@a *+ *+'t[цK-!?l1SE&@@` *+ *+'t\цK!?l1SE'@@_ *+ *+'t]цK!?l1SE(@@^ *+ *+'t^цK+"?l1SE)@@] *+ *+'t_цKm"?l1SE*@@\ *+ *+'t`цK"?l1SE+@@[ *+ *+'taцK #?l1SE,@@Z *+ *+'tbцKO#?l1SE-@@Y *+ *+'tcцK#?l1SE.@@X *+ *+'tdцK#?l1SE/@@W *+ *+'teцK1$?l1SE0@@V *+ *+'tfцK$?l1SE1@@U *+ *+'tgцK$?l1SE2@@T *+ *+'thцK%?l1SE3@@S *+ *+'tiцKr%?l1SE4@@R *+ *+'tjцK%?l1SE5@@Q *+ *+'tkцK&?l1SE6@@P *+ *+'tlцKT&?l1SE7@@O *+ *+'tmцK&?l1SE8@@N *+ *+'tnцK&?l1SE9@@M *+ *+'toцK5'?l1SE:@@L *+ *+'tpцKw'?l1SE;@@K *+ *+'tqцK'?l1SE<@@J *+ *+'trцK(?l1SE=@@I *+ *+'tsцKv(?l1SE>@@H *+ *+'ttцK(?l1SE?@@G *+ *+'tuцK(?l1SE@@@F *+ *+'tvцKX)?l1SEA@@E *+ *+'twцK)?l1SEB@@D *+ *+'txцK)?l1SEC@@C *+ *+'tyцK:*?l1SED@@B *+ *+'tzцK|*?l1SEE@@A *+ *+'t{цK*?l1SEF@@@ *+ *+'t|цK+?l1SEG@@? *+ *+'t}цK^+?l1SEH@@> *+ *+'t~цK+?l1SEI@@= *+ *+'tцK+?l1SEJ@@< *+ *+'tцK^,?l1SEK@@; *+ *+'tцK,?l1SEL@@: *+ *+'tцK,?l1SEM@@9 *+ *+'tцK>-?l1SEN@@8 *+ *+'tцK-?l1SEO@@7 *+ *+'tцK-?l1SEP@@6 *+ *+'tцK-  ?l1SEQ@@ 9 *+ *+'tцK-<<?l1SE,R@@! *+ *+'t@UUцK+@VV?l1SEHS@@ *+ *+'4u!6@цK@?l1SET@@2 *+ *+'uцK$A?l1SEU@@1 *+ *+'uцKA?l1SEV@@0 *+ *+'uцKA?l1SEW@@/ *+ *+'uцKB?l1SEX@@. *+ *+'uцKeB?l1SEY@@- *+ *+'uцKB?l1SEZ@@, *+ *+'uцKC?l1SE[@@+ *+ *+'uцKGC?l1SE\@@* *+ *+'u цKC?l1SE]@@) *+ *+'u цKC?l1SE^@@( *+ *+'u цK)D?l1SE_@@' *+ *+'u цKjD?l1SE`@@& *+ *+'u цKD?l1SEa@@% *+ *+'uцK E?l1SEb@@$ *+ *+'uцKjE?l1SEc@@# *+ *+'uцKE?l1SEd@@" *+ *+'uцKE?l1SEe@@! *+ *+'uцKKF?l1SEf@@ *+ *+'uцKF?l1SEg@@ *+ *+'uцKF?l1SEh@@ *+ *+'uцK.G?l1SEi@@ *+ *+'uцKoG?l1SEj@@ *+ *+'uцKG?l1SEk@@ *+ *+'uцKH?l1SEl@@ *+ *+'uцKRH?l1SEm@@ *+ *+'uцKH?l1SEn@@ *+ *+'uцKH?l1SEo@@ *+ *+'uцKPI?l1SEp@@ *+ *+'uцKI?l1SEq@@ *+ *+'uцKI?l1SEr@@ *+ *+'uцK1J?l1SEs@@ *+ *+'u цKuJ?l1SEt@@ *+ *+'u!цKJ?l1SEu@@ *+ *+'u"цKK?l1SEv@@ *+ *+'u#цKVK?l1SEw@@ *+ *+'u$цKK?l1SEx@@ *+ *+'u%цKK?l1SEy@@ *+ *+'u&цK7L?l1SEz@@ *+ *+'u'цKL?l1SE{@@ *+ *+'u(цKL?l1SE|@@ *+ *+'u)цKM?l1SE}@@ *+ *+'u*цKxM?l1SE~@@ *+ *+'u+цKM?l1SE@@ *+ *+'u,цKN?l1SE@@ *+ *+'u-цK[N?l1SE@@ *+ *+'u.цKN?l1SE@@ *+ *+'u/цKN?l1SE@@ *+ *+'u0цKцKeS?l1SE@@ *+ *+'u?цKS?l1SE@@ *+ *+'u@цKT?l1SE@@ *+ *+'uAцKdT?l1SE@@ *+ *+'uBцKT?l1SE@@ *+ *+'uCцKT?l1SE@@ *+ *+'uDцKFU?l1SE@@ *+ *+'uEцKU?l1SE@@ *+ *+'uFцKU?l1SE@@ *+ *+'uGцK'V?l1SE@@ *+ *+'uHцKiV?l1SE@@ *+ *+'uIцKV?l1SE@@ *+ *+'uJцK W?l1SE@@ *+ *+'uKцKLW?l1SE@@ *+ *+'uLцKW?l1SE@@ *+ *+'uMцKW?l1SE@@ *+ *+'uNцKJX?l1SE@@ *+ *+'uOцKX?l1SE@@ *+ *+'uPцKX?l1SE@@ *+ *+'uQцK,Y?l1SE@@ *+ *+'uRцKnY?l1SE@@ *+ *+'uSцKY?l1SE@@ *+ *+'uTцKZ?l1SE@@ *+ *+'uUцKPZ?l1SE@@ *+ *+'uVцKZ?l1SE@@ *+ *+'uWцKZ?l1SE@@ *+ *+'uXцK2[?l1SE@@ *+ *+'uYцK[?l1SE@@ *+ *+'uZцK[?l1SE@@ *+ *+'u[цK\?l1SE@@ *+ *+'u\цKs\?l1SE@@ *+ *+'u]цK\?l1SE@@ *+ *+'u^цK]?l1SE@@ *+ *+'u_цKT]?l1SE@@ *+ *+'u`цK]?l1SE@@ *+ *+'uaцK]?l1SE@@ *+ *+'ubцK7^?l1SE@@ *+ *+'ucцK^?l1SE@@ *+ *+'udцK^?l1SE@@ *+ *+'ueцK_?l1SE@@ *+ *+'ufцKw_?l1SE@@ *+ *+'ugцK_?l1SE@@ *+ *+'uhцK_?l1SE@@ *+ *+'uiцKY`?l1SE@@ *+ *+'ujцK`?l1SE@@ *+ *+'ukцK`?l1SE@@ *+ *+'ulцK;a?l1SE@@ *+ *+'umцK}a?l1SE@@ *+ *+'unцKa?l1SE@@ *+ *+'uoцKb?l1SE@@ *+ *+'upцK^b?l1SE@@ *+ *+'uqцKb?l1SE@@ *+ *+'urцKb?l1SE@@ *+ *+'usцK]c?l1SE@@ *+ *+'utцKc?l1SE@@ *+ *+'uuцKc?l1SE@@ *+ *+'uvцK?d?l1SE@@ *+ *+'uwцKd?l1SE@@ *+ *+'uxцKd?l1SE@@ *+ *+'uyцK"e?l1SE@@ *+ *+'uzцKce?l1SE@@ *+ *+'u{цKe?l1SE@@ *+ *+'u|цKf?l1SE@@ *+ *+'u}цKEf?l1SE@@ *+ *+'u~цKf?l1SE@@ *+ *+'uцKf?l1SE@@ *+ *+'uцKDg?l1SE@@ *+ *+'uцKg?l1SE@@ *+ *+'uцKg?l1SE@@ *+ *+'uцK'h?l1SE@@ *+ *+'uцKhh?l1SE@@ *+ *+'uцKh?l1SE@@ *+ *+'uцKh  ?l1SE@@ *+ *+'uцKh<<?l1SE,@@  *+ *+'u@UUцKzVV?l1SEH@@ b *+ *+'4v!C&@цK{?l1SE@@ *+ *+'vцK{?l1SE@@ *+ *+'vцKA|?l1SE@@ *+ *+'vцK|?l1SE@@ *+ *+'vцK|?l1SE@@ *+ *+'vцK"}?l1SE@@ *+ *+'vцKd}?l1SE@@ *+ *+'vцK}?l1SE@@ *+ *+'vцK~?l1SE@@ *+ *+'v цKF~?l1SE@@ *+ *+'v цK~?l1SE@@ *+ *+'v цK~?l1SE@@ *+ *+'v цK(?l1SE@@ *+ *+'v цK?l1SE@@ *+ *+'vцK?l1SE@@ *+ *+'vцK'?l1SE@@ *+ *+'vцKh?l1SE@@ *+ *+'vцK?l1SE@@ *+ *+'vцK?l1SE@@ *+ *+'vцKJ?l1SE@@ *+ *+'vцK?l1SE@@ *+ *+'vцK?l1SE@@ *+ *+'vцK-?l1SE@@ *+ *+'vцK?l1SE@@ *+ *+'vцK̂?l1SE@@ *+ *+'vцK?l1SE@@ *+ *+'vцKm?l1SE@@ *+ *+'vцK?l1SE@@ *+ *+'vцK ?l1SE@@ *+ *+'vцKO?l1SE@@ *+ *+'vцK?l1SE@@ *+ *+'vцK?l1SE@@ *+ *+'v цK1?l1SE@@ *+ *+'v!цKs?l1SE@@ *+ *+'v"цKх?l1SE@@ *+ *+'v#цK?l1SE@@ *+ *+'v$цKr?l1SE@@ *+ *+'v%цK?l1SE@@ *+ *+'v&цK?l1SE@@ *+ *+'v'цKS?l1SE@@ *+ *+'v(цK?l1SE@@ *+ *+'v)цKׇ?l1SE@@ *+ *+'v*цK5?l1SE@@ *+ *+'v+цKx?l1SE@@~ *+ *+'v,цKֈ?l1SE @@} *+ *+'v-цK?l1SE @@| *+ *+'v.цKZ?l1SE @@{ *+ *+'v/цK?l1SE @@z *+ *+'v0цK?l1SE @@y *+ *+'v1цKY?l1SE@@x *+ *+'v2цK?l1SE@@w *+ *+'v3цKۊ?l1SE@@v *+ *+'v4цK:?l1SE@@u *+ *+'v5цK{?l1SE@@t *+ *+'v6цK?l1SE@@s *+ *+'v7цK?l1SE@@r *+ *+'v8цK^?l1SE@@q *+ *+'v9цK?l1SE@@p *+ *+'v:цK?l1SE@@o *+ *+'v;цK@?l1SE@@n *+ *+'v<цK?l1SE@@m *+ *+'v=цK?l1SE@@l *+ *+'v>цK"?l1SE@@k *+ *+'v?цK?l1SE@@j *+ *+'v@цKÎ?l1SE@@i *+ *+'vAцK!?l1SE@@h *+ *+'vBцKb?l1SE@@g *+ *+'vCцK?l1SE @@f *+ *+'vDцK?l1SE!@@e *+ *+'vEцKD?l1SE"@@d *+ *+'vFцK?l1SE#@@c *+ *+'vGцK?l1SE$@@b *+ *+'vHцK&?l1SE%@@a *+ *+'vIцK?l1SE&@@` *+ *+'vJцKǑ?l1SE'@@_ *+ *+'vKцK ?l1SE(@@^ *+ *+'vLцKg?l1SE)@@] *+ *+'vMцK?l1SE*@@\ *+ *+'vNцK?l1SE+@@[ *+ *+'vOцKI?l1SE,@@Z *+ *+'vPцK?l1SE-@@Y *+ *+'vQцK?l1SE.@@X *+ *+'vRцK+?l1SE/@@W *+ *+'vSцKl?l1SE0@@V *+ *+'vTцK˔?l1SE1@@U *+ *+'vUцK?l1SE2@@T *+ *+'vVцKk?l1SE3@@S *+ *+'vWцK?l1SE4@@R *+ *+'vXцK?l1SE5@@Q *+ *+'vYцKM?l1SE6@@P *+ *+'vZцK?l1SE7@@O *+ *+'v[цKі?l1SE8@@N *+ *+'v\цK0?l1SE9@@M *+ *+'v]цKq?l1SE:@@L *+ *+'v^цKЗ?l1SE;@@K *+ *+'v_цK?l1SE<@@J *+ *+'v`цKT?l1SE=@@I *+ *+'vaцK?l1SE>@@H *+ *+'vbцK?l1SE?@@G *+ *+'vcцKQ?l1SE@@@F *+ *+'vdцK?l1SEA@@E *+ *+'veцKՙ?l1SEB@@D *+ *+'vfцK4?l1SEC@@C *+ *+'vgцKu?l1SED@@B *+ *+'vhцK?l1SEE@@A *+ *+'viцK?l1SEF@@@ *+ *+'vjцKW?l1SEG@@? *+ *+'vkцK?l1SEH@@> *+ *+'vlцK?l1SEI@@= *+ *+'vmцK:?l1SEJ@@< *+ *+'vnцK?l1SEK@@; *+ *+'voцKڜ?l1SEL@@: *+ *+'vpцK?l1SEM@@9 *+ *+'vqцK{?l1SEN@@8 *+ *+'vrцK?l1SEO@@7 *+ *+'vsцK?l1SEP@@6 *+ *+'vtцK]?l1SEQ@@5 *+ *+'vuцK?l1SER@@4 *+ *+'vvцK?l1SES@@3 *+ *+'vwцK??l1SET@@2 *+ *+'vxцK?l1SEU@@1 *+ *+'vyцKߟ?l1SEV@@0 *+ *+'vzцK ?l1SEW@@/ *+ *+'v{цK?l1SEX@@. *+ *+'v|цK?l1SEY@@- *+ *+'v}цK?l1SEZ@@, *+ *+'v~цK`?l1SE[@@+ *+ *+'vцK?l1SE\@@* *+ *+'vцK?l1SE]@@) *+ *+'vцKC?l1SE^@@( *+ *+'vцK?l1SE_@@' *+ *+'vцK?l1SE`@@& *+ *+'vцK%?l1SEa@@% *+ *+'vцKg?l1SEb@@$ *+ *+'vцK  ?l1SEc@@' *+ *+'vцK<<?l1SE,d@@ *+ *+'v@UUцKϵVV?l1SEHe@@ *+ *+'4w!OO@цK?l1SEf@@ *+ *+'wцKɶ?l1SEg@@ *+ *+'wцK(?l1SEh@@ *+ *+'wцKi?l1SEi@@ *+ *+'wцK?l1SEj@@ *+ *+'wцK ?l1SEk@@ *+ *+'wцKK?l1SEl@@ *+ *+'wцK?l1SEm@@ *+ *+'wцK?l1SEn@@ *+ *+'w цK-?l1SEo@@ *+ *+'w цK?l1SEp@@ *+ *+'w цK͹?l1SEq@@ *+ *+'w цK?l1SEr@@ *+ *+'w цKm?l1SEs@@ *+ *+'wцK?l1SEt@@ *+ *+'wцK?l1SEu@@ *+ *+'wцKP?l1SEv@@ *+ *+'wцK?l1SEw@@ *+ *+'wцK?l1SEx@@ *+ *+'wцK2?l1SEy@@ *+ *+'wцKs?l1SEz@@ *+ *+'wцKҼ?l1SE{@@ *+ *+'wцK?l1SE|@@ *+ *+'wцKr?l1SE}@@ *+ *+'wцK?l1SE~@@ *+ *+'wцK?l1SE@@ *+ *+'wцKT?l1SE@@ *+ *+'wцK?l1SE@@ *+ *+'wцK?l1SE@@ *+ *+'wцK7?l1SE@@ *+ *+'wцKx?l1SE@@ *+ *+'wцK׿?l1SE@@ *+ *+'w цK?l1SE@@ *+ *+'w!цK[?l1SE@@ *+ *+'w"цK?l1SE@@ *+ *+'w#цK?l1SE@@ *+ *+'w$цKY?l1SE@@ *+ *+'w%цK?l1SE@@ *+ *+'w&цK?l1SE@@ *+ *+'w'цK<?l1SE@@ *+ *+'w(цK}?l1SE@@ *+ *+'w)цK?l1SE@@ *+ *+'w*цK?l1SE@@ *+ *+'w+цK^?l1SE@@ *+ *+'w,цK?l1SE@@ *+ *+'w-цK?l1SE@@ *+ *+'w.цKA?l1SE@@ *+ *+'w/цK?l1SE@@ *+ *+'w0цK?l1SE@@ *+ *+'w1цK@?l1SE@@ *+ *+'w2цK?l1SE@@ *+ *+'w3цK?l1SE@@ *+ *+'w4цK"?l1SE@@ *+ *+'w5цKc?l1SE@@ *+ *+'w6цK?l1SE@@ *+ *+'w7цK?l1SE@@ *+ *+'w8цKF?l1SE@@ *+ *+'w9цK?l1SE@@ *+ *+'w:цK?l1SE@@ *+ *+'w;цK'?l1SE@@ *+ *+'w<цK?l1SE@@ *+ *+'w=цK?l1SE@@ *+ *+'w>цK ?l1SE@@ *+ *+'w?цKh?l1SE@@ *+ *+'w@цK?l1SE@@ *+ *+'wAцK?l1SE@@ *+ *+'wBцKJ?l1SE@@ *+ *+'wCцK?l1SE@@ *+ *+'wDцK?l1SE@@ *+ *+'wEцK,?l1SE@@ *+ *+'wFцKn?l1SE@@ *+ *+'wGцK?l1SE@@ *+ *+'wHцK?l1SE@@ *+ *+'wIцKm?l1SE@@ *+ *+'wJцK?l1SE@@ *+ *+'wKцK?l1SE@@ *+ *+'wLцKN?l1SE@@ *+ *+'wMцK?l1SE@@ *+ *+'wNцK?l1SE@@ *+ *+'wOцK1?l1SE@@ *+ *+'wPцKr?l1SE@@ *+ *+'wQцK?l1SE@@ *+ *+'wRцK?l1SE@@ *+ *+'wSцKT?l1SE@@ *+ *+'wTцK?l1SE@@ *+ *+'wUцK?l1SE@@ *+ *+'wVцKT?l1SE@@ *+ *+'wWцK?l1SE@@ *+ *+'wXцK?l1SE@@ *+ *+'wYцK=?l1SE@@ *+ *+'wZцKw?l1SE@@ *+ *+'w[цK?l1SE@@ *+ *+'w\цK?l1SE@@ *+ *+'w]цKY?l1SE@@ *+ *+'w^цK?l1SE@@ *+ *+'w_цK?l1SE@@ *+ *+'w`цK;?l1SE@@ *+ *+'waцK?l1SE@@ *+ *+'wbцK?l1SE@@ *+ *+'wcцK;?l1SE@@ *+ *+'wdцK|?l1SE@@ *+ *+'weцK?l1SE@@ *+ *+'wfцK?l1SE@@ *+ *+'wgцK^?l1SE@@ *+ *+'whцK?l1SE@@ *+ *+'wiцK?l1SE@@ *+ *+'wjцK??l1SE@@ *+ *+'wkцK?l1SE@@ *+ *+'wlцK?l1SE@@ *+ *+'wmцK"?l1SE@@ *+ *+'wnцK?l1SE@@ *+ *+'woцK?l1SE@@ *+ *+'wpцK?l1SE@@ *+ *+'wqцKb?l1SE@@ *+ *+'wrцK?l1SE@@ *+ *+'wsцK?l1SE@@ *+ *+'wtцKD?l1SE@@ *+ *+'wuцK?l1SE@@ *+ *+'wvцK?l1SE@@ *+ *+'wwцK&?l1SE@@ *+ *+'wxцKh?l1SE@@ *+ *+'wyцK?l1SE@@ *+ *+'wzцK?l1SE@@ *+ *+'w{цKf?l1SE@@ *+ *+'w|цK?l1SE@@ *+ *+'w}цK?l1SE@@ *+ *+'w~цKI?l1SE@@ *+ *+'wцK?l1SE@@ *+ *+'wцK?l1SE@@ *+ *+'wцK*?l1SE@@ *+ *+'wцKk?l1SE@@ *+ *+'wцK?l1SE@@ *+ *+'wцK ?l1SE@@ *+ *+'wцKO?l1SE@@ *+ *+'wцK  ?l1SE@@ *+ *+'wцK<<?l1SE,@@m *+ *+'w@UUцKVV?l1SEH@@P *+ *+'4x!\J@цKO?l1SE@@ *+ *+'xцK?l1SE@@ *+ *+'xцK?l1SE@@ *+ *+'xцK0?l1SE@@ *+ *+'xцKr?l1SE@@ *+ *+'xцK?l1SE@@ *+ *+'xцK?l1SE@@ *+ *+'xцKq?l1SE@@ *+ *+'xцK?l1SE@@ *+ *+'x цK?l1SE@@ *+ *+'x цKT?l1SE@@ *+ *+'x цK?l1SE@@ *+ *+'x цK?l1SE@@ *+ *+'x цK5?l1SE@@ *+ *+'xцKv?l1SE@@ *+ *+'xцK?l1SE@@ *+ *+'xцK?l1SE@@ *+ *+'xцKX?l1SE@@ *+ *+'xцK?l1SE@@ *+ *+'xцK?l1SE@@ *+ *+'xцK;?l1SE@@ *+ *+'xцK?l1SE@@ *+ *+'xцK?l1SE@@ *+ *+'xцK:?l1SE@@ *+ *+'xцK{?l1SE@@ *+ *+'xцK?l1SE@@~ *+ *+'xцK?l1SE @@} *+ *+'xцK^?l1SE @@| *+ *+'xцK?l1SE @@{ *+ *+'xцK?l1SE @@z *+ *+'xцK@?l1SE @@y *+ *+'xцK?l1SE@@x *+ *+'x цK?l1SE@@w *+ *+'x!цK ?l1SE@@v *+ *+'x"цK?l1SE@@u *+ *+'x#цK?l1SE@@t *+ *+'x$цK ?l1SE@@s *+ *+'x%цKa?l1SE@@r *+ *+'x&цK?l1SE@@q *+ *+'x'цK?l1SE@@p *+ *+'x(цKD?l1SE@@o *+ *+'x)цK?l1SE@@n *+ *+'x*цK?l1SE@@m *+ *+'x+цK&?l1SE@@l *+ *+'x,цK?l1SE@@k *+ *+'x-цK?l1SE@@j *+ *+'x.цK ?l1SE@@i *+ *+'x/цKf?l1SE@@h *+ *+'x0цK?l1SE@@g *+ *+'x1цK?l1SE @@f *+ *+'x2цKI?l1SE!@@e *+ *+'x3цK?l1SE"@@d *+ *+'x4цK?l1SE#@@c *+ *+'x5цK+?l1SE$@@b *+ *+'x6цKl?l1SE%@@a *+ *+'x7цK?l1SE&@@` *+ *+'x8цK ?l1SE'@@_ *+ *+'x9цKk?l1SE(@@^ *+ *+'x:цK?l1SE)@@] *+ *+'x;цK?l1SE*@@\ *+ *+'x<цKM?l1SE+@@[ *+ *+'x=цK?l1SE,@@Z *+ *+'x>цK?l1SE-@@Y *+ *+'x?цK0?l1SE.@@X *+ *+'x@цKq?l1SE/@@W *+ *+'xAцK?l1SE0@@V *+ *+'xBцK?l1SE1@@U *+ *+'xCцKR?l1SE2@@T *+ *+'xDцK?l1SE3@@S *+ *+'xEцK?l1SE4@@R *+ *+'xFцK5?l1SE5@@Q *+ *+'xGцK?l1SE6@@P *+ *+'xHцK?l1SE7@@O *+ *+'xIцK4?l1SE8@@N *+ *+'xJцKv?l1SE9@@M *+ *+'xKцK?l1SE:@@L *+ *+'xLцK?l1SE;@@K *+ *+'xMцKW?l1SE<@@J *+ *+'xNцK?l1SE=@@I *+ *+'xOцK?l1SE>@@H *+ *+'xPцK: ?l1SE?@@G *+ *+'xQцK ?l1SE@@@F *+ *+'xRцK ?l1SEA@@E *+ *+'xSцK ?l1SEB@@D *+ *+'xTцK{ ?l1SEC@@C *+ *+'xUцK ?l1SED@@B *+ *+'xVцK ?l1SEE@@A *+ *+'xWцK\ ?l1SEF@@@ *+ *+'xXцK ?l1SEG@@? *+ *+'xYцK ?l1SEH@@> *+ *+'xZцK> ?l1SEI@@= *+ *+'x[цK ?l1SEJ@@< *+ *+'x\цK ?l1SEK@@; *+ *+'x]цK ?l1SEL@@: *+ *+'x^цK ?l1SEM@@9 *+ *+'x_цK ?l1SEN@@8 *+ *+'x`цK?l1SEO@@7 *+ *+'xaцKa?l1SEP@@6 *+ *+'xbцK?l1SEQ@@5 *+ *+'xcцK?l1SER@@4 *+ *+'xdцKB?l1SES@@3 *+ *+'xeцK?l1SET@@2 *+ *+'xfцK?l1SEU@@1 *+ *+'xgцK$?l1SEV@@0 *+ *+'xhцKg?l1SEW@@/ *+ *+'xiцK?l1SEX@@. *+ *+'xjцK?l1SEY@@- *+ *+'xkцKe?l1SEZ@@, *+ *+'xlцK?l1SE[@@+ *+ *+'xmцK?l1SE\@@* *+ *+'xnцKG?l1SE]@@) *+ *+'xoцK?l1SE^@@( *+ *+'xpцK?l1SE_@@' *+ *+'xqцK)?l1SE`@@& *+ *+'xrцKk?l1SEa@@% *+ *+'xsцK?l1SEb@@$ *+ *+'xtцK ?l1SEc@@# *+ *+'xuцKM?l1SEd@@" *+ *+'xvцK?l1SEe@@! *+ *+'xwцK?l1SEf@@ *+ *+'xxцK/?l1SEg@@ *+ *+'xyцK?l1SEh@@ *+ *+'xzцK?l1SEi@@ *+ *+'x{цK-?l1SEj@@ *+ *+'x|цKo?l1SEk@@ *+ *+'x}цK?l1SEl@@ *+ *+'x~цK?l1SEm@@ *+ *+'xцKR?l1SEn@@ *+ *+'xцK?l1SEo@@ *+ *+'xцK?l1SEp@@ *+ *+'xцK4?l1SEq@@ *+ *+'xцK?l1SEr@@ *+ *+'xцK?l1SEs@@ *+ *+'xцK?l1SEt@@ *+ *+'xцKI  ?l1SEu@@ *+ *+'xцKP<<?l1SE,v@@ *+ *+'x@UUцK+VV?l1SEHw@@ *+ *+'4y!h9@цK:,?l1SEx@@ *+ *+'yцK{,?l1SEy@@ *+ *+'yцK,?l1SEz@@ *+ *+'yцK-?l1SE{@@ *+ *+'yцK^-?l1SE|@@ *+ *+'yцK-?l1SE}@@ *+ *+'yцK-?l1SE~@@ *+ *+'yцK].?l1SE@@ *+ *+'yцK.?l1SE@@ *+ *+'y цK.?l1SE@@ *+ *+'y цK>/?l1SE@@ *+ *+'y цK/?l1SE@@ *+ *+'y цK/?l1SE@@ *+ *+'y цK!0?l1SE@@ *+ *+'yцKc0?l1SE@@ *+ *+'yцK0?l1SE@@ *+ *+'yцK1?l1SE@@ *+ *+'yцKD1?l1SE@@ *+ *+'yцK1?l1SE@@ *+ *+'yцK1?l1SE@@ *+ *+'yцK'2?l1SE@@ *+ *+'yцK2?l1SE@@ *+ *+'yцK2?l1SE@@ *+ *+'yцK%3?l1SE@@ *+ *+'yцKg3?l1SE@@ *+ *+'yцK3?l1SE@@ *+ *+'yцK4?l1SE@@ *+ *+'yцKI4?l1SE@@ *+ *+'yцK4?l1SE@@ *+ *+'yцK4?l1SE@@ *+ *+'yцK*5?l1SE@@ *+ *+'yцK5?l1SE@@ *+ *+'y цK5?l1SE@@ *+ *+'y!цK 6?l1SE@@ *+ *+'y"цKm6?l1SE@@ *+ *+'y#цK6?l1SE@@ *+ *+'y$цK 7?l1SE@@ *+ *+'y%цKM7?l1SE@@ *+ *+'y&цK7?l1SE@@ *+ *+'y'цK7?l1SE@@ *+ *+'y(цK/8?l1SE@@ *+ *+'y)цKq8?l1SE@@ *+ *+'y*цK8?l1SE@@ *+ *+'y+цK9?l1SE@@ *+ *+'y,цKp9?l1SE@@ *+ *+'y-цK9?l1SE@@ *+ *+'y.цK9?l1SE@@ *+ *+'y/цKS:?l1SE@@ *+ *+'y0цK:?l1SE@@ *+ *+'y1цK:?l1SE@@ *+ *+'y2цK4;?l1SE@@ *+ *+'y3цKu;?l1SE@@ *+ *+'y4цK;?l1SE@@ *+ *+'y5цK<?l1SE@@ *+ *+'y6цKX<?l1SE@@ *+ *+'y7цK<?l1SE@@ *+ *+'y8цK<?l1SE@@ *+ *+'y9цKW=?l1SE@@ *+ *+'y:цK=?l1SE@@ *+ *+'y;цK=?l1SE@@ *+ *+'y<цK9>?l1SE@@ *+ *+'y=цKz>?l1SE@@ *+ *+'y>цK>?l1SE@@ *+ *+'y?цK??l1SE@@ *+ *+'y@цK]??l1SE@@ *+ *+'yAцK??l1SE@@ *+ *+'yBцK??l1SE@@ *+ *+'yCцK>@?l1SE@@ *+ *+'yDцK@?l1SE@@ *+ *+'yEцK@?l1SE@@ *+ *+'yFцK A?l1SE@@ *+ *+'yGцKA?l1SE@@ *+ *+'yHцKA?l1SE@@ *+ *+'yIцKB?l1SE@@ *+ *+'yJцKaB?l1SE@@ *+ *+'yKцKB?l1SE@@ *+ *+'yLцKC?l1SE@@ *+ *+'yMцKCC?l1SE@@ *+ *+'yNцKC?l1SE@@ *+ *+'yOцKC?l1SE@@ *+ *+'yPцK%D?l1SE@@ *+ *+'yQцKD?l1SE@@ *+ *+'yRцKD?l1SE@@ *+ *+'ySцKE?l1SE@@ *+ *+'yTцKeE?l1SE@@ *+ *+'yUцKE?l1SE@@ *+ *+'yVцKF?l1SE@@ *+ *+'yWцKHF?l1SE@@ *+ *+'yXцKF?l1SE@@ *+ *+'yYцKF?l1SE@@ *+ *+'yZцK)G?l1SE@@ *+ *+'y[цKkG?l1SE@@ *+ *+'y\цKG?l1SE@@ *+ *+'y]цK H?l1SE@@ *+ *+'y^цKkH?l1SE@@ *+ *+'y_цKH?l1SE@@ *+ *+'y`цKH?l1SE@@ *+ *+'yaцKLI?l1SE@@ *+ *+'ybцKI?l1SE@@ *+ *+'ycцKI?l1SE@@ *+ *+'ydцK/J?l1SE@@ *+ *+'yeцKoJ?l1SE@@ *+ *+'yfцKJ?l1SE@@ *+ *+'ygцKK?l1SE@@ *+ *+'yhцKRK?l1SE@@ *+ *+'yiцKK?l1SE@@ *+ *+'yjцKK?l1SE@@ *+ *+'ykцKQL?l1SE@@ *+ *+'ylцKL?l1SE@@ *+ *+'ymцKL?l1SE@@ *+ *+'ynцK3M?l1SE@@ *+ *+'yoцKuM?l1SE@@ *+ *+'ypцKM?l1SE@@ *+ *+'yqцKN?l1SE@@ *+ *+'yrцKWN?l1SE@@ *+ *+'ysцKN?l1SE@@ *+ *+'ytцKN?l1SE@@ *+ *+'yuцK8O?l1SE@@ *+ *+'yvцKO?l1SE@@ *+ *+'ywцKO?l1SE@@ *+ *+'yxцKP?l1SE@@ *+ *+'yyцKyP?l1SE@@ *+ *+'yzцKP?l1SE@@ *+ *+'y{цKQ?l1SE@@ *+ *+'y|цK[Q?l1SE@@ *+ *+'y}цKQ?l1SE@@ *+ *+'y~цKQ?l1SE@@ *+ *+'yцK=R?l1SE@@ *+ *+'yцKR?l1SE@@ *+ *+'yцKR?l1SE@@ *+ *+'yцKS?l1SE@@ *+ *+'yцK}S?l1SE@@ *+ *+'yцKS?l1SE@@ *+ *+'yцKT?l1SE@@ *+ *+'yцK3T  ?l1SE@@ *+ *+'yцK;T<<?l1SE,@@[ *+ *+'y@UUцKIfVV?l1SEH@@> *+ *+'4z!uo@цKg?l1SE@@ *+ *+'zцKBg?l1SE@@ *+ *+'zцKg?l1SE@@ *+ *+'zцKg?l1SE@@ *+ *+'zцK&h?l1SE@@ *+ *+'zцKh?l1SE@@ *+ *+'zцKh?l1SE@@ *+ *+'zцK%i?l1SE@@~ *+ *+'zцKfi?l1SE @@} *+ *+'z цKi?l1SE @@| *+ *+'z цKj?l1SE @@{ *+ *+'z цKGj?l1SE @@z *+ *+'z цKj?l1SE @@y *+ *+'z цKj?l1SE@@x *+ *+'zцK*k?l1SE@@w *+ *+'zцKk?l1SE@@v *+ *+'zцKk?l1SE@@u *+ *+'zцK l?l1SE@@t *+ *+'zцKjl?l1SE@@s *+ *+'zцKl?l1SE@@r *+ *+'zцKl?l1SE@@q *+ *+'zцKLm?l1SE@@p *+ *+'zцKm?l1SE@@o *+ *+'zцKm?l1SE@@n *+ *+'zцK-n?l1SE@@m *+ *+'zцKpn?l1SE@@l *+ *+'zцKn?l1SE@@k *+ *+'zцKo?l1SE@@j *+ *+'zцKpo?l1SE@@i *+ *+'zцKo?l1SE@@h *+ *+'zцKo?l1SE@@g *+ *+'zцKQp?l1SE @@f *+ *+'z цKp?l1SE!@@e *+ *+'z!цKp?l1SE"@@d *+ *+'z"цK3q?l1SE#@@c *+ *+'z#цKuq?l1SE$@@b *+ *+'z$цKq?l1SE%@@a *+ *+'z%цKr?l1SE&@@` *+ *+'z&цKWr?l1SE'@@_ *+ *+'z'цKr?l1SE(@@^ *+ *+'z(цKr?l1SE)@@] *+ *+'z)цK8s?l1SE*@@\ *+ *+'z*цKs?l1SE+@@[ *+ *+'z+цKs?l1SE,@@Z *+ *+'z,цK7t?l1SE-@@Y *+ *+'z-цKyt?l1SE.@@X *+ *+'z.цKt?l1SE/@@W *+ *+'z/цKu?l1SE0@@V *+ *+'z0цK[u?l1SE1@@U *+ *+'z1цKu?l1SE2@@T *+ *+'z2цKu?l1SE3@@S *+ *+'z3цK=v?l1SE4@@R *+ *+'z4цKv?l1SE5@@Q *+ *+'z5цKv?l1SE6@@P *+ *+'z6цKw?l1SE7@@O *+ *+'z7цK~w?l1SE8@@N *+ *+'z8цKw?l1SE9@@M *+ *+'z9цKx?l1SE:@@L *+ *+'z:цK`x?l1SE;@@K *+ *+'z;цKx?l1SE<@@J *+ *+'z<цKy?l1SE=@@I *+ *+'z=цKAy?l1SE>@@H *+ *+'z>цKy?l1SE?@@G *+ *+'z?цKy?l1SE@@@F *+ *+'z@цK#z?l1SEA@@E *+ *+'zAцKz?l1SEB@@D *+ *+'zBцKz?l1SEC@@C *+ *+'zCцK{?l1SED@@B *+ *+'zDцKd{?l1SEE@@A *+ *+'zEцK{?l1SEF@@@ *+ *+'zFцK{?l1SEG@@? *+ *+'zGцKF|?l1SEH@@> *+ *+'zHцK|?l1SEI@@= *+ *+'zIцK|?l1SEJ@@< *+ *+'zJцK(}?l1SEK@@; *+ *+'zKцKj}?l1SEL@@: *+ *+'zLцK}?l1SEM@@9 *+ *+'zMцK ~?l1SEN@@8 *+ *+'zNцKh~?l1SEO@@7 *+ *+'zOцK~?l1SEP@@6 *+ *+'zPцK~?l1SEQ@@5 *+ *+'zQцKK?l1SER@@4 *+ *+'zRцK?l1SES@@3 *+ *+'zSцK?l1SET@@2 *+ *+'zTцK-?l1SEU@@1 *+ *+'zUцKn?l1SEV@@0 *+ *+'zVцK̀?l1SEW@@/ *+ *+'zWцK?l1SEX@@. *+ *+'zXцKQ?l1SEY@@- *+ *+'zYцK?l1SEZ@@, *+ *+'zZцK?l1SE[@@+ *+ *+'z[цK2?l1SE\@@* *+ *+'z\цK?l1SE]@@) *+ *+'z]цKӂ?l1SE^@@( *+ *+'z^цK1?l1SE_@@' *+ *+'z_цKs?l1SE`@@& *+ *+'z`цK?l1SEa@@% *+ *+'zaцK?l1SEb@@$ *+ *+'zbцKU?l1SEc@@# *+ *+'zcцK?l1SEd@@" *+ *+'zdцK?l1SEe@@! *+ *+'zeцK7?l1SEf@@ *+ *+'zfцK?l1SEg@@ *+ *+'zgцK؅?l1SEh@@ *+ *+'zhцK?l1SEi@@ *+ *+'ziцKx?l1SEj@@ *+ *+'zjцK?l1SEk@@ *+ *+'zkцK?l1SEl@@ *+ *+'zlцKY?l1SEm@@ *+ *+'zmцK?l1SEn@@ *+ *+'znцK?l1SEo@@ *+ *+'zoцK=?l1SEp@@ *+ *+'zpцK~?l1SEq@@ *+ *+'zqцK܈?l1SEr@@ *+ *+'zrцK?l1SEs@@ *+ *+'zsцK|?l1SEt@@ *+ *+'ztцK?l1SEu@@ *+ *+'zuцK?l1SEv@@ *+ *+'zvцK^?l1SEw@@ *+ *+'zwцK?l1SEx@@ *+ *+'zxцK?l1SEy@@ *+ *+'zyцK@?l1SEz@@ *+ *+'zzцK?l1SE{@@ *+ *+'z{цK?l1SE|@@ *+ *+'z|цK#?l1SE}@@ *+ *+'z}цKd?l1SE~@@ *+ *+'z~цKČ?l1SE@@ *+ *+'zцK?l1SE@@ *+ *+'zцKc?l1SE@@ *+ *+'zцK?l1SE@@ *+ *+'zцK?l1SE@@ *+ *+'zцKE?l1SE@@ *+ *+'zцK?l1SE@@ *+ *+'zцKȎ?l1SE@@ *+ *+'zцK  ?l1SE@@ *+ *+'zцK<<?l1SE,@@ *+ *+'z@UUцK3VV?l1SEH@@ *+ *+'4{!@цK?l1SE@@ *+ *+'{цK*?l1SE@@ *+ *+'{цK?l1SE@@ *+ *+'{цKˢ?l1SE@@ *+ *+'{цK ?l1SE@@ *+ *+'{цKj?l1SE@@ *+ *+'{цK?l1SE@@ *+ *+'{цK ?l1SE@@ *+ *+'{цKM?l1SE@@ *+ *+'{ цK?l1SE@@ *+ *+'{ цK?l1SE@@ *+ *+'{ цK/?l1SE@@ *+ *+'{ цKp?l1SE@@ *+ *+'{ цKϥ?l1SE@@ *+ *+'{цK?l1SE@@ *+ *+'{цKp?l1SE@@ *+ *+'{цK?l1SE@@ *+ *+'{цK?l1SE@@ *+ *+'{цKR?l1SE@@ *+ *+'{цK?l1SE@@ *+ *+'{цKէ?l1SE@@ *+ *+'{цK4?l1SE@@ *+ *+'{цKu?l1SE@@ *+ *+'{цKԨ?l1SE@@ *+ *+'{цK?l1SE@@ *+ *+'{цKX?l1SE@@ *+ *+'{цK?l1SE@@ *+ *+'{цK?l1SE@@ *+ *+'{цKV?l1SE@@ *+ *+'{цK?l1SE@@ *+ *+'{цKڪ?l1SE@@ *+ *+'{цK9?l1SE@@ *+ *+'{ цKz?l1SE@@ *+ *+'{!цK?l1SE@@ *+ *+'{"цK?l1SE@@ *+ *+'{#цK\?l1SE@@ *+ *+'{$цK?l1SE@@ *+ *+'{%цK?l1SE@@ *+ *+'{&цK>?l1SE@@ *+ *+'{'цK?l1SE@@ *+ *+'{(цKޭ?l1SE@@ *+ *+'{)цK ?l1SE@@ *+ *+'{*цK?l1SE@@ *+ *+'{+цK?l1SE@@ *+ *+'{,цK?l1SE@@ *+ *+'{-цK`?l1SE@@ *+ *+'{.цK?l1SE@@ *+ *+'{/цK?l1SE@@ *+ *+'{0цKD?l1SE@@ *+ *+'{1цK?l1SE@@ *+ *+'{2цK?l1SE@@ *+ *+'{3цK%?l1SE@@ *+ *+'{4цK?l1SE@@ *+ *+'{5цKű?l1SE@@ *+ *+'{6цK?l1SE@@ *+ *+'{7цKe?l1SE@@ *+ *+'{8цK?l1SE@@ *+ *+'{9цK?l1SE@@ *+ *+'{:цKG?l1SE@@ *+ *+'{;цK?l1SE@@ *+ *+'{<цK?l1SE@@ *+ *+'{=цK)?l1SE@@ *+ *+'{>цKj?l1SE@@ *+ *+'{?цKʴ?l1SE@@ *+ *+'{@цK ?l1SE@@ *+ *+'{AцKi?l1SE@@ *+ *+'{BцK?l1SE@@ *+ *+'{CцK?l1SE@@ *+ *+'{DцKL?l1SE@@ *+ *+'{EцK?l1SE@@ *+ *+'{FцKж?l1SE@@ *+ *+'{GцK-?l1SE@@ *+ *+'{HцKp?l1SE@@ *+ *+'{IцKϷ?l1SE@@ *+ *+'{JцK?l1SE@@ *+ *+'{KцKR?l1SE@@ *+ *+'{LцK?l1SE@@ *+ *+'{MцK?l1SE@@ *+ *+'{NцKQ?l1SE@@ *+ *+'{OцK?l1SE@@ *+ *+'{PцKչ?l1SE@@ *+ *+'{QцK2?l1SE@@ *+ *+'{RцKt?l1SE@@ *+ *+'{SцK?l1SE@@ *+ *+'{TцK?l1SE@@ *+ *+'{UцKV?l1SE@@ *+ *+'{VцK?l1SE@@ *+ *+'{WцK?l1SE@@ *+ *+'{XцK8?l1SE@@ *+ *+'{YцK?l1SE@@ *+ *+'{ZцKؼ?l1SE@@ *+ *+'{[цK?l1SE@@ *+ *+'{\цKy?l1SE@@ *+ *+'{]цK?l1SE@@ *+ *+'{^цK?l1SE@@ *+ *+'{_цK[?l1SE@@ *+ *+'{`цK?l1SE@@ *+ *+'{aцK?l1SE@@ *+ *+'{bцK<?l1SE@@ *+ *+'{cцK?l1SE@@ *+ *+'{dцKܿ?l1SE@@ *+ *+'{eцK?l1SE@@ *+ *+'{fцK}?l1SE@@ *+ *+'{gцK?l1SE@@ *+ *+'{hцK?l1SE@@ *+ *+'{iцK_?l1SE@@ *+ *+'{jцK?l1SE@@ *+ *+'{kцK?l1SE@@ *+ *+'{lцKA?l1SE@@ *+ *+'{mцK?l1SE@@ *+ *+'{nцK?l1SE@@ *+ *+'{oцK"?l1SE@@ *+ *+'{pцKf?l1SE@@ *+ *+'{qцK?l1SE@@ *+ *+'{rцK?l1SE@@ *+ *+'{sцKc?l1SE@@ *+ *+'{tцK?l1SE@@ *+ *+'{uцK?l1SE@@ *+ *+'{vцKF?l1SE@@ *+ *+'{wцK?l1SE@@ *+ *+'{xцK?l1SE@@ *+ *+'{yцK(?l1SE@@ *+ *+'{zцKj?l1SE@@ *+ *+'{{цK?l1SE@@ *+ *+'{|цK ?l1SE@@ *+ *+'{}цKL?l1SE@@ *+ *+'{~цK?l1SE@@~ *+ *+'{цK?l1SE @@} *+ *+'{цKK?l1SE @@| *+ *+'{цK?l1SE @@{ *+ *+'{цK?l1SE @@z *+ *+'{цK,?l1SE @@y *+ *+'{цKm?l1SE@@x *+ *+'{цK?l1SE@@w *+ *+'{цK  ?l1SE@@z *+ *+'{цK<<?l1SE,@@I *+ *+'{@UUцKVV?l1SEH@@, *+ *+'4|!w@цK?l1SE@@s *+ *+'|цK?l1SE@@r *+ *+'|цKQ?l1SE@@q *+ *+'|цK?l1SE@@p *+ *+'|цK?l1SE@@o *+ *+'|цK2?l1SE@@n *+ *+'|цKs?l1SE@@m *+ *+'|цK?l1SE@@l *+ *+'|цK?l1SE@@k *+ *+'| цKV?l1SE@@j *+ *+'| цK?l1SE@@i *+ *+'| цK?l1SE@@h *+ *+'| цK8?l1SE@@g *+ *+'| цK?l1SE @@f *+ *+'|цK?l1SE!@@e *+ *+'|цK7?l1SE"@@d *+ *+'|цKy?l1SE#@@c *+ *+'|цK?l1SE$@@b *+ *+'|цK?l1SE%@@a *+ *+'|цK[?l1SE&@@` *+ *+'|цK?l1SE'@@_ *+ *+'|цK?l1SE(@@^ *+ *+'|цK>?l1SE)@@] *+ *+'|цK?l1SE*@@\ *+ *+'|цK?l1SE+@@[ *+ *+'|цK?l1SE,@@Z *+ *+'|цK}?l1SE-@@Y *+ *+'|цK?l1SE.@@X *+ *+'|цK?l1SE/@@W *+ *+'|цK_?l1SE0@@V *+ *+'|цK?l1SE1@@U *+ *+'|цK?l1SE2@@T *+ *+'| цKB?l1SE3@@S *+ *+'|!цK?l1SE4@@R *+ *+'|"цK?l1SE5@@Q *+ *+'|#цK#?l1SE6@@P *+ *+'|$цK?l1SE7@@O *+ *+'|%цK?l1SE8@@N *+ *+'|&цK?l1SE9@@M *+ *+'|'цKc?l1SE:@@L *+ *+'|(цK?l1SE;@@K *+ *+'|)цK?l1SE<@@J *+ *+'|*цKG?l1SE=@@I *+ *+'|+цK?l1SE>@@H *+ *+'|,цK?l1SE?@@G *+ *+'|-цK(?l1SE@@@F *+ *+'|.цKu?l1SEA@@E *+ *+'|/цK?l1SEB@@D *+ *+'|0цK ?l1SEC@@C *+ *+'|1цKh?l1SED@@B *+ *+'|2цK?l1SEE@@A *+ *+'|3цK?l1SEF@@@ *+ *+'|4цKJ?l1SEG@@? *+ *+'|5цK?l1SEH@@> *+ *+'|6цK?l1SEI@@= *+ *+'|7цK-?l1SEJ@@< *+ *+'|8цKn?l1SEK@@; *+ *+'|9цK?l1SEL@@: *+ *+'|:цK?l1SEM@@9 *+ *+'|;цKP?l1SEN@@8 *+ *+'|<цK?l1SEO@@7 *+ *+'|=цK?l1SEP@@6 *+ *+'|>цK3?l1SEQ@@5 *+ *+'|?цK?l1SER@@4 *+ *+'|@цK?l1SES@@3 *+ *+'|AцK2?l1SET@@2 *+ *+'|BцKs?l1SEU@@1 *+ *+'|CцK?l1SEV@@0 *+ *+'|DцK?l1SEW@@/ *+ *+'|EцKU?l1SEX@@. *+ *+'|FцK?l1SEY@@- *+ *+'|GцK?l1SEZ@@, *+ *+'|HцK7?l1SE[@@+ *+ *+'|IцK?l1SE\@@* *+ *+'|JцK?l1SE]@@) *+ *+'|KцK?l1SE^@@( *+ *+'|LцKw?l1SE_@@' *+ *+'|MцK?l1SE`@@& *+ *+'|NцK?l1SEa@@% *+ *+'|OцKY?l1SEb@@$ *+ *+'|PцK?l1SEc@@# *+ *+'|QцK?l1SEd@@" *+ *+'|RцK<?l1SEe@@! *+ *+'|SцK~?l1SEf@@ *+ *+'|TцK?l1SEg@@ *+ *+'|UцK?l1SEh@@ *+ *+'|VцK|?l1SEi@@ *+ *+'|WцK?l1SEj@@ *+ *+'|XцK?l1SEk@@ *+ *+'|YцK_?l1SEl@@ *+ *+'|ZцK?l1SEm@@ *+ *+'|[цK?l1SEn@@ *+ *+'|\цK@?l1SEo@@ *+ *+'|]цK?l1SEp@@ *+ *+'|^цK?l1SEq@@ *+ *+'|_цK"?l1SEr@@ *+ *+'|`цKd?l1SEs@@ *+ *+'|aцK?l1SEt@@ *+ *+'|bцK?l1SEu@@ *+ *+'|cцKc?l1SEv@@ *+ *+'|dцK?l1SEw@@ *+ *+'|eцK?l1SEx@@ *+ *+'|fцKE?l1SEy@@ *+ *+'|gцK?l1SEz@@ *+ *+'|hцK?l1SE{@@ *+ *+'|iцK&?l1SE|@@ *+ *+'|jцKi?l1SE}@@ *+ *+'|kцK?l1SE~@@ *+ *+'|lцK ?l1SE@@ *+ *+'|mцKJ?l1SE@@ *+ *+'|nцK?l1SE@@ *+ *+'|oцK?l1SE@@ *+ *+'|pцK,?l1SE@@ *+ *+'|qцK?l1SE@@ *+ *+'|rцK?l1SE@@ *+ *+'|sцK+?l1SE@@ *+ *+'|tцKl?l1SE@@ *+ *+'|uцK?l1SE@@ *+ *+'|vцK?l1SE@@ *+ *+'|wцKO?l1SE@@ *+ *+'|xцK?l1SE@@ *+ *+'|yцK?l1SE@@ *+ *+'|zцK0?l1SE@@ *+ *+'|{цK?l1SE@@ *+ *+'||цK?l1SE@@ *+ *+'|}цK?l1SE@@ *+ *+'|~цKq?l1SE@@ *+ *+'|цK?l1SE@@ *+ *+'|цK?l1SE@@ *+ *+'|цKS?l1SE@@ *+ *+'|цK?l1SE@@ *+ *+'|цK?l1SE@@ *+ *+'|цK6?l1SE@@ *+ *+'|цKw?l1SE@@ *+ *+'|цK  ?l1SE@@ *+ *+'|цK<<?l1SE,@@ *+ *+'|@UUцKVV?l1SEH@@ *+ *+'4}!(@цK?l1SE@@ *+ *+'}цK?l1SE@@ *+ *+'}цK<?l1SE@@ *+ *+'}цK}?l1SE@@ *+ *+'}цK?l1SE@@ *+ *+'}цK?l1SE@@ *+ *+'}цK_?l1SE@@ *+ *+'}цK?l1SE@@ *+ *+'}цK?l1SE@@ *+ *+'} цKA?l1SE@@ *+ *+'} цK?l1SE@@ *+ *+'} цK?l1SE@@ *+ *+'} цK$?l1SE@@ *+ *+'} цK?l1SE@@ *+ *+'}цK?l1SE@@ *+ *+'}цK"?l1SE@@ *+ *+'}цKd?l1SE@@ *+ *+'}цK?l1SE@@ *+ *+'}цK?l1SE@@ *+ *+'}цKF?l1SE@@ *+ *+'}цK?l1SE@@ *+ *+'}цK?l1SE@@ *+ *+'}цK(?l1SE@@ *+ *+'}цK?l1SE@@ *+ *+'}цK?l1SE@@ *+ *+'}цK ?l1SE@@ *+ *+'}цKh?l1SE@@ *+ *+'}цK?l1SE@@ *+ *+'}цK ?l1SE@@ *+ *+'}цKK ?l1SE@@ *+ *+'}цK ?l1SE@@ *+ *+'}цK ?l1SE@@ *+ *+'} цK,!?l1SE@@ *+ *+'}!цKo!?l1SE@@ *+ *+'}"цK!?l1SE@@ *+ *+'}#цK"?l1SE@@ *+ *+'}$цKm"?l1SE@@ *+ *+'}%цK"?l1SE@@ *+ *+'}&цK"?l1SE@@ *+ *+'}'цKP#?l1SE@@ *+ *+'}(цK#?l1SE@@ *+ *+'})цK#?l1SE@@ *+ *+'}*цK2$?l1SE@@ *+ *+'}+цKs$?l1SE@@ *+ *+'},цK$?l1SE@@ *+ *+'}-цK%?l1SE@@ *+ *+'}.цKU%?l1SE@@ *+ *+'}/цK%?l1SE@@ *+ *+'}0цK%?l1SE@@ *+ *+'}1цKS&?l1SE@@ *+ *+'}2цK&?l1SE@@ *+ *+'}3цK&?l1SE@@ *+ *+'}4цK6'?l1SE@@ *+ *+'}5цKx'?l1SE@@ *+ *+'}6цK'?l1SE@@ *+ *+'}7цK(?l1SE@@ *+ *+'}8цKY(?l1SE@@ *+ *+'}9цK(?l1SE@@ *+ *+'}:цK(?l1SE@@ *+ *+'};цK<)?l1SE@@ *+ *+'}<цK)?l1SE@@ *+ *+'}=цK)?l1SE@@ *+ *+'}>цK*?l1SE@@ *+ *+'}?цK|*?l1SE@@ *+ *+'}@цK*?l1SE@@ *+ *+'}AцK+?l1SE@@ *+ *+'}BцK^+?l1SE@@ *+ *+'}CцK+?l1SE@@ *+ *+'}DцK+?l1SE@@ *+ *+'}EцK@,?l1SE@@ *+ *+'}FцK,?l1SE@@ *+ *+'}GцK,?l1SE@@ *+ *+'}HцK"-?l1SE@@ *+ *+'}IцK-?l1SE@@ *+ *+'}JцK-?l1SE@@ *+ *+'}KцK.?l1SE@@ *+ *+'}LцKc.?l1SE@@ *+ *+'}MцK.?l1SE@@ *+ *+'}NцK/?l1SE@@ *+ *+'}OцKD/?l1SE@@ *+ *+'}PцK/?l1SE@@ *+ *+'}QцK/?l1SE@@ *+ *+'}RцK'0?l1SE@@ *+ *+'}SцKi0?l1SE@@ *+ *+'}TцK0?l1SE@@ *+ *+'}UцK1?l1SE@@ *+ *+'}VцKh1?l1SE@@ *+ *+'}WцK1?l1SE@@ *+ *+'}XцK1?l1SE@@ *+ *+'}YцKI2?l1SE@@ *+ *+'}ZцK2?l1SE@@ *+ *+'}[цK2?l1SE@@ *+ *+'}\цK,3?l1SE@@ *+ *+'}]цKm3?l1SE@@ *+ *+'}^цK3?l1SE@@ *+ *+'}_цK 4?l1SE@@ *+ *+'}`цKN4?l1SE@@ *+ *+'}aцK4?l1SE@@ *+ *+'}bцK4?l1SE@@ *+ *+'}cцKN5?l1SE@@ *+ *+'}dцK5?l1SE@@ *+ *+'}eцK5?l1SE@@ *+ *+'}fцK/6?l1SE@@ *+ *+'}gцKs6?l1SE@@ *+ *+'}hцK6?l1SE@@ *+ *+'}iцK7?l1SE@@ *+ *+'}jцKS7?l1SE@@ *+ *+'}kцK7?l1SE@@ *+ *+'}lцK7?l1SE@@~ *+ *+'}mцK58?l1SE @@} *+ *+'}nцK8?l1SE @@| *+ *+'}oцK8?l1SE @@{ *+ *+'}pцK9?l1SE @@z *+ *+'}qцKw9?l1SE @@y *+ *+'}rцK9?l1SE@@x *+ *+'}sцK:?l1SE@@w *+ *+'}tцKY:?l1SE@@v *+ *+'}uцK:?l1SE@@u *+ *+'}vцK:?l1SE@@t *+ *+'}wцK:;?l1SE@@s *+ *+'}xцK};?l1SE@@r *+ *+'}yцK;?l1SE@@q *+ *+'}zцK<?l1SE@@p *+ *+'}{цKz<?l1SE@@o *+ *+'}|цK<?l1SE@@n *+ *+'}}цK<?l1SE@@m *+ *+'}~цK]=?l1SE@@l *+ *+'}цK=?l1SE@@k *+ *+'}цK=?l1SE@@j *+ *+'}цK>>?l1SE@@i *+ *+'}цK>?l1SE@@h *+ *+'}цK>?l1SE@@g *+ *+'}цK ??l1SE @@f *+ *+'}цKc??l1SE!@@e *+ *+'}цK?  ?l1SE"@@h *+ *+'}цK?<<?l1SE,#@@7 *+ *+'}@UUцKQVV?l1SEH$@@ *+ *+'4~!1@цKgR?l1SE%@@a *+ *+'~цKR?l1SE&@@` *+ *+'~цKS?l1SE'@@_ *+ *+'~цKIS?l1SE(@@^ *+ *+'~цKS?l1SE)@@] *+ *+'~цKS?l1SE*@@\ *+ *+'~цK*T?l1SE+@@[ *+ *+'~цKT?l1SE,@@Z *+ *+'~цKT?l1SE-@@Y *+ *+'~ цK U?l1SE.@@X *+ *+'~ цKkU?l1SE/@@W *+ *+'~ цKU?l1SE0@@V *+ *+'~ цKU?l1SE1@@U *+ *+'~ цKMV?l1SE2@@T *+ *+'~цKV?l1SE3@@S *+ *+'~цKV?l1SE4@@R *+ *+'~цK/W?l1SE5@@Q *+ *+'~цKqW?l1SE6@@P *+ *+'~цKW?l1SE7@@O *+ *+'~цKX?l1SE8@@N *+ *+'~цKTX?l1SE9@@M *+ *+'~цKX?l1SE:@@L *+ *+'~цKX?l1SE;@@K *+ *+'~цKRY?l1SE<@@J *+ *+'~цKY?l1SE=@@I *+ *+'~цKY?l1SE>@@H *+ *+'~цK4Z?l1SE?@@G *+ *+'~цKvZ?l1SE@@@F *+ *+'~цKZ?l1SEA@@E *+ *+'~цK[?l1SEB@@D *+ *+'~цKX[?l1SEC@@C *+ *+'~цK[?l1SED@@B *+ *+'~ цK[?l1SEE@@A *+ *+'~!цK:\?l1SEF@@@ *+ *+'~"цK\?l1SEG@@? *+ *+'~#цK\?l1SEH@@> *+ *+'~$цK9]?l1SEI@@= *+ *+'~%цKz]?l1SEJ@@< *+ *+'~&цK]?l1SEK@@; *+ *+'~'цK^?l1SEL@@: *+ *+'~(цK\^?l1SEM@@9 *+ *+'~)цK^?l1SEN@@8 *+ *+'~*цK^?l1SEO@@7 *+ *+'~+цK?_?l1SEP@@6 *+ *+'~,цK_?l1SEQ@@5 *+ *+'~-цK_?l1SER@@4 *+ *+'~.цK `?l1SES@@3 *+ *+'~/цK`?l1SET@@2 *+ *+'~0цK`?l1SEU@@1 *+ *+'~1цKa?l1SEV@@0 *+ *+'~2цK`a?l1SEW@@/ *+ *+'~3цKa?l1SEX@@. *+ *+'~4цKb?l1SEY@@- *+ *+'~5цKDb?l1SEZ@@, *+ *+'~6цKb?l1SE[@@+ *+ *+'~7цKb?l1SE\@@* *+ *+'~8цK%c?l1SE]@@) *+ *+'~9цKc?l1SE^@@( *+ *+'~:цKc?l1SE_@@' *+ *+'~;цKd?l1SE`@@& *+ *+'~<цKed?l1SEa@@% *+ *+'~=цKd?l1SEb@@$ *+ *+'~>цKd?l1SEc@@# *+ *+'~?цKGe?l1SEd@@" *+ *+'~@цKe?l1SEe@@! *+ *+'~AцKe?l1SEf@@ *+ *+'~BцK*f?l1SEg@@ *+ *+'~CцKkf?l1SEh@@ *+ *+'~DцKf?l1SEi@@ *+ *+'~EцK g?l1SEj@@ *+ *+'~FцKMg?l1SEk@@ *+ *+'~GцKg?l1SEl@@ *+ *+'~HцKg?l1SEm@@ *+ *+'~IцKLh?l1SEn@@ *+ *+'~JцKh?l1SEo@@ *+ *+'~KцKh?l1SEp@@ *+ *+'~LцK-i?l1SEq@@ *+ *+'~MцKoi?l1SEr@@ *+ *+'~NцKi?l1SEs@@ *+ *+'~OцKj?l1SEt@@ *+ *+'~PцKQj?l1SEu@@ *+ *+'~QцKj?l1SEv@@ *+ *+'~RцKj?l1SEw@@ *+ *+'~SцK3k?l1SEx@@ *+ *+'~TцKk?l1SEy@@ *+ *+'~UцKk?l1SEz@@ *+ *+'~VцK2l?l1SE{@@ *+ *+'~WцKul?l1SE|@@ *+ *+'~XцKl?l1SE}@@ *+ *+'~YцKm?l1SE~@@ *+ *+'~ZцKWm?l1SE@@ *+ *+'~[цKm?l1SE@@ *+ *+'~\цKm?l1SE@@ *+ *+'~]цK7n?l1SE@@ *+ *+'~^цKn?l1SE@@ *+ *+'~_цKn?l1SE@@ *+ *+'~`цKo?l1SE@@ *+ *+'~aцKxo?l1SE@@ *+ *+'~bцKo?l1SE@@ *+ *+'~cцKp?l1SE@@ *+ *+'~dцK[p?l1SE@@ *+ *+'~eцKp?l1SE@@ *+ *+'~fцKp?l1SE@@ *+ *+'~gцK=q?l1SE@@ *+ *+'~hцK~q?l1SE@@ *+ *+'~iцKq?l1SE@@ *+ *+'~jцKr?l1SE@@ *+ *+'~kцK}r?l1SE@@ *+ *+'~lцKr?l1SE@@ *+ *+'~mцKs?l1SE@@ *+ *+'~nцK`s?l1SE@@ *+ *+'~oцKs?l1SE@@ *+ *+'~pцKs?l1SE@@ *+ *+'~qцKAt?l1SE@@ *+ *+'~rцKt?l1SE@@ *+ *+'~sцKt?l1SE@@ *+ *+'~tцK#u?l1SE@@ *+ *+'~uцKeu?l1SE@@ *+ *+'~vцKu?l1SE@@ *+ *+'~wцKv?l1SE@@ *+ *+'~xцKGv?l1SE@@ *+ *+'~yцKv?l1SE@@ *+ *+'~zцKv?l1SE@@ *+ *+'~{цKFw?l1SE@@ *+ *+'~|цKw?l1SE@@ *+ *+'~}цKw?l1SE@@ *+ *+'~~цK(x?l1SE@@ *+ *+'~цKix?l1SE@@ *+ *+'~цKx?l1SE@@ *+ *+'~цK y?l1SE@@ *+ *+'~цKLy?l1SE@@ *+ *+'~цKy?l1SE@@ *+ *+'~цKy?l1SE@@ *+ *+'~цK.z?l1SE@@ *+ *+'~цKaz  ?l1SE@@ *+ *+'~цKiz<<?l1SE,@@ *+ *+'~@UUцKVV?l1SEH@@ *+ *+'4!Ng@цKO?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK0?l1SE@@ *+ *+'цKr?l1SE@@ *+ *+'цKю?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKq?l1SE@@ *+ *+'цK?l1SE@@ *+ *+' цK?l1SE@@ *+ *+' цKS?l1SE@@ *+ *+' цK?l1SE@@ *+ *+' цKא?l1SE@@ *+ *+' цK5?l1SE@@ *+ *+'цKv?l1SE@@ *+ *+'цK֑?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKY?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK;?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKۓ?l1SE@@ *+ *+'цK9?l1SE@@ *+ *+'цK|?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK^?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK??l1SE@@ *+ *+'цK?l1SE@@ *+ *+' цKޖ?l1SE@@ *+ *+'!цK!?l1SE@@ *+ *+'"цK?l1SE@@ *+ *+'#цK?l1SE@@ *+ *+'$цK?l1SE@@ *+ *+'%цKb?l1SE@@ *+ *+'&цK?l1SE@@ *+ *+''цK?l1SE@@ *+ *+'(цKD?l1SE@@ *+ *+')цK?l1SE@@ *+ *+'*цK?l1SE@@ *+ *+'+цK%?l1SE@@ *+ *+',цK?l1SE@@ *+ *+'-цKŚ?l1SE@@ *+ *+'.цK?l1SE@@ *+ *+'/цKg?l1SE@@ *+ *+'0цK?l1SE@@ *+ *+'1цK?l1SE@@ *+ *+'2цKH?l1SE@@ *+ *+'3цK?l1SE@@ *+ *+'4цK?l1SE@@ *+ *+'5цK*?l1SE@@ *+ *+'6цKm?l1SE@@ *+ *+'7цK˝?l1SE@@ *+ *+'8цK ?l1SE@@ *+ *+'9цKk?l1SE@@ *+ *+':цK?l1SE@@ *+ *+';цK?l1SE@@ *+ *+'<цKN?l1SE@@ *+ *+'=цK?l1SE@@ *+ *+'>цKП?l1SE@@ *+ *+'?цK.?l1SE@@ *+ *+'@цKp?l1SE@@ *+ *+'AцKϠ?l1SE@@ *+ *+'BцK?l1SE@@ *+ *+'CцKR?l1SE@@ *+ *+'DцK?l1SE@@ *+ *+'EцK?l1SE@@ *+ *+'FцK5?l1SE@@ *+ *+'GцK?l1SE@@ *+ *+'HцKբ?l1SE@@ *+ *+'IцK4?l1SE@@ *+ *+'JцKu?l1SE@@ *+ *+'KцK?l1SE@@ *+ *+'LцK?l1SE@@ *+ *+'MцKX?l1SE@@ *+ *+'NцK?l1SE@@ *+ *+'OцK?l1SE@@ *+ *+'PцK9?l1SE@@ *+ *+'QцK?l1SE@@ *+ *+'RцK٥?l1SE@@ *+ *+'SцK?l1SE@@ *+ *+'TцKz?l1SE@@ *+ *+'UцK?l1SE@@ *+ *+'VцK?l1SE@@ *+ *+'WцK\?l1SE@@ *+ *+'XцK?l1SE@@ *+ *+'YцK?l1SE@@ *+ *+'ZцK>?l1SE@@~ *+ *+'[цK?l1SE @@} *+ *+'\цKި?l1SE @@| *+ *+']цK ?l1SE @@{ *+ *+'^цK?l1SE @@z *+ *+'_цK?l1SE @@y *+ *+'`цK?l1SE@@x *+ *+'aцK`?l1SE@@w *+ *+'bцK?l1SE@@v *+ *+'cцK?l1SE@@u *+ *+'dцKC?l1SE@@t *+ *+'eцK?l1SE@@s *+ *+'fцK?l1SE@@r *+ *+'gцK$?l1SE@@q *+ *+'hцKf?l1SE@@p *+ *+'iцKŬ?l1SE@@o *+ *+'jцK?l1SE@@n *+ *+'kцKe?l1SE@@m *+ *+'lцK?l1SE@@l *+ *+'mцK?l1SE@@k *+ *+'nцKG?l1SE@@j *+ *+'oцK?l1SE@@i *+ *+'pцKˮ?l1SE@@h *+ *+'qцK*?l1SE@@g *+ *+'rцKk?l1SE @@f *+ *+'sцKʯ?l1SE!@@e *+ *+'tцK ?l1SE"@@d *+ *+'uцKL?l1SE#@@c *+ *+'vцK?l1SE$@@b *+ *+'wцK?l1SE%@@a *+ *+'xцK.?l1SE&@@` *+ *+'yцK?l1SE'@@_ *+ *+'zцKϱ?l1SE(@@^ *+ *+'{цK.?l1SE)@@] *+ *+'|цKo?l1SE*@@\ *+ *+'}цK?l1SE+@@[ *+ *+'~цK?l1SE,@@Z *+ *+'цKQ?l1SE-@@Y *+ *+'цK?l1SE.@@X *+ *+'цK?l1SE/@@W *+ *+'цK4?l1SE0@@V *+ *+'цK?l1SE1@@U *+ *+'цKԴ?l1SE2@@T *+ *+'цK?l1SE3@@S *+ *+'цKH  ?l1SE4@@V *+ *+'цKO<<?l1SE,5@@% *+ *+'@UUцK`VV?l1SEH6@@ *+ *+'4!@цK?l1SE7@@O *+ *+'цKX?l1SE8@@N *+ *+'цK?l1SE9@@M *+ *+'цK?l1SE:@@L *+ *+'цK:?l1SE;@@K *+ *+'цK?l1SE<@@J *+ *+'цK?l1SE=@@I *+ *+'цK9?l1SE>@@H *+ *+'цKz?l1SE?@@G *+ *+' цK?l1SE@@@F *+ *+' цK?l1SEA@@E *+ *+' цK\?l1SEB@@D *+ *+' цK?l1SEC@@C *+ *+' цK?l1SED@@B *+ *+'цK>?l1SEE@@A *+ *+'цK?l1SEF@@@ *+ *+'цK?l1SEG@@? *+ *+'цK ?l1SEH@@> *+ *+'цK?l1SEI@@= *+ *+'цK?l1SEJ@@< *+ *+'цK?l1SEK@@; *+ *+'цKa?l1SEL@@: *+ *+'цK?l1SEM@@9 *+ *+'цK?l1SEN@@8 *+ *+'цKB?l1SEO@@7 *+ *+'цK?l1SEP@@6 *+ *+'цK?l1SEQ@@5 *+ *+'цK%?l1SER@@4 *+ *+'цK?l1SES@@3 *+ *+'цK?l1SET@@2 *+ *+'цK?l1SEU@@1 *+ *+'цKe?l1SEV@@0 *+ *+' цK?l1SEW@@/ *+ *+'!цK?l1SEX@@. *+ *+'"цKG?l1SEY@@- *+ *+'#цK?l1SEZ@@, *+ *+'$цK?l1SE[@@+ *+ *+'%цK*?l1SE\@@* *+ *+'&цKl?l1SE]@@) *+ *+''цK?l1SE^@@( *+ *+'(цK ?l1SE_@@' *+ *+')цKL?l1SE`@@& *+ *+'*цK?l1SEa@@% *+ *+'+цK?l1SEb@@$ *+ *+',цKL?l1SEc@@# *+ *+'-цK?l1SEd@@" *+ *+'.цK?l1SEe@@! *+ *+'/цK.?l1SEf@@ *+ *+'0цKp?l1SEg@@ *+ *+'1цK?l1SEh@@ *+ *+'2цK?l1SEi@@ *+ *+'3цKQ?l1SEj@@ *+ *+'4цK?l1SEk@@ *+ *+'5цK?l1SEl@@ *+ *+'6цK3?l1SEm@@ *+ *+'7цK?l1SEn@@ *+ *+'8цK?l1SEo@@ *+ *+'9цK2?l1SEp@@ *+ *+':цKs?l1SEq@@ *+ *+';цK?l1SEr@@ *+ *+'<цK?l1SEs@@ *+ *+'=цKV?l1SEt@@ *+ *+'>цK?l1SEu@@ *+ *+'?цK?l1SEv@@ *+ *+'@цK7?l1SEw@@ *+ *+'AцK?l1SEx@@ *+ *+'BцK?l1SEy@@ *+ *+'CцK?l1SEz@@ *+ *+'DцKx?l1SE{@@ *+ *+'EцK?l1SE|@@ *+ *+'FцK?l1SE}@@ *+ *+'GцK[?l1SE~@@ *+ *+'HцK?l1SE@@ *+ *+'IцK?l1SE@@ *+ *+'JцK<?l1SE@@ *+ *+'KцK~?l1SE@@ *+ *+'LцK?l1SE@@ *+ *+'MцK?l1SE@@ *+ *+'NцK}?l1SE@@ *+ *+'OцK?l1SE@@ *+ *+'PцK?l1SE@@ *+ *+'QцK_?l1SE@@ *+ *+'RцK?l1SE@@ *+ *+'SцK?l1SE@@ *+ *+'TцKA?l1SE@@ *+ *+'UцK?l1SE@@ *+ *+'VцK?l1SE@@ *+ *+'WцK#?l1SE@@ *+ *+'XцKd?l1SE@@ *+ *+'YцK?l1SE@@ *+ *+'ZцK?l1SE@@ *+ *+'[цKG?l1SE@@ *+ *+'\цK?l1SE@@ *+ *+']цK?l1SE@@ *+ *+'^цKF?l1SE@@ *+ *+'_цK?l1SE@@ *+ *+'`цK?l1SE@@ *+ *+'aцK(?l1SE@@ *+ *+'bцKi?l1SE@@ *+ *+'cцK?l1SE@@ *+ *+'dцK ?l1SE@@ *+ *+'eцKK?l1SE@@ *+ *+'fцK?l1SE@@ *+ *+'gцK?l1SE@@ *+ *+'hцK.?l1SE@@ *+ *+'iцK?l1SE@@ *+ *+'jцK?l1SE@@ *+ *+'kцK-?l1SE@@ *+ *+'lцKn?l1SE@@ *+ *+'mцK?l1SE@@ *+ *+'nцK?l1SE@@ *+ *+'oцKP?l1SE@@ *+ *+'pцK?l1SE@@ *+ *+'qцK?l1SE@@ *+ *+'rцK2?l1SE@@ *+ *+'sцK?l1SE@@ *+ *+'tцK?l1SE@@ *+ *+'uцK?l1SE@@ *+ *+'vцKs?l1SE@@ *+ *+'wцK?l1SE@@ *+ *+'xцK?l1SE@@ *+ *+'yцKU?l1SE@@ *+ *+'zцK?l1SE@@ *+ *+'{цK?l1SE@@ *+ *+'|цK7?l1SE@@ *+ *+'}цKy?l1SE@@ *+ *+'~цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKw?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKY?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK  ?l1SE@@ *+ *+'цK<<?l1SE,@@ *+ *+'@UUцKEVV?l1SEH@@ *+ *+'4!rQ@цK?l1SE@@ *+ *+'цK??l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK!?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK ?l1SE@@ *+ *+'цKa?l1SE@@ *+ *+' цK?l1SE@@ *+ *+' цK?l1SE@@ *+ *+' цKC?l1SE@@ *+ *+' цK?l1SE@@ *+ *+' цK?l1SE@@ *+ *+'цK%?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKf?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKI ?l1SE@@ *+ *+'цK ?l1SE@@ *+ *+'цK ?l1SE@@ *+ *+'цK) ?l1SE@@ *+ *+'цKk ?l1SE@@ *+ *+'цK ?l1SE@@ *+ *+'цK ?l1SE@@ *+ *+'цKj ?l1SE@@ *+ *+'цK ?l1SE@@ *+ *+'цK ?l1SE@@ *+ *+'цKM ?l1SE@@ *+ *+' цK ?l1SE@@ *+ *+'!цK ?l1SE@@ *+ *+'"цK. ?l1SE@@ *+ *+'#цKp ?l1SE@@ *+ *+'$цK ?l1SE@@ *+ *+'%цK?l1SE@@ *+ *+'&цKS?l1SE@@ *+ *+''цK?l1SE@@ *+ *+'(цK?l1SE@@ *+ *+')цK5?l1SE@@ *+ *+'*цK?l1SE@@ *+ *+'+цK?l1SE@@ *+ *+',цK4?l1SE@@ *+ *+'-цKu?l1SE@@ *+ *+'.цK?l1SE@@ *+ *+'/цK?l1SE@@ *+ *+'0цKV?l1SE@@ *+ *+'1цK?l1SE@@ *+ *+'2цK?l1SE@@ *+ *+'3цK9?l1SE@@ *+ *+'4цK?l1SE@@ *+ *+'5цK?l1SE@@ *+ *+'6цK?l1SE@@ *+ *+'7цKz?l1SE@@ *+ *+'8цK?l1SE@@ *+ *+'9цK?l1SE@@ *+ *+':цK\?l1SE@@ *+ *+';цK?l1SE@@ *+ *+'<цK?l1SE@@ *+ *+'=цK>?l1SE@@ *+ *+'>цK?l1SE@@ *+ *+'?цK?l1SE@@ *+ *+'@цK?l1SE@@ *+ *+'AцK~?l1SE@@ *+ *+'BцK?l1SE@@ *+ *+'CцK?l1SE@@ *+ *+'DцK`?l1SE@@ *+ *+'EцK?l1SE@@ *+ *+'FцK?l1SE@@ *+ *+'GцKB?l1SE@@ *+ *+'HцK?l1SE@@~ *+ *+'IцK?l1SE @@} *+ *+'JцK%?l1SE @@| *+ *+'KцKf?l1SE @@{ *+ *+'LцK?l1SE @@z *+ *+'MцK?l1SE @@y *+ *+'NцKe?l1SE@@x *+ *+'OцK?l1SE@@w *+ *+'PцK?l1SE@@v *+ *+'QцKG?l1SE@@u *+ *+'RцK?l1SE@@t *+ *+'SцK?l1SE@@s *+ *+'TцK)?l1SE@@r *+ *+'UцKj?l1SE@@q *+ *+'VцK?l1SE@@p *+ *+'WцK ?l1SE@@o *+ *+'XцKL?l1SE@@n *+ *+'YцK?l1SE@@m *+ *+'ZцK?l1SE@@l *+ *+'[цK/?l1SE@@k *+ *+'\цK?l1SE@@j *+ *+']цK?l1SE@@i *+ *+'^цK-?l1SE@@h *+ *+'_цKo?l1SE@@g *+ *+'`цK?l1SE @@f *+ *+'aцK ?l1SE!@@e *+ *+'bцKQ ?l1SE"@@d *+ *+'cцK ?l1SE#@@c *+ *+'dцK ?l1SE$@@b *+ *+'eцK3!?l1SE%@@a *+ *+'fцK!?l1SE&@@` *+ *+'gцK!?l1SE'@@_ *+ *+'hцK"?l1SE(@@^ *+ *+'iцKt"?l1SE)@@] *+ *+'jцK"?l1SE*@@\ *+ *+'kцK#?l1SE+@@[ *+ *+'lцKV#?l1SE,@@Z *+ *+'mцK#?l1SE-@@Y *+ *+'nцK#?l1SE.@@X *+ *+'oцK7$?l1SE/@@W *+ *+'pцKx$?l1SE0@@V *+ *+'qцK$?l1SE1@@U *+ *+'rцK%?l1SE2@@T *+ *+'sцKx%?l1SE3@@S *+ *+'tцK%?l1SE4@@R *+ *+'uцK%?l1SE5@@Q *+ *+'vцKZ&?l1SE6@@P *+ *+'wцK&?l1SE7@@O *+ *+'xцK&?l1SE8@@N *+ *+'yцK<'?l1SE9@@M *+ *+'zцK~'?l1SE:@@L *+ *+'{цK'?l1SE;@@K *+ *+'|цK(?l1SE<@@J *+ *+'}цKa(?l1SE=@@I *+ *+'~цK(?l1SE>@@H *+ *+'цK)?l1SE?@@G *+ *+'цK^)?l1SE@@@F *+ *+'цK)?l1SEA@@E *+ *+'цK)?l1SEB@@D *+ *+'цKA*?l1SEC@@C *+ *+'цK*?l1SED@@B *+ *+'цK*?l1SEE@@A *+ *+'цK*  ?l1SEF@@D *+ *+'цK*<<?l1SE,G@@ *+ *+'@UUцK=VV?l1SEHH@@ *+ *+'4!@цK=?l1SEI@@= *+ *+'цK>?l1SEJ@@< *+ *+'цKf>?l1SEK@@; *+ *+'цK>?l1SEL@@: *+ *+'цK>?l1SEM@@9 *+ *+'цKF??l1SEN@@8 *+ *+'цK??l1SEO@@7 *+ *+'цK??l1SEP@@6 *+ *+'цK(@?l1SEQ@@5 *+ *+' цKj@?l1SER@@4 *+ *+' цK@?l1SES@@3 *+ *+' цK A?l1SET@@2 *+ *+' цKMA?l1SEU@@1 *+ *+' цKA?l1SEV@@0 *+ *+'цKA?l1SEW@@/ *+ *+'цKMB?l1SEX@@. *+ *+'цKB?l1SEY@@- *+ *+'цKB?l1SEZ@@, *+ *+'цK.C?l1SE[@@+ *+ *+'цKnC?l1SE\@@* *+ *+'цKC?l1SE]@@) *+ *+'цKD?l1SE^@@( *+ *+'цKQD?l1SE_@@' *+ *+'цKD?l1SE`@@& *+ *+'цKD?l1SEa@@% *+ *+'цK4E?l1SEb@@$ *+ *+'цKE?l1SEc@@# *+ *+'цKE?l1SEd@@" *+ *+'цK2F?l1SEe@@! *+ *+'цKsF?l1SEf@@ *+ *+'цKF?l1SEg@@ *+ *+'цKG?l1SEh@@ *+ *+' цKVG?l1SEi@@ *+ *+'!цKG?l1SEj@@ *+ *+'"цKG?l1SEk@@ *+ *+'#цK8H?l1SEl@@ *+ *+'$цKH?l1SEm@@ *+ *+'%цKH?l1SEn@@ *+ *+'&цKI?l1SEo@@ *+ *+''цKxI?l1SEp@@ *+ *+'(цKI?l1SEq@@ *+ *+')цKI?l1SEr@@ *+ *+'*цKZJ?l1SEs@@ *+ *+'+цKJ?l1SEt@@ *+ *+',цKJ?l1SEu@@ *+ *+'-цKцKGP?l1SE@@ *+ *+'?цKP?l1SE@@ *+ *+'@цKP?l1SE@@ *+ *+'AцKFQ?l1SE@@ *+ *+'BцKQ?l1SE@@ *+ *+'CцKQ?l1SE@@ *+ *+'DцK(R?l1SE@@ *+ *+'EцKiR?l1SE@@ *+ *+'FцKR?l1SE@@ *+ *+'GцK S?l1SE@@ *+ *+'HцKJS?l1SE@@ *+ *+'IцKS?l1SE@@ *+ *+'JцKS?l1SE@@ *+ *+'KцK-T?l1SE@@ *+ *+'LцKT?l1SE@@ *+ *+'MцKT?l1SE@@ *+ *+'NцK,U?l1SE@@ *+ *+'OцKmU?l1SE@@ *+ *+'PцKU?l1SE@@ *+ *+'QцKV?l1SE@@ *+ *+'RцKOV?l1SE@@ *+ *+'SцKV?l1SE@@ *+ *+'TцKV?l1SE@@ *+ *+'UцK2W?l1SE@@ *+ *+'VцKW?l1SE@@ *+ *+'WцKW?l1SE@@ *+ *+'XцKX?l1SE@@ *+ *+'YцKsX?l1SE@@ *+ *+'ZцKX?l1SE@@ *+ *+'[цKX?l1SE@@ *+ *+'\цKTY?l1SE@@ *+ *+']цKY?l1SE@@ *+ *+'^цKY?l1SE@@ *+ *+'_цK6Z?l1SE@@ *+ *+'`цKyZ?l1SE@@ *+ *+'aцKZ?l1SE@@ *+ *+'bцK[?l1SE@@ *+ *+'cцKv[?l1SE@@ *+ *+'dцK[?l1SE@@ *+ *+'eцK[?l1SE@@ *+ *+'fцKY\?l1SE@@ *+ *+'gцK\?l1SE@@ *+ *+'hцK\?l1SE@@ *+ *+'iцK:]?l1SE@@ *+ *+'jцK~]?l1SE@@ *+ *+'kцK]?l1SE@@ *+ *+'lцK^?l1SE@@ *+ *+'mцK^^?l1SE@@ *+ *+'nцK^?l1SE@@ *+ *+'oцK^?l1SE@@ *+ *+'pцK@_?l1SE@@ *+ *+'qцK_?l1SE@@ *+ *+'rцK_?l1SE@@ *+ *+'sцK@`?l1SE@@ *+ *+'tцK`?l1SE@@ *+ *+'uцK`?l1SE@@ *+ *+'vцK"a?l1SE@@ *+ *+'wцKca?l1SE@@ *+ *+'xцKa?l1SE@@ *+ *+'yцKb?l1SE@@ *+ *+'zцKEb?l1SE@@ *+ *+'{цKb?l1SE@@ *+ *+'|цKb?l1SE@@ *+ *+'}цK&c?l1SE@@ *+ *+'~цKc?l1SE@@ *+ *+'цKc?l1SE@@ *+ *+'цK%d?l1SE@@ *+ *+'цKgd?l1SE@@ *+ *+'цKd?l1SE@@ *+ *+'цKe?l1SE@@ *+ *+'цKJe?l1SE@@ *+ *+'цKe?l1SE@@ *+ *+'цKe  ?l1SE@@ *+ *+'цKe<<?l1SE,@@ *+ *+'@UUцKwVV?l1SEH@@m *+ *+'4!;@цKx?l1SE@@ *+ *+'цKx?l1SE@@ *+ *+'цKMy?l1SE@@ *+ *+'цKy?l1SE@@ *+ *+'цKy?l1SE@@ *+ *+'цK/z?l1SE@@ *+ *+'цKpz?l1SE@@ *+ *+'цKz?l1SE@@ *+ *+'цK{?l1SE@@ *+ *+' цKR{?l1SE@@ *+ *+' цK{?l1SE@@ *+ *+' цK{?l1SE@@ *+ *+' цK4|?l1SE@@ *+ *+' цK|?l1SE@@ *+ *+'цK|?l1SE@@ *+ *+'цK4}?l1SE@@ *+ *+'цKu}?l1SE@@ *+ *+'цK}?l1SE@@ *+ *+'цK~?l1SE@@ *+ *+'цKW~?l1SE@@ *+ *+'цK~?l1SE@@ *+ *+'цK~?l1SE@@ *+ *+'цK9?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKz?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK[?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+' цK=?l1SE@@ *+ *+'!цK?l1SE@@ *+ *+'"цK݂?l1SE@@ *+ *+'#цK ?l1SE@@ *+ *+'$цK}?l1SE@@ *+ *+'%цK?l1SE@@ *+ *+'&цK?l1SE@@ *+ *+''цK`?l1SE@@ *+ *+'(цK?l1SE@@ *+ *+')цK?l1SE@@ *+ *+'*цKB?l1SE@@ *+ *+'+цK?l1SE@@ *+ *+',цK?l1SE@@ *+ *+'-цK%?l1SE@@ *+ *+'.цKf?l1SE@@ *+ *+'/цKĆ?l1SE@@ *+ *+'0цK?l1SE@@ *+ *+'1цKe?l1SE@@ *+ *+'2цK?l1SE@@ *+ *+'3цK?l1SE@@ *+ *+'4цKF?l1SE@@ *+ *+'5цK?l1SE@@ *+ *+'6цKʈ?l1SE@@~ *+ *+'7цK)?l1SE @@} *+ *+'8цKk?l1SE @@| *+ *+'9цKȉ?l1SE @@{ *+ *+':цK ?l1SE @@z *+ *+';цKL?l1SE @@y *+ *+'<цK?l1SE@@x *+ *+'=цK?l1SE@@w *+ *+'>цK.?l1SE@@v *+ *+'?цK?l1SE@@u *+ *+'@цK΋?l1SE@@t *+ *+'AцK-?l1SE@@s *+ *+'BцKn?l1SE@@r *+ *+'CцK?l1SE@@q *+ *+'DцK?l1SE@@p *+ *+'EцKQ?l1SE@@o *+ *+'FцK?l1SE@@n *+ *+'GцK?l1SE@@m *+ *+'HцK3?l1SE@@l *+ *+'IцK?l1SE@@k *+ *+'JцKӎ?l1SE@@j *+ *+'KцK?l1SE@@i *+ *+'LцKs?l1SE@@h *+ *+'MцK?l1SE@@g *+ *+'NцK?l1SE @@f *+ *+'OцK\?l1SE!@@e *+ *+'PцK?l1SE"@@d *+ *+'QцK?l1SE#@@c *+ *+'RцK7?l1SE$@@b *+ *+'SцKy?l1SE%@@a *+ *+'TцKב?l1SE&@@` *+ *+'UцK?l1SE'@@_ *+ *+'VцKx?l1SE(@@^ *+ *+'WцK?l1SE)@@] *+ *+'XцK?l1SE*@@\ *+ *+'YцKZ?l1SE+@@[ *+ *+'ZцK?l1SE,@@Z *+ *+'[цKޓ?l1SE-@@Y *+ *+'\цK<?l1SE.@@X *+ *+']цK|?l1SE/@@W *+ *+'^цKݔ?l1SE0@@V *+ *+'_цK?l1SE1@@U *+ *+'`цK_?l1SE2@@T *+ *+'aцK?l1SE3@@S *+ *+'bцK?l1SE4@@R *+ *+'cцK^?l1SE5@@Q *+ *+'dцK?l1SE6@@P *+ *+'eцK?l1SE7@@O *+ *+'fцKA?l1SE8@@N *+ *+'gцK?l1SE9@@M *+ *+'hцKė?l1SE:@@L *+ *+'iцK#?l1SE;@@K *+ *+'jцKd?l1SE<@@J *+ *+'kцKØ?l1SE=@@I *+ *+'lцK?l1SE>@@H *+ *+'mцKF?l1SE?@@G *+ *+'nцK?l1SE@@@F *+ *+'oцK?l1SEA@@E *+ *+'pцK(?l1SEB@@D *+ *+'qцK?l1SEC@@C *+ *+'rцKǚ?l1SED@@B *+ *+'sцK'?l1SEE@@A *+ *+'tцKi?l1SEF@@@ *+ *+'uцK?l1SEG@@? *+ *+'vцK?l1SEH@@> *+ *+'wцKK?l1SEI@@= *+ *+'xцK?l1SEJ@@< *+ *+'yцK?l1SEK@@; *+ *+'zцK-?l1SEL@@: *+ *+'{цK?l1SEM@@9 *+ *+'|цK͝?l1SEN@@8 *+ *+'}цK?l1SEO@@7 *+ *+'~цKn?l1SEP@@6 *+ *+'цK?l1SEQ@@5 *+ *+'цK?l1SER@@4 *+ *+'цKO?l1SES@@3 *+ *+'цK?l1SET@@2 *+ *+'цK?l1SEU@@1 *+ *+'цK1?l1SEV@@0 *+ *+'цKs?l1SEW@@/ *+ *+'цK  ?l1SEX@@2 *+ *+'цK<<?l1SE,Y@@ *+ *+'@UUцKܲVV?l1SEHZ@@ *+ *+'4!+@цK?l1SE[@@+ *+ *+'цKճ?l1SE\@@* *+ *+'цK4?l1SE]@@) *+ *+'цKu?l1SE^@@( *+ *+'цK?l1SE_@@' *+ *+'цK?l1SE`@@& *+ *+'цKX?l1SEa@@% *+ *+'цK?l1SEb@@$ *+ *+'цK?l1SEc@@# *+ *+' цK:?l1SEd@@" *+ *+' цK?l1SEe@@! *+ *+' цKڶ?l1SEf@@ *+ *+' цK?l1SEg@@ *+ *+' цKz?l1SEh@@ *+ *+'цK?l1SEi@@ *+ *+'цK?l1SEj@@ *+ *+'цK]?l1SEk@@ *+ *+'цK?l1SEl@@ *+ *+'цK?l1SEm@@ *+ *+'цK>?l1SEn@@ *+ *+'цK?l1SEo@@ *+ *+'цK߹?l1SEp@@ *+ *+'цK ?l1SEq@@ *+ *+'цK?l1SEr@@ *+ *+'цK?l1SEs@@ *+ *+'цK?l1SEt@@ *+ *+'цKa?l1SEu@@ *+ *+'цK?l1SEv@@ *+ *+'цK?l1SEw@@ *+ *+'цKC?l1SEx@@ *+ *+'цK?l1SEy@@ *+ *+'цK?l1SEz@@ *+ *+' цK%?l1SE{@@ *+ *+'!цKf?l1SE|@@ *+ *+'"цKŽ?l1SE}@@ *+ *+'#цK?l1SE~@@ *+ *+'$цKe?l1SE@@ *+ *+'%цK?l1SE@@ *+ *+'&цK?l1SE@@ *+ *+''цKI?l1SE@@ *+ *+'(цK?l1SE@@ *+ *+')цK˿?l1SE@@ *+ *+'*цK*?l1SE@@ *+ *+'+цKk?l1SE@@ *+ *+',цK?l1SE@@ *+ *+'-цK ?l1SE@@ *+ *+'.цKN?l1SE@@ *+ *+'/цK?l1SE@@ *+ *+'0цK?l1SE@@ *+ *+'1цKK?l1SE@@ *+ *+'2цK?l1SE@@ *+ *+'3цK?l1SE@@ *+ *+'4цK.?l1SE@@ *+ *+'5цKp?l1SE@@ *+ *+'6цK?l1SE@@ *+ *+'7цK?l1SE@@ *+ *+'8цKR?l1SE@@ *+ *+'9цK?l1SE@@ *+ *+':цK?l1SE@@ *+ *+';цK5?l1SE@@ *+ *+'<цK?l1SE@@ *+ *+'=цK?l1SE@@ *+ *+'>цK?l1SE@@ *+ *+'?цKu?l1SE@@ *+ *+'@цK?l1SE@@ *+ *+'AцK?l1SE@@ *+ *+'BцKV?l1SE@@ *+ *+'CцK?l1SE@@ *+ *+'DцK?l1SE@@ *+ *+'EцK9?l1SE@@ *+ *+'FцKz?l1SE@@ *+ *+'GцK?l1SE@@ *+ *+'HцK?l1SE@@ *+ *+'IцKy?l1SE@@ *+ *+'JцK?l1SE@@ *+ *+'KцK?l1SE@@ *+ *+'LцK[?l1SE@@ *+ *+'MцK?l1SE@@ *+ *+'NцK?l1SE@@ *+ *+'OцK<?l1SE@@ *+ *+'PцK?l1SE@@ *+ *+'QцK?l1SE@@ *+ *+'RцK?l1SE@@ *+ *+'SцKa?l1SE@@ *+ *+'TцK?l1SE@@ *+ *+'UцK?l1SE@@ *+ *+'VцK_?l1SE@@ *+ *+'WцK?l1SE@@ *+ *+'XцK?l1SE@@ *+ *+'YцK@?l1SE@@ *+ *+'ZцK?l1SE@@ *+ *+'[цK?l1SE@@ *+ *+'\цK$?l1SE@@ *+ *+']цKe?l1SE@@ *+ *+'^цK?l1SE@@ *+ *+'_цK?l1SE@@ *+ *+'`цKF?l1SE@@ *+ *+'aцK?l1SE@@ *+ *+'bцK?l1SE@@ *+ *+'cцKE?l1SE@@ *+ *+'dцK?l1SE@@ *+ *+'eцK?l1SE@@ *+ *+'fцK'?l1SE@@ *+ *+'gцKj?l1SE@@ *+ *+'hцK?l1SE@@ *+ *+'iцK ?l1SE@@ *+ *+'jцKK?l1SE@@ *+ *+'kцK?l1SE@@ *+ *+'lцK?l1SE@@ *+ *+'mцK.?l1SE@@ *+ *+'nцK?l1SE@@ *+ *+'oцK?l1SE@@ *+ *+'pцK?l1SE@@ *+ *+'qцKm?l1SE@@ *+ *+'rцK?l1SE@@ *+ *+'sцK?l1SE@@ *+ *+'tцKP?l1SE@@ *+ *+'uцK?l1SE@@ *+ *+'vцK?l1SE@@ *+ *+'wцK2?l1SE@@ *+ *+'xцKt?l1SE@@ *+ *+'yцK?l1SE@@ *+ *+'zцK?l1SE@@ *+ *+'{цKr?l1SE@@ *+ *+'|цK?l1SE@@ *+ *+'}цK?l1SE@@ *+ *+'~цKT?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK7?l1SE@@ *+ *+'цKx?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKZ?l1SE@@ *+ *+'цK  ?l1SE@@ *+ *+'цK<<?l1SE,@@x *+ *+'@UUцKVV?l1SEH@@[ *+ *+'4!@цKR?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK3?l1SE@@ *+ *+'цKt?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKs?l1SE@@ *+ *+'цK?l1SE@@ *+ *+' цK?l1SE@@ *+ *+' цKV?l1SE@@ *+ *+' цK?l1SE@@ *+ *+' цK?l1SE@@ *+ *+' цK8?l1SE@@ *+ *+'цKz?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK[?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK>?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK=?l1SE@@ *+ *+'цK~?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK`?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKC?l1SE@@ *+ *+'цK?l1SE@@ *+ *+' цK?l1SE@@ *+ *+'!цK%?l1SE@@ *+ *+'"цK?l1SE@@ *+ *+'#цK?l1SE@@ *+ *+'$цK#?l1SE@@~ *+ *+'%цKe?l1SE @@} *+ *+'&цK?l1SE @@| *+ *+''цK?l1SE @@{ *+ *+'(цKF?l1SE @@z *+ *+')цK?l1SE @@y *+ *+'*цK?l1SE@@x *+ *+'+цK)?l1SE@@w *+ *+',цK?l1SE@@v *+ *+'-цK?l1SE@@u *+ *+'.цK ?l1SE@@t *+ *+'/цKk?l1SE@@s *+ *+'0цK?l1SE@@r *+ *+'1цK ?l1SE@@q *+ *+'2цKK?l1SE@@p *+ *+'3цK?l1SE@@o *+ *+'4цK?l1SE@@n *+ *+'5цK/?l1SE@@m *+ *+'6цKp?l1SE@@l *+ *+'7цK?l1SE@@k *+ *+'8цK?l1SE@@j *+ *+'9цKo?l1SE@@i *+ *+':цK?l1SE@@h *+ *+';цK?l1SE@@g *+ *+'<цKO?l1SE @@f *+ *+'=цK?l1SE!@@e *+ *+'>цK?l1SE"@@d *+ *+'?цK2?l1SE#@@c *+ *+'@цKt?l1SE$@@b *+ *+'AцK?l1SE%@@a *+ *+'BцK?l1SE&@@` *+ *+'CцKU?l1SE'@@_ *+ *+'DцK?l1SE(@@^ *+ *+'EцK?l1SE)@@] *+ *+'FцK7?l1SE*@@\ *+ *+'GцK?l1SE+@@[ *+ *+'HцK?l1SE,@@Z *+ *+'IцK6?l1SE-@@Y *+ *+'JцKx?l1SE.@@X *+ *+'KцK?l1SE/@@W *+ *+'LцK?l1SE0@@V *+ *+'MцKZ?l1SE1@@U *+ *+'NцK?l1SE2@@T *+ *+'OцK?l1SE3@@S *+ *+'PцK=?l1SE4@@R *+ *+'QцK?l1SE5@@Q *+ *+'RцK?l1SE6@@P *+ *+'SцK?l1SE7@@O *+ *+'TцK}?l1SE8@@N *+ *+'UцK?l1SE9@@M *+ *+'VцK?l1SE:@@L *+ *+'WцK`?l1SE;@@K *+ *+'XцK?l1SE<@@J *+ *+'YцK ?l1SE=@@I *+ *+'ZцKA ?l1SE>@@H *+ *+'[цK ?l1SE?@@G *+ *+'\цK ?l1SE@@@F *+ *+']цK# ?l1SEA@@E *+ *+'^цK ?l1SEB@@D *+ *+'_цK ?l1SEC@@C *+ *+'`цK ?l1SED@@B *+ *+'aцKd ?l1SEE@@A *+ *+'bцK ?l1SEF@@@ *+ *+'cцK ?l1SEG@@? *+ *+'dцKF ?l1SEH@@> *+ *+'eцK ?l1SEI@@= *+ *+'fцK ?l1SEJ@@< *+ *+'gцK( ?l1SEK@@; *+ *+'hцKi ?l1SEL@@: *+ *+'iцK ?l1SEM@@9 *+ *+'jцK ?l1SEN@@8 *+ *+'kцKh?l1SEO@@7 *+ *+'lцK?l1SEP@@6 *+ *+'mцK?l1SEQ@@5 *+ *+'nцKJ?l1SER@@4 *+ *+'oцK?l1SES@@3 *+ *+'pцK?l1SET@@2 *+ *+'qцK,?l1SEU@@1 *+ *+'rцKm?l1SEV@@0 *+ *+'sцK?l1SEW@@/ *+ *+'tцK?l1SEX@@. *+ *+'uцKP?l1SEY@@- *+ *+'vцK?l1SEZ@@, *+ *+'wцK?l1SE[@@+ *+ *+'xцK2?l1SE\@@* *+ *+'yцK?l1SE]@@) *+ *+'zцK?l1SE^@@( *+ *+'{цK1?l1SE_@@' *+ *+'|цKr?l1SE`@@& *+ *+'}цK?l1SEa@@% *+ *+'~цK?l1SEb@@$ *+ *+'цKT?l1SEc@@# *+ *+'цK?l1SEd@@" *+ *+'цK?l1SEe@@! *+ *+'цK7?l1SEf@@ *+ *+'цK?l1SEg@@ *+ *+'цK?l1SEh@@ *+ *+'цK?l1SEi@@ *+ *+'цKJ  ?l1SEj@@ *+ *+'цKR<<?l1SE,k@@ *+ *+'@UUцK(VV?l1SEHl@@ *+ *+'4! M}@цK=)?l1SEm@@ *+ *+'цK~)?l1SEn@@ *+ *+'цK)?l1SEo@@ *+ *+'цK*?l1SEp@@ *+ *+'цKa*?l1SEq@@ *+ *+'цK*?l1SEr@@ *+ *+'цK+?l1SEs@@ *+ *+'цK_+?l1SEt@@ *+ *+'цK+?l1SEu@@ *+ *+' цK+?l1SEv@@ *+ *+' цKB,?l1SEw@@ *+ *+' цK,?l1SEx@@ *+ *+' цK,?l1SEy@@ *+ *+' цK#-?l1SEz@@ *+ *+'цKe-?l1SE{@@ *+ *+'цK-?l1SE|@@ *+ *+'цK.?l1SE}@@ *+ *+'цKH.?l1SE~@@ *+ *+'цK.?l1SE@@ *+ *+'цK.?l1SE@@ *+ *+'цK)/?l1SE@@ *+ *+'цK/?l1SE@@ *+ *+'цK/?l1SE@@ *+ *+'цK(0?l1SE@@ *+ *+'цKi0?l1SE@@ *+ *+'цK0?l1SE@@ *+ *+'цK 1?l1SE@@ *+ *+'цKL1?l1SE@@ *+ *+'цK1?l1SE@@ *+ *+'цK1?l1SE@@ *+ *+'цK-2?l1SE@@ *+ *+'цK2?l1SE@@ *+ *+' цK2?l1SE@@ *+ *+'!цK3?l1SE@@ *+ *+'"цKo3?l1SE@@ *+ *+'#цK3?l1SE@@ *+ *+'$цK4?l1SE@@ *+ *+'%цKO4?l1SE@@ *+ *+'&цK4?l1SE@@ *+ *+''цK4?l1SE@@ *+ *+'(цK25?l1SE@@ *+ *+')цKt5?l1SE@@ *+ *+'*цK5?l1SE@@ *+ *+'+цK6?l1SE@@ *+ *+',цKr6?l1SE@@ *+ *+'-цK6?l1SE@@ *+ *+'.цK6?l1SE@@ *+ *+'/цKT7?l1SE@@ *+ *+'0цK7?l1SE@@ *+ *+'1цK7?l1SE@@ *+ *+'2цK78?l1SE@@ *+ *+'3цKx8?l1SE@@ *+ *+'4цK8?l1SE@@ *+ *+'5цK9?l1SE@@ *+ *+'6цKZ9?l1SE@@ *+ *+'7цK9?l1SE@@ *+ *+'8цK9?l1SE@@ *+ *+'9цKY:?l1SE@@ *+ *+':цK:?l1SE@@ *+ *+';цK:?l1SE@@ *+ *+'<цK;;?l1SE@@ *+ *+'=цK};?l1SE@@ *+ *+'>цK;?l1SE@@ *+ *+'?цK<?l1SE@@ *+ *+'@цK`<?l1SE@@ *+ *+'AцK<?l1SE@@ *+ *+'BцK=?l1SE@@ *+ *+'CцK@=?l1SE@@ *+ *+'DцK=?l1SE@@ *+ *+'EцK=?l1SE@@ *+ *+'FцK$>?l1SE@@ *+ *+'GцK>?l1SE@@ *+ *+'HцK>?l1SE@@ *+ *+'IцK"??l1SE@@ *+ *+'JцKc??l1SE@@ *+ *+'KцK??l1SE@@ *+ *+'LцK@?l1SE@@ *+ *+'MцKE@?l1SE@@ *+ *+'NцK@?l1SE@@ *+ *+'OцK@?l1SE@@ *+ *+'PцK(A?l1SE@@ *+ *+'QцKA?l1SE@@ *+ *+'RцKA?l1SE@@ *+ *+'SцK B?l1SE@@ *+ *+'TцKhB?l1SE@@ *+ *+'UцKB?l1SE@@ *+ *+'VцK C?l1SE@@ *+ *+'WцKJC?l1SE@@ *+ *+'XцKC?l1SE@@ *+ *+'YцKC?l1SE@@ *+ *+'ZцK,D?l1SE@@ *+ *+'[цKnD?l1SE@@ *+ *+'\цKD?l1SE@@ *+ *+']цKE?l1SE@@ *+ *+'^цKmE?l1SE@@ *+ *+'_цKE?l1SE@@ *+ *+'`цKE?l1SE@@ *+ *+'aцKOF?l1SE@@ *+ *+'bцKF?l1SE@@ *+ *+'cцKF?l1SE@@ *+ *+'dцK1G?l1SE@@ *+ *+'eцKsG?l1SE@@ *+ *+'fцKG?l1SE@@ *+ *+'gцKH?l1SE@@ *+ *+'hцKUH?l1SE@@ *+ *+'iцKH?l1SE@@ *+ *+'jцKH?l1SE@@ *+ *+'kцKTI?l1SE@@ *+ *+'lцKI?l1SE@@ *+ *+'mцKI?l1SE@@ *+ *+'nцK5J?l1SE@@ *+ *+'oцKwJ?l1SE@@ *+ *+'pцKJ?l1SE@@ *+ *+'qцKK?l1SE@@ *+ *+'rцKZK?l1SE@@ *+ *+'sцKK?l1SE@@ *+ *+'tцKK?l1SE@@ *+ *+'uцK;L?l1SE@@ *+ *+'vцKL?l1SE@@ *+ *+'wцKL?l1SE@@ *+ *+'xцKM?l1SE@@ *+ *+'yцK{M?l1SE@@ *+ *+'zцKM?l1SE@@ *+ *+'{цKN?l1SE@@ *+ *+'|цK]N?l1SE@@ *+ *+'}цKN?l1SE@@ *+ *+'~цKN?l1SE@@ *+ *+'цK?O?l1SE@@ *+ *+'цKO?l1SE@@ *+ *+'цKO?l1SE@@ *+ *+'цK"P?l1SE@@ *+ *+'цKP?l1SE@@ *+ *+'цKP?l1SE@@ *+ *+'цKQ?l1SE@@ *+ *+'цK6Q  ?l1SE@@ *+ *+'цK>Q<<?l1SE,@@f *+ *+'@UUцKGcVV?l1SEH@@I *+ *+'4!۶@цKc?l1SE@@ *+ *+'цKAd?l1SE@@ *+ *+'цKd?l1SE@@ *+ *+'цKd?l1SE@@ *+ *+'цK"e?l1SE@@ *+ *+'цKe?l1SE@@ *+ *+'цKe?l1SE@@ *+ *+'цK"f?l1SE@@ *+ *+'цKdf?l1SE@@ *+ *+' цKf?l1SE@@ *+ *+' цKg?l1SE@@ *+ *+' цKFg?l1SE@@ *+ *+' цKg?l1SE@@ *+ *+' цKg?l1SE@@ *+ *+'цK'h?l1SE@@ *+ *+'цKh?l1SE@@ *+ *+'цKh?l1SE@@ *+ *+'цK i?l1SE@@ *+ *+'цKhi?l1SE@@~ *+ *+'цKi?l1SE @@} *+ *+'цKi?l1SE @@| *+ *+'цKJj?l1SE @@{ *+ *+'цKj?l1SE @@z *+ *+'цKj?l1SE @@y *+ *+'цK,k?l1SE@@x *+ *+'цKmk?l1SE@@w *+ *+'цKk?l1SE@@v *+ *+'цKl?l1SE@@u *+ *+'цKll?l1SE@@t *+ *+'цKl?l1SE@@s *+ *+'цKl?l1SE@@r *+ *+'цKNm?l1SE@@q *+ *+' цKm?l1SE@@p *+ *+'!цKm?l1SE@@o *+ *+'"цK0n?l1SE@@n *+ *+'#цKqn?l1SE@@m *+ *+'$цKn?l1SE@@l *+ *+'%цKo?l1SE@@k *+ *+'&цKUo?l1SE@@j *+ *+''цKo?l1SE@@i *+ *+'(цKo?l1SE@@h *+ *+')цK6p?l1SE@@g *+ *+'*цKp?l1SE @@f *+ *+'+цKp?l1SE!@@e *+ *+',цK6q?l1SE"@@d *+ *+'-цKvq?l1SE#@@c *+ *+'.цKq?l1SE$@@b *+ *+'/цKr?l1SE%@@a *+ *+'0цKXr?l1SE&@@` *+ *+'1цKr?l1SE'@@_ *+ *+'2цKr?l1SE(@@^ *+ *+'3цK;s?l1SE)@@] *+ *+'4цKs?l1SE*@@\ *+ *+'5цKs?l1SE+@@[ *+ *+'6цKt?l1SE,@@Z *+ *+'7цK{t?l1SE-@@Y *+ *+'8цKt?l1SE.@@X *+ *+'9цKu?l1SE/@@W *+ *+':цK]u?l1SE0@@V *+ *+';цKu?l1SE1@@U *+ *+'<цKu?l1SE2@@T *+ *+'=цK?v?l1SE3@@S *+ *+'>цKv?l1SE4@@R *+ *+'?цKv?l1SE5@@Q *+ *+'@цK!w?l1SE6@@P *+ *+'AцKw?l1SE7@@O *+ *+'BцKw?l1SE8@@N *+ *+'CцKx?l1SE9@@M *+ *+'DцKbx?l1SE:@@L *+ *+'EцKx?l1SE;@@K *+ *+'FцKx?l1SE<@@J *+ *+'GцKEy?l1SE=@@I *+ *+'HцKy?l1SE>@@H *+ *+'IцKy?l1SE?@@G *+ *+'JцK&z?l1SE@@@F *+ *+'KцKhz?l1SEA@@E *+ *+'LцKz?l1SEB@@D *+ *+'MцK {?l1SEC@@C *+ *+'NцKg{?l1SED@@B *+ *+'OцK{?l1SEE@@A *+ *+'PцK{?l1SEF@@@ *+ *+'QцKH|?l1SEG@@? *+ *+'RцK|?l1SEH@@> *+ *+'SцK|?l1SEI@@= *+ *+'TцK*}?l1SEJ@@< *+ *+'UцKl}?l1SEK@@; *+ *+'VцK}?l1SEL@@: *+ *+'WцK ~?l1SEM@@9 *+ *+'XцKN~?l1SEN@@8 *+ *+'YцK~?l1SEO@@7 *+ *+'ZцK~?l1SEP@@6 *+ *+'[цK0?l1SEQ@@5 *+ *+'\цK?l1SER@@4 *+ *+']цK?l1SES@@3 *+ *+'^цK/?l1SET@@2 *+ *+'_цKq?l1SEU@@1 *+ *+'`цK?l1SEV@@0 *+ *+'aцK?l1SEW@@/ *+ *+'bцKS?l1SEX@@. *+ *+'cцK?l1SEY@@- *+ *+'dцK?l1SEZ@@, *+ *+'eцK4?l1SE[@@+ *+ *+'fцK?l1SE\@@* *+ *+'gцKՂ?l1SE]@@) *+ *+'hцK?l1SE^@@( *+ *+'iцKu?l1SE_@@' *+ *+'jцK?l1SE`@@& *+ *+'kцK?l1SEa@@% *+ *+'lцKX?l1SEb@@$ *+ *+'mцK?l1SEc@@# *+ *+'nцK?l1SEd@@" *+ *+'oцK8?l1SEe@@! *+ *+'pцK{?l1SEf@@ *+ *+'qцKم?l1SEg@@ *+ *+'rцK?l1SEh@@ *+ *+'sцKz?l1SEi@@ *+ *+'tцK?l1SEj@@ *+ *+'uцK?l1SEk@@ *+ *+'vцK\?l1SEl@@ *+ *+'wцK?l1SEm@@ *+ *+'xцK?l1SEn@@ *+ *+'yцK>?l1SEo@@ *+ *+'zцK?l1SEp@@ *+ *+'{цKވ?l1SEq@@ *+ *+'|цK?l1SEr@@ *+ *+'}цKc?l1SEs@@ *+ *+'~цK?l1SEt@@ *+ *+'цK?l1SEu@@ *+ *+'цK_?l1SEv@@ *+ *+'цK?l1SEw@@ *+ *+'цK?l1SEx@@ *+ *+'цKB?l1SEy@@ *+ *+'цK?l1SEz@@ *+ *+'цKŋ?l1SE{@@ *+ *+'цK  ?l1SE|@@ *+ *+'цK<<?l1SE,}@@ *+ *+'@UUцK2VV?l1SEH~@@ *+ *+'4!%q@цK?l1SE@@ *+ *+'цK,?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK͟?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKm?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKO?l1SE@@ *+ *+' цK?l1SE@@ *+ *+' цK?l1SE@@ *+ *+' цK0?l1SE@@ *+ *+' цKr?l1SE@@ *+ *+' цKТ?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKq?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKS?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK֤?l1SE@@ *+ *+'цK5?l1SE@@ *+ *+'цKw?l1SE@@ *+ *+'цK֥?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKY?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKX?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKۧ?l1SE@@ *+ *+'цK:?l1SE@@ *+ *+' цK{?l1SE@@ *+ *+'!цK?l1SE@@ *+ *+'"цK?l1SE@@ *+ *+'#цK^?l1SE@@ *+ *+'$цK?l1SE@@ *+ *+'%цK?l1SE@@ *+ *+'&цK@?l1SE@@ *+ *+''цK?l1SE@@ *+ *+'(цK?l1SE@@ *+ *+')цK!?l1SE@@ *+ *+'*цK?l1SE@@ *+ *+'+цK?l1SE@@ *+ *+',цK ?l1SE@@ *+ *+'-цKa?l1SE@@ *+ *+'.цK?l1SE@@ *+ *+'/цK?l1SE@@ *+ *+'0цKD?l1SE@@ *+ *+'1цK?l1SE@@ *+ *+'2цK?l1SE@@ *+ *+'3цK&?l1SE@@ *+ *+'4цK?l1SE@@ *+ *+'5цKƮ?l1SE@@ *+ *+'6цK?l1SE@@ *+ *+'7цKg?l1SE@@ *+ *+'8цK?l1SE@@ *+ *+'9цK?l1SE@@ *+ *+':цKI?l1SE@@ *+ *+';цK?l1SE@@ *+ *+'<цK?l1SE@@ *+ *+'=цK*?l1SE@@ *+ *+'>цKl?l1SE@@ *+ *+'?цK˱?l1SE@@ *+ *+'@цK ?l1SE@@ *+ *+'AцKk?l1SE@@ *+ *+'BцK?l1SE@@ *+ *+'CцK?l1SE@@ *+ *+'DцKM?l1SE@@ *+ *+'EцK?l1SE@@ *+ *+'FцKѳ?l1SE@@ *+ *+'GцK/?l1SE@@ *+ *+'HцKq?l1SE@@ *+ *+'IцKд?l1SE@@ *+ *+'JцK?l1SE@@ *+ *+'KцKR?l1SE@@ *+ *+'LцK?l1SE@@ *+ *+'MцK?l1SE@@ *+ *+'NцKQ?l1SE@@ *+ *+'OцK?l1SE@@ *+ *+'PцKֶ?l1SE@@ *+ *+'QцK4?l1SE@@ *+ *+'RцKu?l1SE@@ *+ *+'SцK?l1SE@@ *+ *+'TцK?l1SE@@ *+ *+'UцKX?l1SE@@ *+ *+'VцK?l1SE@@ *+ *+'WцK?l1SE@@ *+ *+'XцK:?l1SE@@ *+ *+'YцK?l1SE@@ *+ *+'ZцKڹ?l1SE@@ *+ *+'[цK?l1SE@@ *+ *+'\цK{?l1SE@@ *+ *+']цK?l1SE@@ *+ *+'^цK?l1SE@@ *+ *+'_цK[?l1SE@@ *+ *+'`цK?l1SE@@ *+ *+'aцK?l1SE@@ *+ *+'bцK>?l1SE@@ *+ *+'cцK?l1SE@@ *+ *+'dцK޼?l1SE@@ *+ *+'eцK ?l1SE@@ *+ *+'fцK?l1SE@@ *+ *+'gцK?l1SE@@ *+ *+'hцK?l1SE@@ *+ *+'iцKa?l1SE@@ *+ *+'jцK?l1SE@@ *+ *+'kцK?l1SE@@ *+ *+'lцKB?l1SE@@ *+ *+'mцK?l1SE@@ *+ *+'nцK?l1SE@@ *+ *+'oцK%?l1SE@@ *+ *+'pцKf?l1SE@@ *+ *+'qцK?l1SE@@ *+ *+'rцK?l1SE@@ *+ *+'sцKe?l1SE@@ *+ *+'tцK?l1SE@@ *+ *+'uцK?l1SE@@ *+ *+'vцKG?l1SE@@ *+ *+'wцK?l1SE@@ *+ *+'xцK?l1SE@@ *+ *+'yцK)?l1SE@@ *+ *+'zцKk?l1SE@@ *+ *+'{цK?l1SE@@ *+ *+'|цK ?l1SE@@ *+ *+'}цKM?l1SE@@ *+ *+'~цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKL?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK-?l1SE@@ *+ *+'цKo?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK  ?l1SE@@ *+ *+'цK<<?l1SE,@@T *+ *+'@UUцKVV?l1SEH@@7 *+ *+'4!2p@цK?l1SE@@~ *+ *+'цK?l1SE @@} *+ *+'цKV?l1SE @@| *+ *+'цK?l1SE @@{ *+ *+'цK?l1SE @@z *+ *+'цK8?l1SE @@y *+ *+'цKy?l1SE@@x *+ *+'цK?l1SE@@w *+ *+'цK?l1SE@@v *+ *+' цK\?l1SE@@u *+ *+' цK?l1SE@@t *+ *+' цK?l1SE@@s *+ *+' цK=?l1SE@@r *+ *+' цK?l1SE@@q *+ *+'цK?l1SE@@p *+ *+'цK<?l1SE@@o *+ *+'цK~?l1SE@@n *+ *+'цK?l1SE@@m *+ *+'цK?l1SE@@l *+ *+'цK`?l1SE@@k *+ *+'цK?l1SE@@j *+ *+'цK?l1SE@@i *+ *+'цKB?l1SE@@h *+ *+'цK?l1SE@@g *+ *+'цK?l1SE @@f *+ *+'цK$?l1SE!@@e *+ *+'цK?l1SE"@@d *+ *+'цK?l1SE#@@c *+ *+'цK#?l1SE$@@b *+ *+'цKc?l1SE%@@a *+ *+'цK?l1SE&@@` *+ *+'цK?l1SE'@@_ *+ *+' цKG?l1SE(@@^ *+ *+'!цK?l1SE)@@] *+ *+'"цK?l1SE*@@\ *+ *+'#цK)?l1SE+@@[ *+ *+'$цK?l1SE,@@Z *+ *+'%цK?l1SE-@@Y *+ *+'&цK ?l1SE.@@X *+ *+''цKi?l1SE/@@W *+ *+'(цK?l1SE0@@V *+ *+')цK?l1SE1@@U *+ *+'*цKK?l1SE2@@T *+ *+'+цK?l1SE3@@S *+ *+',цK?l1SE4@@R *+ *+'-цK.?l1SE5@@Q *+ *+'.цKo?l1SE6@@P *+ *+'/цK?l1SE7@@O *+ *+'0цK?l1SE8@@N *+ *+'1цKn?l1SE9@@M *+ *+'2цK?l1SE:@@L *+ *+'3цK?l1SE;@@K *+ *+'4цKO?l1SE<@@J *+ *+'5цK?l1SE=@@I *+ *+'6цK?l1SE>@@H *+ *+'7цK2?l1SE?@@G *+ *+'8цKs?l1SE@@@F *+ *+'9цK?l1SEA@@E *+ *+':цK?l1SEB@@D *+ *+';цKV?l1SEC@@C *+ *+'<цK?l1SED@@B *+ *+'=цK?l1SEE@@A *+ *+'>цK8?l1SEF@@@ *+ *+'?цK?l1SEG@@? *+ *+'@цK?l1SEH@@> *+ *+'AцK5?l1SEI@@= *+ *+'BцKw?l1SEJ@@< *+ *+'CцK?l1SEK@@; *+ *+'DцK?l1SEL@@: *+ *+'EцKZ?l1SEM@@9 *+ *+'FцK?l1SEN@@8 *+ *+'GцK?l1SEO@@7 *+ *+'HцK<?l1SEP@@6 *+ *+'IцK?l1SEQ@@5 *+ *+'JцK?l1SER@@4 *+ *+'KцK?l1SES@@3 *+ *+'LцK}?l1SET@@2 *+ *+'MцK?l1SEU@@1 *+ *+'NцK?l1SEV@@0 *+ *+'OцK_?l1SEW@@/ *+ *+'PцK?l1SEX@@. *+ *+'QцK?l1SEY@@- *+ *+'RцK@?l1SEZ@@, *+ *+'SцK?l1SE[@@+ *+ *+'TцK?l1SE\@@* *+ *+'UцK#?l1SE]@@) *+ *+'VцK?l1SE^@@( *+ *+'WцK?l1SE_@@' *+ *+'XцK?l1SE`@@& *+ *+'YцKd?l1SEa@@% *+ *+'ZцK?l1SEb@@$ *+ *+'[цK?l1SEc@@# *+ *+'\цKE?l1SEd@@" *+ *+']цK?l1SEe@@! *+ *+'^цK?l1SEf@@ *+ *+'_цK&?l1SEg@@ *+ *+'`цKj?l1SEh@@ *+ *+'aцK?l1SEi@@ *+ *+'bцK ?l1SEj@@ *+ *+'cцKh?l1SEk@@ *+ *+'dцK?l1SEl@@ *+ *+'eцK?l1SEm@@ *+ *+'fцKK?l1SEn@@ *+ *+'gцK?l1SEo@@ *+ *+'hцK?l1SEp@@ *+ *+'iцK+?l1SEq@@ *+ *+'jцKn?l1SEr@@ *+ *+'kцK?l1SEs@@ *+ *+'lцK?l1SEt@@ *+ *+'mцKP?l1SEu@@ *+ *+'nцK?l1SEv@@ *+ *+'oцK?l1SEw@@ *+ *+'pцK1?l1SEx@@ *+ *+'qцK?l1SEy@@ *+ *+'rцK?l1SEz@@ *+ *+'sцK0?l1SE{@@ *+ *+'tцKr?l1SE|@@ *+ *+'uцK?l1SE}@@ *+ *+'vцK?l1SE~@@ *+ *+'wцKT?l1SE@@ *+ *+'xцK?l1SE@@ *+ *+'yцK?l1SE@@ *+ *+'zцK6?l1SE@@ *+ *+'{цK?l1SE@@ *+ *+'|цK?l1SE@@ *+ *+'}цK?l1SE@@ *+ *+'~цKw?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKZ?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK;?l1SE@@ *+ *+'цK|?l1SE@@ *+ *+'цK  ?l1SE@@ *+ *+'цK<<?l1SE,@@ *+ *+'@UUцKVV?l1SEH@@ *+ *+'4!>@цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK=?l1SE@@ *+ *+'цK~?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKa?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+' цKC?l1SE@@ *+ *+' цK?l1SE@@ *+ *+' цK?l1SE@@ *+ *+' цK&?l1SE@@ *+ *+' цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK$?l1SE@@ *+ *+'цKf?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цKG?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK*?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK ?l1SE@@ *+ *+'цKj?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK ?l1SE@@ *+ *+'цKL?l1SE@@ *+ *+'цK?l1SE@@ *+ *+'цK?l1SE@@ *+ *+' цK-?l1SE@@ *+ *+'!цKq?l1SE@@ *+ *+'"цK?l1SE@@ *+ *+'#цK?l1SE@@ *+ *+'$цKo?l1SE@@ *+ *+'%цK?l1SE@@ *+ *+'&цK?l1SE@@ *+ *+''цKQ ?l1SE@@ *+ *+'(цK ?l1SE@@ *+ *+')цK ?l1SE@@ *+ *+'*цK2!?l1SE@@ *+ *+'+цKu!?l1SE@@ *+ *+',цK!?l1SE@@ *+ *+'-цK"?l1SE@@ *+ *+'.цKW"?l1SE@@ *+ *+'/цK"?l1SE@@ *+ *+'0цK"?l1SE@@ *+ *+'1цKV#?l1SE@@ *+ *+'2цK#?l1SE@@ *+ *+'3цK#?l1SE@@ *+ *+'4цK7$?l1SE@@ *+ *+'5цKx$?l1SE@@ *+ *+'6цK$?l1SE@@ *+ *+'7цK%?l1SE@@ *+ *+'8цK[%?l1SE@@ *+ *+'9цK%?l1SE@@ *+ *+':цK%?l1SE@@ *+ *+';цK=&?l1SE@@ *+ *+'<цK&?l1SE@@ *+ *+'=цK&?l1SE@@ *+ *+'>цK'?l1SE@@ *+ *+'?цK}'?l1SE@@ *+ *+'@цK'?l1SE@@ *+ *+'AцK(?l1SE@@ *+ *+'BцK^(?l1SE@@ *+ *+'CцK(?l1SE@@ *+ *+'DцK)?l1SE@@ *+ *+'EцKA)?l1SE@@ *+ *+'FцK)?l1SE@@ *+ *+'GцK)?l1SE@@ *+ *+'HцK$*?l1SE@@ *+ *+'IцK*?l1SE@@ *+ *+'JцK*?l1SE@@ *+ *+'KцK+?l1SE@@ *+ *+'LцKc+?l1SE@@ *+ *+'MцK+?l1SE@@ *+ *+'NцK,?l1SE@@ *+ *+'OцKG,?l1SE@@ *+ *+'PцK,?l1SE@@ *+ *+'QцK,?l1SE@@ *+ *+'RцK)-?l1SE@@ *+ *+'SцKi-?l1SE@@ *+ *+'TцK-?l1SE@@ *+ *+'UцK .?l1SE@@ *+ *+'VцKi.?l1SE@@ *+ *+'WцK.?l1SE@@ *+ *+'XцK.?l1SE@@ *+ *+'YцKJ/?l1SE@@ *+ *+'ZцK/?l1SE@@ *+ *+'[цK/?l1SE@@ *+ *+'\цK-0?l1SE@@ *+ *+']цKn0?l1SE@@ *+ *+'^цK0?l1SE@@ *+ *+'_цK1?l1SE@@ *+ *+'`цKQ1?l1SE@@ *+ *+'aцK1?l1SE@@ *+ *+'bцK1?l1SE@@ *+ *+'cцKP2?l1SE@@ *+ *+'dцK2?l1SE@@ *+ *+'eцK2?l1SE@@ *+ *+'fцK23?l1SE@@ *+ *+'gцKs3?l1SE@@ *+ *+'hцK3?l1SE@@ *+ *+'iцK4?l1SE@@ *+ *+'jцKU4?l1SE@@ *+ *+'kцK4?l1SE@@ *+ *+'lцK4?l1SE@@ *+ *+'mцK75?l1SE@@ *+ *+'nцK5?l1SE@@ *+ *+'oцK5?l1SE@@ *+ *+'pцK6?l1SE@@ *+ *+'qцKy6?l1SE@@ *+ *+'rцK6?l1SE@@ *+ *+'sцK7?l1SE@@ *+ *+'tцKZ7?l1SE@@ *+ *+'uцK7?l1SE@@ *+ *+'vцK7?l1SE@@ *+ *+'wцK;8?l1SE@@~ *+ *+'xцK}8?l1SE @@} *+ *+'yцK8?l1SE @@| *+ *+'zцK9?l1SE @@{ *+ *+'{цK|9?l1SE @@z *+ *+'|цK9?l1SE @@y *+ *+'}цK:?l1SE@@x *+ *+'~цK^:?l1SE@@w *+ *+'цK:?l1SE@@v *+ *+'цK:?l1SE@@u *+ *+'цK@;?l1SE@@t *+ *+'цK;?l1SE@@s *+ *+'цK;?l1SE@@r *+ *+'цK#<?l1SE@@q *+ *+'цKe<?l1SE@@p *+ *+'цK<  ?l1SE@@s *+ *+'цK<<<?l1SE,@@B *+ *+'@UUцKNVV?l1SEH@@% *+ *+'4!K%*@цKiO?l1SE@@l *+ *+'цKO?l1SE@@k *+ *+'цK P?l1SE@@j *+ *+'цKJP?l1SE@@i *+ *+'цKP?l1SE@@h *+ *+'цKP?l1SE@@g *+ *+'цK,Q?l1SE @@f *+ *+'цKQ?l1SE!@@e *+ *+'цKQ?l1SE"@@d *+ *+' цKR?l1SE#@@c *+ *+' цKlR?l1SE$@@b *+ *+' цKR?l1SE%@@a *+ *+' цKR?l1SE&@@` *+ *+' цKOS?l1SE'@@_ *+ *+'цKS?l1SE(@@^ *+ *+'цKS?l1SE)@@] *+ *+'цK1T?l1SE*@@\ *+ *+'цKsT?l1SE+@@[ *+ *+'цKT?l1SE,@@Z *+ *+'цKU?l1SE-@@Y *+ *+'цKUU?l1SE.@@X *+ *+'цKU?l1SE/@@W *+ *+'цKU?l1SE0@@V *+ *+'цKTV?l1SE1@@U *+ *+'цKV?l1SE2@@T *+ *+'цKV?l1SE3@@S *+ *+'цK5W?l1SE4@@R *+ *+'цKwW?l1SE5@@Q *+ *+'цKW?l1SE6@@P *+ *+'цKX?l1SE7@@O *+ *+'цKYX?l1SE8@@N *+ *+'цKX?l1SE9@@M *+ *+' цKX?l1SE:@@L *+ *+'!цK;Y?l1SE;@@K *+ *+'"цKY?l1SE<@@J *+ *+'#цKY?l1SE=@@I *+ *+'$цK:Z?l1SE>@@H *+ *+'%цK{Z?l1SE?@@G *+ *+'&цKZ?l1SE@@@F *+ *+''цK[?l1SEA@@E *+ *+'(цK_[?l1SEB@@D *+ *+')цK[?l1SEC@@C *+ *+'*цK[?l1SED@@B *+ *+'+цK?\?l1SEE@@A *+ *+',цK\?l1SEF@@@ *+ *+'-цK\?l1SEG@@? *+ *+'.цK"]?l1SEH@@> *+ *+'/цK]?l1SEI@@= *+ *+'0цK]?l1SEJ@@< *+ *+'1цK!^?l1SEK@@; *+ *+'2цKb^?l1SEL@@: *+ *+'3цK^?l1SEM@@9 *+ *+'4цK_?l1SEN@@8 *+ *+'5цKD_?l1SEO@@7 *+ *+'6цK_?l1SEP@@6 *+ *+'7цK_?l1SEQ@@5 *+ *+'8цK&`?l1SER@@4 *+ *+'9цK`?l1SES@@3 *+ *+':цK`?l1SET@@2 *+ *+';цKa?l1SEU@@1 *+ *+'<цKga?l1SEV@@0 *+ *+'=цKa?l1SEW@@/ *+ *+'>цKa?l1SEX@@. *+ *+'?цKIb?l1SEY@@- *+ *+'@цKb?l1SEZ@@, *+ *+'AцKb?l1SE[@@+ *+ *+'BцK+c?l1SE\@@* *+ *+'CцKlc?l1SE]@@) *+ *+'DцKc?l1SE^@@( *+ *+'EцK d?l1SE_@@' *+ *+'FцKOd?l1SE`@@& *+ *+'GцKd?l1SEa@@% *+ *+'HцKd?l1SEb@@$ *+ *+'IцKMe?l1SEc@@# *+ *+'JцKe?l1SEd@@" *+ *+'KцKe?l1SEe@@! *+ *+'LцK/f?l1SEf@@ *+ *+'MцKqf?l1SEg@@ *+ *+'NцKf?l1SEh@@ *+ *+'OцKg?l1SEi@@ *+ *+'PцKSg?l1SEj@@ *+ *+'QцKg?l1SEk@@ *+ *+'RцKg?l1SEl@@ *+ *+'SцK6h?l1SEm@@ *+ *+'TцKh?l1SEn@@ *+ *+'UцKh?l1SEo@@ *+ *+'VцK4i?l1SEp@@ *+ *+'WцKvi?l1SEq@@ *+ *+'XцKi?l1SEr@@ *+ *+'YцKj?l1SEs@@ *+ *+'ZцKWj?l1SEt@@ *+ *+'[цKj?l1SEu@@ *+ *+'\цKj?l1SEv@@ *+ *+']цK:k?l1SEw@@ *+ *+'^цKk?l1SEx@@ *+ *+'_цKk?l1SEy@@ *+ *+'`цKl?l1SEz@@ *+ *+'aцKzl?l1SE{@@ *+ *+'bцKl?l1SE|@@ *+ *+'cцKm?l1SE}@@ *+ *+'dцK\m?l1SE~@@ *+ *+'eцKm?l1SE@@ *+ *+'fцKm?l1SE@@ *+ *+'gцK>n?l1SE@@ *+ *+'hцKn?l1SE@@ *+ *+'iцKn?l1SE@@ *+ *+'jцK!o?l1SE@@ *+ *+'kцK~o?l1SE@@ *+ *+'lцKo?l1SE@@ *+ *+'mцKp?l1SE@@ *+ *+'nцKap?l1SE@@ *+ *+'oцKp?l1SE@@ *+ *+'pцKp?l1SE@@ *+ *+'qцKCq?l1SE@@ *+ *+'rцKq?l1SE@@ *+ *+'sцKq?l1SE@@ *+ *+'tцK%r?l1SE@@ *+ *+'uцKgr?l1SE@@ *+ *+'vцKr?l1SE@@ *+ *+'wцKs?l1SE@@ *+ *+'xцKIs?l1SE@@ *+ *+'yцKs?l1SE@@ *+ *+'zцKs?l1SE@@ *+ *+'{цKHt?l1SE@@ *+ *+'|цKt?l1SE@@ *+ *+'}цKt?l1SE@@ *+ *+'~цK+u?l1SE@@ *+ *+'цKku?l1SE@@ *+ *+'цKu?l1SE@@ *+ *+'цK v?l1SE@@ *+ *+'цKMv?l1SE@@ *+ *+'цKv?l1SE@@ *+ *+'цKv?l1SE@@ *+ *+'цK/w?l1SE@@ *+ *+'цKbw  ?l1SE@@ *+ *+'цKjw<<?l1SE,@@ *+ *+'@UUцK<{::1S?lE,@@b *+ *+ (tjBl0цKv|<<?l1SE(X  *+ *+t(lцK|::1S?lE,@@b *+ *+ (tjBm цK<<?l1SE(Y  *+ *+t(mцK::1S?lE,@@b *+ *+ (tjBn цKІ<<?l1SE(Z  *+ *+t(nцK ::1S?lE,@@b *+ *+ (tjBo цK<<?l1SE([  *+ *+t(oԆK7K**1S?l?l *+ *+ ԆKL<<?l1S1S *+ ?l *+aravis-ARAVIS_0_6_0/viewer/000077500000000000000000000000001334570641500155225ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/viewer/.gitignore000066400000000000000000000001051334570641500175060ustar00rootroot00000000000000arv-viewer data/arv-viewer.appdata.xml data/arv-viewer.appdata.valid aravis-ARAVIS_0_6_0/viewer/Makefile.am000066400000000000000000000035311334570641500175600ustar00rootroot00000000000000EXTRA_DIST = include $(top_srcdir)/Makefile.decl SUBDIRS = data AM_CPPFLAGS = \ -I$(top_srcdir)/src \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ -DPACKAGE_SRC_DIR=\""$(srcdir)"\" \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" $(ARAVIS_VIEWER_CFLAGS) \ -DARAVIS_DATA_DIR=\""$(aravis_datadir)"\" \ -DARAVIS_ICON_DIR=\""$(datadir)/icons"\" \ -DG_LOG_DOMAIN=\"Aravis\" AM_CFLAGS = -Wall bin_PROGRAMS = arv-viewer arv_viewer_SOURCES = \ main.c \ arvviewer.c \ arvviewertypes.h \ arvviewer.h arv_viewer_LDADD = $(ARAVIS_VIEWER_LIBS) $(top_builddir)/src/libaravis-@ARAVIS_API_VERSION@.la arv_viewerdir = $(aravis_datadir) arv_viewer_DATA = arv-viewer.ui EXTRA_DIST += arv-viewer.ui iconthemedir = $(datadir)/icons/hicolor icondir = ./icons/gnome appsicon22dir = $(iconthemedir)/22x22/apps appsicon32dir = $(iconthemedir)/32x32/apps appsicon48dir = $(iconthemedir)/48x48/apps appsicon256dir = $(iconthemedir)/256x256/apps protocoliconscalabledir = $(iconthemedir)/scalable/devices dist_appsicon22_DATA = $(icondir)/22x22/apps/aravis.png dist_appsicon32_DATA = $(icondir)/32x32/apps/aravis.png dist_appsicon48_DATA = $(icondir)/48x48/apps/aravis.png dist_appsicon256_DATA = $(icondir)/256x256/apps/aravis.png dist_protocoliconscalable_DATA = \ $(icondir)/scalable/devices/aravis-usb3vision-symbolic.svg \ $(icondir)/scalable/devices/aravis-gigevision-symbolic.svg \ $(icondir)/scalable/devices/aravis-fake-symbolic.svg update_icon_cache = gtk-update-icon-cache --ignore-theme-index --force install-data-hook: install-update-icon-cache uninstall-hook: uninstall-update-icon-cache install-update-icon-cache: $(AM_V_at)$(POST_INSTALL) test -n "$(DESTDIR)" || $(update_icon_cache) "$(iconthemedir)" uninstall-update-icon-cache: $(AM_V_at)$(POST_UNINSTALL) test -n "$(DESTDIR)" || $(update_icon_cache) "$(iconthemedir)" aravis-ARAVIS_0_6_0/viewer/arv-viewer.ui000066400000000000000000000767211334570641500201650ustar00rootroot00000000000000 False acquisition_button True False start 6 6 6 6 6 6 True False Frame rate: 1 1 0 True True 10 False False 2 0 True False Hz 0 3 0 2 Auto False True True True 0 1 True False Exposure: 1 1 1 Auto False True True True 0 2 True False Gain: 1 1 2 True True 11 False False 2 1 True True 11 False False 2 2 True False µs 0 3 1 200 True True False 4 1 True True False 4 2 True False dB 3 2 False 0 0 False False True False Aravis Viewer True True True Return to camera list True True False go-previous-symbolic 1 False True True True Save a snapshot into image folder True False document-save-symbolic 2 False True True True Rotate image to the right True False object-rotate-right-symbolic 3 False True True True Flip image horizontally True False object-flip-horizontal-symbolic 4 False True True True Flip image vertically True False object-flip-vertical-symbolic 5 True True True Acquisition settings acquisition_popover True False open-menu-symbolic end 5 True False crossfade True False vertical 200 True True 6 6 6 True always out True True True camera_liststore False 0 Vendor 2 Model 4 1 3 Serial 4 True True 0 True False 6 6 True False Refresh camera list True view-refresh-symbolic False True True False False Start video acquisition True media-playback-start-symbolic False True False True 1 True False end 12 12 12 12 6 6 True True False Pixel format: right 1 0 0 True False Region size: right 1 0 3 True False x 2 3 True False pixels 4 3 True False Region position: right 1 0 1 True False pixels 4 1 True True 10 10 1 1 True True 10 10 3 1 True True 10 10 3 3 True True 10 10 False 1 3 True False 1 0 True False Binning: right 1 0 2 True True 10 10 False 1 2 True True 10 10 False 3 2 True False pixels 4 2 False False 2 page0 True False 0 0 none page1 1 aravis-ARAVIS_0_6_0/viewer/arvviewer.c000066400000000000000000001315301334570641500177030ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #include #include #include #include #include #include #include #include #ifdef GDK_WINDOWING_X11 #include // for GDK_WINDOW_XID #endif #ifdef GDK_WINDOWING_WIN32 #include // for GDK_WINDOW_HWND #endif static gboolean has_autovideo_sink = FALSE; static gboolean has_gtksink = FALSE; static gboolean has_gtkglsink = FALSE; static gboolean gstreamer_plugin_check (void) { static gsize check_done = 0; static gboolean check_success = FALSE; if (g_once_init_enter (&check_done)) { GstRegistry *registry; GstPluginFeature *feature; unsigned int i; gboolean success = TRUE; static char *plugins[] = { "appsrc", "videoconvert", "videoflip", "bayer2rgb" }; registry = gst_registry_get (); for (i = 0; i < G_N_ELEMENTS (plugins); i++) { feature = gst_registry_lookup_feature (registry, plugins[i]); if (!GST_IS_PLUGIN_FEATURE (feature)) { g_print ("Gstreamer plugin '%s' is missing.\n", plugins[i]); success = FALSE; } else g_object_unref (feature); } feature = gst_registry_lookup_feature (registry, "autovideosink"); if (GST_IS_PLUGIN_FEATURE (feature)) { has_autovideo_sink = TRUE; g_object_unref (feature); } feature = gst_registry_lookup_feature (registry, "gtksink"); if (GST_IS_PLUGIN_FEATURE (feature)) { has_gtksink = TRUE; g_object_unref (feature); } feature = gst_registry_lookup_feature (registry, "gtkglsink"); if (GST_IS_PLUGIN_FEATURE (feature)) { has_gtkglsink = TRUE; g_object_unref (feature); } if (!has_autovideo_sink && !has_gtkglsink && !has_gtksink) { g_print ("Missing GStreamer video output plugin (autovideosink, gtksink or gtkglsink)\n"); success = FALSE; } if (!success) g_print ("Check your gstreamer installation.\n"); /* Kludge, prevent autoloading of coglsink, which doesn't seem to work for us */ feature = gst_registry_lookup_feature (registry, "coglsink"); if (GST_IS_PLUGIN_FEATURE (feature)) { gst_plugin_feature_set_rank (feature, GST_RANK_NONE); g_object_unref (feature); } check_success = success; g_once_init_leave (&check_done, 1); } return check_success; } typedef struct { GtkApplication parent_instance; ArvCamera *camera; char *camera_name; ArvStream *stream; ArvBuffer *last_buffer; GstElement *pipeline; GstElement *appsrc; GstElement *transform; guint rotation; gboolean flip_vertical; gboolean flip_horizontal; double exposure_min, exposure_max; NotifyNotification *notification; GtkWidget *main_window; GtkWidget *main_stack; GtkWidget *main_headerbar; GtkWidget *camera_box; GtkWidget *refresh_button; GtkWidget *video_mode_button; GtkWidget *camera_tree; GtkWidget *back_button; GtkWidget *snapshot_button; GtkWidget *rotate_cw_button; GtkWidget *flip_vertical_toggle; GtkWidget *flip_horizontal_toggle; GtkWidget *camera_parameters; GtkWidget *pixel_format_combo; GtkWidget *camera_x; GtkWidget *camera_y; GtkWidget *camera_binning_x; GtkWidget *camera_binning_y; GtkWidget *camera_width; GtkWidget *camera_height; GtkWidget *video_frame; GtkWidget *trigger_combo_box; GtkWidget *frame_rate_entry; GtkWidget *exposure_spin_button; GtkWidget *gain_spin_button; GtkWidget *exposure_hscale; GtkWidget *gain_hscale; GtkWidget *auto_exposure_toggle; GtkWidget *auto_gain_toggle; GtkWidget *acquisition_button; gulong camera_selected; gulong exposure_spin_changed; gulong gain_spin_changed; gulong exposure_hscale_changed; gulong gain_hscale_changed; gulong auto_gain_clicked; gulong auto_exposure_clicked; gulong camera_x_changed; gulong camera_y_changed; gulong camera_binning_x_changed; gulong camera_binning_y_changed; gulong camera_width_changed; gulong camera_height_changed; gulong pixel_format_changed; guint gain_update_event; guint exposure_update_event; gboolean auto_socket_buffer; gboolean packet_resend; guint packet_timeout; guint frame_retention; gulong video_window_xid; } ArvViewer; typedef GtkApplicationClass ArvViewerClass; G_DEFINE_TYPE (ArvViewer, arv_viewer, GTK_TYPE_APPLICATION) typedef enum { ARV_VIEWER_MODE_CAMERA_LIST, ARV_VIEWER_MODE_VIDEO } ArvViewerMode; static void select_mode (ArvViewer *viewer, ArvViewerMode mode); void arv_viewer_set_options (ArvViewer *viewer, gboolean auto_socket_buffer, gboolean packet_resend, guint packet_timeout, guint frame_retention) { g_return_if_fail (viewer != NULL); viewer->auto_socket_buffer = auto_socket_buffer; viewer->packet_resend = packet_resend; viewer->packet_timeout = packet_timeout; viewer->frame_retention = frame_retention; } static double arv_viewer_value_to_log (double value, double min, double max) { if (min >= max) return 1.0; if (value < min) return 0.0; return (log10 (value) - log10 (min)) / (log10 (max) - log10 (min)); } static double arv_viewer_value_from_log (double value, double min, double max) { if (min <= 0.0 || max <= 0) return 0.0; if (value > 1.0) return max; if (value < 0.0) return min; return pow (10.0, (value * (log10 (max) - log10 (min)) + log10 (min))); } typedef struct { GWeakRef stream; ArvBuffer* arv_buffer; } ArvGstBufferReleaseData; static void gst_buffer_release_cb (void *user_data) { ArvGstBufferReleaseData* release_data = user_data; ArvStream* stream = g_weak_ref_get (&release_data->stream); if (stream) { gint n_input_buffers, n_output_buffers; arv_stream_get_n_buffers (stream, &n_input_buffers, &n_output_buffers); arv_log_viewer ("push_buffer (%d,%d)", n_input_buffers, n_output_buffers); arv_stream_push_buffer (stream, release_data->arv_buffer); g_object_unref (stream); } else { arv_debug_viewer ("invalid stream object"); g_object_unref (release_data->arv_buffer); } g_weak_ref_clear (&release_data->stream); g_free (release_data); } static GstBuffer * arv_to_gst_buffer (ArvBuffer *arv_buffer, ArvStream *stream) { GstBuffer *buffer; int arv_row_stride; int width, height; char *buffer_data; size_t buffer_size; buffer_data = (char *) arv_buffer_get_data (arv_buffer, &buffer_size); arv_buffer_get_image_region (arv_buffer, NULL, NULL, &width, &height); arv_row_stride = width * ARV_PIXEL_FORMAT_BIT_PER_PIXEL (arv_buffer_get_image_pixel_format (arv_buffer)) / 8; /* Gstreamer requires row stride to be a multiple of 4 */ if ((arv_row_stride & 0x3) != 0) { int gst_row_stride; size_t size; void *data; int i; gst_row_stride = (arv_row_stride & ~(0x3)) + 4; size = height * gst_row_stride; data = g_malloc (size); for (i = 0; i < height; i++) memcpy (((char *) data) + i * gst_row_stride, buffer_data + i * arv_row_stride, arv_row_stride); buffer = gst_buffer_new_wrapped (data, size); } else { ArvGstBufferReleaseData* release_data = g_new0 (ArvGstBufferReleaseData, 1); g_weak_ref_init (&release_data->stream, stream); release_data->arv_buffer = arv_buffer; buffer = gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_READONLY, buffer_data, buffer_size, 0, buffer_size, release_data, gst_buffer_release_cb); } return buffer; } static void new_buffer_cb (ArvStream *stream, ArvViewer *viewer) { ArvBuffer *arv_buffer; gint n_input_buffers, n_output_buffers; arv_buffer = arv_stream_pop_buffer (stream); if (arv_buffer == NULL) return; arv_stream_get_n_buffers (stream, &n_input_buffers, &n_output_buffers); arv_log_viewer ("pop_buffer (%d,%d)", n_input_buffers, n_output_buffers); if (arv_buffer_get_status (arv_buffer) == ARV_BUFFER_STATUS_SUCCESS) { gst_app_src_push_buffer (GST_APP_SRC (viewer->appsrc), arv_to_gst_buffer (arv_buffer, stream)); g_clear_object( &viewer->last_buffer ); viewer->last_buffer = g_object_ref( arv_buffer ); } else { arv_stream_push_buffer (stream, arv_buffer); } } static void frame_rate_entry_cb (GtkEntry *entry, ArvViewer *viewer) { char *text; double frame_rate; text = (char *) gtk_entry_get_text (entry); arv_camera_set_frame_rate (viewer->camera, g_strtod (text, NULL)); frame_rate = arv_camera_get_frame_rate (viewer->camera); text = g_strdup_printf ("%g", frame_rate); gtk_entry_set_text (entry, text); g_free (text); } static gboolean frame_rate_entry_focus_cb (GtkEntry *entry, GdkEventFocus *event, ArvViewer *viewer) { frame_rate_entry_cb (entry, viewer); return FALSE; } static void exposure_spin_cb (GtkSpinButton *spin_button, ArvViewer *viewer) { double exposure = gtk_spin_button_get_value (spin_button); double log_exposure = arv_viewer_value_to_log (exposure, viewer->exposure_min, viewer->exposure_max); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (viewer->auto_exposure_toggle), FALSE); arv_camera_set_exposure_time (viewer->camera, exposure); g_signal_handler_block (viewer->exposure_hscale, viewer->exposure_hscale_changed); gtk_range_set_value (GTK_RANGE (viewer->exposure_hscale), log_exposure); g_signal_handler_unblock (viewer->exposure_hscale, viewer->exposure_hscale_changed); } static void gain_spin_cb (GtkSpinButton *spin_button, ArvViewer *viewer) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (viewer->auto_gain_toggle), FALSE); arv_camera_set_gain (viewer->camera, gtk_spin_button_get_value (spin_button)); g_signal_handler_block (viewer->gain_hscale, viewer->gain_hscale_changed); gtk_range_set_value (GTK_RANGE (viewer->gain_hscale), gtk_spin_button_get_value (spin_button)); g_signal_handler_unblock (viewer->gain_hscale, viewer->gain_hscale_changed); } static void exposure_scale_cb (GtkRange *range, ArvViewer *viewer) { double log_exposure = gtk_range_get_value (range); double exposure = arv_viewer_value_from_log (log_exposure, viewer->exposure_min, viewer->exposure_max); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (viewer->auto_exposure_toggle), FALSE); arv_camera_set_exposure_time (viewer->camera, exposure); g_signal_handler_block (viewer->exposure_spin_button, viewer->exposure_spin_changed); gtk_spin_button_set_value (GTK_SPIN_BUTTON (viewer->exposure_spin_button), exposure); g_signal_handler_unblock (viewer->exposure_spin_button, viewer->exposure_spin_changed); } static void gain_scale_cb (GtkRange *range, ArvViewer *viewer) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (viewer->auto_gain_toggle), FALSE); arv_camera_set_gain (viewer->camera, gtk_range_get_value (range)); g_signal_handler_block (viewer->gain_spin_button, viewer->gain_spin_changed); gtk_spin_button_set_value (GTK_SPIN_BUTTON (viewer->gain_spin_button), gtk_range_get_value (range)); g_signal_handler_unblock (viewer->gain_spin_button, viewer->gain_spin_changed); } gboolean update_exposure_cb (void *data) { ArvViewer *viewer = data; double exposure; double log_exposure; exposure = arv_camera_get_exposure_time (viewer->camera); log_exposure = arv_viewer_value_to_log (exposure, viewer->exposure_min, viewer->exposure_max); g_signal_handler_block (viewer->exposure_hscale, viewer->exposure_hscale_changed); g_signal_handler_block (viewer->exposure_spin_button, viewer->exposure_spin_changed); gtk_range_set_value (GTK_RANGE (viewer->exposure_hscale), log_exposure); gtk_spin_button_set_value (GTK_SPIN_BUTTON (viewer->exposure_spin_button), exposure); g_signal_handler_unblock (viewer->exposure_spin_button, viewer->exposure_spin_changed); g_signal_handler_unblock (viewer->exposure_hscale, viewer->exposure_hscale_changed); return TRUE; } static void update_exposure_ui (ArvViewer *viewer, gboolean is_auto) { update_exposure_cb (viewer); if (viewer->exposure_update_event > 0) { g_source_remove (viewer->exposure_update_event); viewer->exposure_update_event = 0; } if (is_auto) viewer->exposure_update_event = g_timeout_add_seconds (1, update_exposure_cb, viewer); } static void auto_exposure_cb (GtkToggleButton *toggle, ArvViewer *viewer) { gboolean is_auto; is_auto = gtk_toggle_button_get_active (toggle); arv_camera_set_exposure_time_auto (viewer->camera, is_auto ? ARV_AUTO_CONTINUOUS : ARV_AUTO_OFF); update_exposure_ui (viewer, is_auto); } static gboolean update_gain_cb (void *data) { ArvViewer *viewer = data; double gain; gain = arv_camera_get_gain (viewer->camera); g_signal_handler_block (viewer->gain_hscale, viewer->gain_hscale_changed); g_signal_handler_block (viewer->gain_spin_button, viewer->gain_spin_changed); gtk_range_set_value (GTK_RANGE (viewer->gain_hscale), gain); gtk_spin_button_set_value (GTK_SPIN_BUTTON (viewer->gain_spin_button), gain); g_signal_handler_unblock (viewer->gain_spin_button, viewer->gain_spin_changed); g_signal_handler_unblock (viewer->gain_hscale, viewer->gain_hscale_changed); return TRUE; } static void update_gain_ui (ArvViewer *viewer, gboolean is_auto) { update_gain_cb (viewer); if (viewer->gain_update_event > 0) { g_source_remove (viewer->gain_update_event); viewer->gain_update_event = 0; } if (is_auto) viewer->gain_update_event = g_timeout_add_seconds (1, update_gain_cb, viewer); } void auto_gain_cb (GtkToggleButton *toggle, ArvViewer *viewer) { gboolean is_auto; is_auto = gtk_toggle_button_get_active (toggle); arv_camera_set_gain_auto (viewer->camera, is_auto ? ARV_AUTO_CONTINUOUS : ARV_AUTO_OFF); update_gain_ui (viewer, is_auto); } void snapshot_cb (GtkButton *button, ArvViewer *viewer) { GFile *file; char *path; char *filename; GDateTime *date; char *date_string; int width, height; const char *data; const char *pixel_format; size_t size; g_return_if_fail (ARV_IS_CAMERA (viewer->camera)); g_return_if_fail (ARV_IS_BUFFER (viewer->last_buffer)); pixel_format = arv_camera_get_pixel_format_as_string (viewer->camera); arv_buffer_get_image_region (viewer->last_buffer, NULL, NULL, &width, &height); data = arv_buffer_get_data (viewer->last_buffer, &size); path = g_build_filename (g_get_user_special_dir (G_USER_DIRECTORY_PICTURES), "Aravis", NULL); file = g_file_new_for_path (path); g_free (path); g_file_make_directory (file, NULL, NULL); g_object_unref (file); date = g_date_time_new_now_local (); date_string = g_date_time_format (date, "%Y-%m-%d-%H:%M:%S"); filename = g_strdup_printf ("%s-%s-%d-%d-%s-%s.raw", arv_camera_get_vendor_name (viewer->camera), arv_camera_get_device_id (viewer->camera), width, height, pixel_format != NULL ? pixel_format : "Unknown", date_string); path = g_build_filename (g_get_user_special_dir (G_USER_DIRECTORY_PICTURES), "Aravis", filename, NULL); g_file_set_contents (path, data, size, NULL); if (viewer->notification) { notify_notification_update (viewer->notification, "Snapshot saved to Image folder", path, "gtk-save"); notify_notification_show (viewer->notification, NULL); } g_free (path); g_free (filename); g_free (date_string); g_date_time_unref (date); } static void update_transform (ArvViewer *viewer) { static const gint methods[4][4] = { {0, 1, 2, 3}, {4, 6, 5, 7}, {5, 7, 4, 6}, {2, 3, 0, 1} }; int index = (viewer->flip_horizontal ? 1 : 0) + (viewer->flip_vertical ? 2 : 0); g_object_set (viewer->transform, "method", methods[index][viewer->rotation % 4], NULL); } static void rotate_cw_cb (GtkButton *button, ArvViewer *viewer) { viewer->rotation = (viewer->rotation + 1) % 4; update_transform (viewer); } static void flip_horizontal_cb (GtkToggleButton *toggle, ArvViewer *viewer) { viewer->flip_horizontal = gtk_toggle_button_get_active (toggle); update_transform (viewer); } static void flip_vertical_cb (GtkToggleButton *toggle, ArvViewer *viewer) { viewer->flip_vertical = gtk_toggle_button_get_active (toggle); update_transform (viewer); } static void stream_cb (void *user_data, ArvStreamCallbackType type, ArvBuffer *buffer) { if (type == ARV_STREAM_CALLBACK_TYPE_INIT) { if (!arv_make_thread_realtime (10) && !arv_make_thread_high_priority (-10)) g_warning ("Failed to make stream thread high priority"); } } static void update_camera_region (ArvViewer *viewer) { gint x, y, width, height; gint dx, dy; gint min, max; g_signal_handler_block (viewer->camera_x, viewer->camera_x_changed); g_signal_handler_block (viewer->camera_y, viewer->camera_y_changed); g_signal_handler_block (viewer->camera_width, viewer->camera_width_changed); g_signal_handler_block (viewer->camera_height, viewer->camera_height_changed); g_signal_handler_block (viewer->camera_binning_x, viewer->camera_binning_x_changed); g_signal_handler_block (viewer->camera_binning_y, viewer->camera_binning_y_changed); arv_camera_get_region (viewer->camera, &x, &y, &width, &height); arv_camera_get_binning (viewer->camera, &dx, &dy); arv_camera_get_x_binning_bounds (viewer->camera, &min, &max); gtk_spin_button_set_range (GTK_SPIN_BUTTON (viewer->camera_binning_x), min, max); gtk_spin_button_set_increments (GTK_SPIN_BUTTON (viewer->camera_binning_x), 1, 10); gtk_spin_button_set_value (GTK_SPIN_BUTTON (viewer->camera_binning_x), dx); arv_camera_get_y_binning_bounds (viewer->camera, &min, &max); gtk_spin_button_set_range (GTK_SPIN_BUTTON (viewer->camera_binning_y), min, max); gtk_spin_button_set_increments (GTK_SPIN_BUTTON (viewer->camera_binning_y), 1, 10); gtk_spin_button_set_value (GTK_SPIN_BUTTON (viewer->camera_binning_y), dy); arv_camera_get_x_offset_bounds (viewer->camera, &min, &max); gtk_spin_button_set_range (GTK_SPIN_BUTTON (viewer->camera_x), min, max); gtk_spin_button_set_increments (GTK_SPIN_BUTTON (viewer->camera_x), 1, 10); gtk_spin_button_set_value (GTK_SPIN_BUTTON (viewer->camera_x), x); arv_camera_get_y_offset_bounds (viewer->camera, &min, &max); gtk_spin_button_set_range (GTK_SPIN_BUTTON (viewer->camera_y), min, max); gtk_spin_button_set_increments (GTK_SPIN_BUTTON (viewer->camera_y), 1, 10); gtk_spin_button_set_value (GTK_SPIN_BUTTON (viewer->camera_y), y); arv_camera_get_width_bounds (viewer->camera, &min, &max); gtk_spin_button_set_range (GTK_SPIN_BUTTON (viewer->camera_width), min, max); gtk_spin_button_set_increments (GTK_SPIN_BUTTON (viewer->camera_width), 1, 10); gtk_spin_button_set_value (GTK_SPIN_BUTTON (viewer->camera_width), width); arv_camera_get_height_bounds (viewer->camera, &min, &max); gtk_spin_button_set_range (GTK_SPIN_BUTTON (viewer->camera_height), min, max); gtk_spin_button_set_increments (GTK_SPIN_BUTTON (viewer->camera_height), 1, 10); gtk_spin_button_set_value (GTK_SPIN_BUTTON (viewer->camera_height), height); g_signal_handler_unblock (viewer->camera_x, viewer->camera_x_changed); g_signal_handler_unblock (viewer->camera_y, viewer->camera_y_changed); g_signal_handler_unblock (viewer->camera_width, viewer->camera_width_changed); g_signal_handler_unblock (viewer->camera_height, viewer->camera_height_changed); g_signal_handler_unblock (viewer->camera_binning_x, viewer->camera_binning_x_changed); g_signal_handler_unblock (viewer->camera_binning_y, viewer->camera_binning_y_changed); } void camera_region_cb (GtkSpinButton *spin_button, ArvViewer *viewer) { int x = gtk_spin_button_get_value (GTK_SPIN_BUTTON (viewer->camera_x)); int y = gtk_spin_button_get_value (GTK_SPIN_BUTTON (viewer->camera_y)); int width = gtk_spin_button_get_value (GTK_SPIN_BUTTON (viewer->camera_width)); int height = gtk_spin_button_get_value (GTK_SPIN_BUTTON (viewer->camera_height)); arv_camera_set_region (viewer->camera, x, y, width, height); update_camera_region (viewer); } void camera_binning_cb (GtkSpinButton *spin_button, ArvViewer *viewer) { int dx = gtk_spin_button_get_value (GTK_SPIN_BUTTON (viewer->camera_binning_x)); int dy = gtk_spin_button_get_value (GTK_SPIN_BUTTON (viewer->camera_binning_y)); arv_camera_set_binning (viewer->camera, dx, dy); update_camera_region (viewer); } void pixel_format_combo_cb (GtkComboBoxText *combo, ArvViewer *viewer) { char *pixel_format; pixel_format = gtk_combo_box_text_get_active_text (combo); arv_camera_set_pixel_format_from_string (viewer->camera, pixel_format); g_free (pixel_format); } void update_device_list_cb (GtkToolButton *button, ArvViewer *viewer) { GtkListStore *list_store; GtkTreeIter iter; unsigned int n_devices; unsigned int i; gtk_widget_set_sensitive (viewer->video_mode_button, FALSE); gtk_widget_set_sensitive (viewer->camera_parameters, FALSE); g_signal_handler_block (gtk_tree_view_get_selection (GTK_TREE_VIEW (viewer->camera_tree)), viewer->camera_selected); list_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (viewer->camera_tree))); gtk_list_store_clear (list_store); arv_update_device_list (); n_devices = arv_get_n_devices (); for (i = 0; i < n_devices; i++) { GString *protocol; protocol = g_string_new (NULL); g_string_append_printf (protocol, "aravis-%s-symbolic", arv_get_device_protocol (i)); g_string_ascii_down (protocol); gtk_list_store_append (list_store, &iter); gtk_list_store_set (list_store, &iter, 0, arv_get_device_id (i), 1, protocol->str, 2, arv_get_device_vendor (i), 3, arv_get_device_model (i), 4, arv_get_device_serial_nbr (i), -1); g_string_free (protocol, TRUE); } g_signal_handler_unblock (gtk_tree_view_get_selection (GTK_TREE_VIEW (viewer->camera_tree)), viewer->camera_selected); } static void remove_widget (GtkWidget *widget, gpointer data) { gtk_container_remove (data, widget); g_object_unref (widget); } static void stop_video (ArvViewer *viewer) { if (GST_IS_PIPELINE (viewer->pipeline)) gst_element_set_state (viewer->pipeline, GST_STATE_NULL); if (ARV_IS_STREAM (viewer->stream)) arv_stream_set_emit_signals (viewer->stream, FALSE); g_clear_object (&viewer->stream); g_clear_object (&viewer->pipeline); viewer->appsrc = NULL; g_clear_object (&viewer->last_buffer); if (ARV_IS_CAMERA (viewer->camera)) arv_camera_stop_acquisition (viewer->camera); gtk_container_foreach (GTK_CONTAINER (viewer->video_frame), remove_widget, viewer->video_frame); } static GstBusSyncReply bus_sync_handler (GstBus *bus, GstMessage *message, gpointer user_data) { ArvViewer *viewer = user_data; if (!gst_is_video_overlay_prepare_window_handle_message(message)) return GST_BUS_PASS; if (viewer->video_window_xid != 0) { GstVideoOverlay *videooverlay; videooverlay = GST_VIDEO_OVERLAY (GST_MESSAGE_SRC (message)); gst_video_overlay_set_window_handle (videooverlay, viewer->video_window_xid); } else { g_warning ("Should have obtained video_window_xid by now!"); } gst_message_unref (message); return GST_BUS_DROP; } static gboolean start_video (ArvViewer *viewer) { GstElement *videoconvert; GstElement *videosink; GstCaps *caps; ArvPixelFormat pixel_format; double frame_rate; double gain_min, gain_max; unsigned payload; unsigned i; gint width, height; char *string; const char *caps_string; gboolean auto_gain, auto_exposure; gboolean is_frame_rate_available; gboolean is_exposure_available; gboolean is_exposure_auto_available; gboolean is_gain_available; gboolean is_gain_auto_available; if (!ARV_IS_CAMERA (viewer->camera)) return FALSE; stop_video (viewer); viewer->rotation = 0; viewer->stream = arv_camera_create_stream (viewer->camera, stream_cb, NULL); if (viewer->stream == NULL) { g_object_unref (viewer->camera); viewer->camera = NULL; return FALSE; } if (ARV_IS_GV_STREAM (viewer->stream)) { if (viewer->auto_socket_buffer) g_object_set (viewer->stream, "socket-buffer", ARV_GV_STREAM_SOCKET_BUFFER_AUTO, "socket-buffer-size", 0, NULL); if (!viewer->packet_resend) g_object_set (viewer->stream, "packet-resend", ARV_GV_STREAM_PACKET_RESEND_NEVER, NULL); g_object_set (viewer->stream, "packet-timeout", (unsigned) viewer->packet_timeout * 1000, "frame-retention", (unsigned) viewer->frame_retention * 1000, NULL); } arv_stream_set_emit_signals (viewer->stream, TRUE); payload = arv_camera_get_payload (viewer->camera); for (i = 0; i < 5; i++) arv_stream_push_buffer (viewer->stream, arv_buffer_new (payload, NULL)); arv_camera_get_region (viewer->camera, NULL, NULL, &width, &height); pixel_format = arv_camera_get_pixel_format (viewer->camera); arv_camera_get_exposure_time_bounds (viewer->camera, &viewer->exposure_min, &viewer->exposure_max); arv_camera_get_gain_bounds (viewer->camera, &gain_min, &gain_max); frame_rate = arv_camera_get_frame_rate (viewer->camera); auto_gain = arv_camera_get_gain_auto (viewer->camera) != ARV_AUTO_OFF; auto_exposure = arv_camera_get_gain_auto (viewer->camera) != ARV_AUTO_OFF; is_frame_rate_available = arv_camera_is_frame_rate_available (viewer->camera); is_exposure_available = arv_camera_is_exposure_time_available (viewer->camera); is_exposure_auto_available = arv_camera_is_exposure_auto_available (viewer->camera); is_gain_available = arv_camera_is_gain_available (viewer->camera); is_gain_auto_available = arv_camera_is_gain_auto_available (viewer->camera); g_signal_handler_block (viewer->gain_hscale, viewer->gain_hscale_changed); g_signal_handler_block (viewer->gain_spin_button, viewer->gain_spin_changed); g_signal_handler_block (viewer->exposure_hscale, viewer->exposure_hscale_changed); g_signal_handler_block (viewer->exposure_spin_button, viewer->exposure_spin_changed); gtk_spin_button_set_range (GTK_SPIN_BUTTON (viewer->exposure_spin_button), viewer->exposure_min, viewer->exposure_max); gtk_spin_button_set_increments (GTK_SPIN_BUTTON (viewer->exposure_spin_button), 200.0, 1000.0); gtk_spin_button_set_range (GTK_SPIN_BUTTON (viewer->gain_spin_button), gain_min, gain_max); gtk_spin_button_set_increments (GTK_SPIN_BUTTON (viewer->gain_spin_button), 1, 10); gtk_range_set_range (GTK_RANGE (viewer->exposure_hscale), 0.0, 1.0); gtk_range_set_range (GTK_RANGE (viewer->gain_hscale), gain_min, gain_max); gtk_widget_set_sensitive (viewer->frame_rate_entry, is_frame_rate_available); string = g_strdup_printf ("%g", frame_rate); gtk_entry_set_text (GTK_ENTRY (viewer->frame_rate_entry), string); g_free (string); gtk_widget_set_sensitive (viewer->gain_hscale, is_gain_available); gtk_widget_set_sensitive (viewer->gain_spin_button, is_gain_available); gtk_widget_set_sensitive (viewer->exposure_hscale, is_exposure_available); gtk_widget_set_sensitive (viewer->exposure_spin_button, is_exposure_available); g_signal_handler_unblock (viewer->gain_hscale, viewer->gain_hscale_changed); g_signal_handler_unblock (viewer->gain_spin_button, viewer->gain_spin_changed); g_signal_handler_unblock (viewer->exposure_hscale, viewer->exposure_hscale_changed); g_signal_handler_unblock (viewer->exposure_spin_button, viewer->exposure_spin_changed); auto_gain = arv_camera_get_gain_auto (viewer->camera) != ARV_AUTO_OFF; auto_exposure = arv_camera_get_exposure_time_auto (viewer->camera) != ARV_AUTO_OFF; update_gain_ui (viewer, auto_gain); update_exposure_ui (viewer, auto_exposure); g_signal_handler_block (viewer->auto_gain_toggle, viewer->auto_gain_clicked); g_signal_handler_block (viewer->auto_exposure_toggle, viewer->auto_exposure_clicked); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (viewer->auto_gain_toggle), auto_gain); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (viewer->auto_exposure_toggle), auto_exposure); gtk_widget_set_sensitive (viewer->auto_gain_toggle, is_gain_auto_available); gtk_widget_set_sensitive (viewer->auto_exposure_toggle, is_exposure_auto_available); g_signal_handler_unblock (viewer->auto_gain_toggle, viewer->auto_gain_clicked); g_signal_handler_unblock (viewer->auto_exposure_toggle, viewer->auto_exposure_clicked); caps_string = arv_pixel_format_to_gst_caps_string (pixel_format); if (caps_string == NULL) { g_message ("GStreamer cannot understand the camera pixel format: 0x%x!\n", (int) pixel_format); stop_video (viewer); return FALSE; } arv_camera_start_acquisition (viewer->camera); viewer->pipeline = gst_pipeline_new ("pipeline"); viewer->appsrc = gst_element_factory_make ("appsrc", NULL); videoconvert = gst_element_factory_make ("videoconvert", NULL); viewer->transform = gst_element_factory_make ("videoflip", NULL); gst_bin_add_many (GST_BIN (viewer->pipeline), viewer->appsrc, videoconvert, viewer->transform, NULL); if (g_str_has_prefix (caps_string, "video/x-bayer")) { GstElement *bayer2rgb; bayer2rgb = gst_element_factory_make ("bayer2rgb", NULL); gst_bin_add (GST_BIN (viewer->pipeline), bayer2rgb); gst_element_link_many (viewer->appsrc, bayer2rgb, videoconvert, viewer->transform, NULL); } else { gst_element_link_many (viewer->appsrc, videoconvert, viewer->transform, NULL); } if (has_gtksink || has_gtkglsink) { GtkWidget *video_widget; #if 0 /* Disable glsink for now, it crashes when we come back to camera list with: (lt-arv-viewer:29151): Gdk-WARNING **: eglMakeCurrent failed (lt-arv-viewer:29151): Gdk-WARNING **: eglMakeCurrent failed (lt-arv-viewer:29151): Gdk-WARNING **: eglMakeCurrent failed Erreur de segmentation (core dumped) */ videosink = gst_element_factory_make ("gtkglsink", NULL); if (GST_IS_ELEMENT (videosink)) { GstElement *glupload; glupload = gst_element_factory_make ("glupload", NULL); gst_bin_add_many (GST_BIN (viewer->pipeline), glupload, videosink, NULL); gst_element_link_many (viewer->transform, glupload, videosink, NULL); } else { #else { #endif videosink = gst_element_factory_make ("gtksink", NULL); gst_bin_add_many (GST_BIN (viewer->pipeline), videosink, NULL); gst_element_link_many (viewer->transform, videosink, NULL); } g_object_get (videosink, "widget", &video_widget, NULL); gtk_container_add (GTK_CONTAINER (viewer->video_frame), video_widget); gtk_widget_show (video_widget); g_object_set(G_OBJECT (video_widget), "force-aspect-ratio", TRUE, NULL); gtk_widget_set_size_request (video_widget, 640, 480); } else { videosink = gst_element_factory_make ("autovideosink", NULL); gst_bin_add (GST_BIN (viewer->pipeline), videosink); gst_element_link_many (viewer->transform, videosink, NULL); } g_object_set(G_OBJECT (videosink), "sync", FALSE, NULL); caps = gst_caps_from_string (caps_string); gst_caps_set_simple (caps, "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, "framerate", GST_TYPE_FRACTION, 0, 1, NULL); gst_app_src_set_caps (GST_APP_SRC (viewer->appsrc), caps); gst_caps_unref (caps); g_object_set(G_OBJECT (viewer->appsrc), "format", GST_FORMAT_TIME, "is-live", TRUE, "do-timestamp", TRUE, NULL); if (!has_gtkglsink && !has_gtksink) { GstBus *bus; bus = gst_pipeline_get_bus (GST_PIPELINE (viewer->pipeline)); gst_bus_set_sync_handler (bus, (GstBusSyncHandler) bus_sync_handler, viewer, NULL); gst_object_unref (bus); } gst_element_set_state (viewer->pipeline, GST_STATE_PLAYING); g_signal_connect (viewer->stream, "new-buffer", G_CALLBACK (new_buffer_cb), viewer); return TRUE; } static gboolean select_camera_list_mode (gpointer user_data) { ArvViewer *viewer = user_data; select_mode (viewer, ARV_VIEWER_MODE_CAMERA_LIST); update_device_list_cb (GTK_TOOL_BUTTON (viewer->refresh_button), viewer); return FALSE; } static void control_lost_cb (ArvCamera *camera, ArvViewer *viewer) { g_main_context_invoke (NULL, select_camera_list_mode, viewer); } static void stop_camera (ArvViewer *viewer) { gtk_widget_set_sensitive (viewer->camera_parameters, FALSE); gtk_widget_set_sensitive (viewer->video_mode_button, FALSE); stop_video (viewer); g_clear_object (&viewer->camera); g_clear_pointer (&viewer->camera_name, g_free); } static gboolean start_camera (ArvViewer *viewer, const char *camera_id) { GtkTreeIter iter; GtkListStore *list_store; gint64 *pixel_formats; const char *pixel_format_string; const char **pixel_format_strings; guint i, n_pixel_formats, n_pixel_format_strings, n_valid_formats; gboolean binning_available; stop_camera (viewer); viewer->camera = arv_camera_new (camera_id); if (!ARV_IS_CAMERA (viewer->camera)) return FALSE; viewer->camera_name = g_strdup (camera_id); gtk_widget_set_sensitive (viewer->camera_parameters, TRUE); arv_camera_set_chunk_mode (viewer->camera, FALSE); update_camera_region (viewer); g_signal_handler_block (viewer->pixel_format_combo, viewer->pixel_format_changed); list_store = GTK_LIST_STORE (gtk_combo_box_get_model (GTK_COMBO_BOX (viewer->pixel_format_combo))); gtk_list_store_clear (list_store); n_valid_formats = 0; pixel_format_strings = arv_camera_get_available_pixel_formats_as_strings (viewer->camera, &n_pixel_format_strings); pixel_formats = arv_camera_get_available_pixel_formats (viewer->camera, &n_pixel_formats); g_assert (n_pixel_formats == n_pixel_format_strings); pixel_format_string = arv_camera_get_pixel_format_as_string (viewer->camera); for (i = 0; i < n_pixel_formats; i++) { if (arv_pixel_format_to_gst_caps_string (pixel_formats[i]) != NULL) { gtk_list_store_append (list_store, &iter); gtk_list_store_set (list_store, &iter, 0, pixel_format_strings[i], -1); if (g_strcmp0 (pixel_format_strings[i], pixel_format_string) == 0) gtk_combo_box_set_active (GTK_COMBO_BOX (viewer->pixel_format_combo), n_valid_formats); n_valid_formats++; } } g_free (pixel_formats); g_free (pixel_format_strings); gtk_widget_set_sensitive (viewer->pixel_format_combo, n_valid_formats > 1); gtk_widget_set_sensitive (viewer->video_mode_button, TRUE); binning_available = arv_camera_is_binning_available (viewer->camera); gtk_widget_set_sensitive (viewer->camera_binning_x, binning_available); gtk_widget_set_sensitive (viewer->camera_binning_y, binning_available); g_signal_handler_unblock (viewer->pixel_format_combo, viewer->pixel_format_changed); g_signal_connect (arv_camera_get_device (viewer->camera), "control-lost", G_CALLBACK (control_lost_cb), viewer); return TRUE; } static void camera_selection_changed_cb (GtkTreeSelection *selection, ArvViewer *viewer) { GtkTreeIter iter; GtkTreeModel *tree_model; char *camera_id = NULL; if (gtk_tree_selection_get_selected (selection, &tree_model, &iter)) { gtk_tree_model_get (tree_model, &iter, 0, &camera_id, -1); start_camera (viewer, camera_id); g_free (camera_id); } else stop_camera (viewer); } static void select_mode (ArvViewer *viewer, ArvViewerMode mode) { gboolean video_visibility; char *subtitle; gint width, height, x, y; if (!ARV_IS_CAMERA (viewer->camera)) mode = ARV_VIEWER_MODE_CAMERA_LIST; switch (mode) { case ARV_VIEWER_MODE_CAMERA_LIST: video_visibility = FALSE; gtk_stack_set_visible_child (GTK_STACK (viewer->main_stack), viewer->camera_box); gtk_header_bar_set_title (GTK_HEADER_BAR (viewer->main_headerbar), "Aravis Viewer"); gtk_header_bar_set_subtitle (GTK_HEADER_BAR (viewer->main_headerbar), NULL); stop_video (viewer); break; case ARV_VIEWER_MODE_VIDEO: video_visibility = TRUE; arv_camera_get_region (viewer->camera, &x, &y, &width, &height); subtitle = g_strdup_printf ("%s %dx%d@%d,%d %s", arv_camera_get_model_name (viewer->camera), width, height, x, y, arv_camera_get_pixel_format_as_string (viewer->camera)); gtk_stack_set_visible_child (GTK_STACK (viewer->main_stack), viewer->video_frame); gtk_header_bar_set_title (GTK_HEADER_BAR (viewer->main_headerbar), viewer->camera_name); gtk_header_bar_set_subtitle (GTK_HEADER_BAR (viewer->main_headerbar), subtitle); g_free (subtitle); start_video (viewer); break; default: g_assert_not_reached (); break; } gtk_widget_set_visible (viewer->back_button, video_visibility); gtk_widget_set_visible (viewer->rotate_cw_button, video_visibility); gtk_widget_set_visible (viewer->flip_vertical_toggle, video_visibility); gtk_widget_set_visible (viewer->flip_horizontal_toggle, video_visibility); gtk_widget_set_visible (viewer->snapshot_button, video_visibility); gtk_widget_set_visible (viewer->acquisition_button, video_visibility); } void switch_to_camera_list_cb (GtkToolButton *button, ArvViewer *viewer) { select_mode (viewer, ARV_VIEWER_MODE_CAMERA_LIST); } void switch_to_video_mode_cb (GtkToolButton *button, ArvViewer *viewer) { select_mode (viewer, ARV_VIEWER_MODE_VIDEO); } void arv_viewer_quit_cb (GtkApplicationWindow *window, ArvViewer *viewer) { g_application_quit (G_APPLICATION (viewer)); } static void video_frame_realize_cb (GtkWidget * widget, ArvViewer *viewer) { #ifdef GDK_WINDOWING_X11 viewer->video_window_xid = GDK_WINDOW_XID (gtk_widget_get_window (widget)); #endif #ifdef GDK_WINDOWING_WIN32 viewer->video_window_xid = (guintptr) GDK_WINDOW_HWND (gtk_widget_get_window (video_window)); #endif } static void activate (GApplication *application) { ArvViewer *viewer = (ArvViewer *) application; GtkBuilder *builder; char *ui_filename; GError *err = NULL; builder = gtk_builder_new (); ui_filename = g_build_filename (ARAVIS_DATA_DIR, "arv-viewer.ui", NULL); if (!gtk_builder_add_from_file (builder, ui_filename, &err)) { g_error ("Cant't load user interface file: %s", err->message); g_error_free (err); } g_free (ui_filename); viewer->main_window = GTK_WIDGET (gtk_builder_get_object (builder, "main_window")); viewer->main_stack = GTK_WIDGET (gtk_builder_get_object (builder, "main_stack")); viewer->main_headerbar = GTK_WIDGET (gtk_builder_get_object (builder, "main_headerbar")); viewer->camera_box = GTK_WIDGET (gtk_builder_get_object (builder, "camera_box")); viewer->refresh_button = GTK_WIDGET (gtk_builder_get_object (builder, "refresh_button")); viewer->video_mode_button = GTK_WIDGET (gtk_builder_get_object (builder, "video_mode_button")); viewer->back_button = GTK_WIDGET (gtk_builder_get_object (builder, "back_button")); viewer->snapshot_button = GTK_WIDGET (gtk_builder_get_object (builder, "snapshot_button")); viewer->camera_tree = GTK_WIDGET (gtk_builder_get_object (builder, "camera_tree")); viewer->camera_parameters = GTK_WIDGET (gtk_builder_get_object (builder, "camera_parameters")); viewer->pixel_format_combo = GTK_WIDGET (gtk_builder_get_object (builder, "pixel_format_combo")); viewer->camera_x = GTK_WIDGET (gtk_builder_get_object (builder, "camera_x")); viewer->camera_y = GTK_WIDGET (gtk_builder_get_object (builder, "camera_y")); viewer->camera_binning_x = GTK_WIDGET (gtk_builder_get_object (builder, "camera_binning_x")); viewer->camera_binning_y = GTK_WIDGET (gtk_builder_get_object (builder, "camera_binning_y")); viewer->camera_width = GTK_WIDGET (gtk_builder_get_object (builder, "camera_width")); viewer->camera_height = GTK_WIDGET (gtk_builder_get_object (builder, "camera_height")); viewer->video_frame = GTK_WIDGET (gtk_builder_get_object (builder, "video_frame")); viewer->trigger_combo_box = GTK_WIDGET (gtk_builder_get_object (builder, "trigger_combobox")); viewer->frame_rate_entry = GTK_WIDGET (gtk_builder_get_object (builder, "frame_rate_entry")); viewer->exposure_spin_button = GTK_WIDGET (gtk_builder_get_object (builder, "exposure_spinbutton")); viewer->gain_spin_button = GTK_WIDGET (gtk_builder_get_object (builder, "gain_spinbutton")); viewer->exposure_hscale = GTK_WIDGET (gtk_builder_get_object (builder, "exposure_hscale")); viewer->gain_hscale = GTK_WIDGET (gtk_builder_get_object (builder, "gain_hscale")); viewer->auto_exposure_toggle = GTK_WIDGET (gtk_builder_get_object (builder, "auto_exposure_togglebutton")); viewer->auto_gain_toggle = GTK_WIDGET (gtk_builder_get_object (builder, "auto_gain_togglebutton")); viewer->rotate_cw_button = GTK_WIDGET (gtk_builder_get_object (builder, "rotate_cw_button")); viewer->flip_vertical_toggle = GTK_WIDGET (gtk_builder_get_object (builder, "flip_vertical_togglebutton")); viewer->flip_horizontal_toggle = GTK_WIDGET (gtk_builder_get_object (builder, "flip_horizontal_togglebutton")); viewer->acquisition_button = GTK_WIDGET (gtk_builder_get_object (builder, "acquisition_button")); g_object_unref (builder); gtk_widget_set_no_show_all (viewer->trigger_combo_box, TRUE); gtk_widget_show_all (viewer->main_window); gtk_application_add_window (GTK_APPLICATION (application), GTK_WINDOW (viewer->main_window)); g_signal_connect (viewer->refresh_button, "clicked", G_CALLBACK (update_device_list_cb), viewer); g_signal_connect (viewer->video_mode_button, "clicked", G_CALLBACK (switch_to_video_mode_cb), viewer); g_signal_connect (viewer->back_button, "clicked", G_CALLBACK (switch_to_camera_list_cb), viewer); g_signal_connect (viewer->main_window, "destroy", G_CALLBACK (arv_viewer_quit_cb), viewer); g_signal_connect (viewer->snapshot_button, "clicked", G_CALLBACK (snapshot_cb), viewer); g_signal_connect (viewer->rotate_cw_button, "clicked", G_CALLBACK (rotate_cw_cb), viewer); g_signal_connect (viewer->flip_horizontal_toggle, "clicked", G_CALLBACK (flip_horizontal_cb), viewer); g_signal_connect (viewer->flip_vertical_toggle, "clicked", G_CALLBACK (flip_vertical_cb), viewer); g_signal_connect (viewer->frame_rate_entry, "activate", G_CALLBACK (frame_rate_entry_cb), viewer); g_signal_connect (viewer->frame_rate_entry, "focus-out-event", G_CALLBACK (frame_rate_entry_focus_cb), viewer); if (!has_gtksink && !has_gtkglsink) { g_signal_connect (viewer->video_frame, "realize", G_CALLBACK (video_frame_realize_cb), viewer); } viewer->camera_selected = g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (viewer->camera_tree)), "changed", G_CALLBACK (camera_selection_changed_cb), viewer); viewer->exposure_spin_changed = g_signal_connect (viewer->exposure_spin_button, "value-changed", G_CALLBACK (exposure_spin_cb), viewer); viewer->gain_spin_changed = g_signal_connect (viewer->gain_spin_button, "value-changed", G_CALLBACK (gain_spin_cb), viewer); viewer->exposure_hscale_changed = g_signal_connect (viewer->exposure_hscale, "value-changed", G_CALLBACK (exposure_scale_cb), viewer); viewer->gain_hscale_changed = g_signal_connect (viewer->gain_hscale, "value-changed", G_CALLBACK (gain_scale_cb), viewer); viewer->auto_exposure_clicked = g_signal_connect (viewer->auto_exposure_toggle, "clicked", G_CALLBACK (auto_exposure_cb), viewer); viewer->auto_gain_clicked = g_signal_connect (viewer->auto_gain_toggle, "clicked", G_CALLBACK (auto_gain_cb), viewer); viewer->pixel_format_changed = g_signal_connect (viewer->pixel_format_combo, "changed", G_CALLBACK (pixel_format_combo_cb), viewer); viewer->camera_x_changed = g_signal_connect (viewer->camera_x, "value-changed", G_CALLBACK (camera_region_cb), viewer); viewer->camera_y_changed = g_signal_connect (viewer->camera_y, "value-changed", G_CALLBACK (camera_region_cb), viewer); viewer->camera_width_changed = g_signal_connect (viewer->camera_width, "value-changed", G_CALLBACK (camera_region_cb), viewer); viewer->camera_height_changed = g_signal_connect (viewer->camera_height, "value-changed", G_CALLBACK (camera_region_cb), viewer); viewer->camera_binning_x_changed = g_signal_connect (viewer->camera_binning_x, "value-changed", G_CALLBACK (camera_binning_cb), viewer); viewer->camera_binning_y_changed = g_signal_connect (viewer->camera_binning_y, "value-changed", G_CALLBACK (camera_binning_cb), viewer); gtk_widget_set_sensitive (viewer->camera_parameters, FALSE); select_mode (viewer, ARV_VIEWER_MODE_CAMERA_LIST); update_device_list_cb (GTK_TOOL_BUTTON (viewer->refresh_button), viewer); } static void startup (GApplication *application) { arv_enable_interface ("Fake"); G_APPLICATION_CLASS (arv_viewer_parent_class)->startup (application); } static void shutdown (GApplication *application) { G_APPLICATION_CLASS (arv_viewer_parent_class)->shutdown (application); arv_shutdown (); } static void finalize (GObject *object) { ArvViewer *viewer = (ArvViewer *) object; G_OBJECT_CLASS (arv_viewer_parent_class)->finalize (object); g_clear_object (&viewer->notification); } ArvViewer * arv_viewer_new (void) { ArvViewer *arv_viewer; if (!gstreamer_plugin_check ()) return NULL; g_set_application_name ("ArvViewer"); arv_viewer = g_object_new (arv_viewer_get_type (), "application-id", "org.aravis.ArvViewer", "flags", G_APPLICATION_NON_UNIQUE, "inactivity-timeout", 30000, NULL); return arv_viewer; } static void arv_viewer_init (ArvViewer *viewer) { viewer->notification = notify_notification_new (NULL, NULL, NULL); viewer->auto_socket_buffer = FALSE; viewer->packet_resend = TRUE; viewer->packet_timeout = 20; viewer->frame_retention = 100; } static void arv_viewer_class_init (ArvViewerClass *class) { GApplicationClass *application_class = G_APPLICATION_CLASS (class); GObjectClass *object_class = G_OBJECT_CLASS (class); object_class->finalize = finalize; application_class->startup = startup; application_class->shutdown = shutdown; application_class->activate = activate; } aravis-ARAVIS_0_6_0/viewer/arvviewer.h000066400000000000000000000007271334570641500177130ustar00rootroot00000000000000#include G_BEGIN_DECLS #define ARV_TYPE_VIEWER (arv_viewer_get_type ()) #define ARV_IS_VIEWER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ARV_TYPE_VIEWER)) GType arv_viewer_get_type (void); ArvViewer * arv_viewer_new (void); void arv_viewer_set_options (ArvViewer *viewer, gboolean auto_socket_buffer, gboolean packet_resend, guint packet_timeout, guint frame_retention); G_END_DECLS aravis-ARAVIS_0_6_0/viewer/arvviewertypes.h000066400000000000000000000020421334570641500207700ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2016 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #ifndef ARV_VIEWER_TYPES_H #define ARV_VIEWER_TYPES_H #include #include G_BEGIN_DECLS typedef struct _ArvViewer ArvViewer; G_END_DECLS #endif aravis-ARAVIS_0_6_0/viewer/data/000077500000000000000000000000001334570641500164335ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/viewer/data/.gitignore000066400000000000000000000000271334570641500204220ustar00rootroot00000000000000*.desktop *.desktop.in aravis-ARAVIS_0_6_0/viewer/data/Makefile.am000066400000000000000000000007351334570641500204740ustar00rootroot00000000000000include $(top_srcdir)/Makefile.decl @APPSTREAM_XML_RULES@ @INTLTOOL_XML_RULE@ appstream_in_files = arv-viewer.appdata.xml.in appstream_XML = $(appstream_in_files:.xml.in=.xml) EXTRA_DIST = $(appstream_in_files) @INTLTOOL_DESKTOP_RULE@ desktopdir = $(datadir)/applications desktop_in_files = arv-viewer.desktop.in desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) dist_noinst_DATA = \ $(desktop_in_files) CLEANFILES = \ $(appstream_XML) \ $(desktop_DATA) aravis-ARAVIS_0_6_0/viewer/data/aravis-video.png000066400000000000000000024277071334570641500215550ustar00rootroot00000000000000PNG  IHDRtbKGD pHYs  tIME 2ye9 IDATxwEv9- iJ HtP^WPl׆ ܋ؽVY@Dz RNyݝ'8$997 w^svvv;;NQvF|_|9Z6L)eRl D FcwـW(`3f|a?{Ocs%%%%%%%%%5Zk̚5cǎCf̘q̩B$̙3cǎ|?OPF^|jٲeӍ1l)))))))))(|Y!)dK`ɬ5k .`s5M0rh֔mm1 0dȐ\HV\)k 1c+V`]DZݬu&N|6FKi_if_IIII~zRhOV.\{EQkf5Jk͸qy֙}}[Ҿ7&eDi|/ٛ[oKWi8Y|:O9}֧8#9bOn߹9k6!o;ڋ}#Iߺ_oכo!Ino@sd護~+fϙ駜YxxN/&MBKƮ‡?AF"r ^{>a ^,ƿϜs=v{vÇ|hsW1nBWR/}IoKW9X0e4͟ϞNGG;:E5K/;C[{s{ӟD~jDz-=-[}c̛?&>,:4 ;VwyF׿? ga;4y ?վ#?0aYڹ+SZVu,p%%:\?ٲhl-|鋟}ϵ]χ?Av{Ӯƻ?c7Ç -/%֚JW裎dc9׈{W2ooE4p "k.~0d`'?7™֫}j+=Fks;;3f0~8VZE[k+Ee+))yR٪/++)i'R)Ŷ) 7IpI'Ï`s\uehy'ֈ7{x)8nA 0h>ſ{3=|?/;E;fRn-|[[[BRRROmQZRRRZ}%s̑GcN;)+B{[ÏmZ3gRcg}&MfA8yg`5ya:<`a{x𡇙6c:O<t_r%F#=5vܑy„vDiI+++y-pi6sݍ7qݍ7q[c0#ߞfs 7ox?mm?a|ӟ}]d dߟ]wޙ<kys2Z_տƬsdߣ=;SN|'t1cXյGl~ae)))׆(-)y@k1Gɡm7]˓O=ͯ~,\G3N; r71fhopmmm|[+$ SNn_+Jf\sZUׯ)Sɾ>q>я‹/_~|gi}_oe(ײ𔔔6DٓvI? ےz׹l~xE0`@I)s4o;(\}yqrq21FϘAG#C]ʞ{neNa ^XÇ5}6mV-_ /.&Yk6t(ɓ䕼4 uZf :|3%%s7>_<|,YZf'|4)"}lk[ ƎЃURzAkLm寷BW4?-Zo^z[T*o7t1F8ڇ{|Vс4[-Yn)ǏWM)]ɹ_9se1η)[;r|Zc-Gg>o P^Y^b{|OS,XG?):::3z9Lҥlv^5`B~\{f`Eǿ|;p{#x' !w٧}Oƻ '2|0vQ.~sŕ?dm3z4/fh9cXb%=ZFmQa\~%hȒ\OG޷/:3f\ClmNEo~{Uk7(+K.K_ȼee/!߸|2}8_,o}w.r٥pa)[5g}ZnƲ~?Kˍn98qqk [_|g~ZbߎgÆq>_-ȫup{<|3gsw/A)'SNeQɰU{e|u җ.`S,8~<&Oܯ\нܯ\yx _zqb̙[Ulr|ט7>G}ux g?i9+ Q^wIQ,]|DUW[#KJJJJJ6wZ}|L>O|lRL6aCr٥l>Q1iCuz7',g7w.NaAkEq[-)Usʁ6(6oslekDis(FyN e߽1G3g\Wx_na:f\~[wv&=,_{9_杧h+h r0v #ߞ+wI9ҽ֨3׵m,^:m:GbQ̞33,^dR٠-@[̛?/_p!/sE}<1F*N9n?7J5GsŕWcz;f SN />y^ĔSafKyzY|3c=N-HE Y"KZt)g}37z+))))yc!uɫum[ktaY5+/W^FŬٳ翸Q#}]x}-S'ĉ\z[}a[,3g7sFl=a3#Z.;s2uL:Ǝo}X1yλk/ yʉKJJJJ'>wտ*}FFOo6=\z5r$?׾u//۫[rrSO:i՛B2v̘sudXy_?UwO(׼cDӟGo#6Zb~s͝;g<<-F.%|곟eb{YKdk俯QwgrC ᠷ@kkZfU?I[iom#&Nd3R9yaj^úu~\v47 Y_㟷lrZZj}i֛},; ZZZ8\6Le$0x`;}IdYưC9C{-?$L!sZj5=`0,;{QhN: 6Oi͝7?p#{p@9sOh"s$Iʐg7SV-_I_{e !ۛve},ȜsyGYڹ_~|Ё wҶ#GЃZk()Twާb5­FϲlIc7ι.^}곟d׼'FoEo^_oˌg|c߹xM{nđ9<,õ3T*k.~<\JSO:c ws=Gvz7[ӎs[8W;z;nc}acy'8(.ESMcڴt;puI.Rq'fir뭼:dpI.]ʵ!)-{aW|5yi}lyr| =Ang&Op!0xmXp!mhҶ,˸ĉMU?͙3̰A$6ıbw3{}!xDbwK]g \zP )AJ$awgN}qo>ś>cM駜RjQFvnp4OaʲYb;4Diΰ~َu'"doJ) Č/?ESk=cO<ɡ[E]ռ4DXnxﱶ+vҔ)a֗<ö_GF{S5{6g~ZRۮMMa|dyk^~e66BWk>{{~N9$:_jp!댓)#Fl /2QRz?_4n兢͞=so"+nm}ĬZdt%8cHӴ^g7a¢EvР4E {IՎbͷ!O>N;=(-AOkk+YmY#{zF^k86th/YBZ]c_a)zM yQN?}nRs}sQ$1gy0gQ 83g$ny.QcdϳxneozAh e}aN|Y-Z!)SxࡇJ;蘆?>o~3mmm=̘1vaeTNEϓVư{yH[Zj\ǾoOi'-|-l7|OO|n|GxjD4Z9lC7Wu1H҄F[؆رn{ Zzx3wu-2ir-vIBXh">{wډ޲/W_{-SMcٌ7n A*"{R?`n[Z<0GaC2o|~QN;$j=Y5d`^\" Xo^~`WΨ#Zk??yӛveN;1gES8{NVq]wȣxx¾ya̜5Ju7lY'@}_9( s&S1nݙ^WF`UW---=Onoڕ_̛7Owg73o|F}0^_J"/z˳Z\Fwa}q}ׂRyqѿ?z8ֲwuy7)ЌC!I-[u7C#o_r<8u4y vܱ[Yg3\ַs2o:mvq] j-5X}ZI[8fΚ3YjJ)F1Gq]wՅF`Р<;i2!n_AKjCoXjUw'x=+Vaۿ]E;J)LӖgNTJJ})S2t뮻`ϝu(npjW5,MSBk\ڹYs ~mE/8E0`@a}-^LKk+ Zoy J5X!h4PZTsd6lӽjKEΜ5&O]#,{|.-9s8'~w5<<7i2<I% HDikꢽy^M뮼B3xޜpqPkc2i&M;5z8=cHzNggg0ۮr׽)k6LV'J_(JJ}=OMs=l7vh*iyfW2F~)?nw}EQ "L|YVXɰCY|9!}n/WZۺ\:mmm57;z-cٲN͟4yvu߯"cے8G$3I'w{%_\""zmڳ#ێ>jܙfA=C[[+J)v.e@ =yw˄xv$&M  t/I-"k~oy ,^{NeX,x~Ll(}cOOii_iVF?P -r:?94"!H{[=:1voN[og{I=7i2vqzc@ߏy}~3/W_Ci]xþ{=@i]y9x10t^)dY8#V 㟷󻫯Z;pWLW<0n?@({ɶN ;HZw+1dI{TprqwsiLցZrZsamAdRJJ6JJ$,nd1csݻ,1ET_*j=Ͷ ͷcAF%Yi es~umE;wIR͛F…3|ei_iߖdKRVy7>>8<&Oa /1~ou;Yβ{ﻟC>uy#K^lʕ+{ZbGŢE/SwE­0nxFEi_ih_IɖRpAzmeh7%M̔ IDATѣdcPOu~/)))))))))\OJJJJJJJJJJQZRRRRRRRRRb_kEi^/sdˊ+PRRRRRRRReE_rc %%%%%%%%%[Ejٰ $he.'ց+HT$h!pP*B06X͊Ш,LU(hX$4SRx k-!Oa4 p1( 1RZb j!hɣF눉Q%xq"ĈQTVؘ(C2*(b/#IE!Ɛ8  "(Dc%UJTP#XR\ST ` iQ!F+qXdXIQiŬ·T҅DhT+&ԣǩr$Q# # !%kpV`WZ+j,~e; Fl̩'DOa%DM (PVhtYLE8E4AELLɕ&M$CM4h4FaU.gPyѐy4wRQZi!<StV\DЁ"X4 )f=$x0ʠIVUE JAPN$%(PNbz$Ɛ Iސ(:wgשw.X\ǿEH*U+~94Wi(PHؠTőJc`j^($"ʣ@Th 4B CFF* >RhB #PMm"2XQEHHȵF 8`I@ *h$ED@TKX#De18Ђ 1HS0@Z-1A)SL5=Se J 1fÕb,@#(QQ!#$()t/h:b (ݬr!Q5"*|ÉjzD慠-vXT Jc5CH\e #¢"$`¦h"Ψ 1#SK 3Bk ,!- &.!d*8 iAEpVQ8'xӊ`1Dk U5ep5M#DjXXrіkK(tFFW RS$ƠL `K@҄f#$V-&-@T]Jj:QHrt%D"IZ2ǴX $:jmEN-(TQG%j&PkP:' iVS<Rt`i9Y@ 5eYZtt5i68hrPbTHppD<:(*BNĩۀ*=&R4EE0+F!u$$#[dƦh jH[B BCJ,UeP@#.|ʦJ)6QY (9ZS 4LA;zMafZQ0S&hpR!fpUTPS$I kadFq ]ZMbU&!BhfQ5ٜB4Kj5T,5GE*&+ZH0J{-i-Z2wORKYi,uI %J{ ć{GhVQʡ5@ )8 "%d[8DX(TDB%s H,@*Y Q%(U` 581 Vh EP"D2DqU@Ã4?W+Ģ'i`Qh 1 B2(i`SO A1KJ@! D6M(RDb.DMo J!Z-@A@pbP*z0.T(SŘ # oDƊ.-'k,6ru}c$ȩ0Dh$dDLZLdXT0A5U= -j"Eh~n3(P45xR KZ  i(fC|u)tlQԼ'o\+LT5g 70FQ. M@Y.^T xMAtEVxBt1a󚦿d㬢#{h3O JD) =Ym:5!6Pƒ Q(Y-!duxQbѪ@B4 &PIxVDV 1!&_hTj~u QJa#H!g"o6EQ" D6?zm:`t$/|W}ӧsȇ(b}ؠ6!d7 W(ʙmtB/^4͗"bٞeB/Fu_JI $pO:gm.kTSS˶ܜ'SV^6@ixلAJD-  Fe)FE41W-&jubB=yS.IC&U;&I:t4Rm:CF`luœd4AwG&[̇!/FI]G!L2}=p?*N :(ݿIyrs;PV CJ>SNZ`d'+߇T7t|҈?U50^/5:WF!ɰ,+8FCʲoKR}EOO%~в3r'&_&ȕ"MO*b+\yK\virjZSͥ0V!;JY'q KRvD" uj(Nʵ1İs}k;ؼ[}W탡;j?r>^hrG>Z6<R>ir,F?~RSGeΉؤ_#׀R)v'@cT1){Ab.̃l BPD"&EAb¦Xmhx啊_ʍmG~m\fJ7:$ ܖ8*96/.S)VG'FGzuXGrOXbun81.6~Eïw}_½mm/Jb|NLyNEoN9Hm;`R٥1^9/n5_1UV;w6J8I0Ks/N}8e/a+ђ1;mAW| =wUpOCޑh׃,-?^aQLge&d.gjhrnKk^z4itׂxٺ&VQ|loI8KA0c4,[I6tM`VȢȧjR G3/AJBPkM*q$M*/} [t)iuSQM UڰU5-7 _鲥-iG)\%B@ +@͸SFY'*F@;O6/q{A b4d.XI.謈$2)dF=yl RqAI% AA4A,0D}a|EJ)e5g곰`+_ɥ̥G=0V&HfXvyeOr @TnFwC'緋7>?/_||'3sfDwf}/+.X bW:`jAf IDAT7A\7Jq]+Uƛs~4q;.N:Np$?&#Ra+l%FU'>Q.*IЧU(k2E zU4qZ^#(qw,偷Wv ̍ K|{!3JNnthGۤJܦozSْJBjŷNzavtv6 B#bb7x d"40Ȓ `xQwR%I(4F֜ya&)2i υEXOvB]Vf&6?߈W}$cE5po\%(8N*+bT>W)C\uAxc2!$4ԖaCqV|$ 4 lYaBX ABw+#O}3SIaN ]V+['悸YWBmHfa(O%y2Ge5c9S+H*P`( ,b):(I|f05J9 #Z]iDIDp` M"7. Y T"V(AYPf0{0O?~ˏ|+׼s>>׃H5`'}o̜L]ә3y2ʔ0Ό@UO~ _ѬW_ :O/__?ӏ)rȖ`>Zx?i,yYBE-)|%*<='5:QxpPAspݕm1_qGqzq_%>Au7'[%9ރeO& Rv >ո}=NB[PvqrzEZ`Jam⶯V:5n-6>"+'aNz]?vC&yO 89^hn9:Ѣ8yImh4K{ޓwىxA6\=Q i6lf#Sh卽tFNE/47jJݦW(!(bEkQ5Wdw"r٩|T 'IJ{Β o\=>V2Pef(W,٭BWM 8)x*=Qۃ%|nlmGjrGtO:ڐ j&|y7N81溠EЀ2VA&#Z!6(xNLrAh!)'Q ^0ɫ p\=)6 &D1QP[롓HA%p2YȪuva m&O+z_ `TUѤ$)Lʣ r j”–KIH2ڥK\0l ˡD%15YCB/U6pƋI0W4&kYp\`a|2 Lf4.-&)aT& lW[g_yT Â=} V:s֛W[+eA\W)g#33d!bm=1UCYj̥~H&F.+,1bJ&PqE{Hm<8%Y~+BVV(Bb?i@ʦ 0:΢pdaZ? t"*cJa.aL3:j:WY`QDV\,/2 p%LEl s &+)"d,EYXEL!H*m2^Gu݌q8% W:[ |Zjٛ!)PHT bkdcǦ j8+`1aL|uC2l$I3Foq2-sp׵~||?||OO+??W姟~d7]s/;FqUdٹy2ԑt^G('5f^Iz{:)>']Fɔ$sܸI>3@wYNH::2B: Z }$}7;[C IB!⒠ ']m:\Ԇl'%Ʀ :U4ΚG6iR3eYʯ* Xn RSWiGrH!2۱}2/F^ * WB(RUz4k`ѦkB<IƚaFw (}K^0_t=yRa+댕s/m{ k 4HPPٰ^I ʬHzn9kį*6FJv\a u_ciO20w2 O?wLT_o\t{e#5N^3%6AZ;LNj5υs[xu%]'hx<*{4.Ql~#1*O6O(ggogZp} 5E .+Mul 05P#oUާ0OZ=JYȼCn> Z>jTox)Գs>*TxUdљity)ʧ:ujS^x}T@NѝQΉcel;[*ߗ :e1m1o? !lʁsR'-W:Ze/Ѹ!rRlakT,*+c $ #8uN3bG]O_Ŭs_PbѱHdOT"a usFw5xDmMXNfŽˁʎaZi'wsiPJRC3HB\lp/$JcUz*"FEz,;YY7OfSK.J}A wNQ67ep.4Y41g)^mXC]$_#.N<.d\)2 2"4b S0sܡ&h 67v[/ p*~542b9E9TX#tٔRW6Yk|Vrbt^"NSbtr)M+*{Hb$|~5OBONn(1_J=D30.mNt^ϕ#ub82K ꅬsQ"\+S 5&RRjsbHaZ05 9pᑅ)`u}ۤ$b1| nbtBBI4 "50 Jʛ•kԑ\qp9lRm 4 YY3ܗ i^ra5GBȀ@F/4f)wE3u1 d.Đ!w9\1cUdd$O|_9w.!}wKÙ'ph½$2/JRnX\#!uSTv"A28?M߄>h-K_Ӎ,wYtv v^ʊ|g~/x|p8m 4a|I; BUZAYh >l "f['kDOj.iPWtkyhAytdW\6m }|7)|܄t.I LO&l. n1&i7n:8P/*hħ6k7f(ʡ~<(auV%#OJse/h1, g!whkӽ0ӉiD+K_, 5kJӥڷxPOبh!RApWAPϜlNPOBDL7R"+k=+7s 1e/DLv["<X I|UV$is2{10Y21=\E׈$aRG DYM3OקȹN2Y`=-ϲh0]ʭcs{+"IY?P\$1B"^p\kB85)ӹ✝wkuR> ||{xVy;1x'yhùV葈>b#ac|'_`Nwd; aI\vN qxM6S/Q.a*9U~l+R R::$_"?G*nW.hSEٮH2c9m-F;xhT%)8%ƒ1kIw!ʊ߽zY3 p[|pD5Y1g[Y6hqujI\F bm䭬#ɬO b+ =3gP/ 9#@}Y.+=&Fzpc\13hsZ7L4*T:hTuuJ0KPgY]|OY>-ɾBuL/b@j\\T _ݲ%Ir^="rsA0B0a2 ^&ӕ@R:ggF³LMW'3`¡*yqjfH 2B߰B*WtK =Xqp]3/MO!4*H$oF'[L5j}Do3tLH#֍d:ĝj1؜&ײ4rP&Sn IL v>9jE*XWżn@3sb@U#ᑉZ#6ږ=v ZSeBu{(2ݺ Qm4px#|0:G)^Z`UE</h4~`$WrT*nwz8*Io3fKcyah=o27 BSeɠKpj6LYpLAo~x_)GT>" ½a ,CLilJ M<[e*r7꒬?p{" t c!2 TzIr9؈ɂ,aG8O{E*؋ /vΈ`qUTRteIDVM~"PkgR ;nrֳQ6l}&)8iZ61 Ҽ4w^0ڽ-@+3,նVmM"kYߤX#*| u^ƙZO_׉;@̼xW{3,gs_W'?qL}vWg>8m'? ito:m'~ah/\PMkNtlres@pE=yZ lygʈwD_iqT!vk.yT1=(v,C@cq^ѷQkՓ/l)5m6IMð벭Iȁnl@7ţ ua{M- kDXː6K0AwB"x߬ Ht%W_ "FU$c+zlxctl?V=(UǃO_4bLG#]c%x h If4 ́vz{X햶 IDAT[pNRa٢2oZd&i6iJ{kOd4y<4hRa9&b-zeb&FiXjeŖdj( p$ ZKޔhFB+؈ 0زMRCg1Lm >XaFf ExfK /uVVȲƈlR@wC[h//Z~TQ!ɔvtpfuz?+M;|еs.)!iU0p Hג&XEHY>Ff?#h("跥xeG4 5AT<ݵ Izz~3b rVXe H8RVqYpF)f?Z׫tlIʁzv.܅#eY'//#2@[a{ B̈́#F{]޲Xbtp Ez /%2::"|"w1H ҄N>hv:N:蓲y "owrWvgBF-Sit>WiZYR$Z^أ| $ɬ*T=hߘ^HC}P"X* M -h}Jʋ{6 wW($x4y"1\F!b.JP h׍*S 2~+`g3$g?k{^_Os^8+&K!Iy[ pbF[8I*-:%(Xe_wܪv[XzrWMS'7\UzEnh ϺT+ bL)7`[ԃ>ĚHh y-a& souoyN:T'2o|E$L; ."nw?K!_u7EN\ SPlߤ}B{0~%h<&l~ǐ_;[z=bH^ o:1k,Ξ'WU2y j\T#v78Γd>d7&=<J+{ aK ZE/.t:Ivx&_EYNvÏw;8a̓H.]$oSCyv F7eb2@JIJ $rpo5a#k3w>!:Zmt;CxčN\d1<;-NrtƀB`% zϿhW!H|Qvj#9 2Y6~8h~<f:9bK7MDxl9`#:V:yo$Ja؄bn#g%U02QIc`;iZMl^#]F13^92#j: 1K"V/jihO_S5 2;L7z=GX(okRyBSW9j t &B'lkmosœI[j>Dȑ=o4,T識!5-z _!ꨝha~̘ |J"fۓ}ϴЛΪ֜bYRȬi<u'@V Ogk02+w.F V_T8*<|<أ~ș,~mYrru8&tm~ulHEt#K jֳܻn.qTĪ`IT)b / ZD^[@}HnB~lŞ ɣ YG՝Қo0_O^wd_{5Ad MDu|yEMR KM^Y#gTôN3j'b-gm|$onSX@)˞xTMLYHqj?hAP eSWC"XDo5q IoЊe1=S;ĪiuYʷ?? %;߰8lI?0%`ިÌ/&BFڃ=xuQG$v0-vU;y}`3xc>d2i N{bLd9>p`ri{0;~ ˅ z a h̗ TDo}p=OJo<( ;h@)]CMk mB$?7†6*Ҏ'3bϸ[lh'7,~zbDO!`KjN2vn%i9l}i l  ? 1bTNon^C#_DBC@[PV3@ ҝC;cu\Hk}ߤucy1SU9Qyv.}O gOj r #]L&R6رq)t"'p{6GB5`)XZ2QFƜ7.ki>@T#6`^&DwY⥆"*8DpSYQ K~++iQT 5Չ[Sh 6gOnuV::{:L !QEL,X(q#\YZ5t7'"olM 8$X"t( UJx[.?Uh@e,(0|"<0cwxj3nhipRkB'yrEgYeꕮU y;&F }>q(t<~z8cweǤ!a{bd8G.Z7>KӚʫ\l(Ep椔3#ɠ6(~h–ƃUy*\DN>iQQ9k L Yel]9՟Nz3btUlcFe~i4nQ̍+bՔZ@8qo!DLC;TʃvLTN"+w\DivFE4 ە U$(auƶ ʼ ;Ɩ G`ϋ}Wbϫֶgq{%qz!Y]kz#%wJJP[6ĒUdr&󶹒ٙUXZU`fIaa璵-3Dgj%Mi5ݱ{ŤzY1 Z7 ŷW'O/N36Dp9oj;UIdl #..#8'. W;CN o|/5 䕛X>qLiѳ,=hč/sӺx/V^uXt2K`pQOiȪp>'HcЖ|#>F8 EszIe]8oIgʅMvdtZ %j8ЗnmfTd{#&WD(B~ c+X~g$z籃X^ }98WovH`_|36/PoWh4Sk"rx Z6n]ͪa|_x䜤5p!ِx0=*l ^~/D^Z5o [V27g0l3_YGlRjx+W[2VZbD6({:(!l 05 q;g4jR,ֳք-Ÿ-/!u ue&dX[wv4*cfeἶ\< .)d2CNTh&d\h  [&%m~?rlU yOEeqwYAlGЬ8p4'U90JҸ| ^uQ[yFS pgipΉI I]Uk`FWE*  ØYX ņDB*ԺYMzWH崭4DQ[['!Y;#" ]>x}pI싈ŎU2]Ĭ jPQح"REO[ ?g ԴH]rO볒z_> D . $>'q{-JBVJJEWu /TBG_EMY7o/e5jQ||ί|oj6NZG$'q1 =zx UHK!䜸$ T!^U#X2g1wřcM|=AxO>Y"U ޅޜCxC  $>j;fm>ϒvF@cU |'_Aۊ>=k󬭋vDO3Xba*O%0Ƣ|/x^p(foUtG"< K'V?iY\/191],xC.G\~V#-y#L#I? 5]FDdQU6Os:UrrL!2xu(Q%Nt#>&w.IFRfM0c c  *Wİ휭쾀-b;5uYq845+֫`$ [Hp7EN] fi,@(os8-k:ɲmrQ6HvUhJ-V!TxL>H6DgDhY.BE$7jd"$S14jjRX!A-2 Q~ R(+TH -wkP }=]k{.E)PoMyeK^,ƐJԓG&Q%1tLj:[ddtUx-Q Y9'JxM^U2~0vq2 SǛؒ`KJjP$y77 ol%m: T0J!Ge3$9uM.\N؁k}(WLDT;WÐ]㸥=Z%$z%%P$݄#{_9&fQ Uvje[};*ʱw! s3xYǺx~GEe݌[ue4M$TKp~OhW\Z}h$JyV³:. 70۪T=&r˖jz.\-"jaQj&<.w]bK%UҎIeP+Q5zu`(Y# iV .(eMY۪wj+Q\H|s}=/:nLyu{V89}/d| L'ghe}Tz`tؖ>C=:'iL\uddA]S^QV*e9r}u9rUcY#y*ZEkOёɕKRR ɜeɗL ppu8Ѝ0T;<^e J :㖐Ǔ2&X $:S/>Ч]/ XUDeGr+YGbJ\*Òc"gB~1=6rݘ?0)ǬTc5c0bl02IX@t@*W$gÜwai5޸VQDNO4vT$u> 1ru&+~KN” qQ\v2Imĥ ]+wx֧$g6~{Y 2Ilv%z.Jo` 5,{&$UR-Ž LYoꍷ,q;#jZΤ?`Yq/ C TC n"S)2TK7Nz9UāZUtWb?&7L+}4FE2]8V/?*JM[?DxOժ .ɗ4/Ng3‡?M1IHnj1s&Z/s9AR=}k' ](teq99qUWjg_to;Je;}W *.L;:#L1C̡ B͆eygݾ8seb߁8 ٘Sӥq.2HE(bvrօsU 5zxvY}"z)%P!PF֔ةs*e&If` %3WKEiZ]CRgb,r컀٭)Jm4^?w< :⛔/Ylg9\>?j7!D܅$Sĥ}S`# IDAT=NMV.]UqFLj4ZjP(nn3Խ8h7BLPs*iv+U>d"zhۦ"@Yd׏S' zOlϋ6![I0N2.9n\|y Wkd"NWp6A쓾2P*aʡ}{_Ќߡ=G?(lGPL=v1;E% ,f0v1hthrs(he(TѢn*8v%ߏZ! - {cgp EC8q[iF_bUVa!Q]gntSػ.F( U]LL>m~*&iC81)4ZzFUʋe~6nL=cl^!GөfB3 - 4-YiպX(U!yylwު i -ϧVk&[af?Y^Q3Ƃ!wݪ<8[Nh3_p~HZ= %E+gw5vK<בQXPt{gMk2҂-2*(ip%6k%Bt۴!iљV eeb`Z=$p4ŗL(wumi}^Ю0r~}4any`޸CxZ[۷3x+3eOǵQC(T {(k٪dr#I+@y8w^uQ\+aQQV _YMٯKV2^gWiIF :RLL/S"M4*=Z/9^:D]*dK1%mcyX8A'u^ :[+܀x Xw+P XC &b Ғf5i86jC5ZQsR qخ\:REЌ(ޫyjC.&qtPqx+i[쮍fk#YߖaMv" ~y\GQ.~gا;'joVfbZh/iz}ҵ<%ᨃZgoD tu5^FlV朐띭Fۜ0̪PlaiJeǛ*#+S5YCouz3b\M'zJۏ[ W~\_馬(ɷ < ~*IJ-.4QD3_gO~%QL "'PthZeZlZZ|X(Oqh:K*Qvo͹K#]& 1p-MTD~7!x| :?״NzbMn\Nn>rU[:ejga4͎GӚN4qM,T;"KxcgӃbVӅpMhYӜLݭ*LRUj=Tw$J0&C2x38 pcF0q|܍teZ7 TgvLMOI O/dj}.=\ƎFf܋_/Z83k滌Db,S6Fw-mwȤEұq0rP۞F? ׺t8֊P곦bRM= `\D z* 456F[ T)2UR9'}ס1E/cQ޲ ԅUŕۓTZh> S/VkfOk /1# ;wތnx/ 7w_SU1F/^\͊A~Q[S2V@HI>d]/>[^~#d_˜3x=JN(]|n4|_m^MXUp`-˧&Z"zf)h[\YGFӛsHlb+ȏKMɳّU'޿\Jfc} `;2! j # b^OLLƥo_,}p_C_x{`q-_A{Z_Vm'XnHsk9/'J>DW>@G0{cGT5իeΟ,0tuc"ƶa_<+a٠ ϧn&Y &g|oTGz¢| V"%ݽ};Zо|<ʗWw*=KC S+$e)Dd¢n; -ʙ`āSua10KMw t0rnR6F hI36 Gٱ\reONR*}*BpjvakWIUڄvZKwg2ڒ* X #yLZd fm g) }SlDK9-g7ԥQzL,Ze^8#U@mzv7B~$ېG?e :Pkh`(hN&WBm{y[R>ҬY0{ ªm].h]F1,|yokcbDֳiJ̎/AΆwr8EzֺrV{R*Grh.EOr0Vtdž(L T Y$A)L"=S:s$zAfY;ajpK"/NHFPJV Yf}'ͳwy)[i}ꑴ6-O1 yC*PjW*%xo#ZaETfy`oLLnd3lHs[4jJQʖWV;sKB)ۉ2!L*.MlR˟>j=[cӨ!|rE3It#%H.T?/ihO*!&cWjVzbfә޸E~ rwR7 }?t ='b.+Ʉv.Z .ׇn'xPn"oJ1mlSҿ@އu9)ytH+βxR3uaɑyןK FoV5e@~nL<+i ÈNo ;>ٯɇ o۱l?`s'jOWm)p.(>F_.,qJr$n8N6eE'?N<`| 1̇+6A΅H[|Ŀ??;cap󒆘T+Z *@/~y+#Y]p\z^kь5A*6*٠=oId1&ll^tb CATLtR7URRKB![׭y1J LE/otOx'.iLjQsIn$]ܺhbhjT+lVu,m}QP7Cj,ʓ`NkK2ҞF]yy2\6A3ުw>[eŠVb:|5BNѤAV#G*JR5 5妧: JlD d"z̟[d8ȕ=yZT &R*XERȖZgVh /(6RW1ŲY)s度 bU'G0{G5_U,JuN:$CZKlu!=NJ2@6%#Uޢ}TD;Cе8A*m^8GLvΥi?4g)*RIm2-)h=Îz/Vg;)~hg9v_Du8J[KzWΐ'jA{<6O^poa˗d)EV'{#yL _$yl Yc >T) 4U)P(J#Z8 z BT~AFTJUW-vEc5/'+U^wQ=i%өl` ^E3% ' .@;ڡ]4jW[X|` SaxjOlp=ߤcc*'?6S>q%Vʋ߈u|b ?qLN #V "\]{a[ӓY4E>/󵝑ZG }UC:XWgbmʋ`ⷱR5]OK['Vm{RnMesJÓ7'ad^?_lYx7/O2{AP<ڨ$ {WH&az)2lU:A&͓ AFX$[Uެt '&re)MꦮvJad3n^ZGQՐ;SpUZ8-itP+Zަ0ao!^FUx,qV_*p"Qs] Y}IC,z0S6sZA,c<^Q-wNAO+Ʌ&ɍ2N ceќ؟C@*ܐRΗ i1o'uVKR18U A£ٻhdğ ZT;Ywnjv7>a~ANK^mUb@bq/x7pӉ|8b6v,JcVz ms?#1^ ʈ~ &1 hT;0R MFi,[VLHѭvh$gk <3&W8FQ)4?L 9Q#.R8g\֩(QbҎ@XJ\J5МHI0(UҒ7^߻ e7/-dM|oIiJF&Ik|(ov:OW,mpZԏuNʠ*Hz/_ҿkð}@}2~A{S7w/Ҭ>>8Q "c\WC3Ya}7BAgOVՁHc |ˮ~:çSjQ>jHIbJݚXٍlA͢E=N< .@V0ZYVmXV޻뉎 m6V.SW kCE6~s*7lTcJ/n3OcZE{ xZEⲍ<;鲘?7l#hL/Đ+w;INӲ-YUK.rn|kwypI8-7N+EF$Z7yL8e+*Bj; !bayڏM"%6nSUM"t{Q!N oZ]KTaQITB'k4FbAK,ďJ'脔 D4ɾ#LbOxq7xuZ f.s]OGu88bV*_<֐(?~d+xi5K\آGMD K'H P QEv&ևB v*Pʷ,qpkV83v) <;ے\U]{1]Ejء>"h)L;U2cWFO%vZX”M~~ޛ׿`d %ó|˛ .Q9F)q*CpmU=+^rCn~y$X{2^вióɾ Ÿ^7*DZ^u+ik^ϮHzH]hX;Ĭ4e/w?t~6Ȫ@F$}Řx]updƶJǚuhGae$|5ȱ+UV zl֑/Ǚx|׻ڊ:1u"f'7&Z.n#vs.O,5.м1ao|ɸgj1CG@7@s0m̋+h{꟏v!p.GXWOQ.ĄpF^>T4b%7M.۠CF@ƳOI4^ntms!<zz#z`\#>!Ԇj ^zT'}nbW6-zv!.N%+ =()g(_"KvT EF#xU$ː8X4W8٩,|S,Cz3L$y+Qګ o$%g-ȐXYU_9H/0bG54)B*u :-J1L]u %$inL–r^R7+ xI l:=`Q]h IDATp9Sq-gև5YkDnSڙpRyvUFNaVG[&6$ڴUmY&cirMͧ n6y]mNl^UFeMSA'S!^1 3]:Vмt:d]Hn#wsī`*n/% XTmև1jl8JMb'Y/KOġu]g` 5<Ze?}BzYgRHWسՅ~Z ,UX"xT3^͏`,`\4+o%%zVRӐ*W/P%PZLjb={}I ~! VJg1|;LQ/R]֍G+fch- /#0 y^g01nu"+hZ쒦];vOb2 iF۵WL7 {n&̱pL`_Vm-2r-u8ؕ.1Z檔CӫIK {ST=ʕ)>jT7Vgݤ'P;p ^)4@Ex">BBVO?ڄ"1 %l&8jPiWz{ !e«U+Ԃ54IW;$HxjJ vӍ /`RpKG߼8tZ G6DtQ%3l*@h jɶ,$Cᴽx0ڬfe5oJS#d4]*"?|WN~f)bC ] p6?|5n232t]Q@o^qTxC49U5hȽ"(CJ@V7ڪT{-}h!xi´R!AmXˆFUn9d]ZJm)z,vigM1  , 9gRYH-15yOaĪ(˗ρX@X:_r:ˤاGݩ('\hu*\e8eR(k@Te{Zp$(Jf]$r.]dF!DM :"z*)[_w&KHO%hǯN,5XTTXNF#k[ANnUnx~W1Q?mV!߉^>nV-٠أ\q2s3yDG,ɚ{Z'Y Γϝ|d}6ڪ϶m3[v6ʎJns2oѿ­oZ88[o^̅na StuuQ^Y &S[b-=.:;K1͜ 5+ʬ/5o":j«9;:ĞH4;ݪ!Cp!3ylgVOn"sre2iAZf -:OiZmKozaNş7{5=YFhpE1g*:]Z Q>NҳV>V~PRi͔b5)vb IoƲJd@1#\Zm.pfIJk[ԭ5%F )LRJV*`" R|(#w jXv5i)7k+96?,0G-mT ID5q[~@&c Mj [ʬ] ޸Rx|d%dBڹ#|­GBQ[kF@4Hg>x y $"#iVU|&=؉kś*ʎf4f-Rk @Ahgg,Ų9H+k^;T%gsp:׬k5rYSe=%&ek+N❖&=, =^_Vt-NSS) wMfS 84Oa׆]5&T;`VƮ*HUhWiQkC K_KYEJUuZW/~UUiwe .Ql`rj[Ԩ!RAD_\Q=vHQPs ֚`"iUm)KjTL dONt*XUi JlURRڨ NfʬsSY& VS;궝-~|Ć5xK9boV #n;Xu%{E͠Mdҳ+bs#x[D6xc6H,&S^lK|N/<ۿ;.[Ml bU=Y:ޣ感Z |mO^6jx-ilo6ZJ`CO cuaWJ1blqv4G1 ͝tH*s+U=bѼΩCsnL Mv4Yg |iIHIU- jP$Jj"VHVg̤[2vmuF+SHW̕+lTW7.tC|p z8]u3Z_ b~%'˳%՞?l DFa]~li\Zk)M:Ÿ?qk'UVT|jt7 ^R =o{c,RJ^$*R.6|c]+]+R5`xefƥEVmܣE󲔾 KAdsdxCKGuQOlp+r$SU @* R YaΩD%͋JnF,Nc(\ V59jH)RպZ/w˖5"d]sR@:T&)(KŰtBSέZ2LDf(O 0R ̆W/OWEVň ɒzV ]7Nƿ`~3YdxQDRuRAFy/IYpIQւ X'k?(2Nkq&r E{=GLJ/> J"J!4f&i,t]:%XӲ>$R@A<|T%酷 sɳ)[h_14饊dYV d='rj/.MAG N>剃B:S9`7or:oxlfU/H4ŤߐnwgVۮ?|XZᙬ$.tk}oܻBK]t5WtzEzYsc.;- 6rx! Q\؄OA%ʻ/V5ș">6 a+ fI!ǪBs4\02֣[K: ]% |UXR #+;K0A3<ޛ?U#^%vO?{ MG'V!hRL2?y: ?# [o>U`Sw%&µs!ÞaF,oI`Y@~ЁG咇pFdѤM'ijIUfmbQLhVw+LPsp+8n|,2TkA@Io,Ca$JՉwUIuPWdKa[b4OeD$SK-+Y&^RNW&_P'j8pfKȁ:|}m`p4>4Ԫ/*Xk+ɟVo'MӺ*ciH(읝 ^2:Jmŏd3{WFO ] mB%'#۔XMxf4c:'Exe0l:[sUh${?‡?vH-wVy+2'vJ>e'֯2gz~|6cc.;iQiEM1*W֢oe6VңOӐq*rS+4D(ۂ14 vMW3EH#[+9d"jgX"R sp{(*z)`,(2J]mכ _=ӡ%=%Y< όZUf +y|ZPbgPp(^,R*8CRA9eG ʑb;5UjSr[$w_&GNR-ӳٵ)fljh{860N.sLuSIz~YK ֐'ӳ×9y, , ӿyO o!M<`Y3u:C(nl44.ȟyuQ^ַ0 Y]Un->1킵d* 7@"Ƚ'ƶIAxYYUzlaSE8I@mHG]x?dmgp0=h1[0S佱ͅ#q ~^խJ B+p8D &zo4[y6/-­l7*RzKov0gfqw1yÄyλ|)ܸ^u1Po]{uUkFl k+O7RU4WM+˿^p~mŌM \Z9eZ 'tIqO/XnRm҆bV91*<;/[n* |!ZM]؛QsJn§|%*ܰ;6TQ N1+~;iJ5H)7^+Ҫa+] IBXqe!tJ} l>iz_P'GmZVBxc0qWrԐb-X}?;1FˤT>E%} h>$ ՍTgfiv55Z1IG9jp&jUEU WFXf(l_,fIJnq<ո^j{>|׏,h'`b0&rjɅjQ3'O?KX)OK)D[Ņ0'J-гЬy{%Y#933̪ %\N\wH oSnu\@S?j~|Rڿ9k}siPRA ';NL:BT-j?Ry#Y{ݮ-&R/]*(ݗݲa]Un[Mur-bC%}օrYa0eUJj`Ұsg۟.ۂYwfP]hXV6k\ _0q$Vaȃϛqu.m3y'+y ƭwޜv\d=82YkMӑpEjp".-9Bcv T|Ms+vp_p!;ߣ@ 9h[9xRDw2\ _8''s#r9+ s eI;_b4f/'s]r#RȷE-rVc?A}qO"Q}lUy޾C] Y/ȓM$.9?&.m |{, 1V.4i?) =α]7>i<̩s?7VXZٱvvbq-T(* !6D{ cW[%Oښ-V~ɃdN~_K6-8n RF\+^(u2%os('tjj*ia,t:NѼl2K@yq^u=U쓫ӵ66›tN$ =RCz{܌e <rpab>V56:fY/mi aA~ﵭ:Ku˷u(eJΖ\(htzVFWjҺ:S! GMN4>xU#[΁‘Upvo]Z i3EngA_8m2zvrxgՀAm9ri5:խzSslBle^jY0iK*usTKLң z+,n!8nδFAʭ%#nE$ug1*)<~m|˾/ /3ߜߡ"X{`[.UgFI*Xv K>J+A!%z"T_~#f7sjCBE4|{ӊ5wul'&T"+Y7s~_~WubQDTjՙiDՙ`]=[R"? l]֖k3 |GLKKU*@os+tVD [& kޔCCq]amraPȺ5V5Z*e_fbhP1h]nͬ^릦XF?2Bv9G-D;|8\y38={q q'̥;Ǽa9'g,f~_yݺoTbzq(zB=fCX 溹nFpDm $?=;Z B"'UGlD̜QK6fq_BuJkݬ _Icն%pZO<6vktm`Wog7.vj%4y9I)1&_6VjRp\i IG?%0f&q(;8nwdz0#FӿWjj "$XIO*f'VFтuofhQ&D~(o'_:?oq8Ӿh~0lK̺4wc=eSox#Zq͊E\/x;~o7ne IDATa,99yx,12l5uC\}éc)Jhɽtsf9ޭ/mm;+FN4川x8\× ?Z!C,EJ:VS֖ Ʊ++9lqz }Lz4U4;.m1#lFfq/eý܎Mf6XC\xׄv™r"zu[\NdlhK忔7ibC4ju4_XTy.DaVt+fkZ4o?Ԏ=gMk-]-S[9Q\E?=})tն7ϗ^$|B+ g @wl)U٤3Rf1YCUk1PBL/}L?h3ŏ̯ɝ!^xAcky!bMgOZXm#qj%rٮf0MUgŤ؛n=xsQ"g1+.ĄaթZ&x2R1oκ "MzI=!"! kKJjؽ)ոSL] Nh kwrO5UcM.FmB_m8a+gΠd!{lLOu٠&kL>8 ,w!y'l0}*t:_xy|t Y c8)H [d|b,<߰/\2`.as?v[zG] (˿;(kRj{^)[Kz?˵'T !fȲtRMc7p7aTH=tm?Y>VVD5)8 VvOGe@]qa9Y?ϻ>VaP^}oaA(ꁫH?MȾ߫_)s^_Rl@L-mw 2T򰚪j^0g SAatI> +Nm⼂420>˜Ieo,C+P;[HuۖlM6XeNjD };U匋2[y*HJq.Tb/? :x3N}QE >&q/_ffIcu 5n%ËG.%hpDט8<~;Z4roPG2gօ[\dcsR1KBAsrX|~~˾ϕTt5lqS?j}Pǿdγ9ޜi]}xe9xs]҄W+F-MXzs{(>}q"յGrR*e Z{%a|~5iی?2ɜ<=I[>tu޿s|M,jWrLgԍ7oƟ8LMNV| 3i\(uӣ#tC_R3 5|2y:^S BUfmHkjw NjӔT0OoJ"8EcUqjU8դo3o=95"\}qe#xlz˓Ɖ"|Xc{ >Kcs:Ϛ~`/` xԊÝgJ [`BYR+Oz9_mї\Q q0y~uɬvSjT /XZLjiRg6A+ZM#G'"L(lG %S)5F6jT ~*j}I%~؞n&ML5"u*bjɩv JfE\ Zw hq,) IJvU{~h0z[ KQTq f$H_^b2:Azx|$7X6i67OyXknXRpl'V- !5F3{ZUbpl(WԿQO6w5`EθV`R#l[z4C(/3N ?T@K} ۏMh!C{Di 0mJ In˜a݃ wMFI2/=}SwV UMU5$mP(mǭ~ִNTHaurd?c5'~}{hwՌn/9`uٷ0Uj{hu`Ay'l2f1Ӓx@Qs[pa{+jJ [hE,ofhEÖ6I͹-ds?8X>=p7iV-tJAw:uLlsv]Hos@Nǩ[ْtg%-&Gi9cTGm'}S?s5U ͋? }9.5/Vr cnuh`h5ݠvj'ȔP0t*-ݍwJEI7Qw9]2J [k)$Q޳nÃG5b WdKb2Tȏ֐ol,sWOۓ#ҺZBx84gӌ;+;l+`V2 ;nڎ FJu(eEF ^? ŗgF'zQ& q;}c9xBE 9?M/J#S'Ӭ8i:}&bOt1ull$?#s =-ةܠ̕gcݥ4}dXGuj_SδAxGWͩTT1͈-,+ͱ\7y^s_$rh[^ Ad 8]PK#VN=Xe *mޅ5&j̢WE LuB*J4P^/QwnKr}YM*Ě~[q<'syߋbn,Q V򺆲!PkWTmn nv H5 v2 &wLGy7wcpV]-m(Yr7A*LuFrMh ߬LVQT}FImvؐzy#u#\j xk,SN-~"$֞D"[c~ZZ/lk-"l49Xpk&y( mq3S%BG<]u^Svb fgDz.Ә%=hfuk3~74jnb+XFGĭlkÈ:?:nq\Ekigͻ.Hl#=ARr8fs]?+:}]<a"˯m v֙ Zq*XOZZGGG1hR|V!/.Wtly{01E"Z2-nVX[ő?iR Sݻ}NJ^#pw=W~ |a?<?&QM(MoSu}xW}҇)\n}0JȦ/&>N*+ڛ5a"VR.5 f@IkJW59dWZ6:S> r+6%p%CkzX4f nRlo /W?no\ZXwoX@.@ȐZMYȷk42žXo:u&Aul65ܜFW掟< &T̻6`7fOݜ8IY13kpͬ/Lc2փx_Zaj?,%|c0^^o4r-UUpn岙|}VcsN1MoM7Zki  lhV.Mp-3c>i̍5 6 T%ߗH{pSJ2z>sN[3jA ÊH-/.97 Ɓ8G (lb¡\.epْIbÅ`nJO[o}`̮u½s$iʹF[jqJA}9\ԮXt9yLݶ.Nh*})Tn/;};Ųnl:w%}hF >pPŌFSx'?ĉOhl0ɊFżNI>Lc~6ZL{%)R'ol+Bqn|QohEX29ҹ*G .ⲹAF$fa Ӎcm%^,ߪgn!W`;#e/Ew/z1X^i&d؜if߫g#s7ؼPE.U,&TlVꨲho59n%vԼLV*/l9fEma›֩z7Zm ֨RАJ#T6mtoT-Bg\%,jtN-`}_޳Po+Kk~Ĭ.#[jYm(x*U/In\N_hD+uY~F{థ;,6g;Eɳ;]sI{z%\Ĵt w .hg +%;Tat X͓Trܡ:XS 8 7Ua IDATw cw7fHp_1+{&p0EX) ۮ}{fZ{҉X Mvs@"S&Lt+0h{_njѩX5Kݴ蒷 u٢jׁSM:5> aB%i+~/ 1i@g-uK[UXW\4҅sSn T2}@M2"MЦ-VR-t+͙ܲuiJ~<|QYaSd's7ٻ1 ٶxDjT[Jq]*oF`I[̻d{Зc|0H,Ruҫ{*'݌z7qRS_~b=~F k;f/Vu2Oso\*2e4DpM'~ܬ5i#NvZvx dVϛRxH4Yg7moS" \`'7{l\8W٩Gq"oc `$QF\E#)c^UOjqsN[)^=Y ">'Jw%:/Fkka|N ^5ƗVGGMy=ru7\^\`0y4kчLr:&mUa 6zܼMp喙Aq= vҳ]QsiT7*6Z)SPKƏ ̯c\\d&B^_=o|\FC|\~Jm%tUSR.ɦD(*-~4gҺ 1FAUj\ZjXNEu.;}wQ<]yORb06o^koԸdƶćPS~m"'ms1 CofجX3V"36.80*؍jmQPm, UxE vq&'nZ!'-̹8q\4j Ye|rG7ݷJ)ltY`ɓE"ݠ mM<;v+R#y%~^\eRqYQԌԥV#"ikda1WZ}9,9!Yl5f@lߤ{H3cMdfeWEf2*-'zusi;Rwg7cJ̀hV)BeS80>}Rhlmi g%@j|FXLis#R'1KN^`]m=UpHX.<-0!|.S憲YJJCxT &+}͑ZBa4JuhKa" ;O$bjlf2z3=i;)W&/jնo,B>Jf[ǽ WJ6}(o@խ;.MظAlp2эqzYbIY#2!U559|er&gaH)|GϵxX1S*֬dјLo&7 w6S 4YO\tLZy2%wRdZbmmZ 0Jv7 )5jƹm+ dV|YZ;Lr*[R6އm_wo8,~w{[izNqm:u)rײ&VZe7R@Vf?q0n-G9/TPT`p@pgœs^$")w&k~54r+b6kdKփ1eq WXƔM";ykj;peuIUWL g)R p¿‚˘WZr"Hlo]'#.˸{+*uhcC{Ƙjڐ{ %4uuoGUܮ',KXEmK?.|5n+}m[,AˊJ})mH gˬUۗf_EFINt>tTEd_im'&>Z7t};:uO8yOz]Zj:MZzJ<*qP][7%=?$L9y?6'8xg3֏I }& wƕP1Ĕ GՃ`ރsg2Ϡ >G#C3R7 );.Tll;F0Ff1xP7Oc#ܛw?T\ƈ p|9 .6MͿaRHFl]Yq*mFp,Ehepj2z/K= +=tfX7:-/x4-mFhYX7:i]8Uo6EyQLuu O( %ĭsw4 Cؚ1+w8I4Dž$d`h+E%r+.W+ZwMKb%OȢ{Sh ncskkZiztx* Ҵ:)]6e5D<Jwnc,#o]W[|,#:Wױ}/=ÝR/]tV<]gv):va^.SXf8MqOۤhrr5){*"F'*#*cBNɛR H9;oj>CQ^+%mL7&MjqhU^:πVږ/ tB,y-py+˜Q8(lݝ^8.F Pi\ G3خ .72YUĜGrׁϢ~/܊ۙ]HaC֙FE 7[Iw zXlOB벍(G׼1sˌ̭zl6ȄYlsnr5 l}z){]4/ ^;;\0?~"ƚ{(KȲI3] 7$mBVy{=L*pim:ݿfMrhРw˥`%}/0|2oEziyX4Mp}}]U`@Ox'SJǫ"4H:-g&(T -- ]^q\&}9g̚+F0?Zo]_IWJ]jdSS?Y嵭z .:IEx`5r<|Re ~hߡFqe/Vta rІ <Tx/aRl˜.q-9q=Nی؏:x.%J[Tc.jĚ􁷠GpM벼]I c'ug=yIqYs-[MjGՄ4y_X35'¼Ać0ӚOGp82-OUN5ԃT#Ǎ{h$FlT3f5\Y:^|I_~;&@,B]uW-au3VS/ "GZ[dr9,f _V|L3t3jm4<ؖ0"bnŝ&W-yyq%[lX4g{Bݲ6!"Ixs({G7ޢVɉwdo9_Z}{2{|{gzMh=)#̌]%zlޥ.h%ujD։D&Sf΅q?iRU5Y,'Zϙ-j\y&2S,%Iv/hPaW)aH\-I45A <ǖ^v]ȣڮ!2W[+ x-ywráC;tktEYͺ5܇ 9~rWі3j X8CA3 zoU|6$: LVLޔoHX[Qt)&m[+P/J^KR)M-5$4! aW0dmpT9e_055TsPYN&ߣ>jbߵ%R)7|Sfԅ9þ<{ ߊL?kioM]L&!=Rg[qÙ;ž&vBKB ^:if鯪ZLK=dr!`dulwʆT)R3FSBY \ h60;] eZCmqۅá>^8jqk I,mᑻlc\ô.L篒n47+^}U}{pEza7śa-Qj0!~81 c5%첦F5Eðx٠7]$w &FX[i(`V'Ķ͠BRGO|6 :5ۃcscкi)lZj[78SZKb ]${R-o7y[(,;CyΤS0j.r|:_PpOq&qc<U a8pF3Zt{ze ޔyn9&:*yD-<{!Y`9DzI c=$貞 Wؗ`y^cXhٵ!L=P0y, kmFiC,Inxm`3ik'IW ڭG0~ 1WGwZ4à {&7ADShoV[j8}eG_q m9-5|_m >xa6J+&g>}HλAj0$,ív[uXͧT :xb`RoJ[l#ust5'XSkntjɡGޙ {Qg왋AX-\0'*.MVy)_Uɓcv*YFe5\ءmM{˩~cm X/YQ Hn*%\xLjZA{+9]vHnk:6%>gu'R_mp]kC?96kR-}c"Nޏz1l|1PMId(ut~zhbLr[$2ۊʭV)–y`mϡ}+F܈O/YV6*,|%ġk8 *rZ,?E,xc J%zTRLݒ@)|yxrn,z3Wx˃Ó{ hWN̴5*Sۙ Ù9iR޹-2Sg!;dǎ&u}lU|HշY;BꋓqOD,Y7Y 1y~ 5L'dױ&AK6@=i m?+^sQw2s#Tf%Ϊ陒iv!pnuRIŝȧ;t IDATMfUTTOVޔ)ۧ0fT\57^mf8pq'}o,^>9RKE.#ښ+ M4# *~К~wL:𣠯"hW-RBB^ 1(݆:PSY|?htDP'_kY~zBAu~b0Z9K+L}W3] u67OβwL9/5Ǭ®T4U,Vv†|yEp0QۓΛ/H''[%dE[2ƍq.ZD,(i,uHɝZaMbX:˒rc*}bd(I\@\ VL.ɝKxna2AڅNEMJ%h!%lAn.+4l aft5X'M5Xu03Ip1"oGyk|T9&ө;mIGR] w)#mi >u][9;pkb6:m9yjM2V6 g||/yFJ%EV M;`c䄳ox_[+k{ݷ \d`y;]FԒ}`;5xf7}nV"xTKV%NJ[֤PMvIqr+]mQR mz^4l]Tu0S]ځO]ymjIiburl.PX*]i9["Wn*R[_/A{B$1Y=CaLt]~C"mmUTzgxoj\s_tT]0&Ͽo}q X+|Li%g.Z}`6S6hyֿUC^M}0-`3L VN8eO_ԛv 0j>?o t! sA ;ߴ _[}vWPj̸Oq͛t.ǢAkMA}R~BMf<);ٱa$-;>}unƂvNlPV?pg}Y->Yo*J8z2t,>1I'Ea-Ol5`G~Әt3;! si%pؒnՁ\FkIž6W9=Y{7N|fB\y_{t]Z,8 \K=Jk #\duQ_멒]V5 ~+}*jS:dyܔh%Mzr7;6ycyH(5Xa2X-'#ǂW5Uc! /hM7жCU:s`.*YY&,Gsw~L GX%sڼ/'[ipm[1皼{%cܤwPMP<5L:op|To:!`*azp"y+eE[P~0Y2[WuIźdžBxf9h j S,,lw F#CCr!i9/V'q<}뉷[WO1y[CoX-aJ/'gC .Xl0;ݻ+|9/6KLUZYJc;%f~f5nԚl%Ak'I/6蛄_kYr20<15!֟I( ȗ>khMV; _}4eaVV+E U,=K^# &njr/;]8^'STK5e[XL<73)CY/~wi Q8Ճ) &Y8fM((%zLKZUH-l{ A{זk ьX5 -OgUl_mKM^OrYT*)l—ۡF;5"7?^KͫQ}9ʼnEکz*XG'kspw5d ĚqJSTК9.Qxn/l"[oXs\M4xtTdk&G>㇑Gwg怜A1X߰h}M }- /7nN}7wjM6Zפ}+Z, ٩D 8x0Wѓ{YCլYUbLxƸ_GNioF j9 ;:Sϴ[Ut:mA`7{0r 4kі,6\i<)s윍UN^ɛAa~8,G^9:O/o5=ȩfscrŅ8eBdeswSbRòo9cJE=9!fKGhp!\n_7Z`sNhRk.v˒H͊߫Ҡ->jfiYq1w繻/ˇV+!7u^B>sC\VR$i3}7akYrl)h =_,ƭ&ԑm7Sū DHz~JlV!T FS+;;d ,f֯!wkn*EF9Nf~8X(43gCYJlT.\D3ivm4}[q*`Xx&8A8|vFD{-*6=v9C\]!Ν)Y<9c ?6x$7 K LzgPs"H`If`Q /fs؁_a ZSͤ\y't3kNs_{ {8׾*Z>< ઓ~Lq_Xꯏ&iSqRʌMF;*ݞS!3X<ļjܡqTU[ZuKRsi1ؽLoy}j]9IV#M]F;_L6Su} EzMrAqq6+Xc&tN`V)oDs iΙɲn|?uve>sХ݂ig)mWwy&l VemN&丕DK3R7NlL,3 ?X) c M4 6T}8+=7:-)^ac\X `6-m k*o-.83\j{&ӌ :4'Qll)=(tŠ&ok׎q_QƱcЏUܮUmtzL&w_`Y& 9Or8('5BLyYNgrυ?eV+Z tMtEo|5B~=)S~ep']Pȝ>#X%C!uz}a؝{9bZ&Vn}A4RƋ+B`0GM|A.rܬG;)pHUe ʈR onl.پ#jMU`˔hXjJ "Rkl%]´I0fvl'dٝlM6o*9u.RtF~3+Y3,nzZ"KtSTxKo0!ѰU,5(>B6VwEHw_mQdMם o૰C_v fbmQ-sK9 Be3cͅ/Q(bn%E{ۯnEԃգ0Ehp קCSvl.jXtc{ucYXg1|6k$~G[J&G v[cY#E,cxk4ڤsnXy0AY7g3zxc.[~ #ko& AOߨ ? Õ*#^!]W.6ZϑO.X3Z'3S?tsR9U [1:G5YyI{r&m$3'Ġ<,I_'9s{G~ؿ XL!,j*kSi^@yh S-JቾՇk)pY[}K*1]\{H^⺁AŽF`~ӧsi᷻N3dO9e=Yaj<\zxdUfF- GK>R/g2=ܨ%4Q:<<0>WBU94pO;K%4Ix2w/ a*2Y)js \"1| ^GlZЏ TUAf&Jf)i9h4$F(Ŋ;(5rmwܳdڄpidcLǚ p, 2^$BA |>*D%LƄ"&W&+jmXo>&LL)+R{H@99qp6bF'uFOK>\! s[X&vvZܗm5Ȑ* Ô7ˉ;r'rҢCi>̙X`4M RZ* km7U,VrKQm3 )R8G4/ߡ(w5MΖ3TU3eU]SԳ5lzd_/"ϴtk+h?+;U&ֳu]Fnbܲrs=;~}n);̒3]6VnCݽ*LvWx(ݶb.VlCԶ0qI'xsԦ̊/\x>R>P-lj~Ne)qR%jP3dcލP5z<ïU0M@[U:So}:->yh;Ao"6Wrqy34X9N=sqls*:kH?mz]^?x+X0.BOt<Y8#+Gsq4][:o\P5 1)P\#sΫ9ZPgr$'֜18S;lJJ`*g.-vT=y4~C/g509@ A/Ar[u^;H2#o\+8&^ g%伡RWOl)IaK^]ոJۖKPY}?`率X.閪RYKzNfgjmKD*_Cy_;ڌ.d_ -:4(L3EQ%8oF7=FZa+Q, }= !!sa>M7&8ɭ0CY>0LܶbVDr`ft>ZqZ(ɻ|*8}mUcp5},cqUOMr7d,ۡӤn֕v)ՃkH0{gtK~Yw7C?)sx8cWтX![@kk>c3h%$Ψv'Ba06 iŷ3bu&ƝT?UMd# $k+񲪻#PϑdCHV|]"}7`0"=甴TlX%eLMF35O+{AO-?-ԣGt7Pt/ *pTSgѱxZ[bE撞 ^ЙќIe&&*wFt'SRjjfczCYρh*Hzfxy'v̳C&ZLp]<&s/d*&p*2U!)1ՔͰc˭!IqɊԲЊٿ($;W]f]S3ҝNO)1X7]=T;ʵ IDATve W)Lˍ_De]dm*D` bns0;J-e[]O|T; h B|s !ZihYLtL|?[+.lvnZ\TO$ ^IJ捫$|T7FtJƬbtce>RMNdI[E ь/OTldP={&Y{Ӹcm7TkjbjjA  ^7 LXU6~#9+M楂-."om_̮zzgƲ݃5o}Aͤ⁑5Y6?im@p+,^F\j x{\!Un_4kw,׽.X$96׳xn~P>5Foz^ܹTr5FccËMקr%?%>z87n-C(mup_:V 2 Y9)"4cNh=AxecFϪqY1dkԿc0a n"[ŀt#Vԙtd+n0h֐WWϜԜvZL. {$od#7 G1TrG0aEzpcך&PS֫*ܕQb a]ZoFdygua-.3.m]b5aS)Wi癊i(r̗3L ɇ63e{&7hOJ()뼼`]YdutEzW;ml(y Vubi*(2>X/ܡ۰2݃yp6'.XZIK'ѕZj$fm~r-?y>FfhhkJj6LDݮ;U-X b'XOjɪUNS} m_JOα1աzҊ?Se8Π:ج: Fh6:z*W Jm<< BH) Ey։uew ZMKyX+ԓXr6Ρ"UBNv|>2ۺbT̛NSiK]arVm7*Z˓O:XC0R ®^X<V&h4Q.:0J l\dm,i+kMp+6;?mvMdnf,b _EtfRd$|dWx:{.=[ǣ?6q!CzIuhw9Xc6J^ݙͶGxuM2 d75/ʅj[yh^Hcڅ-%E"yƶOmKmLirH d6ERYM m]<< _ʡZ,ڱu]oy1ޒ0jkߩ|yey"xg^s2kvS|z;4*~ o6zKh d~99e>`Z_*#̰ SY]4\r1LMǁ8Mv,;g9/"AOT+]rZ7>9BrZ;! çu&\AT)ʋ.c7 MnXgyDRqP?j\mՂ_:<7gw+%)y?4ht/p^te.-j:Ԍ:| ؿ4*Mj1*HS[)ZO_N9Z;T%"CD3vSK'ހթ,0m 3]DLrgKڒ!REs  6IHcKJt#WQ-7vfoI-ռњ~? ɪM},yإ<9_D/&fpOw7#wmpZ-w5c/4"/fenucbu?jT)uɫ}JBV` נٝ\ػ3 EeP73gXo,t`?<[=_ y6CMd]SNCLΌ|sñgڃjΰ;;-4iEnySִMd6~iG9i}HU؃rj9q ݚS!m^ª|i<'10R5F+97tKʥ>?7s=>iX*ښ.f'w\nk7>n>wG2|~0jX4XN.κ{g-^Gḏo 2Jfu4+'`<5)h̒\UkIyI2y,[1w<tcɽH>TϘFWࡶUsdI%)z+WΛm>o㼄u(7/\D~pe[+>;HeJO؟G OYo\yUR5#z) k^ZoQvV;Ƹ%܍kԟ!^REYuEaqϴI9Dے  Ô6^Y2BɮM)N[M BD ]b,oóX>mw  h)7{ K"=ד7}٥ɩ-VF?MGK, .erKg(~d]i &Ӷ͌}yx鈾Gcm CWJ^ @#_=qS'~isP+ QZ#SGfȲd/[9nZ v2 ZXjAe %g^[G/Y]-`Z㇕ WӨ~^V[oV!4'7iܪ(Ɖ4$e*_n*YAr9ɲWyu@Iku]u6=  QoEFT ۹8ߢH`d:J+A+gM}" p&䦋+zrέEPrʃwSʝNٔ /*Lf3ʞiOң=uw蝚EKd{b3d )]LƸfqaN[~Lv 'Y1t r><6AO~7nC{ڗ,dj=4_yAo6 vl]K6o Oj\LZDvrS>}8KzW9uv+Z{74$9;_76f'_ W](&ᵺCʡ‘ߡS-,ggqt~o|?jry'a鷶t ޛwZAyrJE$3^'"_f}?J ׹Y dqx*a!YwtTzk,:Q+snxʬdp2 z6#F^uRae# *EN*}Im5zKg/yv)qIզo\ {;?5=΍^/WP5?IT,6߶Bw{p>wQ}fL#6kv?v&IJ+ -tM-.^h]|$KV:nB/]-V2C <v" z@aS;/=mbw1oۏ\pupfiWkMzbL*7&%%Byx_+tډt삹5qoS9U`$!S˦8HKc_OZmūיp5Ij[<.M3ʍ}Cڌ^ޘ]6U}sXnd繤zYy*W"S{}LSvA6\(TʔR$djrB.eI4n9;eiT*OEisfIkZC*Ѥ ׫X&7x5ett8xV6U4e\︸ wh';i[`[zV3ٕu֠⨚ XUDt"WwE~X.NB}b4xOyUdbZ#dg /aVkNyZki..͆ۡ"X(-#57qEElg`%k۸qh*nE\|l *~R;Ck+Bw67܈צ╋-'{Ͱެ錸y;M|Ϳ2)?5OG1-EWP}M_g-)k_ Bnw5X,6km5|2'vV=vXT>7~i^Z7z)p^䝬U\~KpF^?%a_X꥔ -@'Kkǡ/^[9=Mg꤉ YHc.}x1Ԁfmh;+iW;/(0aBasY*ޕA:s><p7 -۹Mk0v%o(DZjsGn>O$,്s>oLѳamNqW`,s>H4.Uz0_+;95mS[YGL5^bp`V˺,‹)AXOwTyNR~M-YV&7~ozw;!<Rf{&IsMs]wݪX̄eAܺUvW6"(3䬷m}r!m[ۛB8v>獶{rnaLwcRtUAuطN/ESha2 EӒfx6cI*βLϚ\{ ®8}`=^}^S9(*zNK}͂+]O;1?TD$i7p՜?$KaAAݗY<K`_1O\W"`u`$|egMfo$Oh=߳#_lXYyxޠsC\l3kd {!};1JϷ4Z`Y$iQ91vU/:[L.  |Bhi7#=y;бs5#&O\a8JWѾ +tق^KX!Fdg{Pz2=q^R˼fP#rz +?Mf]'Fpa<Yd{2&wĽcZ\n⫩ ˃p11Tv(>DT2!M]0?*t5/҇_&8{ɼO.z$љp`˾@:-GM蝝sjC_.eeʽm4B\t|7=?">ĽsqkKMłIFKiB2`7&sN3S_]ͅZͦ>L P,XBi1%sy䕺0mhƬwaaղ邠X!v.ɷ[eɲ SM1io( Kn4#]Ť(NVvcL-wZ!X,WͼPkY+ȽfX2쀞XdK ;ȄVx0"7E籒y b1*)`iS3_]>0uL8%PFw[ @Cu_PՄ>û ,jKL8~ HK"a(w WfTD IDATo~=O)'ZL1J4eC8"B5oBgR jt-lB:HJSbwqةT@ֵc6S$xfa=_=|&*y3ر/,7'oΣ'ՈUOru,_4:`;M6i8ihД֜ v+=6WoLw+Mx 6ǻ܅Ÿ_Tb }67q3s1#qEo"؛m,Ky_5E vl5CƑ(:{捛Or5޵T${__Io<=[YP=`/t@?e`cUrgۋ&]0omq/خcOL}ӈ2a~.[|{R Ad3qPHݜgy'>HafKZQjA[i!IX-Zg4Sw|%L} lx}A413Fv:hRQfM2¤_^TH+62Xx(-16moI i*V~ Z/SEjgse'\q,0ĎĬjq\Ʒ@S[i:( z[2 δT'aJC(:·m1ı]no~DS&k)"eqp[j_-64%{Uʛ5@(FhR4oRY8}KK瞚Shg:lBTEݚr؆vX*_07-7W챩5>uٛ<_DS4`bP$)?}jr=dT%|Ob#XYR7ģwn >w1N,?BdQ]ѕdl oRtV6EʉGoAޠ6H.X;wMo?/.'ֶr{p$.ey&6>Y$^onF hK;i- [oVA (v_˔?^uc)c 3WOJkf*KDn/[8Q<rYu(&a؏c6 kTq/1ܸC:v7sVx/wzL(7O?2?P&p&,f5_Saw*W; wk𳂣QފՋ](Unhd y tM2CzVøV[ֶyM\pT-FtJ&1 rQCjN( Jڼz+Tvͳb[x v-1eYb[e[L2,[Gaי(~Y-m nwKag&SkJ#P1s -4}/2*~kn[S>YհR(ۍGÖ|~Zob/MŪy [њdٍ> {(gbř"2ΊЪ9lcȕgcdRN~? i릸$Bgq,Ju(ZpRlhC5_>;%/>n?l WlB 7H4݄N3Mbst)S<;;: fºÞ4îv L%Bz&"M iʩc a"ɥh#UtSa&h{&dM_b7MVu N`+/Ҋj*w / -(ݨT%Xht}]6u!!N{%wƹ0T:-A&Nbd=;d=e=q؍F F勹U9YnbO}R9pZ&16oҥʷQAՍj/jUlzkSfa}(O}[5V9g57VCPgFo4YH-,Glj>dl_X(u'(sh]*(lր܃^/br=xdOp"0~XƑhKχĽ*I(q}_btzm5QuV?X73{oGݸ'͊uwݍVx.s&tdnOЩkHOO0B\}b *4Y~ ?#jRzAO8[:+UP,ehJ7Ab3Ρ22&5uԾ"|seR]KA(`>ōӴnyrfW5F߬[6+AMfOgpPY>5w&y^7'V4CP1aOiaMlXP!>abiM>9g^GsKGS퓪b}of-iXh"M̚Ҽ K[ثh-X~SdeCHrv_<)mu 3E'6"N6ߦi׋WCM__6|fd2=]'{C8r b/b;OӤ6g^7Cjʥ14ϴ.+t[hd!VĥtpvulB,dx4߾/.>eCAw#jۃu2狕KSb}xUNi1e?g}0dK`v$ ~=K pvnFbTt<'+)yfmU Il.#[M.+ح`7MM&Q:EC'5x ]cdnEY׈?z㵘O(s w*Fb<~$E/g[h?llX6802ځf^XKb]4h!5(ȅ] 'Yԏe-"9arn\ݪX)Cvۏ ̌IlTӊX*٢sɻ/E:X.Z$x':ّ=eْ͋wnػk3hE[RZXܵy'"ے8"~pbHC迱+3'-.vLϛ+55 rLmT5v!E )FAs $ޣy{kRg5:=oCK%񐍪jkZHtM7v4ݱ;/z8^M@sڽwNc\j<+?Z[qڋX5>Ya 6уֺVjVĞ,`N_eߘYntYg]aw|ʥ8?V>x&?0+Y'v#9ʍ3*gRp\Q5ס]S G ֽ~{Sl[+i/+e3]U1bv(rYQBL\aS+D~oLSf1p*k-2 #-7eSkxqkcljA."A&9ۿ$fM~\T{R^Xvmq2抿T)(i%,R("=W鉼f"sJjlS[{\:ɚò,l]n5e{~=mmݩzć6lfz792s ECwPd~㩮s%|xf)\`mfhCz#GbxiFAda}ⷄ"`-:\;xJ^%պ | >5];u+6T%@PT-+ldawiI}m"^xWƚďPuC8FK|a ;wZ]_➚"d788YtTp Oȓxdm'*^Bqz'f0/o|`gr0j ~r {w Hj0I_Ixme V`~Oz1)O55މ0]DrX 2`~Nn."#u2?Y_Sqrlip{I븄 ^e[Vv*VvpAE㹜X }<I6?M y-#Ua 0kE;hfpciј)^WM(|5n{gѬ橩DymJ G/6n*cKV)C-:Dhzk1kM|N>Ц "|U;\ք(iFw,^X9Gi=&W?Y*U_I^]])#]~܆!=젟ex;ycyB-G1VhX*ia .'Ӄu0M>#hy, 'AD8IJG6H}31L+F$+KC܌[ phAZzP2f(OCޙ D_|'.X#s؀,!ܚkA̛0+-!4=d F+2 gJ4-}<㢚ܔeeOhcn'-0U="f[I֎ܤTb:&Mf1T,LR5Vaթz#0_9Ŝ7k 7dދ?M1mf)ԝ(m$RMT6gmOۇթv`mHY PΡ+sH#llsDU4zk5SSƬ-f3m\]Usk\Tiwi2Svyhj>*Bv;vى5iXӃv,Zʫ) 31 ZȈE 7*7ߖx~DaeMe/|K~۸,/1N3B zɈV*V͊dW5 epڶ|m}jJ?ZCn:ad%Ld,z󠏋tq'ntj~ScRgG(>pЯTV,M`౟鹞<:lLȹ;\|t#-831:mq E :sڅ7 iuAkNdix/ Xa1 ^mxc6{ctm6m<5?8~qmVNپ6OfRpO҂G<)Y Kk[k*d0q[6l=Kv;Gd=rbG+N[Ɲ7wln9XR\D%iU0^4=9mLh{N1(b+A峤/ =t+(=6/kۓ:Ω-/[t7?R/ iWM' wcnY7t%^p'9j4meߍnΏ`fbLwƧ'+2#K+t"9i̝I41z8lS=1#XwU^Y=`$<(an2`݅BLWkz獠1i%h(&0"Q{tO Lp=6`K%翪Q98?Ndj}j ]X. sƍ,OڷyΝK^#iQPt<u9ncbpj?r7EE7ڹE47egO~|2{`ىJIڄr9ޝE︩٘u+߽$‹snuK= o A~( )XoSefNN5N1mRΫ[pmIl,*u4隽kΈ?5յcf`n rspc}8+F"3񻿢7v:,yM?Yc&9d$X7d|\jV7wC\|WK!?[P$a)`JaNNb>[r6gD O]ۊn8 'b3=/)r|.mWtjc&7j lhȟ\apW3ΥK_vBKmᎨ' IDATq̙5:0nm0FWvoT6FsN 8lkGs!J8%;:pZ9gµ6?4-TqggɍxQؤ+R7vY(r\m GKqjnҖbHmlCc_frgK7f7C%j@WVYl:tz,TP+Ssz)<\R,;_DBU2xj^ػO}SXgVkXޘa)̣2fbF`ZjR(Sy ذ8ɼYvwgquUgk(&іS– .N|Ìz>gisq]y8lqYӁ'c{ /ðEgX(2RA-U}˒ٱYqK]Y=,98ww*"%]m؎uמ2F'<'yrIYGq޻x㰛yL㠸6ZXK=H24CYkAh|;?KٍqbiC Qv#q[q(Dp"4ţB"v&f}ou0\ĝ;@nօbeYW ^{ܣY.GԄ-{|31)nZv.F Jz*R1A;#qX̏ߓ54郊݇NzxX%財04\ ɎPoݞ x}ˍ`oT9L#\^?/Ϯ\wLW21+Mp4J T$s(Fr0woYɧo&kN†KW\pAP nM`]yt%У5◒=J%3pQ|3o~i z?pIUgqG1Z0s';GFi7{-+ .q,h>x"D@}uג*aL\GSpVp3q/Iv#Z%}v2&]#s.礖Q}0-zA{b1^}@9u8@D ؐ!gst LXdLS&:ւ61klk#ώ.zp C5ժ׼:=oR^f1_?ȼ6JLe#RLĝu('ڇ SZY/ KpsBGiږbin?f;7Kʧ:Xw7?_RvQgZ}r9K(U-uOPC/<4*5+Ԥ@CFNrJEѪChay`9h'{?G=ɦLBReW5! IǢhQ& |Mܦ[-F{~OMV+zu.;eN%+we lW_E;XykMz]2Rܗ]CgΚC؜M@jd+Y➥rlIc,ZKFrg_e>ޙ:8=9]W37X+MۜWq#_\*>`&#căQQ5\ZQd9abqd6xVGkl0mc|_*ofO9Mc^8h|xK\erKW-"q/ҍY_jt5\ow%geuGڃ.hQo>>V㾋troF*HʤmG%GW$\mfN g >n8Ym*,|[.?y.R1*RmFeq~ш4C\H*~./u fDa_Sւ{hB=KxaΣw4pۡu"c'qO} 4|8&.02:`|pȁ׃&yN{?t"e{^dry4^e|`ݶ{OXRfǝ_M^,m-Re8vXXE*:r)S#0`:;IY+~68x5o)OPz-M%tQ i{HcP֦jQ\w3թi$}K/f::W,;Y˦,8Ut咦6Gorzc Q. =A1Z!AݓQ*ݕ kE\%Ԥ5ȃSko7b)f,7|Pu^vJtmoT׌a[1Cʿ_fce*\!M2QbH+n3}ɺ54y۬Uo?s8~nMp|U',n-. F<2P9;ъ{^bFex3|Gw! { |v6@wlqL!Wx;#qs탢IE'tH#sL_`Ϋ-Jڣ}~1*[vQ"rRtV9~?88ʸnQLo&N>~3yݴ%\j߆>EYWRygMNm;^i¤ܤ\{a.c* ZWn|XhFRp([<ʻ*oLSwʉhݡ\aǨut_ĶClꢰM*B}R:-?Ճ\YU@w%iL2d{ܭ'0Wsݍ|fؖIYgxQҰrzW0N}TeAoSrؖ^!* J㎅{SVʤbԽ~U?ÓE}73K`nɤ#?Hs[,ejAX#j`3}i%C7c W6vR^)wKv"4*SfJnt}ԦlܠVwdoR6%TTJ d^2Qʳ_+qnN̶:"KQZWm_DX2du÷}.tr8oU,_!rC*Ǭ`k[ԻbYFV|J2*# r&0'QuE<v ܇lS^R҅6@2߇6iZiS 񢄥K}/;Nu|g lٵJMdSL-2sAx>>L~⤪:]n奟՜6b.6>E i<>O[ L޺d;T v.`AO5~Р.VmVH3*AqxwKVL{{( ss?P({kpKgK̛å.I?ZLj}ÁWN>lpX9K鱦x/kMYK#Cy:_v4`Fo 47h$PSzes?Pa.1Tb}eL& Dbm>"-躻sGZѦ[+O=il+R7j:Қ.XA}g;ˋs",Vm !&(YTy*k|uHSuq&JiJ] d7ynIS5:n3Dxи˹ۆ/sVۃ"y`xp9C5;C_HZMYD?x4Z*~M1>Ik+Wl;  fƱhm-4+E_XS`x~>g}'bN}9wM̂J@1< !36BeMh,v@yNvCmTKW."AP[ Ex{Ptqe]okx.xv*MKaoih+H;cOZ AN)O㠧̧i ;SKZ^L/*C٥r[H9o4YBwU~4YrƎeԳt9D}QrW#ʫ̍BQ6F㚞Eõ w<_+zk[썢%OpMa:Y| |2W䊥F4A4x(z$; MJG]gZIou1YɬNoN${Q ~*8rΎ TM3)wNO+S뚕ERc6v朘=ufżQܭW'CZ^߰ӞzNcіXo^?K3~E~ l=h ;oJǥU rrqZn}m#np# '+mRW"` 쐢ef98-vAEKQkb跔Q-n')JAlsLULd3yԽu y;({+\$'>nC4?A,f>O;}r̃/TԮwe꓏~/%lQ=`}>i_r1 Sk5abѦ&kNzdn NRNn<U_ֈ%X,ɝT|'=rVmb埴6(#s]P _F&n7/>8\y‰ MJMLl&]ZO3R· ]ٱ voݳV}x|QEw]ߐB*HWJ 4cҺs7kKƲc5ݨӕM3Sͣ9K8 5#'?[Sø[ՁBoASHDXd I'pb6b20|4`usV}.g[ۼ󘰞Z@ˈ<]1  > F*\H*5yض`e,r&7yhK3`.{~_Xʎ.G}=g\7f oczfniocmNńuP5i-['$v.wy'[fGw^>od=q9IӇ~fJ줅Wi>ZC-{=lk9wV :jZԲD`YXcʁyDK8)UgV,ZdxQ6s49wȿ'[;[jTUdZvV_ߓ™ٰ/R RϺusUh 1kzg*M}4}JE9w]i#T=ͩqꠇ9+߉&wZ>ԕ8YdX~Šhd!JT<5h3dʫέiYu pnh1IWI~"Q:{.Ӏ9Y^4eB uܔ?hIzz䝿r?ù~C^NMsR{6uE63}u E:cÜĞċ s:e'5a;G.{M3ҿ\_S7H?T|,ecz|5kۋwr:VLp4m;Dz@t䯋8Ϙ1+ bgA{8Ebe6^Cޔp,6T{*-Y̥4`kkBUT\9UEZ[d=(.;JP*Uq9{kݛݜڐ3 4esݰMPK~06Oj'BPqbaoOucg=:DO|bZ~Y|{ʨ־.?;T08~pxREZHrH5*X|d_"f)[&k*1!]*9wajs/DThմHvL㍹|\ܹm N)`zVyQ?ps){!vK:J7#u!͊Y_jY*lq>ɶʌ[9?^sˡJ+>c\P^~d2IT==RF5,SH#*Ø)lvJ "Fsf 9m#ý Yzpp{X8ӳbXK6k86 @_B_0o8bM]ѳ#^C\kidK&ȹW23YZ\5R1zA|ڞf5a̓9*F"{fVըwǥBŎ쨐*m[}0ବOZWŸ% J}{A@ZŜTWft:K&sʓϞVYskd 8"HdS A8bo ޘ~['٢҉Mx7Ы<4. :V#{["WT[ .2ԅ &K(d{::MOe*d,2؍ pqj0zS׳JP;gy U1HvA$yz0ԢgD2BHd5T"˜cޛHER7؆.y>VM{jwtO8C=֍bN6Yt^]Ts𮬑/Xy(7-n]ɑň|3TkR%ŒI m2jIw%|$_qC@qvMK#O-YqC/-ybWrޓΛdC]9?^{z^w:ߧpsӂ1Ji9b&Ȳc "4o:+ Nfr(݃loۚ)URy#ZtF,lժ S&I AL"[, iuz&sUFgE5xK{=ߺّJ(E ˉ!\rP*6>ؑfW6*Fq&G3%‰ATm:v:6Q<5%XK/F m*r/nKmXfMYy20KU8 tzJ5.d+?1o#Q뼵=04_I1Ţl,=eJMX;.n· O8Ǽab4_b'\AsDT|5%2\~rM:\ҵ :ޡ`b S$ uWC@r\ 8e0擫wZK2xRËf-!a3a^H|{U{r2SҍNZ=i$tTv BVݷX5VXAѡAT껎YFmU2EUz^|c$H\x3/31hU۟憴(v^mXr\[QgKgJtx_%|תOL5녕 ^5dO}Z#9w P% ]/>^I[t})7gh1c fY]"BMR(R.ۀ`F8𸞸6\,1TZvz"{)>C;j<6\vAue=\0|&O8?_t5*G Q&g-EtSx TPʄhVCq7?\qKO^Ng0П_ ,p$*$Pb1w?(Z_[DAk䦲"Z1 -!Q1D1S07!bsB+1?8.[y& V\+z]B)Φ ބ BydjMT|_&n3*ն]h4ڞVSs.ҏvMpiN' e/Ȭ|%7D U(O!u|j^<_+֝ۈm錗r^Nd*{Q4 &wgsH2sMd1=Vs( [ώkttU&Ln*tM^f& A{{ۣsZC^X Ǟb{gKV(dhr3V l)c#y&\/̍Ԧ7aT,EQ=T^Ϛ^(̊nQJ v/Q]<ӪYߤM RWԳ~+2',wR&d ^/nO.dN<LYu۲&Wwʁx+jFWăz]/Ӟ:ؖaN }P /~Gz*wUu4/&|:8)mymGLI$I= q՜jeK.=eI rWZ llۣjBFA1b`)GZŁ`lUrSjzZSqZG8B;]mv3z#aWw$䱾XЭ"fB,lƻ=.TsOro5[Z e^gh>;hU'mZC}d3ȹeZ?ǨbX :֟!!wgB),ް,,"T%-*WܨON*Rdx|S^R,TskmDԒ~"g k˾KaHG/ӑUdj2I22L%וiŨVcj}R߳9"iى" g :kg/M0-\pKP5 ͆(+2#G0{l#VAo7TX=(ڃPXJJ:+^"x,T?E_D3i 5 :G͜U^H㪕X583)'1y| $tM1%Z+ՐyjiV&Epڂq#Wp5ꇶuoo?c=MֵhmʀapJZ:Ŷh:ߵ3nwZKZ]Ը!S+UdI| ˭rFgGrzH_{Se./` mUf7X:s:H.Š2 KV,5fH3z_FK^,v;@Zԁ nC+Ʃ[(^.0ï9'ֳ &|r!o vt5|/zY#;ؾHЊb|! ]Vpe&jB]y‹( fҼO'/r/ZSy7$4^1Q'‘5"02U7+m&cV;#<ljBLy>PkY6G8 V]YO &mb8.S^EXUHE07ZQIDkGu<˳&[Y$L:^5'se;WM#kQw͈hGçǿ׿;'|:?k,Woա)+Ҧ?{L$Kd);n߻m0~Ti$lUNi;Ԋ,/h޽S)&3؁ܮ m-;WیF[ex_Zdl`[A}@L9ZCoF7DSy"㎦r?n'lfw&u`wR}j" 7#D(#vʒ6[ڒdBaϱ6?Ҽq T*6 ʢfK"T.S^l3%84Vv|$A:MvV/2vAK)ܑgu+6tƸr7nkpXIC_v6p1Q]%B(LG[HaXz4jJɰ l&*+;ܕB"[.W'] ?(HMG/\@4ZךHLkzCcQIlԤq x&MF7mCTVHb*}2S+ece27 *UoD²Fʬ4XdAtT`X7r=Q36֋2P&3g=!H4wȞe:ϴ,dzׅ/YXKj(DX%ٰ9p)J10' |`>TL Ț4ͽEnP亞Gc-~gܢ/B>H5oi7CNIߐ_uW--#՚F&eqMq(Gp%ng²٤e]:ȸA*xP )~ajٜKܐ)|isj6 $u`tՍc("Y|'q~A[Ox3<w g#Uד > M~JZfF3c#h6ѫʱn^6b2V%Mkmut|h8AlPV"}Zs.UDž{j%n0!:Nlǎ*0̈UݙWϣ~n;u%`bft/,Wb݌iì :oKLbp2 nHXt'_5Z[6oI}vG1Q33R`= ;_h> ẑIԠF>7\DH+~dVڝxe: #@(jK/a=8pc@ָ+C6<^jc@xO?EҿLI[:930d1,Knj^< ֝fV-3AG }nt]q9z:Wc^F/xm/oi66V%0FqBn_r<Bq謃T6RWvx `XI:Dz/va-]$M6& y֡$ S[͛NؓZ _huҨ WvAco< /"e#S/bh6~~(?{N~@ʯ':y\5W?fgMBSAѢdQBīߥg{oxj(3lVJ*BPA%ImRbq^\P :(NF$MKmԔI=啽Ľ&j!vDɢRv#GNBΊmeD#A~;0W%[iFWFeo80Nhu yԙUe]5ZQ(pNC, |lE%&Ym _Ej<+[d٫y)3l|Xu)Rצr(Y>ulEYE bn)@ F2x./u,x"T.| }DueҞDK1;tG<ߡ)U?ZgX79 IDATrId7zN3@CYۂ,ms^y4O- fG( aVx`*@!"<)(>ixf.U&"gig(S+$9v4MHk\4ų~Q.uBKm2Кpd_\GQMZ]$5n}~@^ua^lP/7Y$@ 2/ +jQqGH:] 'NE( Bxh@9^uԝHger.@`v'^khLs*Թf,zt.z!?U! 9y: G]k "^\nܢ?/Cx=!ȀKm0=Y'{ (#8K×` 3bֈj}H!G;=`MJW|_#x^)Bs?bV-j׍ǢT֒•ҽcFP{ѭb!o,BU嫕 2o}x:S-"C+H3XdH8&ZnU@WMPX1e%ǐBԋ銞˃sǀ}\\^k9r$K-ZKan?b.e.n(-jU@FMEF)6*.>@qʹ նƠExѽ>] ʔ16O_!/qxoJkY^`;yơ18`E?8>-~Fdo ޷;͘Q#gi<80[9je[ZAqZڪx^^vp^_7e`/ƺ9rC&3G͘. ӔqqǻM$Bc(dMtxsr@kęv=C/.RLGKbj; !-k/MR%dkXT^/j,EBnl:Mxøָ!sᷬt8P5"4k''̄Iɧtp*ͷYnt)H9v(~iixpT{oK(wJl?Tw PhQތjϮ~5Nk'C?;^iџh1|eg^ $+_|-n&7>~LެV0ԕוAxfWn)IWgĦp5+PEs [v*.oyC6ңT g akюidu]xs-w(?8~#3~i4nWp WLJ{pi.۝ 8{kddg /?=|u~ye~p-}i66DffQ *;Xx'W{ Peщj.n.,c9#@o%4%m ?vMI9p 7ݰa ; Oo)'ߨq#ٍ9''Zk|O`Mzavs0ş.Zr~ֻ,ckPt6A䂆`ٰDe2jM#>ZY9qݟ!CoDW(WIUH[A[ό(;ѷRj!|87Bp%J{(da3pT>W-}Q,I3`9.td-jx,4pF ײ< |%H:U=5ғKs%Zp>&x8.~k2iPN҅XU*]Z F/\NJ۽/;:H::,]j0]wE@XvIEcpj'p4`*V_4)՟iah]hV I'E^Ѣn`xz+0Fr%HV$:-/VCo]nS@yf3ёȳѤ^.]П)7|~լnޢXzbʇ+v MػZ$gzZ{sN\b,dd[M'-A'B @-$!d̈8콖i`+rȪa""3k.*Is*EYNlY`0Ωoԁ"}>*.AOQ3.ɺºN \ʹ(vn, F-|P? .o k\,K5ud;+XcBf[ɠ)\]0;a&,&5gwsN/WZ[Zpng8\:ebbmpgnNϗFtu* S MVwRQ_wnDgch+U([L{J5,tWKMc:[b\bɕr@(Ln &P$8`| *9 '`!s7] LXo f @|k$"GnMF>Lq=.nxJJSF`F?QFHӴ(Ƞ8ߘ5#RY-jt,i(rӏ/`Vzt%t?JTJ BPךUR1cjP&¢Fly܈!̥AL&BC+7<6ZS.cv,UX$\ʲ޲/v)ؔ~gya<|>?ӼtpHު(ya94RI+Jso1 Sܓ%PTT[JHrُ ie`!,S *XU 1J3#N5H3ݪCL)ƪΦi1}^hٺsZ՘2i=QLga:JFO?h۱eʌ6 IN+TԂ"N583iG+Tq$lbԒ (ϬĤ&#zUL@"U^j9gR!\0(^( .I@Ĉ+uQj4V)wLkTzg6y_Q9ٖ]֑=z˂4YǹTxBK8SII|a2B`LzTBZ6l2'hP,iCkt N|[!LIjB,3!hHCmRrkA2S8g%ͬG0uLM4IciF-Z;Fl{8LeYl0s@mԙQ9rò}53fI#Uds6S!fLʠ1KrgxMM"%3sP6;0z>++42QSFBg ,.{]w#n}04ĖQŘ֟V z ,,1xϛW08]+<Ngd:K%sK3 3֛׍Fugd)Lr-v h,y O\JgBIpDr5{@/X{a֙ /mA$,r̄8HuKc*sA廇tpN_p9FOgJ,O') :{uvkaqv|vreQi66 9VNW>'ƐA%](Eh4XmQ!mJ-[,DUak IDAT(w0΅d\or;rGGf.\rY ;;;+“>n\A@|Z!!Xe"%GNC8C,dA0ML-mT2"z=I83rZ+[* HI2"V4h:Lh3 t aWR1=Trݛ{hLTYLeF{NT 7 [Fnh dkl F8 &"C`fc9fy?q_|c”l Gzɯ{ƅޯiy0N$ vD"5TX FCie36?@'5{㩙' )r\^8Jr".d9I59`u#rMS6 J;IlPK*iŎLldn. YƊQ:UYWVvZ)˙-ozp4ɇ3 7|O8bX#q7?e0xXor}Bud9Ibg,XT99SPQ@)y1kG;-(lblɲUj5 Hؚ~!̈tei?2[͟#y(G\H#^t/P" L)0bЪ`]=?85uf%d;0RqhOsZlp郫Pk;ܝPj1bcsDh`TpT,w`e1;ֽB֟ #(DT:hi87ɬJ4ΆZE{ʈwﳙk"̃衞KpxZZFӴC>ВS%WF=YYsc/QeL0e6 !3*UcR'ioKraU;>lWBd {u8]*1 %gʲ /:w5X_?]Nſ|/&gg홥*7XtnX/'p**Z~Wҭ[k*{r33ɰJ)SUϴD}vu߹ *4l}\R(:)% ZS7 Ȝ*#oI`JR ZOIsQ9<1kI$(яKEVsB(%&[7;B" vO"fe4/Ufi>rn(L2 زڊ ٖW͒ ziDԅ؜jP2ɂ) e>U}pSeN Wz0dz9l1avWKeB.Qug R\0fGˤKopN%6G*KUMI`Ʀn,BeGR3]<\ZXN/u"-4yMYp/Ĥ$j^N N0;?yϿ% *;K_*leR]hJM<­D83tD{/'ԺGNfly= ϸsj)ceg5_ND28P9 NZ#FtKio0 F3X5[E6Zg.jFq8z2=eOS(ј.S^)=q~s/ w“u_13v-ܯjϕ:g%9 Tݙ/4o1o~燜~|+',^?~¯)_?o|E۞qaNB4T U RLhר".-]Lh3+Ѷ$(*}lD)VܐFP[CxBawN{29/bp5ATX Sx򜬇(&ƭ 6aT,F9IZ8uWdh擖i>:Y悝>M2'bJ&l.qD?~T8],QFqp$U4+uI1eHKA/մ @ahQ4k`%€E[‘HfX2h˸4hB&9;z؇,2]-VRkϸC{iw(KNH).i2tu$I/TH%qn9/ܟ/g|+Sfy1PIf K(ƒ'"iܮ,ʉ]n߰MlD2=IDd)8V-B]cl|hiKBHA#-#53ڇ-L&3%5S_5t'Ɛ:5b~J%i[i/V+Z+ZJrGKl)Ի3~}ϲ>k.^-5./^R7:xчsy~Twi;3s]A5 'όQ1^%EE=(Mp&3ZcN\2 2p`(HI@#YE夌 xU9=z. u@itd55ח۷P3 > =rp)+tjTRbv/yeٲöHo*IBJXDx# N?XD*4m5n5q(3[_2OXʙ˕bo+rn ^`YoWZ}Ay@ؽ ›]xZeUnl]:_E+,9Ǐb́og?u_5NCS >7̽)zig Y4?4V'M3dxv̜kaN܄߸DzwFK=c!Li0={3jNQ)ǔF?2~ĂXap).5%$ 57 & BV")=&5e9R'^g 614"b;65]Riue8f4s`04E["Y1&[nfA,*;>98MhBdrdBCJSa 'ueR̢1F~>9^ |Y!PPD'kR~>o;.<͟b" -;6`Wa҂wD3uV".|(2:t[$/y!X6所 @ i̲t喃rGnwD#b5P(IN(*fua Բe1뻱j{b턗xh%öyֳ^Rڱ3 gS^µSZ^)|?#5sLc11+J2pSc\x1lxz=G@y f=Yׁ@[$xfeq=pG @AMIQMgNgB;`GQ&n ;2lFX::#3)j0@,i@BB ?Sql,0 WȞ0FƼ'kD"-! {~ leׄ2bT ٳhQĽeꝩgʖ1PrR}2zLJ1>$}',JN 8;FMۥ_/~wJz1K!o7-R9&ݱN`=01Y⴨~+$[sLy& qQ]X|f1fQfG|$NhE7l֎e:wp#.#V K(!'Fe{tT#H䃯"4|X Ct"8Y߲ih,p4kɅ;-/ίYýriP(wiA ?΂}K _,,j|>sx鿍}'ӿG} <_>eM߾՛wKM)?^ʯsx)OA䎅0+Oas.~bZ??~ mިtO#OV}M׉6n`tc;= +Lm`[N Gr'4+M6dVBsuftU{ JfO}찎ǧSL`{0J1`Ԥi|pdqws6cɯ1%gɳ(5y<IĎjk`051[~̒"'sԃIX/h8<\͊a^&dB)TQff,DEFDq3c!.NRjF DJacď I$;^00szHC'JZd˩M.3C>{̛_v(!k?}/ k )`<@k^0revCKR؇r/ٿ/Iylr&tR2KM9b|A6*w%^ɸ$,/? h撖BaGy cwZpZ;AdD[kIA/+ ^cdž>w/_wUi,K)~xE䆎t̓;䘖0Dձ38P3:dwJʥJiɰbF[;1[N% CC3͇(sMJ`ɓYleI 9P.Dk~. :;qx,3GgMëgN^ζVgn9PeK̤DV;.cdr fX%73" kĸd6|p Azz>o#{Bz9uNDjFroMEĵ}(S#X\¶w 7BX3܍as!o)C_>_$NK#Y |d|y`rā;ZV- 3l4;:`> M8yq'*mb[JfdC<=c '?xWg$3e!d#pQ\) o9(3~ӝhY\7O'i9t"Y|Qn̡Z;b; p L.d)6pxMXI$+~<Ó2QP8, D1 ;%[RQqpkWBʒfCnӕu^Y2A^;^zm)owA{w l<`¼## eȡ舖4)ݮtBM]jL$&nՓJؓ悁Hs%D U#,8J"B4Yrd!~hNVX2Y{{7N]<28"l>m f\h 04RtaJ2S}<v " 54lߘ3=T/) hgUB}sKp.qp(bxl 6'k8%RɎƬVihsp>=3p΂ji“NZ$bBsHn1k9*.s iZ}{~of5muw2P+]Wx,lNT;٩Ws2} O6RP&7g^b-G(͡;qPsecs,u`(9OLkTZX%|0k~m?|veWD1EPrxR+4TMjMs*6XCveٚT&f>tLqtTӐhF!N\P)%}мz$<_%5oW<+pBSJ\=xqG*Άs*k.Hw7FY9Ty}hr//v|ȫ]6f|H W|`hzDz灧sa6gugW\28 "/WA-y7e-}Pu dyԓrƻS|<\I-3WbbET0/l3@2Y'Åj'+bY",:xnN2^4(peBSHQ%EES`FPTpn!G"~\z Mw#\qI*\"%_Z"#!y\Vہ#̓ބ`#_j8RWr/{1ʵ'?t X}G8Ռ9Adcn6\geIY6 q<-쇎3_=ٹ},}!ȉk`>Ho'D% IDAT=+~{x%#٭'vbL= ys1BhKԔ3^g22&]=`gOdT~TF~ Q#8YMVbnzď|%[&IN3c;r`j\RᇶO:Rr~!~'h^#$тӣ^J[=JK#Z;OItxx~\?Ld~)Ay▫o:nr} [scjVtS dgTy4e Py΍zЙCɼYeLӚ+f>ӆ(hqԙ'q2 DMˍ(dɩDrŒS:#шqyIGܒ^{Pk%"LOL7b FŔYR.[eJCvl sfI*3&)Sv-/W”>Ygn6wZ?s9 7e2cG3c{R3F y|$[b4mHN3a`kдԊ\^c k;lz|zcinQ/gۛ '˩ Q3<$ _'3_b_WC5+dLU/O‡5?_w;/~ &95}h oǹ1R_.q(Ӕfua?'`H>XYo^ >;ƎEN)sE_oG`T3`,e'UjxeX*bAxƠ3 k5;y) _`qϴ$9טpDLOػڶ%Y_Dcι^;s2>*0x!G @B$ ,\؅e# erYY;֜c[.4ʻ^"i"y]t"Lt+c"ɘ*ҭb^PH-IR`B3|;EkpFxMh{$pڵHk\ViɯhnJ]DKp)usI*]-ǥ/YM3~qp->kAF[J8&zq#ϸ%N# =:Hsza䜬"xaCy[ә| Z/,'WŻrDx_JbOrmb% X.gNٰ~bY&'yI)l³ YX!o T&L5=70J"nG^5; JQc@gZRTJP5A Jɋʰ.RQ석9K7CbN.4=dumyDFMmܹ- dž~h-jsP$ Ne*vE0YbR`ʟƤI GyfEJUnY!PTЋ VzĜܫA\㝯1uGw3EV %ɨ<4/]up J2{6P>ÉU… 13_]Jge_M6bSe7XXm@@vf4[M=gZ`_Per; lxrieqΙuo읙B$M»O1)2^!4kC&hDޤVnY[qj_"Gi8Mj w)*I1Vљf*jqJ7ԋ#3~N9>d=9|5}<]V^=9oXJ86إK$_蕷gv|3iʯJ{EA\R.Y~ ?[\{_~‡m엾К^/ K>v4Yd;rϝgFO-8k\xɝ g`>{wnKNƆȝض'ib.; yΐDF 0:Ʈ۹baL4#ײ>Hx!cQ+4FsɆ A8rdp E$(гF*hk ?3 i&Ou`L:䙲K)KhpHam~ BEN$Xl8ì60&,Zla0̊B9vSӠ% +u1+J࣑\r60.dɴEx!\ialZ VmZaÑL塦Ug?wC4;0fҤEBS}=ѭ`3ODW02r썳ˇ+37:;Q@C^$߫90Rx!%QoSn' va!x j1u沈|=\KCjq\݂%1PPӐeAz4Lt]A&)t3ˬu誨Ⴠ_ɇN{x@tb$q+ڻ뙸%M fv猒rQj^< :A 6 @x Zr${tBxδQȉZN+v%dVکT7΄H/Y#YO]=ns혜,ۢRS8 4m$ ӥգ>v)ՖB&1!PYJN;wTԋr|nJ[ 2yŎd2X/8?8{IWMv2YA]_2]WZޙSl&ʬHTfҜ2#-ԤJh*ι]qKc۬wnm`Mt+3aN"Gq[,22PL3qOCGCe.؉8+ dHφ׺-Q.D6,ar/nޞe/zA􉰝䂭^q ־r+=w޾^kVf=%r`.̐*X5—R Yn*L ңP$g,u@ BVLQ}Vf-QӤLB34Ԫr\.m5Hr9?rz.O9wmEqn>rgFXO;'e׾ër;Ga=tu1# ~~?oZl_~sFFr6d|o;ʺGwB۟|wge1ӂ![c|i/<ܹOCVkMr+}+H2p[r %-M3hC85PޝwmHMo4hf {d7(ؘtN)vsVYJ"Wz[Rx4kbS3jhHgRPҊ].lifYVrU7qRyȥ3Kk`VAk56Yq&9:KI,uSJZm%oVdtT@Yal.0jnK.BS-\Mf8ZYelDb1ZM"ٱZη+nh+\hJ,@?Mڣ3)njg 'eMՊڅ9&o_W2}ք*z8y$f-r4%iƹ,d2A"kJ7ل1(=RڌY^"-3& nNҭ)RBCYzr* ⎬ iULxBɎ<_3 )UP=o=& ^NR8ۙ<~itnXqRߊ6Q=U$&m „4z vQ`"l]%'L٪uaL;34Amg^?{x9$v<'<^qw;`Tw1n{rʴg.Kc6Vo'TOv𑌦WXNW/:]Յ)YԎe ̨ yJCV[p:H#b/H?&=ّ F%+h[?T !&LEi[L*1pܼ.f$̘}7 u%1WK*xOnH{s.r.Ӏenߘr bsgcCOs>Ij&םIr)\>=DC-f(+!vFpVb2YFI' aR ?ռde@lȨ k&UGzY_3^?:vxx!|.0hmN틒oo|flC77o8kCao<3mtZ)<>aa_oO|?$r LD̾zL#x91cgڼs0;c }sZf46^ U6Zrٹw )D7E6.XO+=oZūS0rLdiL砹2Me?^uZAs+x e6;ɂ3nJ#ҎDkŕRдRBEVBsch9*,9`wjrl օ{`ɤ^zPR HBkơS%{{zdMO`;Qd; PMzJcVִl6h ѭ@. O@چK'GSIT!*Lͬ ZQ>Sz.7"NY A5Dd{]YNL/Muev|_%Nt9S[o/u#GY+ke\5)ϵ.!Z-sk A#=Ei$iI0%&JFQ6^<0ȭ8@F!vBR扜B3X#:1uU "uo#ؙ6iV'R:x,%x )//>Ήgrw4wwn'܈Q/,>}1>7W U^ :DI oc-AB[5_ W/P?O~;{ 侰6얼]ev'˜pOh;#:;`BN'wٕ.,>QmK\3g'&7T;nBNhlLWͲb"ʮ4R|q*DqgXcDqDՔ],5e*+O&ь%!&C,Ma ۪U "E>,+0xtx۪yJe)uq:\s,5g3dVJםXe8+pI]16fNF֋,K05d֪+2W>h1gMZmH @ g]Xū J24Uɬ(B䑋:ͷ`7Wxx!T(\YAF;j>8__O_8E@u>2qF-Xg>>O#!,:G?T).(u hcO5 E)c{$ֵ4[3:Zr8M~&E"^҉FPDvVl FbdD ao KP#9/tEo3 zeU&yge>tFnĺqsr16+ IDATgal0mu,06-("a;[cZ%(9~ϾqI=g2è%+G,8bYqTjvΣ}l:QyV敱1<2ﵳ/M '48uMvQZ(6&+*V~\~M o6Rr5f٦%z KK։}/ FvCcq61tDeWgeePᤵ6oH;#ҐȂc0w9-w$!ÑT(-@?R+EfUד&ƖI ^jtZWAk*M&IaFMf[7K.2+8z?j\kNY/ryyBo nH*<۷)CϹ'>>Y]|W@}DSQ;;}}]>$ewE~ʿFƦ x 췞o:㏹FҔc,97ub>?ow=wFoVVM/&6ׁ;1wγǫ0V<>ϗ|aTf&%Vw!l3y@ù]5أ&R,)`J*K*/s4%f0iAe!LM8tU2lI`oP]NW.*8SjR4Ԉ:dh"Z虖~ݖ҅nV&ZhzDJ-T&]Y^4d_eNtaZ)ee$ѕȠIV T=Ԕd&zJ݉'y|G rx4z>]YdL3iiCs>~`w[ zrߓ9y }ޔt.9[|w&^^LF/KaYAKZ?0Au9HY笩FΔ=1 \FD 2G\/dRNX*HO)euN'ݪ шxa鬭28nTv㙉c^غC Gr2w3z bmP]{b$3ָa"mŽ81NsMX AUtq ء[|Q:Zz1z(^1d5; FOQdX\=O찳bV hƲ^Z}L $YhB[/btݸ bEH`fM IEr*K'|p*nLيkkOV,ݳz+jrAliX\;[4+S}3:ڪ ݬDu?#Ѱܹg}_-JڪPѪM4 !rZ gŕqt9/!&2uYL+U/LgAo~ =Ym^y6,|0|.uC=In*\.]9iKcN;Fpv!6NR#U|1eJr@{jǒvܺMoޒzٮt}sh+(*3ު._#s i,>ޟ|<|SΏ;~!-, x1ml?_B2c{ߦ}{o|zCA+3kK,wajy{ _cwYx l |>;q,X]@#/=P~*JHޡ7 |K:Kyg~rkN^nU#llUtNhzi9e*ŔQ3,c".bGg=ݹX)fɃfYFs)`(N)KyTn̕ Ԍwq#F3qV;֊@4Sމp"65N)`ҍzU'[N (Љf#5fw;VO$ue_NB ]anei^)4#6kY r" $fSe[VEG#Q=d{:{87Ҳ2WR㡞U%?ĩs"5ྜhgXY: mWdЗ;g;V8ݛ35͹]o)W~7jЁuP_Y~quՎTeett0nQU H`ZczI?] 18ubS|߸ݍ.<ǝSxBgnqF ToDG#䖌^ `qh5UMȫ}6kE+H&QIv:E}J鴳ƽ&ZS2I&BC pɣQԠV2TGCҶ<=xa9 aNy:=bk#ުʜZ{ ?y>}87ve'_Gx ggIܝhKWM.l]jO;o^|Vz1)NK6}Km&6Z+v=˞r:Н]; Q{RSK4$Xa0k@V*xԍa=kz@. nXV:ʚHZǔZèӤLQet>$]:l]Br/<~X%j_s~\&l]/<5D? 7Ӊn+{ډ|B.|^Wa=c_\ gy\?>uUpaR`.ؽr\N BhSHUʡ;etERh!ȋut4-fNz$MZ]!ZG5FNΎ`hIs p܃;;{+.=/>j11vu|gs1YL^覽ûK+a-h!S1/ȴ dq`|zmLRqh/@Ц20_J0A3v`8|S9.YP uDQC5q,D sD%4]V]XҸki&gmh[s"P]h TJw*.6]!~aq cXĸ E aQ_Z?N2YX20Z2v dĺS%x[ɯ@Y,*+N)ߴ.%ГL-Q f"i ]SƜ9qɌ2"_)QRJgkt(Ub|)7Q-@"LN]87%XS"q>A,aۉLkD .:u*tg+WS־B%~ޔܘѹKGs2J&vԃUZjDKB.K+o:=E aךC>Rђ_t!厊p҃1)cQus^q8xvf?bK2BXktQM6U4dYZJc+kDic%mB,&*;ފmyjU@DetUt3^&m 0ã&?<PWE:uRhbJlܙ:<<،~ OB 7^3iʓ%ܗ.B8'aؾzBhfnz\0Wo_u܎+\A[Qф㒮J7Qa[m40C)"Oԟy:rL( ^yImOj/4RJIX=!SjK=u0ÑTX_<@zTC"t!l$hK&WF {۲Nc9;✼ֽ\mU7v ٴH-!  O ;HHK mdk]KfUfs"k^aȢ,r2NĎ`ݲ}R6]:2wVOLL-^%Bo1րbvV,N,,U O[#!*]if҄'a9VdoJ@A"5ߓ{xe\!9Ԍlwkcn}()CP([SWZZ %OSP*'rV$xcSkF$hCSNiORgr:M=єIgcʎSB-0+f$=:MR\2k 9&XQTuK޺EfXU1:k’\v6mE"rx `5afeRvҿ[CD 8%N+^qEA6e>9Jme#uJy9Cc_5Wug?FʽiJZ坜4,Co+&K))F8܏$tae#hY cHPkѵ~6VvIeRlg._EwcB9yKr}yxa4>_Gl_y(_{Fa53w\ `O]9<7x_( do= M; by%65;?!yR 5X3\;{@}xbHeܟQY,)^!38bmLUgGp#$TM-(҅vlV0eqF0vJeiZbㆱc>Ӻ!g4[o( (mϪ͵PZ˩btXl,:!4ΦB1^PGmx]AWSeTpɸ THN1G\>jE5 g^sR𵨺'XI 湈Z'ai j>j9^NEE8t-M>OdAKUgLPry4bf]s5Dq$q[RN@…̣TNSh»s ϜuR/sg{7rVNY±w>dlJGpgxRۣeA%Q?#rx!PK57zi>:O¸ 3ȞZ {ςĤ=;g;Z>'/D&4324vC6ԄGPZ]Ĕ5?V1XI]Řrg7\'S5RF<('64?9I't?B? ,^$BȂ} Vw0fGKFjT;d+zEcC:4e܉ߍW֠ZCOB X`dnE=Ytl@?L?Q)Kɢ^otNRXsGOӥh_HQz] aTf647qpJ陇.snD"aq-vL%x=Fej@%.jq;8qs2s+ cb⁺`ٱ],DU9|iFTE8oF/r⬂|qyo>`?u_|@l7h.'FP~Cn(;|=vn-Y%Aa8 +|NhPc{?gʧn?)IU*NٖjeccOAv_0oqO;ruG=r>EQt ØcUpspWqQ;uF5:7Kcj T}ָŕ%Bw,X}1)Wc_ƤL{! "O 8DHqN70 yZi4gw&' Z5nd Aو&~bi#g2cdf2*MKNXД&;Hi &z>{ R`?&x>b3FJsTsy-g xF'([SFDk&aDBU]6~.,mI҉bU374ACflW" IDATjm^#ݳv7|,) h ZmlSV&|H/&K'Me]Nyn ˬ; z %]4q+l-n}{9s)5iǠDjmS'bIAYzcRg*O?ade/9q2^BpVfB{c& DG1=w. ©,jɕ]`d0Aq%qcZd*rlaMbDBR;;/|oc_Tt4ѸZNW4lܲd1?=(S͈d$Ղ9cV`ДY;鞿8&KG&0Qi%7||d)??C&%˕Qz:6}aSc_Ѩ:颸]$O0o|_9>gS`;!d-3Z>dHرj9CEŧ8R6XchzLʄO*K h)9Amz3*G_"3o7;!l$9XG3e 89Ӆe9Rb7 `Ľ&p6]sg^(F\Xyd 3~<ϊl3 tޑcYxN=[>(vte8${$'Er$yKp∮'S5'~|d`"y|e^rJ1R1 MUJttI }'@(5V 厮SN"YHybiI'a,buDyv*JԾ(˝; L 3cr-YJ䞗da3g|w\h)冹vΑSkgx@K`-qSZ+KQYa`65/!;E"u~ߥ ll%SmF0|"ۆΖĞ:4#6ڝzlyɖXsVYVƐJ>ƵQ''IZwO}Oq ѕyux-2#u"h(UH?o_S5E` O( a/tjc92 ErFgމ3G<.ƸOG$qU[|3'92x|'ekj8LX-1O ~O7~O~*E E<Ua%^1rb8aGx]JSaF!sfTO3i#K&0:&=} #\و)e10EyZEjbԝfd|g\S[S} e=3=dl%7/ߝ}Ւ!+uqF.Je1Tȗ=C apJP6WnTQ|en勝DW) 8_ 2b5P.zūr<[5ܱYqHS=թSR\Arh=Ao{^Ri۱.ΕI`<)I8؜( ZӪS%VxRNt@' ~ TS፨9޿ɚYax3 /tnLhM/~}.='`/ oG|5|?Cn{\ũ4\G];u7:{8U' -bPY7}.~>*{4wO\legy`E'f8~g;>=%De/^}|7_>O?.%WKh |> }WG/xés0"4YcKSr7rw2}}dd ,Thw\&vE5@)pNTK 栙rl7pR{aۂʋ{{.'f(w]\i0;ekI25 !\U#ܓ0*ˆDI`XE9ff7l74WE8ɍa`v%v0`H[LSAFuMǩeefSVK?]K(7RB\$)=+/fRWձ$!X0/Eos aFs h'Gjт<==8?'_r+z&{dJKpY8.v#mnV폿.fa)1XiT, 噦U,Y$R-K=ia)->=kLNZ.L|Z\dv] wI)Wia;KzAkba~W }?uJ3TՉ/8j/Yϫ:'xunnԙ_C- ~\bI4NéiF'&GtNs$RU/Jâ9qςG@Zݑr1 ܐA@Peat.=¸j|Cy|b[Yf^\Y0,.y%"scr enyP'FC?gXVbwjm5 1.f|[hJJK9,E7T&Μ´`N+{&\#Y 3rZ,1YrZKˑ%Kr+\&+_$?EqC: * WKGOƅeӶ3Kݍu ;,ΛiZ,mOH(1dt:^11gE%UjN\jw{[*tțL\ۜS_¨gxfM"QNiv("w)Fn6:n#Juc-j0bOI)cNN?"/\6au{?~}>3ThOSDim#-<4K+m£ O,a_͏ˏ8}᫜BɧST>?>"_˗xvyj|-xt% ؕ7 U&-x ra_{ yǻy5 pĸdqC%"7x웰bĀS!ݟ1[41e}q!XsZrL 효b1q;N^Ϩ_YjZpt|پDa~ 33Z,3& #l1=8碜\T|pΆxp9e9-eNԄ%85483cƢJ[`_8wyW; 2+;\ }z [i 8~lo>OG?kI*VŜk~{'q>Kum$;ux <Ȇ?yzS|Λ[^R[g{jӶBlyAc JmĽ3m.QL8˂#k遌kkTr7e*/.\bjA+q_Kg.ݙck)+'xqj|͞y]N;y=흻4N37޳kJ؞6+*&qH(d=pI8`sU@̇k^ g^VruTߘ%*U`´rBTqk(NsF+=ր1 xĖ6d'ld98HT|Vx<eNơ=iF,& .לhO'+>r# @N;9LZ[/P|{gD;6&_ o~ʼK/$Jyyq]?;z43r! v{N}Z$e +\c*.C%$Ul`a=?hZ]i3taPb&@4k"drpp HRFS+B['7æ$2U):)8ޅQ2'V6VA=RZpbk7g#k[ Q__$$/D@kbΌȗ5N"F̛n#S3h='LTgF2F,ߒ9ϔqayӅx0ۆŝh#*,Cj;>)e* Jg@ӑ2 \S1* B) +.Auʕ`n$`'*B3't;(l:0tfs2p,ZtIkb,pl1E2d[2[3znNެx98eCʢs3gT"jwެ3KSQf҆1֕66咅> & 6sJ%ݰdw#>W)x%l`gEFpzڜ;mωPvN%b;oԡo(m A>Y:=2DFo =݅#ozAc{_Es }7=r^lp4k eís q4CE8b_,&~6?_IERoVp>|1[mG-̧S"nvD];'`xm;|\_NVH7F6-U_μOnN/l)K&>yyc^=b+,J"P SϜM@S q#1oK@-=Ò+'S${r%t!`I\޺= *3d#^X%LMQ2VԴ)EGEBAGf/UsG* NFNvdQL=߲MbG̲|DNS[>_}/!_WyhK^@l_^=_\F1b?䯾]O ~٫a96Dv},K3ƸgaD~0\LJy2RY "'ZIcUWʋ "641U3ZJin L z\kɂ9I{д@ɑ{Q'T1ʋ/څaA*+ˋXfT/I)YhxY0' >X㙧m}Q9 Q, 2QpzfS̿D)``[GSDT{~ áA20m0R\Xu <ߡQ2J%QIx`hyx;.ᑘ4ͭ*o3[F\q5bQx#,44P`v"GgJo> [Dܩ^Vu#buM*4&u\PeAň6P;ٍ8xvzJfy TA U899Gaɞm 7=ɃJ [cT:ĕ,œZs=TcQђ(#qƷ .ǃbtJ;BEc#u- d~?Kmu93U\)1dіuKp;ܐö Q(%DT2sN7F![Z17mq:+pߋwt_|wow f/4AP|n*;u@9?(^鞴`4:k}N*_iD^$6eYeEρ 'L{u݂O,p f.|Qhw2+#,}jҡu6iRNXBbƙEň`5Uœ_թN32׽a;o cec8YkeAd8X!yJ xţstβCjD0}Oo- 27l&7.dnXiAjp5?_T3Fn-3ڡӺάCyV$7p}^VRCthኼ}}q1@JB0e)f0؅b^豨|?(_i|D3Aƣː3l{ѝzc`um8+x*U)}|'lz2O`'D9Q **_LJJf4v:pӋS99\ KݡQ\ArL;f7i,tL,yq1 .r"9 gQf4|{; ?8?iO7_)xvc=[w?u>?dͯKSU=A6ѕ]r^^UXx#s`Ṷi|D'ƻ匥UZ %S\srŰ)77XS/fMl6Qp4r*YŃ$rS֢eL+5O=irayME)ytNwwjuk֙f^?wX1ٟb{,._`yaШ0$ UMq.QzfkR\~Ogm\Za pV6u8hX|ئ3SZ9mP] V7\7gM&{< ݘ#qɐ4'2)w gzN^[c C~j7=Y%T Tp LsGyFb 3DPHX;ӫQLkg+sݹo܂O`wHOkǏ?T+?ɗ_?S~??'>s3R$piۗIo%9G'ߦ4oHj/c<5j7%DXfYj*Jf M K&s=L'ώUD/%7a& ;7iJWm6xԽ\ik qZZDCbmGX/mlM+ihmK!nh  h3N|'m&uvʴZ  u+)S*rJUd.Vm7߻LLUcpVCdjKP*ah⬭es< kBh)Ja{oNZL,NMg\s^cu$&ߥ4ʜT8tYH[]Ƴ1;C7ġ:inD5M1$jcS0lM: ܊iXI58ʹ]#:G/0lj<해Nƚ?eRH5h,Y}#B[5J}DJ4O'QOt. ak%'N:]MK:ehy֜&D;Jq("XA>yƽqkDv%/^%\Gm\Z(W~?mawE-XUeଡ8p[%'nCy$Ƶ4SlX1EF"ۆ˘+YֱO+71oTOd5ֿ̯Wp,^OWΘ0zps?OfvՃS-(gHsƸ磑<A?OS =_,nPUɳ%Ws`bžA.>>0__Vdi؟)jg +)Tȅl#eaKN(S<0keEFim*鮘 7fELouO~y s%-/|x#8om=s?}BVnƃI0B3ym)A(Zͼsn ;t(_~4&mwzsb6'my$l*}N_"|Vr,kzZJẊc&i"H˝jsI$|'V|Ci-bqYג!`]+wXȥ""1XZ\>y^b@NS2ʨE._q/<[TsJI 96"4*L1ʔeՙʈRax"cE… 4g,^ÛKe¢9'WyF^k}w.9m-dx2F tE1`+Uܶ~4xBqKEĤ-hO1d'cLmX"w`/͠T̔)r,&T ʩ7Md PPNi]~x97/u}*%N:jOem3GˋY&kÚ\sϘf.Js %ß8g"Qlk]\M82D%"Aƾd]'*'C -M%j u5Y#{ѮEII4窶WPX9Yĭv nJ;m UCzbS,ke&^&S:ZRښM^kfrDj!I2hXsJd|Wl.<,u_Z})=NMbU0ijs"*vZMt^K>HLl?O9qoB%{Aˈw*5cpzCI (8Lijf&̙Bs9U6x{܈ԙ"-d,B%Ώub&ɽ|omwS :EKks+\|I,WnrQ0 Yc7Eq!ܼ;kBn{{=77#5YsnJ0_=y[f1;.TjOa'LJ<7ܻ5}~ų/.&,%tن#NΘ=ȧb֠Gw0nFC:});3,Hk*Y%?b=^iK/QNM { h*K@6nMH \ Lbo7Mtkmw +(aXnařҗOyxFZG|].xNX?Ɵw~ᅾ`2%`ޅeܬA/|ۅ+ZM5 1h1yjN_;,^c9dR%EVJ I,Z|Rc rO`¸mLV/Z\Q5n0õlVpw95Zi|M$H~Y99I>Lq(AU/>Q{jtڄXlIs[2a܇8+7uǥJ:˒fF5Ql6ha2O XeASщǎTI.Ta&~I7NrHަڥ;EKpo7Ⱥq: rMf3R̠XհHm"ZlyC%fss5ISSCZ+zlD] \jk2h$6'fK?ߛ 9 !ɮJgE cH68:Єv6<$mX2 %c>7<$(h;7\wہ06p!Ɓgs6 (K FMN3Te.C[S Nf024h8aaX{ɏӞ97WCZK^eJn0x+/N#P/=];Fm)A36㸃VIeIAoqQ mnx^L]x羒d {-nQ3[%ay:H!܎ls b 4Y0lSOkm3RPn.*4>5s5M2ܚ䂬`EO}w[Z!W㚍!;BȫΟ??_7?)Owa3N?8I3» ·\t6n<)=:&VT7ޯƳ9wSkhsiz^ x(H28КƮN:dܷa-,Xyj>^ c; .+ǐjv-Q\yuk܇ӽaFco t5l͝+k.>i>^-ՙAS.=גfɝ_-r7.MCmH|nȷ1lnCcD -Jސ4&<6PʻjЂR~:x-HBw*z4VA9C.'TR4 .:$8-z~4',xpՁ7[g+&ACfkIQxWWO._q]/El8߆=(_fDE]8BV)k&$єQV9O&A;_OZم Rn Vy_?K<·yA~Ň/~_y]/gk||}D"m0=u%Ӎԗj\syv ab׺S9SzsE҄f$IOhch>6AF6u냫?٨sQZR5#e]ptxuu&ő3k.{;֖]ѴƤ1 _%mg<բU\4{zuEq6eG^6۩8'/}3ClS|,M1 wHy ڒZ?Tσpa̪57N+9 /?/2J kK(mlO|`OsK1c;'U`5뚲CMWP&+|x}\iRjFN@RKpgú86.7-k1Wp x?m2v (4c2ݩ0ft)WK~jK÷dk1e hA[M%76LtwŝO':?S#uɌMw&y\o o8,yz[h)dƛI.&'.dB$fѡQɦ\8 h˝z+)JFԡ{k ^ˁW^vr"h6,x %@Lai;R3hy8[>cWMP41N&}tOҔ/3$cVvyI?u=&|T:2_`B,5W v`b ߕiUf G"g껙s,D,2^\9Lfݙ6RCHgIØF#\.ArhhQfmsdg͂pi1l&Z1 . rVFrDݩwr^Gﺳ$9XJ< gy1]EÍI45ե4*BLk"CH CCPђuAc\ϝWk>Jߍ!z/57GԒD!8ǎ6$< r]At<&CL3G)jԜJ,56LQ[WN[X=d{Fqo蹽bѡ퍂0kG6 ',Vw.<)BfZ}ԋ)ƀUi=rdli."^" /V\}.3:{fwUm&49ێ\o^ENI brB;/0BU%(Czje6GJ|7m d$SRy}vixH!Cd]3iNs\IYARozN阳vB`>`/2n:Ô$KD^Hy qאA>{8$·l[e;6SStQ$\7oE v4hb]*KǨ`F3V}oQ6+[7LCD7 ]ՆC"1)cX=q@fwnQSR ̗sܕp`]t9N6m9G%m\ `ޕө +mI%l1>Ij&] $im7XxG̵1rIommH2"wXxk\-u?1s`;ׁʃ^ΘhL9x"=% }ύgp=c=s6Lp׃مܸy'wu+|]w3ԙT^G37週\j؋׊2խdv8(.:֌f!eK+L"CFxar {=~{|T#0t.9v'Fü;p\&'^EWn#ŕBSI^c;c:wN̆!%X ;x38> ӋC M2Z]&@ڥLvѦ2ߥ!/n =8moa%%*"i-撙, K!Tr;Sf vaEEBE\O 2C+Z59s{<aKOf |یٱuLNgB aZs-`Nz3 ۍzAY҇(`Mk#hL[ɒui$[1z RS*^۩#41^Zχ-f-Uԥ7?kZaK,Acn[_8blkZ?OElGdqi)Z=9{06{nm9)Ts|g IXbن6ܷLƜ6 $On]( 4,l!ZRdF-.u^uvĻkXk?nȘ6/UЭl2 V/'iXKjl˂GSUִ& `AEM%pV!sbUAIT`8'!B[qě4m|`GhsAIu7m: QpFX¨DӬQs`.҃~ȯ鴩ƢK.Jڡ:/|ghvcxPGw̛l3վ8nÝ#XRћ2`≗x\дĒϪB^]!,=0Qx0mDȤ}r3*&&g*~Ꮄ&J4*d")Lu1W:`٧<ſ-~yZijx]n%<1"ÊC?A!h2gpKٿ>TBC "U*5 R@C>J,.l^Afs*9}J?mGShWcE⮺&N–3J;Rt;x"G^̙ !;|$w`g^RkC[\HRV'1BU83y801X^)n熶cX$p6ɯe]Op(~'ݜ25Y wPc*Qh9vg8&X;ix:tD:=qicNΑ)_ 'uxbOźkh⳼('B4uqwg;&Ib)dt)5 ;7٢Y2QGKC2#a5zw94J&JOe+4r`JbVۭ^jVO3ܑGJ[of& ~v|Dj!9woeDWrhģp2o$BFڳhMx_7PMxudެJ͵ ԻPX%3^qk\ޙH:SIB8"04DH,<;bu딡yf!Z 1[Lo\MMpAkƪCf4WvCn-J{V;7~Ew~ JIĜ *繊FbP@9E^YAdb[L5*5Ď/cnΡg,NsF#8ȩ «_|~=$^rJ3RVbЪ0 ́J \"|Fr7fxMZxf KNjUjeovǧaILX??+q)g6.,tVK\NEK%&tZz2Z߂ oP4+il)%\iAECF^17$tl8ҁZ0rѧaXҸ_E=Ey\40 {$siujXj9>N]+9 _zQ^KزDiĦĥv|j|6^L_H7%j`|/)VފTl\D0!}w z_\mq.9v_k<4u^l!!ىѵ޴cq=GK))%HbI[E8T,`$Vث`!:´NU;'JF>XjLI9lc bz4Xi4چYoE"t Y[&1Kuz?[VjL2rB%[*Z\umd9c:A6 \gHXҖZIP Iߦ ]0;>T*6'&h 1&*4k܁)^)+(1|c&wlje)cIA&{B ɶCwx)mj:;,QD|ljzu55儷ɼ4!/ J[# njZ w(vS+ٵMWlйiDWxwt7oRYɯso~[vìDH|%Os>(*O.|jC6YW2ң As6c7䢇0LV@힆n1s #˩XumY.mz7m}ĭ跓Z;.b۴2mjLVj4{Һ =f2yJk6(}\hCz[6 )=B26$X KO? ҟ_ ScpDrlTLz6g~.!emz,Y4=dV/VZ)--PUyNiai ;q2}G#io$[!A{Asyhʽ&qy2׿Gae( m;ViƲ`2uCsOOV.vudV:J ڤ5]^kH wjrQ= ^i߷Xl7ne`٬#K $,Vx{6FtwvLNVg*CQ&͂2H*M_IKAW% я)9A:+} qiuGYy#s#sE9$d'Jl)0]Uޝ%FKwWc\3m2.Wudmy̫?BwhA6gd=.2;sՕRI7?cEn^W2eYcKws|a̬ȉRN2'4p1}Aɫ6 pqr-)-%c.-|X)z^%Pg⒛.F:tg zL ]l>o[ǬRBm=U9'}jUŭS݊$/{-cѾ֜nGϽV?ݶ“ҦnTB T=QaԒE4WY>K^nmeKΘڞd}?ۢY Qy`'46 Hku͢ܗu-.#݇@O-N+,µXO7Qc(^kB7YV%`Eәk6Ӳ&5X;"I>3ώRtraܔ8^VԲV9}(!fQ@;%X̜ȪyRPM. |5C:MwvP/ˊV*赽]!]k#wD&ա{}eyp[l+6[NVыZ}2g6i몢W*E}V`EYls㽤 A%V&m %\+??xay#=d MpmL]HwBKaؓy <츈^7?$ qNw'톇q,g#WGGg̛۔*{մ,֚·dfgaSn/P8)Y;kK`#qCV/fj;e޲i{r G({i1)$n8tn™0T+R8*-uKNE VƦup:RbLKJi |dEPdѳykeADM[RL/=z}s|VHf+Za-Qj2VLDirO,Y%ucUjUzGrK.foց{ j5+ ZѴ>$xz_V93sLSrA.J%GETb NuU2Ѫ0_*AN ȅ`(nBUGZÔ/dH=e_ @ST\S[Qg N:hGWkJ~=}qߥœFTOEer5woB#%vft6 !R%OS[+ˎ6^VfDRj3E}fGeP9#Q:BGM^N"w`OIMƏz؞T$*3vDS:"A[ K֪]j}]٭<|g'ҰyϽ)YF]ιC.Ľ+5ZH-rLn/xACVQW01܂"Z.+cNO*;lp_LB*s0[{X! *kV%ߺgTK7`EH IDATev[B"rJVp"&*41v~1 g,:5X,{}$#A[4Tx,R`VaDc=f*㒝U\rYׇ?QXمg=A[ŖBh Q^uҷ}S5@r6X?W<o[Weew6뒺 :-[IDڊڡD*?[y)eh]ZF/ĞӰ-:Y6:i^ǝkSZW̅!sefz>α8nXwɺ!Z嫾/mL6dӴ-ЛL/FH|ų1da|ŰdJ2H^ku"xe=W&ozS/7_*dqQZt'K)N8$Z=H+84"V/fhY%&1<.\s |sx25gVSVpZpFriᓗ$6hٔ' +M̲K3LJ*-cФqI~j56o#|r£tUv,Ia>+I;P'L׳& nYeuEExI X繒x1;4k*QHBtM(sOӛTn-gȋ gv.RJ҅r%ĭ}>KV;7ݐ>k^brF4, V񎧓]96NƩ.MX㐤bfMoI{ _ ?=7AVX?ua~ap+j }= l5je8 :@vugMfJ Xa_뮃)g,^)9EXq4!Y-KQQMHɺ٩ W$kZ &SbZNzǧ:kDuHG^9QZahqlT:0e'׃oZH#)!Rƚ fȖPZ6xF4*6׌ʀ|Iq0lt'ǂ0 TYUa&(ԃN t(v><='Ϩl*Ν%x ys1 sUtRt"xK {; U؎floӈH|^*Q]ۑӝ%*Q$4_4|S\uyz5J aLwI*6kEMiʻ /-RVi"JceQSY`+fwVF,LL>unni(4g. ŎOOc r V2?ekr5 lHDѭ5r ^MZH Ī$*!H1y,JCjo4$nb3}u;MQEbV[Nq&ͤOFCk;S@chcG` jwmsl--nPRywvzr0"w.g~Ee䎠5eFۓ)_bXBoFQ*D>ZEk(¯ )ء4+M᥋&s{2Yvk!wmT6u ٌ/DZ,^żiV!N&\R"۞מkRG4^ ݊ۧH35@N"䶚}da*m* tǏkD{y,LӞ{څ frCVV,% űSӥ.1n$P࣢ R@IY",I 2dEJ#rUu[*)(Tn7=/ޱlfʛ^g\>Q՟"EzTe3RԓDe7 lm!>!l g3c Ք$RheYVWD#Fxr xug@)|4heQ*WD\.ۀZM+k}T;j 0!,El"U.Ɇe]t5 Tߗ{4e\? ъ I֔.~&5yWeVjiW)sH9+[^$s?7 P^fĽRSv-o}_\v@si̸ؑ}ɯlYhE䠑7G*(UR,;&n1AEM7{}97M:*gѱv.jmz,Op<:՜dgp]"؇AXt*̛P98|!qg0PT Kؚ\OLWV^,#0Bպ;A{]7mV4GN(׋> dJ_3e!G'ś >_ ƝG>}cyc W2rM ֜.Y|䑝QsR:9zQyr< yJe|ʰDC|Fd*detiODJgjֳSyαK֭^z{BZDVVً@jL/ `f;+j&\@d 0aĚos5_- "u XbtO\ |miQCKpV^Şʲk`Cx€:]Mް63 PG5mte ytV󍇠ﰴC7ކG lzlaj=+Ƭ>C 3t8QyFZOl-3gƸ+{E-=&8y a~Ʋ)墿W]vcѶEW^ >.4y]˃e#;?!JL&mg#6˄dT;J]b8 S:U8bCE팔ʓUF739Sk*d˟Y߃V)Z?JA(P밭N!bFm&jdiaK(Q&xUg\Ѵtu'X{E"|+*7sMꍌ,:X]"ǬH~VhEՒnTJ뫻Z!ܗi2 f`sSځZ~jsb{_uhE؍MQ-hxP/{A tD9iI׎]+6jkQH's 7@eSNV^=9J͎ki(F٫U2X߱1^PTKw}-Z?YYԈ R'B7݅Xd){OVe8깕uU{.N[87Nyge= Apݰ2^<\sdOs[8o4V^lbM*;M\'YOFB̋/rӹ~HZtnD$3& _R*RjPRj"FFv]BנƵc# aL N12Ĝ!u>'lU:$;kb(8=mTvG0s@ |rz9\*VEL*>KQ[clb=rlxӕcHD*CnNHKN+?l'OQѶ$m]*<] veggmaoty__חXV fqIХW<-x8: TLЮ5٘ jA"䢽e[1] Wcrro6Lzk]hέhe<y7$ՔֲUs/_K k)n3@zZ[w:r 8wBm1U/t=hO_ zNc< Gфx= GMYr2B81Mћ .7ں( ]hjڑcv $aμk gKq,8ߣ}n'׿gQ УUFN-:~o]ƦMgG5>9N*G^5᝗X?ysgYVн_ NNT~)> Ol(/ZGPPc9mo`!w4;+wNTiL6{Ck7ker>|U(fEƎhʔ2j+.d286C8eV$ XFUmSP OcAl%X F*U@DrJj*Fe1#'ȬlkdoN<<>?$wv5-X%l*,+'/VcM*.\ )of'֧Ld6$w;ձ=ݡs IDATO<mU~~f.8lV4l:x1hi%(ys%P)VpFEw02ck}CW}2I.5o߸?`dpdo hۈdr^ہђXq]Ev)0Qoj;Un:%7*.Eǹxs}*+̸ܽkdY?, .coB}~=WEy]x}YZ`r)LBB9Hg9r+FiU'S S.!I:p. jp eI]V4,鴐ʄƓu<؛&˓ /2Lg878vKvMxΩ|huSybrq1 >ƢߋLůy|T Rǚ.h^~]9aN2˓A?L/Ɨzs!z)ReeF>+ymӑKq#5Y2*^[uWcg{&g:ns4ۭb![~+FLg݄.C%)U$wX/K:܉&jUBshf*ʻjI39ixay,tx;;J׎??Ǘ* 덶A& `{Inނ5̅ g|<6ۙ'hʇ'g(/beI'>brp -s[k|Vtqsj|O1۪3x.70Rbr\ 'kΘoλ|hƓc\(}z@B8hNj#t >\Chh\&)ʒ냜wL&|m\hgY4q1CЫ 5#%dV<hFXjp˃wAmZ݂(}&/:8tŊVe Kn9=fE )ei[oTD;64UW ָ<f~*K-[פFn{;w('3IE6UB5𺬆AO:xܮ:ka2̭6A6L:G8)m](eX4kݷ5}ͫ]:']^AGc`*a/v]j"WCNa*y-p\>KmfS_ؼwS${?9z=0"F*P.ժ>ƝMDM ֯*8m0JEXnxmK6*HJ+.hKK /MkF6^4ST{ H&4BقqH4AƩlFDAh`gb`0lTff4~bMpNR]M2iGZ{gF?03NkUE=hNډ__8r6oo{{Oq1x;sq+68o_O_~7o7rw"spXλ;9޾֌w@/z@ z/oE߽ÔxGwo_1~|'v4l4:v~yK1i<p}NsWwkbjho[ qoq#K@'9\ݑ !\92Ň)-S>rrٙQDbmU/GJNo2>5/bAhނ_EǰR*L )=D^["4 c75MvշJe UmnNolCdw\0'YF5E=%WnnUwQ;r/ ID/w%埒Nh7csQLpJ#BSE^V!Zu9(X zk'w+[ڬ~$Դ[Κ1*KNԠC+fTkAJ$[(Y^'V1r,hrc#nzvTꀠQYbxa>}U!^VlφmyQil܋4xmY{XLBXV7-&Rd]r!ƵvU\!~}Ow,}!iy5N:AdDpSWE\H[i{RmE*:T̏h+j>9k#-qkQbZ@EI } WHt'Dn!]v;-Ҙ|"2&.e$Ż-<4#>۔SQ.} YJf`c5 JD, nj7Ep ͂ B)1\ѷ33sΫ4It#džstO*ɸ@gy|ǪP}Vʰ,7\gey܀Y`y^v)^퓧bvVʌ$/|VܧR@#;y0ExI/<&Nsݤv,zJRu%+"3qWG04уG.]@T1]ZNSGKÒYI=cAb2@| 9+[ɇվ^.hD\sJP2&.edk|2Hx2@$HH)88W)aʤF>DIVޅ,W##DS<|"4^QxU i͇쉸d)3%Oť|f$aBS0R-_&':>dvBS"EdId 96BZ ܉8}4IL(%'uL%NHC7ȉ`s|톞YٜzUNƜFnۙJo^xl?q`,;9 KT[Pf0Lg~d,-;̓ HzF0r+Ѧ匋ܖ}aԳ!|wePy`D$ZȤT%dP(2352Wd0hHe,JX.dڣ-r 1X낄i\'+דk˶WOte#)ebNAHaW {\p,2]a5Gbzqw+G1,6n9}-@#Uɬ`}gj+mMNc”yLL޽(9y~Xa%q Pji飞2XƨW}ʐr0Fق8䄛GݱԶ X1TŹ"5x`]:n,}e[u/#cBSqsjjY>[v M'o2ru3s$_ 5`QX2pN1՛8r ف&ig(-_*!]Ӆant~e,N޹B+>uIRbϵI|0dYЛʌBY'} 4õpNlӍ'핥9es_ՕrY;O0 \-9WOօox' lepY^>Sўo!yWB5Mbw7.β\yzo{-Qk~4З>^VO<ʗo.P|y+TUj{B>kPO'SW8PvHMOدw8*\x 碓W;<|rl= "+$^ ~0 `31-zdF Sfii`(A=rckvc["P+KdJoN@UOsUv<EGD,ln>~z~;9 iejfg 7Bk>$j vM",<'HZ, x\9C@l`&60hb !Ccm;3V:іA7c(ca؁%?GXT!v1?d\16vi6j͟).u*26-1E rwNd~&=jyW%H*<zmD(y=?Hikǧ&'ejB|?ad~MZ?usd{v멠\fqMTOSX8c#Na*߾tMg Vy@|)!ecF~5ru{U֚ ѻ\'N+E/Pe#bUDgy2;e~ߗ7LِkcqJ Mڢ;,Zv|۟>G_؅oH9(/z[ auܹ~k:/|Ȼu#ׅo82V~q7>m/xagx⷟D71O\WHl7;(oY&}c=F'n5quq_mhD||tp waO<o;cr,[P?sECC -&=H=ઘ^B M藉-'I+^jT92R m7A0_e,=Udة=& hN!S$?#),.Lݓ2 TH\RND[x2}4 ϵi1 WK>6S@ʙ+-=c!z1c8Mkϥ ~ܙmd+hý's5!G V܅YqST\9N!dbV +⹂w2|G^;C "gqP,zgj(N ~r2O,<V$z<΃bcwrxgUΒJpTBn|ⶠ2:&F,;#UL袃JScSLSzkoֱPM`IyV!;̳AB?&b]δ6kU]<WJT5CKj>쳢j9VJܘ'wg[a-;;E4Fr Rg`%G~"AFe;Hr*YZ>B-kl1NirBs:)3GSFVNfSNHxõoeYs AGb̖3ED|9T~n6vUb^z>d{UsndA\ yxF,p-BkqAe"[ri08mfhxJm]ѱEV.<83UX2&WR&|¶L D0^:oxN_m2~啭`m郥ø^eu1'0>x=޸ ~Ƿ/+/3OT~:~VY*~!߃m{l+~t{bvԅoynʽ?oゎ7 !S_6~w}ޱSib_޸W7VtVp{@ՃlzGlP ےc%7&Z `ih#2rg FJ`wc, wj S(0OF3l*CshroG[41 @}a!zN^ ٘VFV)4Y1ԞqtjgY@zMs՜ֽs*{DݨPz+cZ*Nxt: y V8= IDAT²L^ǃ-U#1PW1+5Q0DžVY1GGG>fQlc(myp슮 ي5D~="3sJ=jlP#a,L5M'1*#T=e۸;Ί)yh@<9s)jk:TY!pq֕!{Ǹz].%׳2Q6b*T5eRF?:G ӆ́C"$s皫'GCZn \3L]i+&8=<K8Q1ȑܟ&]G4Qy/IKNeX%eMny02IhB񚖟Ȝex.o9q,*[p5򞾽zN1b̨z^NGVC̃O#Jf#Dþ y^Z""9y0* 1f#\uz_d5!$+Fׅy l)Zh]84E*.>4`TVSkZ*?6w|wl|Oy<_Ѳ}7ۃh%9(3ּLցZBJ881b1oHz?xNC%ЄyA8'Mw9;V#t󂖍 :5j~*xXhw2k0beQG;MQh(3z$8Yqbtfٹ7|neMv~3>gѸpDLO%_zʿ74$,q'h4kǺa.7n¿y|S_ٝ1yʺ~a-޸bg!;?(icaM .ƨ]>smaۿ/0+3@ePcre#(a}L i:Q<2rSz!R1) v SOIp(ĸ*k RC}AT'GuǷӼd``tdx$P tk }zx ΢`Y!9O:2ß`)ЪQ.Ms&6oH^݃`bENjBC-B{5E$&3?CkY58Az_E9I^fFg.7cv2OYHƈh^;] 7ɒju$V dW@=CR!>&'+E")̒tggqƬiSɋJK"عǂz+vZ+4v6|*;\8F׋[S J8)/U?o ᗀO߿7߾ж)Q *WV3W3>yccsP"N4-eEBʟsg^1( Xf\OYAKi+jpGeGB΢v;3؜ey,c, ofPV'zt# "˜'5i!zQKs6,nYg$PA֐C`u@,BI\N cgZwZuƞϱJe39KxfE5AS W&w4 OWdD1j(qq(alks[7.!L`b mXDo4y#|>vz`$gKplwd(7 F/;+q d^˜JAr(/$[G ̌j5b.vpss#r1q;plT-9+]OOᴮxIqt\T%`Y$s)-H$Q9WpM>G2ڵ2L0MU[.űOe XD*5Ͷ> 6Q$Jz4I(֨O7 (۲pY ϭbGfD}O7*/%ؿ;O?7'Ar,Ov箓dD|[.[f6(OVn192yD) 9a)NWWs⸹sV,Wcy]yDoF卣 /Jomvλ:oE;ެ`J<>;o#oo\?_7)Zi+Q&uG]sRSո gw>,Gt6X@ Ff&Nx%5`Z>PLKRY4:#EPlv̌T8b9=F/&H͞Sl9uE5 Yv8B9EƘ!-g*!Na,JrFlV4$t> L\u>eԄ9 sޮ-۠\<5g^<DvZn(y_HÔLIdCDO[LSu04[qmyG/A Lmn4컠%9s}Bp=UW'@c"tY0[BJF,yTq8\jlT.A;R, ʼnpdI:p_Y/,κ]NVH-lLAx"Bmo0JA7/嵼kơ\Zg%7}ۤg*e柕f ۝dr,LiuGa(i[Yy\+6ՄcMbqd&hjAq{j`N3;L b:VsaTm^١x&r4zs:khzfHn^q7*7ȒE?/&d0Hl-J9aM0t*{wL4ÃEaGg9[ w&?.t80EzW1͹rKu \.P8RkC'V.Gos)=OGz[\p?1cEV_ ~KAt\NGM`Wfu.߾7lraՍb-6c\=mϯ+0:\oGщxYRy^AfW~-}~\ʃO0 '>y؜O^Da^f 8V4a|rO7qeK>>rt hGN9gzF{CvX6ӀRp'sK s!SAgU2Uayt: .6U2b5Mkޝ+cT*zza;ҔcN\{CD+=Y2$ӹ]z\Zp@iv,mn:B:'$/#m&="qa^RxnFe2lHG|IN*rZSscxCcO'EfAGhRKI<II~yLŃYt>kFtdNksp dL:=c6x0kLF~781Z-))F[Eq34'osӰ5] #yf/b2|҄,$p4"mr|jG@I,Tŵ*Oו!O*{*?~gy=rZNJoL+wvgYf]wj-mʡ,}?:Y)sSG25<"X84{,K+(llVZJ%؎mk-㚗>aeLSNJxk6I_=gyڀcY@% r2nKgf0A9,] MNŻsPSL #K Tێ TŔm01Jz1̌q.iR;ZzRatZ2u W+BcnSQzñM$"FtǞH1vl8].>(O_w*}'2߮,o/,/)/o/?~ÿo߿ȑXw,?Q} J}\#ʍw< 5g6NJMނz:r`u𒑒Q-A{9/ \;Ԇs;r\#G7؋ҮZџ@tPߠ3Rve˃KlW<Ҋ&?+KW9O-pri!, 7Be%x+As!A')Ђ^rcN`o&|Fv +N-+xmSܭ𤕻|׊xe;ޘmɸDz"US")C(&x:X30L8qr$ ÉSXDG6ғo /-#M6lL%sQ`6Kv40϶hņ`[`wYNڭ̕"˩J=yzS 5: ݑmRKH|52)[$cu ѣJr=0f&xz:tÿZ&KߵKJ{D(GAy;7s 'BaA cᯱ?lMC02qM)C)<8v2:c+ ٞm9!?1Y@]-˲gyYk9ykM7Ш1 @"_cGp| 0@!is{5Ʈrחʬ<{9x}^b2/8Z45#--#`ڑ #;7RlTi2MLK=3ZE-rVa2E`x1{+0.H1Ga/fDpu>Zta]`+gR1iʔ*Ɲ&4稱jZ;MىrMS v535!yeڡefN T?q;8T>t#x5S |>&(^yvkK0_M 'z#|?'_5^}O/7`&͝[';wdSN~0M,.eiɳ3emy\2  L_boRLIcpMQ=3#`Y"MP6-cY0~qC6^ ۴g?gΓnLed z8ɭTFsєcJIIΑ@.\&c3P@{Gr&[*Jh;J0ˑit3m4+$J.*E53'K ŒԌYcjl†wE Q4㙓˕fUU´qwǑΌ9M+$gJn M`*FV2ŋd]X[$3fRu&2"6O_N&4-Y8zFpʍI2(KM=rZE2XRʠK@x>vp L֙nNRMq)KƤ} #e H:N2 '#W XsI [⍃9cD٩6Ól[$m K{Ĺ4vْL eS̲ Z+ X%t-|O2+[}uqzyr`q c|_w[kq>63)7 Zo )|p5fG?)WSck#YpW"ٻlw e@Oy6 P[\Z6H8#gX#"hˊ >BJ ky=*d1*I`!䘊)V7H|aywܑZT `Ee8ˡ B~ѩOi\y!ɉ2 h3TȉBwmH VJ@֘׷ceZ1|uz(b-K s̻@L{[͌c9S1O<:26|Q5R!rͱ)h oIYVf @fN,)qNH2U) tep,JS 8e)أaKX?82B,2\񥪖ؒF0BiƱZue t0gJzSYf19(ICiXjI2@Rۊ)Lq4a߿]0Zyb(ug*rwc:J+ZqtpPʉGzf|7<}8~?}~\=}_xx悌+RFWqU+/yc^?S~w>/n0dىHR1,kJA0B l7{^|}/~|?G_ ^|g3Y2x>5 c ܂]-DfE_TeGز9/3wrH5Ɩ9Ja+ձf=O2f=zOo|sFtxJ鰅L@D ;G;+j- 5[,:CN!%b&3CH%sjDI"Xjm R4$M 8sh;ik~61Jbv.z$E.ry\DPmJ6~z ˜j+J'yOT23$ӳhFlf4 ivjV1a.ќ\u4Z.@%!e Ɣ$b PMч' f (h]Y^3sȏ|)hK6;a \6yVuc g,Ds|eL+x?Pgc (Ȋ:NC뉃:ng<-LNdXƄauw+*ה]PJ/Uq&?68Q.ggңR5 Pˎ]k<!5F6u`=,L!NP 14墙=FmLZG2R҆p2 .1 L  K(,J[m0tn! Ōy5)uLl:sFg] [311;wz ^49杜 VV5R1}MP5H9̥v\(F+]kw;Zზ![tg6IzMBRlDrc+KoP*~mYhh$x)4N?z(M߼;ّ3]g! T!Vl1 Ʀ(8Bз-Xf)hzPN6CZ.H#pd˪fdPc+=3#J|;:*+0=!ЃZ@'/3NU~AJÉz-V.ӱFi\I3!q#9ы셦S0GSadZ!kEWo8BK%W׸R=@7VLK.Azc)}suluHǂ\9IgjHywě?=w?x )mo߼wܞV<{5WG^GhBFP!7{gMJFqܞ7n|/_wϿ|uxʸL^ \&r9PBxdaAi1ʼn)H>t\mH5O'QO}-`( ;#LWR)q{_o|^1Iʌx%+}lP.f)QP=a^+iW)(Z&J5(5S’kajhOc:g7423ɍ蒘jUh$^Y(פtqby#PX=3sW[ّιu_-ޜc_q}d r]ofhJ0h6 ܮiV(#ZxlGآ0Il809/ʯLB ]'lh'e"KϭۆiE9آ6"@MHXz|8GF̉eterj8/|2J٠̡|UX VhLEzPdSoTvb-ykw2~LvSt}C$yhlƮt|y2s+t2S[I93R& uO*+cyl/+{p3~ eSTFm{8`_LlU1MRu]0^0<7]%ϔp/)F$Лbc^G;80sKHt?臟pKoX?_9t$9#f N}( zҎĻ{ qꊷX^oK wTTL?ckZ:QzϡWm:)%mb w:X HyeOݳGnl ق8ib7a,+% =x۶ 1sq4fI]QəlE:̍IfX$MrIZ-y7&Z—B5Guз01wzL=(OyƾW#Bk'u`]sL{}_Sgl Bb8eXF7rO{pvN Dwq3)ǻYC|wʍ(L.~O;Ll)SҞtGM)mCyW7gԒxWëU^g`Į\qNonWCI0 P$51Rbr#ׂ9_Fb-mhiCZCwp鴭g?h|??//QbCz_K!j,&Tٸkl]̘kL8JϜyJcV>?39)5c?׿|O{68ٌ&zZ֊̓qҼ\~$loQQfz4C'5y`.q'*sv.֕6`FڄclhsfT,Ԟkxŋs%rC( 0+(vy^ PSC5jʬ !B6Hi,Jhg ZI lVE{,8\J.;ߵU!*BPn5[L:@)}cɑ2s%;*Ed@Ql^'Tzn 0QRo}Nl0]gfìOuKs%/F]1;Z`ܚQrw ;kpFtӔxTiuA2`GʄnG|7zCʰz估{Ҩ 4xux*d,3ݎCyN6l^B6L(f#Ƌx l{ 0I8`-!}ai8iwn쐫^w >w_<ƛG gɧn >0FX=.d~$[}1X7}TQ3j[lUI!AQ &Z|$"1 9᩵N30L˥-66c#(;+]"fȭ\lxu&ٕ+'/: >IKFaȨ@C9VA,Gd'g.nL,]8 KcXaLNiF9墫ѳ&k$[kS]em%r%%EBT#U3G_o){GkDC兇9a >̶5R:k,matZ;{Ml`*00 $Σj+l9,QA/qux$5)p)VۀdQt]QgUF 3Ɉ\h*,8.[=)Y$c)]"[(?SȪ1Xeai8)ʰHf8;,&H=eUai&4MaIR gw^J$#Wc] h>(o< gqrnvǻ=~. wUL'5O5>я~ o߆+Y!S0art_'ss^]Q®>c~q8uG_vܲ=sz}xÙfl1 [ ǂ/+p>}k|_~c>o??&O A~81}U^y"iړPُt Q%P\Y^_3O5oFqܷn\ymHS΍3?s|Dxbk0dNxHg7,)p/y Iɔa͎B5)V STdK]a٣裣4NjdPI9L;i8tºer6se@mpalۆx9>R*2l"t%c'CctI^| BMQPLc SHdg$l;ǤFn)^,BQ:GЇ`=GKf-{yz`g]9hA=,+_'\M;CJr-H=;bU/QxWWBLat诗.t(.gN* od= Yʠs=1YX4t*}\ lJ1*>$İt,m2ΔH6䒙J1"IlE ,K<\[HxqcȄ\V0z V0t63$iD3% +/ NhLӳ͌)̿w8#͜]xVg.Cpvd37肤"lJUC qf˙22o7gNʬ¶a`=s*Q'6>2G#{H^٥[NIƃ 6n#O >w15ȅeݧ7}Ƴ<{>jyJy2wSn'L WiEVYG[q<=|5|<|ۇ#wz#]Λ;o}wѿW'%?!? 42Ơ&nP;25l:x}?H{𡜷FΌ4c8-5س<'֔x%LnWnUG~|g9WWk<O3cЧ)33L}4ƢF.1 qWzI6XN*fYJÇK ]VY Μc:0eHXbOFbʏ.8$4F5"GdRJʗCnRuX2<& #2.:ԃ0l%1'pI{zb:Mf32-Y ņꎤBO*'hD>d圫:K.)ӾbT*s)WRyPi ŋ9s}7*Î 9i~ٮrB9 >%͏OkgaxiN|Y^݄y -&oN _gyF3RYIoǛ?N|$e>|ly6,*.d84\=;0c4&ggӦW;q7v,Bgf:/יz}*{a)\ë[E<ߝ?a~GIO>? fgdט"G.va]buݲgy↓>:e2eebX(HiDHҠBA4=` ") ADsqc-uOչZ˜s ;NoXjnu_>oe,"Q23W.tx <w{q}#M~#{Kg+6ѻ<__ 3?ɏ>aނ^n)q Ğ,DkCp .YtY2r0g8 /#3xLֈx \ˉj脵?87=27Xs^ow1?|)Ќ~D^6juC.5GbTȪy ],֏yc0$!oړ(:6DFё*{S<<^:a ^(\m+S՝2^3CU.AW#( mZd usDyDCj;1JԃMOwu6-ԅ*X=̉ 5+)-t(utv$`=*t^FDB(h3u޽Jb DFudo.h;if<̝AgW8輖O@, @ !xvRNyb< ãʱ:%^9&EODF ~zsȬGtؘ-#әqNJ͉'2"3y"?6rMȸo&20űmE:v=SO}՟fzu)>,?ԛ~CS8JʲwwΏyc"|з:mBO3Ԇ<Μ9*'73/y_oۇ|v^| Dћ^-kƪ}L+!~Bf 댫2 B|d:BE:Џ u1R2Ĩ[yRF[AGX$4;X*( Յ:c 6 VI?#3'>4-TT"TrVac>=Sxڊib˂$v~oU4fVܡeh53׾5j@G-[5;C4֙sLj6ȡQ=[TV6:[Zxiδ?x( 6Ǿ!MbT2>*eU;>&$XK\yOn>{q%`A#&Z !T)ll5aD!tLG. VA*2&{ھ#Xĥ'r;HanJhAZ"ޫZqi m!PCV089yG & C$^2aQX1KINlfFZGĸ e܍G1psx[L['7カpݜ,r?*_W~ {!^gxGko~0BxL{p4^Sk3%B7ȶGf#o99b>*>lwz?[|xٳ;kwXC ϴ4~ JbC^z@R&QZj,XDPvnvz{$e#0Ԙ3r3$$T͊I;@{U P };+HYP1aTD-DD'R*mbW<NL!L`1Lt(x뿊|RUx!?3Oi~O4?o~M7@@ɥ2ƀwE5!=,B.]XfQp1c3ogGO|?'}/p[< +;^|,Hy5 K^;ӫ6yD (lܐXYXQ5*ˉ'u$kdS4S+\pg@Y{7:^*s?3?ƫtbїԻ+ea}Qx<}u"f3ce[O;k5샙e}-:%B3J =tIBx841# !NB"hY!a4OW$wSm&z?˴+JYs:#Hfo }X87޳a*e$$RNi.;.y {H`Q2s[S[IȔ8H@s&Jף#2SW4O'|xvzĐܜܾ:q:W8Οy GGO΄7nyct>>nzHu@9&⩢x#`'ەtNNHp'"d ǘ1(ę8ꑢ0z] *'!(є=91hT~A^ Km$?e9 K_?OXn4֜xw_!Et@}C"ͭuidKCl((P[! ~-pᕯorڟ{)D k3|A­AjS!قWp<BCYl*hl'P-:'C5,'G6j(Z bD4Rpbh:6; NJƌ[-#JKwUIjЫqi[WO ԓ벡&hH# 瘘 cѼ:ే"kNҎ8ɜO*Лϟfk!JE{={TE4(QK$ }5#4O?PۄMz8S@2c6 Bn!U-Sc#Lj!Sꁔo31ĺqhAt!$6&7ȧ}i=r&~Xm9DŽuVh)WQT^ `@BХnHLHx%(ZXtk=\>JFH!n:t?m \Wju#@uc@Qc w;v!Fh=}Njgrfi fD@3SKS,#n&^ r;$EA]pbrh c˴XfDkeI綾Gg˙M\i{n9 WߨkEa퀉Pƙp&+&^ʁ1S^сs{ d֨vcFrӉ_xwLy?-~Wa֯R08blޑ%BR㑕#?%>A=:>grA<1luQڨLfZ JGJ9HS^hENݷ;QoZ1JwRz)8Xvx`aI(Vm 39;&M.}N9axat8J.Hu[&F[~17~i^Fҍ4%rbmiv<λn XK|}ZNx%7F ^g& HvS"ZRU IxS?la_)`:= Hnj:wi8=%L; !,R%vR L0S6C_p} IDATJmzEBix!u=sP#Ф,i,@(i5PpWv0c֡gT"AbB1J]6[o+ B>yb)Hs4 M E~Ǧ;7?+3( M̃JR@KAbmC[8Aϗ uggYD!j-k@ƶe@q'7Aw$*Vu܌Zu|k3]^ w˞ۇO\)O~1!ܽ۽$M՛UV7>]MaN3k ൷26CJ% ٚ =W^\UbV+c0Hm߰@v:*! b Mz0Aȥ\3Jl]6tFhkCd11Zc+Ї3u%P5-vC\:;jzg*ٚj^kvJ>i2loEe]>Iu '$E V>. {уX O;Eb>Bm }!W+}hE&.Ső?ۚw^y@ {hLHRץ[B0%64!T%RPMԄ:wrăwQs4UbX=PV"BkέJ^V9xFV uGC)U-TVbۨևR2 XbV ue 3 i%üpl--62Z k.ad I|b4ŌB%vg3߭튄ZqBh]W& xhX0(#Nax n9#76Uܜٵ'h5te{We*ևm r~hvs~8>ȩE:ȶ6j #^+Rv@h +7(fkuJQ,n'a%Wdm' ܙ7iĆKRoR%YR4p'GKFg1Y6FbrV%#! X6'mWm,Y9!DKEq.99^_pgf7TW smZ=nNp'«EDЌMJHf eaDgW%grG+ :zȖ9,}cܢbK '*C$3%w+ KQmX;0c,kmav|^9qy"+Sh Dhͤ-d?$ bQH$H Aa6vhPJ @XWVxIL E׍v1v$Sb+R$ZB0LÚo-B޻ 5hpHo]s0ڇw7v#Uh_ǃY'zh>VmHl[ $hxzDnU328NFNH0Ѓ02Æg:\ie#,?rI<zbO1[]eKo~ĺm=X6Jc5zNo% um9_w>n/6tx ԍ\`]"w(atrD8#qz`hE2԰y^ v *gKw S)_i??~ۻ~W?N)F[_nJMvQ/G_il#wDڅ:>\o8N 4 [} lk:3JZgꕇv*hl{LV0Ŵ@{L _)B~ky(#cULZl###NX"ͷBp!1J!PMɦd4"qSZ"7* )ŮZ$oB a_tF4(߃X?C$*} Oڕ` kIdsūY{E)Ct66R $QZU%u{o1=tKbE)+@+dHIV,< $Mܗξ,5qjœo ENmZ`C=xhiԹ!ukT k,͙e`-z0T脲0JD D!.LXx=sIR=xoMXL \DdQ2ںD*4s UMk>H%8ZGc ^ .׽te {vԎw CvҼ4&`u*k=]zW =SxIؔ۴4^ !J.u&.CTIԣ5<^z{[HvNxZa*%rd\ xE貰΍d't2W6ؚP^Pmx As㜕"#*\KuW`eζd+,שok>i9os[8Y-q6m"%*Z9qT!@V\5S^V8rw6T]Dz!,gXl^ b\efIs2Yijp $0s;iHHpJ=RkYsq¦`~& -O8Fp9>0mppͼpaY-hzUP(8HSmKeD?TtE:?T I.tH!!HQXд6sX_:*QA)T I׎HF "7}B*JH4D_o ZBr#JɽHڨWq=QB֮{A>A@1@.]n(ꢿ #W;N\:ވZRKp I-6LNR<'a!d=sS` GPxf,?0ja82/Gq^.d <bVʗi6 b^0طxqy fWƇ209\@ J`,pyrCƍaGNCyD Kʷ*ʑƊ3A'g=׾hPپcw/%vMʷ_=qDԆӼiлoҸr$Aq,-HUa` `ʁwޡaq-dվ(*iN`MOTQ  Wr=YNP+!8WB.ZychZc[gJW?&ֶ-1\kϹ}T!@"J RHHED)q&=Kh AHG|)r>pTqٯR޻֚s1h}_,h'=o$J~pcZ9:-gd^&1(>=;xl*Qhi؛Cw mrv-*Ĭ ۛzĔ}s gNaΒ k (*Zvr#/7R\\ؘ}'uѮ̕G seyا<3e廭ph;` *4 4u!!Ήi%5J(ut}"BiHSw\393.W4s$B3wl晩uDYԙ4@ 筟Q.$ӕJGf-E2-@¡ryÚ m+rBmW ^Ͱ)~!hS5޳@_9džsEQD:聥*^&:cs*ȷxQpT&ö!D8E@Cqkh VcVa@@cmNa"$ X*rLガR n)|6)Vɐ9Jbu'mQՕWSy5n~ld~=1yɸKgb0 E%_eҞv%`^xdX猓Aj d#텹N1{8" 80 b(dM̞a9qv ig3qLC|?41gF5o:8аch)rn1h N祭ϹEemM.!C.w7XmJdr}*tȦ1i$V/}"4ImRL+&FkDfSQ`#Ѓv]` "M^|kF;\r'ԕKyJ&+&p7ϯ٩~&}9IhzD_>bd_7/ XVºއmj03oLmK&sLG877陵 ̺?v%Y#%% /Z,LX3^QM8g>LK‹)$QIg-\¸T+y:'rˉT p&*!- Ⅻ/DL,hcbmgگᎂf#MyyVVZt)lTS0?vOD蚐Ř}eB%H8X}L]I6%^ZnFÓ⩎ UevP ;Fh!,LFdFlXؔ0;fZ.x(=hGİ8N髼yqpܙw{0H %{FR\0DȡV<4KqLa։ô] !1%mZC8v\l8ؐ1Wjn<;q Yle4F?{7a7l>ֳA{|u;u_<_Y1s)ȫ\)~O 4|Z@yъN>?#p5KgDGg_B~e?&G?fIG>U|˸:\)r'bhCQ7.LI 䲠D=)9&zXlCaSeX z0|Q(efԑ2a))sІ92U\p;c0efu;c#>.ޒ1ݐ4#֨CڕR%*FP 9 LJS7$hN1CuGH.pgJ!Ɓ7d J`b8>TF?J]itFJ%Q:ֹc-vgL {R)LJt=)ukqfΟQ{`M'}0Q ?pPH8i !d i (cүQ_-+>`:^dUH,aY(Y3t{dQPwL#/IfRJ}Xɵ!}[@*[\}bawsb7q )#Zi''Ec$`) м$T NNYbS, ZR$|5c[P-41To)["&ŭňv0sǍVD%3AH=g!O+i&Q t.4 BseID F{ _QMA ^(zOFԔH7"/ܐ<2ԊMFYJ#3 iYUO8#/9tVD']v|lLelGj9I_p~#dq#v<}:# x]/ecox썣9 3᝭cVu1{`!N%CU~8f^kdf8p۹\/ \r[V&h_t;Rҍ9nyߑÒHZHI2\ڌBA^ڻѳ ѩ#NuΰyHQwJ/cSAN8t(6ۊB8h!Xb ux]:1H}!$>*]34MSl,v^tq\@H`U*2hqS |DȨ1tvEx4Bm ]0*i{ k&hI1״T4͑*v:1*v!He\+.f}o>Eg 8qcƨ>ش;4\_E'ru*/š :#S#J~od@ 1>qf1r6~jE KL0i㧚:xlm;ŅF'c0<1oxs$Ke@%,*IN+/y~#)IFf\5:  SIx );=օ uW%Sg#قyohiځ؉i >Z R{LjbJFK'\:=ҕ=a͕h]G64u (D /7WCgRr}'Xsܔ [3-)r@#(, Ei#m5@3^331&,_S.dSBz#4)MsׁN QUέt0:,OBA 1>t>wrA#8HZKvuR'Tq<x,ҌZ ύR%( =u21i`H(v7]dilØ =1:/Lw[Ug¥iL$&tFVk؝)uAZc-2+R^ Ag.3.y!+c"f1!kF;o}WىXĸbXmnoݰLzA\ڑ N[s띏9icN+~Tq G 1^ѯط뱓gNOPHLZ8홨W-Ճ-o:,Oscƻi9:Zg~J,c6D5%܌dW#qOti ']Pg:)Kw^oClt"I "Kt>RZ{_Ske2R7=q9R/lp`E@5c ,6 +He+ cq}I'HV2>.ȸ󁫉rCƨ`ݧr?OZvo3i> }#^G9f<˾˻ϣğ vjt>ofKߜc'^=/hPAn>D[_K\0ɠE}&;JHm-w,y!kAMqMiN#:6JߕL 6>Cn䜈iY;Z"M3O F!yjtihk:<8FJ ®6>kzµEPɣ)wD!Ճ Ss@A ӆ45V؂34tfF;SqM& BH!4^&葘p,)g:I9G+ac}0s.±堘i<iǴ Ϛo ;{"ʘ,ʽ@A 4KM2Je(%'O6%0/^D5g7J갈ll6p$) ˠ$\r/X)TB,zesJ B D0XCw{JeIԌY-ߘK $ԽcQ7vT87cy_R;kb+q-k3ӭkh1|`W@>5 6cۍ;3U&ʾ*co=N/I/ɯ8b7c3=Vڙ+o@⚌ñ _#W)El&'9s7^0L"3km/H}4؟vW#~Ω/6ޙnƒtMv}F>ynO76mSsdwv/x m7"&dfFn>T>X]]c )#xU$U6lA1F;b&!9t65JT$WH$W&hU"u;iyxXKpr4f{~G).PHS)`G#>QLw ҏ`=;:C%%չ6 .ȓ=6\C Q~t2{BW^X1l'޶K (:늅yȽ$// :Y%OWN$16nn-j8'rb9%z]YqԘ Jf4apDN8hF5: n@O{ȑi { 5RKGP'6}Pp&cvqƻ \w[7oĻݕC H^/ҿg_U^@^.-"O;zp*<}O G7=E -+:DcF@FԮmP]b $9yǧtǍX 1L5( S8>2J ҃AqWQĝp ʜ!#2{wxqA#ܝM1CBWG˘R a#o/2>SRaHGN:tcZPV0zX$V.tʳpyxz2cTWs榔ke: # iթySFG[3O\i$3By+W&oy:I>`n5ӽ$́=Ȝoh*_7)r2DXllN 'sg.XKlY⼻(v\f ߿ oD7Ł7O%ytfKh3V%S,hBF [8֕d4yB]2N@ `03C7e"8$ShJәLF~(> "r%œ(a8H|GpDbyVŐqV(ґ=0`.2 `BI7< |!mcJYdQ\&QM*l1w^9w|Xrħ} g_^`wŰDU ')?E?$y7  _̻\K r ϛPs2-auՙhATyqCƓm0v3^G`*e j?1ԧ~0I{Uw Zۗge>_qkaVa.pmhY^v(H o]fG :22(M:cn({$!0Ѽ OЂC͕JR#0n.Ebc6$ڽ`TmȆpE["rPIӍmlrtjs9 <6bjRs{ 4Ü©9C Z=G;=:ev繦@k&PӃZy &gw(9! IwBvz9K%v@0-HZT)aYr4x$B([A`Nj+K%6iY$3{vj<W u:Ps"i$e$ɜ'XƊVMbP3#Nc5Wv1\*$^ ЏwxQ 1蘍 ^QД.4 b1fnM򽔐u=?E܉-Y`BYI2w{JvOrNޅND&GqXF֌pj0ڽ2t*p &e j3sj<=_Zs=pKJ2Ƿ7CS =5R/J\LJvujp{g8tl|*v;3$lg<{mU> =ReJ'׶aVF$iمx\i̧VeCֆ|2r>}9z$Sc?閆vӯ^d:'otƆ7vW$bj%n8JꕔWB.(|*ɼ۞I}r^8Ą{muF,u#Dq>=]4ky*oŤoިI|ANKC:&m1x٤(d7l@áϔhǙ|h]eτ7JC[fF+#6~C8G˓iQa3ь)3? [ThJ)V4+DvVJø#D^BT<QĘ2fwS ױ0XL9uk8&NBjc T7hӐNxfNFS…JƒޕgJVs*KrЎrٍO ɟG_7Em$3%yB.PjWxӝ˯ .c{tD$@'#g9%c=9șW1+ޅךaSfy6#{_x͡])>JU&^GamWbk, 0龡?nhJ?r.j_?_Ww?%[ =X˄WD2:[c3_| 4ĬHrVqCcJ998p&W67TwF)AHP(1޿(G>I\SDԕ>\`%A?P1&)%~[91PjqJ*\HEi'܌X$\(:X4$9ruxFx^ĝHϔ4&!X'rY%T@gt-s">mG#ešsĚWټ@iLLu2̕ wTVɰ:bBhF\cj,Gs~OELg,tW$_@6^f;qsm3 Ja}9uQ#9ϣAo>2zDl̒Ba@cבːE.4Nȝw,ym19Z{sνUH((QNWӖ ?@(BuH! ٩ BAiTU6 ,ʬȌy{6yn~ٺ¾{ZssydL??3ƄSQq IDAT0eLC(i0.kg0>:@۫|LLoT*StJ+҅d)4rR+m67Ӏ]O](NtO#]q&Tq3T0%!|{ųn7ASjuff~ӄ: I2,J$=B`cbc`eZ: E2,0t u"ƍ"aMYezt 5$&V=RXWU4w yUN:&>aɏ?;'kmH?:~4щ^.4^'9@o91H2ipә^v,uvVyXήs#k'*dNly%AϘN8EqHR7Vs*)QY=Fݏ{~|>G%Nj2ZB7w}XTHr;FlFϢ4!;#}kѩDLhmmlۍ-Q>z{[=mj2o.h& }+5udq~ ~*"lo+]䆒c8Ѝ ZMhƴ@B +mFAh;&'Nd13=u,*)A$س:h fkA$3E;i\;BNGܲ B7M:!RFiw&2&"]`D,=cG[ԨqJ͝C6졨۟kAZJIu?~"}x'6X˽!6X\@Xe#+ɉDFJ57=** +шhT#sdmJsz;N22OFڋ4{ETq>Q&~D3gkwXGl뺱nl_?q9v5W^ī1 }8ՙ),lwGbvpg{+?}l.g.Lf7s0oBZm7^s0y>pyLH(ISrKBi'2 #r_;_¾l|\yE/mm> u!Hy].$$zgΕOG&^ +[?q;kɅE;`_A_1V0G1ˬp+vw7V,=s]N[7(%1J=ӯ2;7~V|t&|Uex^n"8ISj&=f#OA1FX7zv")Ѣխ,NNm;I\!5樸>PP#oJAqVϮBdC^0@DJ@*$2lF& ɱD:_ŀq3VwByӭ.1TxtSFMSB :t@owaݡƋ+]fj_iKDZB|.f# +Zef_^!}g7{wC~ĸ:c$IFd$:ۿ?*eARMy7aSEs|k)cWJ4|ǩ<sL) {ۃx½b GO9>7k8|Evl˼zcMo6" i }?f #C @:CN_AimH0D4"P0_U~pSfؑςVJ§oƠ1>">\៣4cQ/N1Q>y&--vgK  Tp+-4,c(Fx D-H2xJ3cSNӣqSwmt(̤H4QթD5AwbD[dyPy@G'ѩy" 4 ;1sI TmD肄bĬI>HF|HScFʘF6=Xؙj6BNcbwIFt\vwT"C4hvvd4]W6&+DT1S&-;CD1SrhsETʱ(d1.3b1v|Md榏]ʤTQ@;f0 u&<@ǫh *H)Cg:`̢Zt8< 5ERFt4HtlS!6bsFnJkGYkz=sbmeWn=qT)|jGʮO u]K# ƛӝL s4"s܄[zqc.z@# d1NxSOP>PH&$TO<#Z Qb2U%4ʜO+L".D_ؗ]n4Z+g;x_ 4؊$#8G]P:5^4xX&45Ts% ˔X淔nnۙc:(]X hKexR=@.`*FPWpR.n"`XIGG,&kfhqLDH̓a} ɶ`[F̨ȞHbct`rBaɋ yL#*r;bO2 m`3 #d+`ZN}Љv?**lcըI3.γ(gGI?QipN{Y/oOl;|&IɪCs) cM Pi2sFZpGJ}e{jȤ S-v$$䅖tΓW;ƜS8k*P7azCSckκîwtl<6leY>e ۑdߖ؏#}>1M?|>2^*;ߝYfT%yP )tBIL8|gZ#?7knH`I,_s\ )55%*C ZL4OA4g̔HcmL{=2jc#N~1 Hl|$3=>щ؉%#usG.S*˰Bxd1%uMDò ,HZ,#"N)c 5AZq2} 46 G 2)1{@@d'F۝ ^'dh:prD/R13Q2CTz2"P'ۉQF"Z4Hԥ n>ӖB JSklKir1A=tɸg2>Tj a|dF%ĆEfжکMM()tݏ r,!x6#zg}*~W, >+aio$aIHye-JB-LO 3VH\L~n+'Ϩ'ļv흄\OHqDWevx'WBa[!3&.A:Htj\cA[qτeB+g"Uv|vC+FjGyi &| #Nsdveˤ @RCj{b[&dLJ6a!FLj?Nx4˩ݿUkbzl3uD%))DXbZa!+ކ9BRjk4+jB3n dab.FZ|uvz֗X|d|'#+Kր|i_a{NQ1͍}.i ~Hdu-+AJ 11K'=k#<ߝi޾dX^p[YKLobuDJ6{YٹPX|(`\}"1 5 bx V*!-d&xx`LJdcގFq,=kz;oǑi(<pr'~K|~/}}g{$sbQh?nԇ'-q~gNUڎK|'UgI9lpjʆ$AK#XSĎk>Ml3a#uϨ \vp_hPߎy\W8z`QCұ͙8)I9ZՆT)Þ\Qfa~r5m~N/{[B{."qgʅj#AxZt4pH6{(oKZ?B ~? pn9ߔ.βeL=bv֍c|cRr.ia麳)2axbEmH S!ZbD_*\Ũy#$Y)a~} "S~d"tfNj;Oם>97Tىh3XܫқBƚ [ۧ`IWZz˭Tir3vy!+-w &\w1/7@g&W*Σy H:U"QSzY):zԷ=:#V'Mh}KOH\+˲p5O}G9*XJO,׍M'+k+I.ʺ4n1 Ni;_VR$ަDtV%!|^;:;#2lmY F JC+HN%A ,S&EkbwЊNqq;)f");6kgbZG _JKS&(֨}f*FV*8'W+{#d:î1@dIA2J>Cu%d<'R؏]lDOCEω>7@4}g:ɷ6Z( B3m>?bɈyHA;]E\5gk( ihU_pO~o[e9,d~LIP}xC҂jC8rЖl[\٢ > M]2-ݠtT?qф3))= «CTZ/c덬3N 0zEN=W.ik_\S~~jUj;x}!/?ǯ-$W8OەU3-}d^^ڙ#oa->,A /q#+|*٦}p^ǯ|G:=o[Z0d94٢BPŁY(keyPa No#kF2$%0^:ILBXDBFGR]>J&Eao+d{PvF:LZ ejtmĉm0Q#%M))2aazp:'z89> [̉I^S%mTngj sew*6U5lѺdt$4ڈOAsŲ}gIi D\:SN(ZfZε~..0̄dB$1a6edMMیSA~< JJv pWMZI}Do;>PCq>0:؀2Z"BMo-lge0\ l4J9>xqДE>CeD>ata#c#Xp66V!P7S?ۂ0B锤$[J[,JL3ZeiJ\9}EX23‰9 Od)lpg2ԤSp: <bFJ*ABK3@7RyD91)n lyFۊ0˙w.{w8d[cFCgᤝ3iyǷ K3Bx0i zld3S#kCBlH:^ ix5bwJ178lY$)tF,61EFIW{tSe?lzFPz;o|y}!3;B3A |tYQ#SaTSG6DbY m厑.dtk2L]RGhՙPaLhˆ4>]0/a:2Z~C+H1/}԰謾+D>28M"&1n& YG;Лнse(Gќ>G.Cљr;S7L fKf|v(u mȦ<u<0|FU.63UAi 3ēu̍|Ȋ2ҿ |?|Xx8'ޝl-'d5nX m̺5%! Q- $NJFsv:rd1J 2pBL"L "L}Ә -3,vK㰢 &p'&T:w$=5npJNwZ2H^Y74Lr:чP%b[8fHFOtXB1q93y$Jˉ2IH$sfѰah"Hyqbl,)ύNH6DI;heju2{(j䞇b+3 zbR{#|ی iUpсJGu(z%gl~Ph%=F̧*:-Ɩid+[ TꙬ/7Tn(U>F̽S8Ց= ݕnJ[+tjO4Xڕ46?6s;n#qMgZJ GpFg4ScN@=Bc*"t2)>VW8q`:š#:ڂ ,#qP W\\h1xF*َ ܻ3 N IDATwU<,J\84&< NO- ;o\^*K2ʮ)q x~91O>b'r/%#szr&8Ay<׆i>L[gl RH6lwH» p[w6<,W'D/կ\]s ]uҰCm|Sw8A1uĴg:-lWgb(-wI)7;2vjú}g*gRy>] Y#-6^7(+-Dn\hƣo so}*:o=i P<خEnL?L"dζ;2+6)3)YFvZyXzicdh6% _I*jCIr'FZfCjôb#kM:H'KʄJ`5h2􇅩 {oYqd *8Pq3U1*qK]p;`\@i:DobPEcLyk8"`/+<ʙ}NOTRgwMA+iVo:'yuOovP,~}e"oehOS:.gԃD6R^ }~Bq ʺSek: Mx`3)F)ogSHDQλ7 i5*__|:] WyՈ׿S?%J =v”o#42VT@&8hcD9QQ: uEBv\q,ImA[XKa! r8Ph]pB@k~̾e"ZuNwu%i$IDjyDdя8rȩ7l)":'0Ң^ҌЄGE8'\ːxD1!QJAw,^+IY"sߑE&Kx$R(ѱRwF΢S3[2N%G:pI R\fj53c;KBƛMYDG25:1$^%%Iм)h- 텈F֙>`.z1DiƪLiqP4ƨ9bÕmF?犚C}fؤNtU6kEXDIY @Bb0dńM+I+X˄Vd6OHV>'ќ{@s:/92{4n:PBP|B^VdOl+VY2t"%MC&U8O'Ğ*y@owRљ,xUYd}3QN(_yU$=rF F&\9U_iOc 1n < dxϠ;3K6ehYy*|Jn۝t읯_7ǿ޸" 㤁3]}c' jf%7g;Q838l 82M,rA((*La a e9b-$O1!D,Q҉0nA CL)3R7Z)Dwd@Swr,SGA@ oihڵq|q( jdƙÏxNn:Zr#>f KZA t԰L~:nWb2QCoDPX`aN}L$X$bQi\15g_ȣ01ke c{5Z$$ 8|?5)_) (fj*&lrVhYE&62;- œXrf6 wgS8Nz(TBz FrO7lkdXǞؼ#]o{'CF܂as}2FjY=~!Ltʸ"q5mhY^7ET5c>,0 atn 6J]1*7Ȟ&Z =,)p9P9!n4OlC\qI*M0X{TNO۞zjjdoԓyg͉ޥr{r̬{pNP)0]K{b5#r&)?)Ie0tf >rO̗O ՆjLdQiKu|0ӘWWJ9VT Q2WZ _ri QR_ И$\YdT5v,O8'i4GTi RԖzZw$D!,1<莈:1iN߳ؖI0uRk}EaAxg_( w$9P՜5w=rGAF2RywӏI4q:B{T$<6*4eI_ : Dq*SWg۩S,~U0<Vs;W^mrxQv>1 Gu$ß:(z|\wo7^[Y^V^OsP9D9I7C}cv4B$yTϪ<*fPMhX$OƤ$ [%%FA`>QdUK$3A)L\6͔ y帓b0;/Kg %9 ^s;uB2;mr>^N9x;~yy o#޶ {"$WIFdӦ:= QDLl "EZ +ú   h$_~)]RjL!Vkꀇ TGl"6Z TqYŤs ɁOC6Df1ܕvpy83o,BA씁8"t펂NiB&L)8(.9J"j3fҐWH[,1,* Nm{MMxO)>(,TB3BcHjg" SO7MQ7~:&P`bncJL^*1+BW;q1)7͢HEGS'0\މ5bPhAE)i6J]4jη4wmM|CIRX/q(LXaˆFd .5µV:5t:!gú8ٵ{CݘV% E#~1x^:';3ĖyHSx(J5|1s-!sWF0&Қp;P]y}#4E(}禁G0cq9 Wb7Fnگ̵伻J(ޜ+2f('8ݓ y#3F4 s/_?|u?}!8(_;c+zqxA<2ڃ:y>]x>6. ./,J{jX$>^+CWr_:/ 4ό 4Z1CCsSfi#xVE@@븃g*LAS7BJͨ{VꬣL$O-2xULbj|o;Ȭ{^ʰէe?قD;# D#~vH2{NP칇@A=Ty>-N䭖r:r7OB DMZ&N1ܙVT)18Yczyg.s, +Ewk,VnGz<=LJt.-,rpę(J7!^n&<|> YOUfD%% J4<2EN1fH!<2堆W)l6ɾXlZi Q1 ŕQre w픕yq5 ԑH) ' ,"Lw0hZT(B;˻weEǤ`oOrxDV`iOZ)̋SJg-a& T->LN匎 }F-ۄ[a9Z}I/kyq|Uޕ}"Ir"邕F)O5eZɕ֔tb_ཱི`s*C)YVƣ &E835Ht8N8R~/ Nyo'}_/\D|s?a/9 GwvbOv#s|Z6q;oo/WgӁaw}v\.g{2{ztlNT'G" 'Uas- h"c`0rz 0Nx8#%^1OHSpt]9 tVE.ܥD}2lA皓Kˌ:ۅ;{8"SR#y(ؘwEܓu*Öq!#V|?O W{0 4 i/l~e*v/H8)4jV1A@ apd{5d]JK"/MC۠2'(<%8ډá1,XS ?l'.ٿO'ŕ+V*[v&5 pЧvE`r'`{Hߘ]>Sޮ|1.| ~?_/oI$[aFE3-겤IGG!TId[-'4N>Ra iX<&C>тݔ#n^ Tj"&tM`a9/z9jo)=#& 쥣#+YN?a%"-N$]Ŝ9Z$PdUV8Y2|@p-:2}( " 쓊sd\ ׮tӡrfL [T :K=Xh%r<7*3h;WfrJt#$hLh2s"qYqQ`PK܍&F`|.w iatE)^c)OX hj6rK:]Jp̊V~ NJ˅6貢/ٺv/49sxB{}1@yڔOKD+Fޝ;o*u>/ZJ}Y 4zlޙ#vj]AwO?xA;ƕָrqc ̼G˺a\N9= թhKúp R XXc];kvR_~E n+g0/Uب˙U"o6?ۿ\~|g@ =hQOِOo&jm\n,s<g^o;ÜAm*B/F r~<0Fd>Ԝ:1<1gs|L*sZ1 s^6p rv!F&ߤ4Nʴ("q4Ϝp=XOOh+xh3u!єN֪H쌣`¨I93XjEhe re}d J0[܍و + S˄D[K6 #s93eo7ºhJ'Ft eXN sC*gTG[U+S.QxCpY )O"T?m'BoF藼9y&ܬ~ ynKg J#&)), |t1{8EJi5U)쒛"8xU1zOQ=Qh4腽o/[O~7_+gĝ9Yt*q dB{Q9%  s{8N/<5c>*`D#JCt,UˆL4w%?h| nS2@6i`y#-t0rM2A(9Ui#cS0f7b,gi er/@%9]˕驏(H4w 5'uaHDWp"eGrąANTM] 8@fVpM'kvp1P%Qal4y\e4# IDATthZK&Q E,'*b8╠S9L*J]2NF'2b&a!n\ă*ďӉ1s=JvVqYyWsehm ggp];GE3˭ NO<+ӜbVø ʸNy85"~MChON%%x'?fŹj*PNk>yϯ\36X(W  ym>~y|W8:.o+3or6`/+>w_931)y`b'>߬g >,.`vwwBƜ5joijhGfF uޣ(C(*0wy6̍Wܙ1|u"WNUyת$cθo@2h`RF0 32)ui;^U'wT*%9iH ʸgjE1] OġOR<ULXNH9Y@NS14LAJA9 ]aR9-w֡95+ƤޙΥWK^ƻ0fhdq%0ZJ6]X%VJKzaLCKpK!XL8ʼCx=([A)rſ,Q;(_6ӕDz'7'Y ) \+Gw^yV+xM6b{S iS[4؏diQQYhRܫGɅ6D/ 0XdH"9k¡L=Hq!Qy#2c2Gvgrn`Μ ]!ȶ3Y\x{} وs/ˉo;7wկƧ[= qGO;--\7O႖"?L4 29%kSJ5-l@ѠDL-c5 [jef"2NPS43Y0î% ? >GNFM.+B5 YUyDhʘ'H N5#Bw*A9ylA)$&2,iSd>~׬74 R9JCdII4^Fӏo#SԈ b~*1/.t “i匈#Te eLeLrMd5aZ \C*^Ǒ:iPי(R\0yOWR]+klG)RJƎ[a=6ƨS$$8yx~,7B@}A傌t~&ˇG^d ꍷM4?za-lgO8?> b%x 3m۹rڙ^/'P$ި3ƚW^޿gEWܣ2=Z7& uEh3eR(3&35taqW@GjD:Ӭ7g`G*9 JC`h%Q ,<Ϝ##S|9pxzN.Me$Ǿ+DjAA3D$"5.yVyijǺ1C51ևG|V+3RN!(k9v*pňhun1T9.59mP/BZ:H%Ks0wc?i?*E(v*ꎴԕP2`4(<]Ou8ݨwIErSx{N6( e|>^ AyPOWiCPcn1Y1㎏ڐȡcӸAi"uNR[<0)ةmL3oy3tƭSA׃S|~VY帰z{c-Յ5>_8^|{_O{~aR9(.wdlax"$>HF {䴸;.+w ]o-aJDgXAX{=, ;_&{Hi~T)ب/ޅALj,tw̒J,c#?AFeQ={ .-D 5|̔`!9 )RKjw4 0AGʮB$06BԐ.A Y^zNd3܋PBfΧ_umEij t ~ÀdE'ZUb:dcj9كCq `K!g̢ՁbH?}EJ:,MM6h_ {ZQȿH!"(){5ūb՜BL)ptJ'O0)\SL3>5\;^ʠF^ZP6I]J/N=_ܲ`E8f KK<N9,9xX>]'xʙɉ^OUS+|9i?+ۭpWu0ViOOey gwc%º[{Kɍ2Ӷκ0>r=cy]25+?UV :y_ ,2/m'C;=Uxm/. ٸ<=RP5*}8`1щ<ؤ?;ofYeKܨ[uȼ0 }^i_oy{ ޮ/}L֘lSMx7W.L 0(%D]:uOg;,C|#>ĬGf6~7& 6)i[J MQi0']DBY1J<*9Sv spppkEdl&SYh2PŊZgTcH85rh*%F~N<mcP>'/Xh8:uuhr8NlUx+&]0KԾ`FNJlgcc?r uerT62/942_lV4LgDʌJƋO6rr.Nކd︕(ߵ!0!8 ب_}pav)gd3ѯ >l*M;E1V^/\Уr O%o{MsǝfPllܸa17foޘGZ(B}ްɹ|N sp|z޸epOƘH!ɘnCdt]+*MhDjK-xEjVm. 5CΜ. 5i'Dg̼x$aN5*HDDiQb?Z,*t&+> iq_$t7(FkELnx0=m22 ͽb>8KEGdv=;rpxA2W*dl#8Ex,b@i])Th)yeY7g(x RP |?߂+G*\[0vYc%z0`aNJ Nhw#1!iLIor_/I\y`0&:7J) 1VNPd^o\44/" "]sE}݁H H Y #&=]δjh3H&*ɼ2qϘdGn *ªlrOQcJN`we%SQeI)lZӌЍ,UYư");*VcI؍qeqWg[B\gm"(al\SqLg2*T^Ðϗ+=#\);[QF Ux8?r;/dtd:y 7'Iթض[>fA 3XWJc flp9yٝڜ~ ˥Q4xQx[kgt^J@*ӹʼn#.GϾ&da*! ڠbB{^y7Y,*\^_9ds\7kg_}[OH N4nѢ#\|ZV)9j-]b`gQݑ94}IԈƜDVX5%h6zS60ѰLS# a=ϔԘUN #6gR'L1 :2o }2fjQ(*x J;55衢Ll|1; {[(;GjT𞘩q*SVnv HiH(ʵf-%*6z9-:PpuAR&0Va9}fD#2`Sp?x0yLˡ6)zU&޽g/§7dZ=,Ri*C=V cϼN8Q*ex u9l84G90 23OU̕761Yhz?u6yҖG8_tG5۫͝l}jl=xzwtuQ/F?.lM7ڑO||7\_/X) Y;F)'s&5nSk:K>#i*9D Kɔ*'n0)Lr9MVc~׳]IRo XL`Tv ] 1P&z`1S)R{ea uސ, bu4K3YdZSva,p9R r5 6p >Z(n1j@,ђNL$ o k6C){{|'SJOON+9ޅY/*xc9ƀR=Ț1kA% !fOg,&Abs&"q7AΡoW"2Hiv&LfdES"/iC,U뚫b)Bȋ ;97;Q8r`߳~/\Qtڇ8Uepm 5] LPO AY p:jEhT0M'`.ӹ-Q}ȅ+Ŕk5etZ3neۅ堬uxgsE$oхGys/x~=``kN[y˜N_]!sgX͂eA)^R( E' .( 1%yf,*u5xX-@ W/9V™y}׈C[M 1jc tn8nZШ|B?oq~PD(EBnfMrE6wo;lo_~7U`m%3mITz+cK9L$S &Gq)tAm0L(~DR4e5l29R\-/yKJwI!\AF,Qf$9:34 9^r|vVb!B6 He4T nKx0J u2"SbX;'t&niԲ0geI湬 Ԥ\BRw^m t,$+v :BE"{;f *lcM4rN㑷}cTh1lTv=Ҍ8:}cٜbV:N%*`ʣ%]~-ٶoXk>*6l hDZ2E!le mJ2rku=cVDn+ZɳS;׊sM+U!̥8R`k_xo_ؗgnº5gLy.ǃj4]HZ$<ā~42 jBV:nLUEO w.@={I-5<ʖ%q:Bӝgt5BrdX:7^x?gÿO !daDB+14w&Q"cNl+®kJE]`:⑋,=ק%.% jLjf'g|= 8(jZHA?wy1}riNDfxvo~m^'efG-ǟMƔM Q4j2fɧSJ g:l3DD ѿ(@?,1vKhf4$?SoqiϳKgXX0 HhSlm ɒ0&(0 ^eeJ1oš7AWEi9J;]2nZۦg=vN$Tbsx+4g- 922Zwc&쉖 j ̍Q%9NV{m0vUcBDsJ*D'9&,ʸ2I)MaIbjؚD!kbNKdR2_˜|3 OBcxa6!ö43*ya`胒׌=~ /Q32j\ݹ)Y#0HJe} y]pXDl724Hkuly]y>:O.ZvZ&9!˕!T`z#iB (?PVڑ7|:owȥ25J_L畤 ]{4z"F[qNȍjY@7 3O6qgLbJq$a:%c>P+ZGS=;EOaWZTs[z/!ְCl:b~DWI-,s!YfF0G N LkFyI*sAJ&#ΘR(-쮜(GJ\04bR0yf1)q*nԬV ݄d^SDdtL,ml|' >bB}ΐB Aʨy%׆PNq i OЬ=B8 ErEO-WdhITƗCcq2M톳\0JzTOf]:E)DaD*Ǥ0L$WL2E>dDYj]GRIYIâz MX# #q 3Z-Tq<̬t "T IDATQu eZcKW6SePqή?`ŅueDX!S+=/;'.4Mp}IX4/d} uK&y]X+-7J"9>]x^ 1XJN^vCǠx*w'@_8rQg~gwυ6}? "7;Ì>vTVmnhF3~l0f"hN&R6,g)yu`5ٌuZr1drFfYZ#.3r_RIڱoc0l協2;w[94=3a,F5nq57CfHK) M1To9Ah&AFLIF_y.jS5g#O'65rJ~i_Tˤ+r߃ZB%˛p<JhwpҘ&w.-s\5x6aH2y ɸ*~ zYyDTY ח-Ol[)LY8 tIo7)9KWPX1 \2ՑkwSg sb̗+y{CI*lN,a0V 8R|(*\j"ԀI]AIZ2[q$eX^T13ꉏ3b~h+s 癕ɬs{H wkK$p'X_"qtNʰN"x^j0տ̏o<幆vPո7^^/Ow#~#Kn'AmLoAv#ݿ\[ Ю,h 5).[1U6)yIm8t)Br#Bq ͇D.餕9Pfn ~ 'HhX= /)%RjЌ vN&Ҩ emhe03ؘ>?53J0Qr䃠KIWyZ֐ȊQ 1VI2tD"'hjÌߥzhm$Jӑ.X,S#ۂ&dɈ2_"SJ:8}JR-1A/:xBKjy'aJADzjg oKai`Wf!wee`+F+C?}%ggt,L;,2K:hǐސ#;|;矲_˟?}'yBDx`rzcBO2I1\Ԏ(=IIo)eyN-o]ZoV:CnTfa?=8-?d#SwǏO#~jp R i=2QC1 洵EApFRrE iH./?\ɣ>/:r Y/L^k!EKtVfwRK ¢4zls;i>dx:9d R.9 )53Sz*[c\ 2+I%3k! (l)p< PH#efeLHy&hrku:}щ+~ɠUTWf®ԀXѴ2Rg](/Ԝ*FI )+ˠ i4f6\V`#N顓 d ٩^X1[D)iB| ZPNԖ1UnHˤ:鳠3fg`;qA1 2LRtb8x WYAM~kK?AF΅z+L?mL!;:Nz!,Bׄ̈́{"q[F |E%~6'wq ǯ;Weltyv'ݔ>`lol6>}pE5Q΂&HUrw>ʖjgt0NТ%b ;;j,8uW z Xtdt3S?80¨DG8_rb4N[LFvf9͘;e &HP$ZV!p?vO;U_5xXDK>)EB8+519M;kZCR0%2"!$q)9ɺ\Cښ"r0Աs8pA%jmƵfdYwNJla\ż\PMe%dח+P ?S ¥Bz컓RG=vlfj}bY`7^zhcߣ}12yo2+9w|JƼ`O@4 + _I4(KmcY$ƭH[GT3Io< 9|!' ?|w>?GS~'?Ǚ!1DƼGt㝨|ݚs.qy Ni䲍y~adS^~SF>{f RZbMN 'x%-?+΃<p%JFb- e8,Ol//qxtjjsOkf(H7t(6f%yn$:3|G*)E({}WDz|a0(QHeAaҎW'7% LCV4mkGBJu) Mdr<:q7VtDsf1}ωlDSu@s(?u7)LL!Qw5 e-%9\ ;j HrS4n6WQI)mhfY>ooP6܍ޟs9 W6|hѝxfH8-Lî^ZAi?V&~jdtٱaLGbLE\W`Μ q1:GEfp*{o;no/ikM6}ǣ.G"o~7v}0/[3L3f%=1-t\+c酻ԼM#B ")Yy̙x y+M# e\g( ̂ #( e,4'$Q4R3mK!MCS(!%ڔp/‘a1y5&(҄ZhTJ2-O1(6IqazE jDsX=AyVc^ mPA a@^a76CDX) Zn>XD>G|#)ڌ&td@ZaKpnO%޾?#~?Ef0s> ͍?d5>9y hl5qģ=x7ҷy܄WmoG`D4v`y7Ѓog ^MѼKqfC QR&❉T9t΍I>[)J-# Gerjò6w *  @5HZF%ay9)<5P->IC`=hBtCJN8pMNB*dme!WH`3RvF!hAAWcLvPҦhgIUr*I$5!j27[fs$a0Bne٣Ǔ+geDQijsJ7(EIRcP[?-_a5x(ɚI&BiEHS B }<oKL<5gg%, Eܣ|ZPHߙ*hŧ!s(GrR On2L WTzH*\sdIPaA+fXh%tU6 t4*/L2v$#2BוcuFvmNWƪ<B>M g$jj̮^Jwl ytkO+}`-/bYzYK]1j)^y*}OϕyBqxccx(;敵O~d9}U:DVa7CUs+s{>m:n >OcCGi3JFxʓ Y$s܏ΗSf0U{~fՃN J#ŠbؒPfiˁ&ct J&BDy1 HiEI*aYmV?>f4uTtv!{m9o jQxfS?*~41/HZOuqnrž>M\¼\w]rސr>" 5ezJʽ WLE?Hs. ǹ_Fc9.A, kt+>I33" tNҕwϑYLWx˙ /i߹oTcG;/mwv> 5Oʼ@KHiT>ty% CoB\XxecSo{6+֯`q [ v2/M3.8l2g-Nx!`N#vJ+O.{Up84UW:63+12:oS4 Sc=a=3ub1cէR6y.9.SbEX\^[N F%1{#υlcE|Pε^eAӇX"noGB Vǃ%2YćO'!}şn6*[2.$nL{|7DᚔXPGdH%3kph'7-94S輭J}u|:=񸿑[ F[>=ǖX-?8ʧ/ydUy>pTȇRL:2($HQ~xyx4`Ӊb`Ѡ䬴Ghޝ,b T\l~~O}xFnO!x1 JFJ;TJArBzͼb3Գ%DF k=aS1F0.tlwLD~T(7|͸(_,quxIFfl x !7rM~g;ufq׳< Xې*tQ.#t.X ֢5rd!P@ZȆ֪;kUU&_sBwfIn&.4z6>Ε' e K2X(ep?jʭ'; }+\i`?~O{[)Uzs!kr>xZ[>x77Gss 7''qmWm˓Gs~Z?:Xhd;9L;:%쯵>n<w b}t~؍a~?O]`\2A,A\HAqU/`;ޑ/d6U^,a>32Z̤p[KÏtf&E>VQCLI<"$%/a8J%6=5 (sLm"ˢԎ\2YsSMpO$9d8y@QMzqJQp2 ~rI#R&<ѻ u'WR WV5K bQhp\@sّZ5Շ_5$³k)W%zmI3g1Zk|vM77P%$DKp7[4lZUY{bDʓ2aΈ}2Jdaݳj }K^Iqx:%؃Ģ)Sj( 6 &CU&ޜQt?W=Fv:iy2PF]0d>5C qg)#큊Rq СgD@5])#iJqf4dLTNm*dY/x҂΅ .O2$L1@9VH.\tKSeƍsVzꌶyLRcǚ$ >q|98M+1Iʛ _$  .pS.C9B}kl0gbTdtXxR%?'̧WN^*]+)zsFN&ٖ_Bg4xr*\x4P/|;x#was؝+>ڜTg_?퍉 g9:dziNDrLcl߸_^G6:[g28qik(YY8XNѨu sɄ#2$8 x&>3) qI`f, \lKHyC_2ܕ>*+G<˂ s&Z ׎r\ _W? vp!Q6LVlTy$ecrZ*; ^lxr>Wy=6q2&tΈwQDczr5>Wp1T&nbPϫ^)aq3Ӈ'C+{Hrz(I5%6yȁfJX4\cIIgD/r-(ݎ.ņDhAW̶):qxΕPEA0πc '-u#>Mq xfw%i'+J\MFDLb)WRGYb3ՁPeϢt\oij% 9涄!BIHO_ l8dj$' Rub>dH$";DX5H> ZE"i.Mf2ݙ;rLRwD5d=lËc`Q:FJ4Ooғ8}gfK=^@ J`t&}vMX4.a#TeXNdWl1l|N(iz51 R2>Y -G+J--xR %>IIȣ2kyxk":l`ӿ ?Gn/Imp)_`v%}VbղW&Y'BZnH4xOۍ%FΜ0lw~۸ zOq^.Fsc%OPOog`O1dLQ&8) "t?CSC29 m>Ox-Oi̅^:l4jrFX f_A*$FzSA"[,:IsǁIvRn0O*yp^+{3JG)>lkO[~oT-5:1&nV!N@>FϣX sR[L|`d3 sgYt1% z9dɐI,r@38OƸC1MH)&&AP %6'Ip[:I)'U_&$8DŐ. Swt)Q%ϐlM,=ˮA2qw4}."#i$25uzM_ `[:S^#68hGEPYϵpLddۿGFG}$&b+9è^h͉t,̔`̇/QlGP% [*a|_b=yLg*x{D5Xϔ/&: mnͩ5y0{}%IDcs*B1j9 |APgLif$ ̊1} 9c0c`٩D4 =VbuD<5S,6#NO&EfфYYH)' A3g WG1AN8g8r!F(EY!caڑ>@o(i8+=,'4cP^۱ĭX>zpƇ3O^ B_VT [yiʾbsc|J+q̎||bƻ<98p0I>G"i\*KJTzȰ'vn[r6z'X Y ~ުמ`UJae ~&,~i֌dņ0-r%7 Im"1_&|g%yƊAQ 45#lq"vX*' MyP1 yO38u1_\RLj^ic!;Q6nHҵ9/_Y"SvN9ϲU`M.wRu nтc:\X;^s_cJuˊ<ȗ~:Aj䅔 Ɋ\f6dDΜ,~p7r *| 'LKjӹ _ L+J,Υ$'u( _;?-WK]Iebʾ~ˏZ6@y5ƞS=x~sT6;|7flJ.lo :Kij'd %Mt$2=#()S6rI)p \tAE>usHpRFʃ!oPoWfNFv@ V8SdKD 5QsA8d%PLd̴ 4U.U鏄.U4pb)!.|HߣXL)M F!g0Pst s*mvׁL@~,X.]h,0TWF%c$wj {4#= :.4 ;t!ܡ6Wfh<[/P{gHkɃCʑ)2S9YUQ48׀VJ΋;ݜyt)*)d5/T#M:kL8͂h |0kf$+5i1޶cB+V!YH,dӏ\›[taJ"3rKb`^y1BqmqgɅr;Dw4} yS4lYc>| yh ]1`UƧo?}#[.'$d63@3$.;:$O9OIeBEsԕk YnIZQc7qArSfΊ qqRGO ;i#ߞ2B̀fl"ǔV҄qB)sKYOфoS}N-DJBx ꄟkz3npfH)2FvH3S!9q-<`hUkPKo9hH:61[X򠻓5O'׹0DH^:׻;45Kca﫚}l>T56#JizFӅ^+혤3ݑLHe^!jd{Yv0@q?;Dꝼ6!N+Wnp$a6yƱwy m@S|$`Wx#6uL( 㕔*[yCٗr{ qgD[_IgWeGI oFK;__*o,7/s;^2ˋg3}hͯx}9o?Йy6I͉r.DN>PwDTk\*#X~ቒ1ZR [u`3>S< L:bJZHF6eʢ0Z,4e!@enyL}h;8Nf8\IA^X>R-ȅMh3gd2`X*$;  ŵc\aqփ*Qgr[zgn6M;5?ve+y?xz}u]y9ǒVk,!4oh +oݘ&PdB|z(cgXnbi0kb;m>σehߜq}>z>wFkl=*{_ab*dv1!-DWɭ7>R[&5|]<8] ^gXc#، 36.X.:?h h޼(֌862nQ?,:ƺ) ;+5h. 8nLg=o560kr7k|E$i\59)`:ư`퀜e*`[vfmq l"\s x{&;:aB2{f\s阕o SE7D3ڸJe y5X<,+y c'~Dϯw./MtYiihr:JVq52ݕ<̚М82bQ`߅3Nl"@+XzAM7I8^9aQ P|R2 #+m')^855Nu4Wz/4cmtl = t"k~2U)C9(T 3ՔEC8}jZy4pJb۝޹ 6۠mƭ?޸? Y[?>7ªO.2i8&D8nWN IDATI"fyokD/ Β]jzֹC SlT SExh|Q % QgbNaxђgrfα6W-T|X4QEhEQ ݝaur4e0g%NKun0erf;$~U\yH,Nب;&;g^%&KB'096 Xc"%-94.Ȁ<Θ|&љG }a YYǷNvgG=>3Ӕ4`Ҷ^Y_uq*J'uG V69ZWi,ȁ<3_KLk["?7"+ ]6$gd2c_~?X?'g?=.FiFl+6x`sH;9{ k췅?@|]y92#'_;\{X:{)Nrpnxv_?O6#cƩUM,PŽֿgΈdE""L{Zh%~ x\C(BIkiB%1R:H=Zϱ@|*)==v)ԙ=3̍%Fgxdӌ-. ]ĮD9.\3YJG"nja1pBgؘhD(tjk*HX].pTT]4)w2%>*ijhkkL\'2 XFT.z-ҹRebL=Lw}Qf'Z=X^o1w)9%+v1iisq?5|fQ"d)^ MmOigg`[f X8M³/=t \F̕Š Ie$cY1#^P5B͜k,athU L3c0}G}k4lד]'X։YH>g'S#1>9Dd'xys8c4K>ghtQ2nᕧqI?3Ǎ'L9}@O٘;[:{0P`|a;x񧘢D>&;+8WBQ'u>ɥQVx}<(!kǖ42?ξ)}p>1GC鴹qBOW?#Y\ܝh H!O:nHY!ۍ>+Ս΢NR7&°B󘒎tzf&,W$`d?:)(Pi,kw4My[(L/350ęԙ# CE5>{1u:傭 #% ^q"1GU3%X`ΉdRx)H1CuLcq^xcE=VY wa3RYr /N-)G%%#s* Ya:" [Yx&KNY.P%&줤|7[yZC\9^\A//)|t)?k<-w/q='5\>]i9)w&zT ƞ!:HݩH, <7+|);n|>2]ƪ?`gg>8 46:@z}k(l{fa\KK lOFypY 7g#qIa|-ΧkHxODƎLJ/nq,܅/Je;I-,Z>똌Jp2,6c~`KE V(:Єbe%.m]Q0HL Ω6l#zR>Q4~rR Ø REPLrnAP#Mh(_Uga*sysR\ӅD4)D;֣OL*_Uggҳq%g!ã E34CXh ACJ̶0x]Rjwqڅula [vAwcOftgvnO ~ O+_Q}&tp/Q`KgR2n7!FpIoїA"  Ye*ŕ}ˤ ihcbOB; j%7j6O;hx2; ;v>}|sOF։PĜE)॑O&ŞedV1aո R5%-.zZ $ZF,GOT]@ucQ4OU`d8L^KaCq!_3gE3N""yz^l[kC&H:b$P]9JbFDIQs#rJ1A)ΰDb5섄 5 4Nz.Z-VMUů9}V4w;%åd>BXlax]Y[4Bš2kj$.,ec&g!ӚsYf$|1/JB>=%2:I5>niana~g=3Ɍ8 'LN/lSԚS;*ʉPr|mfJ U0V%J8?EY8= ],Ԣ8r)r*PWfM_g z`rҎX$٠j IAqJ$rp XVix{G^b03/δ'[]iְ~§9y/"®;ϕC>p!sJNGx΋~pQ)&tj99?鑟[vЏʴ2aGooo/c2T|$qʥ5-WEP@/&K祈ĮI\P\4xvEԆ^maSYV(#di'Aiq%'Se–-[`cVOjqH~+ XA5zlDw0)sa IGThgB;Q+0WR\!Xχ~^$E`y{L m&½jKE d7ICDS2-jQIV&BEEh+FfͿ086.,Ei,zX*BfkcNos̝8kM5*7ljd weRӔbGTZs/ slLD '{ TWn1B77_B_z?!̯,BYTIy919ɊNjiLvPF![ ^_1_Sؿ?3[ǎ=% F<:c0ҔuM HGE`ԋI̝?#P9^x[ko&DYA1 ˢFr7g;n"#c4XB*0e[h4ZWfMK#[plc- "]-0 +Εrl:dlkװޘ1IhjjC pbU=% /֜ޘA,%7I $jj0$G"Q\2TyviSLz ˩wKZaH]p!j~nrtS_ԔB[ I,G"`Zy`n_n ea˜Rc.eS|Zi,B;G K[n9qx|hoo =p?|@~C8>_p>/aIH|IR.'2 ǓWrmye%b~i E K\ ܱ'*kE#sZ%XIIE)1Z0Bs1T˶֑S~ a4t{c`4 Z3mhl(uN­VHRK.ւVָ"eM4gЏؿs<, T6^<ޏqgi'ck^hY8Y[pւV:PZū`}8+]"č*8B{kօawx K2Lژ|f5zυ<ςx~dA=eW΀@`Μ!NNCNx~:6W4ԡ=?cdR3UiX +![++n>UFaJAST'aG˂tJ,!lV%.ʢ,216К|j Y'+MȊau^^Ӊh]qՎ FXSn|OɱXz9g|KGw~< ~0Y29vW>?d%(>6wnk:+Ȉ4nBV3=kmrʑ7 t/TZQ&wOo+bKT'Sd$s.7L(2*O6PW(?52w\2<?IB5`d!d$: tJ5XQY-='k(a5R ꃦYnTj:]M;?&>LTb#x<_%_B J\x^h9QhHlEҙ2њ''M2qDIąPmyt30ҵJʄM ƩNLS\WMniKHT, Z"hu7YfbNQJIp!cx|gΊigq䈫;>9R:M6iiP1{Z 3TN7nxߍ9;nOXuBΘ,~Пw|+["Ucxsua|af0w q<;C9``n w!o|ocN0Gug 3`AΦ 9%.B0緲0JKǫ@ wƴ+y}^Z͆H.~AdF]PM&7EcfRL 4MÎ]1ற0245uM owNY i%2oSb"ybakɥ&'~??9f-֫E4S.VLW_|wDR0d HP~G2T5B>d-*Z'ꕻOn ]'ߨ5 ?xG#7QYCZ[ j?_|+^/O්􊮓8)/3*\.7,pO K,AAxe,u z %`J~N7>Y^?)w'4>}{keӝƹ0>h ߉~c? Σv]S?>w8;;?o_{x!"'PV+p$~/5HƝy] $/ѡz$ ?(\͕]ܷ//Fbg=F+V9+jq]$%\'o]2LH3d9(厚3',uR(ltUnT%G]Va+&{4PGn"éE%uV3!i< e'fbF,VȏfPhȸi’#X h KH#~_`~ KLr(3`֫k ţ0cRxK׸iрFJM%,itj!H 48BomI^ShcJR=ƭnR&k nYEiEPP6|ƘLmT$wi +? IYd; T|PzigNVS}.(ݯN3 g`Ef( vp,Vҙjn}K͞x:Ͼ?kg~uT|a<9p>D5Xx_W>_p Z4:j| ,˚ U38vThQFaT(7ΣmxĊ֑Ӹad~B S" $#ZfG&P4Ie\ UwO/P=8USjX+TB5IX|rhEr(-񗶜Xơ+u1bFɨ9RI1'V$";* ])ׅ [6bG[q7T`Il ;GZ2C/LJr%3J8R Ԃi:OYnJWa̒)tSS H4["O:gRX<0QyN>YZϔ_2}/օoH&̷p:w#Ͱs!FexPci|bQRF,O' !^3ތqW<ҏ+J:¬Ɣ xC%LùP54 A)%D e'!rp t[-C(4Winpn}~oAdr"1©'^*hBqzM{N"c:FN\Nd&}`[2J:|ΉȂF=s *`tj)(*ЂDdljlQDaS|Id^kĄXXD{W;%JuQiT9JJz__ [L[*,` Y:!܀Sb~,FE&a ?>Rcy0i5@+uLfYwH)\kpgulX ԍFt*?%N0}>&g8Fk>;clq(/= q/s0x4=~Sxࣲ[x: > ?İ~_q_-DM4(ՅLtYX]Y s 7]TkvTGWҤrN,)'C=jhhJkD4q*sJ8̹hPzRht z͛-@tC{?k ;7h6LT4j$ZtVX0a U;n3u11<٢y\]kMӁzJKk2Dt̵t#OzI\ui$:k}"jb8 )6*Y n| *,CqqP8KBx : >u}{NMa!2\J,q0ZSƒu9(Øal>8Dy;wnoO?i`eҫRGc E4j(ܾ礿H ou~?XPv\P t4 ^v ݩosgߍo3byR'l+{?_>9??[捯_oYTB4%;Zs#" uD" 3'E^l5WX`HmyB7) ɌG2J#\N4R%!}59Cj,#Q2~f*횠,.h"JʮY*ʢ6.cUem yXy_Ƈ8"Gs2à ;䗏`nnW>^ǃ*ɟVZ1O]_["(OOk$/ZAKؤ|4Cs?AO{'\RW]'\ie-k/n-!9S043إP6=N-#sd4a3Sqd;@9SKƉ˰v8d\6m֫Y̿LCeXl@˨qœ MJCIk6mΩT56oNQq(L,X.jSfTjp*cvUJp]0Č4MryJuA%ۄ2sA-c0Х/A||! M+'KE*lAmzmijs.*J).29MZ3 ƹﴥcV$`^'}%rJ`r]N.1$SX"&nEEqhPzd\W̛XS(6)R1Qq~vqFiUh-k7842@/^+7@3XJnHYVʶ$FK4)6ZU4#l‚p׺2^R-(M²l|Rh/po{%3|;g`³lH؉U8wY^3I`;z3z00V`mB)ƣ ]4bsL`ބ}§V樕L_&߇`Sؖ4vdpr' +-OnBSɫgqa@|c}7f1c"DFƘ2iv̮ 8B*:RazCx?yl56&7^˖櫾rfO76\8*FsR~N>ۘ 㝯l?=7~/=vCjOo$ &2135q˕C\T|A$WD`K3/i\&=qNAHCI+ EH!JgYoLht]`hIIQpVl޽|RX8w*T"0Z6k- op&8 6-QZ۵qtو,:q)4.Sf,Lf qfTZC`TJO%&TĪ9MYyiRiAjD4IAy&X 7y8œ䤾$Bi0 0P\lO\ku5hr+h6DEB1lĜ=>kڙh U^iH,Z Xq7+iJjڴ{]z5$O5'g9.Qï4%z:s="9)̄}%: t&4@PC2QIڔ*B憓%pE]3F⚃$*;^eJ,+X)8- d$]‹.L֖BM0^EY~ ]]ؖO|.hhMXٱ+΃i>ѣRmzp,N\O=j@urXrUhP{l,L&so e@O$ǰ ΩB?+!tGݠ,a+y81F!'6ƻfs_o7<JRT*Ҙud*PLCg F:1E?ޭG,9[fyN]dwIC}Sfg `&bIuFԭό(5YBX7L'kDO0>ßr= YD;Oj].\3`߷||8\JqLr?DF´F _}V NFF<{.X=dgy E)/r;"9ėbi$8Y='j IDAT*5.p0 4% k[KgXˤ%ҵ cQ4%gH?!%af[\6ؘ#=$ *;%4+1{GzB'9ԣ)%E[ )/]@87/uVtFRDj5[~,8";>%^C:@삥J%`YZT„@b&@= +4\֛I1}baDb£f̰0%،CG9n\d|PLs`hb@'SmĉhkEIkӸA49VdBeZ̙&k!;l,r7cL TUD+6:)*vRrdu8zy UY6Dۏ|~bqk˅#pˑ11w?w:{-毴ZGfy,ǣΠwZtY9z?;V{8*o` -?Ļ&ٹOTuZȢd@4F r#`*H$מ杩B2NG%:07.ϤtpN&fFN45g52PugLǭ[ uER `9>E>ě`F `AKe>Iȶǔu*Sf&Y>ω)8TQ 05I(2rpθ'45KE%96('30PS\# oS[(Q L$ mYEyKQoΫ&rߑChƖVB7Oyr+qg;d7'nw~3+>,Dٰ!CF/h%S\H|%"P 3Q%zL2|N4c#0C(bH͉RS<37<=~|bJ踍BNl߫P,r=+&5 =d6Dm6ڮ936%R1Sz$g=bJ4zLM$ ޤGHggPP zloq3m8*5)?2iœh umH3r*bXI) waeA)zGG`j=P.~v.[47! ʖO$?>?%YbLJ+i3Ù:1u^wRdMcHK:zY(; Wʹ։ Y&Йnj-f&i8HB-W;Ci \Bء{1kvq֚-h,D[f]/xL)؉릞X~j;BƋ Y8lI3u)$lYj 34I8mî?NL\Ue[9GQ֜3 QDr_J$I e.x>9E;2&EH|qxِ\1H9_iqMha-o)kzF /OO+^ʕ4owv _O?k͍^tHbyx_x8#>VCGF](p.{3H.;TnoFW>~q嘓y!Rx''c>&I9pHK'o7|PiyX*,vtDazp h񣂉bPYTI1s>P!Z @{CtbV3<= FiIg,GkLO'ٗID>۔82h0UHCa rbpeOᰯaWsK%B XqF٤x,$Vƌh:0L8Ԋ鱏㎦w;IVA@Y H)N֭R7ELnpOrh<>r?9cQQ&y n"rܡON\ VAĕHtzSFf=5ñ9&I F: ǖRS"Ll4.aT̃.Ba9jbŏcJIN? #ZєQ{Jݜ&7!*Qߙ-r: uCl.aLf肮)%{g;db) }i8LafbVAge%Z+@tP|S.,A%"E^#{lYΉotJdT=yϸϙ^GD%$/3?~/`9}nђaO i{aRGrv'K,+WqM940tDˉVpX?lXf#؁$X? jW09FGlళqHW 2ᝒ1\54&.QѸ5N' *8_M_@XdEO؟NpA9$PVzrQl2:B(r,m# 퍢+ibN5n>8D̯ib .f_KX.)lZRЂ2.¢O2J\,lI O\z}f{zaYzyQ7RYx\fOo<~qG>~|>s}?q;׃Pnᘓ}& Oq0j6pFG{p>Ƿ;$~Oyӧy`:7~.1Y}ʘXkK:iB~lu4%րwI\t0sI&!2]y J$9~Ńy|pXU7c#e l*MsiaE00K3!s Npib3 a,#(3Z49Qk#i)Y֩a"RC2'`HHsi)Puʊe3PI4$g!Y|=!Y@h:8*zH(sZBH","WjVG6dP$'6šb+;\ H% }cj%e>cM$JlPB(&ΙP!933l2 | jE! 2QC{V yᓄ3: u[a䕟Y烖Л00fj~L-Gߓ[}'N^3_=?_sI^tZI~ņ1->-Bck\9eq:.LwRGцu or;sD2f6I2b.@QGrBaY:8!^<Y1%l)+V;fd \U}ɭ"a\v'&qgd9 MԜ>CFS* ^23:[%&6̈́ "PTFU25dfz IS?U}KX4C(3\"lnYsD^͇#&C԰^s`mZCȦؾsb%Ֆ/a0\r%")Qse߹AFo%Śjj؅<|@,Katui*&KsLX, 0LrN^54Ut6qfo4YX<$ ?-G#8wӑa*W'LXy3YNSXs'$I% ~D53-Sj98Fؤ<rLaOk9 V\ p1UȈQsϼ& #6⌑}6;8ydD痜q =DDtT D)IeINBJʖfWٔqUPfHG<%SXb>`;J_PᡍiFəDFBF危[OVȼ86V坵=sOke/,Wa4}Oa:v.f8FwE0s"l@cujHzK"OL cDᓁ0l.WD)U5^#Êq8$W 6t~/Ӱ6y`h^ɛ2Ņ֍'M$iJy 6(]}~@:ϙ!oovۿ}>&z{ސ&죳 O<a^i2+&Y 9(L7rf;&37&vY MOPx}G6'y V Q\s#L RkG={S5]pmX;4SHk0KN&'sLRKn:ЊL( $U Dl:8e;>qi4^?0ME>wD,x 5 TI1<:3%uThv% D3I"-0a ]k2*Ms:؃3c?5T^tuua[&oV<3{7r0>\Kegg=, ;}#_s-u$5n |l !+tdĐBv'3jcrI Iv>^fq ξKu\v>Η %e>OGf2xBV$.~'D Vy?pbqec) ϒEHp/m0 mtWn[+:s1=ac& g1).fV 퓾d ?D_|LPerRcjXEl1ETD0gdԥ ڃ) Y{v2 he FI1%JtTO.ayJpl b}LsAqCY,;5}ܜKp=#PZ-s`ʠd, JVM'ʘ=xrD.uKv(m;,J/jBh'{\0G00w1Yb< %Px/e@3ɲЋFKJ'Ҍ#;I o_>}Rkbbóރs({1>J'kwZαIz .keryUHՕ>X4)%'L^r9=KF0Yudg.$?p7Xq12& 덧YyRs tS2%TEنllXM܌&вYB Xyt,|iK͘4p ,(ͅ.LN@3dPjhXU"󪝋|–2޸'jN 5cNRR\ˉB]LJL|OBୱ҃i@x/4:睋SӯJs ^ TukA\Jس)\~ p&}˯ FMwL| =&vei\ZCR>Hc'tҒ`J2ILu?^Xv> 7`ϰe%nc|$^B ;\#_A~ hHzt0qW'8m3~\\oi__)a[Dߕc /?Q땷%=[X]' DŽN`ӨdLFǙCE2CNy^83&Cm)nRxO|8 ƚ$mrZ]qX2iP%|0%0[MSWIwsDzdf?1)1)/>TI&lwo`i0,j)&B]Vΐ Hqa 'Qa0LHuL4GƯc RVHgX8Q Y%hiHN8AF1&g<)=VTϬuxLm0JpY12g:7?3/[r &,/4|dY)[#bln& 4.yacm !=蟟 C& 2*XB=1.xO\?iCH[Ț.ɅFU^S|۲ݸ=/?|VR*lm?l3,\fhq_ۍU)W퇯3߿=P2_8wH0y[#Ġy}y0ey< &/gD.p<]Yć($zQ{jFN90LYyFoC<Ş;wq̒&Id y%982Ћ.<ВSoh1=tzq) :fF]:#4'Z'D.Zg`޵C^X+%ҕDV{SSɽJڨ# Ś_J `kgŤXg]_ HhiEQ&,(ʴɢN)~J&d3T,4yS 43ɍ:sgdC 6E2x0g@Q@E%~ m nI♞ iM=DAbU;JKF]DK^\Y~'Ŭ<.$`W-qO6әc&< oS%hݱ@̘/Y{!((|f1:i(ʈv-~Qz|S؇MzQP50"sb#q!}&J/XϬ^@}.dYi =YaaIь!0q6w`/ʈB-L2#7F&_<$r^#Cܡ TMZ:1(Db|.rBGrI&uX攄Je\ȖHKb!h-\Rj5r*,a"U剄D̲^p4o5!^Y#V6[i6/\š\3}fJgZH+m<$,\^EWe̢ T5%s]XLA:Bfr-D0Ŝϼ<>AYTmFr}ܟ 7~kNn:o7K_K~yH| HQ(I]OVuI+G$43UIct#qՁeMcC˅nƚ;b1]&^3]xF~?dK\}'-9Y):Xӕe>#@QJs{!Q4o>3\B5 ̼4!0ŜGap.\}ZAǡv@PC> \w }eҖL+} R+r'l987&/$.i}Nxx˥8{D4't1V uIS~|I : 5Jw0șbl.8^ ]!2&Q ĔyFk(oM_,UxQ;q T]pɸ:#)5\:Dꜽ0|UU$Zc&=>)s`>:INLޟ ! $3&#VOy;pQ2iGIɂ_RYGT1KA|彗93pݟ ҄{3YIsݘ=/[ x=xYPy'J Ztc{dɹB?+Mp|\3o&HH}7~gI^w.?Z3!}s޲[b9K&_ĩ2 X kz%Y;xt )ʃK?#U*Jё%ypeꕮKD90*#:ΘЌ~mNNRLN Sn$-t'u{:^P+LBw/L0 7RX0 2)WUZBϝsU$$ ƞK2<]Wud"KX~݅XTSW$Kr;@+HV82RLssG SgNzQ~e)aQRhQvzfHAhIihh2loSXf)w \=O(:Qfgr|<#ۉrމڤIBPX/~JfNcYFPW>r'ǟ h7fs}笅SBBgtvDӊ9@p sOd6)G;%|0 gFvbll8+nI{ @1uAJL`d44)uN藞:S]fQvH{H;50LQd9#̔ڹrf,M=JBqםs@=|w)ThO5Vw$=G'QIL11Q47 ^mR}F$AL ax` Zg?r>}Ϋ?~Ipy^x8)\N% @y }Z`15} AOqxU@^B<1g6۞k 2;~F~(8\Yda/;0<-e]V>7jK31S#s&Dö)#3eP51[ =ҫK `̭ˤW(ltCE8*S6r]JV=btt#l?7b:efGVMȺ͘V'$tL`zISu23s×:m!q8Xد.Z<3ȞP b7n V-rkXUR3FVRwfX⨕ E9dGGgF8Vtc"e'5-&%NɰƜ`Mjxq18Z)fP&VxВsObkQ2P- }<|l\Bykˌl C=^Zj[;EyrݙZp}bg{Kȅn=TFuM fcL"\NMXE` ulѝ1SN%x N]n$?!1qxY+"1^'9ԩCe ~CYtf>"XD5`g%&!R+"U}fܓ}Jxcy%9hź -6<rRs&(9lp3gMCt 4E YVeQGh]y>9WlBUp|*c$Ӎb vF4 xSp70fvu,^9#pw~X pJ@섥-&֙^)sgo11jYSy[*'2;v5kNaZ,Q[f0[431uK $su2r$Δ@2/a ,32,jH3QZctce)"S\puD#ړug,e{eP5=tr&)*9D0&=O̱ǺG;W~<%wbgR!󫼻?<^" Pw8+| EDq1E]^b%E\`$V@A|/Q\-Fd׌}ujkCaN/lo~'={0 sǽpalXeKf,.[uCp`;sxvw9/Q~|3%?o/᷍O}/rgt~ͥZ~{V{Hʥ:Q2`qgwmO}0ˌ/ gA򜉞FGg.ki *9vA9KzhъoY0Ҙ\Nt2)XrppG{Hz̶G]$ 9hKL0f?MF"MIvX֬lm'KBNf"0@Y}c_F<5vw.O% s*i`bY& R-o 5i%"]JEFM+6d ƶԶ=ك֑ s\co_%w16[>X&JV!hwMZSLJ Mh腜N* wNB4g ǞhSK၉&mxV,tt1̑Sx_dm%\H8CWr@kƄ9LƒD C1Xvl xTf!D.zTtj"s-GqZj'[pMC>33N204 ZNahqM(EANCUi=Z ?"E] n,r+)Z6EY xJƝe&w'qp& +5aJș{.wN4߼s4n1셚 aw.ybp6[?os>_a@z %x& lƶ ZeS:U:$%@Ap ӓ? lGe@ xw{K[g,YXžv V_83 /;iK쩳UkIt/%w#Ĥ]c6I(39q"CCLNfփiNc3Qqd$#I. Ȣ\|S>2v Xsxe+ HqG[8xJk=dR^/1g&/-ʌB{ zTM6="lb p(\4wo?|0n_pOj@{ӕ wX)n zZh;fK<-D4XGz*Z?A͓-WvǾV%R\m-{ŗFBnV!2X}4b"cs}tCY*"xfje~Qۨ ьBC * IDAT\;5=UfrL'g+̴3X( f(5mGfh,BQPRH8Cf6ݣBuĴ.'r dpˊ$񖞵r;9-a0!|=򨌔!5\[~ mJN杞Noέ%RXmg.U0:>+97+$kclX0xsܯkLG't<#3}JysÍk0/߀W/q3XEHg1[dJ O-e;IHN#sY`NawtC^*^*o-smtx{!!#usmO < ٝ>a 3e<)sSˠXY-h15;+agSt[SL48BNdƊp&WCFfIm5W`nZPotHBE-9cFV5[Lur /`ba9EI]a-حvC#33QʘO1!iI0T)C+Ra~'&ۤ_ݩgГa%3RKQ,vLN%)-(ny`N93X}x$PN3l5: ʃ3L^j|,ُhb'(Y<&gݿ?bH-x>joy/;q0}|;l|dydV|-`F\_;&V9ӧ|E?3-|>k0NIN{n\07#[+s\^3-iԄW<~y;g&O8RܴDl͜tQl[l6X$[?}o~ =5s{iAFdː{#,N2Ke-Q>j؄ :$)RyLJMA WD#{tg:b51 $ dVQ9s$ yD ̚ !S;|I;y]/g0tEX5h֌h._хmYS*xVv7+ɘi@R*W6k&DM) X*9q' G U<u<ɝ\(4YvΚsr.JvOdx+'9E=q0L&z6+xğXsZ+o(mR80;$^`"'~Y~r?_?_9G͍? u(s/0FLK/7(. sZpzscbs{> 'EPQCXKh9-mK\Ҡyb~yO)HTٷ&6w$ IêfJ7-i$[09lI’@giMCE2ёYm8ES'*J:v5)O'Ӊr5?$C*\JdnGʣ (i҅zX=,)M1<,b,ߖ`146p a{oAy66<6sx-5[rDIVbJy-09hQ Nh (tSɒ%ɝii& Tg”lө0M7,v`3 Y+m+wsXNT$;?|.۷?x=_.˹o {}2w7"4qKqL!Q ;׍?y?yW_ޏR_1_ho`|mO9w-YmYOJ@m=JBƺf.2YisLx ;xrڨ,.u6g}m}JkA{ŽOϿپdޕ ! %VT֢]JjMc]zȨk+96TA/nC~30( DO{@)tѧOI_1Iy2 xM7F4x``$rb/&D#rX2UtGd9^Rdu$:]*;3 se JEiMogX> ʌC"sċF'&KR0I>6( 3@qJ$.2hc:7zJE9k F݃lbhc"h1C$ũ9t`N1G$ V9(Ndfx$TNB"@2d.e(=(UW<6L1y2& ҜLIm z_ͼB\e-l;Oo/л̷!^}yQ}#Y?߿;k_r{~%k' ]^o/? s9oK })TǛqmXb1SZ&BADZے2#=;'hΦ:Ǻɒ@4G6m{:nh&)/-kIǬ&4tz0Tኒe2 lMvꎋ s]kѯ-3,,Ad{$݋H)3G^#e}`W:\A@[ļhл۔@;} ڢ t*r:,嘮ɀ6B W {lx~o\hEy= w_8[ZӆPrfo@ tIG٪ ǿTH\{P(¦\gjt]ÁˣvӤJW_TU]&wK(dtpQ;Fq('E{ 0d><&T;)4IX3MJV*_&<1L'6!ʸ9u /tI-mϤ51F3l;-$=&d<@LIE33H UKC:敔:cX0[RV'10yDB UA]ӃOO`М&4i dJ QF6M87DY2au' BqeKeмREMJP HNgrirOhtM<p]ψytB#Ι~=ܓ?|KOw6w7y ^ol'?ڄO9dyM)ߢx,KEq`)yĊ_7- f*-!~'<7H/ѶL<}# ˫lܙ3<檊Pj>V83h<0f "Kw\C9 T7GӡDpěId0G"IO(M⁑$dD1UTc`cbE$k \qu{!bq?Y]R@ߥD&1U+ձX7jhQ֪3!`';# 7X8Dl͑"QZE8@YKe]3W 1n]}o1\U$EɒXؖ/+AvTI(zA}n_K_[hQ4HѦ"uҦF8uXUl9dhJHJCea,E ^Zs~d-L*d;>cNՂNH˺G܀TPAadO xgg oo{{U wg)۬&?aP&T(# 0'`26%VGJ;$C#GS]&PŮV+p@{V[lGէ")H -Y ԰2BPU:xwϡ [@LQCNֶu*zD.ۧ摡C`J _x]1}H15JB=̡KB6 B8\([爌$ZV8س0$9gw7 IR2;˨8ώ´CΘ¥X0A:-䱉-#d\PZm0zM֭4Zb#P^72[?˫/~v4MrKo«%z[ e/$ֳKp{@=oŴy䧞#H c¶C<~cL}KF iB] wJ=q(4KN^$ )RAQa+FHx]I8 Ǒfg\ ƈ:b'$^eRA=2鞞b;멀ƅo1VPvL& #d)8y7)QBgSyG9̇ ndɘ,=bVXYYDkM /cx1"ɹ\ 7_6' kr|Sinv8P~XѢ,6ꐄ.Ǟ~8킝~(~=VT3]3BNY^N109Ś-1muW*22&F_;+.]SL$e}"ئ0k3բd%J%.G'pjw&">QX& + B}0 洑2F4+ bE yD[3yc+F%f냜#ȭ6bҵMb04`YYB(UQ[=3m^i+}$ K]4t0OՈ Z¼U %ed&Iب2ҰXMOT{*ؕsHV}O$;G0lu%t\}q?tfTig4ITô_w IDAT^`Ц+ Y=ex+о1>ѳpcs__fZ  <ҋ3B*v+m*V2}'{@g| v_'*I*r}w_xuc-ƽ17UMI9=.8A`݀>i J "#Cij^Up-ÝmA#[l846^ :aJF"t ,ZX3k&-"j4[Q4$0Q#2tb+9Ihn0{6#.^8(a_m dڂYL}Gi75DhQ͈h0d{ۄPWR -Ɋ%L!.d&aL8y%D˳2kA(.}̔>3lGvc1=q^UPcǠųef'Leׄ^2#޿?7ܸ@RnO>G]#.?K/܇n~o~y֋S՗9^T@*mg3/ߣ?a%3W:r_+Ӝ?x_ T{g~~.oO܄ޑc/*Z;#י~X IInmeias(kPE܊@j\IGGD͐u!AxGXr`+Z";(mFV1(yti$q!fD099à8'x}m2IQ m[OM2cO{;%\XC\:f|*L sԉt\ADkY nϰ͐Ij``!RstP;RRh "8]! 2$LV:YΝ&r`ő4*xLJ~q]ť]:euㄜ$1ZJ'W+CB]a/7&D=~BbrԌKL & 'z#Еb宔HEzQR9ժ$䔣rF| K<+0RL@OSa}LQ,!d<>$&L[ƨ; GY{tw, .d͛mYdM I\3{2M]?;0REDT#}P OWcɴZãn\M8鉔(j춅\$Td9RA?L/?O~z^gKΞz3orvos/1{z+W2'R M<6ow/AVKTe~FfoTK:#^0>Wob k{Y>X2=3*mdq #AJu$E\zHN9@6@8G^xX ㌷=8%q2j- [gzbMLr&[^ 8mFac?1kb(\%Ɍ\QH|yfpXwߦL*lQxM##LpC!P{;i1EFv q"2"W?]Ň-8*)eND2biJ!Q%rɄ"(.XG'Kdvf׆QTT[J9b;qE՘taű<1ZlήDF#0s|}o޼IB3+|YX߬K'?gF9'=C\އ<ׯʟR߼Izks˛pkLkO,~+w??OO"_eԟ_E. _>5SEJlX5ychw4gD/׃I}'<7<5(5EL%aöϑm'QXҘE@\z]Ҕ!%|*UVLj,tw$XJ r驑ѧDm3Y=c9#$>nzSU5 :!Gr(9 )̨bN5#W%{gHL-e u(V8eX"- =֪v&24;%LqIѷ.NrۉڔfZod1*۠+b0vQ&BvgXD| D7_?POǪ$jXA¸c :ӄ;4̕UE7xcOPr@MuY8.+F2 , ɝ` *'>XL\KgovXe"YDm=sR=я `YcEUHY4ck G1 iGrBDWG!5嵺R4ƈwtP ]0US $I27nmgaIqaxaZa #&`9)JY=:Vńh0ict9$dV5:;7B=-xq98Lb{dzJ6Vb짉2Хr5#g0PϾĤ{ Gmopo[9Kwx'~gsﲾunK l&JȋSHΖmWWj(Giy6԰,n M /S̞)~]?[o3{p<%^^N227¸_MrZ%҅N0,+mSxEkE$~2"M.SGZdp % ?WڈHA0e+;UN!>n2E"YY\i1n6MlTJdDLC<0\>1g!ś+x[CuHX! _#1ڎ+ICُ>S9y(K\NqJ;%>;?w޼]Os77uOd)G:Ohd 5mpNh"8=SN|jF)\ڑ:G1=csc֙;9ʹa&iQs1Oc1A3\?9Oد| 3*Vd8_6i.үp)7F^kpaiCV>j =u갬B0*>O/` r9p&Un~}{ m?ܻA[/^l-3u=of1UͥEJ hv MFr p N٦}dFW%c$Vm%nXS0llh^'YepTı-];guwC ❤!P#A7fYćxTG bu :8:CC,!Pa"j&B,'vPJf/b-ڈ\3Q-+%:sf].u0%@xOI`5 gT2:97Ƌ?tu2+(w“̭/ƭn5/> ؟sCyk7o3st~/uԄ{O;oɧW(mJg-\+|ۍoܿv~>_⵿?O]ݙĹyk1rmwL#U+Hcә{Rhm&A aٹѐh7p\R1F ІA91wfO据1q-Jr1tݦ-6 :=XA90q"JOQtAo q78;$&bC,W*S %0.illF`i(Ѧ,9XTFemQ\3Ox_ zUzf#-O.Վ5`whh52*dTL4McŋGBn y)"6.A/ҬyqJ~Ij2GASnUJѨMQdn04φ4j8IRCМ SeeF$* m%á͍l>&i{hqR ؿ10amVL'h=ċbߣD|U{wEhߍIGy㈪ôXR%&3#5& ms(Ѩ->X$YEPO648XɽUUQ)np`~Lx젍$`婒h@^:0h{DWNzL*+l4WTY@lF#J3Z:3Ӿ1MfҮ7={?\8Cebp6;{PP5VP$(cl59JJP<~sh0Fl~oO%@`3 >fDÂl6<~.Esfb ܂14=ITYKĎGf[4~Z Z p2eژ%3sbNiX9(j ICI3 \8+٘Gɤ^ f1pӱޙqx8Wpa9s%iIALY~O8iN>D>5.W~oOOro< o_W寝sYw#3ÙO@Ҁ_o4S=籧U{ˬ_z&]hmʕǸ2v|g߁/< ~wxo ygq^Ư6nq$vMXwv0H+ݘ҂9kVtT{DsN{Y%%)D14/]:D8A!s,x:uMDÎ& JnCN[l`Z佰ew0 PZIJa-=>%憵VjBjU ռ4ݓJ agWgwf6p^1#=)g0IGIz Wn$Xtf1QLyMNAk9JiE*jD6vq qTF҂PiJPunTBR`]11]DtFPZĄ\,eʶ-ͷ̐ȒI:HZH]LMƨFH4`Y H>pK8}CLi{!\c<6¸fvcO`FF֊8Y@MДhb9I,qE:XbȎzPFXTTl:fz_dWNiˈX`B-gm*_6섕f+0b5:$~ `dJm)ٚQRii8y9C{85gI^D ESͱS^إhbiލjLI۔uas,w{+0BIQH'#n:9gvPt1pߏ =Vˇ(trS91/?ν; #~KԜ7c ,کgL9mwobWYeb`+6N-Nv-p7ph(+Z0K+opʋ޹ɕC=p4G5ߡ \0hDOW~>|t|Pkk?!oqwx7gwׯr vzݺ<< ;9+|Ryy.[G1]}xk<9ۃr1\{zSxӿΝ7oǗ_FUOد]x!`=7.1s(]/~ݑXQ(녔uN٦IH81:"*HG:+Pj85ceo?/LʩmݴbZO֫NW}5]\O|;/xs/q}_&o9Kr[;G I}W_9n0eC9;]rN"=ꝣ7Ft?,Ktx$, !F҄𞇹IRԕaۤBA'MҜ37D- "Hw\ZDH>2Ƣ[V^92: .^c;J2w&;fE ͏MhkO4"QM0+- Bc-S@%pz3T W Apc!NIE:mDΗAH(/X3zzpTܱQ$SVL8BlT1 r$H:@`HWU, X[7[GNNDVsh4 }jKLɆO ^={,4#Rd$}r!3S]t>1MpI)IhSWA+֐ dvj>9 ;#SYa@G$, 㖡 RVzČ/:kHrS3g. u]9='1dtσNayq<;ةϳ{m9rK}eEs`"}K92I@;t {hEF d< [/~(% -=Gjԃp{:!'W1XuUȅm w^\I"#!SL't+4"?ZR9 MZ*@ZLfCl^sb,֊*4W4H .glz,yd~{GK&3p%)xONQ)֡Ń"0&|D Z += x)6#'eY:cJƼ;2utc&Ԭ1!uD:6dhd"jOq\B'XzERQv>hNONZRWȧt +|'?GG3gxt;t- iP6#s,K/ۼ&O맿Au8zGKsC|-^{MC!o8Wz#onecĢ$HIPOH411F$ǖ+vMn5V{{5c] syXO{}˼w{0?yU3||ϟwğ /? ~ sFS\=k*G+) 7b"nmp?u}J_~h;MFPe#T' [KdžJ%`Gj]A)L~BMt]ŐG]i8O5#&4Iv9gJ-ExvVV02؏3& H#>K@ủʈIm{fZO u@5s0vXCwhJ" '2WEG󁬙O:sN;s({.\sUw i7o1{/0;zښCa24] /N_|_z|ocn~ȯ\W0q'_~yprcr,=vq~ F&Zcrtr7`y Sf4M;W?ˍj%%a',38-> W?G~Θ*zD>gl7aAS#[F0_XPq`#D \wA6H_5%)lE$)A#JS~b[5^cx}D %f4*6ѫ# nKT(7BI<"26IV U%>_±lsjLmQq$FvHTi(ʔ,)1;] 8͙v;0wrLu}LQ$L5dv!Op8@\8tүe}7 |67> }^W;<_|Nx3,NOMۙ;;^y?P)΃'g>WSenx`nGW\I k;&8^ҧ :ǫASȍR\ e+E wFǾDAf09P}y2zSBG+}3>7GGdhc I~qmxhoVkpH`BB~ıH-1eW8ӈ%+F_ȝp5j͌K#ecQR7# bm{,bV.3I%a9&h d"KBv)/#9g֒Btb$ hѦ4zYQ&iGccQTcPrVrsrb.ѧ?YNti< n ; Ŵaxc+5P#P>EqD`Q0씳DHE@ZeGk ;-,PIa-QJk +itOtFzEG 2rCmk2Y/HJX@. K$RH aernjٚ-h'~̙ RB5#]Q"Qcy?5̜j5AȩMIyPs'sn6F$Mq(]kV!*]|Z(XG)*JMz!dL'S޷u>9S L8R v*O-,{f[YZ$;sշo} K]$hL/*4a)`sXgu_yB:#JryG|SNxQ$z_gmW3hݻOl%ARLmsmr %`0NtAjA43f扢'Hacʞ6}v;E$ 5kjs5\=ˏWosLNd$~_ܶ{oJq8,`ܼ|G_>?c7._ya|U?<v|vbgDvsQW|qS_)O|w~ofxLJ2 aXlҢdd#r tPyb8 lCθ01$GV_ ń rVrt LH2u*ٹnss,hNŢkN|2822-p94OQW>Ŵ,&o,g 77&4⑃wwfFH@?STо2{KpoR#lXhִ[$`̱Bba6sbcm0QG9)AAƜ I s&पؗTуd0YBrVh436mz@?(=)W+dcBp=%z));Fq|]ȑ0_YB'KC2(9´y=RhSE"'eg&dML ݢ~|b& idV0z  S16R ܯ{;o8_FcM%12Ы3 ;HjxO/2&&`_0~~O~'v? , =GiYXy_`)~[{rc3ffOT;q^[I9꿗b`/)PldsݾIcȠ$l[wv$SYJ=7;> I 5!E f&Ck5&Ftq:@^=9WN`ԘOJwCFgNi{aJ%`s-JvaaXQ<OHj&Ƣ L)P"-bJ6UBN"Y^ V*KvbC8̬ MuN ^J*0:g}5֝H"ԢYAW"h)̣Y0t?%]&xy Kج )"Lk$61Z<<4V}AٵiDktL96NJ9: /:h-1I,8rfJ9bB VY6%֋i4#1Jmkh4LYtb%b1&g2B!. {vZ;p 6"1ݝ,PS&n(&&Jly] `vdt@6:/MQNYC>PY3yNQZa? ܐ˫T"2m^`ْV3skeB&\3wLsrʒ ׎;okʭ7vi~-9^{h 6 =u%4qv>s`˔-KwћosL/gebz&D7BEaF"+w7|A +4*k{ɉ#ӯ'im,gGs/qa Ǥ  # NYBRE&C2z˚f @jB 9tܤX̢,Rq IDATcҸ,~$g[CJF{<߳?Y& ˪i1%'%+XQ4X-}%YsC`XLM+V5ơE7##RޣuۓR|lc5.Luz){27ʄQL2G_\3I∄GCZӂw9|E_ɬIVbY2*b2xM"zWStR⩏p LODz>.Owx|-Sl ai0PS/2Qʣƻ燱?[wpg5(v<MI?;^ɗy2߹pZ{_oKd^wl_D9B TZh{_|'9Yz,tKH8NEmڔB9lS34ԹBS Kw4%j\LS-84($m dF9$Rh TkJOT2 g섭Q&FbR 9!k#יzl4u;x̘w+oQnT\ c Z撨mZ#H [U(ȵs£4\$:ox_߳$2y _$jq`ǸM(l% 'pwjr}lz֛:*냻,'Wop+~1֭g{o|-zڣpA Raux8.[so?kGk=|&ĥ#o"g9351*X;j75I` A 5aCb7w{ -]N#0.WI#UJ !DfJ Y$wa0#ٖsr ]vþБ"v5 #V͊#2=HI.1I[S_4;#+M`lВ"FR6Mj%i雘Ub բaʍĄPF%`^dH㼜YZQU#-&JhUM3&klbĤxFn^ip=biP·c&4x;4=wj |̸2Bm.C02zK_=Rs4-uM57X8n__sg8)b)O߾tx`/??}^x?|g.|@ʼ𙉧|?0`52_0΍16R8YϬiW؟ | +C D\g %H-s$*=Z;yxkMIL+9eJJL Y-w-SKd1Fm" R8iXFԨEc"ġr jcnr\Ϥ5!Y W]\ FYQ X@'ȠtEt!鄘SlX EF 3CG97(ʐX'ɡy>7Enax"GWstITRW\v,#7aW-Ysv8C{6^0l+ڑqfUvKWJR lFZ''#n&9P~Pܱ\n3iG c05_ΜSntmӉ5ZКK3)85L:vN1\w(kFXaJЁ †j`C7+KW䡐}brpx0Me3w|rtɁu.uE%2#YT&("Qtǜ+c\#Sy97igOa%cjo)d0F,M3El`Z0i:MR1,1R[&#Wax2 LΘH䦜sƙ@;{4m.hsL[ϔvE/7ѼG~Å̶f}auXӖ!T-2DB]l9j^~=zHCo~Co=ÛX N|a||3rt#/0{ y~t$RBK+H4+N?8hCg/ <7,rWNMR!֘H-c%!c+k!DSB+**(FJu%-V}+/C??x½k|W~wϯ+￯oyg9?y#? w{{օgnMN֍4c7Ε+dSrfJ|oǶrs:8v$W)ᬸ M82:zbb-{֫3*+Ήd Y|AYq4S,a0j@N1C;MhZ1$lJJa6ltjPhjdA"1ZF͌B4&;kzMؑJ`u0A} lN5{tOdm+>Mrh56bAA YbXlJU#8YVTA^<JlDJlh%¶G*)檒q]QF66!,9 }q[C(iyd]? 躭Ŷ5GkGӓ]u(=)_}{3iqLžu!cnD"pr;J#bbbFM)tRӦa 7(*h 3vvFM R;e,w5KK")!cr"FJ΍<&lRz[nYg|AJ^qwvYR2U 9G:j~8`?X%R ,ҤH$硺k{{u,#*z}15+N~X-|ٵU Mc\fN""7~F篼 7U>G;n/q_G<|cbo_6C_^M>x#xY˧z{Η>W^h *6;կJ &q Ffqyw;;w0 s) 2NPz>{Ai2Bsc~b=XuuFWKN6N[X%{Amik!cR&Ԝ$ {i ~ 1BHp[~rRi52"u0җkh$&2ͤbG'1QsdYЉ9gRٲ9Qo`)n3$Tb'BIU b|"3<15{Ԋr'guPuʩn%!5־"(GFA0F-dLep=wvgMarR7[gXbW˴gːⅶ<4lQ٦?3]7Ң费0`VKa IKOEV2k<~,~|p;sL҄*ܺ2}yQp||"70|%ubIf]Xhypm/?O"3|☝y\qv\s3||gRyKT, HR07rwF1zB$8O&zk|M1`}`эyDJ{9:e$,0y"IFkе##k|QI4.$GBhHK8;\[ Q b$6j\sN.@Gn(kȑd7)k-$?7r mfBPZ(rf8Z#`Ziax<S#-d-3s7Z wI:uJ>rg vΚWW.UӒrf1ΰJfꔸ/}\Z1C"h{e\ Ӟ7[Q?ժ:vQ=wZlhsb7mܽCM^_pw*qO~;7Z=ç~(~  |cqw9Cy)1H@ɯx |F{kbNAח?d8YL*W8%svyE-嚡gbϘ/U2kNeSdN)}=1FBR'y&N-0Mi짘jm^7zaʅ+=u= r.a㆛to$xtuz6=!ɑQBӜ{hS )MGll9bJcŭW\ ɘRlEBM|łܲ]6FZmB84btiS䄷q m ˅uҪg%.5X%ư!@ʸI2t2[]x)}a Y$&+-(2h3V8 .௕<, :qƠm8khJtHTN*rqk5!cPҞIO8|Bh7=#1-j46 ʈq,vRI60=XW=v'6Ho_ʢ\`X@Ockf fVqBEcD/|Љ4?_̝>×p#޿LJ> /]!r?_g9>wFLUKT ?BwWJfN7p#]bo,3]d^tSd2Ź|#(hZN0E=e H諐R1F\C &$cŧ`ZByrʔXQ ^F)mùU$&_4lf1yʵbJa"!I㒝‚qZX&^9OAf0cĮnﶍr^(re!8 [4sj+v͵dl3Q-XiߋCY[ĦnQ b["/Z$dԶ+d8twJ )Lmݕ$Ѷ$TLOc2dO @xudJN10Ji-6y5WJR. T2𬘭 5НDJq0V|ΜNy>8S3 CVgl$j^idRHu% ١#ϽMFQ9W0Ii"iRL"֩"C"Q6-C+?{(}|R!eF|aІrJ1 Ld9{M{ʈl^VJtN9Nuɭc'aJѕM}ȇU_S[Fwn3z8K20ƈU.c'5v9V,N#u(&qcԔNbJF{\r'pNZIv&IE3Y:c@%4kaA; 21mAW4u,"] HGkvnTFeM+ Z`J#& DaDE2ђ3HspX⥢cOP cO(EʑVfG~}F#n;>MDv}#ǡW8tf)^S@8:WB=y7%cB;/soMsxG79돸 ]iY9YNBEw-O~1ɄGsk_y;ϞQ?G'#$dkuԷV DX8*SaroPR<^B<1hQ&tX=-O\)c0Rt˘jbKL*n4)̩M>!U*a 2if3(CY,TRI/V:1ڜNbYUρ:LQ10L"ѱl6.WΓe"sD Tj'd>Xs/N籌L=.ãwA-239%9ơVjQD-E8tF͔b&wa?k?/~l!il)ḿLgDno_r"358|LHq2qv6H0?w9|~+q^]ֽo:w_?tgʋ޿ z'W;o]?{{+PT 1xtoL rv > } WFrNd*]9;>p.~sߠpcm8cqa ìB]h\(̝hΩ>xKy7!v&GL6[["ii\FW (恙SY萝eHX*SIk%1,oB c QrFɣ4Q+?s4a@'eg;# sRFNK uթFxxFSgZSU+s}J*u1,-% 8PyC%\ YtR[IY d %hGc]a:*Cgvb2wAk`g9Ikw@7^J_xy[9cQ @)1iݾx6Xrg_EZ43Rzfc_JCȸsh՘ĥܨʢ_ 2mĩB萄摳)LOq822Ôua`zJ Ce=hIq0'蘎juhb9etb5&Y`IJFE؉ǽ҅ShR<{RbIb39R/\"\@1J!؜ۀ;Y))NX&TCy4(# %&FXSءu9ֈU"K:0\)sIV||ގ<~M8N-> O}p^K661јyDž)g0_`~MmXw?ZbeLH03#xOdJ͙e4#e)8TAWJ7D)kNMGϴ^qbJ([Lc@|VjlƥB}sC^T5'9ڴlfL&LCjؖO՜h Rt ̉z*:lqFR %$ٶKTFPe5ڵE(l@qg'1atjIP!NL)QP2ScF<kF=ت53iLRfÔt)[)ѭf IƒLspkO)^S*W~g5qǷ̓))JѠL=2QdSy}6/%G|K_~W7~år+>CW^`VQr_r^ρK r"| m[s)1E>~Y=/ԦL\X7vOW:\ؕίb *Ԑ4Kњi# ɉrJrK=o6,\̒4̢7a#94 tZIxDYmxcZ]$J Ϭ$y7ӀLaFMG&22%N#I8F Q!VՈ\8%,ƥe2! %UE5X3x,3'Sl$_,drwg e)t}0(5u|0]`Z֭xIk`R)x̥Ox؅zdV'+d;e[$3ڿPz 93NV$O$4X5:ڜ&NBPP&G!8LS65q8ġs 6,X ~+#)sDxaW&OrC/1lW5{ʴ~,9VWgL\?t n8o{nf)% >\/ C-o擎c6 \zM16M[F30!qOTrF'U ݭz wD+?ٌNsGK*zp`uK${XGD&ZK]P̚d1 !!8HgMx 2*| %`[w\c$xC֢i_%+l,]*TW4QP&뼻($n% ߝ9κ~S>B ÓV\*OӨ҄g2͜1QZvؼM2w[ϒ.k/5Q+\_䆥pzTߗGxw~b^28%,Mj8A3=*??m/߿ǃ{|w=Kg2k> _ΠU~'+~|{nyCw.>!ܝcSzNDdܒǾgR#o|6Żs KV҉}ă9>;\^t 0#k+ٌTΆ"e+xGH{)Yk91օ&-D)kLPz\I$jVړFJz{DG$Ȣ!Hy(&\0Xe$(7P`{:v*=4ӆJ_&( S }&9=o/7ʐN2,Ld/;r6L88JbN~HT*`h__G"$@rM۠f<5qmΤ9#lY5*i`>Hwȅm W!i,镏pVƖ}r8->׶MK/uU B䱦8M7Yb FLP~Xx_?, \'n޺GԋRᑡS҄WE4 B:rrl܅?|u;/Qn%\3松SVn\_ #x z"'O0Z`˙N#'.N$rґD}ّ}%:#%pcBFD_xM˜6J $m+H4Mq. ZIn 7X)ؚIŴOYpY"JQaц V?t(C J\D&ɈKdVJh*)KLu3~QxN%vT^R=_)HIUF:``}PQN2uG\kawD/+CΑ_͗!0WxAp{37I{o}e3<Đ#iW>_)O8};\x݇_{ [oxc37x3T`M8}*3߇g_<1OAx0]xL5g ֿOGa]diXN4V;L0EWǘ|Q+;Crőb^Ƒу Mߖy/(r99і3Ņ c͂3c91R'X5uœ!^$v Ě[,-%|L +BU]qߎO)wo7GyԢQ0tH ]JIPC1ḏ:tLA҂؉.$ihѬ+ MrdnzT@?g1ĜR {3,S6~`'+pXc7?>a~"QL-ODaސXYS 냖JVc:5%4i0VFݕe`٬Kr#ٲ鸜m"l9A;Sb?:t|` ;zh#F(n*f,Q>B3w4H 6%0r|}Z&; N'|+0ֺ?׾ߦ[: su88ݪj~h IDATIL44S{ ͜_{nބӼ~k K u0v]Fi)GHؒqZ ÄU֭kƖ}49qjk?qPmmL|$='}Bm)$91%0%䉡J#".'=S&]tdx(/SWǑQ}Ϙ7L.Iif3dS Jyw _Rp}בcKg(dn 'WmN2[K(f D :-E$jQ d!tlY 9U6TlR.dY"ے%瞇$@S^! y0(bGVt$J()"E]xf_u;ךslѺ$lt(T9]{96A*p̡J&PD.XڒMIpeQv#Rه LgZ.%>dvN,Q)L=!j}`5Vu<@Y#izR e IW$NsɆxj c.\ PIB6@ɧ.4p$3ƞ {l?xfbIWI'ulp-Rno_s`аBѡ{tJ@4a{n?ã|Opw)O_nLllO=\ur_psl{h6a_X.߅O4ew6rۃ6KJ+]w5Ifhs78I ;)mM #2mc8YEDr+ʔJ(tS{gΣErT7D5i"K\ vD1w+ؒnHʜ&ƮITBuZc/(RrL;ucx1lw~?iD(mDqo_ANo1e˭^<*ְ 󉛼Wse/|N,(|'G_||M.:7η{ޗx|CuͯˑǗuZSb5M1_/7c"ɞ^YMk82wn#Hʘh=daԜ&zpP2s3|–D5yZg0NɱukhRcȖ$_q ;97"8MFԝH/8#QE )#Gm'qЇz5|4<*l1T*7b89r5ѽe 9ܧ ,!=ƉGkL0JmnӄHgWVƆ8$ ):87hɣHGtElh51-#e2'~gy>?fa͖>ZT_._y^S_9_G1sW OSea=hǏ! S`/ɝ!'6ӿט^%&ٖC=Ey˪4[Bs,Q|Kο? k .4 ҹzY9)'l)¥/DLFR|Gx"1q[A7Ov`7!O7`S,f)h_ bJ *eZȼ7]#~@ Nzʂ&<>f dZ+<NȖPYab1c(@-.ڒbJ DvR^,TxJko#x&K,Q&EHaUPksJ)vuIcքtڼ%;lX\P|lN"q?Sԓ)20U Yş̃3X*G4G ϐǍpl&SҊQ<ӋRwV'7NꆖB3IC9teNDZ ٔqnH4D6Hw[-7ņ5:$!kW֎HKd&zƵ+il>m^Z]Of0ĈAIc"{[vNNN#ŜsME}54&Iƕ; K.$i*$Y*Jn}ĘKl垈PL2>܃X\xؐr#-Co-EH+@g RhcA"ybn͙rH'߉`~Z\cÓo;Fe7>8үw~sf_wss̿\/oϽLgّmCu.ؠ-p 9a6Y߹drz|8s%7θ_Oiwp}ޮ?O8a;:uLԥ1|t:p-#銎a^WY&4rh4s,xj+0wR,# 'qq;5_?%Sě*=`< kc)R|{6Wba QN*6ApէH1A8&'N*S< Kmef0LQd| pHhIhh$f (Sr0.llQDNf\QHUTK؛QӞDV gS1,(¨NkJDIk"&AucϡY"qfq,DLb=HRRKL \в}ȍ3dC/';q$۱ĺ='?cnmEY!$Bk>>畐f {o6^[{޸2ӑ|#XT۹\#?/>[5n(s>_9oԻxo/~Ixr{}D'c)|o'?~L&K?w>']8?æ+zkCKBIJwrn4=b1#A +?!5Sanw4'rhJ QEHfAF\DFXH-zj LBNj9迹3u&f9ĚK#D%:8Yy` I}Xn)c</by!5hS@H.ƒj2K0Ҙg%Ҭ1Zg*Qez_'K;]:Nl0VIc !~R.T)k!$)tĔ}ZS5b,M+yda!jH{Kc3-gn[e+%˄Ԇo:R˹y 5СmudI3:;IT:wlQ`,>b8#o#-f73k!=rd fO1ӎ3[]q;fq#QjBaL4=SZut(Vڙ={b, mʒ2'&aͱ`bU#مe06K~ ^\Q%ae*)[Q6ryDiDiҎԹ9>.b20v'0dU֣CW&s*2TXRG7W ՘xj0s`!nӖe'q9) lGP:%'ZR.{(pt{kGcO ( ۯsCc?urRTَ^>W>~ _ϽŏbIC" z*2`T }`?9M8\kZٗWΞs%z`pAf?TsOaβGi뼕`Á U4'j|#n-0:;$yxNΊ^l2 mLCtUf0Zq V.UA%-Sc'BF) Mʘ<ĒւL56s {f)BIi4TX KXiaȏ_Sh Knʘ5h2N.`cQ8gG ;J?{Hr͌=یMD<@]v$Ye#S z&1n+jBɧ 4VRM!uGp3\ɧ]n%n&8)8[J0An jr ~p &vhZGO|G4\SnL{~u |?˿.}7/qw|qo=4n0*c?taiW ,M` ;&Ssc4Zv:-tDyPr 2c ҜF7iS<ה%ؤI+ R7lqlDu&"Y)05k2$ QshIu[ju-۽NSW9DQ\/H'@p,R!> 3,I d 6aoْ^(56lN;4 +3*N+r␄Q`HahI9Pᰤ0Zfwޕ"@4tj'i`^Y aNQ817 IBf[CYBk2 ιޱuiVj1LAѱ9IR!58hƍ҇zn>K z=>_,z{l<1WN'8ĦUutTϔcV6er(wؿe7wf;)2ñEЮu8.4ؼ6~ħza#;WΟzvcK$ۤ_a X댵ޣϳ}t8P!PۆGG\^ CZ1h,c0%l2۪-eĜ5(!{ˎgwZsiN-֖d:2רD4d-KÇ}gfA2x,%K+mծ !sLTz) ":@1#>$Eۀ(@5j eCE((%+d4'6= V;.iRN"#P Ƶ(ͅB-N8}56Ҳ$;j1Mt%cS郃h 6k[ߓŧ l[4O8G/oy#E6 [#c7=?{||˗s]O ._xk<Tr(^qkxOfVKzy$^PgFA+^6l͹ω%cdR*h4s,6-wlbv}'.ZEۍb3 !|r!7, cU|4)K9DZ#Sa486tc6Y$1%*e;2v0ZC򟺒gçx?=QT"Ӥ@OJ=^ 'rrji$\+xB#b%>UbY2)j6}1riU(q.Sc|{-E1 qaG@p+e<;"VѸe }\D1e6RcIr@ 2tʰ^lZU+J%.CPy\%ysJ99E=Ȇ><< #=RXdOL=4z ^ZtOȺ0dbgZZl0wR2\1Xڃ%2 0L.Pz<+[!l8bH)H1ƃSfD%)bqe#~u 6hA59gK9Q293̒zѬH70+:cQ< s@{glJ>Y=&ƵhH2VRQ\: ́p y&7$Z$T;w:ddw$1OVM IDATfGB-y.Cܔq7Ö,7Nr'yla ~6\{ Ƌ ?~sBzto{7m˔"(뒀a:͎1b5uXq)Ϳk5ufTewRh4 \R.܌V]ѺIׯ/;k7$Ⱦ [G7BO1+8ஊKL0r8%oӒQ(_=m7AT \%-:2X*i$'!+Sʌ)c5%p 1$֚+;遮 =Rc^NA-kfC=}6wεmp[(9Eُ0 -`:Ʊ0}ާ(OT6 ,OD 6gxO9+W#i-`㒲$ћ/|tCJ~~s?_旯p|u^9 ^9ѧ5#r/3ǟ'=sT?o^_~Ͻŧ~qSn6h?{ƃΛq-g"mdp%`95ed6%хN0MV q($<ט5EP.A*YDPIL( IN㠉A Kg^Nѩ9!Sgh=3s: (8+ 9m6i/p4hlX.1}c+f,SBeFt)yH !sGmp8ҋ[us%H]w\{^wgyaW?7w8=W^~Bh{/?{8:k?K͛r\]عӷx[dD=E醯| Li [ h~RpGQSP<]v)(pr&lV:wsckǽBG3BБ.7NOoN59>{{%BO9 CۄIW5#E;b=(>ZrL/TL:CψUlIt( BX.5>$4`"w?fA83tP8`}A:}ȘjpײRO"O/v 2؂QȀ، & T E:x(J*ݷ$;BrRWz_9㹞GwSDSS&5:g X[lM 9F͌wx.J೨, 2"(O!rsH%!aVCKia^ dԃC~;Hf4-z@S3fETS51ZBJs7TI8zbX ɂG!û9!D0\[KXfqYlP…Y)6XESu'u|Hٕ g@!pdqEem1nx#مW:Rf HrD@Jl8iN]ak&|$7ŒvҎx1J!Xb}6TMbo~<>MwHoƣ}>1 TuyO\¶{:ddy矀O?C hw^ږ&W8 G @^><6z7 $')+R֕A8bxͤ$Kt-xVu(-"eZ_bQ(uL1|Fs!M :-+-.'>ZO:rZLjiJ!y4 ]kR $AވDnN2MY|'aRjܠ̎BQG,g3Ӂ\<۾%}[.dYÝ;HA!1tZaQRz@M3;5T`lYq.jđOXiܺ͋?7G3ףs*moW'B7.3:8ok,ux+XdžB~'?]-"!5lv~d3b' fy棷3?M5}Z;'~絯R ϾɷoL |p'?c;n&ߓ9 d[Ο_}#INq&$G e^̛}+Ew^^} zH[hCӨ&ds49.Q; eN@[@&MEH2K6'\̤ZR\QRIb+>U}" #ⱽrR67( BnadTe8 }KPX|¥4Am+,d\GFN*VQ4XGx?(}-!cMf&܍l8I6;Dh%Sw2&RSI`Otx=}ipO|co}ghFap&̸;*3T0o:{Fw;2 y$-]A#>(] e˂81"i&gÖaF!wrOteQR=2rƳ a(#*Nlc@$h ](p允BK`2n5ma/͸w4%Z29wl u4;IR NMC@һsb2esF04اmUȌSƉԡp`a)8Od iNA)He3C)d;^tN iiϿ@3V}<mvU*ΐ})Oy2lSeedv E5Mi&EhR@gdF\]f"V#hBGDV4#}5y:!wUL CrHp_lbJ5Ƃ9N:F_;Ù}9I-乐RE)8@NabH(NkCVbF Vhb4,(s)dOH ߶@-sZQ|1 J"ΐ,B8EV :G,P: #P%/3F7\w&np#aiO~/\vZ~2M# K/~Yh}g8}htDpl %eIK᥏d{׀*ۣ*݇;=u}5v\Xby\WWYζ'NN ޗ$lQZH֯bM#]^{ "{Vش~a،{odz'+u-/K_t-r`N`] NM\<9O]י3l{sn-ɒƊ˱*\ @ A~B+=#Q.\e%7LT;{906]q @{k9>[M4Η΢ 9(V.%E#m p5 \Vr3@: H5l[R]quZ:4M0$D}Miɧ"0'$eTy8kjHrXT "4 _$+E[q7I .Hai$,qe K(&hK줳#ݷd5b"䴀NӄQW T”:\ۖKؿRdqyM6[r-\|*ƈUS2⍒B[ֽ2gYJ5lǬ{Ě`%r ]<]JK{gY=<9jcÞ_k9gfH䊤 Ә2ژ$yFͩRi j82T2Z[ ?Ў !4h@v:gB:FČI2*D7><2clYXXd)k04]΂O #ҧ- 9I-,)fZIlϔuE_,dQ_Y~yM|%J d'7Pz*Hސq`+[xs folkӧm/Ʀ4xg`9^Ir+HHZh%ՊB>!Ys% 笾 ۤR| F(H6(0AaӰ|&Јe&[4eVQsl9x`pa ~>$>:2.e F4٣[F8UCFXE٥8% lhL@Oa-JHu XpYĸ-ӤXwFڞ4)ޅ*N&AuJ5T $u6)`)%amșŅbBsǬć$fu2R%LԲƕ*A e6{8W{t1dzF®s^)~Yb>,rʊ=XF-E$[AȪ*TxTq\U'jvU4.hEسMGKֲ! XXcI9+ *\Tco֣%=ɉk`kF: CEzueWk!sG&%9$  V1]:O!9a|g^j7)3g~)x},Sy#XA/OGG ޡ| 8NG±ȲP(œ}JX7ŗx"8y"cNW8J5Yvm?' Gt7nrg3ewmgBb5A!>0kSѕ3_+zl16jD+#_ib`)Vbil hr h^IeԠ/϶5tDgTP41,LӀMTBQe a5 5zTD(֪")iŲS ‡'Ħt#P{l3]SMO9 A:)NYBA掚R izfs牼&8_:t*fḄ>}Mqr_玮/ƅ`8a%tuB+x%#4RVΈj['WGQ/vKxw ۼeJ c0&ڂ3kao2x(׽S9%glY>QRW-ܙ &sB#뜘[YI"J)ʦfDl㘅ɧP\]3vVkX$d5:6 ]-cbG,2(+)tOwl{<;3N9j |E}R*mqp@n9Yԋwplpst>MG+?#\Xָ::9#Lk1aYx>qu팫cawtq OkE77+,vZ qV2<~&,ч>pBRIY=4!B5=Z"0a -9@:y(3}L 2Y&-=څjPwOaI%J1iH5!29IdUi'6Ԍhx8=^*+wpKDOhtИp8drib2#&eʬ3[Kll!N+nsL(z­pc#Js%{D+stc8-J4Cc*pQsg!Si'wv&ʡ̂ތqN_BfJ{N I{׉VdŬ@v&jCcO෿AitG*l)Wnr!K/kLItFI "3|ᄇZ"&1z ?|#Wy~e^X;?_lV9~m P/{kpqG.Rx{@b>//ٳYfzMϟW qȾ3I>Q>t579+w0GPxG>L=n0I$Bę Rб2#jtl5sDD r 9 JQc䆷2Hh#]qmq]-Q%݄QoS3{!OTttcju\%Ь#\P[=`E]cnKƋgTua) &cwd:âLh*!X!r7Dwp]ѴbB/Pkl@N|f]#O8J񏛔\np=)5rj8x jsendq۶$4sԍap5oE%q20[-CܕeYl*°Q:$v3=wdt snXbm Ӱ,~=FHaR琜R” Mɣe+ečȦgbPkV%V3+* A%ԭLdLHّi"'qUz jtw ENkIUY5\#|&);coj`(4EZF7nTq6wdV69& #VŐa<VI9m^@nae~poV~\rWCƧ! ȁuw6'cLk#O|Xy^ŵq_w fll䧟셗H/n!NóNvgKn#m Of31m?p:gĽ#\Nm >w|@#د cɞ2CÈ%1Y1 !xyh@ f6+jN:)VLxh#No1Q"d- SZQN ͐;#.' 4JB.Rvc`1ng!13oV&&%͐7 K˩ BKX6 sH.LyƔ:3sY5qfa?^V,XFԄM1rĪ# @UU2cjJrkp..=G"[b3 I2V)5fp?g;xo ^tqld e/ukT'S^xgz2ׅ-vLti Yfi v9T͆/Le%lo~{«/ _B/?v _|Hk /_?p7o|kh|WG??ǟz͎7-_?f:Q#Kݝ1C?zja"T* 7b\,Ԩ-SE>q<<7r\M3 Y(x<g{2I;kl 3S[iY9_̐ d&jj>+ bΈ6ME{*+' }fHgT5>| (T:@Q~ 8[Գ$WzL J Mi"7%;1A%ԼYC) OQA7'Q@!5c>B-䇚Ch T e(akF3Y N|_2>3m)9i<{R,ԨV-N 7|NlEpYP,aI" a,VT; F<_9+ece'1S|}Dzb'ߛ5W٧ĩdQ%WVlD1!JI͐\cL qc<ׄ0@1gRf枀U`iڰ{!1g#]~GL@2߼&בM3LCtAI+\yޣ%gCmz뙅=y_ĺ|vuaav iA4R0?Q7Ϲf=˴WFUh]hO6=˃oN'Kn2إ[o2^>aę÷9t$3M+a0P1Nmᐌ>F|F$"![~1tSX:i6S{rQ<`ESl )Nk’.4 >_XS!:5k^-]-d$El@,n ك: G[m#ݣ5T1hCO>Er"0IalB)5.4S5DYOY|F\:K_iup&gJK0 4@pbzLcg7?:[qϞ"3`ҹ} x>ɀw[ܬ[!I'F$[ț 9 yׅZ2^s _iaOCd`qgߌ<^X/?9~yxϿ>̜gx?Oݧ}c/O|ae8S.|#pkJ+_&{pt?&s{y29":[ҹ+ork9?4>~=h -qr,"Ö>{ ln %>h=-`BffwHP-+憛R(h0/:%]@ Z`) Ì7%d_l%:mODa(T!zF5=wjJIen7]f.R-uiqJt˧ uHRiƠUE IWLq UH:ťւ,8I2)JqBLE,'S\COqj!Y* J#, x^cF$Ѓ|Stzu|G %wM:XT=wt 11|~2˄(h ÉVcpŒ;nkHpZ:R 4:-oÐT Q gq $G[!A| ͢3C@GޥY:%+ٜ=~[îo`]9Qq4dӤrbZ2SΈnA@4Z|0MS$ȕ&[r Nqbmxsi')ⴓS3$XJ͍ѐө.Vم~IsL ѫ9 UVaII:3BNCV~jN 3Dՙ^Rf޾fYO7;6vyE{gb?;D/N$dbǠ3[IeQ`PQ*3UnQd[yĺVʁ#/`3 M㣏]Y>z/wҳA* g!l>!ݶ+(ZAeKgOΫʋ P}Yozr,#Q1|.Y5V;II4c#ɉnF' A+] 5!)kIe)>ANڄX@[FtЉwɗT1omO62*bM&X;2IfVwVifǪpW2)^y/&TXS71XZZ٠z<2p,ea^"&3jlH9 pC\>q41ťO RT';pH')5-!$]c"KQp (LY\D12%p31@)62UdE,A]}`>XЬOgln@2%Nj)˘hJYqVz%cڔ]8Jj<荑ȽdC¸wjm kB3FSI ΣI+ߠ uw ظAJ<`X &2.vH1}^hIɋwҦ-nfO+lgȔ>9`xΘ4-HC_\dt䘶Qh9mJc] $!JaR̡8tTtB1F2cYI.H4hqȴeif<Ϥ7 J-#^s ]:[I&EC$(L(- 2D˃#FLƊId\T2㔹[h$nFWUHFz9g9 l+D˸"axْʄh hMpP#3Jo'ZRd4SC1 5Uj^(W~@pƆwjc~\E>ΧH/eM"Q#\cf ᠚aS9cbl$#t~ Ɂ;kg,08,DO a,w9#u33YrAh'póUBRv9RO\^=fY~ӏ>cCä"@hSleQ Aig< N+N(bT%#Lj$( F) eă[#fbPaDq;)4,"'hB?+G!h :,Zg%È( PS In쒲Aȥq-3#e.B?ZdR%n$%to,$SifS8G(rʥˁds +ܞe%8kꃟ/o#͆~xnIԭq?XJ./ |sy{g0}ar '6+t&3>_O *Fɑfs;?/ޡ\П3­ooG[aFYA7{~;O~pn=?k!n+ ^x* /4f 3 xɢ3rԄ/ܺ]׬!7}p֍$JZƄihocbƍT`.|y{* LE3>\3{.IrN cA`;iEō,DC(9窉&J#^!-2\2yS|Fra8_0t"b10/90ҩ=.9KqN-`2e;KsUJ&;VU!?|(}1PH1BPKGF"AC]qbeZ݊Iφ.%nح jXVwdHY22u,%C(S^C",I lU Y !($dMv Fw)բ;*UȐ*hI'v$D3Δ 2ZʙVc8; M+fg:I2Q%uK;7 XVc=2W DH[ɼBgrE +%F-[ WuL`{gN9SB&#%2].n_et$p u~g/BZ8z_2ߧrs\ՆJf;y:GNG}63š;cZ~=:~H@75|UHM7Q$ s8o QC5Jx%>bm樅V5z-ZBQH:0K{0QK+;)ȩjKDh(ܙu^%蘟J&I\*fO h2NRN\:zHEN5͜J3rBnXs^(?EW7H7J?9qcTp!_Ϸxya飿iϱ=-QbG;yPkSJ MvL䱒ו;類'F|zB_ʫ҂ܝqC8+՗*_lleӕcxq_yu< lyq~.r&yォ?;7nS8 K[*t\t+ K}-2 pЧa`[;0̌^HCOC]la764q1-ɹ'Wt&]W`'~ÏLd! cOưQsR( ' {^j&.X 5@ Z:M ꆌCrQ IDATƴ0 oGdCWGJ|h9x46j >RKXIx1 9e1feyo٬s۪Ւ"؆@%ˢ!Y! !@ H @bYRK$jo{5#cUd889u^k~H0 J$Z3{ClTYTn ډFF˙Ҕ56бq:xwEw-$16BI?SW e8̸dJ  M{M<2 >T,z wFQC񽒽)c6q !! %օ +템+\H)b;{L]Z" u&$Jtʖ6=V:tpSsB?͒VeL a`݃6|5L{J>䰖.P(%цZ$u])9X%v}4jI25Uz F%15ʔ CaVN ]khr% UXZpڎQ$ƍq7!!SiXA37٣09 6Z!]ύA"Bd]IȌTtIQrl+h ړ攪@QL,:W^ě]a=ܡb W\o{[1x{3,!1\i2sC;Ok4eGC֋w+qz}-c=|+|K1x u >.1E5Vטn;? (ՑR_bI_~m>Ep'KpV)?zg׈_vfHs_s"NM( h/#al4ŵ KllF7BJ 8}8:2ѴSn$;F3]!p е(gt$VqdhxYih$ z`K41ْkF_Ք9t4gjSlv3rag!Pnh>O-wpꥻ{5;H{ԕud)G:%1~ȝ *}y~[<'G,]|xǍ;˚G!F.#I bJIKb'%) $Dt^֍lLGt"kfIL-!zUE%7rԕSJԳ3*lopXɝۆYF$NѡXa2Qs"]&i VgTݷJU!kQ*E 8 KWJ.p̩2~K莁ޅW$J 4q3yp ~T2գD>noӴ%maO:.ҹ7\r3nx#y{Q)5;1s,yv\kc.`rX ;8GO=b*LyBvB~zbY9\}9J@c3+<-8-34>zO>Bkxrnظ\t`򉞕lj|e%I6, =Y ")EIdlv-y+**@iZFK$9lA2u}Tܷ8>Zx 0y&DlA09]BXb4udDJWGIbE$Y-LS=1|eXR(؍IBRRe)0SمnZ gɄ}NH3dX1 HRäVGIB%e_$.0 /({ǟ*~k(_ĉ,0 YH^מkʙoܚE>@kG}\]}D-O~oS %S#NO%Kbxo0t2{nу*>%r2d8 >$bm=v))"x7":%7ft8QKC""4؂(al J:}*&u}wYQ2Ci$P0 MwJ&! :]MmT[.DD %Q$%LAʨg*; 'i,Һ3ia} (|d\ƄH%''a7@:2#'.'#G{oE;L9grxu~s7OvVk_3=}~ra߮I1dw\LCDcB$g_[>>v ` y+wD o ~|C8lŨlUQ\ $cށS-)|9eܽǓ|#OOy6'zqwz>{|p/y@*ДO~ySd9Ҹ ]̕ŝxc?{/ @^ei=8'xVơ4]^9x[k(+kƧupNx&o _UL!،Ԏ:X͸yzABceR5i]8JaNhc*+hqI>X`"2 P3CCRV:XlLTt~ڐ43`FI' rT*g{U_hYZErg+Z­Z]iҥb$4iOpu-ל-4=&3K߱a7NMVcTt0I BSl|rL: Ҁ]&T5TI❤FSGm]EqDAdzWjw6w4uҜHsa(qF B!c#b[)F٦O]Xrc"7D*UxH-SJ5ȨhN) 8wٲb3]rw63ܨs4g7e%bvNJ[f]|+y|d34ňCnw3[x O c(dmrJ*~:qm9 h>r<ⷹ3Φf]78M8kv>W7tcMO' opx?&wʉ%g,~48psF!ݐPWVuzEr+Z, y%gXA@ @wi椖h4T*#!)V O, K&amdoѨЖHhd3T0Y)}tkt;8{$D~ 3NvRN%ѵ3Q4Tb9)gQd|$(a**ݘ2ks3tKcz ))Cn1&Ef.segc(GZUR{N.Y^I(rU'Em)L685Zd\}ao]Ə;8O΋SjriT ʑ]G{SY =-v˅U5s>fԍ1+np/pW>ļo~>3|Pqc gs rgJr1-sS{g }Mԥ~?~_879_gh(Jxk;ǸםKNAz I+/;n)γu0NA 0F)ᚾO%jN#Bm@٣S~uK,*<-6:Sf;g8$G4.`e[4ؗ.>y&5t(/š\uО)[ʓƖjr& @-=)u$G#{Iƪ)zn4uUL3nӭ51P*Xϴ6Z٘ɱLT5WB:IS5&L}Z<0duTq5FNtlԡV)c,HruA^ }r}G4 ]4hDI,yL CU?i93Mn Lɔo1<, wz: ЮxXI)'nL+%O4IxVm5w9O9Y:<ܻP8KSaXs/S:Ēv̬+mU3IJeK"ZC|A3I XօZ*|4./ŲЮ*Ly*GJ>1\*J'_>slK0|m?JNM0x#j3R W"ϙ+`zoM:(jL佷9.Wc9ֻiky- 3|u%\GSY UsLDǞ+1Ȯ4FN 2rP/+HD| wb.,1+iB3Ca xH=#)U<zfsarc?2%gF沊X]Ȇw(ّ-^89H4I'؇ꉢmJLJdPPTbzLl3sdOM cgr{sm7AgX0)@Rx rk07}%+"YI=V, 85aJ_y~v:m!wF\npEb*Rÿh2xx+}1oц[p>?Q'e>>/_Ƞ_Wџ?cRfvѳsY:귿?ΑgiW^0əFn9w."H5.\3eĖ8`9`P9}cnxw _aq([HAٯ,7A6Qˁv|qٴhm6 ۡxy @sxhθf8xNȣbѹ{:c b}`mm`|{_`?gjSSNc޻ =#,ɿs:uu M)kt N`BlVuݱ)% H0  φ(:H='flbbR0ƧLijiZ$ӺU鸢C"rsKSl$K0bRuFQMCPp'O?^7'~9vw7ۙ;>Ϗ1?O_٬@ IDAT6?m߿';t~&Yj.|*䯷: <}<33-Ƅ%A%9X2J}C0ET1ƪK8̓)"B00ҠBg%kEL6q$^iޅ䙴hc8~ KWܜV6m d 5wpws|G_SFrGfȀ(p_'1O( Ô2(y[EcBy3T\hLC ٔ:O$)d R!r,:ҷfՕJ%ǘ46(Xkh ;Nq+!t%V˶u҈UČ_y jSjbDJb$ÛWA&v9ɠL+t,J Nhh&=>V 3.k`R6&9)1ō KqRӆL銙3jb pTIjK8LU%1,ZwT`#Rbt3 f9p&.5E*02ʷ#*gvuPwNm:Aw^ϴՠ ZD?QH9G0.I+fpNHiAtb,R4Gu,t %-Ql~ 0t"zPe :r`]U`lysn "w!/ 9@.,٘rPWh}GeL_!|w@Lo Kx|擻/pk6ᝇOy/?G>;QsB*-O$/Qg(.)lQ$+&JAN+*I"a5lx)n*=ՌZ+.񍑚[QL4}g.{sT4ttё|btL  6sȿF@S4V G0* e@`QKA"R"%LTnjU.7.q=b.XI1htezH)UQȜ,4vv%BE$,;l49 s(oFON*;BQ`o,;}1  s{=j>5uvro+/9xK@a>t}KqɖD3Bn8_۟T}_x_{i/ JW?|.GO8~ϬKyĽ_zo=I'ĝY/$@ɉp8?~/?556Ej M:ͯ~SҌ5s=UJn' 칐jh[20C?5Hi"&tQCmPQ8JSHa辭U;Gb&Q D!qu֞ܦ7hS|FEmEo+>c1`ztELw$}ȝ_ܞZMLO X_׻$dfޚ]oucl=߫Ӧ[au>Ŀۣ^яGοi;_>կ}C_'o}C_=^W˯{W~*%Z>stg/&$+-v,ɌjdLNo+9',#)dlFǤefT &*v!/K5mZ3>[&Ҝ2.3`͎ ~6^HUrRZd}Y <-ze'1\Ю~$ض6S}K¼zƌܝ%`F3341ى˚bǣ2zp$ ,B ( KRy(^Ypd_c& jeb 3e)gW敃glimVpL a˅ӹc>.N } Έ'D$aЇft G誨+^ =UF>H=qIstu䢘)&P4, S6hcUJb?qхuJ2pA{U[k^s鞫fFH$# *V L\]H9)W*\\I8Br+!`a .#$4HH3h.{\{wV_ >USuΩs{zz=x7paVR7miI&D"~Y6݃@J">Cw <2,.w+[/]ݏ=u:0Ջ}ټpʲYkp1xW ] {rfT.^Ӹ/\xA}w(G7;cPū3Jg{Y)t6Vح 462Ka)NB)k& @ KQD+c[du!2b0fM̨㺴16CWV+`.xg5#LvBr$=6TJ]h: ÂKHMdHt/\UxWsGed]\TvvKnz=p˺$e??=p7"[_'{>wQ{ 9%kA{!e:] ~|}\~9ǝgX8ͼJ9܈)W^tL$ U,\y1TK%i"StJ$M)ȡM!*eDNs[IY] .YAAGrш[%7NrEz5O8@jjKcs ,dQFަDZ(KT*Nf\Jk2+ we M:ڐ1j-JbPF#yWeL4B K dm|h 1 Kd;-M喯Sb /R(Vg#B -x?U4 ]ͥ=lY|dʕ5J/Q^S?->س<{h+YQx`R\} Nk/W,No㙉KY~f{?ǧ>^y?ŕO<ɯ~E]C)uwo'C†E= U!4u@W sHVHRE]7#3 f, oPzc'f긁}Moh&- )QE esfnRj EJa=ıwZ!{Gfp& c3^~_̇ި&":Z!w`1´ " s+9qM[2R e`g|loR#8jBfq86\ w R0`) B`֕EXAh7yhT(G\G4)8L`j ,'̵cab!Rjlu:,DB Rxy9G:%X[VA874VjfPﺯcm+]nw˄Բ"6=WJṭrzF4-ͮ_3}~}~Ja 龻9UxsU^\>{:nkWW~^6m̀ՅN/PsһKѹpa6L\˜vɆ=zͬgZ0p\hVj*Th h甪ZI%Xr3rp$ M`TlN:X0PofQ1Ziw^Hɚ M prCM"VT(f46 U1C]HڱNdyPCˆGAL:شAI'(TwaHdlsJ֙Q썛:Ї &=C %c3_iV]k. хM8ŕL,y1dɺCۋrw5tǩ4S3yc?W8-QH@8?|׾?-_%okV[(9/_s>fibB3|7q)]]ַ#{/ q{*|psx2/>?A}Z4'p;)58L\xCgټ o=O>MJ0q$lj#oA (3J&ұssM*FfH҂iOJG|@,u%@kfl eJҞ8]'LV.ªl1E)G]8p^^&h ^(B=Me!RS\?6Z&יٜ0tTд`/H7Sy:AXPIZ)wi];I#ێQQ4v.Jpo%._iTuńTv)&MJeՀUuQB4ԚFC+jS8Y-"U]ބBhH_-R@* sKQ, ^@S@'N/ ҋW=Hbl"HoF"3P]G`1ne.Lkf&SV$*-RH0"8cR&FA j9ua=x8swïg0v+ fu]s]_i~NlJʔZ%aIS/=. J}Gik`!B|A{Ib1NsDI*c2}Ӽ?Mv^oo!r0GoenYD5u 9>wr"3Wĝo+ <eR ׯX=3S( IDATÓ7~Sϣ?bw%0'2#xJxFUnR6G\_07y{r$gϾt+@NYyH=93/߼ ܸ=9KoWgx1^O\XB߱rXO~~o?ҝ4]Wssn+]^Rp"on6 I1Bk9hVXZXSY[‘%⠬S\ذBuqmt^ u$ZEJpbQ$. 7)U6[\ZbӞzfJތLI(B cuBO 1(ַ} ,ZXˆ:o"KSsZEe`Z'DE’Gi3N%({څiԝ#OAT)JάMS"H(mc0"ZYF!Bڪ` 3&5SKƽg 3UzH uf^f&B'Vx? u׃CҐ"n}2Jv/5)9Iӛ̢JDu#-QqtRZۗ h%[]&$= %dƖ.^ur\5RoDqa0,:9Pbe;C7({-F9.q,)5wMJoУ 9(˄Od+A ܣ=B3%ETQk6HF*H *l]@j#sgiWn3 q(Mv<$LuKΌǺ3ȕ#gnSݏsaO?$R.~+[.vic.LETQ/?Gu`/tjkr׫%-O(6W_on!冀(PSPS$D[7_NiڦFD(4ÁzQY RZDZ*pQI %hƮ Kl Umnrѡib^Bo,Ic" @Y `^oK#ueUAjug*JjIuq2uE:%(D(Kp&/lJLĵat@ڿDj=0B6 EU**J:ԁJ5ͬ2u }l8W?F9G>K|n]~D;O+skiB1%Rⳏ[صVz#6!0/kd6OX֙bJ֊vJ&ڑd!1.E(VQͩں{D4TR(snBZת'L4?pęf#t{..촞Hlg2vh:,9܍67 ,}w3F 4x pO!';@0-ܘzFΧWawx,pc u }RYKp"+GI)v82ukK cÖ[ÇB)7b2BP@њF1xLdHU@2N(`J[<4kBqQPkVD7J *$iDGZɮt :$D yšXPqz>lc!Xw8?u+'?s|o}eӽ|&oj|;'_y˧o=Y`^NoeNFBHf5LX$Ӈ -+ K8.p0$jQjlp faVxfμE )%r-DJD-̱2ɴx"%Dxl3Za mʖTiEщ),D7$RRIȈHTAtU|Gb)P3<[*kBI,,JʢvO4 !PJn1 _ h qJ7d9 :P0 u "ԍ,-M6~8b A"Dlh M!&a;~;=X91M1~{%yاVkb8ֵnFcG")}ͼgX9ZE5ǒH׸&9G*3s1,XɃt Ufs+8Seeo[B,(zKpA3r>wP1vWqFp6: RcMn@n'4p2[4)$w4[Qjޤn $0(+1Q<&vBfƐ~EG$+ Ԡ,nA5 q3!ZLfi:*' .KlHH.kT%ꐩ躑ҍQYɌ>cTAH:T !BS +%Ȗ 3lvn=K\ Zrg/j{Y)Lt!^:\N)VH EpơFF|ai;:*;hT/$t14hܘBDZ+ѪLqD8Nƻ33{4a@vX K!b%Z:!Q@m}AzUq{rԺ2hi(m* YLqI.%Jȭ)QX3I v fD\117A%tØNuӲ& QsBE:..RB:5}LSa1g+zZ"γ&nS(A7omD wt__ymw?7.ӄK_G?ΕŰ  _ߏx[߿ }t{#;9M?ရ]8<˿4))7ur&˂L8 +Oqju Ly, \!_}_ 赬 ;ws.wqny2ܛ/_ħ"U.w֏wI|W)W6*9]b"tLӸnBJy#zO+f2-)ֈ#KhSa,[ +%F'J"e ?@:D[CI J AwD8cm vO- JlS1xjgxP;(@3n*[)i:J;#Rr,D&Qꌫ0RSGJq(58ٚ[Cc Rt3q(zBՀHm3V SMXڡ!i!J"P5~*`_Q}x 2 ؤSz!@ ^bd ׆2!@kҚd+_R!Ak*΍[bJ8DjGcRwfG2>;7;,6'9T 5` <9Ӊ(D^dV5U3]}5 t:"cةѹPs s&"tD j2c􆯕UJm$LaF`lBiBjK* ZT8gRlm$jj9! cO C1ǎ? Kf?$eư@5/lsر]E9sJL?WK,;džLWv9Tz1$B.ѡetqQeK&H#J5bLy&JCTqY[<3$* }\Zyev!wW ,g{P sx߱+Hbn: ɾ5u lCk-Ab/ 㹈K{-g$-yf!MtF'#5F`F뿓lfcm u /:ꈼ2_jFkt. NR8NZtEhTmh4'c_t"-j;)HT#mXK (*1l^qR*;UF dҕL*ex㥚g hūc]>JnK3}Vk _}S{=ejİjHإ5r0VAxӆلS:90eU`(KԨ6SSth$7(N&5&)9:Pܡ8-JQH{S*eHt[.CY#niKWxChNo؇o㰋tB pGW5iS?C_9"'~w/W=~C^<$[R_+'wfd>!;w s*ןc<_ta9\ɅmsO=x}׽+wcXǙ>Pޚ:}տÅy柼;m|g>")I5HD ڊM*w4w :VbHu,V4ni5G׎z%pD0!͸gۢHQCq\&MI@2qrm:Q$f!G+=(*BǫضqT-TWStASVzˤ +6s GĎdrZtpz"y"B~D P2qn.ӎ98eG Lڞűr:4Z`` hH鉔$i|zj[Ys@6cNkNlzAsJ -*;S"ڇF#U#~=3OX5 Y@PJE!~,*gV8<#HjA l/ DHo96Df3767ALDwjA`[&m  Ae u晭 V(e@ũ)%,MFreQhu#Md3nLBC{!ԡe9#R9 JࠆFބ1vj)\NN&GH7ћ[Ixv 7=s~*6/?_?3p*P i;)w2O~Oxs. U*nn;y'[l`$F+Æf,vK'Hg=Gb髳 >9ՍiU u0{{W:߆r%itK@$}2̐F IDATDh!Zm VG5Pډ ᵟdlicTنMCH^MHYXDeTPjBIґP qq1[4C] tFV%R9|Jha0]F#!Ҍ.(CX88m\$Z, A 1hT#:"hc9!p)*casƊAVBUz6 ((,Wv+|qYOy{o}oq \wB TtƯͭAŸOoƒGd3mύC| g7_ 4g}xgm>›3/9nW'_P~ǸyK&iSvcSeV#G aY874.:+{2Ie#Je"^VRR҂1%Nþ'6ϸChQ =Suc4ǣ2$G4M\z< BDE 4D45:MљIXB[ i(N)Lz; <@a7 OFGZk䖈:+Q*+w4*L="*hTofoǹYLqn &DK l8"9pCajGgFWza\!J$Ա\t4ˊq; a&j ZBLf61!^Cs8(t`NEi :Ѱɉu@d0ESjSBwFLСtttF#[]~]hN$ (K#]mPv!('n)$-qNi낪SV3#Wi:olȕ an$Hj@iQd%"Xag;7p% 4'A#"hZX$" ^{8 .#d:6dvzpnt[wvZgd2C#(Q>%Z8I/n!8: u?F;a}\sF@fGt-c?bYkE=9*)$gM퍚NO vN'cTU2Ѧ+àuOyCoל7tkDO3<\GVBݰX9J @6nԦtaZ#4]iUP0YMiݐn4 l ߟNPG| g:$lU.8%"ʱ9JAZeND1]2vqcNqS< S hUZM}\B}tC_!қet[ֹ1ekƊs#Bm'o_&j"me7uu*  e춶Zy 7B4~pQHBǧ79 Jj [l\.ɐ1"ѺDj±emOxJ}\|cYG"}w\y{Fwn;5㽹SG{Ƀ KoW+WYqq,|?OOM٧K;pMWe_~ wa-dcZ],^i5Oޭ PƔvezE”ʮe rr$t@ST D=:Q5ὑcłTI9$"=aI7ܶ׌"52>='-@T6QmH[>0f>M2Ncq8EZ7lD6BNL#F8t!l 29=mcGaт2jq"Ibʎdz AQhJ@fbЪcp}裣Bt@P; GaNd 1tv(w.J1;:,9؜ы!vMǽ2# 74QG'J>pKGoRqP'ސwj<UI FQ9Jd@;:9bm:"S3c9PN哵`y^̡$5& >6:7agf}ˤ#GcVV"ƅ h[$[wt/I*kQdc 7NQ0xDu\ ϵþNdM^NqǺp-mR #4b80e!Jqcp me8"qc d8xF%rFW[8/OTgBigu;ux@_>뿃gvPuH :΁~|_sY/ؿ{{ ?ܭ@;Fv;[Kua~n -q~8~Y}ܸSӷbz md <,*PI#HtVt36:4GSEJc y@͈.lQqE0 "-@'N[Z`|]+ )$C۰K+e|Ē:[t(1*ke;r}u Mi6L HnXYvSI S' fJǃ(q\T<8Ǝj'șqI!-ܸ-2iGȬ L̹*M`BcabKWD#nDg#qa6rwBk]6IbRH$脖 *ͅ%ܑHP( iϫ}C!*Grs՟@qIFG8@1%[߽Gu㛿 BK)G8vC|DGT\94lW|IDrGo\k4鹓b:cqd#xf_U ׈x/NRap kFUChn\-tZ 玈ܶIvqLԅ`+les#{bם)Ȏ*< Fb:$v4D 1sAhbx4OXl)ԁ'%"􃳝,U߿kn4jzä!eOQ'X:ah 6 7D*:.Up d%UAobb ZQ%/NEi(&)#jΙW$*!q& HO,=3z FbOb :< 51Bu<2ON֊ TstXЄЄb+]u'6TD dFPJ.p !8&BTÓ5  !pL9Pt2)ܸkn+1un{eW^4͸L W#(* hBNLvp&E;͕9o񉊱D Nqi`&B` 3=: %KJܤ6}bdgRy&Rz<[OЌ[A:)Q^&fqE<038Z xΧt_F_=m7W求%xϐ`-?οCǴ:/޷?y~x|^c/qwz4Iu|LSNZ#܀}w >~ݟdeHW'#;9P™”oA9'FwR҈.`yjhUḷFow!OY)*2n8:X{Vqنet0'݉c Xкbݙ{wBl࣠a :Nq4ja쎊ҀzOA܍ "'jDFNU>ҡXP!Ϡj>Jwa;NUjoޙDVn†x+Jrgueexh6-1hʼn.ٙhT8xoFHJXS“>O-ܢqt{"FWBa:)&u-P*hb0$)7;,[ Sb4 DG `]ppgktlWvgwy.3Ir"sHpi:\8p%"w_\0{G߰ 6aFߜ䕭o4c3ʃkڹjG}/8_y|'>y_#̓+C`utҐS lzǺqX0/:sm[iRD5dS-"9pfCd&1Rh 6 :iY$qzfQ"sHts:-Hhv\J H" Ӣ3$Ι+١!]qw35E4xrl%$9)n`˔t+7ecmhL"Fy2|xp,G,sNxS.9vl{|UNlCSjXpTLD։t["]IؖTjtbQ05N 0'x 1Ed8U,1:$.U#LL~wZOlQl)!>آ-54 ˠѺ!GrH Vy#% NMBK#ΖF7xcs|sB%A;PʦW#cd}$zэinTXVa\1\J:֭aZF};bw8;g4OSQo:?|r7 Q.ӕs3zwlg?bʟ) nzgRio r2dR(+^8?|ĝ5KLRd(4~f2 RV#@r&ubHGW%3ݦ:HY)$CNɮ&O]h cAPI'+Rl$#w@2Q4AXcAOӬz/WJo صoPFc&怷ioBCD#.H4a\\rdtZX2)٣ڀljIPD&=H aѱHkJ#P:sV$fZ9K^;UE)qU6 Z{@cx0݃z=!*>޳_9@qZkúXGI)(Iy(qv&'~EޙqlB7)@x\8X9PC MW결gnLk&)hHѼg wx6oqv_dz.q_gX'|Ɨ܇~G_X?8:iOAKSBNoˆεRsl;p5N:@kZ\܍F0犄OD2pJA*lLVsI\p,Js؇m) ut Ш*fȎǙY䕨Q}2.R& 1DT!,):nBIe\0B4 -'k$rt!FiچJ Hϸ䳙R.$S0Q.hw4$BepT򞰶r .bB\M9BiJC mNpmBkIpBeJ+FGTް"ܹXdLS{WɔR)TiGػ4=T(@)XijDJns]P*͕@a6#8U19]c)h"2a(d I가0OIGzGe,![,gmǢ W%9# =eJqBS,&D!#Nq0g<^ !0Ooaڶ0clcc8imeoިo"S}7&՝ԍdՔ@:ưh3g% Z DGa8'K65K\te॓B&HeǍcL-q~ֲ1dήU2oTT> 93s |R_n&J#ܴf8G>WOŭ6<3)X?r1ӽ}_ 㿟~=ӟ(b;}`Q ;Ae7Z=?BS#?'ex.^Ep(DB0ŝ7ӨP4ledutB!;0IXއ./h(AZGk$q@ uv!Ŋձ/-m=QP 4l'ӥP)t1ih4\Pvc@e#FGud@0ԨdT+4P"B› T#zn N=(]:0qnWّZ8K$$ XM60QyeiB+4WzH%+{7SQ$jQt\tHmSY>9^9 u6\9>$緅fَ~df' G3o^qU ]|VsOh °ͷ/rxjk|?o# @+nFNى,[3Mkxr__l-3ƺP\1>&ʴnuGz{xY_G>B{sqQy/=R6^}}qgiySbhu71u.}L"b ,>r!Ñ=f+Gj<"2EC VL-&om41[K4Y 饠޸+Cmeʬ y4=L't9]PJH<`Vǻ2QHcrc͑ IFw 4%Z%"Fo;"G&胇/Aؠ.HJ/X@J w'gÖB膆̒mِt 큞WOAsD!G'RSB`Cz@B<)'(HJ%9QD3;I5yPPi&j'i972WT;R3q=#-;d݄J8+-W$ݦOJ Ld.:vhY2$9ŲNf #,YQ3/F [DΈ22z=Sbh ?4:|hld&9R>z~ΜYg*5C. 1YSUIs><Ac/i@֕ƍ&]TC4.J/4wbjҐb%#Y}7!@N3[4 i, *D8ơuZPUz f ԥss. B`# zTGlv#C!Ni34ZՍ+;O>vA߰Q0Ng>Ou%o_^|^yufG28·(u*׿r*v=:ܻAsh?ڟBWo^o=QX7so– [NMC IDAT2|Nxl|oy[X5vk|i<p7gq19sf|xx1W7/ߣ(} K<+ p-|#WF^yo}!_xw}?}O ?kߠݾsdF RȾp+eQlAЧ@J@vcҕ Fu4X}GETV"Sv|LZ-+gЛ1JLтXQv$FwF]'6@K l$_9DDiQ9[ ĘBopT D%<7{+ɊنV)djƆ%Cr Aj!b;PR >#`IN M3K5/u\}"#̀ MìMN!W% `6yڷ;fBR8:=F#:gM8)9S p +l }X-"cQ%!0ATn ؜$Xj>6E4 Fk,2A @9# f̈8¸0X7=gZ8Y&P}>ͫ뇑`*:L3 T(~"R@R%>HWc7@9U!;I'J31{ 4BOO˩ }z4to_+>ANk!]9[&P1Fj3?dpկ0G&+`_I3iC=co} \׌.3Xhx<*W֣8CEpݡ`}$h, 3aC Bg::TAO:()#YaBBDBG<}-*OD(=iJniLDaM)3E!YXΐ4:(arR6 8)eN:1ic)  rRfbJ (F)v&V2횭@Ni4ƦB M^IYYѳN'6̔6vWڎc]O#̸*Ž+B,ڳ*ong9;~H?E=Wa#v{L'y_kg= Ex]4{ OSqSWʜ IuJMChTfMcNCjWHw}'}_3!s~Lmq_mw{7;g|W[[wSaz~YË#>S:}(@_~5~K|!>WϰnJ21nĚY059Z]iVnZao4׍QTV QBH%h9! =9WJ4." Gcݻfd\opl&\Y(uW4"uq)2Y0 ,tsA6h9L ~P<-.ΰn s$D=栩\$FrH f|Or@neY"Th;ubr13FWQ@ё^\+{e~K^h҄82FJ@r+as_ߋ®4f UEP]7TY^K4FmkL fZx? X_ae"keJm=^0pT`pap"}:~=?3J< :Ѭfғ,_A޾tTԽ˿eD^pRQ"wՋ˟g;޻|pE O9{?^fe)2je[&dFs$0d?!yXUڞH - YyZ枅4+h/^e՜2J# z zҲǭAV]YgT-1xhp 8?|#:+A ݽ B D%{:F6qFE| +UF "JD<8+e  'B,Kxƨ,u6P;ˌ+GK6tKLd5!KBA[Ӥ|Bv.=#msBXfҴ9&-;`&g靻|؍LwYD;M6cOKY=x6=2$^9|<: vwOyo%f.<|d{ȿKOrƍa~֓[g<~x=+#-cϑ]|㵿x7_̗ /}'c/wrUoӟ}}:"],㪬+Lڟ+}g'<ËϬxUw>W>{'uԔ1Ɨ^N^Ԑ[/PuȐ+.UjZ@̎" ˕f >wߡ߬Geдc:,x\qEeĉZm!yh`J3.ϕha!YOs@w*hdY^=7’AChB( ZHnu$8ma6-{8@Scޮ aOhETq‚VGrձ1dO)FM viő2VQ 0PuOغC٪@TK4)š~#WVT mX;%+4fM"[D=Y{eo+Vse W-،S\ksM8t08ZU3J]tOH!E W Y| ~ ߃֭GK:nY Ui_ѧmk2\ 5 dx'Ǧ^:>`ڣ>0F8K|?|Za< ų7788tZXjk$pK!BL;|+MnWR? L|r?c#p_7~]r2ۄgKpϯ-+>/ec?vp;9{VU>k=7ɛ9gx} ?˯]vy|x/||ns|%^8_Y6w3oт́o=և!Vg<Yex~i}d"?oqNX~G!3+' z ug儰ƅTGpJð<&|9e,qR*]d*Q40vrq-5fY2ǎtj &;aHZ,.wlM9g~gOŴO4Fj %rd7V#|9S7 w'|ȵ"^Ж ks v(|}[sx clT4QJk[%Q>+8}'!5WY.2. dZY`cZT~VGZbiBMÀ%!-4fYi&ajjb1zO &֨^V2_ gݰ3XDs +JPZ5# EX" ̃1 i#UZ_`5RH`ZP1I}򩱷il. Z1'Sa^ Q1@s3z|[p!ᬳk4l;_fbݢ~Puu:0p^ TTZ=4R)"LڨU\%>)QuQrE uC1f 5k'υkdݣDY\BhzYh\XeF1%ɵ۟U0*MV#@)lM:(T!#P{㸶FR/͓k6EhIo.RǖF%YIpe+4oSI'OIp6IϫC8E8X8`^A>CX:~ҜR'4 Cqj}z }b<N)3?wj˩rUq9S8kPp^S8~f?-#XYnY^LJbY5V[v2=gZX7hKa&}4:~xbDX[㢠1SZތ:~č!{"+e^qp D!F !<qEY47c;&j8d0#ȑՈ^g!F`$6GHtgV0xuv 1lCց+)!^0HT}gPsG-fVĺǹkK,L_*Te j'oOAں2W:"F3cKI`FJƶDo⯎\&px6 C..(A*L>4W8\$f1:]`\4“1*Wo91es~peA \ܾpuG?˟ޛܹ}>_߿er۴ugkj|+p~ wgǮsp/svpLw/~q#oK}&Wn?k|O}ʟ}{zG\\]?8yz?@ ۱0*! CeخpW_eH{;|'ō9~'4}pfh )f;jStz ̽=Q:>6:"uŁ+\̙*yiD!m\ʾ&X6ZJ7:"ah)uR3 csL~ADZ<9moV%˹ aQhP[VZ/sY&35Ch*d=s$i!^KآGJsW4D=[a`r+A"уC q 'DǸ np xthf<>5{,fx+SfmhMծ0Tv"*)/Q< ej^F;B-Ԧ_"Œr͕fffi5+ʌjAj+|y~8an}f ]a5h}ni|+g2ɞE 2O/opq;_o|`_8gԋ|~`[d} 9Vrg/ vL[OL7y5uqa;-Ǔ=gCu7r˿oprgyyͅjʬO8wD-$Qv918y BCpMkOqp8ׅ|26!r:(BkfXSw,T6L~gzp2ݱDm). 2c:͞B륒 ̱ƈԨ#I20"Z+*V(fK+qMf|X`M *+2BX8+G]Oԥv3U8kV.o(3b@%T }TP;*CB%ph98e3길(L/Ҟ)L;-8Yz).{ Մ~rxH*#p 5[|G. R3[KJHThum0klqR/;jbV*k$T2Zϸ7Ҫ3eZ{/~"  1`g+ g+uԁzf$Hp\#R.>>bN@K?Zp>kfqT + 4-d4+$sH^*#;4K!(!bԡs^#;, DϾ,4}4a-Q2J_ 6N. ! jM ,:!Ch $TJt]\?.g#(Z9\+ ZcCOJ 1/ ^AFn/p+]zn( Ce XU2zMt .+[_duh׌D'o7x7 8ę%LAd-t}/eG w8<ʬktdjo8,u 6Q=aճ@85+(Q?^G*H̬<I  C|Tׄn.Wz)) "P!FÊ2KD 0F8b+SAYz`8 븣eGp%ڨXEDb [)<яs_Qq&h3V]ʁrkEJk0uQՓ1ՙ]];K) F6;ƥڄeģ-Ky|mdiزKQB=fb{6f{0ᛸ9`O:F>p-.(UXݸ6w}貢N bG~:-)߸Ç-?8>n+x.2Op5?7eN \|)^Ž =X_|mOK|v@}sz_|_ ~ȵ?O{y|pw~g{]I|S$ͣ| G#HdS η亠9Mhݲ6YNj'P\ ?ơ`{J.dvaMq`.CY(v-6LirJ4!٪7vM.#ޡm4h}]֬11_I(:VF]^>l/Cg0* $/- AARA!q@/GY_=.(B(-DUd3F:p|0M-Rdc0ٳ̧\ ǽ^J),P- YۊGp;GX-Ϥ%`!N҄ STv@FL"TCCk&`{BZczu>!( iqzr9l>uxz3 OIҧ'E-js17]ciKo_t exw[ A+|8Sr[M082۪G%F(FRړⶤw̪.Tc=V+Ed3Z/"GƃA69Tsk3aCghLͯW[HlpaEbtX^3 ?rF#nlguE)r|b \˿'?k/Ygqg9+rO}3<9^C?o=Axk|%33ӔZrc3_`ґ}&oӷ8y|Bmn-8 |rUO_\3Vvw^g/<rjl󎷿|{$ƞk۬ܿOQxwo\cLPC(}P&ωy}ӧ{R]8fg&_n uXP'؉GgWNaS):1F#\`l%r ]"Չd -d&e35/' .4c=J7:J5, Jhڋ@54*unxj[PiL:KXQCPC<0b0) kmV4 ( `6E#ಏtBLiT\v8j%fRF?nKR) œ!kԠk7ejDlаci@$id\05vo84)N (+N;#|%7#:ߕT0ŒI・ɡHͤBdxvcK.GHxKe(J![$XWb$V,%\7/)~ZeS8BH.@|[>i0ĺBg*͡' cXAa>HK]o(>Rt~iItخ3>@ ŠTJ33Vn]wV2QP| >Xz קfgn>VK!JJBH%ψEYgt$4>H7r4$ h۠ qԱ2 yα0 ozo#uG::ضǵ@j ~%ngi4zm{H{dX,0gej-=oXoMfe=t.6} w= 좯`iŲS -[c-ߥ`D4R=cjԍfK٪Aʌ4fd+Ģfba^2^<$Dl)#*tlPBuiJ!RK(ECQŶ HL]K5)p~& -fLշ~H3?Gw0d%i E,Zvmzxv;p,z͝\>yz+zw<$[ʽgǷWyk1?}ۗYϝ7ۏ_)H# EG3v68Ā4;eB YkGAeJI9:Br}RncRN6Jsmke2G}n(:?#یj!\reD$AHE).e&p%e$-f4`3,)"͖tb+m'g[ԳTeQ<+2ǞbJC acQGN.sLu)RG"xK:T3;8Cd D%l 89%٪dM KLq#eV0Z$d,H(򓋭orJPqēˇ/eDm2R0_'P]y"?L$)a”6i`@iz: QP̎u3 Q!g+4#k qԷ&>K%'˂"`R˼Ү3-E 6mf4X V4X`4TYihPDL<P5̘ NKр DTyj YXj:Vs7Aȥrّ;yKfBp25b%d)h5 S$ن3Z::ъJ=#doўsDBom'ňEQ@^BȉQ,kLoיN/|>{R2T*wC㜪Ұt0F+Xa!Uk`mY=*?TC \O+ہIff qq f3ݢнz %b]xB=/H簝{D=1va'Ɛ ư Œ d,'hG!E!RX[]M&EHmX3yWaX,}'%=Ll(#+0=68i4%,/x VJ=Kn B,[%p5VtThk ) QzCg+$ Ma/a^ox]$gz04DDXGHY"6C[I8Q&1'!U٦VǑVvcI1DQڹ$CihC P9+ f*A$SΖxY^C14Lqztybs^~b=Gsuٗc4?YS >"|oݽ$ [JjyWJܬ wS(|}m$oI ƒډ%kc8)~>lE>ۼ1?߿dSna_:bVK\Zxs__2<lÕzȫ{Nz)oxw[%^yJ~6oߢw@\̐i͋'.{rN3ӳ ]iXzݝO(D9zJ6gR8ݲ[ 7)%CA;,\:5:&!㚥M3 e lSTZ lqXJAL@F\H@BTqu!Sr hmQfK##b4Ϙ\HP͸as$Q4ӈ4OpTXz4 RUnbvh(ʬJĈF&qr(:}ߥֶe;NRM)oj*?fBc*='pJb*kh=QBWh;3>źґt[,і >VP"`$cփ;ltŢj,$L\=B$p~3$FSZz3bFŝl 7EX2[-`Rl8E%W0,/`ej bUU`&蘧 1ǁYf"* C5ҩJeN IDAT1%,  C\qbII%tb$שfd匓POrt2ՄK(Ŗz 1gDsȮ7>qy1'$Pb inYOM+yvdW'=I t.-jt,.2z:uEaOU؋,:{uws&[ü\6tb05So8XA~9/)2 1Uk#E 1cD4s,L'a9a0/NسHc5=:u#Ycgdѓ'Bl I2cT8s[lj-(Ln}N`;\Y"(-6 GO#soiю{ =f4'7lW,ڛ0>OU ;WWR}G 5-Ԑ~=hvgiE[AM^|ރ)lH Q-J(V̨HfL%(XL$fJHI(Y<ⳢCEJrM$;ҩcH 'Dd(WN$[Mft̋ B-N=Xcؽ|P{!ІM|Cp2oyF`= /1׿}(@Hs6Z^'7|t1_*/?X~f8섟_o ͕%Ot·m yzC}a4&x.jaY,9,ϰ$2()cq#63FgF)ё5^jz0`;%I+Zբ֓湖KT0 \sDD)babǕ@hDzbGBz(4ddRx$ EMm1xSHZ٧Lk)dYiL.-"Rt$%!6P_-2kflje/m*i_ vFFXXK,Ru1X bȚH9 s$Z1!ZlܑJiٔͰ6-'ȘfUKSCTy$p ƕ\&i`t暳"z0=}% DzlZ-QЬ@Fi=Q"Y_2kS ByT\n3yG>;е{Nh%Jgl&8 5H¬JJSdTG_,?gTϐC]&ہ 8zaضRK`YfG6%8`aEajp97ߦ{#.{M1YhX7 [Э`c{ڇen oթgbV X4om=xv&V\uX\xdNDk+:϶ /HwOO_d*ῼ9ݢO^|W؇?N~z_0}}ҽ/z2 '_1=}{ct$B ߠiR20 n^LD[uf4^(dAD`WP,\]ڱ:l0熲zZ tĠľc5>hè%5,PhLJ#摁%92g[)4f0hDK̊NJ#fP}p)ێ"OIXʶcY,|/NF%xP{jX`(u} SzI$ { [YWb=ОN3WHNӈԗ($Q|Eɚb߈aBģ9`L*aEؚl,oq{oΕ;n6];^\jd5z.~e\ђfh펣)a|0=x(}NGhow ß<m:ϧӽ޼FNgd|2q;O>y$z}D|pgw;N\y5؝?3Ggggt8 w vm c\Lnn/o\І'{)R&3}>,k+6.~Cu!xyb\~g͟ŃCL~d瘋cXس-vb9IQ3B1KIkԧ]q:Z1,ˋqcej3F91S%#ڒ693G_Bɀbn. H(=ةfD#34%@-͸Awc#A<G,Ss1( 'H%ɡ@n1ԓ#4+QGxLJZ͘rKńq@=o&j"bT mƠ T`nS2oќ*yͫԦTXBj.`"ǖ2wm0*d"/8D<C]yfv*닡 м!$X6KĉU鶕_0Z "/]]@,I3IV0e؅c4JHsDa 93@1lL   qֱRlL` hC7[eBҀ ֑M^%2$ebE1{G!;J"D ԟc+ljqvX&+k&R2vәĀ3dBp81;TsJgAb_WM N*Xdi *ɤXA(>m@gÌזU Y M`zrn^J,/WRޯAX}_O\طtiavxvjcp?4jc*2G%\D9Bܜ^Fקl79p ʽ{l'S z9_13` rwZs"jjH6tҥrFSrft!gm`J9L3 `#Toasm$Ș-tS&<&Eٙ7bX+7ĠI^&1YLtΑHj2̎qޑ;޸pP,Ga*Su6uDĘXLOckq9?majW**c/lBh,V3 #`Gw@0J aHyj Mع%1J E $U:} ja*I2L"h[#>|diMptkn8cXTݼDnF8`:"pB#ÿ_6ҹ@ƻ G-iq|+yk{ Y:w8<}E'gq\>=G:Ny7nsp!]sɣs/_kMO^ g%߾s7w?\oߺIxռǍ+wxﰝ s ߽E~?'?^d>|]$uLhs-߿zNox/xoܿcnum[7>W/Y^•p#9\m|U,lI+6߾m t6E9K,m\KW9J,hL2$J2< (!BH jb3c[ J"`]7JG[7yƼE00z`Z6Z hLF^dR yfcRAh⫙'d0L Z A%֡mD+!e`$'R3U" i"F 111 lR-K({C3DvZcCJՔ uS<Iml췤"R%0bU!rvn#6* f4# k]l k+{/˒,O&={GWo Qi˯ߺʯb%/[[7+o]rӳWTL{Ń۱ J^ǿb~l9Hvp~f.8dA ~@:9#,{c,v Zq`i=Gȥk)rt^lTyWH"t/!H184#Z˓n,H ͆K<&_?%SWV c.PeR2$TZ 85L -!!LWۑhmTi'\LUiB),N ìR-1PECaHJ+ k -[,VYK4o^E_CS#yq w`_|5bF8si:ѿ~#iAbP 2yd_L^ҳ{% w_nՃ3˴݊ǎ{7 g3oAE|S)# k|2h!H l%H3J Rga ]2@)uoi0&S E#my1 /R!LġARx!I ㄐ Ղ9S0M .D!$4'Z1l5TLicR8CZ--' Np%2;CPj7fO ϦRF4R0h([?UIGH52 .Xa[`&@Tcj(.\3&s˙DbJ=䊫;bbF!BTDN' +9 &@`LJk7cYܡF@ ;;$Y7%Xs\[a/ \0N)Qf%vJ#vQĎ Nbܢ*([@j:$$\ezѩ&Rٲ5lN2>&^( o;-brQRH<@hif綾Xјc &Yb/tAH\jzSfzKBG!9c\2!O!+T 6Wm=(zG,”'$9DE91V4(>U,Y3"0caLKQ^4WdnK>{99eU7,9hΟOH3N1'Ven^3$sWY?13{Lv+=ns-y Hsux=is1_~3p@ΰ/7~ ;s4͎oޠ]_ެ:{}眜*G1IA%tHV#dG#|_`_G8@1+s7abuiWdDeܹT:s(ܪ+j,X::wIBb2xkYJeN4ԢD?P̨0 7J (*~Q^(ao2$B/+~N]; (cvȾwKe8Sd;{X#zгJN/=o'8O~[-gzT K;H&ܼB_d8< &_9y-܃+͓5'`̾zΧJmژ_=GH^K-3oEe({⚘vnf0¸Dxun\xSNC]F.?dZt^]r||ЏDnh75Nv{yӱ«/_c/H;N5|~ۻk_} p785o O]= G{n@pW?cxmַ;O&lލmf}6O6+]mlyWvd' -e! ˯Չy^~ff4]2`T%WReM9TR,H8Nݡ%J_LK(Z*oEb*{ݞ{.1gOluO [;ćB >$5BF,x?@4--uT6-̡!I4Ea㎹,vÑC^;DR"V?,B@e20Cz!3s5v3={ٯESS!=\`Lv&vQ:!s3*&1. `](Beaq#yCa1pn*KjTAų ʜ;\Am\ڙGIG7_ǜ7d$ sp|O.\>zx.lab7o/|WX?w޻K'7 =%O.ޔ~}'?{au̫O`[n"c=˽}{lwE]S#Ot{?.>}q͢:7x?rNpGFƦņknǏ;gZ)3طbY`VG£]u|]wՕnZ#<3Bbx7p=?.=5/};=aX@nt_dw'Gdw8“vc\IJ'TBp׌~d>COzx z _<Ȣ,sNtIgy]Yf=^FҢ_5d]ѥ) {~E7B{Br1IViHm֢Dthq&i-3idړ$CcI?#<_?'`Wݠ[_~\9|1G➃Db[ӱS\zx^ tG#~gaCnp֊؎;>؞;>G*+e'D>>'96#SO}sM]qcX٫=ݞA]Vkb{_?ewxqGknppq<||MrlN!tHc7<'Vg_~6FHPꊣc=gB與‰ 4VBX+Ӊc͔Y#/|2Hv/1}MǟSpsFIVH2̻@-#hϠl #Y19'efI0;ƒy^C].u9"&j)^ )c?3% E]S ` DWB$ E1@vux*kP#KcCrcmҙB*|^R0Y ;8m#m.A]ZT: L /+*d h̘6sx23Š]gPri ь 4 '{\9!6(KHn6J*mN8(D3ta'ȳ_N,kYL5-wfBGBM%ՂñpaOGrba:KHTID7!8{Se&Ccqze"ŃB$k@2[WE'>xa_p0_/\Byd>WSPqKe8Y3n_ BJg邪=69)sx# ;)W :+79{6c` :˧pCAo_]qs/G.veO:_8gs՚ݶ7+wؿv_❏Atj )Bfn-a;j {\&nw>tPa tɻ^Ǯ+a1{ {sv#߱`;>dvDnFp'O~e깚^9pYf4L4TB=9iygPYKe+K39;V̙<;7^3EF 3*}mOJ4Kj$i[M p4SD#14f$"[pGAXמyOZ0QrTJc eB=)܆;\!pM`c`ѓZ:h'kR^pաQI 8`)BJM]-s ֖AytfKL#LE9 hJk,Y NSl8sdQ#ւH5^m5bU`-cɑP<}o t=}p'Qʌfм;C|-PnEWP x% peՊJ@"eґ0 g(X3 ;Q3%z\=6 Pwu'tc_` ˓G^?CR+0@%V v{1-!d&+-'n5.+J3D@PEQGg{3⼲.mTgP%̂cBй(2ɿ)֘R=.{wMgS)#- 7҂c)ƪzZ z6Ljga[.?&nu{7u6o~6x?bΌwI97iʹD+s mnpg&{Թp5!(I/3@>7:a{1$WlgumLKfb?3Xp gΉSGÊzxJ&ƙi:{>@_DF!Eŏg?|svSGL]مni,%wEfHR$CfΔiO^wԷo6^TsS2:Jc=<8*7`jl  8"ynE0WVĮ =i@YRrdE=>gpn&WTۓbAqU"mUl̖5rI* OHy‹(IkXi$je6 mT11<+ZjdC"ID̈Nh͊T "xIkatJWsmIfFh3i%Sbxz=~Xap?,KJ<ݡsO.w|0..,sp6NΉ'n}Q ]Ϲ &^U6u!#>/p1LGx|¸ \Cܵܽ}h{ƒ3qE8<}rraMOk~[8+uloG+wo*יD_=op-qW,C[52땴8X;˟u ty~eSfEdW1r{Q3s\=NϕԣX9Ȝ;dzL|.חGRp^H(kNs' -1Cryzd}@"<ՉdtDj̲c.pML鴐Sգj%S;6# ճs cKsĊ BJ FL0€G-"zebֲ: qaV&d JlW$;f(Ex0q\[E'J/,P38BAb$S2|(*5CRM8LKE*ˍw'R9].P;N Oe$>~W9Sgl|IJ{ʝw/'Oru;sv);:"ύ ˲g7=1jZ/Y o|n:$k8{čeupܸqu〫_=⃻cሖ,/f֊׉>0큳H?x.G5NIxQH&\NS˝9_V2Tcӏ#/?K2 ,/dqYնG>LL__̉珿 \qL/8^" IDATw䓯W iqd'$q=WĽQl̢FtF^`7|Gt0;>њrVRQTfE g^Eh"ږ"`Vjux1z|2.,ebcn29|kwoH0 F|+%14R-̬Sd7GWR1< E H1<}S'`INѢtΰ (Eu!V/d *Y]Gc$cYz#8-ځY#xFTƦ`@mTD u5)SbT EXkj5b1RuO|?~GsU&a3Gr9An&uh#֊_*964KXSRXfu׌~cfTq^'6yL] Bg$,8˸RKF:Ю1OXRbf(Yfl*evRϯeDa aVT=A3my2/]c0 ULJz*&br0bM0,J$'v9qZ&\Q9 l&HKP`[ ڳy1Ooݞ0檔P4bEҩWa`qZXZ:J =P2{y6ΘB%kGt 9:n:D\=D_ߘYǃ+_q[7\}%|^'Ovnf_+^~|vx6dspqիs^"S%Ou .D7L.ٞ=aa*:?/9wYp HI,̑?{V1ʔPGW r]s# )7%Srn5eӡw8a7nП2ܽE`90YّM۸[Djsh}MՎa ajB,0Bhou=˯:lv(3N"qaA1XP"AHy[)TmVpRY{؛vF $5M͘VoE;2=MBd~O~N)^P'!TzmMwу.<1#DoP3N".)2Η )msmKD&ܬo&^Vo&b-/Kzk2npp{oFe S֝Ȳrtqp%LwqϷЫ:kr= V3 o>t=R-"{xx튗bd`],fsUJ3Gdyޟrù >i%ZB1PR$I2{XĈ>*) oґct{_Ĩn'Hgъ;C҂p0yO2{QWP/-Z3>6x:mô:EК@ jF]>IO,P ,tm ) j`x|rUU%3 dR.S$c2[bL  Ku n!hqr){M*b F ljj%" uUayRtf2>uLj$AE˄ ՞I[+޴ba:̞֎a T^2!༣S53FoI&PͰ8*B+q3:Dց.T%cG\j T\*\={tvkj$#hFkIGQ1Fs`jitQ*]Tz 9C-EYm@:Bp5cΡK`T/uE!;@Zؗ- ߴT:T:TQ/ ҰOf5P$%0KG3c6'`P*I#4Ɵ{IZ POi`g*G_ 7}6_>z`~{+?3]ٙ޳tCNL&,V5rRˆlgO=aFv%,ZRk Ysca[ }Df'"9'޽z~cӽg>>Bk3.~S ^ް̗|9/?zuYrrݑ>zL^XxIyL?)%2O^U}_ɞógS{Z#6V[pz"n9AO{#]lc6}10| }]x7 O{oq7;wg[c1oÄ-GJ]Ae.tOu5}uTvhii).-seU;GjK@Վ`3U(Pt t]f'r4dXc3[({8ĭ`-&${K 1WXbaF0ƓǺkc0AM N ;bS(U2δYMR+ eS fUR xɦ0JȎ (s6Š@ՌT[6Qq[#&R0î-aBm&sxQ+->%B_2}r]os|>%_^PI\u-0mIV~5:SxjOY;پs _곙e5'F..0r-|ruⵋ+Vo'o-o=On}w- }@:a8ʦ`Юa!f ` zo|,8jt^^gP>O .]`[|ЕW`kLx~PRZy~7pJ7p~zMh (䅱t,%S@$ Zf\ZOr αoH@.TXDF9WXVղE#;0'lVDN-"A@2>/g%p4\Z6J7m8K 0@F b#^+R UI@*Xm\vII3V,l9F,6HWr*j1R xo*ᘘ8+FL1bl֒NH`0ΠUd!JB>e-lWGWpxFҕ7Xc`YLcᕬT[pG!I@F X7bfŘ7 uK\fY1YaY3Dj2C.̀J$ e$T;"7;?U0'cFg3졐kTP`砉v#p`1זj[QK+hSuj# bºql%ebP̙+##Ij]`=DRzq3/3ddpuWM!"I)ǚ<㷅r- I "y[҆ZWrH[,-ě q[F~چ9[/1 k*;jJqFq9dnʒu8ӕ \ F4;r&HG- X}!)ř$]jC%SmYAXUrml *I *9YT\5Hg*L" {4 UF&Y9“Oߥ\, GOH>+{7.^/ӟ9u>}zGxˏٞWL>{=^ ^~pC_pxQwK|\t*w7K[<t`WL-'LG>r<7o6x2eF]ES`ƽc2MF R=0.A:ؕX@pn3+\, 'b44i x[CPARs!CcuVVb]eBQԄ ) V{v$1ٌT fT{\7shia[ƴu[%ڨJ* 1Rq-¼4VLg DLQflΰK sY#%63: .rFp Z-lP,v(K36JqGU:չ{đTt܄[XTF5G( .s*(,iL)B ٱ WjB*y¸WgsD=, ԣDV*rxܜPI@ SJ=_ba2 E[.ֆZ`GhegapFR(7ճsJ^׆JZ6Q'FzYL`G[PYo!-$&að˝!w%u=5.[:?u&ѝ?`aSOp2xCg]zfƯX:y\&'w_9} ,@Ն+),. "M(NIW M2c[YiI@1:5e# 5\ii lavqF䓉*wG};O?dWi g n݌c6ÞCs| o љgԺR9; T {5Y?w66Oglgc3|1W_G? "[͖srd!6r]wZ(z`lC%S; kWOas;]f3t\>7'Pkbf c=T.q |@Y ''m S{9_ǫ c[؎#l[pjxy6WV_X>ew\3e :"6KL[\O,N3(q6I¬E:&f,<7K1 K:wlc zk9_-0Rty;P}xWo( M#Bsq:H Z ~,{AtEaEE9(C`0kuP!@:+T5SR .\VmUV,B;Df^d:Z9 $n0QLFyDq84&^b<* e)xfرwrtXۍi%&3E0"b`c$e4 (M\Hё2XճVG[9/@4`MFfxJ͂kIHȠ$qYb8Z8qh)T[рm7vtC0ΰVe¡.f&sbLRVl3F[fp9jp21GbeX+(]#CftN3PdаP‘fS=ő8f1ؽuox>1*nkၾVJa@=㉧SHvT]a w!XC`HNjc:dlXcvWh7,mqW1"Hץ p>4z-`^jsvds`^3EbftpHO6%31=7Q~a&/,שē nBC1ɜbK=WN. &Y~KoNIӈ1Sz@3+N+-*]tl$D9Ѭ0 PؠWtf` Z osWHtqI)&.l(b /pyLB́DD/hǦ˔1ڂg%QQ{FAq1҆q =5 VdN6fU:V+dhne13%n0a͌P!qO_1tGv,W.yI!Fnˁ6&P}7N5#t0]>߸bx[,~Σ>oa]^%?e5[''c:yp Iߓ_u$ d +nb9z>zx*O89cgl!*kcӎ'0ʲ{RvfNpkNIvY=l"^e.7gpz\>6o'_T`yѯI77NnaR/ ~_缺zE_ \m9AɁ%--R )T ]{²4F0~RDɩ"qC3^ASEȐiSKGɖ%*G9ΖBBV, Y<]P%bɵ#{]KuŢ {LҠ #&DU ]wK*SMSC]@Et&ap$;ErfW/㩇 ⏘&ق&j_Cnxvi l$f!{!{ eO- RYWl]%d#ܼ IDATizEprxé+@qD)++ 'Ǥ5jDLEuYE0%zˀ'kA>>eQt W\nZV&љ{ǐ6 G *F#6i %p}\2{XrŨF)t9)'J¡ve2+G0=PU[eʖ̼L2Zf 2+x\mdO]G"Q5GHD3U1etN[O `tM}Y=枏'wO`=&}ݱ2y4|bb_8 GѨGAi/uG;ϩǵQ|G;|Jjk/[+myQx]ƴQ`l)}Ve0`V d=xq- diB*`IA8 1L=2 &))'xnÌFFo(U:r3N ;K&-r2{HD:$p!Q>e˖tL#؈d*+>䢱Nrv /a6ɴ8@L&0P֎:d|P}A,e.g5٠& Mc j{L#F:Bu+t# 4Yʌڊ&O jVO CUB1TXR" "AK\`#;&-^HwĠ?~-!L;+o2M/`®vac#u6wX%g\̟R"?'%].|}Mc~yM.8|_]> ? Dwf̅q^wo?a߽ãl6; 3[|'|L;a'<݁WfMxdWv~ ^+񎁯V>SC)CO^| '[Zns%kyu ~C})Wgnv[Px7_=Tޥ_rt0l}X#3F[7~?ȈK5r* Jf2\̂ 0PM`rDN*T2Z&;&,)澷 &k`Li8$g5Bdh>o'ZcǤʘ+CĕHסn&ʌ=2EGr-ta(I{jױkY[0XMt0׊-= -=&#H:͕l dP-em3(de`O\,")TDR+F U@Vx96l-W9`[";c8yV^eҡfeþE#_TJgNM)y!s3!1TD8pشp*e%g E;>PFм<)Yl`=V)|U+VZ?tjA0~ m괶u0Lٳą>ph1#xHŕK+9GKh!XvZ#֖7 =]*i)d^$Ol 35k"Za#+jY}KظCU {XsU;RI(R*^[ Ed(%MU+D&f,UfU6JjiYghh}(AE[y[= :*+=!w0x5 l-gvw`:(Q]HQ=?ߛ@tq9V8Qt~ (jQ,壘R,O_VKsw|֙AWD,GI[44=f ڪbRe2#ڭrŕEa_z`%Eb;!3'A+(h& % 7FG($ʸ&CurPcrPMXƹ 6۫g#~X%v{{B|3(9AXaPA+asA5PgXARt}㻼{oC~xEzuJ{}c}=gsgGI+Y-M^{3xn-ͷ_c)i\6ʅzˣ{s32r-#99_?gzg?ȳqn%/^^hʝֺu}ܶ Kcxa3 p~o=>;waByy9ȫpxwdO'#rryb+_$uZ`q<芴388Vd1uG2.o9}a 72,6EA : L^6V:8MBy(Jb\lΰ%qJ/0҃[۹K!!Y= j3fԗ32BJ,PIqL#D%povB}rHt&ңvL|!Waz:R͑zau,xqD1L-1U715-ip-BY!zdDE2.8(YH{C(HYKAlF$Pm6j[ 'Ko6贀(XtJK`7%`bvjO-3\UTaziƳNMP?y]Xk !)"\j)nu-,RP(A#ZvS]fpe*ԠF FH҅6 ]kVX\c-_Hu9{5OYb$z0r3~C&Vَ~szhq!8d{;Nخ{ľwL&s-~q+%bƙ;}W׼̯И!w8=\qvWpߡwN!}u.ۛrc7lmoG?_57M@<'pQ ?I<Ե 0}RYG =O^*'o94ȹRUu]'`Ap>e~12Q*)l~rC׿-cf]BC4կnW9ұ|!/@Jr`fd {Qnu"1"VZRwdREt<-ubgYi*wiŪcqGF)jiAβ& +,bZ >Ò`Jfka)-R3&pK=d b>jf+De`KHR-Uhp(b8O9/TV.0b- e )7R(-ɭXok-d&MĪ줲iV5a%iZatgӂ̎gB5hA š`!64ma:$CuT$ԯ)sVུjiئV+ޓS(Cf "Y :#k zGoZ˫cZM˭7CMиj\\8`p X;JT0(6YdLx 7K9]BlF4 qKvə&74T u͘ M$5סV(E XYkQb kA XdǙ\MSh,C^jJ!ЋT\o ЫUCɥeg!Lo klt(N2tY#Jp o=s*δUU{?5_`5pv4s+_/7G!x8e{%pX]E(TшWfI DΖVķֽ-ә7d󞵾&">]&eY %K`†H/cLn` ؆ UEXUV[yo'=r-бv"1Hα藊oga *5x68{6 쯄+NJs\ U5$ H|&d^|,V`:0gַ7uyZ+C=~V㏹]1݂L|k)3z~{~[~yfQcM;o+͝:)W󮓬^KQiGEy_7DY>;6ġtJsH0Y#z#wVAѾ։(ah2`&tvCۂ#9Bp%b$@H) $ji MQ-2JJ>n\UwgNjؚء M#fW,\I是@) ڍ6DH(^ C#-V1lN3%itbO5b  LlW䴾L*#غ}Π-X- c6@h VQVo!f7c_rulT||ABh2):7mdeHG9!-@d6rtHbYug5PfyseNüCTQSkh Av &k8XH mٱD&, 8zDL#Td"i!Yd aYjiиA3 ~< |{YL'WNgǓ{@* ,Ug~ŕt^BH`|n9NxeG>O?cWr|BnJxh2?'Dvz+\ox>`(3߼r|W)[sR3گ~Ϙ֏5Z&9u|?gw7"/;#w쾆:7.k<4uf>$V#:%/0[F7ؙ|yN1O|yn|5㯌W'c{ W*c^;;Y)&)3D^9 LN%ȶNCa{B& T ͉ :njg!씶vوkIE N * *BNuHƼIkQԜI*s \vxAlzMss||\ÇD  q8[41BvgDNz&摵u(%mJ PsV[c4cy Tωp$ց2qgx< :{Ƹw/ȩAHge7#38҉ˈybci;` QB%(mvGORIn[%V9="6-` "18QS'F54hʃvnD*dYRMQfJ°:@;289N M)+ r2OL"mA  g 4FLtD%D#R ABh kEN\N!1BLqGV2BQ}fadB@-h!BIm]86 (yC\p03Xn\VeN҄Z!0p=!;֌$oLz`=6J-dò4"ua M [>@gF k#^gH$,;i";"ʫ_kGx)dd Jb7<]gGFV[>7Fg&!x462y reS8v31t407#(أDQUr(މF2 @ NO Kpq5:\_~vK?/t7E7%A%\_2a_0]}~eDyƋėP|oO<,_,^n.y8|o8џ"G|p IDAT>PG׬:1՞'ל^sosv%>K<|@7Ü~! 'P.0ۗå.>|8pRp88OGXp3'y>[Ļչꂽ\ OX*>;뚟s@z9ܽSYOy{ ?cOѷ6fh$ߣ0ah]XMy2pHƨ@[3rk6NFH 5r)pٱPYU@UvXH[ @!-DO|a&"1/g72 Xtt3;ٱp!fP(5UBy`v:LN<[_cPnF[CJXwo]YkGA1 3=Nh4 2a#5M0玼,ȃR@ 31]\ѫCU:i Bqcҥ3o6xPba@3D%L|D.HFNm !EX(,=B"z mR=XJΙ"q*K6 ki31B27[o qlX Z+Ytb!!R)QmO?@ >eۙK|'x)e& w~z~o_2^=k}eap\|vqW!7/~wk?m(7 9 ?~KQoÛ'ܿ]gWΛ&5mG)apA0^ _~o ohzO~0[|LοM~µ t͡cc3yWn;?i(3=,T^%_/Vy&rG {3 W;ц"ZL]75\0$9l-gZFZtW QgqT"-u8G | X 9nI(kĻSuL@Gk x먝 ]4OzfXC~ F#\)i 늲Rm"Jkz4$(%c$JF6E<z$ , u*DN To+)EZwFddOڀxG48e ZfH2nN7aL] ];QG1Ph -uaEnclmh+^g٣-P8ae%ۈH-nY o9hl{dLqOK>HLe [>$2BJ0G$t3Oa dꃓgTFf9D́hߎW9{FFy+L ]}=6 {,d,ljJ,ƥ-BKyڶ Okc։֌\ B+d8y N"# \"1(&6/p EZEU(Մ(wZnQڷev(8'L6B{*XP0]ƒb WDbmC'"A~ ΅% K{d̴ ;ƕ2¨3ބZ ڙ"-/By0|b=FT"mN&z$)w,ȁ#V:chɊ[-гQM~0٨3b`+mܪxu R2hU Z:҉i[Mk8$&*)0j^D(1R[eu{JA#5*}56o-셠τ!:+䋟~3wg~}0?_V -}5B_>@>|dN킫zt|Ţwˮ>xIV^^pj OOw+|0_dߟH/B{!|'/pE!`׿1o)=5N߰{#\ǟ-q$ӏ_+Bjs}n'^ a3)Pu%HyJ^:CLc‚1eEh rET%9w*K&jeoEĀdBSS{8H@:.0%;D ttzͪ#'b&B([SKǁG6.t%`Y0I'S!=k* b[;Da,#F;VK(޾~ Q$x0b(=T&vq;Ub&+p`7|--0Ćxfd)"❝'Q6'xNJюE":P e618+ 3!k[x$ kjtmu)3:;U g鈋oqHl+C&V94*!vny-Æ'%Uk6s2[5 =:1c]c,8)fykmErrU i`Mp$ JNN<]n  G.!i"R*!bkI-th7a#ڔE.c}ssm+VӁLiB|TqWRh$tƌ/!mkx \x#17zo4o#W7lbh-`DgMsGXvXtvJ*C, K Z6Ցq$F27! YD7}?r҉YU1i\ZA6k#֊ŀ hln);=bYQHemPt/di}B9yܽ'Z"@'EivRZ$dk gH:R oXnۊVfI!Ȗ H@6'6<&9 æ`:2B]lӁ]#k 䧨5ҧ4>g%wgzą _3s|^gaxX3O8w|xŭ*-koX}G8? 哗//nD>tEw֣qx)?}˯gn״U#wG_Vy)p7?{Ǻw\*; ύIw޼|[N%I Uœm[n; ;=Ԙ@+|fdM[;;|)ꬬ??w?c s gO9KfY噻?A3*Jg>raB q+pzh:6{~0B18 WJ̪jUg>D5ᾝ:وEDo 傎He(̬DNUKɆd+6(^YNØц-niIdu+Femkb꺠i$:F<7EiXUI@  *BDQN :VViI)oh@f0beJ0fk4::k[y[Md"Tu$$x?EPPe(6ͦsCE\;96>\$d30pQj_Iy| A4LEi{fWFd~;=+(h!J#FDȵmnʜf QZIÇW,A#|H0 l|wEuk @F (͔Jap!z@U.Ii0J.005{+XUZivRLD޷l#S%[%9fm i :DH40܉z' ;: )bDj7V]kS{DQ%t2Y7,lJa쉇\ƎiFfӴ2=c*x9[d(1bĀ-CP;ՕmXdJ&6Fʁ!B !l!vF*Ք }HQTUơWgBa!&k+t+nőimg1dg7. }k")]5+q0wO+Pv=y2n4 Fy㊖1BώHh(t|CV,θ9= ph谱JSX .9PؚQ; I5ZA.Xi-R/΄|SN^ab]{ h46]DTeʈPpő!h4`Z m$ DP Q:GrrM M)kf1G^@o0+wLm(#Wq5H-a~9d]h3'>L}Ɨ#/EG<:g -r1U^tȵ G/;.+G/\ #7HIϞG/_g7P癞a{ᇟFLz[pUaxzg I8r~U8_~~pAIit8;8 #|g,'p{cǣƀ.;zk3p]r2R}k#O "lm¹gBXd v•y5%N#9܄lUfucvg+(1U.㓑x"pf=tgM$7eDDfܶXUR@A`4< x聦 =a50eHBVtwı{`sgH:y4A"XUjtґ厤2Ȗk sid8|_FXc5GMy'[6P4}LVs IDAT nQ,Z 9ۘ}k,f)lRy RY5lqE]7FM:F#l-fTs`q> d 7jPBpPM8nZ>M-A3x9kf& Ԡ(:>K"$g KK I*}4|4юxN+8{}'۷3'a eWrx :H摖3ʢrT1agtʡUj*) @+{Zc"!NLIٕ>ݱ{+2P/ +_m!uz,CDwrr,Ɉ#YQ".7tAR#LS[1۪'m,jd8c3*L॰lu%q 6}c[JbB +k8FJY!0tQq+v'UPwE Y=.?udupz 7| 5zD":x#щ݈*D/p!MD2 1䀳bGKX0i4˜L4{Qp=PaS{FQ@;idKƚq Ϟ?bn^W%G&qcp=yF_dW9?9^<>)mTGRoB?%O~|һtF\\7_=l`_Pmgvq28^7+ / )Q9Ou%oD^sϋaPQ8/ 'ȳ4Býhİ1̗;Por<ₛȰ?\mʙwG?K &fǫA+Oh*bº΄6$΍ԵLw@)+]%1ƙP+npPbQ(cy%L3'z1ۢSN#PBtk@jÜg fUN ={Kh]0kHo_?|D)C+=fdj`ֈn+v8ۛ+~sL{eĨJJ UC%u9Rmd 4Ccjhs,qj⮧MSuvE1)g)" A83Eo`Ŷ<^vx=^1B1Yg@Պ`j d5~" tvr/t{gX}_pm5kLm˿5ՑojNgu ߨ*%4j\8YeeerbBpjm16+m9a QM9S8h+"۾M\Xh -#|e a8@4p^؟.#>q=ӳOp.b_rxbGOxuOz8J)wb5s9=WmӾ\ƤCWȮ bX[wU;Q09Pĸ3 APqSal{sc08Rh3lIG tfzՅZ'u;1l<S(1PK֎Nh6",DK( ydaI<^;_J +FE26tjxmx5V]JApmF/t1 W帞X 2(ַp Sl +^IUXme4cX0 T`[cĽ80teg/y'cnY [U`x:<Gn^WB./8?W\A~|G/65g':|EmA,1PvǷKFG㣧g'#o={0 ~^/W|呗]$N佲 A>,)女pzvOם 8s̎.ݤOϮqUDaa!HUJ>u7Gnx_IyWwB=r]x=So 4D Ót^ޱ1qw@{_RPO@Fg`Y)їe[ {OÁwvn.JqTk)V+x( gn:f Z=U6yK aJ!Wc5mM7]+,d&a J`5|qT)iFN2i,ygbC[0sQ.R #eF%nBm"mW ?(R6GJEmZT/E: lVWCZg/&0y&gEC4X6KMcäT!d^he34`[Oኀ8hqj XpI!+um[v:e֦ꡃ+X s&bؚgU7og3جŘ:j%@ъO+Y=Aq[ D lA!#9f]ǂ⒡-\mtCs,*#"7JW YfpcNPz@GsΨ!qFB S xZHȄ2@_9 unLqkWBgHc =ASy?ſ{Ѷ =rs޿#o׿}ϿӃr }P;)_V85jW޸ .n{K& L^pPw mx?l r9k8ޝеp;sb|d.GO1{;'?]{/?yB؟nG_-/N2R[pCg(>SPk I !Ε6.fF2FT4J`?=xLVf@h\M*EY m6cUTiQwb:m|ުV6P}&$cu+RwL3q7fWCCns#p:qfB-gʑ<'ZƾVЮ1͝`@y+HE1QǑIx44VOMAs#0Ϟ^vᴲ\w>0_gdX1 +bTׂLY]p 6U:[!G=Qp*%V7ƂJ JR* Ny^!Vƻ59%ah8Jğ9ʼL聇ue=5둵 .`?8?뿻t;^yR_~m•;~J?oϸ9s2͑QkFAX83#'xR qW\}U3g< 40>}2O>^ ?^2>90:YbTJ0C=d3v 7Lk.<an^^i0ʽ`άX+];+ԙNs\ 4] t{rT!HdiEB :0+Hispgq[-ap8reH3ɨ1<,ٍxI],+JMA:Y$fCg#uGʩ<M!Fsځւ[v&DE+UfpHWυFV˞3ʊ:Ӽ(ㄬ:g 2b]4ĺyVBV&Gn߹ttHWr|wݷ yI J9녫k0Ibys$=|GnCo57V9_s쇨2uyj Rfcg\!>e cz$<`N$Qޝv\h_6(ѓ9dR9.7p2 J{賉mFc]&9~č>6,xo+B/I(,GO_@OC3w"/0ޟ tCj#H|[~%pGWbVm}tB lz1a'GU='b- Z[99OiVqn\R1T dEt@BE&"G؈D_ ^[lhP4V2P׭'FdwT484EmHW;$FL7x iT vk=&E7_'TWp:WK5ɌT(Ӹg!Cjk#kHTvtu"}wg39Jܽ@f"v ܤҺ2Vju8r=)QN5p|5wKwO1\UusޅQ%7AfH[[.vchi>漱Uᵓs-Dd :YTxvM+ ECLmS!ς4cqu/Rpt2kD,&j<?v6#5cZrFF+`(6ekXɃeݠgȱ슏>C!4X",0z{tҘُ#sSаpet*&/:+Cyh srxf[dDRoA ,qha/20Hű7>k CR({4)0O3#VqRErbDkcKHhʃtG;U j[i͏(;7&hвGjiB䱐ILPaGR$0F cacj4L +\"Vf'lTKt"B 2nSwةGnyڠѱSX2AI}fOwЅ[;z-B l(oD|o$:ֱ:BtB:4{,Aly#+ؘQmۦնQXt#tB\ ]i&d' f{'g3`4ExsѰO9zY>dOLI#zv#wfH!};rsX7/ɟ~{wO>/3dx;Zt5px%rS#OhvB IDATe~g_]_ag ܿ~ R |tȕ16>ip.=/ePNo2/w8 g; b_Lgw8X:oO&q߂K<ԛ?;p?Ϲ7d1oc~}wxx8)rvo)V6lVnF50r#;=TvJyC)g*R| _x!_@iNsa2\BˎJƚ3RmqĆOnNkݺ5P ( ]3H0SNl/xru*Z`=Sw++5-+feQ&ԌIEF2_Q+tqԕ 嗌P*-ۅ9LRhݡT Fq+-_WȤ/wOTViHrxVT@am0ʆLuC2L@ҀIElELmEHGL<-cЭ"IMk%kg W<)-!KjhW߳ܐ,`R&ݖ}݊Wdo[dۆb-k*̮v:QxăA3dpy;tMHIYoDIPl[w_Y+`P_T&d\uq`[r-1۠M\hPZ׾qZ.@7B\ዧխ y2vc872 aLzֲM}\8 Zp\': 2rPns2@: f{fa9("M-ɮ3ih2#@tY,)QTWN5Y3e2 d&KU*#HHd&25qm Σxo-V16s4:'4ZpDa4}Ʊ7*q`7bPוض.ayD4sJ).U)rX1R݈5d+8#Džk[&5u%cY;Iv?%u0T)*j6!‰ q 0Fk @`An]ݏ`y؀UajFN/ vjT1L6jdZ툓E/В0oF6D8 1gyN [@zԧ0H&3nhA<87գNS\G8-U|mdHd 'Q3kتR`}:]K"SV/)A<ZW(A=`ՓCCTMZ TUj2rr>^l8D=VG&y\i G݆F;>?b8n2qn 7fenв?DR\~2+/O״_qc?xfCxCR~x{bY^؄oax?Ol&; \猧Sy\_\ n`RrwgO(|ay_Xn̻=L{K>9ʰ{K ɣ ;8rt_rSqFa{=~~)vϐ`]2p\G3ǧ+{BV9RI4)P!J߮dsH"FLs۰J_3FZKB5ZD!ʛr[bT@Ҩ^` 񥡥2QkBIpVRi%7Ne+vaqZQ;ѢIXAظ@]5BM_>XP} BpKF+57FQ. )mi# Hp+X}"U,gS,*XtPOq.@К  =n:PGNzVDSJV̠ʶ/?PgN Pjb<>ЧM1 Bfe(Í&,C$gabI'SJ`jìPҌR/ԶbgfybX'cϨ lRt^+4FjÇL J#dł )C3ñS_xC-mP#f=K QAPiEl0A.ƪü2KʎtыN˜2}2ÿUFf9@F+g*Dx ߿vIHw+c4,p>ϸ}%@'5%+˻P[Zkw3>o3_@䎷+'i>apOOqƁs |`@}|)|Iz>p|Ӗ-ooNo^89#Kh>yoV?;O {ap~Di>zHRa+b`t?6ua =̯?ǹs?-_|z8d';n~>=˿?l?QwS7nC ֌J O=g S;NKê2 ,4˔YPo4yVufڀ:F|.14I*SΜu[,' )*֋^fh1Cjc`#4,6-Pu<i6Bq2a)?"Kwcrp`_ 7eEMDVGDB\-i7 5(UGS kH$J #HkBg$KDBH3 Ռlpfj??: @UzCW6X&e!0&<֧H-4Ҙؖ@)uЬR^S2YZ5^bsÂ6vaA@P) ;-: KNf'!ӄ8Es-I֨ N#}3ZV*&[M^!f" wP$(R6INE9cA_& xЊ+k 2r)U8 B5ʚ,啜 k`ۀ -h,6.F$p-jz4`̈͡a`lJ%bX53J{I+V֠Fǔ"[UddɎ%\Z"rf^Ƴ7k}˜%h[!6W[|V=jXSxIXdeW xI8;&c a\)zrXLgcGai+8̍ieȍcs\XbPRe+1U.s-Jh^raEطNzU"m`or;S,jx.whgS #q`՞gBVQ3e, ۣR-JQ) qa"2@>Q/G6&ge8Tz8 _  SqW0%K";2xR[cL'P[E6H Ia'j;8r|3p:/ +))qPvGJ ±9M`?kq NlCg7Akdc;f%3Fn?uXQDkdz6^TeEP-k4_X,v7rز}&*e / v60l|\A6]cCM>W)W-y|=3݀#sKN3Չld9wJG1͑G63%>ϳcqq^2+юg|ف:+4t/']W{^~'*iOߑ? |'a}?}-a_L)VNX NY8C2a`tsvņL qOR7rNPW9mQ"N!+AAsഠCPºT| tGF3Z2ӨT64b]Mdd NhD=ۀo*ǦIUT}KSWH7}%g %tj3 XlvBFCK`[V24Sp'ۖ(s™ErhX)N(%"D&?= jc{N+xߛ?޾a{! A(]tL7n(/iGZ%s'\M3"spqnfT4]GfT:R`cT(S* 16rk (u8qL• /O*m8_2ghܫ_pS3kV UNf![O:']2cacvby(6jIa->Rޟp><rfWDbK0ЧEg !.hm54pdu&Lu >N+)9J9pg _occRe1BT'C} 6s!ᗕkn^|C`+UW *VT$K.6֥bN9V xh$&Z5ˊ*˛'(MNY|_/Xa(zZk07,kCdlC%1\ Ȱ)Տ)sn^g_6x?-;-mz9Or Wt#x=kae~ qO7߾=/߿` ٖ_T{n/v\s+_O<|WWl}~˼ɳsfaC{#j`\5ˁ{ɹ2c?ܾLWǩ\sz%|Ra]"U3a3֒n 2x۷uHa~ |. ?# %7^×*?\6 쫯rRh2,Z) u9C!7?{HĜZ!'J5(ڸ5(sX30 hs^+ Bj869T)^hGyy:E)akhd N (u%XS"*_ mUeF ڳٮ4PʴBbgOzFUֵIXBFȪ$WzyZ4|mYg F5AEVY )@!|%DMhb'ڔɔacuMbwyPSB"b|ϭ? 9"MX ɐ%ҦW;\D絫PZրDc^z!i$a~ŻH J WޯWapL9q/#1,hU'kK#n,.szP{>]Y 7}E9V&ŮpΑĨ\êQ_s-x2!PsD] /RX@OlE2mr9v%rZKl\ÿd-3C /sd8x%rOģه'?i×[_BK8 3Ly︟߾1\(,.'#kxa#9v䗞7WaFPooIis^zX.&7'6!$jLSaYg6# *`<9s}zqoi mj{kEIWf2Nڨsl|=wy?ѓ7|I+7//GvQ'7y8'=}E=^9wͅpX lZ@kx/$IhY1Ia7 \8Ԇ[;u`.5Ln0RR+s7:9Qm@,N'\h=:W0Up KPUXi)'l{h03's8U\g8FPehzb"H!;E0Z*0`&fu<`Tv7bfmh`lFJ#0hZ~iI;(kJkg%צFS$eiB.Xkpі&.Ժ4ips:E[ډ2T6JvM;Zz0@uCP v32@H,'P =VBըAjTj[„,#l%XBipxFPѝPېtM}t#%8?3@#2hְ%A]W,1 IDATCfGvu™1;%cۯMX&X$PSe}0N{i$cb qB >1< ZoqvGWɑ&8B5x<6:وʍDuq9`ɠ  Y[獪ъ]ߡtel?iRe Ssl6K&vqNđQ9ƤD'R1E2TcYQ%@ #QP3.B0Guzs=6!*}]"VVFblٓmkHDeae#C(yf #?~N~İ?=f5gaCM`:ƧO#wc9{p}0=Bس=1\>_]b;_<%\?fܐݖ₧<HDh~\Ga$NMO#m& z!Bm -PA_AUfQLnra-5t$f#cGBwb@H<8K,[lN֨H +~fe`mô 54+x )B:tu4@5F$gď,Zؔ,u !Jn hہB0 _+RCSYY[)-1[:)&32 zeh{yج\7aE)Kj XɌwb18 H }Y{ rq>{Q۔iԑ̬L* #F)BsPhH iE0)=Bq PpXsBtL$a a -<ۑo)#kx_8sܧ;qw<2~x?o gOy*s[i_iͷ/xOϿacwݞdΫoMpx}!~ >o]߾y}O>o+xձ;sV߱w'3>z8+O_ݒv:w=Yg|ֱc%p/+ǎ/ׯY9瞯~fW|qsy?w7[?_ yۯ-ʡ,o1}g%ըmQ@I~+p[e6CIv/PQb] xA bH!zJ'%.:jkR7q>RD#hQ&|oӇҟ77:Іvu|e/}:('Xf~u9Ȳc=a4gIa9X @MFAI1H' +TNkÉ&g44%GbK؝3:VdKzg0 .P#"j # Y_e?}NfGX#oaO=#w&qׄ'q/ ds#D"ޔD2nՙ0d"#]#3fj^(92/#Sz3fj׵n)2 ҰIV[̦H){[XX(h+!H8tZ0'0i >gDT+*=^n nRG plBF"8R8s B ,ӈLJ bD kG@`šA70Jp &~iϻȲ eiix,2:q MZ7HNHQgy5*1OB,Ɛ3KxBۆWI`b2SRG$S.)MRkE0Flyrc[d=BFkJ dUKt2Ssjm+$M7Siy ܼS`O-r2UR8RpsmM҃t#{:C0R!rJB-'B7QELRB*AX=(g=:Tm9Tz:lF!R8M(pJ^P蜣FP|G_*VJ͐on [[&p_Z Zo;aR#XPfRKODҀU BotoH'$k. syw8p q59 _6̲iY! Iq ɳ COXQJƅdn7Ts*dzϬRVq{=ܰc#37*DFNbf* ':)r*&\v5୐FWU, b yxUL*0掷,Lna(gvA.4ebS&/}Θꊒ<3M LyJ RHckv="GR ,-!Lu$5Ͱ d8tzk!.[4t' )V½?ӷY[6ՁR+^ pNɝ{쯞>9!=<'/_ůɧxe K|5˓=]?Q_"#7yƋ\ˉ~-WWD.\)<&7[~u}0|o|^)?WW,^xOw7?7gOx|Ư~klg}[䯞XpaN}}?#۰~!!?gW zw uuƝl'xͧчϱ 厎n١0=uT+56]dVc6ŰP>)Ӓ8nV8J.K%ӵ &%:BadoQbH`f !znJCW(1!^]x] ؆,ٵMz|fGv4൰1!+RU((-}j%[dXA $rj sW 7Tɡ>DY@tnD$I$쏄Z[ZT.ʢ\z)`LИv#f$]Vd3'(tTKʼnC [6t`VǣɤͿ=D<4/aXj4V,W̭a.^YͤNn#KYBf[3`*DXLG]%\xBסq u9xUWGҌKy(IYB$3%\', N=;*/N#NjGn{y4b]cuP$HjlAPcPk+( 3rIVy;ײ % fQU@9 6*FZ8VLJI)BbJALF5X\- 2 :ƒI]Bq5I *±f'8He_{XSjW' P .8½_f|=T 4%1`l+#2Վ2.j` <=JG]b HPϑmX.{t UHe̳D99%9!9 5 B"vHľz9u]h8b@3UBa_1Ie0VR Vk i^*)>qI(uA-0fUz[>,k%3DX:)9ה*R6 C1`G!Ff$׵ GOK R+yzݡP r !(BL?t*DfTF.P#9.km"/V14V1Kn g\syI'xjK|Lz)z'8'LÞ a74D '=;_W^-u(PO>'O 7_q?w?7^{)?:D:9#ʆ{f6'YeYaJ'Wa9l^g?r7O"<;f ~?3pQ$mcUJD`pPm`0pM=:LvPn͆)aۑ˒J 3pxGxQ)0 D9q^hN#"&z: bR+Dc*PfO&$ UkfGrLIJku" "=X` *1e~v U^oJǩ4uoel䍊Heacy9eִ GQM(铱7jxJJHB[P9HkuS$U8ȌhZagNpkUpXI:1Bp[T/JRA ߜU dW٘ dUrP}REd.\wN>ٱۅ#7ss&rm^/ E1S20%Nq$tTfu\CYDpCWvZpYn󚙐:bh%ԓBLwrTZ*‘\HǑܳXiϑ2+-+pUI_*{A&R.xqu=&{^5 IDAT٬֧-]uD),I3Rh92S-. "P1י ϋ _E"hp3* 1&2ڤ!j#g8:NX7+^"򁓀A}a55f oһ;~/@8q}2ғ{W;z6yx~6xo229?g^-9]Ə}_=r{ê c~g<vLyOثV#D]dk}Dpw?&]pUܯf(,˟cp}ő>|c"]f]D':=|?K CnG>Y&bKݻO?\Nx↺ooh+?b=W^k__`y<~%x |&gp^7xOO~L+x65}S,=En&T s{34+OB׬Jě)q9$iYqyvtZP̙AEB{ ]!A={2c19|.5SPL3suTM :rbmwSJP`TL)EL"JyʪEiT/Ȝ |/DIhYrܷUpzfq2䔐MS:+xL3xMU#Z41#50.WDʑj|_o2t+HEPo3p(NanBIkl&93Us,P t:8G`295#O֚eQ\PQ5*36f&t}aI'*Q<7PQsDOp%DIޓţ^X#ovς8ezNCEAjYiTuȃ &ZI^;\}V׊ǁCiDJ;nof"P) SehPRnf΄-Muq(ѵ Z*T%vsd `_֒)Nb9:wC=ˬxWN9 +MƎaithRI>K1 +<PfulxER|p*kd2{K9-@0)O4rV7}b*]MVڌ* oXϥ8ale4&XXȮPEz$  9{qzibX`s"O.\-|, kxWtN R^9}#XqzR1%u_2?boNIL_]ΥV߹0%Jƙc'BGIH̩ke*H)J8D'Rgfue[d+Ys#3 TA=6FF] d󻬿o{l"CŚ9&(I=.zϬsaskI8yֱPka[3B/%6g)Lbzt _iGG/ .;ԌFkHY,sx dr9>{a=tͲQó#r|뿋{otuͽ^ad슴so:O>u*Ww7=_qǟKa ]˜OK8Q6lH;̤?>:Ο>7_[a6 py0g$:RdF1eϺ:un6̨NĹ:a[#+4r32۹pOtBy,c<, O{ۧ#q8&m'`d- , ޺a] HD{vh1]Q5ɱ鍒9*](50 m\\2mxB3JSi=zju{A*R;w{B4WZ ;!SZ誣Z2k,VhqxRu@R<`tBb2t- lbQqdS3fJx/ꯑ*͸6`P0)VlFL Y+k/%[  - Hҵ p UF O9f99?I* Jf,JcC$Rsa mm^R\exyxWq!&S&gB<{:z:D3%{L*h0{ZT}4 3:i&qD)$m}QR=;/fk-h!TW t`Cy R<OUZ[3bv7KqTAؘpB >aEgŁ/aģDZNS&~eڔG-r">m!2gΙ%DsȡW= Sry8,2H-CݔA2ݱM~Cx_9#sr<+ lk®21>E`W3y +$ pd#q 99kG##'al.g ϯyǔ_&9a}EeNwYY`9GkQH&kAHM+W)c]'][Wf,`e=Zdb EB_qsTIGľ(^dyǔ%Lb7qXj :f 3 uM=F^G 9`D"H8]O`p'qrvݯ~+o4W%1UygJr,%d 51g2 YGqV8"r` aJ˝Q"=}I tW8#ǩ'"R*8kL&{_%B^w|wR Wݗ ̰0N`S 92UϞuZ`H>+6ryW/[|\+l)3˿?;ouJ\aq'}_9ξ%tK3/|,ȃ_{pN8~f<ɏ|%d _ذwG\/| *>}㓟nٿg_wnw/QKɿ3x| 7tewNiE㓅f"oyTnr2JSapz$?gxĉT;)Cnf Fތ< =G)) %aV6Wɽ$;dxzfkJERm 7tpTXm]Nd5\P"s#cPh ŠS:L;pY"DDV",# ;PM 8+XjƎC7 @֥jj&ٙ JF]liAĈJO'BE*kH.Ϣ8S|( H[U- OJ;F.BRjeЄޤ@:[8'bcTnH΂1 RpYh#aߦ`)D;;*H ~vYK +:)ҵBv}AY):1ڀ+o*/=;vZ>|}͒#hB Qp"o1 εSm XB|@HGv[|~? qY]/'Эt WH́s?!32O'Ͽ%~8<׾[L~IOxCǏ*_~[\oo8oa.OӞsξyF~o1v^i9^o |bx+ .nY?)q` ooq' px]ѯY}z7{,sS~f 0—^'DO,_*>A##w{~dIj5b6n㐶|tyY8-cuܜK$9jO n }[zZq&b=62R-T)\;ΥJAGJ|JUzj>86o% .QbΑ+͸ ک>3j6jL`B"=uj˕ϭ-z6VQrB T7c )š54$DZ3c4ôb9M{Zq V*&m[xVzz`ˍNߢZtJGHqTߦm,E`iMYSyS][{*mR8 ,jY*UEA?; ֵ d8FJ\SP{dvԬԡqAT;JId?e&JB2T#%)OՅ"JBPcpXn 1/ 3ū#{VfN tN[qȝcUq0BPRT< VRqr (mtP2L=I+4!3[4RYLa 62dF܊`iRZ#tu\(mmb=*eFa}-3QsXЇ/W0[.L7%2_eaWfհz1JI,K:?zɏmYvsν7"^efe[ղTŦ"D  G=!l axlx`l{KdE22+ۗnypB !xM9{}㸌˦}„̴$f̒7sej gWpHOpgE;pqxY\Οia&~)pd9q~8ggS^^rȉ2cg|0g J9twn-Pm,2ݻ ;K}po;ϸ3?Oy Bvώ>ޏhc|~cj,?o |ugpw.7'ȠB>en9n|E= Ej†vdRvtB+*۸Bs x֍zjx|СNU5nJj@taHОR3*@.qJ /؜z!:L: ZWē3hxNᔊTP/H&bWxmqiI{ T@[D!BLJB K+O(b3_u0]?GDh/-8 63&8jBea둺NFMD*z|ҟ}9aQa6+#; {J'iB5Ӻkqq-dJkc> \B'cXP :=$qd.pa@5='JuVYb]Uj&4f Og|/ A `ἧu5=_8RׯSB6Pa萣ier o@54|&b,J%÷ SˑZ&U# xVVf NV_ӄI*KIe*"?%VQueZ`n}9pM"X^סbk yPRY\nnC!pf(%+MiIH\+-8ƴ摣ŘpU6 .UP%˘e 0Xtnv\=iZyiԤ Sei*6qie_ M#&MvH,-UY \i8FWnǗg,i(B=\ԢGo*q1PhU&VQ(qB6VHn!%ZHm(HgH]7"Z@#kPf:MX(BkI X/Th'. &Fl w֨ s >ͨ@9,=JkJYf\1_H#ldS#;hqr:,n@`xI@g߽iRf|@C<^b&} fKOP9T֕|}SdtkE"p\c%#d""VΌIm𱱴U8K%}Ʀ:z??S!ܻrLG\,!zbFhp6~@n݈^fzf-lDxyKyܯ!'ξ2; OϿDy&O\}!o}6響O;%]^ѽpƼ`yē~xǟp)텵[:n~{#.^{}sKwЭp2ۗ^3<s|<{r [xA|;767Yy1>[/W#ǟO><E IDATjcr̴8?91hr-y6ߘsc`^JY@u^jfcB<-ne^|U|n=23 cnGTz$\ qYql` 6cmݥ9D4VZ,Rd= g[\V_8`#Պ_Fi3Zѵ9'` T﮳MM#V@[uCɂ[ :*{0O`%ekDDG*.< \%C)<]Y/t2}% sxOXQ'ğe F)__V p0ivBgM6ia6\g"DVDd q l~9C5D]3Zȸ E&M8cSN|fbC+Jr4UY+ȮG}As*hs&41#T+%GR]  b $9U%.WEPJZ8Z.f2IK/zɺG tR*Sm' I JkVT;"˵|m[2#/ZeFiAsS^&'4H Dɲ6ѩr/0<^ jAǻw_$!8z >6 U+0 rDC@(V!?.إ%c.YíIn-IҔAܑɒrZweCBّ7,k^&BV9j6+(\ж[ > q]UXiwdkk7H0]#9_˾ќ[ mIN-:O̒Mnv9E&:X*ebVT yFd+8f2Ltn`>3#ZHטWh#QK&O eL0(:c:1S\V>l϶lv.1{,u-sYC] .~ȳO^?K}+q׿Dz~\y}]꓂y O%WoY#]'~?nwQp$a[o%n'>}}[sE=c|t`c2?}ǜK}Б>Loes6w]e>=ǿglm/;އh3NÕYhޠ+^K"=繣yg^W7ks֎ޝpqx/x1*Kld-Zr=$LF]2iu:Ek"Z^ZkpftZA1Sj蔤ZRroTq+5#X4g9ZUW]VY -+ F V g >rU''OeˠT# *zRth!$[Mq`iiU֓rE!Rs3"cIVv"́;'+{l FãuYER0dsv  FiktDh,{ ^<%sJ%#! 1 ő$J/ܺ^U[d9_H'SSPҕgk~:UR,8' HX^< +?'FO: 5EeM$fܠ2;:f#ЌԌfQF3jR<*Fg 'ZON WEqHkaXLl u%UŠ jxkk\(所" =τV6 sz%AhQ9YЦtQRc=Z0VF[ iV#Ш6-ׇ `jtzd]He Vy7E6zdhbC#f6ZIKr&[3w5+YV=y~j3U]܉[nd˵fu)#ٯQ?9|,5FmE-њPHydۺoP*h&6Jɉ*Kj!H\AFN5%D2CL;Ogg JՆrrB-*) !v,;]6phiɅ<6gZY(KiO6̸. 4 M;d0}c0DJC-Fjݎ*ns=uqNY`*lI5JBbGˁ́ceBOљ`ci"aii* xW0K);?s {1>D^xWe"8~o ~>q7^f?Zu#~vKts6x#˿d {_s#g?/x w_S#ҷַH-ʿ_ گ7N _mq6Ϝ5Tf+Fz[ .LZeFҠаjE*DA:a{y^_{Ϟ>Ǐ.A,eED'F8L=G$0r·14鰉]kwN)2OsJ] ڈ5ZՎ؟PJ! h. R2xf" iYPEWMV̭ V gDY3A.;x(YWNٹ+~z`oMd\QYٳ gWk5 !yѤ:&hŹb1#_M \TR8er3Df4h*n9n3RGą9w(6S{X{bYslHe43V5%uZ jE LZ$V1AC Yظal3\)z;*x>XI\5kF"FIcqBL G"]W*Fr8Z&GaQMlSsiaNg fGa6n:#β Vsтp͑]OV S. KʬF3d0ۻFfw[\Z/ǞCl$S%mX),s˜fVVKb8fO¦  IǾ$\bV0ʁp,}4dcg=h]ˆ% BI[ǭ e7к4Tq9A2~(`#y$Z@Ӗв殽t#ՌTG] ^Ê2ED]}e7EdV|76cm;zzY,BRg@32ZRb^95f#:ǐI* "$R0LNk$Fpm3Gr(2̉<%U6#e:7YuBERb{p?׿̉|d܆'M>s7p~!b%S[GXx7U#p|}9_)1+ׄ!9zNܟ|۔[g)[{<}1wp{4y}=7~~ֿeq'}_i>)*nq^#;*0z G?e|)??▇/1[{> =SݷK7yd:}ap2E>1-A3T jsUH =JG|?ŝ7@zL <}r`4PX'0=U\t>s,u#lxN.΄3ZʄL_mjL=lk3< 1-]䠙(0+Nn.O!TWxe0WwF?u*C@bC Ք(edhhOH2XsH˘׊|,虣 A*UW~$Sv(!Kf:uFaStɁ5+s]?Cck+8`9g%sTm9̀b$BS~?~Lsa3O f3v)̻upF]ir2|Sfr#7Z\qD(>ye;XFA-EMRg#hE;bWFu:9 Dt(dVbhDhR8 h/צ>Z$Yͭ)VW^gPGlBpڸ7{ϕ*]ԜGqЅ¶m^HR=7wΌVf<3o,Vyp )HÊ]c1Bהz\fjsHAp*گ:Βq% UےHu5=df? 1&S21lIaK#<k*F=mNw=s i 7o#ǨXR I%Q(c4F01вm+#4q{ *}3 WnU3JLٳz}p 4flg!cʩu~ȩ9rQ SH4%FK -tlLe%J!`Wndx=Nג |錟.7?fZgRL3eL:v!݆8,-f!&|jW}DDfJ!K!Dh{ّ QJwf\iNI) Op*Jd}ѡj KX-&UvIӂ_zfXvv1Nа{6mQazѸJ{p3֢ .,:n|U[Ԇs f<#6/T-0BR#]RVP8'Y2crNW)Жt9c3 cT[c>]7Õ(Ct97'OFg^ w6^-TWN'HkvwWybxǗjX*sWb43c܌F$8?`݆ZƋ}y~sT;\|0sy׆;|yP> W خ*\|ܾ? [J܏pfaG^2=,?Mz#c0e]QMt^Sl8rT*)1zݒH,r,lZYqD ;0hq Sz[Fs)wo?O{/~\x| W3̔ d[̝'ZFSk Gsg(RaFh9nyyZ]hSxH'De$֨R*,邧BRuB8% )͍֭&GL8i j dhJ"CUSM•mT9 eX{!YߑRޓ"=;dLiOuVhP -j$M( D[Baݎ) )0X"Ĭq1Ûg_FNQc֙^bWJKЖ0Q,&J2g4A" ӂꬲTD-(:]]+:i@ F]OFNUCkfZ\-F@ು7N'A'yp #[Əu -:̌R %S|n<43j4S'ڍ';ƮѢA]aTO}q l'm'>,cRm]B@mI{$Ш,%H>T7eF.ps0(V?a.sB5tbib)hC]5Y5S8vޘ[e0%!Q;+쐸_):{HmF9IyB]Y(C !ХU=)~(l HD"%\GfW(7:`k 8mœըّˆ&暸elq@+Ƅ:J#]O’=ve zDwBKZ)gfmE} {ÍIu;iW{)|`##q c%Xb;ҡ|d-תH̕Y+~,t{ ’89zbLpSlJ ׉.OQmƇDv|XerPJFs9!Ȉ$A$ˎlR Le4G.Sky Q25vHYHBXi8qp,-?"rڱN]cwчltpB+ #?I!JWrFy<%Pl4J8¤Jje)" p; FlL ϐ7e&C ϴ%s+čg^ˀtL<-h5b1ʖYO p=V#aFg$K5DS[3X҂#.I Z&ˁg C1܍SBqCKω'W#կC T˜%6ұ+V5"Fj X^(D_5QK&W[8rk ,C.J2a WHG17\hxk?!x)!2әXEp-r-8i:X]Zw$#XcrB6lB҅58 X4il;I nLX>2X[6QJTqEkkE d{xN"s9G `2q st VaAE1KqJk̬ˮ)ҶD44x Z#jE m[Ȧ@ Va@Q(qQ?HdP4$: L=3eFOls4늪H+4 8.8YL61 (x?Ⓡzix٠uzJuBᬬ\cբ5GvkniF4fΨXWxt5guav&s[3U3ڙ|O f qc7 -~ýQր dI(!<cTRJU'*vA D _ IDAT$2I)fI $uRZju᜽3ϹP$n{y>gCBͰ̊HuT;/tt?!2EĈb F%6r7 A:WV!2nRE ^ "'s$(LjT` ߌOp.ׄۮLmօ=5B ]1ycXj9g 1[ܖ-Ql7b?b^g?myAV'u>b| ٮpeX.rf2\v{IWQCc8t-SQ[8eDYF"mFdȔH:̗trvD|%_0z*^7vaqI%_Δ1j %mwT*Y / @470il5\XX[tNEJ Bj<*[6MgV8Hc|*YWf1^ DܨV@3 +%b\X%srDېK0#գG;s3%ErFiíy:nBI n=B4]%De֔t4)^L-88RLTި8*LMhաI9#, ͸T0bTHH{ RWQ( u@z6QQ3 NI Οb6CƸue|" #́&sFDGqu}e5)'ޱ18{ ,W+]qg8M=gα) 0S%>NlrG@hІ(*!yJ6೰#Kh&iy\')xhKeE&@yps]D"YX=܃Zq,ѶC8'L(Qk?ó)w0 X)%͙/|Ҕcx~7@u4#1z?2šwXXj۞Rq$K$E6Z,pWu%1X~YVYsYJ )Z+d'hol6P#VQ0ik)k]8@ eF&-&\] U-l lB'H.4y1XR57B"PUh aa]Ԧ#feFvީح8~n,)=iE]4NߡHLIj׊O+u?`WW˺ (nv%c-4e]9(.]KmZ9mp' a[ 3dæ^!4Xj%@1GB{.|!^Gc9=(V땺,PjbCaيsj)Jb#+ׁϤ&S4fox eϽi+=ڲ%.tS5ʮIzb0bXBr-R >ԆK(sYȡOXk0uڄ3% Vj5,@nu#gʌ7e1GhJ U(XR`sԝiz/GG"6 0i@9 \nd|WX \/PKt};r' q;#gC`kflِf'l1'O)R=4ȴMDɮ26U"A}jt}UBr+Lt-zǯBN ZnA=an[ p<˺V3X93K9+(p,s|{;ƷWNX z8ǻ>~~w:0ɂg>!G׊Ǒ9~DN{ 6VCKtTnَR)m.m ((UwpEŪc)U PW^")fet+RgjX)A8SS:\{pFB]=+uubZ)\jP&d{/1s|Ցo-kjY2?nP$f\.Tx=iQv>qT+E5U`I{z.Sc-{0Rub Tp#dǠ$XM. h!L < \<=INPY&CYKQKƹ-X=n-21:7w! mɌAȄ%kHi9 V’F2\24\pOݨ!Q]WjY",&ߵ e]8AXqdЖjedZł[@i tPq/ E /iW:pzPácwÿhҋr{ <{nY6Nhy;FsN#7rMy[K8oTm"Q6p r\_qOXv +UV&]VRDw~5d(c$JWs/wHΙĦ =,:[}=|g.+6lY[y#?ΞgX1ĈZTxGGsa ?nٱ\wo3kpt#~c1T {3N[8G%yq e٦ M_r9)q_pӭm%J=XTz;ɡ_~AA./ ׮]噿xϾn,Cz')[pγU[SNFJ jݓm(Ŝ+n nJ%/E>KPV]jn!߆}".6T0"qG] U X5")mS]Wq($ZÈ҅ʔO.`3=)ye|bբfqғ$A :!5Xch[$(Sw+) 1394A&'P ,J`\:qI -mĈR :E"H#^6%nQ4XUVWcd*FK i=Uz6GA6VyD+-WP)}hRyR 1 iEMY|ZPq4@ڄʎu0\Tq 5gAY-zl_X$0HRwೣ3bCrq4UBXtG-VLXL)œ7k xbdp=#wu*W4 q>q@|eF)wց31VR xZ'Z)sese0d6%ޅ=wZZ#WǘU=jp"P?EgfTТ[Bc3~]H\}F]\4"#;=#ǥRӞ/}U cۿǫu^u]~O|W` ?5aG=Vax36w9<|⻸wķy?x9:wegUy҇DH'_DG<ϾGozD3<~>SAxco;#oЮ>#o{;=K|7x7ֿƭ^m#˵nz^bbN*bayBmԃJk_ Mث hNx^G[x7CrY~g?t-힓9ZLq-Ÿ\WE[7X(wƕBvA;r|-7H H?>ja)rIaTӾPF3xOq9fǔJe_ʈڎ PteͰ⵲ºiZv,(JFnBv[8t5;HmZ7-nrTGUR\(zg-9SFVл)z2K-p'< cozdC0K/x w5p Ji7 *p't@w;; y#\v<@yy߹p .ڀ:=+ӷN.K _m3j.L=wP37s #Wk;.ٗFml- jTMt(&4Zco0'fUV &2}aG6_L&P\{Jz|YqZ8]"JP֌93k@PGUZ G\} ®Uv64JXE)#]`41jpIk<4S6 VY\۳oM?\^;8yq~>GkB3lO=f`vs/|y|֊:ǣJ үp[W6)Ti|S^?tS|ͿWx[oQa+Yk䡯y˫tj֓BSwyjwzS۽K_x}y2W\:p1dm>8}ԛ0hbq`Fp=<HV1Th͓I82)6jP?1T7WJp6kV;=W 4CVM261$-T:7yAD#!f" Z q$Zm4gjBT.cz(P 3u 8p]d\ P/XXGs\&Ԇfu+1;S|-P*-$)xGVC\MavgC|1h넦HEmo* %aHm3>8_q" j^ ^AzVua^B̰34%Lm=Eب JiGjH4bPXu:EFc &S+-yUĠK#X+K,}LE5JR-r^2VJE5SJi-䖩jhHK,?ވΰp`gv`i,0لC؄wU-FEcV o08ϙ8:H}FT"&fDgdJx3@%:x`'yU尨Ի:\gJ*#p0@U`wW'4E82u̝A05z!P>̃T>: /,XT)|rY@r /Duh0yu -Gt-pB,!᫒c[<3S%센4,WPt֚ *4 P3u2Vi$a` 2. X=yV 7*'es߇HO^cz^7Rr=nˬpOoq~F6")9f1 n˻~oMi \]! +O>dJ_X |/_1jMx_][W?_<4ا] j0 cfMB5Aw-({y"]Vx8:~y?o=KuZ#5(_yÏ~_ٟelOIjaJu#5Pu,"'̻7mK>g_8+R6Z+bu`rj5DS @rªр[Gx'O7fuf*ZASBBPPE?E\cE zln$8s5V1kk :Ԍ*̑_omBx!F-`%1EBjSPhr6T{ Us96Sߤ%*Q)BĘafp/luP"':/]˼xP[ކ@>J/VGu[[Wgn35chh\$,,; w]3%:#{O(ahﴗXK#IcȍVl)25X( K  aEXJ: 1X]J%O0۷o]Ď0] hec3Me5jڽLܻ+5.KT+Һg奫rڻе1섪EIE G߻28再AV6"dq40Uξq-Ocd FT{IA+Xd@0HIpwmkx+<"p`U3 ڻ2_Cq|w' hf,ct*ݡ2 tt@svÂpvLۻ:w@egQФ|w, 'c5W{øM[`[&\_E_=I٭z5n ?1?*͆k&\VZOrQ@lY׈iw]HN(֭;)M[1VP2e\\U.oZ{v;>4)C+=4Z+Ȗ5̬dK/ 3⪔q AW![ds)!a4T'JYȶ"1+pupfO V{wMsRP$Dd-!6HX3r|lY :' 8Wđq=9*I%-JJ%jb`D{W=8.r88ȈlyK0 kNCS*>H~kW]0zLK Wg¸atp$WO|w=lP0܋>|ͭ~ 'o{#u> S|}SIl!~ 9Gx|? 8( DIYAq`u|Gkq瓯čӸJEaq'e7Ӛ*zvc=ԌCeao{_dY.x8{7ُ|ǖw?>C];'ǵo}]#׫&0oxzөF}d W|YJkؽ] pyWrx.镻+wfw`rX^5 @;]:qka] F8WXl% #y NJ[¾`?,vW^f,kٕvqѡK bc(. \؄ƞ@rjغHBqƤ2*ڄ"3o'|5ku³ eY!x %H_"[JF:ˁuVbq`GoDUbO>>dWv=K9e|1Nsyg:nQ୏?~$qk:Uvg =[Hz|;ܞBTf<4~Edu!j |cڱ? \VN؞>'\kݩ9 _g|[ kajW@/6n7'\;q?;L>s_ tuDe{.+i[~?ʷ 46|Yt ׁ/%N_?{X[j:ois/lTKX<# P )SϨJxÐ=5(wEn[|ą5~XV&в Cc c2]Oa~QMTUO|-Ylb2E1a %5e2,+⬻B7#̢7%{cCm1k6f&#Ovh.TΝ2ʂ[v7F 86giV|͝'רwGHqBgQCqF%!V nwoL7uOoW_0R /o[K_ ټeQ,[e6S4`Vqb [նloI x\X+a8Te88&!#R u*Ŋ6Z=MNeSJPqFJ0?M( bIyYH+nq51n47J5jOb mČ'CKa_j{N=L>Ju&6&8h k^<)6?I^;]AXl ̷ %Zpjwra0ʆr-kmZp:hSDͰ~8cMyocy僜~v,w Jz|O?|;.<ݧ. :wsyqĵt$^8>ñk6GGc // h}Añ> ^D)k\4»|*770Vݣ{|ݿYhIaX"ԸT-G!x.<~K<.6l6pZU6BsxQ7@6 cWq`db$"WYj-fvM6ٳYR#Q8j#OYJ'Ԉ@͕'dt h -Xh"5#>O[_6 .`5bCC5yYiS@$mtX8༒L 9PcFMus8_;9*DŽ3OhtHΠ=TIAmf>p pbuBnv ̎_珀s7d)pM\ˈg=d|x!-:x7;Fk$Ǚ ZgcTġ˄}m"GޅwBׯ6ӓ?pĞ'Ty9/<;ɼEӉ1y^aOxt#g=g8}?!;>dQ|g';:7Dܒyp{`^)1 ˕a>O6qs83vY~m.eB{10O8}wn؍/=v=xAl~Ӭ.O #OI&ԅ-l|_cyHǭȃ0sVg'[שLy~zu8J"h2>' i׸E^qR(B(][U*W=X7HNdnE؇*^ȕUc҈Oq2fwFۣR&$?9S&JH+ӎRk5P1(vؓYH6Fū'#ᬮh@ ?:y,TjHLsDcvX#Mx6\p\Zתps5szDԄ:8ȄCGУ47ԁ@s( 3.oZq*T5Rql$cjܔF3jDУCCK F0)=b Oɛ>|_IKoή6.wggZFe?{AlL{XX.jp<{?7ȇ5cON╿ӼL/۱ ZKci ãtrK?vG?~v;pߟ^@BS^M^.Pf8_.|G*@Hkr/y%p]~|{SkG ۯ;t! C鑓_.rĮL`rUxX[x uMk+R֟攪Aa lVlZe.XFl o1uiXiTF-#U3b==Ub8':3# cD"lWh6΁"iFu]L 뵞nivDzYīt/T3H0g/C6ínXfmF\ְf~{php'>~5P޾2.]1\]rӮ9\ayW 2tŖr5Q޹Ow;S!ˊorspDw-;(>b>}@X{B6?Ƽ{JI[3]8)3 礦$jKGQcY+BY+(,Y׎-]ŚP #98VPJ%(,%Rrj"F:"nA\ǜUp!#.3Z]^n%jZ!>1~p5^܈;Gz+LKcX >'tu87ǟ n~<;'E.~)tG3`8+? __;+Cfx@oX*:偰8 " |?yD7 S#M~/}ex2#pDN?džbOexMJ1"1+A%sY!P'-7ٸhf4@-Y68G 5.掇3xrhjVP_@Fe(h(;-ڙ @G(҃fP@KmunpubAB%[APJhI#Xn26TňcVYQ|aQ5(k<2XUHN&+7\N[^Gӂ4a ѤȚwh. aYPdF)E{GVT(^X[eCb`h"h*bX4tK2bEq^xN|w3P %b8 kRAe' -G c-q)3V'yc i.z񜊒5b뮁 "0TG m8Lc$iƬ01[PY* ֐ZYL-v-kB;fD'\V+cQ]c$fԪ+:c̉aܩ׸8kaO 8 gUBR\4z7Of70Cwūs.>)~w_ ˥@4S70mV|ЖYOXX%@ցr3a{:kW?|_y۴Hq y|s'0|ǹ±#9c!zs$k˿6'x™ QlO9(W7Sk }AKλˇ*UvsQ=L2ʃh^)v,$T'c~K_chǖFG}!2.쭇s}1kfƁ6`GζM^ 8ZjĶPG%Mb;w3Ëaqm_kgwyTÉX0'JdDՎKgÂ4Q(5c֙mFl@]D1iհ!!sgdsh=׵B!#QZNd2 =y*{lQrW3i jX* ޱ$#ڥQ+CeAQTYA<~LRF.kd9P6T=R*D`\b~?DVP+)ץZZT-zo~/J?Q":ӲLvwhC\9Ǻ`B ͉$QGLA8y -]P1jhe];&P(kdG' 5+:WgDC落Z9Qcv- c3fh!` G=_z`H YsS(#"lS7{zŨ\[nmw,p.GW3o7^gə}1or'D֌k, Z֣K ' RJGϨP(H  w~t=*Z]IblD\,rMN̂57:8("~8AȔzW5^n\usq[3O~i_<@9;O|O(Yм_˂?->ek ܐO[ - ?AYϾsxrᰰa#^fsOf%{\ck؞s=UɜIuΝ ̇{p%Ǘ=_1]]* x7 q5{%]aLgo'傹Dyv1D<; e*7ljS"10&Z[+d2kP42xA.;" 5tBԙ6jX9k̰RيgR]Sc,pMI|@w(LC km꘳)Thۈϙ 2(yFݚU;뇂a3nc\'z*Vޭw$!h|!ׁ脩#ft6LPU^PT9GeFsf\+;nE[p9}Pߠ>+r$ܺٝ; 1.)-n|BrB7aW72HN} o 91q>pY2.rXm4>,NOtAN;ηk% (??G_˟ aXqsx_T}i:nWϑKoө5 ʽEg-#ς_[sȾpa r}|g+nuXMZώk8x+hsr8'5|':y9>Q`23.0Ĭ` KĘǬGigW3tuC,K`BC4GPe(C/u7Jb]gXQ+,N)@֏nYI N1M)V:&̛FimS3 `1;P#K&V:XЮE(Ceș*ݬ5! U3C[Sb#*zxV0^O"]s W1ahTPY`FFpk9Ô[3_knAw1MJˍ|?^@^A_ηG$ !E~ yziO<0/1D>ֹ7OyY{*3η>k|7J_z_^_(s*p-k/yzV"LS%%!H,cb ďoSDqx/4l4qx֡S]!J (E*b1/^6"m2f~BUrҩsllGZby1:\a$,f JH!յdC$t7֍^ v05 []`FcRjN8 8;-xQҔYh޷SgVui1Uxht\Ujwtu@q3 }û@u*0B X7\Bk Q-VI᫃Q銉0Ʒ+1S9ozΤYJ[oh[F`ĺi-XTVA ds fmq04CeMs+hSȣO:&4B,BlFP]8L`݋u6p I>F=6G("WUѮtXi4yfAMXVdWWAQޣ n T:=?>~8f`ް8i'w]iC=hk; 2!%Ia SՏ) #SLZul? |'U7֐N['JǪRaZ':%%II nbl\b ;N_p֧I̋ǼV&P>qihx'\FgΉʙS1v9yWf7l 3F93-]r ;c} f=O~g|&H$pom' ֶ[AR'+?qO^rRb$D8t]v@g:;ϞOPVISUR-Z?tEG6Rׁ|rJm&]G#oE[p QFqJrD8aۄ;11h7ZO oTu82y:/̾Q"-@τntwyY[ztR|aJNx&LlވZ"q.*63QRMQ:O;hRBi@ܽ-\eޕ;5 Bag#68ZF7z4b*+Bw:Qq.dH{?ݶ^WB L;w6ǙxC= -쯔WdnfDl}oߡ֘Jc7U%#)0<NGaT,(>)yŻ &]Ygϛe;;oϼO[o!֧bAk IDATH:oMfƨxy>G>}hw ٟ?ס^ rvTߙJ5pW2ݰxt5{򿣵bfAW& OD17xͯs__ϼɻw|s~wp[!Qk XWV3rQ*`Z\ЗKtF׎Sz@i![6cw;<ϾuzpCcɈHCf)N^8k'CEMu5R'!/tK8hiSs̪bT `(h:u _Q'#LTe^f4z(,gER!B 2Jk}f3EzT#иG#pt| [BѤ=?BhMW: -beHwđHLd5C{yن?'?kۼgx9xV=V=Em6&~n)T(#+S 4'8߱@ in!*x?a6;Ť#.@a-A#Ls{O{ uLKJ q[_ \ayhNhٱor_3}ڱ<29-rYGz%||qW++ O[*:VۋI} ^f0p)"YT3zL HU{Є"A#vѭLs2TDe7rw2auHEuei{66aa=ЧKOX=`XaQy^:K{ʲ #^_4/|{D]_[зiw3廷N:%73+p{s&cIŇ;WZSwSoLG_D1y"4nӞVx`z?d[;ݑs,=[JיFG,' >W S~y{~΃ÝgJ)^SzVN[GDO@p^ s$7&(pcN3Y\[ i|܏sFLBfj\?+#3Mt;\"tl6(*NBP4`e{|9BW=t5DA\bfzʅOU=Vj8y?gp*;7lyP&K.u,9b{ǖ +z=M+B߳cQc6b#2 V@WdtC87#jC˰b9WOJydG_D2⒋7>ˋGWѢQB/k`Ϙ/_L&&W,Tq|U3^i/:v|̎Y9.6Tzm\cl"9wN])K6g,?S +.#9OH^wf?ik<{4~K>|X8?0/~6޿'/ \9qEy\V~6fF b#Ħ;fW̼^~t>˿ /~\Vތ͍aD[ΠLIƭ3߰XK~!G!sNxyɺym't֩SAC1 MxaNx "h8g:njcnfлμ.J};O9EhZp!*Qo촐1pcj`(2fN0?_aoUl i!# @D@0V(RF*dW%-`Z.5"acEѵ$Ti-c!xRDzC- x7j4̃Юp{XOm6#VF!ZѣK/+IV3⌬nkϙhi}FÁY*]-ZG;F/hgw י=-vRꜤS#BU-lwQo55r$c^/Rҥ {+.Z j,Z`kshLDJ@ɽuD@≨,(5 n&ə5*S76,T+H8Zc aHh6]!H/7)J$~'I}lHPmF= mɅӂ§/Lg^Jc~=ı́o8VavޅXs9ϊNa*묿'K _~7̏Njbo \Gہ/Cgx:["F/HQs_|_wuyvSwB T+~2j LԮ."Gl䏬HUt 4(ܘ6nF X3%lx]BW~hT !dí;$4$LgzHO =+.HFt{BɴQ@~.8WH2Qءi@Q48Ib>{Y"#M{ƮAѕg T4}=QSW׆3S +-tL3 n?"O>N(u/p#ТϠغ2 m"JB]v+RaӉ/("_P*,  ]:r ЩHktWѭS rܕ BBǙ)(#tfv6|8ل6V%eZTzT2( $V6B`ʹYW#mG{]$ @n RҶ{61Vt&#iN< ] ^E|mX۽'P_@;ϙRB26e*eSat LQqm2:4KYT2bwU:*KX5{$B`By,F%/MXB g{" M鎡?gJ9_}rcqT;N -sY5GʱcnS%xwF2>_ӃrMZ K|dy/YV@f&!Ց2qe QU1+LDOWçKE|ls'ͷݘlsfS nO0efbcpؘRkF=[5صYQ] 5+[Xs^Jd & :H vvshp%P<$pw|G _[/</(Ew;;AjvW@IkyH֭`^sJf*FFv gcJBXg8&OU/꓌S\^ogY\#LF`_(^h NtM: CNwL::pKCU:f#zmֱSaLж \6{BP=Rl&Yf '@ +aXJD#U2Z#]+xNXhԶJ(^ఴ tԡ:NiG̍z;M -f3+hnӻoBef(A*4{.D34f([ֆ9Jx2/С:K>Q riaf63DvRФ]Ŋ#YFڂKXN#iC)IbSňUzl ;T=6*Z/J\BMT^*"<'Wqq 衱*~15n`ˊ*JkaAC"2I=DJ?Q׉h,3!:+riV*}&hkGEkb#E+,ny[!Wd4 Z 6v ^3bmg<9[x+i ۬¢g8lɚhڨ>f`xiCpqL:aoS-xA6Bgi+Rh˄2C赲/hеӫfQ[ \T|miN Á..tMPGv^g6io! >ً,!7Eu8$ktd=_azOa4s\2}k8&&ujtT v`iM˚Y3WGNuqY"EKw]ЉK_i3 o_VNyg nKsgyu!tvoq>z^>7ş%º{tfzΣt3xIChБ1Wi$;.8peZY"6,*1+w"/Oְ(yY:WS'XݠBPw;qûB{w(!3[92u\&p<[nJCZ%͵dVN}Z+V;o賰c8$%:5a#lQ4Hb\lJQI4/:yy6 7QJPLl[q#zJZ=ĔpQȭ" p/3ܭoX_9:9&BgCrsḴۏ><ԏN4b_;6. m$ Ѝkqxuho|7Ex^ۯX_ߨƩTu^ `W{'P?~b~jS53mtBN*yv4Nxy_y.?y_?P?~wnCP}8@+V ^ \k850x.k"k4ã(&La#_Dtͨ 95נX `mJgCdԄXMmD=TĦ4tqОhX8 IXs(RȽEбFZpqyN5f$Ύ8JI q o q<&I6>ѷ(Vizb-axj:pLʙݴ0 kϹGvrN'bW|礧B%/N/i3U%KlEFIekv[kާF"]vf*rW) * @̋,!(!dB.۲)c[t:^6^D朽-yeY9't[~?TXk$*d@ IDATlʯ.twvԑ]"P`֑ Hrl}r5at|[6෍24Zعde4{**)&7C{{<#l#*ZdȊ]Gopmė_`}.sV W7ؚr+D4syt<>@8kІF1%l^e{V}nOMTl~%#NѼᥟ3m)<(@pX:Q=Vv6.z\,F\%YzV)lat4*y*\X`1J*-%Oη%@#mTq(-7Kwhoĸ2eо;f+#%%f33iey+4#HfBq[B!9c-&YG [;h+b lXiidth&[3nnpc5A+!CLHaApKX-ͱAɨEe/3T¡z| 4vMYW$VwKHH okl4:]N^1?*~đ=e  ~폿nX93+ WΐGtбB}pQ1MK.c՗?77#< uݾ5"VO 6;[ [c=l0LHJYx̼{sT V`?y@ G.=:~y ׺Aa&-uӨ~h8y6 ?.I~Z8k\f]O #C\a)WpS*8_:q _ [胙g^6m[,)GZX.+v0<͕ awŦ\0xa@+9uS(5reaXFkkiX֖sdh FkԨ4nE+V^cȮ2"Ȋ38+7t%q_27(kؐuicBYF4]<:*+d|T7RLuljB IYvU{dV1 9mXL,lgGZ*(ɔ:]cVDŽss\AidsIUPLt[rPCV)n>L~!A+?Yٵb @%4O 2@-( Hq̭V\U@<x' TUa;ѥ9#Et8#1bY{Ĵ)ЋWp\5qⱨlԡDDIc>K͐{n;Ib %5r(T;[,ᚒZc!Y{OLN ˱Ҍr9#8%I+K6!a~߈%st=΄@ Oԯck^h?2ԕ0;EyrJJJ\mb?ً?֫{mwVY ^)++@W5* > [kZذBeApWrߢ!xk(EbؠF8Co`70V!,?v$ piEK%1hʲ:-䶲 0DVrpHiXq^h$n1W92o =FyLS1S֚12XƲÜC(QAUyrj=@YK[TqehzCf"4雹ii iAC'[b;* 1>  =MZ#(L&@->x [g^§xF >c9P7OEm[u^g3.5nzJ>y!N!p{_cDNh\T %6cp &0'h#|w_{%{6nF9>i|GN>{ ÆXLx텨˩- .cPM8:=7@m i Cqt >Dk-LV8N#8y>o|O;Kro-Ƶg3=_Y#42:ayGMVNB˅qk$N]MQZHF)%)4uPZfPQQ5|T"A)ڀul782M8 ^VA[+#Nb$l֕l͉-W""C ʸ(*{.|-ýZRu$q8Vy˵x@_86PXA溮tMuxֈJnA N͂ڑAG6֪UN|7TIlȷJy#A64 o}Ev; 8 rr70sfYC23: lDqd"2Wm\kVF3G)+fB_#M-pf4qf} 6k_5~'~ B Q:1L~QV|9 F )+vq=%`ޓ x07LFn֌_Z:V}+KVʹZ z7Ԯ];§Vg" RPy;*u3vuby:-!p:wسF ƈp8u7Q_|sq ?m_ߑ?2.mT9ȝWw}팗ŋ9{e˳cs~pc[4 a7X}`MˊC($6d\:RTHsQWZs xVJ$\ВNkp\V/Cn!/Iwθk M;<>ry|4ڂ[|<ٿÝ*7abN:+7OњX̸,x. V$v{0J5C$dlLJ N݇'ohh}f$0ېkAgA-P3oeuwFoA"됐'lܻh%c%<(| a)*D[q:`I]EJpu4.RcGXœ*gx ,) 1;W*0JF"T9YglX yMQZѴh~2N4eLIŪ22BuxWs#fpv._&TeZh6 ef]zP3sK0D'z}-GnY1XdSx+<|pw~7O9ljqT% q}*WU9R@+^_g#'ˇOnxaϿƃ{}lqw_6#pT'BaЂT~4ƣ +m,3M1fFY/9Cb")MWAҸ? |_q"+6;-+_/`;ywImF"˄.Gv`MI VțlXq4llTHs4(2FOٖ1mɍT!hCGj^?LJDBŐ01}Vne #zh4p2Bk g c @,67@c#%ˤlDQV$ckcw u5LN ®t ԺviM;kC]ҡc:&3 U!QA5Zŝ=ez V#B x߹4'cPT?-;jІBkF$@XsX5hdBJ[PR_ܾW~H!;]HV|q,۽1v/ܡZ!/?ƟځT!US3jhD%;4@nZ.3<:{ i8m[8a,#g*XˈGΉfM63?ZfX@`Zp*#oª-+f4(*DUX'p}wް rϜxa8Ϝ@` yyc'w\>~̝'W<}3q|*7&ط$|CN݂Ǩ4"¡T3^6Re# JHSa?㥻_[&g{Nx}8~-'W=m.#\Ɲg>N|᳨sǰ )L3zʚ#!){$Gđ#KNJB [!C %v(0CY )D.D ZP=RCN6 ]"7!Րct Է| ]3n:rhqq1=6, nR M?ƈR,gl \fe;$|d&E]*qYT6>᥯\ UWB#^'aђ5FV?BK(ֈ +:\Փk  a&'قsjD88R%slP6e4#5gB)T0ayvxkO&GcYm!9۽>k+1b{b$j7O (=cp '2'x҂eL+l5!! Ƌr* 7|}~cß6p{O2-dn9޹ͧ ">";%\ٸrv*F+ װ?c-9zNO9_H\2wXeZD67߾O;\?WnV΄/,5\\'#9bxV@qcZ)Xq03cBT]Qu_ŷI.=Ry(~Ϻ]ᨄ+ 愗>M ,D .v죗;xuTWGkK#ZwxI WH\#8`۩3Yse%sM7B9ijF5pw8V ,, a8Dg8I23 Y3R=#͍HkӖ1@.E%a9J 9 K]Qi8+xXUp Wo`m$L]64Pyp8Wh:Caf-e®Og o|uhhnH7 nD g#8ُ ~N+`Taی78HzQS4$8ZJ#H'#2o;^+jA M"yθPikD8`~L*_WB =dj=a:vNCe$ʲV)g2֫+޷~o}l<*۳'F,p3ĠyeGsLP|y2Z6w)[6a'Tl 2[(#gpw=،?LravzqF 3Ȧu%q@7ؙ'x@Ja",:ڦv'7xW6ӏ8Nx,#&o_yTޥIdܟO~z˟<YGH4y\F382הW[yJn y3# Ra:>:$DW<ǜ́V2}!aKI75M}L n{l:_/2yAE(W!gIub#"5+ź.ulkûJ ?E~ ܾW~;wo݃yQO"7 _Ug8sGNcsZ9(G\?P5@ IDATJ 7gbw[^S!y_䇿U֫erKduֿf_o z:V,FW87t-/šA=KnLEy/Gi1t+oN;DJmD7!.sw`4IPG̎ -V,R*,cg60:5z>HvhG(=6L/ԕBūL['L CL bK#GRC .V kDmeP"zcLMP)إ8nzDQ!5V1Sd <.X( MD> JhMpPCBNŰz4!8(Ez R*6 j/1:l?P;hJUJ9ej >u 8-1L}5* k^g&j=qp BﰎD Nz M5%SRϸ.)1'x6 PUN6f)bEw1S UGXt-9wCPY,ò|ê?qȶzj^|<|qÃϾO_]p]6vaG-2U[)y(X8oċs$4 X:B2\1'!?FGA=)Sf*G|kPRڬ/k4/g|YK21"\Y;*o_ǒwX<\FG)ޑJB R3WQǰ8skcޣOi5R9Fn~HPPoHɈhQMhuHMuCJӕyc8*Fr-ʑ)䉘!5q*& opvkS sM4:MPSsHW׎=r-Z.^ȭS1!4_qCDɂ6Vln–=>S%"VIgQ 4T;vM(Dfԍ` Ih0ëi#@3et{|l g<]_u&TB C1?3 yY3/3̗7B Bx/s>܎ m+7PT{C+D@8!mckcvG # WEmp<|}p|7Ww]~ӧ7ĿӟC>nmukl.q[X~x(Kց<=>z=po,o ȥ !(^ِ{oS^ڹZOTJWK;[Uһ턕4ohjL(yjO#ӞX=:$fiM :&0w7%1c6p @j#㈱QBBphL)bWem]E(KCRH7$xXd1 A *L^-Hi7,6h R2†V!;YGI.6tn#,ݦքHfFi& )/eVɲ%J2.+Z 8qZ u!Ց6v "i2*\B TW),Jg/ND"c`H%1w}4*"[gdJW J3=P{X-bD]O[!;?c9xUI!R֕R( rʹ0a# '"1DT"FdZ TW( +F[ jWiZo>z|d^Mf[#b5AxKW"hA|p6 xZ>;,}y7'r 3(L!_ݐ%|x?pf8&ntsFj#&V:(;XshHlccFX&x]9K1fS,K]mt:PO29FCf6q?y)8[%Υ뇯CdsnV.1}oyT}fbYAeK2؈3$ 2ԓ A 02 @I%@ $AK"ŗ$I6o}U{2Nwd9έ:{[o&L_㥋KU`6ČyA5=Sc}k5byNPڄNrh v>;!vPp*ϳp;fH,ڹxG gy96zS :șSʄg_^d8&>, x7>wog?y6=OW?;|w9/؝;x҃];'ya(G7sB&p䂂[b0MJ_̄FaDF|OM}G+#,ҝ4(3#mmtK"OBAjVsuew -4bO iH>G i"8RZi(I%\5֐ɹ)X׍BBDun{bkNJ#OD6@^)ӎ)f\HYfa/RaLk5 1E#=tJk8]`zԃ=p&0ęr׉"7n$!; ʛUӉ~<U<7aaJt-6ܑ{a2UbCb3{´YA( x7Ҕ}oR[9=&x`jaĦ;v1rx8=3CQD{#?K{wc^'UwYmb](;_{s/(] TtVM on e##COqzkIR1U,(cz#{z%%;})Dީ0@Wd&fgR&szsF8v-#%`HoD]4"M1)U ޖ}Uœ3| ˡ#/87TGM8.=`1͑905u4bP_OvAQ҃A0<ԍ#&]xw'HܰLF̂tV b=D UuHrbNİ hDhi#zI9$&^A4E"Ռ n"%xbޱ;^2_7sxs4:L=mFc"ZhGzϑl,#6FձX-E.gC|\V"}@q~Loш%sbcve'Ti(14ܔ*U ]Gw0¬J^;[\P= Y&F(Jr zN^Q61)#p] ࡒeBRȧ[RX,|7޼wEN$M-PD!FEgg1p IQul%lGnF˳ 'z57|I5R7rpّIaR$A[t#8tw*L!2g۔b ˆZͤN/8Ѯ7E`N M g4a[~YK<½ÞҎl<x1H2 ;ă3ݗ^&_WH|;|o:wUv{a}hT"#Ǹ;|5yڳe ,x\@( ROmJu%7#$c.ݗw> /tG|fFxA%!jUҡi@}raD:M;#^!yk#N  m`Ӽ!rd;vi=C':VɭU:#ȡΔԸBD..f2E 鍜c μȮ,Q 3SSjxRS0 skB U%t.0M"FYZI$JsnbN[Hm1ҟGv A@c6føidPLfԘdp4>gzhdW\ Ք{ݾB}-%)eO{ύ(*VqG666ASa ^9sA}nxX|N~UTxxo=fw._~ViuFQ! 7VVv-vsC R(0`)֛| I=D)0A<~܌H؅5j$ʸQچD#M)6C؄bLjł3m"N[2 2 5\;55 s+^MN)PLJT3.r;Hiՙf+SX+QvXbElp70 N͔"5Z %n+ Gֈxɷ}"FJJ+Q:Jh9k'=Y n6Z߀DWt'h4vTXgpGx=WYn^po\E>[,w?߰.ocս_$pi,ˆ< 6i+7s +po Ȓ q7q=e╙/Lc].SczqQ w4ܜ^s^y|;7'Sܻ{}~3"pG[|[|;>oxN|%ێ:5JSP Z Oy%.,٨觍C7(xءqzDw֔6,FP5ܑSdF1b78|70=x QYJl:>5ʛL>e#N8ۘHq=)!WX;#)unʁzәwT"Ʉujug)C&sCl]ɢ#s)WlML]8je \H%MHFY똈6%%7tW * @=5HtCB&OۆaKɌ2ɅX|§̼ %,(ڭb8RL¦F+/Q..1߽ݻGvǻ쏁,Js.,}8ߐDW1DcS99-"!ڐ&V2҄HIB-dHzF$Ƃq:KY@N928 y11J ?лDՕFhHa8 =9F+|x :מхmdyt;+]`T3*P, qʒh47 eS?;s04lfL[/LD9#: `W6k7$ox eze@~>z9RMI(A zy:hlӄ%YfivCʜc SQspB1 B(Um,ۂZ ~#4D۠0aCOuo$+^y5 IDAT;i2Ĉ`88P"*<^c5.Y8]GBὩpƖ~˓[R+J7FiBOP'.j0%`Gľ 4 `-fMT *v=a*Z:Lw$C+Ϥ[d F\̸vT*GDt8W~$ Fn^2{/1E48EZGORnXXl$ň$OH(4iuz6t*:k*"4Έsxg0;T;.Û$JQc"UhPos^G+ލt}TR J~m8~OmŠ#&)]nq &7R}_5/=۟"\H"_%T0sϒ;㹣]qJw^x]B2 u|Gᅎ4hF\/j\g-jG⏿RfK»Oo6ɏ1 (Oޫ\}G?ihrR)m#[W6cqH(p>e'#׶+TY9rQh dBOƾN.b< )&#n FZwE$4"Mr:^6|52m-l K:@HڈL'4v&bG"^ ]\ZX n$,HPWZC vLutETEbj" C$ rLw֚Ɉ"#>Y=ۖQeG0(()"0en zy6MX&CPD̷wQ1q"ʼn3viXZE!q!TZ39zE =Kd5*:Vø|STِkF tKÒ1s@ ] B N3%i'Fg0 B3wkuPmXOHiS>ܻTQMhJQ9:͇1 ]N)GhqCAd8%w:ʤP dz0Ql2:CAc}{0s Gz qt)zoeD60eBD<ǚLǬٺ W'"ntDc#RWdhH 3QCdro^yL:!%\]ѯ^e7ͻqnd ϞIܬ 9qnǻp˴mԐ}bTjN >X?Vbя%~/NY}?ነ!S-&,.F}q Qb{<3 g4o?}\?.c|7xL&"`O}O,?*3 ܴޞ5AH5f:t}#EG<$tif0tT!#hB!^;l+F>uB=Rb o!~IxDy4Ե"g bgBDQґ e1doٚ{ޑPQXc; ZX%\EG$IKt";Z ) +@*B&#mc=FU_|@7!JFHHmpnj FPAISK7Dg,UrFfeƫLu&N{T++5{_$خ7Ҿ 9O$}e4(Jbys|2,W' |OǍw޻vG|w5_ssZxetHh:w?sGr:?_@) E쇅rza^(^_,"L_8?|ůϫYi4=ǃ=_y;a3K s-ld}ڹU&N[# 7Cj՝ sMW^ 95s%.624GoJm bdb*=ieLRh>`#̢wgJJ)czDn&|j~NHqh1BketQS=2!B .7tKU08!H⼱yS uߑ3(YQDF ug gArm Al 4ÓO>O ԎH4gIf`NBqА(Ԗqy>O/ht47&Lhe8E qqMv^f^^yI@ǘ-ܬ }eFT;/(XhܑFѽ dPw3fׄ]zb(IA L[TC +#P-hw NȆ{'NhFS̄V Ivld :L)"f#J/}|+;*}t%Dإp7'!qxvz~v:OidX>9po6"27`BƤBvt>l *D` [cQBWWVUDdW4IݑVA&b%y nL܈3鞒״F6?=_ RA|I$_l)b n*sI|#>u@7#ÊB+U>oO>Q]?GOlԒ5b ꮏdD߰2~gFzZ16c`q-&J[m\+ZF 2ڀAdH8quC<)O)=se Z@&!zZG3h[ /S yb)af"!a㏠ )ˀJCv`7#)Mhq-Rbd"k3 :5ZC C)u&8wT"=,_~Mn> Lht(~-PZt"LK$< PQ6&"U: rt_}HgH-;.? >B k7m m|hb:3%a3^ ZKnV(uj&5NְcxoGQAJj_nNsaywn[!ѧqy,玪PsE' ~p\G9rx ?_15c@ȑ^ iY8}=zӶ^h ~é9%t|XVbWC1g?Jx D`t1fn6k[e吟c;$>bK;*dEnW%`t?@P3>֋iX0kJC`֙VjisAe0w(39u.&xJ&aH92y@dDh8/ٜ(uN0C dy6i9iBZ@ CSS|૴!9;kXڂk`N* 2#R*@ ))"39+-%B34wtslJAi@"HsluRfD";ɏ$3:}SoriYYlDQeaL?6%aC,gz湏U#X2P/xX1bhpQbXiSsGHܘlfC PfFاH00F]a?LAdܕHiI1 0hKDٰGT"1lt"^Oxx'\1ܰyt*Aeh2S9d1ƌj'E \H Ԅ;R D'$NFljHm0m6<r\GƎQm&:lN;wf"FH}b`)A3|e?c /1? '^g(FgtYeܞnv5'=^9-<{ G VF98z۞ц>1h#W itvŅtkKZ+>eLGrU>uPy$ޗ,:c'-gɻIםwyő<jd W:+֝_Cn6k Ϟ>& ,ycրN';3T;!t mժ}8[0VT"iF.=#U8i zI#j4쀤Jیu&0Ci{ꃮ"<){{:0YS$/*>#n64NUH} RXH=.H,B^@l6Ԇ(Cu"`Z DIqy͙| 4!M|ƍvqiDHk$ Hj $wRO IeI{!#I. @gnJOn  ]w?c[aLЯE 7mNs2x>iGzMH{Bܴ|~t~)qyh$-FkC"wW< P=7炔y \w8+>E?oT9߀7/zZغ@X-#NYO>V'c ~ DpK6HBzmqǟ$ŎXφE'BuȺ܊ !x9NDh=H5eEK<5.;ĉ7nxFu:J@Mlp2,qb#NL:nw.g,;J۔t,&]2Q"DMF [C{:bMr$ ~iW)F%N.L[̬)b a9@pic#IƤ(lBc;tXWzDYտ/0TE)2cxMAieZTY9}DjB*?(}yRޤײ4;{922d5ER4@Qgx A0w]"%Kf,*}d95ky*I @fܳZ<+j$=ʃ4=&rp+1@3s5|#͍%,ش'0wD&L*xD-&cdc> T*W6$#n8[B87O>9 l'7Z1Ru Åu €Qҁ`6EؑB6; F JH͆I)WQx@CTDR)މbư¾: Yl0ц0BF9<|j|#[dWCm7CS99үC. W%=/q/2qNnG~5>}Vyzs'ׅܩ5e4o'B6Nq*&ErM爇R;s)W%x7S_o/#ኺ9I4ʻLȥ^+3i&~YUtTCg+?]QxRyK(̵##Ő{'\?zȳ?e}rmOIpئB<' |WI*̔!ƈƶ6UX␎:P;H䄚qS=!`7L%;:2Q:F)Fta0JlN S݉&Ew!e6 *))&VBf Y]#ll*L H8br`Q88 omY,z]е>7,md TvĴRFQ*BQXpx*5#UG;)V#"M;"+@@ D%Q(JT(J#cڈ/9yf>B>eWNh9g+o)[T]h[JS0k -pC{n%P*/+ɁmY#?OxN4}r*_^#vNttw,X[n>xgPA}fQ:7~̳Ma6+.#1Una¿C<a pM(^+]9~w$=o/ɽɼ`M }s$76ĄVȪy!bNL֨9 D6q\=(V #1uLحva]6%iAf%4CT⸞"sWD'4', |KJ㜆Rt>5#+Y4v/l1m\2 ~zoSrp&;5hFdcNİ#')=igȶLNhwɇi@LFӈ@J'ޝ[֪Fur9QEIhF$ /FVX>LFlJ4ڐF 3+N-atBA< yG?SoB`29-{lڡhw6sy 5BTmޘD:H#&MءJ[!(6de(\ js و8x`ًXԔ&Jé1YiǯuE'lDchH"Y!d]1sA)בY?N- qPG(NpME{$NNugˁ+ +_k[}ɳn5&:HO\ b 7?D^:M_k vïWY0,~ _7^E/[fCD7N&5p zfwyqF͸`lINFG>wKnt4߼'O K_Cѷ@;Q%Վ[! pn?x~aVxN&yf S2fsVqIPD3M ^ 2K$ ǻY2աKAOY-2( 7 j? @u\?9h!%A:md(9xw*0# TLAH"X])AѪx6]ڸ{9S {d ] o#vN$iE2 Da}Him]@4͘+ZŚ ɕ5oHqD%F8M=~Y^xNeekPQ׍zzg Pe|n$N·?l9DDm CEQKRuc'U?|O31pO|z s̮omv4.[ l#9}zhF}O?AMpU ke?%l?_ǟp5+\P10U&E"Ff7c_ݯ )p{No½6q9I'Du-rDZ2+Pjݩ%)v&YifX։T_"Z]&}sT1Z+)"}O±%4.a!3׉jD+ 鉔j{" +c0Zz4OF+V&|.*xV4G\$fG)% ]F"'rŦnqc&Ԉ>f1``c^&H$il1b,(xvcsUp3`dvBeeCTiLɦl^.)ք΁$AB*zC$@QDL[K׿ vL2&l. JirGppIdM@E %-! IDATMFQC4Ic@͔`%="!Q#QDKB @*haUh [AҼs%06x()=:): 2轐NFq(<m!ĸ/6yBL  kdcty6D3As# $qjba>PY% RNЩIֹѺa#e yGFǔ6Lē@e_`('- Ox_*wŋ癟E d8+eep+6WR)10 Ǘp,ӕBT{>3áõd+?zKcBym{\G61<[K=yց9FS6T9#RQNFr@H@m̖(e4a}`Ց.d;v,P)(1FC@H 5Q޲%ԘA$i4lP-6QRbMtef;]hSB(CL7$.,aX] Z #ιpL$Sz) 9[hqJkȘ"ʔ9;qOHQGtϽ~R$&:@~,Н: w/|(Џ '+9y!ʤ+xw|goᗩ.`gǎ3oS?Dl{O:ǻ$tu^m>~psn}vldU^ A7F2AhyCʑM :+i7~9||ǩ`CU:8et-#1Y8aW/)Qa2ft\^& w-+!:olJ_ :6=QGy!p/ +3_83[hY%9DK #Y;(l%!nBޱs;MDQds.T1:XXԨ\E܈gGHjt'ZK$.iG6OǰضFhV% ذpQu'ѱRvHdwJs%IAdl)I;[ &JBCA eaw)xTGm^fu0}Z,jqUfŔzD4F:[P.R`] Εd_o*/>wIa΃lK.*1<\֝~{+lN&}eyc^^>lcмg=#i}&4 z'- :dC&A(B[(\ak669|u[<ョn eF˻FPWx#J=q2}>O9E>bn`ۂHY+Fh7M6|,&h,)3U kxY;M";7ʙSZ/:. \F]F<&Jp 6'MlZrcwٰFR|'3GBPfJlm2>+NRc>0MQ4,1ؼdqt-M[֩Hazp#CۧlNaH# ~Dը-#tS.$٠M <Wy(N# &-%)A ꣐9vf2b Ӝ=;v|*;]`mnmS#KB.N_~Ygٙʑ?awuZH93 <dl<ݸ8+ KLl8$;==~]#|񗗕u[;?o(޽7%PIێx0޸y}Ihsŝr36[<+ﲷm;qs}οaP-x@zխ2LV"ÎnG^~y~^{\¤|h7 D ȳEr㽼 ƹ7zlAi)t Z}!kpێ?i(̺GJBN/#6Sc0{ AyӽbB7{<ˣOr6+Q@KkM2MVš=rEGL)MxDm;x s/3ݜ) L9hx:r,`YlUc8IZ6z$v'FFdY#[r#zWdip %6x>cklr"ԕ3[=(e.Mt=жI1BZFYw޻iSǟ“')_a9eesיЎ8M3[ׅ>~B-hydGd)қZ&lLtHFmu{pg|V;U;9[!`Sxl e{Dؑ\:'DFHʌ" 2@ǷInѶBgA,zā&Sp vP:FT9mIN0!(NC.4M'\!SUq)(LL#.S,q4;(U VGb8 G"p\͙>SS'bL[cWRteE^E N[@J 0L|8O/>z>)BjFcʊ{Vԩ-vo.6nʿNydZJ$14Ъ(av!SZRCJ>~QxwT ?845@o؞~k$۳m4 ĽSg;Ԯ$zj- `_2)O\d#\OZ|DG47aa\K"ׄS[t$OC~o#1/(/\>|z۹gF~X65 wiS_y"q*9egSIbBΕn.374,D½h1 ]3 cSa8B풖 Òfqn>æXXtBq48f&"vrJ׃TX0FKHWdb~d8N2XsV[“O y($92jp3'h4pheFDqk$Q* al8MQtU憖$mۏ̬GXm{IΦ߮hUG&!]xG?׿ͤ'RtDJwd P-Xe .&p% QegET,z@58<6f} Lh`nu7Ta5#zD*v^'͈^%Ҵm:: .>҇{XYk |q*)vѦ=ݔYz n9-Ӥ|p||א;g];ÎtnIm|8]No6 $V0I"48ybTly XX7bpbnmz8Ӵщ0w-,ZdX΄ mcXʼnEPw&38|Q~G!D42mi񜘺ѷF7y?&4U3z\,QOY 4t<)SnpF$ H Q04wk__^+B8ѻґIՕV;zwN3Ygz/$,,<<ݡ3|g$dzȝ)Bʜ+5'N%O?n6%٪Ñ}cH 1a\'48z@{Io)}o7? o/1W&voǀJ$z"}"Ǎ7Lwr. ?e^߇ѐ+x.Gm\\SIL:&B+L_*HL 5Tﱖu-}]6-0( I錳1*~ 74Nҙ^;PNC}CDK2:2#E4E:AYKq&,TAuŃt!hCٓ|EtPe-4B%\((l%03т##ֆJGR8Œ$EB/ MLڇ 2T?Aѝ w*]y'(i[3GB4h'Zfdе[&m3RF+;gCx,S(HJ) Z[彷~Φo6Ghh"2@1=!aY :P$-8S;h8|U WT'iq ^Yb?3@MFք9cc wASRh]X$,tv`>){D$TOIJ O,TN f)j$T^yP D)iR ?㷁d:î)=\';;)]@v# ɏ.{%a<BOMdlhF ;. R[i$hSiHmFjr$xwU aBP)͑4 S1Nr1kNql1OWyΣ L{gxs ᆏQfmׄ]DoI#y,Oyr3Nι_1NrF7'= ȺFT&͆nMdYO(s([%)k |l|z˻7 ތ,Ժ\i'Oy֊Kf6}][=awH~nٱ=)" h~M@р@1Tamة,vt[ ӗD#U[=Qc0#i#(Uhy 1I6'8WЖ)!"5 5$=2I'Ƒ.gweH؈(a/z/İƮ_qF0,Ý*h ^)]w?ow3R/^5.C^v _bA\1-H̚N2G܄;pJ3 =5lQvP-j-{g#=Në̷KCcpm_+=.h}luU;uc ^&;fotϴ7^OLQn@)R O3wv|rPZCʃ[F2sp.:ſ7<0AhLxX< ͳn,x` K}$# 3lcOr'f'(Hf¦AvS  {~O~>ChHQe.ya=scw1!%!N :lf9XYClrBݣ]S$I={xL2z yCk8Sz87qFx[ Yfzd.Hy3U ۊHq'4}#Wr?@U1 3jadxv, V ;͍da1mD66 `IEb䣠dǃBLN5B4A&l g'NJr#$ҩ Ѕ@)/+j3 B|` |uNyf>2덑yhO3~t"Ë3[GNKx΀T>3|30li|/\yi~T.0SZY9@ #mQcGOVo{?8 ?~XcZkrFjeF>^kdR8Á.Hav7z( ps[1/|oWwO̭!{[.bY ̄RH$4Vr~[EMZ5:VО)JOy{@bnmZGS8WhgakYv}cZk}Nݺk7I )*( [N#yCH\A <I ĉbȖ/%'DM&\ky)0 @TU{9r)[z$y<}D1}Ktxm<<%[Y%G;B{2&^&Af'>I:wbkP'-aDde.wL ;.SjXX8{uf=bF=p-!@(g/nM,;υ"tc9pC IDAT/ÿMc^ԍ߿0T 7Wk;,TO%OQ.@h~Flg=D4SC1͠td_*?zw)2Xp>'jP>Fe#XJp_J1pw7;r. h/9YX e5va}H$Eȡ]y88kcǎ %bR3ʼnrt`^" VmRhbL`Rо(FNpOlIT趍j Z IIk&o;znB8D34₪^"-aߓF!rƴ Nwə~*d;cC#3iKTۦJڰ8L g9ngOJK?2EYf6QҞ +(iݐIa +#mh: eqhGi6~#+3[Ɛ;Ӗl@<ȉ$3=m4W$NL9{+$`YBFӹcFmBPdCVfN`Φ"VcKc}Ѡ$c c>&S5a8nL2t:uĄb>>|ES)6;=!$ét1FLU`ǤТB"f%XM9Qq;5ʊ ]XqE)ZY#4D=gQtNg,CGDHɈtBix$m}6#tY߇eksddx O_NǖoA#4Qۉ:kdOPϥ5b|= f!O+Q7* kHq;Ύ=E5ĮW~cW/ޕf [Qc6C9}| XŊ3"pV k TKa \qG WLJ8tB(p`P LhZF.8=jBb+.6dm(i[L1sΏEj3Vha%[} E,cGqkq<⮲ Fk7̅l';"P+YgasjسM3ehݣD~O?W-b{Aed|WMOہ*ۙnNǑE"~P# d#/ֿKJ3wF#K`vYJ<ЙğĈ"εɬ)m>A} oG\#۾|w❁o0u"u*6dǤ)v<.xpC'l{qޙ|3]D^6c%=U𙍌g%޸/E;vLu&t Lri9Q8/Q$jj1*sGr] 8|At j=X8S[ Gg)5ZSV|)v6r'$gzȨ-Fi!:n2V)(!T ވ4:B@鑠 BD26xcöN ܱ&=i>L,B PcF6ab>r>AYdN֌;Uuuj7PQ ^NfN,$5"Yb kO+-@I?w[=J Ͻy: tֹ+ל[F9cL`=q*[*}Y#{M|{>#ֿ B9уֱJZیQhAiNxMMa>u=Дù&1a|u6">Wr*ܹICj jn+kH& U&6^)M(l=PSjpP[Dֈ鉮/@@s# WJVVMFr%IeMSsBGS&`:,FQ XUa4,l#v$3qA@hm] aIX$&,+=);mjvN;>ָl]#"m\V}9p:=S1a渱HϲOR}f[ޯ≧ki~/P'ǧk|%/_$3uzk#/4"ԝԘ#L^^k\Ys!Q;rR*w fgee~5ϵv|]bK)6s:)>7+iV&YY{cyp<?I:] ̮19vM<~B8].ڪSw/S+͏{Zge58y*PٸI+̺dRCpj:QW +Y2Y:=6 k‘[ 66 `-N>UCaIrjvx0ev&,af >q-;dwŤi8u&sD#SFAiUcYQ: یyWa c(s%= ΄ Fŧ2F'06N;]Cslj>a0KӰ^6₆Nj2׆F_PBt?ydda iN*;6rHn3"¦uhD6mpV"lnjLdE6)=pvtN5`"TQB ڏQTe-X3v 6Ns6g.y'NTE ![`1yQJӛj!WN4Dz:"C P]Xjؼc".4&(DϘ gj,1ċdnhPxQdHPttqxEF=0x\mGO4~/?#/wY^;\/"JWevHMHQؤLcfh]ll>>uE:k\'BAH]˻Sn{mF3_-ǯrZNAQ65DFY :esZ1Sv:ԋxsKifM|}<27PD-27|ITB -4Hd?\UFF76gvo}큶~N:<7 ]OAu??rM sv5cH#/XW,u:;ZZ)u(@iݨ13Y5] g,\$@<͖!&oaj-G 18IQ̔'-SΈ y}^-UV-HhT9:X@M11p0Ɗm8M)01GKXS٩љB 'Ŋ,NFm Y:Χy_>Aơ2+ yx`!ΝG^3{筇k˜>x065Mu򘒺އ?!o*??g798'XB% vB*h=Wb?A _S'#RӜS\W`J" d"3އo0 xF{b_ ҂P'~y< v.5V<ȯxB7Yj,9|.!^y_7]n7_իqͻGu tKxe'8։z#~o5^!Wy鲱yoDGx&ŌO 7.r8v|/|H-]&D^8N 3oMNh8n#Ef4>(-8UIXJ\Z#Dc+Y-NzƢÑ7aHBF:ā+if:2iS17lzæ qָkpo8d5nѨĢlFOXIء3EWKƉ( 'XT;.JNkF-b3J]VIhic,$iX%:?V2).ԇҽΕtH *+4ŬN,ʚMǶ ! {kxL4Kd-%$E!߫@!.hd"h3_҅9teMZ%=M:2r -!z qhXcBLqqZh$|HwZ d5>aieLT1:UG92otCVSE4VJ%]XqΤ2) EKdddPi(hnqQ N IGv,]*M. pGHUh6TQcܾ/,#f2dI8:. as4W A(AcdRC |@c0'^q!FN *xWr]i*4}^Pl#?x1{yða|7Ѯ_/qnTVJe\>Ύ7Ν3;T-ǜ>0&|]tɝ^7 ϽiPQ$5# r'V96b;rԅSzF}B uK.Ɗ#K䒋&q7o:>7}mO3%DzmgeݽP5B,:)gN턈q4%o [5 4G 2F0/c5=Sm`bj_A(2 ˥5$9V@D у#]Mr(&f*z,x  Z RJ<.`YlN>C LFS=дIX7hdΝ+*W8]͍P+ =2 1v011LNwh)( [RC$hbc`B[tkR}cD}C(,h3IxR|"I;u)fFHn1Sq5(oP+֑-izm $%&z" HT dGC}âiO #sy⩰օG5>(af'<\qHq6'Nhy`)&#%Hn8I5 S@0WK )v5bz*gK#S6lDg% I*޹r0~&Bauf<lIyCه #K$L M KFi<72JͩS0`L>{GkupDBl?S]011¬kBUM{L-YB-J#CB47f&z3N u"X "k'%vBlL3FH@ HP:ӑ>4da`GjV0jRBW:sRN䏍#s\'< K]+KdN1ql%QȐ\,*Z]=fJ 4/V.4:2r3M`209El %] k g-D9!L͸W_2Ձ>zppX]ϼď~p䣣F le@_{[xǃm0qqI=eLJ7}?K h ۼoE|mF Yg2dFL T'mmWub+.pd#T]I&}S6F*P 7GhD șjoOrO| g>k,)YtɅؠ鈞d#ćdp2s"N#6'o{dPtXˊ }XV.x*l=3I[E/|ijXGiD} IDAT _/ۅ B#ԡpV a4)=X#TGڌNm KҌRw%d/-JA8N;s*&:"ëDc`Ix3Fy0JIh6uF#MBI4 @}1L(q-Cg26L)a ESŇbx~>AfS.Dq ?|sV:KЇVnƓiG5YR3?.˕?zyԈiׂc`N3fK_?OL ZWB?U^Wys/Y_Ek_xD$ɘ_a~/~ 4ݳ4ks>B=| <Hˏg7+/ԉ2(r|uRB>_{2-d)byc`ɮ&8lX*{%Z˂2!!t8b"}r%G2JlJQABdp_9~]"tܓMdݱs#*xn/š  B͸|g#eeV\_( ͨ(l>?](>Azr!S]}viU[DcKB1nlLMha ъ)~  50M(1:Su#*eG Qe嬓i,~1dNI ]4o)O|jL hZ:B'֩s@8V^'&W4+f\AZ0)ScB}DI!ZCfT-;['XnO~ONFoH49Ң;e@ܘ B~v&M )'*v杘^h*5gn96&@Kc" u"JjD*d@2A\i9a8V]a [@47N ] XG*,#:nݍ"c!c*L xE<:7DteF:xwm=}|S<|}>MG^|`xvw'#+wp:u/W1I+'Q9d_b{>mꞖ6_孯gxq||‡o<[ TpdeL GJ{ [,<V9q:mDV68UB@Z^"/-zD,bO} 9q򅻚(uSܙJeu*80]&cJK -:ʃ9NkɄA'tj,8 Mvx>9*I'wD_>.[ xLS[F=&E#3+!5 rO J#5 PفoT>)wxc6,@S/2w nl2}BF4(G NF| B a9%A;-|߷!X7#sa4&"`cBաE( cho^`"+M3+<?2unU;/={÷xoao|vHCDE'L9n|k浯|xkdi!T_(|+W#΀ s.I7DD'~,O>7*L kx8aR/ϐ_MXˎM/N XO\ ?W)d,{^)|s{o_~} ڏC(xWh¿Ty9 V9rH5'7t9`q⍦ԓ)FJ8Ȉ͔C8PLZ Cu\jiDg&aU2 1_"Cbh=LV ya-1a1a12go0ui1C͙ıHZp#o36]%G{#0 '!bKtO$Bȹ@ 5TB,'$uqK+hG}5F+36 S02"zI6P_.I LiMkR@|Y艐Tne`N4 N23} Xfh&X8RzU<(҇"^f̄ D  *-Ր}*hhhKQfi탕wm=ϻ~]s˾slwDZskJ6jE#hJ 4!R$RV -MK%-iB&m.5C9Zs17Orck5=^k9=2dX2bDw{ !jU]At$vB$ /Lt RL`BS,2F,%`˄Ry^pn0$CgiA1fㅢ(& *Af9c 2piR~jx>+ysWxgn+`ǽNnQ쵱DƙnugX ogtVD/wy8m2Zn튾>3-Է~GY2n$she|E'kuE%Ba B.h9@* q-+N d{f*G1@? i/o!F 3S)G9'Uvv :}vE2J46ҙ:1{NWb%"8-,L6ҷ2 6"nPY~i1\4ʞ anڅ۠ ބĨ&mܰ󙢍 `ؚhsڌ( 9U)l!uzw'Dv"ka#*#}$6(h눴c'|;uGATi! TA0f4LBhd4ƞnqC(Bgs|ї?|ō5X3Rs`끇G3+OsswZV^Pr_eGĽّYi5ox7o'S>{xw|/|-_-o"8'kWW㗯[G G"[32%N9qWn&!mW\늧vV_a7碎kt<>zΏ5z _'Ӟv( ZzV5uC%ȰZ0W~ha- Y3Q*m̸&r!0j0i=Q:7D("DI$7Hs>OϾ]u$mevC'EmٌcT-iƵ"bDQ:LɱXhziwV\N 1t#ؕi2~Z^ɳਢb(ieigWЈXS#@FʢWE X4)IЅpZ+hS!@n /4=,ݙa* Fp+~cր>|M}pN #EbbuP۵ );Ѡx'8aYR|( /NTAj0)[ :>1?>zc/[` qliT [^(M Y:~Ws:~hVB;2QGG@lym|cpx׳͗(XG&GRGJDvr\낷<óׁ9 Z DZwW'1ZfO&'n^8q O[^';'Y!~Z rX|9½gEvT^o _RZ ?O%>#?;AEį~_EȋEJQ+F؄S \`kE*< !y1H/3:*Bd첂ujwM+ehL&m4l'^e#6($.mK2rC ldEX-F>"D'B\ SL YiP:Ej ō˂GAV1>*͞)ж# 8FKp*=Ih}%؀go$;!RB蝞;xBMgZNW2cW =FTohPb "+y3$us6$q;=V59& =ƑfűM/idd;$ .d L%ҷ}ջ~$9n:Z!*fw6M(&D5L6ޚ~$L[P6uHV6(=:P0PZ#~\S]P9Qκ:;\6b4_iȝiSS[Iƪa܋bcatW)V$|PAdjbexeSTH8W: i EHc2Nj> +)L61,Zs<"BDPR%h؝ƚp¢Z6V04j# >VDvd3!;^3"AZ9Ly 25\\, VΝpɡ&ZlE(u`.wz9(;q}yՕ [bJݜn ׁ0PC!>{Ig*<8lp8hZ33Zn !U$e&r3JYӎ'H8鑰7NnDݘ*]sW<=!h:JMegS#Lóf:ϸ:J"5RDh BX~a''TNѸDR l?ѠdFAGCgD->uT2 ǘx(:]ԌGnӊd'J tBc[<{ 9*δf F Nd1lDZYE3N(mtg͔ Z+8w(qF 49l6,x?FL8慻@i8hnl)q+jOձmErx">, n;W ;cH)PCB4ҎLZ#*AZ " !^$9uH- vgToc-8!&;I@Z5BpAok;\e~=sV e^-ĩ~BzCCk'題*m4M1(V;!_Kit?)B8 {+=b7V ("-xL1vuz 6ra2id0[(/Il3Y!xDlj8+3Ӭk}wlO6TqܕB Viis;6E$S \0Ҳ{q>F-AHmQ 7g&cj `0,Ur3ȶ NCЩ$MC u2ĥW]:Y#34߆%28Y UFR&h$1bVJ\aИΩ|}]pvСTڂ(.0w8A];)aEs'HhuT! 恞 GSA[#EH[jW:+" oJa,t:TUC FvDbP?zir]*`ՁfT+!VܯQ0A896䷴Mq5rs o9trP^A6sJ?Wv.y??X@klҺ!CzDL`R=}r.#y<<9m)savA['\XNW4NFi+(×y}OЗ!3gv.6!9F ™)Xi%8]+jy*crq#ݐP[V•$Nm".hX L +8h3Q`B#Ga LƔ"[b4©R yB[an3b4f"7Ah>:0`%DhڠyUH]m"۽.4(= :„Sp#"Ahg a"N8諝fNΩwvŞ;w潏P@Pp Xl\WY!Db(LYh}&XΕ F@W!t{wO-gIBZFy %0@9iwՐ x42 ~+D3~!% Q\Nwk\\.6cvυKv[Iazht$/#}%+ab &nM2/7Bla"(7e&7Dx$=#'R\dhF˜5K*+.kč 0 2y )*܈@cEZLB8yFH6hi'<Ci1%ÍSh"lM_oRe]a6QXs$VslF!HQ>O-:\ɟl7w&7?$~ wXӿ,L]gN}x óـ'+yМσ(%ލNoWQcE KwSpNքhm)uAtdm%CcHuؚp`<J"1X+I.q gi H$>Y aqoJƖ. V uWGՉ `qtH7L +![ZV'H>R!6p/`>?fT3c 1Fƛ¬X%q 'Af쁣Uh:zL$uwCi! ٰ7v}xneUS0bzf.= lD:U::SSrϿ AQ:UeR؞~.٥+Z9Y)rKMF^хgBa7&C 8TB-'aXd3l#ƪpwtUS={Pwu'Mg/C3<= GA39yVtB+:n\m>X= B~8 [H=Aӛ![C~Wx4]xt0^*i0hAe%X:txg#c%`aDPa ~Z"9tZɴ# EXO]\yV ;vn>1> rXxP) j|a^px၇Ͽ̧? §~X><·r^}wS秞?GT|*G_ >!zs}PW|W7[[y\;<ůp_[0)h .GNYٚc)ʁb!7D7<Yn p[Y bg,ÄNMh4iL mUS8&$(;GӘnhp(aD:/VBX{DqϤ*hm,S'*pp`D {aNquv`v#%HYı^!;(;A,悊Zߞi m#LWش r"`i 9WtVlvOz@t)'"Gb1J`s`Gќ'Kb*}qB'B* YSvғ3(q4ł|BBJ SҎ;(QH95b{c\/y)钗ȣ,ᛲxhGbcv:Q)iщ,?X> MOSDs"J718=5Re' ?}|o( t}wyn?S}+/rq 1>Rx5~,/^F"Nɝ %u=g_⥟Y}]i$0{??UR66 >銨C0yHwx^+|;J0>0>?[_z{|Ž|+p9/穯#yǛ]nkMir:m^ fGyG{bHP%29dxݨBQB!NŠ_sHpSF9)mpFK\VGW"96ܑ"LSGYiX.TMG6l2'29m nA;!lC;\]h^N%&Nu'{`SE[Ĺ!#J#v7ZI Щ͙3ɡA7uPZq8dc4fu&یj!i-wRn(,ektz%[ WJ 6O=K~ww#z9vxʴ]ur"M%:v%]%i5;L,h~蚕'.g3e9P.~^x!v_n|K|&Do~RdH^1[ CbJ`.H˗bfM) -kۉ9?3xfp\"_-}eBnN3cuBXb ‰Jm? i( LrA2ځ/3%+ Dorꌑ{ BJ ŠR$OcS5wLb̚:sNF%MBY iG*k CM ^}[RcU&.ʸ7[Ix:9ъTü8ZÖ X7T1NAja]g*x_Q@$lݙ4ЫHחPQ!mcN5u5,tQ/~wr"Z8׽=o9ϱ6618b5T*EI[5ZU Z)JRQQ҈)1P rϱ[fy{qOh"ѿFf<}_#{Kt,%s+d`Z# q7,^xIʔ[RnF8`~NU߄ׅOQ3&&H1r ;ܪ4g )1eEPv=Fw!/!!2%ªȼW!̀ p6 >S%F5%%KGHֱȸvIWOPO5mK4@H t$7eC"1ᜡkрiËk'k9!9" vhY!P ֧X|G.hkC'V,‚Z)8S[GaR~/|K_h!Qh"Zwޕ X"IVTXa+HւPTfx/=ΈV|-DiXcV6@?ņHЪP qz]2㞔 < ;Ub#~|c4lšb ӛfFs׆PF]glu T n2aHA%R̘XRoM;3ֳ# A5o[@D+8]^(7۬ *A1ID+dWaKB "HGJ7⇻q⊄;C}C -`hDx<" t׺ԅ2#S Ncv ە}ՅW sxr]s9£s庱\?G4_kwgb9':wƂ%G\k;j>\y7\wCxtj "7ll#8-P] ƫ-uZ)i`SN V[ GRr$UB.+2_u$vT s|mHp&ZDJtW &lq8 -pW3WBwE2")*td5E'EbJ sMM+y )h Qn+Z Gc `[u1% 1ŏ\!t:OHn N,^)bf_ F3`1H }RAFⅯ|&2gP 邶߸=bBtGT?64D\i]_nw_X<_3O;_GmՓ(<#ᗞMy4ٛ*\\zA:viE%Rjב(UQXx0[nz |p:0L{N0}۷x7-|틟d3as8|+| ֎| [1 U~)6NKEϓ=7J(Pn! ج2Q}@AUbΔsxio]>)Һ&ZjUj ɶ {D&+ܹfz+7p+LҴRjKmgM\5 vFe5f6$*Ԅ MZQ=> Fa2m:bzTK"+^FװXԎCɭ]YՅ)zseEA9McPǎ35ه>6ҐY5?vz0;mWW츣>%MhS^X`mc^~~!/{ W >b*W-_C,WnG|i'%!D)>>rօ|;MgB@+~~?7=( IDAT%~/; O47gfgdrh4|4@xl9ʯg#o=5 V+=¿xe/O?f|kSJ^H$Jpwu?M4~0/H"6kf Jwx2c8O)dk!!t8cXq 7ǝ9#+fv"]:=dXdWq7y8MCE%Vcb M0pLjMr0c%rpdg>54ƊF{Q-!;VNdAe -žđlONIqLgǍUsb0q[aj"Jc1 b(AB#nh<6DJ3۔9nF`>)gfB;aԍ9\PB¯*+f怸V!B], $#kd]"jA2t^q[5 %RV\1(/:Ɛ['8GQe Uhw3L6F 5@;Qo9EP@ >e1,5܂HB8o|QHpim W;ʾΜȩ4761k=Y+x[ސ7wQ *XCiz q~:`)m氓CFcYUvBCb+%nVJݯkCkTߕnS-d6P*^-RRe*2uhCm3b*ֶU8Y|Pq_ Xemh-SOn{ɰ&4(r$MnXX%"r`Hem䰲'6 |$Vr$==I!w,‘4䥐 gW xĝ񠍜x3FAHG3v\fS#PPk4 T$]2Ioo}'vr{e|pT0h>gI0+ /{ό\ ;#r)3?ɏ<3gs ~陉OpWG^μq|;?|S?σ1千+ 8f=s Gx}@oz;?A'i(!zds\c<^$DŽgA&O!<:hl$ϗt3`aå@<)D*s8[]2IsBYg\2RS$JzORgB̝z4tMdQF2L0 qiup\.MN$ W2r'xD2q;9#{C^sL.ԸJəif 0B"Jj.%crvŹ;+n)R1TmI8UœdzAֵf7V9LBtRϻxVˤx7RU8K 2HÉz8,VY khvHUl~Ci]^#Gƌ԰wt\ԁ oF@(J [p"8Rx>MpS1hP@6B5PB{(!Hًi0ڰMpqFPylN"[ڢdF)}$KbVerK1Vag3 M:tԄ9U0O^*I ݥ G0(05fpXH5!%FH.ةMI1P6TD V%ycu~.R܀3NX2kckP!:T)M}@,S2M;( M"TF)P^0+{}Êg&s$6t(c)IV͌}z$ǜ{6D#2yevH{Z_%0ceU!9OF[/Bz̸h3N)_{}/ _b+Nd,,<G4ʢ2|"V$3vHle' *ژr1ʎ<;+3j Jo_΁ =؎Čs;Ni=te w^ 6!3 +%wj<`qtYkA!P1 b-fBjg[K N0P<` (܍ #5w+۶m\ ,>. _UǠ],#ᛲ"沧dQybhwk͙a%>{%ë7Rp-vf7j++%<` )qۭp\X=_~ WY>WݫWXw/"-yyڞpƾ!2q♿-ȋ܇1CPK24S;Ͼԉ __?g2lḫg- wա6 NhZia"B-+Έᆼ/*#G9/ v{gsesoy:c9*>_~: {kWIYkyxӏkdԁ?/ؿ=i)VrcS3-\pƥ |&$Gh9 ;uqI`n iXٮ ˌ'B,,c/ sVZ,A{iᎋLtz R`c\fͭF.Zb[W&!\֒I8Q.md YΌsCn PF, ָg-9s"r-{8ʝ ox]t5J܄, !W6wF x:s;e\p|e]4hGۖi5f^kꑤ}QSsabc0k Bv$;~ȃ1m=y99Tvڔ:8Zq!+naA-ÇJFdhXDZnH~ûMXPڹ [lDl h4x ) -udG7V ?t`H B[e%' +D\&ocӀBg%AnԜcȶw i+"j/qⶂJ#V=&uV6®V֬\&cilJ g͊aځ-#g!n_^nU+:6sD0t_$. -"BԎ;*0g`ES+4)x܁eeWp,ُB[3)ke#-b C~E' - .NPo p%KL+{w0ƛ[DGɇr܈'z3|]Ȯ}$+WԸ։#(o"o"6q52 aRH`]#zb5@3 [41<:qH{3wwR1hQ zit_׉NL1vɯ~oFoA? T#' W1 7Z=f e U!|# h랡F֫<8YebL}Uڬƌ+cd9tf$u8!1RcH i>Q%itQ7 ư㊃)~ZhilSIwCBrR*hd&|3.7<=Wx--\n ѵwQx`صB^BOAy9ܰCdhd Xo3T~$\t|ah6 pg$4q>0.:58'Ebl&͈CTI85% %|d<~PO:Wŀ7* H;TQBo9눆E-Q ^LG\vl"UP0$nَAm8qt 0)V#kݧr Qj''Kca@G *Lr )꘢P qa%H1DDJqǠ%!ݮ 8G/H^y]",u=] qG~(N=|31i_y>#/sޱpk?)GcY, =ZS.ܞ+;8%0Ȫkfe͎LgÅ6.?՝3.]4h:&/rr#ib8rdЂxF붔:;H*Y+]F 5v ޱԕ1{yn ˊDR#,#*B%hۊ廨ĝ8V#+J_ab!oPj IvC}dV9$(RzPeõWb.4_[Xf@ɑD'j1ՠŊ&5-bFB0})G *C,P_^{{7 z¢PITpmD, SB0:)xX\nrOiw6RCp3u Y"j_ai C'fCVt.Ft-;5qN  $<1/MID`q#Z+edp8m3R7vY3*0^vẉ vQ=Ssa,9̼3¦=J u YqG}WD[ofoZ`D@i%r9 LueȤ7F32RS5cTŷ!Li[ ǪXZNq Q]${J,' X.GkЊbi|A+vz䁑 Wŏxjop[\)^s&3#.n4]zɽC$0>s7xߟ7À}{W?aBOL71#놙j` pVpR80HD,I:lPJ%J O֌׍;W]Z[{nZWK?r"pk/Z:" >Mi{3c{al'i -@QAZRHU6iCsiU*Q$1L 8164޳^}|iz?jIs!L[q>`#K(XϨ ~$ꐾv }Ϧ3SW9|.\ ݩ$Ysg h \ N5eve29;;j2';]Uj2MVvSy%UC6mC̩ӌyHnx I-c4'cW#m]9D M g¹Bh8 ֘|Δ**ӎ]7C Tqd{pD '(cKj7 m b,EiDj rNc[RěC1zdN1As Y!V踍[Λ&}|Osm\}NBIcvr7?M 'y'z?Ӊ׿Į}W>NvOo:RhWw$]92^gQN6`l`&,9'B` 4faэCyM<5_:Z[y?[vrM[]5#Y~#4ƒ3kx2nG+>? {GE8ŇS_~WăY #6|M9hvE6%mI8=ǣMJ'zoq3!%!$ydܼ.4NIF#b2z_KyIכD8 2ŶfFشS=0%86R l\em4C_< y<`X=pLC&>wɚ)15IF2$Ct;>;)iV(T{AiR!&CйbVa>K &͆ B'jTI*ľщ&D*F$s=9!j'@kh%[r:*('lv<jgHPM}M>x]*&~C<7KyLsJxY5N6.:QiHVeёpsl^C''$66}0Oxm4وLt؈l<#*&D~Gw]9-X9;.#f86Bi'!$0'r!=#0]ZA:BWjXSiN!@]#64*NRň IU6qA - ( "zի)[S`dʩ1'g{4xnTЖI j.&#h&i]4%eޑ?7}ئD@׈IF$caB,QlGN0v2 W։ J' 6~ň}] >"wieKg2x„XŢ!.PlN ʼnKHa@ܢ%[D%ڠDVDꙨ±Š%1>lN=@ @JLJ@8Q MӠpÊJ$ vtē ˆ E"hA|&Dd9X"&#ʞ_Dq cv~fxm\^{O7nӳw`mc^8/s+ދ8mWxp~-%(;,/-oư{Y` K;p PȊteӋwsG.SZtaۘK d4>H M V@v{BP&++}X*2`Qed SAzZ dvlDž]f\.pȧ'E3 ʊz'[B"Ё4pZ9&aF:N  :63AJg7s73~SD&HlWYK JwZ9,S&>: <&ȉԌVɰZL\_͋ wzΔZ'[I ̈́*aܺTVjyHjBzCu= dGEzxATW\!^3~6+34)tnuLVHj$sV/^souF H[x'r;\23shq2kWH.MqʄMfth?|s9X`*))岲L['˫^ uL28yc7s5iӐqT 9advb9`d8J/ Qn ̝fJy 0ER뾠@DNJ끲$vOT Ɏa͚ ' AP]k̉ }9Se /0wnmx^ IQ1Fޗ /mhsNH3 a.G f]:Fx WhtX|lPWyW۵h` Іʲ72 f k`_nFC{&`3֍oC(".N 4B 8{}'~ÃW9 ܽ}{7"O߽/\pMT'޺Y'?|HNT8D~ 8A#|sKgܝyif~?W c̓waۉ]ĖP: ^8O?&k"7C@mT?.gzmy¼s|Q|,:4'ཛC+9O_ 26 xx}3|{޿+o_x| 1ARGЏ0U„`rʐRJ2\ߧ@Dg;tƝ)H!N03D+y9u&)|}F– Kjx Ls՝oAɝx8ɮd]!X,͡ ڍ9tNL(Jl3"C)+{@z&Xn, THyg#N2c?X_WzHS% ZpӪЮqJ'rީt&|,KBh䰆U6X>763i lhpzWR aP<`Q jw8Y$341`9@a`X%AFu0ۍocDވ˺C"6X9I0V2ڔMC X @ J#@O t ř#BdE\bm51D+A(P-tdATY^ͅ y)ϼ{6i S7RHIu'~\YnbT4$EAv98=zw*,<%g/wv|G U$Zѹui6Vۣ㒘Z NF[fN<#98TA!gJp򪘌,hx#'B^t*o%Y"O̱OSaF; a"YLK/3B2 I!+g#rvcb #=&dZlABdJM<|Q8Ȇ4`5! ]م;$ؘk`PN-ZPxv2a2Se& dmL6GY"IF2mlm{kDõ[[ L4.4A4_9|i9v'݄QaՇ%q^?<_?p3//#t\;}J >cإa sYMM{Kl1F,_?UnS.~,p}9^4ѯ:u'Wme,;t羁/z08?K7G<cy?"Y6nb?!] k"3%73iǃ{7AFzf).jCyAfa:(1P?1DJn5ԑQ4X2;$*9wΉ3¢ =Esf͕*O4:&id@ =2ny؄}1C1Ғq3A=uN) !aG#CaJeݸefWy `g\5EZęU, M=,(trxب=vN#AǁE Q;  1掠^ X&ƹdZ<*HE`;g(M+W:3YI ԨQx'Ld,ʦP'1 :iɤy0?^~3m dJޙ&&R@QÀ.K= G|0c I^LQv%2Yņe SlhRw՘%Pf]']cXK#WBD-:M$te4Eh )5O*E2FcKFE # 7FFHЯ&tAkwl9ؙ*Ɩ`ߕxZ%t!1 .P |Wl ]|lZSC'xAF: RȖf= V 26}a7Nʙ&Vȭibg#',Qhz#мO3"B-E&^ KjĥЦ;lkm Ԇ(i3`?E/ٷȍgO3XGG1vO c% bOv)t9c!:<eΧ>n\U /"Zrɏ!"8l $:wP4h#mp;fOTl$ 'v:'&MO Z#{ʸm"RNi\V%JEh٘*Kn|zu1`h41솙p =el:EV=9jŕ^PK,!p8,ƥ-r`Wǧ@O4_;LVJp8i"L 1&nL ݭ-ULꑪ}dkJ Ntee%E,;i'd hQA mذЋw (i( wjK8Wā]1NFbE*[H JWeA; )7-a)ho&S9n+[y("cC2wkvKCG|^l׹55^wr+|'?zr. IDAT8=lW'y2/t) }u2~K_}?+Xڑ}UX:sS)_#/|䃿ƫk!'F!^/˯wPϴi}?sѿuSg~=_?l%b_Ѿr ݙCCe3o!yk7O$ihJ-5ex=h5B\2JFvfMmuJLκ9KXK-5з+<6cTmGat[!QҌ]j'8y<ˉfꍝd։1u8΁r,G|rJC²:jV<6o %gW,ksmc?;q2 2%Q%rb^32(jacH:4Ỗ)cH$ԙs6M\]FgśdAvÌDqSs seʭy^WcM2 Kn἖ +'?^dg_;vxĕE&Br6l;^u)шxأwaKHp<)vfl>0aq5Pcg7[ ЍhMxX8GҰM,/\.~jcSf89DH B[w,sGjsލ#2+xbGV*'u=&ǯs1tvT't֐c]И Pިy0qui4T [8r~l33"$zR:덩&%s:ő' 8L2,u@@#h)5<{sNS;{%8\iA8XQZu9W~攆Rq:eV i̩LΦNt"?F3hɄ`SB"1]bD^.19TB,#V)AI`fGj8#FՌ2=lt hMF c8211d-rt(-`t&GF{_۲7|>Yb.DJEIW"F(8P+H/@:I:!HI$KtȖ`YHS""K|T{{k1qqs798g5>/"fu];8t˸h2pU\``8%Ls( 0uQtN&PjH BeZQa /;ft*G 4JHu*~Gz1k)FF9B795m[v,{\7f_ #wxMvf1w~ _|`};;2D7|ƷSڋ3g\k"Pďjʉ#Fd2[hu%wȾgjI8&.l(Nk4sqrcòKOzj#ulpUpbvD[dJpgk$rgw,ѼaX;w؃CfNQcJ/( ?>94Qjae|sGmGr/b#s]#$ʉ㽣#wruQw` 73iErt~diB$(mcNG4̖)n!Ox{7l};zdNhWh Y3W3ѾS ĔD Ӟi>qkY!e^(8jg$d#B[_M6#^3@ B(Fʉ=4rI[nL ~gN8sb O}E&q=sY] X՟>:8߈-kA=rOb-R?'MB:bim7GJI)Sb3>8wx"[GwVD9D 9 \+"V uMPH÷s q.@ܡ7v&бRA, ^ak3*ɂ[%Gb${$7H] sM3djS^ݍo1z6pAhM,^d"J/u!2˽Fg$c#AT6z2 Zq95GpF2co;M)˄/m 1.Nv?X} h 6!A &L^f7"G!T:3N&b7>g Gg}yL7%̕`+;:Kq[yd*3k/G|}1qXC+|G=: 79ˁ98NY8uA4yJڹ!E.fiimgBF!#~G>.]xrL7?7ӳgӷ\Nfz:jearR &\w0gTIMɲNw3j e5/l$oh5vPHQ7,iY8#=w4>{g=Vc"{juڌtj5!G2;.J-3* iH(~1w3~b$Rpq=k0zpPLfg-w|0RCƱq3D#;_wO#sJ9'vO j ¬1$M(2B:VzcNJo; Lv9ZY! T6 5@= A=+8:O?'Pk ׯBk/|Cs-Pv',y?{_ m^~ֵ1rW6~m8e<^ҍN$uS%!ej:/o` R=6ȟ 4NtV&oH+QV8h/t]q(H5v}…H[ -|7Po{TOL?6&'5dPF8@@N*:ەR!M&ni +6 > ߠZqmg%u"Jŗˍ< a9s}u:.@n|.?%9/k'F7OR1:M_/?¯|/WgNjFF}~<4D4?|l nw&nO?<ܽx2p`32+|Uvgtkv͋ӉKbhЮ9`B箌jngZ`XΜ.17GW:e>=u&h ~6%_Ny e* BFuEΐ\(qyƆN< Lw&\ C-Y"9J3n"Q3!d9p 6"F=\ԈVɾ x)'2c+f,juiG[aJR!H[AˆT1D`5WGEz{]$Z39AN%#!U?fL2+!H'bdj mui4`- xJZE#a[ΰy&lDH1ߡ-;_^C* D7bLNȮk'hhl"V$zko8 0 h. Y6z)UvBTi͡>h."P m`\'zКq(1 %@~X7교2|.Q]Ar@^QP5B6T/: +g6j7b_*"i@Ѕ`}'TA=t\slW(jg!.D->XB Ltf T=Ŷ#[i2!/}qn"3ROՕ'ДzV\W;crّPoq7|7ZB#c^9^ 2q(iN/)Sj׉p ̱?;sskbJ΁9tN].fd#7o߱sWܛobH4('S@GRYwy÷m,9y$'|R Iaj3ea?B銅Kd;5@QE92=7d Ja x/~<~ԙ9P-hb_s+k)xv*\gj;*m?)Jg8~H.35Z l &\VB$Vf1RQo@FWG&ա;ֲletUrUD\/lOfwJEa~#p:dl)Nr@C"yw_IFb D(]&zix=s6v|/ؙV2h$eifFCero„|SbXQVëׂ8)N*B uW\+XF:5GubJيSY qa[3o eN-{gS*N_,Gs Nƭ׀LkBܗ[FB }WĖqVAZqa$llB$V>Qs$Ii*"-T9eHн9"x"*԰ UlĠM{rzExR ]F*15y}J[8`JQaq9C{(DԠ੽!APvX b{^ԓ!*CrוfAp2{ IDATc0JAZD{߱+N 逍ggoz^B&O3>9OF8>4-hO$'6JH|<obӎgmƩ{G==÷]d&ϬࢣO;;z4ih6^Pw1l!Nϔ>Q"_4*"n'{L*ȡ@gbX[ްH4L*6n#J+ J;յy8ecIwbHmy!6PDžb%5\ K%NM&\3zaNH|F(!X]rF']g3# ;槁W 1y\"]<hbLLi5-PPN-E[3>;QXNv^S, {JZ J3[8slQaJf'c揾AIB{#86:to+%y~dzo7/-0\u:ƶ9FC8v[K|L&8^:~~Yh=3EwN>ssݯ?ǵƷH ğ[v=|3Ie\y {hy_dsdO ;o7fCEv'nD'*LbB)lߍbgs6v;R8/לh"##yj3J={lbxm);^iJc ,\40%ah/w" 'kh>gsf%Yd:lăbo~otwAц'EB݉9OI"3l5܌BՍV3-++ZuB/-Fy`oC { WȾ0達 :&Bq,u qA'2:Uthv)PEb YnʌɆa76Sܑ!ko7B0Uwx ډGCVG>Y`s 6Hih~0d&߻f g]6;x!u"訳"}pVQo}\F8=tr 8m#w<݌ aCHˆCQJ OQX5 T+-P|FZ7b1AoǎFO (p16ԏ9%㶉0խV\ ߱Z;Tِ6V]@ij{0S&i}T~%Ց]=:MgmԽ?`FRXkui^` k=!Mȉg4z'7F(`N>|rq,2 l뙾_1GOJICQEuP빡H 2}܀\.{)u# C+v)l=Hu#L1h1Z1RF ZfDgD7#f8b2*!;Wucsi 3fNrϭ;gϐ0<敳 Q*>a/ݑ tQ .Avbͱ@ƶA&3^=:ȕԴPUnHI銮`q fa( Ydž(|SJ߀^@:mq{ř'a;xToY``DFǏZ!j۰g`Yi:soDi{gpW`7$Pdˏl:O#~o$[?yS?}|OúR|G[Hx ܞ;wNޮub1sاY1@}~ĝ62? ?!^Ѽj#kUO҂ޠvxIY*g=Qiz)^^a"]9zRvTq8k&O[=Z elOו`S08f~cIwRDͅ8E# lh&l` Ktt͉E6N~æ!ΑGB$TC|IH6l:˖ĞՉ*gt9kNu3'R(`S‘sLGDhuƭq^6)o#P _/Qvjs\Knɭ0ѷ{T3 x{zN88 fw1 8KFvt:m1Ѫ&GXЕxuD \N=plR?`N]uT#=#FX&:Asp.x$xyBwEpCsg;9{e-gCbuekںa ƀCt)eg$ƙZ: \Q-JY~Qyګ)hs Dt RZ(h{I:ퟃt2_;O|?̏qE7 &ܟ᫿lEhzxz#<}u7o x+?Fdz=b pO_㭏G$A  %._(w;B"sH̦ lTZ/l^(M(/ %xBqęsȫY۶q̉sh[':qg#V r=38WxTsFLE2Xd< ,DXv:{Tv8,y§G1:\nh`$ޑs$u7nGbvvFj˸Tu{]H}Ti#hͨSkw=lLw\F$ 9јJcO;£9.$qAeN7\+_ ݙs ]mAPNo\q-x)|7 \P|w&=ey޳96__fVVˢZ)ҒEI D 3O=@, `(`YE"jXE{O [0 1Q nܳdmBc ~JO:,vJ!h?OTIFpRǐ  " vDmԊEGA(&^,Vؤ6{R9v0qCƌؑ  ,ґ)C #. Ӂ1Α:`ÓgȥyɬߣcEq+>,f8BkR%\&rxl#n?y8{,ß# mJ/E_JnZGѫ :mwzb3m~% ?+W&v~2?_;?~K.#Gp󞇭rXgDW>ݑ^8NO-}àO7_>JJ-Yd̥id]w4E(H깼|N=ء/i (7f]Is掷xg6Ewm)r7bPr=Z*5ڡHΕ m#tEׯ4>"&d+4<|?WiFO3/aiO43;{,kG~9%7:{CJ'-,O.+dYQF‹;[$!(kő*+cs#D$;b4JHq߆ke#:pi1AMA;3#}D . a֔v<>$/{Mh_U8 XZ=F\ Y9a2 @wHiO*^`s'SL&,; 5 4 rJNf#ɞi7?Sa ފ# a!EE&MVc%a mg:TQtd$27K&{/6* "kox1:mPZi.'{A?wgW|ޛDsji0`x>uϔ:Qu?+}vvgOTZ'z!&J;)sh5 t9#]Bq54$9RZ=8vU\pqu/X١ل蠕Au :(}HwDRf;fldJV.ᩉEV.{~hO =@a?4'֝"4)[CkFMHPAC퍺{:Js;5Ccxb;QRHE@1;OqϞ6#W mHOs|o}_ Bo{ჯ_2Nh#;;P=_|ʏooxj0nY:#80}+&*_/&/ mn&wlcA5qY z k%#I{47?T򠉣v&+-@$[a3!6DBPG4Wm^>x6% Թ7%p#3'By׆ٍ;f\eD )N܁t n w$G66zY2:jLC%F o/7.ӆύ;70ĔHd/ %vNm%ŀcz16=ʂCD1938#nV;lh.c•@w y?zb=|ǷH<şJ1pa7wB=4G).ʂ3@kd:}Cp1w9?&ADhՄ-\r;yyf+6) n|ۗr$$(͸Dtە9yeX(k+j/p[3Õx\ S'{g?a.3sXx-<dOqCOH20D_On'W+c7xdEq$֮$-83ZJ7\_~׾ [>UP* ewq/lnlB~}/Qð|MXjl#oWhzHZ;E{E|g_>Z-{usL4#;G*[R*\qVfᄫZ.-r9Q%*}byh։RR`⸷؝6p'wvFqpOԒN 0ʹٓ;`^tm{M-sFlks<2_8ܕA,~丽6&ʀ*-ld+wl E>H+p~Ff㉮8ێqOmaՕ"NDžR㱱\ʺ4$b<;~ŏYqcJ+֏cOTqk/Vz`T,B_ˍ^99DGi0x Of@=/8}nHp Ƌw|!l3>a~7puoRwD&|8탸z!BK'vTJ×p=Y g/taZ* =uB<юT_mD}mF ulǗv CzGY$;TVjȽ3Q}Gec3zZ@̙֎)tNINpIʺxd 7ܺK<N69L9IluxqR۫ - n?DZ4Lo 󁢎vYhS RVF\aW(;o0)>;mM;*TçNOBg,t!8ƄH!|zJ7pFlCNEpԬT9ƀZÝ8p} +?¶azD 7[ZqH̽C"vS\q6%sfG uCP8;Фj~cJޙ91 ;.o*2ai!(B gƖvoLz\] e  U3ֲ_"{XZEk%Ib{ t[zw~MG/1_x(zcڞsr}o) fA1}UN^dGTIO<WUnyb /M,#.􆰓vBЯU\ B6o<^T:S愔Xo>|J&ObCuG[Nbeʴ5ӑ;,vۚjeF -VQ|v^]ᨴ9N<6|b#Z9ʒ]3c•|legy6|?IhQmiI!f…np {r3Gp;dⳄk-z&[w@`.+}E5Ye%- uYnj\=%%gvF|/\JAlڳ*8y8c-Rv6ja2^#NL]fb4nMvpTnm#49ckPqW!*>,pm&-(f 7WL_ Rqq4AoōUܭpo~X]4ɬ,'FG\+gx'^B*HV:bG[GeîLj6̌a;FX@p7V6Xuš1?гQhغk [s2 Ui r"Xe68reѭyw#V*mvm%жU oonujp]nWѡ&ڕ; ̱r䢌O(-Ѝ%*3b ]B{*bAtƊ:BW?7ti#x_rx[gNEI7]Njc9a:*c!wf򳞵{}.Եt--#!2@ <[tWSu/3L)3}rTonp6?|h7Cx?sw c3Vޝ*e۸Ge3S ߸╟i}=h wx!k$H@3|.TMogMb F3\1dvmBUViX0L{;}`)aEA"ݞ}pή+XNgRjL50jŻU#[LfOi>h1 q,Oݞ9#P 6zx2V ‰׍”U&t{P•e^˸XA'҃]91de:lN⨓=#G~l~L'%+ۜ9s#uS{ ͉݅Ff{NZa1 J|p>{'C|h’"ɜ?Nk *$硬7fN۶p rL}`6ChПX׸x#tML؅XNo銷R}ōˀ~Gk-^LӠߡfx@ia;q549e)-s`;13~ Ʌ[["^,ثhugiVOK'SDNFn{\-rm吗q1na뎅+5I0$`eGicޑxNr Wqnx~f(eA 6G𘈽یOu$evc5UI l@%A1E#NW*%yIqj{2ӧP2P^Z"i+UOus`Fdڔ7 y H,5yJb # z&!S6%JoW6I N%~]c!tcEs .ՏIVȸ}(s *.x?2Ngmt#HjP*C2!4FsQ8] #ce`6)1hCo*: ꨷ԔnNRwЉ1IE5AsJ CX )2aB5sqbP^a:18>3LΩGjreze IDATTq?,0:Ӓ\Sc9䑰',5lme-~aVyCQ fp99=Տi&x肟~\3̨}yã|!9RJ "|W>Yʏ>)&\/yZ:ˍ`{)3nmg~Q0I +OafUႱ4!g\PY cB{h9=wU9m;xS>8 6V:{5U iLB [ >Yx7:g8儵9?,xRyN'>wNR lz(LsD00jāh˄JM&5@T ysmlwz(7q9Z>[= #/[wSu8Y'#lEDQX^XeC(ᩞeIJDZ)lȔowva[+q؉mfktLaysV!rr Oo55w+#3ZPrw4v wQ? a\Ke :ib'RW%wu8k 4Eo<ļ/77N}5eF &lVWqt Ph_Zwz0:N.ΜAFm 5H`b}J?HgJ psL$TI&8a棰ӛ3SwbT0H7'ţU4I"ێ轐{4ыXyD9N;3g|*% D;"NP!PdtFqeJ7Yzm;93ya> QȒ1[d! - bRBj;].*]a #҂ԅNRCt ؠAd9C* %i}У P DI gK$}(I@w,t Nڑ,ڕ yaO3!>~`g~te؅5ףVf(rp1`G3LE?W?qkdN Sk~0r +[p$gm*Uz]|k%?3N Ѻ˿+۟hq]ٙOϨlm0f;VdY`x["aFn)#k']NlT_'!ĉ$f 5Z6~&=ɹ8ܛ~BhiUsc8K^&nJ Yth }<7D4L9HULՍ=XA{!{`Nky FhM<1S% 6$QO'dvFdC N0I}0:mDf6Î90?p<Znrg:ڕ;@&RKDB͎kdLe;G?[Ցxf7@N#Wf}#Er] sv.ә:MP53άcneIX=hE5Ljr}z沼c^iL?t|>w}4||#Γ#_#93=קq^gާw<|g_'7>~ua9ӅEB8?BC܊ީ:s^"e $;MENLχeCa+kz" QwLuKXݐXjLyhy(ww.2lȶl/H3 4(45&D:+EWtS@Deި Dv>'~?Ԙm_9玧cA ®JIyWz,0mL,SR!1sOtr5.v&6C9 >dCIJ-R23 wmg6,gWz=SB;(.k}P4qg=816Fk- vB`ʻ)m޹\ޑO_zU o+I!щiɲ28}ΣO o7NJ*__6ݡ(c|AU/G4;]UaOD_\HF f It\CC ($s bA z__&N3:S!MJyD0N/= nDmX3)!k;h rc]cNq6v] w5$%ɏ҆Oa Ih4%D3y:H'ȊxC_[6'{8Vh P';.ܾ 8F! ǁh X?Hӂ gF 7QDcނ᭣ÜN=1 O_.xWܔsӕwLJV<5A2nUcXa>}@2`V=~WMP?VmoV{BӍ > ߛ?'!x9м$e"aMx&=03~ϼ*?QzW~CE3!А9Y@gP=c*ј#`^"f3b RiLDHg[\4F#DBҀ ƥh1Ɗ+wER*z YG!eha$tZqpR.8m>F u1QG-2n(ve#1NC EێAN(e'-Brts9Zj'dD&N~ĀH N3" OX)A 6ddr⠎H G;o OJkGٱ \0ڎ EtMy剣0)ԧ'4: B-8G9ت2\Gddꊧs^>wu2oJ 6:,/0N^LxAFf+ؙ:SMi1\? :M3L:-珜GST`k& gYݭ =Di!i"=%|]{p!+s@Dbyʨw|[wQu=;"r(<ڝY.LCI̦ TQ*v BtMY w6C& JV!="#eDNqgzBzЦɍ:8#x6+) ʒH(AB3eqQe.lSeAQri&v'Hx,Zgu4PJ'zfgZfLC j̹Ч:C Nq{d$5U:f7v<#TsťnmDQv)AN 2^ɎBiTO=|FCʼn[Pz"0= 'Ҧθ鼑D ͍]%*% QUkGc۾K%GPf3.+zn'zvOCm/%A UQ+f|`"3/!/c-߾~[$a{!3ɕ8$rv6!p HAL{<8~ YAfAR̍j j+a yt<Lv 0S }tt4Pˌ\#!D 2W|rX灏:.FHgr>P%Tj!.e4);Q!՘;Й:<$7F+ĭ{^N 3vwٰ|XXIw$} 3F ,8=?yQ Gƫ x>:{Pef,P} r"\1 Y:U0QѶ}7>1N5`NGf}lv2$Z]rxaN 3EYNU!t7AKfN\1֍8iA/FDʒӹva<  1!#q+< 䩒>olAOOH8qF>gs'N;z4-f6WzfY>2b'a6\|l]!ް6)vjf co+gJioN=Ѷ3& PNhh1,,H7vhݜ5L~f$gJ4SԖhigXgjRX5 0vBՄG`Dg*̩ܽ[T۰*죑5=*eS??6Į; Ex.I1olј^;a ԩ#{Ɨ &%EuJ*N(\|t)x\бJPaOӝaл=NGΐU(JGz^!X  lw6?ag@CB+2eD& c;&iwE;+%3ніK@g,G;teHʄ )#ppdL()ʅ_=bzFƧBg|XP⤱B`LdLkBtkHK7֙ bQVD`3=ވ>~E; gGC; ;V PHlc `vїRU$RiLDu,7&$)"1eֈ ni>LV4 &<ڗiaJ8[ԭDvJg`i!i#ّ?59aV_~.vdLԪ:FBwD}t91:"'T۸`LףVȌx1D)3J{~>|qG&̥qO|iх3@5j?n"S 6qDiX~( 2<+?{Ǐ1; y^ Zyyw;"~?ݎ?%3+Z|~_o~ ʯ~l8{">3svⱺQHgO 6O՝y,A'i&[&;;Va*Q06\'=HؓSBA[ /0a*v7ufh3B=WZT fT0_pDQ]@+luF&Rh31FcLi ׎ObD;q`31ǡڃFz^o.`ʐgGG{cAm=7=;ѐ2 |Ӏ^/N|0g$^qۏK+H?;:Q3%6l<070eJ"k80n܈ˆM1IxA ;)VwP__pf Tglt7JX{Zτ]dox+|*l#ӯᠦA-~)Qt'3}y #aW }4 498 θ(7> S<80#tbϠ!+VII6Yѥܘ>Z:Q3)-F! +BLA͘1"2>c5.1QN}qVOh^\QRe sDLI$Mn)6hM̆9qnLDcUz,lljP]>8d59Q,~1+&J|x#ibWz؈dR}< C1R 1ю 8|OAK3)z(޹an>]`._>*ę*< { x*BA *߳KԌXx2aVM$VDk%g\xnW$vL+x²,x8;MB7n7T Fp)3m$HJݍ9(A͑Y:U53Awt"0΢JLv4uÉS*56 CDH,&/|&LΘCua# ֎uޠ$C92;*G>l!/A+* ,Pv'Y"1V:*y*o$+ I05#Syޙ?`-C& k3^+s6}g+`r; >t̲GdFnaSEX] ]jͯQ|8?CT2ЩFkѱ19stn"䛟.;ki9$쟱WgXfy{NKBfႆ3A'&o>LHcNNBmh6QN!Hu8YLJ$ ܮ( :#V4,zLV0r;^ХNaϴŘb$Jc-GeWAW:{RCF"PZ9,3a(c13 o':!{ï }j6zkVv³sдb/J^7@:\fB31Fc%=±!Ahecotuo4rsvtJZf4ЙtH=ɉnQԱQC؅*oH4({C:*`apO,~g܍*:ލ)kN>_!CL'ffj<j g6<3?UnOu4r MNi`N@P:TQI2Q!3b4.7ٱeҴ1K3[.ιT//-RЀF!C ))$ RIFuSXk٬Ơar9t{cEXf0G@|XȞg$;bX3rpòÓM8QPA3"c0ذ#8@Ep1&Tx!v;VvdH*&XZuxPw :L;Jr0(Gkis2Gc=r'U {UW¸Ϙ tQ;uOOxhlˏH0o3^'ܚ-p~ 0PvPw{#;oWΧyZ~Z/ o;ϏN]<[;?'B.y>Jw>C' "8iAfO/ svy`=BJ.LarWƯ+2o*uv~"g(@yA `F(b82JC'(wN1S̤",'o;e{&MV/]W] Y<7[cGH +Wf )M94Jr$l#a+I< N]ÇJS),R['-GlN8 \] f$MH[>1AqGYėcHFhd-܂Z臣Z"pyI욨=aDw3D -$e{s\nw<3.{^xʍm,lT|8NFXlw"39-8,ְxJHLn*ebwGL&S c_p΅~bOFw<'JIHT\{`,#GS`ݓ+4$S# Dqiqe 3&o{!ڊQ1t|(d83K%iL:Deq؎VEfr|K$aNGo<%^ۄS LōXk_ 7|S9NYw"JF#y:$z88"6gZ0߯XL\q4ؼ!t MHU9S#̠ՈY#SUs`Ӄf>(SdbrǙ#vlbȾĹ*7;'dB$(S$V0̎F1NqYAD}mC{[AdULM#|ʆ (aO87μyr%yQ q#)lԲ'.r@T Q2Ys O9J.jfKDj>g)sR3jO".68DO GpL11! jBP2Gcdu( .cۑ!s`G!(NDԎ+S8s=<0+X 8%b<0t:IHybMg[*'<{w_k#q|tx;V Jb!F)xeZV\H,6cB)L#j FrvP9ڏu!8F9C1c^-""y25ecY,Π C'Y 6HgT?"m# cEU><|;v`~OzW||Ɨ?_{̾*ʛO .eu|39QU)x{yhVw_տ#x|62g~Ə|_o/_ ߿o?廿=v>׿?}]~?ׅ39,30=#ˁlBr NJ&#I<رU\Ppf醓gzgrtwbPQ9Q`YΑs j/gBHXhS[=Vs Iy]'Rp6 _iw۔pq#+<biDQ!0Qx(1 (%e"Pqvwj?sCt,6&L-yJw'JVaqE:\X*ܿ?v aQ1Wû"ӰOAi&%GϪ N s c뎠EJm8A'`L3&ET ȗ'}CÎeOա.pیv$FLY$ASļ3H 6t3Č$0:*{&K'U=&TM*}HxL;RҢz#iF"B:b,Ah6!ӎ0B'CLzHKHT\?k>`]Фh{RPT*}8IMۿ7oG´3mۈވ4%`T &8?P HR5,h;2 %q ӣeù+(+%ZS`eEٳ؞3y6t2CL+:82VИIeSN݀?1 {axOm kh~@ORkDЍdoyׁpu3|j(9>ෝ0ݡqAp'UaHcj 22 X_q2 mYP[-n!ȴ (QN0aQq|wI)eLW8[)oS_p7p*%*_L)ga"ʘv y3cDt1t |܌&ƴS֣<7{EQB\igw),防84OB7>_66[ z;*U+h>H:fB2\)@L 6Hz멡k$h];yA@wva0xߍE|>^hic-ޓPn!pc_ÍfvNPUuY1lЦs~/8Q|eWf:Au8vd͑cK'[U;=zr?/]*a:qݱz pӇW|͕Wx~Q0rXS^_7lZX9wHbƔ'"Lm}r"Έ BW\(1/~[o\1|tv{bj7䉹x.hH֠=bbBÓ]acDԝm;2>8Ͱ"6;jS5ڜ#GY$u}a\v6}&ADzyD&^+5B; w%,v}i&O^ɒy ǺGN"lx1Қy/?<\$C{Fhw8g ́Sc}NE2ցL1 BG ިQS0 t #b85N@?ir}PJPBgZ ç1&nNӉ4cmG*9@%0F$F 2:C0وh§:FO,&̩L'Jwq S23u+UE)Lhx"S6t3t\TyE0Gw fJ0Nqz&n>ܕ=f Уgi>)o1]+{Yi:vL>=`B&iA>qYIV |̈́P;+zx^`1ŋP-q PՁx#Th> {r ;Eqc`L{[Xb14Q3_sr 9^_oP*E|jB)L^ qm{2A5e`@F5]Q;^#.P.W_0gSt0;÷Xޘ&mk'797X`'@NY bȀgtJK@g R͌3@T1r3z }b056A·c2|c V Ry= ݓNlcè;Xh?(<\ u|!\+tw̮d|؄ 4,mX2\1=ϰ>pL#ʊcn`=1{!$xt`I 2{¬aY77Ѿs³.)mLviOxbj36s){R`]ivfY~&lgyO2(bF2?Hy-|ė̅ +hD;s g􎟀/K2R#5u&wb)xcOPW==HASAÄ$[#Y_=˪J,\1"2SD\+!5(p%px[$j5q ܘY$gVlxF'$X.xS92.F89i&7v9, ^ UV<̓FG%H:=óJv A6nS =w.ƂCV/ `]83Se>7dZGcZ!E85Bq$lɈ]B D.-B%BR}C+3 [S spG  S/'jļrk;svvygLD/)t&;z9yoΧw(3w jba#/НV{-o$ƅtz0h܋aQBՉFƵ&PSWHv{+]]<X2&Oj$ =3ҿ?5S;XǍNXܺQWi4g^ UpXqt?XWLc(^Okw3,X6'OZߑ>+<1A0vG6yX(K &j' cdrޑAYƇxQ7x+ظIBÃVN-+3R`hp9t*fHLsS@\Oޣl`eĚYNs2-['n(b4ϽH4FΧ6 P6:)p3ؾ\NxgYykl`q0pg+q._q Ow;QzO_ӯzRDfN?v'GRn8Z啯3VYحpdS0sG}s'L.J6u~"81 S$u74$dX>X)%t OR%h$G^ @VʘOڰ|*_ԣ'g}t)4qymꨃ=C<+c|a7䙫1\CĜGDF#!yX 1ˆ/+@n6e|laz%V2> *+*:.ӁLtzB rA_w͈(Q76o&}`d*hR#3OɿcR_6{ ϠAnW<7FQ ^>^֙s Lf p+V:nV AKnWLf 3Bt' =1t`[a 36v%Etм@),z!CZ":a]Z"uFÍbqrZ<Bg֎uߒ%[*?2IWwoH=:>vzVe3z8ѯnJ'kِA䄳cD#LP9 {XYax2X; ma7 ]G|ê2A7Omo=5v` >8 >2+:_`m4BiF]팭7ܔgO8N!.ܶ;Kbsv) ]N`p-2ύ;bt5&U#_⧀3bvīhrgr7줴zWZW 8C ŧn [^ӌEeeϬFUyxsL7Ԙ IoT Mu@qg^7JMNW{lL`\K<`3"8saޥǒmKs{++{):(PI%]}$DѣO 2>NcNI3=we\7^8'S"U"~E B蠺CE3)4t+Td3 k1?Wt^,u$?(2`1nʪo{ҒB`Ckhdv!mO!dBQ# ulD}!sJ"}oP;9%3IQtC ;D f!c3&VLT-4q^_qgJ+/-DN2ɒ֩ D^@:9ܘbi~yۍIuՎBj Q )+A.rS;[03;ӾC%䩗5<w ^2=:qFWI:31' K!k3 T.x|N_n# `1#@\yǼצ8G6,_o|ʉuREolh5eL&,qv$)'n7t~PL,$"'GXQp$B|S_9r$hφox@ew5n`H0Zv8t%M!ox|>X_NښgCZ~W>A1'Wl&^E"FCqr dz۱^ 㤥2yM[VÈdu?v,Rx'Ý^A73- V.xNwT-)ʷ>7<] +wm,넏6Nf gVTg v Hc0[=aCB\K&'[Z!l JwZ2MB'x{ǞIivp;ZQsl`驰ZIuT6bȻ0>E['N7l1e{1?Y?d]@sB~ "} vEGUw/[!Ռ=w>9RA?X_av,JΘ v|ƁIRhF' m;/rv^;eϓO物apO,27.| Q.̘gbƜEI LRZedgBLxe!r!d#ONZ7,MLɇ$ E/G7'w7#Y6Yij*ͼ *&?F'j= 1=|['D>3ZQhXjYZ: (.̣ pf:бQ%\C\wݟL.Y6 wҼa[qM%/;6,@ӆ].藋lrK sc+&~?R#Ωi6y#ȋ`'"jGB-I5 JLL`A{91^t$Fv6 X M4 hOLuDRqFwLtLI$%Aڤkg&U! *D/Be䉌4 E7L,_ŖגIщ!@؜hKB&率-p=yDބV. %GdIr~[rQn_xv'pmՍ75_%~eyooʯ{__H7˯ηo_t|yKee}(5pol_"oe%WzNq۽,vIȭ̅{H7GZʘ&iNږ"nFˆdb*a 2ȩOwJjW `N+ʟCg{8v))۸br''.L ^.{~]HC9\qx҇rf!.N++a69I9Z&/N颰JqF<3 N6ɌA@h+py U :ϫ'n䘘mP%pSފ3^DO*0b=-XX |@lUس]h: d.lT&L?)"!}g NL9 +'s6f:>p?!3/q0!JOB_#Ft'H+ i! *,&5pB<^;v2`B((1zƝz/MFG+#4M>fo0PKVn[F l 8iO 4|R:VjZog !qH|ΌO4]Dž*~RMT'9zx;fĆRA!DC BȌyVEH+Pƒ s5p?'qX0f0^-ʙp m2ff̒9T9YIhH*흚dI|5ї<7#9w~<%933hsة;cDd9$pxJdZxQbtf2G|<#[NAd[zK;is[ygGvjU8\)!# 7Ew]UT!!%üS8퉏;e9c,,k2 צ=_u,dlC*(8]4#bemg?7EMXAV;9 =NDȅ圄;>P_V8#%?")v뎺n߲sU NH+3ʓ) cdëm:.BmeӰtâ1Bb{`i3fddQy}O"Ǖ}\>[VŸ)B SDiDw~Mh=UR4"('ZL*#:x$r(hvĕ:Ȅ/r@<.֑,E1dE)+ 3Ν1 ڡ15ЇE4pMfGcic2H92sWL2S*^9 IDATq[  rswJ{"l2Nni~ycdNKy:D0cD%` -_:q]QhД(!;n 1 )&%dV(&ʭ2%wT$Wr w&m|I]?'T) $GʶB7ogYmMUJ|: 8МȟKLEX ̆/B?R~t WH '%: ̲&Qd7F!s))7n?NyÂf\D7#;aD ⃯'s-Hr\Cgb 9WyoL8lnHc;ߣB$؉Ė9*9݉iHT$D H{Uʑ9uGDr&pHpDprb5.[f$(E',Z GGSBVOb%>!- 8{`g냜:ce@FN<G D9f*!' *A2R[hhB0f mnj9%F4N)!8* t!rڧ3.(Sqo8yߘI+U]C*.;7-qa ]_xL-$ 1L=Ĕpܚ+V`ɑX<1d}̃2־)<_\GgONZWgΗF*>'}sNF}\4兵L鑏p:Oz L,tXm4=b!w<,Y<{d(_ ɠF#MO~rYi`+34 ʸ7NAx1C$Z@9E 8'_M 7/e(sB^H׿?_mQ4.F;vqaB`woJX2j,9uy#c5M겱k`pez# F*ef'˃j)^]Njh:ڥz S;7&^"k[JK63g AO5L XUVܯ*0y]aD!d!vA2 ysh+%+?fBIYV;" )D%BrKWjBp0ѯ"E="iځHG#"dFڡ40ڈ?R=)fcV*LS*ƴQ< L}fe}K4 Ds6xD O =pV ub ]y1₅̈ z y υK[4a$eqbO[X`PeYXbEd2+o9;c†E%|2J`_iEN'̬)򘁒 9B~# )_:IHOad|$#v4a͠4ga8lO4 gVd$/>ғ0O|4Y:٪L-|DCXȡ]ZXIW#;'g$ <,Y5xʎ6(yyWdA[C35],8A qd\:;&$WȺg8$&̟Q@>*$FgJƩ l6 !3hAxyxi 1O}EX.ڌӝ*gNl&ѕ<:3]KGb14fxk#"fnv;1e'JʐNG$&EEv*Glɢqs^րhdF G];+[`PJ"iF x#'9D'_wÏH.2-|L*!?UQBK`Vh*89NCNEsԍ,6>(#1gB$Dh?[,|h,XRe襒=UH;vFCLh.^8ʴLq\7kR}#=)hd%kGBf?&1v+NE 9)S9wRx2g%yD =;0L$y|Ux)6QFsJ WBxzFJΦkSb1A('>Bb]"# MFH#atz*\ G%:S;!9Uw4F$!DH[b[hjBvY ]H B82)#Vu $x-myqy]Iux(Y%2$Dd(o7uin[`?Fn\2k¹<.q̔<}+b/&^#s6@1hh#0"%̐|#Z#r`jʰɭOF xNyNvMt>F2w hxg4+rۂ\g%;?BAh1|d|r{`o^)д?3@8#wGı9(,'JNpA9 G|섔QS%R:#6fʛzOF tpd`Ljl%\ r,5bN ̂8 9 7ɷ;o+h͘v|nL J3M Y o+15kr2 W+UW,=Zidq1OxIR6ۯ4_L]ɛl7lɘgZ`1Iv|éQʛdBiF?Я?9A|3t%ٍzv ݘJo$ʾn̹r@))N9`a NqVVkyarG !@u`7,Jy[ؼL3`jgCu)xOҼ!hǻmVNE:CLH*w-q-Fҁ9Ma;R%&@ LKߡV5cNK}!ÑR(e^R5 ? ǙWTH ܞWj̣rjkJs XE .<{< BLe8ZA?9SjbN0 4 'w46̅)oO +1$";2L H7ҚIźTtH Ej_5$aX6 lX1;"'T\:&~$b@D NNjOǂ7g'@ /ovw*LgBo rs"!Yp&=Xdx@V#A #a nӓ1tv>t#'֙Z'?nԏ\2(u쎷'ys!|HH7"N׊[5A]RTU/ hhy;HcFFE^܌Bm:Yf-?۠5I$14V{ u $| 8Ԩ,a&xc\$# nOr4ЖV$s6@f 9a &Dv.;'C5 x8^߬QQ $%AV!i*6q4˴ov_rCɪ70A"@ϊ,vRQ(ad5~M)z^-crYjj"DBLTL+3!AHB_ő; RT_rJ ;cHǍPl|' ;gU ՅJ@2l:1S(P3, 9Ľ0I$y|7>P rdN =ʀu!j#%@&kr2JoD8j;]7BF/Mĥ0e -̺i2M1"?P%[\ꙃ"-lgۀmc呝#e(N 4ZY&I9^m/'7h0c*q.HN0 '8;߼lN&`<ʼ#.)x,FzΙ2;(҅_p2'c$ 3_41w#O6֬qGO:;Ϡeg1gLov?xk tYT*L͘*r.k.! 4;[dAD, Pxˋ832-VNϕ|K8F7MI.B۝Q.0_LM(ޙRN,"NHXLF\n;kĂb&&2ꤍ-o%s KjrNa];eKL+짒\ q⪄>7vm6 IDATȤD`8}|eI!wF/\}_!RW$Г<b뉵@rA|B 1$_l]ArDvF*&Pу"Ȃk'sɐ3)$k&\:LB߁-2& :.Hy&h'aF+)<ę'5 :A,D(P,z05qN`-_-\ͩǒυ63ڤkECJlD(GQK>+"8N&%ݙؕLtzUޱ@ z0`LzG3q3ۋ -`хOY 6G(1mC7NĸhS4 EeL~.v&G#ipLJ(_,GOΚ3ڤM32x`g0vP,+g]KF(LW EeALȤJXfp@υ+w}FNA[{Fgg0RxCʮL2:<d&B4ؽ99: c-r5 T)H gbgczO"pƪ9xfeғfMY"54e9c$Jc*JM֕qGBp=h2`όGUؒ샛gVqjB^S2)J?$ *9կ{.e/ؼ<'{2d4yGSgX_(Ǽծ|ѯF !8/,(x_ФH *3iFGLЊM!*Ww>_]3CaJd z'D0>S̋PxBWF~+#5Wic.<#Jԕs4@O|qD 9`a%t6( ƲВB穌CWɶra;*Ο3jƗ?3 %Des;qhw*7Peg0_)ꌔyɧ)㸘ѝsd֚>_0m_3 =}IX{Ñ󃗝|3nM|!^Oy)~ĹuN[Yi­;#bNDNmxZ9e^:ikoH'>$ύk =*RL䷒2d, P2g72C)y#ñsT|<t|kJN1cUVxɊVu0,'w^@L+;,X:|J58Afjba+}ƩFA=hN=a'e"Ƈd^1M|9.cKJTF_S@Pz&/DQ{'}+,1 LnU2ԉ:DOch7|yBw.r^|ɲ+GJl)ĉc}CDᘃGgsBFw1ɫ]ڊK%_-_oPn9+pn<3XB!;k_VLפxvIˋr6覤ج]ИY>i1inxB,ccgZB"`BR :a"l}p4'/h%̡٤Jn v1i 덝я9]V!rVhjr#&MM 6!B` L/_X̃M= -x'\PC`5a$ĝNj1F 6v2&7t=اs+Bu>8mmxوkEKp,An\5ҳ-B۬t|P(x6lD4)GL#pq]=No-14cHFF0MV%U6J-U^_`1cq15a1M)N*AU% t?Y:S t/|ZO| dB2nImmm2炤7lDWWQv@曛jNOJ_ig\.+_{cON<zq*K'sES|\9 E1%J34WBY=4@QIPIbB e3NjI=ю`m FQg 3<3BigFk.Ji&R.Z @ou*r:=<Fq=r֓rBfGj"Pu0 yϼω|+QWd(=!.WД9_qPu#LG@vtVrr3Z9iDm] W?xJF~0(DKAGz/$ʭzr IrB A󃏪tc^sbq)hNq ̨_X_ ]!ot>b<>I;IV KDZW:IꭏOzl.S'纭3bJFwegR;& =t]98 sّe[0[Op) ,@%Q !D/hP޳33}h!QṖٜc|8l\NZ(n|LRNMΠi 0'*_ϟhK#۸#D$*,UmZHu1274qDL)PP*r%D8YsQ߄NJR&'Z;dÍKC8d@BvcNꁕ2eZ:P-Q_WؖWZQFg.u2V&G'Lgƈ #Z3.*5g*#$Ii,JX S.0<RR\7ke[9;.+/WX0xhr;}fb< _rPsP(2H(<3\ x΅HE )0DG`gfLHl%Vg\_E-W1<'G'XCw[\M-s xMuhH]ʅȺ^R:^~t޲dib?{@PN܉za+[F QHPIVȺԘ Fҋ!wy"ƊW.fY2Qgk"q_7k tv \7*¿#1vB.y2̐Y>I+3J KH,z|' kVh'H βΒN󯎇J\nː^_LoJ yFgH0QO'Sg牮IZx/.}Vb7 B\f#!Ts6N1ĥY";kU&;%㇓ܛOˬxg%\hlߓaCXbD Dg^Lxd/JhBHqeΆ[ ;A:K9*+A0bHj;1tb܇W”,wIXJCR´̈BwfDĊV8n HPdy`4zI2'q^ bhhzߖMdZ"͌ݓYv"S& gb$BWZIJ# ,Od',gw9[a17b3>q,JZ]z<(v~/6,A.oWkwc-u&B` g)MyRV,캳-<$o yЃQB'f経G xWFmzNθctRx,NK%$u2sInJb-~e~E,N"@Z#i33 Iبh5ڙ(geTA[DtCŲ imtEV|/[I%s\Gw$R<1?w҃N(&nw~:1kv3)|fd @xPC'7)@-J :BNreͻl8=≕nB|i > -/z\]|ydqb7|F] b'"a#bWF28#= W7s RO_`gd' ^!ڀ;ş\]0]Jx[owN3,-&~>"j'c|}~l 0yKOO!dS>ux-|bf/]<@5`q̭("^0`O Nk]Ld$cBڀ܆2?n' bpL%Hgo1SϔiMoE.XXf#1򭽒%R z` eXW/tw4VJw 5:9VuWprP0 Y^|b@B4WA4A.DzXKⅮa)qPPҎhV"XGgcf+">#osS݈4n`ݜ4w\'3Bvwx||@_]8w4a4ecH J|\{gְP| Eф3u!|4F}`wV4f T@1̎z/Uafِ|"/N"-e/ ̲S/Sw %n0> oo\Γa̿%,I|IC֍L*vOXzb"r@'~%0 r7HN=~7^^vT"GH Y!faKS{ BNQ^$X)"o7AA%Be[1cBތ-*+L8.bxh(FSM8"Vw-6;EoPĕ -߸g );?QcYcoD<81@`ppgX#^ 7Gnch1W2I=$«MBH9x 'K"#>Y+>f ß_H P, tau%&tp" l,x- P5T< c2#0R\" zmmw==""W#m E>hF4f,,^l<9D.Tam<àY&/hP'ބ;C8")LcVy\cC KeyE} f qRBT4wf8wT)L DE F_7OBqңE| }}Q,[#5evGF&~ֻx_Fݿ39SM]dh~@ ՜|%rNF8(_ENrm /jM0=O<"A+LvmĴtԒHl\SNt 4ڍp{,6Fy#̓M#d*#a$Z2?W΢-2\q F`LjxFuj%r< ') ^ Y IDATIC\oEB(x3$H4a;//a;YI:}~񐊯b"<|3"4f$ Jҭ资Lj/ +0N"> Ya%M9x FOp.5Q0],DIx>y\Г%y#zOuo>?a}+ ܥ-ȊO¼5Y#.G_G]|mƌąL/b 1A9Y1C~1 eJ yR:Fa|A_#TILSԔ"EF@eNo_ 5aa3P@WkC"hA+3 r4C=]!`E&c8"^,Ildod֗#v*NKPʑGJ?)\!2:5I蔬؊Xrso[#MO 0wP_GwcDһ;v7"bf*$vv_WjKhމˑ˰QQb贑Gb C:_w΅=!?+cG"̀^ªߞ9yNP!2 )v-c3EhDyLeO|-llPcb_J\FKs'b!ʃ-F })ΞTl~!o} /NgD(' IYXP w\OD'MN-o-=U F|RV4*D?i@A<őpCSsF/8Ë/Z z,_aLPw 7, 7%._eTׅl#ʍ'&!4 Q&T՘+"|Q-ƒ:#?!톐 ͈.V 7\$ 2Jx=!]'W"#ۅ,wuchP >Z+?ygdE뛘 Hܨf)JmτX勃3a)\!]RSz2UߨׅwR `q@:ݔã1ˎ ͈.`V|vޒ2&Li$tE:V~cgΖ2%O~uV[l+685"+C_|J%N:3W8ka"m %? 4[XWdԀvJTn`C \{ft $k]1 D(Z_E6PZ`E~=" J';!o"#nVgԯphaP5ڍ /F}îAvsAh߆`M"ňFOᅢŊ"5g ?)'G42!'!c Mxd ޑヸ-z_d< i/Ft٭~ϊZ1V|lD\HU0Ld Bz& 3OT9wLFNhRQ "m#hq9&`J;1 h=qՀ=3@4?LBԀŪ+C3dOT3N06@W''o&:&/۸hE6HkrR[uj\1StxqR.)hoLH_n<6aEk8}J!|8)%\@1loW'J'9S"qїbTyJ^$$i0kSF$H 7 Fh*-Bv_(,)!D2+;Y?p$yN[<#UM [כR#.wM#mM4,PI42 ả}-R8mbYL_om c11Kw{0)/sWX\dg]jIsD<M>dqC`8XV!½q#o+_dL)c"[pNe9qLCrg? izcM5х\4Ea_ IFƌ2qtaջ€d(ΰL+%OOgCLzQ2bo ]HcmAH29lSsӽM0 sJ' !$({aS/K3t.R8pHɸY(7$F04|B( |COjjqǝ)|d\ vy,d\uuv+Y%HW}1C`>25*aA]և7,ϼzl zKbh3vC8c.TxݑA%7UaΒ.6?Oj]y]?C$;vOIsŠ #M3FLj \'3:rj2wz.t6{ =R Z2~XoŠJQc҅?)K/bIHFxeB8CdP8Ss.ɔ AC{R #Z²[@ӖSe'CR~TcӝOPḉw0]Z(vIENDB`aravis-ARAVIS_0_6_0/viewer/data/aravis.png000066400000000000000000001122441334570641500204320ustar00rootroot00000000000000PNG  IHDRJ_sBIT|dtEXtSoftwaregnome-screenshot> IDATxwxTULzBQ:@,)*4]W]]]%*zKBJ P{dr?bF Iy$3sϝ{99;* a>%Ksrr RTJB!AQE1TVV^|}뭷tFt=SSSCmm-6-B!jj5ZsܹseI0*--j[S!B$t:ϟs/k~{Npuu !B`0^\\|\UTThm](!BqQTTWW*** B!7'FSVB!7/EQtZT!BLmmJmB!B!AB!9 JB!IP*B!lNR!Bas !BT!B؜B!$(B!6'AMڻ?ãG3y]^uUTTwZ쟞|ѣ }ѣٳwUC!n !ڤ?ǡG*++\zz;z4;v2y} 8::0`@ZB $(B9UUUع>{9.Ӄ[;h#PصۤGɓ9l:UC!lexh{B{E< ݪ뒠TOyE3Mglݾ^oLfxhV}^4c'Ld+``3K8m:~www?%SN6ؓ&2f 6y ~EQ 7FDŽ)Sy?_PР^^я%'l@ȑ2_2^-yO /BAA]O2Jaa'N$r0]ѣ(wNʟyػ?EŌÿpر8t''' 1::G`ggCg&M`{2yIM 0 -˫U Jm&77__ع{8^3#***()-ӓ[o#ƞWJEtԈe

\aqh}NΞCV7ٽ+wNJ̨Q&ia!V">1" bܦ 0% !DK3oBΞ;g4Yy +.rM(**">1aCg[qoPlfO2:zhRFaOH-4y *`srɩnO:x$$?!h,1+[Ίޱ#Mnl S*h3m`00!uOO"exJJJ]ZSسoI;`|}T޳{Bee%Oýɲ1hCG5wΝ1|8wd_F^(**"#3W@ %qzvn~+8('N0hckI~BRRRֵ+w~Yr_ȩV] !ڌ-q[QՌ mtt4555l۱Oq#55/\CHPp^~}h>$<ĿW}gNc?ӭkf?ftȆp~?c:ϤOٟyÆ2hIZKB8oc\]QEQpsu?~}{Zu]RR!Bؔ !BT!B؜B!$(B!6'AB!9 JB!IP*B!lNR!Bas !BT!B؜B!$(B!6'AB!9 JB!i  B!nrڊ [A!B%%E.B!i7neB!79UffbB!B}/B!lNR!Bas !BT!B؜B!M%aSOsX2jkquq!88aChS@Tdd~ ΤRRRbޡ#GkΥ}NDKΝqws:II|KvNv+R-6&#n6rrsqsw#0gYP\RBaaa+V\R!D{{{%)aK8:8PQYy]ʑ aCKmU[9'm?qZ= 7WWeeeW#3;;9VZ-(-.)a=dexzxVBiNNrI=AѥKg&~LNn.UUU8;ӫgOngڥ3ee梳WϞ +|t emC8~<$%q6..{\' 1:|3`ooO]3W?!,QQ#-GPP ZAIfV6;1&&j'==Z6GGG7-e9 uC9Nee%^^ 4xً%m[sǶEi}gggG#Gb7[ }mm-} {׮FB c)*.&5,z0FVW#9{q3iT*zꉂBdg>ݫ'AAՋÇ3py6o[.8884_=-<JEP`:=P,JI[tԉ3lݾrBXÒs-?t>Ӈ¢"o\6KmqޝZ~5;v";'@ޞ~}qs˯4`UCXigSYYIIi 3Aj%4$slۊǒR-x{ymjW HH<&JJKwpppFMn^>u?NkUuZƍsNK?/IILe ͦO^tڅ nnn-Q# зO^g̨ 4*S=˯ktܙJ 77rC>}'A_Zi-B\ƎO^dfeq_pwwcx{ympQy25Vۧ撑N#__4 n5#sSeff4Ld„I׻ 9s&~~~xbgхB!įEPZQQAaaq*--5M>ݻwSRR¢E={6%%%&ggg3ydΝˬY{$''k.6mo}]K!BiA7<===cL$44;;;?PYYIZZ1iӦѻwo^{5y!<<zoB!h'AeP8mذw^ONHHAAA&-bϞ=DDDhHMM 00Xx1qB!Dv6%--1c0~xxbyxwHOOVKYYTVVRSSÉ'&!ByPm6z9s֭ Y|9?SN <<EQ8p.B!hDJHJJ"11,.\`^{5b֬Y̝;dHHH`劊Lnjjj !B,uPzc1fG c,XEQx1bǏˋdC&7WOޯ &ɓ˶ !BHTJc &2a¤]!Bqڴil4] !BB!$(B!6'AB!9 JB!IP*B!lNR!Bas'*B!=ѭ4)B!6'AB!9 JB!IP*B!l,S\0%B!'=B!ZZpLӳ<5֟gJ`vjMdW<48Qg{sTx3x_v.V"+w ={&y9kyp}Cת8Q|b#2VO8xeSVUkQ:xw7}P lnϡ<K[>y5^j",;.qo/o`Zk]&R^ĝ(&oՖJ tR*mP"T09ƒ\kO x1Yg]kE^hߗgz5 v4T^]˱ b<[R>_W;ovvp7zH/A:.TO5l.Fҿ3Zm'KdO9_=օ /g-G.\f b@g>ߗ_]eDWW<4\vuuX8UTV%{1T+ |X'2+.|Ϩnx(Y\^&,<_u3{ '*`[6 tҲNơWܸk~zswy$ʗ0o{ > 삓NͩJ97|J\7-b@'Hɪd,2~n6<,1-=qO~i9Y?d?kMW 'J69eԻmizKk;-ת|כ[)m)b_skѨU)Ər[|B?7;"0s>.Z.V<]ՎZ3h[T>FE0'f d,v*:z;ڌ:9p&jw!Ew*amk̄JjYԼ0% _%ɵVՎW7f7(:# eŶl>ڙCt7FL))忇 ((3n@2*kY8.kұתFz}\Ev'F?Т,=_GW^\r3]<*͢JUxob }- )w#yu'XojaZ*,h|Oor+ ދ&Y}xij0s>=l5;j NJ_˻?g_V#|x`Yc啟]=UMe.3 W-T_go͎X~wSu0vXҶ\]O҆7TP hgrxd/ΏNJloԨU8ؙvU(U/-_UӨ)am% syskqsPSQ]˕pi IDATյu[R>7;>J9U&C'3++bKSyTkڃ)%Ȩkw*avPwpg(2P\acE bqP drjڣ%GF⩣dH|ۉO[ݷA<9c/\jӥ,aVy9k[Qzh]`[6C;93+eM}w<4Ƽ;/c76>]SIlW6Two;Ylܯܚs:'ȑ쒚m0ʑ{?sܘ*Y5yzY C>.Zq3a.揻+T)3M}v>ԩ{pҒwٍzN_F[wHg?{ͥ*J=#smtKYF6E᪂<1o/ὸ,[ث~|9/L殁c&)Y{bᥩj`ݟpͮ/X'.kL x9sJUuC%Uu׋fq.T9 €|ŝPЕVpט-h=Uj_5P>؞ͪݹ՟6 * ce^Mү[F1nF]wtjrJj` J{E]jՆ-͎W_7o=Y̜~<ަ 945&t= _sm-kIiۆ Joph^gi + uw](_3gߙRtp6(>S4ףU8vA|vj;\RsZ\>oM=^I dQTtw0 V8r],:_35[#+׋h*9ԨUtw`j)5F].Zo(ԣը/3ƚx8iul^UŎS%Tjx9kqњ m-*A^ɮLy};g3 {N|{eJtrasr|C;4ZnohsmtkI~c.ZUX^-'WÍP/nvL`RGZؔTpguvAU1l;aٝko7=p0o?/Ufw#ZN:5Yk,Ə8کuղp\i_B)4%'FNSp n@PXax8ix8rN3wnvkUƻ[eZXn`ۉbGg{5AAaJ+ wG 91K/aRFNM0'5Vg.4jU3tp^b9UIJfU/Ux0;몭{gw˂tpIW_N?NdVp@~pu;ؑ'ÍwlJni _%_울,\k.ۃ CQymϟH졺gDWWz:031=8tp\, F˹=PTͭՍ=g3kbQ*p(_$H|̡,jcWϖlFbǁse *S jxt^U_b[*Ceյ9]ʧ{sߖ̓#|yijnrK|{Ô[CbZRN)mHݟ;aP -˒ݟxp/^"RO;o͙<1ڟI˩"lM\{Y͙<2җNBA5EQ}:dMm3]舓N/yiEm1(,{r`o¼u8SµVP!bfG~-wYs~*֓Uw\ up39£Aoג9=ky җ EQLN% ԕ]DwwP'j6-b:Z̵ͥ[Rm*339x0N5і>%h(SLJ=;p[3/Ҫ?c+NѿF ! wG 5U~5BqcT\o{tANxp(ܪ[3/!7Th*ّ͕>k$]8~ͥ5BqskJB!\S*B!4 JB!IP*B!lZR!B!iS7KOB!9 JB!IP*B!lNR!BasVTO]~!BqgFكbŏYT*kV'B!npm~~Ĉ&~~~(Xt)999dddG|r֮]kb5kL8N>/'OFʕ+ypttl|ii)f͢8;w7믿Κ5kCRR555<峳gϞ8p.\Nkϱ-kǥ!EQϏoA~ **C/Ɵgyop!6mKjOZ:533 6pq,X`233ƦS4kT-[fٳyYU9;;+7o|,QZZT*СCcѢE-ƖonQF)/1Wݍ_z%eƌFsBE9pboo,_\ R CZr~~WJ``ȑ#{HqqqQ-Joz|<䓊zj3f( .4::566V/lFQg_ӵkWr*͍p\ qh|;w.wfÆ 2o<2qDhtlذe˖ꫯuF16s\plzSÖ?|ʕ+8^'==uO||<#Gdܸq$%%2o}y/^OMMU%??ߘ[o)QQQ&z^)((0jkkJӧ/-Gw}Wyg'O*ϟW|ICJEEEon"eʔ)JΝJ7NREQ@Y`rA%##CYbbgg$%%5I[>.]~eee)*J9|p>}|\dҽ{&n>MKKSj(rw^EQ4s)'O6T;c6KsIIIQ%''GQe֭3g*ӧO7.((PT*}vEQL׮]+gΜQŲS'''gUz}#{>>fӛjg=}4jϥ1AAA k;dС,^otzqrrgnv}jAi=FChh(*őƘ1c?~Çӽ{wV\hhZʨN8dy(&ӕ+|Ǭ[/;;;<==o;;;O\\Z JEǎIKK3+00K.YU[;.4w3ԘXRSSߤI﷔Z{[?`0̙3Mo1Wꆄkkk[PT 668qvvLJGy`^y-nծz`0(++c۶mу9sЭ[7\]]MUTL2-[믳dɒy( hr&&&_c,Ο?O޽[-W(b|8'''Q;$'Nr(q)čK.TWWsԩeee{nO?וBNח(6nhL/--eǎL:lzs۽{wT*z;͉Gᩧ4 Y|9)))-Z[nlH{o(#99y摞Ntt4~~~$%%HVV .4.),,$77~cǶx 6PZZ5k&MW^s;::2m4ϟOJJ UUUرc;9̙Æ oȑ#w}-.K{K!nD͝o̘1yqE駟#00!CwwF{عs'/s%cݺd.]ʞ={bΜ9DFFop1spsq}OrY,-/s…=fƍעiwoq%R]#[oU\]]'T[-s*Seʎ;Lq֭JTT 6Lٹskǥ77ETwwweȐ!'6\jSywEi>5 ʊ++2vXeϞ=&y~ʀ???I}nIzS[VV<oFgyF;Lƞ5(;(@Sh4e˖-}h;D&Lh RxxxpY:vh|}+B!Dq)wNnniӦ ?ѴVyN)yx+ !Ai뢈UEFFZ+ #FfuB!heIII8pI&xw~gFͪ#o׮] Qaɴs.B!`0Xf #,,?*$OB!nB&֤^!B؜B!$(B!6'AB!9 JB!IP*B!lNR!Bas !B*(іN]~!Bqك(-^NRY:!Bqk#F7lvz JŖ-[LMzjׯ( +WdرxxxٵkW橭e3ooo>0ΣYz5}mt[֬YÐ!Cc̙Z~AMFhh(L2T>Q[>.YYR߶U#F09xIܾEQϏoAzΝ!;;'Or}qww;k,.]ٳIHH#** ^o0==uO||<#Gdܸq$%%2o<{$''k.6mom\Wee%=o&OťC]ZXXHVVW&..)Sq6ow}GJJ :u"**R^|Eyׁ 5""ٳgܦI|ct=ʄ oxWxSa0=<>>[IsDQWWWٹsged'''ˆ7W_///?0 &9s0Yn_~e UXZBSԷiii3ŋ^Z2*++'N5 g ^ T*joM;{7io bO?pﵦ_~gkTTTX]___ظqRvԩSͦKLL/0^Xǥ7+smѣs̡[nW5(8peY( ڵ+555~cǶuCjǥ7+sIII$&&… ^fbܹ$''SUUEBwaQUdT5Dr/}4m2ͬ2-+iZ.hV"&2 I;yyd.8{Ϝ3~0gڵk BDD:twwwu7n@RRyr 8?~<>C̞=/&MT&g\t Oxѵk\oNNNbŊy1 b͚5}BR 777ѭ[7Ru233_|!Zn-s=''N>m\gJXYY BP+++ѣG:۷o-[nnnbȑ"999G}[>e@TRXXn]ߟ̜%Qe`oPTFb޼y[;wN!8~q_ȱ'LKKAAA[___fOﯠL/8|qbK8;;^z{ !E VBquaee%va7`lTQaaѽ{\L&3GGGܽ{j2>ߧ#"""h" M2O)kϟ(/źϯXwm۶8QWPjzQ%Vn""""$PJDDDDc(%""""1JHr DDDD$9R""""C)IX4kF3u(׌>}B"o'ɊSUpf^VF5`ee5kbȐ!yU˗=Zv܉֭[ #F@bbb嗐dP(G͚5O>#z۷o"##sd Uvff&~mTV * xAuYx1d2o|MTĉ:Sl풨<0 X|9:vgggk׮ͱԩQzut u>|Ç...ٳ'222Ym۶I&dk۶-r9ß9!Zn Lf'}hCbt„ 8r6n܈7obpuuUᣏ>€J_~AAAXh.^ 8*]rZQFA+o>8wn޼ WWWQNCTT ^yBpBܹ=á0~gC̟?۷/]]Z]tu0n8>};&LLzB5 sѣq9߿bcc … qf̘*U(6** 3gsRĜ9syСCr)ߚJ}hC%r{:_@SzG-Vy{"mckk+9Rmڵk'$agg'Ξ=[3gAAAQj!ŋs]rJ-z}n߾7oq36lx7Ō3D~[YYǏ8K`…Yf"555;!bbb\g޼y9>_Vgr?'L"T"Ο?o|`0VZ3g ƍ*-}Cs͝Q¤#Ƈ)d2w={{{̟?ՃJB޽qU=V֬Yc\ƌQJ%֭;w8'O^-ڵk Bkx1F777xzzw1yڕ+W`oo͛7y qqq 믿n|MR+p9WC>}:|||ݻ#""") XXX@Vða UvFp-LPe2̙iӦaʔ)/޽gϞٳgѮ];tx@߾}q)`̙=z4RRR&M’%KpMC@@t::2d233q5ꫯ[ll,z &`ԨQykDD,,,~vڈ,p9xW:.SҧNpm39r666h֬3ܹӧOcĈ.{̙ СCq|xt:L2| \]]s ֭[˗/Fa_Q%Qy#^wTرc!p][s.->G3g ܹs1sLT"﫲cZ~8>D zQM0x"֭q;' :M6EѩS'tC+F ^@֔Vްİaàhp㾾+oΝ;_zjo}QFX`!@||<잙@R!>>кukmk׮իWѬY3tcccuV_5Jk g?##fŒ3`oo-[DÆ PuwvvF&MpYVZ8pqݵkBcҤIN`ذahӦ |||j*\~G_EQ%Qy9AѣGWzz:4 k.ܾ}&MBqUE͚51f̞=?3޽QbbZмN@VC ů7n7׻U^z666ơ3gΠo߾B 0BLY#cP*P*xwc3gh֬a^t NNN9IIIpvvZ~锔L ^^^Xd ?~q 4i>eB|wƿcǎR#)) [Frr2=zٳgcn,ׯ_/﫨*R$*jժQ# +?4F>|羬T*1`4oժUѱcG޽@E $$&L̙3s )T0M@_:u±c_;wcǎ֭~Y[T5kĴiPzuL2S}Z r9իg֮N8cܸq-_pB,_ÇG޽sI7^d]޽{<7111>5jTuAFF_gϟ?ɓ'cƑm߾]v{M.CǏr3f̀A`۷oDEEhܸq_%QQ%Qy1}t,XO?y󴀀9^O~ǢEQ`ZPN sϟ #))ItYl۶M\vMܹsGXBXYY{{z*ܦɞR;wNDGG~[Νu_BtRQV-/"""B͛W F#Ξ=+N8LyBq=amm-|СCM:uJDGG!C] P&M)))"""BtUիOtYDFF Z-~W+"&&Fx{{sY^/_c߿h޼~h4bʕNܺu+ײrIII"::Z[iƸ~_EQ%QyjE۶mEfŽ{˗Ż+x!DTEڵŮ]ĝ;wĕ+W… Wnݺ%޽{EZZXjwBYZxqcN U CGߔP& υ$ϟ/Zj%J~~~α^Q: z-RD5ļy󄷷w;wD:uJ=zB&b͚5ϔ>~~~~h=ie˖M9R$''z DͅSN-III"00PTVM888֭[0!SLD*Un:'Ny_ى"((Hxzz ;;;ѦM(R)F)<==ӧ3./U]/[vvvOα`k֬۷*Jnݺ9~_'O4.+vHBP+++S>B,::*ׯ" ;{:*Ɍ&&&wEZϟ툈r9|Zh2S wc%""""Kx_wm۶)*bFDDDDr7%U< DDDD$9R""""C)I$PJDDDDc(%""""1JHr DDDD$9R""""C)I$PJDDDDc(%""""1JHr DDDD$9R""""C)I$PJDDDDc(%""""1JHr DDDD$9R""""C)I$PJDDDDc(%""""1JHr DDDD$9R""""C)I$PJDDDDc(%""""1JHr DDDD$9R""""C)I$PJDDDDc(%""""1JHr DDDD$9R""""C)I$PJDDDDc(%""""1JHr DDDD$9R""""C)I$PJDDDDc(%""""1JHr DDDD$9R""""C)I$PJDDDDc(%""""1JHr DDDD$9R""""C)I$PJDDDDc(%""""1JHr DDDD$9R""""C)I$PJDDDDc(%""""1JHr DDDD$9R""""C)I$PJDDDDc(%""""1JHr DDDD$9R""""C)I$PJDDDDSeU"""" k)zQw<=I$' !ҬSeaa{{{T L&uuFCiBB<^z֥X9zWtUj*==W^ABB<](t(MIIA˖/@IGZZji֩I]\rԭ닰 DDDDO(t(0 Y -DDDD9:'L !B{HDDDTx=IH#<RO""""‘R""""\Gp-թE5ЪE t*o:~q|)R(-*!~wv@z&2:WFտ=6x\.ǏCӕfr{[U]UV6R˯pjy nܼӦ"33Xedظe xVthoGb틈 FJW6G SÆ F쌸Gpl۾za@>bi)u*"$(8vdžrke2B.G;??lv-c\w_Uf8<5ؾs&5'O.~ *+۾i+0@$&>αNNCzz&Gl\,BBO̒nQXd)4nSIODDDTٙ}tL z L0j:u|?; MMq%*|"p^oJDDDd"&)qqZC_Rs)}`C:hzZEDDDTY|G Ɵ}j3q}yo7ngI]"""r#U,ۥ^wU ey3%o^""""*!_SZ"]8\aly54MQL>RڰA= Zթ5+ڹ&MVQeakJT*xy@FF[#@0l$zb*Lͱyz7m23HLH#P : B> {;[ g޼5پR,T9%gQx{ybqhe$%%"!!ޤ'"""Je|:uпOv pG~o4lGG$%'J58|8ǵz^:}occaHOOG\\IKDDDD9J(hHJN܏5ݮӫѣTjyɾnt T(;쉈JQRHIIoOG}__lشiiykkco׻w3ɩȑÆBTDgLj $$IÇ #ԅ Vj#ْ`aan]:O@OXZZB&C -4t$%=6I)}8x}žCbbKvhDDDDIJԓ5R*/$""",)%"""":ZXX@LƜC^E """ Ux0..P*JN%fTѣT"uUJT&`0@.Q.]:V[f,*OO/oRW#WVVJxzzI'sendQ+5T-QV<ϸG&Ԟ*xNjUg888'h IDATNH j5"#NNU\7tIDDDD&amm ww|)PPJDDDDT0JHr DDDD$9R""""C)I$PJDDDDc(%""""1JHr +@K !!RW*!KKKT=!ɤ)YttTzBDDa(zUJm »Hr)lDDDd8RJDDDDHi%R"""2w)%""""qH); ;v KZn|P(剑Æ0 Oء^aGs]KDտQ˿\ ++Y^G?ֹ#F "WD 8 8wo߅j޵svtTU8vv%ڸe+~hҸ&O%kODDDTrfJBhZ=-\ kVAOn%yDG,馭p?fzeBc0__z\v ?Z5kϯeTff&I3r8ԯ^qb؞`@TT 7aZ$~Dȩ쓹ĂKbZ2?."""ɬB\.J84?WNveRGh԰!\]ˤ Ş-,,4m;oD6mU~I|v5zt:][?2Zoj9lXxW¯_@^G|缼 U(͍\.Npi=w/%SR8~FNVbu8v ^mcFBQ.[G;=}}|dgĦz ԩjgP|GX~ݿ]۶`Qد?xYS9~.\ 2:=^X!!'O!1) n.=b9p@^}вys}<}z@@&}υƯjHKOG 3HLJ3 6`b7 BN qK@m1reЈx{ذi ""#5x=~ܷ͘1;Uo~9ܻG^݄YR!Z-~?ԭ['C $vًCaݷQ]: |baȯٟJ  ,{Zd?=u͛tGprtĦmauV"##WU:􈋋GKK`6~w&OqqDV]6/m_~}z9K ZO>ƆM[p?2s?@Vj԰>W(YZ j52u:\2.]!ءFW-[4GΝb xR@;xÏBx,w|5|(r\ !CVq͈2P}u}Mw|ت%ڼ^ GjhzT(xD1/B.5B!^tvv2k?_GZZ:@4uQu$pI>d =={쏱jR899rܸy k2q4΢Y&V*qM@zxyz樟V6Pw77@Ll2#72ǗuS;~ojoVҲ ߲ wE`%bX[[=j5 ӱc0x@HQ5""jT*lmm  ˟x.qkW^ye: LFfU˖XgؾeI[ZQQQ @puqŕkٟG[j2i/a{: yk{;,,,r(B;3ǎ*7[P;n޾m|M@zӗ\.F+[̟g1b$&>V,8zwS}FjjV0BFF5l @KK Zkagk]:Ÿmp!&ap-rfl 6medeeZ\n;?;[[nn0?w=8u` .x> pqvF^=Ѱ~}cBrW`c'܋#֩o׬@Wt#ǎǥ˗Ѵqcx+[᣹"5-}|բptpu)ORRU " NjXXyԭ[뻺G7S㙙HNNF5jkcc T">>8groL[6¸/LX[[C.C#%%x3=3${{{X[[C`@ffRRReAI1gii 77w>YL&Jʵ<27E&"ܕˑR*\S:?ǏϟE =[B1)xf'EFϳd$''9-PZ M& E}DDDT0VBҒ{h|2-7J,GJAoGQb(;iqhZܽ{#""DDDdJ+^IDDD採H); :.$DeMҲJ+QPZUꂇ#JP%hQ << 1 0K]mP<<< 1Ytt/8$""""IɥC)I$PJDDDDc(%""""qJJ ..1jRW*!++%f}mJmUFFAMT*N77J[FP*jmKmt6Qe\ll,;mRDMcmJmUV VaMS*jLOm2Ѷ*+R""""C)I$PJDDDDc(%""""1JHr }]zĒCN5I v &_Y)~\;wD֭#F 11Q*6+S BإK&4=R:bپ;m9yko0I4 ~wMt7m݆OXrs/ ((-ŋ>}@~ -N_¶Mms@TPTBR1x@,]I*ecc훃Mtzz}_|9s}ϟ / q툊m̙9 DeءiB2\Nʵp>" ھƌ"K^KőcDZ}s0T*zAzĦz ԩj0`!'q?{x` ֭k] BpEn]LP`yN;v!:&NN:zo~']֫Z6o>dǕqO٣D8`T*o>vTnm9(N>ceDrJ Oکc뫈Qot2 k?_:V-a᧟~RRX"xk*U̵ %|:#lZժa}:0m$l իayY 99oMu+W>3?%K1_ܺ_.M7z>CZ}?O>6q) 4jXի{+*PDD,,,Pf׮]%?Tضd9t4Z-v XFA(_}Ra*"sR>x# {C118";;[T*tΜeX[[c=ϔ#~E_fI̟gq"$ݻvy|}oEKηthF &Na#~jz{[^ M7-lV%iE.77񰳳1 d(ݻw$ePݺ}P~Χ5vO~R)mܶs6nl\GTb꤉;s89:P[2~i7"*K#A@z}A 4bq}^oO^&Cr`d6WMU'gtB-[[^Νr1e t}\eq3j59:<¶M>P /j6/W7QէyyV7I_ETJ|kݺ_}.  ryW! uk^dLfiVzd2Yrq~w'bڹS+*5j@#"""i[n; (Qa==J=d#Oc6/lsrcgk=_}*T#11ijx#drڷk[:_T$&&aը[uXNSgV"99<>2q]Ո{Ȥe0+p!4%Ϛ5 sӧq͚53¶M >I:˾YbhPZ !D*(Vy C*"sapAǣQÆ5{.K6e0y zs<_sӦLBzά0񈊎҅_e0* &OŘa00oS)}b: ￘9\h%(8W1qt:\&p{XlNMwQyM >'۞ 2 S'Oſ.#$4@ñsv"UDBe_k!OĞ﷕_s܏fϗj9 ,Ο!` 4'BN~TiA[ \^}X \|P߷.;훃T*1nT={DDD0`zts."&6ubzdT_pi=w/%SR8~FNVbu8v ^mcFB{W~ؾccb䈀c@>eyDE2ZթxcOxֹ(>ӦL¶oYZ[E/BJ˿\oM BF zuDDdjB)xkD[Uy0 99t4Z-v XFA>_:V-a᧟s-3c,\έѴq=PH)m֭V{ZmШa@ 0l¯]Cƍ(JL4s'GGu+C&!:&/\agg Jn]:ԙ3Կ3թ&vvpws31C)c0oo '$`Ø9CYUmU'gtb/k݇QѐYcyIDATBDDf^lm^z _\o£Z5@Tt4`ЈQuzyyV˭_Ĕ3ЭKg sJ 7Fgpt^!SSQQD(Q(GF$ض r]fgkOf a򂯼9Ocѵs'Q)5 h4Z L[w wʇ$ֳg®^GaCi6Us7nwOcd2E,l3 6o1qC))9%cuC& ޸8::jzB|Xq`_0NLDd.]Djj*bjki%NòoVa蠁6x ԫVC{;;t*^#33opJn޺Ndmx!Te}DEPCcM|2CxyV/xR4m$x{{ax\ f\pJ8h!C@TBT"55ݻwRDϞ=M"m9xqb0 7gN'a~} 0u\\&G 1k\< ,ۏ>;o7mFbR2{?5gϞ%88///<<<5j7nP 4i^^^@ffR>o<4 O;GVVÆ wwwOAA#루8p 2`~G222M0m49sh4>͖c€`NAP&C^e{l\wr%#?IFq\HI}~^kK:wLrr2O&--H|lٲ͛7d",,L)7 9ɤl?Rܹ3-ZĉMi?şs4.v38˱cǸx"գҠAb1k2z*ݬ,fΜI׮]Ԏm{P xN n EKlRڤp^k8q"&LP^߿_]#"" Q *ʕ+i׮o[n6je>}z׋-vڜ={mۖ8~۶mx{{+eycwQN._l.ǘ BY,hm\dxkFn2p1'OӃ7cW_~-...  filHG06׼a4_q0x{f7kVj[: nZv6nnA:8:0qҿšKh1пW\^zVZq%uNNM4Q^ ˬ/66Dr ]֮,_1ժU[ gQݦrttPjM:t(Z흉nbb"{~`6mӯ;L>͚5!oo1y{8$=f3|m{j֜9LE|| >Ǔر3|ܺe`Ѽ~c"kPPXX9/[ARIf1VE)Nc!r|8׮,7=w>A dˆpϴnU_R.:ikj>>Z3g|7$!!9Œ34iRn0N:t֍sw˗/c5kmڴ!..Φm׈W1eNVYGƍ%k߾}J /--Ç3|p|k2?~<^7rBe͛x#b.o>fq֮kc޽; aONXv5j3j؝)k?Ocqv /ɷG 999wq. Y&n^<?'6 iMYh4<ZwG;.1aK=J=+ PAٵk{eĈܹ'NPZ5ڷoρhѢ֭7(QOjpss#''FCFHKKS&++ȻDu]wl}~εT@İm6N}(eX,ԩCnnQUؾ_Q̙ҮvTgJZ-fw\<'1^^X,R/^,gԯFR>]wށL?,Fe#dK=?ӭLVlֿhtT^Vb)nes&==] ޽{sy7~_g?2bh16_YǏ'""X|||J=&66޽{Ylb7::łhT( $ (ӯ梿~ƍJuwL&Ky!!EHJڵiCvmY6 .Jz:\]ߵ V&['??IIKݺp22}6׮CеKndзG0nsM23p)5?Ҷ3[lfŜHB.~̘͛1,zA͚58p QQQϲe8{,}yF,""x 9~)慆Ϯ]c:uزR2L|d!A D ??-[^kz= bQ]"͛8KbW‰dn߾ͯxr7+z˃kcNW.a6j^T th;zS0.V-[2et ʇs瓞3m@Dd4#_ Le9>~~{;|-ײ?W5&q{0jl!Ź x3 }{o;0P8h&gRHf"##aÆ$$$w^[֬YCNݝM6+BuЁiӦ /7nT4iY`lذXj۾k7Wh:ɧN1c̚5 NlWV9t 0K [ȺzЈlovXFƖ;XDsտ~+bL8oXe1&%Oۯc*Oy"n$gqemڗe B?T;Unn.8תvSB!=O?ܼuY۵}fB!PUDwnيB!yҦ !UX-j7AJA汅B!$)B!T!BNR!B:IJs5j0j7CTqFc:ΦuJl {P-DU%IcÓyj7ETQFc))m;BmBTUUkFׯg/wģݽj*T!BNB!$)B!T!BNR!B:IJB!$)B!T!BNR!B:IJB!$)B!T!BSW[nIENDB`aravis-ARAVIS_0_6_0/viewer/data/arv-viewer.appdata.xml.in000066400000000000000000000021541334570641500232640ustar00rootroot00000000000000 aravis-@ARAVIS_API_VERSION@ org.arv-viewer.desktop CC0-1.0 GPL-2.0+ Aravis Viewer

Simple viewer of video stream acquired using Aravis

Aravis Viewer is a simple viewer used to display video streams from GENICAM-based Ethernet industrial cameras.

It allows to control basic acquisition parameters, i.e. framerate, exposure and gain, and to save raw still images.

https://raw.githubusercontent.com/AravisProject/aravis/master/viewer/icons/gnome/256x256/apps/aravis.png https://wiki.gnome.org/Projects/Aravis emmanuel@gnome.org GNOME aravis-ARAVIS_0_6_0/viewer/data/arv-viewer.desktop.in.in000066400000000000000000000010021334570641500231200ustar00rootroot00000000000000[Desktop Entry] Name=Aravis X-GNOME-FullName=Aravis Simple Viewer Comment=Display the video stream from your cameras Exec=arv-viewer Terminal=false Type=Application StartupNotify=false # Translators: Do NOT translate or transliterate this text (this is an icon file name)! Icon=aravis Categories=GNOME;AudioVideo;Video; # Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! Keywords=gigevision;usb3vision;vision;display;viewer; aravis-ARAVIS_0_6_0/viewer/data/meson.build000066400000000000000000000013441334570641500205770ustar00rootroot00000000000000po_dir = join_paths (meson.source_root (), 'po') appdata_conf = configuration_data() appdata_conf.set ('ARAVIS_API_VERSION', aravis_api_version) configure_file (input: files('arv-viewer.appdata.xml.in'), output: 'arv-viewer-@0@.appdata.xml'.format (aravis_api_version), configuration: appdata_conf, install_dir: aravis_desktop_dir) desktop_conf = configuration_data() desktop = i18n.merge_file ('desktop', input: configure_file (input: files('arv-viewer.desktop.in.in'), output: 'arv-viewer.desktop.in', configuration: desktop_conf), output: 'arv-viewer-@0@.desktop'.format (aravis_api_version), install: true, install_dir: aravis_desktop_dir, po_dir: po_dir, type: 'desktop') aravis-ARAVIS_0_6_0/viewer/icons/000077500000000000000000000000001334570641500166355ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/viewer/icons/README000066400000000000000000000004701334570641500175160ustar00rootroot00000000000000The source files for Aravis icons are SVG files in viewer/icons/src. The rendering to the different sizes is done manually, in order to avoid a build dependency on Inkscape. After you have modified one of the source file, please don't forget to launch ../../tools/render-icon-theme.py from the icons directory. aravis-ARAVIS_0_6_0/viewer/icons/gnome/000077500000000000000000000000001334570641500177425ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/viewer/icons/gnome/22x22/000077500000000000000000000000001334570641500205215ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/viewer/icons/gnome/22x22/apps/000077500000000000000000000000001334570641500214645ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/viewer/icons/gnome/22x22/apps/aravis.png000066400000000000000000000022731334570641500234630ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitleemblem synchronizing5tEXtAuthorLapo Calamandreiߑ*IDAT8OlU?3y햝E6@K,/EmĈMфWLpB"1$'VSIkvUHKn0ۖo{7ア$=; G>HtZ>XǶH#Gh`kOhdS' ,˲,$i7ߛB q)兯GJ*}*;U@tB \G g NQ(Ձm1ctԆFkfpA[ۈ2;O66ZAM6oի.dR)H)w]W0ڰ^nXC6ٽ{{jֲl,h kcYk:Ym岌n~~$bc0u\c[K!Zz~O*Ui@Sސ6~=lg'Bம.r<7n3;1rH%[{v3W^~>\H0###$ɩ2m#ʕkŹ8ͥe ϴg]鏈_z(kqO[zQ؇쩍leQӣDEFe|j?l,:JWk-._m-oK-Ot x;o~P,e[~qr81qҫ<866ZX|Tr'OV3Vwr/?$6v+$I_C.IENDB`aravis-ARAVIS_0_6_0/viewer/icons/gnome/256x256/000077500000000000000000000000001334570641500207035ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/viewer/icons/gnome/256x256/apps/000077500000000000000000000000001334570641500216465ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/viewer/icons/gnome/256x256/apps/aravis.png000066400000000000000000000520661334570641500236520ustar00rootroot00000000000000PNG  IHDR\rfsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitleemblem synchronizing5tEXtAuthorLapo Calamandreiߑ* IDATxYș&9̌32j6}&9f%ӓYI3.[ Gf0zVԎlM6k+ixCvU*vוUYYyߙqp=; Ld%~?܁ RdȐxB;dȐ@ dp@ dp@ dp@ dp@ dp@ dp@ dp@ dp@ dp@ dp@ dp@ dpavW}kL05r,!d\ߋ_FJZ'E(J? +3 S:mZbX⊪MJRA1ÆeZ-ۚ7-4k;;?׾VUv y~իc/JT,P( C.04M! }e; UJ! FT[R2 mwU{*REt5F4+ s ml4M4 kuT˵rm&ޑ&WO|etdJAchhb G0i:t]4V8PmϿOQȘ/C)m۰, e²2UkT+vwwͭWOIzHO'NQ(0 hBR=C@,e'_!AE:,i%m>iVaooXY]?˿WCoH_oSӧ'NF? C!4_8LA>Ht"HZo'EH!NZܶd2`$\Jm.cyyz_~WHW WONϜ$JAGH@՟[]|uzFeYhM4 aeeo߮|f#)E _jCzH ?={ujjO$<_? I>-uPö5 1[rPY\bSڔu"_o3ٳ8q$cPrni֤n^ubk/V LDRzdb%믜{jggS'P*iZƣ]sStK{%(^ŘTsβ, 4Eܟoݛ˿:$W>3sܹ3Ovr^}u܃%kFǝpIlbgw<?} 204Rӱq EtE;%^CF mA2>A躎@'&O`gwgfksO\| : իcΟ;) .,ߩ/$y>~Ыz%< XYrۻ͝OY#_C__r+//ЊqqXl ƬM !!}}}WzիWFGFllt B!oӔU@0Zj$)I'zvݨ756M  J&'02:g_ǔ J/E48\.x'8 I4Xݨ#e\,+4 |C2/fdg"Bǥ M[K Iތ9)X,`hhC?B 5.իWT,!9߉9i=*|\Ocٰk8DQ*1P,ᗿe%)@j,>;A܂yӔWڼmx @PDP7 ١CBj0BP@Bͺ{$ɟ&'u2b|d C7fqu&&8:iE " !3"RCq;2[!VaΗvRhu#g"+ǥK{i.|Qn t 5Olnnz+8g8ؘ7T@nXvw21(WnaO176=IصRx][ax@K@_ptoچzcuZ*P-$4tB 25 :!C'dE/S!BZŵk_Zy/8\iam0"FkQ?. DTqVHha(M"`"|۱▩qFla(ړF}3 #6B7oL lLJhvu[7j H"D ?4-,l;O#=vRrkDH8G\+3ӈӗ666 "%N ~~>N!9e'I7m4WSaA.hmSaske{;s_Әl5kXC);Щ`Y6VVO8a'0.\!H>=mWxAu>"-T^kY^qM 엦 4n߯A$Z_bϏ$y,4C̓ L`ioCJɚ5Z !\&5 bJ[;x9=e}oOLj@' *VwҵzqMۈj_' _>cl~Jo] xRo}.OKIڋvveV(jw ЍG@OK|܊_pAEM#(Wj&> ^1`!;B%.޺vZͩ6Ћ$. ts)P'}ݼi@jP.,Nr'OCsxm ,PD!e9tNJ X\Z`/`y@KھDPݎDmPPՔN C˽B?(NfpրD+J(JK?A`⇪;Ok)¶mܻH5F z H ^y;HSJBj@S7.[^/byE\p{ ՝i؇gGj@ʆa|޻y++`>@mg9#'*Ůài:&&JDVû֮k`HCOχ ^efNEh8nN|НPD ʩ]Q\.B/X 1E NL`rb=[o*^%,--ajj W|ghakk[\_"k(nuxy%B(|F:u "aJ=45@\u ,6xXaltӣ~}G-`yy˘WpIַ$x'px xQ x)V d Be0t5~ 8}j7x]sVqɓr Μ>Ǐװ%FK<+"wlu+H PDQӔ^Q JаS' 䟓p x׿pZYY N8~cÃ+(g:x1=kӢL2g;W Ҋ@ЎGky+ Ϧqah(W*6u/pzzS'Gq}l6w\?fgg=2lZ5mxv~DzT!W{/X|~ lB@/ ~D~~'x!?~˗/y KXY5zSNbtdkvbb4ѽv2x z@7pp h]ױxD52L4p[8s'P/ѽ4quܿ/\:5캫 )DhI6{vO=uMlrرN/!,姽/}gqp"za|ٳSƍ7CXg /0oh L d3ill;F%g}~Yo`eema to=@P·b['ڪ@`xHdߏgBƆn PE-Xke/glN!iw4&'Gp[xq[cqmny\|4`?t1m=RC^+ `jj SSS7*C@=/ͽ3\.E|3w>j^{ x12R⦳Zt Э΃.<p'Gz;B|7,Ǭq'##\^GV4sfp~zw=ҥK3`ee[[ZUR8  8K|:!lQm r,-ܧqn޺u<ܳac˦ Kp !xvf~ˮ?t @,0pIS.Q5bAuA&tCŷ!O&F334|5 :udnd:rRDJhڟD@p < e㗯_ 81Yp>$wF 2*`4Qm锾h x>&Ζa]?? i?^Um縋1?עy!ḿ]ױp~'>hsN۶{z_im0to;p W /p ''G]GnK/0M! 'aJE57H tLJwwwq \6 p 8 si:|bp#|B 8"J)޺vgggcDXPnoo x,sAQ/>^Wѥ?ᜊ{5H+BZzl:D|` El/}}yۻ oAKq UQ!1TiSCaԮ-Ǜz{{_4 [[;uٟG ୁn 0KeBO~>cb[M6c,-ox+Mcpiʫύ^ xk^ H t`5%pǵߓa< ? ݻnP`~O|c5aSn; ;bhuܙqNCzeIFGBG]FPPmpcr7yϡH#xW7pC [ duRaڐǨ :>ɏԩ P'1~|]UB%ҭIyub* #yh>V IDATRC)'mST*\>rCN8X ;_Vq3i"7ӟ ]714A,MvcjB B>ӍnƝz>I|S#E[PA` ~{ 4$PJC%C/fӦ@Ͼpw)'@P  `_ mSg_p X@a ' &J_z Q*R[k JH刺fO B''{e㓟N: 5,H!i~B$ B&Bn޼ \g~ô+D}(iJh4K~}g|sI%<7,jfRlL P `O<ԜO49 ֈI+RctfbsɓxS!ߗ  p|\ dh}ZLu?%(v#( : yӎ,,ԓ4`٬6G6,F}}g^m /9n Dsh  $ 6MwpbҽȄpY-2ۖ]J)GgcZ⥗>ӧOro(iY=‘SQpIlHB+v #o\bTEb>?@@n1:2['/}nܖa˴+uף O(=`1?c~]BkBdDD&%Ņ҈TlS>)D'_5Q_mbrr/λZC "iY0T G$a !Huy$@w~ @.+~@ EK3Hp?8hòl,Vi9|azz"`.@/-`E]hݣxsHR x;qYE,K y\|NLo4m/XtGAi[YPX K XW&WA'4c2!EX<:ZOd @V.ױa݃[@>w߇Z{Ƕ""]ѿw E҉k s\>/C!AV k _ 2\S.vw+8szOƛo͎0:\Ν;waqi5`F[6{v .[A{cq`ܨEmm`.pў: o'렺GSh4q2FJg KKK~]DtX8q^z۫WzuiX^ Dp. ~1&T=xG5+)"} (~}\2UA2llb{kSS֭sNj݂\.{Ӹ}g[>lѦ~ H nO r*{8d!g_YzM?DQ[A%%Y* TږɵE S@ymcs{|p{FGGsϣP,ell/d^(ôl &&MQVy:S)]W,S]c;c@%k,r\yĉrY&*+ 6bY?e)[b Ek~*_pL^3U@k2'w `ss[[{?,^&G>ݽ*޻zCE 3`ZM!H7B>` S&1Z?P*suOF#5y MQ>ZX:NL _"qfD033}cm_MKI|b^]a6'p/Ji5ZxivRC2zN2*6hˍi?^̩%ܼcӸ| r</m`{{_%smd=4 '[i[ tTJqJ%&`~!瑲yA*_5*w Qի@4"VpI|K_"n޼$BΜ9˗@t`k{@PRm}cOikB-g_tҋ@ؗbI"ičF+ZI )@iq/Ǹy&2!W@)} 'mh0}HA@5e(#5Ld~ 8xA2c{ Y-h6q<q4~w~;;;(Jh6mao jۊb>yݕm7H@}? d/㏷ {.!="4BR%Q&BkR u%,.\jA~FH>>M`!oH4 ޏ<Gx'HH`?,eT z eZIE(/zA@ˎi@@2 tFGP`~ J#Ԍ?Hr,'4a|%TIJAʿZZ?PL |j`"m?W+$ z 5Jy9:ѡAφ Z` α0 FږMy螐 {>99gEa`>ZGtҫ]+b^s~ l(2ͺ h߄%/-nĮH?hZ&>3+^ǁwwJO^mH|]EE>ч1A\oR Q5TQE26&f11>L!M*"z8!9ߟǭ܉E8՜=;\Nkh6,n9Oȴ$OK\ Ο; z#`fjuF]t@םp:g jYe:&hճYam|_ݍpR )ǰ7uCa0+Bגы6FΎs :²C >L @A 1X}Kqqe!]' n$5@r>H#T}4;$|ry vLiKA X^@[_\ZzY 5N%T ("J>􁂢Fjأ{ `B6QG}}# %+4 :nP/+2d>TU{1 I@Zt?mz0!qnѲRX R 6@DP 5 ((FjsxH'|7h5G 9,o[S9e~͑KnIGsH 0觰AMi57g6Q>lPiGPCu4@Mw?'[?OjFn !\()G¯l}:=( }l)" |sU9N ZUTPF:AADeT`pUZCأ(2*hȵl+πK EU\ oQ.CoϷLЦa[fX-D}|b-NHL )7J=Ts~4P䉳„:{>} h }(u쩝LOISp^}?iP ([cfq`)ejxOiEj@<.ljkg' h@AaQ 4QG v:u$@rƁh'! qU@Dͥ&BYdAp-oOC2 5͆1 ;9= f Px!srT/T$ ޲A 8`'J(}Z>G t3xmNBp-"e~ڨ;bj:a1-:$&A۳tC-8dVDVя~i9g{c%**;+P"YvD7漘pYd)@>?K݀!&S̸[ ZZ&nx~n#MXO.Ȋ(}V!qHRAmkeRFa?]6lX0]+:,~BZv$!Ump68AAq\g5D#j) i4Ǘ @Ū }E{?[S545L$ S\v9l}SowXϡ ? ݷ0Vh:_lQ f6q. 0mowKa{s7ﶭ- %U^ ff{Ӓr$YB D0O)oe)KP_gNDm=Qկ/f E~b؃5RX<d_`O+E}z%Rh Rk$/R FR ]W Z* 0xAzJ$QAҝ5 -mX[[݉'|2 \_'XZ 10::}1뱭 ,ÇӧO!| q*`h8TB0>>>g;NZ͛7!?9vvv8{ T\tU);|X~ +xkp~Rܹs!#hT*w^G(MKM {U ySCn7qpbaa3vvv u F'Iكj(=>]r/RZc?tT`P-{{@hpW>1\~i :OxPŲV0 .>$X~"b[3n!Ӌ3x@K.ԩS{ lllx;~ ,ik xx߇SN̙3xŏczz /eJ,~k 58@|Y ###x罉_- ъ7Dμa}'TQavPCR\R &KؘE`$ ǖGaDL'!YeҊ? hkni} 4*?hM>7*_+G"*,-9bp0ZI>'ק`MN^>(^a@('|8@-Zq]˛1P)XG4+Z@[Ugs'V^4„Z&s/'=/4P4M4 ]*P:&6_y0m+wNp5D:e[/9y]~-[`j+!n= D⿛( loeQꐍmS?WMze. r|/=YEZ,tYfs^o(㴆Z+իY ,%-peehiv?6Z'Ț:tu*IɄ5 ]szmi6QUaZ#8h Z&|~$Qjzf3rV0jXIVRNcSn׎Fr+YPe@:vƖA˲PQTP֖ _2nDsk 1t }5/r*Fl>"^Vn@5œZrZo-IIA.??g=J)W;*'L(n@"H Wxri0 04 jeTuʨv:Ti]Wג 5hRZxx2مjwS_󣄼D@!]s*@|!ssswwwvV-&_p% Le~wZux)< PSG_\\i&a֟Kv h?p#@Q6Ț _e";T]' Ɲ l;(ujޠJ $T U6yzߪQ u> ^p0 nEs LEgo۶6Vְ-98Bnd@,H'Le꯿.^dmoo룣rS ;%{s7\ G y2hWǩ$ۍ<H$ TO}Q2QTM G-8j' "\OH@5e3|&xxnmnno&'&qAuh % ; &¤uQfzIa=/SLpο <_Ǐp g%7Ĭ/֒AKa0׹>#<9;{?/ J0 % /A-ۍt '1U?4F(/3 ӴG x4?_O~#:i{k<NH+ ~I~y066_<dN_. L̇-ՃFK/u=;ʄ߶lkXYYqрCLpd# ets@d煟 |=sswgg#b$hYv`f81KsPLDuS7nICaRloM;{n'?a׸ "-z@+ZٜٯIFK>Vwexh( h9Àixh0'--9_e8H =T{jLՎLYAh_~"m6Gyy``'~,$ P*e@$_/||}afBۦiXhE*wB _|,_{x!n7|C@WX'5X5UҨ/Ozmr|3>k:NLcppHht]s-!ݻOR #f5Y#Aeܶ ~_MM_k h|,GCIn@e@:g ߿ yJmLMt-@47`) vDzOAopU* ?Z+wox2}}۝[`XzܟÍ_7n<6kf.A孠 ${XZX\44ofZS33ax_km?;ЉYWDmGJ=_{IĭD~'gME4z ܹ{޿7~ƍ|rbclC";fK* n' ¿)[Ѹ Io r8J"rt]w "Y@T!IV DG[$^/? sM>o6&vvG?yͷ9u,P9@ w\A~}ueefԩL03  a"юI*ڔ !i?h{r"PǑx; ׫"ǒ]˲\ӟtml`aaǃ*ַ@9,( $uLD+ c;y~~_vM+՗x>[䩙ӹ)bXDXD>XcXBzfPe1FܱNNko9D]ڿH 3s[5P.cgw+x8>h_Λo^,GM>u8k5oMq٧ y~pP~P^:Q. dmOt΂W ZP(|~O|ύh`G}j $>j" BH" j5a# y%n¶6| fzr;X7;}FV+V&l?/*su)V_~@} [lRAOاP(~s~O?ԅח5 DEӸGJV*2!B.#0 PbQpS^觲*oE:52Dg6eZ7h4ժ/Wͭ-w>ssj_(e`[}_d"D^* s'RGbj?/X:ODd@$@.?u™SNb8X-#(9yz(\4 pΥLNO * X$/Ax/U T'\ރXpVFm18]!!@\ͦYùy4pfwT$DP>;ViԺzy'>`WBEۀHHr{pYd+oܑV&^&`yM k@7WXGw3*Tf%Pd_<"J5EZ'Wp_^p 2O;ДM"\UR(g89/+4$:1 =q6TBE召y]9`A Yc |cgh`dE ]0WȤD,T'@xU8\=fOGڟ2 [Y<Ț>,]8 sV&9͔s5 ;Bra2D^u; ?e^~:+\7@+Mؒu}4x CnSE-c>Wi}f 0feYy8dse__~B֏cy' *쏊 𚜏ߨHwI "2ៃfDr A\ OT B o‚~aT?՗Ƅ*( &Le :;5j/gp<f ފ䴨 =ԆVӿc B*+@vT*ǎy`BTVQl/ ưOئ8BoGP dj㸟(aW=G,8*-Ó +. q6?Й +Qa//%Bq ǖψ" !Y0l'~BFDzP+hm X Ve8Cao\JG(~b$HW87ÓvrZd +"@[+]3!8p'5Ct@@Gր|OLЏa q!qX]~CZZ0۱'=CIvCWc*:53QWXEv =~U!⤷B3b9C@h$:pAN&$<Un&dtKs/ @ىIAY]ʐk C!CA= &Ȉ"Cq: Ȑ!C{~+Cc2d8 Cc2d8 Cc2d8 Cc2d8 Cc2d8 Cc2d8 Cc2d8 Cc2d8 Cc2d8ʚhIENDB`aravis-ARAVIS_0_6_0/viewer/icons/gnome/32x32/000077500000000000000000000000001334570641500205235ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/viewer/icons/gnome/32x32/apps/000077500000000000000000000000001334570641500214665ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/viewer/icons/gnome/32x32/apps/aravis.png000066400000000000000000000030421334570641500234600ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitleemblem synchronizing5tEXtAuthorLapo Calamandreiߑ*VIDATXŖKlTU羋ҡN) h c7&n-.X.H\h"]aqe" -־(Ё>F޹bΫ! _rf;R"Pv@+.RFEg  e 2@CNvHRDywi%7,s۫{yp0/"b6Eu]q(T?β,:;k vޞuxT@hݤ:C*byy9[nrKG^mjjDX |?n=b~~11??OWWvx ȫ|/D'(߅a]52AiUU#Qt(ʊmqMJ%RVm;1a6Dǁijj3MMJ,,O?Q]hHn&RB144t7udRb[,f\~ݻrŋϜm^f^賿Lc iکvd0j0a c`tC*PT1&Pj@I jDvPJqЁ- k @C A"ض-4kZJ;ӉBa 9ӆ~*-@eQs9VWm !فsssMkE:D,@қħG!3e=hkc ~D|>_xS)(%|Ϳě%tuuBŖkYXXࢻ;Bl@Є!(~,B!E bBeP&̄j@pp '+ apppK,3Q~^[ݝ!`Z>'EG>>kxGBFFFp)fg+݁M7F}A-Q*W044ݻq\JpU# X'+=z]v!JE iطo/_̓1dG[lx%>ǂùS J2FFFFlZ&PJa:Y-7T/u~ɓ'6D0wo93!NÇ7ufPH$>R J >5J)~ܭSH:h&cpoKvJ\%ށ*K@Mc?|u]jbo`w+BqJ1A9r'Nlի!V;J,5 PJpС:P3 ŝXܬe:./B (G?9ӎgbP(d͋jG_4S_溸w2Z#9?k׮!χ7rd~߹s'Μ9S4'pِuܘF#[ fc["H#͈~mvfN\JPJg+F50֛ mv('1nNIZwٶ 0nƣ:3y;H4|Q+tƨnFfggm!dCz…gffd2J6WZ!0 d+++*?x$JȍV*%T߅H)URQSSSՉcrs_JBH;,w4RʎX~B)8 K.}bY`I)e#tHO^+qTR'@ņ#  jc'k *8$ӎmIENDB`aravis-ARAVIS_0_6_0/viewer/icons/gnome/scalable/000077500000000000000000000000001334570641500215105ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/viewer/icons/gnome/scalable/devices/000077500000000000000000000000001334570641500231325ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/viewer/icons/gnome/scalable/devices/aravis-fake-symbolic.svg000066400000000000000000000165711334570641500276750ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme aravis-ARAVIS_0_6_0/viewer/icons/gnome/scalable/devices/aravis-gigevision-symbolic.svg000066400000000000000000000435361334570641500311330ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme aravis-ARAVIS_0_6_0/viewer/icons/gnome/scalable/devices/aravis-usb3vision-symbolic.svg000066400000000000000000000244641334570641500310730ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme aravis-ARAVIS_0_6_0/viewer/icons/src/000077500000000000000000000000001334570641500174245ustar00rootroot00000000000000aravis-ARAVIS_0_6_0/viewer/icons/src/aravis.svg000066400000000000000000002553321334570641500214440ustar00rootroot00000000000000 emblem synchronizing image/svg+xml emblem synchronizing Lapo Calamandrei aravis-ARAVIS_0_6_0/viewer/main.c000066400000000000000000000066331334570641500166220ustar00rootroot00000000000000/* Aravis - Digital camera library * * Copyright © 2009-2012 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * Author: Emmanuel Pacaud */ #include #include #include #include #include #include #include #include static char *arv_viewer_option_debug_domains = NULL; static gboolean arv_viewer_option_auto_socket_buffer = FALSE; static gboolean arv_viewer_option_no_packet_resend = FALSE; static unsigned int arv_viewer_option_packet_timeout = 20; static unsigned int arv_viewer_option_frame_retention = 100; static const GOptionEntry arv_viewer_option_entries[] = { { "auto-buffer-size", 'a', 0, G_OPTION_ARG_NONE, &arv_viewer_option_auto_socket_buffer, "Auto socket buffer size", NULL }, { "no-packet-resend", 'r', 0, G_OPTION_ARG_NONE, &arv_viewer_option_no_packet_resend, "No packet resend", NULL }, { "packet-timeout", 'p', 0, G_OPTION_ARG_INT, &arv_viewer_option_packet_timeout, "Packet timeout (ms)", NULL }, { "frame-retention", 'm', 0, G_OPTION_ARG_INT, &arv_viewer_option_frame_retention, "Frame retention (ms)", NULL }, { "debug", 'd', 0, G_OPTION_ARG_STRING, &arv_viewer_option_debug_domains, "Debug domains", NULL }, { NULL } }; int main (int argc, char **argv) { ArvViewer *viewer; GtkIconTheme *icon_theme; int status; GOptionContext *context; GError *error = NULL; bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); gtk_init (&argc, &argv); gst_init (&argc, &argv); icon_theme = gtk_icon_theme_get_default (); gtk_icon_theme_append_search_path (icon_theme, ARAVIS_ICON_DIR); context = g_option_context_new (NULL); g_option_context_add_main_entries (context, arv_viewer_option_entries, NULL); g_option_context_add_group (context, gtk_get_option_group (TRUE)); g_option_context_add_group (context, gst_init_get_option_group ()); if (!g_option_context_parse (context, &argc, &argv, &error)) { g_option_context_free (context); g_print ("Option parsing failed: %s\n", error->message); g_error_free (error); return EXIT_FAILURE; } g_option_context_free (context); arv_debug_enable (arv_viewer_option_debug_domains); viewer = arv_viewer_new (); if (!ARV_IS_VIEWER (viewer)) return EXIT_FAILURE; arv_viewer_set_options (viewer, arv_viewer_option_auto_socket_buffer, !arv_viewer_option_no_packet_resend, arv_viewer_option_packet_timeout, arv_viewer_option_frame_retention); notify_init ("Aravis Viewer"); status = g_application_run (G_APPLICATION (viewer), argc, argv); g_object_unref (viewer); notify_uninit (); return status; } aravis-ARAVIS_0_6_0/viewer/meson.build000066400000000000000000000016501334570641500176660ustar00rootroot00000000000000viewer_sources = [ 'main.c', 'arvviewer.c' ] viewer_headers = [ 'arvviewertypes.h', 'arvviewer.h' ] viewer_c_args = [ '-I../src', '-DPACKAGE_LOCALE_DIR="@0@"'.format (join_paths (get_option ('prefix'), 'locale')), '-DARAVIS_DATA_DIR="@0@"'.format (join_paths (get_option ('prefix'), aravis_data_dir)), '-DARAVIS_API_VERSION="@0@"'.format (aravis_api_version), '-DARAVIS_ICON_DIR="@0@"'.format (join_paths (get_option ('prefix'), aravis_data_dir, 'icons')) ] executable ('arv-viewer-@0@'.format (aravis_api_version), viewer_sources, viewer_headers, link_with: aravis_library, c_args: viewer_c_args, include_directories: [configuration_inc, library_inc], dependencies: aravis_viewer_dependencies, install: true) install_data ('arv-viewer.ui', install_dir: aravis_data_dir) install_subdir (join_paths ('icons', 'gnome'), install_dir: aravis_icon_dir, strip_directory: true) subdir ('data')