yubikey-personalization-gui-3.1.23/0000775000175000017500000000000012603205741015732 5ustar klasklasyubikey-personalization-gui-3.1.23/ChangeLog0000664000175000017500000023753712603205742017526 0ustar klasklas2015-10-01 Klas Lindfors * NEWS: NEWS for 3.1.23 2015-09-30 Klas Lindfors * tests/scanedittest.cpp: simplify test by not using new/delete 2015-09-30 Klas Lindfors * src/ui/staticpage.cpp: make sure scanedit is initialized fixes #56 2015-09-25 Klas Lindfors * NEWS, src/src.pro: bump versions 2015-09-25 Klas Lindfors * NEWS: NEWS for 3.1.22 2015-09-23 Klas Lindfors * .gitignore: ignore 2015-09-22 Klas Lindfors * : fixup neo picture 2015-09-22 Klas Lindfors * lib/scanedit.cpp: remove debugging for every encode case and add debug for failure 2015-09-22 Klas Lindfors * lib/de-scanedit.cpp: add <> for german layout 2015-09-22 Klas Lindfors * .gitignore, lib/common.h, lib/de-scanedit.cpp, lib/de-scanedit.h, lib/lib.pro, lib/scanedit.cpp, src/ui/staticpage.cpp, src/ui/staticpage.ui: add german layout to scancode passwords 2015-09-22 Klas Lindfors * lib/common.h, src/ui/staticpage.cpp: modularize scanedit so it's instantiated when selected 2015-09-22 Klas Lindfors * .gitignore, lib/lib.pro, lib/scanedit.cpp, lib/scanedit.h, lib/us-scanedit.cpp, lib/us-scanedit.h, src/ui/staticpage.cpp, tests/scanedittest.cpp: add inheritance for scanedit parts 2015-09-22 Klas Lindfors * lib/scanedit.cpp, lib/scanedit.h, src/ui/staticpage.cpp, src/ui/staticpage.h, tests/scanedittest.cpp: refactor scanedit to only use one lookup table 2015-09-22 Klas Lindfors * src/ui/mainwindow.cpp: use edge picture for 4.2 2015-09-04 Klas Lindfors * .gitignore, lib/common.h, src/yubikeyfinder.h, tests/test.cpp, tests/tests.pro, tests/versiontest.cpp, tests/versiontest.h: move YK_VERSION macro to common, add tests for it and fix it 2015-09-04 Klas Lindfors * src/yubikeyfinder.h: fixup YK_VERSION macro so higher versions are recognized 2015-07-09 Klas Lindfors * lib/yubikeyutil.cpp, src/ui/toolpage.cpp: take some care to set resultLen on errors 2015-07-09 Klas Lindfors * tests/yubikeyutiltest.cpp, tests/yubikeyutiltest.h: test getNextModhex() with uneven amount 2015-05-29 Klas Lindfors * lib/lib.pro, src/src.pro, tests/tests.pro: change syntax for accepting CXXFLAGS and LDFLAGS they now have to be given as options to qmake, instead of env 2015-06-23 Konstantinos Georgantas * README: fix typo 2015-05-29 Klas Lindfors * NEWS, src/src.pro: bump versions 2015-05-29 Klas Lindfors * NEWS: NEWS for 3.1.21 2015-05-27 Klas Lindfors * : update product images with the correct fido logo 2015-04-20 Klas Lindfors * tests/tests.pro: add no_testcase_installs for tests to avoid installation fixes #49 2015-04-07 Klas Lindfors * lib/lib.pro, src/src.pro, tests/tests.pro: restructure compiler flags and add CPPFLAGS from env 2015-04-01 Klas Lindfors * lib/yubikeyutil.cpp: yubikey_hex_decode() and yubikey_modhex_decode() take dstlen 2015-04-01 Klas Lindfors * NEWS, src/src.pro: bump versions 2015-04-01 Klas Lindfors * src/src.pro: fix windows build with signatures 2015-04-01 Klas Lindfors * NEWS: NEWS for 3.1.20 2015-04-01 Klas Lindfors * do-source-release.sh: fixup release script 2015-04-01 Klas Lindfors * src/src.pro: correct search path 2015-03-30 Klas Lindfors * : update neo pictures 2015-03-30 Klas Lindfors * : update plus pictures 2015-03-30 Klas Lindfors * resources/resources.qrc, src/ui/mainwindow.cpp: add edge graphics 2015-03-30 Klas Lindfors * lib/yubikeyutil.cpp, lib/yubikeyutil.h: drop unused hexdump function 2015-03-30 Klas Lindfors * tests/yubikeyutiltest.cpp, tests/yubikeyutiltest.h: adding test that the random function returns different stuff 2015-03-30 Klas Lindfors * src/yubikeyfinder.cpp: mark more ver 4 as not supporting ndef 2015-03-26 Klas Lindfors * src/ui/chalresppage.cpp, src/ui/diagnostics.cpp, src/ui/mainwindow.cpp, src/ui/oathpage.cpp, src/ui/otppage.cpp, src/ui/settingpage.cpp, src/ui/staticpage.cpp, src/ui/toolpage.cpp: add more includes 2015-03-26 Klas Lindfors * .travis.yml: format changes 2015-03-26 Klas Lindfors * .travis.yml: split travis script and install 2015-03-26 Klas Lindfors * lib/yubikeyutil.cpp: simplify getNextModhex() by having it call getNextHex() needs to do some coding-decoding, but less logic 2015-03-26 Klas Lindfors * tests/yubikeyutiltest.cpp, tests/yubikeyutiltest.h: some tests for getNextHex() and getNextModhex() 2015-03-26 Klas Lindfors * lib/yubikeyutil.cpp: include QRegExp 2015-03-26 Klas Lindfors * .gitignore, tests/scanedittest.cpp, tests/test.cpp, tests/tests.pro, tests/yubikeyutiltest.cpp, tests/yubikeyutiltest.h: refactor tests a bit so we can have several classes and add a simple test of YubikeyUtil 2015-03-26 Klas Lindfors * lib/common.h, lib/yubikeyutil.cpp, src/ui/aboutpage.cpp, src/ui/chalresppage.cpp, src/ui/confirmbox.cpp, src/ui/diagnostics.cpp, src/ui/mainwindow.cpp, src/ui/oathpage.cpp, src/ui/otppage.cpp, src/ui/settingpage.cpp, src/ui/staticpage.cpp, src/ui/toolpage.cpp, src/ui/yubiaccbox.cpp, src/yubikeyconfig.cpp, src/yubikeyconfig.h, src/yubikeyfinder.cpp, src/yubikeyfinder.h, src/yubikeywriter.cpp: refactor so common.h pulls in less of qt 2015-03-25 Klas Lindfors * .travis.yml: all needed before check 2015-03-25 Klas Lindfors * .travis.yml: add travis.yml 2015-03-25 Klas Lindfors * .gitignore: ignore 2015-03-25 Klas Lindfors * lib/lib.pro, src/src.pro, tests/tests.pro: re-enable silent compilation and add warn_on for debug 2015-03-24 Klas Lindfors * .gitignore, YKPersonalization.pro, {src => lib}/common.h, {src => lib}/crandom.cpp, {src => lib}/crandom.h, lib/lib.pro, {src => lib}/otpdef.h, {src/ui => lib}/scanedit.cpp, {src/ui => lib}/scanedit.h, {src => lib}/yubikeyutil.cpp, {src => lib}/yubikeyutil.h, src/src.pro, tests/scanedittest.cpp, tests/scanedittest.h, tests/tests.pro: refactor for testability, and add a simple test this breaks the application up in a library part and an application part, the library part is statically linked and pulled in for both tests and the gui app. 2015-03-24 Klas Lindfors * src/ui/scanedit.cpp: | was at wrong position so translation from scancode to text got wrong 2015-03-16 Klas Lindfors * YKPersonalization.pro: switch timestamp url 2015-03-16 Klas Lindfors * : new logo for installer 2015-03-16 Klas Lindfors * : new logo 2015-03-16 Klas Lindfors * src/version.h: bump copyrights for 2015 2015-03-13 Klas Lindfors * NEWS, YKPersonalization.pro: bump versions 2015-03-13 Klas Lindfors * NEWS: NEWS for 3.1.19 2015-03-13 Klas Lindfors * YKPersonalization.pro: switch to osslsigncode for signing windows binaries 2015-03-05 Klas Lindfors * src/ui/aboutpage.cpp, src/ui/aboutpage.ui: remove the build timestamp fixes #48 2014-11-28 Klas Lindfors * resources/resources.qrc, src/ui/mainwindow.cpp: include neo-n in neo 3.3 picture 2014-11-28 Klas Lindfors * NEWS, YKPersonalization.pro: bump versions 2014-11-28 Klas Lindfors * NEWS: NEWS for 3.1.18 2014-11-28 Klas Lindfors * resources/images/README.mng: update text about creating mng 2014-11-28 Klas Lindfors * resources/resources.qrc, src/ui/mainwindow.cpp: image for plus 2014-11-24 Klas Lindfors * src/yubikeyfinder.cpp, src/yubikeyfinder.h: no support for ndef in yk4 so the exclusion struct has to be expanded to hold a second range for every feature.. 2014-11-11 Klas Lindfors * YKPersonalization.pro: drop QTPLUGIN line, caused the plugins to be linked in at times fixes #46 2014-10-31 Klas Lindfors * YKPersonalization.pro: check that the binaries are correctly linked 2014-10-30 Klas Lindfors * resources/mac/Info.plist.in: apparently the app store doesn't allow build number so I wonder in what field that should go.. 2014-10-30 Klas Lindfors * NEWS, YKPersonalization.pro: bump versions. 2014-10-30 Klas Lindfors * NEWS: NEWS for 3.1.17 2014-10-30 Klas Lindfors * YKPersonalization.pro, resources/mac/Info.plist.in: add so a build number can be set for osX builds 2014-10-30 Klas Lindfors * YKPersonalization.pro: try to get by with codesign --deep 2014-10-30 Klas Lindfors * YKPersonalization.pro: more mac fixups 2014-10-30 Klas Lindfors * YKPersonalization.pro: switch mac build to qt5 2014-10-29 Henrik Stråth * README: Update README 2014-10-29 Henrik Stråth * README: Update README 2014-10-29 Henrik Stråth * README: Update README 2014-10-29 Henrik Stråth * README: Update README 2014-10-29 Henrik Stråth * README.adoc: symlinked README 2014-10-23 Christian Hesse * src/ui/mainwindow.cpp, src/ui/mainwindow.ui, src/yubikeyfinder.cpp, src/yubikeyfinder.h: show U2F in supported features 2014-10-23 Klas Lindfors * src/common.h, src/help.h, src/ui/aboutpage.cpp, src/ui/chalresppage.cpp, src/ui/confirmbox.cpp, src/ui/helpbox.cpp, src/ui/mainwindow.cpp, src/ui/oathpage.cpp, src/ui/otppage.cpp, src/ui/settingpage.cpp, src/ui/staticpage.cpp, src/ui/toolpage.cpp, src/version.h, src/yubikeywriter.cpp: restructure to get rid of lupdate warnings for translations relates to #42 2014-10-23 Klas Lindfors * YKPersonalization.pro, installer/win-nsis/ykpers.nsi: include the qtaccessiblewidgets plugin when bundling fixes #43 2014-10-23 Klas Lindfors * src/yubikeylogger.h: Q_OBJECT has to be declared before public.. fixes #44 2014-10-22 Klas Lindfors * src/yubikeylogger.cpp: add another tr() 2014-10-22 Klas Lindfors * src/yubikeylogger.h: add forgotten Q_OBJECT macro to yubikeylogger 2014-10-01 Klas Lindfors * src/yubikeylogger.cpp, src/yubikeylogger.h: add two new logfields, accesscodes padded out with 12 characters to be used for the Yubico format that specifies that the access code is always 12 characters, zeroes if unset. fixes #41 2014-09-16 Klas Lindfors * NEWS, YKPersonalization.pro: bump versions 2014-09-16 Klas Lindfors * NEWS: 3.1.16 2014-09-16 Klas Lindfors * src/yubikeyutil.cpp: Q_WS_* is not supported on qt5 change to Q_OS_* fixes #40 2014-09-12 Klas Lindfors * : commit 8fb1b1dfcea2c9e1a8abfd19157cc97f2c74bcfa Author: Klas Lindfors Date: Fri Sep 12 07:51:28 2014 +0100 2014-09-11 Klas Lindfors * YKPersonalization.pro: drop some more debug stuff from qtgui on mac 2014-09-11 Klas Lindfors * NEWS, YKPersonalization.pro: bump versions 2014-09-11 Klas Lindfors * NEWS: NEWS for 3.1.15 2014-09-11 Klas Lindfors * resources/resources.qrc, src/ui/mainwindow.cpp: new picture for version 3.3+ with u2f logo 2014-09-11 Klas Lindfors * YKPersonalization.pro: make sure the qtgui is writable 2014-09-11 Klas Lindfors * YKPersonalization.pro, installer/win-nsis/ykpers.nsi: switch the windows build to qt5 2014-09-09 Klas Lindfors * src/ui/aboutpage.ui: move the support link to it's own line 2014-09-09 Klas Lindfors * src/common.h, src/ui/aboutpage.cpp: fixup support link since it's no longer mail 2014-09-04 mistertoh * src/ui/aboutpage.ui: Update Link for Help and Discussion 2014-08-28 Klas Lindfors * src/yubikeylogger.cpp: fixup xml syntax 2014-08-28 Klas Lindfors * src/yubikeylogger.cpp: add CryptoModuleInfo with configSlot 2014-08-28 Klas Lindfors * src/yubikeylogger.cpp, src/yubikeylogger.h: add tokenLength formatter to get responseFormat correct 2014-08-28 Klas Lindfors * src/yubikeylogger.cpp: user serial:slot for Key@Id 2014-08-28 Klas Lindfors * src/yubikeylogger.cpp, src/yubikeylogger.h: write start and end of PSKC info 2014-08-28 Klas Lindfors * src/ui/mainwindow.cpp, src/ui/mainwindow.h, src/yubikeylogger.h: register aboutToQuit() handler and call closeLogFile() there 2014-08-28 Klas Lindfors * src/yubikeylogger.cpp, src/yubikeylogger.h: close the logFile when things change 2014-08-28 Klas Lindfors * src/yubikeylogger.cpp, src/yubikeylogger.h: implement secret key in base64 for logging specifically for the pskc format 2014-08-28 Klas Lindfors * src/ui/settingpage.ui, src/yubikeylogger.cpp, src/yubikeylogger.h: add a first stab at an experimental PSKC output format this is clearly a naive least-effort implementation.. relates to #4 2014-07-15 Alessio Di Mauro * src/ui/staticpage.cpp, src/ui/staticpage.ui: Added graying out of text boxes and buttons when no layout is selected. 2014-07-07 Alessio Di Mauro * src/ui/staticpage.cpp, src/ui/staticpage.h, src/ui/staticpage.ui: Added dropdown menu for keyboard layout selection. 2014-04-23 Klas Lindfors * src/yubikeyconfig.cpp: make sure to initialize all variables in constructor specifically m_hmacLT64 2014-04-23 Klas Lindfors * src/yubikeyutil.cpp: reduce scope of val 2014-04-23 Klas Lindfors * src/ui/diagnostics.cpp: put the "unknown os" in #else 2014-04-23 Klas Lindfors * src/yubikeylogger.cpp: fixup logging so all modes are logged use a switch-case instead of if to get warnings if we miss a case. resolves #36 2014-04-22 Klas Lindfors * : Merge pull request #35 from dudebout/patch-1 Adds a missind dependency in the README 2014-04-16 Klas Lindfors * src/common.h: add head to html template 2014-02-27 David Wittman * src/ui/oathpage.ui, src/ui/otppage.ui, src/ui/staticpage.ui: Typo fix in UI: s/Quicky/Quickly/ 2014-01-28 Klas Lindfors * src/yubikeyutil.cpp: change around qDebug() usage to get rid of warnings 2014-01-10 Klas Lindfors * NEWS, YKPersonalization.pro: bump versions 2014-01-10 Klas Lindfors * NEWS: news for 3.1.14 2014-01-10 Klas Lindfors * src/ui/confirmbox.ui: set a minimum width for the confirmbox text 2014-01-10 Klas Lindfors * src/ui/confirmbox.ui: let the confirmbox expand 2014-01-10 Klas Lindfors * src/ui/toolpage.ui: drop the placeholdertext completely 2014-01-10 Klas Lindfors * src/ui/diagnostics.cpp: fixup mac version 2014-01-10 Klas Lindfors * NEWS, YKPersonalization.pro: bump versions after release 2014-01-10 Klas Lindfors * NEWS: NEWS for 3.1.13 2014-01-10 Klas Lindfors * : commit be3540fa8b3c5e9dc45b5587b4b427f28dde9fd8 Author: mistertoh Date: Fri Jan 10 11:20:10 2014 +0100 2014-01-10 Klas Lindfors * src/ui/toolpage.cpp, src/ui/toolpage.ui: don't use placeholder for the default neo url, just set it as text and improve reset on Ndef page 2014-01-07 Klas Lindfors * src/ui/toolpage.cpp, src/ui/toolpage.ui: change the NDEF example to be the default string 2014-01-07 Klas Lindfors * COPYING, resources/win/resources.rc, src/ui/chalresppage.cpp, src/ui/chalresppage.h, src/ui/mainwindow.cpp, src/ui/mainwindow.h, src/ui/oathpage.cpp, src/ui/oathpage.h, src/ui/otppage.cpp, src/ui/otppage.h, src/ui/settingpage.cpp, src/ui/settingpage.h, src/ui/staticpage.cpp, src/ui/staticpage.h, src/ui/toolpage.cpp, src/ui/toolpage.h, src/ui/yubiaccbox.cpp, src/ui/yubiaccbox.h, src/version.h, src/yubikeyfinder.cpp, src/yubikeyfinder.h, src/yubikeywriter.cpp, src/yubikeywriter.h: bump copyright 2014-01-07 Klas Lindfors * src/ui/chalresppage.cpp, src/ui/chalresppage.h, src/ui/helpbox.ui, src/ui/mainwindow.cpp, src/ui/mainwindow.h, src/ui/oathpage.cpp, src/ui/oathpage.h, src/ui/otppage.cpp, src/ui/otppage.h, src/ui/settingpage.cpp, src/ui/settingpage.h, src/ui/staticpage.cpp, src/ui/staticpage.h, src/ui/toolpage.cpp, src/ui/toolpage.h, src/ui/yubiaccbox.cpp, src/ui/yubiaccbox.h: make the help pages non-modal and make it a child of mainwindow and just send signals there when we want it shown. 2014-01-07 Klas Lindfors * src/ui/diagnostics.ui, src/ui/mainwindow.cpp: make the diagnostics window non-modal 2014-01-03 Klas Lindfors * src/yubikeyfinder.cpp: clear touchLevel when initing 2014-01-03 Klas Lindfors * src/yubikeyfinder.cpp: add touch level to key diagnostics 2014-01-03 Klas Lindfors * src/yubikeywriter.cpp: more diagnostics for successful write-key operations 2014-01-03 Klas Lindfors * src/ui/diagnostics.cpp, src/ui/diagnostics.h: add an info diagnostics message with varios versions 2014-01-03 Klas Lindfors * src/yubikeyfinder.cpp: force serial to a string in diagnostic message otherwise we will call the wrong arg() 2014-01-03 Klas Lindfors * src/yubikeyfinder.cpp, src/yubikeywriter.cpp: add qualifier to usb errors. 2014-01-03 Klas Lindfors * src/ui/diagnostics.cpp: add date to the diagnostic messages 2014-01-03 Klas Lindfors * src/yubikeyfinder.cpp: add diagnostic message when a key is inserted 2014-01-03 Klas Lindfors * YKPersonalization.pro, src/ui/diagnostics.cpp, src/ui/diagnostics.h, src/ui/diagnostics.ui, src/ui/mainwindow.cpp, src/ui/mainwindow.h, src/ui/mainwindow.ui, src/yubikeyfinder.cpp, src/yubikeyfinder.h, src/yubikeywriter.cpp, src/yubikeywriter.h: add a diagnostics view with more complete error messages 2014-01-02 Klas Lindfors * src/ui/settingpage.ui: try to make version compability on settingpage clearer 2013-12-30 Klas Lindfors * NEWS, YKPersonalization.pro: bump versions after release 2013-12-30 Klas Lindfors * NEWS: NEWS for 3.1.12 2013-12-30 Klas Lindfors * : commit b9e5bdcd47f777e7bd29b1021f9d9cfa627527c2 Author: mistertoh Date: Mon Dec 30 14:24:16 2013 +0100 2013-12-02 Klas Lindfors * src/help.h: fix typo defer -> differ 2013-12-02 Klas Lindfors * : commit 90de271eb1dd877f4db807e3645b9a2b6c73f27a Author: mistertoh Date: Mon Dec 2 14:41:49 2013 +0100 2013-10-28 Klas Lindfors * : Merge pull request #28 from mistertoh/master Fix Icon Position 2013-10-28 Klas Lindfors * : Merge pull request #27 from mistertoh/master Fix Typo Challenge Response -> Challenge-Response 2013-10-28 Klas Lindfors * : Merge pull request #26 from mistertoh/master Fix Typo 2013-10-09 Klas Lindfors * NEWS, YKPersonalization.pro: bump versions 2013-10-09 Klas Lindfors * NEWS: release 3.1.11 2013-09-26 Klas Lindfors * src/help.h, src/yubikeylogger.cpp: add endl and tab variables to logging 2013-09-26 Klas Lindfors * src/yubikeylogger.cpp, src/yubikeylogger.h: make the logging local resolver take the name as string to reduce the amount of similar resolvers 2013-09-26 Klas Lindfors * src/ui/settingpage.cpp: disable the format edit when not in flexible format 2013-09-26 Klas Lindfors * NEWS: add NEWS for flexible logging 2013-09-26 Klas Lindfors * build-homepage.sh: drop build-homepage script 2013-09-26 Klas Lindfors * BLURB: add category to BLURB 2013-09-26 Klas Lindfors * BLURB: BLURB for yubikey-personalization-gui 2013-09-26 Klas Lindfors * src/help.h, src/ui/helpbox.cpp, src/ui/helpbox.h, src/ui/settingpage.cpp, src/ui/settingpage.ui: add help for the flexible logging format 2013-09-26 Klas Lindfors * src/yubikeylogger.cpp, src/yubikeylogger.h: add getting a list of lognames 2013-09-26 Klas Lindfors * YKPersonalization.pro, src/common.h, src/help.h, src/ui/helpbox.cpp: move help texts to it's own header to reduce re-compile times due to changed texts.. 2013-09-26 Klas Lindfors * src/common.h, src/ui/settingpage.cpp, src/ui/settingpage.ui, src/yubikeylogger.cpp, src/yubikeylogger.h: add a flexible logformat with configurable input 2013-09-26 Klas Lindfors * src/ui/settingpage.cpp, src/ui/settingpage.ui: change the radio buttons for logformat to a combobox 2013-09-26 Klas Lindfors * src/common.h, src/ui/yubiaccbox.cpp: move defines for accbox to yubiaccbox.cpp from common.h 2013-09-26 Klas Lindfors * src/common.h, src/ui/settingpage.cpp: localize OUT_CHAR_RATE defines to settingpage.cpp 2013-09-26 Klas Lindfors * src/yubikeylogger.cpp, src/yubikeylogger.h: refactor building of the logging string to use a lookup table and format-strings, calling methods in the YubikeyConfig class by name instead. This will allow building more flexible logging schemes. 2013-09-26 Klas Lindfors * src/yubikeyconfig.h: make YubikeyConfig a QObject and it's getter methods invokable this will make the getter methods available for calling by name through the meta object. 2013-09-20 Klas Lindfors * NEWS: add NEWS for the next version 2013-09-19 Klas Lindfors * src/yubikeyfinder.cpp, src/yubikeyfinder.h: fix so we recheck the key after regaining focus add a new state to the finder NoFocus, when running the find cycle re-read all info if NoFocus is set as well. 2013-09-17 Klas Lindfors * resources/win/resources.rc, src/version.h: and change around again utf8 in src/version.h latin1 in resources/win/resources.rc 2013-09-17 Klas Lindfors * src/ui/aboutpage.cpp, src/version.h: revert back to latin1 for the copyright sign but use tr() utf8 broke in the windows resource file and in some versions of qt. 2013-09-17 Klas Lindfors * YKPersonalization.pro, resources/win/resources.rc: make version numbering work on windows 2013-09-17 Klas Lindfors * : Merge pull request #24 from eworm-de/encoding fix encoding for copyright sign 2013-09-17 Klas Lindfors * src/common.h, src/ui/mainwindow.cpp, src/yubikeyfinder.cpp, src/yubikeywriter.cpp: Allow writing of keys with unknown firmware Print a warning in place of "YubiKey inserted" fixes #23 2013-09-17 Klas Lindfors * YKPersonalization.pro, src/ui/confirmbox.cpp, src/ui/mainwindow.cpp, src/ui/otppage.cpp, src/ui/scanedit.cpp, src/ui/settingpage.cpp, src/ui/staticpage.cpp, src/ui/yubiaccbox.cpp, src/ui/yubiaccbox.h, src/yubikeyfinder.cpp, src/yubikeywriter.cpp: support qt5 2013-09-17 Klas Lindfors * src/common.h, src/ui/aboutpage.cpp, src/ui/chalresppage.cpp, src/ui/mainwindow.cpp, src/ui/mainwindow.h, src/ui/mainwindow.ui, src/ui/oathpage.cpp, src/ui/otppage.cpp, src/ui/settingpage.cpp, src/ui/staticpage.cpp, src/ui/toolpage.cpp, src/ui/yubiaccbox.cpp, src/yubikeyfinder.cpp, src/yubikeyfinder.h: handle error messages when opening key Adds proper output for the case when there's more than one key present fixes #9 2013-08-05 Klas Lindfors * src/ui/toolpage.ui: re-add the importBox as a qWidget fixes compilation errors and hopefully doesn't show the box fixes #22 2013-07-05 Klas Lindfors * build-homepage.sh: drop news file from homepage 2013-07-24 Simon Josefsson * resources/lin/yubikey-personalization-gui.desktop: Add Keywords to desktop file. 2013-07-04 Klas Lindfors * src/ui/toolpage.ui: drop box around import 2013-07-04 Klas Lindfors * YKPersonalization.pro, src/version.h: fix windows build by fiddling some with version 2013-07-04 Klas Lindfors * NEWS, YKPersonalization.pro: bump versions post-release 2013-07-04 Klas Lindfors * do-source-release.sh: fix release script for new VERSION format 2013-07-04 Klas Lindfors * NEWS: release 3.1.10 2013-07-02 Klas Lindfors * src/yubikeylogger.cpp: don't try to open file if we don't have a filename 2013-07-02 Klas Lindfors * src/yubikeywriter.cpp: drop the write_config way and only write it out with qDebug() 2013-07-01 Klas Lindfors * src/ui/settingpage.ui: make sure all text is shown 2013-07-01 Klas Lindfors * src/yubikeywriter.cpp: set acces code mode to the library 2013-07-01 Klas Lindfors * src/common.h, src/ui/chalresppage.cpp, src/ui/oathpage.cpp, src/ui/otppage.cpp, src/ui/settingpage.cpp, src/ui/staticpage.cpp, src/ui/yubiaccbox.cpp, src/ui/yubiaccbox.h, src/yubikeyconfig.cpp, src/yubikeyconfig.h: code to set the mode of acccode in the yubikeyconfig object 2013-07-01 Klas Lindfors * src/common.h, src/main.cpp, src/ui/aboutpage.cpp, src/ui/chalresppage.cpp, src/ui/mainwindow.cpp, src/ui/oathpage.cpp, src/ui/otppage.cpp, src/ui/scanedit.cpp, src/ui/settingpage.cpp, src/ui/staticpage.cpp, src/ui/toolpage.cpp, src/ui/yubiaccbox.cpp, src/yubikeyconfig.h, src/yubikeyfinder.cpp, src/yubikeyfinder.h, src/yubikeylogger.h, src/yubikeyutil.cpp, src/yubikeywriter.cpp, src/yubikeywriter.h: include cleanup. 2013-07-01 Klas Lindfors * src/ui/yubiaccbox.cpp: if we want to keep accCode, return the old one as new 2013-07-01 Klas Lindfors * src/ui/mainwindow.cpp, src/ui/mainwindow.h: move around inclusions of "other" forms to avoid unnecessary re-compilations 2013-06-28 Klas Lindfors * src/ui/toolpage.cpp, src/ui/toolpage.ui: disable import when no key is inserted 2013-06-28 Klas Lindfors * src/ui/toolpage.cpp, src/ui/toolpage.h, src/ui/toolpage.ui: add serial checkbox for ndef and zap acc code 2013-06-28 Klas Lindfors * YKPersonalization.pro: move around 2013-06-28 Klas Lindfors * src/ui/chalresppage.cpp, src/ui/oathpage.cpp, src/ui/otppage.cpp, src/ui/staticpage.cpp, src/ui/toolpage.cpp, src/ui/yubiaccbox.cpp: mark unused parameters as unused 2013-06-28 Klas Lindfors * src/ui/scanedit.cpp: use toUInt() to get an unsigned variable for comparison 2013-06-28 Klas Lindfors * src/yubikeywriter.cpp: fix warning 2013-06-28 Klas Lindfors * src/yubikeyutil.cpp: fix warnings 2013-06-25 Klas Lindfors * YKPersonalization.pro: add build config flag force_pkgconfig 2013-06-25 Klas Lindfors * README: we now depend on 1.14.0 of yubikey-personalization 2013-06-24 Klas Lindfors * src/ui/toolpage.cpp, src/ui/toolpage.ui: try to make uri example clearer with a placeholder on ndefEdit 2013-06-07 Klas Lindfors * src/ui/yubiaccbox.cpp: remove unecessary check if m_serial is set 2013-06-07 Klas Lindfors * src/ui/yubiaccbox.cpp, src/ui/yubiaccbox.h: implement serial functionality 2013-06-07 Klas Lindfors * src/ui/yubiaccbox.cpp, src/ui/yubiaccbox.ui: add serial checkboxes 2013-06-06 Klas Lindfors * src/ui/yubiaccbox.ui: set stylesheet for the accbox 2013-06-05 Klas Lindfors * src/ui/settingpage.cpp, src/ui/settingpage.h, src/ui/settingpage.ui: refactor settingpage usage of access code to use new box 2013-06-05 Klas Lindfors * src/ui/chalresppage.cpp, src/ui/chalresppage.h, src/ui/chalresppage.ui: refactor chalresppage to use new access code box 2013-06-05 Klas Lindfors * src/ui/staticpage.cpp, src/ui/staticpage.h, src/ui/staticpage.ui: refactor staticpage to use new access box 2013-06-05 Klas Lindfors * src/ui/oathpage.cpp, src/ui/oathpage.h, src/ui/oathpage.ui: refactor the oath page to use new access code box 2013-06-05 Klas Lindfors * src/ui/otppage.cpp, src/ui/otppage.h, src/ui/otppage.ui: refactor to use the broken-out config protection box 2013-06-05 Klas Lindfors * YKPersonalization.pro, src/ui/yubiaccbox.cpp, src/ui/yubiaccbox.h, src/ui/yubiaccbox.ui: break out the config protection box into it's own widget 2013-06-03 Klas Lindfors * src/ui/toolpage.cpp: make sure the buffer for decoding hex/modhex into is large enough it has to be number of bytes * 2 for decoding. fixes #18 2013-05-03 Klas Lindfors * YKPersonalization.pro: only enable silent if nosilent isn't set 2013-05-03 Klas Lindfors * src/ui/scanedit.cpp: old bug make sure we don't access after end of array code was changed earlier to xor with SHIFT before and store it 2013-05-03 Klas Lindfors * src/ui/settingpage.ui: move box around to fix ui issues 2013-05-02 Klas Lindfors * src/common.h, src/ui/mainwindow.cpp, src/ui/settingpage.cpp, src/ui/staticpage.cpp, src/ui/staticpage.h, src/ui/toolpage.cpp: handle strong_pw stuff as settings 2013-05-02 Klas Lindfors * src/ui/chalresppage.cpp, src/ui/chalresppage.h, src/ui/mainwindow.cpp, src/ui/mainwindow.h, src/ui/oathpage.cpp, src/ui/oathpage.h, src/ui/otppage.cpp, src/ui/otppage.h, src/ui/staticpage.cpp, src/ui/staticpage.h, src/ui/toolpage.cpp, src/ui/toolpage.h: let the import feature select slots 2013-05-02 Klas Lindfors * YKPersonalization.pro: only use productbuild for app store builds 2013-04-30 Klas Lindfors * src/common.h, src/ui/chalresppage.cpp, src/ui/chalresppage.h, src/ui/settingpage.cpp, src/ui/toolpage.cpp: handle hmac_lt64 as a setting 2013-04-30 Klas Lindfors * src/common.h, src/ui/chalresppage.cpp, src/ui/chalresppage.h, src/ui/settingpage.cpp, src/ui/toolpage.cpp: treat btn_trig as a setting 2013-04-30 Klas Lindfors * src/common.h, src/ui/oathpage.cpp, src/ui/oathpage.h, src/ui/settingpage.cpp, src/ui/toolpage.cpp: handle oath digits by remembering the setting 2013-04-29 Klas Lindfors * YKPersonalization.pro, do-source-release.sh, src/version.h: only keep version in YKPersonalization.pro 2013-04-29 Klas Lindfors * src/ui/settingpage.ui: export and import 2013-04-26 Klas Lindfors * src/ui/toolpage.cpp: save filename if import was ok 2013-04-26 Klas Lindfors * src/ui/toolpage.cpp: import alot of settings 2013-04-26 Klas Lindfors * src/ui/mainwindow.cpp, src/ui/toolpage.cpp, src/ui/toolpage.h: switch page according to inmported cfg 2013-04-26 Klas Lindfors * src/ui/mainwindow.cpp, src/ui/mainwindow.h: add code to switch to specific tab on page 2013-04-26 Klas Lindfors * src/ui/chalresppage.h, src/ui/oathpage.h, src/ui/otppage.h, src/ui/settingpage.h, src/ui/staticpage.h, src/ui/toolpage.h: make setCurrentPage a public slot 2013-04-26 Klas Lindfors * src/ui/mainwindow.cpp, src/ui/settingpage.cpp, src/ui/settingpage.h, src/ui/toolpage.h: add a reloadSettings slot/signal 2013-04-26 Klas Lindfors * src/ui/chalresppage.h, src/ui/oathpage.h, src/ui/otppage.h, src/ui/settingpage.h, src/ui/staticpage.h, src/ui/toolpage.h: move all Page elements to public 2013-04-26 Klas Lindfors * src/yubikeywriter.cpp: use YK_STATUS object from yubikeyfinder instead 2013-04-26 Klas Lindfors * src/yubikeyfinder.cpp, src/yubikeyfinder.h: move the ykstatus object to class level and make it fetchable for others 2013-04-25 Klas Lindfors * src/ui/toolpage.cpp: start on importing configuration 2013-04-25 Klas Lindfors * src/common.h, src/ui/settingpage.cpp, src/ui/toolpage.cpp, src/ui/toolpage.h: filenames for import 2013-04-25 Klas Lindfors * src/ui/mainwindow.cpp, src/ui/toolpage.cpp, src/ui/toolpage.h, src/ui/toolpage.ui: add basis of import tab to toolpage 2013-04-22 Klas Lindfors * : re-generate .icns file for mac 2013-04-22 Klas Lindfors * resources/mac/Info.plist.in: add CFBundleShortVersionString 2013-04-22 Klas Lindfors * NEWS, YKPersonalization.pro, src/version.h: bump versions 2013-04-22 Klas Lindfors * NEWS: NEWS 2013-04-22 Klas Lindfors * src/common.h, src/ui/settingpage.cpp, src/yubikeylogger.cpp, src/yubikeylogger.h, src/yubikeywriter.cpp, src/yubikeywriter.h: remember selected locations for log and export and reuse resolves #16 2013-04-19 Klas Lindfors * src/yubikeylogger.cpp, src/yubikeywriter.cpp: better default paths for file dialogs 2013-04-19 Klas Lindfors * src/common.h, src/ui/chalresppage.cpp, src/ui/chalresppage.h, src/ui/mainwindow.cpp, src/ui/oathpage.cpp, src/ui/otppage.cpp, src/ui/settingpage.cpp, src/ui/settingpage.ui: add a setting for enable/disable export config 2013-04-18 Klas Lindfors * src/yubikeywriter.cpp: YKP_FORMAT_JSON changed to YKP_FORMAT_YCFG 2013-04-18 Klas Lindfors * YKPersonalization.pro: deal with moving qt_menu.nib if it's already moved 2013-04-18 Klas Lindfors * src/ui/settingpage.ui: move around logging settings 2013-04-18 Klas Lindfors * : commit 2dab637d23070be7a6e146a1d5e4b2e60673ba0d Author: Klas Lindfors Date: Thu Apr 18 13:57:52 2013 +0100 2013-04-18 Klas Lindfors * YKPersonalization.pro: add for_store build flags 2013-04-18 Klas Lindfors * resources/mac/Info.plist.in: add application category 2013-04-18 Klas Lindfors * YKPersonalization.pro: for mac use config for_store to select appropriate certificates 2013-04-18 Klas Lindfors * YKPersonalization.pro: run productbuild instead of pkgbuild 2013-04-16 Klas Lindfors * YKPersonalization.pro: add license files for osx 2013-04-16 Klas Lindfors * YKPersonalization.pro, installer/win-nsis/ykpers.nsi: include licenses in windows installer 2013-04-16 Klas Lindfors * YKPersonalization.pro: merge two win32 blocks 2013-04-16 Klas Lindfors * YKPersonalization.pro, resources/mac/Entitlements.plist: use app sandbox on osX 2013-04-16 Klas Lindfors * README: update instructions 2013-04-16 Klas Lindfors * YKPersonalization.pro: simplify mac build 2013-04-16 Klas Lindfors * YKPersonalization.pro: rework macx build to work with binary package of libykpers 2013-04-15 Klas Lindfors * YKPersonalization.pro: change around so the dll files come from the packed up zip 2013-04-15 Klas Lindfors * src/yubikeylogger.cpp, src/yubikeywriter.cpp: set filters for selected files 2013-04-15 Klas Lindfors * src/ui/settingpage.cpp, src/ui/settingpage.h, src/ui/settingpage.ui, src/yubikeylogger.cpp, src/yubikeylogger.h: change around for logging to go by QFileDialog With this the user has to select which file to log to when the first write occurs. solves #3 2013-04-15 Klas Lindfors * YKPersonalization.pro, installer/win-nsis/ykpers.nsi: add json dll for windows build 2013-04-15 Klas Lindfors * installer/win32/Installer.sln, installer/win32/Installer/Installer.vdproj: drop old windows installer 2013-04-15 Klas Lindfors * src/ui/chalresppage.cpp, src/ui/chalresppage.h, src/ui/chalresppage.ui, src/ui/oathpage.cpp, src/ui/oathpage.h, src/ui/oathpage.ui, src/ui/otppage.cpp: implement export for oath and chalresp 2013-04-15 Klas Lindfors * src/ui/otppage.cpp: same rules for export as write 2013-04-15 Klas Lindfors * src/yubikeywriter.cpp: little bit more error-checking 2013-04-15 Klas Lindfors * src/common.h, src/ui/otppage.cpp, src/ui/otppage.h, src/ui/otppage.ui: add exporting of otp 2013-04-15 Klas Lindfors * src/yubikeywriter.cpp, src/yubikeywriter.h: add exportConfig method and split out assembling the configuration 2013-04-11 Dain Nilsson * do-source-release.sh: Use publish script in YUBICO_GITHUB_REPO 2013-04-05 Klas Lindfors * build-homepage.sh, do-source-release.sh: change release scripts around to work with yubico.github.com 2013-04-04 Simon Josefsson * resources/lin/yubikey-personalization-gui.1, src/common.h, src/crandom.cpp, src/crandom.h, src/main.cpp, src/otpdef.h, src/ui/aboutpage.cpp, src/ui/aboutpage.h, src/ui/chalresppage.cpp, src/ui/chalresppage.h, src/ui/confirmbox.cpp, src/ui/confirmbox.h, src/ui/helpbox.cpp, src/ui/helpbox.h, src/ui/mainwindow.cpp, src/ui/mainwindow.h, src/ui/oathpage.cpp, src/ui/oathpage.h, src/ui/otppage.cpp, src/ui/otppage.h, src/ui/scanedit.cpp, src/ui/scanedit.h, src/ui/settingpage.cpp, src/ui/settingpage.h, src/ui/staticpage.cpp, src/ui/staticpage.h, src/ui/toolpage.cpp, src/ui/toolpage.h, src/yubikeyconfig.cpp, src/yubikeyconfig.h, src/yubikeyfinder.cpp, src/yubikeyfinder.h, src/yubikeylogger.cpp, src/yubikeylogger.h, src/yubikeyutil.cpp, src/yubikeyutil.h, src/yubikeywriter.cpp, src/yubikeywriter.h: Bump copyright years. 2013-03-18 Klas Lindfors * NEWS, YKPersonalization.pro, src/version.h: bump versions post-release 2013-03-18 Klas Lindfors * NEWS: release 3.1.8 2013-03-15 Klas Lindfors * src/ui/oathpage.cpp, src/ui/oathpage.h: correctly add the MUI part to public id for oath fixes #12 broken in 5fa2fb7 and released in 3.1.3.. 2013-03-14 Klas Lindfors * NEWS, YKPersonalization.pro, src/version.h: bump versions post-release 2013-03-14 Klas Lindfors * build-homepage.sh: no -e for homepage build 2013-03-14 Klas Lindfors * NEWS: release 3.1.7 2013-03-14 Klas Lindfors * src/ui/otppage.cpp: switch to using fromLocalFile() to construct instead of specing file:// 2013-03-14 Klas Lindfors * NEWS: NEWS for 3.1.7 2013-03-13 Klas Lindfors * README: LED_INV didn't appear until version 1.12 2013-03-13 Klas Lindfors * src/common.h, src/ui/settingpage.cpp, src/ui/settingpage.ui, src/yubikeyconfig.cpp, src/yubikeyconfig.h, src/yubikeyfinder.cpp, src/yubikeyfinder.h, src/yubikeywriter.cpp: move around and add LED_INV support 2013-03-11 Klas Lindfors * src/ui/oathpage.cpp, src/ui/oathpage.h: cleanup, remove unused stuff m_pubIdFormat was never read, calls to update...() didn't have any effect. 2013-03-11 Klas Lindfors * src/ui/oathpage.cpp: drop commented code 2013-03-11 Klas Lindfors * src/ui/oathpage.cpp: fixup entering of MUI contained code that overwrote the bounds of m_pubid and did other unnecessary things. Fixes #11 2013-02-28 Klas Lindfors * src/common.h, src/ui/otppage.cpp, src/ui/otppage.h: change around so we don't send the uploaded key as a GET instead write a temp file with an auto-submitting form that does a POST to upload.yubico.com 2013-02-26 Klas Lindfors * src/ui/staticpage.ui: add a + to indicate that it's version 2.2 and later 2013-02-21 Klas Lindfors * NEWS, YKPersonalization.pro, src/version.h: bump versions post-release 2013-02-21 Klas Lindfors * NEWS: news for override box 2013-02-21 Klas Lindfors * src/common.h, src/ui/confirmbox.cpp, src/ui/toolpage.cpp: make the override box on ndef without http work 2013-02-21 Klas Lindfors * YKPersonalization.pro: point to rcc for win32 build 2013-02-21 Klas Lindfors * YKPersonalization.pro: declare that we use exceptions 2013-02-21 Klas Lindfors * NEWS: release 3.1.6 2013-02-18 Klas Lindfors * src/yubikeywriter.cpp: only set imf if the key is capable of it 2013-02-18 Dain Nilsson * src/yubikeyfinder.cpp: Fixed memory leak introduced in last commit. 2013-02-08 Dain Nilsson * src/yubikeyfinder.cpp: Only lock the YubiKey when we have window focus. 2013-01-10 Klas Lindfors * NEWS, YKPersonalization.pro, src/version.h: bump versions after release 2013-01-10 Klas Lindfors * NEWS: release 3.1.5 2013-01-10 Klas Lindfors * YKPersonalization.pro: add ykpers-version.c for inline build of ykpers 2013-01-09 Klas Lindfors * COPYING, NEWS, YKPersonalization.pro, do-source-release.sh, src/version.h: bump versions and copyrights 2013-01-09 Klas Lindfors * YKPersonalization.pro: set version to 3.1.4 2013-01-09 Klas Lindfors * NEWS: news for 3.1.4 2013-01-09 Klas Lindfors * src/common.h, src/ui/confirmbox.cpp, src/ui/confirmbox.h, src/ui/toolpage.cpp: add a confirm if the entered uri does not start with http 2013-01-07 Klas Lindfors * build-homepage.sh: add NEWS to homepage 2012-12-28 Klas Lindfors * README, YKPersonalization.pro, src/ui/aboutpage.cpp, src/ui/aboutpage.ui: display library version on about page 2012-12-21 Klas Lindfors * NEWS, src/version.h: bump versions after release 2012-12-21 Klas Lindfors * do-source-release.sh: remove trailing comma 2012-12-21 Klas Lindfors * do-source-release.sh: update do-source-release properly. 2012-12-21 Klas Lindfors * NEWS: news and release for 3.1.3 2012-12-21 Klas Lindfors * do-source-release.sh: remove USER 2012-12-21 Klas Lindfors * do-source-release.sh: switch to gh-pages for releases 2012-12-21 Klas Lindfors * build-homepage.sh: script to build the homepage in the gh-pages branch 2012-12-21 Klas Lindfors * README: change some formatting to match asciidoc better 2012-12-21 Klas Lindfors * README: README updates 2012-12-21 Klas Lindfors * YKPersonalization.pro.user.lin, YKPersonalization.pro.user.mac, YKPersonalization.pro.user.win: drop files that we generate anyways 2012-12-21 Klas Lindfors * README.binary_dists: some useful qmake invocations 2012-12-21 Klas Lindfors * YKPersonalization.pro: add code for signing windows binaries as part of the build 2012-12-20 Klas Lindfors * YKPersonalization.pro: no $$ when checking isEmpty() 2012-12-20 Klas Lindfors * YKPersonalization.pro: cleanup libraries and remove unused header 2012-12-20 Klas Lindfors * src/ui/oathpage.h: mui should be unsigned 2012-12-20 Klas Lindfors * src/ui/oathpage.cpp: make sure we zero-out mui on reset 2012-12-20 Klas Lindfors * YKPersonalization.pro: fix release build for windows, cleanup. 2012-12-20 Klas Lindfors * src/ui/oathpage.cpp, src/ui/oathpage.h: don't do fancy bcd tricks with MUI, just keep it in an int 2012-12-20 Klas Lindfors * YKPersonalization.pro: config for creating windows debug builds 2012-12-20 Klas Lindfors * src/yubikeyfinder.cpp: fix a file descriptor leak that caused windows to fail after 44 writes 2012-12-18 Klas Lindfors * NEWS, src/common.h, src/yubikeywriter.cpp, src/yubikeywriter.h: don't reuse the general error message for challenge-response 2012-12-18 Klas Lindfors * YKPersonalization.pro: make compiling silent 2012-12-18 Klas Lindfors * NEWS: add NEWS for 3.1.3 2012-12-18 Klas Lindfors * src/common.h, src/ui/mainwindow.cpp, src/ui/mainwindow.h, src/ui/mainwindow.ui: add support for stopping animation (and saving that in settings) 2012-12-17 Klas Lindfors * YKPersonalization.pro, installer/win-nsis/ykpers.nsi, resources/images/README.mng, resources/resources.qrc, src/ui/mainwindow.cpp: switch from gifs to mng 2012-12-17 Klas Lindfors * : new pictures 2012-12-11 Klas Lindfors * resources/resources.qrc, src/ui/mainwindow.cpp: new picture for production neo 2012-11-20 Klas Lindfors * src/ui/settingpage.ui: change wording for update to update settings 2012-11-12 Klas Lindfors * src/ui/settingpage.cpp: add forgotten save on selecting pacing 2012-11-12 Klas Lindfors * src/yubikeywriter.cpp: fixup last commit that was broken, remove correct ykst 2012-11-12 Klas Lindfors * src/yubikeywriter.cpp: remove unnecessary status struct and call yk_check_firmware2() when we have it 2012-11-12 Klas Lindfors * src/ui/toolpage.cpp, src/ui/toolpage.ui, src/yubikeywriter.cpp, src/yubikeywriter.h: support for writing SLOT_NDEF2 for production neo 2012-11-12 Klas Lindfors * src/ui/mainwindow.cpp: correct picture for production neo 2012-11-12 Klas Lindfors * src/yubikeyfinder.cpp: features for yubikey 3.0 (neo) 2012-11-09 Klas Lindfors * src/ui/otppage.cpp: run the editingFinished hook on public id after setting it to serial 2012-11-07 Klas Lindfors * NEWS, YKPersonalization.pro, src/version.h: bump versions to 3.1.3 2012-11-07 Klas Lindfors * NEWS: release 3.1.2 2012-11-06 Klas Lindfors * src/ui/settingpage.ui: put ... to show that update leads to a new page 2012-10-31 Klas Lindfors * src/ui/settingpage.ui: some wording on versions and box sizes. 2012-10-31 Klas Lindfors * src/ui/settingpage.cpp, src/ui/settingpage.ui: remove save button and write out that we autosave 2012-10-26 Klas Lindfors * NEWS: news for 3.1.2 2012-10-26 Klas Lindfors * installer/win-nsis/ykpers.nsi: create all start menu items in the same place and make sure they're removed when uninstalled 2012-10-26 Klas Lindfors * installer/win-nsis/ykpers.nsi: set a default startmenu folder under Yubico 2012-10-23 Klas Lindfors * src/ui/otppage.cpp: set new parameters on key insertion, not removal 2012-10-23 Klas Lindfors * src/ui/mainwindow.cpp: remove the movie field if it's set before setting a new one 2012-10-23 Klas Lindfors * src/ui/chalresppage.cpp, src/ui/chalresppage.h, src/ui/oathpage.cpp, src/ui/oathpage.h, src/ui/otppage.cpp, src/ui/otppage.h, src/ui/staticpage.cpp, src/ui/staticpage.h: keep track of the keys state when writing multiple keys otherwise we'll trigger on the keyFound event after it's written 2012-10-19 Klas Lindfors * src/ui/toolpage.cpp, src/ui/toolpage.h, src/yubikeywriter.cpp: add message on successful config deletion 2012-10-19 Klas Lindfors * src/ui/toolpage.cpp, src/ui/toolpage.h, src/ui/toolpage.ui, src/yubikeywriter.cpp, src/yubikeywriter.h: add access code entry for ndef programming 2012-10-19 Klas Lindfors * src/ui/toolpage.cpp, src/ui/toolpage.h, src/ui/toolpage.ui: add access code entry for delete 2012-10-18 Klas Lindfors * src/ui/toolpage.cpp: call deleteConfig() 2012-10-18 Klas Lindfors * src/yubikeywriter.cpp, src/yubikeywriter.h: deleteConfig() slot 2012-10-18 Klas Lindfors * src/yubikeyfinder.cpp: clear the finder object when starting, so it re-reads key 2012-10-18 Klas Lindfors * src/yubikeywriter.cpp, src/yubikeywriter.h: break out accesscode formatting into it's own function 2012-10-18 Klas Lindfors * src/ui/toolpage.cpp, src/ui/toolpage.h, src/ui/toolpage.ui: start with ui for deleting configuration 2012-10-18 Klas Lindfors * src/ui/mainwindow.ui: make the serial numbers selectable and copyable 2012-10-17 Klas Lindfors * NEWS, YKPersonalization.pro, src/version.h: bump versions after release 2012-10-17 Klas Lindfors * NEWS: add NEWS and release date for 3.1.1 2012-10-15 Klas Lindfors * src/ui/scanedit.cpp: don't try to access the usb2key arrays if the scancode is to high 2012-10-15 Klas Lindfors * src/ui/staticpage.cpp: take the scancodes directly from the scancode field, it's always populated 2012-10-12 Klas Lindfors * YKPersonalization.pro: do else:fedora to avoid debian branch falling into later else 2012-10-12 Klas Lindfors * src/ui/staticpage.cpp: set scancodes to password mode when hidden 2012-10-12 Klas Lindfors * src/ui/staticpage.cpp: set len to zero when clearing 2012-10-12 Klas Lindfors * src/ui/staticpage.cpp, src/ui/staticpage.h: capture a pressed return when editing text 2012-10-12 Klas Lindfors * installer/win-nsis/ykpers.nsi: don't show the components at all as we only have one 2012-10-12 Klas Lindfors * : commit 791a91cfffaded71855c788ae1932e5881f9da5c Author: Klas Lindfors Date: Fri Oct 12 08:36:48 2012 +0200 2012-10-11 Maxim Burgerhout * resources/lin/yubikey-personalization-gui.desktop, resources/lin/yubikey-personalization-gui.xpm: Add .desktop, .xpm and .png files These are from the yubikey-personalization-gui-dpkg repo on github. Putting them here will enable us to grab them from the tarball in the future, instead of directly from github. 2012-10-11 Maxim Burgerhout * YKPersonalization.pro: Linux build -> Generic Linux build 2012-10-11 Maxim Burgerhout * YKPersonalization.pro: Create a separate 'fedora' build target Copying this from the 'debian' target to make sure changes there will not bite us, and vice versa. 2012-10-11 Klas Lindfors * src/ui/chalresppage.ui, src/ui/oathpage.ui, src/ui/otppage.ui, src/ui/settingpage.ui, src/ui/staticpage.ui, src/ui/toolpage.ui: change height of radio buttons so whole button can be seen 2012-10-11 Klas Lindfors * src/ui/settingpage.cpp, src/ui/settingpage.ui: use validators instead of inputmask for all customer prefix fields 2012-10-11 Klas Lindfors * src/ui/scanedit.cpp, src/ui/scanedit.h, src/ui/staticpage.cpp, src/ui/staticpage.h, src/ui/staticpage.ui: rework the scancode input. allow editing and pasting, allow going back and forth between scan codes and text. 2012-10-10 Klas Lindfors * src/ui/staticpage.cpp, src/ui/staticpage.h, src/ui/staticpage.ui: add field for scan code input allowing either direct input as scan codes also showing the scancodes that will be programmed for standard text 2012-10-10 Klas Lindfors * src/yubikeyfinder.cpp: clear the struct when no key found, not when closing. when closing, clear m_yk 2012-10-10 Klas Lindfors * src/yubikeyfinder.cpp: always closeKey() when we're done with it in yubikeyfinder 2012-10-10 Klas Lindfors * src/yubikeyfinder.cpp, src/yubikeywriter.cpp: only do yk_init() / yk_release() in constructor/destructor of yubikeyfinder 2012-10-08 Klas Lindfors * YKPersonalization.pro: change name of linux installer 2012-10-08 Klas Lindfors * : commit a5339e308fc784cf6a996c8050a81bcf9e6abda9 Merge: 27b8dac 88ba617 Author: Klas Lindfors Date: Mon Oct 8 11:00:57 2012 +0200 2012-10-08 Klas Lindfors * resources/lin/YubiKey Personalization Tool.sh: fix binary name 2012-10-08 Klas Lindfors * YKPersonalization.pro: fix search paths for linux "installer" 2012-10-08 Klas Lindfors * : commit a79a710011ebddc22fbab5477cc6b4b4a452cc54 Author: Klas Lindfors Date: Mon Oct 8 09:30:45 2012 +0100 2012-10-04 Klas Lindfors * YKPersonalization.pro: other libdir for natively installed qt.. 2012-10-04 Klas Lindfors * YKPersonalization.pro, resources/mac/installer.plist: installer fixups 2012-10-04 Klas Lindfors * YKPersonalization.pro: remove the headers from qt frameworks 2012-10-04 Klas Lindfors * .gitignore: add .DS_Store to .gitignore 2012-10-04 Klas Lindfors * YKPersonalization.pro: run install_name_tool for native builds 2012-10-04 Klas Lindfors * YKPersonalization.pro: use codesign and pkgbuild to build a signed installer 2012-10-04 Klas Lindfors * YKPersonalization.pro: fix installer name for native mac build 2012-10-04 Klas Lindfors * YKPersonalization.pro: native mac build fixes 2012-10-04 Klas Lindfors * YKPersonalization.pro: declare that we need qgif 2012-10-03 Klas Lindfors * .gitignore: ignore build artifacts and .swp files 2012-10-03 Klas Lindfors * : commit c373d05f7fb586c4810941eaa8cee32af2e30841 Author: Klas Lindfors Date: Wed Oct 3 10:05:31 2012 +0200 2012-10-03 Klas Lindfors * src/yubikeylogger.cpp: spelling timstamp -> timestamp 2012-10-03 Klas Lindfors * src/yubikeylogger.cpp: do start logging in traditional format 2012-10-03 Klas Lindfors * src/common.h, src/ui/settingpage.cpp, src/ui/settingpage.ui: add controls for the logging format 2012-10-03 Klas Lindfors * src/yubikeylogger.cpp: implement the yubico logging format 2012-10-03 Klas Lindfors * src/yubikeylogger.cpp: spelling timstamp -> timestamp 2012-10-03 Klas Lindfors * src/yubikeylogger.cpp: do start logging in traditional format 2012-10-03 Klas Lindfors * src/ui/settingpage.cpp: set logging format on load 2012-10-03 Klas Lindfors * src/common.h, src/ui/settingpage.cpp, src/ui/settingpage.ui: add controls for the logging format 2012-10-03 Klas Lindfors * src/yubikeylogger.cpp, src/yubikeylogger.h: add support for different formats to logger 2012-10-03 Klas Lindfors * src/ui/chalresppage.cpp, src/ui/oathpage.cpp, src/ui/otppage.cpp, src/ui/settingpage.cpp, src/ui/staticpage.cpp, src/yubikeyconfig.cpp, src/yubikeyconfig.h: add serial to yubikeyconfig class 2012-10-01 Klas Lindfors * src/ui/mainwindow.cpp, src/ui/mainwindow.ui, src/yubikeyfinder.cpp, src/yubikeyfinder.h: use touchLevel to find out what slots on inserted YubiKey is programmed 2012-10-01 Klas Lindfors * NEWS, YKPersonalization.pro, src/version.h: bump versions after release 2012-09-28 Klas Lindfors * NEWS, YKPersonalization.pro, src/version.h: bump versions for release 2012-09-28 Klas Lindfors * README: information about cross compiling 2012-09-28 Klas Lindfors * NEWS: NEWS 2012-09-28 Klas Lindfors * .gitignore: ignores 2012-09-28 Klas Lindfors * : add logo for dmg (not working) 2012-09-28 Klas Lindfors * YKPersonalization.pro: avoid rr-moved 2012-09-28 Klas Lindfors * : logo with correct color 2012-09-28 Klas Lindfors * YKPersonalization.pro: more dmg building 2012-09-28 Klas Lindfors * YKPersonalization.pro: switch to build_installer for both win and mac. start with dmg building 2012-09-28 Klas Lindfors * YKPersonalization.pro: only add libusb.h if we're building on linux 2012-09-28 Klas Lindfors * YKPersonalization.pro: move native dmg for mac into else of cross 2012-09-28 Klas Lindfors * YKPersonalization.pro, resources/mac/qt.conf: add qt.conf for mac 2012-09-28 Klas Lindfors * YKPersonalization.pro: change name of TARGET to TARGET_ARCH 2012-09-28 Klas Lindfors * YKPersonalization.pro: properly change the name 2012-09-28 Klas Lindfors * YKPersonalization.pro: finishing up the building of osx bundle 2012-09-28 Klas Lindfors * YKPersonalization.pro: only remove -arch if cross is defined 2012-09-28 Klas Lindfors * YKPersonalization.pro: remove trailing " 2012-09-28 Klas Lindfors * installer/win-nsis/ykpers.nsi: win-installer updates for new compilation unit 2012-09-28 Klas Lindfors * YKPersonalization.pro: mac updates 2012-09-28 Klas Lindfors * : new yubikey neo picture 2012-09-27 Klas Lindfors * YKPersonalization.pro, installer/win-nsis/ykpers.nsi: call makensis from make, output from nsis in build/release 2012-09-27 Klas Lindfors * YKPersonalization.pro, installer/win-nsis/ykpers.nsi: more build fixes, mostly win32 cross compiling. 2012-09-27 Klas Lindfors * YKPersonalization.pro, installer/win-nsis/ykpers.nsi: static-libstdc++ and static-libgcc gets rid of some deps 2012-09-27 Klas Lindfors * YKPersonalization.pro: att SDK includes to QT_INCDIR 2012-09-27 Klas Lindfors * YKPersonalization.pro: take pointer to SDK and define QT_MAC_USE_COCOA 2012-09-27 Klas Lindfors * YKPersonalization.pro: x86_64 for macx, that's what qt distributes. 2012-09-27 Klas Lindfors * YKPersonalization.pro: start with support for cross-compiling 2012-09-27 Klas Lindfors * YKPersonalization.pro: QMAKE_TARGET instead of QMAKE_HOST to find out the target 2012-09-27 Klas Lindfors * resources/resources.qrc, src/ui/mainwindow.cpp: new picture for 2.0 and 2.1 keys 2012-09-27 Klas Lindfors * installer/win-nsis/ykpers.nsi: correct \ instead of / 2012-09-27 Klas Lindfors * src/ui/settingpage.ui: move up help button 2012-09-27 Klas Lindfors * installer/win-nsis/ykpers.nsi: base for nsi installer 2012-09-27 Klas Lindfors * src/ui/settingpage.cpp: use another constructor to work with older qt 2012-09-26 Klas Lindfors * resources/resources.qrc, src/ui/mainwindow.cpp: add picture for 2.3 2012-09-26 Klas Lindfors * : update 2.2 picture 2012-09-26 Klas Lindfors * src/ui/settingpage.ui: shuffle things around on settingpage 2012-09-26 Klas Lindfors * src/ui/toolpage.ui: move boxes around on the toolpage 2012-09-26 Klas Lindfors * src/common.h, src/ui/helpbox.cpp, src/ui/helpbox.h, src/ui/settingpage.cpp, src/ui/settingpage.ui: help for manual update 2012-09-26 Klas Lindfors * src/ui/settingpage.ui: line up help buttons 2012-09-26 Klas Lindfors * src/ui/settingpage.cpp, src/ui/settingpage.h, src/ui/settingpage.ui: allow customer prefix to be entered in hex or modhex as well 2012-09-26 Klas Lindfors * src/ui/settingpage.ui: different wording on 2.3 features 2012-09-25 Klas Lindfors * src/ui/settingpage.ui, src/ui/toolpage.ui: move around some elements 2012-09-25 Klas Lindfors * resources/resources.qrc, src/ui/mainwindow.cpp: new 2.2 key image 2012-09-25 Klas Lindfors * src/yubikeywriter.cpp: store the challenge in a QByteArray to be sure it isn't deallocated 2012-09-25 Klas Lindfors * src/ui/toolpage.cpp, src/ui/toolpage.h, src/ui/toolpage.ui, src/yubikeywriter.cpp, src/yubikeywriter.h: ndef writing code 2012-09-25 Klas Lindfors * src/yubikeyfinder.cpp: neo has oath-hotp and imf from 2.1.7 2012-09-25 Klas Lindfors * resources/resources.qrc, src/ui/mainwindow.cpp, src/yubikeyfinder.cpp, src/yubikeyfinder.h: image fixing. images for neo and devel key. use pngs. 2012-09-24 Klas Lindfors * src/ui/mainwindow.ui: remove empty buddy 2012-09-24 Klas Lindfors * src/yubikeyfinder.cpp, src/yubikeyfinder.h: more NEO support. add ability to exclude versions from feature_matrix 2012-09-24 Klas Lindfors * src/common.h: typo 2012-09-24 Klas Lindfors * src/ui/mainwindow.cpp, src/ui/mainwindow.ui, src/yubikeyfinder.cpp, src/yubikeyfinder.h: show if the key supports Ndef 2012-09-24 Klas Lindfors * src/common.h, src/ui/aboutpage.cpp, src/ui/aboutpage.ui: add link to settings to main area in about. 2012-09-24 Klas Lindfors * src/common.h, src/ui/helpbox.cpp, src/ui/helpbox.h, src/ui/settingpage.cpp, src/yubikeyconfig.cpp, src/yubikeyconfig.h, src/yubikeywriter.cpp: change updatable to allow update 2012-09-24 Klas Lindfors * src/common.h, src/ui/settingpage.cpp, src/ui/settingpage.ui, src/yubikeyconfig.cpp, src/yubikeyconfig.h, src/yubikeywriter.cpp: add FAST_TRIG and USE_NUMERIC_KEYPAD 2012-09-24 Klas Lindfors * src/common.h, src/ui/helpbox.cpp, src/ui/helpbox.h, src/ui/settingpage.cpp, src/ui/settingpage.h, src/ui/settingpage.ui: enable swapping configurations in UI. 2012-09-24 Klas Lindfors * src/ui/settingpage.ui, src/yubikeyconfig.h, src/yubikeylogger.cpp, src/yubikeywriter.cpp: support for slot swapping 2012-09-24 Klas Lindfors * src/ui/settingpage.cpp, src/ui/settingpage.h, src/ui/settingpage.ui: controls for setting/disabling access code on update 2012-09-24 Klas Lindfors * src/ui/settingpage.cpp: messages on key update 2012-09-24 Klas Lindfors * src/ui/settingpage.cpp, src/yubikeyconfig.cpp, src/yubikeyconfig.h, src/yubikeywriter.cpp: support for dormant configuration 2012-09-24 Klas Lindfors * src/ui/settingpage.cpp, src/ui/settingpage.h, src/ui/settingpage.ui: more stuff for doing key update 2012-09-24 Klas Lindfors * src/yubikeyconfig.h, src/yubikeylogger.cpp, src/yubikeywriter.cpp: add support for updating configuration 2012-09-24 Klas Lindfors * src/ui/chalresppage.cpp: chalresppage doesn't need QDesktopServices 2012-09-24 Klas Lindfors * src/ui/settingpage.cpp, src/ui/settingpage.h, src/ui/settingpage.ui: make settingpage into several pages, start doing update stuff 2012-09-24 Klas Lindfors * src/ui/toolpage.h: toolpage doesn't need yubikeyconfig.h 2012-09-24 Klas Lindfors * src/common.h, src/ui/helpbox.cpp, src/ui/helpbox.h, src/ui/settingpage.cpp, src/ui/settingpage.ui, src/yubikeyconfig.cpp, src/yubikeyconfig.h, src/yubikeywriter.cpp: add updatable flag 2012-09-24 Klas Lindfors * src/main.cpp, src/ui/settingpage.cpp: do all application setup in main.cpp 2012-09-24 Klas Lindfors * src/yubikeyconfig.cpp, src/yubikeywriter.cpp: use ykConfig object instead of settings do proper setup of ykConfig in constructor 2012-09-24 Klas Lindfors * src/yubikeyutil.cpp: mark as const 2012-09-24 Klas Lindfors * src/ui/settingpage.ui: move help button and remove tabstop 2012-09-24 Klas Lindfors * src/ui/toolpage.ui: update texts 2012-09-24 Klas Lindfors * src/ui/mainwindow.cpp, src/ui/mainwindow.ui, src/yubikeyfinder.cpp, src/yubikeyfinder.h: add support label for updatable 2012-09-24 Klas Lindfors * src/ui/settingpage.cpp, src/ui/settingpage.ui: make the settingspage autosave 2012-09-24 Klas Lindfors * src/ui/chalresppage.cpp, src/yubikeyfinder.cpp, src/yubikeyfinder.h: disable fixed hmac-sha1 challenge for 2.2 key 2012-09-24 Klas Lindfors * src/ui/mainwindow.cpp: clean up when key is removed 2012-09-21 Klas Lindfors * resources/resources.qrc, src/ui/mainwindow.cpp, src/ui/mainwindow.ui: show correct image for inserted yubikey some are animated, then build qmovie objects 2012-09-21 Klas Lindfors * src/ui/settingpage.cpp, src/version.h: add CompanyDomain to QCoreApplication 2012-09-21 Klas Lindfors * src/ui/settingpage.cpp: turn off SERIAL_USB_VISIBLE by default 2012-09-21 Klas Lindfors * src/yubikeywriter.cpp: no need to get status for challenge-response 2012-09-21 Klas Lindfors * src/yubikeyfinder.cpp, src/yubikeyfinder.h: State_Preset -> State_Present 2012-09-21 Klas Lindfors * src/ui/toolpage.cpp, src/ui/toolpage.h: only enable perform button when key is inserted 2012-09-21 Klas Lindfors * src/common.h, src/ui/toolpage.cpp: show status message when more options have to be selected 2012-09-21 Klas Lindfors * src/yubikeyfinder.cpp: do yk_init()/yk_release() in start/stop functions it should be a good idea to not do yk_init() for every openKey, this should make our use of libusb more consistent. 2012-09-21 Klas Lindfors * src/ui/toolpage.cpp, src/ui/toolpage.h, src/ui/toolpage.ui, src/yubikeywriter.cpp: implement a tool feature for testing challenge-response in key 2012-09-21 Klas Lindfors * src/ui/aboutpage.ui, src/ui/chalresppage.ui, src/ui/mainwindow.ui, src/ui/oathpage.ui, src/ui/otppage.ui, src/ui/settingpage.ui, src/ui/staticpage.ui, src/ui/toolpage.ui: change green color to correct Yubico green 2012-09-21 Klas Lindfors * src/ui/toolpage.cpp, src/ui/toolpage.ui: activate the tool base page and add a backbutton to the converter page 2012-09-21 Klas Lindfors * src/yubikeywriter.cpp, src/yubikeywriter.h: add function for doing challenge-response 2012-09-19 Klas Lindfors * src/ui/oathpage.cpp, src/ui/oathpage.ui: trigger the editingFinished on imf when user edited 2012-09-19 Klas Lindfors * src/ui/oathpage.cpp, src/ui/oathpage.ui: let the reset button be enabled 2012-09-19 Klas Lindfors * src/ui/oathpage.cpp, src/yubikeyconfig.h: use int instead of short/char for oath imf, gives us larger span 2012-09-19 Klas Lindfors * src/yubikeywriter.cpp: check if ykp_set_oath_imf() fails, then throw. 2012-09-19 Klas Lindfors * src/yubikeywriter.cpp: don't bother with yk_core_config new (1.7) interface returns empty config 2012-09-19 Klas Lindfors * src/yubikeywriter.cpp: use ykp_set_oath_imf() instead of setting manually in config 2012-09-17 Klas Lindfors * src/common.h, src/ui/otppage.cpp, src/ui/otppage.ui: add a multi-option for pubid from serial 2012-09-17 Klas Lindfors * src/ui/otppage.cpp: spelling on debug output 2012-09-17 Klas Lindfors * src/ui/otppage.cpp, src/ui/otppage.h: build default public id on key serial 2012-09-17 Klas Lindfors * src/ui/chalresppage.cpp, src/ui/oathpage.cpp, src/ui/otppage.cpp, src/ui/staticpage.cpp: spelling in debug messages 2012-09-17 Klas Lindfors * src/ui/otppage.cpp, src/ui/otppage.ui: private identity is a secret and should be randomized 2012-09-17 Klas Lindfors * src/ui/chalresppage.cpp, src/ui/chalresppage.ui: add static secret for multi hmac-sha1 chal-resp 2012-09-12 Klas Lindfors * src/ui/otppage.cpp, src/ui/otppage.ui: let the reset button be enabled, resets the form 2012-09-12 Klas Lindfors * src/yubikeywriter.cpp: updates for new api in ykpers 1.7 2012-09-12 Klas Lindfors * src/otpdef.h, src/ui/otppage.cpp: don't insert the 0x28 prefix before customer prefix 2012-09-12 Klas Lindfors * do-source-release.sh: check version in YKPersonalization.pro and src/version.h 2012-09-12 Klas Lindfors * YKPersonalization.pro: bump forgotten version number 2012-06-07 Klas Lindfors * NEWS, src/version.h: bump version post-release 2012-06-07 Klas Lindfors * NEWS: NEWS for 3.0.6 2012-06-07 Klas Lindfors * .gitignore: ignore deps and libs 2012-06-07 Klas Lindfors * README: describe how you get dependencies 2012-06-07 Klas Lindfors * do-source-release.sh: no need to remove dlls, removed from repo now 2012-06-07 Klas Lindfors * .gitignore: ignores ignore Makefile ignore src/ui/ui_*.h ignore build/ 2012-06-07 Klas Lindfors * deps/libusb-1.0/libusb.h, deps/libykpers/.gitignore, deps/libykpers/.gitmodules, deps/libykpers/AUTHORS, deps/libykpers/COPYING, deps/libykpers/Makefile.am, deps/libykpers/NEWS, deps/libykpers/README, deps/libykpers/configure.ac, deps/libykpers/contrib/README, deps/libykpers/contrib/programming.sh, deps/libykpers/libykpers-1.map, deps/libykpers/rfc4634/hmac.c, deps/libykpers/rfc4634/sha-private.h, deps/libykpers/rfc4634/sha.h, deps/libykpers/rfc4634/sha1.c, deps/libykpers/rfc4634/sha224-256.c, deps/libykpers/rfc4634/sha384-512.c, deps/libykpers/rfc4634/usha.c, deps/libykpers/tests/Makefile.am, deps/libykpers/tests/selftest.c, deps/libykpers/tests/test_args_to_config.c, deps/libykpers/tests/test_key_generation.c, deps/libykpers/ykchalresp.1, deps/libykpers/ykchalresp.c, deps/libykpers/ykcore/Makefile.am, deps/libykpers/ykcore/ykcore.c, deps/libykpers/ykcore/ykcore.h, deps/libykpers/ykcore/ykcore_backend.h, deps/libykpers/ykcore/ykcore_lcl.h, deps/libykpers/ykcore/ykcore_libusb-1.0.c, deps/libykpers/ykcore/ykcore_libusb.c, deps/libykpers/ykcore/ykcore_osx.c, deps/libykpers/ykcore/ykcore_stub.c, deps/libykpers/ykcore/ykcore_win32.c, deps/libykpers/ykcore/ykcore_windows.c, deps/libykpers/ykcore/ykdef.h, deps/libykpers/ykcore/ykstatus.c, deps/libykpers/ykcore/ykstatus.h, deps/libykpers/ykcore/yktsd.h, deps/libykpers/ykpbkdf2.c, deps/libykpers/ykpbkdf2.h, deps/libykpers/ykpers-1.pc.in, deps/libykpers/ykpers.c, deps/libykpers/ykpers.h, deps/libykpers/ykpers4win.mk, deps/libykpers/ykpersonalize.1, deps/libykpers/ykpersonalize.c, deps/libyubikey/AUTHORS, deps/libyubikey/COPYING, deps/libyubikey/ChangeLog, deps/libyubikey/INSTALL, deps/libyubikey/Makefile.am, deps/libyubikey/Makefile.in, deps/libyubikey/NEWS, deps/libyubikey/README, deps/libyubikey/THANKS, deps/libyubikey/aclocal.m4, deps/libyubikey/config.guess, deps/libyubikey/config.sub, deps/libyubikey/configure, deps/libyubikey/configure.ac, deps/libyubikey/depcomp, deps/libyubikey/install-sh, deps/libyubikey/libyubikey.map, deps/libyubikey/ltmain.sh, deps/libyubikey/m4/ld-version-script.m4, deps/libyubikey/m4/libtool.m4, deps/libyubikey/m4/ltoptions.m4, deps/libyubikey/m4/ltsugar.m4, deps/libyubikey/m4/ltversion.m4, deps/libyubikey/m4/lt~obsolete.m4, deps/libyubikey/missing, deps/libyubikey/modhex.c, deps/libyubikey/selftest.c, deps/libyubikey/simple.mk, deps/libyubikey/ykaes.c, deps/libyubikey/ykcrc.c, deps/libyubikey/ykgenerate.c, deps/libyubikey/ykhex.c, deps/libyubikey/ykmodhex.c, deps/libyubikey/ykparse.c, deps/libyubikey/yktoken.c, deps/libyubikey/yubikey.h: remove deps and libs, just copies from elsewhere, see README for how to get them. 2012-06-07 Klas Lindfors * .gitignore: ignore YKPersonalization.pro.user 2012-06-05 Simon Josefsson * COPYING, NEWS, src/common.h, src/crandom.cpp, src/crandom.h, src/main.cpp, src/otpdef.h, src/ui/aboutpage.cpp, src/ui/aboutpage.h, src/ui/chalresppage.cpp, src/ui/chalresppage.h, src/ui/confirmbox.cpp, src/ui/confirmbox.h, src/ui/helpbox.cpp, src/ui/helpbox.h, src/ui/mainwindow.cpp, src/ui/mainwindow.h, src/ui/oathpage.cpp, src/ui/oathpage.h, src/ui/otppage.cpp, src/ui/otppage.h, src/ui/scanedit.cpp, src/ui/scanedit.h, src/ui/settingpage.cpp, src/ui/settingpage.h, src/ui/staticpage.cpp, src/ui/staticpage.h, src/ui/toolpage.cpp, src/ui/toolpage.h, src/version.h, src/yubikeyconfig.cpp, src/yubikeyconfig.h, src/yubikeyfinder.cpp, src/yubikeyfinder.h, src/yubikeylogger.cpp, src/yubikeylogger.h, src/yubikeyutil.cpp, src/yubikeyutil.h, src/yubikeywriter.cpp, src/yubikeywriter.h: Bump copyright years. 2012-06-05 Klas Lindfors * NEWS, src/version.h: bump versions post-release 2012-06-05 Klas Lindfors * NEWS, src/version.h: prepare version 3.0.5 2012-06-05 Klas Lindfors * do-source-release.sh: check if we've handled the NEWS file correctly 2012-06-05 Klas Lindfors * do-source-release.sh: create a ChangeLog with git2cl 2012-06-04 Klas Lindfors * NEWS: NEWS file 2012-06-04 Klas Lindfors * do-source-release.sh: add small script for doing release 2012-06-04 Klas Lindfors * : commit 8bfa06bc2955d5b31046138bc7eb192e57ec28b6 Author: Simon Josefsson Date: Mon Jun 4 15:04:03 2012 +0200 2012-06-04 Klas Lindfors * YKPersonalization.pro, src/version.h: bump versions post-release 2012-06-04 Klas Lindfors * YKPersonalization.pro, src/version.h: bump version to 3.0.3 for release 2012-06-01 Klas Lindfors * YKPersonalization.pro: add inheriting of flags 2012-06-01 Klas Lindfors * resources/lin/yubikey-personalization-gui.1: add man page for linux distribution 2012-05-31 Klas Lindfors * YKPersonalization.pro: add debian target for building with system linked deps 2012-05-31 Klas Lindfors * src/yubikeyfinder.h, src/yubikeywriter.h: includes for deps with <> 2012-05-10 Simon Josefsson * : Don't store libusb binary. 2012-05-10 Simon Josefsson * README: Add more info. Line wrap. 2012-05-10 Simon Josefsson * README: Mention dependencies. 2012-05-10 Simon Josefsson * COPYING, README: Add build instructions. 2011-11-28 Simon Josefsson * COPYING, README, YKPersonalization.pro, YKPersonalization.pro.user.lin, YKPersonalization.pro.user.mac, YKPersonalization.pro.user.win, deps/libusb-1.0/libusb.h, deps/libykpers/.gitignore, deps/libykpers/.gitmodules, deps/libykpers/AUTHORS, deps/libykpers/COPYING, deps/libykpers/Makefile.am, deps/libykpers/NEWS, deps/libykpers/README, deps/libykpers/configure.ac, deps/libykpers/contrib/README, deps/libykpers/contrib/programming.sh, deps/libykpers/libykpers-1.map, deps/libykpers/rfc4634/hmac.c, deps/libykpers/rfc4634/sha-private.h, deps/libykpers/rfc4634/sha.h, deps/libykpers/rfc4634/sha1.c, deps/libykpers/rfc4634/sha224-256.c, deps/libykpers/rfc4634/sha384-512.c, deps/libykpers/rfc4634/usha.c, deps/libykpers/tests/Makefile.am, deps/libykpers/tests/selftest.c, deps/libykpers/tests/test_args_to_config.c, deps/libykpers/tests/test_key_generation.c, deps/libykpers/ykchalresp.1, deps/libykpers/ykchalresp.c, deps/libykpers/ykcore/Makefile.am, deps/libykpers/ykcore/ykcore.c, deps/libykpers/ykcore/ykcore.h, deps/libykpers/ykcore/ykcore_backend.h, deps/libykpers/ykcore/ykcore_lcl.h, deps/libykpers/ykcore/ykcore_libusb-1.0.c, deps/libykpers/ykcore/ykcore_libusb.c, deps/libykpers/ykcore/ykcore_osx.c, deps/libykpers/ykcore/ykcore_stub.c, deps/libykpers/ykcore/ykcore_win32.c, deps/libykpers/ykcore/ykcore_windows.c, deps/libykpers/ykcore/ykdef.h, deps/libykpers/ykcore/ykstatus.c, deps/libykpers/ykcore/ykstatus.h, deps/libykpers/ykcore/yktsd.h, deps/libykpers/ykpbkdf2.c, deps/libykpers/ykpbkdf2.h, deps/libykpers/ykpers-1.pc.in, deps/libykpers/ykpers.c, deps/libykpers/ykpers.h, deps/libykpers/ykpers4win.mk, deps/libykpers/ykpersonalize.1, deps/libykpers/ykpersonalize.c, deps/libyubikey/AUTHORS, deps/libyubikey/COPYING, deps/libyubikey/ChangeLog, deps/libyubikey/INSTALL, deps/libyubikey/Makefile.am, deps/libyubikey/Makefile.in, deps/libyubikey/NEWS, deps/libyubikey/README, deps/libyubikey/THANKS, deps/libyubikey/aclocal.m4, deps/libyubikey/config.guess, deps/libyubikey/config.sub, deps/libyubikey/configure, deps/libyubikey/configure.ac, deps/libyubikey/depcomp, deps/libyubikey/install-sh, deps/libyubikey/libyubikey.map, deps/libyubikey/ltmain.sh, deps/libyubikey/m4/ld-version-script.m4, deps/libyubikey/m4/libtool.m4, deps/libyubikey/m4/ltoptions.m4, deps/libyubikey/m4/ltsugar.m4, deps/libyubikey/m4/ltversion.m4, deps/libyubikey/m4/lt~obsolete.m4, deps/libyubikey/missing, deps/libyubikey/modhex.c, deps/libyubikey/selftest.c, deps/libyubikey/simple.mk, deps/libyubikey/ykaes.c, deps/libyubikey/ykcrc.c, deps/libyubikey/ykgenerate.c, deps/libyubikey/ykhex.c, deps/libyubikey/ykmodhex.c, deps/libyubikey/ykparse.c, deps/libyubikey/yktoken.c, deps/libyubikey/yubikey.h, installer/win32/Installer.sln, installer/win32/Installer/Installer.vdproj, resources/lin/YubiKey Personalization Tool.sh, resources/mac/Info.plist.in, resources/resources.qrc, resources/win/resources.rc, src/common.h, src/crandom.cpp, src/crandom.h, src/main.cpp, src/otpdef.h, src/ui/aboutpage.cpp, src/ui/aboutpage.h, src/ui/aboutpage.ui, src/ui/chalresppage.cpp, src/ui/chalresppage.h, src/ui/chalresppage.ui, src/ui/confirmbox.cpp, src/ui/confirmbox.h, src/ui/confirmbox.ui, src/ui/helpbox.cpp, src/ui/helpbox.h, src/ui/helpbox.ui, src/ui/mainwindow.cpp, src/ui/mainwindow.h, src/ui/mainwindow.ui, src/ui/oathpage.cpp, src/ui/oathpage.h, src/ui/oathpage.ui, src/ui/otppage.cpp, src/ui/otppage.h, src/ui/otppage.ui, src/ui/scanedit.cpp, src/ui/scanedit.h, src/ui/settingpage.cpp, src/ui/settingpage.h, src/ui/settingpage.ui, src/ui/staticpage.cpp, src/ui/staticpage.h, src/ui/staticpage.ui, src/ui/toolpage.cpp, src/ui/toolpage.h, src/ui/toolpage.ui, src/version.h, src/yubikeyconfig.cpp, src/yubikeyconfig.h, src/yubikeyfinder.cpp, src/yubikeyfinder.h, src/yubikeylogger.cpp, src/yubikeylogger.h, src/yubikeyutil.cpp, src/yubikeyutil.h, src/yubikeywriter.cpp, src/yubikeywriter.h: Initial import. 2011-11-28 Simon Josefsson * README: test 2011-11-28 Simon Josefsson * README: typo 2011-11-25 Simon Josefsson * Add. yubikey-personalization-gui-3.1.23/tests/0000775000175000017500000000000012603205714017074 5ustar klasklasyubikey-personalization-gui-3.1.23/tests/yubikeyutiltest.h0000664000175000017500000000337312603205714022532 0ustar klasklas/* Copyright (C) 2015 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include class TestYubikeyUtil : public QObject { Q_OBJECT private slots: void testHexDecode(); void testHexEncode(); void testModhexDecode(); void testModhexEncode(); void testGetNextHex1(); void testGetNextHex2(); void testGetNextHex3(); void testGetNextModhex1(); void testGetNextModhex2(); void testGetNextModhex3(); void testGetNextModhex4(); void testGenerateRandomHex(); void testGenerateRandomModhex(); }; yubikey-personalization-gui-3.1.23/tests/yubikeyutiltest.cpp0000664000175000017500000000723612603205714023067 0ustar klasklas/* Copyright (C) 2015 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "yubikeyutiltest.h" #include "yubikeyutil.h" void TestYubikeyUtil::testHexDecode() { unsigned char result[3]; size_t len = 3; unsigned char expect[] = "foo"; YubiKeyUtil::qstrHexDecode(result, &len, QString("666f6f")); QVERIFY(memcmp(expect, result, 3) == 0); } void TestYubikeyUtil::testHexEncode() { unsigned char string[] = "foo"; QString result = YubiKeyUtil::qstrHexEncode(string, 3); QCOMPARE(result, QString("666f6f")); } void TestYubikeyUtil::testModhexDecode() { unsigned char result[3]; size_t len = 3; unsigned char expect[] = "foo"; YubiKeyUtil::qstrModhexDecode(result, &len, QString("hhhvhv")); QVERIFY(memcmp(expect, result, 3) == 0); } void TestYubikeyUtil::testModhexEncode() { unsigned char string[] = "foo"; QString result = YubiKeyUtil::qstrModhexEncode(string, 3); QCOMPARE(result, QString("hhhvhv")); } void TestYubikeyUtil::testGetNextHex1() { QString result = YubiKeyUtil::getNextHex(6, "000000", GEN_SCHEME_INCR); QCOMPARE(result, QString("000001")); } void TestYubikeyUtil::testGetNextHex2() { QString result = YubiKeyUtil::getNextHex(6, "0fffff", GEN_SCHEME_INCR); QCOMPARE(result, QString("100000")); } void TestYubikeyUtil::testGetNextHex3() { QString result = YubiKeyUtil::getNextHex(6, "ffffff", GEN_SCHEME_INCR); QCOMPARE(result, QString("000000")); } void TestYubikeyUtil::testGetNextModhex1() { QString result = YubiKeyUtil::getNextModhex(6, "cccccc", GEN_SCHEME_INCR); QCOMPARE(result, QString("cccccb")); } void TestYubikeyUtil::testGetNextModhex2() { QString result = YubiKeyUtil::getNextModhex(6, "cvvvvv", GEN_SCHEME_INCR); QCOMPARE(result, QString("bccccc")); } void TestYubikeyUtil::testGetNextModhex3() { QString result = YubiKeyUtil::getNextModhex(6, "vvvvvv", GEN_SCHEME_INCR); QCOMPARE(result, QString("cccccc")); } void TestYubikeyUtil::testGetNextModhex4() { QString result = YubiKeyUtil::getNextModhex(6, "vvvvv", GEN_SCHEME_INCR); QCOMPARE(result, QString("")); } void TestYubikeyUtil::testGenerateRandomHex() { QString first = YubiKeyUtil::generateRandomHex(16); QString second = YubiKeyUtil::generateRandomHex(16); QVERIFY(first != second); } void TestYubikeyUtil::testGenerateRandomModhex() { QString first = YubiKeyUtil::generateRandomModhex(16); QString second = YubiKeyUtil::generateRandomModhex(16); QVERIFY(first != second); } yubikey-personalization-gui-3.1.23/tests/versiontest.h0000664000175000017500000000264312603205714021637 0ustar klasklas/* Copyright (C) 2015 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include class TestVersion : public QObject { Q_OBJECT private slots: void testVersions(); }; yubikey-personalization-gui-3.1.23/tests/versiontest.cpp0000664000175000017500000000320412603205714022164 0ustar klasklas/* Copyright (C) 2015 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "versiontest.h" #include "common.h" void TestVersion::testVersions() { QVERIFY(YK_VERSION(2,2,3) < YK_VERSION(2,2,4)); QVERIFY(YK_VERSION(0,9,9) < YK_VERSION(1,3,0)); QVERIFY(YK_VERSION(3,0,0) < YK_VERSION(4,0,0)); QVERIFY(YK_VERSION(2,99,99) < YK_VERSION(3,0,0)); QVERIFY(YK_VERSION(4,1,10) < YK_VERSION(4,2,0)); } yubikey-personalization-gui-3.1.23/tests/tests.pro0000664000175000017500000000460512603205714020765 0ustar klasklasQT += testlib QT -= gui SOURCES += test.cpp scanedittest.cpp yubikeyutiltest.cpp versiontest.cpp HEADERS += scanedittest.h yubikeyutiltest.h versiontest.h CONFIG += testcase no_testcase_installs CONFIG += console CONFIG -= app_bundle INCLUDEPATH += ../lib !nosilent { CONFIG += silent } CONFIG(debug, debug|release) { TARGET_DIR = ..$${DIR_SEPARATOR}build$${DIR_SEPARATOR}debug CONFIG += console no_lflags_merge LIBS += $$quote(-L../lib/debug) -llib } else { TARGET_DIR = ..$${DIR_SEPARATOR}build$${DIR_SEPARATOR}release DEFINES += QT_NO_DEBUG_OUTPUT LIBS += $$quote(-L../lib/release) -llib } DESTDIR = "$$TARGET_DIR" QMAKE_CXXFLAGS += $$CXXFLAGS $$CPPFLAGS QMAKE_LFLAGS += $$LDFLAGS cross { message("Doing a cross platform build..") # pickup compiler from environment isEmpty(TARGET_ARCH) { error("Cross compiling without a target is completely invalid, set TARGET_ARCH") } QMAKE_CC = $${TARGET_ARCH}-gcc QMAKE_CXX = $${TARGET_ARCH}-g++ QMAKE_LINK = $$QMAKE_CXX QMAKE_LINK_C = $$QMAKE_CC win32 { QMAKE_LIB = $${TARGET_ARCH}-ar -ru QMAKE_RC = $${TARGET_ARCH}-windres $$quote(-DVERSION_WIN_STR=\'\\\"$${VERSION}\\0\\\"\') QMAKE_MOC = $$[QT_INSTALL_BINS]/moc QMAKE_UIC = $$[QT_INSTALL_BINS]/uic QMAKE_IDC = $$[QT_INSTALL_BINS]/idc QMAKE_RCC = $$[QT_INSTALL_BINS]/rcc QMAKE_LFLAGS += -static-libstdc++ -static-libgcc } !isEmpty (QTDIR) { _QT_INCDIR = $${QTDIR}$${DIR_SEPARATOR}include _QT_LIBDIR = $${QTDIR}$${DIR_SEPARATOR}lib _QT_BINDIR = $${QTDIR}$${DIR_SEPARATOR}bin _QT_PLUGINDIR = $${QTDIR}$${DIR_SEPARATOR}plugins } else { _QT_INCDIR = $$(QT_INCDIR) _QT_LIBDIR = $$(QT_LIBDIR) _QT_BINDIR = $$(QT_BINDIR) _QT_PLUGINDIR = $$(QT_PLUGINDIR) } !isEmpty (_QT_INCDIR) { QMAKE_INCDIR_QT = $$_QT_INCDIR } !isEmpty (_QT_LIBDIR) { QMAKE_LIBDIR_QT = $$_QT_LIBDIR } } unix:!macx|force_pkgconfig { LIBS += -lyubikey } macx:!force_pkgconfig { INCLUDEPATH += libs/macx/include LIBS += ../libs/macx/lib/libyubikey.dylib } win32 { LIBS += $$quote(-L$$_QT_BINDIR) $$quote(-L$$_QT_LIBDIR) !contains(QMAKE_TARGET.arch, x86_64) { LIBS += $$quote(-L../libs/win32/bin) -llibyubikey-0 } else { LIBS += $$quote(-L../libs/win64/bin) -llibyubikey-0 } } yubikey-personalization-gui-3.1.23/tests/test.cpp0000664000175000017500000000057712603205714020570 0ustar klasklas#include "scanedittest.h" #include "yubikeyutiltest.h" #include "versiontest.h" int main(int argc, char** argv) { int status = 0; TestScanEdit scanEdit; TestYubikeyUtil yubikeyUtil; TestVersion version; status |= QTest::qExec(&scanEdit, argc, argv); status |= QTest::qExec(&yubikeyUtil, argc, argv); status |= QTest::qExec(&version, argc, argv); return status; } yubikey-personalization-gui-3.1.23/tests/scanedittest.h0000664000175000017500000000270012603205714021736 0ustar klasklas/* Copyright (C) 2015 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include class TestScanEdit : public QObject { Q_OBJECT private slots: void testCharacters(); void testCharacters2(); }; yubikey-personalization-gui-3.1.23/tests/scanedittest.cpp0000664000175000017500000000365412603205714022302 0ustar klasklas/* Copyright (C) 2015 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "scanedittest.h" #include "us-scanedit.h" void TestScanEdit::testCharacters() { ScanEdit edit = UsScanEdit(); QString characters = "abcdefghijklmnopqrstuvwxyz1234567890\\n\\t -=[]\\\\;'`,./"; QString scancodes = edit.textToScanCodes(characters); QString result = edit.scanCodesToText(scancodes); QCOMPARE(result, characters); } void TestScanEdit::testCharacters2() { ScanEdit edit = UsScanEdit(); QString characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+{}|:\"~<>?"; QString scancodes = edit.textToScanCodes(characters); QString result = edit.scanCodesToText(scancodes); QCOMPARE(result, characters); } yubikey-personalization-gui-3.1.23/src/0000775000175000017500000000000012603205714016521 5ustar klasklasyubikey-personalization-gui-3.1.23/src/yubikeywriter.h0000664000175000017500000000514312603205714021613 0ustar klasklas/* Copyright (C) 2011-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef YUBIKEYWRITER_H #define YUBIKEYWRITER_H #include extern "C" { #include } #include "common.h" #include "yubikeyconfig.h" class YubiKeyConfig; class YubiKeyWriter : public QObject { Q_OBJECT public: static YubiKeyWriter* getInstance(); ~YubiKeyWriter(); static void setExportFilename(QString filename); static QString defaultExportFilename(void); private: static QString m_filename; YubiKeyWriter(); static YubiKeyWriter* _instance; QString reportError(bool chalresp); int encodeAccessCode(const QString accCode, unsigned char *accessCode, size_t *accessCodeLen); int assembleConfig(YubiKeyConfig *ykConfig, YKP_CONFIG *ykp, bool *useAccessCode, unsigned char *accessCode); public slots: void writeConfig(YubiKeyConfig *ykConfig); void exportConfig(YubiKeyConfig *ykConfig); void doChallengeResponse(const QString challenge, QString &response, int slot, bool hmac); void writeNdef(bool uri, const QString language, const QString payload, const QString accCode, int slot); void deleteConfig(int slot, const QString accCode); signals: void configWritten(bool written, const QString &msg); void errorOccurred(const QString &text); void diagnostics(const QString &text); }; #endif // YUBIKEYWRITER_H yubikey-personalization-gui-3.1.23/src/yubikeywriter.cpp0000664000175000017500000005256612603205714022161 0ustar klasklas/* Copyright (C) 2011-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "yubikeywriter.h" #include "yubikeyfinder.h" #include "yubikeylogger.h" #include "yubikeyutil.h" #include #include #include #include #include #define EXPORT_FILENAME_DEF "export.ycfg" YubiKeyWriter* YubiKeyWriter::_instance = 0; QString YubiKeyWriter::m_filename = defaultExportFilename(); #define TKTFLAG(f, s) \ if(s) { if (!ykp_set_tktflag_##f(cfg, s)) { return 0; } } #define CFGFLAG(f, s) \ if(s) { if (!ykp_set_cfgflag_##f(cfg, s)) { return 0; } } #define EXTFLAG(f, s) \ if(s) { if (!ykp_set_extflag_##f(cfg, s)) { return 0; } } YubiKeyWriter::YubiKeyWriter() { } YubiKeyWriter::~YubiKeyWriter() { if(_instance) { delete _instance; } } YubiKeyWriter* YubiKeyWriter::getInstance() { if(_instance == NULL) { _instance = new YubiKeyWriter(); } return _instance; } QString YubiKeyWriter::reportError(bool chalresp = false) { QString errMsg; if (ykp_errno) { qDebug("Yubikey personalization error: %s\n", ykp_strerror(ykp_errno)); emit diagnostics(ykp_strerror(ykp_errno)); switch(ykp_errno) { case YKP_EYUBIKEYVER: case YKP_EOLDYUBIKEY: errMsg = tr(ERR_FEATURE_NOT_SUPPORTED); break; default: errMsg = tr(ERR_PROCESSING); break; } ykp_errno = 0; } else if (yk_errno) { if (yk_errno == YK_EUSBERR) { qDebug("USB error: %s\n", yk_usb_strerror()); emit diagnostics(QString("USB error: %1").arg(yk_usb_strerror())); } else { qDebug("Yubikey core error: %s\n", yk_strerror(yk_errno)); emit diagnostics(yk_strerror(yk_errno)); } switch(yk_errno) { case YK_ENOKEY: errMsg = tr(ERR_KEY_NOT_FOUND); break; case YK_EFIRMWARE: errMsg = tr(ERR_FIRMWARE_NOT_SUPPORTED); break; default: if(chalresp) { errMsg = tr(ERR_PROCESSING_CHALRESP); } else { errMsg = tr(ERR_PROCESSING); } break; } yk_errno = 0; } if(!errMsg.isEmpty()) { emit errorOccurred(errMsg); } return errMsg; } int YubiKeyWriter::assembleConfig(YubiKeyConfig *ykConfig, YKP_CONFIG *cfg, bool *useAccessCode, unsigned char *accessCode) { // Check features support bool flagSrNoSupport = false; bool flagUpdateSupport = false; bool flagImfSupport = false; bool flagLedInvSupport = false; YubiKeyFinder *finder = YubiKeyFinder::getInstance(); if(finder->checkFeatureSupport( YubiKeyFinder::Feature_SerialNumber)) { flagSrNoSupport = true; } if(finder->checkFeatureSupport( YubiKeyFinder::Feature_Updatable)) { flagUpdateSupport = true; } if(finder->checkFeatureSupport( YubiKeyFinder::Feature_MovingFactor)) { flagImfSupport = true; } if(finder->checkFeatureSupport( YubiKeyFinder::Feature_LedInvert)) { flagLedInvSupport = true; } //Programming Mode... bool longSecretKey = false; int command = ykConfig->configSlot() == 2 ? SLOT_CONFIG2 : SLOT_CONFIG; switch(ykConfig->programmingMode()) { case YubiKeyConfig::Mode_Update: // if we're doing an update it's other commands. command = ykConfig->configSlot() == 2 ? SLOT_UPDATE2 : SLOT_UPDATE1; break; case YubiKeyConfig::Mode_Swap: // swap has it's own command command = SLOT_SWAP; break; case YubiKeyConfig::Mode_YubicoOtp: break; case YubiKeyConfig::Mode_Static: CFGFLAG(STATIC_TICKET, ykConfig->staticTicket()); CFGFLAG(SHORT_TICKET, ykConfig->shortTicket()); CFGFLAG(STRONG_PW1, ykConfig->strongPw1()); CFGFLAG(STRONG_PW2, ykConfig->strongPw2()); CFGFLAG(MAN_UPDATE, ykConfig->manUpdate()); CFGFLAG(SEND_REF, ykConfig->sendRef()); break; case YubiKeyConfig::Mode_OathHotp: TKTFLAG(OATH_HOTP, true); CFGFLAG(OATH_HOTP8, ykConfig->oathHotp8()); CFGFLAG(OATH_FIXED_MODHEX1, ykConfig->oathFixedModhex1()); CFGFLAG(OATH_FIXED_MODHEX2, ykConfig->oathFixedModhex2()); CFGFLAG(OATH_FIXED_MODHEX, ykConfig->oathFixedModhex()); //Moving Factor Seed... if(flagImfSupport && !ykp_set_oath_imf(cfg, ykConfig->oathMovingFactorSeed())) { return 0; } //For OATH-HOTP, 160 bits key is also valid longSecretKey = true; break; case YubiKeyConfig::Mode_ChalRespYubico: TKTFLAG(CHAL_RESP, true); CFGFLAG(CHAL_YUBICO, ykConfig->chalYubico()); CFGFLAG(CHAL_BTN_TRIG, ykConfig->chalBtnTrig()); break; case YubiKeyConfig::Mode_ChalRespHmac: TKTFLAG(CHAL_RESP, true); CFGFLAG(CHAL_HMAC, ykConfig->chalHmac()); CFGFLAG(HMAC_LT64, ykConfig->hmacLT64()); CFGFLAG(CHAL_BTN_TRIG, ykConfig->chalBtnTrig()); //For HMAC (not Yubico) challenge-response, 160 bits key is also valid longSecretKey = true; break; } //Configuration slot... if (!ykp_configure_command(cfg, command)) { return 0; } //Public ID... if(ykConfig->pubIdTxt().length() > 0) { qDebug() << "Pub id: " << ykConfig->pubIdTxt() << "length:" << ykConfig->pubIdTxt().length(); char pubIdStr[MAX_SIZE]; YubiKeyUtil::qstrToRaw(pubIdStr, sizeof(pubIdStr), ykConfig->pubIdTxt()); size_t pubIdStrLen = strlen(pubIdStr); unsigned char pubId[MAX_SIZE]; size_t pubIdLen = 0; int rc = YubiKeyUtil::hexModhexDecode(pubId, &pubIdLen, pubIdStr, pubIdStrLen, 0, FIXED_SIZE * 2, !ykConfig->pubIdInHex()); if (rc <= 0) { qDebug("Invalid public id: %s", pubIdStr); return 0; } ykp_set_fixed(cfg, pubId, pubIdLen); } //Private ID... if(ykConfig->pvtIdTxt().length() > 0) { qDebug() << "Pvt id: " << ykConfig->pvtIdTxt() << "length:" << ykConfig->pvtIdTxt().length(); char pvtIdStr[MAX_SIZE]; YubiKeyUtil::qstrToRaw(pvtIdStr, sizeof(pvtIdStr), ykConfig->pvtIdTxt()); size_t pvtIdStrLen = strlen(pvtIdStr); unsigned char pvtId[MAX_SIZE]; size_t pvtIdLen = 0; int rc = YubiKeyUtil::hexModhexDecode(pvtId, &pvtIdLen, pvtIdStr, pvtIdStrLen, UID_SIZE * 2, UID_SIZE * 2, false); if (rc <= 0) { qDebug("Invalid private id: %s", pvtIdStr); return 0; } ykp_set_uid(cfg, pvtId, pvtIdLen); } //Secret Key... if(ykConfig->secretKeyTxt().length() > 0) { qDebug() << "Secret key: " << ykConfig->secretKeyTxt() << "length:" << ykConfig->secretKeyTxt().length(); char secretKeyStr[MAX_SIZE]; YubiKeyUtil::qstrToRaw(secretKeyStr, sizeof(secretKeyStr), ykConfig->secretKeyTxt()); int res = 0; if(longSecretKey && strlen(secretKeyStr) == 40) { res = ykp_HMAC_key_from_hex(cfg, secretKeyStr); } else { res = ykp_AES_key_from_hex(cfg, secretKeyStr); } if (res) { qDebug() << "Bad secret key: " << secretKeyStr; return 0; } } //Configuration protection... //Current Access Code... size_t accessCodeLen = 0; if(ykConfig->currentAccessCodeTxt().length() > 0) { int rc = encodeAccessCode(ykConfig->currentAccessCodeTxt(), accessCode, &accessCodeLen); if (rc <= 0) { qDebug() << "Invalid current access code: " << ykConfig->currentAccessCodeTxt(); return 0; } } //New Access Code... unsigned char newAccessCode[MAX_SIZE]; size_t newAccessCodeLen = 0; if(ykConfig->newAccessCodeTxt().length() > 0) { int rc = encodeAccessCode(ykConfig->newAccessCodeTxt(), newAccessCode, &newAccessCodeLen); if (rc <= 0) { qDebug() << "Invalid new access code: " << ykConfig->newAccessCodeTxt(); return 0; } if(ykConfig->accMode() > 0) { int accMode = 0; if(ykConfig->accMode() == Acc_None) { accMode = YKP_ACCCODE_NONE; } else if(ykConfig->accMode() == Acc_Serial) { accMode = YKP_ACCCODE_SERIAL; } else if(ykConfig->accMode() == Acc_Random) { accMode = YKP_ACCCODE_RANDOM; } ykp_set_acccode_type(cfg, accMode); } } if(accessCodeLen > 0) { *useAccessCode = true; } if(newAccessCodeLen > 0) { //Enable/change protection ykp_set_access_code(cfg, newAccessCode, newAccessCodeLen); } else if(accessCodeLen > 0) { //Keep same protection ykp_set_access_code(cfg, accessCode, accessCodeLen); } TKTFLAG(TAB_FIRST, ykConfig->tabFirst()); TKTFLAG(APPEND_TAB1, ykConfig->appendTab1()); TKTFLAG(APPEND_TAB2, ykConfig->appendTab2()); TKTFLAG(APPEND_CR, ykConfig->appendCr()); TKTFLAG(APPEND_DELAY1, ykConfig->appendDelay1()); TKTFLAG(APPEND_DELAY2, ykConfig->appendDelay2()); //TKTFLAG(PROTECT_CFG2, ykConfig->protectCfg2()); //CFGFLAG(SEND_REF, ykConfig->sendRef()); //CFGFLAG(TICKET_FIRST, ykConfig->ticketFirst()); CFGFLAG(PACING_10MS, ykConfig->pacing10ms()); CFGFLAG(PACING_20MS, ykConfig->pacing20ms()); //CFGFLAG(ALLOW_HIDTRIG, ykConfig->allowHidtrig()); //Serial # visibility... if(flagSrNoSupport) { EXTFLAG(SERIAL_BTN_VISIBLE, ykConfig->serialBtnVisible()); EXTFLAG(SERIAL_USB_VISIBLE, ykConfig->serialUsbVisible()); EXTFLAG(SERIAL_API_VISIBLE, ykConfig->serialApiVisible()); } if(flagUpdateSupport) { EXTFLAG(ALLOW_UPDATE, ykConfig->allowUpdate()); // XXX: let update support mean these as well.. EXTFLAG(DORMANT, ykConfig->dormant()); EXTFLAG(FAST_TRIG, ykConfig->fastTrig()); EXTFLAG(USE_NUMERIC_KEYPAD, ykConfig->useNumericKeypad()); } if(flagLedInvSupport) { EXTFLAG(LED_INV, ykConfig->ledInvert()); } return 1; } void YubiKeyWriter::writeConfig(YubiKeyConfig *ykConfig) { YubiKeyFinder::getInstance()->stop(); YK_KEY *yk = 0; YK_STATUS *ykst = YubiKeyFinder::getInstance()->status(); YKP_CONFIG *cfg = ykp_alloc(); bool error = false; qDebug() << "-------------------------"; qDebug() << "Starting write config"; qDebug() << "-------------------------"; try { if (!(yk = yk_open_first_key())) { throw 0; } else if (!yk_get_status(yk, ykst)) { throw 0; } ykp_configure_version(cfg, ykst); qDebug() << "writer:configuration slot:" << ykConfig->configSlot(); bool useAccessCode; unsigned char accessCode[MAX_SIZE]; if(!assembleConfig(ykConfig, cfg, &useAccessCode, accessCode)) { throw 0; } //Log configuration... qDebug() << "-------------------------"; qDebug() << "Config data to be written to key configuration..."; char conf_buf[1024]; ykp_export_config(cfg, conf_buf, 1024, YKP_FORMAT_LEGACY); qDebug() << conf_buf; qDebug() << "-------------------------"; // Write configuration... if (!yk_write_command(yk, ykp_core_config(cfg), ykp_command(cfg), useAccessCode ? accessCode : NULL)) { qDebug() << "Failure"; throw 0; } qDebug() << "Success... config written"; emit diagnostics(QString("Successfully wrote config to slot %1").arg(ykp_config_num(cfg))); YubiKeyLogger::logConfig(ykConfig); emit configWritten(true, NULL); } catch(...) { error = true; } if (cfg) { ykp_free_config(cfg); } if (yk && !yk_close_key(yk)) { error = true; } YubiKeyFinder::getInstance()->start(); if(error) { qDebug() << "Config not written"; QString errMsg = reportError(); emit configWritten(false, errMsg); } qDebug() << "-------------------------"; qDebug() << "Stopping write config"; qDebug() << "-------------------------"; } void YubiKeyWriter::exportConfig(YubiKeyConfig *ykConfig) { YubiKeyFinder::getInstance()->stop(); YK_KEY *yk = 0; YK_STATUS *ykst = YubiKeyFinder::getInstance()->status(); YKP_CONFIG *cfg = ykp_alloc(); bool error = false; qDebug() << "-------------------------"; qDebug() << "Starting write config"; qDebug() << "-------------------------"; try { if (!(yk = yk_open_first_key())) { throw 0; } ykp_configure_version(cfg, ykst); qDebug() << "writer:configuration slot:" << ykConfig->configSlot(); bool useAccessCode; unsigned char accessCode[MAX_SIZE]; if(!assembleConfig(ykConfig, cfg, &useAccessCode, accessCode)) { throw 0; } m_filename = QFileDialog::getSaveFileName(NULL, tr("Export File"), m_filename, tr("Yubico cfg format (*.ycfg)"), NULL); char data[1024]; int len = ykp_export_config(cfg, data, 1024, YKP_FORMAT_YCFG); if(!len) { throw 0; } QFile file(m_filename); if(!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) { throw 0; } if(!file.write(data, len)) { throw 0; } file.close(); QSettings settings; settings.setValue(SG_EXPORT_FILENAME, m_filename); emit configWritten(true, NULL); emit diagnostics(QString("Exported config to file %1").arg(m_filename)); } catch(...) { error = true; } if (cfg) { ykp_free_config(cfg); } if (yk && !yk_close_key(yk)) { error = true; } YubiKeyFinder::getInstance()->start(); if(error) { qDebug() << "Config not exported"; QString errMsg = reportError(); emit configWritten(false, errMsg); } } void YubiKeyWriter::doChallengeResponse(const QString challenge, QString &response, int slot, bool hmac) { YubiKeyFinder::getInstance()->stop(); YK_KEY *yk = 0; bool error = false; qDebug() << "Challenge to slot " << slot << " with challenge: " << challenge; try { int yk_cmd; QByteArray chal_array = challenge.toLatin1(); const unsigned char *chal = reinterpret_cast(chal_array.constData()); unsigned char resp[64]; memset(resp, 0, sizeof(resp)); if (!(yk = yk_open_first_key())) { throw 0; } switch(slot) { case 1: yk_cmd = (hmac == true) ? SLOT_CHAL_HMAC1 : SLOT_CHAL_OTP1; break; case 2: yk_cmd = (hmac == true) ? SLOT_CHAL_HMAC2 : SLOT_CHAL_OTP2; break; default: throw 0; break; } if(! yk_challenge_response(yk, yk_cmd, 1, challenge.length(), chal, sizeof(resp), resp)) { throw 0; } // 20 (160 bits) for hmac-sha1 and 16 (128 bits) for yubico mode if(hmac == true) { response = YubiKeyUtil::qstrHexEncode(resp, 20); } else { response = YubiKeyUtil::qstrModhexEncode(resp, 16); } emit diagnostics(QString("Successful challenge response with slot %1").arg(slot)); } catch(...) { error = true; } if (yk && !yk_close_key(yk)) { error = true; } YubiKeyFinder::getInstance()->start(); if(error) { qDebug() << "Challenge response failed."; QString errMsg = reportError(true); } } void YubiKeyWriter::writeNdef(bool uri, const QString language, const QString payload, const QString accCode, int slot) { YubiKeyFinder::getInstance()->stop(); YK_KEY *yk = 0; YK_NDEF *ndef = ykp_alloc_ndef(); bool error = false; qDebug() << "Writing ndef " << payload << " of type " << uri; try { if(accCode.length() > 0) { unsigned char accessCode[MAX_SIZE]; size_t accessCodeLen = 0; int rc = encodeAccessCode(accCode, accessCode, &accessCodeLen); if (rc <= 0) { qDebug() << "Invalid access code: " << accCode; throw 0; } ykp_set_ndef_access_code(ndef, accessCode); } QByteArray payload_array = payload.toUtf8(); const char *ndef_payload = payload_array.constData(); qDebug() << "payload: " << ndef_payload; if (!(yk = yk_open_first_key())) { throw 0; } if(uri) { if(!ykp_construct_ndef_uri(ndef, ndef_payload)) { throw 0; } } else { QByteArray lang_array = language.toUtf8(); const char *lang = lang_array.constData(); if(!ykp_construct_ndef_text(ndef, ndef_payload, lang, false)) { throw 0; } } qDebug() << "writing the ndef."; if(! yk_write_ndef2(yk, ndef, slot)) { throw 0; } emit configWritten(true, NULL); emit diagnostics(QString("Wrote NDEF for slot %1").arg(slot)); } catch(...) { error = true; } if(ndef && !ykp_free_ndef(ndef)) { error = true; } if (yk && !yk_close_key(yk)) { error = true; } YubiKeyFinder::getInstance()->start(); if(error) { qDebug() << "Writing NDEF failed."; QString errMsg = reportError(); emit configWritten(false, errMsg); } } void YubiKeyWriter::deleteConfig(int slot, const QString accCode) { bool error = false; YK_KEY *yk = NULL; YKP_CONFIG *cfg = ykp_alloc(); YubiKeyFinder::getInstance()->stop(); try { if (!(yk = yk_open_first_key())) { throw 0; } unsigned char accessCode[MAX_SIZE]; size_t accessCodeLen = 0; if(accCode.length() > 0) { int rc = encodeAccessCode(accCode, accessCode, &accessCodeLen); if (rc <= 0) { qDebug() << "Invalid access code: " << accCode; throw 0; } } // write NULL to delete config if (!yk_write_config(yk, NULL, slot, accessCodeLen > 0 ? accessCode : NULL)) { qDebug() << "Failed to delete."; throw 0; } emit configWritten(true, NULL); qDebug() << "successfully deleted slot " << slot; emit diagnostics(QString("Deleted slot %1").arg(slot)); } catch(...) { error = true; } if (cfg) { ykp_free_config(cfg); } if (yk && !yk_close_key(yk)) { error = true; } YubiKeyFinder::getInstance()->start(); if(error) { qDebug() << "Failed to delete configuration in slot" << slot; QString errMsg = reportError(); emit configWritten(false, errMsg); } } int YubiKeyWriter::encodeAccessCode(QString accCode, unsigned char* accessCode, size_t *accessCodeLen) { qDebug() << "access code: " << accCode << "length:" << accCode.length(); char accessCodeStr[MAX_SIZE]; YubiKeyUtil::qstrToRaw(accessCodeStr, sizeof(accessCodeStr), accCode); size_t accessCodeStrLen = strlen(accessCodeStr); int rc = YubiKeyUtil::hexModhexDecode(accessCode, accessCodeLen, accessCodeStr, accessCodeStrLen, ACC_CODE_SIZE * 2, ACC_CODE_SIZE * 2, false); return rc; } void YubiKeyWriter::setExportFilename(QString filename) { m_filename = filename; } QString YubiKeyWriter::defaultExportFilename() { return QDir::homePath() + "/" + EXPORT_FILENAME_DEF; } yubikey-personalization-gui-3.1.23/src/yubikeylogger.h0000664000175000017500000000620012603205714021551 0ustar klasklas/* Copyright (C) 2011-2013 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef YUBIKEYLOGGER_H #define YUBIKEYLOGGER_H #include #include #include #include #include #include "common.h" #include "yubikeyconfig.h" struct logging_st { const char *name; const char *configName; int returnType; QString (*resolver)(YubiKeyConfig*, QString); }; class YubiKeyLogger : public QObject { Q_OBJECT public: ~YubiKeyLogger(); enum Format { Format_Traditional, Format_Yubico, Format_Flexible, Format_PSKC, }; static void logConfig(YubiKeyConfig *ykConfig); static void enableLogging(); static void disableLogging(); static bool isLogging(); static void setLogFilename(const QString &filename); static QString logFilename(); static QString defaultLogFilename(); static void setLogFormat(Format format); static void setFlexibleFormat(QString); static QStringList getLogNames(); static void closeLogFile(void); private: static bool m_enabled; static QString m_filename; static bool m_started; static Format m_format; static QString m_flexibleFormat; static logging_st logging_map[]; static QString formatLog(YubiKeyConfig *ykConfig, QString format); static QFile *m_logFile; static QFile *getLogFile(void); static void endPSKC(); static void logString(QString); static QString resolve_eventType(YubiKeyConfig*, QString); static QString resolve_timestamp(YubiKeyConfig*, QString); static QString resolve_hotpDigits(YubiKeyConfig*, QString); static QString resolve_symbol(YubiKeyConfig*, QString); static QString resolve_secretKeyB64(YubiKeyConfig*, QString); static QString resolve_tokenLength(YubiKeyConfig*, QString); static QString resolve_accessCode(YubiKeyConfig*, QString); }; #endif // YUBIKEYLOGGER_H yubikey-personalization-gui-3.1.23/src/yubikeylogger.cpp0000664000175000017500000003207312603205714022113 0ustar klasklas/* Copyright (C) 2011-2013 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "yubikeylogger.h" #include #include #include #include #include #include #define LOG_FILENAME_DEF "configuration_log.csv" #define LOG_SEPARATOR "," QString YubiKeyLogger::m_filename = defaultLogFilename(); bool YubiKeyLogger::m_enabled = true; bool YubiKeyLogger::m_started = true; YubiKeyLogger::Format YubiKeyLogger::m_format = Format_Traditional; QFile* YubiKeyLogger::m_logFile = NULL; QString YubiKeyLogger::m_flexibleFormat = ""; #define STRING 1 #define BOOL 2 #define INT 3 #define UINT 4 struct logging_st YubiKeyLogger::logging_map[] = { { "eventType", NULL, STRING, YubiKeyLogger::resolve_eventType }, { "timestampLocal", NULL, STRING, YubiKeyLogger::resolve_timestamp }, { "configSlot", "configSlot", INT, NULL }, { "pubIdTxt", "pubIdTxt", STRING, NULL }, { "pvtIdTxt", "pvtIdTxt", STRING, NULL }, { "secretKeyTxt", "secretKeyTxt", STRING, NULL }, { "secretKeyB64", NULL, STRING, YubiKeyLogger::resolve_secretKeyB64 }, { "currentAccessCodeTxt", "currentAccessCodeTxt", STRING, NULL }, { "currentAccessCodeTxtPadded", NULL, STRING, YubiKeyLogger::resolve_accessCode }, { "newAccessCodeTxt", "newAccessCodeTxt", STRING, NULL }, { "newAccessCodeTxtPadded", NULL, STRING, YubiKeyLogger::resolve_accessCode }, { "hotpDigits", NULL, STRING, YubiKeyLogger::resolve_hotpDigits }, { "oathMovingFactorSeed", "oathMovingFactorSeed", UINT, NULL }, { "strongPw1", "strongPw1", BOOL, NULL }, { "strongPw2", "strongPw2", BOOL, NULL }, { "sendRef", "sendRef", BOOL, NULL }, { "chalBtnTrig", "chalBtnTrig", BOOL, NULL }, { "hmacLT64", "hmacLT64", BOOL, NULL }, { "timestampFixed", NULL, STRING, YubiKeyLogger::resolve_timestamp }, { "oathFixedModhex1", "oathFixedModhex1", BOOL, NULL }, { "oathFixedModhex2", "oathFixedModhex2", BOOL, NULL }, { "oathFixedModhex", "oathFixedModhex", BOOL, NULL }, { "tokenLength", NULL, STRING, YubiKeyLogger::resolve_tokenLength }, { "serial", "serial", STRING, NULL }, { "endl", NULL, STRING, YubiKeyLogger::resolve_symbol }, { "tab", NULL, STRING, YubiKeyLogger::resolve_symbol }, }; YubiKeyLogger::~YubiKeyLogger() { } QFile *YubiKeyLogger::getLogFile() { if(m_logFile == NULL) { m_filename = QFileDialog::getSaveFileName(NULL, tr("Select Log File"), m_filename, tr("Comma-sepparated values (*.csv)"), NULL, QFileDialog::DontConfirmOverwrite); if(m_filename.isEmpty()) { qDebug() << "No filename returned for logging"; return NULL; } m_logFile = new QFile(m_filename); if(!m_logFile->open(QIODevice::WriteOnly | QIODevice::Append)) { qDebug() << "File could not be opened for writing"; return NULL; } QSettings settings; settings.setValue(SG_LOG_FILENAME, m_filename); } return m_logFile; } void YubiKeyLogger::closeLogFile() { if(m_logFile != NULL) { if(m_format == Format_PSKC) { endPSKC(); } m_logFile->close(); delete(m_logFile); m_logFile = NULL; m_started = true; } } QString YubiKeyLogger::formatLog(YubiKeyConfig *ykConfig, QString format) { for(unsigned long i = 0; i < (sizeof(logging_map) / sizeof(logging_st)); i++) { QString token = QString("{") + logging_map[i].name + QString("}"); if(!format.contains(token)) { continue; } QString out; int type = logging_map[i].returnType; const char *configName = logging_map[i].configName; if(logging_map[i].resolver != NULL) { out = logging_map[i].resolver(ykConfig, logging_map[i].name); } else if(type == STRING) { QMetaObject::invokeMethod(ykConfig, configName, Qt::DirectConnection, Q_RETURN_ARG(QString, out)); } else if(type == BOOL) { bool ret; QMetaObject::invokeMethod(ykConfig, configName, Qt::DirectConnection, Q_RETURN_ARG(bool, ret)); out = ret ? "1" : "0"; } else if(type == INT) { int ret; QMetaObject::invokeMethod(ykConfig, configName, Qt::DirectConnection, Q_RETURN_ARG(int, ret)); out = QString::number(ret); } else if(type == UINT) { unsigned int ret; QMetaObject::invokeMethod(ykConfig, configName, Qt::DirectConnection, Q_RETURN_ARG(unsigned int, ret)); out = QString::number(ret); } qDebug() << "replacing " << token << " with " << out << " from " << configName << " type " << type; format.replace(token, out); } return format; } void YubiKeyLogger::logConfig(YubiKeyConfig *ykConfig) { //Check if logging is enabled if(!m_enabled) { return; } QString format = ""; if(m_format == Format_Traditional) { if(m_started) { format += "LOGGING START,{timestampLocal}{endl}"; m_started = false; } format += "{eventType},{timestampLocal},{configSlot},{pubIdTxt},{pvtIdTxt},{secretKeyTxt},{currentAccessCodeTxt},{newAccessCodeTxt},{oathFixedModhex1},{oathFixedModhex2},{oathFixedModhex},{hotpDigits},{oathMovingFactorSeed},{strongPw1},{strongPw2},{sendRef},{chalBtnTrig},{hmacLT64}"; } else if(m_format == Format_Yubico) { format = "{serial},"; if(ykConfig->programmingMode() == YubiKeyConfig::Mode_YubicoOtp) { format += "{pubIdTxt},{pvtIdTxt},"; } else if(ykConfig->programmingMode() == YubiKeyConfig::Mode_OathHotp) { format += "{pubIdTxt},{oathMovingFactorSeed},"; } else if(ykConfig->programmingMode() == YubiKeyConfig::Mode_ChalRespHmac) { format += ",0,"; } else { format += ",,"; } format += "{secretKeyTxt},{newAccessCodeTxtPadded},{timestampFixed},"; } else if(m_format == Format_PSKC) { if(m_started) { format += "{endl}{endl}"; m_started = false; } format += "Yubico{serial}"; format += "{configSlot}programmingMode() == YubiKeyConfig::Mode_YubicoOtp) { format += " Algorithm=\"http://www.yubico.com/#yubikey-aes\">"; } else if(ykConfig->programmingMode() == YubiKeyConfig::Mode_OathHotp) { format += " Algorithm=\"urn:ietf:params:xml:ns:keyprov:pskc:hotp\">"; } else { qDebug() << "PSKC is primarily for Oath-HOTP and Yubico-OTP"; format += ">"; } format += "{secretKeyB64}"; if(ykConfig->programmingMode() == YubiKeyConfig::Mode_OathHotp) { format += "{oathMovingFactorSeed}"; } format += ""; if(ykConfig->programmingMode() == YubiKeyConfig::Mode_YubicoOtp) { format += "CN={pubIdTxt}, UID={pvtIdTxt}"; } format += ""; } else if(m_format == Format_Flexible) { format = m_flexibleFormat; } else { qDebug() << "unknown format" << m_format; return; } format = formatLog(ykConfig, format); logString(format); } void YubiKeyLogger::enableLogging() { m_enabled = true; } void YubiKeyLogger::disableLogging() { m_enabled = false; } bool YubiKeyLogger::isLogging() { return m_enabled; } void YubiKeyLogger::setLogFilename(const QString &filename) { closeLogFile(); m_filename = filename; } QString YubiKeyLogger::logFilename() { return m_filename; } QString YubiKeyLogger::defaultLogFilename() { return QDir::homePath() + "/" + LOG_FILENAME_DEF; } void YubiKeyLogger::setLogFormat(Format format) { closeLogFile(); m_format = format; } void YubiKeyLogger::setFlexibleFormat(QString format) { m_flexibleFormat = format; } QString YubiKeyLogger::resolve_hotpDigits(YubiKeyConfig *ykConfig, QString name __attribute__((unused))) { QString ret = "0"; if(ykConfig->programmingMode() == YubiKeyConfig::Mode_OathHotp) { ret = (ykConfig->oathHotp8()? "8": "6"); } return ret; } QString YubiKeyLogger::resolve_eventType(YubiKeyConfig *ykConfig, QString name __attribute__((unused))) { switch(ykConfig->programmingMode()) { case YubiKeyConfig::Mode_YubicoOtp: return(tr("Yubico OTP")); case YubiKeyConfig::Mode_Static: { QString eventType = tr("Static Password"); if(ykConfig->shortTicket()) { if(ykConfig->staticTicket()) { eventType.append(tr(": Short")); } else { eventType.append(tr(": Scan Code")); } } return eventType; } case YubiKeyConfig::Mode_OathHotp: return(tr("OATH-HOTP")); case YubiKeyConfig::Mode_ChalRespYubico: return(tr("Challenge-Response: Yubico OTP")); case YubiKeyConfig::Mode_ChalRespHmac: return(tr("Challenge-Response: HMAC-SHA1")); case YubiKeyConfig::Mode_Update: return(tr("Configuration Update")); case YubiKeyConfig::Mode_Swap: return(tr("Configuration Swap")); } return(tr("Unknown programming mode")); } QString YubiKeyLogger::resolve_timestamp(YubiKeyConfig *ykConfig __attribute__((unused)), QString name) { QDateTime ts = QDateTime::currentDateTime(); if(name == "timestampLocal") { return ts.toString(Qt::SystemLocaleDate); } else { return ts.toString("yyyy-MM-ddThh:mm:ss"); } } QString YubiKeyLogger::resolve_symbol(YubiKeyConfig *ykConfig __attribute__((unused)), QString name) { if(name == "endl") { return "\n"; } else if(name == "tab") { return "\t"; } return ""; } QString YubiKeyLogger::resolve_secretKeyB64(YubiKeyConfig *ykConfig, QString name __attribute__((unused))) { QByteArray decodedSecret = QByteArray::fromHex(ykConfig->secretKeyTxt().toLatin1()); return decodedSecret.toBase64(); } QString YubiKeyLogger::resolve_tokenLength(YubiKeyConfig *ykConfig, QString name __attribute__((unused))) { int len = ykConfig->pubIdTxt().length(); if(ykConfig->programmingMode() == YubiKeyConfig::Mode_YubicoOtp) { len += 32; } else if(ykConfig->programmingMode() == YubiKeyConfig::Mode_OathHotp) { len += ykConfig->oathHotp8() ? 8 : 6; } return QString::number(len); } QString YubiKeyLogger::resolve_accessCode(YubiKeyConfig *ykConfig, QString name) { QString code; if(name == "currentAccessCodeTxtPadded") { code = ykConfig->currentAccessCodeTxt(); } else { code = ykConfig->newAccessCodeTxt(); } return code.rightJustified(12, '0'); } QStringList YubiKeyLogger::getLogNames() { QStringList list; for(unsigned int i = 0; i < (sizeof(logging_map) / sizeof(logging_st)); i++) { list << logging_map[i].name; } return list; } void YubiKeyLogger::endPSKC() { logString(""); } void YubiKeyLogger::logString(QString string) { QFile *file = getLogFile(); if(file == NULL) { qDebug() << "Failed to get logfile"; return; } QTextStream out(file); out << string << endl; file->flush(); } yubikey-personalization-gui-3.1.23/src/yubikeyfinder.h0000664000175000017500000000640012603205714021543 0ustar klasklas/* Copyright (C) 2011-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef YUBIKEYFINDER_H #define YUBIKEYFINDER_H #include #include extern "C" { #include } #include "common.h" class YubiKeyFinder : public QObject { Q_OBJECT public: static YubiKeyFinder* getInstance(); ~YubiKeyFinder(); enum State { State_Absent, State_Present, State_Processing, State_NoFocus, }; enum Feature { Feature_MultipleConfigurations, Feature_ProtectConfiguration2, Feature_StaticPassword, Feature_ScanCodeMode, Feature_ShortTicket, Feature_StrongPwd, Feature_OathHotp, Feature_ChallengeResponse, Feature_SerialNumber, Feature_MovingFactor, Feature_ChallengeResponseFixed, Feature_Updatable, Feature_Ndef, Feature_LedInvert, Feature_U2F, }; State state() const {return m_state;} unsigned int version() const {return m_version;} unsigned int serial() const {return m_serial;} int touchLevel() const {return m_touchLevel;} YK_STATUS *status() const { return m_ykds;} QString versionStr(); void reportError(); bool checkFeatureSupport(Feature feature); private: YubiKeyFinder(); void init(); bool openKey(); bool closeKey(); static YubiKeyFinder* _instance; static const unsigned int FEATURE_MATRIX[][2]; static const unsigned int FEATURE_MATRIX_EXCLUDE[][4]; State m_state; YK_KEY *m_yk; YK_STATUS *m_ykds; unsigned int m_version; unsigned int m_versionMinor; unsigned int m_versionMajor; unsigned int m_versionBuild; unsigned int m_serial; int m_touchLevel; QTimer *m_timer; public slots: void findKey(); void start(); void stop(); signals: void keyFound(bool found, bool* featuresMatrix, int error); void errorOccurred(const QString &text); void diagnostics(const QString &text); }; #endif // YUBIKEYFINDER_H yubikey-personalization-gui-3.1.23/src/yubikeyfinder.cpp0000664000175000017500000002242512603205714022103 0ustar klasklas/* Copyright (C) 2011-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "yubikeyfinder.h" #include #include #include #include YubiKeyFinder* YubiKeyFinder::_instance = 0; // first version is inclusive, second is exclusive const unsigned int YubiKeyFinder::FEATURE_MATRIX[][2] = { { YK_VERSION(2,0,0), 0 }, //Feature_MultipleConfigurations { YK_VERSION(2,0,0), 0 }, //Feature_ProtectConfiguration2 { YK_VERSION(1,3,0), 0 }, //Feature_StaticPassword { YK_VERSION(2,0,0), 0 }, //Feature_ScanCodeMode { YK_VERSION(2,0,0), 0 }, //Feature_ShortTicket { YK_VERSION(2,0,0), 0 }, //Feature_StrongPwd { YK_VERSION(2,1,0), 0 }, //Feature_OathHotp { YK_VERSION(2,2,0), 0 }, //Feature_ChallengeResponse { YK_VERSION(2,1,4), 0 }, //Feature_SerialNumber { YK_VERSION(2,1,7), 0 }, //Feature_MovingFactor { YK_VERSION(2,3,0), 0 }, //Feature_ChallengeResponseFixed { YK_VERSION(2,3,0), 0 }, //Feature_Updatable { YK_VERSION(2,1,4), 0 }, //Feature_Ndef { YK_VERSION(2,4,0), 0 }, //Feature_LedInvert { YK_VERSION(3,3,0), 0 }, //Feature_U2F }; // when a featureset should be excluded from versions (NEO, I'm looking at you.) const unsigned int YubiKeyFinder::FEATURE_MATRIX_EXCLUDE[][4] = { { YK_VERSION(2,1,4), YK_VERSION(2,2,0), 0, 0 }, //Feature_MultipleConfigurations { YK_VERSION(2,1,4), YK_VERSION(2,2,0), 0, 0 }, //Feature_ProtectConfiguration2 { YK_VERSION(2,1,4), YK_VERSION(2,1,8), 0, 0 }, //Feature_StaticPassword { YK_VERSION(2,1,4), YK_VERSION(2,1,8), 0, 0 }, //Feature_ScanCodeMode { 0, 0, 0, 0 }, //Feature_ShortTicket { YK_VERSION(2,1,4), YK_VERSION(2,1,8), 0, 0 }, //Feature_StrongPwd { 0, 0, 0, 0 }, //Feature_OathHotp { 0, 0, 0, 0 }, //Feature_ChallengeResponse { 0, 0, 0, 0 }, //Feature_SerialNumber { 0, 0, 0, 0 }, //Feature_MovingFactor { 0, 0, 0, 0 }, //Feature_ChallengeResponseFixed { 0, 0, 0, 0 }, //Feature_Updatable { YK_VERSION(2,2,0), YK_VERSION(3,0,0), YK_VERSION(4,0,0), YK_VERSION(4,9,0) }, //Feature_Ndef { YK_VERSION(3,0,0), YK_VERSION(3,1,0), 0, 0 }, //Feature_LedInvert { 0, 0, 0, 0 }, //Feature_U2F }; YubiKeyFinder::YubiKeyFinder() { // init the ykpers library yk_init(); //Initialize fields init(); //Create timer m_timer = new QTimer( this ); connect(m_timer, SIGNAL(timeout()), this, SLOT(findKey())); } YubiKeyFinder::~YubiKeyFinder() { yk_release(); if(m_timer != 0) { delete m_timer; m_timer = 0; } if(_instance) { delete _instance; } if(m_ykds) { ykds_free(m_ykds); } } YubiKeyFinder* YubiKeyFinder::getInstance() { if(_instance == NULL) { _instance = new YubiKeyFinder(); } return _instance; } QString YubiKeyFinder::versionStr() { if(m_version > 0) { return tr("%1.%2.%3"). arg(m_versionMajor). arg(m_versionMinor). arg(m_versionBuild); } return ""; } bool YubiKeyFinder::checkFeatureSupport(Feature feature) { if(m_version > 0 && (unsigned int) feature < sizeof(FEATURE_MATRIX)/sizeof(FEATURE_MATRIX[0])) { bool supported = ( m_version >= FEATURE_MATRIX[feature][0] && (FEATURE_MATRIX[feature][1] == 0 || m_version < FEATURE_MATRIX[feature][1]) ); if(supported) { if(FEATURE_MATRIX_EXCLUDE[feature][0] != 0) if(m_version >= FEATURE_MATRIX_EXCLUDE[feature][0]) if(m_version < FEATURE_MATRIX_EXCLUDE[feature][1]) return false; if(FEATURE_MATRIX_EXCLUDE[feature][2] != 0) if(m_version >= FEATURE_MATRIX_EXCLUDE[feature][2]) if(m_version < FEATURE_MATRIX_EXCLUDE[feature][3]) return false; } return supported; } return false; } void YubiKeyFinder::init() { m_state = State_Absent; m_yk = 0; m_version = 0; m_versionMajor = 0; m_versionMinor = 0; m_versionBuild = 0; m_serial = 0; m_touchLevel = 0; m_ykds = ykds_alloc(); } void YubiKeyFinder::start() { //Start timer init(); if(m_timer && !m_timer->isActive()) { m_timer->start(TIMEOUT_FINDER); } } void YubiKeyFinder::stop() { //Stop timer if(m_timer && m_timer->isActive()) { m_timer->stop(); // doing closeKey() here might look out of place and may cause findKey() // to fail unexpectedly, but it's needed to not leak file descriptors // when writing the key. closeKey(); } } bool YubiKeyFinder::openKey() { bool flag = true; if (!(m_yk = yk_open_first_key())) { flag = false; } return flag; } bool YubiKeyFinder::closeKey() { bool flag = true; if(m_yk != 0) { if (!yk_close_key(m_yk)) { flag = false; } m_yk = 0; } return flag; } void YubiKeyFinder::findKey() { if(QApplication::activeWindow() == 0) { //No focus, avoid locking the YubiKey. m_state = State_NoFocus; return; } bool error = false; //qDebug() << "-------------------------"; //qDebug() << "Starting key search"; //qDebug() << "-------------------------"; try { if(m_yk == 0 && !openKey()) { throw 0; } if (!yk_get_status(m_yk, m_ykds)) { throw 0; } //qDebug() << "Key found"; //Check pervious state if(m_state == State_Absent || m_state == State_NoFocus) { m_state = State_Present; //Get version m_versionMajor = ykds_version_major(m_ykds); m_versionMinor = ykds_version_minor(m_ykds); m_versionBuild = ykds_version_build(m_ykds); m_version = YK_VERSION(m_versionMajor, m_versionMinor, m_versionBuild); m_touchLevel = ykds_touch_level(m_ykds); //Get serial number if(checkFeatureSupport(Feature_SerialNumber)) { if (!yk_get_serial(m_yk, 0, 0, &m_serial)) { qDebug() << "Failed to read serial number (serial-api-visible disabled?)."; } else { qDebug() << "Serial number: " << m_serial; } } //Get supported features size_t featuresCount = sizeof(FEATURE_MATRIX)/sizeof(FEATURE_MATRIX[0]); bool featuresMatrix[featuresCount]; for(size_t i = 0; i < featuresCount; i++) { featuresMatrix[i] = checkFeatureSupport((Feature)i); } int error = ERR_NOERROR; if(!yk_check_firmware_version2(m_ykds)) { error = ERR_UNKNOWN_FIRMWARE; } emit keyFound(true, featuresMatrix, error); emit diagnostics(QString("Found key with version %1, serial %2 and touch %3.") .arg(versionStr(), QString::number(m_serial), QString::number(m_touchLevel))); } } catch(...) { error = true; } closeKey(); if(error) { init(); m_state = State_Absent; int error = ERR_OTHER; if(yk_errno == YK_EMORETHANONE) { error = ERR_MORETHANONE; } else if(yk_errno == YK_ENOKEY) { error = ERR_NOKEY; } else if(yk_errno == YK_EUSBERR) { emit diagnostics(QString("USB Error: %1").arg(yk_usb_strerror())); } else if(yk_errno) { emit diagnostics(yk_strerror(yk_errno)); } yk_errno = 0; ykp_errno = 0; emit keyFound(false, NULL, error); } //qDebug() << "-------------------------"; //qDebug() << "Stopping key search"; //qDebug() << "-------------------------"; } yubikey-personalization-gui-3.1.23/src/yubikeyconfig.h0000664000175000017500000002203212603205714021540 0ustar klasklas/* Copyright (C) 2011-2013 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef YUBIKEYCONFIG_H #define YUBIKEYCONFIG_H #include "common.h" #include class YubiKeyConfig : public QObject { Q_OBJECT public: YubiKeyConfig(); enum Mode { Mode_YubicoOtp, Mode_Static, Mode_OathHotp, Mode_ChalRespYubico, Mode_ChalRespHmac, Mode_Update, Mode_Swap, }; void setProgrammingMode(Mode mode) {m_mode = mode;} Q_INVOKABLE Mode programmingMode() const {return m_mode;} Q_INVOKABLE AccMode accMode() const {return m_accMode;} void setConfigSlot(int configSlot) {m_configSlot = configSlot;} Q_INVOKABLE int configSlot() const {return m_configSlot;} void setPubIdInHex(bool pubIdInHex) {m_pubIdInHex = pubIdInHex;} Q_INVOKABLE bool pubIdInHex() const {return m_pubIdInHex;} void setPubIdTxt(const QString &pubIdTxt); Q_INVOKABLE QString pubIdTxt() const {return m_pubIdTxt;} void setPvtIdTxt(const QString &pvtIdTxt); Q_INVOKABLE QString pvtIdTxt() const {return m_pvtIdTxt;} void setSecretKeyTxt(const QString &secretKeyTxt); Q_INVOKABLE QString secretKeyTxt() const {return m_secretKeyTxt;} void setCurrentAccessCodeTxt(const QString ¤tAccessCodeTxt); Q_INVOKABLE QString currentAccessCodeTxt() const {return m_currentAccessCodeTxt;} void setNewAccessCodeTxt(const QString &newAccessCodeTxt, AccMode accMode); Q_INVOKABLE QString newAccessCodeTxt() const {return m_newAccessCodeTxt;} void setSerial(const QString &serial) {m_serial = serial;} Q_INVOKABLE QString serial() const {return m_serial;} void setTabFirst(bool tabFirst) {m_tabFirst = tabFirst;} Q_INVOKABLE bool tabFirst() const {return m_tabFirst;} void setAppendTab1(bool appendTab1) {m_appendTab1 = appendTab1;} Q_INVOKABLE bool appendTab1() const {return m_appendTab1;} void setAppendTab2(bool appendTab2) {m_appendTab2 = appendTab2;} Q_INVOKABLE bool appendTab2() const {return m_appendTab2;} void setAppendCr(bool appendCr) {m_appendCr = appendCr;} Q_INVOKABLE bool appendCr() const {return m_appendCr;} void setAppendDelay1(bool appendDelay1) {m_appendDelay1 = appendDelay1;} Q_INVOKABLE bool appendDelay1() const {return m_appendDelay1;} void setAppendDelay2(bool appendDelay2) {m_appendDelay2 = appendDelay2;} Q_INVOKABLE bool appendDelay2() const {return m_appendDelay2;} void setProtectCfg2(bool protectCfg2) {m_protectCfg2 = protectCfg2;} Q_INVOKABLE bool protectCfg2() const {return m_protectCfg2;} void setSendRef(bool sendRef) {m_sendRef = sendRef;} Q_INVOKABLE bool sendRef() const {return m_sendRef;} void setTicketFirst(bool ticketFirst) {m_ticketFirst = ticketFirst;} Q_INVOKABLE bool ticketFirst() const {return m_ticketFirst;} void setPacing10ms(bool pacing10ms) {m_pacing10ms = pacing10ms;} Q_INVOKABLE bool pacing10ms() const {return m_pacing10ms;} void setPacing20ms(bool pacing20ms) {m_pacing20ms = pacing20ms;} Q_INVOKABLE bool pacing20ms() const {return m_pacing20ms;} void setAllowHidtrig(bool allowHidtrig) {m_allowHidtrig = allowHidtrig;} Q_INVOKABLE bool allowHidtrig() const {return m_allowHidtrig;} void setStaticTicket(bool staticTicket) {m_staticTicket = staticTicket;} Q_INVOKABLE bool staticTicket() const {return m_staticTicket;} void setShortTicket(bool shortTicket) {m_shortTicket = shortTicket;} Q_INVOKABLE bool shortTicket() const {return m_shortTicket;} void setStrongPw1(bool strongPw1) {m_strongPw1 = strongPw1;} Q_INVOKABLE bool strongPw1() const {return m_strongPw1;} void setStrongPw2(bool strongPw2) {m_strongPw2 = strongPw2;} Q_INVOKABLE bool strongPw2() const {return m_strongPw2;} void setManUpdate(bool manUpdate) {m_manUpdate = manUpdate;} Q_INVOKABLE bool manUpdate() const {return m_manUpdate;} void setOathFixedModhex1(bool oathFixedModhex1) {m_oathFixedModhex1 = oathFixedModhex1;} Q_INVOKABLE bool oathFixedModhex1() const {return m_oathFixedModhex1;} void setOathFixedModhex2(bool oathFixedModhex2) {m_oathFixedModhex2 = oathFixedModhex2;} Q_INVOKABLE bool oathFixedModhex2() const {return m_oathFixedModhex2;} void setOathFixedModhex(bool oathFixedModhex) {m_oathFixedModhex = oathFixedModhex;} Q_INVOKABLE bool oathFixedModhex() const {return m_oathFixedModhex;} void setOathHotp8(bool oathHotp8) {m_oathHotp8 = oathHotp8;} Q_INVOKABLE bool oathHotp8() const {return m_oathHotp8;} void setOathMovingFactorSeed(unsigned int oathMovingFactorSeed) {m_oathMovingFactorSeed = oathMovingFactorSeed;} Q_INVOKABLE unsigned int oathMovingFactorSeed() const {return m_oathMovingFactorSeed;} void setChalYubico(bool chalYubico) {m_chalYubico = chalYubico;} Q_INVOKABLE bool chalYubico() const {return m_chalYubico;} void setChalHmac(bool chalHmac) {m_chalHmac = chalHmac;} Q_INVOKABLE bool chalHmac() const {return m_chalHmac;} void setHmacLT64(bool hmacLT64) {m_hmacLT64 = hmacLT64;} Q_INVOKABLE bool hmacLT64() const {return m_hmacLT64;} void setChalBtnTrig(bool chalBtnTrig) {m_chalBtnTrig = chalBtnTrig;} Q_INVOKABLE bool chalBtnTrig() const {return m_chalBtnTrig;} void setSerialBtnVisible(bool serialBtnVisible) {m_serialBtnVisible = serialBtnVisible;} Q_INVOKABLE bool serialBtnVisible() const {return m_serialBtnVisible;} void setSerialUsbVisible(bool serialUsbVisible) {m_serialUsbVisible = serialUsbVisible;} Q_INVOKABLE bool serialUsbVisible() const {return m_serialUsbVisible;} void setSerialApiVisible(bool serialApiVisible) {m_serialApiVisible = serialApiVisible;} Q_INVOKABLE bool serialApiVisible() const {return m_serialApiVisible;} void setAllowUpdate(bool allowUpdate) {m_allowUpdate = allowUpdate;} Q_INVOKABLE bool allowUpdate() const {return m_allowUpdate;} void setDormant(bool dormant) {m_dormant = dormant;} Q_INVOKABLE bool dormant() const {return m_dormant;} void setFastTrig(bool fastTrig) {m_fastTrig = fastTrig;} Q_INVOKABLE bool fastTrig() const {return m_fastTrig;} void setUseNumericKeypad(bool useNumericKeypad) {m_useNumericKeypad = useNumericKeypad;} Q_INVOKABLE bool useNumericKeypad() const {return m_useNumericKeypad;} void setLedInvert(bool ledInvert) {m_ledInvert = ledInvert;} Q_INVOKABLE bool ledInvert() const {return m_ledInvert;} private: Mode m_mode; AccMode m_accMode; int m_configSlot; bool m_pubIdInHex; QString m_pubIdTxt; QString m_pvtIdTxt; QString m_secretKeyTxt; QString m_currentAccessCodeTxt; QString m_newAccessCodeTxt; QString m_serial; //Ticket flags bool m_tabFirst; bool m_appendTab1; bool m_appendTab2; bool m_appendCr; bool m_appendDelay1; bool m_appendDelay2; bool m_protectCfg2; //Configuration flags bool m_sendRef; bool m_ticketFirst; bool m_pacing10ms; bool m_pacing20ms; bool m_allowHidtrig; bool m_staticTicket; bool m_shortTicket; bool m_strongPw1; bool m_strongPw2; bool m_manUpdate; bool m_oathFixedModhex1; bool m_oathFixedModhex2; bool m_oathFixedModhex; bool m_oathHotp8; unsigned int m_oathMovingFactorSeed; bool m_chalYubico; bool m_chalHmac; bool m_hmacLT64; bool m_chalBtnTrig; bool m_serialBtnVisible; bool m_serialUsbVisible; bool m_serialApiVisible; // v2.3 settings bool m_allowUpdate; bool m_dormant; bool m_fastTrig; bool m_useNumericKeypad; bool m_ledInvert; }; #endif // YUBIKEYCONFIG_H yubikey-personalization-gui-3.1.23/src/yubikeyconfig.cpp0000664000175000017500000001021512603205714022073 0ustar klasklas/* Copyright (C) 2011-2013 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "yubikeyconfig.h" #include "yubikeyutil.h" #include YubiKeyConfig::YubiKeyConfig() { m_mode = Mode_YubicoOtp; m_accMode = Acc_None; m_configSlot = 1; m_pubIdInHex = false; m_pubIdTxt.clear(); m_pvtIdTxt.clear(); m_secretKeyTxt.clear(); m_currentAccessCodeTxt.clear(); m_newAccessCodeTxt.clear(); m_serial.clear(); QSettings settings; m_tabFirst = settings.value(SG_TAB_FIRST).toBool(); m_appendTab1 = settings.value(SG_APPEND_TAB1).toBool(); m_appendTab2 = settings.value(SG_APPEND_TAB2).toBool(); m_appendCr = settings.value(SG_APPEND_CR).toBool(); m_appendDelay1 = settings.value(SG_APPEND_DELAY1).toBool(); m_appendDelay2= settings.value(SG_APPEND_DELAY2).toBool(); m_protectCfg2 = false; // XXX Not implemented m_sendRef = false; m_ticketFirst = false; m_pacing10ms = settings.value(SG_PACING_10MS).toBool(); m_pacing20ms = settings.value(SG_PACING_20MS).toBool(); m_allowHidtrig = false; m_staticTicket = false; m_shortTicket = false; m_strongPw1 = false; m_strongPw2 = false; m_manUpdate = false; m_oathFixedModhex1 = false; m_oathFixedModhex2 = false; m_oathFixedModhex = false; m_oathHotp8 = false; m_oathMovingFactorSeed = 0; m_chalYubico = false; m_chalHmac = false; m_chalBtnTrig = false; m_hmacLT64 = false; m_serialBtnVisible = settings.value(SG_SR_BTN_VISIBLE).toBool(); m_serialUsbVisible = settings.value(SG_SR_USB_VISIBLE).toBool(); m_serialApiVisible = settings.value(SG_SR_API_VISIBLE).toBool(); if(settings.contains(SG_ALLOW_UPDATE)) { m_allowUpdate = settings.value(SG_ALLOW_UPDATE).toBool(); } else { m_allowUpdate = true; } m_dormant = false; m_fastTrig = settings.value(SG_FAST_TRIG).toBool(); m_useNumericKeypad = settings.value(SG_USE_NUMERIC_KEYPAD).toBool(); m_ledInvert = settings.value(SG_LED_INVERT).toBool(); } void YubiKeyConfig::setPubIdTxt(const QString &pubIdTxt) { m_pubIdTxt = pubIdTxt; if(m_pubIdInHex) { YubiKeyUtil::qstrClean(&m_pubIdTxt, 0); } else { YubiKeyUtil::qstrModhexClean(&m_pubIdTxt, 0); } } void YubiKeyConfig::setPvtIdTxt(const QString &pvtIdTxt) { m_pvtIdTxt = pvtIdTxt; YubiKeyUtil::qstrClean(&m_pvtIdTxt, 0); } void YubiKeyConfig::setSecretKeyTxt(const QString &secretKeyTxt) { m_secretKeyTxt = secretKeyTxt; YubiKeyUtil::qstrClean(&m_secretKeyTxt, 0); } void YubiKeyConfig::setCurrentAccessCodeTxt(const QString ¤tAccessCodeTxt) { m_currentAccessCodeTxt = currentAccessCodeTxt; YubiKeyUtil::qstrClean(&m_currentAccessCodeTxt, 0); } void YubiKeyConfig::setNewAccessCodeTxt(const QString &newAccessCodeTxt, AccMode accMode) { m_newAccessCodeTxt = newAccessCodeTxt; YubiKeyUtil::qstrClean(&m_newAccessCodeTxt, 0); m_accMode = accMode; } yubikey-personalization-gui-3.1.23/src/version.h0000664000175000017500000000367312603205714020370 0ustar klasklas/* Copyright (C) 2011-2015 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef VERSION_H #define VERSION_H #define VER_PRODUCTVERSION VERSION_MAJOR,VERSION_MINOR,VERSION_BUILD,0 #define VER_PRODUCTVERSION_STR VERSION "\0" #define VER_FILEDESCRIPTION_STR "YubiKey Personalization Tool" #define VER_INTERNALNAME_STR "YKPersonalization" #define VER_LEGALCOPYRIGHT "Copyright © 2011-2015 Yubico" #define VER_LEGALTRADEMARKS1_STR "All Rights Reserved" #define VER_ORIGINALFILENAME_STR "YKPersonalization.exe" #define VER_PRODUCTNAME_STR "YKPersonalization" #define VER_COMPANYNAME_STR "Yubico" #define VER_COMPANYDOMAIN_STR "yubico.com" #endif // VERSION_H yubikey-personalization-gui-3.1.23/src/ui/0000775000175000017500000000000012603205714017136 5ustar klasklasyubikey-personalization-gui-3.1.23/src/ui/yubiaccbox.ui0000664000175000017500000001462412603205714021634 0ustar klasklas YubiAccBox 0 0 350 120 Form font: 11px "Verdana"; color: rgb(0, 0, 0); 0 0 350 120 font-weight: bold; Configuration Protection (6 bytes Hex) 10 24 330 22 font-weight: normal; YubiKey(s) unprotected - Keep it that way YubiKey(s) unprotected - Enable protection YubiKey(s) protected - Disable protection YubiKey(s) protected - Keep it that way YubiKey(s) protected - Change access code false 170 52 170 20 font-weight: normal; hh hh hh hh hh hh; 17 17 10 45 141 20 font-weight:normal; Current Access Code 10 80 141 20 font-weight:normal; New Access Code false 170 87 170 20 0 0 font-weight: normal; hh hh hh hh hh hh; 17 17 325 0 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false false 10 60 150 23 font: 11px "Verdana"; color: rgb(0, 0, 0); Use Serial Number false 10 95 150 23 font: 11px "Verdana"; color: rgb(0, 0, 0); Use Serial Number yubikey-personalization-gui-3.1.23/src/ui/yubiaccbox.h0000664000175000017500000000426112603205714021442 0ustar klasklas/* Copyright (C) 2013-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef YUBIACCBOX_H #define YUBIACCBOX_H #include #include #include "common.h" namespace Ui { class YubiAccBox; } class YubiAccBox : public QWidget { Q_OBJECT public: explicit YubiAccBox(QWidget *parent = 0); ~YubiAccBox(); void reset(); bool checkConfirm(); QString newAccessCode(); QString currentAccessCode(); AccMode newAccMode(); private: Ui::YubiAccBox *ui; QString m_serial; void setSerial(QLineEdit* line); private slots: void keyFound(bool found, bool* featuresMatrix); void on_currentUseSerial_clicked(bool checked); void on_newUseSerial_clicked(bool checked); void on_configProtectionCombo_currentIndexChanged(int index); void on_currentAccessCodeTxt_editingFinished(); void on_newAccessCodeTxt_editingFinished(); signals: void showHelp(int helpIndex); }; #endif // YUBIACCBOX_H yubikey-personalization-gui-3.1.23/src/ui/yubiaccbox.cpp0000664000175000017500000001574412603205714022005 0ustar klasklas/* Copyright (C) 2013-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "yubiaccbox.h" #include "ui_yubiaccbox.h" #include "ui/helpbox.h" #include "ui/confirmbox.h" #include "yubikeyfinder.h" #include "yubikeyutil.h" #include "yubikeylogger.h" #include #include #include #define CONFIG_PROTECTION_DISABLED 0 #define CONFIG_PROTECTION_ENABLE 1 #define CONFIG_PROTECTION_DISABLE 2 #define CONFIG_PROTECTION_ENABLED 3 #define CONFIG_PROTECTION_CHANGE 4 YubiAccBox::YubiAccBox(QWidget *parent) : QWidget(parent), ui(new Ui::YubiAccBox) { ui->setupUi(this); QSignalMapper *mapper = new QSignalMapper(this); connect(ui->configProtectionHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); mapper->setMapping(ui->configProtectionHelpBtn, HelpBox::Help_ConfigurationProtection); connect(mapper, SIGNAL(mapped(int)), this, SIGNAL(showHelp(int))); connect(YubiKeyFinder::getInstance(), SIGNAL(keyFound(bool, bool*, int)), this, SLOT(keyFound(bool, bool*))); } YubiAccBox::~YubiAccBox() { delete ui; } void YubiAccBox::reset() { ui->configProtectionCombo->setCurrentIndex(0); } void YubiAccBox::on_configProtectionCombo_currentIndexChanged(int index) { switch(index) { case CONFIG_PROTECTION_DISABLED: ui->currentAccessCodeTxt->clear(); ui->currentAccessCodeTxt->setEnabled(false); ui->currentUseSerial->setChecked(false); ui->currentUseSerial->setEnabled(false); ui->newAccessCodeTxt->clear(); ui->newAccessCodeTxt->setEnabled(false); ui->newUseSerial->setChecked(false); ui->newUseSerial->setEnabled(false); break; case CONFIG_PROTECTION_ENABLE: ui->currentAccessCodeTxt->clear(); ui->currentAccessCodeTxt->setEnabled(false); ui->currentUseSerial->setChecked(false); ui->currentUseSerial->setEnabled(false); on_newAccessCodeTxt_editingFinished(); ui->newAccessCodeTxt->setEnabled(true); ui->newUseSerial->setEnabled(true); break; case CONFIG_PROTECTION_DISABLE: case CONFIG_PROTECTION_ENABLED: on_currentAccessCodeTxt_editingFinished(); ui->currentAccessCodeTxt->setEnabled(true); ui->currentUseSerial->setEnabled(true); ui->newAccessCodeTxt->clear(); ui->newAccessCodeTxt->setEnabled(false); ui->newUseSerial->setChecked(false); ui->newUseSerial->setEnabled(false); break; case CONFIG_PROTECTION_CHANGE: on_currentAccessCodeTxt_editingFinished(); ui->currentAccessCodeTxt->setEnabled(true); ui->currentUseSerial->setEnabled(true); on_newAccessCodeTxt_editingFinished(); ui->newAccessCodeTxt->setEnabled(true); ui->newUseSerial->setEnabled(true); break; } } void YubiAccBox::keyFound(bool found, __attribute__((unused)) bool* featuresMatrix) { if(found) { m_serial = QString::number(YubiKeyFinder::getInstance()->serial()); int num = 12 - m_serial.length(); for(int i = 0; i < num; i++) { m_serial.prepend("0"); } if(!m_serial.isEmpty()) { if(ui->currentUseSerial->isChecked()) { setSerial(ui->currentAccessCodeTxt); } if(ui->newUseSerial->isChecked()) { setSerial(ui->newAccessCodeTxt); } } } else { m_serial.clear(); } } void YubiAccBox::on_currentUseSerial_clicked(bool checked) { if(checked) { setSerial(ui->currentAccessCodeTxt); } } void YubiAccBox::on_newUseSerial_clicked(bool checked) { if(checked) { setSerial(ui->newAccessCodeTxt); } } void YubiAccBox::setSerial(QLineEdit* line) { line->setText(m_serial); } void YubiAccBox::on_currentAccessCodeTxt_editingFinished() { QString txt = ui->currentAccessCodeTxt->text(); YubiKeyUtil::qstrClean(&txt, (size_t)ACC_CODE_SIZE * 2); ui->currentAccessCodeTxt->setText(txt); } void YubiAccBox::on_newAccessCodeTxt_editingFinished() { QString txt = ui->newAccessCodeTxt->text(); YubiKeyUtil::qstrClean(&txt, (size_t)ACC_CODE_SIZE * 2); ui->newAccessCodeTxt->setText(txt); } bool YubiAccBox::checkConfirm() { QSettings settings; if(!settings.value(SG_ENABLE_CONF_PROTECTION).toBool() && !YubiKeyLogger::isLogging() && ui->configProtectionCombo->currentIndex() == CONFIG_PROTECTION_ENABLE) { //Confirm from client ConfirmBox confirm(this); confirm.setConfirmIndex(ConfirmBox::Confirm_ConfigurationProtection); int ret = confirm.exec(); switch (ret) { case 1: //Yes break; default: //No return false; } } return true; } QString YubiAccBox::newAccessCode() { if(ui->configProtectionCombo->currentIndex() == CONFIG_PROTECTION_DISABLE) { return ACCESS_CODE_DEFAULT; } else if(ui->configProtectionCombo->currentIndex() == CONFIG_PROTECTION_ENABLED) { return ui->currentAccessCodeTxt->text(); } else { return ui->newAccessCodeTxt->text(); } } QString YubiAccBox::currentAccessCode() { return ui->currentAccessCodeTxt->text(); } AccMode YubiAccBox::newAccMode() { if(ui->configProtectionCombo->currentIndex() == CONFIG_PROTECTION_DISABLE || ui->configProtectionCombo->currentIndex() == CONFIG_PROTECTION_DISABLED) { return Acc_None; } QCheckBox *lookat = ui->newUseSerial; if(ui->configProtectionCombo->currentIndex() == CONFIG_PROTECTION_ENABLED) { lookat = ui->currentUseSerial; } if(lookat->isChecked() == true) { return Acc_Serial; } return Acc_Random; } yubikey-personalization-gui-3.1.23/src/ui/toolpage.ui0000664000175000017500000012443512603205714021320 0ustar klasklas ToolPage 0 0 730 650 0 0 730 650 StackedWidget font: 11px "Verdana"; color: rgb(0, 0, 0); 3 10 0 710 22 font: 18px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); Tools Qt::AlignCenter 10 50 711 421 border-color: rgb(0, 0, 0); Qt::AlignCenter 20 20 191 25 0 0 font: 12px; font-weight: bold; Number Converter false false false 20 45 671 20 Convert between different number formats Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 20 100 191 25 0 0 font: 12px; font-weight: bold; Challenge-Response false false false 20 125 671 20 Test Challenge-Response functionality of YubiKey Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 20 180 191 25 0 0 font: 12px; font-weight: bold; NDEF Programming false false false 20 205 671 20 Program the static NDEF string of a Yubikey NEO Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 20 260 191 25 0 0 font: 12px; font-weight: bold; Delete Configuration false false false 20 285 671 20 Delete the configuration stored in the YubiKey Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 20 340 650 80 0 0 191 25 0 0 font: 12px; font-weight: bold; Import Configuration false false false 0 25 671 20 Import a configuration in ycfg format Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 10 0 710 22 font: 18px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); Number Converter Qt::AlignCenter 10 50 711 125 font-weight: bold; 180 60 381 20 0 0 font-weight: normal; nn nn nn nn nn nn nn nn nn nn nn nn nn nn nn nn 47 47 10 30 91 20 font-weight:normal; Hexadecimal 10 60 91 20 font-weight:normal; Modhex 180 30 381 20 0 0 font-weight: normal; nn nn nn nn nn nn nn nn nn nn nn nn nn nn nn nn 47 47 false 571 28 85 25 font: 12px; font-weight: bold; Copy false false false false 571 58 85 25 font: 12px; font-weight: bold; Copy false false false 10 90 91 20 font-weight:normal; Decimal 180 90 381 20 font-weight: normal; 00000000000000000000 0 20 20 false 571 88 85 25 font: 12px; font-weight: bold; Copy false false false 110 30 61 20 font-weight: normal; color: rgb(118, 116, 108) (0 chars) 110 60 61 20 font-weight: normal; color: rgb(118, 116, 108) (0 chars) 110 90 61 20 font-weight:normal; color:rgb(221, 97, 99); 10 185 711 60 font-weight: bold; Actions true 110 25 85 25 font: 12px; font-weight: bold; Reset false false false 10 25 85 25 font: 12px; font-weight: bold; Convert false false false 210 25 85 25 Back 10 0 710 22 font: 18px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); Challenge-Response Tester Qt::AlignCenter 10 50 711 225 0 70 361 50 10 0 321 16 font-weight: normal; color: rgb(118, 116, 108); Select the challenge-response type 10 20 151 19 font-weight: normal; HMAC-SHA1 true false 200 20 151 19 font-weight: normal; Yubico OTP 0 0 361 60 10 10 321 16 font-weight: normal; color: rgb(118, 116, 108); Select the configuration slot to be used 10 30 151 19 font-weight: normal; Configuration Slot 1 true false 200 30 151 19 font-weight: normal; Configuration Slot 2 10 130 321 16 font-weight: normal; color: rgb(118, 116, 108); Input challenge, max 64 characters 10 150 361 20 0 0 font-weight: normal; 64 0 10 175 321 16 font-weight: normal; color: rgb(118, 116, 108); Response: 10 195 361 20 0 0 font-weight: normal; 64 true 10 295 711 50 font-weight: bold; 10 10 85 25 Perform 210 10 85 25 Back 110 10 85 25 Reset 0 0 710 22 font: 18px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); NDEF Programming Qt::AlignCenter 10 300 711 50 font-weight: bold; 10 10 85 25 Program 210 10 85 25 Back 110 10 85 25 Reset 10 50 711 240 10 65 321 16 font-weight: normal; color: rgb(118, 116, 108); Select the NDEF type 10 85 221 17 font-weight: normal; URI true true 10 105 151 17 font-weight: normal; Text 10 210 391 20 https://my.yubico.com/neo/ 80 false 10 145 113 26 en-US 10 125 321 16 font-weight: normal; color: rgb(118, 116, 108); NDEF text language (IANA language code) 10 190 321 16 font-weight: normal; color: rgb(118, 116, 108); NDEF payload, OTP will be appended on the end 530 10 150 100 10 10 125 23 Use Access Code 10 40 125 20 hh hh hh hh hh hh 00 00 00 00 00 00 false 10 65 150 23 font: 11px "Verdana"; color: rgb(0, 0, 0); Use Serial Number 10 10 361 50 0 0 321 16 font-weight: normal; color: rgb(118, 116, 108); Select the configuration slot to be used 0 20 151 19 font-weight: normal; Configuration Slot 1 true false 190 20 151 19 font-weight: normal; Configuration Slot 2 10 50 361 75 10 10 321 16 font-weight: normal; color: rgb(118, 116, 108); Select the configuration slot to be deleted 10 40 151 19 font-weight: normal; Configuration Slot 1 true false 200 40 151 19 font-weight: normal; Configuration Slot 2 10 0 710 22 font: 18px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); Delete Configuration Qt::AlignCenter 10 125 711 50 font-weight: bold; 10 10 85 25 Delete 110 10 85 25 Back 500 50 150 100 10 10 125 23 Use Access Code 10 40 125 20 hh hh hh hh hh hh 00 00 00 00 00 00 false 10 65 150 23 font: 11px "Verdana"; color: rgb(0, 0, 0); Use Serial Number 0 0 710 22 font: 18px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); Import Configuration Qt::AlignCenter 10 70 711 50 font-weight: bold; 10 10 85 25 Import 110 10 85 25 Back 10 50 600 16 font-weight: normal; color: rgb(118, 116, 108); When you import and select a file all settings will be overwritten 10 115 600 16 font-weight: normal; color: rgb(118, 116, 108); Import is only available with a YubiKey inserted converterHexTxt converterModhexTxt converterDecTxt converterHexCopyBtn converterModhexCopyBtn converterDecCopyBtn converterConvertBtn converterResetBtn converterBtn yubikey-personalization-gui-3.1.23/src/ui/toolpage.h0000664000175000017500000000667212603205714021134 0ustar klasklas/* Copyright (C) 2011-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef TOOLPAGE_H #define TOOLPAGE_H #include #include namespace Ui { class ToolPage; } class ToolPage : public QStackedWidget { Q_OBJECT public: explicit ToolPage(QWidget *parent = 0); ~ToolPage(); static void setImportFilename(QString filename); static QString defaultImportFilename(void); enum Page { Page_Base, Page_Converter, Page_ChalResp, Page_Ndef, Page_Zap, Page_Import, }; private: Ui::ToolPage *ui; int m_currentPage; QString m_serial; static QString m_filename; void setSerial(QLineEdit *line); public slots: void loadSettings(); void setCurrentPage(int pageIndex); private slots: void connectPages(); void connectHelpButtons(); // Converter Page void resetConverterPage(); void convert(int updatedIndex, QString txt); void on_converterHexTxt_editingFinished(); void on_converterModhexTxt_editingFinished(); void on_converterDecTxt_editingFinished(); void copyToClipboard(const QString &str); void on_converterHexCopyBtn_clicked(); void on_converterModhexCopyBtn_clicked(); void on_converterDecCopyBtn_clicked(); // Challenge Response Page void resetChalRespPage(); void performChallengeResponse(); void on_chalRespChallenge_editingFinished(); // ndef page void resetNdefPage(); void programNdef(); void on_ndefTextRadio_toggled(bool checked); void ndefWritten(bool written, const QString &msg); void on_ndefAccCodeCheckbox_toggled(bool checked); void on_ndefUseSerial_toggled(bool checked); // zap page void on_zapPerformBtn_clicked(); void on_zapAccCodeCheckbox_toggled(bool checked); void on_zapUseSerial_toggled(bool checked); void zapDone(bool written, const QString &msg); // import page void on_importPerformBtn_clicked(); void keyFound(bool found, bool* featuresMatrix); signals: void showStatusMessage(const QString &text, int status = 0); void reloadSettings(); void switchPage(int page, int tab, int slot); void showHelp(int helpIndex); }; #endif // TOOLPAGE_H yubikey-personalization-gui-3.1.23/src/ui/toolpage.cpp0000664000175000017500000004703112603205714021461 0ustar klasklas/* Copyright (C) 2011-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "toolpage.h" #include "yubikeyfinder.h" #include "yubikeywriter.h" #include "yubikeyutil.h" #include "ui_toolpage.h" #include "ui/helpbox.h" #include "ui/confirmbox.h" #include "mainwindow.h" #include "otppage.h" #include "chalresppage.h" #include "oathpage.h" #include "staticpage.h" #include #include #include #include #include #include #include #include #include "common.h" #define IMPORT_FILENAME_DEF "import.ycfg" QString ToolPage::m_filename = defaultImportFilename(); ToolPage::ToolPage(QWidget *parent) : QStackedWidget(parent), ui(new Ui::ToolPage) { ui->setupUi(this); //Connect pages connectPages(); //Connect help buttons connectHelpButtons(); //Connect other signals and slots connect(ui->converterResetBtn, SIGNAL(clicked()), this, SLOT(resetConverterPage())); connect(ui->chalRespResetBtn, SIGNAL(clicked()), this, SLOT(resetChalRespPage())); connect(ui->chalRespPerformBtn, SIGNAL(clicked()), this, SLOT(performChallengeResponse())); connect(ui->chalRespChallenge, SIGNAL(editingFinished()), this, SLOT(on_chalRespChallenge_editingFinished())); connect(ui->ndefResetBtn, SIGNAL(clicked()), this, SLOT(resetNdefPage())); connect(ui->ndefProgramBtn, SIGNAL(clicked()), this, SLOT(programNdef())); connect(YubiKeyFinder::getInstance(), SIGNAL(keyFound(bool, bool*, int)), this, SLOT(keyFound(bool, bool*))); ui->zapAccCodeEdit->setEnabled(false); ui->ndefAccCodeEdit->setEnabled(false); ui->importBox->setVisible(false); loadSettings(); } ToolPage::~ToolPage() { delete ui; } /* Common */ void ToolPage::connectPages() { //Map the values of the navigation buttons with the indexes of //the stacked widget //Create a QMapper QSignalMapper *mapper = new QSignalMapper(this); //Connect the clicked signal with the QSignalMapper connect(ui->converterBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->converterBackBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->chalRespBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->chalRespBackBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->ndefBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->ndefBackBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->zapBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->zapBackBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->importBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->importBackBtn, SIGNAL(clicked()), mapper, SLOT(map())); //Set a value for each button mapper->setMapping(ui->converterBtn, Page_Converter); mapper->setMapping(ui->converterBackBtn, Page_Base); mapper->setMapping(ui->chalRespBtn, Page_ChalResp); mapper->setMapping(ui->chalRespBackBtn, Page_Base); mapper->setMapping(ui->ndefBtn, Page_Ndef); mapper->setMapping(ui->ndefBackBtn, Page_Base); mapper->setMapping(ui->zapBtn, Page_Zap); mapper->setMapping(ui->zapBackBtn, Page_Base); mapper->setMapping(ui->importBtn, Page_Import); mapper->setMapping(ui->importBackBtn, Page_Base); //Connect the mapper to the widget //The mapper will set a value to each button and //set that value to the widget //connect(pageMapper, SIGNAL(mapped(int)), this, SLOT(setCurrentIndex(int))); connect(mapper, SIGNAL(mapped(int)), this, SLOT(setCurrentPage(int))); //Set the current page m_currentPage = 0; setCurrentIndex(Page_Base); } void ToolPage::loadSettings() { QSettings settings; ui->importBox->setVisible(settings.value(SG_EXPORT_PREFERENCE).toBool()); } void ToolPage::setCurrentPage(int pageIndex) { //Page changed... m_currentPage = pageIndex; switch(pageIndex){ case Page_Converter: resetConverterPage(); break; } setCurrentIndex(pageIndex); } void ToolPage::connectHelpButtons() { } void ToolPage::resetChalRespPage() { ui->chalRespChallenge->clear(); ui->chalRespResponse->clear(); } void ToolPage::on_chalRespChallenge_editingFinished() { QString challenge = ui->chalRespChallenge->text().trimmed(); ui->chalRespChallenge->setText(challenge); } void ToolPage::performChallengeResponse() { QString challenge = ui->chalRespChallenge->text(); QString response = ""; bool hmac; int slot; if(ui->chalRespHmacRadio->isChecked()) { hmac = true; } else if(ui->chalRespYubicoRadio->isChecked()) { hmac = false; } else { emit showStatusMessage(tr(ERR_CHAL_TYPE_NOT_SELECTED), 1); return; } if(ui->chalRespSlot1Radio->isChecked()) { slot = 1; } else if(ui->chalRespSlot2Radio->isChecked()) { slot = 2; } else { emit showStatusMessage(tr(ERR_CONF_SLOT_NOT_SELECTED), 1); return; } YubiKeyWriter::getInstance()->doChallengeResponse(challenge, response, slot, hmac); qDebug() << "response was: " << response; ui->chalRespResponse->setText(response); } /* Quick Page handling */ void ToolPage::resetConverterPage() { convert(0, ""); ui->converterHexTxt->setCursorPosition(0); ui->converterHexTxt->setFocus(); } void ToolPage::convert(int updatedIndex, QString txt) { unsigned char buf[32]; memset(buf, 0, sizeof(buf)); size_t bufLen; switch(updatedIndex) { case 0: //Hex YubiKeyUtil::qstrHexDecode(buf, &bufLen, txt); break; case 1: //Modhex YubiKeyUtil::qstrModhexDecode(buf, &bufLen, txt); break; case 2: //Decimal QString tmp = QString::number(txt.toULongLong(), 16); size_t len = tmp.length(); if(len % 2 != 0) { len++; } YubiKeyUtil::qstrClean(&tmp, (size_t)len, true); YubiKeyUtil::qstrHexDecode(buf, &bufLen, tmp); break; } QString hex = YubiKeyUtil::qstrHexEncode(buf, bufLen); QString modhex = YubiKeyUtil::qstrModhexEncode(buf, bufLen); bool ok = false; qulonglong dec = hex.toULongLong(&ok, 16); int hexLen = hex.length(); int modhexLen = modhex.length(); ui->converterHexTxt->setText(hex); ui->converterModhexTxt->setText(modhex); ui->converterDecTxt->setText(QString::number(dec)); ui->converterHexCopyBtn->setEnabled(hexLen > 0); ui->converterModhexCopyBtn->setEnabled(modhexLen > 0); ui->converterDecCopyBtn->setEnabled( ui->converterDecTxt->text().length() > 0); ui->converterHexLenLbl->setText(tr("(%1 chars)").arg(hexLen)); ui->converterModhexLenLbl->setText(tr("(%1 chars)").arg(modhexLen)); if(hexLen != 0 && !ok) { ui->converterDecErrLbl->setText(tr(TOVERFLOW)); } else { ui->converterDecErrLbl->setText(tr("")); } } void ToolPage::on_converterHexTxt_editingFinished() { QString txt = ui->converterHexTxt->text(); YubiKeyUtil::qstrClean(&txt, 0, true); size_t len = txt.length(); if(len > 0) { if(len % 2 != 0) { len++; } YubiKeyUtil::qstrClean(&txt, (size_t)len, true); convert(0, txt); } ui->converterHexTxt->setCursorPosition(len + len/2); } void ToolPage::on_converterModhexTxt_editingFinished() { QString txt = ui->converterModhexTxt->text(); YubiKeyUtil::qstrModhexClean(&txt, 0, true); size_t len = txt.length(); if(len > 0) { if(len % 2 != 0) { len++; } YubiKeyUtil::qstrModhexClean(&txt, (size_t)len, true); convert(1, txt); } ui->converterModhexTxt->setCursorPosition(len + len/2); } void ToolPage::on_converterDecTxt_editingFinished() { QString txt = ui->converterDecTxt->text(); bool ok = false; qulonglong dec = txt.toULongLong(&ok); if(ok) { if(dec > 0) { size_t len = txt.length(); YubiKeyUtil::qstrClean(&txt, (size_t)len, true); convert(2, txt); ui->converterDecTxt->setCursorPosition(len); } } else { ui->converterDecErrLbl->setText(tr(TOVERFLOW)); } } void ToolPage::copyToClipboard(const QString &str) { QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(str); showStatusMessage(tr(VALUE_COPIED), 0); } void ToolPage::on_converterHexCopyBtn_clicked() { QString txt = ui->converterHexTxt->text(); YubiKeyUtil::qstrClean(&txt, 0, true); copyToClipboard(txt); } void ToolPage::on_converterModhexCopyBtn_clicked() { QString txt = ui->converterModhexTxt->text(); YubiKeyUtil::qstrModhexClean(&txt, 0, true); copyToClipboard(txt); } void ToolPage::on_converterDecCopyBtn_clicked() { copyToClipboard(ui->converterDecTxt->text()); } void ToolPage::resetNdefPage() { ui->ndefEdit->setText("https://my.yubico.com/neo/"); ui->ndefTextLangEdit->setText("en-US"); ui->ndefUriRadio->setChecked(true); ui->ndefAccCodeCheckbox->setChecked(false); ui->ndefSlot1Radio->setChecked(false); ui->ndefSlot2Radio->setChecked(false); } void ToolPage::programNdef() { QSettings settings; YubiKeyWriter *writer = YubiKeyWriter::getInstance(); bool uri = true; QString language; QString payload; int slot; if(ui->ndefTextRadio->isChecked()) { uri = false; language = ui->ndefTextLangEdit->text().trimmed(); if(language.isEmpty()) { return; } } payload = ui->ndefEdit->text().trimmed(); if(payload.isEmpty()) { return; } if(uri && !settings.value(SG_NDEF_WITHOUT_HTTP).toBool()) { if(!payload.startsWith("http")) { ConfirmBox confirm(this); confirm.setConfirmIndex(ConfirmBox::Confirm_NdefWithoutHttp); int ret = confirm.exec(); if(ret != 1) // 1 is yes return; } } if(ui->ndefSlot1Radio->isChecked()) { slot = 1; } else if(ui->ndefSlot2Radio->isChecked()) { slot = 2; } else { emit showStatusMessage(tr(ERR_CONF_SLOT_NOT_SELECTED), 1); return; } connect(writer, SIGNAL(configWritten(bool, const QString &)), this, SLOT(ndefWritten(bool, const QString &))); writer->writeNdef(uri, language, payload, ui->ndefAccCodeEdit->text().remove(" "), slot); } void ToolPage::ndefWritten(bool written, __attribute__((unused)) const QString &msg) { disconnect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(ndefWritten(bool, const QString &))); if(written) { showStatusMessage(tr("NDEF successfully written")); } } void ToolPage::on_ndefTextRadio_toggled(bool checked) { if(checked) { ui->ndefTextLangEdit->setEnabled(true); ui->ndefEdit->setText(""); } else { ui->ndefTextLangEdit->setText("en-US"); ui->ndefTextLangEdit->setEnabled(false); ui->ndefEdit->setText("https://my.yubico.com/neo/"); } } void ToolPage::on_ndefAccCodeCheckbox_toggled(bool checked) { ui->ndefAccCodeEdit->setText("00 00 00 00 00 00"); ui->ndefAccCodeEdit->setEnabled(checked); ui->ndefUseSerial->setChecked(false); ui->ndefUseSerial->setEnabled(checked); } void ToolPage::on_ndefUseSerial_toggled(bool checked) { if(checked) { setSerial(ui->ndefAccCodeEdit); } } void ToolPage::on_zapPerformBtn_clicked() { int slot; if(ui->zapSlot1Radio->isChecked()) { slot = 1; } else if(ui->zapSlot2Radio->isChecked()) { slot = 2; } else { emit showStatusMessage(tr(ERR_CONF_SLOT_NOT_SELECTED), 1); return; } YubiKeyWriter *writer = YubiKeyWriter::getInstance(); connect(writer, SIGNAL(configWritten(bool, const QString &)), this, SLOT(zapDone(bool, const QString &))); writer->deleteConfig(slot, ui->zapAccCodeEdit->text().remove(" ")); } void ToolPage::zapDone(bool written, __attribute__((unused)) const QString &msg) { disconnect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(zapDone(bool, const QString &))); if(written) { showStatusMessage(tr("Configuration successfully deleted.")); } } void ToolPage::on_zapAccCodeCheckbox_toggled(bool checked) { ui->zapAccCodeEdit->setText("00 00 00 00 00 00"); ui->zapAccCodeEdit->setEnabled(checked); ui->zapUseSerial->setChecked(false); ui->zapUseSerial->setEnabled(checked); } void ToolPage::on_zapUseSerial_toggled(bool checked) { if(checked) { setSerial(ui->zapAccCodeEdit); } } void ToolPage::on_importPerformBtn_clicked() { QString filename = QFileDialog::getOpenFileName(this, tr("Open file for import"), m_filename, tr("Yubico cfg format (*.ycfg);;All Files (*.*)")); if(filename.isEmpty()) { return; } QFile file(filename); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { showStatusMessage(tr("Failed to open selected file."), 1); } char data[1024]; int len = file.read(data, 1024); if(!len) { showStatusMessage(tr("Failed to read from selected file."), 1); } file.close(); YKP_CONFIG *cfg = ykp_alloc(); YK_STATUS *ykds = YubiKeyFinder::getInstance()->status(); ykp_configure_version(cfg, ykds); int ret = ykp_import_config(cfg, data, len, YKP_FORMAT_YCFG); if(ret) { QSettings settings; m_filename = filename; settings.setValue(SG_IMPORT_FILENAME, filename); MainWindow::Page page = MainWindow::Page_Otp; int tab = OtpPage::Page_Advanced; if(ykp_get_tktflag_OATH_HOTP(cfg)) { if(ykp_get_cfgflag_CHAL_HMAC(cfg)) { qDebug() << "importing mode chal-resp hmac"; page = MainWindow::Page_ChalResp; tab = ChalRespPage::Page_Advanced; settings.setValue(SG_REQUIRE_INPUT, ykp_get_cfgflag_CHAL_BTN_TRIG(cfg)); settings.setValue(SG_HMAC_LT64, ykp_get_cfgflag_HMAC_LT64(cfg)); } else if(ykp_get_cfgflag_CHAL_YUBICO(cfg)) { qDebug() << "importing mode chal-resp yubico"; page = MainWindow::Page_ChalResp; tab = ChalRespPage::Page_Quick; settings.setValue(SG_REQUIRE_INPUT, ykp_get_cfgflag_CHAL_BTN_TRIG(cfg)); } else { qDebug() << "importing mode oath hotp"; page = MainWindow::Page_Oath; tab = OathPage::Page_Advanced; settings.setValue(SG_OATH_HOTP8, ykp_get_cfgflag_OATH_HOTP8(cfg)); // XXX: handle seed and fixed_modhex } } else if(ykp_get_cfgflag_STATIC_TICKET(cfg)) { qDebug() << "importing mode static"; page = MainWindow::Page_Static; tab = StaticPage::Page_Advanced; settings.setValue(SG_STRONG_PW1, ykp_get_cfgflag_STRONG_PW1(cfg)); if(ykp_get_cfgflag_STRONG_PW2(cfg)) { settings.setValue(SG_STRONG_PW2, true); settings.setValue(SG_STRONG_PW3, ykp_get_cfgflag_SEND_REF(cfg)); } else { settings.setValue(SG_STRONG_PW2, false); } } else { qDebug() << "importing yubico otp"; } settings.setValue(SG_MAN_UPDATE, ykp_get_cfgflag_MAN_UPDATE(cfg)); settings.setValue(SG_PACING_10MS, ykp_get_cfgflag_PACING_10MS(cfg)); settings.setValue(SG_PACING_20MS, ykp_get_cfgflag_PACING_20MS(cfg)); settings.setValue(SG_APPEND_CR, ykp_get_tktflag_APPEND_CR(cfg)); settings.setValue(SG_APPEND_DELAY1, ykp_get_tktflag_APPEND_DELAY1(cfg)); settings.setValue(SG_APPEND_DELAY2, ykp_get_tktflag_APPEND_DELAY2(cfg)); settings.setValue(SG_APPEND_TAB1, ykp_get_tktflag_APPEND_TAB1(cfg)); settings.setValue(SG_APPEND_TAB2, ykp_get_tktflag_APPEND_TAB2(cfg)); settings.setValue(SG_TAB_FIRST, ykp_get_tktflag_TAB_FIRST(cfg)); settings.setValue(SG_SR_BTN_VISIBLE, ykp_get_extflag_SERIAL_BTN_VISIBLE(cfg)); settings.setValue(SG_SR_USB_VISIBLE, ykp_get_extflag_SERIAL_USB_VISIBLE(cfg)); settings.setValue(SG_SR_API_VISIBLE, ykp_get_extflag_SERIAL_API_VISIBLE(cfg)); settings.setValue(SG_USE_NUMERIC_KEYPAD, ykp_get_extflag_USE_NUMERIC_KEYPAD(cfg)); settings.setValue(SG_FAST_TRIG, ykp_get_extflag_FAST_TRIG(cfg)); settings.setValue(SG_ALLOW_UPDATE, ykp_get_extflag_ALLOW_UPDATE(cfg)); settings.setValue(SG_LED_INVERT, ykp_get_extflag_LED_INV(cfg)); int config = ykp_config_num(cfg); emit switchPage(page, tab, config); emit reloadSettings(); } else { showStatusMessage(tr("Failed to parse the configuration."), 1); } ykp_free_config(cfg); } void ToolPage::keyFound(bool found, bool* featuresMatrix) { if(found && featuresMatrix[YubiKeyFinder::Feature_ChallengeResponse]) { ui->chalRespPerformBtn->setEnabled(true); } else { ui->chalRespPerformBtn->setEnabled(false); } if(found && featuresMatrix[YubiKeyFinder::Feature_Ndef]) { ui->ndefProgramBtn->setEnabled(true); } else { ui->ndefProgramBtn->setEnabled(false); } if(found && featuresMatrix[YubiKeyFinder::Feature_MultipleConfigurations]) { ui->chalRespSlot2Radio->setEnabled(true); ui->zapSlot2Radio->setEnabled(true); ui->ndefSlot2Radio->setEnabled(true); } else { ui->chalRespSlot2Radio->setEnabled(false); ui->zapSlot2Radio->setEnabled(false); ui->ndefSlot2Radio->setEnabled(false); } ui->zapPerformBtn->setEnabled(found); ui->importPerformBtn->setEnabled(found); if(found) { m_serial = QString::number(YubiKeyFinder::getInstance()->serial()); int num = 12 - m_serial.length(); for(int i = 0; i < num; i++) { m_serial.prepend("0"); } if(!m_serial.isEmpty()) { if(ui->ndefUseSerial->isChecked()) { setSerial(ui->ndefAccCodeEdit); } if(ui->zapUseSerial->isChecked()) { setSerial(ui->zapAccCodeEdit); } } } else { m_serial.clear(); } } void ToolPage::setImportFilename(QString filename) { m_filename = filename; } QString ToolPage::defaultImportFilename() { return QDir::homePath() + "/" + IMPORT_FILENAME_DEF; } void ToolPage::setSerial(QLineEdit *line) { if(!m_serial.isEmpty()) { line->setText(m_serial); } } yubikey-personalization-gui-3.1.23/src/ui/staticpage.ui0000664000175000017500000016212212603205714021625 0ustar klasklas StaticPage 0 0 730 650 0 0 730 650 StackedWidget font: 11px "Verdana"; color: rgb(0, 0, 0); 1 10 0 710 22 font: 18px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); Program in Static Password mode Qt::AlignCenter 10 50 710 171 border-color: rgb(0, 0, 0); Qt::AlignCenter 20 20 110 25 0 0 font: 12px; font-weight: bold; Scan Code false false false 20 100 110 25 font: 12px; font-weight: bold; Advanced false false false 20 45 671 20 Quickly program a YubiKey to emit your desired static password Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 20 120 671 30 Allows you to program one or more YubiKeys to emit long, "hard to guess and remember" static passwords Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 10 0 710 22 font: 18px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); Program in Static Password mode - Scan Code Qt::AlignCenter 10 50 711 72 font-weight: bold; Configuration Slot 10 25 691 16 font-weight: normal; color: rgb(118, 116, 108) Select the configuration slot to be programmed 10 45 151 19 font-weight: normal; Configuration Slot 1 240 45 151 19 font-weight: normal; Configuration Slot 2 685 45 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 240 711 190 font-weight: bold; Password false false 685 0 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 150 75 205 20 0 0 font-weight: normal; 76 QLineEdit::Normal false 10 50 110 20 font-weight:normal; Password Length 10 75 110 20 font-weight:normal; Password 40 146 661 31 font-weight:normal; It is strongly recommended to create a backup YubiKey with same password in case original YubiKey is lost/broken true 180 50 431 20 font-weight: normal; color: rgb(118, 116, 108) (Max. 38 chars for YubiKey 2.2+ and 16 chars for 2.0 and 2.1) 10 150 24 24 0 0 ArrowCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/recommend.png); color: lightgray; border-radius: 1px; false false 150 100 111 24 font: 12px; font-weight: bold; Insert Tab false false false 150 50 31 20 0 270 100 85 25 font: 12px; font-weight: bold; Clear false false false 10 25 221 18 font-weight: normal; Hide Password false 370 75 110 20 font-weight:normal; Scan codes 490 75 200 20 Verdana -1 50 false false font-weight: normal; 490 105 51 20 font-weight:normal; Keyboard 549 101 141 22 0 0 font-weight: normal; Choose a layout ... US Keyboard DE Keyboard 10 440 711 80 font-weight: bold; Actions 10 45 175 25 font: 12px; font-weight: bold; Write Configuration false false false 400 45 85 25 font: 12px; font-weight: bold; Back false false false 10 25 691 16 font-weight: normal; color: rgb(118, 116, 108) Press Write Configuration button to program your YubiKey's selected configuration slot false 300 45 85 25 font: 12px; font-weight: bold; Reset false false false false 200 45 85 25 font: 12px; font-weight: bold; Stop false false false 10 132 350 107 font-weight: bold; Program Multiple YubiKeys true false 10 25 331 17 font-weight: normal; Automatically program YubiKeys when inserted 10 520 711 130 font-weight: bold; Results 12 20 688 100 font: 11px "Verdana"; color: rgb(0, 0, 0); Qt::ScrollBarAlwaysOn true false Qt::SolidLine true 0 4 50 false 20 # Password Length Status Timestamp 370 132 350 117 10 0 710 22 font: 18px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); Program in Static Password mode - Advanced Qt::AlignCenter 10 50 711 72 font-weight: bold; Configuration Slot 10 25 691 16 font-weight: normal; color: rgb(118, 116, 108); Select the configuration slot to be programmed 10 45 151 19 font-weight: normal; Configuration Slot 1 true false 240 45 151 19 font-weight: normal; Configuration Slot 2 685 45 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 249 711 161 font-weight: bold; Password Parameters 685 102 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 240 100 330 20 0 0 font-weight: normal; hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 47 47 580 98 100 24 font: 12px; font-weight: bold; Generate false false false 240 50 330 20 0 0 font-weight: normal; 0 0 240 75 330 20 0 0 font-weight: normal; hh hh hh hh hh hh 00 00 00 00 00 00 17 17 580 48 100 24 font: 12px; font-weight: bold; Generate false false false 580 73 100 24 font: 12px; font-weight: bold; Generate false false false 685 52 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 685 77 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 25 221 20 font-weight:normal; Password Length 10 100 221 20 font-weight:normal; Secret Key (16 bytes Hex) 10 50 221 20 font-weight:normal; Public Identity (1-16 bytes Modhex) 10 75 221 20 font-weight:normal; Private Identity (6 bytes Hex) 360 23 42 20 font-weight: normal; QAbstractSpinBox::UpDownArrows QAbstractSpinBox::CorrectToNearestValue 32 64 2 32 10 125 221 20 font-weight:normal; Strong Password Policy 240 130 147 17 font-weight: normal; Upper and lower case 410 130 101 17 font-weight: normal; Alphanumeric 540 130 157 17 font-weight: normal; Send ! as prefix 240 25 72 17 font-weight: normal; 16 chars true false 340 25 17 17 font-weight: normal; true 410 25 31 20 font-weight:normal; chars 450 25 251 20 font-weight: normal; color: rgb(118, 116, 108) (16 chars for YubiKey 2.0 and above only) 10 421 711 80 font-weight: bold; Actions 10 45 175 25 font: 12px; font-weight: bold; Write Configuration false false false false 200 45 85 25 font: 12px; font-weight: bold; Stop false false false 20 20 691 16 font-weight: normal; color: rgb(118, 116, 108) Press Write Configuration button to program your YubiKey's selected configuration slot 400 45 85 25 font: 12px; font-weight: bold; Back false false false false 300 45 85 25 font: 12px; font-weight: bold; Reset false false false 10 132 350 107 font-weight: bold; Program Multiple YubiKeys true false 10 25 331 17 font-weight: normal; Automatically program YubiKeys when inserted 10 52 191 20 font-weight:normal; Parameter Generation Scheme Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 10 75 331 22 0 0 font-weight: normal; Increment Identities; Randomize Secret Randomize all parameters Fixed parameters 325 52 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 511 711 130 font-weight: bold; Results 12 20 688 100 font: 11px "Verdana"; color: rgb(0, 0, 0); Qt::ScrollBarAlwaysOn true false Qt::SolidLine true 0 5 50 false 20 # Password Length Public Identity (Modhex) Status Timestamp 370 132 350 117 YubiAccBox QWidget
yubiaccbox.h
1
quickBtn advBtn quickConfigSlot1Radio quickConfigSlot2Radio quickProgramMulKeysBox quickAutoProgramKeysCheck quickHideParams quickStaticTxt quickInsertTabBtn quickClearBtn quickWriteConfigBtn quickStopBtn quickResetBtn quickBackBtn quickResultsWidget quickConfigHelpBtn quickStaticScanCodeHelpBtn quickStaticBkpHelpBtn advConfigSlot1Radio advConfigSlot2Radio advProgramMulKeysBox advAutoProgramKeysCheck advConfigParamsCombo advStaticLen16Radio advStaticLen32Radio advStaticLenBox advPubIdTxt advPubIdGenerateBtn advPvtIdTxt advPvtIdGenerateBtn advSecretKeyTxt advSecretKeyGenerateBtn advStrongPw1Check advStrongPw2Check advStrongPw3Check advWriteConfigBtn advStopBtn advResetBtn advBackBtn advResultsWidget advConfigHelpBtn advParamGenSchemeHelpBtn advPubIdHelpBtn advPvtIdHelpBtn advSecretKeyHelpBtn
yubikey-personalization-gui-3.1.23/src/ui/staticpage.h0000664000175000017500000001053412603205714021436 0ustar klasklas/* Copyright (C) 2011-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef STATICPAGE_H #define STATICPAGE_H #include #include "yubikeyconfig.h" #include "scanedit.h" namespace Ui { class StaticPage; } class StaticPage : public QStackedWidget { Q_OBJECT public: explicit StaticPage(QWidget *parent = 0); ~StaticPage(); enum Page { Page_Base, Page_Quick, Page_Advanced, Page_Upload }; private: Ui::StaticPage *ui; int m_currentPage; enum State { State_Initial, State_Programming, State_Programming_Multiple, State_Programming_Multiple_Auto }; State m_state; YubiKeyConfig *m_ykConfig; unsigned int m_keysProgrammedCtr; bool m_ready; bool m_keyPresent; ScanEdit *scanedit; public slots: void loadSettings(); void setCurrentPage(int pageIndex); void setCurrentSlot(int slot); private slots: void connectPages(); void connectHelpButtons(); void keyFound(bool found, bool* featuresMatrix); void clearState(); // Quick Page void resetQuickPage(); void freezeQuickPage(bool freeze); void on_quickHideParams_clicked(bool checked); void on_quickStaticTxt_textEdited(const QString &txt); void on_quickStaticTxt_returnPressed(); void on_quickInsertTabBtn_clicked(); void on_quickClearBtn_clicked(); void on_quickWriteConfigBtn_clicked(); void on_quickStopBtn_clicked(); void changeQuickConfigParams(); void stopQuickConfigWritting(); bool validateQuickSettings(); void writeQuickConfig(); void quickConfigWritten(bool written, const QString &msg); void quickUpdateResults(bool written, const QString &msg); // Advanced Page void resetAdvPage(); void freezeAdvPage(bool freeze); void on_advProgramMulKeysBox_clicked(bool checked); void on_advConfigParamsCombo_currentIndexChanged(int index); void on_advStaticLen16Radio_clicked(bool checked); void on_advStaticLen32Radio_clicked(bool checked); void on_advStaticLenBox_valueChanged(int value); void enablePubId(bool enable); void on_advPubIdTxt_editingFinished(); void on_advPubIdGenerateBtn_clicked(); void on_advPvtIdTxt_editingFinished(); void on_advPvtIdGenerateBtn_clicked(); void on_advSecretKeyTxt_editingFinished(); void on_advSecretKeyGenerateBtn_clicked(); void on_advStrongPw1Check_stateChanged(int state); void on_advStrongPw2Check_stateChanged(int state); void on_advStrongPw3Check_stateChanged(int state); void on_advWriteConfigBtn_clicked(); void on_advStopBtn_clicked(); void changeAdvConfigParams(); void stopAdvConfigWritting(); bool validateAdvSettings(); void writeAdvConfig(); void advConfigWritten(bool written, const QString &msg); void advUpdateResults(bool written, const QString &msg); void on_quickScanCodesTxt_textEdited(const QString &text); void on_quickKeymapCmb_currentIndexChanged(int index); signals: void showStatusMessage(const QString &text, int status = 0); void showHelp(int helpIndex); }; #endif // STATICPAGE_H yubikey-personalization-gui-3.1.23/src/ui/staticpage.cpp0000664000175000017500000010377312603205714022001 0ustar klasklas/* Copyright (C) 2011-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "staticpage.h" #include "yubikeyfinder.h" #include "yubikeyutil.h" #include "yubikeywriter.h" #include "ui_staticpage.h" #include "ui/helpbox.h" #include "ui/confirmbox.h" #include #include #include #include #include #include #include #include #include "us-scanedit.h" #include "de-scanedit.h" #include "common.h" StaticPage::StaticPage(QWidget *parent) : QStackedWidget(parent), ui(new Ui::StaticPage) { ui->setupUi(this); m_ykConfig = 0; m_keyPresent = false; clearState(); //Connect pages connectPages(); //Connect help buttons connectHelpButtons(); //Connect other signals and slots connect(YubiKeyFinder::getInstance(), SIGNAL(keyFound(bool, bool*, int)), this, SLOT(keyFound(bool, bool*))); connect(ui->quickResetBtn, SIGNAL(clicked()), this, SLOT(resetQuickPage())); connect(ui->advResetBtn, SIGNAL(clicked()), this, SLOT(resetAdvPage())); ui->quickResultsWidget->resizeColumnsToContents(); ui->advResultsWidget->resizeColumnsToContents(); QRegExp rx("^[a-f0-9]{0,72}$"); ui->quickScanCodesTxt->setValidator(new QRegExpValidator(rx, this)); scanedit = NULL; } StaticPage::~StaticPage() { if(m_ykConfig != 0) { delete m_ykConfig; m_ykConfig = 0; } delete ui; if(scanedit) { delete scanedit; } } /* Common */ void StaticPage::connectPages() { //Map the values of the navigation buttons with the indexes of //the stacked widget //Create a QMapper QSignalMapper *mapper = new QSignalMapper(this); //Connect the clicked signal with the QSignalMapper connect(ui->quickBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->quickBackBtn, SIGNAL(clicked()), mapper, SLOT(map())); //connect(ui->quickUploadBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advBackBtn, SIGNAL(clicked()), mapper, SLOT(map())); //Set a value for each button mapper->setMapping(ui->quickBtn, Page_Quick); mapper->setMapping(ui->quickBackBtn, Page_Base); //mapper->setMapping(ui->quickUploadBtn, Page_Upload); mapper->setMapping(ui->advBtn, Page_Advanced); mapper->setMapping(ui->advBackBtn, Page_Base); //Connect the mapper to the widget //The mapper will set a value to each button and //set that value to the widget //connect(pageMapper, SIGNAL(mapped(int)), this, SLOT(setCurrentIndex(int))); connect(mapper, SIGNAL(mapped(int)), this, SLOT(setCurrentPage(int))); //Set the current page m_currentPage = 0; setCurrentIndex(Page_Base); } void StaticPage::setCurrentPage(int pageIndex) { //Page changed... m_currentPage = pageIndex; switch(pageIndex){ case Page_Quick: resetQuickPage(); break; case Page_Advanced: resetAdvPage(); break; } setCurrentIndex(pageIndex); //Clear state m_keysProgrammedCtr = 0; clearState(); } void StaticPage::connectHelpButtons() { //Map the values of the help buttons //Create a QMapper QSignalMapper *mapper = new QSignalMapper(this); //Connect the clicked signal with the QSignalMapper connect(ui->quickConfigHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->quickStaticScanCodeHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advConfigHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advParamGenSchemeHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advPubIdHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advPvtIdHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advSecretKeyHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); //Set a value for each button mapper->setMapping(ui->quickConfigHelpBtn, HelpBox::Help_ConfigurationSlot); mapper->setMapping(ui->quickStaticScanCodeHelpBtn, HelpBox::Help_StaticScanCode); mapper->setMapping(ui->advConfigHelpBtn, HelpBox::Help_ConfigurationSlot); mapper->setMapping(ui->advParamGenSchemeHelpBtn, HelpBox::Help_ParameterGeneration); mapper->setMapping(ui->advPubIdHelpBtn, HelpBox::Help_PublicID); mapper->setMapping(ui->advPvtIdHelpBtn, HelpBox::Help_PrivateID); mapper->setMapping(ui->advSecretKeyHelpBtn, HelpBox::Help_SecretKey); //Connect the mapper connect(mapper, SIGNAL(mapped(int)), this, SIGNAL(showHelp(int))); connect(ui->quickConfigProtectionBox, SIGNAL(showHelp(int)), this, SIGNAL(showHelp(int))); connect(ui->advConfigProtectionBox, SIGNAL(showHelp(int)), this, SIGNAL(showHelp(int))); } void StaticPage::loadSettings() { QSettings settings; ui->advStrongPw1Check->setChecked(settings.value(SG_STRONG_PW1).toBool()); ui->advStrongPw2Check->setChecked(settings.value(SG_STRONG_PW2).toBool()); ui->advStrongPw3Check->setChecked(settings.value(SG_STRONG_PW3).toBool()); } void StaticPage::keyFound(bool found, bool* featuresMatrix) { if(found) { if(m_state == State_Initial) { ui->quickWriteConfigBtn->setEnabled(true); ui->advWriteConfigBtn->setEnabled(true); if(!featuresMatrix[YubiKeyFinder::Feature_MultipleConfigurations]) { ui->quickConfigSlot2Radio->setEnabled(false); ui->advConfigSlot2Radio->setEnabled(false); } else { ui->quickConfigSlot2Radio->setEnabled(true); ui->advConfigSlot2Radio->setEnabled(true); } if(!featuresMatrix[YubiKeyFinder::Feature_ShortTicket]) { ui->advStaticLen16Radio->setEnabled(false); ui->advStaticLen32Radio->setChecked(true); } if(!featuresMatrix[YubiKeyFinder::Feature_StrongPwd]) { ui->advStrongPw1Check->setEnabled(false); ui->advStrongPw2Check->setEnabled(false); ui->advStrongPw3Check->setEnabled(false); } if(!featuresMatrix[YubiKeyFinder::Feature_ScanCodeMode]) { ui->quickBtn->setEnabled(false); ui->quickConfigBox->setEnabled(false); ui->quickProgramMulKeysBox->setEnabled(false); ui->quickConfigProtectionBox->setEnabled(false); ui->quickKeyParamsBox->setEnabled(false); ui->quickWriteConfigBtn->setEnabled(false); } if(!featuresMatrix[YubiKeyFinder::Feature_StaticPassword]) { this->setEnabled(false); } } else if(m_state >= State_Programming_Multiple && m_keyPresent == false) { if(this->currentIndex() == Page_Quick) { if(m_state == State_Programming_Multiple) { ui->quickWriteConfigBtn->setEnabled(true); } else { writeQuickConfig(); } } else { if(m_state == State_Programming_Multiple) { ui->advWriteConfigBtn->setEnabled(true); } else { writeAdvConfig(); } } } m_keyPresent = true; } else { ui->quickBtn->setEnabled(true); ui->quickWriteConfigBtn->setEnabled(false); ui->advWriteConfigBtn->setEnabled(false); m_keyPresent = false; if(m_state == State_Initial) { ui->quickConfigSlot2Radio->setEnabled(true); ui->advConfigSlot2Radio->setEnabled(true); ui->advStaticLen16Radio->setEnabled(true); ui->advStrongPw1Check->setEnabled(true); ui->advStrongPw2Check->setEnabled(true); ui->advStrongPw3Check->setEnabled(true); ui->quickConfigBox->setEnabled(true); ui->quickProgramMulKeysBox->setEnabled(true); ui->quickConfigProtectionBox->setEnabled(true); ui->quickKeyParamsBox->setEnabled(true); this->setEnabled(true); } else if(m_state >= State_Programming_Multiple) { if(m_keysProgrammedCtr > 0 && !m_ready) { if(this->currentIndex() == Page_Quick) { changeQuickConfigParams(); } else { changeAdvConfigParams(); } } } } } void StaticPage::clearState() { m_state = State_Initial; m_ready = true; if(m_ykConfig != 0) { delete m_ykConfig; m_ykConfig = 0; } } /* Quick Page handling */ void StaticPage::resetQuickPage() { if(ui->quickConfigSlot1Radio->isChecked()) { ui->quickConfigSlot2Radio->setChecked(true); } ui->quickAutoProgramKeysCheck->setChecked(false); ui->quickProgramMulKeysBox->setChecked(false); ui->quickConfigProtectionBox->reset(); ui->quickStaticLenTxt->setText("0"); ui->quickStaticTxt->clear(); ui->quickStaticTxt->setEnabled(false); ui->quickScanCodesTxt->clear(); ui->quickScanCodesTxt->setEnabled(false); ui->quickInsertTabBtn->setEnabled(false); ui->quickClearBtn->setEnabled(false); ui->quickKeymapCmb->setCurrentIndex(0); ui->quickStopBtn->setEnabled(false); ui->quickResetBtn->setEnabled(false); } void StaticPage::freezeQuickPage(bool freeze) { bool disable = !freeze; ui->quickConfigBox->setEnabled(disable); ui->quickProgramMulKeysBox->setEnabled(disable); ui->quickConfigProtectionBox->setEnabled(disable); ui->quickKeyParamsBox->setEnabled(disable); ui->quickWriteConfigBtn->setEnabled(disable); ui->quickStopBtn->setEnabled(!disable); ui->quickResetBtn->setEnabled(disable); ui->quickBackBtn->setEnabled(disable); } void StaticPage::on_quickHideParams_clicked(bool checked) { if(checked) { ui->quickStaticTxt->setEchoMode(QLineEdit::Password); ui->quickScanCodesTxt->setEchoMode(QLineEdit::Password); } else { ui->quickStaticTxt->setEchoMode(QLineEdit::Normal); ui->quickScanCodesTxt->setEchoMode(QLineEdit::Normal); } } void StaticPage::on_quickStaticTxt_textEdited(const QString &txt) { QString scanCodes = scanedit->textToScanCodes(txt); ui->quickScanCodesTxt->setText(scanCodes); int len = scanCodes.length() / 2; ui->quickStaticLenTxt->setText(QString::number(len)); if(len >= MAX_SCAN_EDIT_SIZE) { ui->quickInsertTabBtn->setEnabled(false); } else { ui->quickInsertTabBtn->setEnabled(true); } } void StaticPage::on_quickStaticTxt_returnPressed() { QString text = ui->quickStaticTxt->text() + "\\n"; ui->quickStaticTxt->setText(text); on_quickStaticTxt_textEdited(text); } void StaticPage::on_quickInsertTabBtn_clicked() { QString text = ui->quickStaticTxt->text() + "\\t"; ui->quickStaticTxt->setText(text); ui->quickStaticTxt->setFocus(); on_quickStaticTxt_textEdited(text); } void StaticPage::on_quickClearBtn_clicked() { ui->quickScanCodesTxt->clear(); ui->quickStaticTxt->clear(); ui->quickStaticLenTxt->setText("0"); ui->quickInsertTabBtn->setEnabled(true); } void StaticPage::on_quickWriteConfigBtn_clicked() { emit showStatusMessage(NULL, -1); if(!ui->quickProgramMulKeysBox->isChecked()) { m_keysProgrammedCtr = 0; } //Validate settings if(!validateQuickSettings()) { return; } clearState(); freezeQuickPage(true); // Change state if(ui->quickProgramMulKeysBox->isChecked()) { if(ui->quickAutoProgramKeysCheck->isChecked()) { m_keysProgrammedCtr = 0; m_state = State_Programming_Multiple_Auto; } else { m_state = State_Programming_Multiple; } } else { m_keysProgrammedCtr = 0; m_state = State_Programming; } writeQuickConfig(); } void StaticPage::on_quickStopBtn_clicked() { ui->quickStopBtn->setEnabled(false); m_state = State_Initial; stopQuickConfigWritting(); } void StaticPage::stopQuickConfigWritting() { qDebug() << "Stopping quick configuration writing..."; if(m_state >= State_Programming_Multiple) { ui->quickStopBtn->setEnabled(true); return; } m_keysProgrammedCtr = 0; clearState(); freezeQuickPage(false); ui->quickResetBtn->setEnabled(true); } void StaticPage::changeQuickConfigParams() { m_ready = true; } bool StaticPage::validateQuickSettings() { if(!(ui->quickConfigSlot1Radio->isChecked() || ui->quickConfigSlot2Radio->isChecked())) { emit showStatusMessage(tr(ERR_CONF_SLOT_NOT_SELECTED), 1); return false; } //Check if configuration slot 1 is being programmed if (ui->quickStaticLenTxt->text().toInt() == 0) { QMessageBox::critical(this, tr(ERR), tr(WARN_EMPTY_PASS)); return false; } QSettings settings; //Check if configuration slot 1 is being programmed if (!settings.value(SG_OVERWRITE_CONF_SLOT1).toBool() && ui->quickConfigSlot1Radio->isChecked() && m_keysProgrammedCtr == 0) { //Confirm from client ConfirmBox confirm(this); confirm.setConfirmIndex(ConfirmBox::Confirm_ConfigurationSlot); int ret = confirm.exec(); switch (ret) { case 1: //Yes break; default: //No return false; } } if(!ui->quickConfigProtectionBox->checkConfirm()) { return false; } return true; } void StaticPage::writeQuickConfig() { qDebug() << "Writing configuration..."; //Disable stop button while configuration is being written ui->quickStopBtn->setEnabled(false); //Write configuration if(m_ykConfig != 0) { qDebug() << "ykConfig destroyed"; delete m_ykConfig; m_ykConfig = 0; } m_ykConfig = new YubiKeyConfig(); //Programming mode... m_ykConfig->setProgrammingMode(YubiKeyConfig::Mode_Static); // set serial m_ykConfig->setSerial(QString::number(YubiKeyFinder::getInstance()->serial())); //Configuration slot... int configSlot = 1; if(ui->quickConfigSlot2Radio->isChecked()) { configSlot = 2; } m_ykConfig->setConfigSlot(configSlot); //Parameters... QString staticTxt = ui->quickScanCodesTxt->text(); YubiKeyUtil::qstrClean(&staticTxt, 0); qDebug() << "static txt is: " << staticTxt; QString pubIdTxt(""); QString pvtIdTxt(""); QString secretKeyTxt(""); int staticLen = staticTxt.length() / 2; int len = staticLen; // If longer than size of fixed, fill up UID and key if(staticLen > FIXED_SIZE) { staticLen -= UID_SIZE; if(staticLen > FIXED_SIZE) { staticLen -= KEY_SIZE; secretKeyTxt = staticTxt.mid((len - KEY_SIZE) * 2, KEY_SIZE * 2); pvtIdTxt = staticTxt.mid((len - UID_SIZE - KEY_SIZE) * 2, UID_SIZE * 2); } else { pvtIdTxt = staticTxt.mid((len - UID_SIZE) * 2, UID_SIZE * 2); } } qDebug() << "staticLen:" << staticLen; // Keep what's left in the fixed part pubIdTxt = staticTxt.mid(0, staticLen * 2); qDebug() << "pubIdTxt:" << pubIdTxt; qDebug() << "pvtIdTxt:" << pvtIdTxt; qDebug() << "secretKeyTxt:" << secretKeyTxt; //Public ID... if(!pubIdTxt.isEmpty()) { m_ykConfig->setPubIdInHex(true); m_ykConfig->setPubIdTxt(pubIdTxt); } //Private ID... if(!pvtIdTxt.isEmpty()) { m_ykConfig->setPvtIdTxt(pvtIdTxt); } //Secret Key... if(!secretKeyTxt.isEmpty()) { m_ykConfig->setSecretKeyTxt(secretKeyTxt); } //Configuration protection... m_ykConfig->setCurrentAccessCodeTxt( ui->quickConfigProtectionBox->currentAccessCode()); m_ykConfig->setNewAccessCodeTxt( ui->quickConfigProtectionBox->newAccessCode(), ui->quickConfigProtectionBox->newAccMode()); //Static Options... m_ykConfig->setShortTicket(true); //Write connect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(quickConfigWritten(bool, const QString &))); YubiKeyWriter::getInstance()->writeConfig(m_ykConfig); } void StaticPage::quickConfigWritten(bool written, const QString &msg) { disconnect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(quickConfigWritten(bool, const QString &))); QString message; if(written) { int staticLen = ui->quickStaticLenTxt->text().toInt(); QString keyDetail = tr(" (Password Length: %1 chars)").arg(staticLen); if(m_state == State_Programming){ message = tr(KEY_CONFIGURED).arg(keyDetail); } else { message = tr("%1. %2").arg(tr(KEY_CONFIGURED).arg(keyDetail)).arg(tr(REMOVE_KEY)); } showStatusMessage(message, 0); message = tr(KEY_CONFIGURED).arg(""); } else { qDebug() << "Configuration could not be written...."; message = msg; } quickUpdateResults(written, message); m_ready = false; stopQuickConfigWritting(); } void StaticPage::quickUpdateResults(bool written, const QString &msg) { int row = 0; ui->quickResultsWidget->insertRow(row); //Sr. No.... QTableWidgetItem *srnoItem = new QTableWidgetItem( tr("%1").arg(ui->quickResultsWidget->rowCount())); if(written) { srnoItem->setIcon(QIcon(QPixmap(tr(":/res/images/tick.png")))); } else { srnoItem->setIcon(QIcon(QPixmap(tr(":/res/images/cross.png")))); } srnoItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->quickResultsWidget->setItem(row, 0, srnoItem); //Password Len.... int staticLen = ui->quickStaticLenTxt->text().toInt(); QTableWidgetItem *lenItem = new QTableWidgetItem( tr("%1").arg(QString::number(staticLen))); ui->quickResultsWidget->setItem(row, 1, lenItem); //Status... QTableWidgetItem *statusItem = new QTableWidgetItem( tr("%1").arg(msg)); statusItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->quickResultsWidget->setItem(row, 2, statusItem); //Timestamp... QDateTime timstamp = QDateTime::currentDateTime(); QTableWidgetItem *timeItem = new QTableWidgetItem( tr("%1").arg(timstamp.toString(Qt::SystemLocaleShortDate))); timeItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->quickResultsWidget->setItem(row, 3, timeItem); ui->quickResultsWidget->resizeColumnsToContents(); ui->quickResultsWidget->resizeRowsToContents(); } /* Advanced Page handling */ void StaticPage::resetAdvPage() { if(ui->advConfigSlot1Radio->isChecked()) { ui->advConfigSlot2Radio->setChecked(true); } ui->advConfigParamsCombo->setCurrentIndex(SCHEME_FIXED); ui->advAutoProgramKeysCheck->setChecked(false); ui->advProgramMulKeysBox->setChecked(false); ui->advConfigProtectionBox->reset(); ui->advStaticLen32Radio->setChecked(true); int minStaticLen = ui->advStaticLenBox->minimum(); ui->advStaticLenBox->setValue(minStaticLen); enablePubId(false); ui->advPvtIdTxt->clear(); on_advPvtIdTxt_editingFinished(); ui->advSecretKeyTxt->clear(); on_advSecretKeyTxt_editingFinished(); ui->advStopBtn->setEnabled(false); ui->advResetBtn->setEnabled(false); } void StaticPage::freezeAdvPage(bool freeze) { bool disable = !freeze; ui->advConfigBox->setEnabled(disable); ui->advProgramMulKeysBox->setEnabled(disable); ui->advConfigProtectionBox->setEnabled(disable); ui->advKeyParamsBox->setEnabled(disable); ui->advWriteConfigBtn->setEnabled(disable); ui->advStopBtn->setEnabled(!disable); ui->advResetBtn->setEnabled(disable); ui->advBackBtn->setEnabled(disable); } void StaticPage::on_advProgramMulKeysBox_clicked(bool checked) { if(checked) { changeAdvConfigParams(); } } void StaticPage::on_advConfigParamsCombo_currentIndexChanged(__attribute__((unused)) int index) { changeAdvConfigParams(); } void StaticPage::on_advStaticLenBox_valueChanged(int value) { int len = value / 2 - KEY_SIZE; if(len > 0) { enablePubId(true); QString modhexMask(""); for(int i = 1; i <= len; i++) { modhexMask.append("nn "); } ui->advPubIdTxt->setInputMask(modhexMask); on_advPubIdTxt_editingFinished(); } else { enablePubId(false); } } void StaticPage::on_advStaticLen16Radio_clicked(bool checked) { ui->advStaticLenBox->setEnabled(!checked); enablePubId(!checked); } void StaticPage::on_advStaticLen32Radio_clicked(__attribute__((unused)) bool checked) { ui->advStaticLenBox->setEnabled(true); on_advStaticLenBox_valueChanged(ui->advStaticLenBox->value()); } void StaticPage::enablePubId(bool enable) { if(!enable) { ui->advPubIdTxt->clear(); ui->advPubIdTxt->inputMask(); } else { on_advPubIdTxt_editingFinished(); } ui->advPubIdTxt->setEnabled(enable); ui->advPubIdGenerateBtn->setEnabled(enable); } void StaticPage::on_advPubIdTxt_editingFinished() { QString txt = ui->advPubIdTxt->text(); size_t len = ui->advPubIdTxt->maxLength() / 3; YubiKeyUtil::qstrModhexClean(&txt, (size_t)len * 2); ui->advPubIdTxt->setText(txt); len = txt.length(); ui->advPubIdTxt->setCursorPosition(len + len/2); } void StaticPage::on_advPubIdGenerateBtn_clicked() { size_t len = ui->advPubIdTxt->maxLength() / 3; QString txt = YubiKeyUtil::generateRandomModhex((size_t)len * 2); ui->advPubIdTxt->setText(txt); } void StaticPage::on_advPvtIdTxt_editingFinished() { QString txt = ui->advPvtIdTxt->text(); YubiKeyUtil::qstrClean(&txt, (size_t)UID_SIZE * 2); ui->advPvtIdTxt->setText(txt); } void StaticPage::on_advPvtIdGenerateBtn_clicked() { ui->advPvtIdTxt->setText( YubiKeyUtil::generateRandomHex((size_t)UID_SIZE * 2)); } void StaticPage::on_advSecretKeyTxt_editingFinished() { QString txt = ui->advSecretKeyTxt->text(); YubiKeyUtil::qstrClean(&txt, (size_t)KEY_SIZE * 2); ui->advSecretKeyTxt->setText(txt); } void StaticPage::on_advSecretKeyGenerateBtn_clicked() { ui->advSecretKeyTxt->setText( YubiKeyUtil::generateRandomHex((size_t)KEY_SIZE * 2)); } void StaticPage::on_advStrongPw1Check_stateChanged(int state) { QSettings settings; settings.setValue(SG_STRONG_PW1, state != 0); } void StaticPage::on_advStrongPw2Check_stateChanged(int state) { QSettings settings; settings.setValue(SG_STRONG_PW2, state != 0); if(state == 0) { ui->advStrongPw3Check->setChecked(false); } } void StaticPage::on_advStrongPw3Check_stateChanged(int state) { QSettings settings; settings.setValue(SG_STRONG_PW3, state != 0); if(!ui->advStrongPw2Check->isChecked() && state > 0) { ui->advStrongPw2Check->setChecked(true); } } void StaticPage::on_advWriteConfigBtn_clicked() { emit showStatusMessage(NULL, -1); if(!ui->advProgramMulKeysBox->isChecked()) { m_keysProgrammedCtr = 0; } //Validate settings if(!validateAdvSettings()) { return; } clearState(); freezeAdvPage(true); // Change state if(ui->advProgramMulKeysBox->isChecked()) { if(ui->advAutoProgramKeysCheck->isChecked()) { m_keysProgrammedCtr = 0; m_state = State_Programming_Multiple_Auto; } else { m_state = State_Programming_Multiple; } } else { m_keysProgrammedCtr = 0; m_state = State_Programming; } writeAdvConfig(); } void StaticPage::on_advStopBtn_clicked() { ui->advStopBtn->setEnabled(false); m_state = State_Initial; stopAdvConfigWritting(); } void StaticPage::stopAdvConfigWritting() { qDebug() << "Stopping adv configuration writing..."; if(m_state >= State_Programming_Multiple) { ui->advStopBtn->setEnabled(true); return; } m_keysProgrammedCtr = 0; clearState(); freezeAdvPage(false); ui->advResetBtn->setEnabled(true); } void StaticPage::changeAdvConfigParams() { int index = ui->advConfigParamsCombo->currentIndex(); if(index == SCHEME_FIXED) { m_ready = true; return; } int idScheme = GEN_SCHEME_FIXED; int secretScheme = GEN_SCHEME_FIXED; switch(index) { case SCHEME_INCR_ID_RAND_SECRET: //Increment IDs only if in programming mode if(m_state != State_Initial) { idScheme = GEN_SCHEME_INCR; } secretScheme = GEN_SCHEME_RAND; break; case SCHEME_RAND_ALL: idScheme = GEN_SCHEME_RAND; secretScheme = GEN_SCHEME_RAND; break; } //Public ID... int len = ui->advStaticLenBox->value() / 2 - KEY_SIZE; QString pubIdTxt = YubiKeyUtil::getNextModhex( len * 2, ui->advPubIdTxt->text(), idScheme); ui->advPubIdTxt->setText(pubIdTxt); on_advPubIdTxt_editingFinished(); //Private ID... QString pvtIdTxt = YubiKeyUtil::getNextHex( UID_SIZE * 2, ui->advPvtIdTxt->text(), idScheme); ui->advPvtIdTxt->setText(pvtIdTxt); //Secret Key... QString secretKeyTxt = YubiKeyUtil::getNextHex( KEY_SIZE * 2, ui->advSecretKeyTxt->text(), secretScheme); ui->advSecretKeyTxt->setText(secretKeyTxt); m_ready = true; } bool StaticPage::validateAdvSettings() { if(!(ui->advConfigSlot1Radio->isChecked() || ui->advConfigSlot2Radio->isChecked())) { emit showStatusMessage(tr(ERR_CONF_SLOT_NOT_SELECTED), 1); return false; } QSettings settings; //Check if configuration slot 1 is being programmed if (!settings.value(SG_OVERWRITE_CONF_SLOT1).toBool() && ui->advConfigSlot1Radio->isChecked() && m_keysProgrammedCtr == 0) { //Confirm from client ConfirmBox confirm(this); confirm.setConfirmIndex(ConfirmBox::Confirm_ConfigurationSlot); int ret = confirm.exec(); switch (ret) { case 1: //Yes break; default: //No return false; } } if(!ui->advConfigProtectionBox->checkConfirm()) { return false; } return true; } void StaticPage::writeAdvConfig() { qDebug() << "Writing configuration..."; //Disable stop button while configuration is being written ui->advStopBtn->setEnabled(false); //Write configuration if(m_ykConfig != 0) { qDebug() << "ykConfig destroyed"; delete m_ykConfig; m_ykConfig = 0; } m_ykConfig = new YubiKeyConfig(); //Programming mode... m_ykConfig->setProgrammingMode(YubiKeyConfig::Mode_Static); // set serial m_ykConfig->setSerial(QString::number(YubiKeyFinder::getInstance()->serial())); //Configuration slot... int configSlot = 1; if(ui->advConfigSlot2Radio->isChecked()) { configSlot = 2; } m_ykConfig->setConfigSlot(configSlot); //Public ID... m_ykConfig->setPubIdTxt(ui->advPubIdTxt->text()); //Private ID... m_ykConfig->setPvtIdTxt(ui->advPvtIdTxt->text()); //Secret Key... m_ykConfig->setSecretKeyTxt(ui->advSecretKeyTxt->text()); //Configuration protection... m_ykConfig->setCurrentAccessCodeTxt( ui->advConfigProtectionBox->currentAccessCode()); m_ykConfig->setNewAccessCodeTxt( ui->advConfigProtectionBox->newAccessCode(), ui->advConfigProtectionBox->newAccMode()); //Static Options... m_ykConfig->setStaticTicket(true); if(ui->advStaticLen16Radio->isChecked()) { m_ykConfig->setShortTicket(true); } if(YubiKeyFinder::getInstance()->checkFeatureSupport( YubiKeyFinder::Feature_StrongPwd)) { if(ui->advStrongPw1Check->isChecked()) { m_ykConfig->setStrongPw1(true); } if(ui->advStrongPw2Check->isChecked()) { m_ykConfig->setStrongPw2(true); } if(ui->advStrongPw3Check->isChecked()) { m_ykConfig->setSendRef(true); } } QSettings settings; m_ykConfig->setManUpdate(settings.value(SG_MAN_UPDATE).toBool()); //Write connect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(advConfigWritten(bool, const QString &))); YubiKeyWriter::getInstance()->writeConfig(m_ykConfig); } void StaticPage::advConfigWritten(bool written, const QString &msg) { disconnect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(advConfigWritten(bool, const QString &))); QString message; if(written && m_ykConfig != 0) { qDebug() << "Configuration written...."; m_keysProgrammedCtr++; int staticLen = 0; if(ui->advStaticLen16Radio->isChecked()) { staticLen = 16; } else { staticLen = ui->advStaticLenBox->value(); } QString keyDetail = tr(" (Password Length: %1 chars)").arg(staticLen); if(m_state == State_Programming){ message = tr(KEY_CONFIGURED).arg(keyDetail); } else { message = tr("%1. %2").arg(tr(KEY_CONFIGURED).arg(keyDetail)).arg(tr(REMOVE_KEY)); } showStatusMessage(message, 0); message = tr(KEY_CONFIGURED).arg(""); } else { qDebug() << "Configuration could not be written...."; message = msg; } advUpdateResults(written, message); m_ready = false; stopAdvConfigWritting(); } void StaticPage::advUpdateResults(bool written, const QString &msg) { int row = 0; ui->advResultsWidget->insertRow(row); //Sr. No.... QTableWidgetItem *srnoItem = new QTableWidgetItem( tr("%1").arg(ui->advResultsWidget->rowCount())); if(written) { srnoItem->setIcon(QIcon(QPixmap(tr(":/res/images/tick.png")))); } else { srnoItem->setIcon(QIcon(QPixmap(tr(":/res/images/cross.png")))); } srnoItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->advResultsWidget->setItem(row, 0, srnoItem); //Password Len.... int staticLen = 0; if(ui->advStaticLen16Radio->isChecked()) { staticLen = 16; } else { staticLen = ui->advStaticLenBox->value(); } QTableWidgetItem *lenItem = new QTableWidgetItem( tr("%1").arg(QString::number(staticLen))); ui->advResultsWidget->setItem(row, 1, lenItem); //Public ID... QString pubId; if(m_ykConfig != 0 && m_ykConfig->pubIdTxt().length() > 0) { pubId = m_ykConfig->pubIdTxt(); } else { pubId = NA; } QTableWidgetItem *idItem = new QTableWidgetItem( tr("%1").arg(pubId)); idItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->advResultsWidget->setItem(row, 2, idItem); //Status... QTableWidgetItem *statusItem = new QTableWidgetItem( tr("%1").arg(msg)); statusItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->advResultsWidget->setItem(row, 3, statusItem); //Timestamp... QDateTime timstamp = QDateTime::currentDateTime(); QTableWidgetItem *timeItem = new QTableWidgetItem( tr("%1").arg(timstamp.toString(Qt::SystemLocaleShortDate))); timeItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->advResultsWidget->setItem(row, 4, timeItem); ui->advResultsWidget->resizeColumnsToContents(); ui->advResultsWidget->resizeRowsToContents(); } void StaticPage::on_quickScanCodesTxt_textEdited(const QString &scanCodes) { QString text = scanedit->scanCodesToText(scanCodes); ui->quickStaticTxt->setText(text); int len = scanCodes.length() / 2; ui->quickStaticLenTxt->setText(QString::number(len)); if(len >= MAX_SCAN_EDIT_SIZE) { ui->quickInsertTabBtn->setEnabled(false); } else { ui->quickInsertTabBtn->setEnabled(true); } } void StaticPage::setCurrentSlot(int slot) { if(m_currentPage == Page_Advanced) { ui->advConfigSlot1Radio->setChecked(slot == 1); ui->advConfigSlot2Radio->setChecked(slot == 2); } else if(m_currentPage == Page_Quick) { ui->quickConfigSlot1Radio->setChecked(slot == 1); ui->quickConfigSlot2Radio->setChecked(slot == 2); } } void StaticPage::on_quickKeymapCmb_currentIndexChanged(int index) { // Reset these, independent of the chosen layout ui->quickStaticLenTxt->setText("0"); ui->quickStaticTxt->clear(); ui->quickScanCodesTxt->clear(); if(scanedit) { delete scanedit; scanedit = NULL; } if (index == KEYMAP_NONE) { ui->quickStaticTxt->setEnabled(false); ui->quickScanCodesTxt->setEnabled(false); ui->quickInsertTabBtn->setEnabled(false); ui->quickClearBtn->setEnabled(false); } else { if(index == KEYMAP_US) { scanedit = new UsScanEdit(); } else if(index == KEYMAP_DE) { scanedit = new DeScanEdit(); } ui->quickStaticTxt->setEnabled(true); ui->quickScanCodesTxt->setEnabled(true); ui->quickInsertTabBtn->setEnabled(true); ui->quickClearBtn->setEnabled(true); } } yubikey-personalization-gui-3.1.23/src/ui/settingpage.ui0000664000175000017500000012225612603205714022017 0ustar klasklas SettingPage 0 0 730 650 0 0 730 650 StackedWidget font: 11px "Verdana"; color: rgb(0, 0, 0); 0 0 0 730 650 Form font: 11px "Verdana"; color: rgb(0, 0, 0); 10 0 710 22 font: 18px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); Settings Qt::AlignCenter 10 35 711 70 font-weight: bold; General Settings 10 40 231 17 font-weight: normal; Use and enforce customer prefix true 240 40 61 20 font-weight: normal; 5 0 240 20 61 18 font-weight: normal; color: rgb(118, 116, 108); Decimal Qt::AlignCenter 340 20 61 18 font-weight: normal; color: rgb(118, 116, 108); ModHex Qt::AlignCenter true 340 40 61 20 font-weight: normal; 32767 0 440 20 61 18 font-weight: normal; color: rgb(118, 116, 108); Hex Qt::AlignCenter true 440 40 61 20 font-weight: normal; 4 0 10 450 711 50 font-weight: bold; Logging Settings 10 25 171 19 font-weight: normal; Log configuration output 200 25 125 22 0 0 font-weight: normal; Traditional format Yubico format Flexible format PSKC format false 350 25 325 20 font-weight: normal; 680 25 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 550 711 80 font-weight: bold; Actions 10 25 200 16 font-weight: normal; color: rgb(118, 116, 108) Settings are saved automatically true 10 45 171 25 font: 12px; font-weight: bold; Restore Defaults false false false false 480 45 171 27 Update Settings... 405 25 275 16 font-weight: normal; color: rgb(118, 116, 108) Update is available for YubiKey 2.3 and later 10 105 711 165 font-weight: bold; Output Settings 10 25 691 58 font-weight: bold; Output Format false 10 25 68 25 font: 12px; font-weight: bold; Tab true false false false 170 25 68 25 font: 12px; font-weight: bold; Tab true false false false 310 25 68 25 font: 12px; font-weight: bold; Tab true false false false 98 25 52 25 font-weight:normal; Public ID 258 25 32 25 font-weight:normal; OTP 398 25 68 25 font: 12px; font-weight: bold; Enter true true false false false 665 0 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 85 691 70 font-weight: bold; Output Speed Throttling 665 0 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 170 24 171 22 0 0 font-weight: normal; Standard Slow down by 20 ms Slow down by 40 ms Slow down by 60 ms 10 25 151 20 font-weight:normal; Output Character Rate 10 50 281 17 font-weight: normal; Add a short delay before sending OTP part 360 50 271 17 font-weight: normal; Add a short delay after sending OTP part 10 275 350 100 font-weight: bold; Serial # Visibility Settings 10 25 221 17 font-weight: normal; Button at startup (2.2+) 10 50 221 17 font-weight: normal; USB descriptor (2.2+/3.2+) 10 75 221 17 font-weight: normal; API call (2.2+/3.0+) 315 0 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 370 275 350 50 font-weight: bold; Static Password Settings 10 25 331 17 font-weight: normal; Enable manual update using the button (2.0+) 315 0 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 390 350 50 font-weight: bold; Update Settings 10 25 331 17 font-weight: normal; Enable updating of YubiKey configuration (2.3+/3.0+) 315 0 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 370 340 350 100 font-weight: bold; Extended Settings 10 25 331 17 font-weight: normal; Use numeric keypad for digits (2.3+) 10 50 340 17 font-weight: normal; Use fast triggering if only slot 1 is programmed (2.3+) 10 75 331 17 font-weight: normal; Invert led behaviour (2.4+/3.1+) 10 500 711 50 font-weight: bold; Application Settings 10 25 350 19 font-weight: normal; Enable configuration export and import (experimental) 0 0 10 0 710 22 font: 18px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); Update YubiKey Settings Qt::AlignCenter 10 210 711 50 font-weight: bold; 10 10 85 25 font: 12px; font-weight: bold; Update false false false true 110 10 85 25 font: 12px; font-weight: bold; Back false false false 370 10 85 25 font: 12px; font-weight: bold; Swap false false false 465 14 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 50 350 65 font-weight: bold; Configuration Slot 10 20 321 16 font-weight: normal; color: rgb(118, 116, 108); Select the configuration slot to be updated 10 40 151 19 font-weight: normal; Configuration Slot 1 true false 200 40 151 19 font-weight: normal; Configuration Slot 2 10 125 350 55 10 10 321 16 font-weight: normal; color: rgb(118, 116, 108); Select to make the configuration dormant 10 30 151 17 font-weight: normal; Dormant 370 50 350 117 YubiAccBox QWidget
yubiaccbox.h
1
custPrefixCheck custPrefixDecTxt custPrefixModhexTxt custPrefixHexTxt tabFirstBtn appendTab1Btn appendTab2Btn appendCRBtn outCharRateCombo appendDelay1Check appendDelay2Check srBtnVisibleCheck srUsbVisibleCheck srApiVisibleCheck manUpdateCheck logOutputCheck restoreBtn outFormatHelpBtn outSpeedHelpBtn srVisibilityHelpBtn
yubikey-personalization-gui-3.1.23/src/ui/settingpage.h0000664000175000017500000000512612603205714021625 0ustar klasklas/* Copyright (C) 2011-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SETTINGPAGE_H #define SETTINGPAGE_H #include #include "yubikeyconfig.h" namespace Ui { class SettingPage; } class SettingPage : public QStackedWidget { Q_OBJECT public: explicit SettingPage(QWidget *parent = 0); ~SettingPage(); void init(); enum Page { Page_Base, Page_Update, }; private: Ui::SettingPage *ui; int m_currentPage; YubiKeyConfig *m_ykConfig; public slots: void reloadSettings(); void setCurrentPage(int pageIndex); private slots: void connectHelpButtons(); void restoreDefaults(); void load(); void save(); void restore(); void on_custPrefixCheck_stateChanged(int state); void on_custPrefixDecTxt_editingFinished(); void on_custPrefixModhexTxt_editingFinished(); void on_custPrefixHexTxt_editingFinished(); void on_doUpdateBtn_clicked(); void on_swapBtn_clicked(); void updateConfigWritten(bool written, const QString &msg); void swapWritten(bool written, const QString &msg); void keyFound(bool found, bool* featuresMatrix); void custPrefixChanged(int type, QString src); signals: void settingsChanged(); void showStatusMessage(const QString &text, int status = 0); void showHelp(int helpIndex); }; #endif // SETTINGPAGE_H yubikey-personalization-gui-3.1.23/src/ui/settingpage.cpp0000664000175000017500000005171212603205714022162 0ustar klasklas/* Copyright (C) 2011-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "settingpage.h" #include "yubikeyfinder.h" #include "yubikeyutil.h" #include "yubikeywriter.h" #include "yubikeylogger.h" #include "ui_settingpage.h" #include "ui/helpbox.h" #include "toolpage.h" #include #include #include #include #include #include #include "common.h" #define DECIMAL 0 #define MODHEX 1 #define HEX 2 #define OUT_CHAR_RATE_STD 0 #define OUT_CHAR_RATE_SLOWDOWN_20 1 #define OUT_CHAR_RATE_SLOWDOWN_40 2 #define OUT_CHAR_RATE_SLOWDOWN_60 3 SettingPage::SettingPage(QWidget *parent) : QStackedWidget(parent), ui(new Ui::SettingPage) { QSignalMapper *mapper = new QSignalMapper(this); ui->setupUi(this); m_ykConfig = NULL; //Connect help buttons connectHelpButtons(); connect(ui->updateBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->updateBackBtn, SIGNAL(clicked()), mapper, SLOT(map())); mapper->setMapping(ui->updateBtn, Page_Update); mapper->setMapping(ui->updateBackBtn, Page_Base); connect(mapper, SIGNAL(mapped(int)), this, SLOT(setCurrentPage(int))); m_currentPage = 0; setCurrentIndex(Page_Base); //Connect other signals and slots connect(ui->restoreBtn, SIGNAL(clicked()), this, SLOT(restore())); // autosave when changing settings connect(ui->custPrefixCheck, SIGNAL(clicked()), this, SLOT(save())); connect(ui->logOutputCheck, SIGNAL(clicked()), this, SLOT(save())); connect(ui->tabFirstBtn, SIGNAL(clicked()), this, SLOT(save())); connect(ui->appendTab1Btn, SIGNAL(clicked()), this, SLOT(save())); connect(ui->appendTab2Btn, SIGNAL(clicked()), this, SLOT(save())); connect(ui->appendCRBtn, SIGNAL(clicked()), this, SLOT(save())); connect(ui->appendDelay1Check, SIGNAL(clicked()), this, SLOT(save())); connect(ui->appendDelay2Check, SIGNAL(clicked()), this, SLOT(save())); connect(ui->srBtnVisibleCheck, SIGNAL(clicked()), this, SLOT(save())); connect(ui->srUsbVisibleCheck, SIGNAL(clicked()), this, SLOT(save())); connect(ui->srApiVisibleCheck, SIGNAL(clicked()), this, SLOT(save())); connect(ui->manUpdateCheck, SIGNAL(clicked()), this, SLOT(save())); connect(ui->updateCheck, SIGNAL(clicked()), this, SLOT(save())); connect(ui->fastTrigCheck, SIGNAL(clicked()), this, SLOT(save())); connect(ui->ledInvertCheck, SIGNAL(clicked()), this, SLOT(save())); connect(ui->useNumericKeypadCheck, SIGNAL(clicked()), this, SLOT(save())); connect(ui->logFormatCombo, SIGNAL(activated(int)), this, SLOT(save())); connect(ui->logFormatEdit, SIGNAL(textEdited(QString)), this, SLOT(save())); connect(ui->outCharRateCombo, SIGNAL(activated(int)), this, SLOT(save())); connect(ui->exportCheck, SIGNAL(clicked()), this, SLOT(save())); connect(YubiKeyFinder::getInstance(), SIGNAL(keyFound(bool, bool*, int)), this, SLOT(keyFound(bool, bool*))); QRegExp modHexRx("^[cbdefghijklnrtuv]{0,4}$"); ui->custPrefixModhexTxt->setValidator(new QRegExpValidator(modHexRx, this)); QRegExp decRx("^[0-9]{0,5}$"); ui->custPrefixDecTxt->setValidator(new QRegExpValidator(decRx, this)); QRegExp hexRx("^[0-9a-f]{0,4}$"); ui->custPrefixHexTxt->setValidator(new QRegExpValidator(hexRx, this)); } SettingPage::~SettingPage() { delete ui->custPrefixModhexTxt->validator(); if(m_ykConfig != NULL) { delete m_ykConfig; } delete ui; } void SettingPage::connectHelpButtons() { //Map the values of the help buttons //Create a QMapper QSignalMapper *mapper = new QSignalMapper(this); //Connect the clicked signal with the QSignalMapper connect(ui->outFormatHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->outSpeedHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->srVisibilityHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->updateHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->swapHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->manUpdateHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->logFormatEditHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); //Set a value for each button mapper->setMapping(ui->outFormatHelpBtn, HelpBox::Help_OutputFormat); mapper->setMapping(ui->outSpeedHelpBtn, HelpBox::Help_OutputSpeed); mapper->setMapping(ui->srVisibilityHelpBtn, HelpBox::Help_SrNoVisibility); mapper->setMapping(ui->updateHelpBtn, HelpBox::Help_AllowUpdate); mapper->setMapping(ui->swapHelpBtn, HelpBox::Help_Swap); mapper->setMapping(ui->manUpdateHelpBtn, HelpBox::Help_ManUpdate); mapper->setMapping(ui->logFormatEditHelpBtn, HelpBox::Help_LogFormat); //Connect the mapper connect(mapper, SIGNAL(mapped(int)), this, SIGNAL(showHelp(int))); connect(ui->configProtectionBox, SIGNAL(showHelp(int)), this, SIGNAL(showHelp(int))); } void SettingPage::setCurrentPage(int pageIndex) { m_currentPage = pageIndex; setCurrentIndex(pageIndex); } void SettingPage::init() { load(); } void SettingPage::restoreDefaults() { QSettings settings; settings.setValue(SG_CUSTOMER_PREFIX_USED, false); settings.setValue(SG_CUSTOMER_PREFIX, 0); settings.setValue(SG_LOG_DISABLED, false); // we continue loading LOG_FILENAME since we use that to check if settings are loaded settings.setValue(SG_LOG_FILENAME, YubiKeyLogger::defaultLogFilename()); settings.setValue(SG_LOG_FORMAT, YubiKeyLogger::Format_Traditional); settings.setValue(SG_EXPORT_FILENAME, YubiKeyWriter::defaultExportFilename()); settings.setValue(SG_IMPORT_FILENAME, ToolPage::defaultImportFilename()); settings.setValue(SG_TAB_FIRST, false); settings.setValue(SG_APPEND_TAB1, false); settings.setValue(SG_APPEND_TAB2, false); settings.setValue(SG_APPEND_CR, true); settings.setValue(SG_APPEND_DELAY1, false); settings.setValue(SG_APPEND_DELAY2, false); settings.setValue(SG_PACING_10MS, false); settings.setValue(SG_PACING_20MS, false); settings.setValue(SG_SR_BTN_VISIBLE, true); settings.setValue(SG_SR_USB_VISIBLE, false); settings.setValue(SG_SR_API_VISIBLE, true); settings.setValue(SG_MAN_UPDATE, false); settings.setValue(SG_ALLOW_UPDATE, true); settings.setValue(SG_FAST_TRIG, false); settings.setValue(SG_USE_NUMERIC_KEYPAD, false); settings.setValue(SG_OATH_HOTP8, false); settings.setValue(SG_REQUIRE_INPUT, false); settings.setValue(SG_HMAC_LT64, true); settings.setValue(SG_STRONG_PW1, false); settings.setValue(SG_STRONG_PW2, false); settings.setValue(SG_STRONG_PW3, false); settings.setValue(SG_EXPORT_PREFERENCE, false); } void SettingPage::load() { QSettings settings; QString logFilename = settings.value(SG_LOG_FILENAME).toString(); bool logDisabled = settings.value(SG_LOG_DISABLED).toBool(); int logFormat = settings.value(SG_LOG_FORMAT).toInt(); if(logFilename.isEmpty()) { //This is the first time... set defaults restoreDefaults(); } YubiKeyLogger::setLogFilename(logFilename); QString exportFilename = settings.value(SG_EXPORT_FILENAME).toString(); if(!exportFilename.isEmpty()) { YubiKeyWriter::setExportFilename(exportFilename); } QString importFilename = settings.value(SG_IMPORT_FILENAME).toString(); if(!importFilename.isEmpty()) { ToolPage::setImportFilename(importFilename); } //General settings... //Customer prefix bool custPrefixUsed = settings.value(SG_CUSTOMER_PREFIX_USED).toBool(); if(custPrefixUsed) { ui->custPrefixCheck->setChecked(true); int custPrefix = settings.value(SG_CUSTOMER_PREFIX).toInt(); if(custPrefix > 0) { custPrefixChanged(DECIMAL, QString::number(custPrefix)); ui->custPrefixDecTxt->setEnabled(true); ui->custPrefixModhexTxt->setEnabled(true); ui->custPrefixHexTxt->setEnabled(true); } } else { ui->custPrefixCheck->setChecked(false); ui->custPrefixDecTxt->clear(); ui->custPrefixDecTxt->setEnabled(false); ui->custPrefixModhexTxt->clear(); ui->custPrefixModhexTxt->setEnabled(false); ui->custPrefixHexTxt->clear(); ui->custPrefixHexTxt->setEnabled(false); } // OTP output settings... ui->tabFirstBtn->setChecked(settings.value(SG_TAB_FIRST).toBool()); ui->appendTab1Btn->setChecked(settings.value(SG_APPEND_TAB1).toBool()); ui->appendTab2Btn->setChecked(settings.value(SG_APPEND_TAB2).toBool()); ui->appendCRBtn->setChecked(settings.value(SG_APPEND_CR).toBool()); ui->appendDelay1Check->setChecked(settings.value(SG_APPEND_DELAY1).toBool()); ui->appendDelay2Check->setChecked(settings.value(SG_APPEND_DELAY2).toBool()); bool pacing10ms = settings.value(SG_PACING_10MS).toBool(); bool pacing20ms = settings.value(SG_PACING_20MS).toBool(); int outCharRateIndex = 0; if(pacing10ms) { if(pacing20ms) { outCharRateIndex = OUT_CHAR_RATE_SLOWDOWN_60; } else { outCharRateIndex = OUT_CHAR_RATE_SLOWDOWN_20; } } else if(pacing20ms) { outCharRateIndex = OUT_CHAR_RATE_SLOWDOWN_40; } ui->outCharRateCombo->setCurrentIndex(outCharRateIndex); //Serial # visibility settings... ui->srBtnVisibleCheck->setChecked(settings.value(SG_SR_BTN_VISIBLE).toBool()); ui->srUsbVisibleCheck->setChecked(settings.value(SG_SR_USB_VISIBLE).toBool()); ui->srApiVisibleCheck->setChecked(settings.value(SG_SR_API_VISIBLE).toBool()); //Static Password settings... ui->manUpdateCheck->setChecked(settings.value(SG_MAN_UPDATE).toBool()); //Updatable settings... if(settings.contains(SG_ALLOW_UPDATE)) { ui->updateCheck->setChecked(settings.value(SG_ALLOW_UPDATE).toBool()); } else { ui->updateCheck->setChecked(true); } // extended settings.. ui->fastTrigCheck->setChecked(settings.value(SG_FAST_TRIG).toBool()); ui->useNumericKeypadCheck->setChecked(settings.value(SG_USE_NUMERIC_KEYPAD).toBool()); ui->ledInvertCheck->setChecked(settings.value(SG_LED_INVERT).toBool()); //Logging settings... if(logDisabled) { YubiKeyLogger::disableLogging(); ui->logOutputCheck->setChecked(false); ui->logFormatCombo->setEnabled(false); ui->logFormatEdit->setEnabled(false); } else { YubiKeyLogger::enableLogging(); ui->logOutputCheck->setChecked(true); ui->logFormatCombo->setEnabled(true); ui->logFormatCombo->setCurrentIndex(logFormat); YubiKeyLogger::setLogFormat((YubiKeyLogger::Format)logFormat); if(logFormat == YubiKeyLogger::Format_Flexible) { QString format = settings.value(SG_LOG_FLEXIBLE).toString(); ui->logFormatEdit->setEnabled(true); ui->logFormatEdit->setText(format); YubiKeyLogger::setFlexibleFormat(format); } else { ui->logFormatEdit->setEnabled(false); } } ui->exportCheck->setChecked(settings.value(SG_EXPORT_PREFERENCE).toBool()); //Signal everyone emit settingsChanged(); } void SettingPage::save() { QSettings settings; //General settings... //Customer prefix int custPrefix = 0; if(ui->custPrefixCheck->isChecked()) { settings.setValue(SG_CUSTOMER_PREFIX_USED, true); custPrefix = ui->custPrefixDecTxt->text().toInt(); } else { settings.setValue(SG_CUSTOMER_PREFIX_USED, false); } settings.setValue(SG_CUSTOMER_PREFIX, custPrefix); // OTP output settings... settings.setValue(SG_TAB_FIRST, ui->tabFirstBtn->isChecked()); settings.setValue(SG_APPEND_TAB1, ui->appendTab1Btn->isChecked()); settings.setValue(SG_APPEND_TAB2, ui->appendTab2Btn->isChecked()); settings.setValue(SG_APPEND_CR, ui->appendCRBtn->isChecked()); settings.setValue(SG_APPEND_DELAY1, ui->appendDelay1Check->isChecked()); settings.setValue(SG_APPEND_DELAY2, ui->appendDelay2Check->isChecked()); switch(ui->outCharRateCombo->currentIndex()) { case OUT_CHAR_RATE_STD: settings.setValue(SG_PACING_10MS, false); settings.setValue(SG_PACING_20MS, false); break; case OUT_CHAR_RATE_SLOWDOWN_20: settings.setValue(SG_PACING_10MS, true); settings.setValue(SG_PACING_20MS, false); break; case OUT_CHAR_RATE_SLOWDOWN_40: settings.setValue(SG_PACING_10MS, false); settings.setValue(SG_PACING_20MS, true); break; case OUT_CHAR_RATE_SLOWDOWN_60: settings.setValue(SG_PACING_10MS, true); settings.setValue(SG_PACING_20MS, true); break; } //Serial # visibility settings... settings.setValue(SG_SR_BTN_VISIBLE, ui->srBtnVisibleCheck->isChecked()); settings.setValue(SG_SR_USB_VISIBLE, ui->srUsbVisibleCheck->isChecked()); settings.setValue(SG_SR_API_VISIBLE, ui->srApiVisibleCheck->isChecked()); //Static Password settings... settings.setValue(SG_MAN_UPDATE, ui->manUpdateCheck->isChecked()); // Updatable settings... settings.setValue(SG_ALLOW_UPDATE, ui->updateCheck->isChecked()); // Extended settings settings.setValue(SG_FAST_TRIG, ui->fastTrigCheck->isChecked()); settings.setValue(SG_USE_NUMERIC_KEYPAD, ui->useNumericKeypadCheck->isChecked()); settings.setValue(SG_LED_INVERT, ui->ledInvertCheck->isChecked()); //Logging settings... if(ui->logOutputCheck->isChecked()) { settings.setValue(SG_LOG_DISABLED, false); settings.setValue(SG_LOG_FORMAT, ui->logFormatCombo->currentIndex()); if(ui->logFormatCombo->currentIndex() == YubiKeyLogger::Format_Flexible) { settings.setValue(SG_LOG_FLEXIBLE, ui->logFormatEdit->text()); } } else { settings.setValue(SG_LOG_DISABLED, true); } settings.setValue(SG_EXPORT_PREFERENCE, ui->exportCheck->isChecked()); //Reload settings load(); showStatusMessage(tr(SETTINGS_SAVED), 0); } void SettingPage::restore() { //Confirm restore //Confirm from client switch ( QMessageBox::question( this, tr(RESTORE_SETTING), tr(WARN_RESTORE_SETTING), tr("&Yes"), tr("&No"), QString::null, 1, 1 )) { case 0: restoreDefaults(); //Reload settings load(); showStatusMessage(tr(SETTINGS_RESTORED), 0); break; default: break; } } void SettingPage::on_custPrefixCheck_stateChanged(int state) { if(state == 0) { ui->custPrefixDecTxt->setEnabled(false); ui->custPrefixModhexTxt->setEnabled(false); ui->custPrefixHexTxt->setEnabled(false); } else { ui->custPrefixDecTxt->setEnabled(true); ui->custPrefixModhexTxt->setEnabled(true); ui->custPrefixHexTxt->setEnabled(true); } } void SettingPage::on_custPrefixDecTxt_editingFinished() { custPrefixChanged(DECIMAL, ui->custPrefixDecTxt->text()); save(); } void SettingPage::on_custPrefixModhexTxt_editingFinished() { custPrefixChanged(MODHEX, ui->custPrefixModhexTxt->text()); save(); } void SettingPage::on_custPrefixHexTxt_editingFinished() { custPrefixChanged(HEX, ui->custPrefixHexTxt->text()); save(); } void SettingPage::on_doUpdateBtn_clicked() { int slot; if(ui->updateSlot1Radio->isChecked()) { slot = 1; } else if(ui->updateSlot2Radio->isChecked()) { slot = 2; } else { emit showStatusMessage(tr(ERR_CONF_SLOT_NOT_SELECTED), 1); return; } if(m_ykConfig != NULL) { delete m_ykConfig; } m_ykConfig = new YubiKeyConfig(); m_ykConfig->setProgrammingMode(YubiKeyConfig::Mode_Update); m_ykConfig->setConfigSlot(slot); // set serial m_ykConfig->setSerial(QString::number(YubiKeyFinder::getInstance()->serial())); // access code m_ykConfig->setCurrentAccessCodeTxt( ui->configProtectionBox->currentAccessCode()); m_ykConfig->setNewAccessCodeTxt( ui->configProtectionBox->newAccessCode(), ui->configProtectionBox->newAccMode()); if(ui->updateDormantCheck->isChecked()) { m_ykConfig->setDormant(true); } //Write connect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(updateConfigWritten(bool, const QString &))); YubiKeyWriter::getInstance()->writeConfig(m_ykConfig); } void SettingPage::updateConfigWritten(bool written, const QString &msg) { disconnect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(updateConfigWritten(bool, const QString &))); if(written) { qDebug() << "Configuration updated." << msg; emit showStatusMessage(tr("Configuration successfully updated.", 0)); } else { qDebug() << "Failed update."; emit showStatusMessage(msg, 1);; } } void SettingPage::on_swapBtn_clicked() { if(m_ykConfig != NULL) { delete m_ykConfig; } m_ykConfig = new YubiKeyConfig(); m_ykConfig->setProgrammingMode(YubiKeyConfig::Mode_Swap); // set serial m_ykConfig->setSerial(QString::number(YubiKeyFinder::getInstance()->serial())); // access code m_ykConfig->setCurrentAccessCodeTxt( ui->configProtectionBox->currentAccessCode()); m_ykConfig->setNewAccessCodeTxt( ui->configProtectionBox->newAccessCode(), ui->configProtectionBox->newAccMode()); //Write connect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(swapWritten(bool, const QString &))); YubiKeyWriter::getInstance()->writeConfig(m_ykConfig); } void SettingPage::swapWritten(bool written, const QString &msg) { disconnect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(swapWritten(bool, const QString &))); if(written) { qDebug() << "Configurations swapped." << msg; emit showStatusMessage(tr("Configuration successfully swapped.", 0)); } else { qDebug() << "Failed swapping." << msg; emit showStatusMessage(msg, 1);; } } void SettingPage::keyFound(bool found, bool* featuresMatrix) { if(found) { if(featuresMatrix[YubiKeyFinder::Feature_Updatable]) { ui->updateBtn->setEnabled(true); } } else { ui->updateBtn->setEnabled(false); } } void SettingPage::custPrefixChanged(int type, QString src) { unsigned char buf[16]; memset(buf, 0, sizeof(buf)); size_t bufLen = 0; switch(type) { // decimal case DECIMAL: { QString tmp = QString::number(src.toULongLong(), 16); size_t len = tmp.length(); if(len % 2 != 0) { len++; } YubiKeyUtil::qstrClean(&tmp, (size_t)len, true); YubiKeyUtil::qstrHexDecode(buf, &bufLen, tmp); break; } // modhex case MODHEX: YubiKeyUtil::qstrModhexDecode(buf, &bufLen, src); break; // hex case HEX: YubiKeyUtil::qstrHexDecode(buf, &bufLen, src); break; } QString hex = YubiKeyUtil::qstrHexEncode(buf, bufLen); QString modhex = YubiKeyUtil::qstrModhexEncode(buf, bufLen); bool ok = false; qulonglong dec = hex.toULongLong(&ok, 16); if(dec > 0) { ui->custPrefixDecTxt->setText(QString::number(dec)); ui->custPrefixModhexTxt->setText(modhex); ui->custPrefixHexTxt->setText(hex); } } void SettingPage::reloadSettings() { load(); } yubikey-personalization-gui-3.1.23/src/ui/otppage.ui0000664000175000017500000014210212603205714021134 0ustar klasklas OtpPage 0 0 730 650 0 0 730 650 StackedWidget font: 11px "Verdana"; color: rgb(0, 0, 0); 2 10 0 710 22 font: 18px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); Program in Yubico OTP mode Qt::AlignCenter 10 50 710 171 border-color: rgb(0, 0, 0); Qt::AlignCenter 20 20 110 25 0 0 font: 12px; font-weight: bold; Quick false false false 20 100 110 25 font: 12px; font-weight: bold; Advanced false false false 20 45 671 20 Quickly program a YubiKey for use with Yubico Validation Server Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 20 120 671 30 Allows you to program one or more YubiKeys with greater control over the configuration values Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 10 0 710 22 font: 18px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); Program in Yubico OTP mode - Quick Qt::AlignCenter 10 50 711 72 font-weight: bold; Configuration Slot 10 25 691 16 font-weight: normal; color: rgb(118, 116, 108) Select the configuration slot to be programmed 10 45 151 19 font-weight: normal; Configuration Slot 1 240 45 151 19 font-weight: normal; Configuration Slot 2 685 45 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 132 711 130 font-weight: bold; Yubico OTP Parameters (auto generated) false false 685 27 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 685 77 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 685 102 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false true 240 25 341 20 0 0 font-weight: normal; nn nn nn nn nn nn; QLineEdit::Normal true true 240 75 341 20 font-weight: normal; hh hh hh hh hh hh; QLineEdit::Password 17 true true 240 100 341 20 font-weight: normal; hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh; QLineEdit::Password 47 true 10 50 221 18 font-weight: normal; Hide values true 10 25 221 20 font-weight:normal; Public Identity (6 bytes Modhex) 10 75 221 20 font-weight:normal; Private Identity (6 bytes Hex) 10 100 221 20 font-weight:normal; Secret Key (16 bytes Hex) 10 272 711 80 font-weight: bold; Actions 10 45 175 25 font: 12px; font-weight: bold; Write Configuration false false false 505 45 85 25 font: 12px; font-weight: bold; Back false false false false 200 45 155 25 font: 12px; font-weight: bold; Upload to Yubico false false false 10 25 691 16 font-weight: normal; color: rgb(118, 116, 108) Press Write Configuration button to program your YubiKey's selected configuration slot true 370 45 120 25 font: 12px; font-weight: bold; Regenerate false false false 10 0 710 22 font: 18px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); Program in Yubico OTP mode - Advanced Qt::AlignCenter 10 50 711 72 font-weight: bold; Configuration Slot 10 25 691 16 font-weight: normal; color: rgb(118, 116, 108); Select the configuration slot to be programmed 10 45 151 19 font-weight: normal; Configuration Slot 1 true false 240 45 151 19 font-weight: normal; Configuration Slot 2 685 45 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 249 711 132 font-weight: bold; Yubico OTP Parameters 685 102 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 240 100 330 20 0 0 font-weight: normal; hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh; 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 47 47 580 98 100 24 font: 12px; font-weight: bold; Generate false false false 239 25 331 20 0 0 font-weight: normal; nn nn nn nn nn nn nn nn nn nn nn nn nn nn nn nn; 00 00 00 00 00 00 47 47 240 75 330 20 0 0 font-weight: normal; hh hh hh hh hh hh; 00 00 00 00 00 00 17 17 580 23 100 24 font: 12px; font-weight: bold; Generate false false false 580 73 100 24 font: 12px; font-weight: bold; Generate false false false 685 27 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 685 77 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 25 225 17 font-weight: normal; Public Identity (1-16 bytes Modhex) 10 75 221 17 font-weight: normal; Private Identity (6 bytes Hex) 10 50 221 20 font-weight:normal; Public Identity Length 10 100 221 20 font-weight:normal; Secret Key (16 bytes Hex) 240 50 42 20 font-weight: normal; QAbstractSpinBox::UpDownArrows QAbstractSpinBox::CorrectToNearestValue 1 16 1 6 290 50 411 20 font-weight: normal; color: rgb(118, 116, 108) (6 bytes is default length as required by Yubico OTP validation server) 10 391 711 80 font-weight: bold; Actions 10 45 175 25 font: 12px; font-weight: bold; Write Configuration false false false false 200 45 85 25 font: 12px; font-weight: bold; Stop false false false 20 20 691 16 font-weight: normal; color: rgb(118, 116, 108) Press Write Configuration button to program your YubiKey's selected configuration slot 400 45 85 25 font: 12px; font-weight: bold; Back false false false true 300 45 85 25 font: 12px; font-weight: bold; Reset false false false 580 45 100 25 font: 12px; font-weight: bold; Export false false false 10 132 350 107 font-weight: bold; Program Multiple YubiKeys true false 10 25 331 17 font-weight: normal; Automatically program YubiKeys when inserted 10 52 191 20 font-weight:normal; Parameter Generation Scheme Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 10 75 331 22 0 0 font-weight: normal; Increment Identity; Randomize Secrets Randomize all parameters Identity from serial; Randomize Secrets 325 52 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 481 711 130 font-weight: bold; Results 12 20 688 100 font: 11px "Verdana"; color: rgb(0, 0, 0); Qt::ScrollBarAlwaysOn true false Qt::SolidLine true 0 4 50 false 20 # Public Identity (Modhex) Status Timestamp 370 132 350 117 YubiAccBox QWidget
yubiaccbox.h
1
quickBtn advBtn quickConfigSlot1Radio quickConfigSlot2Radio quickPubIdTxt quickHideParams quickPvtIdTxt quickSecretKeyTxt quickWriteConfigBtn quickUploadBtn quickResetBtn quickBackBtn quickConfigHelpBtn quickPubIdHelpBtn quickPvtIdHelpBtn quickSecretKeyHelpBtn advConfigSlot1Radio advConfigSlot2Radio advProgramMulKeysBox advAutoProgramKeysCheck advConfigParamsCombo advPubIdCheck advPubIdTxt advPubIdGenerateBtn advPubIdLenBox advPvtIdCheck advPvtIdTxt advPvtIdGenerateBtn advSecretKeyTxt advSecretKeyGenerateBtn advWriteConfigBtn advStopBtn advResetBtn advBackBtn advResultsWidget advConfigHelpBtn advPubIdHelpBtn advPvtIdHelpBtn advSecretKeyHelpBtn advParamGenSchemeHelpBtn
yubikey-personalization-gui-3.1.23/src/ui/otppage.h0000664000175000017500000000774412603205714020762 0ustar klasklas/* Copyright (C) 2011-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef OTPPAGE_H #define OTPPAGE_H #include #include #include "yubikeyconfig.h" namespace Ui { class OtpPage; } class OtpPage : public QStackedWidget { Q_OBJECT public: explicit OtpPage(QWidget *parent = 0); ~OtpPage(); enum Page { Page_Base, Page_Quick, Page_Advanced, Page_Upload }; private: Ui::OtpPage *ui; int m_currentPage; int m_customerPrefix; QString m_pubIdPrefix; enum State { State_Initial, State_Programming, State_Programming_Multiple, State_Programming_Multiple_Auto }; State m_state; YubiKeyConfig *m_ykConfig; unsigned int m_keysProgrammedCtr; bool m_ready; // remember the last state of the key. bool m_keyPresent; QString m_uploadUrl; QTemporaryFile m_tempFile; public slots: void loadSettings(); void setCurrentPage(int pageIndex); void setCurrentSlot(int slot); private slots: void connectPages(); void connectHelpButtons(); void keyFound(bool found, bool* featuresMatrix); void clearState(); // Quick Page void resetQuickPage(); void on_quickResetBtn_clicked(); void on_quickHideParams_clicked(bool checked); void on_quickPubIdTxt_editingFinished(); void on_quickPvtIdTxt_editingFinished(); void on_quickSecretKeyTxt_editingFinished(); bool validateQuickSettings(); void writeQuickConfig(); void quickConfigWritten(bool written, const QString &msg); void uploadQuickConfig(); // Advanced Page void resetAdvPage(); void freezeAdvPage(bool freeze); void on_advProgramMulKeysBox_clicked(bool checked); void set_advPubId_default(); void on_advPubIdCheck_stateChanged(int state); void on_advPubIdTxt_editingFinished(); void on_advPubIdGenerateBtn_clicked(); void on_advPubIdLenBox_valueChanged(int value); void on_advPvtIdCheck_stateChanged(int state); void on_advPvtIdTxt_editingFinished(); void on_advPvtIdGenerateBtn_clicked(); void on_advSecretKeyTxt_editingFinished(); void on_advSecretKeyGenerateBtn_clicked(); void on_advWriteConfigBtn_clicked(); void on_advExportConfigBtn_clicked(); void on_advStopBtn_clicked(); void changeAdvConfigParams(); void stopAdvConfigWritting(); bool validateAdvSettings(); void writeAdvConfig(int mode); void advConfigWritten(bool written, const QString &msg); void advConfigExported(bool written, const QString &msg); void advUpdateResults(bool written, const QString &msg); signals: void showStatusMessage(const QString &text, int status = 0); void showHelp(int helpIndex); }; #endif // OTPPAGE_H yubikey-personalization-gui-3.1.23/src/ui/otppage.cpp0000664000175000017500000006753112603205714021315 0ustar klasklas/* Copyright (C) 2011-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "otppage.h" #include "yubikeywriter.h" #include "yubikeyutil.h" #include "yubikeyfinder.h" #include "ui_otppage.h" #include "ui/helpbox.h" #include "ui/confirmbox.h" #include #include #include #include #include #include #include #include #include "common.h" OtpPage::OtpPage(QWidget *parent) : QStackedWidget(parent), ui(new Ui::OtpPage) { ui->setupUi(this); m_customerPrefix = -1; m_ykConfig = 0; m_keyPresent = false; clearState(); //Connect pages connectPages(); //Connect help buttons connectHelpButtons(); //Connect other signals and slots connect(YubiKeyFinder::getInstance(), SIGNAL(keyFound(bool, bool*, int)), this, SLOT(keyFound(bool, bool*))); connect(ui->quickWriteConfigBtn, SIGNAL(clicked()), this, SLOT(writeQuickConfig())); connect(ui->quickUploadBtn, SIGNAL(clicked()), this, SLOT(uploadQuickConfig())); connect(ui->advResetBtn, SIGNAL(clicked()), this, SLOT(resetAdvPage())); //Load settings loadSettings(); ui->advResultsWidget->resizeColumnsToContents(); } OtpPage::~OtpPage() { if(m_ykConfig != 0) { delete m_ykConfig; m_ykConfig = 0; } delete ui; } /* Common */ void OtpPage::connectPages() { //Map the values of the navigation buttons with the indexes of //the stacked widget //Create a QMapper QSignalMapper *mapper = new QSignalMapper(this); //Connect the clicked signal with the QSignalMapper connect(ui->quickBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->quickBackBtn, SIGNAL(clicked()), mapper, SLOT(map())); //connect(ui->quickUploadBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advBackBtn, SIGNAL(clicked()), mapper, SLOT(map())); //Set a value for each button mapper->setMapping(ui->quickBtn, Page_Quick); mapper->setMapping(ui->quickBackBtn, Page_Base); //mapper->setMapping(ui->quickUploadBtn, Page_Upload); mapper->setMapping(ui->advBtn, Page_Advanced); mapper->setMapping(ui->advBackBtn, Page_Base); //Connect the mapper to the widget //The mapper will set a value to each button and //set that value to the widget //connect(pageMapper, SIGNAL(mapped(int)), this, SLOT(setCurrentIndex(int))); connect(mapper, SIGNAL(mapped(int)), this, SLOT(setCurrentPage(int))); //Set the current page m_currentPage = 0; setCurrentIndex(Page_Base); } void OtpPage::setCurrentPage(int pageIndex) { //Page changed... m_currentPage = pageIndex; switch(pageIndex){ case Page_Quick: resetQuickPage(); break; case Page_Advanced: resetAdvPage(); break; } setCurrentIndex(pageIndex); //Clear state m_keysProgrammedCtr = 0; clearState(); } void OtpPage::connectHelpButtons() { //Map the values of the help buttons //Create a QMapper QSignalMapper *mapper = new QSignalMapper(this); //Connect the clicked signal with the QSignalMapper connect(ui->quickConfigHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->quickPubIdHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->quickPvtIdHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->quickSecretKeyHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advConfigHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advParamGenSchemeHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advPubIdHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advPvtIdHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advSecretKeyHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); //Set a value for each button mapper->setMapping(ui->quickConfigHelpBtn, HelpBox::Help_ConfigurationSlot); mapper->setMapping(ui->quickPubIdHelpBtn, HelpBox::Help_PublicID); mapper->setMapping(ui->quickPvtIdHelpBtn, HelpBox::Help_PrivateID); mapper->setMapping(ui->quickSecretKeyHelpBtn, HelpBox::Help_SecretKey); mapper->setMapping(ui->advConfigHelpBtn, HelpBox::Help_ConfigurationSlot); mapper->setMapping(ui->advParamGenSchemeHelpBtn, HelpBox::Help_ParameterGeneration); mapper->setMapping(ui->advPubIdHelpBtn, HelpBox::Help_PublicID); mapper->setMapping(ui->advPvtIdHelpBtn, HelpBox::Help_PrivateID); mapper->setMapping(ui->advSecretKeyHelpBtn, HelpBox::Help_SecretKey); //Connect the mapper connect(mapper, SIGNAL(mapped(int)), this, SIGNAL(showHelp(int))); connect(ui->advConfigProtectionBox, SIGNAL(showHelp(int)), this, SIGNAL(showHelp(int))); } void OtpPage::keyFound(bool found, bool* featuresMatrix) { if(found) { if(m_state == State_Initial) { ui->quickWriteConfigBtn->setEnabled(true); ui->advWriteConfigBtn->setEnabled(true); ui->advExportConfigBtn->setEnabled(true); if(!featuresMatrix[YubiKeyFinder::Feature_MultipleConfigurations]) { ui->quickConfigSlot2Radio->setEnabled(false); ui->advConfigSlot2Radio->setEnabled(false); } else { ui->quickConfigSlot2Radio->setEnabled(true); ui->advConfigSlot2Radio->setEnabled(true); } } else if(this->currentIndex() == Page_Advanced && m_state >= State_Programming_Multiple && m_keyPresent == false) { if(m_keysProgrammedCtr > 0 && !m_ready) { changeAdvConfigParams(); } if(m_state == State_Programming_Multiple) { ui->advWriteConfigBtn->setEnabled(true); ui->advExportConfigBtn->setEnabled(true); } else { writeAdvConfig(WRITE_CONFIG); } } m_keyPresent = true; } else { ui->quickWriteConfigBtn->setEnabled(false); ui->advWriteConfigBtn->setEnabled(false); ui->advExportConfigBtn->setEnabled(false); m_keyPresent = false; if(m_state == State_Initial) { ui->quickConfigSlot2Radio->setEnabled(true); ui->advConfigSlot2Radio->setEnabled(true); } } } void OtpPage::clearState() { m_state = State_Initial; m_ready = true; if(m_ykConfig != 0) { delete m_ykConfig; m_ykConfig = 0; } } void OtpPage::loadSettings() { QSettings settings; m_customerPrefix = settings.value(SG_CUSTOMER_PREFIX).toInt(); if(m_customerPrefix > 0) { ui->advPubIdLenBox->setValue(PUBLIC_ID_DEFAULT_SIZE); ui->advPubIdLenBox->setEnabled(false); //Build Public Identity prefix based on customer prefix QByteArray prefix; // As per old tool prefix.resize(2); prefix[0] = (unsigned char) (m_customerPrefix >> 8U); prefix[1] = (unsigned char) m_customerPrefix; char pubIdPrefix[prefix.size() * 2 + 1]; size_t pubIdPrefixLen = 0; memset(&pubIdPrefix, 0, sizeof(pubIdPrefix)); YubiKeyUtil::hexModhexEncode(pubIdPrefix, &pubIdPrefixLen, (unsigned char *)prefix.data(), prefix.size(), true); m_pubIdPrefix = QString(pubIdPrefix); if(m_currentPage == Page_Advanced) { on_advPubIdTxt_editingFinished(); } } else { ui->advPubIdLenBox->setEnabled(true); m_pubIdPrefix = QString(""); } ui->advExportConfigBtn->setVisible(settings.value(SG_EXPORT_PREFERENCE).toBool()); } /* Quick Page handling */ void OtpPage::resetQuickPage() { if(ui->quickConfigSlot1Radio->isChecked()) { ui->quickConfigSlot2Radio->setChecked(true); } on_quickResetBtn_clicked(); ui->quickUploadBtn->setEnabled(false); } void OtpPage::on_quickResetBtn_clicked() { QString pubIdTxt = YubiKeyUtil::generateRandomModhex(PUBLIC_ID_DEFAULT_SIZE * 2); pubIdTxt.replace(0, 2, YUBICO_OTP_SERVER_PUBLIC_ID_PREFIX); ui->quickPubIdTxt->setText(pubIdTxt); on_quickPubIdTxt_editingFinished(); ui->quickPvtIdTxt->setText( YubiKeyUtil::generateRandomHex((size_t)UID_SIZE * 2)); on_quickPvtIdTxt_editingFinished(); ui->quickSecretKeyTxt->setText( YubiKeyUtil::generateRandomHex((size_t)KEY_SIZE * 2)); on_quickSecretKeyTxt_editingFinished(); } void OtpPage::on_quickHideParams_clicked(bool checked) { if(checked) { ui->quickPvtIdTxt->setEchoMode(QLineEdit::Password); ui->quickSecretKeyTxt->setEchoMode(QLineEdit::Password); } else { ui->quickPvtIdTxt->setEchoMode(QLineEdit::Normal); ui->quickSecretKeyTxt->setEchoMode(QLineEdit::Normal); } } void OtpPage::on_quickPubIdTxt_editingFinished() { QString txt = ui->quickPubIdTxt->text(); YubiKeyUtil::qstrModhexClean(&txt, (size_t)PUBLIC_ID_DEFAULT_SIZE * 2); ui->quickPubIdTxt->setText(txt); } void OtpPage::on_quickPvtIdTxt_editingFinished() { QString txt = ui->quickPvtIdTxt->text(); YubiKeyUtil::qstrClean(&txt, (size_t)UID_SIZE * 2); ui->quickPvtIdTxt->setText(txt); } void OtpPage::on_quickSecretKeyTxt_editingFinished() { QString txt = ui->quickSecretKeyTxt->text(); YubiKeyUtil::qstrClean(&txt, (size_t)KEY_SIZE * 2); ui->quickSecretKeyTxt->setText(txt); } bool OtpPage::validateQuickSettings() { if(!(ui->quickConfigSlot1Radio->isChecked() || ui->quickConfigSlot2Radio->isChecked())) { emit showStatusMessage(tr(ERR_CONF_SLOT_NOT_SELECTED), 1); return false; } QSettings settings; //Check if configuration slot 1 is being programmed if (!settings.value(SG_OVERWRITE_CONF_SLOT1).toBool() && ui->quickConfigSlot1Radio->isChecked()) { //Confirm from client ConfirmBox confirm(this); confirm.setConfirmIndex(ConfirmBox::Confirm_ConfigurationSlot); int ret = confirm.exec(); switch (ret) { case 1: //Yes break; default: //No return false; } } return true; } void OtpPage::writeQuickConfig() { //Clear status emit showStatusMessage(NULL, -1); //Validate settings if(!validateQuickSettings()) { return; } // m_state = State_Programming; //Write configuration ui->quickWriteConfigBtn->setEnabled(false); ui->quickUploadBtn->setEnabled(false); ui->quickBackBtn->setEnabled(false); if(m_ykConfig != 0) { delete m_ykConfig; m_ykConfig = 0; } m_ykConfig = new YubiKeyConfig(); //Programming mode... m_ykConfig->setProgrammingMode(YubiKeyConfig::Mode_YubicoOtp); // set serial m_ykConfig->setSerial(QString::number(YubiKeyFinder::getInstance()->serial())); //Configuration slot... int configSlot = 1; if(ui->quickConfigSlot2Radio->isChecked()) { configSlot = 2; } m_ykConfig->setConfigSlot(configSlot); //Public ID... m_ykConfig->setPubIdTxt(ui->quickPubIdTxt->text()); //Private ID... m_ykConfig->setPvtIdTxt(ui->quickPvtIdTxt->text()); //Secret Key... m_ykConfig->setSecretKeyTxt(ui->quickSecretKeyTxt->text()); //Prepare upload url m_uploadUrl.clear(); unsigned int serial = YubiKeyFinder::getInstance()->serial(); m_uploadUrl = tr(UPLOAD_URL). arg(serial == 0? "": QString::number(serial)). arg(m_ykConfig->pubIdTxt()). arg(m_ykConfig->pvtIdTxt()). arg(m_ykConfig->secretKeyTxt()); //Write connect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(quickConfigWritten(bool, const QString &))); YubiKeyWriter::getInstance()->writeConfig(m_ykConfig); } void OtpPage::quickConfigWritten(bool written, __attribute__((unused)) const QString &msg) { disconnect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(quickConfigWritten(bool, const QString &))); ui->quickWriteConfigBtn->setEnabled(true); ui->quickBackBtn->setEnabled(true); if(written && m_ykConfig != 0) { ui->quickUploadBtn->setEnabled(true); QString keyDetail = tr(" (Public ID: %1)").arg(m_ykConfig->pubIdTxt()); showStatusMessage(tr(KEY_CONFIGURED).arg(keyDetail), 0); } else { m_uploadUrl.clear(); ui->quickUploadBtn->setEnabled(false); } clearState(); } void OtpPage::uploadQuickConfig() { m_tempFile.setFileTemplate(QDir::tempPath() + "/ykpers.XXXXXX.html"); m_tempFile.open(); m_tempFile.write(m_uploadUrl.toLatin1(), m_uploadUrl.length()); m_tempFile.close(); qDebug() << "temporary file for upload is: " << m_tempFile.fileName(); QDesktopServices::openUrl(QUrl::fromLocalFile(m_tempFile.fileName())); } /* Advanced Page handling */ void OtpPage::resetAdvPage() { if(ui->advConfigSlot1Radio->isChecked()) { ui->advConfigSlot2Radio->setChecked(true); } ui->advConfigParamsCombo->setCurrentIndex(2); ui->advAutoProgramKeysCheck->setChecked(false); ui->advProgramMulKeysBox->setChecked(false); ui->advConfigProtectionBox->reset(); ui->advPubIdCheck->setChecked(true); ui->advPubIdTxt->clear(); set_advPubId_default(); on_advPubIdTxt_editingFinished(); ui->advPubIdLenBox->setValue(PUBLIC_ID_DEFAULT_SIZE); if(m_customerPrefix > 0) { ui->advPubIdLenBox->setEnabled(false); } else { ui->advPubIdLenBox->setEnabled(true); } ui->advPvtIdCheck->setChecked(true); ui->advPvtIdTxt->clear(); on_advPvtIdTxt_editingFinished(); ui->advSecretKeyTxt->clear(); on_advSecretKeyTxt_editingFinished(); ui->advStopBtn->setEnabled(false); } void OtpPage::freezeAdvPage(bool freeze) { bool disable = !freeze; ui->advConfigBox->setEnabled(disable); ui->advProgramMulKeysBox->setEnabled(disable); ui->advConfigProtectionBox->setEnabled(disable); ui->advKeyParamsBox->setEnabled(disable); ui->advWriteConfigBtn->setEnabled(disable); ui->advExportConfigBtn->setEnabled(disable); ui->advStopBtn->setEnabled(!disable); ui->advBackBtn->setEnabled(disable); } void OtpPage::on_advProgramMulKeysBox_clicked(bool checked) { if(checked) { changeAdvConfigParams(); } } void OtpPage::on_advPubIdCheck_stateChanged(int state) { bool disable = (state != 0); ui->advPubIdTxt->setEnabled(disable); ui->advPubIdGenerateBtn->setEnabled(disable); if(m_customerPrefix <= 0) { ui->advPubIdLenBox->setEnabled(disable); } } void OtpPage::set_advPubId_default() { QString txt = "cccccc"; unsigned int serial = YubiKeyFinder::getInstance()->serial(); //Convert serial number to modhex unsigned char buf[16]; memset(buf, 0, sizeof(buf)); size_t bufLen = 0; QString tmp = QString::number(serial, 16); size_t len = tmp.length(); if(len % 2 != 0) { len++; } YubiKeyUtil::qstrClean(&tmp, (size_t)len, true); YubiKeyUtil::qstrHexDecode(buf, &bufLen, tmp); txt.append(YubiKeyUtil::qstrModhexEncode(buf, bufLen)); ui->advPubIdTxt->setText(txt); on_advPubIdTxt_editingFinished(); } void OtpPage::on_advPubIdTxt_editingFinished() { QString txt = ui->advPubIdTxt->text(); int len = ui->advPubIdLenBox->value() * 2; YubiKeyUtil::qstrModhexClean(&txt, (size_t)len); if(m_customerPrefix > 0) { txt.replace(0, 4, m_pubIdPrefix); } ui->advPubIdTxt->setText(txt); len = txt.length(); ui->advPubIdTxt->setCursorPosition(len + len/2); } void OtpPage::on_advPubIdLenBox_valueChanged(int value) { if(value > FIXED_SIZE) { ui->advPubIdLenBox->setValue(PUBLIC_ID_DEFAULT_SIZE); } on_advPubIdTxt_editingFinished(); } void OtpPage::on_advPubIdGenerateBtn_clicked() { int len = ui->advPubIdLenBox->value(); QString txt = YubiKeyUtil::generateRandomModhex((size_t)len * 2); ui->advPubIdTxt->setText(txt); on_advPubIdTxt_editingFinished(); } void OtpPage::on_advPvtIdCheck_stateChanged(int state) { bool disable = (state != 0); ui->advPvtIdTxt->setEnabled(disable); ui->advPvtIdGenerateBtn->setEnabled(disable); } void OtpPage::on_advPvtIdTxt_editingFinished() { QString txt = ui->advPvtIdTxt->text(); YubiKeyUtil::qstrClean(&txt, (size_t)UID_SIZE * 2); ui->advPvtIdTxt->setText(txt); } void OtpPage::on_advPvtIdGenerateBtn_clicked() { ui->advPvtIdTxt->setText( YubiKeyUtil::generateRandomHex((size_t)UID_SIZE * 2)); } void OtpPage::on_advSecretKeyTxt_editingFinished() { QString txt = ui->advSecretKeyTxt->text(); YubiKeyUtil::qstrClean(&txt, (size_t)KEY_SIZE * 2); ui->advSecretKeyTxt->setText(txt); } void OtpPage::on_advSecretKeyGenerateBtn_clicked() { ui->advSecretKeyTxt->setText( YubiKeyUtil::generateRandomHex((size_t)KEY_SIZE * 2)); } void OtpPage::on_advExportConfigBtn_clicked() { qDebug() << "foo"; //Validate settings if(!validateAdvSettings()) { return; } clearState(); freezeAdvPage(true); writeAdvConfig(EXPORT_CONFIG); } void OtpPage::on_advWriteConfigBtn_clicked() { emit showStatusMessage(NULL, -1); if(!ui->advProgramMulKeysBox->isChecked()) { m_keysProgrammedCtr = 0; } //Validate settings if(!validateAdvSettings()) { return; } clearState(); freezeAdvPage(true); // Change state if(ui->advProgramMulKeysBox->isChecked()) { if(ui->advAutoProgramKeysCheck->isChecked()) { m_keysProgrammedCtr = 0; m_state = State_Programming_Multiple_Auto; } else { m_state = State_Programming_Multiple; } } else { m_keysProgrammedCtr = 0; m_state = State_Programming; } writeAdvConfig(WRITE_CONFIG); } void OtpPage::on_advStopBtn_clicked() { ui->advStopBtn->setEnabled(false); m_state = State_Initial; stopAdvConfigWritting(); } void OtpPage::stopAdvConfigWritting() { qDebug() << "Stopping adv configuration writing..."; if(m_state >= State_Programming_Multiple) { ui->advStopBtn->setEnabled(true); return; } m_keysProgrammedCtr = 0; clearState(); freezeAdvPage(false); } void OtpPage::changeAdvConfigParams() { qDebug() << "Changing adv configuration params..."; int index = ui->advConfigParamsCombo->currentIndex(); int idScheme = GEN_SCHEME_FIXED; int secretScheme = GEN_SCHEME_FIXED; switch(index) { case SCHEME_INCR_ID_RAND_SECRET: //Increment IDs only if in programming mode if(m_state != State_Initial) { idScheme = GEN_SCHEME_INCR; } secretScheme = GEN_SCHEME_RAND; break; case SCHEME_RAND_ALL: idScheme = GEN_SCHEME_RAND; secretScheme = GEN_SCHEME_RAND; break; case SCHEME_ID_FROM_SERIAL_RAND_SECRET: idScheme = GEN_SCHEME_SERIAL; secretScheme = GEN_SCHEME_RAND; break; } //Public ID... if(ui->advPubIdCheck->isChecked()) { if(idScheme == GEN_SCHEME_SERIAL) { set_advPubId_default(); } else { QString pubIdTxt = YubiKeyUtil::getNextModhex( ui->advPubIdLenBox->value() * 2, ui->advPubIdTxt->text(), idScheme); ui->advPubIdTxt->setText(pubIdTxt); on_advPubIdTxt_editingFinished(); } } //Private ID... if(ui->advPvtIdCheck->isChecked()) { QString pvtIdTxt = YubiKeyUtil::getNextHex( UID_SIZE * 2, ui->advPvtIdTxt->text(), secretScheme); ui->advPvtIdTxt->setText(pvtIdTxt); } //Secret Key... QString secretKeyTxt = YubiKeyUtil::getNextHex( KEY_SIZE * 2, ui->advSecretKeyTxt->text(), secretScheme); ui->advSecretKeyTxt->setText(secretKeyTxt); m_ready = true; } bool OtpPage::validateAdvSettings() { if(!(ui->advConfigSlot1Radio->isChecked() || ui->advConfigSlot2Radio->isChecked())) { emit showStatusMessage(tr(ERR_CONF_SLOT_NOT_SELECTED), 1); return false; } QSettings settings; //Check if configuration slot 1 is being programmed if (!settings.value(SG_OVERWRITE_CONF_SLOT1).toBool() && ui->advConfigSlot1Radio->isChecked() && m_keysProgrammedCtr == 0) { //Confirm from client ConfirmBox confirm(this); confirm.setConfirmIndex(ConfirmBox::Confirm_ConfigurationSlot); int ret = confirm.exec(); switch (ret) { case 1: //Yes break; default: //No return false; } } //Check if public id length is 6 if (!settings.value(SG_DIFF_PUBLIC_ID_LEN).toBool() && ui->advPubIdLenBox->value() != PUBLIC_ID_DEFAULT_SIZE && m_keysProgrammedCtr == 0) { //Confirm from client ConfirmBox confirm(this); confirm.setConfirmIndex(ConfirmBox::Confirm_PublicID); int ret = confirm.exec(); switch (ret) { case 1: //Yes break; default: //No return false; } } if(!ui->advConfigProtectionBox->checkConfirm()) { return false; } return true; } void OtpPage::writeAdvConfig(int mode) { qDebug() << "Writing configuration..."; //Disable stop button while configuration is being written ui->advStopBtn->setEnabled(false); //Write configuration if(m_ykConfig != 0) { qDebug() << "ykConfig destroyed"; delete m_ykConfig; m_ykConfig = 0; } m_ykConfig = new YubiKeyConfig(); //Programming mode... m_ykConfig->setProgrammingMode(YubiKeyConfig::Mode_YubicoOtp); // set serial m_ykConfig->setSerial(QString::number(YubiKeyFinder::getInstance()->serial())); //Configuration slot... int configSlot = 1; if(ui->advConfigSlot2Radio->isChecked()) { configSlot = 2; } m_ykConfig->setConfigSlot(configSlot); //Public ID... if(ui->advPubIdCheck->isChecked()) { m_ykConfig->setPubIdTxt(ui->advPubIdTxt->text()); } //Private ID... if(ui->advPvtIdCheck->isChecked()) { m_ykConfig->setPvtIdTxt(ui->advPvtIdTxt->text()); } //Secret Key... m_ykConfig->setSecretKeyTxt(ui->advSecretKeyTxt->text()); //Configuration protection... m_ykConfig->setCurrentAccessCodeTxt( ui->advConfigProtectionBox->currentAccessCode()); m_ykConfig->setNewAccessCodeTxt( ui->advConfigProtectionBox->newAccessCode(), ui->advConfigProtectionBox->newAccMode()); if(mode == WRITE_CONFIG) { //Write connect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(advConfigWritten(bool, const QString &))); YubiKeyWriter::getInstance()->writeConfig(m_ykConfig); } else if(mode == EXPORT_CONFIG) { connect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(advConfigExported(bool, const QString &))); YubiKeyWriter::getInstance()->exportConfig(m_ykConfig); } } void OtpPage::advConfigWritten(bool written, const QString &msg) { disconnect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(advConfigWritten(bool, const QString &))); QString message; if(written && m_ykConfig != 0) { qDebug() << "Configuration written...."; m_keysProgrammedCtr++; QString keyDetail(""); if(ui->advPubIdCheck->isChecked()) { keyDetail = tr(" (Public ID: %1)").arg(m_ykConfig->pubIdTxt()); } if(m_state == State_Programming){ message = tr(KEY_CONFIGURED).arg(keyDetail); } else { message = tr("%1. %2").arg(tr(KEY_CONFIGURED).arg(keyDetail)).arg(tr(REMOVE_KEY)); } showStatusMessage(message, 0); message = tr(KEY_CONFIGURED).arg(""); } else { qDebug() << "Configuration could not be written...."; message = msg; } advUpdateResults(written, message); m_ready = false; stopAdvConfigWritting(); } void OtpPage::advConfigExported(bool written, const QString &msg) { disconnect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(advConfigExported(bool, const QString &))); QString message; if(written && m_ykConfig != 0) { qDebug() << "Configuration exported...."; QString keyDetail(""); if(ui->advPubIdCheck->isChecked()) { keyDetail = tr(" (Public ID: %1)").arg(m_ykConfig->pubIdTxt()); } message = tr(KEY_EXPORTED); showStatusMessage(message, 0); } else { qDebug() << "Configuration could not be exported...."; message = msg; } m_ready = false; stopAdvConfigWritting(); } void OtpPage::advUpdateResults(bool written, const QString &msg) { int row = 0; ui->advResultsWidget->insertRow(row); //Sr. No.... QTableWidgetItem *srnoItem = new QTableWidgetItem( tr("%1").arg(ui->advResultsWidget->rowCount())); if(written) { srnoItem->setIcon(QIcon(QPixmap(tr(":/res/images/tick.png")))); } else { srnoItem->setIcon(QIcon(QPixmap(tr(":/res/images/cross.png")))); } srnoItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->advResultsWidget->setItem(row, 0, srnoItem); //Public ID... QString pubId; if(ui->advPubIdCheck->isChecked() && m_ykConfig != 0) { pubId = m_ykConfig->pubIdTxt(); } else { pubId = NA; } QTableWidgetItem *idItem = new QTableWidgetItem( tr("%1").arg(pubId)); idItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->advResultsWidget->setItem(row, 1, idItem); //Status... QTableWidgetItem *statusItem = new QTableWidgetItem( tr("%1").arg(msg)); statusItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->advResultsWidget->setItem(row, 2, statusItem); //Timestamp... QDateTime timstamp = QDateTime::currentDateTime(); QTableWidgetItem *timeItem = new QTableWidgetItem( tr("%1").arg(timstamp.toString(Qt::SystemLocaleShortDate))); timeItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->advResultsWidget->setItem(row, 3, timeItem); ui->advResultsWidget->resizeColumnsToContents(); ui->advResultsWidget->resizeRowsToContents(); } void OtpPage::setCurrentSlot(int slot) { if(m_currentPage == Page_Advanced) { ui->advConfigSlot1Radio->setChecked(slot == 1); ui->advConfigSlot2Radio->setChecked(slot == 2); } else if(m_currentPage == Page_Quick) { ui->quickConfigSlot1Radio->setChecked(slot == 1); ui->quickConfigSlot2Radio->setChecked(slot == 2); } } yubikey-personalization-gui-3.1.23/src/ui/oathpage.ui0000664000175000017500000015555612603205714021306 0ustar klasklas OathPage 0 0 730 650 0 0 730 650 StackedWidget font: 11px "Verdana"; color: rgb(0, 0, 0); 2 10 0 710 22 font: 18px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); Program in OATH-HOTP mode Qt::AlignCenter 10 50 710 171 border-color: rgb(0, 0, 0); Qt::AlignCenter 20 20 110 25 0 0 font: 12px; font-weight: bold; Quick false false false 20 100 110 25 font: 12px; font-weight: bold; Advanced false false false 20 45 671 20 Quickly program a YubiKey in OATH-HOTP mode Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 20 120 671 30 Allows you to program one or more YubiKeys in OATH-HOTP mode with greater control over the configuration values Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 10 0 710 22 font: 18px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); Program in OATH-HOTP mode - Quick Qt::AlignCenter 10 50 711 72 font-weight: bold; Configuration Slot 10 25 291 16 font-weight: normal; color: rgb(118, 116, 108) Select the configuration slot to be programmed 10 45 151 19 font-weight: normal; Configuration Slot 1 240 45 151 19 font-weight: normal; Configuration Slot 2 685 45 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 132 711 130 font-weight: bold; OATH-HOTP Parameters (auto generated) false false 685 50 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 685 27 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 685 100 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 50 221 20 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-weight:600; font-style:normal;"> <table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> <tr> <td style="border: none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:400;">HOTP Length</span></p></td></tr></table></body></html> Qt::RichText true 280 25 181 20 0 0 font-weight: normal; 00 00 00 00; QLineEdit::Normal 11 false true 240 100 371 20 font-weight: normal; hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh; QLineEdit::Password 59 true 10 75 221 18 font-weight: normal; Hide secret true 240 51 71 17 font-weight: normal; 6 Digits true true 320 51 71 17 font-weight: normal; 8 Digits true false 10 100 221 20 font-weight:normal; Secret Key (20 bytes Hex) 10 25 221 17 font-weight: normal; OATH Token Identifier (6 bytes) 470 23 141 24 font: 12px; font-weight: bold; Generate MUI false false false 240 25 41 20 font: 12px; font-weight: bold; 10 272 711 80 font-weight: bold; Actions 10 45 175 25 font: 12px; font-weight: bold; Write Configuration false false false 335 45 85 25 font: 12px; font-weight: bold; Back false false false 10 25 691 16 font-weight: normal; color: rgb(118, 116, 108) Press Write Configuration button to program your YubiKey's selected configuration slot true 200 45 120 25 font: 12px; font-weight: bold; Regenerate false false false 10 0 710 22 font: 18px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); Program in OATH-HOTP mode - Advanced Qt::AlignCenter 10 50 711 72 font-weight: bold; Configuration Slot 10 25 331 16 font-weight: normal; color: rgb(118, 116, 108); Select the configuration slot to be programmed 10 45 151 19 font-weight: normal; Configuration Slot 1 true false 240 45 151 19 font-weight: normal; Configuration Slot 2 685 45 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 249 711 157 font-weight: bold; OATH-HOTP Parameters 685 127 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 240 125 330 20 0 0 font-weight: normal; hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh; 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 59 59 580 123 100 24 font: 12px; font-weight: bold; Generate false false false 240 25 330 20 0 0 font-weight: normal; All numeric OMP Modhex, rest numeric OMP + TT Modhex, rest numeric All Modhex 320 50 111 20 0 0 font-weight: normal; nn nn nn nn; 00 00 00 00 11 11 281 50 30 20 0 0 font-weight: normal; nn; 00 2 2 241 50 30 20 0 0 font-weight: normal; nn; 00 2 2 440 48 130 24 font: 12px; font-weight: bold; Generate MUI false false false 10 125 221 20 font-weight:normal; Secret Key (20 bytes Hex) 10 25 221 17 font-weight: normal; OATH Token Identifier (6 bytes) 10 75 221 20 font-weight:normal; HOTP Length 320 76 71 17 font-weight: normal; 8 Digits true false 240 76 71 17 font-weight: normal; 6 Digits true true 10 100 221 20 font-weight:normal; Moving Factor Seed 240 99 191 20 0 0 font-weight: normal; Fixed zero Fixed Randomize false 440 99 130 20 font-weight: normal; 00000000; 0 8 8 685 27 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 685 102 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 50 221 16 font-weight: normal; color: rgb(118, 116, 108); OMP (1) + TT (1) + MUI (4) 685 77 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 416 711 80 font-weight: bold; Actions 10 45 175 25 font: 12px; font-weight: bold; Write Configuration false false false false 200 45 85 25 font: 12px; font-weight: bold; Stop false false false 10 25 691 16 font-weight: normal; color: rgb(118, 116, 108) Press Write Configuration button to program your YubiKey's selected configuration slot 400 45 85 25 font: 12px; font-weight: bold; Back false false false true 300 45 85 25 font: 12px; font-weight: bold; Reset false false false 580 45 100 25 font: 12px; font-weight: bold; Export false false false 10 132 350 107 font-weight: bold; Program Multiple YubiKeys true false 10 25 331 17 font-weight: normal; Automatically program YubiKeys when inserted 10 75 331 22 0 0 font-weight: normal; Increment Identities; Randomize Secret Randomize all parameters 10 52 191 20 font-weight:normal; Parameter Generation Scheme Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 325 52 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 506 711 130 font-weight: bold; Results 12 20 688 100 font: 11px "Verdana"; color: rgb(0, 0, 0); Qt::ScrollBarAlwaysOn true false Qt::SolidLine true 0 4 50 false 20 # OATH Token Identifier Status Timestamp 370 132 350 117 YubiAccBox QWidget
yubiaccbox.h
1
quickBtn advBtn quickConfigSlot1Radio quickConfigSlot2Radio quickPubIdCheck quickMUITxt quickMUIGenerateBtn quickHotpLen6Radio quickHotpLen8Radio quickHideParams quickSecretKeyTxt quickWriteConfigBtn quickResetBtn quickBackBtn quickConfigHelpBtn quickPubIdHelpBtn quickHotpLenHelpBtn quickSecretKeyHelpBtn advConfigSlot1Radio advConfigSlot2Radio advProgramMulKeysBox advAutoProgramKeysCheck advConfigParamsCombo advPubIdCheck advPubIdFormatCombo advOMPTxt advTTTxt advMUITxt advMUIGenerateBtn advHotpLen6Radio advHotpLen8Radio advMovingFactorSeedCombo advMovingFactorSeedTxt advSecretKeyTxt advSecretKeyGenerateBtn advWriteConfigBtn advStopBtn advResetBtn advBackBtn advResultsWidget advConfigHelpBtn advParamGenSchemeHelpBtn advPubIdHelpBtn advHotpLenHelpBtn advHotpParamsHelpBtn advSecretKeyHelpBtn
yubikey-personalization-gui-3.1.23/src/ui/oathpage.h0000664000175000017500000001052012603205714021075 0ustar klasklas/* Copyright (C) 2011-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef OATHPAGE_H #define OATHPAGE_H #include #include "yubikeyconfig.h" #include "common.h" namespace Ui { class OathPage; } class OathPage : public QStackedWidget { Q_OBJECT public: explicit OathPage(QWidget *parent = 0); ~OathPage(); enum Page { Page_Base, Page_Quick, Page_Advanced }; private: Ui::OathPage *ui; int m_currentPage; int m_customerPrefix; unsigned char m_pubId[2]; unsigned int m_pubIdMUI; enum State { State_Initial, State_Programming, State_Programming_Multiple, State_Programming_Multiple_Auto }; State m_state; YubiKeyConfig *m_ykConfig; unsigned int m_keysProgrammedCtr; bool m_ready; bool m_serialNumberSupported; bool m_keyPresent; public slots: void loadSettings(); QString getPublicId(bool bcd); void setCurrentPage(int pageIndex); void setCurrentSlot(int slot); private slots: void connectPages(); void connectHelpButtons(); void keyFound(bool found, bool* featuresMatrix); void updatePrefix(); void fixBCD(unsigned char *bp, int bcnt); void clearState(); // Quick Page void resetQuickPage(); void on_quickResetBtn_clicked(); void on_quickHideParams_clicked(bool checked); void on_quickPubIdCheck_stateChanged(int state); void resetQuickPrefix(); void updateQuickMUI(); void on_quickMUITxt_editingFinished(); void on_quickMUIGenerateBtn_clicked(); void on_quickSecretKeyTxt_editingFinished(); bool validateQuickSettings(); void writeQuickConfig(); void quickConfigWritten(bool written, const QString &msg); // Advanced Page void resetAdvPage(); void freezeAdvPage(bool freeze); void on_advProgramMulKeysBox_clicked(bool checked); void on_advConfigParamsCombo_currentIndexChanged(int index); void on_advPubIdFormatCombo_currentIndexChanged(int index); void on_advPubIdCheck_stateChanged(int state); void updateAdvOMP(int index); void on_advOMPTxt_editingFinished(); void updateAdvTT(int index); void on_advTTTxt_editingFinished(); void updateAdvMUI(int index); void on_advMUITxt_editingFinished(); void on_advMUIGenerateBtn_clicked(); void hotpLen_clicked(); void on_advMovingFactorSeedCombo_currentIndexChanged(int index); void on_advMovingFactorSeedTxt_editingFinished(); void on_advSecretKeyTxt_editingFinished(); void on_advSecretKeyGenerateBtn_clicked(); void on_advWriteConfigBtn_clicked(); void on_advExportConfigBtn_clicked(); void on_advStopBtn_clicked(); void changeAdvConfigParams(); void stopAdvConfigWritting(); bool validateAdvSettings(); void writeAdvConfig(int mode); void advConfigWritten(bool written, const QString &msg); void advConfigExported(bool written, const QString &msg); void advUpdateResults(bool written, const QString &msg); signals: void showStatusMessage(const QString &text, int status = 0); void showHelp(int helpIndex); }; #endif // OATHPAGE_H yubikey-personalization-gui-3.1.23/src/ui/oathpage.cpp0000664000175000017500000010542312603205714021437 0ustar klasklas/* Copyright (C) 2011-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "oathpage.h" #include "yubikeyutil.h" #include "yubikeyfinder.h" #include "yubikeywriter.h" #include "ui_oathpage.h" #include "ui/helpbox.h" #include "ui/confirmbox.h" #include #include #include #include #include #include #define OATH_FIXED_NUMERIC 0 #define OATH_FIXED_MODHEX1 1 #define OATH_FIXED_MODHEX2 2 #define OATH_FIXED_MODHEX 3 #define MOVING_FACTOR_ZERO 0 #define MOVING_FACTOR_FIXED 1 #define MOVING_FACTOR_RAND 2 OathPage::OathPage(QWidget *parent) : QStackedWidget(parent), ui(new Ui::OathPage) { ui->setupUi(this); m_customerPrefix = -1; memset(&m_pubId, 0, sizeof(m_pubId)); m_pubIdMUI = 0; m_ykConfig = 0; m_keyPresent = false; clearState(); //Connect pages connectPages(); //Connect help buttons connectHelpButtons(); //Connect other signals and slots connect(YubiKeyFinder::getInstance(), SIGNAL(keyFound(bool, bool*, int)), this, SLOT(keyFound(bool, bool*))); connect(ui->quickWriteConfigBtn, SIGNAL(clicked()), this, SLOT(writeQuickConfig())); connect(ui->advResetBtn, SIGNAL(clicked()), this, SLOT(resetAdvPage())); connect(ui->advMovingFactorSeedTxt, SIGNAL(editingFinished()), this, SLOT(on_advMovingFactorSeedTxt_editingFinished())); connect(ui->advHotpLen6Radio, SIGNAL(clicked()), this, SLOT(hotpLen_clicked())); connect(ui->advHotpLen8Radio, SIGNAL(clicked()), this, SLOT(hotpLen_clicked())); connect(ui->quickHotpLen6Radio, SIGNAL(clicked()), this, SLOT(hotpLen_clicked())); connect(ui->quickHotpLen8Radio, SIGNAL(clicked()), this, SLOT(hotpLen_clicked())); //Load settings loadSettings(); ui->advResultsWidget->resizeColumnsToContents(); } OathPage::~OathPage() { if(m_ykConfig != 0) { delete m_ykConfig; m_ykConfig = 0; } delete ui; } /* Common */ void OathPage::connectPages() { //Map the values of the navigation buttons with the indexes of //the stacked widget //Create a QMapper QSignalMapper *mapper = new QSignalMapper(this); //Connect the clicked signal with the QSignalMapper connect(ui->quickBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->quickBackBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advBackBtn, SIGNAL(clicked()), mapper, SLOT(map())); //Set a value for each button mapper->setMapping(ui->quickBtn, Page_Quick); mapper->setMapping(ui->quickBackBtn, Page_Base); mapper->setMapping(ui->advBtn, Page_Advanced); mapper->setMapping(ui->advBackBtn, Page_Base); //Connect the mapper to the widget //The mapper will set a value to each button and //set that value to the widget //connect(pageMapper, SIGNAL(mapped(int)), this, SLOT(setCurrentIndex(int))); connect(mapper, SIGNAL(mapped(int)), this, SLOT(setCurrentPage(int))); //Set the current page m_currentPage = 0; setCurrentIndex(Page_Base); } void OathPage::setCurrentPage(int pageIndex) { //Page changed... m_currentPage = pageIndex; switch(pageIndex){ case Page_Quick: resetQuickPage(); break; case Page_Advanced: resetAdvPage(); break; } setCurrentIndex(pageIndex); //Clear state m_keysProgrammedCtr = 0; clearState(); } void OathPage::connectHelpButtons() { //Map the values of the help buttons //Create a QMapper QSignalMapper *mapper = new QSignalMapper(this); //Connect the clicked signal with the QSignalMapper connect(ui->quickConfigHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->quickPubIdHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->quickHotpLenHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->quickSecretKeyHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advConfigHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advParamGenSchemeHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advPubIdHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advHotpLenHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advHotpParamsHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advSecretKeyHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); //Set a value for each button mapper->setMapping(ui->quickConfigHelpBtn, HelpBox::Help_ConfigurationSlot); mapper->setMapping(ui->quickPubIdHelpBtn, HelpBox::Help_OathPublicID); mapper->setMapping(ui->quickHotpLenHelpBtn, HelpBox::Help_HotpLen); mapper->setMapping(ui->quickSecretKeyHelpBtn, HelpBox::Help_SecretKey); mapper->setMapping(ui->advConfigHelpBtn, HelpBox::Help_ConfigurationSlot); mapper->setMapping(ui->advParamGenSchemeHelpBtn, HelpBox::Help_ParameterGeneration); mapper->setMapping(ui->advPubIdHelpBtn, HelpBox::Help_OathPublicID); mapper->setMapping(ui->advHotpLenHelpBtn, HelpBox::Help_HotpLen); mapper->setMapping(ui->advHotpParamsHelpBtn, HelpBox::Help_HotpParam); mapper->setMapping(ui->advSecretKeyHelpBtn, HelpBox::Help_SecretKey); //Connect the mapper connect(mapper, SIGNAL(mapped(int)), this, SIGNAL(showHelp(int))); connect(ui->advConfigProtectionBox, SIGNAL(showHelp(int)), this, SIGNAL(showHelp(int))); } void OathPage::keyFound(bool found, bool* featuresMatrix) { if(found) { if(m_state == State_Initial) { ui->quickWriteConfigBtn->setEnabled(true); ui->advWriteConfigBtn->setEnabled(true); ui->advExportConfigBtn->setEnabled(true); if(!featuresMatrix[YubiKeyFinder::Feature_MultipleConfigurations]) { ui->quickConfigSlot2Radio->setEnabled(false); ui->advConfigSlot2Radio->setEnabled(false); } else { ui->quickConfigSlot2Radio->setEnabled(true); ui->advConfigSlot2Radio->setEnabled(true); } if(!featuresMatrix[YubiKeyFinder::Feature_MovingFactor]) { ui->advMovingFactorSeedCombo->setEnabled(false); ui->advMovingFactorSeedTxt->setEnabled(false); } if(!featuresMatrix[YubiKeyFinder::Feature_OathHotp]) { this->setEnabled(false); } if(this->currentIndex() == Page_Quick) { resetQuickPrefix(); } } else if(this->currentIndex() == Page_Advanced && m_state >= State_Programming_Multiple && m_keyPresent == false) { if(m_state == State_Programming_Multiple) { ui->advWriteConfigBtn->setEnabled(true); ui->advExportConfigBtn->setEnabled(true); } else { writeAdvConfig(WRITE_CONFIG); } } m_keyPresent = true; } else { ui->quickWriteConfigBtn->setEnabled(false); ui->advWriteConfigBtn->setEnabled(false); ui->advExportConfigBtn->setEnabled(false); m_keyPresent = false; if(m_state == State_Initial) { ui->quickConfigSlot2Radio->setEnabled(true); ui->advConfigSlot2Radio->setEnabled(true); ui->advMovingFactorSeedCombo->setEnabled(true); if(ui->advMovingFactorSeedCombo->currentIndex() == MOVING_FACTOR_ZERO) { ui->advMovingFactorSeedTxt->setEnabled(false); } else { ui->advMovingFactorSeedTxt->setEnabled(true); } this->setEnabled(true); } else if(this->currentIndex() == Page_Advanced && m_state >= State_Programming_Multiple) { if(m_keysProgrammedCtr > 0 && !m_ready) { changeAdvConfigParams(); } } } } void OathPage::clearState() { m_state = State_Initial; m_ready = true; if(m_ykConfig != 0) { delete m_ykConfig; m_ykConfig = 0; } } void OathPage::updatePrefix() { if(m_currentPage == Page_Quick || m_customerPrefix > 0) { //OMP m_pubId[0] = YUBICO_OMP_CODE; //TT m_pubId[1] = OATH_HOTP_CUSTOMER_PREFIX_START + (unsigned char) (m_customerPrefix / 1000); if(m_customerPrefix > 0) { // make room for the prefix.. m_pubIdMUI %= 99999; int mui_part = m_customerPrefix % 1000; m_pubIdMUI += mui_part * 100000; } } QString pubIdTxt; QString muiTxt = QString::number(m_pubIdMUI).rightJustified(8, '0'); QString pubIdModhexTxt = YubiKeyUtil::qstrModhexEncode( m_pubId, 2); switch(m_currentPage) { case Page_Quick: ui->quickPrefixTxt->setText(pubIdModhexTxt.left(4)); ui->quickMUITxt->setText(muiTxt); break; case Page_Advanced: switch(ui->advPubIdFormatCombo->currentIndex()){ case OATH_FIXED_NUMERIC: fixBCD(m_pubId, 2); pubIdTxt = YubiKeyUtil::qstrHexEncode( m_pubId, 2); ui->advOMPTxt->setText(pubIdTxt.left(2)); ui->advTTTxt->setText(pubIdTxt.mid(2, 2)); ui->advMUITxt->setText(muiTxt); break; case OATH_FIXED_MODHEX1: fixBCD(m_pubId + 1, 1); pubIdTxt = YubiKeyUtil::qstrHexEncode( m_pubId, 2); ui->advOMPTxt->setText(pubIdModhexTxt.left(2)); ui->advTTTxt->setText(pubIdTxt.mid(2, 2)); ui->advMUITxt->setText(muiTxt); break; case OATH_FIXED_MODHEX2: ui->advOMPTxt->setText(pubIdModhexTxt.left(2)); ui->advTTTxt->setText(pubIdModhexTxt.mid(2, 2)); ui->advMUITxt->setText(muiTxt); break; case OATH_FIXED_MODHEX: unsigned char tempMUI[4]; tempMUI[0] = (m_pubIdMUI >> 24) & 0xff; tempMUI[1] = (m_pubIdMUI >> 16) & 0xff; tempMUI[2] = (m_pubIdMUI >> 8) & 0xff; tempMUI[3] = m_pubIdMUI & 0xff; muiTxt = YubiKeyUtil::qstrModhexEncode(tempMUI, 4); ui->advOMPTxt->setText(pubIdModhexTxt.left(2)); ui->advTTTxt->setText(pubIdModhexTxt.mid(2, 2)); ui->advMUITxt->setText(muiTxt); break; } break; } } void OathPage::fixBCD(unsigned char *bp, int bcnt) { while (bcnt--) { if ((*bp & 0x0f) > 0x09) *bp -= 0x09; if ((*bp & 0xf0) > 0x90) *bp -= 0x90; bp++; } } void OathPage::loadSettings() { QSettings settings; m_customerPrefix = settings.value(SG_CUSTOMER_PREFIX).toInt(); if(m_customerPrefix > 0) { ui->advPubIdFormatCombo->setCurrentIndex(OATH_FIXED_MODHEX2); } bool customerPrefixFlag = !(m_customerPrefix > 0); ui->advPubIdFormatCombo->setEnabled(customerPrefixFlag); ui->advOMPTxt->setEnabled(customerPrefixFlag); ui->advTTTxt->setEnabled(customerPrefixFlag); ui->advExportConfigBtn->setVisible(settings.value(SG_EXPORT_PREFERENCE).toBool()); bool hotp8 = settings.value(SG_OATH_HOTP8).toBool(); ui->advHotpLen6Radio->setChecked(!hotp8); ui->quickHotpLen6Radio->setChecked(!hotp8); ui->advHotpLen8Radio->setChecked(hotp8); ui->quickHotpLen8Radio->setChecked(hotp8); } /* Quick Page handling */ void OathPage::resetQuickPage() { memset(&m_pubId, 0, sizeof(m_pubId)); if(ui->quickConfigSlot1Radio->isChecked()) { ui->quickConfigSlot2Radio->setChecked(true); } ui->quickPubIdCheck->setChecked(true); on_quickResetBtn_clicked(); } void OathPage::on_quickResetBtn_clicked() { resetQuickPrefix(); ui->quickSecretKeyTxt->setText( YubiKeyUtil::generateRandomHex((size_t)KEY_SIZE_OATH * 2)); on_quickSecretKeyTxt_editingFinished(); } void OathPage::on_quickHideParams_clicked(bool checked) { if(checked) { ui->quickSecretKeyTxt->setEchoMode(QLineEdit::Password); } else { ui->quickSecretKeyTxt->setEchoMode(QLineEdit::Normal); } } void OathPage::on_quickPubIdCheck_stateChanged(int state) { bool disable = (state != 0); ui->quickPrefixTxt->setEnabled(disable); ui->quickMUITxt->setEnabled(disable); ui->quickMUIGenerateBtn->setEnabled(disable); } void OathPage::resetQuickPrefix() { ui->quickMUITxt->setText( QString::number(YubiKeyFinder::getInstance()->serial())); updateQuickMUI(); updatePrefix(); } void OathPage::updateQuickMUI() { QString txt = ui->quickMUITxt->text(); unsigned char buf[MAX_SIZE]; memset(buf, 0, sizeof(buf)); size_t bufLen = 0; YubiKeyUtil::qstrClean(&txt, OATH_HOTP_MUI_SIZE * 2, true); YubiKeyUtil::qstrDecDecode(buf, &bufLen, txt); ui->quickMUITxt->setText(txt); memcpy(m_pubId + 2, buf, OATH_HOTP_MUI_SIZE); } void OathPage::on_quickMUITxt_editingFinished() { updateQuickMUI(); updatePrefix(); } void OathPage::on_quickMUIGenerateBtn_clicked() { YubiKeyUtil::generateRandom((unsigned char*)&m_pubIdMUI, sizeof(m_pubIdMUI)); m_pubIdMUI %= 99999999; updatePrefix(); } void OathPage::on_quickSecretKeyTxt_editingFinished() { QString txt = ui->quickSecretKeyTxt->text(); YubiKeyUtil::qstrClean(&txt, (size_t)KEY_SIZE_OATH * 2); ui->quickSecretKeyTxt->setText(txt); } bool OathPage::validateQuickSettings() { if(!(ui->quickConfigSlot1Radio->isChecked() || ui->quickConfigSlot2Radio->isChecked())) { emit showStatusMessage(tr(ERR_CONF_SLOT_NOT_SELECTED), 1); return false; } QSettings settings; //Check if configuration slot 1 is being programmed if (!settings.value(SG_OVERWRITE_CONF_SLOT1).toBool() && ui->quickConfigSlot1Radio->isChecked()) { //Confirm from client ConfirmBox confirm(this); confirm.setConfirmIndex(ConfirmBox::Confirm_ConfigurationSlot); int ret = confirm.exec(); switch (ret) { case 1: //Yes break; default: //No return false; } } return true; } void OathPage::writeQuickConfig() { //Clear status emit showStatusMessage(NULL, -1); //Validate settings if(!validateQuickSettings()) { return; } // m_state = State_Programming; //Write configuration ui->quickWriteConfigBtn->setEnabled(false); ui->quickResetBtn->setEnabled(false); ui->quickBackBtn->setEnabled(false); if(m_ykConfig != 0) { delete m_ykConfig; m_ykConfig = 0; } m_ykConfig = new YubiKeyConfig(); //Programming mode... m_ykConfig->setProgrammingMode(YubiKeyConfig::Mode_OathHotp); // set serial m_ykConfig->setSerial(QString::number(YubiKeyFinder::getInstance()->serial())); //Configuration slot... int configSlot = 1; if(ui->quickConfigSlot2Radio->isChecked()) { configSlot = 2; } m_ykConfig->setConfigSlot(configSlot); //Public ID... if(ui->quickPubIdCheck->isChecked()) { m_ykConfig->setPubIdTxt(getPublicId(true)); //OATH Public ID Type... m_ykConfig->setOathFixedModhex2(true); } //HOTP Len... m_ykConfig->setOathHotp8(ui->quickHotpLen8Radio->isChecked()); //HOTP Moving Factor Seed... m_ykConfig->setOathMovingFactorSeed(0); //Secret Key... m_ykConfig->setSecretKeyTxt(ui->quickSecretKeyTxt->text()); //Write connect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(quickConfigWritten(bool, const QString &))); YubiKeyWriter::getInstance()->writeConfig(m_ykConfig); } void OathPage::quickConfigWritten(bool written, __attribute__((unused)) const QString &msg) { disconnect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(quickConfigWritten(bool, const QString &))); ui->quickWriteConfigBtn->setEnabled(true); ui->quickResetBtn->setEnabled(true); ui->quickBackBtn->setEnabled(true); if(written && m_ykConfig != 0) { QString keyDetail(""); if(ui->quickPubIdCheck->isChecked()) { QString pubIdTxt = ui->quickPrefixTxt->text() + ui->quickMUITxt->text().replace(QRegExp("\\s"), QString("")); keyDetail = tr(" (OATH ID: %1)").arg(pubIdTxt); } showStatusMessage(tr(KEY_CONFIGURED).arg(keyDetail), 0); } clearState(); } /* Advanced Page handling */ void OathPage::resetAdvPage() { memset(&m_pubId, 0, sizeof(m_pubId)); m_pubIdMUI = 0; bool customerPrefixFlag = !(m_customerPrefix > 0); if(ui->advConfigSlot1Radio->isChecked()) { ui->advConfigSlot2Radio->setChecked(true); } ui->advConfigParamsCombo->setCurrentIndex(0); ui->advAutoProgramKeysCheck->setChecked(false); ui->advProgramMulKeysBox->setChecked(false); ui->advConfigProtectionBox->reset(); ui->advPubIdCheck->setChecked(true); if(customerPrefixFlag) { ui->advPubIdFormatCombo->setCurrentIndex(OATH_FIXED_NUMERIC); } else { ui->advPubIdFormatCombo->setCurrentIndex(OATH_FIXED_MODHEX2); } ui->advPubIdFormatCombo->setEnabled(customerPrefixFlag); on_advOMPTxt_editingFinished(); ui->advOMPTxt->setEnabled(customerPrefixFlag); on_advTTTxt_editingFinished(); ui->advTTTxt->setEnabled(customerPrefixFlag); on_advMUITxt_editingFinished(); ui->advMovingFactorSeedCombo->setCurrentIndex(0); ui->advMovingFactorSeedTxt->setText(tr("0")); ui->advMovingFactorSeedTxt->setEnabled(false); ui->advSecretKeyTxt->clear(); on_advSecretKeyTxt_editingFinished(); ui->advStopBtn->setEnabled(false); } void OathPage::freezeAdvPage(bool freeze) { bool disable = !freeze; ui->advConfigBox->setEnabled(disable); ui->advProgramMulKeysBox->setEnabled(disable); ui->advConfigProtectionBox->setEnabled(disable); ui->advKeyParamsBox->setEnabled(disable); ui->advWriteConfigBtn->setEnabled(disable); ui->advExportConfigBtn->setEnabled(disable); ui->advStopBtn->setEnabled(!disable); ui->advResetBtn->setEnabled(disable); ui->advBackBtn->setEnabled(disable); } void OathPage::on_advProgramMulKeysBox_clicked(bool checked) { if(checked) { changeAdvConfigParams(); } } void OathPage::on_advConfigParamsCombo_currentIndexChanged(__attribute__((unused)) int index) { changeAdvConfigParams(); } void OathPage::on_advPubIdCheck_stateChanged(int state) { bool disable = (state != 0); if(m_customerPrefix <= 0) { ui->advPubIdFormatCombo->setEnabled(disable); ui->advOMPTxt->setEnabled(disable); ui->advTTTxt->setEnabled(disable); } ui->advMUITxt->setEnabled(disable); ui->advMUIGenerateBtn->setEnabled(disable); } void OathPage::on_advPubIdFormatCombo_currentIndexChanged(__attribute__((unused)) int index) { updatePrefix(); } void OathPage::updateAdvOMP(int index) { QString txt = ui->advOMPTxt->text(); unsigned char buf[MAX_SIZE]; memset(buf, 0, sizeof(buf)); size_t bufLen = 0; if (index == OATH_FIXED_NUMERIC) { YubiKeyUtil::qstrClean(&txt, OATH_HOTP_OMP_SIZE * 2, true); YubiKeyUtil::qstrDecDecode(buf, &bufLen, txt); } else { YubiKeyUtil::qstrModhexClean(&txt, OATH_HOTP_OMP_SIZE * 2); YubiKeyUtil::qstrModhexDecode(buf, &bufLen, txt); } ui->advOMPTxt->setText(txt); memcpy(m_pubId + 0, buf, OATH_HOTP_OMP_SIZE); } void OathPage::on_advOMPTxt_editingFinished() { updateAdvOMP(ui->advPubIdFormatCombo->currentIndex()); updatePrefix(); } void OathPage::updateAdvTT(int index) { QString txt = ui->advTTTxt->text(); unsigned char buf[MAX_SIZE]; memset(buf, 0, sizeof(buf)); size_t bufLen = 0; if (index == OATH_FIXED_NUMERIC || index == OATH_FIXED_MODHEX1) { YubiKeyUtil::qstrClean(&txt, OATH_HOTP_TT_SIZE * 2, true); YubiKeyUtil::qstrDecDecode(buf, &bufLen, txt); } else { YubiKeyUtil::qstrModhexClean(&txt, OATH_HOTP_TT_SIZE * 2); YubiKeyUtil::qstrModhexDecode(buf, &bufLen, txt); } ui->advTTTxt->setText(txt); memcpy(m_pubId + 1, buf, OATH_HOTP_TT_SIZE); } void OathPage::on_advTTTxt_editingFinished() { updateAdvTT(ui->advPubIdFormatCombo->currentIndex()); updatePrefix(); } void OathPage::updateAdvMUI(int index) { QString txt = ui->advMUITxt->text(); if (index != OATH_FIXED_MODHEX) { YubiKeyUtil::qstrClean(&txt, OATH_HOTP_MUI_SIZE * 2, true); m_pubIdMUI = txt.toInt(); } else { unsigned char buf[MAX_SIZE]; memset(buf, 0, sizeof(buf)); size_t bufLen = 0; YubiKeyUtil::qstrModhexClean(&txt, OATH_HOTP_MUI_SIZE * 2); YubiKeyUtil::qstrModhexDecode(buf, &bufLen, txt); m_pubIdMUI = (buf[0] << 24) + (buf[1] << 16) + (buf[2] << 8) + (buf[3]); } } void OathPage::on_advMUITxt_editingFinished() { updateAdvMUI(ui->advPubIdFormatCombo->currentIndex()); updatePrefix(); } void OathPage::on_advMUIGenerateBtn_clicked() { YubiKeyUtil::generateRandom((unsigned char*)&m_pubIdMUI, sizeof(m_pubIdMUI)); m_pubIdMUI %= 99999999; updatePrefix(); } void OathPage::on_advMovingFactorSeedCombo_currentIndexChanged(int index) { switch(index) { case MOVING_FACTOR_ZERO: ui->advMovingFactorSeedTxt->setText("0"); ui->advMovingFactorSeedTxt->setEnabled(false); break; case MOVING_FACTOR_FIXED: ui->advMovingFactorSeedTxt->setEnabled(true); break; case MOVING_FACTOR_RAND: unsigned int tmp; YubiKeyUtil::generateRandom((unsigned char *) &tmp, sizeof(tmp)); ui->advMovingFactorSeedTxt->setText(QString::number(tmp)); on_advMovingFactorSeedTxt_editingFinished(); ui->advMovingFactorSeedTxt->setEnabled(true); break; } } void OathPage::on_advMovingFactorSeedTxt_editingFinished() { unsigned int val = ui->advMovingFactorSeedTxt->text().toUInt(); val = (((val + 8) >> 4UL) & 0xffff) << 4UL; ui->advMovingFactorSeedTxt->setText(QString::number(val)); } void OathPage::on_advSecretKeyTxt_editingFinished() { QString txt = ui->advSecretKeyTxt->text(); YubiKeyUtil::qstrClean(&txt, (size_t)KEY_SIZE_OATH * 2); ui->advSecretKeyTxt->setText(txt); } void OathPage::on_advSecretKeyGenerateBtn_clicked() { ui->advSecretKeyTxt->setText( YubiKeyUtil::generateRandomHex((size_t)KEY_SIZE_OATH * 2)); ui->advSecretKeyTxt->setCursorPosition(0); } void OathPage::on_advWriteConfigBtn_clicked() { emit showStatusMessage(NULL, -1); if(!ui->advProgramMulKeysBox->isChecked()) { m_keysProgrammedCtr = 0; } //Validate settings if(!validateAdvSettings()) { return; } clearState(); freezeAdvPage(true); // Change state if(ui->advProgramMulKeysBox->isChecked()) { if(ui->advAutoProgramKeysCheck->isChecked()) { m_keysProgrammedCtr = 0; m_state = State_Programming_Multiple_Auto; } else { m_state = State_Programming_Multiple; } } else { m_keysProgrammedCtr = 0; m_state = State_Programming; } writeAdvConfig(WRITE_CONFIG); } void OathPage::on_advExportConfigBtn_clicked() { emit showStatusMessage(NULL, -1); //Validate settings if(!validateAdvSettings()) { return; } clearState(); freezeAdvPage(true); writeAdvConfig(EXPORT_CONFIG); } void OathPage::on_advStopBtn_clicked() { ui->advStopBtn->setEnabled(false); m_state = State_Initial; stopAdvConfigWritting(); } void OathPage::stopAdvConfigWritting() { qDebug() << "Stopping adv configuration writing..."; if(m_state >= State_Programming_Multiple) { ui->advStopBtn->setEnabled(true); return; } m_keysProgrammedCtr = 0; clearState(); freezeAdvPage(false); ui->advResetBtn->setEnabled(true); } void OathPage::changeAdvConfigParams() { int index = ui->advConfigParamsCombo->currentIndex(); int idScheme = GEN_SCHEME_FIXED; int secretScheme = GEN_SCHEME_FIXED; switch(index) { case SCHEME_INCR_ID_RAND_SECRET: //Increment IDs only if in programming mode if(m_state != State_Initial) { idScheme = GEN_SCHEME_INCR; } secretScheme = GEN_SCHEME_RAND; break; case SCHEME_RAND_ALL: idScheme = GEN_SCHEME_RAND; secretScheme = GEN_SCHEME_RAND; break; } //Public ID... if(ui->advPubIdCheck->isChecked()) { switch(idScheme) { case GEN_SCHEME_INCR: { m_pubIdMUI++; updatePrefix(); } break; case GEN_SCHEME_RAND: YubiKeyUtil::generateRandom((unsigned char*)&m_pubIdMUI, sizeof(m_pubIdMUI)); m_pubIdMUI %= 99999999; updatePrefix(); break; } } //HOTP Moving Factor Seed... if(ui->advMovingFactorSeedCombo->currentIndex() == MOVING_FACTOR_RAND) { unsigned int tmp; YubiKeyUtil::generateRandom((unsigned char *) &tmp, sizeof(tmp)); ui->advMovingFactorSeedTxt->setText(QString::number(tmp)); on_advMovingFactorSeedTxt_editingFinished(); } //Secret Key... QString secretKeyTxt = YubiKeyUtil::getNextHex( KEY_SIZE_OATH * 2, ui->advSecretKeyTxt->text(), secretScheme); ui->advSecretKeyTxt->setText(secretKeyTxt); on_advSecretKeyTxt_editingFinished(); m_ready = true; } bool OathPage::validateAdvSettings() { if(!(ui->advConfigSlot1Radio->isChecked() || ui->advConfigSlot2Radio->isChecked())) { emit showStatusMessage(tr(ERR_CONF_SLOT_NOT_SELECTED), 1); return false; } QSettings settings; //Check if configuration slot 1 is being programmed if (!settings.value(SG_OVERWRITE_CONF_SLOT1).toBool() && ui->advConfigSlot1Radio->isChecked() && m_keysProgrammedCtr == 0) { //Confirm from client ConfirmBox confirm(this); confirm.setConfirmIndex(ConfirmBox::Confirm_ConfigurationSlot); int ret = confirm.exec(); switch (ret) { case 1: //Yes break; default: //No return false; } } if(!ui->advConfigProtectionBox->checkConfirm()) { return false; } return true; } QString OathPage::getPublicId(bool bcd) { unsigned char pubId[6]; memcpy(pubId, m_pubId, 2); if(bcd) { int part = m_pubIdMUI / 1000000; pubId[2] = ((part / 10) << 4) + part % 10; part = m_pubIdMUI / 10000 % 100; pubId[3] = ((part / 10) << 4) + part % 10; part = m_pubIdMUI / 100 % 100; pubId[4] = ((part / 10) << 4) + part % 10; part = m_pubIdMUI % 100; pubId[5] = ((part / 10) << 4) + part % 10; } else { pubId[2] = (m_pubIdMUI >> 24) & 0xff; pubId[3] = (m_pubIdMUI >> 16) & 0xff; pubId[4] = (m_pubIdMUI >> 8) & 0xff; pubId[5] = m_pubIdMUI & 0xff; } QString pubIdTxt = YubiKeyUtil::qstrModhexEncode(pubId, 6); return pubIdTxt; } void OathPage::writeAdvConfig(int mode) { qDebug() << "Writing configuration..."; //Disable stop button while configuration is being written ui->advStopBtn->setEnabled(false); //Write configuration if(m_ykConfig != 0) { qDebug() << "ykConfig destroyed"; delete m_ykConfig; m_ykConfig = 0; } m_ykConfig = new YubiKeyConfig(); //Programming mode... m_ykConfig->setProgrammingMode(YubiKeyConfig::Mode_OathHotp); // set serial m_ykConfig->setSerial(QString::number(YubiKeyFinder::getInstance()->serial())); //Configuration slot... int configSlot = 1; if(ui->advConfigSlot2Radio->isChecked()) { configSlot = 2; } m_ykConfig->setConfigSlot(configSlot); //Public ID... if(ui->advPubIdCheck->isChecked()) { bool bcd = ui->advPubIdFormatCombo->currentIndex() < 3 ? true : false; m_ykConfig->setPubIdTxt(getPublicId(bcd)); //OATH Public ID Type... switch(ui->advPubIdFormatCombo->currentIndex()) { case 1: m_ykConfig->setOathFixedModhex1(true); break; case 2: m_ykConfig->setOathFixedModhex2(true); break; case 3: m_ykConfig->setOathFixedModhex(true); break; } } //HOTP Len... m_ykConfig->setOathHotp8(ui->advHotpLen8Radio->isChecked()); //HOTP Moving Factor Seed... if(YubiKeyFinder::getInstance()->checkFeatureSupport( YubiKeyFinder::Feature_MovingFactor)) { m_ykConfig->setOathMovingFactorSeed( ui->advMovingFactorSeedTxt->text().toUInt()); } //Secret Key... m_ykConfig->setSecretKeyTxt(ui->advSecretKeyTxt->text()); //Configuration protection... m_ykConfig->setCurrentAccessCodeTxt( ui->advConfigProtectionBox->currentAccessCode()); m_ykConfig->setNewAccessCodeTxt( ui->advConfigProtectionBox->newAccessCode(), ui->advConfigProtectionBox->newAccMode()); if(mode == WRITE_CONFIG) { //Write connect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(advConfigWritten(bool, const QString &))); YubiKeyWriter::getInstance()->writeConfig(m_ykConfig); } else if(mode == EXPORT_CONFIG) { connect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(advConfigExported(bool, const QString &))); YubiKeyWriter::getInstance()->exportConfig(m_ykConfig); } } void OathPage::advConfigWritten(bool written, const QString &msg) { disconnect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(advConfigWritten(bool, const QString &))); QString message; if(written && m_ykConfig != 0) { qDebug() << "Configuration written...."; m_keysProgrammedCtr++; QString keyDetail(""); if(ui->advPubIdCheck->isChecked()) { QString pubIdTxt = ui->advOMPTxt->text() + ui->advTTTxt->text() + ui->advMUITxt->text().replace(QRegExp("\\s"), QString("")); keyDetail = tr(" (OATH ID: %1)").arg(pubIdTxt); } if(m_state == State_Programming){ message = tr(KEY_CONFIGURED).arg(keyDetail); } else { message = tr("%1. %2").arg(tr(KEY_CONFIGURED).arg(keyDetail)).arg(tr(REMOVE_KEY)); } showStatusMessage(message, 0); message = tr(KEY_CONFIGURED).arg(""); } else { qDebug() << "Configuration could not be written...."; message = msg; } advUpdateResults(written, message); m_ready = false; stopAdvConfigWritting(); } void OathPage::advConfigExported(bool written, const QString &msg) { disconnect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(advConfigExported(bool, const QString &))); QString message; if(written && m_ykConfig != 0) { qDebug() << "Configuration exported...."; message = tr(KEY_EXPORTED); showStatusMessage(message, 0); } else { qDebug() << "Configuration could not be exported...."; message = msg; } m_ready = false; stopAdvConfigWritting(); } void OathPage::advUpdateResults(bool written, const QString &msg) { int row = 0; ui->advResultsWidget->insertRow(row); //Sr. No.... QTableWidgetItem *srnoItem = new QTableWidgetItem( tr("%1").arg(ui->advResultsWidget->rowCount())); if(written) { srnoItem->setIcon(QIcon(QPixmap(tr(":/res/images/tick.png")))); } else { srnoItem->setIcon(QIcon(QPixmap(tr(":/res/images/cross.png")))); } srnoItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->advResultsWidget->setItem(row, 0, srnoItem); //Public ID... QString pubIdTxt; if(ui->advPubIdCheck->isChecked() && m_ykConfig != 0) { pubIdTxt = ui->advOMPTxt->text() + ui->advTTTxt->text() + ui->advMUITxt->text().replace(QRegExp("\\s"), QString("")); } else { pubIdTxt = NA; } QTableWidgetItem *idItem = new QTableWidgetItem( tr("%1").arg(pubIdTxt)); idItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->advResultsWidget->setItem(row, 1, idItem); //Status... QTableWidgetItem *statusItem = new QTableWidgetItem( tr("%1").arg(msg)); statusItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->advResultsWidget->setItem(row, 2, statusItem); //Timestamp... QDateTime timstamp = QDateTime::currentDateTime(); QTableWidgetItem *timeItem = new QTableWidgetItem( tr("%1").arg(timstamp.toString(Qt::SystemLocaleShortDate))); timeItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->advResultsWidget->setItem(row, 3, timeItem); ui->advResultsWidget->resizeColumnsToContents(); ui->advResultsWidget->resizeRowsToContents(); } void OathPage::hotpLen_clicked() { QSettings settings; QRadioButton *button = ui->advHotpLen8Radio; QRadioButton *button2 = ui->quickHotpLen8Radio; if(m_currentPage == Page_Quick) { button = ui->quickHotpLen8Radio; button2 = ui->advHotpLen8Radio; } if(button->isChecked()) { settings.setValue(SG_OATH_HOTP8, true); } else { settings.setValue(SG_OATH_HOTP8, false); } button2->toggle(); } void OathPage::setCurrentSlot(int slot) { if(m_currentPage == Page_Advanced) { ui->advConfigSlot1Radio->setChecked(slot == 1); ui->advConfigSlot2Radio->setChecked(slot == 2); } else if(m_currentPage == Page_Quick) { ui->quickConfigSlot1Radio->setChecked(slot == 1); ui->quickConfigSlot2Radio->setChecked(slot == 2); } } yubikey-personalization-gui-3.1.23/src/ui/mainwindow.ui0000664000175000017500000010307412603205714021656 0ustar klasklas MainWindow Qt::ApplicationModal true 0 0 900 700 0 0 900 710 0 0 YubiKey Personalization Tool :/res/win/Yubico.ico:/res/win/Yubico.ico font: 11px "Verdana"; color: rgb(0, 0, 0); 900 710 300 200 730 33 170 677 0 0 170 677 font: 11px "Verdana"; background-color: rgb(255, 255, 255); 0 0 3 677 0 0 3 677 Qt::Vertical 20 40 128 128 Qt::ActionsContextMenu Qt::AlignCenter 10 260 151 16 10 240 151 16 font-weight: bold; Firmware Version: 10 5 151 30 font-weight: bold; color: rgb(221, 97, 99); Qt::AlignCenter 8 380 155 200 font-weight: bold; background-color: rgb(255, 255, 255); Features Supported Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop false false 5 45 121 16 font-weight: normal; 2 2 Configurations 5 65 121 16 font-weight: normal; 2 OATH-HOTP 5 125 121 16 font-weight: normal; 2 Challenge-Response 128 45 21 16 font-weight: normal; N/A Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 128 65 21 16 font-weight: normal; N/A Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 128 125 21 16 font-weight: normal; N/A Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 128 85 21 16 font-weight: normal; N/A Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 5 85 121 16 font-weight: normal; 2 Static Password 5 25 121 16 font-weight: normal; 2 Yubico OTP 128 25 21 16 font-weight: normal; N/A Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 128 105 21 16 font-weight: normal; N/A Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 5 105 121 16 font-weight: normal; 2 Scan Code Mode 5 145 121 16 font-weight: normal; 2 Updatable 128 145 21 16 font-weight: normal; N/A Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 5 165 121 16 font-weight: normal; 2 Ndef 128 165 21 16 font-weight: normal; N/A Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 5 185 121 16 font-weight: normal; 2 Universal 2nd Factor 128 185 21 16 font-weight: normal; N/A Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 5 600 160 60 Qt::ActionsContextMenu font-weight: normal; :/res/images/logo.png false Qt::AlignCenter 0 8 275 155 105 font-weight: bold; background-color: rgb(255, 255, 255); Serial Number Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop false false 128 50 20 20 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/blank.png); border-radius: 2px; false false 55 50 70 20 font-weight: normal; Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse 55 25 70 20 font-weight: normal; Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse 128 25 20 20 0 0 PointingHandCursor Qt::DefaultContextMenu false Qt::LeftToRight false background-image: url(:/res/images/blank.png); border-radius: 2px; false false false 55 75 70 20 font-weight: normal; Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse 128 75 20 20 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/blank.png); border-radius: 2px; false false 5 25 50 20 font-weight: normal; Dec: 5 50 50 20 font-weight: normal; Hex: 5 75 50 20 font-weight: normal; Modhex: 10 200 151 16 font-weight: bold; Programming status: 10 220 151 16 0 60 725 650 0 0 730 650 0 30 900 3 0 0 900 3 false background-color: rgb(140, 192, 65); QFrame::Sunken 1 Qt::Horizontal 0 0 900 30 900 30 font: 13px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); background-color: rgb(255, 255, 255); border-color: rgb(140, 192, 65); selection-color: rgb(0, 0, 0); 10 4 95 23 background-color: rgb(255, 255, 255); border: 2px groove rgb(255, 255, 255); border-radius: 5px; Yubico OTP true false false 535 4 75 23 background-color: rgb(255, 255, 255); border: 2px groove rgb(255, 255, 255); border-radius: 5px; Settings false false false 115 4 100 23 background-color: rgb(255, 255, 255); border: 2px groove rgb(255, 255, 255); border-radius: 5px; OATH-HOTP true false false 225 4 130 23 background-color: rgb(255, 255, 255); border: 2px groove rgb(255, 255, 255); border-radius: 5px; Static Password true false false 365 4 160 23 background-color: rgb(255, 255, 255); border: 2px groove rgb(255, 255, 255); border-radius: 5px; Challenge-Response true false false 680 4 60 23 background-color: rgb(255, 255, 255); border: 2px groove rgb(255, 255, 255); border-radius: 5px; About false false false 620 4 50 23 background-color: rgb(255, 255, 255); border: 2px groove rgb(255, 255, 255); border-radius: 5px; Tools false false false 750 4 45 23 background-color: rgb(255, 255, 255); border: 2px groove rgb(255, 255, 255); border-radius: 5px; Exit false false false 0 33 725 27 10 5 16 16 16 16 Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 30 5 691 16 Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter otpMenuBtn oathHotpMenuBtn staticMenuBtn chalRespMenuBtn settingsMenuBtn toolsMenuBtn aboutMenuBtn serialNoDecCopyBtn serialNoHexCopyBtn serialNoModhexCopyBtn yubikey-personalization-gui-3.1.23/src/ui/mainwindow.h0000664000175000017500000000567412603205714021477 0ustar klasklas/* Copyright (C) 2011-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include "qtimer.h" class ToolPage; class OtpPage; class OathPage; class StaticPage; class ChalRespPage; class SettingPage; class AboutPage; class Diagnostics; class HelpBox; class QStackedWidget; namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); enum Page { Page_Otp, Page_Oath, Page_Static, Page_ChalResp, Page_Settings, Page_Tools, Page_About }; private: Ui::MainWindow *ui; int m_currentPage; OtpPage *m_otpPage; OathPage *m_oathPage; StaticPage *m_staticPage; ChalRespPage *m_chalRespPage; SettingPage *m_settingPage; ToolPage *m_toolPage; AboutPage *m_aboutPage; Diagnostics *m_diagnostics; HelpBox *m_help; QTimer *m_timer; QAction *animationAction; QAction *diagnosticsAction; void createPages(); private slots: void setCurrentPage(int pageIndex, int tab = 0, int slot = 0); // Device Widget void resetDeviceInfo(); void keyFound(bool found, bool* featuresMatrix, int error); // Status Widget void showStatusMessage(const QString &text, int status = 1); void clearStatusMessage(); void copyToClipboard(const QString &str); void on_serialNoDecCopyBtn_clicked(); void on_serialNoHexCopyBtn_clicked(); void on_serialNoModhexCopyBtn_clicked(); void toggleAnimation(bool checked); void triggerDiagnostics(); void triggerHelp(int index); void aboutToQuit(); }; #endif // MAINWINDOW_H yubikey-personalization-gui-3.1.23/src/ui/mainwindow.cpp0000664000175000017500000005620412603205714022025 0ustar klasklas/* Copyright (C) 2011-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "ui/mainwindow.h" #include "ui/ui_mainwindow.h" #include "yubikeyfinder.h" #include "yubikeywriter.h" #include "yubikeyutil.h" #include "yubikeylogger.h" #include "ui/otppage.h" #include "ui/oathpage.h" #include "ui/staticpage.h" #include "ui/chalresppage.h" #include "ui/toolpage.h" #include "ui/settingpage.h" #include "ui/aboutpage.h" #include "ui/diagnostics.h" #include "ui/helpbox.h" #include #include #include #include #include #include #include #include "common.h" #include "version.h" #define TICKMAP QPixmap(":/res/images/tick.png") #define CROSSMAP QPixmap(":/res/images/cross.png") #define BLANKMAP QPixmap(":/res/images/blank.png") #define COPYMAP QPixmap(":/res/images/clipboard.png") MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); setFixedSize(900, 710); m_timer = 0; //Create pages createPages(); //Connect other signals and slots connect(ui->exitMenuBtn, SIGNAL(clicked()), qApp, SLOT(quit())); connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(aboutToQuit())); connect(YubiKeyFinder::getInstance(), SIGNAL(keyFound(bool, bool*, int)), this, SLOT(keyFound(bool, bool*, int))); connect(YubiKeyWriter::getInstance(), SIGNAL(errorOccurred(QString)), this, SLOT(showStatusMessage(QString))); connect(m_otpPage, SIGNAL(showStatusMessage(const QString &,int)), this, SLOT(showStatusMessage(const QString &,int))); connect(m_oathPage, SIGNAL(showStatusMessage(const QString &,int)), this, SLOT(showStatusMessage(const QString &,int))); connect(m_staticPage, SIGNAL(showStatusMessage(const QString &,int)), this, SLOT(showStatusMessage(const QString &,int))); connect(m_chalRespPage, SIGNAL(showStatusMessage(const QString &,int)), this, SLOT(showStatusMessage(const QString &,int))); connect(m_settingPage, SIGNAL(showStatusMessage(const QString &,int)), this, SLOT(showStatusMessage(const QString &,int))); connect(m_toolPage, SIGNAL(showStatusMessage(const QString &,int)), this, SLOT(showStatusMessage(const QString &,int))); connect(m_aboutPage, SIGNAL(changePage(int)), this, SLOT(setCurrentPage(int))); connect(m_otpPage, SIGNAL(showHelp(int)), this, SLOT(triggerHelp(int))); connect(m_oathPage, SIGNAL(showHelp(int)), this, SLOT(triggerHelp(int))); connect(m_staticPage, SIGNAL(showHelp(int)), this, SLOT(triggerHelp(int))); connect(m_chalRespPage, SIGNAL(showHelp(int)), this, SLOT(triggerHelp(int))); connect(m_settingPage, SIGNAL(showHelp(int)), this, SLOT(triggerHelp(int))); connect(m_toolPage, SIGNAL(showHelp(int)), this, SLOT(triggerHelp(int))); connect(m_settingPage, SIGNAL(settingsChanged()), m_otpPage, SLOT(loadSettings())); connect(m_settingPage, SIGNAL(settingsChanged()), m_oathPage, SLOT(loadSettings())); connect(m_settingPage, SIGNAL(settingsChanged()), m_chalRespPage, SLOT(loadSettings())); connect(m_settingPage, SIGNAL(settingsChanged()), m_staticPage, SLOT(loadSettings())); connect(m_settingPage, SIGNAL(settingsChanged()), m_toolPage, SLOT(loadSettings())); connect(m_toolPage, SIGNAL(reloadSettings()), m_settingPage, SLOT(reloadSettings())); connect(m_toolPage, SIGNAL(switchPage(int, int, int)), this, SLOT(setCurrentPage(int, int, int))); //Intialize settings m_settingPage->init(); //Start YubiKey finder YubiKeyFinder::getInstance()->start(); // add action for toggling animation animationAction = new QAction(this); animationAction->setText("Device image animated"); animationAction->setCheckable(true); connect(animationAction, SIGNAL(triggered(bool)), this, SLOT(toggleAnimation(bool))); ui->deviceImage->addAction(animationAction); // add action for diagnostics diagnosticsAction = new QAction(this); diagnosticsAction->setText("Show detailed diagnostics"); connect(diagnosticsAction, SIGNAL(triggered()), this, SLOT(triggerDiagnostics())); ui->logoImg->addAction(diagnosticsAction); QSettings settings; if(settings.value(SG_ANIMATIONS_PREFERENCE, true).toBool()) { animationAction->setChecked(true); } else { animationAction->setChecked(false); } } MainWindow::~MainWindow() { if (m_timer != 0) { delete m_timer; } delete m_otpPage; delete m_oathPage; delete m_staticPage; delete m_chalRespPage; delete m_settingPage; delete m_toolPage; delete m_aboutPage; delete m_diagnostics; delete m_help; delete animationAction; delete diagnosticsAction; delete ui; } /* Menu Widget handling */ void MainWindow::createPages() { //Create pages m_otpPage = new OtpPage(this); m_oathPage = new OathPage(this); m_staticPage = new StaticPage(this); m_chalRespPage = new ChalRespPage(this); m_settingPage = new SettingPage(this); m_toolPage = new ToolPage(this); m_aboutPage = new AboutPage(this); m_diagnostics = new Diagnostics(this); m_help = new HelpBox(this); //Add pages to the pages widget ui->pagesWidget->addWidget(m_otpPage); ui->pagesWidget->addWidget(m_oathPage); ui->pagesWidget->addWidget(m_staticPage); ui->pagesWidget->addWidget(m_chalRespPage); ui->pagesWidget->addWidget(m_settingPage); ui->pagesWidget->addWidget(m_toolPage); ui->pagesWidget->addWidget(m_aboutPage); //Map the values of menu buttons with the indexes of the pages widget //Create a QMapper QSignalMapper *mapper = new QSignalMapper(this); //Connect the clicked signal with the QSignalMapper connect(ui->otpMenuBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->oathHotpMenuBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->staticMenuBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->chalRespMenuBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->settingsMenuBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->toolsMenuBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->aboutMenuBtn, SIGNAL(clicked()), mapper, SLOT(map())); //Set a value for each button mapper->setMapping(ui->otpMenuBtn, Page_Otp); mapper->setMapping(ui->oathHotpMenuBtn, Page_Oath); mapper->setMapping(ui->staticMenuBtn, Page_Static); mapper->setMapping(ui->chalRespMenuBtn, Page_ChalResp); mapper->setMapping(ui->settingsMenuBtn, Page_Settings); mapper->setMapping(ui->toolsMenuBtn, Page_Tools); mapper->setMapping(ui->aboutMenuBtn, Page_About); //Connect the mapper to the pages widget //The mapper will set a value to each button and set that value to //the pages widget //connect(mapper, SIGNAL(mapped(int)), ui->pagesWidget, SLOT(setCurrentIndex(int))); connect(mapper, SIGNAL(mapped(int)), this, SLOT(setCurrentPage(int))); //Set the current page m_currentPage = 0; setCurrentPage(Page_About); } void MainWindow::setCurrentPage(int pageIndex, int tab, int slot) { // Page changed... // Clear status message clearStatusMessage(); // Toggle menu buttons QString disabledMenuBtnSS = QString::fromUtf8(SS_MENU_DISABLED); QString checkedMenuBtnSS = QString::fromUtf8(SS_MENU_CHECKED); QString uncheckedMenuBtnSS = QString::fromUtf8(SS_MENU_UNCHECKED); switch(m_currentPage){ case Page_Otp: ui->otpMenuBtn->setStyleSheet(uncheckedMenuBtnSS); break; case Page_Oath: if(m_oathPage->isEnabled()) { ui->oathHotpMenuBtn->setStyleSheet(uncheckedMenuBtnSS); } else { ui->oathHotpMenuBtn->setStyleSheet(disabledMenuBtnSS); } break; case Page_Static: if(m_staticPage->isEnabled()) { ui->staticMenuBtn->setStyleSheet(uncheckedMenuBtnSS); } else { ui->staticMenuBtn->setStyleSheet(disabledMenuBtnSS); } break; case Page_ChalResp: if(m_chalRespPage->isEnabled()) { ui->chalRespMenuBtn->setStyleSheet(uncheckedMenuBtnSS); } else { ui->chalRespMenuBtn->setStyleSheet(disabledMenuBtnSS); } break; case Page_Settings: ui->settingsMenuBtn->setStyleSheet(uncheckedMenuBtnSS); break; case Page_Tools: ui->toolsMenuBtn->setStyleSheet(uncheckedMenuBtnSS); break; case Page_About: ui->aboutMenuBtn->setStyleSheet(uncheckedMenuBtnSS); break; } switch(pageIndex){ case Page_Otp: ui->otpMenuBtn->setStyleSheet(checkedMenuBtnSS); if(tab) m_otpPage->setCurrentPage(tab); if(slot) m_otpPage->setCurrentSlot(slot); break; case Page_Oath: ui->oathHotpMenuBtn->setStyleSheet(checkedMenuBtnSS); if(tab) m_oathPage->setCurrentPage(tab); if(slot) m_oathPage->setCurrentSlot(slot); break; case Page_Static: ui->staticMenuBtn->setStyleSheet(checkedMenuBtnSS); if(tab) m_staticPage->setCurrentPage(tab); if(slot) m_staticPage->setCurrentSlot(slot); break; case Page_ChalResp: ui->chalRespMenuBtn->setStyleSheet(checkedMenuBtnSS); if(tab) m_chalRespPage->setCurrentPage(tab); if(slot) m_chalRespPage->setCurrentSlot(slot); break; case Page_Settings: ui->settingsMenuBtn->setStyleSheet(checkedMenuBtnSS); if(tab) m_settingPage->setCurrentPage(tab); break; case Page_Tools: ui->toolsMenuBtn->setStyleSheet(checkedMenuBtnSS); if(tab) m_toolPage->setCurrentPage(tab); break; case Page_About: ui->aboutMenuBtn->setStyleSheet(checkedMenuBtnSS); break; } m_currentPage = pageIndex; ui->pagesWidget->setCurrentIndex(pageIndex); } /* Device Widget handling */ void MainWindow::resetDeviceInfo() { ui->statusLbl->clear(); ui->versionLbl->setText(tr(NA)); QString blankBtnSS = QString::fromUtf8(SS_BLANK_BTN); ui->serialNoDecLbl->setText(tr(NA)); ui->serialNoHexLbl->setText(tr(NA)); ui->serialNoModhexLbl->setText(tr(NA)); ui->serialNoDecCopyBtn->setStyleSheet(blankBtnSS); ui->serialNoHexCopyBtn->setStyleSheet(blankBtnSS); ui->serialNoModhexCopyBtn->setStyleSheet(blankBtnSS); ui->otpSupportLbl->setPixmap(QPixmap()); ui->otpSupportLbl->setText(tr(NA)); ui->multiConfigSupportLbl->setPixmap(QPixmap()); ui->multiConfigSupportLbl->setText(tr(NA)); ui->oathHotpSupportLbl->setPixmap(QPixmap()); ui->oathHotpSupportLbl->setText(tr(NA)); ui->staticPwdSupportLbl->setPixmap(QPixmap()); ui->staticPwdSupportLbl->setText(tr(NA)); ui->scanCodeSupportLbl->setPixmap(QPixmap()); ui->scanCodeSupportLbl->setText(tr(NA)); ui->chalRespSupportLbl->setPixmap(QPixmap()); ui->chalRespSupportLbl->setText(tr(NA)); ui->updatableSupportLbl->setPixmap(QPixmap()); ui->updatableSupportLbl->setText(tr(NA)); ui->ndefSupportLbl->setPixmap(QPixmap()); ui->ndefSupportLbl->setText(tr(NA)); ui->u2fSupportLbl->setPixmap(QPixmap()); ui->u2fSupportLbl->setText(tr(NA)); } void MainWindow::keyFound(bool found, bool* featuresMatrix, int error) { QString disabledMenuBtnSS = QString::fromUtf8(SS_MENU_DISABLED); QString checkedMenuBtnSS = QString::fromUtf8(SS_MENU_CHECKED); QString uncheckedMenuBtnSS = QString::fromUtf8(SS_MENU_UNCHECKED); QString copyBtnSS = QString::fromUtf8(SS_COPY_BTN); QString blankBtnSS = QString::fromUtf8(SS_BLANK_BTN); resetDeviceInfo(); if(ui->deviceImage->movie()) { delete(ui->deviceImage->movie()); ui->deviceImage->setMovie(NULL); } if(found) { YubiKeyFinder *finder = YubiKeyFinder::getInstance(); int touchLevel = finder->touchLevel(); qDebug() << "touchLevel is " << touchLevel; if(touchLevel & CONFIG1_VALID && touchLevel & CONFIG2_VALID) { ui->programLbl->setText(tr("Slot 1 and 2 configured")); } else if(touchLevel & CONFIG1_VALID) { ui->programLbl->setText(tr("Slot 1 configured")); } else if(touchLevel & CONFIG2_VALID) { ui->programLbl->setText(tr("Slot 2 configured")); } else { ui->programLbl->setText(tr("Not configured")); } unsigned int version = finder->version(); if(error == ERR_UNKNOWN_FIRMWARE) { ui->statusLbl->setStyleSheet(QString::fromUtf8(SS_YKSTATUS_ERROR)); ui->statusLbl->setText(tr(UNKNOWN_FIRMWARE)); } else { ui->statusLbl->setStyleSheet(QString::fromUtf8(SS_YKSTATUS_SUCCESS)); ui->statusLbl->setText(tr(KEY_FOUND)); } ui->versionLbl->setText(finder->versionStr()); qDebug() << "version is" << finder->versionStr(); QPixmap pixmap; QMovie *movie = new QMovie(); if(version < YK_VERSION(2,0,0)) { pixmap.load(":/res/images/v1-3-not-animated.png"); } else if(version < YK_VERSION(2,1,4)) { movie->setFileName(":/res/images/V2-0-2-1-animated.mng"); } else if(version < YK_VERSION(2,2,0)) { // NEO Beta pixmap.load(":/res/images/neo_transparent.png"); } else if(version % 10 == 9){ pixmap.load(":/res/images/yubikey_devel.png"); } else if(version < YK_VERSION(2,3,0)){ movie->setFileName(":/res/images/v2-2-animated.mng"); } else if(version < YK_VERSION(3,0,0)){ movie->setFileName(":/res/images/v2-3-animated.mng"); } else if(version < YK_VERSION(3,3,0)){ pixmap.load(":/res/images/neo_production.png"); } else if(version < YK_VERSION(4,0,0)) { movie->setFileName(":/res/images/neo_production_33.mng"); } else if(version < YK_VERSION(4,1,0)) { movie->setFileName(":/res/images/plus.mng"); } else if(version < YK_VERSION(4,3,0)) { movie->setFileName(":/res/images/edge.mng"); } else { pixmap.load(":/res/images/blank.png"); } if(pixmap.isNull()) { ui->deviceImage->setMovie(movie); movie->start(); if(!animationAction->isChecked()) { movie->stop(); } } else { delete movie; ui->deviceImage->setPixmap(pixmap); } unsigned int serial = 0; if(featuresMatrix[YubiKeyFinder::Feature_SerialNumber]) { serial = YubiKeyFinder::getInstance()->serial(); } if(serial != 0) { ui->serialNoDecLbl->setText(QString::number(serial)); //Convert serial number in hex and modhex unsigned char buf[16]; memset(buf, 0, sizeof(buf)); size_t bufLen = 0; QString tmp = QString::number(serial, 16); size_t len = tmp.length(); if(len % 2 != 0) { len++; } YubiKeyUtil::qstrClean(&tmp, (size_t)len, true); YubiKeyUtil::qstrHexDecode(buf, &bufLen, tmp); QString hex = YubiKeyUtil::qstrHexEncode(buf, bufLen); QString modhex = YubiKeyUtil::qstrModhexEncode(buf, bufLen); ui->serialNoHexLbl->setText(hex); ui->serialNoModhexLbl->setText(modhex); ui->serialNoDecCopyBtn->setStyleSheet(copyBtnSS); ui->serialNoHexCopyBtn->setStyleSheet(copyBtnSS); ui->serialNoModhexCopyBtn->setStyleSheet(copyBtnSS); } else { ui->serialNoDecLbl->setText(tr(NA)); ui->serialNoHexLbl->setText(tr(NA)); ui->serialNoModhexLbl->setText(tr(NA)); ui->serialNoDecCopyBtn->setStyleSheet(blankBtnSS); ui->serialNoHexCopyBtn->setStyleSheet(blankBtnSS); ui->serialNoModhexCopyBtn->setStyleSheet(blankBtnSS); } ui->otpSupportLbl->setPixmap(TICKMAP); if(featuresMatrix[YubiKeyFinder::Feature_MultipleConfigurations]) { ui->multiConfigSupportLbl->setPixmap(TICKMAP); } else { ui->multiConfigSupportLbl->setPixmap(CROSSMAP); } if(featuresMatrix[YubiKeyFinder::Feature_OathHotp]) { ui->oathHotpSupportLbl->setPixmap(TICKMAP); if(m_currentPage == Page_Oath) { ui->oathHotpMenuBtn->setStyleSheet(checkedMenuBtnSS); } else { ui->oathHotpMenuBtn->setStyleSheet(uncheckedMenuBtnSS); } ui->oathHotpMenuBtn->setEnabled(true); } else { ui->oathHotpSupportLbl->setPixmap(CROSSMAP); ui->oathHotpMenuBtn->setStyleSheet(disabledMenuBtnSS); ui->oathHotpMenuBtn->setEnabled(false); } if(featuresMatrix[YubiKeyFinder::Feature_StaticPassword]) { ui->staticPwdSupportLbl->setPixmap(TICKMAP); if(m_currentPage == Page_Static) { ui->staticMenuBtn->setStyleSheet(checkedMenuBtnSS); } else { ui->staticMenuBtn->setStyleSheet(uncheckedMenuBtnSS); } ui->staticMenuBtn->setEnabled(true); } else { ui->staticPwdSupportLbl->setPixmap(CROSSMAP); ui->staticMenuBtn->setStyleSheet(disabledMenuBtnSS); ui->staticMenuBtn->setEnabled(false); } if(featuresMatrix[YubiKeyFinder::Feature_ScanCodeMode]) { ui->scanCodeSupportLbl->setPixmap(TICKMAP); } else { ui->scanCodeSupportLbl->setPixmap(CROSSMAP); } if(featuresMatrix[YubiKeyFinder::Feature_ChallengeResponse]) { ui->chalRespSupportLbl->setPixmap(TICKMAP); if(m_currentPage == Page_ChalResp) { ui->chalRespMenuBtn->setStyleSheet(checkedMenuBtnSS); } else { ui->chalRespMenuBtn->setStyleSheet(uncheckedMenuBtnSS); } ui->chalRespMenuBtn->setEnabled(true); } else { ui->chalRespSupportLbl->setPixmap(CROSSMAP); ui->chalRespMenuBtn->setStyleSheet(disabledMenuBtnSS); ui->chalRespMenuBtn->setEnabled(false); } if(featuresMatrix[YubiKeyFinder::Feature_Updatable]) { ui->updatableSupportLbl->setPixmap(TICKMAP); } else { ui->updatableSupportLbl->setPixmap(CROSSMAP); } if(featuresMatrix[YubiKeyFinder::Feature_Ndef]) { ui->ndefSupportLbl->setPixmap(TICKMAP); } else { ui->ndefSupportLbl->setPixmap(CROSSMAP); } if(featuresMatrix[YubiKeyFinder::Feature_U2F]) { ui->u2fSupportLbl->setPixmap(TICKMAP); } else { ui->u2fSupportLbl->setPixmap(CROSSMAP); } } else { ui->programLbl->clear(); if(ui->deviceImage->pixmap()) { ui->deviceImage->setPixmap(QPixmap()); } ui->deviceImage->clear(); if(error == ERR_NOKEY) { ui->statusLbl->setText(tr(NO_KEY_FOUND)); } else if(error == ERR_MORETHANONE) { ui->statusLbl->setText(tr(MORE_THAN_ONE)); } else { ui->statusLbl->setText(tr(OTHER_ERROR)); } ui->statusLbl->setStyleSheet(QString::fromUtf8(SS_YKSTATUS_ERROR)); if(m_currentPage == Page_Oath) { ui->oathHotpMenuBtn->setStyleSheet(checkedMenuBtnSS); } else { ui->oathHotpMenuBtn->setStyleSheet(uncheckedMenuBtnSS); } ui->oathHotpMenuBtn->setEnabled(true); if(m_currentPage == Page_Static) { ui->staticMenuBtn->setStyleSheet(checkedMenuBtnSS); } else { ui->staticMenuBtn->setStyleSheet(uncheckedMenuBtnSS); } ui->staticMenuBtn->setEnabled(true); if(m_currentPage == Page_ChalResp) { ui->chalRespMenuBtn->setStyleSheet(checkedMenuBtnSS); } else { ui->chalRespMenuBtn->setStyleSheet(uncheckedMenuBtnSS); } ui->chalRespMenuBtn->setEnabled(true); } } /* Status Widget handling */ void MainWindow::showStatusMessage(const QString &text, int status) { qDebug() << "status: " << status << "\n"; if(status == -1) { clearStatusMessage(); } QString statuSS; switch(status) { case 0: ui->statusIconLbl->setPixmap(TICKMAP); statuSS = QString::fromUtf8(SS_STATUS_SUCCESS); break; case 1: ui->statusIconLbl->setPixmap(CROSSMAP); statuSS = QString::fromUtf8(SS_STATUS_ERROR); break; } ui->statusMsgLbl->setStyleSheet(statuSS); ui->statusMsgLbl->setText(text); if (m_timer != 0) { delete m_timer; m_timer = 0; } m_timer = new QTimer(this); connect(m_timer, SIGNAL(timeout()), this, SLOT(clearStatusMessage())); m_timer->start(TIMEOUT_STATUS); } void MainWindow::clearStatusMessage() { if (m_timer != 0) { delete m_timer; m_timer = 0; } ui->statusIconLbl->clear(); ui->statusMsgLbl->clear(); } void MainWindow::copyToClipboard(const QString &str) { QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(str); showStatusMessage(tr(VALUE_COPIED), 0); } void MainWindow::on_serialNoDecCopyBtn_clicked() { copyToClipboard(ui->serialNoDecLbl->text()); } void MainWindow::on_serialNoHexCopyBtn_clicked() { copyToClipboard(ui->serialNoHexLbl->text()); } void MainWindow::on_serialNoModhexCopyBtn_clicked() { copyToClipboard(ui->serialNoModhexLbl->text()); } void MainWindow::toggleAnimation(bool checked) { QSettings settings; settings.setValue(SG_ANIMATIONS_PREFERENCE, checked); animationAction->setChecked(checked); if(ui->deviceImage->movie()) { if(checked) { ui->deviceImage->movie()->start(); } else { ui->deviceImage->movie()->stop(); } } } void MainWindow::triggerDiagnostics() { m_diagnostics->show(); } void MainWindow::triggerHelp(int index) { m_help->setHelpIndex((HelpBox::Help)index); m_help->show(); } void MainWindow::aboutToQuit() { YubiKeyLogger::closeLogFile(); } yubikey-personalization-gui-3.1.23/src/ui/helpbox.ui0000664000175000017500000000742112603205714021142 0ustar klasklas HelpBox Qt::NonModal 0 0 500 260 0 0 500 100 500 260 Help - YubiKey font: 11px "Verdana"; color: rgb(0, 0, 0); false 10 10 481 241 false font: 11px "Verdana"; QFrame::NoFrame QFrame::Plain QTextEdit::AutoBulletList false <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> true Qt::Horizontal QDialogButtonBox::Close buttonBox rejected() HelpBox reject() 316 260 286 274 buttonBox accepted() HelpBox accept() 248 254 157 274 yubikey-personalization-gui-3.1.23/src/ui/helpbox.h0000664000175000017500000000422412603205714020752 0ustar klasklas/* Copyright (C) 2011-2013 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef HELPBOX_H #define HELPBOX_H #include namespace Ui { class HelpBox; } class HelpBox : public QDialog { Q_OBJECT public: explicit HelpBox(QWidget *parent = 0); ~HelpBox(); enum Help { Help_ConfigurationSlot, Help_PublicID, Help_PrivateID, Help_SecretKey, Help_ParameterGeneration, Help_ConfigurationProtection, Help_OutputFormat, Help_OutputSpeed, Help_SrNoVisibility, Help_OathPublicID, Help_HotpLen, Help_HotpParam, Help_StaticScanCode, Help_ChalRespYubico, Help_ChalRespHmac, Help_ChalRespOption, Help_AllowUpdate, Help_Swap, Help_ManUpdate, Help_LogFormat, }; void setHelpIndex(Help helpIndex); private: Ui::HelpBox *ui; }; #endif // HELPBOX_H yubikey-personalization-gui-3.1.23/src/ui/helpbox.cpp0000664000175000017500000001077112603205714021311 0ustar klasklas/* Copyright (C) 2011-2013 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "ui/helpbox.h" #include "ui_helpbox.h" #include "common.h" #include "help.h" #include "yubikeylogger.h" HelpBox::HelpBox(QWidget *parent) : QDialog(parent), ui(new Ui::HelpBox) { ui->setupUi(this); } HelpBox::~HelpBox() { delete ui; } void HelpBox::setHelpIndex(Help helpIndex) { QString title; QString helpMsg; switch(helpIndex) { case Help_ConfigurationSlot: title = tr("Configuration Slots"); helpMsg = tr(HELP_CONFIG_SLOT); break; case Help_PublicID: title = tr("Public Identity"); helpMsg = tr(HELP_PUBLIC_ID); break; case Help_PrivateID: title = tr("Private Identity"); helpMsg = tr(HELP_PRIVATE_ID); break; case Help_SecretKey: title = tr("Secret Key"); helpMsg = tr(HELP_SECRET_KEY); break; case Help_ParameterGeneration: title = tr("Parameter Generation Scheme"); helpMsg = tr(HELP_PARAM_GENERATION); break; case Help_ConfigurationProtection: title = tr("Configuration Protection"); helpMsg = tr(HELP_CONFIG_PROTECTION); break; case Help_OutputFormat: title = tr("Output Format"); helpMsg = tr(HELP_OUTPUT_FORMAT); break; case Help_OutputSpeed: title = tr("Output Speed Throttling"); helpMsg = tr(HELP_OUTPUT_SPEED); break; case Help_SrNoVisibility: title = tr("Serial # Visibility"); helpMsg = tr(HELP_SR_NO_VISIBILITY); break; case Help_OathPublicID: title = tr("OATH Token Identifier"); helpMsg = tr(HELP_OATH_PUBLIC_ID); break; case Help_HotpLen: title = tr("HOTP Length"); helpMsg = tr(HELP_HOTP_LEN); break; case Help_HotpParam: title = tr("HOTP Moving Factor Seed"); helpMsg = tr(HELP_HOTP_PARAM); break; case Help_StaticScanCode: title = tr("Static Password Scan Code Mode"); helpMsg = tr(HELP_STATIC_SCAN_CODE); break; case Help_ChalRespYubico: title = tr("Challenge-Response Yubico OTP Mode"); helpMsg = tr(HELP_CHALRESP_YUBICO); break; case Help_ChalRespHmac: title = tr("Challenge-Response HMAC-SHA1 Mode"); helpMsg = tr(HELP_CHALRESP_HMAC); break; case Help_ChalRespOption: title = tr("Challenge-Response Options"); helpMsg = tr(HELP_CHALRESP_OPTION); break; case Help_AllowUpdate: title = tr("Allow Update"); helpMsg = tr(HELP_ALLOW_UPDATE_OPTION); break; case Help_Swap: title = tr("Swap"); helpMsg = tr(HELP_SWAP_OPTION); break; case Help_ManUpdate: title = tr("Manual Update"); helpMsg = tr(HELP_MAN_UPDATE_OPTION); break; case Help_LogFormat: { title = tr("Flexible Log Format"); helpMsg = tr(HELP_LOG_FORMAT); QStringList names = YubiKeyLogger::getLogNames(); helpMsg.append(names.join(", ")); helpMsg.append("

"); } break; default: helpMsg = tr(""); } this->setWindowTitle(tr("Help: %1").arg(title)); ui->helpTxtBrowser->setText(helpMsg); } yubikey-personalization-gui-3.1.23/src/ui/diagnostics.ui0000664000175000017500000000765112603205714022015 0ustar klasklas Diagnostics Qt::NonModal 0 0 500 260 0 0 500 100 500 260 YubiKey Diagnostics font: 11px "Verdana"; color: rgb(0, 0, 0); false 10 10 481 241 false font: 11px "Verdana"; QFrame::NoFrame QFrame::Plain QTextEdit::AutoBulletList false <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Verdana'; font-size:11px; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> true Qt::Horizontal QDialogButtonBox::Close|QDialogButtonBox::Reset true buttonBox rejected() Diagnostics reject() 316 260 286 274 buttonBox accepted() Diagnostics accept() 248 254 157 274 yubikey-personalization-gui-3.1.23/src/ui/diagnostics.h0000664000175000017500000000337512603205714021626 0ustar klasklas/* Copyright (C) 2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef DIAGNOSTICS_H #define DIAGNOSTICS_H #include #include namespace Ui { class Diagnostics; } class Diagnostics : public QDialog { Q_OBJECT public: explicit Diagnostics(QWidget *parent = 0); ~Diagnostics(); private: Ui::Diagnostics *ui; QString osVersion(); void setup(); private slots: void addDiagnostic(QString text); void clicked(QAbstractButton *button); }; #endif // DIAGNOSTICS_H yubikey-personalization-gui-3.1.23/src/ui/diagnostics.cpp0000664000175000017500000001024612603205714022154 0ustar klasklas/* Copyright (C) 2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "ui/diagnostics.h" #include "ui_diagnostics.h" #include "yubikeywriter.h" #include "yubikeyfinder.h" #include "version.h" #include #include #include Diagnostics::Diagnostics(QWidget *parent) : QDialog(parent), ui(new Ui::Diagnostics) { ui->setupUi(this); ui->txtBrowser->clear(); connect(YubiKeyWriter::getInstance(), SIGNAL(errorOccurred(QString)), this, SLOT(addDiagnostic(QString))); connect(YubiKeyWriter::getInstance(), SIGNAL(diagnostics(QString)), this, SLOT(addDiagnostic(QString))); connect(YubiKeyFinder::getInstance(), SIGNAL(errorOccurred(QString)), this, SLOT(addDiagnostic(QString))); connect(YubiKeyFinder::getInstance(), SIGNAL(diagnostics(QString)), this, SLOT(addDiagnostic(QString))); connect(ui->buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(clicked(QAbstractButton*))); setup(); } Diagnostics::~Diagnostics() { delete ui; } void Diagnostics::addDiagnostic(QString text) { QDateTime ts = QDateTime::currentDateTime(); ui->txtBrowser->append(ts.toString("yyyy-MM-ddThh:mm:ss; ") + text); } void Diagnostics::clicked(QAbstractButton *button) { if(ui->buttonBox->buttonRole(button) == QDialogButtonBox::ResetRole) { setup(); } } void Diagnostics::setup() { ui->txtBrowser->clear(); addDiagnostic(QString("App_version: %1; Lib_version: %2; QT_version: %3; OS_version: %4; Word_size: %5") .arg(VER_PRODUCTVERSION_STR, ykpers_check_version(NULL), qVersion(), osVersion(), QString::number(QSysInfo::WordSize))); } QString Diagnostics::osVersion() { #ifdef Q_OS_LINUX return "Linux"; #elif defined(Q_OS_MAC) QString mac = "OS X "; switch(QSysInfo::MacintoshVersion) { case QSysInfo::MV_LEOPARD: mac += "Leopard"; break; case QSysInfo::MV_SNOWLEOPARD: mac += "SnowLeopard"; break; case QSysInfo::MV_LION: mac += "Lion"; break; case QSysInfo::MV_MOUNTAINLION: mac += "MountainLion"; break; default: mac += "unknown"; break; } return mac; #elif defined(Q_OS_WIN32) QString win = "Windows "; switch(QSysInfo::WindowsVersion) { case QSysInfo::WV_2000: win += "2000"; break; case QSysInfo::WV_XP: win += "XP"; break; case QSysInfo::WV_2003: win += "2003"; break; case QSysInfo::WV_VISTA: win += "Vista"; break; case QSysInfo::WV_WINDOWS7: win += "7"; break; case QSysInfo::WV_WINDOWS8: win += "8"; break; default: win += "unknown"; break; } return win; #else return "Unknown OS"; #endif } yubikey-personalization-gui-3.1.23/src/ui/confirmbox.ui0000664000175000017500000001167612603205714021656 0ustar klasklas ConfirmBox Qt::ApplicationModal 0 0 530 190 0 0 530 190 530 190 Dialog font: 11px "Verdana"; color: rgb(0, 0, 0); QLayout::SetMinimumSize font-weight: normal; false Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop 0 QLayout::SetMinimumSize 0 0 430 0 430 500 Qt::LeftToRight true Qt::PlainText false Qt::AlignJustify|Qt::AlignTop true 0 font-weight: normal; Don't show this message again 0 0 Qt::Horizontal QDialogButtonBox::No|QDialogButtonBox::Yes true dontaskCheck buttonBox buttonBox accepted() ConfirmBox accept() 248 254 157 274 buttonBox rejected() ConfirmBox reject() 316 260 286 274 yubikey-personalization-gui-3.1.23/src/ui/confirmbox.h0000664000175000017500000000360412603205714021460 0ustar klasklas/* Copyright (C) 2011-2013 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef CONFIRMBOX_H #define CONFIRMBOX_H #include namespace Ui { class ConfirmBox; } class ConfirmBox : public QDialog { Q_OBJECT public: explicit ConfirmBox(QWidget *parent = 0); ~ConfirmBox(); enum Confirm { Confirm_ConfigurationSlot, Confirm_PublicID, Confirm_ConfigurationProtection, Confirm_NdefWithoutHttp, }; void setConfirmIndex(Confirm confirmIndex); private slots: void on_dontaskCheck_stateChanged(int state); private: Ui::ConfirmBox *ui; Confirm m_confirmIndex; }; #endif // CONFIRMBOX_H yubikey-personalization-gui-3.1.23/src/ui/confirmbox.cpp0000664000175000017500000000623612603205714022017 0ustar klasklas/* Copyright (C) 2011-2013 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "confirmbox.h" #include "ui_confirmbox.h" #include #include #include "common.h" ConfirmBox::ConfirmBox(QWidget *parent) : QDialog(parent), ui(new Ui::ConfirmBox) { ui->setupUi(this); } ConfirmBox::~ConfirmBox() { delete ui; } void ConfirmBox::setConfirmIndex(Confirm confirmIndex) { QString title; QString confirmMsg; switch(confirmIndex) { case Confirm_ConfigurationSlot: title = tr(OVERWRITE_CONF_SLOT1); confirmMsg = tr(WARN_OVERWRITE_CONF_SLOT1); break; case Confirm_PublicID: title = tr(DIFF_PUBLIC_ID_LEN); confirmMsg = tr(WARN_DIFF_PUBLIC_ID_LEN); break; case Confirm_ConfigurationProtection: title = tr(ENABLE_CONF_PROTECTION); confirmMsg = tr(WARN_ENABLE_CONF_PROTECTION); break; case Confirm_NdefWithoutHttp: title = tr(NDEF_WITHOUT_HTTP); confirmMsg = tr(WARN_NDEF_WITHOUT_HTTP); break; default: confirmMsg = tr(""); } m_confirmIndex = confirmIndex; this->setWindowTitle(tr("Confirm: %1").arg(title)); QPixmap question(QMessageBox::standardIcon(QMessageBox::Question)); ui->iconLbl->setPixmap(question); ui->msgLbl->setText(confirmMsg); } void ConfirmBox::on_dontaskCheck_stateChanged(int state) { bool checked = (state != 0); QSettings settings; switch(m_confirmIndex) { case Confirm_ConfigurationSlot: settings.setValue(SG_OVERWRITE_CONF_SLOT1, checked); break; case Confirm_PublicID: settings.setValue(SG_DIFF_PUBLIC_ID_LEN, checked); break; case Confirm_ConfigurationProtection: settings.setValue(SG_ENABLE_CONF_PROTECTION, checked); break; case Confirm_NdefWithoutHttp: settings.setValue(SG_NDEF_WITHOUT_HTTP, checked); break; } } yubikey-personalization-gui-3.1.23/src/ui/chalresppage.ui0000664000175000017500000014773312603205714022152 0ustar klasklas ChalRespPage 0 0 730 650 0 0 730 650 StackedWidget font: 11px "Verdana"; color: rgb(0, 0, 0); 2 10 0 710 22 font: 18px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); Program in Challenge-Response mode Qt::AlignCenter 10 50 710 171 border-color: rgb(0, 0, 0); Qt::AlignCenter 20 20 141 25 0 0 font: 12px; font-weight: bold; Yubico OTP false false false 20 100 141 25 font: 12px; font-weight: bold; HMAC-SHA1 false false false 20 45 671 20 Allows you to program one or more YubiKeys in "Yubico OTP" Challenge-Response mode Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 20 120 671 30 Allows you to program one or more YubiKeys in "HMAC-SHA1" Challenge-Response mode Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 170 24 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 170 104 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 0 710 22 font: 18px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); Program in Challenge-Response mode - Yubico OTP Qt::AlignCenter 10 132 350 107 font-weight: bold; Program Multiple YubiKeys true false 10 25 331 17 font-weight: normal; Automatically program YubiKeys when inserted 10 52 191 20 font-weight:normal; Parameter Generation Scheme Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 10 75 331 22 0 0 font-weight: normal; Increment Identities; Randomize Secret Randomize all parameters 325 52 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 50 711 72 font-weight: bold; Configuration Slot 10 25 321 16 font-weight: normal; color: rgb(118, 116, 108); Select the configuration slot to be programmed 10 45 151 19 font-weight: normal; Configuration Slot 1 true false 240 45 151 19 font-weight: normal; Configuration Slot 2 685 45 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 249 711 107 font-weight: bold; Yubico OTP Parameters 685 77 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 240 75 330 20 0 0 font-weight: normal; hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh; 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 47 47 580 73 100 24 font: 12px; font-weight: bold; Generate false false false 10 75 221 20 font-weight:normal; Secret Key (16 bytes Hex) 10 50 221 17 font-weight: normal; Private Identity (6 bytes Hex) 240 50 330 20 0 0 font-weight: normal; hh hh hh hh hh hh; 00 00 00 00 00 00 17 17 580 48 100 24 font: 12px; font-weight: bold; Generate false false false 685 52 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 25 221 17 font-weight: normal; Require user input (button press) 685 27 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 366 711 80 font-weight: bold; Actions 10 45 175 25 font: 12px; font-weight: bold; Write Configuration false false false false 200 45 85 25 font: 12px; font-weight: bold; Stop false false false 10 25 691 16 font-weight: normal; color: rgb(118, 116, 108) Press Write Configuration button to program your YubiKey's selected configuration slot 400 45 85 25 font: 12px; font-weight: bold; Back false false false false 300 45 85 25 font: 12px; font-weight: bold; Reset false false false 580 45 100 25 font: 12px; font-weight: bold; Export false false false 10 456 711 130 font-weight: bold; Results 12 20 688 100 font: 11px "Verdana"; color: rgb(0, 0, 0); Qt::ScrollBarAlwaysOn true false Qt::SolidLine true 0 3 50 false 20 # Status Timestamp 370 132 350 117 10 0 710 22 font: 18px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); Program in Challenge-Response mode - HMAC-SHA1 Qt::AlignCenter 10 50 711 72 font-weight: bold; Configuration Slot 10 25 321 16 font-weight: normal; color: rgb(118, 116, 108); Select the configuration slot to be programmed 10 45 151 19 font-weight: normal; Configuration Slot 1 true false 240 45 151 19 font-weight: normal; Configuration Slot 2 685 45 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 366 711 80 font-weight: bold; Actions 10 45 175 25 font: 12px; font-weight: bold; Write Configuration false false false false 200 45 85 25 font: 12px; font-weight: bold; Stop false false false 10 25 691 16 font-weight: normal; color: rgb(118, 116, 108) Press Write Configuration button to program your YubiKey's selected configuration slot 400 45 85 25 font: 12px; font-weight: bold; Back false false false false 300 45 85 25 font: 12px; font-weight: bold; Reset false false false 580 45 100 25 font: 12px; font-weight: bold; Export false false false 10 132 350 107 font-weight: bold; Program Multiple YubiKeys true false 10 25 331 17 font-weight: normal; Automatically program YubiKeys when inserted 10 52 191 20 font-weight:normal; Parameter Generation Scheme Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 10 75 331 22 0 0 font-weight: normal; Randomize Secret Same Secret for all Keys 10 249 711 107 font-weight: bold; HMAC-SHA1 Parameters false 685 25 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 25 221 17 font-weight: normal; Require user input (button press) 240 50 111 17 font-weight: normal; Variable input true true 370 50 141 17 font-weight: normal; Fixed 64 byte input true false 10 50 131 20 font-weight:normal; HMAC-SHA1 Mode 10 75 221 20 font-weight:normal; Secret Key (20 bytes Hex) 240 75 330 20 0 0 font-weight: normal; hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh; 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 59 59 580 73 100 24 font: 12px; font-weight: bold; Generate false false false 685 77 16 16 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false background-image: url(:/res/images/question.png); color: lightgray; border-radius: 10px; false false 10 456 711 130 font-weight: bold; Results 12 20 688 100 font: 11px "Verdana"; color: rgb(0, 0, 0); Qt::ScrollBarAlwaysOn true false Qt::SolidLine true 0 3 50 false 20 # Status Timestamp 370 132 350 117 YubiAccBox QWidget
yubiaccbox.h
1
quickBtn advBtn quickHelpBtn advHelpBtn quickConfigSlot1Radio quickConfigSlot2Radio quickProgramMulKeysBox quickAutoProgramKeysCheck quickConfigParamsCombo quickRequireUserInputCheck quickPvtIdCheck quickPvtIdTxt quickPvtIdGenerateBtn quickSecretKeyTxt quickSecretKeyGenerateBtn quickWriteConfigBtn quickStopBtn quickResetBtn quickBackBtn quickResultsWidget quickConfigHelpBtn quickChalRespOptionsHelpBtn quickPvtIdHelpBtn quickSecretKeyHelpBtn advConfigSlot1Radio advConfigSlot2Radio advProgramMulKeysBox advAutoProgramKeysCheck advConfigParamsCombo advRequireUserInputCheck advHmacVarInputRadio advHmacFixedInputRadio advSecretKeyTxt advSecretKeyGenerateBtn advWriteConfigBtn advStopBtn advResetBtn advBackBtn advResultsWidget advConfigHelpBtn advChalRespOptionsHelpBtn advSecretKeyHelpBtn
yubikey-personalization-gui-3.1.23/src/ui/chalresppage.h0000664000175000017500000001014712603205714021750 0ustar klasklas/* Copyright (C) 2011-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef CHALRESPPAGE_H #define CHALRESPPAGE_H #include #include "yubikeyconfig.h" namespace Ui { class ChalRespPage; } class ChalRespPage : public QStackedWidget { Q_OBJECT public: explicit ChalRespPage(QWidget *parent = 0); ~ChalRespPage(); enum Page { Page_Base, Page_Quick, //Yubico OTP Page_Advanced //HMAC-SHA1 }; public slots: void loadSettings(); void setCurrentPage(int pageIndex); void setCurrentSlot(int slot); private: Ui::ChalRespPage *ui; int m_currentPage; enum State { State_Initial, State_Programming, State_Programming_Multiple, State_Programming_Multiple_Auto }; State m_state; YubiKeyConfig *m_ykConfig; unsigned int m_keysProgrammedCtr; bool m_ready; bool m_keyPresent; private slots: void connectPages(); void connectHelpButtons(); void keyFound(bool found, bool* featuresMatrix); void clearState(); // Quick Page void resetQuickPage(); void freezeQuickPage(bool freeze); void on_quickProgramMulKeysBox_clicked(bool checked); void on_quickConfigParamsCombo_currentIndexChanged(int index); void on_quickPvtIdCheck_stateChanged(int state); void on_quickPvtIdTxt_editingFinished(); void on_quickPvtIdGenerateBtn_clicked(); void on_quickSecretKeyTxt_editingFinished(); void on_quickSecretKeyGenerateBtn_clicked(); void on_quickWriteConfigBtn_clicked(); void on_quickExportConfigBtn_clicked(); void on_quickStopBtn_clicked(); void changeQuickConfigParams(); void stopQuickConfigWritting(); bool validateQuickSettings(); void writeQuickConfig(int mode); void quickConfigWritten(bool written, const QString &msg); void quickConfigExported(bool written, const QString &msg); void quickUpdateResults(bool written, const QString &msg); // Advanced Page void resetAdvPage(); void freezeAdvPage(bool freeze); void on_advProgramMulKeysBox_clicked(bool checked); void on_advConfigParamsCombo_currentIndexChanged(int index); void on_advSecretKeyTxt_editingFinished(); void on_advSecretKeyGenerateBtn_clicked(); void on_advWriteConfigBtn_clicked(); void on_advExportConfigBtn_clicked(); void on_advStopBtn_clicked(); void changeAdvConfigParams(); void stopAdvConfigWritting(); bool validateAdvSettings(); void writeAdvConfig(int mode); void advConfigWritten(bool written, const QString &msg); void advConfigExported(bool written, const QString &msg); void advUpdateResults(bool written, const QString &msg); void requireInput_clicked(bool checked); void hmac_lt64_clicked(); signals: void showStatusMessage(const QString &text, int status = 0); void showHelp(int helpIndex); }; #endif // CHALRESPPAGE_H yubikey-personalization-gui-3.1.23/src/ui/chalresppage.cpp0000664000175000017500000007371712603205714022317 0ustar klasklas/* Copyright (C) 2011-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "chalresppage.h" #include "ui_chalresppage.h" #include "ui/helpbox.h" #include "ui/confirmbox.h" #include "yubikeywriter.h" #include "yubikeyfinder.h" #include "yubikeyutil.h" #include "common.h" #include #include #include #include #include ChalRespPage::ChalRespPage(QWidget *parent) : QStackedWidget(parent), ui(new Ui::ChalRespPage) { ui->setupUi(this); m_ykConfig = 0; m_keyPresent = false; clearState(); //Connect pages connectPages(); //Connect help buttons connectHelpButtons(); //Connect other signals and slots connect(YubiKeyFinder::getInstance(), SIGNAL(keyFound(bool, bool*, int)), this, SLOT(keyFound(bool, bool*))); connect(ui->quickResetBtn, SIGNAL(clicked()), this, SLOT(resetQuickPage())); connect(ui->advResetBtn, SIGNAL(clicked()), this, SLOT(resetAdvPage())); connect(ui->advRequireUserInputCheck, SIGNAL(clicked(bool)), this, SLOT(requireInput_clicked(bool))); connect(ui->quickRequireUserInputCheck, SIGNAL(clicked(bool)), this, SLOT(requireInput_clicked(bool))); connect(ui->advHmacVarInputRadio, SIGNAL(clicked()), this, SLOT(hmac_lt64_clicked())); connect(ui->advHmacFixedInputRadio, SIGNAL(clicked()), this, SLOT(hmac_lt64_clicked())); ui->quickResultsWidget->resizeColumnsToContents(); ui->advResultsWidget->resizeColumnsToContents(); loadSettings(); } ChalRespPage::~ChalRespPage() { if(m_ykConfig != 0) { delete m_ykConfig; m_ykConfig = 0; } delete ui; } void ChalRespPage::loadSettings() { QSettings settings; ui->advExportConfigBtn->setVisible(settings.value(SG_EXPORT_PREFERENCE).toBool()); ui->quickExportConfigBtn->setVisible(settings.value(SG_EXPORT_PREFERENCE).toBool()); bool reqInput = settings.value(SG_REQUIRE_INPUT).toBool(); ui->quickRequireUserInputCheck->setChecked(reqInput); ui->advRequireUserInputCheck->setChecked(reqInput); bool hmaclt64 = true; if(settings.contains(SG_HMAC_LT64)) { hmaclt64 = settings.value(SG_HMAC_LT64).toBool(); } ui->advHmacVarInputRadio->setChecked(hmaclt64); ui->advHmacFixedInputRadio->setChecked(!hmaclt64); } /* Common */ void ChalRespPage::connectPages() { //Map the values of the navigation buttons with the indexes of //the stacked widget //Create a QMapper QSignalMapper *mapper = new QSignalMapper(this); //Connect the clicked signal with the QSignalMapper connect(ui->quickBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->quickBackBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advBackBtn, SIGNAL(clicked()), mapper, SLOT(map())); //Set a value for each button mapper->setMapping(ui->quickBtn, Page_Quick); mapper->setMapping(ui->quickBackBtn, Page_Base); mapper->setMapping(ui->advBtn, Page_Advanced); mapper->setMapping(ui->advBackBtn, Page_Base); //Connect the mapper to the widget //The mapper will set a value to each button and //set that value to the widget //connect(pageMapper, SIGNAL(mapped(int)), this, SLOT(setCurrentIndex(int))); connect(mapper, SIGNAL(mapped(int)), this, SLOT(setCurrentPage(int))); //Set the current page m_currentPage = 0; setCurrentIndex(Page_Base); } void ChalRespPage::setCurrentPage(int pageIndex) { //Page changed... m_currentPage = pageIndex; switch(pageIndex){ case Page_Quick: resetQuickPage(); break; case Page_Advanced: resetAdvPage(); break; } setCurrentIndex(pageIndex); //Clear state m_keysProgrammedCtr = 0; clearState(); } void ChalRespPage::connectHelpButtons() { //Map the values of the help buttons //Create a QMapper QSignalMapper *mapper = new QSignalMapper(this); //Connect the clicked signal with the QSignalMapper connect(ui->quickHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->quickConfigHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->quickParamGenSchemeHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->quickChalRespOptionsHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->quickPvtIdHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->quickSecretKeyHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advConfigHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advChalRespOptionsHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->advSecretKeyHelpBtn, SIGNAL(clicked()), mapper, SLOT(map())); //Set a value for each button mapper->setMapping(ui->quickHelpBtn, HelpBox::Help_ChalRespYubico); mapper->setMapping(ui->advHelpBtn, HelpBox::Help_ChalRespHmac); mapper->setMapping(ui->quickConfigHelpBtn, HelpBox::Help_ConfigurationSlot); mapper->setMapping(ui->quickParamGenSchemeHelpBtn, HelpBox::Help_ParameterGeneration); mapper->setMapping(ui->quickChalRespOptionsHelpBtn, HelpBox::Help_ChalRespOption); mapper->setMapping(ui->quickPvtIdHelpBtn, HelpBox::Help_PrivateID); mapper->setMapping(ui->quickSecretKeyHelpBtn, HelpBox::Help_SecretKey); mapper->setMapping(ui->advConfigHelpBtn, HelpBox::Help_ConfigurationSlot); mapper->setMapping(ui->advChalRespOptionsHelpBtn, HelpBox::Help_ChalRespOption); mapper->setMapping(ui->advSecretKeyHelpBtn, HelpBox::Help_SecretKey); //Connect the mapper connect(mapper, SIGNAL(mapped(int)), this, SIGNAL(showHelp(int))); connect(ui->quickConfigProtectionBox, SIGNAL(showHelp(int)), this, SIGNAL(showHelp(int))); connect(ui->advConfigProtectionBox, SIGNAL(showHelp(int)), this, SIGNAL(showHelp(int))); } void ChalRespPage::keyFound(bool found, bool* featuresMatrix) { if(found) { if(m_state == State_Initial) { ui->quickWriteConfigBtn->setEnabled(true); ui->quickExportConfigBtn->setEnabled(true); ui->advWriteConfigBtn->setEnabled(true); ui->advExportConfigBtn->setEnabled(true); if(!featuresMatrix[YubiKeyFinder::Feature_MultipleConfigurations]) { ui->quickConfigSlot2Radio->setEnabled(false); ui->advConfigSlot2Radio->setEnabled(false); } else { ui->quickConfigSlot2Radio->setEnabled(true); ui->advConfigSlot2Radio->setEnabled(true); } if(!featuresMatrix[YubiKeyFinder::Feature_ChallengeResponseFixed]) { ui->advHmacFixedInputRadio->setEnabled(false); ui->advHmacVarInputRadio->setChecked(true); } else { ui->advHmacFixedInputRadio->setEnabled(true); } if(!featuresMatrix[YubiKeyFinder::Feature_ChallengeResponse]) { this->setEnabled(false); } } else if(m_state >= State_Programming_Multiple && m_keyPresent == false) { if(this->currentIndex() == Page_Quick) { if(m_state == State_Programming_Multiple) { ui->quickWriteConfigBtn->setEnabled(true); ui->quickExportConfigBtn->setEnabled(true); } else { writeQuickConfig(WRITE_CONFIG); } } else { if(m_state == State_Programming_Multiple) { ui->advWriteConfigBtn->setEnabled(true); ui->advExportConfigBtn->setEnabled(true); } else { writeAdvConfig(WRITE_CONFIG); } } } m_keyPresent = true; } else { ui->quickWriteConfigBtn->setEnabled(false); ui->quickExportConfigBtn->setEnabled(false); ui->advWriteConfigBtn->setEnabled(false); ui->advExportConfigBtn->setEnabled(false); ui->advHmacFixedInputRadio->setEnabled(true); m_keyPresent = false; if(m_state == State_Initial) { ui->quickConfigSlot2Radio->setEnabled(true); ui->advConfigSlot2Radio->setEnabled(true); this->setEnabled(true); } else if(m_state >= State_Programming_Multiple) { if(m_keysProgrammedCtr > 0 && !m_ready) { if(this->currentIndex() == Page_Quick) { changeQuickConfigParams(); } else { changeAdvConfigParams(); } } } } } void ChalRespPage::clearState() { m_state = State_Initial; m_ready = true; if(m_ykConfig != 0) { delete m_ykConfig; m_ykConfig = 0; } } /* Quick Page handling */ void ChalRespPage::resetQuickPage() { if(ui->quickConfigSlot1Radio->isChecked()) { ui->quickConfigSlot2Radio->setChecked(true); } ui->quickConfigParamsCombo->setCurrentIndex(0); ui->quickAutoProgramKeysCheck->setChecked(false); ui->quickProgramMulKeysBox->setChecked(false); ui->quickConfigProtectionBox->reset(); ui->quickPvtIdCheck->setChecked(true); ui->quickPvtIdTxt->clear(); on_quickPvtIdTxt_editingFinished(); ui->quickSecretKeyTxt->clear(); on_quickSecretKeyTxt_editingFinished(); ui->quickStopBtn->setEnabled(false); ui->quickResetBtn->setEnabled(false); } void ChalRespPage::freezeQuickPage(bool freeze) { bool disable = !freeze; ui->quickConfigBox->setEnabled(disable); ui->quickProgramMulKeysBox->setEnabled(disable); ui->quickConfigProtectionBox->setEnabled(disable); ui->quickKeyParamsBox->setEnabled(disable); ui->quickWriteConfigBtn->setEnabled(disable); ui->quickExportConfigBtn->setEnabled(disable); ui->quickStopBtn->setEnabled(!disable); ui->quickResetBtn->setEnabled(disable); ui->quickBackBtn->setEnabled(disable); } void ChalRespPage::on_quickProgramMulKeysBox_clicked(bool checked) { if(checked) { changeQuickConfigParams(); } } void ChalRespPage::on_quickConfigParamsCombo_currentIndexChanged(__attribute__((unused)) int index) { changeQuickConfigParams(); } void ChalRespPage::on_quickPvtIdCheck_stateChanged(int state) { if(ui->quickConfigParamsCombo->currentIndex() != SCHEME_RAND_ALL) { bool disable = (state != 0); ui->quickPvtIdTxt->setEnabled(disable); ui->quickPvtIdGenerateBtn->setEnabled(disable); } } void ChalRespPage::on_quickPvtIdTxt_editingFinished() { QString txt = ui->quickPvtIdTxt->text(); YubiKeyUtil::qstrClean(&txt, (size_t)UID_SIZE * 2); ui->quickPvtIdTxt->setText(txt); } void ChalRespPage::on_quickPvtIdGenerateBtn_clicked() { ui->quickPvtIdTxt->setText( YubiKeyUtil::generateRandomHex((size_t)UID_SIZE * 2)); } void ChalRespPage::on_quickSecretKeyTxt_editingFinished() { QString txt = ui->quickSecretKeyTxt->text(); YubiKeyUtil::qstrClean(&txt, (size_t)KEY_SIZE * 2); ui->quickSecretKeyTxt->setText(txt); } void ChalRespPage::on_quickSecretKeyGenerateBtn_clicked() { ui->quickSecretKeyTxt->setText( YubiKeyUtil::generateRandomHex((size_t)KEY_SIZE * 2)); } void ChalRespPage::on_quickWriteConfigBtn_clicked() { emit showStatusMessage(NULL, -1); if(!ui->quickProgramMulKeysBox->isChecked()) { m_keysProgrammedCtr = 0; } //Validate settings if(!validateQuickSettings()) { return; } clearState(); freezeQuickPage(true); // Change state if(ui->quickProgramMulKeysBox->isChecked()) { if(ui->quickAutoProgramKeysCheck->isChecked()) { m_keysProgrammedCtr = 0; m_state = State_Programming_Multiple_Auto; } else { m_state = State_Programming_Multiple; } } else { m_keysProgrammedCtr = 0; m_state = State_Programming; } writeQuickConfig(WRITE_CONFIG); } void ChalRespPage::on_quickExportConfigBtn_clicked() { emit showStatusMessage(NULL, -1); //Validate settings if(!validateQuickSettings()) { return; } clearState(); freezeQuickPage(true); writeQuickConfig(EXPORT_CONFIG); } void ChalRespPage::on_quickStopBtn_clicked() { ui->quickStopBtn->setEnabled(false); m_state = State_Initial; stopQuickConfigWritting(); } void ChalRespPage::stopQuickConfigWritting() { qDebug() << "Stopping quick configuration writing..."; if(m_state >= State_Programming_Multiple) { ui->quickStopBtn->setEnabled(true); return; } m_keysProgrammedCtr = 0; clearState(); freezeQuickPage(false); ui->quickResetBtn->setEnabled(true); } void ChalRespPage::changeQuickConfigParams() { int index = ui->quickConfigParamsCombo->currentIndex(); int idScheme = GEN_SCHEME_FIXED; int secretScheme = GEN_SCHEME_FIXED; switch(index) { case SCHEME_INCR_ID_RAND_SECRET: //Increment IDs only if in programming mode if(m_state != State_Initial) { idScheme = GEN_SCHEME_INCR; } secretScheme = GEN_SCHEME_RAND; break; case SCHEME_RAND_ALL: idScheme = GEN_SCHEME_RAND; secretScheme = GEN_SCHEME_RAND; break; } //Private ID... if(ui->quickPvtIdCheck->isChecked()) { QString pvtIdTxt = YubiKeyUtil::getNextHex( UID_SIZE * 2, ui->quickPvtIdTxt->text(), idScheme); ui->quickPvtIdTxt->setText(pvtIdTxt); } //Secret Key... QString secretKeyTxt = YubiKeyUtil::getNextHex( KEY_SIZE * 2, ui->quickSecretKeyTxt->text(), secretScheme); ui->quickSecretKeyTxt->setText(secretKeyTxt); m_ready = true; } bool ChalRespPage::validateQuickSettings() { if(!(ui->quickConfigSlot1Radio->isChecked() || ui->quickConfigSlot2Radio->isChecked())) { emit showStatusMessage(tr(ERR_CONF_SLOT_NOT_SELECTED), 1); return false; } QSettings settings; //Check if configuration slot 1 is being programmed if (!settings.value(SG_OVERWRITE_CONF_SLOT1).toBool() && ui->quickConfigSlot1Radio->isChecked() && m_keysProgrammedCtr == 0) { //Confirm from client ConfirmBox confirm(this); confirm.setConfirmIndex(ConfirmBox::Confirm_ConfigurationSlot); int ret = confirm.exec(); switch (ret) { case 1: //Yes break; default: //No return false; } } if(!ui->quickConfigProtectionBox->checkConfirm()) { return false; } return true; } void ChalRespPage::writeQuickConfig(int mode) { qDebug() << "Writing configuration..."; //Disable stop button while configuration is being written ui->quickStopBtn->setEnabled(false); //Write configuration if(m_ykConfig != 0) { qDebug() << "ykConfig destroyed"; delete m_ykConfig; m_ykConfig = 0; } m_ykConfig = new YubiKeyConfig(); //Programming mode... m_ykConfig->setProgrammingMode(YubiKeyConfig::Mode_ChalRespYubico); // set serial m_ykConfig->setSerial(QString::number(YubiKeyFinder::getInstance()->serial())); //Configuration slot... int configSlot = 1; if(ui->quickConfigSlot2Radio->isChecked()) { configSlot = 2; } m_ykConfig->setConfigSlot(configSlot); //Private ID... if(ui->quickPvtIdCheck->isChecked()) { m_ykConfig->setPvtIdTxt(ui->quickPvtIdTxt->text()); } //Secret Key... m_ykConfig->setSecretKeyTxt(ui->quickSecretKeyTxt->text()); //Configuration protection... //Current Access Code... m_ykConfig->setCurrentAccessCodeTxt( ui->quickConfigProtectionBox->currentAccessCode()); m_ykConfig->setNewAccessCodeTxt( ui->quickConfigProtectionBox->newAccessCode(), ui->quickConfigProtectionBox->newAccMode()); //Challenge-Response Options... m_ykConfig->setChalYubico(true); m_ykConfig->setChalBtnTrig(ui->quickRequireUserInputCheck->isChecked()); if(mode == WRITE_CONFIG) { //Write connect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(quickConfigWritten(bool, const QString &))); YubiKeyWriter::getInstance()->writeConfig(m_ykConfig); } else if(mode == EXPORT_CONFIG) { //Write connect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(quickConfigExported(bool, const QString &))); YubiKeyWriter::getInstance()->exportConfig(m_ykConfig); } } void ChalRespPage::quickConfigWritten(bool written, const QString &msg) { disconnect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(quickConfigWritten(bool, const QString &))); QString message; if(written) { qDebug() << "Configuration written...."; m_keysProgrammedCtr++; if(m_state == State_Programming){ message = tr(KEY_CONFIGURED).arg(""); } else { message = tr("%1. %2").arg(tr(KEY_CONFIGURED).arg(m_keysProgrammedCtr)).arg(tr(REMOVE_KEY)); } showStatusMessage(message, 0); message = tr(KEY_CONFIGURED).arg(""); } else { qDebug() << "Configuration could not be written...."; message = msg; } quickUpdateResults(written, message); m_ready = false; stopQuickConfigWritting(); } void ChalRespPage::quickConfigExported(bool written, const QString &msg) { disconnect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(quickConfigExported(bool, const QString &))); QString message; if(written) { qDebug() << "Configuration exported...."; message = tr(KEY_EXPORTED); showStatusMessage(message, 0); } else { qDebug() << "Configuration could not be exported...."; message = msg; } m_ready = false; stopQuickConfigWritting(); } void ChalRespPage::quickUpdateResults(bool written, const QString &msg) { int row = 0; ui->quickResultsWidget->insertRow(row); //Sr. No.... QTableWidgetItem *srnoItem = new QTableWidgetItem( tr("%1").arg(ui->quickResultsWidget->rowCount())); if(written) { srnoItem->setIcon(QIcon(QPixmap(tr(":/res/images/tick.png")))); } else { srnoItem->setIcon(QIcon(QPixmap(tr(":/res/images/cross.png")))); } srnoItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->quickResultsWidget->setItem(row, 0, srnoItem); //Status... QTableWidgetItem *statusItem = new QTableWidgetItem( tr("%1").arg(msg)); statusItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->quickResultsWidget->setItem(row, 1, statusItem); //Timestamp... QDateTime timstamp = QDateTime::currentDateTime(); QTableWidgetItem *timeItem = new QTableWidgetItem( tr("%1").arg(timstamp.toString(Qt::SystemLocaleShortDate))); timeItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->quickResultsWidget->setItem(row, 2, timeItem); ui->quickResultsWidget->resizeColumnsToContents(); ui->quickResultsWidget->resizeRowsToContents(); } /* Advanced Page handling */ void ChalRespPage::resetAdvPage() { if(ui->advConfigSlot1Radio->isChecked()) { ui->advConfigSlot2Radio->setChecked(true); } ui->advConfigParamsCombo->setCurrentIndex(0); ui->advAutoProgramKeysCheck->setChecked(false); ui->advProgramMulKeysBox->setChecked(false); ui->advConfigProtectionBox->reset(); ui->advSecretKeyTxt->clear(); on_advSecretKeyTxt_editingFinished(); ui->advStopBtn->setEnabled(false); ui->advResetBtn->setEnabled(false); } void ChalRespPage::freezeAdvPage(bool freeze) { bool disable = !freeze; ui->advConfigBox->setEnabled(disable); ui->advProgramMulKeysBox->setEnabled(disable); ui->advConfigProtectionBox->setEnabled(disable); ui->advKeyParamsBox->setEnabled(disable); ui->advWriteConfigBtn->setEnabled(disable); ui->advExportConfigBtn->setEnabled(disable); ui->advStopBtn->setEnabled(!disable); ui->advResetBtn->setEnabled(disable); ui->advBackBtn->setEnabled(disable); } void ChalRespPage::on_advProgramMulKeysBox_clicked(bool checked) { if(checked) { changeAdvConfigParams(); } } void ChalRespPage::on_advConfigParamsCombo_currentIndexChanged(__attribute__((unused)) int index) { changeAdvConfigParams(); } void ChalRespPage::on_advSecretKeyTxt_editingFinished() { QString txt = ui->advSecretKeyTxt->text(); YubiKeyUtil::qstrClean(&txt, (size_t)KEY_SIZE_OATH * 2); ui->advSecretKeyTxt->setText(txt); } void ChalRespPage::on_advSecretKeyGenerateBtn_clicked() { ui->advSecretKeyTxt->setText( YubiKeyUtil::generateRandomHex((size_t)KEY_SIZE_OATH * 2)); ui->advSecretKeyTxt->setCursorPosition(0); } void ChalRespPage::on_advWriteConfigBtn_clicked() { emit showStatusMessage(NULL, -1); if(!ui->advProgramMulKeysBox->isChecked()) { m_keysProgrammedCtr = 0; } //Validate settings if(!validateAdvSettings()) { return; } clearState(); freezeAdvPage(true); // Change state if(ui->advProgramMulKeysBox->isChecked()) { if(ui->advAutoProgramKeysCheck->isChecked()) { m_keysProgrammedCtr = 0; m_state = State_Programming_Multiple_Auto; } else { m_state = State_Programming_Multiple; } } else { m_keysProgrammedCtr = 0; m_state = State_Programming; } writeAdvConfig(WRITE_CONFIG); } void ChalRespPage::on_advExportConfigBtn_clicked() { emit showStatusMessage(NULL, -1); //Validate settings if(!validateAdvSettings()) { return; } clearState(); freezeAdvPage(true); writeAdvConfig(EXPORT_CONFIG); } void ChalRespPage::on_advStopBtn_clicked() { ui->advStopBtn->setEnabled(false); m_state = State_Initial; stopAdvConfigWritting(); } void ChalRespPage::stopAdvConfigWritting() { qDebug() << "Stopping adv configuration writing..."; if(m_state >= State_Programming_Multiple) { ui->advStopBtn->setEnabled(true); return; } m_keysProgrammedCtr = 0; clearState(); freezeAdvPage(false); ui->advResetBtn->setEnabled(true); } void ChalRespPage::changeAdvConfigParams() { int index = ui->advConfigParamsCombo->currentIndex(); // else we use a static secret. if(index == SCHEME_INCR_ID_RAND_SECRET) { //Secret Key... QString secretKeyTxt = YubiKeyUtil::getNextHex( KEY_SIZE_OATH * 2, ui->advSecretKeyTxt->text(), GEN_SCHEME_RAND); ui->advSecretKeyTxt->setText(secretKeyTxt); } on_advSecretKeyTxt_editingFinished(); m_ready = true; } bool ChalRespPage::validateAdvSettings() { if(!(ui->advConfigSlot1Radio->isChecked() || ui->advConfigSlot2Radio->isChecked())) { emit showStatusMessage(tr(ERR_CONF_SLOT_NOT_SELECTED), 1); return false; } QSettings settings; //Check if configuration slot 1 is being programmed if (!settings.value(SG_OVERWRITE_CONF_SLOT1).toBool() && ui->advConfigSlot1Radio->isChecked() && m_keysProgrammedCtr == 0) { //Confirm from client ConfirmBox confirm(this); confirm.setConfirmIndex(ConfirmBox::Confirm_ConfigurationSlot); int ret = confirm.exec(); switch (ret) { case 1: //Yes break; default: //No return false; } } if(!ui->advConfigProtectionBox->checkConfirm()) { return false; } return true; } void ChalRespPage::writeAdvConfig(int mode) { qDebug() << "Writing configuration..."; //Disable stop button while configuration is being written ui->advStopBtn->setEnabled(false); //Write configuration if(m_ykConfig != 0) { qDebug() << "ykConfig destroyed"; delete m_ykConfig; m_ykConfig = 0; } m_ykConfig = new YubiKeyConfig(); //Programming mode... m_ykConfig->setProgrammingMode(YubiKeyConfig::Mode_ChalRespHmac); // set serial m_ykConfig->setSerial(QString::number(YubiKeyFinder::getInstance()->serial())); //Configuration slot... int configSlot = 1; if(ui->advConfigSlot2Radio->isChecked()) { configSlot = 2; } m_ykConfig->setConfigSlot(configSlot); //Secret Key... m_ykConfig->setSecretKeyTxt(ui->advSecretKeyTxt->text()); //Configuration protection... m_ykConfig->setCurrentAccessCodeTxt( ui->advConfigProtectionBox->currentAccessCode()); m_ykConfig->setNewAccessCodeTxt( ui->advConfigProtectionBox->newAccessCode(), ui->advConfigProtectionBox->newAccMode()); //Challenge-Response Options... m_ykConfig->setChalHmac(true); m_ykConfig->setHmacLT64(ui->advHmacVarInputRadio->isChecked()); m_ykConfig->setChalBtnTrig(ui->advRequireUserInputCheck->isChecked()); if(mode == WRITE_CONFIG) { //Write connect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(advConfigWritten(bool, const QString &))); YubiKeyWriter::getInstance()->writeConfig(m_ykConfig); } else if(mode == EXPORT_CONFIG) { //Write connect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(advConfigExported(bool, const QString &))); YubiKeyWriter::getInstance()->exportConfig(m_ykConfig); } } void ChalRespPage::advConfigWritten(bool written, const QString &msg) { disconnect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(advConfigWritten(bool, const QString &))); QString message; if(written) { qDebug() << "Configuration written...."; m_keysProgrammedCtr++; if(m_state == State_Programming){ message = tr(KEY_CONFIGURED).arg(""); } else { message = tr("%1. %2").arg(tr(KEY_CONFIGURED).arg(m_keysProgrammedCtr)).arg(tr(REMOVE_KEY)); } showStatusMessage(message, 0); message = tr(KEY_CONFIGURED).arg(""); } else { qDebug() << "Configuration could not be written...."; message = msg; } advUpdateResults(written, message); m_ready = false; stopAdvConfigWritting(); } void ChalRespPage::advConfigExported(bool written, const QString &msg) { disconnect(YubiKeyWriter::getInstance(), SIGNAL(configWritten(bool, const QString &)), this, SLOT(advConfigExported(bool, const QString &))); QString message; if(written) { qDebug() << "Configuration written...."; message = tr(KEY_EXPORTED); showStatusMessage(message, 0); } else { qDebug() << "Configuration could not be exported...."; message = msg; } m_ready = false; stopAdvConfigWritting(); } void ChalRespPage::advUpdateResults(bool written, const QString &msg) { int row = 0; ui->advResultsWidget->insertRow(row); //Sr. No.... QTableWidgetItem *srnoItem = new QTableWidgetItem( tr("%1").arg(ui->advResultsWidget->rowCount())); if(written) { srnoItem->setIcon(QIcon(QPixmap(tr(":/res/images/tick.png")))); } else { srnoItem->setIcon(QIcon(QPixmap(tr(":/res/images/cross.png")))); } srnoItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->advResultsWidget->setItem(row, 0, srnoItem); //Status... QTableWidgetItem *statusItem = new QTableWidgetItem( tr("%1").arg(msg)); statusItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->advResultsWidget->setItem(row, 1, statusItem); //Timestamp... QDateTime timstamp = QDateTime::currentDateTime(); QTableWidgetItem *timeItem = new QTableWidgetItem( tr("%1").arg(timstamp.toString(Qt::SystemLocaleShortDate))); timeItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->advResultsWidget->setItem(row, 2, timeItem); ui->advResultsWidget->resizeColumnsToContents(); ui->advResultsWidget->resizeRowsToContents(); } void ChalRespPage::requireInput_clicked(bool checked) { QSettings settings; settings.setValue(SG_REQUIRE_INPUT, checked); if(m_currentPage == Page_Quick) { ui->advRequireUserInputCheck->setChecked(checked); } else { ui->quickRequireUserInputCheck->setChecked(checked); } } void ChalRespPage::hmac_lt64_clicked() { QSettings settings; settings.setValue(SG_HMAC_LT64, ui->advHmacVarInputRadio->isChecked()); } void ChalRespPage::setCurrentSlot(int slot) { if(m_currentPage == Page_Advanced) { ui->advConfigSlot1Radio->setChecked(slot == 1); ui->advConfigSlot2Radio->setChecked(slot == 2); } else if(m_currentPage == Page_Quick) { ui->quickConfigSlot1Radio->setChecked(slot == 1); ui->quickConfigSlot2Radio->setChecked(slot == 2); } } yubikey-personalization-gui-3.1.23/src/ui/aboutpage.ui0000664000175000017500000003575112603205714021457 0ustar klasklas AboutPage 0 0 730 650 0 0 730 650 Form font: 11px "Verdana"; 30 80 671 450 background-color: rgb(255, 255, 255); border-color: rgb(0, 0, 0); border-radius: 5px; QFrame::StyledPanel QFrame::Sunken 0 71 121 168 23 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false font: 12px "Verdana"; text-decoration: underline; text-align: left; color: rgb(5, 67, 168); Yubico OTP Mode false false false true 70 211 168 23 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false font: 12px "Verdana"; text-decoration: underline; text-align: left; color: rgb(5, 67, 168); Challenge-Response Mode false false true 70 181 168 23 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false font: 12px "Verdana"; text-decoration: underline; text-align: left; color: rgb(5, 67, 168); Static Password Mode false false true 71 151 168 23 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false font: 12px "Verdana"; text-decoration: underline; text-align: left; color: rgb(5, 67, 168); OATH-HOTP Mode false false true 410 355 240 20 Application Version: Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 20 420 631 20 Qt::RichText Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 0 73 671 2 background-color: rgb(140, 192, 65); 1 Qt::Horizontal 143 25 384 22 font: 18px "Verdana"; font-weight: bold; color: rgb(140, 192, 65); The Swiss Army Knife for the YubiKey Qt::AlignCenter 0 410 671 1 background-color: rgb(140, 192, 65); 1 Qt::Horizontal 20 96 271 20 font: 12px "Verdana"; font-weight: bold; color: rgb(118, 116, 108); Personalize your YubiKey in: 33 121 24 24 :/res/images/right.png Qt::AlignCenter 33 151 24 24 :/res/images/right.png Qt::AlignCenter 33 181 24 24 :/res/images/right.png Qt::AlignCenter 33 211 24 24 :/res/images/right.png Qt::AlignCenter 20 290 191 20 For help and discussion, head to 20 310 131 20 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false font: 12px "Verdana"; text-decoration: underline; color: rgb(5, 67, 168); http://yubi.co/forum false false true 33 241 24 24 :/res/images/right.png Qt::AlignCenter 70 241 168 23 0 0 PointingHandCursor Qt::DefaultContextMenu Qt::LeftToRight false font: 12px "Verdana"; text-decoration: underline; text-align: left; color: rgb(5, 67, 168); Update Settings false false true 410 380 240 20 Library Version: Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter otpBtn oathBtn staticBtn chalRespBtn settingsBtn yubikey-personalization-gui-3.1.23/src/ui/aboutpage.h0000664000175000017500000000344112603205714021260 0ustar klasklas/* Copyright (C) 2011-2013 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef ABOUTPAGE_H #define ABOUTPAGE_H #include namespace Ui { class AboutPage; } class AboutPage : public QWidget { Q_OBJECT public: explicit AboutPage(QWidget *parent = 0); ~AboutPage(); private: Ui::AboutPage *ui; private slots: void connectButtons(); void keyFound(bool found, bool* featuresMatrix); void btn_pressed(int pageIndex); void on_supportBtn_clicked() ; signals: void changePage(int pageIndex); }; #endif // ABOUTPAGE_H yubikey-personalization-gui-3.1.23/src/ui/aboutpage.cpp0000664000175000017500000001215412603205714021614 0ustar klasklas/* Copyright (C) 2011-2013 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "aboutpage.h" #include "ui_aboutpage.h" #include "ui/mainwindow.h" #include "yubikeyfinder.h" #include "common.h" #include "version.h" #include #include #include #include AboutPage::AboutPage(QWidget *parent) : QWidget(parent), ui(new Ui::AboutPage) { ui->setupUi(this); //Set application version QString appVersion = tr("%1 %2"). arg(ui->appVersionLbl->text()). arg(VER_PRODUCTVERSION_STR); ui->appVersionLbl->setText(appVersion); // Set the library version QString libVersion = tr("%1 %2"). arg(ui->libVersionLbl->text()). arg(ykpers_check_version(NULL)); ui->libVersionLbl->setText(libVersion); //Set copyright QString copyright = tr("%1. %2."). arg(trUtf8(VER_LEGALCOPYRIGHT)). arg(VER_LEGALTRADEMARKS1_STR); ui->copyrightLbl->setText(copyright); connectButtons(); //Connect other signals and slots connect(YubiKeyFinder::getInstance(), SIGNAL(keyFound(bool, bool*, int)), this, SLOT(keyFound(bool, bool*))); } AboutPage::~AboutPage() { delete ui; } void AboutPage::connectButtons() { //Map the values of the buttons //Create a QMapper QSignalMapper *mapper = new QSignalMapper(this); //Connect the clicked signal with the QSignalMapper connect(ui->otpBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->oathBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->staticBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->chalRespBtn, SIGNAL(clicked()), mapper, SLOT(map())); connect(ui->settingsBtn, SIGNAL(clicked()), mapper, SLOT(map())); //Set a value for each button mapper->setMapping(ui->otpBtn, MainWindow::Page_Otp); mapper->setMapping(ui->oathBtn, MainWindow::Page_Oath); mapper->setMapping(ui->staticBtn, MainWindow::Page_Static); mapper->setMapping(ui->chalRespBtn, MainWindow::Page_ChalResp); mapper->setMapping(ui->settingsBtn, MainWindow::Page_Settings); //Connect the mapper connect(mapper, SIGNAL(mapped(int)), this, SLOT(btn_pressed(int))); } void AboutPage::keyFound(bool found, bool* featuresMatrix) { QString enabledLinkBtnSS = QString::fromUtf8(SS_LINK_ENABLED); QString disabledLinkBtnSS = QString::fromUtf8(SS_LINK_DISABLED); if(found) { if(featuresMatrix[YubiKeyFinder::Feature_OathHotp]) { ui->oathBtn->setEnabled(true); ui->oathBtn->setStyleSheet(enabledLinkBtnSS); } else { ui->oathBtn->setEnabled(false); ui->oathBtn->setStyleSheet(disabledLinkBtnSS); } if(featuresMatrix[YubiKeyFinder::Feature_StaticPassword]) { ui->staticBtn->setEnabled(true); ui->staticBtn->setStyleSheet(enabledLinkBtnSS); } else { ui->staticBtn->setEnabled(false); ui->staticBtn->setStyleSheet(disabledLinkBtnSS); } if(featuresMatrix[YubiKeyFinder::Feature_ChallengeResponse]) { ui->chalRespBtn->setEnabled(true); ui->chalRespBtn->setStyleSheet(enabledLinkBtnSS); } else { ui->chalRespBtn->setEnabled(false); ui->chalRespBtn->setStyleSheet(disabledLinkBtnSS); } } else { ui->oathBtn->setEnabled(true); ui->oathBtn->setStyleSheet(enabledLinkBtnSS); ui->staticBtn->setEnabled(true); ui->staticBtn->setStyleSheet(enabledLinkBtnSS); ui->chalRespBtn->setEnabled(true); ui->chalRespBtn->setStyleSheet(enabledLinkBtnSS); } } void AboutPage::btn_pressed(int pageIndex) { emit changePage(pageIndex); } void AboutPage::on_supportBtn_clicked() { QDesktopServices::openUrl(QUrl(tr(SUPPORT_LINK))); } yubikey-personalization-gui-3.1.23/src/src.pro0000664000175000017500000004301012603205714020030 0ustar klasklas# # global definitions # VERSION_MAJOR = 3 VERSION_MINOR = 1 VERSION_BUILD = 23 VERSION = "$${VERSION_MAJOR}.$${VERSION_MINOR}.$${VERSION_BUILD}" APP_NAME = $$quote(YubiKey Personalization Tool) # # common configuration # QT += core gui TEMPLATE = app TARGET = yubikey-personalization-gui DEFINES += VERSION_MAJOR=\\\"$${VERSION_MAJOR}\\\" VERSION_MINOR=\\\"$${VERSION_MINOR}\\\" VERSION_BUILD=\\\"$${VERSION_BUILD}\\\" VERSION=\\\"$${VERSION}\\\" CONFIG += exceptions # if this is qt5, add widgets greaterThan(QT_MAJOR_VERSION, 4) { QT += widgets macx { QT += printsupport QTPLUGIN.platforms = qcocoa } } !nosilent { CONFIG += silent } CONFIG(debug, debug|release) { message("Debug build") TARGET_DIR = ..$${DIR_SEPARATOR}build$${DIR_SEPARATOR}debug CONFIG += console no_lflags_merge warn_on LIBS += $$quote(-L../lib/debug) -llib } else { message("Release build") TARGET_DIR = ..$${DIR_SEPARATOR}build$${DIR_SEPARATOR}release DEFINES += QT_NO_DEBUG_OUTPUT LIBS += $$quote(-L../lib/release) -llib } UI_DIR = ./ui RCC_DIR = "$$TARGET_DIR/RCCFiles" MOC_DIR = "$$TARGET_DIR/MOCFiles" OBJECTS_DIR = "$$TARGET_DIR/ObjFiles" DESTDIR = "$$TARGET_DIR" DEPENDPATH += . ui INCLUDEPATH += ../lib . ui LICENSEFILES = json-c.txt \ libyubikey.txt \ yubikey-personalization.txt FORMS += \ ui/toolpage.ui \ ui/staticpage.ui \ ui/settingpage.ui \ ui/otppage.ui \ ui/oathpage.ui \ ui/mainwindow.ui \ ui/helpbox.ui \ ui/confirmbox.ui \ ui/chalresppage.ui \ ui/aboutpage.ui \ ui/diagnostics.ui \ ui/yubiaccbox.ui HEADERS += \ ui/toolpage.h \ ui/staticpage.h \ ui/settingpage.h \ ui/otppage.h \ ui/oathpage.h \ ui/mainwindow.h \ ui/helpbox.h \ ui/confirmbox.h \ ui/chalresppage.h \ ui/aboutpage.h \ ui/diagnostics.h \ ui/yubiaccbox.h \ yubikeywriter.h \ yubikeylogger.h \ yubikeyfinder.h \ yubikeyconfig.h \ version.h \ help.h SOURCES += \ main.cpp \ ui/toolpage.cpp \ ui/staticpage.cpp \ ui/settingpage.cpp \ ui/otppage.cpp \ ui/oathpage.cpp \ ui/mainwindow.cpp \ ui/helpbox.cpp \ ui/confirmbox.cpp \ ui/chalresppage.cpp \ ui/aboutpage.cpp \ ui/yubiaccbox.cpp \ ui/diagnostics.cpp \ yubikeywriter.cpp \ yubikeylogger.cpp \ yubikeyfinder.cpp \ yubikeyconfig.cpp RESOURCES += \ ../resources/resources.qrc OTHER_FILES += \ ../resources/win/resources.rc \ ../resources/mac/Yubico.icns \ ../resources/mac/Info.plist.in \ ../resources/mac/qt.conf QMAKE_CXXFLAGS += $$CXXFLAGS $$CPPFLAGS QMAKE_LFLAGS += $$LDFLAGS cross { message("Doing a cross platform build..") # pickup compiler from environment isEmpty(TARGET_ARCH) { error("Cross compiling without a target is completely invalid, set TARGET_ARCH") } QMAKE_CC = $${TARGET_ARCH}-gcc QMAKE_CXX = $${TARGET_ARCH}-g++ QMAKE_LINK = $$QMAKE_CXX QMAKE_LINK_C = $$QMAKE_CC win32 { QMAKE_LIB = $${TARGET_ARCH}-ar -ru QMAKE_RC = $${TARGET_ARCH}-windres $$quote(-DVERSION_WIN_STR=\'\\\"$${VERSION}\\0\\\"\') QMAKE_MOC = $$[QT_INSTALL_BINS]/moc QMAKE_UIC = $$[QT_INSTALL_BINS]/uic QMAKE_IDC = $$[QT_INSTALL_BINS]/idc QMAKE_RCC = $$[QT_INSTALL_BINS]/rcc QMAKE_LFLAGS += -static-libstdc++ -static-libgcc } !isEmpty (QTDIR) { _QT_INCDIR = $${QTDIR}$${DIR_SEPARATOR}include _QT_LIBDIR = $${QTDIR}$${DIR_SEPARATOR}lib _QT_BINDIR = $${QTDIR}$${DIR_SEPARATOR}bin _QT_PLUGINDIR = $${QTDIR}$${DIR_SEPARATOR}plugins } else { _QT_INCDIR = $$(QT_INCDIR) _QT_LIBDIR = $$(QT_LIBDIR) _QT_BINDIR = $$(QT_BINDIR) _QT_PLUGINDIR = $$(QT_PLUGINDIR) } !isEmpty (_QT_INCDIR) { QMAKE_INCDIR_QT = $$_QT_INCDIR } !isEmpty (_QT_LIBDIR) { QMAKE_LIBDIR_QT = $$_QT_LIBDIR } } # # Windows specific configuration # win32 { INCLUDEPATH += ../libs/win32/include ../libs/win32/include/ykpers-1 # The application icon RC_FILE = ../resources/win/resources.rc # The application dependencies !contains(QMAKE_TARGET.arch, x86_64) { message("Windows x86 build") LIBS += $$quote(-L../libs/win32/bin) -llibyubikey-0 -llibykpers-1-1 } else { message("Windows x86_64 build") LIBS += $$quote(-L../libs/win64/bin) -llibyubikey-0 -llibykpers-1-1 } LIBS += $$quote(-L$$_QT_BINDIR) $$quote(-L$$_QT_LIBDIR) CONFIG(debug, debug|release) { LIB_FILES += \ $$_QT_BINDIR$${DIR_SEPARATOR}Qt5Cored.dll \ $$_QT_BINDIR$${DIR_SEPARATOR}Qt5Guid.dll \ $$_QT_BINDIR$${DIR_SEPARATOR}Qt5Widgetsd.dll \ $$_QT_BINDIR$${DIR_SEPARATOR}Qt5Testd.dll \ $$_QT_PLUGINDIR$${DIR_SEPARATOR}platforms$${DIR_SEPARATOR}qwindowsd.dll \ $$_QT_PLUGINDIR$${DIR_SEPARATOR}imageformats$${DIR_SEPARATOR}qmngd.dll \ $$_QT_PLUGINDIR$${DIR_SEPARATOR}accessible$${DIR_SEPARATOR}qtaccessiblewidgetsd.dll } else { LIB_FILES += \ $$_QT_BINDIR$${DIR_SEPARATOR}Qt5Core.dll \ $$_QT_BINDIR$${DIR_SEPARATOR}Qt5Gui.dll \ $$_QT_BINDIR$${DIR_SEPARATOR}Qt5Widgets.dll \ $$_QT_BINDIR$${DIR_SEPARATOR}Qt5Test.dll \ $$_QT_PLUGINDIR$${DIR_SEPARATOR}platforms$${DIR_SEPARATOR}qwindows.dll \ $$_QT_PLUGINDIR$${DIR_SEPARATOR}imageformats$${DIR_SEPARATOR}qmng.dll \ $$_QT_PLUGINDIR$${DIR_SEPARATOR}accessible$${DIR_SEPARATOR}qtaccessiblewidgets.dll } LIB_FILES += \ $$_QT_BINDIR$${DIR_SEPARATOR}libgcc_s_dw2-1.dll \ $$_QT_BINDIR$${DIR_SEPARATOR}libwinpthread-1.dll \ $$_QT_BINDIR$${DIR_SEPARATOR}libstdc++-6.dll \ $$_QT_BINDIR$${DIR_SEPARATOR}icuin52.dll \ $$_QT_BINDIR$${DIR_SEPARATOR}icuuc52.dll \ $$_QT_BINDIR$${DIR_SEPARATOR}icudt52.dll \ ..$${DIR_SEPARATOR}libs$${DIR_SEPARATOR}win32$${DIR_SEPARATOR}bin$${DIR_SEPARATOR}libjson-c-2.dll \ ..$${DIR_SEPARATOR}libs$${DIR_SEPARATOR}win32$${DIR_SEPARATOR}bin$${DIR_SEPARATOR}libyubikey-0.dll \ ..$${DIR_SEPARATOR}libs$${DIR_SEPARATOR}win32$${DIR_SEPARATOR}bin$${DIR_SEPARATOR}libykpers-1-1.dll isEmpty(TIMESTAMP_URL):TIMESTAMP_URL = 'http://tsa.starfieldtech.com' LIB_FILES_WIN = $${LIB_FILES} TARGET_DIR_WIN = $${DESTDIR} for(FILE, LIB_FILES_WIN) { QMAKE_POST_LINK +=$$quote($$QMAKE_COPY $${FILE} $${TARGET_DIR_WIN}$$escape_expand(\\n\\t)) } LICENSE_DIR = $${TARGET_DIR_WIN}$${DIR_SEPARATOR}licenses QMAKE_POST_LINK += $$quote($$QMAKE_MKDIR $${LICENSE_DIR}$$escape_expand(\\n\\t)) BASEDIR = ..$${DIR_SEPARATOR}libs$${DIR_SEPARATOR}win32$${DIR_SEPARATOR}licenses$${DIR_SEPARATOR} for(FILE, LICENSEFILES) { QMAKE_POST_LINK += $$quote($$QMAKE_COPY $${BASEDIR}$${FILE} $${LICENSE_DIR}$$escape_expand(\\n\\t)) } QMAKE_POST_LINK += $$quote($$QMAKE_COPY ..$${DIR_SEPARATOR}COPYING $${LICENSE_DIR}$${DIR_SEPARATOR}yubikey-personalization-gui.txt$$escape_expand(\\n\\t)) sign_binaries { isEmpty(CERT_FILE) { error("Must have a cert file to sign (CERT_FILE env variable).") } # sign all Yubico binaries SIGN_FILES = $${TARGET}.exe \ libyubikey-0.dll \ libykpers-1-1.dll for(FILE, SIGN_FILES) { QMAKE_POST_LINK += $$quote("osslsigncode sign -pkcs11engine /usr/lib/engines/engine_pkcs11.so -pkcs11module /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so -key slot_1-id_2 -certs $${CERT_FILE} -h sha256 -comm -t $${TIMESTAMP_URL} -n '$${APP_NAME}' -i 'https://www.yubico.com' $${TARGET_DIR_WIN}$${DIR_SEPARATOR}$${FILE} $${TARGET_DIR_WIN}$${DIR_SEPARATOR}$${FILE}-sign"$$escape_expand(\\n\\t)) QMAKE_POST_LINK += $$quote("mv $${TARGET_DIR_WIN}$${DIR_SEPARATOR}$${FILE}-sign $${TARGET_DIR_WIN}$${DIR_SEPARATOR}$${FILE}"$$escape_expand(\\n\\t)) } } build_installer { QMAKE_POST_LINK += $$quote("makensis -DYKPERS_VERSION=$${VERSION} ../installer/win-nsis/ykpers.nsi"$$escape_expand(\\n\\t)) sign_binaries { QMAKE_POST_LINK += $$quote("osslsigncode sign -pkcs11engine /usr/lib/engines/engine_pkcs11.so -pkcs11module /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so -key slot_1-id_2 -certs $${CERT_FILE} -h sha256 -comm -t $${TIMESTAMP_URL} -n '$${APP_NAME} Installer' -i 'https://www.yubico.com' $${TARGET_DIR_WIN}$${DIR_SEPARATOR}$${TARGET}-$${VERSION}.exe $${TARGET_DIR_WIN}$${DIR_SEPARATOR}$${TARGET}-$${VERSION}.exe-sign"$$escape_expand(\\n\\t)) QMAKE_POST_LINK += $$quote("mv $${TARGET_DIR_WIN}$${DIR_SEPARATOR}$${TARGET}-$${VERSION}.exe-sign $${TARGET_DIR_WIN}$${DIR_SEPARATOR}$${TARGET}-$${VERSION}.exe"$$escape_expand(\\n\\t)) } } } # # *nix specific configuration # unix:!macx|force_pkgconfig { message("Unix build") LIBS += -lyubikey CONFIG += link_pkgconfig PKGCONFIG += ykpers-1 } # # MacOS X specific configuration # macx:!force_pkgconfig { message("Mac build") INCLUDEPATH += ../libs/macx/include ../libs/macx/include/ykpers-1 LIBS += ../libs/macx/lib/libykpers-1.dylib ../libs/macx/lib/libyubikey.dylib CONFIG += x86_64 DEFINES += QT_MAC_USE_COCOA _QT_LIBDIR = $$[QT_INSTALL_LIBS] _QT_PLUGINDIR = $$[QT_INSTALL_PLUGINS] for_store { QMAKE_CFLAGS += -gdwarf-2 QMAKE_CXXFLAGS += -gdwarf-2 isEmpty(PACKAGE_SIGN_IDENTITY):PACKAGE_SIGN_IDENTITY = '3rd Party Mac Developer Application' isEmpty(INSTALLER_SIGN_IDENTITY):INSTALLER_SIGN_IDENTITY = '3rd Party Mac Developer Installer' } else { isEmpty(PACKAGE_SIGN_IDENTITY):PACKAGE_SIGN_IDENTITY = 'Developer ID Application' isEmpty(INSTALLER_SIGN_IDENTITY):INSTALLER_SIGN_IDENTITY = 'Developer ID Installer' } # The application dependencies LIBS += $$_SDK/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation LIBS += $$_SDK/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit # The application executable name TARGET = $$APP_NAME TARGET_MAC = $${TARGET} TARGET_MAC ~= s, ,\\ ,g # The application icon ICON = ../resources/mac/Yubico.icns BUILD = $$(BUILD) isEmpty(BUILD) { BUILD = 1 } # Copy required resources into the final app bundle and # put the current version number into Info.plist QMAKE_POST_LINK += $$quote(mkdir -p $${DESTDIR}/$${TARGET_MAC}.app/Contents/Resources && \ cp -R ../resources/mac/Yubico.icns $${DESTDIR}/$${TARGET_MAC}.app/Contents/Resources/. && \ cp ../resources/mac/qt.conf $${DESTDIR}/$${TARGET_MAC}.app/Contents/Resources/. && \ sed -e \'s|@@version@@|$$VERSION|g\' -e \'s|@@build@@|$$BUILD|g\' \ < ../resources/mac/Info.plist.in > $${DESTDIR}/$${TARGET_MAC}.app/Contents/Info.plist) # copy the QT libraries into our bundle _BASEDIR = $${DESTDIR}/$${TARGET_MAC}.app/Contents _LIBDIR = $${_BASEDIR}/Frameworks _PLUGINDIR = $${_BASEDIR}/PlugIns QMAKE_POST_LINK += $$quote( && mkdir -p $$_LIBDIR && \ cp $$_QT_LIBDIR/QtCore.framework/Versions/5/QtCore $$_LIBDIR && \ cp $$_QT_LIBDIR/QtGui.framework/Versions/5/QtGui $$_LIBDIR && \ cp $$_QT_LIBDIR/QtWidgets.framework/Versions/5/QtWidgets $$_LIBDIR && \ cp $$_QT_LIBDIR/QtPrintSupport.framework/Versions/5/QtPrintSupport $$_LIBDIR && \ mkdir -p $$_PLUGINDIR/imageformats && \ cp -R $$_QT_PLUGINDIR/imageformats/libqmng.dylib $$_PLUGINDIR/imageformats && \ mkdir -p $$_PLUGINDIR/accessible && \ cp -R $$_QT_PLUGINDIR/accessible/libqtaccessiblewidgets.dylib $$_PLUGINDIR/accessible && \ mkdir -p $$_PLUGINDIR/platforms && \ cp -R $$_QT_PLUGINDIR/platforms/libqcocoa.dylib $$_PLUGINDIR/platforms) # copy libykpers and friends QMAKE_POST_LINK += $$quote( && mkdir -p $$_LIBDIR && \ cp ../libs/macx/lib/libyubikey.0.dylib $$_LIBDIR && \ cp ../libs/macx/lib/libykpers-1.1.dylib $$_LIBDIR && \ cp ../libs/macx/lib/libjson-c.2.dylib $$_LIBDIR) _LICENSEDIR = $${_BASEDIR}/licenses QMAKE_POST_LINK += $$quote(&& mkdir -p $$_LICENSEDIR && \ cp ../COPYING $$_LICENSEDIR/yubikey-personalization-gui.txt) for(FILE, LICENSEFILES) { QMAKE_POST_LINK += $$quote(&& cp ../libs/macx/licenses/$${FILE} $$_LICENSEDIR) } # fixup all library paths.. _BASE = $$quote(@executable_path/../Frameworks) _LIBBASE = $$quote(@executable_path/../lib) _QTCORE = $$quote($${_QT_LIBDIR}/QtCore.framework/Versions/5/QtCore) _QTGUI = $$quote($${_QT_LIBDIR}/QtGui.framework/Versions/5/QtGui) _QTWIDGETS = $$quote($${_QT_LIBDIR}/QtWidgets.framework/Versions/5/QtWidgets) _QTPRINTSUPPORT = $$quote($${_QT_LIBDIR}/QtPrintSupport.framework/Versions/5/QtPrintSupport) isEmpty(TARGET_ARCH) { _INSTALL_NAME_TOOL = install_name_tool } else { _INSTALL_NAME_TOOL = $${TARGET_ARCH}-install_name_tool } QMAKE_POST_LINK += $$quote( && $$_INSTALL_NAME_TOOL -change $$_QTCORE $$_BASE/QtCore $$_BASEDIR/MacOS/$$TARGET_MAC && \ $$_INSTALL_NAME_TOOL -change $$_QTGUI $$_BASE/QtGui $$_BASEDIR/MacOS/$$TARGET_MAC && \ $$_INSTALL_NAME_TOOL -change $$_QTWIDGETS $$_BASE/QtWidgets $$_BASEDIR/MacOS/$$TARGET_MAC && \ $$_INSTALL_NAME_TOOL -change $$_QTPRINTSUPPORT $$_BASE/QtPrintSupport $$_BASEDIR/MacOS/$$TARGET_MAC && \ $$_INSTALL_NAME_TOOL -change $$_LIBBASE/libykpers-1.1.dylib $$_BASE/libykpers-1.1.dylib $$_BASEDIR/MacOS/$$TARGET_MAC && \ $$_INSTALL_NAME_TOOL -change $$_LIBBASE/libyubikey.0.dylib $$_BASE/libyubikey.0.dylib $$_BASEDIR/MacOS/$$TARGET_MAC && \ $$_INSTALL_NAME_TOOL -id $$_BASE/libjson-c.2.dylib $$_LIBDIR/libjson-c.2.dylib && \ $$_INSTALL_NAME_TOOL -id $$_BASE/libyubikey.0.dylib $$_LIBDIR/libyubikey.0.dylib && \ $$_INSTALL_NAME_TOOL -id $$_BASE/libykpers-1.1.dylib $$_LIBDIR/libykpers-1.1.dylib && \ $$_INSTALL_NAME_TOOL -change $$_LIBBASE/libyubikey.0.dylib $$_BASE/libyubikey.0.dylib $$_LIBDIR/libykpers-1.1.dylib && \ $$_INSTALL_NAME_TOOL -change $$_LIBBASE/libjson-c.2.dylib $$_BASE/libjson-c.2.dylib $$_LIBDIR/libykpers-1.1.dylib && \ $$_INSTALL_NAME_TOOL -id $$_BASE/QtCore $$_LIBDIR/QtCore && \ $$_INSTALL_NAME_TOOL -change $$_QTCORE $$_BASE/QtCore $$_LIBDIR/QtGui && \ $$_INSTALL_NAME_TOOL -id $$_BASE/QtGui $$_LIBDIR/QtGui && \ $$_INSTALL_NAME_TOOL -change $$_QTCORE $$_BASE/QtCore $$_LIBDIR/QtWidgets && \ $$_INSTALL_NAME_TOOL -change $$_QTGUI $$_BASE/QtGui $$_LIBDIR/QtWidgets && \ $$_INSTALL_NAME_TOOL -id $$_BASE/QtWidgets $$_LIBDIR/QtWidgets && \ $$_INSTALL_NAME_TOOL -change $$_QTCORE $$_BASE/QtCore $$_LIBDIR/QtPrintSupport && \ $$_INSTALL_NAME_TOOL -change $$_QTGUI $$_BASE/QtGui $$_LIBDIR/QtPrintSupport && \ $$_INSTALL_NAME_TOOL -change $$_QTWIDGETS $$_BASE/QtWidgets $$_LIBDIR/QtPrintSupport && \ $$_INSTALL_NAME_TOOL -id $$_BASE/QtPrintSupport $$_LIBDIR/QtPrintSupport && \ $$_INSTALL_NAME_TOOL -change $$_QTCORE $$_BASE/QtCore $$_PLUGINDIR/imageformats/libqmng.dylib && \ $$_INSTALL_NAME_TOOL -change $$_QTGUI $$_BASE/QtGui $$_PLUGINDIR/imageformats/libqmng.dylib && \ $$_INSTALL_NAME_TOOL -change $$_QTCORE $$_BASE/QtCore $$_PLUGINDIR/accessible/libqtaccessiblewidgets.dylib && \ $$_INSTALL_NAME_TOOL -change $$_QTWIDGETS $$_BASE/QtWidgets $$_PLUGINDIR/accessible/libqtaccessiblewidgets.dylib && \ $$_INSTALL_NAME_TOOL -change $$_QTGUI $$_BASE/QtGui $$_PLUGINDIR/accessible/libqtaccessiblewidgets.dylib && \ $$_INSTALL_NAME_TOOL -change $$_QTCORE $$_BASE/QtCore $$_PLUGINDIR/platforms/libqcocoa.dylib && \ $$_INSTALL_NAME_TOOL -change $$_QTWIDGETS $$_BASE/QtWidgets $$_PLUGINDIR/platforms/libqcocoa.dylib && \ $$_INSTALL_NAME_TOOL -change $$_QTGUI $$_BASE/QtGui $$_PLUGINDIR/platforms/libqcocoa.dylib && \ $$_INSTALL_NAME_TOOL -change $$_QTPRINTSUPPORT $$_BASE/QtPrintSupport $$_PLUGINDIR/platforms/libqcocoa.dylib) QMAKE_POST_LINK += $$quote( && \ if otool -L $$_LIBDIR/* $$_PLUGINDIR/*/* $$_BASEDIR/MacOS/$$TARGET_MAC | grep -e '$$_QT_LIBDIR' -e '$$_LIBBASE' | grep -q compatibility; then \ echo "Something is incorrectly linked!"; \ exit 1; \ fi) build_installer { # the productbuild path doesn't work pre 10.8 for_store { _INSTALLER_CMD = "productbuild --sign \'$$INSTALLER_SIGN_IDENTITY\' --component $${DESTDIR}/$${TARGET_MAC}.app /Applications/ $${DESTDIR}/$${TARGET_MAC}-$${VERSION}.pkg" } else { _INSTALLER_CMD = "rm -rf $${DESTDIR}/temp && \ mkdir -p $${DESTDIR}/temp/ && \ cp -R $${DESTDIR}/$${TARGET_MAC}.app $${DESTDIR}/temp && \ pkgbuild --sign \'$$INSTALLER_SIGN_IDENTITY\' --root ${DESTDIR}/temp/ --component-plist ../resources/mac/installer.plist --install-location '/Applications/' $${DESTDIR}/$${TARGET_MAC}-$${VERSION}.pkg" } QMAKE_POST_LINK += $$quote( && \ codesign --deep -s \'$$PACKAGE_SIGN_IDENTITY\' $${DESTDIR}/$${TARGET_MAC}.app \ --entitlements ../resources/mac/Entitlements.plist && \ $$_INSTALLER_CMD) } } # # Additional cleanup to be performed # win32 { TARGET_DIR_WIN = $${DESTDIR} QMAKE_CLEAN += $${TARGET_DIR_WIN}$${DIR_SEPARATOR}*.exe \ $${TARGET_DIR_WIN}$${DIR_SEPARATOR}*.dll \ $${TARGET_DIR_WIN}$${DIR_SEPARATOR}*.exe.bak } else:macx { QMAKE_CLEAN += -r $${DESTDIR}/*.app $${DESTDIR}/*.pkg $${DESTDIR}/*.dmg } else { QMAKE_CLEAN += -r $${DESTDIR}/* } yubikey-personalization-gui-3.1.23/src/main.cpp0000664000175000017500000000321312603205714020150 0ustar klasklas/* Copyright (C) 2011-2013 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include "ui/mainwindow.h" #include "version.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); a.setOrganizationName(VER_COMPANYNAME_STR); a.setOrganizationDomain(VER_COMPANYDOMAIN_STR); a.setApplicationName(VER_PRODUCTNAME_STR); MainWindow w; w.show(); return a.exec(); } yubikey-personalization-gui-3.1.23/src/help.h0000664000175000017500000003027412603205714017630 0ustar klasklas/* Copyright (C) 2011-2013 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef HELP_H #define HELP_H #define HELP_CONFIG_SLOT "

YubiKey 2.x and later comes with two configuration slots. Each configuration slot works independent of each other and can be programmed in any of the following modes:

  1. Yubico OTP
  2. OATH-HOTP
  3. Static Password
  4. Challenge-Response (YubiKey 2.2 and onwards)

The first slot is used to generate the output when the YubiKey button is touched between 0.3 to 1.5 seconds and released and the second slot is used if the button is touched between 2 to 5 seconds.

When the YubiKey 2.X is shipped, it's first configuration slot is factory programmed for Yubico OTP mode (which works with online Yubico OTP validation server) and the second configuration slot is left blank.

" #define HELP_PUBLIC_ID "

Before the OTP string, a fixed optional Public Identity can be used as a prefix which identifies a particular YubiKey.

Important Note: Yubico OTP validation server requires Public Identity to be of 12 characters (6 bytes) in order to correctly extract the Secret Key. If you change the Public Identity to any other length, the Yubico OTP validation server won't be able to extract the Secret Key and the OTP validation will fail.

For additional information, please refer to YubiKey Personalization Tool user guide.

" #define HELP_PRIVATE_ID "

Private Identity is an optional secret field that is included as an input parameter in the OTP generation algorithm.

For additional information, please refer to YubiKey Personalization Tool user guide.

" #define HELP_SECRET_KEY "

Secret Key is a mandatory cryptographic key needed to compute the OTP or the Response code for a given Challenge.

" #define HELP_PARAM_GENERATION "

Parameter Generation Scheme defines how the Public Identity, Private Identity and Secret Key parameters are generated when multiple programming YubiKeys are to be programmed based on the initial inputs and then just inserting YubiKeys one by one.

The following options are available:

  1. Increment Identities; Randomize Secret: If this option is selected, the Public Identity and Private Identity values are incremented by one and the Secret Key is randomly generated for each new YubiKey to be programmed.
  2. Randomize all parameters: If this option is selected, all 3 parameters i.e. the Public Identity, Private Identity and Secret Key are randomly generated for each new YubiKey to be programmed.
  3. Fixed parameters: if this option is selected, all 3 parameters i.e. the Public Identity, Private Identity and Secret Key remain unchanged for each new YubiKey to be programmed.
  4. " #define HELP_CONFIG_PROTECTION "

    For security reasons and for avoiding accidental reprogramming, YubiKeys can be protected using configuration protection access code.

    If the configuration protection access code is set, no one can reprogram the YubiKey unless the correct access code is provided during reprogramming.

    The following operations are supported:

    1. YubiKey(s) unprotected - Keep it that way: Use this option if the YubiKey is currently unprotected and you want to keep it that way
    2. YubiKey(s) unprotected - Enable protection: Use this option if the YubiKey is currently unprotected and you want to enable the protection. You are required to provide the New Access Code if you select this option.
    3. YubiKey(s) protected - Disable protection: Use this option if the YubiKey is currently protected and you want to disable the protection. You are required to provide your Current Access Code if you select this option.
    4. YubiKey(s) protected - Keep it that way: Use this option if the YubiKey is currently protected and you want to keep it that way. You are required to provide your Current Access Code if you select this option.
    5. YubiKey(s) protected - Change access code: Use this option if the YubiKey is currently protected and you want to chagne the access code. You are required to provide your Current Access Code and New Access Code if you select this option.

    Important Note: It is not possible to retrieve the access code from the YubiKey. Yubico highly recommends users to record the access code for each YubiKey programmed. This can be achieved easily by ensuring that logging is enabled and archiving the relevant log records.

    " #define HELP_OUTPUT_FORMAT "

    When programmed in OTP mode, this option can be used to insert Tab and Enter characters at various positions in the OTP output string.

    The following options are available:

    1. A Tab before Public ID
    2. A Tab between Public ID and OTP
    3. A Tab after OTP
    4. An Enter at the end of the output string
    5. Each \"pressed\" button indicates the corresponding character is enabled at the specified position.

      " #define HELP_OUTPUT_SPEED "

      When programmed in OTP mode, this option can be used to introduce a small delay of 20, 40 or 60ms between the characters emitted by the YubiKey.

      This may be required under very rare and exceptional circumstances if some characters of the YubiKey output string are missed.

      Also, if there is some parsing - or GUI rendering delay for a particular application, an additional 500 ms delay can be inserted before and after sending the OTP.

      " #define HELP_SR_NO_VISIBILITY "

      Yubikey 2.2 or later has a non-alterable, factory programmed unique serial number which is different than the public identities configured.

      The following options are available for serial number reading:

      1. Button at startup: This option allows the serial number to be read at device powerup.
      2. USB descriptor: This option makes the device serial number visible in the serial number field in the USB device descriptor. Please note that the YubiKey must be removed and reinserted after this option is enabled in order for the operating system to recognize the updated device descriptor.
      3. API call: This option allows the device serial number to be read via a client-side application via a software interface, such as the Yubikey Client API.
      4. For additional information, please refer to YubiKey Personalization Tool user guide.

        " #define HELP_OATH_PUBLIC_ID "

        The YubiKey supports the Class A Token Identifier Specification as outlined by openauthentication.org.

        The general format of the 12 character (6 bytes) OATH Token Identifier is as follows:
        [MM][TT][UUUUUUUU],where -
        8 characters that uniquely identify the token for a given manufacturer and token type
        MMOATH Manufacturer prefix (OMP)A 2 character prefix, assigned by OATH.
        Yubico's OMP is \"ub\"
        TTToken Type (TT)A 2 character token type, assigned by the manufacturer
        UUUUUUUUManufacturer Unique Identifier (MUI)

        The Token Identifier can be configured to be all numeric, OMP Modhex, OMP + TT Modhex or all Modhex.

        " #define HELP_HOTP_LEN "

        According to the OATH-HOTP standard RFC 4226, the YubiKey supports 6 or 8 digit HOTP values.

        " #define HELP_HOTP_PARAM "

        According to the OATH-HOTP standard RFC 4226, moving factor is a counter value that must be synchronized between the HOTP generator (YubiKey) and the HOTP validator (server).

        " #define HELP_STATIC_SCAN_CODE "

        The Scan Code mode allows a YubiKey to be programmed to emit the desired static password.

        Type in the characters of your static password in the \"Password\" field using the keyboard and the tool will automatically fill-in the corresponding scan codes of characters in the field.

        The tool maps the scan codes assuming a US standard keyboard layout, so the results might differ depending on the layout you use. In such cases, try setting the keyboard layout to US standard and then typing the password as you normally would on your keyboard - the characters in the password field will not match but the eventual output will.

        " #define HELP_CHALRESP_YUBICO "

        The Challenge-Response mode allows programmatic interaction between a client-side application and the YubiKey by support of a client-side interface software, such as the YubiKey Client API.

        The challenge-response mode can either be Yubico OTP compatible mode or HMAC-SHA1.

        The Yubico OTP Challenge-Response mode takes a 6 byte challenge and creates a response using Yubico OTP algorithm. In this mode, the YubiKey makes use of some variable fields and hence generates a different response every time even if the challenge is same.

        " #define HELP_CHALRESP_HMAC "

        The Challenge-Response mode allows programmatic interaction between a client-side application and the YubiKey by support of a client-side interface software, such as the YubiKey Client API.

        The challenge-response mode can either be Yubico OTP compatible mode or HMAC-SHA1.

        The HMAC-SHA1 Challenge-Response mode takes a 0-64 byte challenge and creates a HMAC using HMAC-SHA1 algorithm in combination with a 20 byte secret key. In this mode, the YubiKey does not make use of any variable field and hence generates an identical response if the challenge is same.

        " #define HELP_CHALRESP_OPTION "

        If this option is selected, when a client-side interface software presents a Challenge to the YubiKey, the light starts flashing and the user has to touch the YubiKey button to acknowledge the challenge-response operation before the computed Response is sent back.

        " #define HELP_ALLOW_UPDATE_OPTION "

        If this option is selected the YubiKey configuration will be updatable, without rewriting the aes-key. Only non-security related settings are changeable with this.

        " #define HELP_SWAP_OPTION "

        If both slots are configured to allow updates they can be swapped with this option. That is slot 1 and slot 2 will change places.

        " #define HELP_MAN_UPDATE_OPTION "

        The manual update setting is to allow the static password in the YubiKey to be changed without reprogramming the key. If it is set it can be triggered by holding the button for 10 seconds, releasing and then tapping it again, the YubiKey will then generate a new static password.

        " #define HELP_LOG_FORMAT "

        With the flexible logging format the format can be specified manually, this is done by adding a number of variables enclosed in {}, newline and tab can be added with variables endl and tab. Currently supported variables are: " #endif // HELP_H yubikey-personalization-gui-3.1.23/resources/0000775000175000017500000000000012603205714017744 5ustar klasklasyubikey-personalization-gui-3.1.23/resources/win/0000775000175000017500000000000012603205714020541 5ustar klasklasyubikey-personalization-gui-3.1.23/resources/win/resources.rc0000664000175000017500000000154212603205714023103 0ustar klasklasIDI_ICON1 ICON DISCARDABLE "Yubico.ico" #include #include "./../../src/version.h" VS_VERSION_INFO VERSIONINFO FILEVERSION VER_PRODUCTVERSION PRODUCTVERSION VER_PRODUCTVERSION BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904E4" BEGIN VALUE "FileDescription", VER_FILEDESCRIPTION_STR VALUE "FileVersion", VERSION_WIN_STR VALUE "InternalName", VER_INTERNALNAME_STR VALUE "LegalCopyright", "Copyright 2011-2014 Yubico" VALUE "OriginalFilename", VER_ORIGINALFILENAME_STR VALUE "ProductName", VER_PRODUCTNAME_STR VALUE "ProductVersion", VERSION_WIN_STR END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1252 END END yubikey-personalization-gui-3.1.23/resources/win/Yubico.ico0000664000175000017500000001006612603205714022472 0ustar klasklash&  ( mQַQַl¬Oն4ϫhяi5ϫMյ6Ϭbڿf4ϫOֶbھrfKյ4ϫ ͥ7ЬniJֶ<ӱniR׷+Ϫ!ͦMյR׷t?ӲWؼXټNնnh0Ьν$ͨmj4ϫˣ0Ьt5ϬRַ`ڽeۿMյ7Ь`ٽcڿ5ϫQַ3ϫdۿόfۿ3ϫOնqSָSָoï( @ hPֶGԳPֶgYغ7Ь1Ϫ0Ϊ2Ϫ3ϫ2Ϫ0Ϊ1Ϊ7ЬW׹k4ϫ4ϫ5ϫKԴoċϕӌqLյ6Ϭ4ϫ4ϫfPַ3ϫ5ϬYغ]ټ5ϫ4ϫLյPֶ5ϫ8Э:ѭ5ϫKԵl3ϫ8Ь9Э4ϫeۿ4ϫ4ϫ<ӱ8үNָ5Ϭ3ϫZػ3ϫ[ػd(Ω'Ψaپ3ϫTָ7Ь5Ϭ-ϫ,Ϫ`6Ь6Ь1ϪLյ=ұ1Э1ЬRַ1Ϊi0Ωq,Ϫ5Ѯ)Ωx1Ϊ`ڽQַ2Ϫe,Ϫ3ѭ0ЬCԴ3ϫHԳGԳ3ϫ4Ѯ2Э:Ұ6ѯ)Ω4ϫAұRַ2Ϫ(Ω,ϪWٻ'Ω^ھ3ϫIԴj0ΩpLַ-ϫ:Ұ'Ω1Ьw1Ϊaڽ1ϪKյ+Ϫ*Ϫn/Ь(ΩPַ1Ϊ8Ь5ϫo*Ϫ*ϪR׺+ϪAԳ6Ь6Ь\ٻ3ϫYغ-Ϫ!̦?Ӳˤˤ_ټ3ϫV׹4ϫ5ϫψϰЈϫ5ϫ3ϫp3ϫ7Ь8Э4ϫiSָ4Ы8Ь9Э5ϫNֶT׸3ϫ5ϫU׹Yغ5Ϭ4ϫOֶo5ϫ4ϫ5ϫGԳj͐чlIԳ5ϫ4ϫ4ϫk]ټ9Э2Ϫ0Ω2Ϫ3ϫ2Ϫ0Ω1Ϫ8Э[ػmTָHԳSָl’yubikey-personalization-gui-3.1.23/resources/resources.qrc0000664000175000017500000000154212603205714022467 0ustar klasklas images/cross.png images/question.png images/recommend.png images/right.png images/tick.png win/Yubico.ico images/clipboard.png images/blank.png images/logo.png images/v1-3-not-animated.png images/V2-0-2-1-animated.mng images/v2-2-animated.mng images/v2-3-animated.mng images/neo_transparent.png images/yubikey_devel.png images/neo_production.png images/neo_production_33.mng images/plus.mng images/edge.mng yubikey-personalization-gui-3.1.23/resources/mac/0000775000175000017500000000000012603205714020504 5ustar klasklasyubikey-personalization-gui-3.1.23/resources/mac/yubico-logo.png0000664000175000017500000002630112603205714023444 0ustar klasklasPNG  IHDRS}NsRGB pHYs  tIME  [v IDATx^gt$u0A.6as "YDE*~:S$ۏh h~O>e1"vav9 z=3=g]U]u\D,"D,&@D%J.EE(@p@RΤ& N,Ns$=ere&5! ր dV ROw~WJPNJ _/5X>3x즲](XVUX< Y%83\܎C(XԭAYVɱjeVH/-jqhV `hV `hV:(׵' X 6Hnb~OQ\ E&U4V ]Uu$VBcu,N'@).GF2JɞFE 'P1]rc#N<"2DP`(>G~BDIϮ%"C@-!b#}jD4#jcc%BDHk8L>h=I '  ƻbrPV2&f7 Npbx,9 LJd5΁\᷷z6-.K=0DHGJĠ:$4BKx<N#T  bTL*l6,:0氌A{AY`814=;1N R "3Y$TT;k\ktfZ[P 'xhO_CK1zsbpD E,Dt4= 7)eUO>qtQ @g{`RfcP@`LOcrh|s5{liBj]347QPzd葚 Z?ę"q\TJ9xNNj|br #JGgƟfpD4:968yWml$6ٚl*}So{v8r2B4O_T( zO=5UoݱP0?G O&IUCrDDөcϜ|νe[ʯ] l[mAAgr J*UP ӡ%fzZM];032b0a~un(2 @d@{׏Be%(5 Dt޶j*y1dz@D%BFud5j?wN(WBA`@DxT|*j ଚbCAeUK \ R}r_cEhYG#"yسS5Zzr{Cc."+̅;+x0JDY$9oOƳ!kAWSX*c_9:x"=RrPU%mH_c#L#VP?4pGJ5-J G+7<3"֠ҟxV@`bDT7u)%HGJɡQ0>J?<]Jgr bLώMwbb-D\y.^Se?ڄlTr5ֹq(> ĺG"gtǠ@VѱV%ke*$<9> KulhqǿI3݊'""ΉggEČibDCǞ9L9+)c]etn (u D$0Sg)Ew1Μ|ڵIϻ#/ SNhA97M=kmzcHlwWURm*y %#"qÃ\1H2ak)u& " lm,۩'" @kvx#ѳ_D:b8)&0|Ddb}` '5&&oZg,SPD"11ƣB40[2ǞxxLD OU9ۛ+kfV19 GNFՔLfÿ'GLMOI 6Xk% 23zĨ W6-f@@$˶Nĺzr, _㿎!ęu&z*)MeXt=EizKmsUr N3ѧ8"tl䱆Qcr* = \}ր  ?2paĂ}gƞ|"2 ;7}ֽ9&Q\W\Wl}FN ^qBJ@?I0yj(rHEļ"F_9"BNsU9ָ7,U`CLvڵ5_V{&8>WJ2e;L6T)(EDU>{30oih+ϝsc5{;5Ji{PHQ4yUaͻEHGCGT./e\smQ/DD`ÑS}Iƣ] - (?X%Ϯʬvpy4zFO` ɄՓ!"jwfM1"jIM2kqVoT{6oIq-!Z[NPp4zVӺY@V|Рd(F;> @dOOɂ{ڽqaR^iIEK(6IZ%4t~?vW}l?ݺ6Tޒ/6I  Tߞ-YBPX@`/o$mZ+nz5745ek.D\Zo<&@hj24سƲs tkkT}[kc~ LȤ.D4k+`btbtQʳhLO;ޟ]+L]r8eh- =s\ipxϤzE+Ӹ<K\)`[#3k⤖ۛLZʔws=C ĠS ^oK͝ddcCd@L*PP :6hb\VedDW: F soLE,,AZmb.@k 3r//d)D4ߣ"tb)?bR>m._KL$ڍ ^7. NJB@@`Q)NDJCʍn@L)1N[uSB쨽[Ue0Cƣ]׊7{r7Z} ( X- " $\+uSʴK$Xغ8d,Z{eڨ@`.6pW7pKQ85D|(1XUAg/YYb_ZǢYJHh3mU%݉<OQ\MB,1-ծM+WTxҸ JIb0(ҫ,J,e4 &6q|z2Dˑ+th rL.oEM^A9),RLJ1h3.(1!)}a7 @ZMrf$ %l"3phEel]mႫ!TٻS _QEBθa<Phq)%GFhW\*"hj*#E&_,̢lXܡI:㪴Rs$XKnՄ&I]~4S'S.൯gfrY ꋀނ.@!WyщKDd:"V.'m.ò @+j:Eえ*W" 5XfxG@sd:::B{ uQj5.KAGVx K>_B4Gbj=;䩩qBZ`7!2Ss2-+^{cs=; m=eaH}OMv\[7t!Q*=W]Bu/#"cց\7iy##ڼ-D7-~.L: " ({ZK )e6éѧxΙTFOj>2ȾodDcBk5YLPR6J&YϚ D$tsEd-%g(;I~@1<K7VT5\^`VF *$H' *jk M`k+k:+0өSDsʹБh^p-X,W 5ywj׆*:0,< E&=q/bf e:(COF|[0r`,;we:ZbfJÉh* 0%$tY$9~djF\b&@$$FGO_ӐĞLe]ZT5Me;N=mȤX3&Na.7 6LT" 'g. jBDluwLun89oiXCٶ9BC=9yۛZ|d~/Ėoֹ궷~TRSrޝ̕Bwa,өHręqgkrK@7[Eic{]JXd-2YM&Ήۛ<ۋΧ~Tf1VKk7R9nZ9WLnKkɯaQW";sEƪYQ#CG`t/`vg'U4j?@c{=Hg hh Wa%VWʱUl`(]̋f`snsJ-n,ۙ]DᔈjZ-{^{\5D?Z ̐)0`e˜T" qoe-1D$jr{c)sh\*n-&X®̒cQ^5476htYș֚[`JNi m} ϊ.Mwc}_`pzDDĝ[~`D4 Xw`>n/"m5Z@!R w4VK {Vy#. -5EdJK`k]W>[#".* !".7 D$"_sofȖ"lw]֚%u|Ie) LQ{w@DȘvY52Sr2"pi.oaG=eaeB&I@`(ծuշo 2)=dZ~M/@L(1x*mծSlMwm>;B0>PdʁYk6Tܲ^jR3 "Y7T|hA֛{xlKZD"eW}>[ᡇiw1rJDD*\J 7oѷqRj"Dv"4sBTz;X8)k]} O(PDdιUu7Sh(uɤ5 t(R+nz{(r".&1X"1ZCIq+<{]-AȶfOx 92փUӳT8֖_]slΊBJQ ZT+䀬>'m%(#fR CSYM2 B±ɷlVo片Cq%$<^.D:NkspTS#ӧgGtX c;Z[<ٯ-̕X&D<ʓ[͂( !ʞ&x:CX鉙Hrt:9I t*ڵνgoInEi^bZZ*gRX@`h0ޟHG?"f^huml)5M^Q.,"XJ?b4͏ S]+~Gr2+G'8) rPĤ((vidŖx~w(+1ZI)&G~Yγ>r*$Ef4Uy26BOMCxR""9] >婾Ju2LZB5Z~!Q@h1v%--fĖ8C(1Zq{(EdfnkJ  SR'JH`nk]Gf ԁ1Dts%k&olt,,*U.mI҂.ZVJFz$`E]z ~Lj c2"nm]<_eK pq9bUR˶{mzrY@D":;N"bȚ{l&^*\FV'x0 %"^aosoyUe5b7T:pqF󫬲e`8Qe09:6Wh> BZMN=ZjQbSӝÑP"lZ#8c04-?}',ZI3Dvz2kg2/uEMv^$Gj[dw<*06\O= Z*)/<'K洄bnx\L bLb][*{m"{oqR;vA1DM0mkdxO{UDwYt@$9x=sgkS.DˡfQޚ7wEN) ``u@{DNۚU$ *tjg:9L;S>[֔zs tZ{<[5Ӟˡ /XAXiZM|9w\rvN0" G[rц3盽WDpDg{pǣ[k/6F~ED'Ǟ=9S{セK?ީ*Wᡇnhk>9E9}7}f*#!ss9q`G*ns/~ XEGBJo/%j{~nT0Lt=r[c: Xz ?H/x<[s/\& 7//{Jy_}X/sT~dvp髽ZVwȓǧǞYm_~l7y~{kR<Z>kG+rۺ?5e&;RJC;Y)e47?뽵=ۻoӗD zw?Ƕ=PޔVlPy-"&}"~C:ߟHO~d0|Ot_ErG|7.pRj"&UQDzolzޖOJ<>…)\\1YtjX+5*lc慨іRbNz׺7+PX79LGx??Z*WzޜZ>5)<%25͟Txr< ?,0SZ`O |]swH`RswjծM9xbW{>e<vݻ;ӧem^оv{=^kt2 +3095:}5_tSCaK͝[`&pxAYכּg{ݒ`sYo5WɃ>{ík7 6IܼHbRGo(uMfh^T.s iVKdR(\&x,Sg5Vt$.c *)F;okY:=|ԛ'1&jal |i]M/Ec7}ʼ硍# zw}l}KͿyNXZX$'CRc XIt<0>J@(+1YϤ&^x o(r6Wߖ [gl䍾vLzFϸ}b8rպ6 [ {υ-9)5)e!j*;5\q92`eZb  Y%6TX];㿧O;YoqY{vĬ[Z`.813G`8@@Y"@L֔ڹ^ CM)d7Ʀ%;7qY L^xV*S E\W4bZ< `SxjWG[2nP$"nTw=l<3cGfl&vumT-6Dd( T:[ƢȩmYN1,3p0c̅NHϖIQrB E`4|N2AD [ɍH!b^1'FqGө1NȈdb?c]Ԥ2xU}ѹc PQKUY ^AEfY"3E謹/z,OwuDs{LpcqRc j:ީXLju nd(HCVq$X\G:s2k33_ @eB"3U8$hro1yUwoÿ2=7[/v͖|j= 0Q@1lK9#rWxb4ڙKRJVp[J:c#5mʹZx0VsUrb}tk^yJgkTw>q'cٻb׏B}`:2^q@ZwGsh,:)Hc>=\sI+n\sSg…_ `?:ى;ouo.֌(zҹ6&,UL˶~ƪEh;Cm$S;?rl#O[h-{smGG~?SzOC5;L~Xjʬw}œOw}a򷕿g t䩳Z_qK(hh*Xf+|%R#O/)\U`Hn(X,CVMޛ۾=`,s̢Cp$׷~@O=mu'ǟ96 (EkvLw̅vƟXkTq? "P↍'F~_ Q_3w7&u-ޫBv*O]*zhdo80 VZr5_}Gx&JeZpY7YtܻG ŇMm %nֹ6k $Ϗ}EoKJoD\ ޏU 0\*e~$#Ԅ$X띖P|P%gkmR$\|(\lxyJit5yziw>cJ8"2WYi5̪pIENDB`yubikey-personalization-gui-3.1.23/resources/mac/qt.conf0000664000175000017500000000003212603205714021772 0ustar klasklas[Paths] Plugins = PlugIns yubikey-personalization-gui-3.1.23/resources/mac/installer.plist0000664000175000017500000000076012603205714023561 0ustar klasklas BundleHasStrictIdentifier BundleIsRelocatable BundleIsVersionChecked BundleOverwriteAction upgrade RootRelativeBundlePath YubiKey Personalization Tool.app yubikey-personalization-gui-3.1.23/resources/mac/Yubico.icns0000664000175000017500000412033412603205714022623 0ustar klasklasicnsTOC hic08ic10yic13ic09ic12ic07Roil32l8mkic11 is32s8mkic14ic08PNG  IHDR\rf$iCCPICC Profile8UoT>oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqxl+ pHYs  @IDATxYeuw;p32PXŠ[2jSI#`ta;_$*Đl$SMPU9tFksV( (wW=쳦kM|1G bG0 #_('tMA?pK~#' to$"oSz7Aww,~vqCj_Vk}Ys5_x5&jUxYuŢoQ3 rupE0X']?Gyp-9wgAEݭz;ټeY;?'QX"ojɻX[ kЎ"VM[O{>pK38l1EU<8?VՄnFQD~o`e8iu_<@$yфbL7k mo;#$I"Toխ%ϧ4[xpZ؝E]Gec$M(ŸHv7D3`I1SI*(/R1Q N9=j?Wr+WE˂9[L74L@hK+}M'vRPe?xBiiiA0މ˪'g'ˇT1%גw>6|ΝfS{56|_|_H:oC3 A)W;G5vY,A~/常ʿoÛGY0v^?Nǿ,̶PeQ$58XV^$~R$Aח4h3I?L/N4TA;Epk+?S^Kg>YЎ/Zg_SӁ ÅA~E:Lp7˝]T.ޥZ3N &(P'pBVX"TVi$4AW(]zU-n R}>s@ȡQh9owbr2Sw]}eiW_.ߢ8ebત-:Rи:r&-mF*@ B=Y)S(: 5MZN=*2#<:nE4;kI[g79b|I՞h.2ܲΓ6^J;!hV~ yۺ jIߥ*6 }$_MKDVXNGtԧXqa݄ߘG;s+DDFt,F3C@ñɗK9򿈂l6"ha7g00ؘI˯9?x\.%K7J >!@r"ۄ\:%(i&:!Őp7RsFb!+jLшd'ncռY7о2~]}akb\01 SruM=BVCm]AHgcH[ hn Nyrzֺ^}[_҈Y v 0]d ^BQQ6Zxb,׏<@@_ϮpA v|<ʿ#O>O~fY 7f`@24 ueꯩ@I!L`)̂ $wDL]%+.bYM3@vLUVE69="^ XDiݍ3gkIYu[[.bW_UWx:(y`۟KA~9VÃBBpMA+a&_b,1ЏCp U"+bwap[V_CSݸI`1%Y8$QQ}cZKn@׿pC%qJ|Z&0$YӠ!Lp6J#X$bT[iV$ C:|yH[ܻSnݢ.7!7 iS_![g>/@n@`+7x' Zz $qS4(^:-gR,|oudM ݁D 8pԸ hH vRd1C5@XV H,^].d^*DH;kI|FS#+}Xl\ENeKop {/J9|yzQ\^\?0C) (~B ڏ/C]ۃ@2v:#^rV..Q2⇲Oq.(akeGύW)B]2¯QLX7Ԧ`GB Ck_Knh׿`>5jΟ~A1s?/`~ޖ&p3%-s=jmTg ; D`\MYQ*0a \hӥ _ Ѱ`~ms|Z ,U" pqεD_J,@jd >EN%# ,U# 1_wVN-&/g~ZBDg41R }d8j4 Oʴ"]&/;/lahbŠAborrnR[~!:n(@_P5sqT]5{92p]D~͕]4VEZ4 t(AnI:@˱'@Amb$괛7_DƋ/Ϊ༚}(Q?@+L.:so+d ȋݰR<O2ߊ$|0NKSU?O{^o,pxE zp7~qx4WI5p$DJvM"N$'8idb ^w.2@n=Cq@!?V{h+ru}tE"8`bP8:t2[}}S.Yʦ'Q8Tx(s-7@Ħ*$8 eb$0ְ.Hl _xf$s.wEËbM{6F gv{=,d9gRc+]>f/NzB3i1视O~7wwwܸy)2O'9G Ki愔:mן-<д qn^8!<[{k&RvH0SA4i 6Z旧"gNzv)Os.]LG>[_`[cydoS]wZP_ {Ph#:q(fG\ߗѝ;G :eǜ2ń:`t>W+gi؆3DSJ-\F \=Y ai~=gX "N;Q*D-KvdZzᖆx{_GzqApJgtC6x-e ݍ>KXch,i J&%{2f_&gh߭q}Ȏ~L~?3).oۦ܈I6 "Bb #L<be%kCeѺTtaYj"O^y7viM 4 {}h%Ӄ8`:9{.ֈ`&%:_N<>{xIl- |l:J1E]EtC4h8'l- _T!6~Hx9t*׹a\YXWB dYܼzRk(데XqrZ+y p_ݳ^TId[J5Zyd.@NbH [+'#I* "Ưdo7;Nȶf#;;{% ,|@u w,|'?G>(F&рp ټ | ִ\aJ2s@~><(:p܋4C ѣ`?/G<v>G5QI BF(B5xwG7l LdhLF 'Q0zҕL]PBp+{6aC˓,9G1FK;/xN>UWgb{8<ECIX(~Qnڏ!^U0CwRxiy -bjl.i|yi ZwGiQ\r $^ ~--檯+Az < i[`LD@![_1r$0::Eya(-9 mҰFSJiA}!,j:yKk"`Pr|G9捛οd!\~s`4lu'TX`x@*0e"uģz{쭷Ɨ3U?v`=:^؈pѲ肮 u;`M{0S#x\(aYVvژ| ґl-!XYsݔ*YUHWgG/5e͐hS ^VxVaG&+lwE5.z_}i!`Kל ^dh{ }vO !`)q 8`2,Y==PQۍ8yLv8ůHݢ]Oer p_Hę),kQjA%[ 1:(d:!/z!D!Eū@_7 d3TY< QZ'>>0[г+b w^-zg MNvaབྷ-{; N#X8-G7<d~u烳)跜ûKZoiЛY$im߮ ӀYFt PYI>WW1Ɉ'Uʲ`/d>yI% >gEefz~<N8z##Io2$ZUe3=" ڷ D2fgYPz!^v-R,6u;E$UVRt/a1l(4O }sOb@b>Kgn3 XO/vS qLJ~A@;NkIF3 `s~Lzw7k@?Ҝ?h?QGLpr.]#YXVN%ؖy6טt~v4LcCR5g]GW}M!^m0J"JD * uҹ:U- eVQT A-<gԫ |ީHfvO5^x 25 ؀/F/IqĬ/&U, Sz{MLojmBh{Ź/ ;ﭫb8heՋ8ٲ ?`{?m0>MXg%4BFHfSzzNzVMq<*/ή%+mȓ!ޘ3-_+׬B'!iU΀rl Ik4](갽U vzNv^zm?06 X> ћu/%O,1{cpAuE5QI9&E`aa7 ~])\V4xdr] C,FvAi'Ɩ-{wT/{ӾKm^UPɂ.alpYӶ"NNѝ6?$PgUF+<3A947Fb7f>#>إw.`TӦpy4aq~i A|Q2VBhE҃=WٽxjY9rOGl?`?=j{Ȯ߼=G5],^^P4"$ik;+l"HraᰀsLH쏵zKƅ=c?,i(S:{PҔTQ{)+G8]]S>5d츰sG/e:!8CSӍGw^?/W8)G?K>h_iAw"ছv#e)P;ẇ`JRB{]<LȭX ulbp|0.E?;$$Ǹ ~^ѡe=zliSFL -w_\Jwfu6Z66W&͏zn ;@t/C$M4-0hPg;fÙ V}ylJX:V)9@|qx'epQ:ܐ?vzd qfos|x9$Jt\$5HU%=Inj:=ܾ:_\ϳRND}Ce m>o?7./o;\ EЏ\qKa%3["> NSueS`נΞmXO҄b&sWcb06IHDo:05rnuyV*z ]{sCUNO :á" ,z~4oDxp?}0f6~Ն{y|PEhvk!R_~JO2oIТm[G[@Ne/|dGͰb鲊qClr|5;eSƼ7pSѹȭ [.^,\Y[N ,Y⁞UҶp_N@rnqUQȥWhC^9lQML8$"/wi_1&޳WGyT:|FH߸yeN>aݰ8H)8c$VJAr]p|D0*KN3e/{0|rpl['Yy^A K5$Ew_`:o=<7yM73݃СQP.K^~mɎw-lH@^Ev'U(̮A񒒶:Lwt͕G 88g B{h޲P'ΐ_36D>hmPtQC֗)nEXr"~um+O'ٸ}VG<°e?D̄OA5~N}? Uprz@QTWX>a?YWV')CJ8rU#<T-wQ"=5qԠw_~x]p|U&G%p6wp#tVv6ѯ{Em-=r"YRSbJ,uY06qߒ\Ev[{i_$< 1'10(B6F$L{XmkI`'=!з^z3hӄ)Vg09Ώeiw ؜ 'p [t ggYK7'45Χxe'(kfۮuTZ:Kx69gzO?'{Be 45xL4KZůu6on^oEl>(fwρ ?bi3} _( YyxQ5njDQbw*[d&LgEnm5D$HVV\=조Z 3^*xjT)ґQ3tau`^ i*ޭ^^6R͚h~v~# ){ǃ-g-ѐy?J0%V@tޢCdzx шW܊mY;؁t-eYmt a$J}xwxПElVy Guq.ɚ{%=d* ꋶ[Ƀ 䡓^E\W&W4׭qV+柧D[_y-"braC: hsZ%DgIQԻ.RMogFqLIM-iYN܀)heW]oWbYMV/46Cdp: ?riݹv٣|Mj hƇt, . qtxYl`jvu߅2qA3hg^k4pTSYEgIͩ+e$ϧ.%B hM[k$!kSo 7Ge \Z`uϊW$>{4(ە+'(R>\̥Em8w b> o9aV) yCAn7^^Vx飜HEǦyepV=G'Ou=Z]Gbu`{DpU%vu9m( z bIZ6Ayt1wW&23}Ɵ@YMY&$oov3;" el>+?#^]uO0;ؐҟ̖ϑIWv U"eb iA 1X6BCپxBKF" eeyBH*d8w ͊@R_ME`\`Bth]KitϹ[衳SBP&Y\w,:|G1}W˨^jvKM>Cb|@O(ea8mx((n_@f,N"UҞr$ v'r+Ngh . Dl5C:=?7f gGN+4YjsxwudVߊh!k{皫Y PtK|[K+[EH4HGr9X1J×KT 8S#M V5X|3Qt*eDtPegLw\b>#|ְ{3%(?ߎjI[>6@<2gg"2p'k3W.8N h;[5iղS^KxJיlr]n \*w wߘN0،`,ܦ&8G`>O$5@*ώnFR:$]t;9I"Ѝ$oÏ$j馗d*{=IIJ[JGC`wEǬJڸPJ;Z}Zb$&i9 Ag&}q[Fyxyx\,o2~`gVGxDp 3G!<TP sM8(HT^O`+̰] )"AMR(OlT2X̭("+O(F(PG+z]{"4 uMTć AN~ĩU!-SpWaWV<3И~ tYW:c%BJUޢ]8;Ih*Lq?Kŷ0BF8ř"Dbvݭ\uVHá s?uKNYo?MzGlK@[~xtc,}2nPX-膌= [V'Vk׺]z V/"n WR0!VWCw+~^7&"J՛D lYhD+"]pa2x74㮭Iґ%`;YҲ-a- <>œTc,,n_&ybF_EK~#CYr?/_u{<.LIƽy H©9թģUsʤ~@{ߦn#ݲ_*}Jsӆyws376m*cusqX^"4W6YYV5n9aHd2Ϸ f'tVZ>'}@) 奋O⽭^eᬪ2vI0bnkV-l9B9v!ݸ3*@ı\phvDp\EKˮS r)W-^[P?ʥr-m/+L {SO.ojBnA*|Y<+tҽ!奱ol`0`zz:[3[ɽ&\*˷.#~)#AZo铐YS#WMIrY_ORiFV;mҵ$}S jż۝f[L>]q+8dq}VLUΐחxC@ ڙ@I\Vp‚WC HSr'[jM{tstY5~]٭~ƹҖ:tTR(T?1M6-!'Dͺ}bSf|4*^IM/m,u[JYvO/ wX`m4DO fe$S}*8 0ݽWezQJAe#yCzvlh@z1;2]gd B(z+h,@S eQGWIj-b͉ U[Is_|vգv/LZcƜުvC!<),?c/*I6"n̟Ó[3S~Gcc>jD@KCva;@FVS{&34^dquiRU'f{]ErdDˉ5~U^"-)\mF?2&,ZYXC?v>]w/b>`i>:>TU HvÙ]vp}3(Gdi;GWO5+Y׾,GNmë:.:fMKqr2NL#M?Cwh OQ؂NHRn:@xW%zkPhfqkLCJ6Ƚߤd7I^xf+>/'TqDxrvPDJK>21a&G\`Ġy{G$B Mhlу@N!̘M)d>1kqbKʢR@}$(CH#tY[yX)vKBﳻ q't:$oH{lm5`~V>oF+H_]bi%+AՐ_c8R̽75yJ5fLOr |QƾG"84I nY1>z3ОJE DDc+"$d!}E 8EL`rߛߗx_pt38݁u*1-TŎ`e~N@ L` F_a;*NC<}WqsD˃Sӭ )D 3{%Ysn9{*ӔYF,TkM X5W,(׮J{֖ͧV=Ӗݶ Ԧxydqz-zbKޙniMr, Q vYM4 ==3A3;~m!V 0޷T8jo$G'0px[L55(!'c3slm#ֹa 1;OqoTV&oN&GԷ ~?0E̐:hI͑A+TQŖ*@_{R!n,8 q]\/2Ҷbt"#HMY}o)J|OuKܹ+P[.Bxu11(Aв(0|X<ß}mκ"MhhqHg㱍[1`!6-RPD;kLΙxyI@|h5v}̿OވcC$x@H7FcAu2@$Iu.d(kB#;MEXgGst\=$ @₮@lD7T\5;%?"o@Z"QБ]\V(7npg E9}A~fja'c@b&)6s# 7r}2Q(NT)0CRcNNǫG }d}|ٔ8.' V׿|hKHN8iw e֦0׃CAk)B@ึKhm}:>Tiݓ{ռ"`tT"ztuʷ_CX$('t]2z1Kڌf QZ ntKdl>i"#=娃%Qv p Y@ۂNeAԃ8RIq5r[3`rl̻=)'ƒ[p' 0gaˆ$`}J9- KQkI@L@jeCNBFM)Ax)c`-")/7Cp@@rQjN(g`JDG'k `@M @@ʃ(gq{W;@Ѡ W"5g#i-?#˕U`O@)0Pt\N|i/ F.gwjUra=mQ9/>E.cvgyoc?ys4'Q+;22xJ |;@qo0@PB%G9%0]˫qA-~< O)A]b}Qj˺r>m~Y%.zh(F,GC]Q#b#bp[n2pCVMыdѓhokq0g"4 L;\NX d%1hDWC?mRnkrt+цh6hDr$(iԮNhmz ?kIqĒ <߽{}G}{nq|P,aJ, v pB`HtFr%6t}\| ܨ-xZ1CnUZ[R4fw2bG/i>Ü><`$r1@E⬯0J5?G;{cw,pW~ /d4 Ap':Ŏ@\uzv N˷ߡc;AD1#u';}I3 Ky}^i,htD[,3tE:{a^N9Stl[d`DW1մ(#q@}.@d~,$#`0LʁJ(z@B6APyr|- 8mZm߶##˴`I C7F8?G-FsfMqrAc`!0wM`DK |U+,Rpz= qb5dئcBFA]}!ik$RWij*A.\~]YZ\[;I;pTJgxGh!I\mG zÇs,5J{҇E~cmleu@T5)n*A :Ws5O~yB%HOYqdpÛe.ր]@c@C]\q}h$ҖO: ͝?U id' 돹Co?f?-c)A! olA}pVԝRډ06׋Z࿖ CԍEЇq@`p35el05`zAxw^`r#)X?J H4>"x4Jm2]^Fpw"ckB>M=Q6t d/Sp3ߗ?։: phM P_<phz@z)h@Ž0`WB%({|+Ԡ[H3>x"`_}h@MkU{3Fup¯验,6KMT G[$)]b%FM.yd kBxayN큄qXՍ Sd`ǶacM_ei`v}qY 6oa"{LbӫiNvlfU[`H#\zIGT/Qk>4@P͟i?1˽4AJFup \{ &e0Ii:Y]Y?4]ɿ\D0mY 7ֲeh^}6/_OyK?9 YBC.RsC1?%U0D?GARDdHWm\ݸ 7绨g1/Z$=O t}T7垭#@Zеg|˾=l!xlzx73ӄe`Z !c@PZ'Au Io",r_!a7@q8K=5V& Hv&$149% .iH噆_-Q ΦZjx' Ьݒ 󫹩=UU@y數/H [M/8CMjQp`_~iS]be0%TzK,m.uy-&J3P=C]ȯz.&*V>N@Wc\b*yg{fJW09 3lvwk!6q*3"nBS7jNr %-S='aE9cLڽ!ze^#˼>vygvq~.,,K/X 5/|>=0wvFp fzq$q3! hZPu$y0_es?-D> $轴UtXjqҵ<]0ޓ\4BLz],D N!F/$$ HWP+P<0[;PnBv<ˋqjPX7W" m4[朶 q>fbJ*3W"R'X\")HKl!DV~{m'VycpKXY99;ÏB}0ge}rDC@/pꑢ/oNU 1:)%m|RD'uSܒa}h/l4%zL?B,Q69IJYpqu<-:WAKor΁̔CA`nfBJ:OWyN2gS߲ބ6%=b06Hq\쬞֭eÔor&|_>Qx"PO >JpAKȏa#AV.+hYҗ6鱴 @Kֽ2[sQ1 IlXkEy߉~rP)YD!-uS˓zT*OԅE %VĎ ɅsrE!(E4 lU|I=p|qsLjWu904۷iEV5WRm[OA}EFTvz ?B1AZVVtʷːJs(00\ n]'b-X)˪Kv؉&O3RcێA8 *NN W+Dz94'!@(yBh(NKK4%0=XDwh.TS|$Uȟ/ p;[`vZV0B~,!h#.$ wb$uMȟhD|Ṷk QC:xye$BUZqu(5;5Cǖ&WA}X#JΞW7{*9pk{΃01د¢u||xiD: OOŠ{09-0e;`)qkj6PF&z\"5 *7lrOدE;. WYePѿ8/nݮ{:h;9)D[5t[oJJ/l 62<:n]V2ݰ*Tm}1+Z2$j-ĉKS_x}l{4"r[֎UI.K/`o=KT:%(M bQ!k y=UnY uO/hm$Wqlu],% ,K 8 W'xcTu32VH$nOYN{~Hz|*%"UHT;"@v%Dl)HN>t6A6[Nej^ß+cw?p1O}"r)hoX+L#z\ۂ,]z\eل3JbGrMœނڐA hK\tZF@L-" YB\$!jd:ҤHHvLZHs$]A@+LeTC+Ar&u~x" g~_gv0<8N{ zv Ч-YBƛS h!H"2.Y)Hǹu:B+&83ӊXGS"L3mouQ[}'Wfa/4/U)n ~E=v!Ү9 $k,I0 ӽ.eK,JBPPZtOEĤ;`c6/{dK i^)ؤ1}ȟ/zg1f-!b!Z䈉d.LMS*ILOk_N$=&G_jީè~O_|жُ~q[K6~Og׽0YzBjN 6A[K| $r(cTera#$ ^%T:0.(3ч(+%hS"Q%3HQWrhm9rTca(ҖNsF M,VԞ1VǡCⴥu3o<&"4 ~nG`%o7FGgh26JW@4Zj A'"RFDVb Y `( > yz*?P" W,$3g={`DeF~˹^iQ8q،J$B;\2R> uU4 A"cUihW7dd^/^= z݇IOҍY3 @yF_ 6oVLLя1BݮO>zꨔjf%I@K_%Fq[!ug FLK:(NF۰q1tiVv7*/7gN @ Fz?d:Tgא8Iz+4U$Il1p:Dg9JM0!4"i1Ț#___N9|NszGN>ˬ_Qc/8OX]f`YWnͤ^VMԡNb.on8NG">d [e }A% sFsAMj#1CŃv (vF}B4+爴uQh=iﺱw$2i+Qn3KuqN'`z͔D v 7o7\Xx6E*stmҬ]eZAY>fUFy"P ?"=I})A|}_s2(Y#.C5Zv]9d)mL3ԧ=uMܿq ZC? 9zGsԿz%CGLg/:3 *Ti'^AJ&x{<,{Cֵ㴍?XG=6;{?fL/x&Y!1#(N[ؼq\)ll\ͽZ' /N ~r/ . 1bkbhRln9XCrxZD(6UZ7$6|RD1 d)&? +lAƤe(S1GT=0 w%2w]q[bUSeG]l#=Tp(k5ˍo{(:12Q|QJ`ƄOC8$UKhE(E@dY$b.PGky0K[C2S9e{EB&dðN~gLa}wۖO * *[1XYÅUAz[T5~sx+Sc՗y "aV jTcTGu8D=fsN?'NԨD*B XbcS@i!%)Fbi&[?ܲ,ڨqnh;pWUB``7YS;cfYגJEC@oHGɳN\rl|6ϥND)ƐrvjUR1c8eF'1f莇C9nq<[ NfwmG? $,஋yNQJ0'S"Kb!sq5JD;U&f)rn5 G3[H Jl\E!VD )s++:*+w '?3.0_r{I1#_G}0gU򅢷VdF 4e(:W1h6KZf+`֜>:ZL6b}C^|CH8$ĦI TWp_ީuw (81pX 9w/c\:Owe.q(+Ǻ+Ge`C3#NI|<|ߠ=0z?fMG읇wou#PǾRҋWx)5;gKs*D#{0_xֱz0d`fՀiW?<(~$)`Va@$8\]hcفc~ wQ1:*K}YW6sI9!1KfDQ+i?S aIGN*u  ?Y([\]{1Bbn/.y:W? M+֪c\p7t|b)"Yczb$"^D *jVr:m2B+p5Avx}7hѯ串<~𱇾8AlO r;8RZ"2Sˆ.$zD :9|m37DŽ(?J'=Fe u4]qR4} ' sz5ĺy0vȾ k.k) "+g6&A+ʄ<30gt4Y<3'}A|h-tqS3(5ݦ19?CӔ`tI,qvK@Tc}{K i˸$c."ioDĀ!ԙ)="1#H!17o΂&\f?\Ñ$ &G!,yjfy:ACv΋|D] b3@;L]Ne[)+Gs뮢~kS2CJG}#F.sx zBils]_>EHy{sۼ J9.( &C-(}R ZuЅc6Bd<-8%;}xo9 ,3o`z%FDJChD@ ZN粡M)'>ekGf'lC hw3zn"pr'v: >ɚ?_?ʁ<@P/Qoe_"\ԷwXJ18$ZL"G#hmȌ53RO@88q4})7nR!) h?<3oz;=&wW5α v,02 C(6{BEe\d4X '$a*IcGAllZ`@HaͷaMbpq'=z}=uX f`wo;=FXl.lsj 8A P_26#"V)(%߈' B7eو;P!3@DJwR"E=dxun"mn:G]fw ZV^/Tc2KQm}.B~цu͑O㘲qUv u͘* RY us)O8d9BymYl`讼:wTe³xO+0J,s#p/nEd ܎]܅o3]Ԫ:t%{E(5g~ ( m6^ƓM c [\C u?錫J@"n<+)}71G\X Z>!O6ј6Ɣŝn:v_ۄi% eF8#̅ņCp˜l 0y:bў:Ъs$`u(Xap+'_tSH'30g ]l@@̩4 @q#-NV]LUHmˎԄivE,]b`wp&gudj ag!s*uԍvg{ {20P<@ԥݙa1th;+Sh2v۝ʰ1{`cl"R  Z0 {;N:Neiv{Saky"H!gK^daD 8-e);-GoOA{<2; _[{sbZh,s倓K 3O2N ~]pR~c‡0<,í@ċNVF)v[6R6? ,P(.Wޖ7<$s</7ӛxO(\TTwx("lu Dl;3{kߠ`NO<οA6CfWnU< j D`dlLd("p92O45 6|%;Hq # ~>1vuǠcӟ CEfw[X) \YtA]簉#DWv$X H.2w݈sȖal췙#UOj giI~쥱sBG =ȍFiF&-S~tћhsEU`/JRHU%Ng(n2Qhl `Y!)ї1 cH RkqSF#{{?9 '8q:濴ڹk$a &w DI}T bʊ -F})J|i*&`w0 X:٦ L@>6]jxT3-sJ(gQO;7׋UJj@mhQM١8{P- l]Ns3:eO=_ QPB8>{GoŃ<2ڸl6MzÝJ(+bY&ACn 0.A2PFW,J lexpn dqDzHb{:FOۢұBzHuu)f=90JIc8}c~p*c "~ M exsh7S:F$L _!ȓ&w _i-ag7m6d!`.+N݄QeYK`T}\`!5!;6ܵ /r^x;IDە9^J^e,&u\ט3 BskA=|D#k >)D-83[@d}ɹ2P}ȊǭCPپCIy6+q Qwu G1x`zS{k}T3O j#D;1Ӎ,tXNȧE|w=/N$4 ɧEc.$)}+͜sS@jsh >Tf4̄h&*G~<ݻ ;"<>f= ;f~ :nisVq2EH|%I4gd(;1"1gQcD,@>jLQf*GwĆ jQQ]]M ,cV{;Y̳d؇ƖkAI%S <`†$Q^sY|9+\*;%~ 딳*CCQiu>ґUhC6u.Ԃ^.3ӟ$) {Iap0B6f[6Vlv|s3A=A+3lL j>Ψ.bVU cƜp#"jopAڎL6t1`@標'A2a3ӑ:}g!UwjV_~s7.GxL@ ľވ~PIULΧ }Rι-觳./|o JW\1Xt2uQ7} +Yǒ̪K.#-~~Z;5)7>) J@g^c?'_SWQuo 89@E @<$a.}QDVs RgUɹGBp{k;/Ym;Fu~ Dqtd2H l> 0a_kp0K0b2߄y09ן_J9GcCX)%SBB F{3 3,v3 ShZ\]qiӂsu9 Ju>1H5#!X1ɖBрz0Q4(DROѬpm Whd}qnyܑkߦl!>Lڿ&2B{*029>/P1ʔK&c%}D?_3!E YZSX40< ~`'Ǎble< CnS!}}2.@ &FU9e=QnQHL5sv$Ŷ۠K_G}`&GLg9boO'ڵJkNYzd<0 VgPH='=TVzk hpq 8l@9(L "O-( P;?8@{Oۋs r.8M];y䟛އ"=YOs'$ %8M|kj}#,:0~Fàh'X }\ϐMWQ03Ζ)uHd-ƪETg&fQ׫Kҧ>Pw5ÀԮqcnZ z"̰H<:&b|gbd"9DD.Q$H.;p ]A0 2AX4l]-ov_"ײA`YcAyw)ᲚJJq О_PIDW\O ;WN -˱X xV"o.߇Aŋx.7#Y[xEz&׿$-;Y(qrLs,h='PV莼yGV4(Q_:F/a]O@~5 N@um&l-0K-(TPg_A^PQG+ v(B$鯍0o [n/Ĭ P8o&N+ӔW㬷Wy " :etEwBvGg]f>.^n7q:"mR,>@ mfۗ; : F͜hS-SbZ0"f5 UtsD3_ xdnȯ )8 ]9b/EO9N)F}F(o+\єV#Ȉ Tb#6 0ecĜA9N2j0^uOnP A)hdAF<$:8IGJX$+$xP#פֿ!?{J)|Qvt墊e &>pZ[H?UgZY ĮO+{e52;5UHF ͇~^]\] Hsx0 aKqe] ii*kzNE~BI7 axש$ϡڛq[cŸ?o<Q%hrP%g|-{.d=L*ԁI@ZXY DpXAI=R:m:()JɃwQ L%乆ilv<I3:srr,$)ZR-aCM qqx /xZer} X1ù<.a47:qvi-)R*ڜks:˶q,/׹W^H-Y鬘I:YO4=]s, @û"E8$+OtJw2%ly4 (|A?c883 סKb$+-Bv~!/gݮ` gnj1Z#)-湿eHE3Tc lW_x.w[2(O`)uh3-+Hk]lW9?RVVpj-7 | |X`Qc;NEvEAV2bʩ,[+1"oEL_DdI6svGBG5M8᧪3ȯɛEc[ռE tGZbdxɕ?G~oRfPM͙Rx(' (2ˀRF +HT \yȡU-n9\0uA@`.tEq,gha&f,!3.~HW IU9[hι;n= *PT>nUL$h"BDi<=Hˑ z r Q vg!XιY&"5ɗa_:GeoM3E5{&",k?0Pgs셰=A)%t9 `4{ɨkw{_{Յ>CuR &0n(?[{$QJ1@ RE)Ġe^}rO3GBȀOEӤ4-6#c1mo,'/t ۚs&ad"#׳VkV2d N n40lb!J \03' &P"8~6SoW0A%䄥Ѩ*a>a'<3aX ,04 oAԒ4>3ڝW7 k5eD 9Hv] !N׫!^B!3 aE60atc5.5:5qTrt}$K>tGy}<^w];xՅ GiK8NyJ sW99BB:dm#h0߽~gpZZTh#fw"\0Y'$Uo49ؠCi H"EВ$#YD:_w@a 3+%91dh(DGI |\YfHaA-+e{S[n&spxߗТ}$F~aIJ:笞ĝ "ތv9@Zk]`waպDfa/'N䜔^ϞMIΰb:p^/ $.ԙ[Ζl/z4 p)z^fF~ 3N6J$#VIVȒ#e΍ɬfDX7(mEBwAP2/{ 6֑SUʈHEwEy"p`ݐ+QMVHYСa:Ө7@pþ&icnj7 |ٛ_QBVu.!\ki/ZV%NcIFELF@2x%z@4w|S0-Ӈ~6Wa |x8-Ԏ9=i8JwD(orRhw8`;^_MTڕׯM+ n5>op~H_,'KQj}_lZh'Cc!#G%/݇:H(x(xd5ws.[^ѶC 7̖y e +w/fq^E[lԓ|ep_FKQ95B)2Q.r0bkwBp>S2_KkKtyc1mR[KKyjE z (Y okz;nqƄgLyMh5^xŝ.[L`GjeԮac^қ>_)uXFch !-F< )AI ?y;BNB.ƙ0@ȤEYAjdΑI2E$@Mh837JO$rv\z\qBaڎ2>++7✻pF:^v FvM{ wMc?A{ %Rth>Gd̋w1뻻GkkqqmC,9**i[Gs?xuH˩ՙK4_.~(Kl+~`O`x||/ %k.5QeJa2 NĩόF @0Ӳ%OܾiLeq4մ܎"C ,KZ 18L; Ң;9EM Mc U=b87 'q5ǩƦA)wՙ̌"3c>ui+xGiXx ,H҅+٘&n lTH0W) ʶk=`~⴦{LOݴNKs額{PD%)IN@g]TvZZJom=hz78MtOFwQju }r7B!$kp~tu xCn?p^n$I+E l {]%FؙZ$$,q81x#e\7Y>p(N%LlNoi1b H<$mR8ld89s\'n$Ȣ-Ws(#Fw|jW\7B.%ϱwx#?ߠÔ|%g-$[+JfeD ,d9jT^Hz_g;6d+mS"Xưwo}%jH'@1qѸwȧpV23j )L"GX~ӊ-lv^@QR\́`Y~~$BqZ?\H@:o(E~-RzX)R&!(}VsPJ.-<09g,Viksôi_~ߣacOTix>bzKO˭ХUlhbق68Cg綠Ó=nҧ8MɯMStw.x28L<@U'w:,zoc! ҕ@U?d6>ك*fVB'!F@J\%5N1 N-FJȠ2Y*.nEvFO@NLjɭ5p Ay@@puGf p$Hh (8Pfm^sc[ϳa4'(QI s`~v0Bt ;d: MK+f&,g$)CK\'%h?r4 (*T̶U~yʟ|k~Bx>Įƣ>1YU_lVGg>L=SP5Pɺ.fZң돺Nb?s7>ބ_5;I~b'zPEA}x(ݺ$0ܺ$?W5IBG^K ֶ(* ^F1C4tא$g?A&ܓLE,L p9 "ď|"[GG,2`:F`,`_{ J*Y2ȗ؀'G DI!oo/ 9/ K2U{CzrO?JvLLdvų<` KZLJ$Pai3[X`=T2vBi'p[HSȫqB"~OC 5@'; UGAvLַIb(r ~`N ;iux=G-ezHJ!=wOwk)=VZf$5izG]|\`:`~0=h NLT'@zIl$E߄'xVVRnb'" kpF:Y>fXPl-~ߥ8'ч 3I`$qmk+3T8O#I4FӒAbu,t28{Y)*]pt;y!ť`8gU`4?QOfm o)Dz 3% 7JO=Ra>u}GFR\lGb,33utjAp~ e11C΀%gc6WRS';>ۜ+#/N9ۓ2\Aj Ng}JNG5sJ1/\VEH ';Q_ETpw:y3hnpzO4²w'Ԯ +]'0zJZ%Q0sܥȍ <N -r8=?nq'=W Q5Ik1ª'id6/?2,@/70*S, o.o So`B;=py%t .>VO?=›iu}>@]VH'7X; ;4npjlfmtq:**/PP'p.߿3I~0*=H갂s| vb<n+N!țGY$ 8і@ znf19x-]L=f<"`2+VދG XpDܻ.:i! 0i!!uB 9bu}*@0 ƴwJ9e،MAa$pY&@ @ʽ&X+M,EQ\*MV97t{ hIሯ^`^_ϒ"An]"t7w'z{is}FUx0a$f C!Ц.h T&B\婸 =h-:0Y~@l+NQD8Mn@tw#| j@سt =Z@gohChZ?9NnLYF#ڨ"P l`v! 01bWGqEXI.,8q^W )rnm MÌ Г[ X!VWE`o߂ o~7+/?͈~uuaEt1fŁl&<ed`ˁwfAlď.f+{ b9U DqlH\ 4c[}'X뤟}iFb^I!oto,0Mƣh 5P쟼i٫@o$uy& QާV u[-@h+{*h\ig&/`!} ijB;np !l]8-YV˒έ 0{9^T~ &N}@-F' , L ,xV[4pMg `O ؑHKInୣb(;BV%mn)BKM,“O}a -VىN7Pt2v{42#F( f!Th梳ۅ]=pt.`>4`# x\bWN_` >ӁH=U p PezìW~: 7MCbOC;QyTJ6^TJhĚ bewǘ| &b]^@0ԬYQLܙUK@_2tUp9&ΗI32Ѵ*.sqڃ '/XHUz p=\]}}5V!I/mP9Xoퟤ}{Tma.BH 0t'HT'$PS'#.p'TZ-$f682Gulvʂ>baoZaN&Ml1;;"VZWk/bYjQ!.;tJIH ~Itd^ci0KPf2-kHO`~J5w=_?ΖPbBz D~?p,-J[y`Ƒ6'`̘GIڕd7TRD-a/zP/vg7FWwqzA_! Xb̒:('~?Bg#x>ss}a\AɁ5yu\c-c4aV5;v_O7ZOHr-[5]B%qF"h0=^66 =n?g0O6m0z޿HQ_݃EUl j=i(C-r_ ]>G'td_{t/]\8FH]W(oz?m98B2`Kr/}W?xVwn|c˃˜(5a%X}]|h`/~:a)qcx"Q3; UoRD-FfQE7VSF3_B`TyRx>y*R`yM0ֲJ^soo/=Ǘfׯܸqp}}t ' ,*0*~?WV;ԡ cok̪9)iHgID-&th5''Wl/-^<bx~EBxETH٬yȔC)B#pHseu '=--ƀ;1r!QW[,PRNG< $}=TuJg:xhN"]A*t\p*k*%6'ܿ(p.>x0glS ` gg+&\!/)u|wցn2a8SHDޯC'&;V5}bKYW? p;={SC;ܤcG Sq2ǞpX2~3g}*_x nGH$ͧgcuYl?7Nt #Ezۧ Dto$xoA,cD_x<,Pi V{RG0EK|z6~ EIWnN@OC] LG3} [Piar{}f G \e\˗"$%D\QfɄeqD r-.'{~1!0CT/ S>.5bo `&$ v/+nos} -4k[%]vf#[rY>|0 U,D݉&>ak( %׻;VxéD  A`HO݇*UIDAT@g!60b !FG&E'-Z~^HLt:(ظdn" ^<>I1 Ww]*r)Bx]w{dNIGymrுHli[Y<%+}W9WE~/rx [Y"^6aq=M"ƌbxZGz̛cz~ iv`V,+V !˼/"~0te!al Ϩ䗟N7Xw,8Z[cn_zHA!"9ͭJHcCk?H_Sz* 6/W~iu+k`ʀ}dL*pp'Lw|ٛx:Ig0z3OnmF& 9tSfO!=3I `WOK+KǮ?;w;́{EچQC*Q16kA t&X?$b'#9.F!Fi=P-,񅉉r=-DMˌˌz ( DqX<)p`G%5jeT޳ @#VJ:` Xfcv+L7꟠כZ -A\g!TӇgc,pd2H x lK`տYjTRJN7 /~ KsY&8Mؿ1=/b⑰,&]REqye~rI;Ȁ/^߮T Jr컘;γw2y8^w9aw?w%ZA'<hKJBr+aA]v0nG_ RދE];-nbCi %h6;@Lw{X}>g6S,a w -<M=%ZLߗa ~$v_|H){/g}v>͆_C:S]y*uwӟ9KhoO+0{؃Pna'+e# ^ ];o>vPzx3)Y8aDDǖ= a3/?$X.Ls+l1(%Kx:~!LTεH%c["AOP2y?adF'[( | |m=p*s˪luePS"/z^fn!@X1o}[׸<~y9a滠zs `m3X*n`#QsՈE1׷Dfv%B;tL'ttp@zD%t$îO?_9NAp"zi wLw=u_QSODBڽ5H3 `b8OR`aTs+< aZºVEտyMi &ڮ^ b+Rb=zo? .! 0U}# '>FDo _dPras=3x- >Z57Z3ט]܉Lfeį|W.+>W) . t h,3M֪-,IWuA<3}TIfyd bX”"W#F~t28ʃX\.A;g]7+@'(*]\:5uÑ\[Z0Nǭ0PbH.#R'B!#3 F!J19IՊR'dQa1+X8::.`nZoZKN?]Yd&5HM~P B * b+<6!qQ^Oꐭ"̦u][9p7o-~oH,݋E;CFC6sIHklY(C{6D8i/A7nfX/(V,{-H|lȡ-q>4fÓ_HO!za0P_zvguO>;^=jlP2zbx@;%?ϦX(٧GAԆO"F/8R{/x~gX?s}?c3by;+Ù$N@3ٍzn@d(q obQO:F3P6#.RflfVSkW`1rX%G!R;=V<̽6a&!M7L r/@~^AkR mkiNN-/Xq9F Bf}nH2X8t , ?$J 5z#!i1!}P@eͣ`{l`:Mog C ]KPVT8uF+/{F+ +<~⡇ETzܪ.l>&ON50s\ 9!?PC0х'ۅʠqfo4⛘oV;YN!{K-m[obI>8`ƚ)p:o0)J&'Gs_FoC[ aepek98FiLY 0g A  7OϯX8'Y5]hj Z99OooOԴv ~4 L}_}3]7?em0P7b9z2jO8ɭO@.u|e ewٝd ; 6s:25[X9. dN:Hػ~ |MjKE6nE ko-(G{=V1ڻn˵#/.9" Z.s#=PFWVF61Dy< ]f[2q (9æ,9#!|?ֱFBG=9Dw4omo9# WV܌KEd8F:lV9yE"?.޸AR f/3TUc3 z~zz #~'~[,cwTr"#QXl9Qd u#o9ĉk/bX,Yئqzs>7D "*65vfNy{br(Gclg>nyr rrό,a9;@1Pc 2H)f'{Ԭ勸&7~d^yE?|5,>@$a!`wQ| y  &8\6(L%^&R9P3D$ɿn)a0BF6~+D\\|ϔ#y~75[;y Qx`fC\A_|IXKQUˤx%Z5G2&FtǯooiT6w8ĵUuAҏ!sbҴd.#KYbe}ԿΈ~08J{s jC@CP cR~5ME!Y(A" QX Bl9ɣZ(=~R`_qj:J~3E W@SBL&mSAi_,ZЛkZN<;/ ɘ✷4GEJ\Cʑ!CbD˅&J1@ܬU3A5pjnO9"I9T]7'Dy`^ 'ʀa0jf);yYdрgk8̗TnF"CcP0ɿ؆1I>_Y P_EP|`I A /*?F~*ECDW3;M,Mqg|$MN|&׭SxCci0,Q̈8L2w`*Wn_Fq7V2F78 F3dx6+5CfeIA4N!3/F 'E~r%}FJ )zvR=O@g&f $!J -ZG$!{T T99( O?r :*-8~F28iY@U ZRod,fqwM{@|TxN}Gg!JHٔ4L(5 N{Ju;8GNywD-`IC:KnPS_{{%Y5kRe$#?4%I G5R;?2</wkX4>^7a tҽ¤/_r:Y"\4a_нr=21CF+@{`߹DP*[—B ~> 8ͫ/9Ѡr5nDժ9gVa}'O?M/NAT1# ͵}L$`W'O@5*Ne7 N[ꀲuU,4ydUßDr1DZW>O"AibpB" !2DjK.͗]dVpX;r(7߈*"Zcֈ@>DC"vIs.ډ=ݬ;jK|n/ <~i'3YJg󳀆p2L3g+rcVg>kǧ$[L(GbA }0< [1&?S7_خ#%5OabTPtxjv(:E70:hN vag9)q*]wwߨk@$q{r=p#d)ѪSZ ƣUk^?zD?{YpENpb"myo#C0NG?pD$51R؈4KNzQu0N<6+X@.^-J H>տج啍/h4r<|ɦGu|rY2$  05]~z> 1B 7v(D8m''5\J@FHbm0o0wǨg*}#̰p0sY$Cy>/ `.~h (Ń+צ9 I||CN&, jA*(}33 ,oH,A8*u0}\X*ZR4MX35c0@v#mQ\Ϻ Z]TՏDd _H@_p@a*00į0AS:)}mʃ*ӎwj`շygWx"ZyM߭,x,UErz3z>oS`Ace!w0 yoL&_5~F=">i1^1S GYW̕U7_~}lpDmOteDѓG|*2^*Z1~ arڙ30 cu~;_a 3scT q|4'Oc̿zﹿ9Ն Y&:gDg?swfeεjйPoӁ:iiɩ5i X#?~=ʝT1V~InLF pQqfjoŢGDpJCZWY'3:o&IjvN@쿲 Y#u_9H>9tACjW{5|ͨr;Jz]M$aw!iU 9H? x- s `W|Gr$ؤX '8)<^۶܀r0B N5U~! 1.$doO2W]T~!tyf(H"I1؉C_ǃgln@9 :%Y]E: 4>"GcEnDK?  Nko]8rL5R;o?n~Nϙ&5+#Ќ| orm໙zxҼz_:Fۥa: ( g ǟkfMuG_S`ã:"LrNE]Q΃ ݅3) G*xPKB20/ 1KCx/b$zKU9Le&/SFl4ʶ@|K`3*ƣQ .0y9ry/ϧf%+./D7vƻn ?~/.sNn`hP@g3Fzc˹vuD}4)Baj9+'mhegY| 2}Eܻj ` vP&'f 0W4d^S-@oM$ o^lZh<zqU&E/I5ɐ&0>z'P@&b 苣M J֛҆\6>rG~J@s|O?CxyY//er~—\H(jJ9O~8Ձ}S_?v !i'd*ݡ0oN?_@KhSd*Y6JTٟ"[峭(TV4s?s` t6N48c4=7Ga0Y{ڄ,'Mx+-h°<F,)hE  $ '=)?1GO `dkvc/j3Hr/zygb"Ȳ]؇QyR$7tE‹2z=~}XfM+PdͿf(xb%~CQwNUdu߼yثC X:`r 58\#E-.sb`z ꀺ'׀eH z{$ _ ?~Ct*e;!/=l $㞐vi;}sMfx%|U~13U!#Bi Y>a}+ )5dV$dܭws{ ~HuP}FяmOqEZMޓ`PF|vW RPwĠI N65;lܿޫL0 l8Eq?n*-CtFk#j(][؍K܀_F?a!0I^)˓<0S~$aD ʝa"#"(!!@0D+o%CL>ڼh/z~ݭ6L`@ p!72A D)`IAFdpQ'atAp8]33ץ5ۥai lNرcE$ddP"t@'h)<1CC?<:zst[-:ժg\ljĞg/V lV2' 4cK _?T|1=hTu tsַ|fl.U&^Z ct|.I`{$ėx+'A@kn'TIşnޕ"˂yC=Nf 4}^n+v7u k$aS[T{[?Y[hn 2tySLчioJ``" X0E+JJ̾J`$` }Vv*kv*1~+)5Sa[ةةHLчioJ``" X0E+J-*IENDB`ic10yPNG  IHDR+$iCCPICC Profile8UoT>oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqxl+ pHYs%%IR$@IDATxْH (63ssF3SbjBFJ/Joa~ޠ.JF/%;7.(PsdNA;~ pGpGpGpnxt#8#8#8# \߁#8#8#8# o%#:#8#8#8C8@މqANGpGp)Ju_8#8#]Gqx@/7)'P}m빼8#8#|xDo~HĈfPXģ.j#YsIk<^vGpGptKG7 [}"<Ї/-n^"@͏?DZ@}Vsj??d9?E1]2>CO߇}GpGpg򾎀#Y_/*mcfx/N뱚_?o?C8#8#|5y ׏ȿξqO{,*#qbJxԯ.ʣ ABGpGpo|oߟ2G!bH/1}#8#8 ~}GC`?¯PP}IpɄ?/zҾ%Bˡxnj"V_/WBnM3Ws(F\uQ ؽ曡~5+q (Y#gE}}l|pGpGxRx':|3Ecحȿ]CEkxOPg?̱IqKôWy qHx95nni)SY8amy37o?$Odj_UMBY(?$c[GpGpG" /<->n,(_ GO<T۪uaO]\q0# &'w?qGpGpό|f}9GKF`M)h߇r{;,ں a4mQUۈC'c W v>q៸h)tzל6ZxIx?<a/BKfՑiE#m DQ ernے>| ?UT 77o_%%;߻#8#8#oKZ54ԇ__m[\_7!MCf:6aSꪮLI_!Bq?u߇Mn6֡C8TPj& nf(u+8ԣjzS۲.h!2/v_s=U1iUn0c,"C+_,`=0-~77_O[< #8#8 ~} GB@+W{GNaKm7k<7XPb&T&L>`s 7~5lO~F02$qjj _N=}ɘSX>ѳX)HD5bH 1,̺&f$<3CpGpG+E_r>%GKq)_mkPć7ufBŏξBvwNJ(72 #8#8DOC`E_R}xw2'$~^_~mVtn#Pũo"~;Waƪh `=OM?λaw߉ #??6d`L6y N3{T; &/ǘ`DP Hp@pUi4<J\ T@(pSͶK=oD_9K^ #8#8O,Q,,d-[>43}UT"CYc@huQz%"!ܼ}B,m#8#8oFBx<C?jLwVn;bŏLM4N?w7˟F}Ѩwz"OT,]p3M&4nPQ|ú|yRNzJ('G7F5|*VmSEMk~| 톹ؑ¼'^^K =B~;B1+!6.q3L sU0h ~e@obED[ ֑?~ޏPd۽tC{?Qe X"m<#<_°JaX*6@%|(-O#8#8#p~=9G[ ?F \}BH[4 t}-a~Xw^Oebwt' OHFZjybx!s"|xL.4QydlOr mb¯r@tx@e)!@3A, $u@AMs@-'?GpGp 9ݡVW>#wRWB=β/hIŇ6}](0IP}!6sM=aV !Z@tc$cqocDY!|"%2X0=uj25]@!UÈBPC[$ Aˎ)8#8#ծM1[whʱˇ4 h`tpm,#dD@Yh~V_3zY+^f sք{@Zyu*~orkbԌha" iaeL@@ "VPf$M- fw -8HGH(R%> d)$s V)+w}8#8#|V\Y'?^.}| {+hr"5H>(ME7/5 >Icj/#etE%mu3)7>?y=nYJNL/>eGA5N8!J?I- AXT0X `[0 `}h|@pGpGp<*#(c?vnovǫkp.@Tc5,{EA@; ?*H.E"QdC1RsH-&H3aqqv/ Hi(+ݟ;]?2 R'E_><#i"8 U5ѓt3훦+pvH BB@pGpGp߁#9b~o~$]SvA"sT~C 8C?N}Kx4|. #V4_ߋՏ]v?HxIs3!{^bP\a/Zȿ! Xb 0u+\a #Ԧ_;Wh+8Xk_Ԉ#UPL(kT OJ<; lK@8ZX"2AE0 p `?+Τ lpXx48Fp7&WE>Wǽσs;78#8#8  o| E 4| E>I#ohhkD/ 7D0!Wݘpn'{cR+M|5=;-^hp`><iiu&e~(hiARST7u0튙+ uGo H  \P爬CRF6$% qGpGp <#8QѣGO>fK@G ]1"!E$.}D/ ΃NK.F hkm;FR1gyhJ:pXe gys('FÚH$CXrr`t3)%MSܗAZ)$*9B% ˓zn.2U~\ #8#8"WwɄQ~W%{1I#&Rɟ0o#@@ Ɯ&`[D>æ()5K1BޜNuQ[D&X{ς 2N1:~76x|-aFE@ $PpC 32f6[7m;m#8#8c"Dv>k&_꡸B@j/O~u0Ï> 8&"$a]?4C}e/fE8&OW,a0ew4Su [d}iӌ%SpJ0+P"ITc@$( P(!"A$N p",HP$lL9G[s_GpGpA@tXUW; 5)r<4PShӗ9?zH=Ė3z"M OB/M˭hd/-1r{qr5K`R$ os}]qvU{zlZuH-zt/oBAFy R7mL0.qPeyL2YJ5dEh@n3 K 6[7+XX8#8#|\ @)GF@\W̷+9䏯gH~_wϪ4[:nzJ'rlq`&5==@B8 i/7ߨL$>MDī"o"\uhvLQK_,4xr [F)6 MpAhG n`!՟GY߰eѽMnM4H@eyn: X #tp_".~8#8#|r\!C(B#<&/Ҵ1V]+gl몝* -/!oJSK?·HCmYX \+EM®[bn뱎?1u;rSEowGfI_۠k +(^*w"Mh'GB_VITgvG/V&P;M0Akʵ{Uӊ/l! Ϗ}ؼh%?X(砆`kHkϿaBBpȤ:{bR\^7J8`Ї HϞC~}oW{{[pGpG[C&>Tؠ+oz)T_cA;]ibiǵUIvKSNȿ|Oo%KQ6zzDO_tMK4^]HL /zvr{=v!q+RYؓ!A!Y| @P T`h.QՎ]˔cD*)C4,pGpGdA;m~_?Lo b4'>YL]{t->7Hbʋ&""D^ҪߝK]Ɵ4t$uxQݑ濻Wi!\ͶEX!LTiJ لTb쭣<,@SpVlCLH 8i;? 0uCC8#8#|"\iF@~(M/E 0Nea:D:# ~ cYd±qE'/VlE&bjvnGpA>>-n\9ιImo[T\ֶPxc㣿+IajEihX/}B%_DC.@a<H#T5D#8#8'Gb_dA0+~5oW&BڍŰwklc_8a!0bNZ{?V W="˽ڏwVՑ\V|^uCk7ƉK8qI/:w5E$%) @@B)`(r$-&E>yEHVVyQTƼ8#8#|.(|#dNk.kSՋ/7Ӏz][E'}GDtn0'՟N)ГZ,,ˇ~ǒEܝjt.[f/5N#O}>?V뭩M7۞MVNIg'ͮ! - KGh"xʂBd D9&Xđ"+{Tۑ@آ\ӎR:#8#8 > 6<*":KCHvd׻4WCUcQoxG> W]gDC0GhbTxl kk-qdRolѠk% ;kO0,X7IUw^K2Tc$hȓ)0BI`W&J5hPހr}vjZiԈE]w!=i|N``B"۪)nw3TU6d׿6Å uGpG7E}SdֺnϬ:ۋdj$=e1A.NsOw]4U3O7 Gz?c-5}󣍀0cB6( $ݢ^Jdw:d.I'_%a^'9؊:/K}kUg?4/yI']KWB ˤQO#Wv'p_G`?BS愂 H ,Qt'Y,yGd[λӕ Dj]7ի6/K=#rÑNK/:GpGpo|C/#{=f,eY][b7]Ӆv vnoʾ=*??"ZF /9~m\V<V,I UpZqN{$hʙ-1eEm'' wTQ::w^p K3růӁ> cРf1}!(H2Ÿ̃Ezmъ8cH17(n"ĺb,),6tEs>I#$ 5nY{;_vGpGp|C|I4:*5f8L9 n;t{(3"a?wF;H~hG\6oFݍUA?~\>&5`Ue;yϱf r:4wO{BپpuNIC8UPjÃ˲4dB?caAe` ݙZk$b@d E3fXvyR*", mE Uj^-ͽثGpGp"B]5MPIA-:Dzr?4Uߎ1vh;T$7XlK'?zJ*|ORq#3\e.:E$ٸl&AXDsz@XϖԒWu&}%bi_"~M8\gJ5J=>%jƂhXCM7ZҦա +u=1HrKIts=huXk[Z[_FkʗƮǬu~*DKM GIz+=ޏԤb,4L-VWO" Vn0|,g۶Ƌ@J%e˾![A8#8#\[EE1*.Woiע۲%mbn1/@1U',ߨuPQ`F5=H~*Ko_61REPS/"1-}vj3,9)Y$BՉܧ"%X]'@0C c\ 뀀ཱྀphk8HW8DQF=߸r:#8#8'q \BXqhx@_۲- q¯~)M1I 4F^4Me*/N˩{bidmvivh jqq r!9n/75Md$L$&$ @U) " )0Tp|ɟFG!""PPAaHH@ kif5;K֝8#8##sDx|2 Be1ʷsٳm놮N#yjs!󓕎B wE"\7Yx^67V4ъlO4yb&IH.4+Н@[(SzSKY㒴m:n$@'*)՟{YFPՂk@GKߢԅtv(ʽ| E \!p)$y6Sğ,|6\~8#8##|*DΏLE_m NZy#᛺zG程s<\n0?tkm# Wq2z"=/v UAӹÄM յuuMuI\9?κe)u.4܅p_qWuBUe+{׎2CAe}B"c 6h0G @fdy ?WP2B26KZz+- $)}ޔ؄vSw}D% EhJ1x'8TήϚpGpGkC_01PMg~kӼ݆;[b?{By3s_Ɗm=Lo`P39szG2A2L; cu֥U[ `NH+@ fQJ֠;90 MA)_JrZ;ʚY Yz_Tth-{NKIJ}\K``?Y_!`HGr_JZƠpHLUF/ 4qKH0۠68#8#\BP:G (>nk^֯R @n.b WñFF4s$FB3y<% s˱ͷU+W;O޹{I D= >]~PvMbrai %:h.\+3XHf"Mx@A"ĩK2;jx|HVeI(@G ɡ5I8#8#||ԏByGՋ/j [c N?TŐC:n&w|l o*\3ؤ5摙/\}[ 쒧ùW۫2$7 Oi3RCPa,JQxe 5e>v3oNCIh|~$ȣr {x3L|Cf.`p(Y(Z~8#8#|}ؿwjKmYۋov-dno Dw.CRw۾ۑ~}zI , r<&X 5FH,+\: p~d UmNTğ8+2@yMshX*"Zq9rĝmDs]ܽ|)H9WTOyavp4'= 61{{M@Ev=_@gOƉ}-s}aӏwG %  @1A$_)Xoj"7xTiM uf!jpGpG&p7oOß?UϺb]oMkXX\3QRA 7b?78\S~ $$1˄݇s1aV9(4 r,}]Zթm9:ǽsU'ͣݝEaYfeZRe>E6 e['X^) ,֤3u~:MDyGIlh!!D2]A_k,SS-/gjGCBwCAo[[tYKMVGpGpGA/#PP ں e#}$;١}|8%޹ 604Nw7ĉJjɉ*+ {ߥNȔ]BS.*ya]Oci݉kf#_]EOxI'XP@GdY`&}d@%o^El{KZC Y4eQ8#8#8.ox, r2 XM|'_~\WNcE`@./1)kMDK IZm,ifd%@y݆[a.ϸ>Z5H4gNuŪlMK9RE?j yR]߀/,! %!:S% TߴbϪHвCIMkY}h?GpGpA|ȟcjk.kafgm&$ޢ`hha~-ܯR2-!"LF.O׀_% fC}5 @uK"5qsԼ?)UX6E=Pn5I^q~/xRU#D{WU- p4 \.ij/ 2zckzj.BOHY& SB/ȿQ[5fZ3+{ga$LgLϖIM藑ɎvWڨ;{ Wּd/Mu(sEnOdqxi#Tb&3~? "SlG>օOF?oVFoFOSm( cBf@IDAT4;1!/eh$l?^# dK"ȺmCI4!06K# #a;7]jX48#8#pgܗ& &pP$&Jz)}_KTV;WSU\o8c98]*δ󎳅J)QLH$B yUG "Rj p򟈼Xu~WE0o5goM#ְIu֏:XXaY7O&.\SKbEu0]l.? PR p s:>2y{()ZՈAܒq:z{ XU#8#8׏ wOy*O~5fOv4F>%9I78)&PD?zv͔ܳc5B`IMV~mc)iS]fKzmJ+~GAڨ3BnPIQWaCީry]JC,F *RͨVg|Y" Ӏ6tk>N( ԓHoM5"J5($_FXAԑ"0R+(Is"PMGpGp|/! I 0Ĉ54s'?@4 ̛q. f+!c '2`옊 !D5'm5oW\>qOKޤR˩ltu5v\IJ'Mg $)zǵWH"w/N]N Bdu#Ad %Ma8 `q.^o!pGpGp>;LDTGR֒*I;¶[DY;d]O W wP0J5niZ AQ/M=4b Ǻ|yܗk^=|Tqi!E˼:5foF%լ_H@GRDGޣlФ`dvLe? Y) o$ "IFl62B4) =#8#8 }| Dc:_9Ȗ[Iٳzj͛ضSŰ->{eby mr5kH$>q3q/*Xy0@DVtk4es?82RjlO`Ѯwږc5e*_QGjd]N1a7/xozD׽'@@dάk%Wy-͜V{fz ]`|՜&QFsHs(m!"t>q Iyh4G"@2H X]i0o$ ,!CKj@ (jz?/ ,pGp/|ѯ70}hُ)666ny1VŮV1,!q D&2Q&A|hbBQ=@PBr'QR&8QEk1qH`;IQX}Pk]"r\gDWXqn_4~KX] o͠94s*[5L^Ƙ|ḏ'=R~eTiT[zޚH;6+3= 27cW8QK!>?%܎0lPfx1.%@@'\q Zn~Vofz f*a#&,m_+큫#8#8_0._o#p':?7uwߵ?mdl--kG5-V[-*ثa3Rr,5A 8SmPv5⤌Oulv '!+S'zr$M}Ziwb}"㖕=$nRTWf잧UͶBcߤW=h3PY妒v|Ր, `sj ] jſO$H7_fxpu|ZD t]gC(:(5`"ԕ x#!^$L"NJ@A'3|kDO3^PF)-݁o ܲrdV$:5 cum7}4Ȋ`׎?>UVsٯ#8#8O":*HրSGK"^ܛTd@w%wTAn(w;JD U3cϪ(o0ubTmr(á~F&?=u޽_GpGpP\8"`>2'B+z㢌?/M~4C}ʹV3)J% ) Gc)lL%TgWr9q7*8BZrLE]?K.?եk;ۗ֙N'~K.x,Gt Ka \wՋ#ˁV-ĈDc^eJ ITBo7P* X@D M]mDr&^}gR=@^??#8#8_.ޖI!!#x??"8\i}=~WG/D0;48#a.AfD8b0i;MpKSeqJHVJU\ɥu/v$-:c.է船[2^5$PЪ2U6e*$ @ }DX`/5i0P; +XK,4y4pGpGB_._5% G 7beLD2Bؐ ۊbY"_{v–#7үytrd=*m;j7}zh˭ϟHvpcݮW˺m=|UT:><׺<=`>!adܛ_mFMTiퟋlSU/؋@0MB%kfgpd0]]ow6QpGpG#p=]σ@&S\izSl|[l-/NC&Y? Sl[wܲQ/Պi?"+-e=QG8r\ƜӸ}.k^DuwPk  _@ w>lTb<x{un*kHw&  + *M1XB6(Q&F`2P( P_ ?ksA+VAXwLeBS,cI7עo0+~`BJ0Q=lwv y'5 c#`ȫ(]c &n,(tSjHDEjjKgF1W]S[')7Uٳp׶<];Μӑ ^FWkWݩN-ik=/u_=+@m…sia\e__`!}Q{$ӄR@{Ş2#ꧼj@`'W10WԊ `dC?e*3.l$٥2= _~- Yit8#8#p~9GC6F z*7M,T[+6^s|fСM4]{Մ`JܻaP1轂wlac4a^*a (WSS>]2~5^iFvi7*k q ;qldhk5꺮>nMts tI1 K:owyZS.HEZXsN'Ri6Xp~yG@q],"X =.)Z7aOa$cGoW[#8#8GO ?Apvg|SiRA7)f$ `#`9vS`rj0%Pw8 YP-LbE?F>5>̷2="˩i8+?j|@>^ya үCWK@jk܊85:k\WN"; o]>]mu|ږ.҈ҥ]?uYZf)i[{k VgUEzʦn MTRWY6J v~4-5h`h!+Lkpi1GeL&tȝEFiFryQ s]UY 7Fquz}ϥu]?__(2FFƩ-$agI1>4I ˬYHo# j dlj|Wo9h ?pZq=HSZgqGpG<<-0OEKHjM6Snzh e8x h@'=~{8+HZG@nc`XM%z>D플Ʋֺ.1&lBUm[gz g\vNeu}F?t^)MPq=Ϳ4⡶4}=>Mݷ9ss^]4`OH@dyThOn[CϦLNĴB  JTU |aW8 zf&7`q0l6-bd:2@J#8#8oB >" S_ bh`C? SLfjPBv`K"]n:46 LeiR@˧SI oUUaM@ەDkO_k[ͦX^cS\i;{QwwiĻr|}h-SyK˨.֗EHvhJ"QFǦ!@ 0 OG 0Gv-¿"5$?r ^MX <7|զn |GvKUעt "4p!-zpGpC; D3Cf2+_MlzV]{e r/aY{IW8aѿ| 'i͡jaCOcVmث+ d@Q"ثrHgi@0qz3qܴ. WqW*䛥qUy/Ƕ|I^ZqlHwrk/~^)ҝpaSzFb'Id4b0y%Y7-d8=w!!AG5 нMЋs"`|uUo @_ғ#8#8@e_!PR]A!ٍrCv;#k85$ow# =bw8;# A(ǺȚNJ4>TkL?=Mk˦N9V"X*On~pOUC?Q ^-[Eeu$ v@|] u#-'nV7ۿ a?GpGp>.\H:O xYnƭݯ&eeA"iҲ@@}iKvөõ(RP%Bx`f0.8!t2U(N?7aXFZ-7-=zɺk,g 7y}#|UӁ{}cA@[%O  N5"&$ a1 e'9=0| n,6±ypGpG"Ow4( dOh5J@A"ws@]t'  F ڐ,ОR“(0-q$K#x~. ^.u]n;RJf?oӂ~]y_jK~9'Sֽ}t~kk)ݧMn285L@c8ݱU8XD5α˅,J,4or3C=O ǿRB-Q1pGpGxJ) QI!;E5>U BEB'bѡ9vG O}B(@?iK2 SrQNuCYjxjKq~suŧ%ڹO^+ߘ-W%` }#%賏Q짠OR.BU/"k 0s+U"2jc&鐠9#8#8 |.}ύXϚ_ϟmeo^I ҏ.sZ" yw( 0GH0MX7?OLsJ47N%eoHuY"h$%&v֐fy-5wTmyMhڥuiJ^ T޵Klcb@yA%h2r&$!\eآocu)bE Y5~+l I䧏Zďde  羹-7_ƯVY]eGpGpO >>c" #Z/7ln3 7]s6EkhOM:l={<%P SzNT5Q>0#]ұ_PŸ2]mڑ*?rVٺrQ&lnX2NAJ3}ġ-m˚JSiՖj#zOl[W2=+ Ms6;+?3KoK,]+*z{_~dZܿ_6D- [HKY($>4x(XLzP’  ,##7aGzd:eZpGpG OO3hTY]u[/@˩'Y96?Cfv iMMb {A_^7yx9h9}_=^\TqUD 1C h3[?#w9.c u}kk26vi|6k^Q1Ok.!z_}n.vf|X=WE2w>=wM Vβk:!:o۴M\*[]j狃G_Y`,w]rFv%903?Њ/⋉bwW$ bIvlD"$I5"(sNbn H?*pp\ X9s`S ' NRqQߘiX?q|ь*Of n3$$ s 7vݴ د||3ϿSs>1Q4Oa~=h˖<gTT_=%Օ[w=%P)뜾г+z/: jI&z]rkɥ]uN_@#KuQ=Ril!3 V=ч+\T̫[P;WWN2yRJZܠRD4g]>SmH sA4B Oa Wĸ27+֬q`} 앹hX~X Θ?oo6as陖>Sޥ8n#8fKs44444444)4 BMOЯ90 h}9V[$SΊnC=,#$5.{`*-\OۀǵuJЦ5'q lP*27g4b3BS۬|2<õP_򿖷-ĥsgI2wR!5 /2LF}r}P q8ZhqJ5QuMN۸2`5}8ۏ1Lȃ3.;zf[[ %_ӋݑOf:n5| qo6 >b~`a+n0ۿyCx:g4fZTr_HR>`*iWJp+.)y!`9?K%,Wu6]rh@~oZuIFɻv-zSy:Y&U)*tkU_@xCr_/ u`JG{R'lAn[/hQ`Z@^ gR3Nl_MMMMMMMMNt$ p{]?ЍꙹK18W=5-s{fNIs33ɘEj"+X[ q_R5B",D@W*tSHׯ2󁿅߀1?3tP=9e&}bLPq灤tf? k00i17l\@ڲLopt h8YA5(W@@@@@@@g@3|6U>0D<n ٱ9c38[a2; D]"0q8 {;;)KR+b79? &<w{} e "BT_3)eM_ Eg>a_ Sp-aKHSkS{K/U8.ji)R55>O+Rx}fFZk tY|5!%^>02u;pmiW[O0`,'.;ZhhhhhhhhXh&sk@Rc;?fgvaϪ=fL%GbXݏxg/c@k[W]`HPUAFfRHDCK<"9rs\@"!IBbPF9QbG9.+Ut/^-rQ?/]!:ΪKu}_Vմ+-xR5b}Ja{X-G,ia pb1O't{@/3 !lfv|p(R?цxohhhhhhh@ ú,ߊ5 | !tH`Ki~7n}vqxyY =y}|;@~ܘ?Gi *2p+L*R_?:l3&ؑ*c|=Ssq&| ڥkTs-_V *hfIEr$ N~Y;ڰ|jrb\?_}ԩoνE`vH/'Vl⬔Y(bJe.law5 ?xcg`P[gZhhhhhhhh&5^s~X>c9t㿙˿ϖ%nX-;;̎4K$~ dqx٭7Sfe0 >W{ ur3͍go/n/wSVD6~@ q y"#X1 pg-ݑW]J2 _NwazF\6ssp]dĩR욲 Vm-!>DӣU",Ryqxէn &=`˲zb;F`wӂ>#I:l0晕#NvǑMҞgp `YE|zߔ!' ԓvmhhhhhhhyh35zkȨpo?&?xx\=>[p_#pd;={ŽF9쏕 l4gzUm9N`1d5bē{j1Hȼ~F*SrEcW,EF^NbUeDYJ9][aYdB+NsYq~1De#OuqINM)MdK8)-B<:9ps]}95DwKqC:t^DH wn[]u7" `>`9'm3},#4C(W?N(8n3 ]w1M?hg?YxûǛLE.߼Yocs44444444hPZ+5ZC?FdwC?v-=g}z ӄÁwq܁.z? jsO g "bֿcF !#cRs^0 9_5I7p_#<hVj)ix."bvk+_,uP"}`:75++6k ZjF-> R>59e^a:^;5CbHϑ>u.xn='^xC  w<p<! =? iCTζ0穄x =qHi.82{\ ]z XM444444445 \M@4#LCx#o8ރl1sd?qpK=Gf0ta"\ AR<I`\QsPRPgp.I9lJ *9\9L 3ZU0.6SbΨ.V2KWE|Mk(%6x\ d]+q4 UCZ}N'i]f_+trbV,f\#6V$&5ʏm߳zsalXj~IBpϿ(?pt@"u0mp8OvC8 e  7{fJWgGqJB-YJ#K=\b2? Ĵ1 セ"5WL:n^m\x\WNe[j踄DQLJy^]lgj=kЊ'y8c 9 8եE@0 30 A?o uVr3 !+֟ڐ K@@@@@@@i>LoрKu7?m~7π{>?=> =,K;V``<+1>dY?5e @B!=3dh0L:*|ϭ(GCnDi,⬋q i:9\8'q.;\Ĝ:$+K L+Mzl~K_E^\_uig TfQ #ey ^C@:0ez f`oSX3XC밸`s<<:^tyb|H女W5 e~A 8گ?)ݷ~87at̙܎q ^nX,1_gqlNF xpf$@rҟuKmUK+:]kU Kkm{=D+YnǓ)\5,)جr?S-@nV-0aX?z9}vHj8ihi_P G>wFP~.ao?3H={w@oaV_S?F[`X ᾸFWl HCCh?|8q~C%D;m,0l%|S(NMաA :K-'D+2yDžy$Blg`U˵p:^/5.nG ׺]u ;^,y\2_夨!N둜`Ϗ@$1_sSJ]j:8@@h*W=5\ ;XMyW>a5wlRlwcꍅ9s#\> hGG>Zjvby$Dc[!/sgz)qrӕR2]B^ҷ:;]m޲juΓV9%#se_.9B*.5_ZD*%[j5^0?Yʾ'?$|Bkעz&&>^u5oϞy# C/U EI9 M'm1y[g])k&am3pԚV$yJ)I[IR žDT).g9}"n؂!ZSg7+u.7?q4~|D#(e͟a3t3xp4a 9Y }"8W{p_܁{vwI0g[B:E?AZD܈֌3 ׻[띆? s؆{Ž[FwXp2wpX=Vzgә~p&[D:#^\i08ӟWX n2D /SRja %ERBj"A(" %(B?ZIUQ+M S n)e;_~%^ђ%\0 @IDAT.Wſ+r^Eᙩ堋?/f7ī<4x3'A)h +rA {~)׸x]6Ag r#dlQI~ꗻc=s6߰Yyfa]ۛӎZe-4 4 4 4 4 4 4 4 C/{7=n 3רÿ}L3n{K3͈W  c"^h??& 6}'Ys͙D"q->{y?a77:W=G>aRkΫ N 4FbyQ/a1)Yu5 [Hʪwn{Ꮀ2s<䱭6z~qܹOkq+pkV@@@@@@WfnAc@\Hc`/g놜ȑ+3ӈJGxyߑ0#@OWi} Gv!ā- 0qrhyP6I Ӏ8q3vW=*2~hm*:-ī-Ex{x;[v)Û|? +8رOcn8lb>>YŨzb8o1Ԟb?q'# f1E0yI|^&U$s^H}r,uܞ3Z% _Wھȫ/}a~VĝLD[B#H#Vdg3[!̴uF4p7gQKL3=iku*uzwJy֫W`Gӡc!TXY~ (2qZ'j=8Ĉ=h1?u`A9췉]7ry<G 3GNpвy=fc S`͔Ӿ~Gh]eB]LKRƣE?u>}ww;;849`u|x ~0dl8 .VMǘ:6l?Q]1_ˎ 74;% 3pʬ"RW0s*S1A|+yIS-8Y'83XW[9h5YiW279V~1IGg#DYSI@$"%3~%)* Dsi!. |]Ro4ͼT‰*dyه&QWL9n")g 1 /ɋWdO#XΤ £d<.xe1f5#6t}; drΑel!Dipq;~c [X#p~v{8t`<Ƿ}?~AhO ܈MMMMMMM 4Fh7L'qYkyQ@p6,~d~ BI6aϊ@q̟@QxvE9`w33Ew2vb20)O@|]̅ ۢKˉ3LLJ@ J|YGIԯug5],TMixkZR\y|wA\IE,{g"ɂ1}G#^^\Y>ȪC9T+|x ^Zl@s 9W+ ߪViiiiiii7f_EnL~@oqp֟-:cޏc c,7&=fh`A]B(a `c@Z\ 2HO4093')V$֜Y3Sz_$aqNLT^j:.2}>OMR ) )U^TI^!Q(J'[S@輙 o15Xn]pgAo:േ;㇍$`D`@-yjC8Tniiiiiiii 4@{ >BZ {Î@3w`fLױ߰n 8ڏc,0vկOI*Wg#!HѦ`LH/j|d(EZJZK%_.u_6w֟ݜ6}}_6n2~\Z\.JerWu#A1w4=䏕 rΦqN#0l&P&'V0 c>!}Ԁ?l~A|9=`Pp~I,BsAnɦ߮{otmןҞ~M=>OgpT jX`s`cF Ua,!5(8>i0X#VtiUu-x-u k|gLfW3Nf5%K^jPܟD-e-+}B+׏Uϔzxrz&7}b@ұ^ZѠtoO[(8p ȜF61a%hƁ5F<+Hd90`q\3e(ON.[iiiiiii7fM/ީӊ͏7VjwxtG~K~Ӟ{vpG=/G Z@ #2%ٯZœf#gVKʳ2,bI`}Q` ٲ|Jjݹ""W3_˒tAݬWA} JY]w%/iEDl@WiVUjM.u$i?^ģRu6St׼`ӷyN9"}g>yu 8rNǾ#xb = >?a/oYۏ맻 >;|,r40o<0 + 29(<`.#'I x BasJ:3i\SD֙9HI@byIn{j3"S Z T|"HN !,uJS/J:+~A7Y$u/ Fɸ%T@ȏ*1zfkIΥT#&̑xR!5SnN0aǓ9L[[):ć@AgG}p< Gǡ.t‘Ov?@9>#C0qx}CFvv{vӏ>[_I9.: K@@@@@@׮f'n_jyR9ˬ9~[oo= OwC{^ﰻ_uϨ|^;[d?0L A?gü  |qF=|t1QhyqME :@WҧQ%)sK: Fa),E L, 6/ŏgR!#W5쑧WVlNUJ5^S|YXy浔gE%_M</ʕ:"))K@Hk;k2 C VBJ`z~kWTԽJx~ oC*p+1x9>S($;%x@.ּz'}`5"`dn!7Ƌ+idv' 4<17[lo7PaHX9)]5?/y; `ѿk]Mit\+;~?C艻Ś߃b otw.w;NtpH~jgD'l> {px ,߲X婢' YsDwĂ-HHLB0BHJ{[,h$S#R, _ȍ,S(T\mi4ɼ'*ॄ·OKߗ)/%̏9YRrkis:^xFGb ky:r=z)iMlz9#8c}G }Ѵq}X9qFt6e n[|7#4?A,VfN B@@@@@@o][_8ݲvwlx?fp5 wG:?[4`0N o Q=O ݻx 7H1?H}Q'Ze(^T34_VÍBi/K>)E7zQtV*)ת2oωԕD}-gU'W^H`#v:c.ײ!8Q"P )D'vd`%` V"3'x0; Mc!DYpƂȁ\ ? ֵK@@@@@@A{˟1|g<#F G63x- LFN\-}7"`e·N!CFpmt1Wy\yv`r q%??w[Z{˼z$Z>w6wp9f|Lw`XǨ+`cF?ПX}okhwS>b Aƫ5/egGzbf%}ǞE;?sdD&bAZhhhhhhh]i~Ww6 "ay8c0u_bdy7m׬房#zcu0vl9$3 ?iDۑ1Y'FKZX֜PX: 2sKκfI\/(q!qlSV*L-ZȢ^dKjZo%e߷:k:|-珞ţNCW'n~aoXyVl;ednKt k/_!YҮ Z%7TQB3ʂ6.$P*_3r AZ_e޻6+v=_H G~jiY2!:VqLꀸa! =0/8E3 hiiiiiii7K@Z>fȕ5[kLgFml7ݎ#6:b͞uG#3vp5Ll4Fi~[ 8g [ݪsyt&2үu͹)cWB`%l3y˴h3SRn,fe,"\ \3-XamGK6mL,o#n'R]7SJ OunirZJTaҲsˌN 'KG~LC`C,I3>G$ztmB0уiy" |~\ȯ 5Bυ@dFt"8Оxv!nO3l&倻~69p51DR}7 4 4 4 4 4 4 z5 {9Z~i=;f㏻Ѝ˜a۝3p5G"e&^'B+re&^EVBLאc+v~~>(eKܝXvoRb NOpxYů,\3(8q"ټO.FOy/#)XmtYӎEsGs4"x'p"0aI~'`f8?B,i VޕКś>Sk7*Cwsl~;eӞ̡ {֞.V `㰚S=bb`^K?-Rp =G~ 7gԯ-mI*g[hhhhhhhk~v@=}QK23Xcwa@rRg/kKFJ"eU~]JnTyJ+)1JJ}ExU\&^rLגQf-͕<~\Zދ>;kr@مwYOWkxOTWhx`?y!)XĴ>, 1'r! >N9xgGqpp4FRC@ +!U-4 4 4 4 4 4 4 :4 [`WX1f#~ϫn=˙Q;߻5p4܇XJLiԹgr|pQR*0O41a#3rd cp)C b57x[e=??X@}|zl/h(w(zFZUߞ_8FˌgV߁3?vw3t3w.v;vw,v5i#ts6?<<ߎx?c?t=X=(g6:>,aإ .#Jڟ $)_JdX :i'mؿ|j Eg1|jATu¦Lm4w-L]0IbKMMz*go|/@k-Yf27 詚qγА+e+xBgte"\2^ u_ʄ399Z IFyκe _ QycJKOIXu]ϗŦ=AID|qMOPj}2m< yλ; )LZx@Yn0 Ab,Wj@@&f ˏX:fl`iсߤ'7ǟAIϺbs7}h cXe7Hoiiiiiii@3|շ5.yEҥc~_~u9z8#{NNXy?Ԯ=:,H᱗%srqAtG`@Dm<ӵ|`#ҥxȔ V9,OͰN,2vR-^(k& oB&B&aKer>?;"I!ipq〣d,hv.s9i>=dE2SEݻ~z5s9Us_rָZDO0:}EF d@g.!?5(#Z^0\Ώ6ky_XrN&BT;r4r<.j/6s&x< {| ƕi~{;'L<szP?Kկ ~tx-@43>ǁ+Y4(;`^xYna!V4U{=aYUeN'b{W%UmhhhhhhhEfwCw1O0ٟz17L13߂l}ǢGwocLZ sTf^ۋeb'4c<62.|/;J/E&$s ͌\l" ;1]ggjHJ^ȏdn-־E>?Kvk:;'|dGC@^{'޿3EY@~Vp)j7i )sJW'~:L:%J; ܠnI״_ج"\WKu5KO{$akЄd/I@sE,R]_uܴ-.2K:,s'F6u$Jg "mD+je?+P\A &1*OgE' 4J8Ɂw $IC/ L,g,okh~'޾~ h_]mA[etu0̤l=mrYÞ;L[XAs|xۦ~ 'tсSf0876Ġ#%{oa1#pC3Zn"Z1L`Rj是` *E5&fk"_-KH,/ץ"/iue.jy_sۥvڷgLysdy@\|0+1$WޅĜxz 8)'AU'Y-?tfi 5*odSHq(`\ W <Խ;i/fBJu*Gݟanw[?w̎O=Ue`vS-x``V@ɩs@xЈzMiE:r)ԣRhZʙi?mHvڮdHb;arZ\j =VZTP@$ N>=gт~SVJT&p jxP}Dc*) ހuʊuHPk0'iF"/i%R' )vM~wϧT|%TB{!PKk_HE*Pjї54M9s${zϊmt) k?_(!l;Ji OXpAwZOoň>C2 P=' C2?&4pjt@k@@@@@@@3|Q:$ퟳKV{x;[8|{^ =m{.sR#aZljXZ7Y9 xg i; Sґb?6OԘC+]&=x4ȼįse5f~dnyN9q@xE;S)ףu壺R}AӾgT&w Z)-I(.: = ^K;Q+ B̧bv_f{?70YBȫi%=Sl}_*v-fk]g(j;_m]Kxu?ܒ8pE7jޥ$9)䔓" qX"I੶3[9|!MijGY#Q>oM>t|s+C x_iar)QRm鸺c Yz>xo7 `j0=+OChWi-4 4 4 4 4 4 4 |q 4 := l߯{e94lqοKe o;un؏a~w8>2# 9kz3 b0pʎyFI@3vvtnG 2-#l*3B i]|'<|E&E]N`n{yvc@ؼ?lP D¤lJIb֞bLvM@-q9񯠰 /fIv]a}@둓DM~J.!%] R8E~Җ!2=')Y5jť|z./s%g_5'ߟW8ZiWu%V:/C [>w!m{3?Ym|Ba೫V:t2vm>>nد8c>ހj97{:>:<=meq ŷlèI= U=PߦpE ^)t~5npl,%tkecgCWסD`m9&R~!K¨L%G+˗Q3Nm&ArCoF#'Y'0Cv'3§OiM>e ZtHq\`y0jebJFE;ScKmS?9Xe)>ߋYRv0e". |0n&ODdL)pFĂTG|ҳk$r C+1x6ꋼΒg\MU"E ot6$72OLO!s]ύa e ? nd;0KXEx?-h5-ҟ 6>/x%h?pz A|߰`z:(~vn D~ Vst_^"?'d].E>Hei444444{@3>`L}s;\J@IDAT:6s uudžo?2^֯ "q1\2{Fu p63ǀ>[54MáqzDzxD5ZEus٨X B@9qn#S;uÁCʱ?muuXr03$ y~ݎK'@rsxS_"jʳ˴$fFCrGUѸG pѳ:0[`4=k8 y ;'Z2t=_QŜ:EUxn4~Nr~!r_1BQWv )zMJrC SYz:S='VTy C~ q{36&=+ b 1@&ZqCg[F +D`{|y0Wb`A#K k2vP @bB@@@@@@@3|)zc0 qmscdgqea9cZ%cq=oɥfGVlaT BJwo.3"~"rcRgHflP}hk5g Aߦp}gUvɍAk@7/Y?=pz!S ފ0p 5`ͮ䮺hnx!{MMMMMMMEYuVHo1m]w=f +^kq8N?G@|A3M4Mc *E&  p3+uݐ)(n @,?Hp&=Bh13O_P14'b`CYQ>;G>(#@jl01 aͨqZY_i4L@h[i] 6$L$"LdlKOe]5 eÃyI eE|ާ H2όK|/?uYw{+;OkL7H YZb#Dv+yͲ 4%Zg57VdsAvr6| h)0*|B@@@@@@@3|[!{nqBx|b#R~}:dY? ̡$]+b٧ar'Yg! S69EL,B0,hH HSs C|W?=>I<S)e7guUPn+  +W6'\΂44444444 M՟"ƷRcsgn2;lFopwq^lV;|]1np}GZo]h {Fnu@t@Ff-GM;7>Ppm|^:$\EԛҢTQ_2:]gR*h4bt'P7[I#LB@!0G (P5`Qdhّb2m9Yh;!3].xit pY2*W륅$]@fhaX<1 +%%AEy^J"]Cd~vk-/ "TY"1:w)u. "Stiw*uzMx&Ľ$^= ~=*{ 9 VAP[2g04&d)8+UH۟pIͺ0K˷Aw[~P5txO'[  ;VoaY.MMMMMMMFLZiM?Ӵaz췷ߏͷhp2P0zdl=cs˱,_g12F6#w)8f;?Mqx|t-+[8ϩc z#x /Ѭ0qeDY_~p1w?b4 $@[LL +/daz0bF փznu@%2@5*ZAMa)a+DE=i ?S79zH19*:KD}~`MHms(S%~ EqIZ~e\jXF˯p^.m^QF2߯2?Q|~{|z? YHԈX)ڹ[ y/Zx-=t;nl{.q "/ۜ[~ݳzM啸Ȕ[KvNȧ8O}J^ \ v+RR}7 4 4 4 4 4 4 |2 4'S u/ژ>tTc{ Nc,{9WFc`1ڮp<@mw>Ϭu>(uܘ}\'@%. CB} 4yJuNKS9a|@ B-yMTZ8UB}+ #\<:æݿk{G\5:dvȚYsTY胩II;6Ϝ0 ~=8ps(8pP~1i/@4 ix$*>L'/ x^E{U W6,[YR31KsfuKv\Kg*qIvqe/CLtfv`B~y(K ^ɋ WjBMIp܋S>ҹ+.\q]|'?qCRbN,W _8'y}\z|"x295<, 膩F1S֬vB/xNz}^46q>!*˦#``hF4444444 AZE{_ |8O~o&f{fW7/ױ[?2haa)[q5 ;5 󝑷'tZǀ ?0 Ypt[`tA\#5Sp>+8ʷu9y@rg!`/S)]8Cp@)^rĶ"f%Q& 'L:(`fsv8gs0_ (_3')͈v{ڊ}5( ;nWϷB:ZIinqݞcv,Ap2t>͌36ٳUo} o!Gеػ̘)DGi[42y^wpҸ8/9R\pΕV;XYHB8gF g9̗kWvhH\MłIBESV Wo`{4ߟnfYb$P,*--Jzybd s>^>X"x)/nZb)bqf#''oꀄ5<qs8$| c%WU 8&w_cخv/&JSJ1Q[yR"ٽ_.\mٻeee_^㸖WӋ.; Oy7WjX/Mm.Ň;DAѠ} IJE^p&D2b9RFdj\w31S?^kw cSXm'bW0W l;K |#?[.o4444444I5 T_V8Y)|b!)_;;ejkκ^{M1ϐ zA X9+&Os8Wqxi^5rF1h%O"5d[wԓsU^b$bŔdwywj 4 8W1L9~l`X~ ULztǷ 7?k݅8e?2Bq`+[1#P`Et.qiџ0oa`bsB4L|/AAPgPIQL|r-Sf\%R70y,r%3exQ#&v|,/:^YAL!]Ka &AeӮ({&In#A73#RU-"EI#;f?5ۗcchgH#}[Ds2QYKStG8p0xG*"ͼb&;gR%n>:ٝwmz$G FY~xwef֘EBwvɌg ;|{CͧzFZ(\?G ? _mgl$(vv2,jæGV7d=нձ>YeY>2qS>3O"~B0Fh`p>7݂)2j o 2=MWY.EC WFA0?"ϊ^ 6wGD[9CdOMt޵=8+Î=ɹXzoJli" Š9x( U ڐ;h"7mG'= ḤT~;LbP)wETfdb8Cs~wg9RsϹ,?y4`,K{1mMt`f/~%9.R |1#KjYH$*G(P| LMh+c1)_$EbYtx .׻I&Y0׸O3gb͡e<.u!@R+yl-RRRRRRRG@U(d(4WU_5+&A4\n6}+y+?̮^[c= (rַݱ>6Fjq.~r.sFO P{~{.[<-x";V<a<yCvpoE@?3(ܣr┚J Z#ԳXʺ5F&٢ݢضxk$q(\"тSA4GIƑ_]x}7tOo@LkDy4c@zMz>:(&F1xyWSֹH>h><?M8ͽWs]eyL+-Sy鏞~!숎E9S9h#ZA)/:|:.;ɠڔ// ,yjfTw% Nz,A <rj [\>)rDwb>kG+RRRRRRRC)PJV>9|ⶲ mZ!­HYk5d6b<Ȗ*c+Յ\U\5Hl(}^!If٤iH<%w{s2|!92EB.Y&Q'đ8w7l#iYQhoa:peh0)!c/l%v=o~aGe{41N#H:Nm9¼P={?;/S磂=Jx3К%L"~P!}ήhT4z RƐ?SwEr'CL-AV`(a ~yLUuS< @P1Q$(_}XOY}ʟ"%K䏵cY* TϾU % ͰۻSM\Q8.GqfMX' l*S$lvT!UK-l:9J(9HBMǛ/QXpV@%mlv֓˙RRRRRRRC)PJ^>3GX'1qt7 ^aw{<"w %-Lr ˘`o|A["T6mX\c8*0)`Sk[O8?6Q@x{{RVb9FuRpK~* ;v ?C_+yʾ(kPTqY<'~_fॸ6g66_U0<`F >dEAwسc+;2:qH ~^@=R@ K&ߒk-0@%*- }2&E@v£x%)*-=*|喗}ʪFs*x~{F,s<-xNVmb)(6-LLT':8&)A99_n%߼' T_k` (r zltObvJNh4Ӌ3;e)R *******{c I=]|^~[(Wn9_-pw0"~ yx^~iq ?1_{Vw8¨XZVaBp_8XEXr (+d\Vl[Ndw}Lx\RbG$&1^D퐑r>e 2IV KJ9~{Mo^#oa390Ӝ7oidǑ~~ Z'-ył¶Zȸmٖb p( <7RVG7h`,0_l# xޱ:*` ίɳiQqZPଔ~@ݸ51DZizR:ߴI( }2\Cz`0<?;AOn>jYI<)$3{ Ea}*r_%\>OYO"WJN,}e{5(,ƛߑ { O|8f5+}P!euY {ˌ bAjRSuGnhpS1+þ6n4nM8sC[Q/UƨO+9a߲ga:bXuP@s0{%~"\DOsl'C`0g C87EkցA(˹అ.?r+s9NN!ዱa#(]75I%~u:A] Qy,#{n4!A#ŝ:!SFܒԶ]~G i"o~]nF=+;oG`;\O9Slc9;_i9Z7;\2ErV T T T T T )P?ϗa3ru\l^c戹 {d .}ŤK;V(+ml7K$>< ?KұO\>4Ga-L1*,=Panޮ݇~Ny! lXͻmDZnwkȆv#wPY4oɽ]ۦaѝˑƆUqޒUB7Mi0w]ar j4] &bKpwG9nZ89Ӣ.oˇDKX9-ju{cEna#B㙒f9N舥 {] P煸s=|^ j (CF7j *+GATnP0tPJry5sF9{x} 0ujyELRRRRRRRR*+qCoU|ezR6.,)sz} 00.ȝkQp qX[/WU=Sڗu 9_r(L{h] A_I/ 6qs8ǔ,ߏ!rXv$'a߲G?~V1S7!+ÖFn1@Jf2%ê[=tw꼩=$s\컇 ,c?4-rv}kaśv89ovsZ\M V-7A0&06hq@N&ޠf> eR9mGV,1YFm( h HKF#}(Y/)nUKJD| +1=/</W/ fQ7?!P~:RʂK抋˺K^OIoI񡄕x3]R{p"<Y* .gQ :s`=LTdNpb Pg?z>^| (DU&RqDwfP)'t83oH@BP2#W{(******* dRjR&ӬNA9׌[ǀxf6R u j՚<LW0+BS| UdCYLp]aKXj$hՔ\1@$bWB?^夋ktCj n{F]C.{U.%f9~T;,)0pw e,;~'9,ǁaXlqpB -Fէ9|W/C{e />}Yw8X5EͶ35hmӾiPlc6 '>" 5A4Kt;{#ArS?M{J|<Ҟ,_Oqs(;62RgcĜKf֞|*@ꌀʙL!x8ՐU}  F%|X[Ւ~p38V5Laz E#뫡RRRRRRR@U d8HГ)Ьe:Y/hχusobD7,NaUOɭ tb"hmi)F*******Q*Q jEg5l[-| oy v}X^x5餹NXkBsd4IQ a^4?zJզ&a0*`*?%+)Sd3i?zSSWX @UD?nR\pj}jXHViYfڵ-{?eu3vmD⽝S֬ywÿ~%jN' Ge)cUulÀ=@âVâ0g+Či[:PX{ iH,3~Z: [U,攲OOed 䳄xR (+!-NnX+BҰ[f ytDǫj|e)Z[2W&-vC|~|6xA{`儁ّur-7뛛ǣq'e,r~JHPC@@@@@R*>R?^>xX EfV%=7}B2ǥL00_N`71a"lPG^(éOmZa=3l1N=s\é2М>eqD>b:2O쵼xp/كOƴD8hx c ^2Q?)CkJ? C3e+zo^{qKdo@F{ܰG}tn[aQ^/^7˛nfo~\.诇S+'_~W*r*|9Hoz]yVͭ JV!K:VM;;|`7E *n8qW@= "!P^4L(&Bm8hCك(X_>YŮDRBImgCSZIih\h^)r~ԟ EΨ;'{~e \t3oM~+Q&\ϳe;2 ] ȌGFҺ) 3yyTi"lv_TĘؼÄ|Yw `OC.T bVd ;o0R)A~ t.<G(!=jm튭>˶p ;|]n1j7Fkq:DP)P)P)P)P)P)P),Y]1^♿]a8=n AxeOgk-?քww߲3@ed2g8GqMHaWO.H̺$KN n\4A28éhXcX..p#`#񣐯?lPq/s%P ^!5RLxS,# Fq7&* v_~}7,clx7 9]/1.ea9F7!WA731)m6MswkgV=diXa88- $ ;x| l '[%v$SWQܠSzԧS8*#j6P=ѝ=8K^˖i9D-O-ť~&F=_iAH6)}Ѩc6Oc.:V> ("ffebsvBawGY)jҹwiJGAgV5P 摎&@! 8$$YnMmK*sf&a~&nHiL?g78ZoskxU,yq+# VX,bݞ@1fV~sGsޔU~O1f .Xto8ddGdakSK="+~N Ӕߌ{zxD( ~܄2>h y6gȡ/0gCupo%2ELn9 8~V[2:#3}@/p<~WJ!e lEljiW @~W C޽0oO姟w^A05ΌAF 2P;+ၑtj / !0V{qR\6o̒3f \x+5m,a)џ!?uXp"`Ufݾu|_9K@r(J-Y,Ge҉]>ӮP(ʉQnXT~˼0e|H4-@7qZ_.n 3Y~ iޟK+iӴZsM˴ȅ =`(\ssal,4"-fNW-t3?J,mQ0_l蚱^) sV sNT;D&P)P)P)P)P)P)P) aK&ԍ"p6ݲW}\c{([~ +-a6YS;[,̥K`Njձ$7Z^`U^Bnl48~~γxr<>gxozVƯ= "ȕ48}郁&"Ījd@٠~8-pĵ84Cs?N/4S ft$h2/?9Y^/_{a ͥ3/jb622<?yy?3"O`z \>=!M̟e%µRJ̗.&ObH9EXgz*7+k_T7@4Y8kZeݚ0ǹ\vxƫ?N`/R|cx$_S'=/@VC@@@@@@@A(cFaLqZfTb5IL@Qt8\`ϊR) @Ç/?BH&yj"AXz*?׸Ka#{{ 127K =RY\l[\ֺ{=B2#i7/džX?x_5_!̇_~;D (8WlCwH0ۑu|5->+b*@OMx71X"7@|iȟT[GtrL ݏ=)6T@IDATnR/? /agց%UL#<zur)nM(lY޺l TxmDkpjgm kl`l#BrE/K%N S WOY89)uXksSV:*@zIlM^A0MyrcYe9wwӿѮ2͡m1j2Oe̓Tїӣ@ʗoZz(O $dYpN._1E?x}:$|tS^}ױ_\O9K&#@}2͠V@?fۻUC;Zs|GfgA #FZǑn˓  X lWv}\nGLh9)`ׇ?nyҲ<%j(P0] NbzݶVDWشox/>_tp_"cY|iVP fqg0wJĚ+f@qd?[du +ⲱc({醰1͛@Rz2>;Nф9=fLSta} *"-Pon|8`Gp\9q v@}}qy00L*:D !Ozt򾺟JOwxАvKK, 8˜\K@ދVlPm oPmKP$cD1J[r?."/R N|6-QsTg{m1r΄_\XFhQ+MpWhܐV^5#)a!Seb-i%E٢U̼ Б'``Z=yؔ 9&! \{UҨ! ^bO%|'?GE>2vu|DnۊIy qfB̹f-xR)EU k>kv˷{ eЁU~ov;E}KؿyF+$ Fkrݗ_~i|~) a7 +'-+[^`mr Mxޓ{XlPG8RnN` *kqD"[T42n(JQ1[n9C$s] WSml9rY3{?f[wVsLE $`Y'6r C򃑚"yPd̕”>΂  n\ۥ\dJ_RfGLaw0vC{v;s? 6_Y>\IrD,fr~xN K,U0Q,vGt^p\d?f*K7'H[uB񡄝H]`ߪ1\>ÿ[ʧ!cLKڢS\yԆ3PV+f!u10#;v円K$OIBR hQ v0 _I(zĜqQlbW.aX٦ І9;m`s7jRRRRRRHt54V?$Z/?HqO\ٞ"̧jѴS_FR.˛0Rr䉇 DN6)SXx^Ea~rZ ]dz5f~H9Hao>V=?:a7 3 ~+au93m%˜9fͷ^̰=Ag wU3a?n {DU)9 }M2e)acwrY0}.>4ӞKCۑqӧϹLy,3MKCߟkV^X`7 a7tT`p= g1 {BRs9U9.-TcaZ6O@2-Qp>.>#~7EIJ^􎸨@OzRC@@@@@@U0!8 J2`(pM6k9y\w, 9V;̥Y?0-{YMj8aTp{voQ2ր)P3(##4)!`E1^as|*>S\CEZzILI0e qt蜅q8 VVBG{[ԏ0W޿WÒщKnZ:MW*Ќx&cUBA r煢A;?^"l8ޔ-?{g/~/럦YlgJ_&YǤ\a+?g jk%{֘aRN UY <w8kc 84{ s`5à 'PG|cIL%Cg#YvEgXeE.wi.2ԇJJJJJJ> TGx?24Hsw=ռYPxR8?6}gxT. BWwHʠU5J$1~d ?ɭePcfToX][L[2AciEﰚ=.[t@_lYoE%?h Qom<2*hY& )2|=tRD4cfNiɄu"25"XGe ;N/tӂwѫen6ބflீVMIQd?3?,b ,m{7{Y}`1w******~) c{ m~|HsZ&cΩ#a?L{3wo)a%EA (Dq7?GU }8Zh:X<S |?+{#{H0AʌRƚ{P]gy^brdS5e9 1CaKGE5h W)0*ʴx[mnί b4q=la ‹zEphm-VC`8/^o7scylqi@ONQe-l[\ߩP߅n|:#Tp`G(8u͋og9q0dɩJ>`Wj'@U/wdY2]zETaa8_ڻa~ [k;ws = xbU5] 7{ͼH@vU !\Η+ i<.O }2<`9'E,8Pd$ z2 #³z5A#Tk,.˜Ƴ.Iiu{:/ ypl~_\ Pp5{;pf'ٟoy'@gÕ!SY+٬#5(]fS+ ۛox`_,.=p @Ow@㨿h5NjD)1|4L'Tޣ ൤"+XƋl'N01"# á7])p\Cܝ0}*\Y(1Q<ѫMJܹ5XNKq@E?oBՈ@.L<y FBbe%%oY9oI\b(3&p>HOM GVt7xM v  rݲ]6߼~l8Uvwb.JE:]P)P)P)P)P)K@U-pv[<'߫yOn6C3'>+Z#_C?  OE(g'ydfk`H I'ٗjjZ$;^bl7i2w< cMs9;NH wΜCU &+o< abZ ߳m@o?{ߠ*D)@߻vpGi+Nt`pL}eD|/[(9ڭfJ^1NYmxqŜ,z3fa+D5G{@saـʒ29qr?k˩x}JH52ZN\u33`@,+Hm N &8F[`Q>'rZjH:ƽjNEd?H%A1 WPX"!Qeb |ޝB395[anJRZlWeB-1Ñ4$'ѨX-4cnZь;=U[deC18 3ΑYa.,Vf~?f}AJF_P)P)P)P)P)P)OLG ?q_̮!o[6rjگLگ19pDL,GB8w/a/oY /XI[OjVJddev5/EJly<UdK6$SN#/O&/#9ysL:3/|L4&[' qhR҉|y]8!a}<~n)[;p\\l|^=3ZYo(a/)|' ݮ]lG nP0%/cT"CDV (2F=gkp(L,4=/"eN̏?`]cZTYRj}l]1R)֢Essl鈏 xvFEP/"]mOu&փ4y <[ˏcBѠR ty8'%SGloiyޫjť>5i 7sȴ89.QA #1f%w6ڀ******~I ]c}c-FA5=W0k8Q98+m5 NV7{cUV)F`McK+RGLaee xʣ~~ dT€n&2Yq9Dn0T x-^X=^E^@iﳿoW^׬,.8 e{!|TY#+ǻLXxGi,'8#GlZ{;>19#1;۪Pur^=uELEXaC7"M)_ZZfn1ğTt-Vl p' 3(m{=j;}i:9XlxAAG*3WV T T T T T (P?[ \!?Ry+@C%Akد |[:4,g|Z",uOQX 5?8D5 "`%FUtE<))S,iEkV60i#4 k~ 7F 3Z#VVYiƷ? 1Z}^<ʒϺnN[!O+r0ڶ=.Ь<([3DYD$#6/_(Zw QU>?U(؞tOPY2$,S6}~ 6A9y` I!õzbLcHvOa?n}|%[GYć =1%(%<&#[@0M-J?*QDN<^Ê zd^βMb5(ڦ?'keMv"{Yw@^n0ƕeЂA]-HC\iK6! vT}?[߮M?Di Y#ikoӎr56moٿiڇ㻔xarҹ;1Z*vi*I)bNL~/DDki'B |c~@ bV9 fm2b%@ JXnoni"EsO@@@@@ύUߘRJIxkY_!sn(Z0qՄ@{/ps?"_K='~6CVXyrE )ٰ9mlGG$RE2ᔁ;LD#Y tTx +OFW{<-%t(FG~yiO>C9ǁi >v7o=ܭ\ /AD =Ytm1h*x=ώl>~{`vc}ݯC˗/dx ;Uƴ(?t8>\N<\k %v\l(^b7&\/a֕/1O[KKL w}l_CO{!|LeAAB96EG0K|H|3XS|qD_ tng//5{b X?_ T3G(L> -9_w˯p3k0l ޏPØq򷸃Ǻ뻅[p߷;l xnp4"m9#J*cxlc ȕ9BPS԰PׄUBq?~;Q wk 8XY1V͎pG)E3YK=uLqaupIis-D^8X\u#\G|E`Y)-|no`_m[s,Lߠxw#lq`#&+\*f[XsW+?uy׫ܧa w,d?50 ޳1@ۑWܒē1sk}DȰ'ıix0 `]~ySZ2>KX N ~NtȺ!dE26KGDI;aERv$E\Mms E)p"XMn92,hs=#EYx7)֔ye\]0r9|gޣfDdH^'E6@V9):-N5% }g byJ  )F ^gH #gDkR*dr0 }8cߕy;@`"p%&5\+b8Bit ii_H0B'RIA;py|]9-\fbXڗBBGR@ZN\:墱[hPj.;,!v ݱe89G?l=GԡM8 jLhT!eN\5cLÊ;C?,^Q8~|YY^lƐ5gnrr ?M7a!i&[m|x޳5^B#.Cc s '"]8uHr}X'b9~* .%ʢ5aT^+W=.GZ454"5{'U?fSCNXxٸ9{9loh500A>G>#l h ډ GxngͦaTNݫJJJJJJ7ۿ?Yd`ܐ?l48`Np7Ĥ&5na`fx_+է ֚æ LIW9`<:?OX% `9˄,a?Խ/ΏxE\"örGM!4Jcc"Zl,sg/naJ1ƚr?T*E6U7,糲3/knD a=33|8]UӐwxyݒe|lGX,k0+|9lO$Ȑ*(O iʍ )I򓏙+͋1Oψ&5>Ikͯ37"-g8#'tW:s'+9I}SHiYAܞT2ay{`Qr]|C*2G築'̶PH?+ō*{8)# Z$(NRRRRRR'Lr!Ix~-G-Y Gi謹{9GulLfH\&8D3&B5\zǼJpa|%grh\Z1Kh\'ȹRd&_>5H+Bf0lIwrxS` = p7~d ??7M߻,bن:-P1FGiw5v=PzOXW]TD?? h& #D&EM08c)말 95QTX 5绚ϧV2R0/DqZ'd3;FZ"à).2 C: _CϗأiyxJˣŋUɇ[LR)P)P)P)P)P)ӣ@UG\vbcƛy {$ Gn k=VSưkt0x q<1|69Ri"!;牘irV&.3KxuMdhY2<~ L't<ˀ˻:x]g0, 1 86v} U'8{!8kfz_ |b)lĆ/ҖP)P)P)P)P)P)s?Y6tʸ\_%{/ ϲrZf5|9G5( \(әB4WxAȿ-+knaPu\ɦ'P]Jy\pȇhH#C5W2s.4Vc}c8FwSsބNx:*ܫ 2cA߲ Qp 77ֿ{zwwSrwD3u)[2oɏ3wz21Gd@F![nq|bR̤S-8-^ ֦d'WzjpQG?EϐS1Z;5!)\)o4<Bmeߦf?S\ #(s0Y#-vY#Ta k8 ^羜A+Z3pWI*MG}]IHȑ9lb?ezFv|Sl:@{p9}i̢MwO!șfn^qg=.CUW:_RRRRRR'NjL\ل3x#\f+oWNr,u.V/>w^Q˚e5r{Q8wwl\nnua`pV:k81揵v`ɡ@XnڹSvʏq;9L4$Ǹ7ÄXa(D`4"gסTbxJSHx\q5l创4&u }۶M_/elفexhbp2gC"cV>\+S㓷~A/aYwg'C;}˼ǿw1pD1Ƣ$9e=>b(8*a@Uk uQ}~xGVn~I;51DiQyL }4!rxG;D4,I7qYqzJ&怨jr|=A2tB^DƁQ@}lO8[QCmc%z/b>/UrHJ:TmҴ-e?c3r, 21@6fH}+pS:f ׂ'e?.1lr%&WBK60ûS|t &.F׳ϘTְ3<с2h[ ?HHHsȭc4˸b1="\5(2< )dym^hJ~p4+/-ڗT@ӔQÜH(y˼y-MUX잡@R0yɑs5hMvВ-4vP~h /m<9G4 SsZiz (ѽ[<<;㘱<8S> F EkS粼iӴ@iߴǨZl*8iО321[Q̿l {ti^d47b3p)G껦UpGY)rd w?(R% e&UQ\N;q@LgC)>RRRRRRN_ XKr1ky`G̬Ur_b*J~V\S!?'fË0jx /x.]2Z+10 Jjl.B\/2}CZ%=+/cxN W*S| _ڏU?{K3~܈+s-z_+{d}||S\t VGYzg5_@p*NG"BIf4!!9\#C,)(dQ@IDATWSg,6+Qj C('pUmY1OfwBI F"GV T T T T T %+d+__C8InWesIpG>~)XA4%Y/S]sˆ`'Ȓ%T>Lȥ*Qb3~-*Z6ޤ?naʂ$~1kU7u558ťQא^X|Oyu !L ]KTk8N2^b} ^y&dt }6>M5%7qg6 E%6iVP*`) <>{a-1O㸖Sjp& Z=vRWsXƐg|9.B \******~< RrUJ^ ޅ\zjv['P"'yo+x0X7pk7,:Y=#Ag?cu 0`/7SRү|AJ^-#,S .ɴ~N<67˳øgml-zlfТc *Kj͛i8T @|-RRā&L8Cro@H_$vJKxƵ8f@_%%lA1g}8v_#<~r, 3Xr|qI \8dm';w+$)^1P.f1zA\AˡTP04AkP]#Kbz/uTfpzFq *[};: o/)y{K]UhS‡p92)h*;pDY':/Xψ@좆ś3HZY< <#/ ˯ZvümjiÄ+k?u0{Ggu9Sx%)RJ2/ڝ ^SO^TJyz'#(-[jnϜ\$3phz 2z{|WJ&xW;I \2Փ"r݈phH=A |ApDK%\3Y*(Ty>s2M!5@R?wnCB/4bx Q({DU}gF- Z)fB$3 .Y|Y۳!,ybckog[>HJ onulW{ %.wVgۚDtL=KW]Y&L8'oZHcq;)#-CK( cT'NZ vgpOw^niC BCQAhPP)9W.%"O} ~2*e!}a}4ůօT c+n[D [@ԮLdށ^EGDl X`TQ֡00c { kbq{]jd8PE~"lG+^q[9[wLj aV !9ä^U[|~}ۄC+ HQd`O暾'p i  uy3ْtyIP_> Rq) 8!?`s+Ĝ 0k9]֌⬘SecY9 c^H_h,aЩ.4213Kx?O<@J_HJ\8ZdTb26,nɰ֕g'>e5Ӌ-Q[ټVq{fht;_\K9- (OC藇m` {ϰY3{ì!x^y!Ei&$3=6S,{Kzs?Y P dWK/dDg{4}O[Kʻ8<혦zj&q}Xp>Μ;^a]0w>7vALnā&L8[4$b?fD1vEBVbwdY,bfa q.L` ◳DWxUxJ:3^ OֆxO59.3-jWÎ_q91I/, ;H6FuJ3ߘ+["sm6qfֺa<^Basg6Vk8cic1?'ugQ(ɗ›iX!. ۢ;ּ#{_b3}SptfXn',Amc,Bu%Q٤$9FYSj!+nR-Xn8q65TgW]wp;۱~g$;ZBLrU`+lB߉&L80q(gNqIMY?GZhd搳? H*f+"#1ha!)UEE`ѮEF,Eh+BZ`pxsjS)4sJ Mos_*r%+o)qN'Ubom+y2~\< N[+ֱ⌆qnC'['A;`\ q O>Su;(,da4yO<@;7 {/S ^)e92P5&wAR=b`Ǧ~ M~~h̡"ޥ[t`;.ρ?83`ܹ97qECK%η-ֈknjLnā&L9k6a=wlqz\oܬyH5GN;NE~7n \5% .5a# ݒ=\1bđj*Em[%#7G:E[l`Q6)MEnظB.(WʱWd:Œ ^; |&W} f8=aG($ =`&L8D5 rPYsp`50QtjP.a 9"?8%4^բeߔp83Fg壄g(dAl fԁpw[`j3@g| -KJŠB,+. /8pq7$Oщ&L80qRQ~ UR_noׇ=j_&` ކ%1\sJɆiCwf nvT~6޼rfuvNc^I~'L80q`ātАbO;G4xāu7[Wt&fxkD?ly̤e` F;@DiPg c (E,ODwȷkG xEhI,Ig~ܽ?ɆO.aA l,NkH#\5:?,UTH Ce)S38Q4֛9U% ֳ*OOha#)`p`^_^Xvv?dWЁwR*?E=ZAzhbM0P>/n<x>+\74ϐP*Lyս<ɿWCJж"Wk#EpB#<$<(HB3J&=IfR; NW1/mXiBxIMdꤔ|RͲ\x1)ʅ~64PY㴛w;wQ9`&AӕV|vҹ[rywu0l1 ?2UNԽ=zXoo-!Njn;q`ā&AVRZ W~BIQğa##,p3%3ɏ;k(CoK#)Y#\-sɜI]f}2{DCWIo{G+X=Zgڴa''j既HH߿&A!.4MQ-SOʿ9LȘ1z_=aKtzYkic:XtwUtF>s*&slp3`%Jua/HE0[ʈbgd3.Ph g4n_iTpoXtr zQ9kũaag^$~}42-ؿɩxJ^i҆F9$u^'u4 _+w}gE >lQ ZDVKQ fl29=b>C 4Px㳶й @:y&ol/ˍ0|eG?%bG߱1/0Fn8`K -l/[Km[>r&:uч/w~oǽefM&L8[/p Xwx>Da:,6->;Ζdqql= %i ٱ2 ;B-K:G93-[O.K39DLVoe NJHve\[AEzN`D  ؝Uq/}k&+C$F) 4:v#EHXf 2ܤNd|(U> YA#+oRԷ)k3'R2'H: M 23wT*? %j>o8Gda.Ҿ.*;?ֳKac`Ȅr >X64ws8|1 ˂wj|ru|{T|OGqF6Rs֪{xe9<~-#f+\Jނ;_aV8{:${on-fχ *5R;/7U$&{iBM*?0grcb= QKG\.< %5RB-LA%K^T2"&V=ÁK;QKMk"bI?`u'R?SnAk.$k͗WW3~h{N*g'FΫ_V\D%q{'7>Պ? U#7LoþLK{-)~Y9Zb ۊ3fx@ 勢Q#g,})@800$LJ*|\4|1Ǖ3ذ ,.0e n9%6t *B .7w'vzc'̾X?&L80q'^I0}o1 ݵ~w B&Lc(ig2~ukP$s,"6q"֢Bfk>mat_+ƨ{X`M |ޗѼOÝFB%Ѥby3U'6EtMP>_lA!ZRC?; 'G~H9(;[V;[-q-bǖܾvoVU9JJ ]{cgw?q`ā&|~ĕR‘ *]9bW";l?؃)L>31Gw0bc Ҫ_hXʟ.@'^ЫL:@>k;,JjR VƱH taFSd?o޼YlX/kXEL[\}½0p#M3I'ߒʾ_Kk- " Hf  ~ߵ{ \\>F ׬mۉ"@ L&%,W#BkamkJ8I:ջf]4KG@[q~ٜT[i{2O c''9d7& :6(A |ws@ c(8#wv,Y B1ā&L8QBUdQv=PAva>>?B#Kc]OO1,q_rDH+D:`0k@ܴE\)߄`C}. ]_w^K* qLJ? %3sO`+w%K U59گa;qVƨ?G*A)rN??ٿo6̂vadSqhR|e&ɷ >a~{wd҅>!"֥liNZƔ,P!̢'/1;6E|h[i9) xtz߮Gq†~uC[K"}vʪㆧfc^cY*(K B1d&G م2ag?9/k f8 4&L80qrg7 )|_FS\(̍~X|_!xܓκ~քY?{@laɇb@j5-ͣP?%_8o9eYc#E[]/]%_+'܄{Ь2z"ľ02gV5hS50=ʏӥj %Ѹ,Rb ѲLkس+Dq{+"r~3G(z"(2|OZξjeϟכͷ//7فv;% z7((;K d1lv TUFU2r:#O?_GkP Q3oZ9u)x#xw\Q3V`  ö-?%Zd\{%MU f 7ɿ!<֨I3ܦȰkܥ<%\\ 3mXq*TcD : LX`;`D%[w|χyĹnnbs|yy)= *ˆW72&L80q`o?@Z:BJ w+KkÚy|5rml!YbX1SC|y*21Yi?1^Hq撲Ts;pVNF];"J̲ug&<` "RjH ł .ʓJ $9#W 2XqFcx?E7.ow*cFH VKw6%;MϧOC>g-OkY3FfF_vww oQgF>m~Csqs€1&ǀC.u44 )E<@ysXdV[볚wa0n&iJQ{iwH{) pZ V,֍cK5I]39$7)h}-I@MH&3D ᒟ%*u-@Mmfo⊟d೾7'ś0~Y;jPES7߯JCPN*Y,( !Ɂs1猜#>P)z{}9.vvA[15g~Yؿdd4F29evSk={k% 7&L80q`/-3:Z@* &Cwf m!9G3VA08C 裾2vJB-{Wu 0q))q\8jA<ڜfS:*R JMOˁb|yaanno嬆EYU -^₏DcڿF o>aJRم[X[ki-hXJ+G: '#FJSLa5I-%Zᙜ~oP|օc- ?V5kFҲ kwmֶ:a!Q|k~x|2-4m<| cU(P (~gEH1?CJ,+Y&w18Ugy(f%42(/\-L?&L80q`shHa |=đPRA PoT]X3G< d>?XaAŝC=(75 ikϔD$ϚZ%>h).خ hQ%[S)āW9<){ȇSQ1?3Gc9uZw;Y6:+׮fͿwtbpdmQY?[#X! ,4G8V:_xѕ~7ajj/%1X |xN_> Aa\8Ӗ5TF62 T$wP~~D۸iqȈ?Pa? .(3LH .{TO.{X\K׳^ {?bje\?GkTLR~-5ɔS^}I*;M[0 %L&0mR@-x*>^ee2nq bpF@\lnpU?$˷T2]c#\;^L;xŕpx#slK:_XnϷ#Y'܀0.}%>> ~&L80q`ālPH%}:ulT7s? &0`lF lbQ9a,g#УtLj Z!@E|ūh[ɠO+@ G'FjZS˟ f4j'Zz5I1wQ*H=؇FνP2fN'37N_d<*cq`#2們2}&:ڊsnLK'Y!tG;=3f۶֮jҸ}IEN+>e\S{ѻnYmwD,% Uᅠ k eYm&+u</,?^1v.ں5J1'd|Aa7)Sy?q+Ǫ96|wj1x!yHAuk3yНB,3YbI.p~fqwȶ ab{q@x7g8&L80qu| EJc{n}{{-/s6cH^F |p#"vLGؠr#!dDa?ə=S&(,ء]蝽4’z$Aʀe/Pi!,FhĔS*X%5q f(g-,S$pr j%G++ "Po1cGL}RHr`2uobs\3  A5?<xVيC3] F+ƲFmՀ]mazEZR7j'f/('Ʉ ENx)"c(' ;T >[h'9P_kیR=mwԭE [ՑYrzA wyY1pm%N7:dhI2vbym h34jNvMbߢQɩ)Ln|FT?&3;UTWcWZ:.ޭ;;MT]%?SXVp2 |-U@9WowV~+pZlǺ\`?8-(lJV-Hkr&L80q` |C\v.+(ЊW  ~S  L^o6~{~FDY1$4eR8Cݒ ' -+hE!Ʊ giP$v$Q*PUe-s͑ZrZ^5)eRybɏa&B"oI48F#0Q*ǽIyÁӥ'iG<Y"򭂢tuV@"LGq`ggaX[ˇv~͟۷Xc|LٸpKcyxX섗+M{Ft(P(7'Y(O }6J (Pҽz*̏ψ7y NR*S-5bt7=|N}'['rUX[GYβ1]m\S|Iƻs1,:H#]"+:U\_R@ Kȼ--xl_]}kmOBm :x_ېgר;%Ց|ޥY.b=pǵ =Db 5vga>Yйa8uqG8M-,^wK \u6 0i??͗+ⓛ80q`ā^6 b+弖4hKkn( snvXNj}=.AH&( ΅1;FhO% 9%Z=N቙݊V( ,,RKrW5‘"kS!+7y~^ ZNxNT,YvK$S4W^u?!hP{Lաc " #F=&{8l_uvrXoo48g?}6MtqN_W*rJj O v Ǘ~y[gFR,턣z쿛⧦n&&R0]C{I*kb\l`%Ԁ &>tz@#TG}jQ iYAQ1( $IA%y$Ñ@' Ϯ&E g׈.*H'k:|l^GpT{D׉)6'1KVC8{3sL'1ӟ#wCϪVRJIrC9J<8od}ǒ-G2Qoe[̄ C@7a"jˍUpKe{aP8zoN7?kn@&L80qǁmoyG wkNz_# H ̙~@G3(0lr8< r~csHP_%!p)u{,]c0gRbH'cL(rUB*'$Y`kg%\R6kr8$98gmAlB:d5cČ#L3uQ**@flxxPP6|v_)f!gSZ"}-@G8Jrn*h%4@%;KNXJ@~劼S'ʴ~>UobV̈́*$pd(l)1~Am+`ڴB])$(|~/C)-0ASo;>P(9oL+H~CCK yIhG'_kaHId4x<̗me"ểK˜i\,1^'nzϹїnGCM80q`ā́O \Qc7Ge-!a @A0b̙0bk pi e 98qJA1_kN9,Pr2cP2=6pKkv->F4‚n&&<֦U(L,;RDSyj0R\ٔ%H]ωdKOBlj:蕬(~` 3Xŝ* (a5:a-maXwz!~7*Z}uZP/oH|X+N_'MBW6VMqwZD~iJR?֖`Mfh3}|u g69Dd )a("|>h9>1ZXϋdD|8I ACxy֝Z}I t ,"+_} /;(9]ŊMEZn+H80q`āOUF`PQGFWG.pB-L>:&&2D#S&(.`q3)bPuIGNFc?q 3s_AiLM1Εt~Laɴ`6q&|-c#+!(*dߍ c!xw ~QKf޸x9BUc9Dw9kغ5Vh/xF}1T|n7%G6[ߓ2-spn=Ԇw HCgi^-X >R>3^Vqr1@}Mnā&L@?O+ګ48, d]J??#l Ll8SYk΅ѡ18t w)nĂFCܫ?:pCx;!6i-Lkimޟ>lͲv[6L4*mkdX .[J;%K͏`2\J+wLW65GNu`&zbsi%YGWhjK(V{Ш\*6qfӈ6v9y Vk~]+<3Kv1]ɰ D^|S_h}c9duo6J-ac0ޖ0ԓLkKk ]U=Hqռ-!3EE?Kt*ADĦjϋx~df/86 ٶ(ݬ8p NaFAv>E|pc ^ >a8HQ /nM<'L80q`o?@+ zG՞MPlLhALYC9(/ )y51Șm\%Pl(z*֤x > M9r݊)Ƈ_^U6>?Jl=MxMI( @1! 7fT~ cG~.9X40g`qXC 쫯veT@~6W?Zj'PZ]uh gΩ? @H<<6[-PQ,P-_nҜ#۩sY;S-#hX LBϧh{ doE=-Sh!@kS/w˛[rax/8QTrg| `ā&9 |?#TGk9ݗ_n8 c0fX 3nɢЧۇJ |3k4sUY,wg-7 kCP"a1_0ЧlE9d{ֺ=v ` x;EXJU#}Ѥ2%^V$Nw F_"_M=?64ZvS\)Ԃ{8Wx2G+\$r1\nxGKlπ}')JDn@*r[$bZ~$N}Y,zQRLKXn^I )QoyG</K$zUO z'޿~1xڼCgy|K~߸5Y1!˓>/R /Ba!)NSi (8+,E-z nX1(M~\'Pְ ߉&L8e!9"FQ= nIZ)ô)~Ü zۚ80ńXޏXr! h!(:J`(HC/|et8%Vw9L2v>KJ 5㬚k TO'[4QOɫ.aUE?8plXqq:ĂC+m*xd~ޗqYrWdc@7Vv#Sc'ot,Ǚ "#4h+ҼMifk &>\.#mىJY ~fir3*lI79[D%L̄yl= G1pMuoYon/ZZWY~a 2^)?!Z4t̫OX;Ofy>(\|Iq .k @|'`+K0@~Ősd`h3G.`!j80q`āz\+מр0]+AT?-P_T Ҙ L8ؠp(~ .GIE ^!".}кdǎ7@ev7BW/ĢYKܲʾVʞϰ (b9U 5{qM\WbBͿݤ9=};<1^TbE .\6L-hn4Q?!ӂ\igu-+~罎թ;gBb6,e})$͑Ꮳz#5J.^wYm`wp Ѐd\2rD*euGcOAqγp^ugwŀB*P%0Saf1.8ϫ1c+3[nө;xj^Db[ۛ`&L80q́sUZ8 `kd;Aa$Pe~%ӄ rFbq/y\ 2c1ڋ|QőzL ~r $O%Rn4V@S[i.&9ڛ[d4"\dazR+Lf *[8KZ<.$[GS>8'jzN"s-{pnt^.%; (ϨeY뮭X` g̛Y k`fAYȵ|-溆#JK\Qڻ1V%< ,ɛ܆  ?XɁOQ(ZE9"_)'{˫](fT*e+G.kQjhؔƻ;77w9wcGx <G(9{!}<`=dvcScDl8./\Xl.& xP.™ wā&Z9`8ZrǢnusr?vE ? l*vj{"1#Uʱl*f~b HpQYՠ1,y\ 66==-GQ19NCkBak Kgx~+pfFYưTF]$ 6_gڠ|:|~.BSxkd1 B7eF6HJ z4Y70G9T%H%ɀUJ~yol./`x\n[lu{;;}{&(Z#u"zZU~ڰ7g# wo޼Y~^o~dzi {e<ܳm7sF5?HhcsޯMly<3 A'}!Ь,a $'N =0Fx_KF d yjn K92cJf*ږdҨԳ鋙ajӢfIX|{M=/I[wiPpmBwtUhgi# a,PǬ Ux݀zݳw+'`Wl!w[5{2 Cl@ 3Xjp&L80q`?"’yZ=؜s]{>_`ϑXc1 Opm2:,wy5'P][FP - *ed̴) 5HMB.@G5#Ɲ@0 F{=EWJEDWɓP*x5w"nTC $K:ѰԐi!/XTE8n_w39}|FakMhf^V.7}N؏יuǗ_v 1rݷhw<+ b9+dOϩgpĬa=0qOV<[<_ eE@saoHxR8< j'hG碙,+fBe,h-^oZ|)ORKRz("xqD~iMoR^ bA_J˟Lh%}R!mJD*H?ʧS%ֻ(@(iB"G/ݷ Ւ85N8~B0͕9ʃzv^|[׈ f2EX}l{%lgM#9p'N<b8=~8:g „wv˱.q+c G"F,هtOm63v"vط #M80q`ā_~p\Y,F_v g~v_9+wJGq}qBtgwe#N WFPn3T(JVSA\X++RUxY #p\~eR[޷V;!F˯RQN>l |ݜ7aq0Vdf?*+ |~럽9ϩX};0h_k9HQ/[zgfKF@%~;5o}>{{yiJ80q`ā?1~ 0񀹿j) fXqeÐ 놯=F `8.6(o|!|>Exd-8_} = =uCЇZE:pE!TfpE.rL/Dߛ{ !~C\+لxprGW%q2_^Ԛ1dkzʵ-IaW<B<,m9 s8K9P13aEO{6ox OY9?p NǼB?> u9oajD3W_ sԶ#s(ֳz~2!3Y|uuwXN`O8~5`zA9lj*snĠ}~r : a88#V+JZΚ@x<OkMI#zZSf'o 7d26py.++,–@(x|UCgL$V{)JB)#:!G"\>@8y#n5D:'YS n-k J:˹! md~( e#P($ xH&ٙFʌQ4ӽ058%Бoyqz)? 30mu "#\Kc]lɌc<9>K'6915&XWAFć.ƗLPHy$sNkr9F›gHF@H܋4$^H eiſOѻֿFzXSgz&m8 ϸ WAWxJyHKNfn&kyOВDiI ޫw꼊 Lt* ^FPa1M^/#I,,% -: j!#\Wwfyā&Lmp0nnoH/TgSpt~G%l&~h?ʿpƸ BH+ B# h隆}i^P?5@R]V@i93}RDKqfL'2e]FZ @oH~0+i'8[\r vRa*&=QJ5n`:'FNR ~4GI2[5a&L ӟOρ!vmzeNnגHkoNS_N"bt3\6:Ŕ,-6imf1i8Ժ,§u;ت,X('_w H4V# 1g;_u`ǔAd!`37=BƀkZF 'l ^'oā&29{9>CKvַ% vEFd1G]cS;W DXʲL,J g?EPkR Źrվv >N޳C2)| uK?Fj"S/B#{@RdçO2xC&JfGIvsx nMkڴ;l}um flvx???/oo6 <=<v Fq\.`nQl[cWa.ea ڞLcR3s@= ,c6ogMiSPTA==kaIGy%|𴭽^AxGWr#ɂd!#< }d$-zI#2dgk^K;#21s> NW!c0! ?9*N )"1W1?BI@0|q_(N p=˹0;Yv8:kCmCo~-.]msL80q`ā_|/D˻ǎlvuXWnϴv(1&3O1W6 O~hb`\ND|}Gz=I!bQ"BW xQr!zu-=D'ޠ0\?',dXBib= ո"kb+>sށȡfUJQmMTgؚ8d[;L-_z]ϳb1R[?SnD'}b)'R#%Q^VK} '`ﬕ%k2E~>gcr[1`L?ap۷k="2;?6 s6}&<v`?KvfYٸћQ8IC_1[pƻx^y6U)p@ IL}}$\&XKao2z0mZ`Y.!糄PJ=ŔqE}/ _dډC'yWez&k,od"d;FF|ן.#Q) h-%C^L:!%!LxuL扫$2jf 7}jZp G};[F?3o[qJ 'i* G1B`.Ͽ}zZ߯~r̶߽zm/vw继Yi ̜`ϖ;*{ov=Y`2|CqqàBy?ۅ' ƥސ؇;f@,U[v7ZJvڙ#}5ASH^T{QF};%PsE1Aa-qklO_>{^1]պwI!6) /X $FbcB1@v?51wcbʩӋ&K H~o^ΟH" ?evNעѼ㤃11  ޛ5Ir$ zGUȟreEHO󸿅?o|؇,vTUS5u7ȺPz-325usݬ&]8eo8W'ā~+~YĆVdSz-?112$ٱt (~wD{{w#Њ*Jb;ÿJHjV ' PAZ{/۟޽YFm?<9pr}Oc· K|ǻ?1[!wXRL/8>}|&S:L90Vfnz2[$Ҟv"mCׁ%փm葾洧hG3m /n9`@ Os4q @oWaah/wynmPn7g>yؾz~v Nf_߽<6w' sy~x=^c{sRpqOgV?snm9q+nO< ?fapu |$VBb#OsMUB4H47BQ"剟~7B=f*PƀoJ1+ ҔFX-x"-`)dԫj(ΰHi=/0Q,[vc bPЋ` 1:4Ҽ`rŁPg"Z.VqQ*iBk:o)Ѕ)陱?F7OʐճZ`j,I}"_KOo7YDߜ=/yk*GX9yLЩ|u^3~HT`f ļQ=L6@3;6Fս_ӋjoFfؔn)'OToI7اX)+s'[)Eppx |%~aEPG+_2 sڄJmKIa_Cќk@f.[V3~_g5[V=3YoV rUKؒ ]^z_#ϛy~p}-m^m9ny1gΞ%,?KA@bة[R78\8r!^3"M|2`c#q "g;%/ĝw\A q5OBHã,0j҈COp+k!G;TO 2ğ2 -LE2խw;HQ@4%:m%0ݰ+1`kJǯʸD1t7j.{ɮͧ-l4+M!!͊.@g bvjDEn8"iwrxDkrӪ$߀Y i5sx(6ܥ`&i*}}$g)d(LJP\ lxM9ƓF#6e~y|:=lGdD^=16&O*Y/V X-Zo;0|_\-9iBy{2|=_=/҉;dHTC=!)D4TemjU3M\af/S͏~鄕5|-6ƥ z#$p%h>$$34oh=fL1tDGcZpDNRp.k Pj"ehr2Ɏ_o_cqFqSNv@s* N$mgpr$20:G:˻p8@N}v6dZ;1yd4Sfҳ>΂w0|g{X*"Pp޻kQ*+K0WYG9˸/̵7gF wE3Z 1T~|¨@)ǢO)cm8đ'Vi} ^N,ob@bm`S(<7;KE?H<8[jV we6Ɵhy8M{TvCk6<߹=|9?e{ )()=&mM8e#Z;yOWytO(li4 :SDŽF-3IHh>{CTgO@!iVL6mig@cL]fgY(?\Cjჽ잉kc:WN~ GG߉Б?K| ?( a:<{bЎA39'n5|807;Ҿvwo> wX22JVmxAFbۻ}=q/{wڍL=òQvG7':c$q 'l xS+_+0xI]CO|,Eۋn?Rz@r$ѬAy~n;s|vǩC[;x mXg' X(2{X-Z`jOk]g+cn܁ݩfc3?Zl Ƃ=*\>ҋ=iʙ\g ~g;`)#V=h4* ,6B/`o\wWpI_v+1r Y#}wnŌa/d#2M>`G#];q.,m;AWb)?K+\{tr210lULo/ouvwWxd9='̎m= a=|g&Ysbٱ$gVr 6[՛nv᫊|c/Vi0Ԏ'Fh]= ->,i縒;)TM5VݽOB75 ` 6Pzz Bq1/T+?_Ujp˲MY%غ&Nms$s㓮SZ 2\˧Q3@2э S.ݳ+?]q0g6:=*>EadH%Z)@wjVgM@IDAT -PU'i/p=y-}u?_3|O+;X| +bYvAm rjSșH^o^2K ]rtN#Jt; 6 ;ŌsпA+ n<СSƵ']l芀 3Ps\$0HKyT.͖8@l#믿n?Ns޷?Oҿݞw{Vr,/ki +sN>gp:Vk\: mX> /nbWX e` P=_>(کPsK$-_  8e-hu@4n$s݌B3_1sb2]s퓷J%4 ZhI{5`D@JFQLRP>[Pa -zm# Bu|Kw{&p_AVs=r 6H"/rٌ#{?ӬV X-Gk"%eO~}xc?ˑ :cL> +83xqg~tYg͞NxgiB?;Qr1P|3g4vg~X u&ä ,gрh 4'(i ۨ8/f}lǗ٣xE94O Cc{ L ܁řWȑw YY2pӻwteؼͫW)9hw||S_g3V,y;_h>>Ι GiY7G6{:=nٔG"cӑ=8l¹) 1p&-yGϯ7<.|$ hˌo#Sj~13jT*;$Wj };_ QUZMG ,\#)Z[bƒZ^R@+Xw}K [߰/y7M7^p_]Pbd GòEG9\=SKtr:^zL/JQpދjE AHGb2•{ĻB"V*>t|QGk',DžO){!92ɐō_}|I-DN.n9nfRhTxzf_駻OJS%+ njV MX*Uj=Nj 3MagY?='65mWCNǃě|'LWbw{&ᷡc,Zoa PMѤl_\| `h(-ѧKE=jr,I=i%f`>{K I]T md dڝ1$YM66c mA`ptB@2T {nOC/D-͎!3Snߐ=)tV*d}˖?Ӻ/ΙUx@6OX|p6o޾m^= јT%lw>?8mao=v,y}bO]Ls&{)@ 2 'Вg$g8 (K[Nf]%qs4%WKa獇5c] q&/1K,.t b[70vQ.K&iœ!#)ڍ?ʕX9<똉+z|2oˮrg,f ?/QyWv-" ) 2q 0F.>2&yOQ2o1N9ZB>,aW DJDeVhf#43-t5790^pTz#-pmlrټ{#W_]~y|v2V <] p] xJ=l`)`^Ðr 3,J͚ ,m,;wT%!oHqK]ό F2N7AgmNf|4ardLܔ!#nncF  R uBB$9qtlnNgn„ 2.o\I`.2ḭ+-ωc?5ݵsJ.Otg3;Aa(*!cՈv{RtBHQ3Xq!s_=?~ ec|!px绻Tk-S#E7MBdoBV X-Z`lO`WmwY@{u=_Xb GrKsTޘw`۹"_s3uek@B_$~p/668lu'Q']-l]Y-G]6ȡD vDƋJ-%7; T KG*S0!Df :>#Lǖ>./Μ7}l1sDv iu2Χ-9J_' @{I.}2ҞCٱOӉ>4_CpSYʃvw{lAU% evY+m$|sO;yxͺ?q.-sÙ^ktC&l=0ej6Cdfw @a6_GA3|kEE~F7 HPDž4o.yW3h&W|3%Ų (8H}h{Auis*XkYkM3݊yɐypmBm2ACrK"qDDrF3'4@/6g"z%VґK4XKA d3oz2XVnǏ (-E/&,)8H{ {8H']?N/ 7};ρ+'JM_(EQȥdu"5zȕ_jV [w5O_oXFW7_m.̲l~.}|k:^>h Pa:ىVAt*Ư[CC򆩣py!b X-0[Qd@*4"i zT9VfdtkڟY],Yb'+hf:Ǧv *S`{1C4:c*;4kNA q TIL||6*~1KHQly;VpwUH[`bwT]t8b0hkYt3 3a1@2H7 DWbxL# :qގL["[пmx3Iv[~n>}:Gy^F!n '@s'W# Fa̙ X:XCCY>a[V`E4>xA\Eؙ EeݙQt@VQ+C,%V X-7eOJ 9E 83'Pn[:f FLԿԴT߶âwȠsV_;ߡ0Ae9zEq Y-J!/ 4s\-4k/@fi$/e+l҂6&QZ^r>$]hsH~6O OGx3hQ=;ܺ] 4Z/,Ce)>j8ʮHp;q_m>;@_\?yx NrWlhBqWܳv j3+X=L=.4q9!l=0hXnGA4GG͏.ZGaDbx} A)((&腍Ň0͆#"{\@=K'E7 _ ^_,:"ȗx_5+b$Y.fʽDA9nI`O/` XBaDnr"X fmh(+!† l%|3F ( ֯@(EfA&젪h|r zV X-Z`bO@EMdnm-;ܳ[STtX@Ytbm 'knޢѫ@ٮ^'%Y/C'^V/ˉW,axcةoOғMLVoYbLttnYu:[3秐-Og*ic2.w*`Ae\ M`71/'l@[bM6d9x8tu 8?KXYޏ*6YdA7ơ9}43X "g= 602~vk|M .J^f,©bP㟻H gɦ1ol X灹=G/i=IoxE]7%u%IB,yG=.&jC).X(мc i O, Y0xKjjW(f!lC˄V X-;ZNnN?SDzRD/|yG~2u.U;8~ܭ%N6&Aݍra{qE`}hCl@){oB)녟 EhF : D, T&ͣFM2}j%ӳHlNGN^||BE.%s~ ]w?%P#w|R}z|lฟm?uw~փe]u,> gڲH3 +tl xFp,l@R<ܸ5;ix:({)If$Iį|VD.hz5\S歷8Q-DFdilq+en\fwpxn訡rVo.HKϠ t ˬOf|5l1@ER,N#ju^|۴atYb=kEʦa݇ݠclbOJ:GH9N@U„9^-Z`j>y࿠~aKg7~|r;SA87+s 33V,¶aQ3yn!j 43E3kMȬV^]7DBaH&T*R%[!x4mi^DۢK$=rYm[5DZ𢟇S3!d66,&sĹk=6MY4^XBldnv6#Pu&] Ά}w:2nFXaq~eOgx`y1sXSKWoc'OǓ4M;.OG6D4j(yD6z[oKSVb8$ |7!;nl ZqN!)ޱ_qx8 %,IYa&7nt'Z<vgz0E2nerbX"3KIONyĔ >c>o/3ȂS¸ϧχgxIRhp{dʧE<zުwCB^^ID욻Cc}h gO3`PrMh0cm&B"N%jB:%0amAr' 9uSyJ% Y`0,m9x*.QqfJRunCWkNLSAOm:\bI F6! 94( 8ٔ[3Mnܚ`ZOqBk:~^n&yo ^2eLx-x: 5 }y炮%|%z#uQN7J`A>-, PSlr`KFY9r=lgɽ}F 㱐A %/W|df_/Fh^.u}7oBgbOѭ~uw|gYȈ2F1wnղSn^߁zƤ?=<<0Q3;b:ƿlZ`j~[ |ebeLn5skmj t]wFe#- `b4GcnGl,@k %Cu&ڸsAlDFC3q~\BQfBBƇ#h͵qaMOn:"BOm#`dhv "ƾLG/LmHd{UŊ͈ٟ1!YKs}NprGWlٿ!oPьqgM:vQ *%h.㥕J߄#]x M#nHn0JCilKJ"(^R=ڡKT_" [OsMSG{n&]/k]:klawHA($vxz\8f ƟwD 2^Qa߸({zVTg$l^@8x::%ĕ?"s_oU{ [dk%7Dbr`P]6a( υRSGNZQI 3{Ʀ hvzkgwQ=3#@63l};xk~a)GJxU=?CHy]jV -wwzw*Jf7LҁwZ\VCܩ6kY$Mo^́hLr7 4}HC2AF!ʼ}h!Ho\>y:ަےSq=ݢ){Dth71 *4yvjX F"R 13pd &VLJcCmw✶ҁUTDv4zre9FocgY{ l b'**S&9} TGT̙ =t a]gk79%}Y:Jÿ@&XB4A#3pU.1L{$)證U?QFIQW)6T@():9.yxs^9NYK{ׇ;BcQ-X?YM)\Nш^tQMQ 8 0?c]2~ӜX6:v ]]Y F|oBSg%Se(:iտZ`j>{Mr]5GNJL?`];9|rӛSdc"Hm[ e\b׾q.˨pݗ>֋m&M{(@~FlBr{-~ma_g @8` wevE|\ޑQ O* tv5 6RP w:d}Qohyq_ʈԡURFz}iq #g ^j&4PSh$PdQ9%>`\553E^TCVE_zUX|Od )@#2QCe ]O X|h/!Zt_b /] g T^t({ޟVڷ2)2@C y6y QY=)Iay bv3LObM?}px`/N zэ۱3.b`uz_-Z`j5eJc ͮS3$nmk*Y*zϾK vmh/Ë6I\ m. J[-CV䮱zцNکu;\y~ueVҕ7-?|ت3Y 4VsW%hrͨOt4&dDڒ16،"4ʧӎXbVD[NmLf8i39ħ.tDS;Ro@j mp`,($~PnU ?$;%p-Ѽ6Mۻ / mxC'} >]=Q͟1f+OS2E*.+`b #' zW:7{f&dB 4gifl{K-dž?Xo[: 3|##zL$7ϧ0T[JC7GBb^^&Fǚ="oÌNn2pmn=WPhF\h7o6OWׯs\*4{>o_PguV X-Z[bDu۷,-u0qGQ4킜8,caPSQG!Q˷載Z*6ڷJ;Z84<(¹` t];[+v0 :IIfh-; c8nא\6j]<@*l b_1Iђ#",>y4-gBk&ͩ@a-r {y`*A?Bty!86&FQD#gkE3 cBc?$s{j&=,Bm9ڎ;nFF'~4D-ИMC2^ hg&lLR@vP* u)31z~îo57H,S~lQE[F52g.XE'VpriOnlxf"@GM\;t%d{Kҁ-6!^&S@YC#eJ**}{Dp=6#~Ԡ'2o.)Il.%psfd/d|=4Hhdd]# )-rQHuPSpQl9y{C ,B8leP46hz0ptbG%6kNH|߼chS܉Îm=c"Z_3GnQGD(|=>bۻJ]]voOOwn_V X-Z`o`> VjrƝʌZhzç=dPFxk,RYRGs.VK/A .[.FNG WH  gpJkHPiuE?f(B,WQr<KW;foH9½pI@SԯBNܲ l7)_t(}uߡe]/D+=Eg +uEXcWt@DDp۩(}gdV)-)(>f9 o7A38'; }xi'LzspMa{?2}lϏOw?xk~AJz_-Z`j_3*mƹp*ekmZ9lcOW 6W Lߘ\-J?CTJ/ yz}_V|ehG"b3AEb>:Edtusfb>F/dL >_LIDc a{푢% -\; A9x'sZ'CMgI4hU'WX}{%Y%n$7&d4h:YRܾEd7J"1R5psI{/gW0eR񾿿jT~= ? V]A2/,MͿđ9=M>b;Fyi-KllH޳>=mװ)=_*`m\ }],LeUxuV X-Z7g+_ǘ+5UF8+ud~T_.3WڋGmis@ʢeĕ_>H휜emjwʫ#>yp3Htˀȇg\2K9S4Ĉ\' @Cȁ9B?*$decwSSI[W=􆗤p{+>ó4Lh{_5pZֽ[+O"F`$y"-;e& tmTY _,=z=}OdeR &hlؕv~f-˼Sm$92rR7 t?>;{g[.^y▞<_3\IQ/ 86x}_@y~ʔ؂2O}~U/\ȷIL_K@u4=i<;”Qk9{6'F uOByO.E zF ANkǂD3(Yw] %O!{NG'#QON(\B_CDA;]-Z`jcO}T`zM6ơ,۰? M6";9v@N?" G[p*H s)2W?нOjy$!yq/ V+ǰ\ <͛e^ -}&az6 Qtn ]:ЗpE_zώ 0PlfB ]tqr ;xJ}w҈_g.K`(,g!)dNn#Һ3 bvl4qu%Xأ&_4ҽ=ߛu,=g)"}-,E؛0w;gҒ)\t_?8Q H[ 죺Z6\N0.@3=UvD7F;t!R?Az_-Z`j_20D?~t]nu82g=xy81ݲT7~s۹.޽;+q "3;!r97CA9|^7&\kA !>^M2 =+ѓq/:1 4Zbn|rC~c{C5yaOVݔO35+xMD w# U'rO.;t{h(RXt;?|rЖXRR>ݯi<1n"suj#եWWkηv# },y4X?6Csn4g/x?ޛޖr826kx# +ڥ`)+@/7]z)N#<I8]p|7]Q\`=SVh s`,GݿHV?r 儍 j,F,F*ȺCDQ@KkMDٕ${,_/2>z:;{cY n3&x7Ð?P.;0$!@zLv>^X 8.@)G=[ܣ@IDAT~wyEjr.|R@SӐiy?r#O'ܘluV X-Z-Q9=Qy߾(8< wۿyr6{*='~}h9=@Ӣᅟ1y~\A4Xm2"_4>B0J c б#׫,lt!QUhuQtKPxNqmM>DhAsw4=uc+ @ޯ^pEwb`gqve֗4:ơm. ]R"h$%$ƃ3}à@+N6 6()3y~caVmн{|ۥM9~<`jE5gmo0e0[mE8Wt+w&[-~{GPa6a,Y*4i v01-CCbJ+R:r%65AMf2ΗzQra<@r\ o;@zS,$2Ph-YT̢~–_VgO|`cs5|fG+z=`%Ra+چ6w{@c@ =3j~WsT GMObnEaأY€ R@< WC}O`#cyTVȴl錑܇*[^dIFEݮxnc`âH2k&;@GςIHwKȚlqOoMoIV :,y/wҘ^sM7ħA=Li"-7ޥՂ|@4-~d^?ilGG *15ݞMf~ْwIIani!;O_E6όMgљ5aX*^Z/NkxZ|A"pxuk*sE/-m&SZNA0KwY{@Kw`:9x#6 Ȇ7Nqo g!nҟvU.RCԵ[A 5AG1ٺD d]m4pɚliF7ZFI ?p22Ld\p^:هBDTh4i%t_!x:U,HCWfy>$@x;z7'v`<yw<-ig(*$ CDMɾ.sFNs6Ԝ[!Qy$7!  8tmI=QSk.ڟ+RsQU +$NqJ_1IU8Zfn:6Mhb@xMj$6BuDc`ʪF4=05Aۼ!i#& I]\=V{W"*?p&Z"늸ꭟI4y#Ql⥀&zX6.vKʂKXX)\OU0veӛ掞 rKeSפV. ;F#㤚ܻ?ˠ@Z^?^W<Šs`n TDo Ն'4: f%D}fGN{gH$)O={ 001 t(ՏbA/L&խX-Z`j_3|~oշk'v9u{͑Oߝ?Y+w5X M+7~ yzq=^hzz=}JȜ7~bd*:xZ.7 6PSw+ԡztvzi:o4` 5p2FYU*,7$g*T_>+b ۃ~qpr*~)J9`Kpq_)~&\[f[!A~rSaa4ȋWZ. ?beaTxʖ~K@{y|=n?eq'(KrKѾ1>w`|?<蘶pSB@^9ҿWz̟ܯH{(xp4^n{G&, `֐e~f=V X-Zs7 = Crd0%o{*=!_P9-UuTV17wݨYc%PT J7x pu/ /"_f4s\Gv;穰dPʹַ.1yznnf JP/'Cl"[83'Dq-60Ջ&D<_<| &t?Ǖ̿8?^3q/{ڹS[;qs)_#i%WPo.X)x6Du Bu\q(Ṽ94N\.w_.H%ɃpՇ !͒\F |j HGwk齣,YObcD@c.>P! wULT45luV X-Z,N>,nc?5ԁZq~GSw η}pvx=mHc8~Kc^|rW%QEv <^ Rw \S;R` phwŽm[Es.QSF;kt}ta.ȎI5V}b% 2NgIRD=£s?c-_Wp04({L>DnS X:X_es?:l'*Nx{$(swvp ڽQpEeۿS;n*6߂.s+t$_nF ^tB}E8| tb0`qt0dVvAX%$}uqF;'L-!ZkWQ__RU]pM$/ї8[>\ KC }':)n٧F3n*L1_5aSu̝eDjމA4I"OM|\!zr! 20= cbKs׉!YWčlQ"SZ : rOz`Md`e͔Y7Xtq}G٪SL։׺Rj2JWvDE_S7-e\0)a*[.*m A'UINU%ֈBI/Cw/pE->14JPuw}BӉifq=ZX{|xJ3TNo͎">?+"^Y;pq`1taݽۻ8rѽ~V IF^ Z-Z`j,֑ﳐMk`Srߎ?~![{ +|b%{gԝ zu/,ۻ0+T׶GFnLш^V+w)֩3B_ ]ӄl$loHڢq}\p!HINFU*#pD' |] GTF߫3; o]*#䖮b Yq:6yGٶL*T15j $cKӥp4AQ؄c',~V?_ZFFȐVy[-+[B;@̢ maC{!ytH/$Iϫ#3]']0 G~^QiUL_qk!V\JܢcLۃ&~^ty?nڧ -}q j 2Cq)pTI2 ٳ'u/)Oa†;8y2_u4,yMG D]a=sLF;=z>{<F ];G#偂 힥4y|dnE`؞UCpFO,: MaWZ`j> qjooet&-{;m D>+[] kn p _u$v2>@!˖L5pM B\e]KQq*]׽׹-=mSkhسU KRk?AS9 ÓpEvbŸ1"o`KאW4⫻LWK] ;FhJdż5˾}>HxA[P.܌EU+ˇ^ъ+zP/|Ɯ0yO %:!4x2gle"!LqJ2ED#:sҝ5 pSv1eAWpr ⤍T;F{vV.) 3򎾢nowǻˍlpj#z+عqHCza'O#qv:>x_I5)l_tK5`1N='/x0~@Yw.a_@k-+v{ BE>HN5y)~~Hf w\HpÂGVѵf:dI,+Sp6 7{6NýNAӵBV X-Z`-`9氧ʺ;YN`!6Vr4w6y,s1jghp%qKk=Wר]oɸ_:B>\w3,sοm.tQB5LӠ' ھWt[|L_11]-.*zނe孷_/=*=W4_p\ qsDq5Θ./&8yjdvyA Iu'DVBWN(*^5QݺPKq$ZҲɟ|jZf/i}ڣB  ܜ\{Gv IR蠻y>Q=]{X.cٜޟY|9z<2ܟwH=ξ2"@T JO 8irs$s"ӺV X-e/?pØ69SXܟ fƋ#%|!ygy.1``/{ XdWǧ?!K"l\ $V Y <>><|c qu?P̰_|f \6ly摚q 9Y8,-t=tpiLдɐ=GUkF-P/G4 THh#uu-=/_bMCKf2M>-E.! nb{XBeU`~6?`H Y?{$9n$fdDdVUw;sVg3kv6?,f!uG&}p`DeUwZDfpNl;לӗ>jCtRtteG P_{ބVtvBJdlئk$s66 K gVH{%WZ` \{"^)xa.E+.[N gj-]"Dw%RJ!ᙿn&z%4&[l,yYVJ`|c_"sKNB8zkUIBp=Ƅ0`d%XNнknڵn74нkX3\'iCOAsy0"BTՀhJJw`>\4׿f͗rx_7kUVZ'^|:iG?/O](  >i$5e)?֯W'VW$%O/EAE:n|˯Z%_3 S , h  ,X,nb :>cw߰m߿iS<~\z ;=eoww gW\Gpwt,GKcxգ9Yr5Fy?BFvJlq_> . nZf\ X&3( 1ljP+7@P`/hC+KQSWxOLJ" l<2fx! ta=$P)7(C-:*smb\ssқ .9~4s"_Q9xr l/!1&Dx(rƟeQtR^/DY |,W!D {2 H mphH,GC":`m:yn]/?:殾J@%XgRxBcig!h‡q F5 ;tȣuVk퓥e=R:7{@t g,Nҭ%oa{lsF%-4jտ_4p[A2*LaΑN;%UOeę 5b=C#m)Jqg^)'#/!t93=,kݧh*+5Iۚ8;5y=1}^e)V4rݞ,g'- zpDz[57<>a:};=5}@~ zv_.uxv\;M: V;;r֠`D7q#2xy/-KbXq6.*pb4X|29^A͑TɡjT~+C=A+MxkB]69I'11JW0ȥ !=CrH0?ڹK%Tj1EY\|b+.pP4M`Z/hZDxe=Pz:Q;RQJ+ea&`usjTr!n <2 %ג{ mIRQJ.3'1KRPL' #8,t)0}\SlJđ80 Q Cu׏1BWrκwEs8OB3@\Qsa`̌b-oVxJKu<:-oUK]"dZ?WeU?/ z;&.ϑ6P>"߿jO{ ;mĂbEYf䧔8U s9\~&*,!="3z9e^K<&CRdǦꭰ^siB"P $]ϋOgfF}Ž'o2/OzCu>be"S81t~}-7| m_?gi ͆+399~~__X 2KX,X`bn Z_Wo?_cG +SB??dncӹD]3%S9篯Bdb؂u%p. *Y-5 s؎DI2RkQKEP2CHC҇sw۠a _Q /e[nޠKEah0 <74zZeg?bvLVJۨ2AuTS#uVa~ұ S}@ oUd{tgK`q̇\pNfS4mp gTl*ݡ+'h,ҳ8e %?3YBܝATھ);K<IRĤA;z? lh?4 Z)ݬwM=lEV3o+Xx{;C+ngc\ֽVǝ՞koH77w˛{&l3%,X,X`? -PO9}kr=6o޾ݳG$L>P"box9;A=~F׮ Un^?/J/@ 55_d| ^{%`l,PPhѵ*W:CTBfPQ` a(yd8zU袬9F\C<a0~c4`15Lَ ɯg|*Wb }LHKЍD MJxz%#R^ǓzLW58bpxQ?(՜7w't֍=W:! TFez:r `}?ʓҟ̞#AߟAZuBF ;faT>SVou]-L*H8U 9ΎK|e&敘8}s@4% aO)|RL:2a7kORGPѪŚÆ/?CyJ ċ ,X,X |UOI343}'/2`t[W힙i qw~|dq~1 .*1 |"$h6`2qKڄG˪9=Me U;VE\p^`s@׽P].0:~{TN9Ғys7 +OK贸IT%$I}7}ާ(m?( =nW3\ru8-ٯMN|)5KsK-{_!h2K4@#3È`\T@ :XiůNXLp;=p\Neì o; 8ukb‚1:lGr[={aQDNϸ.ʅc5KO?CR?KŪAg{+AjI'(*e7˒^,X`?~ ٿ=m?;ony>y9ww~ ga3XWm<ls~2])ޑ4p!Y,eSh:x:C*DbyCthAo`k#\j,r l9A+핹ʩ b,MNg=ץMAi5\e.HUj#-%Q@n gd́~S:ks*W2U3aQ'ToVAkȂ_f9#p*ASyq )|[qfj&A]Ϗ%Leg>HzhT ],FNj?ओլbq iR'G"G=& d bįj@']w(h*QȆ}jC O1)SY[ϬC8{l:,_ShkOqx}`"+l}" ߌ<&(\ yAĜ7K !d\:KYKUk+k'b3x]mJ8 6Y'Jη&e CH,g aG,4QXJT@5@ȫJiN7L{1iUX_HS >hlj#mO!NsczskpT6UFo)eBݭfR6弄Y2ArVnE\ǡsP8χ. O• M!t,`uZgIC^GN*p3H^K)wCvG~ozCO]7S&IO t=H'Xa 89Uu/`H@$:B qkU E*ō9K&jpiE& n8^+Lqj}knf#2p?fo1'ק 'voG6R:{N?ӻvˀ"ޝl|H?=7}vӛW3n ׊5]ҋ ,X,2LTA x~ko3+βvmfN|!6ᓀ<\yw|?gycrG{1~Ӿ/2b#֛;uʝ~O{i~=Hp;p; ?Wz8) <X@$E:縁%á+DO["{H;x7ıMV9t`{^7) Ȍ3 W`+> t#HLS3A>q~1pxr{YBV8xr|B&6c0N:uWu3CB6D+M4 5mDT_z>  u<Z )dT-}_ 68{N4iLs55 Hc1Yr-4QF2?L'OӦl LdYg}wdkz|H '*ʆnP7_+5 Cs8 rko^9tQn\Q Zl O;$$@٘@B!>66k*3ѷISVPBi[Qt}  c&^ Qc@d4[<Э ?C: G#KG_{O|dCJL 6{yށ;뫒rx r8<?}X:딧=OQի:} @>O|6txg]`%Ɗ 5r.{Y X`b?) `a`yz/^gkQ[mo˳y=ǝ9yG.iv@3ݽT ku+]`_;U(%<Ɏ~!GuTT-DEk-!p)̪hxo{F$=~m@IDAT(2tޫEJOn6 e'*E4K1ltEUҕ\l"BDn(Ti)+)7H7J)^,Q뜇>O)g/8>$Upf!߀aa8Jƹ R?~wĤ‰g53JM?,ASܼo)KtzOe/WAo64hu~:1RV5G^'/oYg=J.g_npŕofeB"U:A椃i6 oyp U_Lr -vYg6!Wj,O5 ަQC6fT_^Bt+-ZMypv=y24 9IeІ}$2y~x~~r[p}{kwDp?zp|N)#6?vbSe $cΖ/ B5y||7oxnab~^A'4Wula0} }#Nagz9vO<H]S3/Ն1N!:qq[qR؅jI~ +N=qKe^SԫhNšFP3  p {hnYU/i*%l/A91Pp~X|ջktRP~0}}8cnV~oDžv1t"Z߱:H Mѧ&.'Zt֑|R5uiK5R* s Ն)SOõV7[>=7+XT1oQP%5Vפ1u:QJU Lofm}(P8G܇7t:D]M0<iE@t{'':RkWK=tʣ.xNt =pa:wuIjUNN`'#7l+ ސ+OiV=9p(@Gѽ6:][+]pF:7[-b8sy,O;=e_Cq}ޚS|isi!O4$&m&&h}U$P-[vljƙfhchFA5+&=]}U7YU'4cD~ ,g?|FvU;^[@WT7_\0loB1n+lC:&}jSBhWCW7 ~肸 >$˗ק_+s#*;ڞf Q7M? RMCi#CD%};z;1<%@.ķ k|jtӪFu:wiZ]YrH"sl,ǝ̇N3Q'WZœ pP4:K3rlZMoKҤi$P# '(|:*dRzG?-1p负[+;>׉ Vne#eJV Yޒzw@@e:#{Dd" 5}O‡MWDddsWd)}\癓qI1tIS.mu $2}|sm |MĸxP+c9f@dÇ$el>Ji@\WJ~qnYDi{>,s*h$|[ ,X,3>pϖœJIKnEtIOI{yԺ DXiy<'Q\eMPQV<hCψN=cB>Z|Vظx?6c"}Icc`\6p\yH+rOJHAl [:zw|@~W34KX,X`bO?ʉO717_}uq˚-^';.:6{cΎ:g!txT:7ݖI$3R# :VckAGRoxfB f<]#.x;ju޳Ω0+Y}>u۹A]2UG+=̈́?E3y "sM)s'i}֖e;d6sEk\oH&w ˜*Hũioa֗N>+#pǥ擾\mJV:=O"Jnq mTG'sii7m't8Fyݮ\4IS{x:&o:tvh7N1)*=rCfNpWpr!Zm2x|eg >wɧʟAr-$!dɅ=;,kYXɁk@`a!?Ld:R_) {Ӕ}\kE^^ JA?(*eLFǢ  *sj&n橢<{/)5{5 ¯)B[AVqnI0&キ.Y9(Hg 8lG6E8qC =pڿeW|MF7383uOFvGe>|˯ZbٌYyw;d-ab~Q&k_e_ ixA XD Ht_]=2|wPv=ܿ$zL>l8etB!trF^(4m(*⎴PrxÒ<0US3*'rPi,SsNɗ6j1 ,m 5N쁁x&5:+7ōGhaMDEId {`F(JKq^~S?C(X*0 D7Z2Jp_X}H8A-GE9X=esuz4Qh%ƹ(S<}."eͲ.fΈMKI钄>q99ƴL.dn̽f]" 7e!"4+~+u}`}ia d8%Ƃ�&B2PϠ<z FyN>D5<1栌kjZ4jNUlϲnqB]ȳsDs DF0$8r!k:0 K?,3y)>J7!_{ek`0dV4u$,\^ /iqMqRu#42< Ó8obCgɉ";'Nzzj}2h'AtR:#y:jr~7OOO|>ROˎ5E!xz`?@]sX}Ǧ8+8NpJ}.2d Q&T )rC˳ġAu<1^U1^N`.A@'~806Y̵A2F*2U :;^7;87 $#ʭ:?T3 *p Ge'c)C[VzkV`ݩ mD#C-& g ) VO<,cIuӦ_宐4(LF > `K܅с$it )?J]Y&姄8GI*} GbN:u$`#+k:WURk EDN0&z?˘֑Mhᠷ )muU+<=5RB+86 bYtʧɓݖghAƗю-;=JsÂK_ ؇`,?NO-+  '85mUGbx3('sax-v~W={1 pxY`g{V=r2@ i5D#bVZ?0d]-VG^ܿ/Nq E5EZ0c݁Ӝu>9bb &w}C >Ob s\7g7s罶G~]ґ>ߖUX=-ӄO@J;섳ᓼa7d:.ԖPYI OYja8t)>CNȂm̅De։#W+ݙYн02Rg5V(F!҃M?Zv AtL%C&gR\M!h݉^#MҧϘX K5!Ο K@K(d00OՉUҀyRGndεbbוWrPS>'| CLB`we) ]Ko}&uן'IdYJaNm#!y͛K˃O:-7eƐr"L*ۇhP`\~$ȓKEP1q삯փmr~lŜ_ ׈- BjAJ_kPpcg +>s{4brbŶΙx1 JX |n xNH vxb%Fm:ǻoCԱ~s ,,Mh(;頰3qqƒGN̬5_`Ś#3F#ӎ1rɝ`mCE$}wߧqdl{2[r`֧o._>+BѽP9+e&3fEЄWXجFtW`;+[Qk+X f/[rHHu)Dm~_t=4 ށԷ7'f.hCB M$ ]_4 8ͱ|_'4X0s VN~' ¡&C,,yʐq,Do+[9V._pA۔!'2xD|y;T8y|J)"e4=&bICCɲR TJ?y~Q|38uHXS/yC+\Y'e<7Y,ut}"HqPia}Z:d;aJ>l{C3[ut/j -KNpoXx%,䣓Vr1^E#r'llBx~qŸ?̀ Z Y Iذ(NNQ̖I)*>?S֏Q?+V DxM%Z,X`b~ +6.?'N_߽{Mn^X50Cƥzvt>`"L<T1`W#dׯ%CRL*6]-24sz*sw+:Q i5#F CO؇iKIJ Lqw+s wMf4)NL!P7G 8ƑM݌Qw;'W?T+}trDWg^?6 Qxr#yU֙A6Cwop3N}#л7~OPyN]N (m8!9p)Ɖ:ʆC*?O[5gPMՁ Y] =`gU'X?"Y[+)aD::G*fs;tu睝x+Nx+Ϫ_UPHބEUy|K3fvK !R;6NA~lJus4+NXX1i\Ec̱+=x(/E @<ډ+ԧG㹥|_ϧflyݵ~1W 35gia ^ ز YZey]x*BἻĒ$5$1LX $Gl,b |Oign:/͑ͩx?^ۻͪ0}pլ/ߞ^这8>icn iIefe,@c<<޶G'=h0z!'pl sk4 =;.QN Q+A,nqWBKJR!vq*R}`M7>>hl6;N o]:[#N_Z!#-,NZrr_Ư,FA7dw^\>&X:㉽I ʐ<5#Dj /p_~}4KX,X`b~v*'63>'+3گ߾}9맃{V.aNbD=3ydƛo'6СccW*%uRYg2btrhŽ6Xb>]FYѱǡ#8B5b{hJ'Î<׈uhMH˿&"!:aKGQ= &8w64897Gx 7Gl= PD d^$MY}Su{cxɫVoH_)3HT˧WRz+9a@; G_ȥ\^`I4 }73/KMY*CvϕK'ռn `"Ъf 鄦 Ni R uS_A7$Z~W4>gg|J͝!J֥AAX8dvwLTČ& aeOK6ZrRXO=Gua_{9\`mn9˷ ~åqŦ8-5sXˆΎؖ:{߿ۖaUҌ]0O\[h 3WE QF%G-úF2:T `P5qs18]}RI1PzQ8801}ŨPvzduzԣG67WvRf`UkJ@CGtFіrhB"/_d q?RPc~qjY|^+iUoZa])̶o=ki"p |m /P(IXh[?jHssϾ{7q}`\`}­sOm]gJxCTBoofbɵHF߭u^n":T|s{;~y/HDAS}9=X8ϸcf@H>"aukE?csO) ~bYo3ZӶFَ HaO〲K0b"" {]r1$sfO2b %LѬ;sA>9]:0?}=ȵ$ ".[Y gqe {c?d3mK>,˵olj'POW"y{`6[՞E=ՁE;JuI+Wҋ (gO쳴ktǯmʗ&-b ,O04b D^E6o{կ~0cNU-p<>z`VG$|2p90-edfWw1c?aeQ>=q %r(:l%bCWDo)8Xi{}L!}HX PAP/$H{(?+b$8ʫۅ_GKն>)O3 9p=mjzq[ Q75X(#4cE?:Ilæng$Sܩ]ObZ -TE4M 5קOq%m|osIN6d L;&wȟ36萯6ȰfrbA? Q0VLkW߬h|z'\E_m620_|敛fu'ݯ~uw?;a`hgl5.y>|Vg-X,X`w>p GM?~v7cعƑ\r'(oJ;>W#o=.,/b]}C[t l)6z`JXSBw\pb{Y ?z܂w+ݓRdž^Y3MUIJ.*ANP`i)j& 4=LODv2h4)5:fS9E z|s$(gX[=}PJgԐDH6oѰ'0aϒAֳ'}V;QvWVbX l}@r-3˵@c+|8s!v( @3o<>쑘L $p‘ k> ÝּVI~{t 2vʙ0L@-ɀh<1q"XBC,1̸厎s Wp‰G__Kg:t Җq M2Cg,&%ḧM4.immqJ ;Jql4H!g EGyRFW |5[,2JDEbVGKjH-kiwlzm^w {ь>?oBjK|zINPO-\=mOVr ;1S\&V@U1+[&ј$& h[\Nk}=f , [';InY=>3xrc%q1p怬cY=&#sH_KWh*駅*o/Zr=u:N~ ǘ_t~ &`Z8]cU9XAYL)jX7Ѱ5 &TtG;KM3}a,\ksʋ\cIUzLnf+KFH` a<%q-mC= OP#t"}1p6G_1 OcU"x XL\dS@a>kvbt炚X]k 2{hR 4!M-4/WB >=)ƕ.i^ՠ~! M5ZtWR`Rud]2q;\ظײO[4?k$}OqkPfɭX=Z[?ijjc)%ۜNc8J31怴҆$cuEMIUKbO._+8N ro$qCIL&X/O˚% $c!BTQYN01!߿V[S~eξ.ǫsp2d4=Jabg.iso6&@|j&YDȃ`O` pIF#lqlo 0Y4-S ĝQ8t;d7=g>NEkB{-Ihˮi] p,!KiV=Mra p\6l[Qe yzx@޿j XyțExb>! |2 _k0Mt<"+{a6M'w|vϿH|+'otj(<]?<ňJbjCC12Zas@QiowKJi~~;)HJV~`6H:JE5y>4ݫۧc~Z@CBӄy๵ʜ -gsba]K$c;|.T^O#3y+-ݵpFGslQSQ$|WY;cҲ,Nr':83i9B HPfkYQiu4y(k;Tt{naN7 t`y]rBLI2|/QM'tRc0A`B,=. $#3A]RI5`T|}u=mN=(%U|ԏ,nJK /[e5->_61cq8YTHg` H>$, j@<j_ٺ)#[ D1 @6 YpwHC0"|Ka*P0g2|SW'S=^QB+cehcC9EHcEPHŕbw_|V/S A<-:ڮvkO/sn Йq?`e0rȧ3EGH 8P,wl{YcP#5?WPfVP(chЕ>#̴̒`{(Ba(.(: 3IA#N(#dL2D# )Uz`ubbW}gR}\sf)[q~GFVUKs { )ҢWQF ES˷yNA8¹չSxiqK-R$ H-'M` =crÕ%o&+ ?m< f}5H~:+?aȫޭ/澬Kz0kp>wyD;df:̍7}-ĜhJM,tREs?2 m1x0$KQzB3 Bchj{ŕ|F7eٳ!ə{C&oS!y0'Z$E5yjG{@BgDۤDM>:sʅ{C;><͛a!7QdwL | Nl09[FQoCKg?^|Wg/Bz(GKkcCř[ ,X,ZSp/ҍy?oc>mW+p|=#<nnV7.9Qh׫-;f 1!P˖~qQstPk:'>=`"*SxT ^sdrls&{Hi՚+t2\ |4?7pe lӴoz)Un`c. ο ^"|dSvYڄPBK_R / pkjHShڣ/ J6(jOtr-d7FC8?Oqx/Kbiy"qdڪ~O#!ț8>&Nׯ(˂>K.{'-,0sqyM4bo#|O>1rFt&H-Oṿ[&_~ .+#rtY .;9W&\_Gzqgұ!8oSI _2f, ʴx,a4!G^nkqBg_,R@ߝs'XKd.6njH~$RV<_I;f+DE/>S'EƼQ{*+ԺN3pAx_˴wVX׉JK{A=2vkx h;uy{ڮvV^?Qo7g/-ٖ#щ/Ix&~+X%,X,X``\'X%6sN~oo;qw#_[1I@/z!?@{\AkV+"w(@7Hg88 dQHd x6d #VLY,^.p Ppˮhka ZeDNJw`5bF$D~1H 5) 2C ԥcN=RSӕp"s}j;-M+dWrH hqNƛc\',CXI`⚣1cӍ`G&IbA8Jx6P:5oMX7p,ޟnɀJ| "=u4]*1h3=:q=ҝ!)Udn(i3$%WZi13Qc} }a om^]W<'.7s x)?8ן>=je}q^pDWۍ\N$,~|Uއ5[霸>+IN\y*OI:NƻP%R%kѕG\`jB`=1ńH szPS|8Œbֹr@ْ ڃ7EnN> AZ8fN$JK^Jd/a9X^V,*d ,\:ML21B qIآHl՟‚YfOk*=_::u-O34}Qi!R^gS| hyqIxXO_P:sM%ťcUWK~>ꌸ}l׾6'lOC ¨U&+iӂ,N2BѯmgHG>J,dxu-/4h,$Tޢb~9LLOPuǯ;?aeޱULzV$3+XEćoYy1 ,c͕^,{ 31`,3թK˘}Wkhץ`7bEk2[OK .Г8^JA T/Oj~j힦UzdKӅ76*7,WI^b.=\ VgcNtQ)\ƸzXʹdi|WۯtlyAq1)o,+C?ǻ:w/?%.cq e|A/t4ZM PaSrYaOrE9BOfDH n7H`D$`| Ie+ ̀&Uck*-`?KzXC)ӕGpDgƾNٞ[':t"UِsD: p ;bgVqXBv YPCO6P[X|5$bJoBe%C)QXxX\K8?X[ I^+ĝț3`*#5UD 68 2Ol<6Q";7* xji}uI>ߧ'cWFRJi0;+e*ұjn+'\#va-ҩvM?+M @G,;ĺ"M'ȌJL,гb!*qLdԅCgf^\X؅ uaNxɤh#UlQEs)kWơ|t"dn!ۚ-ճ|цND+d44KRIZq-p,8c\+4\2̪$gkWHۍxrch b,|ȢQptdN~49oCsMnXera UR3īYϐKfb~8 '.ĹX3꩓v{x[s`r{^|{9X%,iq:>"{dx.F!c E9ѩA=RNokT4kٙR ?]5Ykk  "=O0\RxWQ(t>&}{ z-V9^_m2ddCQ;PoZ]ɑX$,'x*': aӲA KlDzv7,9:x\,4}5(OZ+x 4cp7f1/խFs]3)QZjy?WfpP~5]edȾ5YqʣJ P<*]ɖ)s4Q&?S~ҧ'kyY__uVfå״ VNHEa"Cb/vр. 9/} @jÊO(΋jd#P*pJQ6'baOjW´5 Fn(,̤M,#VBTC"'xb_ tMdihD碍SpUJQF+5fm ѳ Yb&lCvgd v A<'kyU?^G ۋV'X =Q!3Ϲ{Ƈ&FqbOW=7՛jwG`3MpY;T¾K g5^b -IO1͙%:9#}o~|O,ҧGxbVޙlHd>;>;Ɩ뢹;u;N壒0Al:iNI+ՑQ4ߜ44GL~[Ҍhqgum, g5fm1ҴE&>d0ɪW'HÁlStL3]e"r )W+ӱR+y 0y&@X=Yttx-saThȧ-Dɸ)hIᒎ ;j8SPڒqd65i_B0f/l"|JLħIJO,udO0%M̫Zȣʹb*TLK'Sfs|k4@)d7f<X,akb4&~3+`Ș=eM9|)y}dmQ}QæǸ,+p_bnx9i>FHuQ̶d]aP9+ϰm Uljolmv>a\%0t(?>' gMy&3D`&M^0#:RP^^u2Gty'<EyL^"qʮwNk8ND;,%8PͿq?̟omFQI#K` >l$%TѺS|ُ\{4~K ~w8B#on&UqU$d+#)yMry,L#s 0Qi)~ⶀjÇȅ[r5/8kଁj-urԷi U{{[Oi`]=[C~Mxnt1b:>=2ݭt_a];XhXutJo'pNBEjQ MNF3/DS+x}ֽAhXvuGq[A#QKs \02vISM g(z!*N f6FI1ɮLʳv0/>ɒ2ei6Tv7:Z߃wfAL?Ň!VT\ gJ[4՚)JF?@sT# $<1 W8=ɗLG#+2oeͯr|o(CS ^q =W/-6cڦy^s ;VsR? y2!?τ-jDj!08'|24pI Mí)720x"> `IN]cER83B| ^^\GɬҰKN ObʵB!uN x!lA&w`6Щ[]8$CGޣ8:t*a>v=D8!EPg@TԒoS_ǰ);:(!gADДd/`!o2Iv qSrCL?w)WK|lO׼* cW:Qȃz/o3^Ɣ Vn+~\GK>;N`{{%'X2!&8##3~zvg./9V)#,`l>%$/O| 8kଁ~g;m7xߧL\*@W}dovw$G:<82*2C9_j m:3PƄi{^A,?y r%;N3auo<5پ{ieV)E.ȰnȯȱG̸DU:]&YizB* #λ.ʲ|.ήןEY2%qƯ߰DIqjjb >4 gתHk?$vynNB)FG]F\v(uld'xE%WrG28%YQl TP6{ wn7X*X0tQg I}ΨlХ|W= m"8>+XX𠙂4% ~ZN'0Y*W wUpW$vy'p'CvG[*I<$LS_͜Yg 5p_INWs _{ϭ oxK簳W(]ȇ@y~p]c)/u׼! )ffM6^-~S4 =Jm,*|}]ׄ>. ܗ~+Vb. ;Qp\[Ǎ6~L.lb-fU5X3aa90 (yM4piLqC ,D -WTHi٤<.4s<"t~IV=+Djp'@_uyrJmtFw&YRВ!&AG>=ls3JR8u%-Yb( NORұ`R_RoT6V20xdUL={]cfdh9@Vyepw = ;`CO2[״2Lv КshRqg 5pY?'Ni>:#v?2}WO顀3Je ܁#q4vrD[ѩ]1͸yNh7<&i+% c'AQ8t:ТɭI;.c܄?E~9 99l~/K3c11'R4X* 6l3Θ[|sou=??+2d.0ǵ>3ƿt>4j2V@+ppLrGP^P]I/Ⰱr [3(ӯ|sgۗI,Z[o85y(#dywF&+ݙ8\b)SbLU!+'nL,g4役 a3/x9AqDK$\?!b0[0Hf䋢O~yR77W2Ak.$-v9(e7UXu">i=yGC[=ǎgC7[)`̣%=G]& 2 S*TZ dgwYg 57/qMe@M9$AHwiw?=̓3hfkpk7zL;Cy'͠;5I#ms鷸N?usoq=öa3햷T|ۦ#eئHy˸-*ZRf %`b.=P#3"]tdI?w\;orIؽtF 3cR@>/y?twHys qҵm;N`Vb2*+,#1|u]Y1zzvwCuѓPE}3#p4x.ҥy TKXUNk!V2d"}ɶ$%3&sBkxRqt~@Y&j:̷k~Y[Rj`$ v 6 k-YCslhL>iphI;|ؿD* P <#,o.Y%@~q2 X N8sNk&ؙȞ.CG*jX8)4/ Z7樝/8'PNݷK-Z}ǎ$XY\@ `T@Z 7f'K1-'3'J/}ah•/  J5go:9W H`xcMSB6(OCO5iF֍fa\~~jڍBLb"3ްvk]!Uĉzeq5 &@p ohoĈ 8kଁ~b 'lOfODwum.XwOt`u8| ӭ02N/ˉWvw=q .[۵퇓03y2aI/AonR«Ж?I۬gtcg~nv }hx_v"1]*|dmUvɷ#^oBɂp&TAuk[(-~a'ћDlpiCmR:_qrgEՋ3Ca Y*钕8ҟ@&bn M_:-yhnMӹ xЬUw\F8q멬kL >@`zSiَHt|sL@`ўID_ĭO\P>>?2AV Tr>L:ICal 5ԟj٤vBz>8kଁP t0^Ç79q-s-=tn!=d{wq4}[P9}ezzvd=9ԣˡZ@+9ێ|n , 0qf"z |`(!ߨ^ء5/T7NK= 2xg 4!Ue_U}N <<ƕ=O#_1 pa_kLhE%$d%EɩZ'|)š3צ5Wʠ%aXxf/N{*qRW1j-e8>{ O8{ N?cimċa AzLSEr+'_KXC} cILvJ&߼OrbI:3w-7ۋ/=ChLJSx@κߑ'g*TDPBH"z^^0<{Oh[3jvRKQy \s/uH@S~T' {UJpQƣp^Q;l61F֢xq@3@Q0f"pqtq{C鶃ObI,4e#<8kଁ ov t4'/\y/rp_aKcFccΛ[ތUz@xzuypi82[p~O^1odkZpaU? |ɱDT2F p^J\,ꁵۙwd492Wd%3$a )UT,1k\P0d22] |t%H7')e9*dp5 !H9Y1:s /4sX1:UAo7j Z ?/|w,~~xnFt pK{l1)V'7.h#y[ٛ(mqGǂt>->e꿧>at nIe>: LY 4+t-wV6i"rd uO{9a~nF 4Eh6q5.gM=bELxicKaŅxP JJUwDI?\x`jfwfvPaqmv,rhp;ґ70`7 qTYWDR'8<@HN2wfaϏKpiI|>;" BEgN`9A_VRT(|dPL&̐:1cg>$A eU'Hzx݉J'с +J% &r Xܒ¯s謁8k|_{m7>wokhL{9/V=k]>0H?xK娎xRFb-3*(Yi-wv^od?"f t- 9:x[/+S$ssx< qX/}T3.Ooj{qf5B[eZV <".l I+S ަ@9ɤ&/xcu/ЅW.o"kZK+M;d򧏑 *xڷI`makELPVwrjz-a|ɴ%sy%@I4|vL0Zan[v͕WGl*(iVeBq`4>E_ֳwhP / x'c DRD adHo1(:b'02k>WaJq{82qœo@06(#Wy BtN̈?9':{(f9 b=D0W ̎(Ƶ+q^΃ۘ Eta:䆄g7;V䩾<5*%" w &2{i%O'Giꮳן)XqOy}V%Ǐ8-uIv:u%a}*7pg v-4IZ7o۰7ZU̱)-\ZϜ#g ^nw|5;# =}'oy(/W[?b!EB;kଁ4KPg|t鷷ecYq\F>|GfXFJl[Nxy9'2(A7\ڷ9#xk0Ѧcͥkox 8&Yf l702u6jL"Vg!6}ZhO6k=νy67N 6W.wG(s374 +DqGmd:kଁ}v}xoeXugh|xa"S,Ȉq~Kȳ'I-g-Is9ܹ|CS\$NGmLĽERM)6>ӟ&4o4[fr;-c˶%a\SmD^*rX En gTи20~;C?%1.ŸX5:<: |OKQudK >9fyv1팘D(Z,Mjֈ|);+4 \ 4*Ioec@qHM/H~Ԁɟy[7-"6ҩىpZw8')xp~6|KQϞj9.#/-rE^ݰG÷%}߹0jv-nQGlkƵHa?̯;߰OoIR\-ř~y z!p$o;ca 3XP![#·"29Ũa Ojۀ62v ou7y9Y|5zB,!Gޗj`vv 'Fa%֘O`0\.kk?rҭxd9S`euL;x%4AP|bc^X>aq@U;pMqSw^^ӫk *Py+)iq~|M@1lJS`a)K:y>CU0Qqal85nbp@;l7KKs8|&j@gZuT R l;2qb@ka2Qz OҵF7r(K6Htsd|~ۢ؇ `h $[qfݦx(gNBxߠ-}!D]&j6>PCU5 ThOWoڸI&1Q$@y{]29pyߝ[HB~bg]|eB i|݄veSy@fٝ5pYg x '>[Ȩ/|nyl2K_+nYtퟟ;`xYqlX?w-GFlwMG q 1| Q/!4=œ4FjfΰS?(4o3lβ3|*)̫l_k|"<3nl.tnV?ۗ3x >zj,5 ׂkrCk^5r՝[3sJÎ=c4`9J ֏Z\ ); M`y,7\m'4aVcD^aq09C9_(ov"ҸBOQ[+>#bd<i xƥ@cI(qųcS9?^Kr2LStlOG ˎwxBoidu%[,X'aV$KgKn}v6|7 {yM5}qM!]pNtkЍۨTclx^JOwbiūZ" -Y@}3/nhC<*hNڠ5ҳtlnrw}Q`c"`))+LadQƅPx 1 R W+Ɔ1\;ܸ+0:l㆏X9~`f/u!@Y r$ U叒30噏0G h1o{>G G(\p#=v= |9w0yp)ơHy) " %gNqU;kଁ8OVVw(]<_ѽub 8𞞔o00:8yAu'E,9܏O@IDATRG1;Zh"7*;?酫qDBGK)0'_Ǭt=`Ua\qΑF%# )Z"u龷 {ܭ[5T6 WUtKfxl71&#h^39Y^Lo&"Gu^$t%F_/"!֋S\ xˌ9Z1OB]vLAsG:H[dxѭh"w76{7ݾ)eA任=4;,-JI5SAlG&57VH+–_mˣOUaa㪣뿾qV{ pgksƼ-X ?ɇ﹒WI3Nq oz_}:\|eX|t8f-ӯHMt `xf&=OFGHX r(9ƜT[t2@e`v>=\W&Ida ?>Yx$MHeqŝ>z=1^ElE5ohGI d_F$r 7$ZÅ9$7b P VnТWwW\%U/S0*D3#ZB ȝ([y7֓u"IF̌'s [YHm/vWt LB@cfJY>P|[j'v{[Gg|?IgN\ݓnZ6{%P^S*;kଁ O0XAC J.t,Ͽno'Vs_A| 1cb'v||{Ǥ--;p9Yua*|7,]`ipT_XIG)[A[iGŒg&=)KfQ6H8+|z\P4<2&"Bd5Rdp(p4>5[Alw&蕞.G1d]0]= 5w]j 'ڼ#_"*_ ~ 4 ݙ{f1EwjtL&7SUS)(+&]y9߀vG]?v_зK>{O?rds*r Lc6K >#"%+!+E5k2)$278Hy79OLĝrGzex ja8Q~ eA}޸cPTX@ js$]v|Vmn.#?fJ$ i 3O>V#aGq #+&heW$S7L# _{ ^VE.H.R7Ty5pYug0sbo+= bၵ9gn'\x]]jV9;>t{绑u }'v /cR!zGpƤ~z4b<\O4Ƥ;t7N:ܸ#~N#eESo9XM]mމɝV;ٕ53P9WFӼX3VLY%B78e_S=i+ؕ޻) [6N=PU;6m$Y^5W|o@c$ (̸ͳюA[ 0/oo1x]|2uW PxxFQqqvT^~f␞ù|m7=3 {e#6oʸn|T CJ@]jtg(7?b>6re^*Rl, lQ/ * xWr<~Sk`!; vLjfay8yP& xl/}bnA͎I#$x{>^--#S@nY$'- 5JIsYg 5y`9Jg8O(77x~x6vtM;x{`䤞!`ݗuBk/cPĘu 'CޛC-NT/'w=,]Z̎Kaqs3xL37 ©fa03He|Y`w/2@§h7$G_I7?z_p-h"G>sU 3H\5)b,Ė# Owɕ_Wtba}[l[jUypܱB|.02Zr2 7$DF ԇfaY%0fOM23s'y:On}6xR&ӛ㛗-uD|4]7]kp)$:H2p23!y9p)k럹|͞ =P`gXg2/]. Q9M\^@ ſJ3੒vSSǷl>#haNY֕Cۂ'Z9l"jەd;c!q $ G$A-Xs<cma4>~iNeIpD%zvg 5pYSi~'}'7\q0_zzyFDW\ Yvp埈eLH"^ϨYKWld@#kVÿ7і_̒c U4?6yleoN1t/~sjI~4͑5luh{kʩz ]oW47Mg*$pmSo;$Yȍc*χ@7|++fWZ5SmS#rvg 5pY?H 'ɗ}$9+ClzO|`ގޒA^5(}-|l`ϕj%dF\ؑO$w))ى¨5(lFXfچPymlwyK~g^]ig(ѰMғno6 1  ?,ds|!dB PфF[g!KnfF :[1zcvp2Qu>CN~]~̕bw9s'1I9^;i^78E!! #ѐO%R(JтjRR @IJe+aFkb nYT9^8yɎ*\2UEeKܲ]jrD`i='h.E$rN)dHKk>t)ϔP\N CEI#nS }k._^_qA(PXȬKfo줓{Pk;@!ߤgVk̏fg-_s X-u}vP<>"S3f|Ixxn8,x0a$T Y-o(߻Gf2Ț5pYg yV97Obp~ydq >]'zNN?`=[_wɄA = C$޾ݨ zvl_n3_jۑIW߫[>-W龴T%V]Ưii1co}p['IH Z)8vs+86tu_CV1NZkJ@͕2Ίu 0i$l>//籘4şhC?pVeWr1#+Um1(,{d*Hq15M} +#VߔLfA68| z-d)u'yc`?>g\x~C\HƦ8qplt'XQitP~C"AViE^{ c#mWHt1A,)0em-d;@ KtrC FPmm䯢Z&yu[S?7ˮUkdVy 6 7g2!ÊwRf_[I|8LOb?  M``c//8"ݹ'm$+**A^S :Us謁jg@ sӷ|Ϗ:owwwWtjן>Vﹻf?^sq=[z?O1q^uATX"3 ;`e{7[Fm!\M Čg!ӫ ρ8kkݡ<u}gƺ>ypK 7;?sݟc֛Iy:8׮ÕU{O3{V2lșY1`N%#+gR[kBPnhu!@zmy'܈= : ҽĽg2ϸ.issqOуnp s3)aΖ%JTRٙRR|M!py'10_KJD* MSςo]ؼAHԂ%hbqxAx/F|ÛYcY_W7~WIZ10a3 gMI͹V 6{,wfv20yWݎ{&C+a'44χU/޿bF\ͮUԥzTg Cr놇NeR%`YmŵW)QE^|&7~b+Z1 #^鬛<=[+1l3I'L?||?ppS>s28aaѥ+ z20J2`jym>뤾`[vkWK|+ |rb;>Y?i2K4HlȤJj[d0qh~ V]<s?~zbۿnnq ⹀׎._g|uu?<]W_qr`gGd#]1e YKЖ4 $>N߹5D ]G9#9+N|\J^up72TӺJhru hh$* fȫu߿Z"ůxk!uˢ׸d#v$BP? ҙsx u nNh_DŽٸQ?n>e XUbGR)za]=VW#C+Lb=]r) =f| ;Bl7rRw$| 55֎+} ѶhxB;襢)v&,հ y d) 5,܅;&Y &V#nN[ L4XOS ~P‚w>ЬnX;v@j 4ȝѴ"_4Q}WWe߷#K^}6 j| ̙yk}eB~4kG,~FCF h-U&YvXRw|nө^o,>shH)6ސUyI`}-w፛}nR ̲!+RSN0V!yI?wqGxV}+|$!.xų%bʨ_;an}wwϤ_yAH?UpުmH:Sk˅ؓq76#e1E!+d-wCkmrcz^3/43 K"C' ^zXySN2$5iP#ì*#} + ~ FN||nDZi.aήMՖlʛ:W|"j@*Z:GdIIЂkr.+e#a+ݒd` n(I2 X, fd|=¶d ?_U!tSLu %)7yJg%0!m*ϴˋ?0FfX·Y{pW9xb×)zmH&׻G{ڷ\UҪY=daku1r5́ 3Wco2$\?h^2O].e,7z FOS& cwK0W] @}/}dhkwofC"^c"Y#{r]ѕ+[51/d|PM=PsY1^# L3p48tB0$ g7e7&'V;$\jC0E,"]#.*aND mg; 7ȍo>&H_Nx[&'xI̼*Hbi\TM/ v7vGGrA?g-U~1n9q´i8[b }8  ??C`@gKN8kଁNh<pB)?[wG?rc$c8:3&ܷុӀLlҵf~F{C5aE ML7}`.Vm\\9ܸmf3͏udEy8x [3,fU^RqY5[ᔟ;іCIfvLV{aFAX.er1 3 &7-l.Wa3.,/ Zիϟxd$Qt' 28㶸zŐ'XkS}>YîJ④<4jt Ï&%/Du-.UO8.zHd\-طCm^ ɇIkS Ha[?Nw^<"@EDS']w."Vqi*7oqjDž@#],L`dK`k3* ׯ?ěn|M[. `g;ln'uh ċX9^@/~/+ƑeQ_\!Nt9*q*7oxTL쒚9 ij!pǘ+dw@^Sh;O1V^IFrHu8k`F!O{|{\ŎlcxwN̹t}' dHSu%?e2Y>N??Vz"XQ61܂e|-m_ǜЫ݌ ]fM9ۂfp3l5yJ4vx _S6nGk| ӣF)5~W8hQKH-)CcO=h0]:}Lļu0#hY^稹FΫ|9쏶Avf,Ǒ z>10v0EU|Ea#I5iǰO0/,b[ᄧpMӾ_[[&qix/a__^&() prz W|fGN\D>8.a2`^/\Μ͉aL($BfɳL_(L(͸ch2XR]NX{ҳlkDO=DgNV;.?jh32T'ɕvڷ;LhO?dM3w`鞗43b } _8 ([<^UM;5xṴA tM3ˤL ajO8J#߾&.kH4 09Jl7;-_`ܱ<b+L^Iѳ5]jk~DUt lU-hClXHv;5/ 4sapRi&4||fZS3FD^a,py"^7xU(0hYDR &k$GRc' dnEd#PI I$O #)30%HCH:v3tJV c`_|Q7 ,_.uFfRBCsGIY :Ew4HfOq Sdg/uzwT⭍8 ror?k%+ry>^0Fr 7 Cxe+o& /̯k% 9kଁ5`o|v?ҹ\_K͝Ooݿ1?>#{|эힿe''`'}5yh`&X^:ci6fbc}9>7o 4j- i(7rKB_%Z_íuVHWHѳys"&q VrC<1=yn ?ASwXA7t{™ rb:Uf!ƙ5A>:PmNi0Jl֛rt4 NN%(Wīn)P/Kwy=q{)@8*|t$]m9-F"FfRK<43@:-T,?}E;I)m#ݩ3iaգiwW5 ͜!v*#T%=GD>)D38|Bd$- ،Q ;3 @5Wo%`.|iG`c+Ͽg 5p/AtgSk $1׿_a'xkn|ܱpgp~!1x{ͪ_xq-7E9,_سz:ݲ;(o.yM؁cz(}m4s֩/tjr|\W) !-t&{Tʙ.᚟9O K4xYK50pd{aP=E&,Wԯ*A'tc5&CŎrX|,ػK2JPԸݠ\h_1 HܷO.>})nVVz\^giۋ.nuǰo3)${0Ip- y\\9P4{Ud` (h/Va[1N3]&s-|?Gԙhi" ȏ 24#^ ;<ȳh8;c[ƪ\@jPc'O>ʶHXbe+~\6ۣm^C]GBJNgygkO9AcJ?f 8Fޖp2&/l i`ı5[w?ЈHk<(4zW_7?zЋj$M+4m "W62ΰ~zGtR5~ [objH3'yN^ɂ3aIF4G){RaZ'#ܣ C<"kKPPSXP?_46Sd|+i>臯ZR|L`ogdmcwMwJ d_?>|Y|ii|ɸyLDEh<3U g+vG>wyQ-o=sa5caoDQXfno;iGIvKN*~gwKΏ8ܦN_C݀%\? ]Y) 2@] u b6*U_Mzj@2IjIY҇][r-0F>n( /a+|${ՋJ6dgV(mGu:/YZT fDwcָ8ThD)S) `twr*F)fXXU=ow֑+qIZjr̄?zdϨa טHؼ0w\,~7ƿpȇor>,ٻA5YW>iޡШcb[ R=W t2@g8ZDxǧ9!eN[Gq @Hȩ} "| ؟&F^ܛ׈k҄$3.@gr $?f^1-\6?L!!0~ːADSJ2;ըU'!/vp8c'H/Ƹ1@l5.My#N +JvV_hlC>B}pYvYpi1*/\溺rs6L0BA[Rn)4vJ,Tr~::2e٠# մ WyҺ&LfBG GpQ.w~Ol4X}u_o& lY8Tq!|e~Mˆ zdn%[ݔi cIh܌gX q.c9A4^o癗"_\wW{{tJ&;3{xom%98k_ PX`fgNa7sx t+?HD :Lu>ph>k+;N0c%SzacǟEI} b oz (&Î@egBU5tL~YwdX K`A}yڦZDy 6_)n:{"U[ kyʈ4gaN9Ts6Yﯥ#AQrw[#NI$ d:|6SwbC嚚_K0Q+lapM8]!W1"s)[MXJ[xq=- #F~|/V_{$< t_f",K+ƛ8!F5SzGZ`vS YqvGޜ ~bF"_Z9;I8qѣ~qUfѥq5,c=k550]Wx+N%M)aG9pOKBSH4n%Khʸ( UO{I1&[+YMowX+Ic?rk^0N\X~:t^5_kB6 QO`"e3tDZj^$(l,qvͩʼn@u  "#{ԓ.Hu¶F7%;x,fnT4|5~3O;v-f>tMOo5OYSY׊vߓ߬HFn 9p.ۀ7u F>oL*K `o 6;z?q`{iH凧xJnoYB!RHr0Qp_~CѮlwJN, rj8kଁ_`ŕoX`:$w(Î/OL8#~qIẇ¿_>Œ LtxK@#V_` u>UD9<||x+mxN@E}| Xk57X `1[])=ӸYZuV\Ȅ@&\֯6a? yJ%qb~r]]Kmg>83tK1<7Nc\ٖ߱kOB&K>+~W 85c ;Ny̴-ȩaVݮoeb7obfD@t2k-z{#tM С{ ~Huk3TK _xվT/,?_akhI,tz gNPaIgdg YcIMF78spՀ;ZYFwQ)jeT,p1m13\(JVM\={~fݎɇ 0vSk©T^79b~tիVaT>fվ p3| y~ <7#E5^y+#fAѼׂثdNʧO~3\X.!V6 @~&V7AbÂʆ9kc{oޘ4*W0sմɕ7|Z{Jg4q4 !Q>${#3#g PzS?Z?`Į(,bgPOQ.P9LU U0@w  \^Ps9lmً&1Gn\}\r:FT_aLz \7O= pvWݾ嘽۳|t@۝u~8~c4lfu+:E0%ja ޿@4jY7=FtyQW3h'#8uuR`i.?\I(I[]ʭ#öjJ+DQWȅ0Xce:I5~b;VRux˩ںU 0I^Gd(ߩf<}~}K>7XQc(;;{Wt}y2{-I'̠mc®w؃S!Ӑί9 f.hY 0 ?tCeEyXA(֧2WD'gJ-΀΀  Omw'yC\0O %}=&?zUثQע;|_X.ȷρL>s3>Y@H2J|w'sSFEq[K?b$Χ hoΰvη߰hoߞ{Ҕ)l'w*S J]Og(;;# <a{yő[C:ϝf;ϡav!-ްSp!-" :re0twUy9CFeG;k7 Š 1݈V 43FADlQQ\G1h R/Ҙ:Vdpk%)O~:@铄 ~:X2 &V {IT&G40r_єCFd/#g;޾ IL-sڬ9#(̈́cXG.t\]l QO(mSߤ^0n7e ( ;|AgIh,W^2KÇT-eAӂ?dYY/YV,4.!VϦly6oQ;xn401{ } w4w(a#" *vqxyL`gin?x.Kd5JɝJT'(\w ˠov1 ;L.sdw[;^NrXCO{8DO*ݡ?#) CY!uӚD $etX#뚾b2Eg IayILͰ}=VYa[~x<ٛa=FqyoewwXھpkܾxS|ÒL2#ڒLUF $d8d  ~}C UFg(Mjߚ 򑉀1V&'mg b "ƽcf Hw{|?"7Ϭk1X.)<ᆗpH*˵8s\9C#QДT SJ9 $hx!Ӿ.96U 64Bω)#u)7eM_/'Ot-{5ӗ-G(hEdlek+|b|j21fs-=`vV GfBwd(Z_ b=+>gdeCy Hc@n82fO3>ՒӏyߑO"Y UڰeoN1Ë́ *ܩN%p*8M~1믿~dռeG;:PY|~F'Ja̞;g~ 8!B;ZӿiZfX˥ k4^`7Imq π3p`tG̪rD(kcc9Q0ǒ~D'^Rg9gn_^MZt𱸰W\u=oF7՘J|1`xX"$4> ,y (ZUF*igf#LwNb^<.xn\xI6Kt?'-9ܰC8K`XǴ%NI^pHP:(%N8c1vya_Ú=HJ \~~WT9Պ3.t,LY=}bK$QԸr vfblqBMY9Q>U`׼G,dǵ9Ra_-hgPv$;,FS JT8Mr+Ȏ% KN+K66pMwW얻$fOd0X=珬'(,=- 2fk'v+EGxt lt6_J|J^-l^@5䛤:IE5SYK5:mnڦ*\ٝ^|Ri>!XNnZ8ô`SЊ[s@ZYMhʄ.K}}0XdZ`I;!I3u]Z}!)nd¡/i '~ '섊djod!jdhG")y4[5?3k6%j(>Z|FuE- x\%H=BG/i;ێb ڙ"S֎K1-JLF΅N\YYC}4{ s2 6eshl+"3)ןVr8#sx tQ(2n`umXH1 U86bSIWo$&q/5/Zv^O$MV*466Vh䣅o_~iOQD.AةN%p*8M w9"9ݻ+G>x|`b@˞O:B+:/ɢѹғyZ/u.ޤW=͙|S;6AOgt(nt:p#Bf<;3 +wFj*䥾^5${G7[UL"#.G'pC2yn97~nl"gBc< e˭?őYRa}$ \&:|O{jf|\'Z~'Y S~Pÿ$Ss'tvc" +UD؊e9h77o4\|p{3w&N9}/e;a/8UUZ3N~e%B4~ش, Y9ם0l۠49 \-:퐆,CÙ@ O~Y^O³ƣq_~-\HA}r4z\81c׉P ǺҥG o 3RlWF6r>T|t&Wg7 vK&|:d諾=O"9ziZ{6f+D9f><\==~<U1r;fN%p*S iXav(p?f5a_霾y|tX[9d(=GooY7Αwk6HUrt|g:,-V]?N/DG4(q${Ԃ0`u[)Wcf>BBK`>UWK`Rvѩ%eTr8+&(dTb~6z{8`EZ|N{M"Qm#,u6.J`/J%4(th$==NA!F[ӸmYKI')eMϽ(,<2?d2 }cND?坑;y7gwCm#ފ7G'rtX.ig]M, t//d5u5e@ b  q:#jVtLX#wF̱˃+E4Mc>S+*~" <7)L+Вp+..eL u+VɊo*sk59{aSuj>$Љ`tJ2L}!jM윪nfvwewל\KҠCbR7;#lg[]3`\ή3=6ag[i c >ݸ / ) wt\vq:~ 1o`EMi_O*:gY ?ÆɑS<:coGYʮ6!te@9: X\)()AՑ4/bŠ;2p6T%‘SZhzHU.|@.D긵mJtĦ2L*L2xV9B]Ƞ00U#!CgJ8뉡_u`P?,cp@S}lWժ&.âYtEg TmjWZ Auwce.:D-l .VrPi!9u?^'Qchl}~? F;klk' iI, Rpuȸ?R̈l/nn2mύo3.\ ^bma^#'>ug^EFb[J~Te2XΌ}-*VæGg+`bMF/& )L/:` / |~X ,<#c^p_%|9S 󟓎Xbu~yE1-p񆡏d2xgl g`% L/z,_\0?+,FL}x8mj~J3wO%p*S J4CeP΅οK?`?n\tSO8WWoA=H--=|@u/`*F,:J9]}EG;  N0"V^-׉pӏu1!s6K.EAq`w,"oqx :J!G  (CTp0Qt80-ou#eޮ C] ͂At^Ż`S[3 =ŸN~r[o1 RY ߐj*UYψF'l)e-0};etrR^q,5}vsaBƷ\)WDŽԼ㑶I@Mnu ,Ϲ^b~Tv~?NrU֦S_5-@=frIɏ/?H:pYX:[NyHN ۜƶLZ,7KۡX'A,Mw-*Q5ƽG-QKQ>(O=lDϳd7ŗw@6Y+9u.#018Yh3,7*1 ѕfdMu3VQiQ΁=`2=30gÿs]O[8ڿ]=_cϋpzC +`sޏp:-@ϙ EϩN%p*8M\{+yevT^<3bcduŲ^SOdWuVfVx;Rd Qe\J1؁r;.M 7&|Fw|뿐lKSji>>Rt;iDߴ[~ixgcNx4 kq[/97p5l! ,y%-`)\ʯPB>1ŽG\Yx۩ac<:̜\%N.H@\5!Pm3 ^[]gGavRcwkv%p)+](=bAx/ҍrEs۵Ipƛe~he/9fڦ6~|mG ,nc0%qZ,ڒ[>/\t,۪'d5AoO ={쯘rS% hlGڹ22޺Z)WiUN?8~%pсNA믿mE;gѠG߱d_oX Pד>98h`9}i:TU77s8B8WY^5.ԧ?x2`6maʿ .f7O+v`0owB(f%]Cs"脧XD3kw,WcYG<#An\L;=G~ͲLP| ƥl':[&5i^;"*}jBPjUG4C+;kҌ> c#dKpC%L9:&x&RjLL^3*I&HHt?Ht9М v}4:GOuqgV' wcomh[c" (쬓yl:]r?IG?3ES#_]F}q v@)fv,<>K$?lϨzC?.Ws1W]nUssw~GX 'a-, 6!o*uq2'E2ɧ§.T$`e\o|{gn1&'~Nz JTqK4 Ka|!x}}Os h|fglw /1@-Wn./nxOˬb]eFo)}2 yFx?/CW|$:{c(ebf/ ISXMcǜd  UBOHT\\bmR;[GD "ͨCSɽG3q5<[w miTG&Lo\Z}'~6*-e. 2]^='QnT. (υ U g@zV z+&a(]q|`Qo(#|a̪ؖu–{k)qU3Lz{F\2ES$2~$ |-솤}TR%VHX]D"`goA/vRlN$ɸ,l#H "@sTvDr3vH}fh+Ra0X#1m}@;߉%agQTlg Z϶fksT/:J4?H(Ɋ܄v6#/zux%YbIm&!,-~~NKl?H֓d?ĕc¼=mE6"yks*`^p0ГQN{p W7|"*+5៘zt'OW:r?$4Jd_puJW AO wwggϼ(AHJ _ҰkHs*S J(Q?2O;?U~뿞vq_@27onn5ʈaȹd?Ggqt|'g:{MD2dqs)KoH>UjVʉOBGWpP .A5.M5r42^:q:`CaYG yY$߾:1"g]hQ#ESld\Ro!`:eVT ^}*M=ا`+ iJaZu;愾[`Ң_x')`~+ F覡~9t+)6 !|n<5w"9XHv{|l- =0 L<}Z';xԇ;1BZ7zux׿>1x@xj4g)p*S J*dž'Xv(tsٹs:+d/l3|`5捃CJF{ӷډ8{<=_ +o-o='-2ڑ3cXn $ut]K$ŹGAy:Fr1`XE˜'?Ә>#ؕOHkiƧ#+e4)RUpH7tU LqLa0bÓKS"<~|bNnN2J9ň47~v0{[9b%f/?O(tST8Z p:cgv/ K?pZM6?=}FwNe K-#-^y·̛C=Pb_=}!Ww,?a}]lR@-eژo,$6@K ek[5# !aF1K;ƨZ6 v d6" U1XʬOzmIxbh0K9c,#/?簩xR ʭ4LAuT\ћ;CD[X'*]W*ts.0{5+ĝЯҍo)ߌnb%%pkV ~ b]0 ]Lxi12ΦNYM.|u%_%@CPbp|^jgݝ+$ ridOqT`V_t>2A(N)K͖ Qs%X+hA[_mL7(-–fFR`}>r ƿ+K|ўƋw. G">3,{l9)CN#I?4,=&gΉ=2M1a*6mJB.)@k7kyV1Uyrkk IL0TgmKI%*<Ff`mC\rO5뛔s7}V1uoțGg}0?+g`r`|*X]݀q 'd\sD oV4Y=d:DƷFr~9N%Si(QƶS)c-w߱?`Xw=r5 9wn stto eOwtqvv 粳[=C !X~~.qo`u:':GR N|2P\sN);Ͱ s4$,_ -ńz~2w "iW)lo,V/cd e$t. "C~s?syaeTʢGW^Z.tV(Dh؀oQeWVW\7WH^F|uũ෹#4G٘D.`]''gaRavg<>^̊W9NMleZ_sS9-,T599*'={F8T{$%T'&mJ>nB wb+Y)¯*p Am8V?:ӫbmXxß]~UM&qځw.id64xcR釘MTh_X$`$zȒi/Dcw+Av)#sV>>($f*ȲL$_0xbWTl'dDz*S J'-OZ?0'b4wuy]{;G:=?+^v|<:;>\Z9 @*qs܈aL]2[CѰ6:]@K`$sTN3gne٭ OF7H?{Md.S-AlmM4`3p'>J Gg|ۏa _$e (ts̠1r"k W\z/ŨݢM+S \^IW>\7jp›0AaܬȜX$LO1>L̙/3&,INJ5κrPOW\iiQfi!gg @Vw߼]m9%3NߟݟpN ;Ĩ}5#%@LA}_x#Ϙ}$`#Jj@$.vd8!^O#L!Sx8OF'=ExE}RA6:-KpC>Z0~B T0-/U  }S&Csx|+Nv^r85iqiδ~mR;:Yo XĒdY^`l(g%,u59G*rGk(`7`J/1!bKxf+?]﮳12m)>d7+Hr)! Ox{ƙn&)gخ&G#'T8OU &9lF`77w @ynM8eظ.\϶c';cv_Ψsl;f'͗PUWKaKyjK5pG:g,^h&(aXjB~GfsYqC8]Ê3o–Y| 6/>5zv d@N0SSQM%,Zue[wP@>VI,AbiG[ۮQV^X.Κ˗YO 9⎕$izkP-G2WL^mP͢a `YH',pB g3W.*Sk~+q ft=(m[Q֘?zx ֌uJTK4×/۷D/;}[yLz3 q1xbG/ovl /oYp.l8Y#fK_8޳"H5 '# JpဧMu0!:pp #8Ŧs%3$?),->-b'aB(|ȊAV ug 'i&n7vƯiKqC6nxЌQ!A FF.?5xIoxX ]};3߷U|| Ѳs9}WN)\1`GA*|247w2rՁ=fF\`lhR唴 5d[k*)<-%s|, qAW=xI|H\ f66SE6$bJ="*b#'p (l:("*n6 4u$CaZ( KЌ2fmSn4CY4>3ٻ2 $81.|K)g?!7tVzV*M?~/s~ Ŏ{Ja LF%E9aFDIDMrX^GQ$S V>ff‰|pi@'<h.ޟ[qi:7&rd>gJ=>&p|*yq|JwoP`s1_1Cכ4n6G yNN%p*N?~Pw__>,/bNƠ0sN 1пxϑ~-7wxP;l-8۽c Q1zĆY v*tXWf HdT  Px".t\p >A2VU&̕YUv51hoF\d7ox2#poi;WqmP @j6h|3W/eX.-ng$p$G.ve.䂀 4&i)8dc Yvqh(t>wZhopr=WZjAIrE˘6nDDcD"g=嘻!{.(KEkpT1/:g29) rPhd4O=aݛVk,˳XG ;QpyWh*s3}D Y;dv$- fBf]`GK6#[YSYE7=ǵrf "#vOO<11pmS9lIؕg7 ͦ|H;TY2TϜ&*\ߗGw++ ̫N~:} <{XEd.i)kNS7\wJ/j[K <*C@qcJ^)*6b{{xTL'dFH}Jfy~<['^pt~h]OOo//Y#=\üyÇgS:O%p*S %pKŎe˿ s܏Saw zdea}-Ou-}1n4mq/3LIOsB:b;m}bzx>pzo-1P,WTPy{-ZD`,B ף[K Ed2u^ce{4~16qFvk6TV-;Zhˢm:N:x#jXw8 L4XE2?]'iG|ك,0{ְ4U,Zm$#436ei8(^霻YK/Joo`H߸ -(Spujs=('gaq:Z|եkP3糮0BmY&Ɋ+8-]夔 4A2E2Q 1hxeWAMLRԽ(gKeE&en7l)z&ROi;:w] @<\n*R BmfҋyGPҚ;h:䞠a|uu}uf$p +wƿ-d>0QȎgO|F\=8cp7g7o O 0VbsKf\5sp ulϙ`S$P'w*S J'/O^?@:^;J}pc]=3k:{~4=l׳nXĮ9|&{:Eu tb_]Qg?g_!P3bㆯYn\Q| i&=,٣$?<U 8Z~WVq rxF4#pDv8mcmCN.z^Nmëݿ .Г7ݨ-%iZGCfɇr7yD43i־pIU\8Etft%Y,`>~ sOs~{ND\l;/9HˀhG m`?ڤv{>rז{_c3S<٘8)YNɸiwג|ޗ3Ij ^ی:S JT?^ &~ErSݿ?2p1 ??ws5[إ2sűΓn~/CsL ވ2>sdvt\(Zd#K%Wu.zprnI6L_̜f{4P@Q)U 6вGj1[?`Idnɼ}eƛG١Q_CGPT< dM+G_O}¾ryFoeѕ00y* :S'V pl^ĶNB9[ p+qI5M{:7Kr81l|zHڥ2/CX! İ}Ñ2`}](v<^A׆]?Jvx'8Zzs8Qk_MbMg_"vhE@xϤA&`NeCc3=%`&2'N~G,M^c@~x<柗(f HM?㞥\.Qs_C"uNN%p*N?Ge2,Kn %xwyq9Li`7ʹã3u۝3ybFzÕ_gw;IyOh ;|pKPN/I=I۟FfyR [`Ǐ&XF <2"' K1`3)5'qr+%znЗ²F{j润ZCS8Cߖb%{ >VVY.1iKhKx}Yqi\ 8aU?# л@Q,Ey ]b=bvlAZzˈ#zH!)v*S J;i;?A)/ncӃ ]蜘{:;':#>-|l !Q :^@cCD]Mor5|[ ?mr5pf! P ]kn` cɭ k" /fudJ0'7Ba^ƿ,ފKXoykDR2%ib .;||C@5Қ?6~p˴ :< J(W[x%6ƿeHrsx?+G`!|fyG9'5WV{'3sk+HY,X UA =¹ۧ<KMgJZXrJ/, :"z9w 5?Ú{a#yۆ46\]׹hy^n4y9/2*#X.l$ݞXKNxջL 8nI.wBV˿V;^!;NS JT?L &~rGo~{ :'wu>3 Q2{ K 2# =}쒗y|t̛#)_/;{^  4GtK`|8;)?S.L\+0[smq໰b(hvKh EMd U{QE ^3˦ي700s~NZXri6@qDSk~S EXDU^Vˍ#WLJNK# Q`H?k6?W:2Z R˷ Gvf i6$;kW>o^^؎}z.u7v=>px Lh)g,ƕTN1 ")D7*X ;ügiijCy'郀0X::ϥsKg-!\Œ1`3@49*+~{@ήA%ʫ$hQ9Rը~.3?T|.ɔ]us|z[c9 [|wltPW|q|cu2OfB=Xj%-w$tÔxv3.FjgIG HhM0u@WHxQQ63᠟S OmЛBaβk>Qt S 1;կ~uW_=I`[5XrBN%p*S |8M|"d`Bgmxvx۷o1Nl`G2W~TKRw9=5[ָ0NUz\fSfwq; +6Y6=<*s> $0x[D7?{Fx(kDΙ:PH1㈤l!_\ ^dď$ ͇AP)7 2O( 7D^I{'O2{'?4*4˗ 8NfR 0DhSQLM6j, b4Tt_ [a+̰W x XF&SoVkҲQi4I; Ăm͜\4Ӎ3D ``đ%̡g]qo1iO"> @C .7eo^PwA4A9#+8 /eg؛0@_MXKQĒ,m˚2ә&VUpv/ṼIxRLb0jh¶[ź\M*;t{N$}vR xMʽ |qM&^я@&.T(76fl+g>@UADqrF[ʚ<\Y`X, 7(00 <CFyq& xMLE>Mǡٗ\:@ |Co$h 8RiJnEPtR?2hpܥx<[E{F~YXx8#pHwſg dK10s&~xGX@[y`7 ~C[xiVPR',7̐}yssq LuX̢-_i>* 6N%߷UOi 9ةKNf7OOnn.gЧ_eF;yr3vͽe\y~>gy. /,s[2>wvNϝ[{`TEi~F|a6cp?яxگ f&(K9AįeDE7 =u/mʔ?GrA8#̻i˭9vxNAqo\ @Y]4k3L$\j98aތ0W2'. Cq?rI TwI=g!SnIl^4s4eϠa8-F],1m/)l[GjSO4m^]2l" 1Ľp3&󌇿+|ޛVKmZ+~ :Zh͘{ۜRH'`"[8 Gx&IXW5tz.Rif~)G(̭GvLK˜FXG/m}+mؘa]r yqȢL^aܿeTs | ,p~yKhWL0uqp[~Rt{t{{^L Ve=<<u"9N%%pg#Lտ~73ʔm+og9gx9xvwz'ALNHLQ@0͊S@A]vZ0lgj07'΁N,޾q¯\rd .EFQ ,:;sP_=uetU>2gXt4#C z ᄑrRO!PU+F4fhf볨!EGW@<š\ ˜<)W41 t!5 wA,BE&,:8U qL7 b o50k8SA6 y3RV&}^Cs<>R̠NVCS:)WmzV'?EQ+S :٪gMZx%)'nҽVXgZK2K+iDA{ݡ3n"=9ͻ2ҝs$6We,ү@nO6L[ȧqRKbQn x X¼=0P6e8ZF^˜t^ag@>ma@VtLvD b;ύVGm# DߠǞhַ&g 7~L n(wYwϴvsf&M~-41%D2*7)T8ŁٓY,a$H/Et0{Yn#PBC6ʜ"y0̈́^3ГY|Q厮 iW?yA3aɌ4sL?ET4.*d2yY}\KGY wu@kB!]9cbzu~+ҦESpMsʘ򌺏tcCʚy/FF?BZ,Dtid3-nsLg`H:I.V`K6L^`bw#Ӿ΢NFgŌu-^4C9|** *4"ozk 4AB!N%3nKc)mvl ;iO %$Gnӭ)k ^lmDaasӕa#5N7)`p5#]H5Gd  [% K%ցY7j%<=:3<71 Ac6`ܭn%Cm*ٟ\H?1mmYek|4BD#(;M sJ~ci.ڽ tFY.H?I{YFw5t_Jx1OK6+7AD Ҹ+,1Hc]#2;5ꣅ}FY_ZY{:|<.t |K,b?*-1 (a @q}\FoCu4(-(s&Wv]? ,SˡT~JJku1.9e[<4\X4QZaY|R&t e(5ijxbL!*qiz+Y_/j|W nv !Ž ,ꞵa%ox)3 Ȑ0N*c|ɃoCY?pq,zn%p+[ |/%p^+iay{-кvA^syF= i~~ww[ƾYs,#G-M0MKǃdfSns)xvDЌw51_g/Rz(ʩh]Pd9ZmR|QS]ν+ڤ߬ e EeR_{ asEΤ6[}{ǀݿ6\nYP?'2:`G[sӟ~~~wqn_|zMG+k8V`Qd=pZg[_9CqYh7GGWu~GJ=dɆ2 p;G玛rt4Bb880ҩ{!ʷYm,0gЍjO&L}:A^zýDvP/;v c@G:J?70W8OrX*Ҍ"/Rx%J8`$6U } ]k,o=60fBF[hQa0eعwmtVc> 嬌{&}p}ۮ~zu]mNL-vg\jeZqkXcԜӵW}d CP8{+Xz,|Y0D`HḅWǬYVD2ŬP&52Vm?pӛ޼  @E~ƏC  }ңoHΚ\h!ܻi2^`S9~\8ɸvQbD2xH3oJcRRݕ2; 2)R&1Ө챮J۔Xm>#>a,O@}B ?DNegpӳsd &(*y$6DHx.d"wFu-JeLZ,V(4B;wﭼ߾FB1Q@`ſ>[>y|d#k6 uԁ##G>vnߜZ=>ud/@ tp~l pfE]\!/D~瞰2?S7ᑓOѾDVgGkKNzvlR/7崲9)!g7nL[-` I&6*_v}R'[YBNXQhDžRvׇlry'xlJF\3|&Ԓk0rJO9(COk*fZ#2X/Tnd×b~8yn-%^-S2Ӡ5لx `ʁR(9BHt'ֽ|?(KxVdA .` =z y!e < fZG8o)pb][,hB]~pR#PJ#}WޏőeA%C+zV,ts66čp >qd +._JQŏ~Ƙ|[6Ȱer`crM=!`à>2ó~_p;lB^LdMgϥ>7_ܭ)|+[ %pqK`G?O Gof9ެ_XrZ"וmliK7pr1m0֘҉Srm1׫NR:F57^ͳd 81]/(!KT).+`]'YP19_yJic,ߖ:ӱHfcIN[>+!O@!0!%L{3|[=:Å,2R&xqECkWFb[yʒMM{}Xl)?9da+]KnoTx_Rc:ƘkBUr] g]0| 뜧b x=fE10'B' ^uMTPY;JDJ94 ?<Iu 3>u A׸ýZ])} AX|Om˗<82x =՛o#HYP \`3DGCW "F 2\lDYH[ JVQ(e < C=_'qoWOV8! gg*;H*7 z3B*#=@ZV{NjՇ4/q.'=&Jd|.}˟Sw VDY]KzBXrz悕{oÓJj5b gKui=m+e֢9Kߠ͏B`"㚛e^ueZa3dfHW'4EW~d8Sa*́Y8Wt X9,('EezhJ8󳝯[oz5k/-<:eِEg-O"}W8kq ŭh"?gF} hx>LSY'igIg}AH;'^ O\\*=L\הH\U\XOң"<}G̳k8ǩs{zk>&u/~Ӹx_i8_>cc;\߭Ymiu|[{`|%yOlq>̑o|vӐ 7w+[ J ^>7J`ҵ=:'7 xgxܶMql8ѴzУ{{|M؝?X4zىsH#8[XŋiBH+kwÒby% ){)yTLqky2oC*` !4VH] ,#=rJ}?OꈾS9^fIL7~\>mjAr>>ub>bȌ0)_a:2"fO4&~SVάcMW'<3cuv&J;Q%c/V ƹ-lQ:12Q[t(\U0 ğc&կK2r}Xq{.U,-.@FBRd]⦄WUr< |9_xgGY̌.M]x z/$@N1+P9=sGVatىY )kxҔQ6+xG`Ip+~wb|$5?䓒o^xbe7ۜ>##ڣYr1¤݉:KY/.GTc?`{[̨0}ܭn%p+ [8!jUv^ϧ՟Wn͎=fg; X-|Ms[c+l>о2vf3|`}l}&GNwFcm[/k=`CCNN#|cˍ{h\F Be~{9f z8 4X*:+؄Kb]pH?G, (W(U$K@o ׼-L%RHzR!![T;H"C`!0twҳ1T71ӿ{Wz|\+ެx||aNlVߜ0q<4HyyX_'H[,~}d?z_VANvo"7 5/iXN2P);T:hW ki@Hs,j^ɨ @!CAΏ %aK@ QxrUIS^i/8̃4$]9_dKb ߼'ԟ,UO/Hlh"e.;Ym9xaekcDxG: ~QLx;r4ցz`v{9]¬ wwg UQ . D d}pOAV- @i@0Q Qw{xCɋzL$Mdy&vp7J7;s:%,3G,rC/9.vJZ!Yh7f4}qHSes'O|+_]t϶ kabЖ_w{vX_{޳iONxY pXK2㘀;8wGNL:ٜX^z~ftt3mgHVЭe 1oxf$n%@PojX%`е}b8/㣛`co6|tv뷘omiXQw6]g:$P}VFtE J⿹hm/ꉴ0h>&$K8l&xk(XtG4J×Rgzc % JJ!I*\"oXSLsWs~@U8 R>d H" Z*){!?~;vQ>?tfp<\Q;vGBV3Y;dGتl?l&Qx tl%n>"YMDPfxQl!`8?+c,_ uJ6}+Wȷ7=d\[x@@V.d@t1Q+πE׀~9Iw*%6s/'Hq5R rSA[ϴ )ud%<;C5Abo2`$KZ'DM^sWB 4-7Y|q5dl=qW=/OС%ޒ *Շ[>>\H,z4y⾲]_3*)u_\[`s lӎ }§ެ[> $t3 )cۼqX.s?iXTA/䘛[ JV Kz>m  mx7,<0Ġ vks_h&)z)c֙ ͤ&7ʵEߗS{XG:gKڋH0!p@zĸUݻs9z>=+/.G,&:VV.jAǦ<P"`k|1} [f4[g) 4">:GW5SX$R88+͞FQ^GJOJEh/w@]r",Ik;N )!qF3pŽ| ßSy۠ipX]P~#*' ø,H|]>x]Kn6ů?~}/}BԻpూoVjvY?}[Rfhk`C-u@0!YC00hZ-.pɔk=sy!߱ ts#Y |W$pA }% ^I*n%p+[ %pJ1wujvghZK6כg=M&ͧތ`!4w9-EGklַ~rscG\tB>%u+'؇_L,+)+\<%X /oC0чAt1Prކx#GS| _ g79kz G?*g;Jc<: `7ŰLDŽ2A`~Iid.$j_4o!>$_|5>+Qdgg2\?ԫ.؈wȧkNLkW^_LԻR3\zM׉zor/E\VYTy;Jh4,t[䗮5s<7O^~ 7KGKlppt?qJG<gyvZ a!H%ہe?$PiG=Il) a4aD6_@I1Zlgn%0@YthNoԸ|@f?={_~b͔UgqF3t=h eʢ @+%Xoi y %OW21_pl@FOq,tIW|\=.4ۥLsݔg.$/"HkzQkϠ?o7W/^@^e*V~g!Y3O 2m+3oJxxczDGQ4d 7Zd7W<`W,̓GYfp( ˠW[YQ\th3|%;쩤~Cafuq@:qkC ,x:A-Ϧ{U^Bo&簫" .E:-E)pIōqCYq*I ]0`JoJ-l^K9M36y+~z'3G TsecJ%FVF u;\xX;A|28>H1cCBWRrAqG;>x``0QsLm㝕d[ JV[AK@{ދH'{>cQp::zÖ@Ov̶:Onf C~%Ia(g-26CWm9dv#C|(I=LW] /3ƽJ{,"x%2LٽyMN]zX>KXNwj0O 8;8(kPj:3?T39$4fb;SٰU5*?p\+E *D7 p\*u'ṵ"$'uT>|).g \{Jsw{pIl)t}PA)^æ1mdy3 #7Uxx [{5T*o3|~L#8]HSVɕx]- ܠB+\m{Uv ;C\ڒ;:'Z!=p Y~ W?vW+:̋xe2|ʍpW>=E/C\7`Ok34}76 HrFlƃ>$k3/ G\VN?[ J]1s$\KZ}7ǷoߺOxVlN9iҬ9w@}@Sb\|ӱ!:DSl;#`Ȧ@vUFD]P&Q= hbG&.:P{ FDeܞ^]ȚP +=bTnO3(zLƒJ=I;K"ahDA6.%]\Œժ% _v*\8K'qnBOƆwC1;%84M-0zaw//oW-h.Q~w7 Uu+Fg=!ojgLDؕz @:0PyΗsQ3, {GepKru.zdVpsP^/)gu;ܕ*טZ6di!KrQ>6Me%: PLA8fz$W\TӸؽ,i[=V\H\Ϣ`8g̼b / jgLp}蟾PSK<j._Rr}`$`BB,I[WpMIJ @g`nxq{8*}^E]L6;l-[2:zῧ'N8oij w播iihI XMN_PmWq)IKz$tT4G 2^L Gπ{%i;  ^~Nq0tf&8i ҷSo.• ΉL#p 2 /,ؗ&m7W,R93sjsdʙQd mVuSv}Ӹa&x~zv.Y7`Nхi(C}ȳCMuy6bU_!IaY&pPQ{c;8иyLӎy=p ,O8ɤ y|Pv'TO*׋ ]`pQPLD]MP YQu^䣋Dңᔌ٥"C+X:T%5;5S*!LH+&MÎFz@鄑`3k[o\@/5usJv?[=_*ź0P2u]%@njjsK6 8Fؑ&lɘi34}#n(/@Yr4hFzKxn:@-k1j>C\^ti9sOD~*R %W&05O sWc-.6H npF;;{q%@z߬8x.^q} XNM5 , dj4NqlYf^'K(b@&/j/V.Ur ("'>/|jTz<|.\=@0ҏzH~g2i崃f6  "տ k^Jo.B*W!A?D95o!b~!pxmvc,`?gԨ`:ޯ[:/l^Gցс _xc<.>h'+y_x&_ҌGNg>OZR*-U.'K2?IVJ6^pߘ$KFShY`)V SLo`&L %8ozL3 שzX 9aZKhM8\-:S?3kBr /aWL77Fg@KoW~WvI"(~ʙ [N}p]P,@1@\4/)`JRR|}\/凡fUKO4YY +z۠#1m$].ǪrrUIi,ħϝzQϸWSh(.@ww# klx#B$/Th0_Q,'^EaX%:= 1:*"J̈́+< Ihռg(')J\~Ga `Et-<6ʜv ?|%xMX3,Xx"3GrU-3Ye/HaA{C 7c̐u_F>t`bvaMk^Zݼ[ JP]5%lx֮` .V޽[ @ҏQpBmiұ:?tiH-{K63Q,yx'/\$,0効'^R/ֆ2ܙtATl&Z^}J\\t̲E^ݭi W|L,,<*0568a!^YiP[4Ed(wXqK V|Ņ>EO ?J?Yvu4I溴evʗXpuā;ۊ2Uʯne+ik 8񲶾9gM/ ;v[+W\@<`VH_u="OGO[3;A"Z _4Gd< $$U { wih*\y0L$ ?fnKn4DF%>E;ț8]tL)|]rf?G>`Ynȃ#e<$[=eX7q2ō].IrsS@|3n%p+z ~w/|romq3lF7n@JۉNssZi(H:D !kij>j.mu5$Ol(=IwW"ľ&kwE~OY"Nj/.., \n1_\+2Ȓ!Za5'@"w™`]w ʽD u-V?̲H*? `ey^s>_EJ+ܒ;қ%29pAңk,ZǮ0fbYƫ{(dŽל{Y.zKJOtJ@"/G\Ua-&$K\ISR8|9>qq!7饙;ť\a֫0#a_&2`gR煄b=Ϗ㻒˿Cj R91x"Ngec>(j O;{14"'`lBư ,ݢϨn?%dve웆wzٟO4|\,#S >v)f\w4tL2MJZhS#RK¡$2||UYv6;l}4"qF3'=; $HQp'%zA@̄|HYLg=MQ&_f̣NmK*1RRFuNj88@gu/dI/,F,!dn`+VY^Y)>՜4Im6fw֯s V8`Qͣ"/uO]|iS%SoA ud0V/G4 $all\lR<%f|koطx͙kNkx0ȬWʏQnCJUZWb_JJE$7e0iJ Ba9@?jβZCGWX|adp&5:`њΏ@G1'$+< tԡ-Qn_rO)zYSLdj2IיYQ iP.#P@ ll R{_%JA=a)W7\2=Y% v~b? ә68rZ~3Ly[ySO\se7iBZzm[.ouz{`2f䊫Mԭڌ@߾ǽh7{$ш_S%\(>$~XCa%qݽ؇E'H[>S6eA 3,:޳z=oNp_׍UE, V+[ |%po~4.g(}{޺x|{Jd ֜>oi@fnx{`π-&[icnXӐB8 d@l:r6.{| kz5CPpWa b/GBP>S 5B2H"] _nHD%hSF`Z(L ˈc0DawьbzKDϾ5Ң|묩_hi@lcy9j^]<1(YnwX^$i u 0Q1UsPf%y,rP[} pQ(%BZRm ^@oJTg,( OggtQ^N:&nT\|Ң ->r \tK7d:ƀ_p=k]ci"-Wz3u?ՓE=ȁWp)fF7"1S|#6@"S_AFCpP|g|Õuj!=![E(DW~Re` CGBS9&a"5#M#q7Lk3*`,fUI. eE>ך}F]BKIw]Yq!{F O~ 'cl\~Kio?<~#Y[a"᛻~b%PO,[|!%pO,mo~s^}˿An8rR-i?wӎi6ihCRLytt}K[4x[iaK¡L#p{)pںhmio a#Oh4d4;P hfӉ9PɝUڬ["n9X;g@ M!qgrn %5q}|PfB^Vq [7|u#_-{3ƌN;qSM G3Ym"pbku*VEzvc X$ŏ9͆)_ =8jpO;(>_:ipVCkq8(H/V4*{Gz%ۏvrfGF((>*RZRqD_0@IDATdE)RÏDHy= bPySzKCG8pS8p9VMRp3&]#=<{'6e&,/kpOz|\}đ3sO,Cq`c+$E^py҅4#G=|<# `myK2ŀZTynmGeȔw{MjNiM>RЗһH̵{NÃтVлgKf|ό=|-qR[eğBN7r tSfx;t¹{ljlg=xO^#0^e0[1=?AHfLas88~Qy{0](f`ϩ3_~7$5hL q+ ܭn%S*Onyj@Zljrc"9/a7] Xzb3F+#ӷ-uGhpBFv􎾦r {:)x>6C 0X\GCLKхZVWDsbz8р3`o .S3\NB7L'[cBˋT?p 46&hY 3yD$6Β˯#*DF9^Ad̢#q Y1s>oarƍFsBgQ c}Ke~1 K?trjg1|㔑5m=_.W 5d~.)iQv^C(:UYq661O0 xN#=U S!ڪ@?o<[}meNY;Lx"CʓW|":OXVD۞yhEW~2W)-~j]<SHv4]5ӺQ ,2!$o Q=\}0=a렩w+w?~g  ^1}楡8:}9] OrH^:tRdi4eOYo_5=Y F*l3 oZ$|sOz8KG?}&V͙cy{>sC?\){`(`ϫ~ [V^=һ+{&;ba <_<ݮ97{xz:߳ӊ ōJV_` QoL3Ghm8*jmcPt.Ѿ9e/=0B~i9O|Gm0쿔X%7-S3|;͹N&AmUKD_셝h{<7X $) Kʏ DRV i֨_䓞;yzqι*No Iu>. fcb6U.veC7rLÂg(՚"?!$.15kr}>.:/~>)%`Pi\hvqĴSFڅąHv5/ g Jл`GYt{WuF?"2Oÿpҋ3R2?~0,~|b= @@>zo3'm\ 0 G>@"o6 3`<`Hp=EGW2o7/ 5CJwP@q'RmJ[D"2%kMb)k4Y_hbPHr2);!- =cdt!8fRT!}?Mi,|'^%5atz0<=Rh>{42z0fNs~Y??Ȇ 8X|6St|:=^!n%p+b ~wʓMU\c^^^4+ض?k'm9`88X߻l@,A}tK2Oۥv&q}Hi喛H +_+9WY[74'Š4螤=+aٗ#cD;-OS.!I ~3m]az.s6;j!5aGYJ/7vR*& w`1E4Jܸ.. oӈ&y`Avgu{vvf4LKg_~0/;c{_DC_:>ӱP:?!!X#&΀D+^8OtQ^ȳNi嬿3DpSӊ}s*oQ$ L0}/\Չ 3,z[[p}=:WB_boG*;u3-&z9Xh}VQ]X/#wxX3ϓՈϒx4esfJBJNОd7ܲ[{,/f7#l-noXfi5>7w+[ 4K6Ӽ_rKs}ȗ8m,@eEɘROuʱ.)}MH`Gv9[U] BpD"a5:V 5UsQ9(,]B__";)|M=ƉT8ǩ0z4|t1t؁ܹ|W7aq#^aCOxCw*9]FH^D="|?s-r" B3gXd#zBf "2>ov=NF+F:_ aUwۑDrQƆЊ362λ\ՂiMkUa_ed^R ,:H%Mѕ?b ͥK\$iz&A5kR\SxKC/'|pݎqi%d c|走_ l|xh:>FwS|N[Gw[8A'MVR2|Þ4&b,g\y07w+[ |%pLXH66]G{ڴ#z= {ؘox?>g@ʷt^gߨ`ˇ+ޥ6XQdK's' 2Ёt'`ʰ~[̼4G}_.GuIe?BA9,k$|}Jtj~\,7 Up҇\낶ʁKZ}RS\T_#F!]-yJ}2~z)0cD~M^wEoB t |G{9(x`9ơ"|S 0_~0Ӷ^pJY ࣷi1Guc %_AEQ)cfp\K I>JF^ WKeU|Pa3;n5]} %|onQ>n6n x0F?x6zbLi|9`4Y~ {z;'{L9ҥlF VUO6c,,0A/Uu-/`oVJ6ݲŒʹCN:6{g@_~@sx6gֶ=9\1׆AnD2=5e3VtlzkXt{ņR(^Pm]me?e!} _e6t x# 1tq E @G`)ez: 3-MIa q^IW'Y8d]Y^a2aMT=~l [',®hCfRͼIJyARҿ_P ӼuچֱuXM~]ZE]dV_Vi .˷2Wcdtc4g-J|g#Ǭ@G 3Lz棜aELL?GP.hJZ%&qEdЩ\%x{5t~w&iv _> :%>3Oc7R@N(X\g'yĭ(&?C{]xKNFL-g;ŸbNqwްcd`À{A- &5˞wl&jUW(\dGq JV%0o?i),W_}]Fm8[6ѬmbA&hX +X Nr-6Gct:`'貉vT84h\5<~*-B{u2,eW*SYTlK ^n,  :hF[̎B0ЄOK+\_꓉6~QAggLd] :3#V1|gʑzn~嗮vVMSEc er55`?~,03BvMzOZ?i:@4Px h*]0~XFqaK‹FKi#7Թ~pk@/Ҁ@WWxL)[^ư4EWa|<$y/ijrG/޺Ŀduf2^Ј`T3߆K(X"LªqpwE!J">opL$ZB2Nݽ98gxNz(:q0JhB}$tYr%{ ^¢xSoߩŊHmw:O'4TkV K>U~zz?݊8L[|>s0yϳȜ?v~7jZNps7$>iY 9n%p+/n_}jirpД|/_7~ݜvr.#{i4Uwx(vI'l]}vtWp rJ@C2W+>L+rBG`:4`S ѽ . }Iy3^H` QH Vhį LCo섆QV؂wR 5(P{K"[j<&NE@l 35+'b yhbZl }4m䚰S#.aNٙJ#pVxUf+|;j > p310ť7Tl3}K]%1..2W򍲍\uGig;q&%8b 7NJerZ9 eLH}^'G%CƲH;Fd3o!h4/2ģ:+ Us#=NWy 4q9vɢowѩCHDslV9Yy]#> 8_ڮ\Mfݶ oNE;`9輳^ LefCR*CJmG\譪1j5O/l˓7g"x01LbAHkKTNp0"FkѺRdNq?Oh!5Qq~ qw7<!nsq [ J *tDUilKRh?{ss~zWho76znc`Sokξ|> ~v!q!֧3;mXGk ]L.F٠glPӇhY̵YW!A41}l:u逍Gt+.~9RBOS%/ׇ /<:=Acy"Q.=c C:Qϸ(]a#ސVH#& mRezPnH[.n7л@/9b)hg,//Ƒ ڬi1`1 p)>bT(zbm ;`ϧ/N5PcmV\lED.7O&poo#OGߐ#MiUd^Ed8qB52;R) ú7t)ˇF`m Qʽ8CkɅi]{ERDG;!޴Bix y4FB}>e&}gn~ 0ہ(xRܴcXOb*N~HB7ȁLa8K+no-:4|)˸咦9@ [T+1 sxBM\6s:8qaSnyƔC-$}p9}Blqo3'$Otl6 AP'$eiГkT.Hy:p5BOou7u;YAw`,h^Spx 7 /m=how^x' .:awkp ~'ph&|?x~' DgO?f27*8sԡ@fXx.n[ J)R7[6 ]7,M1X6zCGu[]o73OSfL}#Ws6vLkǍu|3l1O;m̂^; n3SV^ȳ]~[@Ϭ", IɯW;ܧEa`NuaO-=WoyIC@3d| ?FB.E xՌfv83mVbpEO'0w]vaS]bЈ:/OGJ _ȆTizd69Y2xmQ%KJɯcwX˯+T98+3#$ȓC(EŧtdE/IeR :I-t}-v)ƢCp7M5Qw߁;0(uM"n+4w {`Tڇ\H{kKORk* ,"|^!qt>gz Å&MH="̬%rFeDԩu)-Ŕd0|y|* fn#w{T b(WqQ@Y[~ؗH-A1C:ǽ]'9AD]N {͖|^ޏ7f3s-k*Wn%{.B➤dxV7bl!c%qd$kNgP;Q_59Ḱ/~%2}gx_X~ȉύiVww,yZ,߀;D 'J8&R8NC癀4ϊAO|[\!쳘K'*WVFJRMJfaF5gB)eč!x%}= *e\zZ,]QFc/G~Ó~aY~x1e ѡ; 6fP#.Ŧ|";&,8όAoX%*$+oH*W76e.Lq4uST8n)cUQ:*@TXp8gGT(̣$+Vwh~a- Sf%Q"#LXAil\p Yk޻ kI\FZӛs_i^|y\טg߼k/A*qY֭@(%܀+8vA!74eK;l?60}3{8s{ɘ^nn%*qinr rke oO[2i{v9 tnHlDS>ı_p 6E2J X֦H](4(o\IV))/0B/%4gz*"U˕vmi0?x jpsڟ?UOSt)ԕwUD~85_=?mWFA8oS;;fB K#C-= vTOOl+ee|+վ5~pskڧ1lm,oyL<?nv9%4Cn R aHt/7M H-eR=I< nt0%_o#nu;pE Z=@ !daI1MxQ=$Dm;i1l0.@TNBܗ9"PXӲ/=(loO.dUmeɈKQR,$%xCw(HB4=/kkg .T7>}S4|O[.$J1ķ{tQ~}5xHÂ/ #hĕȴ ;'x/@ y@Z]n9Ciݲ_`th|8???M_@2-U!?RCsӷ|s^ Sڟ~(^y p\׿Z[oϧVvG>ަq74-4E#۠Z*ӶM;:k GB_uHB4>I7ndT!#k֜ٲ8wSF&r 9 9~e.BR4 %[ 3Jy[L ȅǧNNaîjf/Ww(X`Mn xh+Bf?#\a%_Ùvʼ4*k ݸ'L G{GO $Qw;b`0\.<>Fx!'n.r:`Y?es(wPTud}7<Ƙ y/AeW81X/`X+H '$x0§4T n`=Ÿlq^ -0/ܺĥ5ϐĩ!¼^qNC/G \sށl!db2x6Рo :J:‹Kldd 0D#㍘?YmÏ;j.{dZrJ{ \ {:;ܬċʚGhVv_ߑ- 0{g OoDN`_593ɁϤ b,K :o_r_nN՛7OH[y[V[maB;~--' 鎥qܠ{57[=f}J;Fp@'87t+&$64x ; +4WM→vČd&z1h' @;.L9- !,Z4~؁l4@|%Rs#-|bV8:i*Xʧa<f) 5?U)Y?xC;X ҏxۑFzqJ??Zbcgr*)P?;2HsDβONodx6(k cxVV0> 㕵nv:~l6\KnfL*pML< iRwt .wyOX/FELR*/im^蛌"P=9`TPb#GyMOFV8t6,]ğ1?}1})L̘N6өnlnh7}n MޅV[}Mo SApP p0z&!^Fe9,I݂ _&hU؊in7+XC؁Y2).?2?qW-Ld|ÇB^`ǻydh m}H.D(#]QX ߜmyV,ax =s{T7Uf~W|7&w}7W $9^~v}9 a`x_˙5p\p_t9`B440ϴ?7^]*Gրqnol^Æ-M9ihN(46ԞfK=;x GYF+]6peoDCXt͕zlDrgsDl1 Ӕ_o YGzݱŁvvU|O}G O v5AYsfBcfw._2NV2:?a{f90r断553v?}l_Κ+9pxe倃}͜/rhط]Mq{?֛-+O,[)mpyb_LpyM 4cw&&"2<8z;y`5d(yn$/(Yv#=eZq}I XHKEKF9Jg 0~`JRy¯?E! '@3fc-kC?5:yQݻ#1 6abu~waYg҆qsJ]ts;kh/Cac݅4tRi%z(f/S#z0K:`= qTqH;&5q2v;\xOӳ0dTʮ;[yT Ο xB<;TqIZ#vdܽL7OutIΗLtUjQdMWt3B_|%Oʥ :F/%SIT Xi %N҉~p ފ߈F@;¤/WCdTtM(˕f*1-~R"j*UؾBbhM pDO2!SJ8=6KD@[#j_nX>96QYI'Ӏ`FpRǥ `S[A~G{~Ip<˟޻q3l_Wln.K vn}L4WI\/i(6eW_ci-.h#f<ȯ)`b4* C [&6}ǁ~4vCL,RNW'6%QGE>t˖ޱ@2 sjL3t9ṕϘKg_6n<4X{8·͖n35F'(+TB_QYǦyc8^6h}.4hǩ.1Ŧ{\Vu1\rV&@>}O&{i|SJl*Qzw ׌}9 A6Lq/I 0') ۯ %RTp0(T/yƌ&r {N]1t 'YQ?saLp B+|#*ol U(/d[LS 3xDpTI#G|S ֯#ރR\Ϙ= j#Isy/1y_x:?TZ/}t/W1g*>ڊ4{:PԅU鮜aݧ蜽ˈKƾc!,䇄ByU'鳴NExtuMg1 J'aFLpӖgjE6-+*Cur#n`:ą栀OP’aC~ɟ`K1_4%QO .S$B1Cgx*P] X;_/_iRyQtۘu>{w&Ͷrw#u\'k4\y\׬p|Tal<@IDAT^ <<шHpf@-˵̬XmO۫ikƔ5p\p_9`bsoV4HCcc߯Ͽ=ݼA~{{0۵nWxv:oG't!nYo8Ms)U*XmܩuǨGPLmGaˊ;S۰N$O7f˨2^*E"FFD^> F5nބUi@'?}(Xĭ8-4xXMK̔bE ~ٵ ܾS$#0ˣ <3Bϕ!SUCvmyO:g)"тГ'޻|4K0r;u)ecFF2-!G}!e>\PO{,1_odEYo*Lp^$8TI5Qd:#OcgУGPэ-w&=5 q4-$YTgDQ$UBHau#Tcq֟KۺrH~BL>8 E$q@[4IC: ^WeeUGO / ku-{n{OdK-gi& /=fzWؒRaw ,!sOŘ0<Zm=SCݼqF j9ṕ//HtؠXyħx]Ǜ'm<kv[nY}] pk W2*uv\ߡ ޟ\D9w/\%m2%*;v)G;btmwE|:x >ЪP+n[zN^S^(B>*1ǧ=q2:be(@1Mt\/)&x-qnYEj0ѣ'#AuSAH8+(Yt)~q &@&KD,X7y)kޤxbxqKF x&m[gutiPkq< ތgsFcEn/{꺕7kq6QT ǽ(?2= -w ,=L98r-%wft upT\/ܮu$UNJZA Ri4y\_܄$ך(^qx/Ni"w=G'|蕬頬齘Eƀ"|Q?=%rɁm-P\+G774>Wrt;NX=1x45 K87G[~oެ^}ՁC'?2%j]s3&ѕ5tؠаFFq?ܼzƋfmt,w_h+vfoۑ-4;Wج>" _mUܘhkmOOf b_4.(^d ci]"ԫHaÚ?󰢄?%zIPz;ɧ"0 7 _J0^opn4PJ{fssE) 7M"J =6gh PX.0p}EړS.;[C- 2]iyчyG* yG8"Ȳ034h3bT^Y -/Tc Η?23qimY>?!ɭA qQt߁6vnO*!z 08U"}?V{6(=  Ta{D[Y%G0ʤl?0s%0۩pӷKD"CS)?.o0k,0zb=\!cU̥+wE8@<I'G_l⟁qT~^`2:]a7: 8.Sb{ i^ ODb%838~Ȓn ^ VKOa{Ƹ<ȏSL\Ÿz` zw/>뽧k=pSBm)K+Wo̥=]Qخ8b*Yv_s66?~f9@mcuN~__ڢS H' {v4iȘpeҴ6w44͘ri-%15n@Fw pޕܠ>vް="5s&/ˡ_,K_d!&ZP(餝tx ~A9FŦ7bq/t.S4I%de `PX),N~)w] I']f&L65C(.}k~嘁,Hwq橌t ᖐ?1,ʵT1Oؽ0}'W>cݨjmp;v0Bߢ'*(ܻALH Y3|yَSuKJ<aTdNQ#~ /Jgm˛rv1,g\Tiz/@G;S|FQFHޫޱpPcq#0ؠ6ٛYm _ C hNrujŝ]\|kIg!\HA-vBHƖWld5UaPZ椀>UW59es:eO4b P {7i77ߟh`q֦{:763mX  :lF?n?oQ{uji<=$/?_ KʲKO!#?( ƣbVzQq su쬳w9 m+Aӓ N- 7~}k;@J%MY\qfI6AL$.aƶ|^6My b49R)leu^3ce,6)ځlAGažP6L#x4qDuSn+MY[Os> d`KИB>֌V? av^/ >|x7Y='%v+VLV/E[v!fF,+_ʽdBtBekC^i4rɻe_b_6LvN(޼spDVjLCϋRf=8Iom=89'pe[},N(DBXeTk1aW59Er:E/)ؚ!i xցI$w)L{*nqy?JtGzJZl8{(krV~O+V`~\u#W{JF"O3wɔm$ؽӆ{Ϟ.hLčq 5>C\>C^Y"rZNGŇFGf9pmIi,CWοu}Y7za1FWr_L=H)l՝XeP=Y1U )x )t K9TӮLVt{rv-vN13W(ol$ *dc# dEr =Q,Nǰ٠BmV~#buϤS'2 % [W!K"ZM !<~?N7Έ\"CtVCiq_ y|H%NWW]`*$hZYJ&Ls8`k4*ڣRY>kG}"\xy ]~cDDnC$2ԛ:nu5i^ʛ4Rpni{>e.NԻ{as%[(9%MaH/uwbp=w0/SAŭl9UCz߱Na$ u5#Z9,D1IfWԶvD%D. b*FHT4,&4J( Ջ4PRxg$ }Dfz/eJ0GIg!H@1U޳ft(>-=:%!ХNX.}Wv%6ӈ!P9G8x+1 Zyڴ'E;2wJ>ݦT1Ga0;Rl"he 2~rKZ""&E2 3gK'(tt[3HִexyPv1&i27[noMN6/ r%',ŭ{ܼ}?WvrTwp s{;أNpZLbJHďB~p|3?*ݫ1}6\WaZO}=% +0qf 4 t]ђaq`ǟN^]ԄLxUểLQ#E`K \Kq`pWЖqfPpOl3affJ!rUS@}cx1$ox;m|.p `46]9 s&52Xьֳ >Z\yúk@uPLj#,8H+fg%>7}o&ޏ3oG_ #49е5~ 9`gn` ohޜƓoo_Vo OkԷ4n}Dz7k9ѮѼҶKAFHߕ-s(h4nAm휶 $Su;\F5tTOIR D NWWc'UH}Ȏh%S2c7E< ƮO=ơ"H3d <#BSt*!ePUqu@zz'*T`D)6Gv_om]vBe߫=/Ci!H|*4˛zXȲ$ O:Vl JL|@$LM]1H}D䝱 [F __4R+A#mt*n a o_+&Rqi(bH?_aYժLYYT,s](#b1:~xĨ?q-8{'w|wlpҝ2)!cKOHg r>}uB+[NGvQgK<}Y`~V[V1*  Y}*VwBl]hG86` o󌰈*[/h #,S\y[r K> 2$C$!kҍ-(1\&]6 /vI |9,db5*p Ea#A[Oш״@3pϯX3omZ ƒ|cxg#7#CO: Bg:fR|ݳ쎁eSLsN҉[pf|}isǷ^RR:$p:sͫ?x? fzJaL|BcGeպ5~T\~T]sVp裷D?0?sְͫv;&p,0Jzu14hBm9Z0hh)YGj|[顥2>Jx݈mчϱ}RQv(T2KYrNw7"?ORXa#pnv)C)U!cEN- S 0G5J;fIݴ8_7褅KQFc3 UƃbD5Vp"2 G)U¡՛ C`SA˖A}a_2EQe ÊMy{+ʼa}u[3Jv\/|cGr]IӎL98<7 9V@1a DajGvq-Ǡ}C˴?ٸرЀC=g`{F|8;ki"cBƱ`M K>e=f.R=1Ҽ} ؜]|G)}|[sR|s0sRO{)VqK x$nzhF6o35nw0nqȑT!I:7?M `gT{3XX{ ["YV͇Y.q $F7mK\9ṕ΁Gg51\gʟolnf:ڬ ry *ۑtkb.tiG h+YG74K=4=6y_]cs.aq @52µP"lA쨢qd |v+G;vkw1Goπuu_sɁ{2 K4.qqްi{J;Ttّ)ܞM9 >Cק ݌iK]ÃECDoWG醞'E/;܅'., }Pz# Uv~;.s$ E(!rQ=Sf­~8{zDBuPTS C ;! LTc U,Dn&nH ΃Ci](Zr2!+124+XMDUV9 h1K\|")؇H'Ă<Qq|'OG*F/Uv9/BZg;>Y{)C~X*T3)./L]Dū>:iz}ZrE3Oh"{JDI/{blFY}\%Cʮ^݋xm6;a{@PI">6!q. ww&i->Œ]gJeLf6ă=TFi<Tgf)yψk\s`9r^s8߽:߳0\@jxpx r0ơ{f-G |ذY֭WLhF>^h[,fh LjWԛ!\MXw$Ј32ESo=܅b^]',"nW'fN&sAwC@gC%#Jv<s;}J.uW: V^w@hF1{&{ETTTN{:g<*rv<`CԟX)X9 (;2gŵቤ@`'ZsP :(|5 TtA`P 5Ga{c1=Z < %ФI> Vq?KT#kiu>EQ:b% &҃ 4pPpE-Ó`c(e]F0qW̒s0XbyڱT0xĻCeS'.>^HӞW)Ye:7HSz\ a{R, .. ^c8Lqei,0VES5C/[;fUb߈j> [x2j FY|^ں cMOp-xz(P~Wqc6ŨGp@2ɾqfgY z{:>pe=g2iw g2Eb| |9ṕ́ԕW6(+~oOz{qSʘ|ewx&\h!1wigdKo`6cOMg,ct=@lTwHh ڼ%`Gi%Bh6B殌k/^ NK#|MfԆoeh ,Ƀ_Oc{+/`$+;R⢤WZ)aFPbJ3otp' }k1UYlɹJ! 'Qgצ!(IJJby,T8#Q(' QzBi$8iN,4Oe ;rt ؛!" 2VLR<4exNCMW*DFi2{n"AE<}Bg3Kt&@%|qQYqX5FQ(sPIwPƃU.wK.Aq䪿}&)Bc"zɘFp :sR▋*8N옄Off0j`e]wƐj'*hcel}3BX7oJC}0o™m' >he@kt[͜rsď7Ğbd{.Ӗsśc4W8ɃK 9*!n`h˫ R FQKU <,pD[]k5;-@{:#?4'し=[ w㞓Z&>nX1 my|kW)菾}\9ṕ٫5f9`Bctsӟ=߯F K~-sX1}mMvim6=Qwu’wNz vΎZݑfwtM`t/$Qk|nm˧N֋ V3Xb##a BwX T4@2u=& D{0\D~7[KX<\j"фYnqt>/eNyx:z@t-e>qsaw'%Ƣ;P!۹SB ?ï* Z[/~FG{Bڄr)DU=9b<#s2US-cZ.CFzzn2g"X FBI-/}K(nªR?DZ24ޟ$WcZ>;a[Pnjف" |p7BRWa`Qw<=rWWtϩiI~$ߡ]% 52x9P1|\=çTF\GTO'xK@hLap=J*㧾"Qr=TZ [@DEEG)a0:0v :2d[lu6h:b7/|R_y}ȟ.H9-H>.D3]z23t|087]DE, q$.QF,:D-~-Y4P,!fAOi2l;:>@--elcWWxG{ް=ee>Dqϸ+ q,`Mi*D;7o;fo\ݻ#3(;F)ۛo2-b|hN]~u9PG3?hr.ཊ>a{sKCE+u~|KX'hn.#{oc- 8֗p0!>6`NM5tN"LqT,4|}~KMEl3>aL(2_5a7KS%iє-,L<Yny`U^`:71yM-2hXEtUTd0exP 8@ux;g̍ _<%OqJY~g ,t'qFt<2 P gبlYY>yCj8C& ¥uhaІ$,e$z`D*xH:3#Qt)dR1w'l,KIJi^~*TGs('g`~ML|"RO?1wsd-Ϸp.:TU UͨGAᷞ;3IfӔs E"/xq`(smDMAK1{#%S+pL~IH`eF,iς!XA8[v#,.f!^%Ϫ&Wi0V hVb>+kHAE[9wwyΗw|rm Ƅ܎2/A;zs^ i.,c h64w{NM'{b閑3uE4}/.ޘ2av/]ڳ(wEab0 2![ p!(цvNHl#\ϻwJrC%}lRGkWht;񝖠>|4bE]mp7/q񉫒X)F]2Ȯ\_娤j/:6F Hq] aӱA>]W59a9PݺR]sWD#E?1rvAG^G.Φ\vzy;RVWs iB`?S`qZ!(sGOC/oPsOKzXͤzE5dnE53vb4+z-ӝZ6hHfs`%! N[GIb2 Lm++qrql}mĮPa@JvJ[GtG<ԧ|0 ?L H B d; }ut0Wa6cHO:ƒ?#R]5Y $| ,62Kg$xۖc?0W O[4Qv]`GܝJu*Qy?#E#:\UoKYr_Oէ@DiZn}f6e*6L='mqi |+oUH?'R>TRK^̫KG{=R]t:<:_HZ3`c{o2?g}&:x#[cTOv&Mt gBƦ 垝fg,d/}'|ni6wt`/bI~!q-WK9s_s#s5;Vao(<4_qn>=Ҿ=bFK21Mli F-g4pǏh-F'p_ p5tR.K3/K,ጻd52*E{\_Oṗ훵 ;r\T&:1DfOViU-{t 5# ;iY:n cS FHa7FA@ U⯜:ґʿ~s | IE^^rȟU2 ^`ʍ3f8rTc/?Uݿ/,+mtWkpӎB=2[}KeM%w)< pMˁ3FhnX\:6-ާ'V=2gaYksǧvg2^44[>tC;O?D{W")M~ro% *zCNdDev(!CR| @Zc@NcøK&X8)r KCю.g `fۡrAR d Q*VpK 3qmj[}AG2ZqgIhB)`S"6(D;/|I'vA5K^?K(bն,ozС/pz 4?[JP \{ag3I1Z|lwVǍ6Gnrrl?1mNony'|ǡy8+'o`FI Dzd5=cfxpy7;*'TIïk\s\5>.>==qvکziT5L a{ y<6՚-G7Z-;GkUpM3#7w.@x!t}\"].!ή~4IRIӰK1y!T""ntiE],KsqRB+uwQ)ѷR0叱aweyugQ@)jA4NÕOwIvKX GL T) zhhx2 r8O΀s=e`^~p49.BC LbTFcz@4L u"{9\>U{Bo:*1G&#W='NglL~ฅ8CP頣ATc` (|~3Ǯn^A<0}2r~ ڀN)[+>X?I+ 6=Ψ 5*!.x3gɌ8G>J-ZqwWCU\cGܭ{^/BL ^!/  ;_ՁBn-"*3P dY*|Afo$Iɕb4iI]snb" J=7AF+MgjA"c$zߝ &ĖwJc@^>5c9ṕ9`Qov~-m7{ֽE=;>oѺrE_syڱ+zܞM+hz.Ke3m<Ҋ"l038V 7P?\!<`ӎu ^gݜ| V0e2 [? |①`ظNPL2TlJN1|G;AkE$fO{fУ b-$41ρ軄qC3ߪsD %l32ଷάz=Cq142 G4=oTj*%q W e׳ ʢkoq;H0e{"Vda4xXЀ}9FDv0x '}V2w֑jh~ӑ?}{\DKDQpG( ~4ߓLe݅E{Fbb-r? >GpC5/oVx;e#Kْ\"9K ^'ܢ2u[HyLjy.d@Ei&@<gs bt,,S2ځX%uX|*3c! gsUe!΋FyrY? 8K;i%"8hx:x xdha<- .N=t[!E򋐘*(O3>s5eM1#x-$+3m{xϬaY =/hZD]k|>6|,1Mq營27B/xGcFZvOn/+'=\![$^߿}SqɃ!u&?~7gr$ś_{_{~\́ӿۿmQN7^o~Exmh Wx^޸;ڀT+X]3k{G?R蠵T(`k{'.L?cɀ u ;D b A(bpλb/xIl)WCi:LN1N!,#Ш5ۭHePQyJcuVu@]x3_<èxw?76!e۩^p֢x3m&`'~r?WM8dwq76£+P\!dFÇBbO=ce_J Dg]+"C `t zD[_Ca 4PK>FoV&FLO\"{ߓ "qtūWbĎ/ᝁw?_4\W \5fp^&l ~oXl޲Czl6^i=px`o:&M{6p*usV.3@A3J{U(…}'l "\M@!:>pQ, |џ'`/'H4/ H`_*R"1v~Jf^:"Ө-Fv+;X.kػa,\#W ,p oپR "k) |(>{d^݁pS#Տ_@xG459,;a1PIgY=0441bzZMQ".'[V OWEmʅI 5W89ᛱB:4ZJRid C{ň* h ?'z_s8UڷlL|Ι3_QM LKWI<0p`2 +N XJ ltP.m@dg֭rؖbwxMHz͜9{ fրFg7%kXOHNsvArbH#?:O!$Љ~&^DԉdLI·”Z4]'/)*~"!\Ow3'rnxNv[3 hbEt>esc`c֫vA|hDŽbf x#'c>7~p^H;N2cJlk)ȃ=XLqS'RؕU.X ŹjԀ5 \# b{l|ޮV7վ;8zkl}d|bf]tvUkutt$a;@ݘ.I%gCGzYh34)@++?9bX᎖5ӻ !>ۅuK)ɾi!^]U5#\..2RD3b&W"0rgv q4[vh$/Lorn%.܋}pWF}W ΢{15 s{f<ƽ?' :D%pV`K.N]{Q8W.#F€$4}]{yw A3LBY#׏ O)./{qK:p".rB4LO?A'=E'aS{ '܏I38xi ư IK2}M~=d݉ĿdO} 'KC< xv!H^r+w&Kvwqd<:MpS550`~=Ociߋ䘯+إS9.b>!'"}-q/NȗpC^S6=P 7|H LE[n$԰p5kn S6KoE3;T8un,I*2]P3s{:gphY >nX,Űm;n| Z9#>z>9c23=qi/щ! `՛^*=U& K\\Μ?q٫Hqdrf'\E L4}##eKX#ޫ:t?օ~9OV!ePk4ZLsi 鄐m?ge] TC#|uEMK':4–qaS~S@hUgڽH=N-[$vkW#R&mfI \= 2YjM"*A>Q9ZiF; 0@{SaB8'Q[.M[LC<]]Oyop-)1nv~ #Ն[ GTot2 wιto& 9HPj2W|͠9 h[F]LW\Oh,LëX +CƚA`;sWE|Աg/2 2_Q6UW'Kk2{ ތr;=(O8) \N3aZdPmEP9)0Xϓl ?gR7d _GS5tY-[>5,mh0K/L)mi.F 9/\-99d' #3Ih _M_,x[dc$p{%iLzbE;0@rU8"proN_!: 8MZc?>:T^~H~lg+1u3al_ Ճp}X?r|r^3Ƈ;r &@2w7{:=o}s=uNXfXsjuki k7||82 _x^qsq@稯o>;oWf &оb5t5te_Hn#|3(?Ireέaq) Tb<6fPbtFA=`DCCK ԉyEZklaЗ&3vl~󇱟 ;_yx|bf~0zW N?ܴضڅ,nVpۮ_hF~cN,H&e FװZSywM6̣+@ie"G}/ $mfFz̄9ͣ򚳚!ː^vUs.9"L,tD'ICMuN=(4И79TS.X֦KT`$=TM0yCAշ"xT &YF߀ld>Sa G1׾Bzگ$y5r=JO\>U|vK?t3Kģvu؃oa k@7 z-U856;~mD3ܳEn'Ye{ey{{~sy@[;EF~F ;v>ϫ}2 9%OcIAԩ3)1 jݙ¡k;ư#ky1ǔ N ]D%!UJM蛗 9.G U{*`!? YIqq$I<ʯr4 F._߻jƬSD!hwG8L%&'E9"L M Dwn@Qm ]?0q |C!V ^..W}xgr< QV3h&N3Yvu킰ܺzNm4cGS^λ=.NyZ*{Iʣ;ϪѯέVko`'>\0qn&(raMY^Wx?a?c"$mTY rم"2eD_M\p2.Q1ШM1 q L[Ɋ6&ԝʀV==$;a{KcMȣH֥mҰpmN'v3PoΠ*~%C!D7tp$v5*%i x/OQRR pt"'@"fLGq ]@CF0nEδ+=37j`BM SCKRn'3q y1CoUs. [/q;cv(=zo2~oq0u"Sk)t$GwG 3{ ?1?a71?f{v>?#a\ef# "N*ooƟl$mt<W |N|{-^v,tW_w?5F_ˁ{gp[F.k8,;0fᜯ1.:Z. 2pВN bp!Pč QNr(}gc2/o'"˞ Rt<Μ $'3Ia seIX\MXA |;GtvZY,YA)؝J7q$L07{vYNht=-5$(-V& L z&Dsi>aP\,:s Lghj㪒5"4ToOX.F06l#7iM33jz]4/MӀcxMS//2't ; I#юӮ/[~p%:_Df4/*EHsB Y<4xll' G~("b?\b|rl57(K5rN F vvm Pc~Vf*.KRnY_> 84@wɴg~?y}OoLau_Zzb[sU~7c6{p, f؉Nj?Q<9g[KU frrou iL '.L0`xҠ2gZ ΕfOΝr8X?Ӷ,|aDru(ߴ͖1`&B&::6T3QP"XT)55@Լꇴ9a\Fvd#U^aԩ', 'nY4#'q#}?gs?;}YeL|`)Al.<$n\b" .|r:m8 a$ۤb+"eP;ùOW0A={3m3aar#V|+#OUtzhȟllD-J%^]:,@G`R' W{ojdR.s&H*b>u>uweO N%M5:#[8ӕ cs*71:|Fم՚]Xq1f0~WYRjઁ)\5wnf˂5 jkG{:;ZOh_uq&љ+gܝuX{~,ف:LaT(I G'܈4W:*\|~)߼KΞ('sH2ϩO!53828*fw3F5 R=ޢy-c^#-NmԆAN18s Ha[v1:aJM{K?gQՕjf6D7D>>"}f!;qW;*)!Ʋ5:mKh;>H<3ܔYZ`-e"d񑍈on^=*qp+u u.'W@o5RWufAONXPNEW'GfLcM&~? Qm'+rHVuAI~ }ٙth@':<KAim#{/&7_ nLo8 p 3F \1ϕZ\Χ@'0Vi*-p`̯7E2 ~ *O{/$]cl_QʒaF?f튬sF,x_őqq, q[#}GvGG|vO~a'mY%R\W |N|ε-/rO#&$]ű Nlٽ]rTwz<_U>9䮌?:;5 (]?1AWxX]E:h&]4xl . +1x{P op9jDS}˰)~VXf]ʎ] ZLỪ0>Y P;7kA&rrrFhh%-. i?A{lFg9R=5uoVi/y T-O/}A Y91y.3..N9Ɩ/zvI>27l#Dcfγʷ"mn˫> urX߄o7_kl{wb6 ^a{]5pB Bѫ~I h ;8pl|qyuV>zGVðb4/GMLݲz.1QRyi+^+?ԥg0/~P( MF jx\QF#4|cNC=_Np"lf~nQl GA&ƞ]tm€!=g>8z[ 0Ϙ0Fzx^VVb895/LݱތFYWP {] M}b2@kF?Lv9E^9!a8&r-7}<0?1 Sx7=6D9>ć MxC=h3ٌ,in46ukZǩa,6P"DבFUݔS?'`щx+ Fލ2>^ϧ%0,m/:)g4ϥv5hWDr6xx/<@tCj紶'l\㑺?7ȈIb>LN<(=@ΛKM')Uf #_Wٮ4W_:Ng/;¢g;>:C~fr Q# jR,,z*nHe`&y̦APk.-$)GdF 1]/)P0{ 8 / -8A! .Q |r{5?:@XI Hy~ oޡAa/{dr й[#t0J LI+2 pӑh6K#P!a$t$n+Gf)r`/d򐎺4[V\^,B׆G6hZSQވ,XҶWS⍹!Eoݜx>z8IMc6㧙 1:aeh%X!| l^FM B4;&(/J);m^ p ~sR_ƅPϨ 4 JqA&T=£)]ψKC=נ4 a 7h-ۯ 4{^ߥs`dI?r ] + [^wH}O C ?P |5p|Z%|#jʧѾ 7v`w~ޒʼn7>^cY"KYOgM?kv9uKo }Rsy7Tmw얉;ՆnnKA%Ժy7>u0DZ rN!9`sw܊Mh$Eh_8.v>; <_JUlbyëodvSl۵)iIan1xikb<אr2@_gG>LV+"bGҡ$#eg?zBityru nҞEzܝspC`F皨rcx"J,z1BAgz@p)_˳]Awr8^Lj !S*$iӴv=0tD8x:/jsgx[t3gFY\^`þQ$nr.,^H=QL3-L7ad^!=9Z0jBY3.Ș`OMR y"󸲘0ФuFAڇe@jA56=Ȋg#FWpj^Vgn&@J>;XC݆pv8W6w1Bw SL`9Y3y`-s\Z&eM CN7L8 pbW]Bbgk/]v< xC|>>Ton87g9r껮1"ww{G&zi2Aw=' ȟr)hnN4{M_Q%{. |p%4aNI$,w׎嶍dvx]}T 3Dp Ƅ폶Ĕe1@zSF-hBM-(s]My;RYccllpt<y3+ Ȁ&]/yMu\k Tߌ*h-S9'߼Qtc) E]п4STp Oi~da5:d3Ce렑hNc1|V0$ Qb*0":GԏO,\ C(R=]Ź|և)zϹG-MH#3|#ݓR wlپ>4pZ_{zӟ@wyܱ6o{:ӥ1F}q{C'·w;'IC7ZGK"4*+}{=IC׀9?Gs >u !&onbH4'0#ه!P}&zi {TG#S/1~AYg㉇'$6mG|0۰3atTFXVaL lA[k -tYUf}xk3WmyI0xe ^M]#L:wOw2@L1+SIǐ5<3kZay:`9e×gbΥ᭡n;.eMn~ Y91ɳL[v} ~6d4ցL(t[VڤSiTpxc-I0꟯DlscTmBȶ>l_vu{{_8Ey~1Od~Y*iݝqn[^IxIwKNySςbU0j4fXIWJ1眵+EӘwĔn :a MRWH Go`I3sȌ3\LTd \,{郌?.m+]2_26]#@IDAT_iX7T\۴ki7}~E~|bF:BlAs_s6 ȻKWO6 0l C{uW |Ge񯅾jo;a`'/j,YaancFil嚁C?_Vp=]ե[85OiQ: hkቑ;\IJx_AoG YPYdh;`]VNN8f{M|{.O%SK4%\7}Lrۨ-jX]9F.vgZ@u n0=psaG1af6M[2pA9V 0f"n`͖t@6nC7O^{ S6̔c;;g>y5  ^͟+|-aȢ+8PLWE_V:-I;Q#00q)1.Fƿƾ^v`XLWԩ?]%.6D読{(7a^1frcNx'_>W4pN $Wv_>=ݜt5sŻG> \߯18,Glc[jaQ< K֠h(\zy .kMh^phG¢o 'BƝI1u^ i/6G;9f?3,Ø`Òրw+&n& yrLyO+Ӧ4qA1 kKj_/ӂ^#F5œ АVX}ڌ`pi+nېV HޙPƸwAD#x¿Ge}{bw,,o]{ _>}hī4dBtL@t,C\z?aJ)GlOôomڃt}MY5i[tD'7'+`۰HKG Q"uE}̺\%l*` > `#n"J^*;4kK 3O7dRRqKx+'h`K0VEJP)AL[Vy&Rf<=09rl>؁}%|L06(4KEReRp2ocp $v=a/8jD%1OEb90:6f"鲝l&y 7;$K̈0AV6 x/SZfb 8 ,"dakD V4"a}q^#, ̘L&h~ǰ$<̄UY'UZGA1UA${[[fB2vrɧ`Q|~'a@K't2zL"]_+@qJ4hclֹJ'J_FiܪA %τ#Β5n>q fW~2X۲c| b9ꦸ(,bv)Ux ӒV\ w[g;e2!53iàgXxکOzXפ1@b#; 9)rkG,k8 yi?Sls]*U°_7_}qЗΏ_~{ߤ{Zv[NmbI߉o1BCqA‘= G“)R"3随HtҥtJ q[CpiՌi$zO'KI \E$HLQ슳b`S(X}U1^<5ɀoЕXI#=H8FBTn|[V1CvWo|-wV0RٖOZֈK@` GޙB,Vi~JfC+E y/3mU_0V w?>&.[)yB} [mSPAIFOΟ-}0>yXY.pu DSnRvw~@glyv3c. M{jESɝQi>GǪpK{osb|@jys͸"E3:c&R'-;y,C'K dkɢ;.]~Rw#@O6 -^ N֟﮽"ϺK^—ZQ pM./ᖴg13d|3"Fk[/%~A?UpsUW *5p?޾{7&~>p}X?0ܱ~{X=00KWȇ|a|>pewlo^clWoIt5}ocefnb#\AՠDj!B] M9nH=#'2QHWW pTok([f+rg'gLUw7woǚ0=rrL͓tr@O}rEY0Y:02 N[4eDwiKO-'l_5 sHY6'#,8jh`:.|_p J[W)oHomI`#α6$o+h^OTʓF:2gQ8?U(R,æ!~M8 i3Avi1_@ dԝ#ٵmy >ȉpCg"z%Bd@??~$]3<$IiS ]n- i)T3c=%?hiG,Ľ 2 W -Xu'g׃F_Iûvp9iGeG\ '1KąTE420 <*0A 7hkyyG_H&CV<%3(fȏ8:A;qvKijͫݚOV))ꋇ4O :<XTT+[G|ϛ;C,[qR2/=Y_nùJǛ?IɄhƯF=gSkAj7xso3Nkc;sc}G'Qx_*=+_jw{R\5雱|w[ G90$WlxE U>k z.C~[CRJ%s (3҉]-Ơ6pJrp& ]5(#;hBMnp|[+..)(c,}$ViFܺAǕP11]Ihco1``Fz)ǥiQ*v2;ƞ >EA[fA!GIw^|0 #^6`J*˰V,W*k& \w@~v8v*eO;w@N]Fwqgz##68:F/g=vNRw2IŊ;Gtt ۂ3m$kNTURuye&zM2 aUSt@%hJiCP=oYJ܅$j)_cGf6{xR[,! 0itrmcv>z;EϤPY]`UBY@O"ߘ"D]6ehAEwS| B 95Lv hBCMيak5҅b4cœ}nv6!DŽ*+s_̤<+dlف7AxF&;ؾL@p_nKyj9zzjuWr>K \'>j׮a@QǞ?)?񏏿#7v~[¿}C̎=u:2%gim<ϸ2at0ǟAt#X"D12 0lo{&ޫ+`N I}0+" ʠF^.4ֿe]M\2Ʋ+!m7,Ld5# -L&%( B'Ij.ײL%7 ޳ps@̌54Z1y4#}3&aF:Z4xdBHYykVx̦d7g%\y ϡR,B\|ou=5;pd OK|vVD#R^[yVNљkAPշMcWSL8\҈-0)l*f&8 {w,G_eP:yJ8|MW*Ľj$7я7LUI}'DF}wcgy)jL jOItqze̋2_1-v |MtN/rҙ9@90jVd86rB$n2 Y@]~-8 :@'= &ġLtnKB7m/)m$e>}tt̩rj;Qk-SM.֜gDb^rb_OeBLP/iG؜Тj|,ܒWgրSσr~8,al>YvǺ3wtEl}dׁ pB;N ֜DCA('m}|~p.,|Mx TLYy,rh`jch~sBhy/+pWJY܏v@\cЏFNJp >%2*S/-M]痋߶4N;42hB+4#NgQT0:iek]6JtzMHv1MM)jrgq ,WQ2>8'NU"q_He5C9_V?>!?&?y00 <mAqKqFzq/.G# L ־e\v? 3<6aҟ1mA54P'RP|Z2-lkPl9rh>|i#-f3(W Fm*6:]FnhJ\q6 ~ۨDQVׁTb;-kQHz,V=PҘRJ0k䗐mcl Z4s(c{V(gw礱ϕT"71xp-GfY>r?>z7-gysu{_PJuE\5i:U@ ~;/VȰ.n{C1A`vǜ[V;^b{j]7(O>%x;՜w=YѵrӶ,g ? ucBH,*2<ӨCJ{'dV\Y w)-" 2l+e֭=ؖjr6D>ʟ]snȴ -/8c/b1QD{Y{ R_ bt['mHkYc2a'bR I d6k6(aBg ж+{[d@3OJ^.,Yf秦լӹ ĔIDŽ~ {,D P#<1KxxHDә]lo_S .&_Ɨ|hO4FTxlZqD\tH&)YWᙢ4)94hbJa*f=/4 w¶vZ J6qkOZ`6GJ% ]TJ Ǝ$ƿIfͫ ŝiE_pm: @^Cp'1bsb^w^!zGtB_]s v{dS`ÅqYԓ%W"{r\Ai췝4h@>H~L:,4>QaE{m=^ingExS'j(c) !5#6Z80qb3.@IzWLc /' (2 }x o)̑iO3A4>uK'_S /jt~}?RLd@V[@Iiah2r*Q 6NMi&got pdbOB~"/˫ѯ4 G' F֦lT ^8 Jj]vln(qJq\7I֡kÓN&.FUQV`)hJ1oCncە;mXp@X4"a?oLܞ\YVy؉oO("6tnb?siZ)SkZ^EUYМs^ MHp:YP#MOvs 11HTq: 3^ (e^$m5bByB@Oy̡' i_Ρļ``ի9.xr@Z, ' T'_,YI)0>?.]JXPg٠3pR !qQ76SB*Lpr‹zK+,ttj+_OZ[3nd9{V8}xyͭaiHg {<{5T9l7 HF #raũGP>;9+_U__Kh }8Gk{&vL߽{G?~zJ`&n'V[9цϖiDkbγӹ2dg&Xp@.AS^qdEz)O 4y vu"m7E MO02xZvHJPF,y찻撳( ,n'Sjv+ HݐQة^Mxe'mĺNRr@|'e& a gH!kႩ+N%8w?g7MC#!I #Xuסq2S#$sw2W53&fY-h+ƿ?Yԃz|5֌{h#akW7ta-|פ>gRs ՞rP]){ei%Q'˴FXю%5Qw &|;!#s-Jk6 hG/z( D>oJ>򯟇VΗ 3p<2oLY͵qAduvjO>J+U^^Ki8` .QwsY~wL?r [I5?H)'1;bf/v%w1.:߁\/wTZ3酗}f%a&>EH__(1mdPA'ZS)?{]F2ڄ4X.4 5lEiB%5 `0ej+!hC@oG(+Ѩ {v'WƷ0?mmGIMڑ ?[2X h~eGڏe߇ҽ\,{Sf=.ɩ;Hwr3%X?vkxÎ_q13e`'MU2y))-v ̢z[*t|'9 Ϟ#5UHE^qBB 3tcDЍls=-1#ѣ=vl/l~R!kL.H1ڼĴt؃Om)J 8,q(~"DvzF̕ڌ4աcZY'sw9=;ceܲ&ec%~ڋx0o$GOȤ<$re"Lz4~[ωI\Ƽ;@&Gpe)4no~yO:WF6b19W$3UbEF0&N0|V3%:omډad{O8Z@vWrJ_d-4^ЍH#[с-i'Ң?0\_|._J`$~/@6νLDsjLcD3rJBp]Jat).~_qc\#=1:'67q9i@'De%; "ʑ fcrji`9媁>! `itb`zzV[ n$ց'6<эrX:[3qO{m>?]J &ӏ}ّ=A'IK g ]J^?% Wa9pmQć-0uӰkV'rk2b2@ٷuK^+Cr3q@7J~7KiX7km"闹0H垰q{e-_XDhػ?_p= ̗ b/=8ǝ@q&Kʫ^SA|cM&Z$Z=&p`#|XЋG_Esw{QF~:D! Km+ >~e*dDuadp,&/Bd/)Z"eUMz V~m/O_`XʷWډ~zs KfHEq< :BTPmЏK B##EqӖyngt6|0ew|zz|@f]o i}|?>+U]UW |"|4G<|w0T`/"g?nwECSp{Ym^D[~&hx>01f[o/ھ[첼2tg/Swc-rd@f4+GPl/CU%<㎤@F%CN9BhӪu;/%`%X^՝Pԇkh /!&5 uX/;^JD@ qO)irs'; "qu dDFb- |2 s@h)O0J>?{ 1}o߯nC 74S|Y|`863;eI2۾UmcdM*g@Ktu&= ][D.Ǐ0ܜN]WkC8UvOxt&Mi|mv\B@DȢLNjG*@hhi`ކ xTޤ9ɠT\e+XBEsn=AW9Q^*˜oAΧPg7tMK|\{t9)X*\vW4$lo=~ )\z2&d&x{<{IٳqGuk[ys|xIWwggZb8~W`Avӣ 6X6िo?p=] Okj Xta.ۍzҮ_Fxc8hs'j 2qp#z0exZ9氍Bem6 MKMh͕rBN 'Ih,hh'wwq'l^a0{߼}ws,$-5q hPh@\hEP=8ClW"X9|r񒎓c,.A"&eGW0oېiuX*mȢ5l.H`-?UcTQ{nzII\2%7r[⃫F*,agܽB7Vx[ܧJҙ:-Uj[AaHU]N4\Ϡ} +\_rc9?g4whcN22`xQ~n L@ݧ&&"2q('ooO_TIzDKr 귅oI|3~j(,- >\F٧JGeDKmb}X4x93`B= ^sw_5ii7i9>sM$őh#3~ 2uymLFPӤnTH kn Á<'<]m>XMF8q7kgO5;wg#-@ 3Zqgk+:PV喻Uv i4#c`:w`ވr4U+@dn;U58H"`5R(.fx㬅T ]꒡uS*U:"P2YriSP#-WGA*Z#@B$#6:̂dh NuuHCtܵ f (iƈ>-&ѤTץ`R= $'VSJ# UkCR &YN. WY`RnK^Ys,u .!T{S^ˆR*̸ɝ O ; 8EY,L9A8“xk 0cW Ht]g!fFc[{\[um} іʀ^.2Pۜf|r>C>7@"f_DeOſW_iM@w,|'Pw;tg7t.dOn#d=鞭纯qWBR ^uɀ8ZYk蓡Wc7 @\DQ/Z&-;/"=Gy.#KpW&3Xv>ẁйi%׃)B4Z:qDCF5l9M b׭%65ƴV鼎cA 'p/u!Th-7&ъ0)[=gBob[3O.aIOR ۳͹\l5Pov QK|h܊qai;Ɠ >rb!/'pYŷ^f쁿mEV-[7{O1MU[-G,{+RLޯ= XX۪zg&F3v0uT)8&\de}@ WUEPpnTIDQVõ2~:sLO) PB%juu{|oHYg <%)sg^-;|k"9uI<0*w6N1xNEz_z¯pY֓ϼ3T<.u6DD6ٱ(\.6q@X_3l?GB|@"p6M0=r@XQLP j'[Bm೘ސ(۟aW>gP\R!R.atE/$CBP,U8\e'TFX7 I[#(,6&aqm[ >l R ֹ.y9UxjZfNfLz`t͌=7ZHg( /aV݅ywdQxo;ay9/iڹpSF"ϥșmHM# # aZU/ŸQBz0SA83B'r rMEXB]9B*#Rv-Ce_5DGV渢Wӿګ΢ƕ^%`:=0 IswњJ<6rQ:lXreԳ<0ѹ=^;&%I8:;tgg;mP SBYK.ZW}Ft+Xcȟw70h/ x\/^[B+jTH`ZG Kd 5nPe4;7qLɄ-J}]}*Ec S&f23<ògX-1ltM\K)!㹹9.OkyDaaY}SBI[>͖^ő|[1k]Nܬ+\4 O⫌ᷩyk@7 Xl*{L':j'K#׮]Q|z!&"EI:JzQ|I&z ^5v!@-'] xtF('󊒭A|JQ"bz< Ǟrf-2J5Rg9 d!ϰblv&K=q&*j*_A{D]rcr1'+J7[`O:eV} cn_FL2 <בsTGF4 Aa Ҙnwc8?͆bt :C5XD 9-7 R7),p?\cmO|;^KnȎ}NO~w:l|N,C/'S\nd{sgT{X_g':b h VwscѝS0?Jnw+I'\KY @Zg:l7\muh ̒qrdƹ1@$;a l}#^X{qW'_erf~6(m=53@mXVe'GPxA9Ph^('yTP*cYaUZ *|XolC׮::VG-8F`E z׍*ɯAq /e}{K}3!Okn [>A*{N6(P3@ i(ȼ  :9Y EɄBdFeq APp[Is=ՔBȌvNއFDO+( vjw{"KIVw'>7zdN {<ff\8Ejp#C_d~xszEN.o(۩\az3_f`WJo}A AMIזV.nQIRp3_7~xZ?j!rB:ӹP 3F?'b'UJj8VMv~$$rCj]C7:Ht偡a"nXv),%k["FyR$)E@h L mA? H)_/ˮFzTAPx[,Ӈ:# :׫$6fp-q TJ+@Gh fx a@_(lU}{Fu:sP./xnZٻ9ayH*7JlSL醷k "r &}օ`\N,@̥,C >p:ppqGNos~w>?mC3#Osg|jMO|׿nYnϱfH[=tbR<<0ÿgg:x!/~7fVW{QQ:(Pk)tP\d^R0p;|1]F]x MQ\}^B$yVƦ`&@fߺzc#%lRr^L$բ~\@)>25FPQ\ S bRs"qJ<|grfSe%S~;Fl:@r9WI:޾Rۃl8~#b2ܨlNS:ٔ|pkWu v혫qlFe‰؁ۓxC:GRY8$_MiYM.7dϩ?:oW[$qhGڎ 1?>%(O*dȳ ;P.)Nc׾Y+˶\6kA\JmqE~&4@V$M}Ei,qAJ]FygZϤ" =W8sg!خ5E>WG0<\qw]6J2Wf|Bx"z<17uhW_}u޺:5;~7N&p@i{ό=u&k| OdlWLLx~{p`bQH p4 |~xRzeRnK jȔJdʥ]SWT}˞LrYc6<1r`1,Csg٠Oub-q*jmHRYCL.tC-D w$mZǩuyJ0'22e:. 7Z.k;|"nOyM@`و rp$wm߆j-E2QE0 Ђ䌰$ATjIWߒ} 7f`jPmMiq/SQgs9-,խy 'VeLh i\WZK-C̍]k-Gw3wb Vx}eHN=x>k},SL:d4L5!O'uxxG.Nf'ut3CB|ܙF1{@nJ '0uRJz$M_P@{x[.=9lSlZ^OO{=,Sl^A 5hA鰈L'M` zSuLkm5q29(lvpt큒@'#`f(Vv։56}X֪8o#~6.&x2]CfʐRYnFhz{/iga Û $p*4sŗct+T:Kj[+ ǁO܃)Ô kK?g7fxS9ŴqReQ*6g\gą>pǿu_YD?TZCǡ--Cذv}C Sa۹2V9 )pM@)HSԬpɑamL?߳~njDuW@}n`\={ EU/f=xE[k`|8]_iݑoX>>3+`y8z ۸{n龼+j4@+,,!\1dC%3ho艼c;-^Z<:_%enN,U}1#(_0:pvu5h |yM*"/Rύ t JgȲU50* |[J\o$XgC4b1[n` E.ZK6U9'ASH&`ogLj6rLM§␲ 0xޗ!ǁ5+,#9>7hG c$pA3rZeXOZܬ,8 N$ N:Dt] zW",;FZ?Y{quT\{^K;,|5NL_CK{l'y=sgLx nnw~ŐՑcytzzdI 6Ox= j}}##zp=Όä8U/)j,Ĕ=D۶ƈp+ʚQz 99y*g|.ˋK+ՉYA#j_rjJLFN"PLbQc5$zB9ts92ʞ+ͩXd:H5pRbY=\%bESE;4}ݒ@r4¨Er-*fz ,_B:̫\NU7hgMe^&h> h({]`IJUbv~ұ)JF$k2TwTUR5UVIUpį%ɚPKT2?srbmav[7S6AsSAyZNx/10O=\)~=1:x!NkW; uv ONQ]3 VwD,t>3#]sz3|?` }VVfs`끱ۿagtTo-V@pw^u;z"<`4a>w0iAG|>prŗU&Hd1ߘmT+-*Z^ABx]"Al$͓C$Z!HVb$8VH":i'"t#thC'RQ[ CTJu yĮuA N/ 'e6zpfh[?]hfp15Ti6]fV *D@Ca!K&՟X"F%4A`y5&WTg_T,DTa a km j|&ȏ4 |r^2bsUyM‹Q*6Jge2UF)yQ[ ܀Tk^Ȭ$#Tݰ\5j$K+\R0r\FDJ >& 6[ޗzA_5bZ+ߍs;{e@*ӍpH 5u]ID#Ʈg Q1n5HZnz{ ~USzÈR]巕^ Ԧ:H#Fү1GxO|*CWoV >v|qX|ؿRƛ-nߺ#<77)x_׺Y4~_^ +dk-x, P\3$#a4{ͼf_Q=h?p޶AYXYe#Vz$%y߷QF Sг;=. lsZ@K*wl b$Ph3.@t^KJf"JIf멆h{~ aQ;VVrz 2[,KnTWlڵ+.ln"rվ^k!fwK ۟6&[XniE7Y)5.Lr|2qD0۟|"Wז:gnECU0rd>㾠w?8O$EG̝̟׻{c)"s> ޝ)@ͻO ?{`~Ss`-կ~y=~^|=<p._#&X{e}=Wjzz 9 ,r<X RSX`:91*\LAD -#"J&݈(YsŔ9McZ;h#rѽFoE3L!d3;p5W [,V]zT?8=A[649觢%#ќ92F˭h3DBj:Q|\L0,5b0AΕց(©O|}tV0I o32NxT;l^U:ZG8њ܏_MUJPe QA`.9kg\bU"u0t0& 0(zW vhEg-%6+Ֆ"?\|%+#DH =#ɵ"&b_`"P→"pN"q哴cW%7jAT^cWqՙ!TKm:I&#*GhmA3<{\弧͏\ Wz ({ 3@sx^%H*4{`<0SiZ߆ͧwx̿h/v-^J o:/ùWsæȀ>LzT:jv:E12!Лb>)tsd6̼Y-# IZ4ǩ`>#ÀMɼo Fk 8ay[D5mU&Eu]dIԲ's* quKvz( 7rDD:1G,v E8 dDڿ% Y4"g FBB2 2, >t/ř!i .`ͥ*[Fd.vJc0d($:̃#  ‵µsY;I>K+a}se=-үcqMn; Pd|zQ`>t|$0`?|`9# ~]-Wē I>%ў:{4sCW_8}6үY.?ym^rzs Yu+x;7g둿BAX2G*:U cbU_r\0hb#ŵlS1XV1Wx'lKaQU )8Gަf5rC CG9 }urȞsL]K#l6eFFЈ сKdiIgo*{Ux-b-.L{\J:zt26f\LZ|vT BSLKEI]?>IF5mDlZ[6 &*84IL8(:k:Z% ZBl|BeS<S~,Opi;r{Oyp`=./S f3s`y:V:v`t?<:+=>^ sgDOO$@{/k&f?".ATlAԐdDL1P DBbD87 )+2)KʣL8eUB)O/v6u 3K G8{Ģ(2kU&UKU&s.Lt"+Z P+06U0_}cȀwӂC(,hw uKSIj]Dh3} vuJq"7V)j9;EYE}55c X\P_K^mJg *Y(^pN=Ύ>vBJ#cw".3&wQL%m&~J~KM+nsv)DSgL(gрD&2< kU=cFX%~iOcRՊHDc'7?W f8+8i7v4a POO Sբk{f0°tku@  Q狙x9~%7p.=P=0TW̅ݨ:^i<_{*'*L_׫ȖO6E}F$^ B l>ھB3S+|<,g~-`iLz8~R.9:z߭7?ߝW9 ??ϋ@2)9=00>iܺ1r=#N?M6󟯷?g/˟߳9Y/V;}V݊, Iv喗>;iNk`0Q5|"x2vZࡎ$psT`F6D)t2!MR` 6 $izS3DY{e z +V>ZaalR4{caWi"H^J *{j:(鄓.x\mbfx5M 䦼~C;az >7u:To^\[x@ \zsޣ㩘 0k hXr<5جf!?TRыࢱH<`JmՀ =U៕ p%0+!=emݸp[X)8oHwĪŚ5EzmAzilcX>\2b26Ea Vp=/UR܏ \͋9=0{` )Mu.}<ۣb糞;+[YwQ_OS||?.D^ +HR1 Lf XPOd#CpIRjge cf$o1ص oVit^ќKV1eizNv\)f <0 1Wfx+Sϓ3Xq]_ P<ֻ5 X4Ւo8vK}1O A,d7;Pz\!PPn!rEeXz=@Ó j^ jF9Te^%VŐ;#UF]K]-Acnʻ%JاA61v5#x%?16Ӽ͢ÐE<ڕMYkwj'XZ9B!3Œ.W}2*jdX'Zi RU (փVڟe [F_b+Q7"h< oF+ϡse+8i*1oOyecVZ,< ͷG>-3G;V5ON#<36bʸ>{`y`O~_uxAt>3Пx'@;>u2-ZB0A{Cda 0+^50e<ƹĽP?5G9٤4!4c22W6s̛c3lrSqރͧ2SB=eD~;cˏ@$|fL?.ZW`=ռ~;ί#[1zsU@IDAT 1shCH+Lsv,oC&l1zXASϥx@D]i皤9{s^F 9׃x¿ff%9vi?pW|SbihF`G[aa.xg8i&=0{ЍضwV#HD#h^;'_H]fS$Pp^E,Gy@tҍGVR< !!#\!#`ATDS!:\GyDM\i,6/p{n˸\^;OJYYrLULg~JZK]ok[[nDG#'z?_ПElqqZ}*Gcy sny|`F|0_OyFp`*`.=<L5{!Oٹ}z1$_j0KpA5F06qJk]~_BX.5r*Z'xڷHذ!`/p#ɦA]c@?1d~eJ?S:ܛ4dž @bWA?aUo"ōyF O.pӞ\U5]Dž6Ne?>iY^:"s+%SKH#u=@ /zrAO2@돇O_}\wA AŠ4~Yopz4{`{`τ&= t[ws7߯q/vnҒw ;f}l.[`W<àDw ZyBAHٚb0V=ZMIU2F මĄ\KYBEBB RtY,| D/R`p?pLqrtLJU-TQuAfvlQkYRDh .~&ΰE{CB]?y36\y^m˝d-]' emI>"ټﰅE 9`vx\eY+p5[(y+2mMh.H D& d -< .#ݍϪ}C:Q&Tucsar`)Her~bT~Ad3D-u2S04K3PܐxmS&%NBQiӆNϼPj(Ae-+;M0\H2ǹt]1r"KO3q|`kۜ:TrdTs>C3T5 ŕfw( (e.u+8&zҝ4Ĺi߱Yw)+ enuwǏ 8N&K1@ ]tgMKf$sq7@xj73}/X@+D㎧ ;q_}A>_ \vڱnS2 gMr>ە`mmb\~@ߡ-޳μ>}G-5_jh]KYwRp;6wܩep/׋GLCq}{ξM( 7yfxtSԖ/wwwNl@%,%O D o,HYg(ӗ:f0p<=g*YаXQvW,gXU(` =Yr'n BoTng;,6YSY9) gO鸁Whg,vg:V{%{;" fB3jGtZ}DI)d C+\VV}pMЫ9% juW:zեz qTߤtO{?%\e?tO> ,<ӴWؕ5MA߰۠-rYbv 0O%Q6D me 80 3_"XB3W!Ddx-KsD94⒳3[8|V!#sy6`-]R.{͹,oW>dI cIBƂvњ^vKN#x WшQ; IdD6` [ md&o'y*O:D *%/W dK]e”M]'܏A=YkwM2>3䲈: {?H''djee [ܤi ogr>)VZ@%2/{]'zT8uO+GGfLrpnzϘm},{3 pངa)pZ?U2Ȏq  ~:F+=7P2(OMۯRVuz?\וH%0 Jo0#[ h$|^x"*G%Jl<xر׻}|rjO x_^%_WÔ9=0{=0Cgqf<Z>Hh#8‚Gu[ <`@hOzp€L,NKH,`F%4sC 6jc0% c 5""(R4Dvl94N`zls"5'+m*I,TcjY6 BĆ19J1"霂\Eg; в \|%a#p =T)pަ*9"V0"D8+@2/i/?(VZ`t9,|mkkVoK]EҊ{{AjϬj"rb6B\R;(c3lfe] 2#02!/߷HB"^_3X9ԫoLT/N"a^Sy_WWu !+ zax|OOEd@aW?BgQ@z{D}dq8A'& rӇ{:&|؜C2|s=0{^ﻙszb\X煾 %YnwRlR@̂ #;!=uz\~œ;i60)xp+:2@_ `>*rE0S*IYv@B-e{f?+&u0fF%BQ%S]z*F=6UH-|2rT^j_2JZb2=WhpʠܫmyժJY : َ=gSO.F{N_kzХI,:8:I쑬B487{-x*D@,tp'MO.nw+% E^_*DZTT3{-U._`~ V=T5pezs@wo -Ji:[!"j9zb:mrH_#zю`۳{߀A=0}pͿoOy`p9>nÃdEi >kfz`u =0{9~&LXb,o~|9?lA| 7+>|ǔw <8%;¦-Ɏda=Xbb`ìMxyR%xT3R )eCH!Lc^E'Juܛp ck";}Yњ/L>O(X"&Jvha+_<4IS !6}fX)Ecͭ^_q.3/..YY:Iػ^0:S[A6A5qUlnPv^J9/+DžF]y?L3t0 Vs0EwT-cy#h%0K7ʽ"s U#<#2$U' ! < np|Sw._=)-Pr_́y?@V/Z*l&ӈnۗ $xmCLChE?QK^`KeA9԰rʥ@ow#Áq!.X6 nͥ`^ jf_i&I#=>Ëo;u'ٳzs~^ 3-kx=.ry|o5w rS+fx#oY/@Ah Vf#Om*Nv"f (pGخ[,%]1D } Wot"E9 .:!P)u9Oxϋ~j&Y6BFT۝/-KȘ,C~g p+k5hoFVGIClN~ƦsOd5;Qĭr vʹLr߲ c_^juO6DY",׎-`@/!s ^R6y졣/ sT@3o1@ 2ouf{l{}:^?)Պ8/?v>Oo}րG&ngxoY؍?Z@vZ5xGq`?S WtךM@0DOF&.5Bf^vzIA"QaE`KƏiacbe0AD3W>^kPc[yD]yƍzr@|(Lk-*ΜGx٤;hhCe\.Ju bt>e~rrc0}-.?'ǀ{U1[2L$ϥy曒Ͽ YQ96`OaT&̰$cͰ/o#^n=gb=W*.( }ܺ6JJid/Vi%(Y؏Nw\tܓ| @iZutIƔ%aĜ=‹^_ZTӗ_~IsJޣ >Onϓ'֧ :du:+ 3aۃc\+zK!,#&QS)H)ErБpQN7+J~\3dw=_+1ɸ{&*r_[@!r!NǂǠL lfx=Y~ DFWE;@pJc0\\Vip!*k _6IP"+8e2$&X+Q_Q6<%<||Jb忼eB%3W׷z/1iu%19?+/0( ܝG>Juŝْ<{`yp,r쁷kK\|Eٱryy` _,E/Zqx@EZ `C!XȁSCc)8=-Qxt#l8$&p7$ QC!29ڬuBE6d,7GIKh=U%eU/1-WdsuX%5AQA#+S貯ϵd+GV̹:$/>-`yH\.0B4㽒/pD@-Gg :fC.[+ckk(lEFʨZn-2Dȯx0U^1 rYm} zC=j .~97+iv=;LtӖV6cTu 6ҁm/Xn߆ߊ5(->Va!aB0εq2{`{:؟7_zpB^_v*K}NxWYPh' @b_' q[L,"Rv7㗧d{r0gK6rlIOTهm޿)pڱeCpZ'PӇ.,*9( QV'C(^nd*`F~vK*UqJqI5IŰ/0ч 9Sm>-hak ;Mvbsu)Ge:;c" >òϰ/eOEھq4: eZZ;5*ZmRG8Bx5TG6$ ?u,U= -Oh}YQ+5;Poy:=0{mė%ˇo,|)ux!0ϫ Ñ2!FǗwL`wdz5_y 5\4pcFQ&E)5DR$+ZHau2;=Ç|-fV,@DVn[ Alʹ/tJF_#8L³|RV̎f=Cˣ4uXp U.|N\KukV6Ŷ2.&ZyW=`>1qۅ ^radp7^#)JY:D'@m:1\oEZVMՃ-ҒQκ"+#,hVK3S.I#-+;Yg>'w5dSVEd"!:}Opf5۹g2PŴA.=ރl Fx gtOn}X}qZ| (od  dSoy<9˙=0{{{@7v<Be3X~HV{^g0+`ww(_-V=}WLQ#10]tψHX3B tyaB"8G"T90 @*mդІdQS kׂ,ۈ{Ši&R76"N3Q6|(4`Tȥ;UXoBidg1+L+,sA_@VU02U z"72*V7HH1Q'Q]d3 PέeJHp8l_JQxkA`p pLtEn 3XߗCT g6D(QVmx795"i3xUO zl|?QmDetd#>3 Jۍ2t\<I:JramUHU pQoALH|EN ಧmnN2pT$c :vm{^wy)볼3 k > {xNWˊ|?Yw=Gn {$rx|nύ1Aj-3RP?pY6^yNYfx^sO Z7 ~g>_Sח;W$\P\B8V/+:g=X~yO>HC)5|kI[7g]^EyLW R yY,P-m+eZEO~_8Jd_c]A?)qF#xw u301G93PᢜoU1 ^S̍sɘ:jZp۶?KR.r]m=yT$nЙ%|lt׬~ }-d;5[o1ˌ?+ SJ Zw:oO ϋʊYmm7ةZY,.D~<1gq:r8zw]@ -3vku+`[fmG;kk:ycJa*jtX>= =0w|Bg΢f n0R-odB"Ng8=_d$#`9,~EB F2JNT^mh`AgJ@5z&Nqָ B)i#h_)D]LcJStSj#)Y6/_T1>*glJ؇RrJPFGbf7\ ,"yZ~+^R)Kc\uЀ1tȿ,2`-ޞH☤Eq*cmY~+hiřZqTʧ;/vK''Cl@#⨎z6u<8(~gDO?oJ {F= c:4>j+LBK+eҌ4%|UwڙDpPjԒn~׻ ~ngzL*Ԟ8oq}uv=yj͌6HaFV]ǫ'}s=0{sy`\=9=-s ؈t\xA9jnό,'C/#QʞȄ |_xi7LXW`'b:ب&kF>b0K}"SDd#HU>B~!q5Lr8/I”%=4 jMC̼2K-n$12ﵧ=OV`tc$8Dm>[šӌIqyqyL??L-ۓjؒztqkgphH]dm5Z;jɸDq`UԗpW-ydKY7sTIsLQgEWPГ{Jȸv.sK䝵颀g^ X0Cwx]Vrf<'OͯioUGZ=0{y;秙j쁟67kj"H`|`>" GG+bbf Fě{=#>r1ip9cbh}oe|ut(9MKOx A0M9=O?"#}JttOɺ@Ix卼DIp䭴k5+y6 \|Ҋds,ưĽҧ(M(L?my[ϭY^3[Z]wd2_f YJHJk`M6==ƣVFZ[X/u{Z=E J6^~lٻ{Z[ cԗҲ<`_!0VZEvhW;66+kvp4C"ok}U₱s߁>dYXnė9t ^m3pljuyx ]{||l,Ⱦz,`߽j;Ʈ˳灹y~f x}(~{~?_p.ٸ5qtzF4{؞Ģ˃ }b D;,W,Dt^FN۳3/13 \N0`L:|ҽl4m S{SA4!C)-T9sJE5ӕ/L[{HiWZőgAo^qo58GAxVLv QVexRJ :TÍ5BzcuD?2S]OzނONlA.+*N >-X@ ,~}m[L26 @TSP׼=CJpIA2#Lu>u'e1 !L8V|ʃ"W VҀ!DV|{!gj":--OczUpT-Գ\>c_/9V<=*ywp GQ&obZL 8c?i:0ܿ>.xk. Gʬ87z{of%w7~̀~=0{Y;妙h쁟.Eo<<\ww6o,&l tOHб03 ^l||N>dŀ g8.//X%pCSH22HfקF"Xz".)D=SKQy 1/fEcig>~t" %LA Fɇȷb e!7NgDd)gsqޒ> 6UH|qRNДP֣|A&q(t  T̡Tl pK%GWH QFDdJglƷ4(pm@jְ\S%9Uzt%=Ht{(@9 l,V_1%H\js/ ~D7{<B jX8 O =k,*wƩ*l#>;Гäkr'%C_Ȟ[HdQL0;Tٜipep/M*)7!޷PeUfv]H< z!N,`}ڬ^1[֛L/7Gys#n`;c<^O78ր9=\L7{`O>#q? |K;ljKtd:^iX`P3rfbl1+>+y2/AGbǣ; AI ,X` bM`^Y %_C>b1͟di#Ku L*3y.LfΙ3<$S]Ǎ9C'XbCf٫%}2|R G!=VE&0E-e~h.3 k&NytB=#xrMDSNe)iZQjoB[Lc }6}\k%|/ GeþL5"o[]WM-2{UK)}62Ks-zWY,CS͘~EC q:e#]N }Q[NUn_.PYx.D֫&UGLGV\3oņ>d1u>B1^65on:'V[C/W} ,װ G}7N= G;qV O/5ӑynP#`ؼx(/;yoxnO{V c][w ٜtd6_/ ֨OvNf<ss4=\oᄏ_pY+!nl9r"ꎀvEs rb BŶOug`Z ]BIn~peH[x[C-֘)-'.Җb2?|hK6N&NՑu&:*IAkY.₨h d'SRXq|̲'Cέ6?nLa娖U̐ZGB\ccF"Zb+tJi쏅w*6Օ<[ϛL֡X NZSymJ9nzgp[IY.a0%' y &aA@[6M gy K9%Mζ6J2%m%SS~+oJWkSkk=WN?fLz`t =0{Kͬ[߸v{fG88 ` #|:e""h-0?7/F:}thZ`L6GX.?|%Dvl@S4Z-ʍe?)p㎇=dW a]^$tH)ܟLl,lO:ǟӖ;ݠ3*I^̷Xf,&c_ +ͷ297H׊PEµtM<' =Z ,Y1@:׬Ԋ+kb/"W}_+R<5>sG8mf=0{'X,H+Y>e@^{-6D3;b!13c =;?@%ژt83W$XE3Tɀ*#p$SM*ŵe)Z1N)--Z?QjUo˨+#8½ϚZCd^6x|=iܘ5xPw܂?Edrl[v Gn<k\v|Gãz\btc@IDAT eC'__՟>{g ]@p>2V4y[.HX`mlpb4yQ7جzRppUeU#* L_-$3ÈitJdv GY]X' ;1c˳m~ ҵ֖)קaj~lyU8SuJ<>QRR듘FpkR}L~hW/ՕuA'-CKs)w[&Z%;oy]ShayLm} VhVX*G&ACiBQsyc'Y8!?>@X_Yf#|;~?3=\䲦P=toxLMjZ7↎yu`]{|gRQ^c A:}W?j͚gVE5}QvI\MtÞI/__5k<{g&>?xz;3?3Qvq0e FUw{u[ئ1"$/Dpàk5(H WK72jUQ mt݈ H,{cT6o `s$+-]GSLTHyM?& cQy_}2w>Ω_րbSiD_v60 ho_T!TDkV?i%8ω>oQ0L>Niʘ4)+@(EW+dTB`.k$yҲ4~gUsX@pCKBGq*⁤"jx\)w$̎|v:`h,֨-HZmYa%5KޥYeyΖț+ޱ%*fmgt{t3G w,N_xN<1##~¿ysd)J]\hnzb@flP6zvƽgX|O;B ņX x- !1!4b-8 $%|Cwah) Q ObNGC*{LTx$ГzIC#e~ogјk+T9oKEPbKv JӞM]g1eNsLФwYU)EnyGN5իv11#c3N,{ H#N9@gM ӊs~쁟6SFׯ_hvPp'([vwxVD!!Y1|Fb6`:2Huh )]W͉`L)k W`OZ}ހdd hSu*Ny[}I’[שt .:SoSƸ9kW3qCrK{Cp?M_7YGC(;9d!SrRVŧ֦I7uS%tg! )IhZkJ"9S*wj=Kg r6_A1QSJIN&3ъd?d)@$o:q1j2EwAM!MΧjd>xc%CBPH?Sܒƿuiey[|=C' ]TL8<웪Ke"BfEH HNy6m-`el4IN+I2lciƙ)4*z㲪#DK-K-V|WLkʷL0Om+=VF X c-A8΁ʲv$ oSK?㨧.!}#:Dj`S'loc -n;-?6.ں7^?#*Meב,\o2NT͏xUdV/ /l|aMD/@a`["ߵxi~ٻ=^XruN=l8L;mtg0k<˳~;~uO,C _&d!%"}]0V={AwĘ D] W"5&kA|V׷cKP$|7 ni0,|!U崵Iؗryܶ֘Jܗ)ۦb/ڄ{Sdu=wIiS;'3H oaO ##^#SmЍNx:@hk-< x}M91L OT3 20s!i| |*&9=RɳYo(<?QvWFW96陦Kbglw |nF;:t6>+ = W3AN; c4ya*3Z[.N:y/w#Nڣyz^Ӿ$M_? |x`\깢f؆硯#.~OәrJ$MCNK >?n`-F`@' HFHÐ +h.`20d L!:J(,GZ;1od8'CR?">B `sP`]3,wdKӲ N T* ARgcņؒ>03$+N4p \Szge>q:Wh=%@\[Nx nh &i8{MS' ,qʯv4N+ײ|),9>l!}%Y1xZ*nz:;Zr]t*SEl*k#.Ʃ;QY3A@"Y0nlߘ&bt$_s."KnÎ1q<⺗nq#6iiks>m)=tmc[Fx: ã@9ۊe7Mĸp`Kk|aqu޲.K.7LT])#Y9#9pbA?8zRfH]__՞:{`@z͛7@v+L"stO2 X=_2nf fGy˖L?-Gw1hQQc ;e\8O%L)IÉХCFɭ+TUJb)sF,$ ;}ꬪ ЪXb1032)QAM&R> SfwdW`WƦ.1)kL] ^u] T>%hQȈrBU41u4yf*-Mw~Lq=_>0Ϊ<+ 6`pyy^߳-ofmX VK)i/s/2ϕ=0{ =>?9 fݑ̤dHc;,>t}uƁ _EJvcKFN|rgD`81 # ZepT! Cq O#$Z@wKO! o*|jD0+b[[ 1 ]шixNɀУi 6?eI$!dn?zՊzmZF[Xڃ29JGDцL :Pd@՝ocJ5CMXW\;M&-+m^[$>FFLɗS¢P?u$癫.-GѤ~ԞoS/od!UmQ/I +F7apnh(6ֺT{>:B^.ma'BEI:@tѳq{ T">VS#;Ak,cUTwe3ZTz?dyY lZKk^u 28O mjnW<6x.#%aT}C' H},vOxxwb>ܝ'}"Isz28OcCDit>Ҥ&孺x>.Ö^Gyqޭzy7Lg :i* /,7,߱%qׇ=:P1{ၹqJ=zX";jTa/}da6*p`tasMbY{ ,ll4 |G 4&!\PO Q5TDTZؔg R 'CʚD$#GnO 0$yU:I RAG?=+7֩ŷNJ"𢡄 }j%Ȉ$SZ]]U'%<,!sֈbTx8bdŴt 4h imPr|&n#l~FJaSMEw$-拉w|ǚa?|'%Y iRe `oE%}gšqI[I(HWdmqV_YpnY[zPp: ?@|_!h#v)j(Ԙhc]T0隝v2,A?S&3 J;YqѮ_HG9L#d^ϻw0Fϱ/X|y^m_ApJ۟@˥xN~q;~q|zU^C[^v{?Fx)ZD3d%o(\mOӜ8 nj3rP$F:A?ѠnhJ šĴ43>l$[Iy)xJ~&K9|0[ S$ח)fO UK^;NS4rr?&-Pڍ ɔgI|d܀{]F!mh>>ߊo)u\’.yec\W&JY( "~)dTH#CR 5{:bqT_vFyߣwrK􋝍r:V@/6p+3ˤ]^Ře^`J[=ˣ6Dl5As6դj1~;WK ]O݀[xtHtȬ,\ -$C/FSwbLU[\A)O0Z` `+t ְp+hF E?Goq%zΧrCV^p5FؠRm~.biaL]=mPӅyV)m=x[ϼ #`Zpʿ/XI2zqܲ1jNg٧?0jF4-g^<|d]R:\v`V89i6m)>_]O"s0o3lA[朌9y`]³f<4 {lؗsa5Of ZB0HY+f]`{tοq,-*$ C@C9yhbS8ꚲ~ZOYL;"2=!Ύ6?١КQ-lh9ۼReA&ҧUv&/|41z'4mALqmYi sIdmȟŵ~&I) }Tj:QU*,Z q=h]13 cep#ᅛa[uX2$-lg\D[L]žAGvG$vli󊺑` pXoBy |;>7d4 ڔRD*Z|21Gy4.|)> S2{Isp/|Geҹ7ܛ@ucYm)HS!g6E9KgT #eXf[yO#yn4/b46k#7~!J=Ƅ>ښ{ ?Q:nm_,^;+5p4a> x feȒzv> ¼Z7M5RAcP^7c_n<y1ZZ4kȖ<'/+»|,Ger\n?97yoUTn_gkDXcsB՘=0{z_89>>oaOǿ>>V,o)1wDoX pd>&k:TDK"w k(bV5pDDk,vU#cGCHA3kO>FHP >pZI-eNsة#1S*(JU\E]5L1毓)M_$ #8 k]=ҪdDŕCipu*\ַz冢:H *I=62j=5ɍi蒦]kiD9g)ൠK1X}h/6ppWLg?%|66MCd+=1ӡɔУܫblMٸ,.֢rvcGo18s ལT< N,I9 rxiXK70qicCR^ZSQu \HCȬV`؄A+ gWgU/ʵllmSnzWŃ#\F#/|aNiҔ{py-w`=ip1p<2D.m]_Ȉ[@/uS_|:eqVnlۜRW+w9l_hc6 Y=PaW_.7כUlt[,{_m_a񗿸֥IdNp_͟=0{z|?-QZN/^87O޽۲7dxGyrk[-A҃:NNbv& "B$KUMAR vELF)WBM,,i `HɵzaC{B1.ٝ#T^X8 Ur BStI@ZHJH|L\x<(6X6^AW` bVQi΃J?22/A#kYGP]X,1)#X9!Nf"+o['mXQ;Rh>U}dT:RkI H+&C`MзQ_a㉯r}vOrhH^"2E$*`PW G9`#-[Vh|)N-itL7/Vi_YOO܃U}[f$=0w$/lLҜ_;4 h`w͆ݯ^; p-1KBJ@q%x%/(a !bJO7?ϠwRvm |kX=!(}#JI3#sz<e9mmힲHGGWjhTJd~*U9-%MTN4|[ 9ߔW-Y SVoGCJ2& (og]rF1vFggL6m:ʮEN6 #o'ݾ^ G-,=r穴ۺ f{d۰" xE2yDzUV _&']مJ12ӏYlXPW #ԇdaq Bt.4f ]t`{@Z9|)>nG84{灹wM=<`{$o޼92 @>f},w{b'Hhyx`oVE"B NlG>cP5 K9%mq=eJx)]~K Ҕ` 3ScsOb\#<ѠCݸ-cH{|y%d}F W1%W1|&yõnׂ|5a_H̍&t_ɀQ HnMOᤜ70UsZĵe[1nJ~ JS HXP. wVCn:HGy9~+l+ǎ@^mWe&O;L|X:DQ;jnKC<BC Jգ)HB&-ڸs|볗ުc(6Lը.xAɺ;tB;-XN~ \14{g쁹g|q=y=@0B~M@Q$p"G41dRb W2-/{ eHsp'#Fe^U9F8ڲ-Z`K,Rǰ`zc* נne[))xw+>?1.2 re㏆Q0&<5{p]wRXK[)~a-|;R))5B,1_I q 5e9WL¦EWd$CsMٞ1S{8uPώz-H6'Fubf? \pn=em 0-<Ώl1uHӤR>*ߠ/sqf+giybL 2k8OgXnzc`ApS|`'+"W1}3:h-H2O@ +%|T-1i҈83VƸQ[cܤ5pKwK҈+S.$7.[|f;8 SivCp*Eڂ}u˚)O%#?&Cߑ 'וKdSI9mVUrZG[dɗT`f,w!@+M2NAUߋŏT|TNme6fM,kZ7'GE?o-j|ih-ʮG\~EKQeS wicC$v^w%0/L߱WW/0q |s0sݮ,' ۬9sG:Y:2$տk0k#;,dwtwԗl[QZN  :v S V'F+}s.Lg~y\g9~l3-"/2/ٗd__8J1 x:>~;=|sYoS f|Q;5;{`?4ĉ1oooϼVW{q6|[m>$* Xt[ )oبG<*:3UԭOV{nhoꥏLc)S?^~aO; xw#NQh߽|B;22"=R0!9ѨfOvJzds }Nڮf*0k!_$ЀϖQ~W=Eq]h_ޔ/3;B.>r|^n0j1+F WtᷯW^qNw6S{m|E8Q|,xud _ z:?;s<;Qzą3PٮG:Jn ǒ}ȥH|gO';zG)PwgG3 览 O=z^7n=-36/ίocwz2@wv H\ImV.A3π`.;>sgѳf`@4tZF=Tdz$Lv}g IO}$JI)犦H*`Wrԕֻ_mJVFQȗ{Hd)/w1 wʽ_~u7w ϖ2/wt|NwS㝢hwo[^n̓:s 8QG6m?Fϫœ;bxھc=a'c]nlogg TU}0Q'qU|?6*Ef>2x:iqQ}yMOnhrGTPx]RNg>:bOh; 36+^xyOgxrZuyq$yj =VcKvaW{sb;lG:6th(v *LKep?NMİn7q 3U-3-nںE ^/=c{#xQ`wЏwoWeb$9R<0w|)Wjs쁟X pzazX/^l5&'L=t8#bbq}bd@baiAQA`)-2$J-kѩN`SD F "Κ_pRzOx+!?SJDɔZzip: [KIj%=p27uuJd S\C-R#s.;m\$Җ߬'(ɍLq4/&sS`S'/a;`C†COū="q\95ђ \`?яE&F ƿ\`yߎ3q_h;CTm/vxZFWˮx>&Se_']\mWVK b$192o煳ʳM #Vf2? 2YN8g$BdH.^w̎AvLFb^c˙ix?B!}v737Y/y⢽]A0|A'4vi䁹KZf|1 xV{$#\a3G1r!+&Wn=vR8fbc櫝+@_̎$|(]hR2]bsMCVV;gZϧT܏НVu5N7UaSVG1,dOLc۲9DD~8|ld[&y*[b}S;e&p]+, 1)GvƄ W_d[n c-w8J36q*{8P*1>}T{ްގU [+^&"-g|8s.T,پ8vtS%V!RDҍZcPd>L) ؅Оʤ]xn 0 3TSCf>iSI1Fs+ښk 5)TY;b9.'WK@u)y"Ә!<x+ULM螠Ox<58#-SA%6@FB+A`` MI+)ZZt=EuD]fʶ[a>49-EVE\[ѫpX"ق"q\)Bc|狂)PݲSb!b+-=ƟqݪCEJ-983&m+qܢ)Fb ^#GOh)H\#nW$xaI\r5㚶q>yJbX@6N8!Ï;bs[r HS?&%e6Ȗ[3SuMh#gB'3?e樿<~4ݦoCE<ptNScA@`q1Mx>t+IAفvl쳉mwߌW,xrƵ/Ow~,@ bKv`aU3|t*2|^jʻ.(]y pڍ .˴]ۅ-h5pw]\d3UFdO+xC{Q!K5.K:yެP@#iOsOr=%{ &w߽;E4N&>=c|O744䖁w,꼡v P -H-{;BA p6B![/0d#"0&DM'|HJB`lA$inj:7@,HZQ6k~(Kv*2ew樫Í4N90$qeHƫq 4>#`oi{UOS -r0a#5+?VˀG殪 }2UQѥHU^)@ȩtcs3R-TaݍDJv إ͗O.5OV?0 !`=5+HKy9Uwذ%0Έ?fվ^i޳=_:t 3RI̵xIݓ Vy Vִ3_e.+<*p,^W V=mxE~Xo#4v+I=\;>6_Q eĞA9 qck{ GqN]ͻM.(fM{ۗ]no(w.t(.O-{Y ]`/A\ .qy3A+U`2oۅ=.slc_ ^}&8xՁ[QGAG=]Q 7zΔ.㳲4{y`l=s­47K^`tazT) lX--(/9AGhěD XcSg%2_Rjw M!Zi/A7 P}l 'px:EViw+Df{*1H)0jK 5YMXYPO\{)3t8:<ӆr8r\RGÌ-Fa+i9g`_=,^Mם-Pflz۔]$jBn;M!{v15n-lve+otr\Fy;A}vP ^|)L]zNwb#}2.Vh >faAN #$)D1zEyy0\_ZGT;:\c@8{[ˆboιg3mmb . (*Ɛ$މT4u+%f s+"6EC8X6Ók|eͫicJ7K:HztuᵪkHU Aj9H'}{zAxtX*љVn5vܺxSa)Sr3 j.e!/ Y ?ͥ%0KL'_t?<>>UqMqy~ @!b!,8Duء1NJQ/WXȢLiՐ9f$_L6Qe#nV055ud<S3Y~4b]|w)3 u4P7$#2}vϨn:CϿ-`^m:{ ;O=E+a Xn{\p`${<:= d,2Y2 ?ٙ%0KGWH\p|x`x5į{G%Y/3@݇O(V( 1QGTdžE'5(B׸IDeSp:N+)^Ktݵ q6mup  <04Bf1NĩKʈ΁2sϠ+C{%93@emRS,kUb dJ~ZVs(ՎV,Ɏe]6:'e?*c~XH'ҧy@x AlءBZ=mZT(}H4SmxEpW1q~$'K+>CƼ<,Pn%TTUZaiȉi qsTxL՘@/kY2=,hYVo}~"@g`a aY9A V'(km{G=bMX n!jI-C'^X L΄2G:ḿ~p qM=qu3j[nV)V䁶H0[Zr eZg`o.@ltlV}[/n@8H,ϛp@{kDʜ%J`v%0K`,_v{b-8bK+| {Ut>ұ  J[f=;`336oʜO8| m@긂XC WhrhE!zJF"H\h`22Ȟ~AՖK|g_NͪM/RGZ ^/*@t"U( 0ҳwA$ olC8Hب&|4?ĐLMc1a٘?aYjBOPZnɴ;tFչ_dIi ?`_h q Pttz#)\g- :5|-t0Tm׼LN#Y:/oI|sXtDXl`[oGd]ָN[wg?W*ӼM[`߹=@X. 8޲wí3%t Rvߐgz>]$0;~1ύ%-J!>޾}놀wd;zڰM_QPvgpڲ>-Jx\-ZMe"ǻy?`ZF3 kPsŀI-U^R6B@<wđMKg(6Y%< XMHwlJcVׯ{) U0"*6ч˓(I4]]D0Y˹/ɴtZcDL\VH)h?F@1QnkvÊRTUB6Qh0D1{gk*-lsD:02Z@׬|I zF4g`9CPV}ʔW~b0FVi7L,OO?b4PsHT+W<1l 7-k۰D[f'}mɠͰp~FfqX/[| MY7/#Ձs?ϻƍmf:-:kD>g,]bI@NV:P .i+|^G>;b? NW~Je~a/ <9A5⼇b>q"78׍+D} Xű8DlsO+\(~r"Ћߟ){;,|G(ʴ0ˢbQb@U~s~Yp,YJ@-)4!jnB"4~LeZ7#'(1g #FNE\L! gg _ڎ 9 ;~j  z3F=˂5]Lă ,DW9t,PLMR`gͪ@#XK*U`12P/ӈJW=WM3;զ2 $U9p" <8*/d 2BS4: 0 `&HI幣 wdihrTCÁLV-5suK.E쐊Q?i}`n<$@Ȁ_d$Y@|ڊ/-l-7\0lVmxM ئ2%IXKU6:'Q~UEIy%Pѽur`毯ZYxŐ׸7^ pv:[~IXАad.O-/]k8v~iDy)7ܴq3;~oZ;.F]~pqS%Xs6yqP'y/qЗ{hӉ}$ pމz$_9@eAUpA[."_q}ʋyc.%0;?},?JO?ch[}n߱3r8)>-0,-K4r hj*G9Ng %Qs>PToĒ,2Z!Ih)f UE!FY_ lHdnn)TϾhb^ϋCyW) Z+2_:uD;7AŔ+#فPU^eƕn3.zOTn:Bҡi΁I6BWúvLYl+kE:I$pLtR˖ό│ GM.O#.G7J1 $CL/Αب?%(Hͱ64AbH'CrMu*6ƛ}.Igof}=g a?p0u jN].#C܏Y :A) ѓ@>ZՍlCG{ٺvΑxxhm'no#޸ `G0X3;;]/vpgfpbM_I_! 6s!O+Kāit8hn3=xK olku0Oe]4Kw<71K`, Ÿ|?/Ha<֩i#)e$O][<|_'4^iepkQ¿Լ$4b`>xt c\8!L\kvYv՚\mSpВ>iiKÓ Tsd@ 9+ %} Y~G~8/=yg;-5`qUHa8,P=^pg f %I#C1 _rfӡ;Ke镡mOxUK*`FEBd8gFNr,Aa ]̖UH n:_(eF{V0851FA3nOGDmtS튻Z`"1;LPHV 7eq,)nːIw <?nU&X$cJ,Su)ZUڬqYm$WUSp|l߅"sm~Lmp@@~VYp_8UJ}08y@ft߽RK#c׵,/'9#$0;m%0K3$ <Pc/O|.N,R^> \=2>c'$2z/+Jn}nGPO'!U]k!uU|]k:ʽv2󕭸~z ]Q&!Ŗ鐅DܐJ9PTYOO[J\e:]xo:lKCO*>$/*U< 'Qd X~`HY__wejS[p6 îӸ2\NϨ*x@yv4?<I8IF<xu71OQI'=aڮ"aPS,LyzsӼ <3؋t8=b;_=p_!{o>n o)7DNM.+4fȆ<`S4].oK'd:~T-pW${ȼv;tGFGq5Jf:ajw>Az ƒ%=*Ȩ/̲dF~碢*B mC7~#PC:&*A Uɲ<)*fJ |R+[4TU*o3Uz} vIIQ2>"(Ьw9SKcBQ~ja),^_4_ˇa4$Flz! 䂏Īa 2/Dpm;X LW3=37`DjS-_Rsu_"]s486<ᴄ~H0$Yk+.L%:Puu8m-; E߽4yź' G'(7;Bx `dunp|r6ؔk䘆o|G7vSyjںx@s `,|<S_iAy7mJ?  _Y_ ߬ϋWnpXl5pZ}qX g#"7% q͐cvqF.[Y蟳tR gMx^Y^@x(2U밌:_6~"K< Hg)PizXa39g | #Ǚ,Y$qqQ [1B_OoZޝhĆ/-V'`zdV+F+6~˼wLD҈IpZ掕l3aCu(J1@/LLQX哦Q:gl_h eZkV|{knQ;.0B*YsZ7ZSޫJO151_;_HDۥ6& ׇy{Rr!7d=)]eq'{#υ-5UM}x"}ߵ2L+[w|}!'DWIr\_a,Z=v;̏% iN%9wqL XySl)I7D+)w0XNiy)Sa\}/:M^Dr1WX#]0q9O trJQ dS5yVvA64m{8՟Xe`"NqR1 ,#VQp$iu<{dAz%+|'f6B@ӯl=e#s΋|*^o3|hr0%x u<ҹx4ɚ"p=e'mӝ-t$4t:`-7x%oJ`/CYp%el8X6?piPo`b}Ht}-0 `,?H^ྸOo_}xs{R]Xp0 |yw7WGPk6dw#[ݨ-txlI΁V> jPPARPIR:8 ZedDA(v8B38P&mKPF5$0M8dU*jGVVebad!(i9jEK+[HbO" = Rq&M$gT{$pi\BdcvUܚvMeT-.cٽ9&h"V"O"{@t?.Ҟ%]hmo+^ i?Cؿ.Idd,@I)7O}徑F4Bc K8T#ckaJ2`gT?iaDtc>lR&2w}Mpxj#K qDkYZϲ0#7O;jl3^$npfvbyd{EW!PGGˇ|%I4躛ʶ@AVBߕK^\ap܁x={<_]D?9@C=C' g-{Fi#O]thW vMWZ, WґNA$g޽r]02`Iޱʘw!v==w/6oa,BWf(8ϖiV96$0;{wCr?{\5a{ӻ;4wh/1- ɼEAZ@1G5e:Sc`چN'7{O Zzm|nܳ]W,a[A_o  );зP-R.zN_81%nti06.e7 ҿj#3Z+b4l͞W˅|]\,]o9g @\@RT#$ҭ:=Id[y-rORS0+~RiT6EKi 8FHx7aRSq?{a8~6ĸ4:‘^16h\*zՆE|1_v\8`;ain Y^F= U5†w<'|84r?b!׀ C8BX)D_d PT8_a48C%[0@⎝˗=Vy=6wlݧ'Mv#  w~BP'7q_IK#&fe0&yvt7Xp"չ㤡c /B7˽L3+ 4ȔG$9>E8%+TwaZkaWj %0KJ'Dq0/TMbN&JZeV;6[B)a E6'tF6<:6Pԏ@ӥT2_EjP5Jes׬߅jqK)]=F@IDATzXvD_O?a٭zl{<+#R}yNV^xG4EZCYSJ7nЪ&J6߇ aӞe*[ LZQ#2}.97}aMPY3WLXc:_^ql!G:a;rG KQa<4tyI6#:fi[QzC2u JvP[,xjdU}oHgش+dF?) )zE"=+4QzFg6J>Ej!J `@i'ymYcc]h_!Z?x2q5ƛ@+[R>%dDdaז%0K+I ;Z>o{%;?13Tq`} ,+hdzyYşm6zj/QIKseO5`Ԋl HU LL,xsL#!KJ^ u'5`{f i XQBV 1'Ջy\9 SO{j >@Đi.<) я;Ǡ1>m}׃:=G+CzͲo`pDH4yb8ښNw5yYϑoΧqo>Ac'@Ly+pø+Gio3PtX6c= wTHB8pI:976Y†q9ė=ڱI 0_`̂K`Av҅We8jV8`P *0%ӸX<Xv`.k BLOfWLn,YPDs@@e@)$vKNKd܊Lt"g#쀝3&Sǁ.UcChAMPCQWQuX|&n_ɸHSϞ.sӋ-Ij 5boo.>(~R;^?"wŀu!3׸D^VmB l}8ܽ$=7C\1F$Hk_k9st!fNQl`xa2SIؤk|}Gr0i~"G@G+mr(_C**p)k(03 _JPwT!i]Q^q^6@4H2u { %GǕ: tH H,c~ۨL%x߅ N} o<%)}Sd ދ = yXq\!$QGv0KkJkf %7&G=# ( ,l FLh$w{T2s]XC!&/{-)k8R9X+@wjCNMPS!numwt] ls[C>CU²+gwɥʬBr$cdҺ]R]__>¥MSUtayoU Sty:Sy mP2DڀSh}AG "S]쇱e;v|c>)enZh_&}37~f0v n~UpSw)r56Ց Y:N "aW%kXSPA?c^!Hɾe-=xwcq$9glxĎ3;fukAcZ8tMuߴtdtQFwUT$oIqWjtostNrqצip6Nuʉg٬Ч 6dz^xQD3,Yt3ӑ/6}_U~[OQVޣ#G bšNg?\a5qsi*al3 stD:H!8A#-OKr6Y=r p%%jEʜ ӥޥ =8]W.٫W1})/Fa[O:U82E~S{2/"YL_ZVNW`}Q?)`žFUWAkAD8mi9| ϗՌ9K`,)v&"Bq*?ӿ~]q=6>,ZqbQ|+Ȭ:Q@N-c'$ǽ Q \`UNۻ%/Jڏ@Pթ(N .K ,b8M |NާyT^d;'Bk?y*q//XSK)_2]R>֫vbVn!+$l٫WA u⎐(E8P׹XT3YksT=-%8BhgIh\j< hNM5ڵ}9R(i,Z::!LS|aV*3Ѝ`}Gc;lφ/Z't6t!G:կ1'3*/=`1N45~s6FMs^ LOEeF:|tf=cky\NqY`cJ{6rʼuH $8HE8m^[4bA?Kf\nx>z"Xnu~; ^s::N4Y;bK|@.8&i0mf!X8u$x9n ̒vLsy︸NGv}GPb5ݟg^V,2 5y7,ϒ,1Hf @e}3OgV٠udǻW?W?XZ]XO0n>ߝ+&>(mqF=rzfI5=BeVc*L|u},=HTvMmd:QNTsdI"H*оH̓ љKHEQIe>$P4ǢzQhBו zvdyQB#iDN8l=}21+KU,{!ay ~8b'#@&od2 xKs^ M%#װ>1j_"^q){:#paX=\ D朝S 8nϢ3IsMR#m7d_iHk\|N uh$AK'w$VmVdt<qͽgU#4].L k`cÛWiǭS)w/8tݻ >-zٷa2|[~G3rѫ&1:# ,K? Y7[c;x>2t&~ *3K`- X-PǼ~̟ܣ%zq2oEu9NĬB\K8wt)P4QBe *FDBMõ.)K;u oB|u!2:*p}Č 悗+e - _1\o\z;}xu\|uߚTivMzer.jP"-]*Qո#PsR44>`4ѹXpdfEYsբ>2=t>~E;J#}7[L;2 [Dw a:ޑȝy^j6 |w?6.8mX)rڱw,@<-O2 ׃D0پtf $Yf 9% +=SH>*OPlQXiCaVgHBIßI888(PJ#RT/A hdZB*j/ GxInU#Z^2Kv0m8Un{7Gƥڜ[%v+pe=<`S:g7ީ/2/`1mYF?@5DAp^cpg{;e9Dق;Xm8##|0x5o__h!<pmx/7f %0KoP)z%n۟ aPbgAG,z"#łBZ3SFt#qTsB70 a+k :N_ܧ6*q m,usa5Wax_Q!Jvo2"3:wKt'qC?u"TÕP 9~{g@s >]DDh/eg %7! v t-ЉhD;Tt#!Nx՗ܥ٩nS~Fjq=#3MT6}hV(q PX J걊VUą#jR+K®}tѨ*!|,3;M0u>=26Z/Hl 6տ,#~U÷A2*𤁡?5ⵑmQVHmDX}Ӷ2(Q~; ?+N7cGMoQeA$;`7m׀uS?%̴ee;gls#~G}c Ǭ-JacVpj/dF2\Ru_RB>2naB9hSUG#7 N˒Q8qPM;;pd7],`Aۖ^PXG~AG"=qd@@L+S/Y1/UC8ŀ 8[Ft<@Xb܅v;Ȝ%I`vt˜f ;>ݳu?'8Kѽ`Gr1# ڰCyD8Hl!ZZ&7ݲTFl(2Lh3XXfq*vWVU^kڇ"Q*3=P7%җq944![ąOk:T1K=[=)YMY-~vf:/='c/iZ)֘%_< )Z Vx=ee(Ulq~lv[ d5{hK0lmc'L#Α}ouh3=5|'}5SXc54yX#n7C!Q٣љ WVstYrLw+/EdM?fh%pnƻ!Ԑ„95E TYQ}P]hހXnU3*h-d'-$ z>]!?WV<+FuM;m*]e@( v!^DΖ(xkFgD.n,k-[7~;J^l_pt8~# ِ 7іw*:P W\eEԲJhPFCTڔ34"GɌc8y<1,`;;{-3ŏz1hr⡁z,i'+怿y8..;7l]KwLu)Z۱4``.y{_ޥ{*贰?ru9r}щ,- & T/bچA+}iuvh,Gm\c Vn8~~ +cr۞%:S{m,cnǦ6|;k =~휿]. #:)SYϺe-6$l8[2A[Ls4z|I{4q3>6WlYbIu!X|%0K`,?^|i ?ÿ~DN}xl6v֖ P_ xܢ;b@4pz#}6ZCKa"_f%6t!fA+Oc7l"@NjRG懲UV]Azv8U 1alJHc :,W!c+1btd?xʨ}GZrQ&HG/JB}5 نѨbF>KY\~ %j r•}6z-nv>4:nhB~#CDȘv0g+н73>=TnD'~'at{9JFf̵.p|!8\t\H?6Jo"-,f@(Fy]<3x?fXZYk|VłSg> z=,3?y>Ƚ郆1e8>76|k:1-ؾfjC"0_N G>`/p[߀UP-ؖ!b>pC.mV㑬roI8odžS#53!ֶsⲈuޙ4L*GwGC&wUpw {N~ޫ5iFu!ʘq}>ޑud΢9z`JkpHa}kn]/!Z|`oW?a*i9$0;Q̉Yf @axRq+uTgjhĨUPQ1בTt}l*nR f:ĂqOn/mJVQ_*fj lO  *+X7ApY/A "BYi Pn9ib)>8}~؍T=3r<5|`/6i1?a?À܄ѿrfW p7}M }_Skۑ58g?beG̮05L5)Ö/BLpO}.ӂ?&e$o._! G_?mh|:3A_ɹ(1sþ> LC!,҂!{ ^nxۭdhU8U*f6xͰ0w@bޘUn } . ^$"WM7ϒDBS2ހItXE]oCҥ̶DX+W;;hG ^p"ݶ?5X9o=04rɈJӅ`K@M؜v$0;k=t,oG\<}=?n$HA  ]= Jr`RSמ߲S9Jx+l B\( Q L̫$I2A4 <qét1c :zw]3rEEXJds~j䕙ӻvkPE= c+z$3EX5$ jAPvg^xO#/ս;~?+XJ4w+-'^#ZX;\1PunA`Ì"=u ^-{j4mc$k3)>:~OS qI*z# y`/(t5Z4i8#U;=xǸSȘ7y*liS fS=`(^'/&ˢUu$Ĕw)UA+(*ebHK^eW z=GrWb%nê_@((*?l1NA͡qIV=FW&4N/pWZ} Vjusx@ݟ U TUX)[jV#zbQ~zϼwkAQiK R/J=(_M??(Rj:=~q%Z/KB% 'gE3/}IhjzL'm F|l #s?7  tztBdվspm1?@K¨33Q[)0΋s #.}g;%Mfa_ǵye ո^k-8|; `LR jtQ6sPz ':RD'XБK7w-1+`T@LF< jSx5#3%+HK>f aku$n9_ؕ$muEЎ3Ak4;wso&vIIA'||64ei!Wĭ`sNkor(+jk-   e

        ,c:"AگkhE<]gq2-kڗ=Μ5aC^Oask 'D% #vt\lx0m{dsT Cu,7JqБ#1'-Yt k}75q9mH`v|y,Yz `aR{t_٣0t rsO0(;eCg#Q׋uP2SEƥS{)U4AV#ѫĥab >E_BLn+܊*cTdX5֊~Qˬx@ 󷚘0Cf^ WPE Q# 3 s)YJ*rnWOdwT|YT5rõ427cz4livw8`~ 0IGϳ֕[yZ3b\3g o;_AYHV@.g¤\Ɏ)=?V6Vs HS؃CDOCиK;W+~Rvx+"]5:MY(;J'ט~uF*C(gkO&n{dg$i('hs$8K¦[!=E9(؄ G9 \%:M 017#:]LT]18|w`H*4֧߷f{7K`,|ӧ XPIjُ,}g GYY4K[Ęy=~t3KV+ 1X& Fvc j|7=ؿ\IF >0Z(>~ {ktpW}*TYi+U/n{5/6NTk"q]Ostt-_A[ƱqdRJ=.?#z3ԋ,TC>Y6rz0]R#*LB/'T PsE5]ޤqZ3?6c>o\C.֞yk+ c:XmP#ز|nuQGczIЖOo8u/ۉ!P6\;!Č#/0~Ǫ4fw}'1}'Ft|9wirW~n'/6]&r@Yӎ9l2gs%PO<<阆伓_qXh&芣w8x'qesw #_aTI' nٱl@7TsNOwIff %KK?]60?q2O1~ZN?ܣ*ҏ22++Y33cUnId#tFBQ۔(ؑZGl(ɲ^wQe< ~.LIC"Hܘt { <8 d /3qOn߄f7qN%0KJ)xR㏋ëWfXTUY2^q,CCEUU! T+n*SK zu(A-[Uy3Ƞ @@c=S}kS{XqzzQqhlc)Vŧua +E4 }\mW/a}h,hJdaNhA½&B32hق]Tm~*LN?4 N?kCO/HHӰ(F5dM՟Ӱ1cbCYeQvc%[NF!,tx%W.~i\p0]22#߮w_MXOb3CJUbրrrpb_v;f`L`ץg0bGQ3RAݺEŶŗD9CCN\ .#t&;u}n7+@b޷t 4ci,kKո}t@IDAT-SZ ?L&J0 !x5t,Vq|wBk9Hx*Gi!PPG'@R 2Gߜf7w%0K %y\_?Qt8oNaFE5h9*7hj`k̰dUAq^:Yc8&*b*ay,@lesaV~_K&cK-OWT*GfF Fe@BVZT,Fo+k )I`W\ \rBD02u=A(>*ϵ1U6E‹Uի,$^<,&ʢ25KIGxis_Z? 9a1%4M9akYwXNGFA|{`̉GwxYz@..N7 b?W@Gc| FÔq{Јǹm_<')(/.Ht#mL^Uq;X+XC~ΰЖ-A1Chݱ A;:ĽCcuYJs(^I:#B]ĵ0cy @qtyBB>Kz byنH;@ IjhCjP$'Zb/W 8We {>V: xI>׌ax`Uh* P w$҂@ό+]b"cb wW##wgT~t1m[ph )g|K;jfO`HGq=z{+K;WR 1 L.+[5nݨo53yB#El?\֡j*Zr> -[XnOسA" |紡e3GaNz)2=05>H Fq3HҥDOL|&0dH:"JI1CCg4 b;|gz B82E&̇{S ~˟62#w gTPJN2'EQxҥQ3f  $mWQ&PCA@ {dGe;|(0PP܅&"2*bj#{F c'PFlR2`tWJʿ 񅧧M̸L& R03OON=^ښ;Mq * R'av^nxgTw*>MݸQ*]IJ9)>mQ!Wb;6{yβ-'B)ۗ7R Nw*#Ic>V  25 %P??!k3Kf %H>[ӧO e:|a{XywL[s:6oWا7(8t#0Ҹ=,lwe+bj ڋ‘R**ˠPR- aj )jS\A?/.Sϕ5|QC n!% oGar$9fMwBV95m?Lj+HKtWBB| ÝdDdfT.5s @PMx)> ԅ}c}YL,%&W'DE=IΊHZ|.L .!(uksv4Ao_PKWweK t%>{&" 9sR<:!ma/JwϷADnsw{M.cVC N)'cۖ,r x6`3иa%U|6^EX6#궂j}a;c+.u!yKQ?X~!V?psFcȚvs6yu]mdz#xn}NGP(F8{k> lxd{brwC=RCL"0Be(?6?Nc#up!m*PF'WftF]3*JiלØaBZ&]a#^x՜37&p"䃟wgn[ _a;CFk!2ԧa1{c5 ,.ldf>YgJ!)6'\t}Ɯ4u<4D 9@ >**)>Y`dﴂluiĎ@80ztń3 Pv=knD@uGpfI)BiaT$4jq{⁹ )z 2Iq(GGhC(j]'$B3%] i]V,C_"Yu?SzQ@kOqez#l뗨[#U^rc;m=/q|>.:۷sjkk|j&k0s2]]ߎNiQI' # 7SQOtM*OKO2+"!"ġe޴ty~!i/|zcL6xE2=Wd,n8,8h'|zUpsJڜ*Ֆh/(6P\R㋳ۏj'CbϹck(u j"Fk =ŗyv/wB).\p7Qi?'Q}LƿmDʪBykִh'|E)H er9s0ڥ/, s1fQF }Xr=b"8{={yL(g 8-+7%Z_{Fdރ33fq?]:rmNJd'+gj>;y6e9bp›zH̙d-;_41>Y Y⾵^r qT( OwuQOѨom#XQ}+rG~`E>m_z쟑kўi[OkQo#K\ع޳B2n4Gu A#KAck]ѕ6u-tbRU<Ҩ3Ҙ[H#Q^1R:D`ZclF*:dƟ?)f?i͚90s`?*ס[qdݤ 9#iSw$ZMͰT{;D+:2_RT)0"rŒ8' 69eZy"p3åӥjK\({g ]{eGu~_/z\2ϘOd4+:w$*zNJB 5S8tIc:;}6y B-Fz&AS'=S%S?&E_ֽ'f[(SeΔm/MR8PYK=ܲ)8TẀo r5g){@'G "hNmΧyҺ!p`5v[R|e"a9[i^~({Hr 09+`\|Ii  S"֡g}>$]X@{ayo@. 3 :<ҭ49Ъ & >r7(q$4{=hR\OA Y_s&~K ꀾB@;#&qh8^P=Y33fp ? , %V=2J!QF,qQs8qJ{K~DAA 10(oO8bXK\I`!w+jic~Jx\u9ؗ$NQ-3+Vy Zg^ ϸϔeNP݉Sbc&y_SyF9wX_ «OПzv\;C"y J |rvBKY"gDiBqwQSi Sd~k̔ XKSy&T ]"~2Q6:*zu.%]zOas~A_bEXgxwp sk 4VBVW\i8~Ͻs?:ϼ;s7, =|Lݧ^&AWJxq-G>.bx߹*NyKz>{MC:rl( - , YbP18[IO`M/J(=/UaݧEiyĽ Et꿎?Kʊy|(Ij ;Mc1>-%ݠtBst<[zozu * y d!!Cs׽y{o)jϷ=.n&l\gbDo"`uLN5A2a+ϟX6"V?n|{=](jzueu~v[zN!b4Z6|.k n8>iZWO$O>YaΈMZ~N  lHz:u[@޵mD[5kڷes!939\k$_mi?E+\QWi-4xo lx꒣lK$iEmǵ9wqn߷pbKyG:RgUo3?sWE1oeE!sʸ"iv,YUK j@cT9?ff"g9s?_pPGĹta[śI c-eV\^?ncsN[D--)3rx_S eFn}UTkLc )a+ ’@Hp>y,jUBܝœ"ɍ /f Oup=Bn[Qy̦! * v4O llyYbɻ e8Y@OEZ u:AH}E[G ~+x|CP:A`~kȃOHE#& tĂ!˵pSUOST85F002>Ą  ɜ90s`m+G"nw߭8;&;`[$5J[~#Ǹ0t xA&AV (`CP2 9rB%&E(L) ?MhA,e{UiS!dZ]'HŗN:aBC|B"pSuB#zWz(Ӫ*ZVD2S',/ P I3^SB 9VUrs2+E/ LZ@o?Resäտ\}ׯ7ًٴ{ץ7\v"%e{fD{nCFhC;t#>lb|:<٠ZSP%x R8tQ CsIQ)vI3o/p >wC^7+Bܢ ۮa@Q`A慱RSR:~tq$=o:hd/ge7V15䛮 YC+}BP3~YcAɾؓEe xWsF:Gw>2^YEﶆWdÀyj3H_O'p9Vh<{6<ӎ7]*ea=}a>q`6:l&ẃ5Cb$~xYpUJ %ʖ@?Pޠ>slu'Tg *X/3">2-6lU9^e'tK 0j{* p,]n<;Hfwg]\V{g8vԞ<7PQ%{ds}J^EQN<{o|q1` VfX~O^F(c'3h]_̅ lV** {-7U`uFjJt?0&wF0`q8c|h!8049s`́6^2\o[ `^`nDD{ȍ=Îm;fv..u gq:"!2q @U"rQi Š!q~N 㶧ކ~Zxs/җ~Sjz:dL1|m-c8`o }0fq]S5)n)oI 9Z(PvL-˔S%M;s^Z*-.u!$S:Fq$ JWy"ZfQnx',FC3@ 9*QCdsrk_ĘAE%.{~T_sx/1TXI|cĄVnH&ȫDg TGAޘ(쨯ٓ seOLG_-j:()>۲*pfZ@h6fUy vÔ+R)iw')-6Fpv^SfTż" )|>=+mZ2DS_F؁ }ӰjQ_d&:0,ywH#+ěW0wV~gAZ*~`#H ,cyYӝފ?90s`́!Dt1Ǐ+*DVh3\ ĮP2|d}"7K BqHrKIQ+ܓډ2܍asN=Kc|4n^FI z ^`ٟX曇G" WlP~ Lpo^EMH4e}֫q#-ƻiæ_ƅ4Vj'>DsϺ/2 I1eyl/BTK{R LB%ap_yO—*ej`8=tKf枬Y!Q42<*HŸF!iA?I\ /:I٤L~b$`qt;$kdxx`QPƄ2T@}E*X~wٝ~, RXDe4NO$% `$fo F4[^_#O'GT.ؼK'e/ߘ73fq?„Æ ;9ىws?GLrx4=b r8se ">cDJ9J% V6/܋gâwV8`K)i-&X٧'  ?"s"RM;<li˺"f*`Y:IcW;^뒪Icȣzq~>tZKV3uU@ ܽ.^$P8I^ˋ 9FkNv&Z񩓷T}1C)Ya= {sSa*[8 -wp pӢB\kKo+'2Qvߙm6%q=³(0Nߣy\yk * -k%!׈p&|e,|g5 ={&O'SϦ 0)2?c/t{V9^[[#&8#AXZiqfIC↛&:^I- m\>_z*l5>w|Ɛ$2| .t]gFÒweU"=%iҙ݊!kPc/}^qٝp :06.E0zK秛 4Ĉ e "II$-3}HVxxW[9ٴ>ܬhbzX&Пuy%Nlڲ ,> '+n6:=k~_l}Ĺ3}qD8J5ÀVuaL-3FJ>n kzp9% w=nI? Pq^8;sPQ ɬmL(Uuef%/e=ܓ"q%uLKѠK-]ՁBT~ =0> Ǻ; ϔ:9 Es|Ýx O.9+ť3UmJYHaÑG,^&ݧ=O̯W9ԉZ4 Q^g| aij9Jo^ou2OE}T H*QQ {E}g՟۫W?Brm#6rSweY:)Gΐ~EQW kG|G ѽ-iUo\V\ke+tJ)+BZycR4iOPB n&Kf]֪#MmTP18+2ut_9c~~F,{g$8)Ml'? #m6ݤNc٥|/gзh_/xBdC}~x5KeA Ye+kAidŒÕimsOo0r@ip5".4x)XB$ 1O ;ߦMmf ÞWÑ1`5k $dy|AE|g=a4 {?ND%/l G;HĹ3f8 [`}6w7tERY#coH+[fޡO_'xzxW7/h@uarJ*,9@v% ";_R夸90gkhGOI&"zI)0( _3I8Ã([Wx<4QhCE/³5 M LkPhlKnsV>!M¢#@用[):s'w[-F}\p"hmrIԐdwSSv ofOu]26A[ˏE *o᏾ZkcV/Xb|bܣ@Y]}/7WmžR5]oA^5V$u %`Pѫ{f%.Wa#cgMX-YngU YJ(m#y(xwf?,ܠޚzU e+Rh]$?1J.S&㷥M6Wxm#S4msG Mݠ U5TVQJ΃яw~N7#;v]?~pFg!/W z`q`6:d&ǵt ht#eS~޾_}~YJ8t;rxÏej,Jx%Ú34<bLGq[b`HןKRZR+oEjЁo>%:;ؠ =Lv$M9{ /1<}.(pxIH؟ҾUz{T$pEIgjUj8 _C%K?"kdntH{ cc.'5+ žֲWPzb*v7Ғs^džȫːAmܢ1r+ް< >3(Tt J[LIEF`VELi]A[LY#J g;ΆgWaf6(rݠ6CY@IDATz-W!<zJ#oYS#֒Uz.xn%q8n7C<а~+Eژ`o\{#31ta,BcF5Czc"EEb0c}Rfeqfܶ>^3#:3y ? iL (jjw`nКdy}fluĹ3@xp+wwǏ&*^HE,Gܡ'P]vߊم014pюLcqVh%(`%*yѤI 6l=$\^Jg?ɳ90~90s`?)J85qǛO~\.=3Jأޭ{7D=.Bd!;;Q 죠U2J,Uh%Hc"hD̀ ==M_x.`|s52n͞SS"C~)0~^_,02"-$0" sy..I3>c%g\Op'_y~g1" C $QM@5RU*WJ,\Zq >gw *.i +B\tQO'ȧG]+ k0TQxxw.5^A7C,<MC\?15n*RN-}5F.Ա*q[Z#{ΡVA^ZВep Vg\(~S~w%x`O&؁#9xeWLD?a1P위^A^Liz n'\"ul(9p 8*eaȕ+݂%3OO$Okg%O>**E.(83R; ?/'B ZJOuop[FZJ-*.&4,J}Kw9n/ !#iuN m:RT0vK =δg-|/U7ם7SoJe \9wDTrQ{uOG˻'i+34|!i8_LƞϷg?3m$-v!˙TUƮ-WGWZ4{ FBH|)Q  @#78( '%# xxWhc@cqޟNr1 ~2On0t4dXO 4:l412f#_78~]~ϵ90s`v{w FԐ9v3{-SĥҫIDJ0X9"X]&R B~.Sֆz(P:.)ܑZOrFW J"=\$occ>aO/=bSƇ)>5=m˿H=OXi@{ўHս~1\?g Il@Hs(AY R;l5zҢאR] H~p55V}equmns>akxTnx~/+ Qyp||* ~6*E6[W77?zcEUF=-o"M˙k_PQ?װ9_*'gE^kl(rOW1Ct\(Iu.pՉ rj EjGYgG4AͫS*s3OJ7U/7 I{_n̻Xr%E5|;p] F5J5qw^fpF$N3$G~ HOAV?\XbZY<>Ȃࢆ%ok\fP8'TA_;Exjuor)θe*7WhȪAQ 7uq[pzƔ3͜-kڑw(bk,V(*/{M[t>K}U#(adv/U>>쳹^s(U:QlUEun,B~ng0z;~uh>$]; =H]K5a5Þ45xMUW?~{a*,=^}䢸C02d{~WWJxiM^ Btb 6q۝R}∋VtXK/FTXy \8Жӓ Y%lg˭d8q+;r͞h{,&ޔÈ$ﷻviҸ"?p+Ivu~;F8$MϴHcWЎq]%"^$Ѕܠ.⠊b3:x߯5x3F\׌"\}cZ#6,K^`&n6\90s`@/(]w+nZnɿb[~T6}@" n9yq1L?dc/eJI60L.aPIrp'ܓ|&$!%9ZO U%( eE +N)QI>P*"`- v*/w,'\',?Q`mt'RYT%,SH)KP&mk]"YIg΅dBxw%X ~ɷ7@S0ڐ|1*YczC_Nef[tyyƩ) K?\{a鿳PYw{Jm=ӊ:paDf@T\Lljr_}@t~^niYʛg9/+>Ul!\G~#eX-*`Iaँ $l=p6YcDmEҶ(ziy/RD"T]@HV:+!~!f>p7|}cy;>r9 Gë{)$=^ 5Vԕu]_EVӾI3\_]T5 0V}nmY[Ҡwv=#UV%M ,o/aW{!/ !4 CC a3vt.#qckѱほ74WEfg柿#cK!M۱Wg@b`^Z!x/|[ov&f3fPp ^=pE`(;$ E Zwę?z ʭ ֖rx 1͂Ą) l1TѐwB Fi)D rJK ~/S!y>wpI=RT!T'SZˏLQ|֥);6Yc^iO+H 0҅ʔ|\sm$L{\}Ȕ!ıZoV'x X{LtNrqJ~7#v [^!4tgetW؄YI~u_s3f9{p2i uHرֵ;|8؃Hb[eokE#TSwD-%?O6E&-uJyN@ , v g1ҩ6bPN3mL7SRzNNscSz^sXFp9\2UʔshݏxgQ L'I@Y]!AuuDi0mҮ%wVPJEwMkpv>asZ7Q(^{jhHsȚUX J+fA9wE;]w{q#2I{[ M>Ҷ̤ <Vy\+r=y(ôl:}ɋ'%oPTwR-O /~WrX}6 HWNFGEo,N)K |2 A+ΰN*gm#H^.W6@ЫQ|^*N:C:,Qc#)PC"8Ӎ%*m41:PqI$^6fL5p);dS.!3|V @"|_>~%_s53f9p?۳! Q9C~ ߖ *3w?B 08\ɔ ⒕D"jp;M!삋2tVIg~ [N@?4o#&(/i~Vic i_A菐iNΦx ԉIgb$| _ ;cyeǧ"@`djCA h dͪW$a^a>t 4x Z *E* 4Zt('5} =nKp:Y}ǟY} Eb.iNdQ5R˓_TWWWS(NJ啱jͺI5$YTgV43@+GRvdD2혙?9^B/p`5f$ '7t 5u3@\~铏lM'yh,\hi  C쉬!,{6̼[ڣ/ -aJ Gh& P=Ln4qg f5mJSFXgƆG8NJF-U yU/}#xAE?߈7b\́3f|N-qy(+ʦ\DV@Tr BgFر-``B`g8?"uv*$F:HiIEgD&YfH(z$oXI6$ɠ`w,k?WҤmlJ e.s?\v.L3rRzb@<7Q,#̸oF_0D_[];YYOK6 L]w_xA==|\m lvSP [M*1XTme}(?(7joI?`Q\fE N||! 햙P%7Vr Qfՙ&d%>vVj;M?AY"k[9P;z ;b_ }8Vaek;e8Io]/xΡoƁX9#90s`́oG/Ne #c~Cۿwe@Xݕ%C!r DQr^\؝ n`*-jC=Jẉ+< n UMXe\I3(]cZZe-a}/ *5ظ6dy;[ t%>ri;i*5)xwUAn໅_f#-6IK-z)݀`Nq:.&BȾ$*q0) _5g4l69 $nXp;bB),Ky$$srMB/b~AZ&MSKW&?f%ND)M8ܳ}O'LI^1KŢTs;շFCC9~/>68t< G!gf_pv5u{Ù&T8U0MtU >pcz-*fBh7qϽN[% Ԃ)|[$gH҂q% "Ԋzij!9ۯD{a;͕0n_sC~bE0N'!г4 dO=$: Wì b[Ɂ ث|[J;s%O5nرgZ&a \D3TC*=lS1 PKuuv ts5A l!"~qt#Nzuw྇ >`}xUV-XܷoN=W4O\l 'g7s`́3~s WD@iEA@ɥnwßfb@Z, yXH*F$ĖÎnk8ߊۋJ1LEB,JݔRj{4h*FDqV% wY$Q/AfҐV شe+zp0zr ՈZ4 $B:R>zL;R!-ׇVv^sVj_m^$Z9 bڢ@O)*) =J\0NO~_?ikAh uX7p8)=7xyōp)TnW+z_ooVVHp ׬ Yz𙄠ky$G8K=OӉ8%TǷi'!ldopYJUoWv@96w(*jl.tp%D M~@8_$nL,j|ᾞ ^@EO75Zҙ,ao5heձ(S+;\g7[LCn £~Di^`wQLVY7{!Fe ȁx?KleCq?^KO1x㸚xc[ڷ5|KNIX;>{pBBqo!7!ٕxɡ'K{x|> ?$$[k`1Y Q5F`9haE>֋ϻ<Â?^ Wpxw;`BqF-7.` gp1,{6[2X>p*8bb}#ó3f|h@@Rt?|mS |tGF*"xG{Ű+-kFE5`&|TBQhLȒFb?GY[~.]+K~tiH&"ge>xJT,]8ņ QK>uZfT`{}>Uv\ZvAcᢷ+t_@U(+Co ۟K-Z R80 Ha'eĪhP Qf DqVJ_4De*)j?&I9nAh4BːSiC׃gt*~(pS˞Y̫3fk'75„ٍ%{x,0Szgjn>C;F+l,wCQp=)Dϒ랐D ^`qezX7<h0 v䍬*MGt#y4BwՏAzI1gu/& 47jD)rF8Q|yݎ(bY@f/NRGiCe MlTͲn=ʕxzFҪhFZh4[҆^(m,^52`IYhQL8 ['XȊ/9߮n[@iT]}ٽ;]J{~诌Ʈp's65aq}&kWakC Ăm] O#C|aC:E%ӌ$_s!Ҥ`<$92F"2W KM<|޼Zk2%;XAFuP)th-Jābv́3~4"ucvu.W,hJzÌ3 1_!28Fb>96P^C!(,GD#"rkYB #ŰY0 :Sgso: U8S+6 j` ;5ARX?A~)f/\~́3~-tau={V7yby`-%(0u:V#>^]vQLPAg>&2"l!q)4i5!i)t'QN83 4RĹHړ$\"cD9AwrCˀ,!>; p`^Tsic8kM2 ]]^Tk GQ4qg9ʻ^մV`V͜ϩQFTC[]#XKg*IE)Ci8{,#/$O~ZPAPBz U ܀_iJw;)dq[ NњK%+ 7{˓M'e=T%F@\Ԑk~7|ᛅxZ@RxbIc7|5%4{ȝÃ7/$C>IրU`ݦ6$' ʰe\]a\r!!R#뙳eekʎezbq 8bR:v\⁒k 2Ʃ|'I',=jxyW2oe -I?{o,Indgȁ]p^}qߵ90d!` ̎n[4d5=1K#OX,CA$v6p]\DN?("L$0I`ߛ( ̨yffGHاc5@=v aT2S@M  *D]ISr+{Q(.TiW=G߭^$0Z\T<]kzYOuw$Ӎ)|\_z[ioV0uZ+yJ7%amϷ(Ky^q-ES#|A>%P@l8Vwp *%7jZG%` 0rί#Ŏ:d82I3z.ʹ]qgKy83yU a¶y:3-`t|zTeZ/?ae+;;8h0]c2q( :V{#20L{<NI3`0'Pj:ɲJXccAc=vR`c|v%l h˨b`zï5"'sgא=&A i?ZK49MMg\ppmj }ckJI?f!g>RᝢF.(a<E>',D_j } ;&#1y՟dGp23N3l˂`GNάDLn%I#X< B'ϏdѢN$0I`߉N˒^ Wc+݋Wԣ'syц4|vu:=]{@+zQuPr0+9n$}4,~NZ;*?q|=3WX\zHR^Y¾#No70x.q$rCnk48O Ǿz.npuZ>;9xd$|4d(gt:H b 6wbFr6)M+L/X.H"ێo389]!vނ`ׯPq=۶ ylY`Fk {0ۑ}N;߶S\ όL.[ 1_9A|ǚuG I;a4 W 8~xlH<"reOa@پ;`Vv~LJ`[t.7䈦]kJ>#S_\ 4B9>*4.Wc4QM̰}G"fMٯ>o gcnwKyWYibϳ_#Hm3I`$I+ o~?~GOBȲ};~Ϟ=( Ug38zE9KT2ΡEwBeeԤ*DӮlp9Sq=`W19ܧ*~U)> eoћΤ9U-–_긶%E2 nh/z47b8VسoM)縞-%XaxR]+Ta+8+2 Nm/8;3nw ]mDG>T#Ϩ%#. xuh(f-/f ni> 2ီG58I2X vWV@0I)m%| ezPriÈgH0sɃ>9:Qn@dxO/3Ke1w2;SCԝm |tHOE[OZ ~r-\a})$Ҁ"_壧+dc{Af'ٌ1"qf˚h@ʆ[fO ր^er?G<͞)hç5}Ac#\8f)^VSj9i|vܕ @(?0@IDAT'x&Qp3Ð^◎*QxI1 lU@шG]C0 #@|%1>RHf1h;«"BM˺6 gU,cf0b0%oF +k~d5 :azG)ipB jAZp&A&S$0~& L$7oj*n@o~9ݽS/o[8_jBb C8Vs$F=u9 ,e$BG6u<Bss*W8g^pR4L@V;)6zսRJY,Xd, \ZʝƄ;Kp(fSsyݴ +U郎"ȹTa%1&^mq!Mw 3SOn jIz'id)UiSV 5(8|qN^qC:2b{|y9,32l!8 nQnV_[cdS&c8$⍌]窡Ed2 PrY3'mZ1Ix&^x[fwZ3rIH|L4|l_OG9pKk.SF5ϴW>MuS#_-K[X#S/uLAp86K*[hW(3DBp`C;^8.K[g6N/ȇA_ GA4^ uw&SlDwb#I3f&P}- ǢfCض7h:?Lڹ56 ;zExMIB:Y^sEٺh?y!bqտ̂^ӧ-qGZβc]ljmov.oy2m?҅O3h,I@#Sm%G<E 1 $YLb\~24{\n6k~- ge1Eӆw}n4=GބB垉}w}>?2C]8%Ew+#&/Q*M$0I*h륕t*|ӟDG&n=_{5qmZG1g8q~dfNdrq+SQl`glgDMQ(PRAb\3HCU`k/\nѩFi%NGi4y6G_MIj|tha=}n*o鄷ht!3۳K=&&K>*.3*k//VD`N:edZ%c͞π;兓/juGA)[Q-< omʓDKG1{{%]6t~9?UCw;进r, ?UG>\+>ZT#`'#TF- |?{E>9!R[GF9"LOei:N^ג{E':CAL!kO.)ƉרGObaL5 lXFLJ qܡCaB-юF\3{ſ'l&2Lspav- hp-5ٕ@:!j`E>,V[d6㝿RnzTZG0#8Ihط ҞOdO$0I`V**}#b# o@FAAbvr2+GReV9/6p*sbUT!%O-dXس/|9^j\/_>)05MeR7Ӫ^(~)uױ߯)ѧǎg^Y{ V +9Ԇ])@U+pެ?eeS);L7+Y؂|YWV.2(px [N9xaaO7.zQ>>`,Vz|-WjR\;*cEl.fUA FeϦ @+GYmzsm]p , ݬSV&^,p02D6.%8#CF|t╏TS9X'm3kGZv)vqoJg;s1b2fpMv?ᡓ˒?.MʡWɉskռȳϤ1 9] 3˄9K xD!-BtNUƱw,]sxr2r.3 "#3x U*,wtG>ǣTiO5pk` t,& L$0IMME-E MكzZG"2`_VGat (" ?=Ua= /oE,s\8Sfҏ]NVXBzA>NmyRw䚸 z*t=[a->uUpK^ˣLZwj$%EM3:bm_X )zDeHg}Yf @plδ ״ei>>;2|e@e3 D)C\[hgd yzt7 [ؓwFϹl1PJDez_">!S@2t@ }u]>pH=m )3mJ*I?2AB@{$PyeIdj aC: F9ATЮ)%k3>1SBG$:L \VM.+b{pS.30vuwgusӎ ey1buc`^~5cH绅Q$@lT6A~-I9b SVPA?Fևf=luy{s,WU@/ν`UGF)\EÊe8%)A!4 즜& L$w*F1 e?d&hh,*5+Z){TIv0 ,89ƙ8LZM*~qRQY>~Y}kqƌ6*7Y\6^~uK8BFC?'iץww$#UwuϝQF.ejgSa黄k}d{#ܮk2Wzzx|mY'=wAmhIeNqw\93;;VZZ -\ \56\5*; VK: 5Yӏ 7V~j&ޮn_"L p!\ka[8XJsڥc(0r:zVκeѡƍ La5N/G>a1$l|=OH ?>Dۻ}cɫkXQ3FL6) y4: u&-0OC29jrg2D?? lȻa6DMK:\rDd!fǏb}VtfN!wgDW;v$C)̊6%KB ^|\S̩lo[ G6IWOn͗8 L')$I& K@=&~D E㑙̧WG<&M0#[[ CT+~7QDc?x*/^eip90ann{)W6q]8fԕfЊW"l4w@۟ Nb&?->ݬFAE"B3)›K&Qqq#Drjjl`}?Ӷ?MdI*Ug2"u. l {yUq:"{z)mkL.xsMO|/Ӹq2ĀҺ XVC}Fĥ[gMZęq :b@'&p/_~ . /16:2;ii1Ӫao`)M>z46lne9_ښ0/ϲgޘ/՟/rS& L$0IW)wqޡ<0Tyu;%#6Ն)?`xTG0Կ@ji*j(ju#im!*}jNҵ0n@NE{ߢ>"8>\zljG)|~cx1yu1űԣgX+iy36TC3vЦtWd~"I3 })mTd%ڱ1pJ:? p.lxo]OmoX#;wÀ \. q=3si `vfN>wV +F#,1B4ɷa.G @s?oWoF(bp47$L 1rѱZb-}HgC6YWhGlOGC`{$,1 H%dUu{Gu>IFV(w:ޙM: [͍\$A<_x;+DX b a+O wli:8H,Yj!x'v÷{Ƙ71ఎ<ȺnПBcڃHfɴ p$?g,@jY/_4ay4v MSy]`>zv{^>M !Fp 5O@D{C}XYtbGqy3/"w8#*M4GQ9즏G qH`,'?p;i b7XʼF tؑq"=K>K7dGj;E֘Wa+ϥ&@iojPh!qʿ-K ܕ@9QK0(e:BXX%I.۰K(_J]sϋi~#˕kӬ?lq_/ʊ|nOɆxw[ʥ~o(Kd >3k*cX.H x&z8m1:_T ^¸?`~ {'SO9 ̆@~ӫS~i\f(_ sO4 K۪}×&y5.:V|$ܜX-`+ʒt\rGb…׃a?Wd8_ď{hy28a^Q]I`2\ dz$0I`$ jt?U0MOofww ߶uuʵ[pW,G}pkÔ9qW(nlH[:.|'Of*Œv0 2fc**] a[9 ,|Ƞ -@&r Ha9{yG釸4'W⻿3s̒X,{0 KuN2TŇof],.Uph7ˆtgX&f|t{ tߺnwwwEO.#n(nXֱ!Zr< lz"L^%|,Pn8 0rϻJ{ X9B>2bMGkߐ-fz9ugh0gHZK |ڭFmwF٩ Q^kGQ|mW  ?#?.'!FC:b悧G|c]; 3X 8?4fhDZKZߒf5 !I}1Xdz8d&8oI9ctM2꼶N-=&GgR9!D^i 1dó,wn;;"!<3>#5a06t-q$"0 KYBſuky%x3ϱO0VΆ̹#\4 c -ȩdثI4w-;w#gr齕2?dnI& LLvWOH燇Պ]9 ?9tąfďqaȨ ,Vݰ}M(7]_]R@`fY"u SՖsTX gh9;dQJݵ魟'N,"0wnQx#W^d<V/ýOãx&ەVPy?aIs'Cʰ]H4qюנN7:#SԽ?v@aj5Kb 2438ƬW ? mS/EP 8=/Ι^|r0CY7/=H]579}҂JOLr(4Af{ NLbA|g?H%9rk!WΩ V| x Ƥ`:BII#;dx`k0HЊ_C;hﴭiX QJ'ЭaBH33 S \/^B˙ Wdqkhs`Mx?wr=Gr-"a ڎ#qO^)p@f.3-m:>ϊZ)m>,]sD=#)SisR hX<ΆȨ= ؃ \dhn%%g s霭?@~4|Ӽ6EzNb@e`&۾+a!<$n踩/jg!}pg:? ozb!e$%_ыv ^Gҭ.`j?3_#xצ48@Sf>ZWUbл|3?|FDF螅ﮠ:b' w7:ܲގwtzeQCXO8dA]i娛n4eh)^GCf ]>Ry~YF`mDIFְ½W''11ȄݝWw0۾1;Al0PSEC乔d4I`$I 7Djrb~fz'Px]K=Mx|A`p'pxAiAReu8O(jR)JhTc'?^X~7M2s3}~3E˄/y2.{Dh 3Dz^E>*xΫU%~(׆{<Ϩ楃Z"Mu\tw+< 5n lG3꜑g&@(@ {Zx4eVnGMpJ xkucMN~/h;".1i4qZ_"^ ~B3WlO^c?ݍoI+ ``Sӕ"Ue[&XDd=@+C(֑ϲ 7Ӹcn?V;to0\׸ +Xg@b}烤]׸kY2 +JKȲ ,ys5tyKK4 KdP\5s̩%N*_`%̨@oGjX>cxbVO|/YbBZ(rq':W*}Y}I ywY vKԙB@4bPq.QXNk92nz06HO)՜H`$;I`$Ih NZ;iwC_q-SosFd":YČH8n @wAZ2Qo)f'G*&v4 IBη) d Fx3B]hW?*rY]o5] -♡!\y.J?w= %~(]>:lPr_[hO/_"Qjp 3uwɁb?":% K6s! J=#Uj:߻6+`l)(S//kZp'rs|+7!gq/g-tfpsa4wGet A#G9W7 /s;iJȤo@yλF˷tg'Heі_zw$'N~1Edk_8,)'ux{3q ilG ~÷vKAyn|["מGSJy(#kG LpFٙ~q9([WP o΀2Dv2f0 xz!=wͬ 藞f  F<1oDNCI{s+wh2a]X܍;~ꩾpMg5\\SQH{R"zp[.!VyL57 ^* >/˸~^>?IwJ-Z%$a5P~A/fht)rQ]\FJiIqޖʄWP?zw2"8c{?{PGMݣk6'M |y9;C_=k\PսghSd|a_߽0Mp wW@ ` 6xY^8Mנ8WՁpxlt.B;9TRXsEPe ?CB.Ħ/rgF;_1S(] An<*쟉sDW6.{p##ܿY?Xкǟcc!a`¬ ?qݜJ:Xn$g+檣T!֯+]G\7~b)\㎰Ҿ \KTx&s{G~ ?}ȍ(A b`lavևtR dhSt1LZ'rեz;1?T\4EK3n8OG6n |SgN)b?}I^Ξx|?\8A O9w(WbhG;`Uw&d[rP kVPsN/؉^ۿz>QkJZPkRFr&wdE7TI& r%B?oo[q7|dwwP IXl[cqv|fv>QҖ1-zڸƄaWYőATuCrz-V04xk8JdϕL㜻@nOi tNΉ+"Ϧ0+1rTn!6y81C-6=N OUDɟRD@Eٻ9(I싮lr=߂\adF/gg1Bm Wb_{wy ;}L(#o/@k0pӥUK\U0@54<#tw)0.w4͞+;L&ܷoV8],-f.qȡX4LVư(,V^n2"7\Lc0r:ʉ4O~lP4ܱ Hz3}}/W~\"?eZb!@Y?x0" dU(#TUHRVn]3>iYM#&&c=t @s)HuSl/l :È"xH4 Y2/超94ݺf.Q>#ҧ|:߽ya_a;QlN5r5gl]lIn}0 yL F/Ȕz|*/#OJ8wrniSdI x9_]x؍Mtfe\Z8- |msdC8@m=OL-^$ r͙CW1;  /X_ ئ*6I`$I7$Gm!~^b>@KIAGKpĕ~X=Pď g0t`|E|L' 0FL&Oaj6ؕ‹b"A6ui UB1K6$iBLsqWyHz|1#$(Оr yYP_ Qֶ-7I Mm?#QyhY ӔrR/p#.NHa?L'@:Si)|-^6飌KCɷ7;90i1oWG^ۢC7cL/y a2Gno/McDp$o#FqN8h=$`=!/ Ƥ A#;Fn7"hpqdXS樴@WڟhX‰H=»l?"QzA~B>OL+ MFiBz( Au_Ґ6_)TnY'WD >n1/䑄n s}ߎ3G>!#. m!bOB$F$3cܶ= =og+O"Ϧw׏5dѠDlOyϡf|JcORtZP~Ak{2iγ3nLcalWY}i0r6;j}P hGZ 3~JtRu[<ɕNM1M$0I`$_ڍ p0 `>_~ڱHW=T|2N8vdŰU]K\UNhsGyP==Y>ө8iNsugL:r8KxLq2Uu(Dcl3݈XuM/ oqI - mqzȿE%YiUCry0])ȝ>0tKN POuD!"3I'Ol5d qL lr  ƣYZT(u^l`eż)8gNNl[,H0r|߸r#.A?D:!;.c(jʦ]ɑ`)US tf+.5 lvO H [k×i4T-$vJ#*^ _?Id)U=q`TN,܃l"# $5>| +G$#67hfaEeݬtpU!K|2CdD<(FG!Xk51C8.ҞH[~?K5D;Ɣ8);lW󘾯\a"ߨ0OH+ o1ˈp.CGKDz:kfO^$Z9_3ݴ$]sG&@t$0I`$_GNf)nLewTcw+EgNE>D`]g S"4p7+@= ҝ#^J#g8`p E }`Tl4/Gg =Gafr 7 e Pt<)(4_8)WI+]x#yM#,m<IaȼX;{>X| mdA&[Rp=gudzN)>V>*$orR%U}K1Yڽ?-gHm8ÐlEIgmmK`AS^N"1 w](?g9|DΒG#|OF?N`θO臸dm-59ȼⱆ!OX}5 .23ih'QJ ӿqbJ鯝C| I,%@="o $?xHgZ(iQ~9 ӼԆf"G2OВ,?ښ,_x'7B$I& L$p}.wy{l koLGkq1NRe=NƎp2b<2cb^kw#hHbUW zJq@u4-a I)@~UIM"P4nl! 5nC$2zbj-`.@IDATYgB R^Io\dg;Jrxv0R(-* dLUz[mZYѵ!R_X/G3o~$p#2LA7!7&> p5zi3 YdMᶃk#߉/QiA8S2J]F,7Rh;gld>?,Vȶ5Kkq3(v,޳Ep͞P~Y@s^Uqr7=^k| $yB1, qlB{bVMĄ1`K|a3.=ȾEp$nH"`=a-͗K6bʠJw% l D_?V?h}Si8F2q . R5wJx ژ5Upz%a/rx/:rC0#]OtrH?~T2;)_;fb%!pC(S$I& %Yz9ݙH3q'v.f"M݋1pj: ĻFy9rN(>]  jtLGEK ZN7gN`]Ƌv4~[eU>$ӈ!:t-e ~CiΥ~@J{yJZYu+jגq+Z-t5h/`gp#48ݟ12G೾P]ԏʶ)}KfFQi|[<7slt*|G&'p%B}Vqp>U@tpެLJ,+ã?ਊվl"ϖ0bs^K]}mJG#Xn{nK$9: ^"3F ϞQcEF#ʔOߠJ<ʃ*=쭴;r֊G>=ȁ[ >9zޒ7Vot#]Դ}0kZYr֨jGwNU/i֯sM/oGn #{4ȍ)h,g!sN J tha^5YcW&zx#A1 qS#RZUil":a0&|~.?/H`2|A0S$I& $oqPnhdKWt F?c|TId&[p[I-~AtC@42pD&WAҴERx@.,͐ygrpuŹ%9&_n&1PflT&͌~'`Tu{]z94?w=1 {K82(]M=zxQ<"6Җ9mR rkT)Lc.f& ȧ,6ɗ :)w,[jXr?6^x!.%Ă %g q#ீU/s #*EFb^x@i;l[m0Bq4 ^N#ų1b7"JhDb®eԗqb8c͎ kε VEtݥݼ\o{0 lA߆U%pt!)vuU驲lf.J:sޖ"7"PFAyORT$Ccwo jƥfe7BC6muye:2{F->*Z?}Q}xaOJ_8cd1ɶnl;9voඌsf J-ǶSݍoi~#|ԩ2U iomYކ9;fԌڍFqL+G$ȿ̩[Q#hxa*$EAN.GwOv:6LxZՅ#pߑ 9z8N;{@-@=2<¿<ܕ&@I& LǗ a> 7O8h fΈXcݕ: f@QjR\ 6*~u>_<1EPɂwC Ji*+q FjS1u'|bіTg@n-4ɏ2?n7J=݋F5<܄og  iF9^yHq`0.Cl0_LAV ݏB;D\(C>x9#ۦ^Ͼy\;xFB.#㛻?}͑ @u/{ڙ.kKY~}zi{wʲFO9Pr 1q1x- 2BDtku:VZ8zLSIۄk=ʻBl">_"k@Z3:;.G=.wl'RnFvl?GI;ݗœEALߤG|"m$ODX++}v iҕd Z7hA=Y8b5NQW|,8^#g;wlo3b, 01v滿|r+ e.8T)輣z((C+b]k*x"3/r0즳]quc0 $koԆ2A}{! Fi=\7M8>fO~ÌK!60XasQ w ˗گ08pΞ#Bi7ұ9L˲8doi|v=e54C` xX`,?I`$I Xt:2yrwӭ8"p;F Z ٝEdɹK{'[F<`iX/g:ǒ/*?3PE!ϭij/^/VP:~܃b[(TA_"˓24(pђJWh&(0iR5L\( o]g7Z1ryC *Bз2 %됳uwYucFf :mF&zM{_.]Y~ ;K>`˵p5g _tYms<+KBxS+PMxz@.q ?p7wAG Xr6@!N*`^n˸΀x[_ )[(+\ +,l1̫8 (Ԃ%zW~~ɇ@SØjGg"Ǹ-ؤzvr |#^>%XEID|Md%kvLVH#UWVrKH9e bW+֣!݄O" Ӂ #X: bcfc}wMoYY)ld!n{52W1+~MϮy̖#|"p˯US|~](m-*(_]!^E@oNQC[ YK!MC2|_9os UC] sS%҉)Y\lF\K4ŤL x{q^u1gb gW/ou%;Mcϟ0`I# Cb]4 ou$?"d{lI& L[I+qJG.!pZ=<,Î=.-!pq<~DHRT4~G4/%{ 84("hܨQv4=D6ݸ$ 3E2)GJ"g '6*i4v,^Q> =݋T+~va\"A[2h2 2 )'Cd" _t׳LGvl ^SJ-`Z>;zF.q^k _A@8X:u'%{4cvIF|I1Ŏ3~SA |l<3 fI#=,ҥntg)Nc4mzU>g)`yi9ґՑw`!;g ?eCCc {{Ϫ?n`KHwCɎQs_ү^b@Ŷ."|ednJj'|5|1"ȫ|\zȏ8-6]BDG W}mf'I tF%"K" #}z죊?;Hl7Feui-KlyZc\W- .a l=<K^ SO$0I`$Ipl6{5EeɵSLq~ܣ QX[*rԔ=*U͖ລyԒt.uːJڙ^@*¯*r$ϗeS]))I{犯Z^ CCϝ8vt=Gد% St;mHq*{+Ll[UW1dtl0, v0@N$ 臀ֻBG9e - ^OY4;oōg:~H>ɆtWpAw1'"/x){JĦyDܨs{ۮ%~iY.$tc q w5=-ZXcyg3@zA|T83#-J@W '+|lS{\ :Jd=*:ɤ?_*F[XŌ~iw:,BH.ɲF *:$ g|O~QZG$}<* zMT6prɡ 7 A)exJTT4:dݽoɛ#N^Xsd2tM9K P}Sji::;Ng#&Za A-xd\7([Bl #B+ >kL }KFoLC9td~} L«4jӜl&{3͛a3׌{yL٪aWF j_ @Ȥ<oəӕo ޚ@zz?GN|mtV=}n<}'(pYh?QV<.*E\ˆ(阶HwŪX׽9BMYz挅-DWlV?E.2.ݘA;vlO[p+,+fPՆkP:?Il3ŏk: gk<*#QfEPHR/E~-{uYoIފW dfEeZiѡ*߲+8{z |W%E ^>tb.Qc>o`akxW2>wϋ/ɷ’M%R۠^:ɍ%P?& L$0I`J%$2V0 n3 +G#؜H%IE+j"UYg,ůJ'屻^3JSaž 9fBŸhgN~\3&g$.="FN ȌBl:@9wbjID%8#U*ٹм3ϳkqZ?b(j@li7nQq~DimӥXQa_#^9,يn@;94~I>er*eڲ #@./=]F-;o"DE.TƔTt.A')c?Iz9ݳ卯?V4V;7}tyk^f7"ͺv脢,KYRC5P>)KcuӰ/2t|)N^Rl]F:)okЈAk,QzYЧU pz`K<`?2ϑwcX0ӖaФ|WUH~L_\9Ⱦ>s)g娶yt(a F "룚_ ;v2i+]8nlҘ#߻=9K>}Zuw 艟OQg7FFPG IC~(9gd)3)aʆL:=>K\mq9 MXh+UA m]Ed) ӽ2'Iq6qΞNSy73!:n[50wgO35-4)",x kQ+E>1ON w('Fl7V`z?I;EČB7eLzuE:沭aT#]覣͢0S:y8e&cA~uϡ˿ݝ~ߟm=o'N$0I`@tp㎎&2v#_9u 9vޣl[N?_XxThlXt8=xH JUqL F_-Hu)fA W3IWU *4`E"< 8Tu=_RA9#YBƵR pˑíHºM|h:6A/ϐyr+GN'AN ɨUG@dpD!/#/AxGvʻq+ٽ{}w76f;{wӿi#~˃LX"kVΘֺ=t'3-oօ#:(^#SɲvY;3þzc0 6}˓omAzie;VR{+! < JyYc7ȇdy v䴈=f}Ac #;;60Li0Q; Ks^ge !¸VFW>[k2]m2n{FF3A_KOo7ni{+#7Gp|7:TEww:M)UO[ËxU=`RR!3HoBCs'T5lٮw߭~zrt6'(z^a_ F8I`$I?YJ_r* w*iW{j|rڢ8@|@vy:}a&4- sD|{N dCEIh,Ѷq7Oxtc,C6% -w"sLeN+Dt䪰P_O~~4ϼØ`'@g._6W)η.DC!8:%(I/*jG$6y$ma` [Ov2@%`_~~(#:`vwv6.Zkjё 驗oI ("T lNIW]/ؤL4w@kۭޟYIaZkqG 0zv`z7DLu7\ޛlKg>!3Y ODozQ/5-4A"9ĝ|_TވL@7MMGQQ5 EEUDl sFYf:@늷ϿRQq>Np‘aS{CD1EY~iھ:aǍeiʐ =pq T|7ɀ32S"$fOwйݔҚ GH'Қ]QfcK*H.s\Ku(!=XC ՌK& L3^ d* 5$5@uiÛ [3>ah3!͞9=> 1 E` ,=rV\۷ MDZ^nxWm$8a|I~_@נY~)/'vcWJӖvx8tui =k'MmٱϾ]~(Ԥqgđ>\-Rk55O W`~ f?O6x=/:Pe߰BtE5߼}gooo~y1q(</;L80q`]X1.D 8?a dkB=X=cyAyqA|Dx^޲= $y  ܫ&4 ~sܜq+p- 4Cqtrx-B8R+ oEoR>oŚw.C?דLhRƍu 0< SDum+* 4@Pn1C{m(?}СWqTje~;THÍ#˛tW/R`*/!-\`b$mݩ%Ƌ7h[`%E\]n<ĺnb.ߦ f:FW6Hȯpp7cH$)jj8ч5(} fA9(;bDK .ر0Kh//]F]i24 /xgz B% ).IZ-KNnG 7`xp{\];#=B]=ٽckL+yZܬQglYrxڃwQ[L xPx^{1M9#s绫%EH&N~ʻr g|6W9e5^4lfwiAo|U2sd\mm1/ YN5Cej]b>+42>:=Q}Iɓ80q`ā~?%8o6#G/h:0]Y[[g-5Ȍ"LEQy5ޣs٥>zWy{ },R0[ozb> 2|<e\oHJ`ƛO WmqsNӜerRfcA# uqSE7QX(Fwi"[E帧^٦03\2bLxLc-zj 4d|9jH䕨 KJon>->=lX}>s6~KFڼ$5yeE;}bzo}7gg&gS'L80qXtEPR*w1J7 DVbf%n1V./͆'#Κ_\] G.se-%qoA{nhBrPDqosèiK/Lጂčh`R.M$BGMslVKLqRt@ >'?I-Ғner֦V6c.`7蹗mP뉤hZ}op?EIGO(P=`w/̝#UwJΔiHW1RWBV=tFn*. Tx"Ou8gSCi_0mG6deWzpҤDaů`MlwvTyrk[/a+`+[;W74ɳQ.r%N[j o;јvM|YgiKu쒝ޚW)r([M]}Dy'sYU8>* `(M0u[͛+_ iƷ(m/𓾗YCŴBl;~V79ˀ-S4}0⑿~ %)kNsUX`N[/mٖ܏ 5Hf>ԑw-~\_:h'}lu~S"Je٥Xw&d8|$p>5|y6_ ?G%X?)"F)??7)>>ZhF K>{- ^Go#D:)iݮQv,[,g4l۲^_+ Y䲞O00\@pn?ٸ#yn ;$=%V f/qML!^߰+ UX|`o)طZn1 SKiB/W$%V?q#MzKQ^>J C&x`f{;{d~nR|#`jā&{q  e柍\d9{'TEL:m|Fa^r <lfJ.'pRI2mR(E,Ҕ1A0PJ܈Mm=T)RU$kno;Dy)ٴ[%K l̬?z+RvCz " (Hr}'6zYfgP`96Q؍ 54n j'6g7gwG1;f=~ի՜ o%4ok)[vKjόCdYLG)wgڨ6rRo (\Bk96kIOU 9%KPrrh}-"H>KA(*h ĻqtGڙ0k8s.9IqJ cٍ̏Fj7 fw/}ٜ3pf$K;\ P"]Xd@\~1rSg&gS'L80qG9E?_\p6%ڝ04ܜB 5@udkt/ @"in4*@m+ v4<' `e.b _FTB,r%s)go׳ .E۠x){vpwcÜ 7bnDhUJ;A']৕yK)NTg"7l"` M=vL}B"1Fk?Uz=/g;kO@[ilߛ7@XYIw`{TJ;Pdo<3op2#^_>,Vھ^r{a? ];\g?a8w@r$# #Ly8xw$M=~;BTz aC䏬?<ǟ:$vN:k٥/[?u'X||z?<I{v=KB`#i7?Fŀ00BzO:kQ)EU- ͯ wb|aOD_o͠SI9=N/|u[mR|?5{ā;0~ ~4Y?o_ %%TGrz{F᚝0uF:| /iqrڢ( yz@l)V# 1RQDDB\U QkTJ,nĀ. [ST$ڴmZ%ܶ!%c@hԗF78h*e'nRPorlC{[ ! ")q+%k_b bY' Bd:5Hup9kzlfce&@AȾ߳%hr=/ E2 b&&'8Ke$pә:K!;㓙%z œo&7ݔL0¼1ٽ 'h ;`̮64d猤 "z|Gy\[<@{f |tHb(R0 _ F#2ZB_kG=K(|LX+#l` Ȕ!ɸ!Azsl j q\ul-^ $ (ON/#`OeGCx*`V-/ស4TP~MR)@h.,PqxvyE@IDAT T7_cwTHOEKoHZUi~ ob-ƏrdlĦ@mlPY.(X"x^lQi ۻ(vֻ;/Th}/8<::M KÆsN‘uyÈQʡ~7` g?^]QuK'?M{xB =f\>@ Dy@X_}>h%W'P4_8n-"g֑{tzm0g;.~i}=.t\\=~}-ܛ^/7JGT=ýGVN80q`ā?G⼋\c#(08 D\/eu$|`7G6!A%AM 0/f#MhVⴏz nI@F-EnidCX-R"l?k->Jp~^|:F!g͢k8J4/cH?A;`[Jnxܩә0_3Xú "/hHX0Y%K:Wm:aa9C@qa<4S_plK^TՆ&qx'+YǕ\۝/#>Nd=OCc3o ]Ol pf|(;#*L ybe#]uQ{u`Q]ۅi8td|Ud뤓n+5̮|Fg΄&L80qߑ6ZycP7rOCb6 !{{n9y:<%@8DZDDC"/AoJfĮ ȞވJ%/'o>0% GM%^qݟy2dsU8-t WDoĿNT넷pg Nlw7)>0ā@R?ȇl=&*/Nvcq ~C9:5*gie._ T>+9IOOҥ?唵'UJHeu7&hW۳QsÇYb{nE dΰ5^~_d0P Sn0*-Yuw  7+c"")d iY!v](jZu[.-7ߍ8^'=p8 9кz׵k ϼC6Yiog@B?X 5zrAYI``ǃ;-sɜc W8SB!]=Q뼤" zFƇ-= 2w鈬S;xe.B&h2e4kJCNgSE d[L%Șma: +i?-Ji3;ysᥳ>$`S) $o?$XMZ5yx(Hx? 5/Q\%?e>Tp}3>rq~IdEJq\zJ09 ہ"\<Ĵ{<3y;=GjZ4'Z- -k}O]^V޽.|}?{}~~Ѫ>I9Ɖ&L bڎ Tbv*EGAKJT#DǮpBH`L2'>W0N/B}BroR\$cp;J61nxhi"6Gqrd%Ve|=ao"vo^H"$#N fX EieO]旍.ZN~c72;ߕt|dA8MS!y$WT0=UV c&n1R=kb4W g ,ԟ]) xPm{/\gY&Qd%4Znfqys>wfԖ['$ۋ4we/t&͐x <6Ć=1lG,<`uADN Ə ل> ^CAd +xNKRVrFxnq~h0iO;Ɲ!wFIJ!쯱_ku %RPK{:># ې#O/o`~12zm*]ó1<I0 &L8<)z(?-ᜓrޣ $h}Y+;'.B#-KJplI*=J8%-H5iaD7,4<벛-T >;%3]⧪<=`qu™ gN!!ѵ0))2!>9#3NLʕ U0[MҘNojo51=اHƮu=! r֗AAX;@\Iju*_)U!O/ʃ#V~]ݓct}.a%JNzb*x\ SnB VZ;Ǚ݅b07LK㫸 @+2쀘s7؟KK4fLҙG c+ .s\yğBX΀i?ɤ }-rLzp,cXecW&㜀,xwKU \,1zLO9M"|'qcF'A: Faq-1OZXuDa`~g])7\kEG@G/k RuUD>YrBK\**u!&~69x]f0IT.=8BO*@Šz>Nk!D#GTVʫYF/(>x+̱..9ޠepfK=aBkA\T`ws ||=ӿcSaMU[HZ("AoaV}~d|>5 fZl7݃@+*VmcQ~D!4. ^~ٶ c?fbB7@T1t}`{{({?|hTqV^&b7zr#,U%qU^|Lh+w,縲d6gNX(fG.L{g40ݞQr0x9=?ϯw \Oʀ&L80q [X^%ϗo}dfu |?s+V9 Y"9%%&il7Xb?b!j BS  JrI8;51(A V$q!%IC"RA"3Z#&곞Ӵr+b: k#7VwKBd?,-9{?CthCXkx`9K)4^X1pzJY]?_oF4 boAUvՌ>^NFC0ypcdㇸ>XiWS~wǠV?&C!x׼.V7KaHߡ@.pf[pupowF0s[{9~]fމ=JcIt/syKo[/c.> Dg9[*>AQ;4e<\Y'cS65Xp &+IEA`#}ARS(`@(sm/eK źے}q JnYwMZF6Mn.5lOxe_݆_9:Q2m,C'h+&mN~ q(($1N0 *_R:lp~y1l?F/uˀz[ U3zʼn5sH;>8o>un/8"zQPطP#Rj_,Is±sf{:\ #}-2P{fw WAo}& CŒѽJH*3;;w-C5 )j폄18\Q||?(=M/Vk9`߮ oxz?$܈g'_PgNM80q`ā?{tͻ2XpD`ǻw=_ggрHE^XN`4 %Jb%lX`N@D JeRHf<ߍ%0tO; ~n?i~_Q'm-aU߶犰fM8$/Fv?,jEeeEZuq]i ܿT 50F*`z AXAh40 gi1f,ъl`ko?50Қu9r@u5=c&7.~rUP|#paܹ~kcF=ڠ79>fM[HGǼ,-;c|̅Bv<D8ZDk@;slp8Κmke?t8-\Աs4|q(nA:v70Q#OEx ռ6* SlK_i)>syviffhDE$n.g}@ygϏw9x'C̷|F_ֺ iaxԿb)No\'LBij *BO LnZ,X<^ ^8 b`S*IO}&UVvM8hKUK/V(ܔCoϵP1a`/ZЙ$1'_>ӟo f_KGwCw,xj ՗ PC :ʄE Q"4_#8jJI&GAYc1|O}+1{尧zFއ;CaA=f>|em*!ϋ5jā&Lb^wcP7 8e'z8WNBai{+f@.BAn0~c$3r" ET'EORA@ -Ɉ_~O f8U:*#Iy$߫ KodՕL=59 Eڐxe&b7I&FG4r0Sm"8pU@} u>#Np62(pg4 a-qb.LGgf,ZU[͹vk쌦l੔b8+Ы߱b$^IZv  0%MKK0қޭk쒆rM'ڏ$k/@ޕ]3܈G51NFIgAi?9Ǖ@˞OfD7yb"״r/ ufV1_JQPQ5Ý1 NU=%>wys&X>Kg%<&N"lZW*uQ{p-HMAa{yIU pJ Cb9.m\JZ=]7,JVSPt9cLEٺ)/~Bck&xzBu@*jL?㘾:W7B\G:] "5OhGG@@ͨ]n}P>]OfMJނ͗([ +/نJ+7]$^GCzyjā&qP<p #@!zPWs )8bL  u@jJU qSOM_>wӐS1/8yJc9Ot gq[gYD* @'78eq}Fⷽyn3(`mV#>[ΉC7-lLE"TH "7c< v?0ͦ TE`xlRzAh=Ʋ~"_O>HK*?\`S}wLprw;2ġI9@T `ηD `p9 TdS(ߚ^ }3fB>g.oUݙ_co176#If dk%xڀq|ib[8w:9?4B~꡸Ydf(W~*>*갖xA[f>L7*#T;asx#Jj%P,fqQWo;U%ANr}TATLM=A+&>Yo3e`Q?4x1c@>gC'^iK F?*toڏ)zazRJcy|dIf9]ZR1Ng <`$&'2N80q`ā?ThBթ@juLw983@=1" 'ĝ.솆PZ#J2sH)Oy9݁Bg41R}D?7FHJFF0C Hi Ɣ;.gOe<4tCKy9i-| I| w@)LT_ t@K0,=u 8b/+`X0d9}< +ʥ,p^ KYi u>ujzV7*]!z'JJ;+;ƔY ԏL^;K3|gۣ@*WY++)\݅%?VrM dSI9363v.n1QAS.7 (!j9[{#WY*1U,4چ_+M㘜p ZVɨԸ1q`ā&9ЅX~yf8!b,:dy#]y5_7Hl؜֣deX8%q+jZn<(YbT@Y2l ,œkҘŶ\['Ch-Lj8|pOK{] b@b'_{$'` 9R>3kϛ@8 a/ Y ~knM(Se/˨H!pı.kt͊)ƾ2LW.^FAn}rK%vL莤> ݔc5#Tdzv<%v\{6{/)̔{w-7^Q |{00 b.88cƑ;I{qr:pzߍ%|i]4@V{{})%#{-K޷2L1)Be޳ܳ:Q}%%Zk PJO jg~ GMtR+Zl-Ls 9Q#g^&u !j} ߿Y3~8i9`YH&3aKthD=gQ/A|Bqwk.|O#9"LTwۦɖ+_|R ?!P/&{*q>HPXAXB̔ ȓxf1$ŕ,Q~MQ04z|8UIDcB|Ϭ3YFl*^,s%39Ƒ^' W+FK ĦOl? {bHAnS'Om݁|?{@ٽ;?~# vմGu55Kuޠ Q+g*P5 FsqqW.[[*>ln7A 7Khz[3ttb3wgdfIYQHN\{`3Fgm(8msp ,hK0+'ZxZ on J ^BZ#[N8##w 3Ŧ9~ʔGB`[ka>{z|}ό1vkC9 Ǯd 5Tno?dŌ+H*'^S,j2O(>?k;^8va{J!sf@a<yJ:Iq`ā8HRˏAbϧRT_*]Xr 0i%;6az<~lK!ϗ;D0⎈XE8h=X*ZJ9HJ8e\άQ'ʂ.EƖ036zAJ&7X$=5C%ul`X-3l"? $ fHi`GϤOI؅t-Q\Ll^-=$6.< -g~I_P.-רTH׼Lz9m-E P]-hD&h*ԩy7р833nVBqug|g]n? ó;<ʀo]-Kspꗅ5s/eeVT$Uabs P⷇Es]-HAݕzڠX9.v 0ܞn{appk(]nXP H-eb -`ue 8{xn:zԜ OX 80fUP8:bK<? h]F99y^s5bCjo7Eb 0M|*pq @6#0YG47JtY(_1{3cJ_3mhg&E9Ʉ3[BjSHrm+4pύ/Xbwg{,Xxޝ2* 8?3~`v| Ӣ߅v1P Z"uX~~o_ 8g_~} . ̕ #\E=!shuDqXs:?x; Iy~oxh7lzru26: ^v{Qr"}@`VE_+1Sq??UO]&L8΁.xxIi#3UWo>޾]^N=c/ D^IyRZtM`|ayKF3Ѭ["a)!!!ŌKTʄ$ԆBYdJ8`!& >|=OעA]OT![#Akk!]M0&c93?eImYZ{%l, s 0̫]iF'"ST1m~~epxp F~m[gwbع}X P*8𘮑Х^``"Κ X3@)pah&Y_/nA7Y fbU& qK)ugd :&2kN}ߢ$q3>> T՚1tkz15t k~3QL< "YUDz @% ~; +^a!GdX~h>k޼hmxy%.Bmpo|2_-g?9cW* v?Coʂ96l:s׿Q^r`R4q`āh"]"x]Wǣr1*b掙KgB٢8 `]"ߘx݈ct"گwE+I&LxN OzžѦXݬ Hfi>KqT*q=¨~Af')?D"jl`ĭ#&B9-zB"Ǭc?Q\{DXٷqh0v(Y+0cu)4{rYXba@6sk<=%RGg)Ȧ^+va +4k/HJYD+ tkC,}H}G4Y^% o=Ƹg Znr$qSst~~ 5N2 svMAQso\T0,)NPiyrCD$0aV@"8,czPmsJr‘gk={Fi@۵vk3{ 96!\>mMhum3jZ"K lI~˘)8JqCio4TJA _ Pa۵ ×JzLjXeV)ӝ܀2&~4IOR:vœ2"BklJZmC\ n;ƣ0BG>ǕotyD&/ <۹`9?*vPk͛zAa.bKR宫QeyHT3Op`R|)Sā&LsyK^EL v9:œ_TDF(W6\0|,KM'UDbX>SxYI˝UE4y[W#("\&;"J~JSk`iueZ4my%V֬% )=sHc4k&O-xF,Wl6VX0ɱ[jA_8wG93_RtYCVDq4H.k81Ñc  `:/&oDM/CiXA̠FʰR<,I+Skzg;WZc ln/2Tz gtdj&/xsw6`^%j z g#l_!GY0 HUe"Pȥ[H/1Jq6Ͱ)(\yWpUW6N#x*kI7!l Cj`LkͩÎ!& 7d* 㯮qPYZ$7(.uc> 8fc+1֫QF{ ܑޙ G 晎uc%AX sruxbMn&rc1(vuL F%N{lS9 "!H; i0!uԐhB!j_S F emmz~*,lhoºc>rw Smʭg/w,%o

        -C%?ltcX.^$2&#/D}cn- _Yŋ,:Z~hngwKixķ[C `gLGh dZ ֝lq?h-V[=qw#$`nO%ʷ2,r@ԞlL/9ܯXu%^r -&lu^{ŁI!ā&L3d7*R٣ARŬ5۽^[-ў^,4錙:-aJxHaX]"(,!Ő!?V+pPjB$5AY@RG:2+vRBOS?+WU ^ lbUX8s_/`Fvqq (0Pi}dnflgZ:|ŁnQ@Rvi :rM !L]Cj4K TnV7'zš9sM|}e ֈ4fLe4–_(A{N*`d)E7K8`m쐅 5Yr l;+30֒F[ ps=6]2xN޺[\;_ .P=λeo6 KJhv G[XOhGnE93$*Wu:|'zP%җDcDcwi.^{3^¨mc>tcސ$E&Wg%O5eu!-IK*odĄ^h ;.'NKK;! D|xpCI .;3d=*(%ZsCsbQSZnr/90伌&L80q`ā?+(QZ=IŶQN"9=T yl KsTz=!Hb:, #gv2 d)#Y!_# *u^ߝv3,!)"FYp’;Yr?~ wsc)!?$9;y ?ur)L#~@gf..L">m8դ߬l8 \Λ=`迸<'pWOxܕK;6L9'e@%iN /R~i"S̐DZ5[`.`H= Fm5bD$8,GMq=gKtnhiϷ4揗Dg>T.pQAfwfBoUGݱ9`]PGW6En^UھgkrAljo3갳-;Zm h ʇ@ڃL=:ZL;k*#QHǡ}Y7\1w0 ?$Á3[?S6~Ȓ 1f^`; Tw{oELj h"3BB#^ -=qXyZ Zʲ]{5V(ˠ[ Kjdy WD*?vb $W o}ƊX$~=|`|s?o?gH?qSg.H\3[ZG<53 qgf>0k{7Z͐YNG\puxG 8yLp\o#F?לrF6x|xG6 _,Rn_Y#@m|B#> pZM416&&$RB6AD>< "7@gr&J/=(cP`@gXCÂޑcDFJAyC! 'q6!9UfJmlAWI 7ic PpO;6%@,`-]FʓoOGsDl*]R}` -.gx͖RG#4 h3 sevڶ}q5?: Hd\Ōi~kwnp w,YRPK˜p7e/i?Q|6kŚ/N@?I*\nPqRꎱX+DJ/yҚA^qH \E0 [@q^37>Î"ZGI=dyO|APcΫ|Eww~[p}}M8 <+0uqxv?LK;qDĔ>UOq(02 QUfV-aUa JȌIH!0'BUh~`10T+~Hx> 46g9z! u9>(hw?~cyi3RˁJȞߟ (#(%K `sC2I-oj́b S t?tȆ$8^7Hqzc5m4gudC?g(PTd,.H'EǮ W,fx_CNW5fhwZ!H?0Úa1HyKx_nvxfI@V9;YkRv:{r#`[% L}uB9{Mu?vIdc$a@'%vz.TN;A.I90]cq_aȦV?gg@,u< ڗwk4PF2a/NJC>vǎ.(Ha:<4Iڒ} H#3cC@\3h[j,%CG{&In#]3?H6gfv\n kc6vnth54TS쮏y*6GjE5@WdD@Duw8$Y'2Q/#=߳%g<A.((pɂ<]w:R!uݴ)H njaQE 6S~s\(GkWzӊ !l4B-"&\y>7T ;?9XN~N #6'9L~0&<,1A buy'm8";ٳ'˧aS@? hc76Z婈ͻ MȖ* Bg! "x>NX'囅4>m es-= c S 8sy3p1I/k4s(gSkȂYt*pn9"~T23z>&ڶ|8 6'(i%3cl&ZKBUhf?0Pw& ƭ67L?Yu+epbv`I(utIׯ=7G/bdm56)8SI`{5QCP/&׍%kM+k#)ÉAO=!Z#zb4Ԃ@QT8ZK[m->Jek'TWJt +_ sXQF\麟ā/{PkHD1B4uaj g%I%_91Ѩ8# ٝe@eH褤~C5n`\It娔\iyL & .#rIV@]g; 3'q:h/S!wk:mAPPX!Am*s*9 2m=lNn)$ g*<?inauFZT='N?GPpgӌ]JM2 c>EJe#2Fyѡ?<:Yװ~Sq _+ ,~ f_,4ur:lo0<&m 2D80p`_.|ǿ3gAZEs+ '=g'Lcl /1՟}:ceSS*p";Ls>\HAd&KL]Vw9g`"D $4vC=`+@k XNw g'5BthH jEia~xI`thLa#aCKJXmk$5pFɳI.mBK}퉜^,38 D$Yl(&/mϜC*`w *`HCsAوfBQ{('gk' =Lhyq|{}@c]l#Tpx"bg˞l` >bCWnl  !; КD2jYeQjrQXB7t<+,plaehnDz†a=﹏;0=?5<ŷ,|Ȭ]}^%Qx.gbmOCkf{XFj*^75&9Y!R#w].t5:nWiP|%Ŋ0lj9Y#,%P=c#/H ߩxE1%NCX ؐ|CӘdenp̛ݹѾ0kf줋n^̘ (p܋I4X8)y#I%5&L&u6hWRʨ1Ouཊ$~!7c:̶PT"(ϾqUBAL@n:u*UsoPV5lL9|+ XLxeس"JtCFq[p\Z+ᓬI`]Q>'js~q޵:DtMuuPʆZnaTŠQ:q[<*mPgzF|@9E5{m(9 +_t-Q59) CaQVs@6(|Y//+ t#wq$_+?3p~z*\lO/s [)~gc[ <{ qs|XGӘ#EK I~ǷiR~>y6<1p`>E8qs#j۔XG/V5bï(Yz6SJ)l8iCc9SV/A_&dS 43 C.粗SI#D"PV{j(0 - f%RM'tǐKz|ܫWƵ-0A{M @!^-kff$g=rBO$ZLIݲt cV?+5LG ? "7sitnzj6p-aХ5P3&l 80phǷo^7z}5fwH ].Y_NX,dɂmwyt,Q|O;oDO:vĉ(ҝ_Wp;SmEfDҘ%Vu[~{y$3ANͅqF^SR DOΟDe?&@ߣ={Qߺ)v¤@4z` +j1<gڴ~kbw:$dЗ.'-tX ޟ1Exe+&͐MR9mX 2*>d|e!NƘ`oιFHqݷ^5Awla`sZwה "^0Gx2sB?M >y"_&bߓL%%E/| T5V:[wؑɵ+av#x({@ሠ KV*[q? ]p;¥ au L3'= pƛ=>/~"WZ&p疒{jҴ(p#LsԄhB"%k[FwXYLs3vpڄq XNtÇ-Dm >Ѥ)!:9#d;?ej]5XeܳC W rt2U%BRٰlNOh0p`~~8ZߴjFN_}ggx}7g8s2hnd?z0q\S'k3Ϭ4O{gfAV_SԸL 96-(ۤL&MLkWV3(9a"b:U:GGM23TmOH0_'Bfgzs;;mo~<#/{_4<>2xj d4_f*,[dLOws3@iK4cKڴD׏nxSO/Ha_j/2zýrʉ\[&amMCYHrCsuB/͂}fV0W>s} @ԛaD qs{V 61OZG[4 3±>I3ծ.ۗR>L92[e)Xh )R[kP FyU8AzN Xs+[ Xl(PbA^IA ⻉`ܶ[G`G%۟P»RQM, r  c$o$0灴cmx \Ix8HC ԭUZ q7+v*; U\6$3SA|[͟8H˯xN^Kj;=TAq)gm?wƣ `N]xг_ny`-S~]鎵h8\p[Y?v1ݳ }岈fC>5d80p`.lrRܱ#[<ٳg DJݓ^PFӘr%S4lRwD .5&c#p:S?.\r0LL> <;kw9`%3VbI/(A':Ӡ&}a23<SCޣ TI%Z&^onϤT;NJ˻'|,oIҪoo7/6c0N~m\N`=@9`UhyqPe`*~4_G5/N0 4lc !~Qj{C| 0 #> Zi- ؽ76~aR MN9էP xyu>Վb1J /NQ:U< X͉;4++oR~ȶK<4e}MDe~xJ+ eGA H7Š&;VL)Jrnz'A8;jzceA |7 }㳖$0_n)Ha($.k8[9iPI '^Xw̿Tؐ kgYI !'.;}2H4/M?c[ĥ WDgHGN,Q&nI]c,Pc+nYxuۮ(b~%f?G0mxd|`b݅ B {/L2׀N|$.N!k&# `Ξ:/1"!9$&b4Adb`8 HiPXdب:!B'jh$й- ͝Oc1&{JXع8)3ng{t/b Fq|J2 Y0g |i{dDX/RfGdN-4/NaӺt3QC_sv].{JiHh83I]7ip!JrD1-Pg+-6bXhmWq ͶBׇjm~V`AP^5V"˱! 9&E&F_B/)0}c2&jՈh۽4K:pS9DĝY @P ρ |mZ.L"jjRP3MG {` *pÛ4m-Bh8n,Z1TD3G՟"Gq|׿BʲVk6ﶬ` glsY>cEVI@8O lc~@|3^{M4:i-Y8; d.q\P@@lٜk +8 +% <SyL@ẈJcp[ Lg ЁpõZ46-at,[/!9vJMZzT'Ai@T]lis'qvxڞm˻{t hX.`ӄ7dŃU1 ;_( >M;H˛h|`C>/-mpBˬ9u29c2t@: I' Y:g,Q 2=3dxр(!4t5kzl:j!M-x0TtY?TY!Jvszh L&g& rȏLxkoh0x4St@` ~9(ɶ.i53 lsGh0΃D-/R.tx:?AHx(*\"qv̤P6;GhS -0#Cj-ڪr{D^džVR@/Ql`#]v&4R20*tzwE7"3}?/7gp;X3-DpA,P{Zo.",ݱ.;آ|Ÿz/'Z k`,%X3dKv2N%DUaϷ_V rj|ZrQxnD5ǡx8;@3!>'y;wAc|,oyu.|Mҍh#qЙxm澕Iw6 Ҙ|&_\`+?FK2"OX\cDo/ۘR1?mVGkx?Y42Dُ $i.~  C 80pÁ@[lw<Ѐstrg g˴fΰ;w#`{'%;jGS#֛R4ǘ+,`C߉)3LA?Ģ!g[0?#p/x~HsنI4Zh2d6Ý=3gMCaLֹs.u PL|T\+!P:iAuMoC@bP@KD ts狊OęExE9^\Xf'KaFpN Plt%:Ev{: y]C_* {fFa_C,~||3x-ق}gPqEIH`gVC{CyÑh /eAv~xd$)yjse6:%~iFO3979[̲q|o;SA2a23ɫpG= RItHx 0')W-Ft&YluO{gVajr/R] caBҕxwj3 y0&ql[m^lb-wGrȷyEC,Bλb>%㢨S&KͲ၁ 8䀓777XWe&Y_v$0j6;=ssJ+''&gi2=Q>::zg8V)L1o3NIp6,)0Cݵm_Y&\8d_BQYZC+$11ܲtb jnrfvg׼T2v j(E P%Y18e=Lbu1h% XfˆmO0nҍP$kL%R x6Q۟|>`+/B8RgN/ 4hlX;@Ƹÿ#}pX /C;;Tި ,SwX"k@IDAT=PaBR@fWCy9Q͢N:cIːϭks~m*xEV NۯE7&&%1P {x|.@E gwęxh/ 7#8CH w7!9کnZDy\h{|>]m\ )^`1Her]x)إmS \/\}?z[Ȁ]P^{?@> my]`<^'lZfi >Cg3๗ǥ 8Gjb~8bP(GPdH{<<#d3q=Q2$Bqۖ&t>opX"f6J֮TF%xNгv$F1@SC3<[,O)E<#&D`@-;4,Fr^7wO2UvxUKB&k|jrw"w[u$afLfi-'d8߯$ Hݶݪhz鉏k9X_U=d_31$φTVsn2'o=)hŝ% WKt\7j{\vHv!~&S~ q?~0p`qMMo/nh{:wҌu2HisOV xs* u d #fd5t Q2[-8--MIhPR'OH6;E:8ܳ dϷqw`F oyBXWQ"5/ N#01>֨57cr@̍/e) Ob6{#I3Qlݴ0(sq!!].D[5hPM#@|hF r d $lbfo;Zϧ3!{*kX16~pgfGtX b'3cAk=/^Cr2.oPk>KYQ.xN *ƴ`Xlw獁ߝQj|Dx(K'yΛa| m~bLpX>G5_`|OZ hڣyB$Aj=/C^W3qfpEnk9d̓dSʕKZ#/yly@ƪUM}0d K[/B L"$%2!^=ʵq!:iurhYnٶJXmOI4Zu_~̟_^Q/hRmRҍᆘ_AT*^kl w. )k>Q4u{o_OǁAr(iMpԡx Lazo CD#;B 37"].)OOX;2uϚGOlOV0Л9, kne"Opxpy0ia1C*,֌5|K)~vP'X :we`K) 5x)i|@fREc# XA$+Vvz3Rnaj)(*@+lp Jб; xo͍&PsA?T)O~Mˌ"hn#ř|$F9s)@;ɆzGS/hp} ,35c+zB6!Csx:uv_Y'^VFi}D_Eb2Lvt|nmgx4 s;Drl#^xWHOûN\S>UB)"Q"Dq&Őq%5)|BYO|L#2)1B{'EV~$w-S2<OQ9^}n(`W&}>sC* ?9yUz}G-cC;eS_-r&VoaɎTjVBIv|R?P 9.BN(9vgb]NLk>ҁ?dB4lӹ2x$e`7a#V¼8 !Lom#]e֐ y<j\L6R4b0 ΂tIhX24jXi A4Əo0eŀqϘ(+hF5+r1=KgC T(/fB:qJV^ZxX4] 'Y<-MW1K֙E(Ti%Y̛=g#Y|DlxaEPZ,oh_DDsx@{P+h< n7Sbܢ[p:ui#}7O p%18P~Xls\{#WvBgñ u7Wo|`ۃ!WkM_SL&>ɡTLnZ sPW?qቴq< 3d,xo..Q(pYp8cj6Ti pG?Bh,(Prp\KwD#mZ[c0SYf9glbT٦Up믏/r~i;x\OП*{<}vZ8-6'mf*/HE7fV?D\qcdA/yvO L7Ht zIck \<.{z:` 䣇OlNjW&[ys n]ߘ~v9 4Уz^/:`9MFQX8c>l8 Nm k7c"h[uQ'Pez?Z%^PK}/Cw(πYDɔ%c ڙN/ڐgɐ^QPpفmLf  Y`lx@xg 8"!"4p(,?IO" coD2ky8L[1 oHaB*;vj0-r +L9C`4gC@X; dp ?q@OSx?9tq)3S-Όpa|@Qt?IbHO!?M.1|sǬ>9x[ؽB4 ķ SЧž~aS,FcaG5",v>qX4*Bחr`80p`p8:~vUD/ ]Akӧz?=v–@z:ٱNpC ul9bk#pDw Y1!] VyÅ--jMrj\ /Ki ؎{۹;7O݂UjQilPzMGw \F _yx`0urs+An'۸1t[5fEhIKr#s+#jz_5ʽ.qRun# C߆-uHZl)4R[_QO5*iZtƕ L Q dܲ}|P- [R4XY2C͖:5V0\ ϳmsy 7ieh vBM 4eTˏ}ߴ K}[ qfL*";f$H *I9ny_c؃?gY8}C[;[Tɏ8|m7p[?!P%zIC rd(z 9Mأꫯ1!/Dsl_2{Et=.KG۝9-^%N0Vԣ?fӁMn?ܧp^vI໼f50gѠ> =wo|ձ-›XlG>Sűcq,,ܰ]G^+ T cA%^ϙF\!hcH $[kw`^!AB!S!W)!ȧ2D/>,7 G 5 {|h%g;C9ѦXxXWJn{}m{P;~?3=A!ʉ֩xدO=r^2 o!X䆅@4v:9lc `Nݷ[D"vZcoGo[`[`3.4^?SO90c80p`pRd]]fa͛͛q6uדO3;ߏF}>mo|&r  Tt!E>W(f8Gc!pxu!U|>Vv5_wW&؜ޞ\ۯ3&D$IجNҖ?'zv ~/,sk/ RLO)*d&*&;$ƃw wYH"Z(Ah"y?%a{`2)P#h-1W̮NmA(q FGPI-Y3"KUV꧆p_TП/* (bYw&fiHʱɈYq>.W0`{@!;~j )vE9mӷ%`w;L!UB z vfvz?9AՄHHz"gT@sye_7T}nLJ# (/O YI}>0cI ۅ./U@rFEk$lR Qc @d tkiDƼ K':xgY@>d=\6%8K|QO3@#A 7ю{>TEPAd4 xaT`q} Wnn$a7~V?:Nx//YC90~f 80p`_iZC߾};z2Qgȼ=n@{|u2Fr\x1~r>a/nX8MPSD!q$480q9n=ncxу`9Z}]sݢ7>'WGT~av?n7byFHcجL6?Sd/Tt?T8]~/fwe@Z0&SP[f0_$DD_X`(R{x#i}x:UKX<~xN }a1~6cB!I飣8'0UPZx7CQ(H |kpz!G'[}A?[@:kpxO}'V\6UTd[h2(^2*!B wA=HļV_%L$>q<1 ڢ(XQQA;s$@S$' ӂsXM( ᵖ|/}_T?$$ ٳek/} >oHOpuq;AݾezSW:[^DYY?J&ʞ1h`&G1d3O4z5ۚit}B\͌Cu:lt+"RxhÙ'Iۧۉ%ƛ1}/42],>Q8 1}(H (3`)@P|LϤ"tjtSG:-A!G$&"`F\)B?f)>&U>.󛧈5c]?< ks狋..}D[2!t/IJZ4Rp;Э댼TfЏ(e;Uu?̻ {7KeVXUTQ)EVXJZM+˲dhːI*OKvay-C k=E6VVT&}~p9RK8X2!\UmeC $#\[i2>Q E3vO,E,7q^{c^YQuH/r}-139^v:)Y1DlsXX4UF4,qPL"|;_\ZV?aرl0n(IO  WU db d}p@A W:Y?͟߄bS[{9*lੋ)pڑha / + M0Ek"\ :dp!.NGw tT4 0QHYE@HC@Zi®{/Cmk̴38-l[J~Μ g2tDeS`VP\"A? ! )@sy Z|Vg>$iuTkB@rdqXӑUdQ{)DP(hwi\z!<-"]F28y\}97tl۷zׯyw8y0J3t-F$M mۖW7E 6"y4s.8y&)g*zRk/M=9MO)kz#{cωl%\9>05E@vRDVdz#ߊ1f~8lw *UKUt '! 80p]{yOx?M7:bg0 /^sP'lݢ:v?iaFb嵇(݃xd=*w:Sp cZv, nO)Z`j% \a\+}Ud@\}b#*MЕn6dL@^oVMʉ`y# ^}F\B ãd`G^euMJ 2]T9.,)W\6zFI>Mu$uY}I^}T>V {v)s<)~80e5$D뒨 EGX)Odj)7 vI?m7b6Jr<$-R&Y\_H ogvr^|f!/hO67A#CY ;ϕ@@[n AG:=f>m%FZ,P(Y @=~xo5%mfz1up0Xat8u 80p`@hq9=}h}Z7ϞLJDWAP* RlJ*"2!=Kr|/e pP)?Γf?0(1Z5#`甮{=c0ڎ(Pt^b fs;v9qam+[ d'k .X]zFi}gph w"tpXXsJ lA߃ 1\GC:Brnɸ2hۿڍ~0F3(*G5ky2q?^ 'FhhA"m X6ewj}t/# @'~ܰBKS~<=د}uJ7%H=| =FC~BLh#@ἕ׊|mZ dES-Lk]L@Ifߜf[wG <瘃eNFh~> _O 80p' l>%s7S{믿>|嗻&zB7q ?hN{5#kMOۿ[irh&ZLK8?L٥Ħal\&P8,/H` ttq|_x~ȌtjIF1"z6lsv3pƗEE6s/neM$ї]S&6XTZ+Mh]醮So?b^~5j׀wOf CHrZN^=[.W<ӻsM rWkoi tQj!Q9,omk]Zk,Klq-M9ƒ!r, ߞfڒOW猋,w >Uy0pzڵ cGtXh5H3x@`?q斝 M ظA46-R yӿJU5LJ Y?pXqbߙ*8p:rt||;}>!'dׅ%ؒ&w%99EG(L%$C<֥@ )$BZ"/ܸO;{k=V. 3[H=C /h΋ y-Y$~DN GF͝ )x!( \N m|?Қö>BˑAh~8\/.s|!yUvn׵ho,lKzcԓ;Ҝռ g*3vM=_F&Tpl_!DiI'~pM [;ZնƙgLx1"XF~5-e`v)ܯGQK!+yZ]!!Tm -A %d:$)hr/F7^a_>w[X,cﲥ_1~֠ O^g 9Yme,:z7eGI<Z{p׏ۡG hzQ޲k,~7>oIܒή"_yf<ٱ|!Kn2ov1i6'  80p&~ƙ)_ 0~(j%qftڱqya틧@l7Ec*ޠ{`p/K&YX a%-bA!$krsнĆmI.>&;%%`$pU[ `Vk_'G* HLӊl5IEC w4`;Lo63(_!"$l JsJni+iZ~܍ @ @f˾WDJޮ5y*k9(tVs`2+CbIR1P,-_4 "SEt2PQ؟1yz|lUxHлC0 ^"X^z2 wF}) I*8sg)n=#z0Ih:#~Ǣ#=T=c8.*T־I2.h}@m]~d)tG-Rt3/"CYI߄~vZV;CJkףBۊmv,Bq`|b23p`~ `*dQsM? 3y5"3~ vΎ! $R} Qrj<>IjЧfeKlD6B9kv`PZ":ĂB:K Wzcm?kcD~aőkxgo0p9׭ҢK`q ;>%%IŖpnPY %8{]kd Ki,PP\Yp>8gGs-E2ˎ5t+.0F(0?j.sIZ [N ґȫ{xug="i.G\_i)v_w `|pq}:\𔤅34jR}Gi!;p%<ſ'pw!SAL4i{>e=\as$ׯ};~r\  80p`K8͟g*;y8mzG6# 0̈G5<CW _.N("cgv" r*j"ZJF=Uw8!aTFVѻ۰[:rs`=Sq)mWTKK?`} $,g&Z9Ҟ1-`/Pݰ ޼ghegxww6y=gpQ'$z3/ MqoidLfC%4B@K,|l% t]lEqJw>Xw ,qW-ݸl{$[`s*(G!hq`X"hǃsWň(/m O Mc_sv:%-mnGX% 7fLy9V ?{$qi)# dmmGWm''mc2F D)}# JDTdxq(u$Ed aWiw <m $O2%uLC)#+8HcƄ߱\iό7@#9{?9t:1*ੴ@ 6_FG8IOR|1@I,oYĴ^{X؊ XG_hyxf ȁ%җi }N7_/ׯd| e?F&"z"p@!zգdl J ~AAs@[u4bKbYRaKyB$xbv\^1G6r fS")Y`)K QɈo%bW|V}P2)]ܵE}cWXڹi'84O^m==.mrscq]a?@j;TkY ]w׃wШp1&A32zEk p_a9z6nHYoa60@7 ΅ `B@>+x ޱn HYj!I Ѕ¾ #H3 w7s.O8 ix ޡs7'`$HgூoM 96pq|s~o0֠Xc3~ G=EkWVmkW8i8?AV˻w 8S@ѽhh \_{N_"~E4&.8&68:ImBA?vHjw pýxP%3>Rx׽}&>%D@ۡ b(iF,rwLt o s+ڠ XK`|Ƭ GiP[EE-_}>ťCߥZrhk XP9b]@|wAO W r:݁BB_/9a&˺m8k<?(SuZG/81,8fQYej@h0t hAhVojq d&͹v4 ˮ//V0͸E'uXJ!_@B`|1>NZ^K,&dapkl%]smYL-u*2Smv7}J;u#8!CZ3%/msiՌלI&r-q6.nLJD-ny Ae?u\93oY:|$ծqOkĴXۍOw9e  4h,ܢ- JSKHc ȇtPs?^ }-&R h\?PiRѓa0~^_J6k878?7oL s ]eWved]wj vќb6ޕK dVc0)O 26#ʭDL?" N]_ Lœfu\*w+ nQ%ۦS8ˊRc\lM?T$s^є*[1P-ƎhDžvzc@ͰsZ0N^?zaTțBTwPC&wٿhce#bceLx H\bk_xo)6XGzOkɆwgd_< Kmg:Fj$s^ CQ[ 96m{5Hp9XFs`s/,j(<OOԷZA;p2Ȣ|qhɁP j,(k|,<+p[yI)%혍5*. ?4w}5u)}@R.Z SK~yC ?AE;w-K;Q>ݳ ^Zox9.II0cO,fvhsFJ5#;syg p@C9G=a?D:͈e\听q ϩ58ו8?Yujeyڿ ^y5wb<TzP󇲿,?@S Eߑ+cH:M67A¯%a ~dH8~FYO06N,.Jpߢnhjsj'X^ !#{06c-]&HJtќ? H콶ŐqtTZ`+H} _]'$qwxG"Mbӹ O舏CYkdO4.ڴHMqǯ,]j_ȅF;Wta@u˪/=~a`m84ΧIh݁v^;# ` Bm)Pe?7yqX%g=κB`i 6AOGF2qyB=u @:C@@:d3+0;x!ԟys3J@N| hvc?soyaA$k |oAú+[K8p?_љ́́́́́́́́Z`pxʵLo߾m&M`f`.HJx hZ"-_C_!i=\0!@p؁pO/4 %!A@ZR)8댕`6ECr1F-A%X 6 0`ȳ\N+UPO7~仏+|1!g=zAe _^ 9g. |njW8ra>SsBJ]ddddddd(n[wޕӫl-,n*\[̣/~ dLA!` 46D4Ҁ10 QՋV$p#") yj@)6׾I t@8UWC-];@H| vj!8n>0ߦDTDz.=ZL kq]VTb4J H|x9=$m&ik\6\ @sVhŪ eo?;?|{l#<,g4;\ A,A2KٳA7u #qFz:L;\}hE߳i~[;5cmWnT]CsO| meS S|lϚM^ߤO++ȚTӖγߺ+_= &c#}1{B`vR(8t@rCG@@6QD_mϾ A\>d&92222222>>@ӱc2Շzj D4$TTBl'JAtK0}BwxP ]@MI muWbIlw#@4xblHMA`4;vF{ԡEy!2W <8|v!Qp!5oW&[_lh wk<VdMWB n5x5xl/jF/O  !ۼ "D}y6]fy,(l4VwV^a=\U m_^s# ϛ߻E{'t)xڮ1@‡mݷ6%hJaoWIAb!$6e1_!n*@lCd? wGlNIeqx5띥.ώYٽ|́́́́́́́د_{7Π@9mEw 2ԃ]-ihVX U q,OBp6㐨D7(\i CMC @ͷ_)uzI0'̳%Î8ZyF)iǎ><65]7`X~+" 4TC7 ~.wV6ʃ*v"mȰYJxهVZAPR;/hV-H=(HaZbQ؞Z|Q _:47Aji<PPqfNJϲ? 9!5Z{xN!!θ7/!)A` ۣj8!yfK K3q`5Fy1A_bSudz@@Tm?V!HXsL98K=ڼadS;PO<) @ӌKnN@!q k A8RY6bpCJ'G {\1w5f ִbDgz3ew$̶y MgU0daOCmsXvo3-Hoh3c.DZ  W/P8^] @H9ί, qIi% NP\}hztGI†Dx7~?&yЧf_ ^ k샠wҗ yYi3黉 Z=st?Xp\pHeC?Z:? do͈DϟL-ל $AXD8^i@^y>p@@@@@@s@𯟾wxC? ף붞cUv`b F(, mʆ\ĉ[&ӍZ݄(uئ.^ncp vl%Q/5ތ,A,Swcy"K{{~l'=BX("2ugn%i<%FM̱ vI)Z"6,EWВ*m$HܣoBУ`& ^ r @4Z胎0PgNk60O~÷+Y'$ċEG"u8'.|ض9Q@*%s(%uq>p=`W- g=1 h_d9>,F=DZ"xV DiMWfZxWHkSoAÑs°m=8Q_AxG># uۜBJ 0?iOSt']B|dQ5@읶׭e>+o*hD &/CuaGLB}a]a8ӆ 0`fɬA#90BtGGJ& o03F,!ef6/˱'㷰9qj:gɁ,99999999ik0/nW~Y/0EH4>,w%}@ixR;p}@ Mhل`(Fn_+4 P@EH% 6$ |">!߹j5yH- :w"91/,YuygXG.4j-6A`uyvF$D=̀u DZ91g/ 2bZz_:\/ѥ[Mz ynSz@"HG .(?.Hݶ` w򇏀ʞ3m,=eS&C+CXT"N*#w߆A:Ap홻~Lב BO$k¬17# SM5tbݷ}7e"l.MWΗ8clx[<ؓ89F_2v2mDIO`}ܩ:\U詚ak^ + .@% 9(8i/!~a L5|;sP`L`jj 6uM~9 4)j #඘ %>bf]VL!fhˆZԥwH)ѿ.Z/g}X= mRB%K]$ج#u}h7ƀV>~/8A8nB$]p5; `o |VP`>2]/ E؟&qNhrk3_?@?\SA@S@ܹ}x ‹5ξ6vJ3"^V HDdQsJ(gM rڏ(Jn|^NL9<"i C=,{ k_CFpeddddddDJ6Kۙoŋ# vQw̡2 -'lQ裵?NQiʌH$H#1 N`@]L^W 1 #H--S 7v@j5W7} =L/kKEK'U4RS>*}d>1M৛}1k^ yTC,0Gc?AԉwZզ΁Vh& `6suh*p-aϼˆ7E~0nrqо4;_Sٲ$f~^=EHW@7į4 R=$/t+$ ic\:G ,?\ d#b>T\CaB R?񡸌H zmoXlc :de3222222x V%p+}-R1v%tfhN3 pG]Wp@zڛLqlxwEõB8;}hN .=Z^b WkLӪ9$ cغdۡ6ɎYO*W*f;NsyY`qt]@|dnHiAD81]ϋ>J?c?-0@O.2p<3\K[@f_}>x@@@@@@ƁHhˌ?Vu$$ct#+,r\x3ƞ&$ H%]%aX)p,  Z ހAofߚy[UeV&]+~2@ #AAipAW!ZN1`It?;:[eAY 4`+Ba w+ɚ [DX` qGCy֏ 6 [X c %$18,/mGInGEK{{F #y1 ҷo[Zw[oͷ!-RL1BR1!9QHxĵi Z~>11ʑ jثoUChy/``F9`Ln>jǕzD rjp>73Lbxh1uیXrMe |06LD! -gGX8UEZ;= \ Gu !-p}!`KE:%!:RG?ֶXa6-ٯ5L8< CK>dMh8?Zon%!' 4~kxK+ILˑq O8a|ִmW%5HG?`HBq~NJ8X>vĵ9)(r&O6H`"]kübE=5{j_8$W Yqn$1?8q)~+ʛ9@?.W.jo0 r7'{y? \Ը!,8FyHr5˝A,x0tZTX_uXb4mG*N۞Q'T|`@`Xt(wMjq$Hky} U@w/QE,3b[6zX-B zx =msw[\9<Ƥ{af-~LXn ?S[Lj~c&t^Fot@i@@@@@@ ?~_-=涾QmL}41C@4=3Sˍ nY*Lpg;WAK eAހ'lp[AM⭀, < ,)ML/6:V08YB(QiSR-泧y !6!G/9:><14lr<ַӵ#i~br6'³Y(~X/`v-'lAgҎTQG|ˀ(Uqf[@KdlDlJedȁ,A@@@@@@@Ociރ7 < 'g٣vn&|e&yD?k - +'וj݁+%p&Cz6ƒiDjO#E5 uwƥP!kr> =|'H\"!~Q\C@_rBsӆ8B@xUqv0R"8p-3|+Ρdz¶/tHcNB@:Aa `Jpisֶʕ8m\qlņ)l@uA /a 鉁a_ƀ,UdcFc'.vڊa+|r ȕ́́́́́́́́mޣ9^/ @j1ѣ=;N(xE,H 4m44F 0( n)>6G|<Ȗ ΂cSoڢSVvXt0N 9[븶^Ɔd!dAk_cDT .Q"H%w fU\WNme D$*kqe[JRnWknKRɂUθZ+d^KEh]BZ\h-i]6bմO#ޝOhkg ?]w\9N˸ QɄ(HkGuhlc%/6/HWPK?<q 00!o4SY |qBXW}.?YS9gddddddd 4oKW_]_Ucb&M\sA 0" 2w PUJ3(#E@#u ;!(a/˅m7b2 N?XhI%6cH)>o'@n0 ОuX:ڷM:Wt=PAbПvɞl-n9?vq<],|H;+}iX*~ 7_X>: N]Aߎs9(t4kpϳwƭi)A̧aaU*ԣճt2l%)o7"YvqxȔhx-5e H !` 7'd]~|~|Tdr*kXX~f @AΉ8K?'`"hs&9iۆ֚4@y~ wHP.&҃rBL5YTAYVМKE Ș)G@Wc~U?t*h}88; -p6-@"`] ^\8O <7/ژT0ٝ݊^5B .;57PD"Iޑ>3*x >KF'?Q@<]nu-ɿa:W(Xׅ.lq30 `gHwu]MGyI?X|?KnD'z`R%7 ? Q~d[qp?$|gݿz~f9lZ̪YUGEVuSUc P8$c#%{l[.O8Oؑ22222222l l@IDATt\W|?q ~wd? 5wX4&Sȓc A 6W(D߃7+es'A#3#\/FEhBLA4qUs);rk֯6#ߟyyC#qVety! 8.Ԓ3q 1$?fdddddddM|믯uXU 0UL3L8q]7c ־5gO"</0% gRŃij c "K!m`H5 ѵ;Hez4qQ/%w# 颕(t>߃u[wP|Ju@ lO[õQz{uUup$tLi1}R{@>T-7sŵw)ˎhPĵ|'1댏 Q%bSκ9Я|e(p5g 0$ <gL:&תóN6co775B )0?C9$-H&rYe_>0VR#ș%i/x7ic LW԰aւ4?m28?|veddddddK9 3hY޾|X!Κ] /nZ7U:HKAeݲ\A5 TĀ9!PHX=فUnT0DR`!W"&bbAf#Ц`}`wB:Px ۑV3z 'w'(  ~mܠ{iV7Ya,\7p8t 2vF:T|W%}.S=䏱|ڨc UY_І*'@ fo=u6og[' @۰wAGئB"U  (feŜlw@DMrI%4ͩ.C~j.m ~ b$AhKTC {^qδ=2mVv#͏jgp RWS:8;?=>,A%1E% )AK?+#6#2]_ω踃P|hd/0ٴ]RK's >Uy`@@@@@@@'p@`"Bޏ~WD:p'xf7-۱ƪŨ:3ݣ1Gs@=.ڝ_ @!_1 Z{@; 3iCLcL/| %0?<=Sմcczm[4AmO0fCV+؄$A[b]9L-`(i0%bA0mzg(0;k;՛(nT}W٧`.ϙǽ8kp<̓uP.h_&fZH| $ȸ4K`1,G@Ew mJS$-́O@|"́́́́́́́́ü/|鬼'٥Uh,C,En \i7Ji@r3q4*ili;1.:>eD–𒙹瘽\?a@O:O6w! ̭oIsI9!$>nQhw!iŮ۶mnm4oz %%.:Ej LdD@`C"vA 4} 'Wsw'Q֥{8D؆,nbP̶*!PV[ p?.O@_^I:(|Ը T#vnb Z >,d\2~~dӼb@@@@@@@qŹ|.NSП ~О.5D<:"j,SrS@@@@@@@?@;(<"ln|(* (|ʹ%nX1 t6 kNHbW <`ޱAѷ^"PIaB@E&(+~~=R0*?On kMcW:h@ƷĂ㒌;\/PjnMT ({Plֳ^fHBdE,CMИ9,p/bO@TLqi,2?4:i\߀"r򓺮|N2. ( ·vK78y $BVGM?_5H6ryzi8ew3=a&"ތ=0z_M_f|ؔeddddddd|"6DCç Àv^k8t_/ݎҤA] B=S9>(}o#[W4X/|'MX} X#nf_Hix$V.e ?cFoq!ܼnQ,==́O@|"́́́́́́́ a8+dA毿kƯƗv~5T}W/U ȬQ 1I fN-Y[0{z UcQ .gQ,hI@l"F(rOmT`i[J3#OԮ mhśxctW/kI=GJРcPo:<>΂aa!>q@i&)]XK~?F,q qϛ3 JNdB\Ē.nWOgv$Ҕx9!<5IyӇ {!s q 99999999^}zy^mna:U}34ChX"=ZAXnF@ 43`;U}FsF&Xl@)QQi (Aȶ  }8/paMlܵ臄2̢cg !kZ65!(] @I70 V:F_ny.-γjlGi-~0`_7^-#(q&06B໴ 2\G„`RP;`Lc µ )4y 6$Z^M&?+$ Jɹ)';e_'@HLDZ@M8x,/,gSߍz-//y P.?e^)s s s s s s s sscfCxF/%=Wԛ~n؆߻jmQi@} &xHFe D  buPj{ѿK tFkҦPihr Xul&'.`[$ou۟Y@,V8+?g1B@,#F/#yvlލ+d .xst}2z!Z}Z}}7d#U5b!0b=n! ZrB 5C_4l%0\F#S?wc B,8HH\Z_l͹%s8Ħ<(s s s s s s s ss`Y6E3 unRo9t ٩<iSnR@ghv3"S = BM]/`_$ hS4^hM r.K1L0'F(Xi}:!F=Dm}r@q uvm=`>&u>E3b |]:f!DYZCȢĺ<>Y%“}Qh{[lk`m꙼;(4]@ 5 [+@LWu\YM3ڞv6%ҿ j>LY)!dC8E32222222~"} ~OGkl2:d+PHyoN >jSLdKi04=%t$ۨȼ;Vyg|zLH$U;. 4Dd5nwX(3cPU LI@ l eH7?\d?ý́́́́́́́@4 ,"j 9&rӚL  D#  #ǔ&?@~A' 1@/6 Tr-NWrz%d% 99!:k=C\A@3 %4HAKt?ǘϟt;g.WxG Ë nAÚau9sG_3F!A/?#gR %Y@Rvs㳮cYdJ^Zđbܟl6 x{xzf RԀrcP<6~]YM}hnS=n7?瑡{P诅)q7HHjKF~ޯxT5ɀ (Z$9 \*CnjK@?-=E/K٨́Y49999999[\j }|#q07pˏPM݂rb!8\A,{|x*Eߠ=[B d q̤@q'ߊu|S>RvTg^^HG"@/ߓ5`zuJ/;!9 —eD\̥GKZ8ZC6hE#CG$LHG?噙v_A1j T<SO[(v:@smIv ]i67݊B eL\[V\hߣX8K*iDqWg 4.Vw|+hC5,LLyݴۜq _;WkI"<w|۞?> Z6'3~'+ #l+ >g\^?mIXڰ Eugp-‚oxeՐ\HFYit.dLv%( u/3q*4F7e^kMZ @<۰V|:9xa"g&LW\Tl =Sǹ}?n ޳_3'j ,v' #14ԏ8gNBPaOzhNeF^5࿪% lPNYR[,a8E<,pW_8߱4uE:߼iO|+;S:Rp.+ks0·4p<$n$֒ycɯ~۸'!sS8¥<&s s s s s s s s mnsy (ׯ1ov3K=rV%4/p a;ڣ&)}E+`30"юB7\dtJK>>i@L Z:["x# j۱hp Y^MkBHک1B QQNJfj}#޴Ѧ++Ǫ 6Y *YՒT &a1/-63ӈp}Ņ+,.Ppdc)y'/tMQ2]cS;?ˢ ?|:JdC8E32222222Flvֆ}=T nKqU3M*hJX8m/P / PId*֌G\SɷJ  CAb"ZqT;2$7XyH t+`Z+'w.PZKb}X A'nyoD믛@`[fI=t{WkE8B3q=1.o#C{wbO&=в> Vĸ|:B}pEj9`FG6H!џ@x<`޷0d 3ߍ4cac)^=9O@4Iײ<ߏp/Vz0>*i]{bݡVc KEs=p̵il]Hez \FwɎ`@fFZ:PvcBsq@X |WkM-b^4F*# s+=k ו`S ,&\, Ò@Ve@>CKD/yVzQRY޻?ԣ_<ǃqv#r."KoG5``17v -H0Gg ϴK'I3'K4oOp#S9@"^C&"s s s s s s s s9ʁL7 +̻2KM?+m׿`<־p,~b6+klM:Pz6W`*`x!qA x9f P~[3T-6V!z@)nNIjgh< nw4qͿ#x@DuP^iFhܝM, 6%v#< b͂Ca` R9`Ii:IRH=caBy9ap$Od/Md:22222222)pߋhߩ 3fG-Ag;#nD`&}`Pd|Y厰_bu@ﻡt==@h {6Uϧ 'vd9d?f 0PxGs H@da""I idA/ema~PHF" OpY`+*;HSѡ7u#kŸD#wx I8Bj@('W~M'U[h[^Ig~N[侪DFF4?*#5"I]ȋ>G8 w]^ >NK{6͉ƥ8u {́%_w@@@@@@o\䓫0S;].*c0O^Znnu  ЯD?SQi=Ar!~%D8 $5)QģG4@woG~@)MmI6Eq:k4BJ6c xqEqw AlW@^%J%I(g56  w? H Y. h޾$H5pL=`Cm'+ws?@$5!8F+M<[ŀ)=oN4Nq")BF p'g#ޢؕG H~0 n0<ḻ߾dDX"2f"8p?_5́́́́́́́́_=!~םkc&~iU weI({[sX|";[-6,đLXkܼAd^:KJUvk)̌,Cujk(n q:"@%&~ 4̗w{Q7;} %1#Cɯ3@>su& e:lMӿü?Qh1?św~mX)l{NhXK~B>eAS}W ^[j`tSm^Kf^.PKS@xq4࡞HԠXg!$@!pLcJ:3ayf5cgVj9 D7Cr99?'7ZHVB}]1//1ov=Vhe+۲m 8/0"b7垉-!0(/L\=i0zĂTQJj{@qHaʾ* AN? g8pGy y49% H47e_X}V0-p Az|퟊3+}$C??4EH"saTk?oF 6Nќ̏qFlP"?R"|#l81`{#-a x+|;4[sPʒ|](4Pyz -ٲT2cd*$kt)!0AV7|ޱ?;Is:2>z{^nbEz ,Rﵓ}iq,pHwYZ_J g8x4H\_(_y[%܈E.OJKsR&@' -}]TBӾ!V(1y "/ `M`&%vIG)T_ U0ABqkYj2Yk8-'kyC'4O̾N{_-Q3'E웹꿎hn]% n5vπ`y}H6k.(#Ye=@}> *W??(7or&d(' ]Ih@PD^έw<&qJZE^'c&`&`&`&!ozV%Y$ϟ?2*_$mYϷm ʐoi :<T +%,}9Åprا OFC0,U+@ghEJ u@d(F<* ~E,(M?v<QP% : _F e$9"<wqHj^ $LXT 0oDOFƍrCCB ڧc뢧aOty&plY |l}w >$OQA'5`[&DHS9'9 4#}Mɯ[#JWC iWmTӦP${ x9&LEH8׽[')(Lӯ(_UKO$ >j'C@!s!@ܫ͟s&TXdɳ(BZv'Ÿh|ns &1JSˉ0d<^,' @Fj )U) bp^L#`<j'",@1$t. "kr{?O0 Zy_#~kk#"e@ cSO.zUYk>p\L2eP\׆dBj@,r;s;-"O?a]& ,:JXaaa`Zk%-LLLL}8GcIJЧ!Ke.1ZcN)#1H9|7aom:#h\gGj3, 1#Wΐ_!;U<ס{%bTaو) g_OvLcoSN'@Ut f cݸ/:VBNWBaW!㾉|~c7&sԇ6HP0G oǎ/J'{ _'3JK[1cA{GDƎC?ޠ4/?yiC5Y=+uUW s .g }x8[ fS&ST4${d0kKFܫC@x{qKjڧc*L{y 9!c((ls>A z8(Lj _ASq@s➶~L$$3L a&$V,R4OD6:=Ǝ };tW+C' SZ'.úYy&&`&`&`&`_- (cw>| zDqOoL@bP &#f~ o ]]NMutٯ,e:rasStB΢4D^l,27'M G;KSCB -#{2Ss?cّߦ|./eP&}AYRGbH49fzL^0|\7?;BGǨ5M9'0vmF(BЗa@ 9HD d2H (<B?){EA'zUJQȪN.G0Lts{&KyS g!T>I&*漣z.(/E쟤e 1χB"9oԥ'^f۔p@āLHF o(@> rNyCӣnoH5:z?$%zݎU_}ЇD}70h 1(ww\{1p>qiS75)x^9a=j:6$'S^rIWպ#]j-(0,f<!uu[Ht<Gt ,e A}G%TUUE$K+`2)0v>_& 6DDU1 [L4`!t"$; ͟ _|x!W/+0˄UA,3a3́،10iGؖQ@SފCRtO݇J!3IDAT [=0W41({JjNoB/My&`&`&`&`A`UC DC=|P[-t5SSyCf-6MZM7SЙ9mؗ*{JٕlN+`T\dgX2Sص7+l_9sjBw~r߽چa0S]!UnwPE[R< DhQν"SAx@ 't>iD_DS$A9[1gAEC }AFAM_?DkINLF'>ԫԉ P;@r="p,h:.f'bG>@*G/n-WWuru햚e7w8@k>CEUPþ?d4HG#"_&$#@ꉠSK< tW!' 8ʀQ`~RTDEO1 x447 rʯ!&vAS ǚ@K|oͱ_bxZ 3x0o#,2{e6QޤLLLL$^C>~xl65:SӠxrBSlVq.Q8mZO47Z@u>گhXKx{iC|€ȣ_JsΔ`'  R0"T0 blX֫`! 5<Y Ka]2 u:I|M¢B`^ukdl9@YkY(΋.2}<7[JI=qr:szm#RBXX$^CB*Cxy=2LQwTY5Ř\C @PUSWw;?6"b_G50000E\2wTP$#}q.S@iy:' ҺAR|n/P)N|@ o@X Z+sHi~d UK$mw^"_}}2 r%u^y(@w3@T&/~;Q@eф0Qs6_ P@(,%@|Jo8G`LFܼ%@{fb&-\EX/&+}~l0000"U!8 !j.=CJ88_|Dc G\:QIUslk Q,%~].\4ZYZKL06ِg%NAa e߬5rLhq:kn n:B/(^[Z('\fO4EBV>SF L!/O?So~CFL*7K*!R/I$g[ jTQOWZ{1 _Ú $ѿ\Q#igکiIOi,--9O]Oa-"t'Fyۻ$9+eKL=H@:a؍>Is5/rU1MMR IP~i':9RWl\&[dO#~v?6rR!@1Eڥ䴏9]t# !]1 zi@K .P埈)\ 鎡:cq?ipTŴ7P:6|ul&`&`&`&6z)7ӧJ#O4H gEڷ8nݰ%aA T(2X#z)j3dE,&86V{LttY/*[{CJk{Tk?5_,6wNq`ڎAcFfL:!W r{Qx}ҳ裂DP9AWYv}cW$O (&;|SM5;fSq޿׻iT_fޯ>z*6|Uk&`&`&`&>0$϶0tI]Cg!#=C}3 4+(8nTÉrűDR}O%!bB4CX#3/zYR(6)٩Npk8=#•rxX W3^njNoe`5謘Nt/ $n̈Z}҉x}&FxoYB-5jf@}<3dDcݧ݋I{ϾۯjѤ,V6|om&`&`&`&V25;0S4 'l p7 nTD}foG37!;fю>t$g!f8YĹQPYj ֚zHǢD<E !g.qΘ{gѯT_ s*\ErH{W %$.B+"`J}Kk;G${f=g h8?珄=REh:)n 8/j܉6  Ӹ=# y8B!H (&Ko UlFPaa.@m ~j_ӡ܎/d!^LNpÛ&`&`&`&`&.'F7O={6~ڿq&UZ (u4|oOԫkB)uIhO AOpȊ-V+dѺJ8\;/>^Sh7 ;o>_SŷfU8[q9ؙx=cHZm 7Toͦa1iڴmui;>}_r'Ǜ&pJS60000x y,ܩ9e,S`&U]1o Fe#tęP(y6P:WښM˛׭Y3Fѿ u[ge g#L"'dZ bX5(Zj/A @"UiaWZt7'8 &`&`&`&`&)x%p CWUבi %j5¯ccEp j3( 6[&:|7'41]ϿDA|A,qe+Թԇu?%'sJ=?a-]a̦Z;De٤X&ݖex) K k0p{ |<z۱G[v)dM*z8}(iC@Y:+H1c$$Pj İ/Hk~|quds"ΛͧyƜ_e4κ~%9Z݆3#BY&AS/[.0`:>՘N1dtS'7_' c(00000/ ر :B7—pD|ҳ:X(8=bx$$>']Q/_?##& BT >[ W)雭o\E}<(rq20Q* C_TmS u\$& (iAf$K0O8axZU?~ci&6| GOǺ;?‰]YSӖUVO{/R"ubr'7H]*&!]2?͏ #d`@ez*G3L:um+@>[OgtX1(_Xœ*?[wS@h7;vT9YqU 97Df`6Ί(-$Ҽ(200YZgRI,مBV &t*%ؑs0D?^!Љ*i-kzU"\dB#f6mL:Ȁψnb:*w%7tK _]7 ",ym&a6|00000>FmK?DTzwɻMݿgʷCUǜ:4$o~P@ S(WDc3(g(>AJ0e g.#vh10:hA}_7kk 9_BsI|\?(,tX=e%ia0Pb_MKc*˗\_D"Mˁtnn8d|Dy 1ټ686|'e&`&`&`&`% EiXm+޳z9x")eiynyo@*]r:">d|gߧr D,r/^F\$9C{g3E@<>j]Vg[ y9m.AiEaWT Pd u;CE1{xhu&OXD4v,Ƽb&lD`>LLLLE.#@ nr'}C9di&UQiHu%^O@r#Qkez_IM9 ~yU~`+?pQ~-\DЧfE YL;L]w2SZfAz7šg߭  666nLLLLJ@F'Qa{ٶIGKGgo$H|$9EIGgvDSU4QP,[(dN@aІ  %Pa=_LDh|x9Q_U[ F!"H*LxD7ıhjACiĆ iMۮ/"u/&` 10000 ^q[?t'1(ww8oI/OA} )W@f "=~NO|ڿ="_Y lcK`(Wm#@E$e!@ja5ŐAKCC50.E^H1j&@A0s\d= A -ҩ(1]5Ow`!IhG.}QOџ=?5D="l. > t w~َ }ȗFAG쿴8U -H%Bc>OrBFUT3k76J@?R=@-{ѱ`7c:0Nώ -c]ֈJGwSG";wpӫ0]XOtEo:%6 cJ |[|-VADM?A"z*`{ PϾB2JQ^ =V(Ț  #lJ<\IN6%XM񧇤>x18 ΂Ճ L@tCsQ凬\Q@?.c>{=TGgɀM]M/ωP1ZCSOЏ[*n6  \@l$`LLLLL-$f( 2>{Lib(=*UA*rHbNT?qF-?' *6{s QxR?S&_~ʁHv U#Jq@u>Uڥx]LyC/ˆ{5)t3 |A#n#>#Le&`&`&`&`"pbP$ixS%ϲb}߭5%\aWDS_TH\9 c|?D>`׽rw4€2Ԧ!'rsZy6k1(EFO(0Ȧ(= "rmk1^_J^L>3>3Pg&`&`&`&` 6qΝ]9lz-tv~CNbPW?CH`0@29 whK@ 0[|}6b&w훙 (,=ߣџQPp}Dt֍eV:}t ?aQ/ 2qWI'5 "RQɉ(@v$p"$?C3Ŀ 2<-A 5.Ð``!->Ws ϿE .PD/#&`g%`Yzp0000 5}z0~^>~gSU#~l*駔DpSvDZ.U$6py?GibЕLqGjE&9 D{6uQ_q(@9mp=V%HB1Uknw^PHe^NUVMe 0 ?_m&`&`&`&`1/K!+N@z~ ٝ4O@yh* r qK *et؅@70M=- |YeI@ spOWT̯E~ lv&`&`&`&`&>S$W#@T_~MGQ@;oM6ߤiUnU1@>0 ? b{ THiv}p_>{F"PLomH6]`MLLLLL'Beٓ?{m_R%zg R"B`Ċx%r'jz-W"^p {! $g e]kDS\@弎~N'_мD/ey&`&`&`&`&[ T#"ṿgPye G۷AD{sv7L86|q600008 {RV(G*BK˿uze,#ýqD~Kc_&`Cy | [1:?77þ(;f~U0mĚ~YQ`"5`jvax;"S7Lw'";rLLLLMCWFU?#ǿ7I"en&K]w&`&`&`&`&{xg";yJ ^L $/y&`&`&`&`&`&`&lTb>LLLLLL@6|/S6000000O%`&`&`&`&`&`&`& |i |*>7000000/@S600008;WjAx n,7Ծ \\lLLLLLLL,l8 Vj&`&`&`&`&`&`Ez gAMLLLLLLpYó1000000,X= \.}x6&`&`&`&`&`&`&p65000000"`eLLLLLLB`&`&`&`&`&`&`&pYl٘ YpLLLLLL. ><0000008 ΂Ճ eއgc&`&`&`&`&`&`g!`YzP000000,6\lLLLLLLL,l8 Vj&`&`&`&`&`&`Ez gAMLLLLLLpYó1000000,X= \.}x6&`&`&`&`&`&`&p65000000"`eLLLLLLB`&`&`&`&`&`&`&pYl٘ YpLLLLLL. ><0000008 ΂Ճ eއgc&`&`&`&`&`&`g!`YzP000000,6\lLLLLLLL,l8 Vj&`&`&`&`&`&`Ez gAMLLLLLLpYó1000000,X= \.}x6&`&`&`&`&`&`&p65000000"`eLLLLLLB`&`&`&`&`&`&`&pYl٘ YpLLLLLL. ><0000008 ΂Ճ eއgc&`&`&`&`&`&`g!SPrn!`uIENDB`ic13PNG  IHDR\rf$iCCPICC Profile8UoT>oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqxl+ pHYs%%IR$@IDATxYeuw;p32PXŠ[2jSI#`ta;_$*Đl$SMPU9tFksV( (wW=쳦kM|1G bG0 #_('tMA?pK~#' to$"oSz7Aww,~vqCj_Vk}Ys5_x5&jUxYuŢoQ3 rupE0X']?Gyp-9wgAEݭz;ټeY;?'QX"ojɻX[ kЎ"VM[O{>pK38l1EU<8?VՄnFQD~o`e8iu_<@$yфbL7k mo;#$I"Toխ%ϧ4[xpZ؝E]Gec$M(ŸHv7D3`I1SI*(/R1Q N9=j?Wr+WE˂9[L74L@hK+}M'vRPe?xBiiiA0މ˪'g'ˇT1%גw>6|ΝfS{56|_|_H:oC3 A)W;G5vY,A~/常ʿoÛGY0v^?Nǿ,̶PeQ$58XV^$~R$Aח4h3I?L/N4TA;Epk+?S^Kg>YЎ/Zg_SӁ ÅA~E:Lp7˝]T.ޥZ3N &(P'pBVX"TVi$4AW(]zU-n R}>s@ȡQh9owbr2Sw]}eiW_.ߢ8ebત-:Rи:r&-mF*@ B=Y)S(: 5MZN=*2#<:nE4;kI[g79b|I՞h.2ܲΓ6^J;!hV~ yۺ jIߥ*6 }$_MKDVXNGtԧXqa݄ߘG;s+DDFt,F3C@ñɗK9򿈂l6"ha7g00ؘI˯9?x\.%K7J >!@r"ۄ\:%(i&:!Őp7RsFb!+jLшd'ncռY7о2~]}akb\01 SruM=BVCm]AHgcH[ hn Nyrzֺ^}[_҈Y v 0]d ^BQQ6Zxb,׏<@@_ϮpA v|<ʿ#O>O~fY 7f`@24 ueꯩ@I!L`)̂ $wDL]%+.bYM3@vLUVE69="^ XDiݍ3gkIYu[[.bW_UWx:(y`۟KA~9VÃBBpMA+a&_b,1ЏCp U"+bwap[V_CSݸI`1%Y8$QQ}cZKn@׿pC%qJ|Z&0$YӠ!Lp6J#X$bT[iV$ C:|yH[ܻSnݢ.7!7 iS_![g>/@n@`+7x' Zz $qS4(^:-gR,|oudM ݁D 8pԸ hH vRd1C5@XV H,^].d^*DH;kI|FS#+}Xl\ENeKop {/J9|yzQ\^\?0C) (~B ڏ/C]ۃ@2v:#^rV..Q2⇲Oq.(akeGύW)B]2¯QLX7Ԧ`GB Ck_Knh׿`>5jΟ~A1s?/`~ޖ&p3%-s=jmTg ; D`\MYQ*0a \hӥ _ Ѱ`~ms|Z ,U" pqεD_J,@jd >EN%# ,U# 1_wVN-&/g~ZBDg41R }d8j4 Oʴ"]&/;/lahbŠAborrnR[~!:n(@_P5sqT]5{92p]D~͕]4VEZ4 t(AnI:@˱'@Amb$괛7_DƋ/Ϊ༚}(Q?@+L.:so+d ȋݰR<O2ߊ$|0NKSU?O{^o,pxE zp7~qx4WI5p$DJvM"N$'8idb ^w.2@n=Cq@!?V{h+ru}tE"8`bP8:t2[}}S.Yʦ'Q8Tx(s-7@Ħ*$8 eb$0ְ.Hl _xf$s.wEËbM{6F gv{=,d9gRc+]>f/NzB3i1视O~7wwwܸy)2O'9G Ki愔:mן-<д qn^8!<[{k&RvH0SA4i 6Z旧"gNzv)Os.]LG>[_`[cydoS]wZP_ {Ph#:q(fG\ߗѝ;G :eǜ2ń:`t>W+gi؆3DSJ-\F \=Y ai~=gX "N;Q*D-KvdZzᖆx{_GzqApJgtC6x-e ݍ>KXch,i J&%{2f_&gh߭q}Ȏ~L~?3).oۦ܈I6 "Bb #L<be%kCeѺTtaYj"O^y7viM 4 {}h%Ӄ8`:9{.ֈ`&%:_N<>{xIl- |l:J1E]EtC4h8'l- _T!6~Hx9t*׹a\YXWB dYܼzRk(데XqrZ+y p_ݳ^TId[J5Zyd.@NbH [+'#I* "Ưdo7;Nȶf#;;{% ,|@u w,|'?G>(F&рp ټ | ִ\aJ2s@~><(:p܋4C ѣ`?/G<v>G5QI BF(B5xwG7l LdhLF 'Q0zҕL]PBp+{6aC˓,9G1FK;/xN>UWgb{8<ECIX(~Qnڏ!^U0CwRxiy -bjl.i|yi ZwGiQ\r $^ ~--檯+Az < i[`LD@![_1r$0::Eya(-9 mҰFSJiA}!,j:yKk"`Pr|G9捛οd!\~s`4lu'TX`x@*0e"uģz{쭷Ɨ3U?v`=:^؈pѲ肮 u;`M{0S#x\(aYVvژ| ґl-!XYsݔ*YUHWgG/5e͐hS ^VxVaG&+lwE5.z_}i!`Kל ^dh{ }vO !`)q 8`2,Y==PQۍ8yLv8ůHݢ]Oer p_Hę),kQjA%[ 1:(d:!/z!D!Eū@_7 d3TY< QZ'>>0[г+b w^-zg MNvaབྷ-{; N#X8-G7<d~u烳)跜ûKZoiЛY$im߮ ӀYFt PYI>WW1Ɉ'Uʲ`/d>yI% >gEefz~<N8z##Io2$ZUe3=" ڷ D2fgYPz!^v-R,6u;E$UVRt/a1l(4O }sOb@b>Kgn3 XO/vS qLJ~A@;NkIF3 `s~Lzw7k@?Ҝ?h?QGLpr.]#YXVN%ؖy6טt~v4LcCR5g]GW}M!^m0J"JD * uҹ:U- eVQT A-<gԫ |ީHfvO5^x 25 ؀/F/IqĬ/&U, Sz{MLojmBh{Ź/ ;ﭫb8heՋ8ٲ ?`{?m0>MXg%4BFHfSzzNzVMq<*/ή%+mȓ!ޘ3-_+׬B'!iU΀rl Ik4](갽U vzNv^zm?06 X> ћu/%O,1{cpAuE5QI9&E`aa7 ~])\V4xdr] C,FvAi'Ɩ-{wT/{ӾKm^UPɂ.alpYӶ"NNѝ6?$PgUF+<3A947Fb7f>#>إw.`TӦpy4aq~i A|Q2VBhE҃=WٽxjY9rOGl?`?=j{Ȯ߼=G5],^^P4"$ik;+l"HraᰀsLH쏵zKƅ=c?,i(S:{PҔTQ{)+G8]]S>5d츰sG/e:!8CSӍGw^?/W8)G?K>h_iAw"ছv#e)P;ẇ`JRB{]<LȭX ulbp|0.E?;$$Ǹ ~^ѡe=zliSFL -w_\Jwfu6Z66W&͏zn ;@t/C$M4-0hPg;fÙ V}ylJX:V)9@|qx'epQ:ܐ?vzd qfos|x9$Jt\$5HU%=Inj:=ܾ:_\ϳRND}Ce m>o?7./o;\ EЏ\qKa%3["> NSueS`נΞmXO҄b&sWcb06IHDo:05rnuyV*z ]{sCUNO :á" ,z~4oDxp?}0f6~Ն{y|PEhvk!R_~JO2oIТm[G[@Ne/|dGͰb鲊qClr|5;eSƼ7pSѹȭ [.^,\Y[N ,Y⁞UҶp_N@rnqUQȥWhC^9lQML8$"/wi_1&޳WGyT:|FH߸yeN>aݰ8H)8c$VJAr]p|D0*KN3e/{0|rpl['Yy^A K5$Ew_`:o=<7yM73݃СQP.K^~mɎw-lH@^Ev'U(̮A񒒶:Lwt͕G 88g B{h޲P'ΐ_36D>hmPtQC֗)nEXr"~um+O'ٸ}VG<°e?D̄OA5~N}? Uprz@QTWX>a?YWV')CJ8rU#<T-wQ"=5qԠw_~x]p|U&G%p6wp#tVv6ѯ{Em-=r"YRSbJ,uY06qߒ\Ev[{i_$< 1'10(B6F$L{XmkI`'=!з^z3hӄ)Vg09Ώeiw ؜ 'p [t ggYK7'45Χxe'(kfۮuTZ:Kx69gzO?'{Be 45xL4KZůu6on^oEl>(fwρ ?bi3} _( YyxQ5njDQbw*[d&LgEnm5D$HVV\=조Z 3^*xjT)ґQ3tau`^ i*ޭ^^6R͚h~v~# ){ǃ-g-ѐy?J0%V@tޢCdzx шW܊mY;؁t-eYmt a$J}xwxПElVy Guq.ɚ{%=d* ꋶ[Ƀ 䡓^E\W&W4׭qV+柧D[_y-"braC: hsZ%DgIQԻ.RMogFqLIM-iYN܀)heW]oWbYMV/46Cdp: ?riݹv٣|Mj hƇt, . qtxYl`jvu߅2qA3hg^k4pTSYEgIͩ+e$ϧ.%B hM[k$!kSo 7Ge \Z`uϊW$>{4(ە+'(R>\̥Em8w b> o9aV) yCAn7^^Vx飜HEǦyepV=G'Ou=Z]Gbu`{DpU%vu9m( z bIZ6Ayt1wW&23}Ɵ@YMY&$oov3;" el>+?#^]uO0;ؐҟ̖ϑIWv U"eb iA 1X6BCپxBKF" eeyBH*d8w ͊@R_ME`\`Bth]KitϹ[衳SBP&Y\w,:|G1}W˨^jvKM>Cb|@O(ea8mx((n_@f,N"UҞr$ v'r+Ngh . Dl5C:=?7f gGN+4YjsxwudVߊh!k{皫Y PtK|[K+[EH4HGr9X1J×KT 8S#M V5X|3Qt*eDtPegLw\b>#|ְ{3%(?ߎjI[>6@<2gg"2p'k3W.8N h;[5iղS^KxJיlr]n \*w wߘN0،`,ܦ&8G`>O$5@*ώnFR:$]t;9I"Ѝ$oÏ$j馗d*{=IIJ[JGC`wEǬJڸPJ;Z}Zb$&i9 Ag&}q[Fyxyx\,o2~`gVGxDp 3G!<TP sM8(HT^O`+̰] )"AMR(OlT2X̭("+O(F(PG+z]{"4 uMTć AN~ĩU!-SpWaWV<3И~ tYW:c%BJUޢ]8;Ih*Lq?Kŷ0BF8ř"Dbvݭ\uVHá s?uKNYo?MzGlK@[~xtc,}2nPX-膌= [V'Vk׺]z V/"n WR0!VWCw+~^7&"J՛D lYhD+"]pa2x74㮭Iґ%`;YҲ-a- <>œTc,,n_&ybF_EK~#CYr?/_u{<.LIƽy H©9թģUsʤ~@{ߦn#ݲ_*}Jsӆyws376m*cusqX^"4W6YYV5n9aHd2Ϸ f'tVZ>'}@) 奋O⽭^eᬪ2vI0bnkV-l9B9v!ݸ3*@ı\phvDp\EKˮS r)W-^[P?ʥr-m/+L {SO.ojBnA*|Y<+tҽ!奱ol`0`zz:[3[ɽ&\*˷.#~)#AZo铐YS#WMIrY_ORiFV;mҵ$}S jż۝f[L>]q+8dq}VLUΐחxC@ ڙ@I\Vp‚WC HSr'[jM{tstY5~]٭~ƹҖ:tTR(T?1M6-!'Dͺ}bSf|4*^IM/m,u[JYvO/ wX`m4DO fe$S}*8 0ݽWezQJAe#yCzvlh@z1;2]gd B(z+h,@S eQGWIj-b͉ U[Is_|vգv/LZcƜުvC!<),?c/*I6"n̟Ó[3S~Gcc>jD@KCva;@FVS{&34^dquiRU'f{]ErdDˉ5~U^"-)\mF?2&,ZYXC?v>]w/b>`i>:>TU HvÙ]vp}3(Gdi;GWO5+Y׾,GNmë:.:fMKqr2NL#M?Cwh OQ؂NHRn:@xW%zkPhfqkLCJ6Ƚߤd7I^xf+>/'TqDxrvPDJK>21a&G\`Ġy{G$B Mhlу@N!̘M)d>1kqbKʢR@}$(CH#tY[yX)vKBﳻ q't:$oH{lm5`~V>oF+H_]bi%+AՐ_c8R̽75yJ5fLOr |QƾG"84I nY1>z3ОJE DDc+"$d!}E 8EL`rߛߗx_pt38݁u*1-TŎ`e~N@ L` F_a;*NC<}WqsD˃Sӭ )D 3{%Ysn9{*ӔYF,TkM X5W,(׮J{֖ͧV=Ӗݶ Ԧxydqz-zbKޙniMr, Q vYM4 ==3A3;~m!V 0޷T8jo$G'0px[L55(!'c3slm#ֹa 1;OqoTV&oN&GԷ ~?0E̐:hI͑A+TQŖ*@_{R!n,8 q]\/2Ҷbt"#HMY}o)J|OuKܹ+P[.Bxu11(Aв(0|X<ß}mκ"MhhqHg㱍[1`!6-RPD;kLΙxyI@|h5v}̿OވcC$x@H7FcAu2@$Iu.d(kB#;MEXgGst\=$ @₮@lD7T\5;%?"o@Z"QБ]\V(7npg E9}A~fja'c@b&)6s# 7r}2Q(NT)0CRcNNǫG }d}|ٔ8.' V׿|hKHN8iw e֦0׃CAk)B@ึKhm}:>Tiݓ{ռ"`tT"ztuʷ_CX$('t]2z1Kڌf QZ ntKdl>i"#=娃%Qv p Y@ۂNeAԃ8RIq5r[3`rl̻=)'ƒ[p' 0gaˆ$`}J9- KQkI@L@jeCNBFM)Ax)c`-")/7Cp@@rQjN(g`JDG'k `@M @@ʃ(gq{W;@Ѡ W"5g#i-?#˕U`O@)0Pt\N|i/ F.gwjUra=mQ9/>E.cvgyoc?ys4'Q+;22xJ |;@qo0@PB%G9%0]˫qA-~< O)A]b}Qj˺r>m~Y%.zh(F,GC]Q#b#bp[n2pCVMыdѓhokq0g"4 L;\NX d%1hDWC?mRnkrt+цh6hDr$(iԮNhmz ?kIqĒ <߽{}G}{nq|P,aJ, v pB`HtFr%6t}\| ܨ-xZ1CnUZ[R4fw2bG/i>Ü><`$r1@E⬯0J5?G;{cw,pW~ /d4 Ap':Ŏ@\uzv N˷ߡc;AD1#u';}I3 Ky}^i,htD[,3tE:{a^N9Stl[d`DW1մ(#q@}.@d~,$#`0LʁJ(z@B6APyr|- 8mZm߶##˴`I C7F8?G-FsfMqrAc`!0wM`DK |U+,Rpz= qb5dئcBFA]}!ik$RWij*A.\~]YZ\[;I;pTJgxGh!I\mG zÇs,5J{҇E~cmleu@T5)n*A :Ws5O~yB%HOYqdpÛe.ր]@c@C]\q}h$ҖO: ͝?U id' 돹Co?f?-c)A! olA}pVԝRډ06׋Z࿖ CԍEЇq@`p35el05`zAxw^`r#)X?J H4>"x4Jm2]^Fpw"ckB>M=Q6t d/Sp3ߗ?։: phM P_<phz@z)h@Ž0`WB%({|+Ԡ[H3>x"`_}h@MkU{3Fup¯验,6KMT G[$)]b%FM.yd kBxayN큄qXՍ Sd`ǶacM_ei`v}qY 6oa"{LbӫiNvlfU[`H#\zIGT/Qk>4@P͟i?1˽4AJFup \{ &e0Ii:Y]Y?4]ɿ\D0mY 7ֲeh^}6/_OyK?9 YBC.RsC1?%U0D?GARDdHWm\ݸ 7绨g1/Z$=O t}T7垭#@Zеg|˾=l!xlzx73ӄe`Z !c@PZ'Au Io",r_!a7@q8K=5V& Hv&$149% .iH噆_-Q ΦZjx' Ьݒ 󫹩=UU@y數/H [M/8CMjQp`_~iS]be0%TzK,m.uy-&J3P=C]ȯz.&*V>N@Wc\b*yg{fJW09 3lvwk!6q*3"nBS7jNr %-S='aE9cLڽ!ze^#˼>vygvq~.,,K/X 5/|>=0wvFp fzq$q3! hZPu$y0_es?-D> $轴UtXjqҵ<]0ޓ\4BLz],D N!F/$$ HWP+P<0[;PnBv<ˋqjPX7W" m4[朶 q>fbJ*3W"R'X\")HKl!DV~{m'VycpKXY99;ÏB}0ge}rDC@/pꑢ/oNU 1:)%m|RD'uSܒa}h/l4%zL?B,Q69IJYpqu<-:WAKor΁̔CA`nfBJ:OWyN2gS߲ބ6%=b06Hq\쬞֭eÔor&|_>Qx"PO >JpAKȏa#AV.+hYҗ6鱴 @Kֽ2[sQ1 IlXkEy߉~rP)YD!-uS˓zT*OԅE %VĎ ɅsrE!(E4 lU|I=p|qsLjWu904۷iEV5WRm[OA}EFTvz ?B1AZVVtʷːJs(00\ n]'b-X)˪Kv؉&O3RcێA8 *NN W+Dz94'!@(yBh(NKK4%0=XDwh.TS|$Uȟ/ p;[`vZV0B~,!h#.$ wb$uMȟhD|Ṷk QC:xye$BUZqu(5;5Cǖ&WA}X#JΞW7{*9pk{΃01د¢u||xiD: OOŠ{09-0e;`)qkj6PF&z\"5 *7lrOدE;. WYePѿ8/nݮ{:h;9)D[5t[oJJ/l 62<:n]V2ݰ*Tm}1+Z2$j-ĉKS_x}l{4"r[֎UI.K/`o=KT:%(M bQ!k y=UnY uO/hm$Wqlu],% ,K 8 W'xcTu32VH$nOYN{~Hz|*%"UHT;"@v%Dl)HN>t6A6[Nej^ß+cw?p1O}"r)hoX+L#z\ۂ,]z\eل3JbGrMœނڐA hK\tZF@L-" YB\$!jd:ҤHHvLZHs$]A@+LeTC+Ar&u~x" g~_gv0<8N{ zv Ч-YBƛS h!H"2.Y)Hǹu:B+&83ӊXGS"L3mouQ[}'Wfa/4/U)n ~E=v!Ү9 $k,I0 ӽ.eK,JBPPZtOEĤ;`c6/{dK i^)ؤ1}ȟ/zg1f-!b!Z䈉d.LMS*ILOk_N$=&G_jީè~O_|жُ~q[K6~Og׽0YzBjN 6A[K| $r(cTera#$ ^%T:0.(3ч(+%hS"Q%3HQWrhm9rTca(ҖNsF M,VԞ1VǡCⴥu3o<&"4 ~nG`%o7FGgh26JW@4Zj A'"RFDVb Y `( > yz*?P" W,$3g={`DeF~˹^iQ8q،J$B;\2R> uU4 A"cUihW7dd^/^= z݇IOҍY3 @yF_ 6oVLLя1BݮO>zꨔjf%I@K_%Fq[!ug FLK:(NF۰q1tiVv7*/7gN @ Fz?d:Tgא8Iz+4U$Il1p:Dg9JM0!4"i1Ț#___N9|NszGN>ˬ_Qc/8OX]f`YWnͤ^VMԡNb.on8NG">d [e }A% sFsAMj#1CŃv (vF}B4+爴uQh=iﺱw$2i+Qn3KuqN'`z͔D v 7o7\Xx6E*stmҬ]eZAY>fUFy"P ?"=I})A|}_s2(Y#.C5Zv]9d)mL3ԧ=uMܿq ZC? 9zGsԿz%CGLg/:3 *Ti'^AJ&x{<,{Cֵ㴍?XG=6;{?fL/x&Y!1#(N[ؼq\)ll\ͽZ' /N ~r/ . 1bkbhRln9XCrxZD(6UZ7$6|RD1 d)&? +lAƤe(S1GT=0 w%2w]q[bUSeG]l#=Tp(k5ˍo{(:12Q|QJ`ƄOC8$UKhE(E@dY$b.PGky0K[C2S9e{EB&dðN~gLa}wۖO * *[1XYÅUAz[T5~sx+Sc՗y "aV jTcTGu8D=fsN?'NԨD*B XbcS@i!%)Fbi&[?ܲ,ڨqnh;pWUB``7YS;cfYגJEC@oHGɳN\rl|6ϥND)ƐrvjUR1c8eF'1f莇C9nq<[ NfwmG? $,஋yNQJ0'S"Kb!sq5JD;U&f)rn5 G3[H Jl\E!VD )s++:*+w '?3.0_r{I1#_G}0gU򅢷VdF 4e(:W1h6KZf+`֜>:ZL6b}C^|CH8$ĦI TWp_ީuw (81pX 9w/c\:Owe.q(+Ǻ+Ge`C3#NI|<|ߠ=0z?fMG읇wou#PǾRҋWx)5;gKs*D#{0_xֱz0d`fՀiW?<(~$)`Va@$8\]hcفc~ wQ1:*K}YW6sI9!1KfDQ+i?S aIGN*u  ?Y([\]{1Bbn/.y:W? M+֪c\p7t|b)"Yczb$"^D *jVr:m2B+p5Avx}7hѯ串<~𱇾8AlO r;8RZ"2Sˆ.$zD :9|m37DŽ(?J'=Fe u4]qR4} ' sz5ĺy0vȾ k.k) "+g6&A+ʄ<30gt4Y<3'}A|h-tqS3(5ݦ19?CӔ`tI,qvK@Tc}{K i˸$c."ioDĀ!ԙ)="1#H!17o΂&\f?\Ñ$ &G!,yjfy:ACv΋|D] b3@;L]Ne[)+Gs뮢~kS2CJG}#F.sx zBils]_>EHy{sۼ J9.( &C-(}R ZuЅc6Bd<-8%;}xo9 ,3o`z%FDJChD@ ZN粡M)'>ekGf'lC hw3zn"pr'v: >ɚ?_?ʁ<@P/Qoe_"\ԷwXJ18$ZL"G#hmȌ53RO@88q4})7nR!) h?<3oz;=&wW5α v,02 C(6{BEe\d4X '$a*IcGAllZ`@HaͷaMbpq'=z}=uX f`wo;=FXl.lsj 8A P_26#"V)(%߈' B7eو;P!3@DJwR"E=dxun"mn:G]fw ZV^/Tc2KQm}.B~цu͑O㘲qUv u͘* RY us)O8d9BymYl`讼:wTe³xO+0J,s#p/nEd ܎]܅o3]Ԫ:t%{E(5g~ ( m6^ƓM c [\C u?錫J@"n<+)}71G\X Z>!O6ј6Ɣŝn:v_ۄi% eF8#̅ņCp˜l 0y:bў:Ъs$`u(Xap+'_tSH'30g ]l@@̩4 @q#-NV]LUHmˎԄivE,]b`wp&gudj ag!s*uԍvg{ {20P<@ԥݙa1th;+Sh2v۝ʰ1{`cl"R  Z0 {;N:Neiv{Saky"H!gK^daD 8-e);-GoOA{<2; _[{sbZh,s倓K 3O2N ~]pR~c‡0<,í@ċNVF)v[6R6? ,P(.Wޖ7<$s</7ӛxO(\TTwx("lu Dl;3{kߠ`NO<οA6CfWnU< j D`dlLd("p92O45 6|%;Hq # ~>1vuǠcӟ CEfw[X) \YtA]簉#DWv$X H.2w݈sȖal췙#UOj giI~쥱sBG =ȍFiF&-S~tћhsEU`/JRHU%Ng(n2Qhl `Y!)ї1 cH RkqSF#{{?9 '8q:濴ڹk$a &w DI}T bʊ -F})J|i*&`w0 X:٦ L@>6]jxT3-sJ(gQO;7׋UJj@mhQM١8{P- l]Ns3:eO=_ QPB8>{GoŃ<2ڸl6MzÝJ(+bY&ACn 0.A2PFW,J lexpn dqDzHb{:FOۢұBzHuu)f=90JIc8}c~p*c "~ M exsh7S:F$L _!ȓ&w _i-ag7m6d!`.+N݄QeYK`T}\`!5!;6ܵ /r^x;IDە9^J^e,&u\ט3 BskA=|D#k >)D-83[@d}ɹ2P}ȊǭCPپCIy6+q Qwu G1x`zS{k}T3O j#D;1Ӎ,tXNȧE|w=/N$4 ɧEc.$)}+͜sS@jsh >Tf4̄h&*G~<ݻ ;"<>f= ;f~ :nisVq2EH|%I4gd(;1"1gQcD,@>jLQf*GwĆ jQQ]]M ,cV{;Y̳d؇ƖkAI%S <`†$Q^sY|9+\*;%~ 딳*CCQiu>ґUhC6u.Ԃ^.3ӟ$) {Iap0B6f[6Vlv|s3A=A+3lL j>Ψ.bVU cƜp#"jopAڎL6t1`@標'A2a3ӑ:}g!UwjV_~s7.GxL@ ľވ~PIULΧ }Rι-觳./|o JW\1Xt2uQ7} +Yǒ̪K.#-~~Z;5)7>) J@g^c?'_SWQuo 89@E @<$a.}QDVs RgUɹGBp{k;/Ym;Fu~ Dqtd2H l> 0a_kp0K0b2߄y09ן_J9GcCX)%SBB F{3 3,v3 ShZ\]qiӂsu9 Ju>1H5#!X1ɖBрz0Q4(DROѬpm Whd}qnyܑkߦl!>Lڿ&2B{*029>/P1ʔK&c%}D?_3!E YZSX40< ~`'Ǎble< CnS!}}2.@ &FU9e=QnQHL5sv$Ŷ۠K_G}`&GLg9boO'ڵJkNYzd<0 VgPH='=TVzk hpq 8l@9(L "O-( P;?8@{Oۋs r.8M];y䟛އ"=YOs'$ %8M|kj}#,:0~Fàh'X }\ϐMWQ03Ζ)uHd-ƪETg&fQ׫Kҧ>Pw5ÀԮqcnZ z"̰H<:&b|gbd"9DD.Q$H.;p ]A0 2AX4l]-ov_"ײA`YcAyw)ᲚJJq О_PIDW\O ;WN -˱X xV"o.߇Aŋx.7#Y[xEz&׿$-;Y(qrLs,h='PV莼yGV4(Q_:F/a]O@~5 N@um&l-0K-(TPg_A^PQG+ v(B$鯍0o [n/Ĭ P8o&N+ӔW㬷Wy " :etEwBvGg]f>.^n7q:"mR,>@ mfۗ; : F͜hS-SbZ0"f5 UtsD3_ xdnȯ )8 ]9b/EO9N)F}F(o+\єV#Ȉ Tb#6 0ecĜA9N2j0^uOnP A)hdAF<$:8IGJX$+$xP#פֿ!?{J)|Qvt墊e &>pZ[H?UgZY ĮO+{e52;5UHF ͇~^]\] Hsx0 aKqe] ii*kzNE~BI7 axש$ϡڛq[cŸ?o<Q%hrP%g|-{.d=L*ԁI@ZXY DpXAI=R:m:()JɃwQ L%乆ilv<I3:srr,$)ZR-aCM qqx /xZer} X1ù<.a47:qvi-)R*ڜks:˶q,/׹W^H-Y鬘I:YO4=]s, @û"E8$+OtJw2%ly4 (|A?c883 סKb$+-Bv~!/gݮ` gnj1Z#)-湿eHE3Tc lW_x.w[2(O`)uh3-+Hk]lW9?RVVpj-7 | |X`Qc;NEvEAV2bʩ,[+1"oEL_DdI6svGBG5M8᧪3ȯɛEc[ռE tGZbdxɕ?G~oRfPM͙Rx(' (2ˀRF +HT \yȡU-n9\0uA@`.tEq,gha&f,!3.~HW IU9[hι;n= *PT>nUL$h"BDi<=Hˑ z r Q vg!XιY&"5ɗa_:GeoM3E5{&",k?0Pgs셰=A)%t9 `4{ɨkw{_{Յ>CuR &0n(?[{$QJ1@ RE)Ġe^}rO3GBȀOEӤ4-6#c1mo,'/t ۚs&ad"#׳VkV2d N n40lb!J \03' &P"8~6SoW0A%䄥Ѩ*a>a'<3aX ,04 oAԒ4>3ڝW7 k5eD 9Hv] !N׫!^B!3 aE60atc5.5:5qTrt}$K>tGy}<^w];xՅ GiK8NyJ sW99BB:dm#h0߽~gpZZTh#fw"\0Y'$Uo49ؠCi H"EВ$#YD:_w@a 3+%91dh(DGI |\YfHaA-+e{S[n&spxߗТ}$F~aIJ:笞ĝ "ތv9@Zk]`waպDfa/'N䜔^ϞMIΰb:p^/ $.ԙ[Ζl/z4 p)z^fF~ 3N6J$#VIVȒ#e΍ɬfDX7(mEBwAP2/{ 6֑SUʈHEwEy"p`ݐ+QMVHYСa:Ө7@pþ&icnj7 |ٛ_QBVu.!\ki/ZV%NcIFELF@2x%z@4w|S0-Ӈ~6Wa |x8-Ԏ9=i8JwD(orRhw8`;^_MTڕׯM+ n5>op~H_,'KQj}_lZh'Cc!#G%/݇:H(x(xd5ws.[^ѶC 7̖y e +w/fq^E[lԓ|ep_FKQ95B)2Q.r0bkwBp>S2_KkKtyc1mR[KKyjE z (Y okz;nqƄgLyMh5^xŝ.[L`GjeԮac^қ>_)uXFch !-F< )AI ?y;BNB.ƙ0@ȤEYAjdΑI2E$@Mh837JO$rv\z\qBaڎ2>++7✻pF:^v FvM{ wMc?A{ %Rth>Gd̋w1뻻GkkqqmC,9**i[Gs?xuH˩ՙK4_.~(Kl+~`O`x||/ %k.5QeJa2 NĩόF @0Ӳ%OܾiLeq4մ܎"C ,KZ 18L; Ң;9EM Mc U=b87 'q5ǩƦA)wՙ̌"3c>ui+xGiXx ,H҅+٘&n lTH0W) ʶk=`~⴦{LOݴNKs額{PD%)IN@g]TvZZJom=hz78MtOFwQju }r7B!$kp~tu xCn?p^n$I+E l {]%FؙZ$$,q81x#e\7Y>p(N%LlNoi1b H<$mR8ld89s\'n$Ȣ-Ws(#Fw|jW\7B.%ϱwx#?ߠÔ|%g-$[+JfeD ,d9jT^Hz_g;6d+mS"Xưwo}%jH'@1qѸwȧpV23j )L"GX~ӊ-lv^@QR\́`Y~~$BqZ?\H@:o(E~-RzX)R&!(}VsPJ.-<09g,Viksôi_~ߣacOTix>bzKO˭ХUlhbق68Cg綠Ó=nҧ8MɯMStw.x28L<@U'w:,zoc! ҕ@U?d6>ك*fVB'!F@J\%5N1 N-FJȠ2Y*.nEvFO@NLjɭ5p Ay@@puGf p$Hh (8Pfm^sc[ϳa4'(QI s`~v0Bt ;d: MK+f&,g$)CK\'%h?r4 (*T̶U~yʟ|k~Bx>Įƣ>1YU_lVGg>L=SP5Pɺ.fZң돺Nb?s7>ބ_5;I~b'zPEA}x(ݺ$0ܺ$?W5IBG^K ֶ(* ^F1C4tא$g?A&ܓLE,L p9 "ď|"[GG,2`:F`,`_{ J*Y2ȗ؀'G DI!oo/ 9/ K2U{CzrO?JvLLdvų<` KZLJ$Pai3[X`=T2vBi'p[HSȫqB"~OC 5@'; UGAvLַIb(r ~`N ;iux=G-ezHJ!=wOwk)=VZf$5izG]|\`:`~0=h NLT'@zIl$E߄'xVVRnb'" kpF:Y>fXPl-~ߥ8'ч 3I`$qmk+3T8O#I4FӒAbu,t28{Y)*]pt;y!ť`8gU`4?QOfm o)Dz 3% 7JO=Ra>u}GFR\lGb,33utjAp~ e11C΀%gc6WRS';>ۜ+#/N9ۓ2\Aj Ng}JNG5sJ1/\VEH ';Q_ETpw:y3hnpzO4²w'Ԯ +]'0zJZ%Q0sܥȍ <N -r8=?nq'=W Q5Ik1ª'id6/?2,@/70*S, o.o So`B;=py%t .>VO?=›iu}>@]VH'7X; ;4npjlfmtq:**/PP'p.߿3I~0*=H갂s| vb<n+N!țGY$ 8і@ znf19x-]L=f<"`2+VދG XpDܻ.:i! 0i!!uB 9bu}*@0 ƴwJ9e،MAa$pY&@ @ʽ&X+M,EQ\*MV97t{ hIሯ^`^_ϒ"An]"t7w'z{is}FUx0a$f C!Ц.h T&B\婸 =h-:0Y~@l+NQD8Mn@tw#| j@سt =Z@gohChZ?9NnLYF#ڨ"P l`v! 01bWGqEXI.,8q^W )rnm MÌ Г[ X!VWE`o߂ o~7+/?͈~uuaEt1fŁl&<ed`ˁwfAlď.f+{ b9U DqlH\ 4c[}'X뤟}iFb^I!oto,0Mƣh 5P쟼i٫@o$uy& QާV u[-@h+{*h\ig&/`!} ijB;np !l]8-YV˒έ 0{9^T~ &N}@-F' , L ,xV[4pMg `O ؑHKInୣb(;BV%mn)BKM,“O}a -VىN7Pt2v{42#F( f!Th梳ۅ]=pt.`>4`# x\bWN_` >ӁH=U p PezìW~: 7MCbOC;QyTJ6^TJhĚ bewǘ| &b]^@0ԬYQLܙUK@_2tUp9&ΗI32Ѵ*.sqڃ '/XHUz p=\]}}5V!I/mP9Xoퟤ}{Tma.BH 0t'HT'$PS'#.p'TZ-$f682Gulvʂ>baoZaN&Ml1;;"VZWk/bYjQ!.;tJIH ~Itd^ci0KPf2-kHO`~J5w=_?ΖPbBz D~?p,-J[y`Ƒ6'`̘GIڕd7TRD-a/zP/vg7FWwqzA_! Xb̒:('~?Bg#x>ss}a\AɁ5yu\c-c4aV5;v_O7ZOHr-[5]B%qF"h0=^66 =n?g0O6m0z޿HQ_݃EUl j=i(C-r_ ]>G'td_{t/]\8FH]W(oz?m98B2`Kr/}W?xVwn|c˃˜(5a%X}]|h`/~:a)qcx"Q3; UoRD-FfQE7VSF3_B`TyRx>y*R`yM0ֲJ^soo/=Ǘfׯܸqp}}t ' ,*0*~?WV;ԡ cok̪9)iHgID-&th5''Wl/-^<bx~EBxETH٬yȔC)B#pHseu '=--ƀ;1r!QW[,PRNG< $}=TuJg:xhN"]A*t\p*k*%6'ܿ(p.>x0glS ` gg+&\!/)u|wցn2a8SHDޯC'&;V5}bKYW? p;={SC;ܤcG Sq2ǞpX2~3g}*_x nGH$ͧgcuYl?7Nt #Ezۧ Dto$xoA,cD_x<,Pi V{RG0EK|z6~ EIWnN@OC] LG3} [Piar{}f G \e\˗"$%D\QfɄeqD r-.'{~1!0CT/ S>.5bo `&$ v/+nos} -4k[%]vf#[rY>|0 U,D݉&>ak( %׻;VxéD  A`HO݇*UIDAT@g!60b !FG&E'-Z~^HLt:(ظdn" ^<>I1 Ww]*r)Bx]w{dNIGymrுHli[Y<%+}W9WE~/rx [Y"^6aq=M"ƌbxZGz̛cz~ iv`V,+V !˼/"~0te!al Ϩ䗟N7Xw,8Z[cn_zHA!"9ͭJHcCk?H_Sz* 6/W~iu+k`ʀ}dL*pp'Lw|ٛx:Ig0z3OnmF& 9tSfO!=3I `WOK+KǮ?;w;́{EچQC*Q16kA t&X?$b'#9.F!Fi=P-,񅉉r=-DMˌˌz ( DqX<)p`G%5jeT޳ @#VJ:` Xfcv+L7꟠כZ -A\g!TӇgc,pd2H x lK`տYjTRJN7 /~ KsY&8Mؿ1=/b⑰,&]REqye~rI;Ȁ/^߮T Jr컘;γw2y8^w9aw?w%ZA'<hKJBr+aA]v0nG_ RދE];-nbCi %h6;@Lw{X}>g6S,a w -<M=%ZLߗa ~$v_|H){/g}v>͆_C:S]y*uwӟ9KhoO+0{؃Pna'+e# ^ ];o>vPzx3)Y8aDDǖ= a3/?$X.Ls+l1(%Kx:~!LTεH%c["AOP2y?adF'[( | |m=p*s˪luePS"/z^fn!@X1o}[׸<~y9a滠zs `m3X*n`#QsՈE1׷Dfv%B;tL'ttp@zD%t$îO?_9NAp"zi wLw=u_QSODBڽ5H3 `b8OR`aTs+< aZºVEտyMi &ڮ^ b+Rb=zo? .! 0U}# '>FDo _dPras=3x- >Z57Z3ט]܉Lfeį|W.+>W) . t h,3M֪-,IWuA<3}TIfyd bX”"W#F~t28ʃX\.A;g]7+@'(*]\:5uÑ\[Z0Nǭ0PbH.#R'B!#3 F!J19IՊR'dQa1+X8::.`nZoZKN?]Yd&5HM~P B * b+<6!qQ^Oꐭ"̦u][9p7o-~oH,݋E;CFC6sIHklY(C{6D8i/A7nfX/(V,{-H|lȡ-q>4fÓ_HO!za0P_zvguO>;^=jlP2zbx@;%?ϦX(٧GAԆO"F/8R{/x~gX?s}?c3by;+Ù$N@3ٍzn@d(q obQO:F3P6#.RflfVSkW`1rX%G!R;=V<̽6a&!M7L r/@~^AkR mkiNN-/Xq9F Bf}nH2X8t , ?$J 5z#!i1!}P@eͣ`{l`:Mog C ]KPVT8uF+/{F+ +<~⡇ETzܪ.l>&ON50s\ 9!?PC0х'ۅʠqfo4⛘oV;YN!{K-m[obI>8`ƚ)p:o0)J&'Gs_FoC[ aepek98FiLY 0g A  7OϯX8'Y5]hj Z99OooOԴv ~4 L}_}3]7?em0P7b9z2jO8ɭO@.u|e ewٝd ; 6s:25[X9. dN:Hػ~ |MjKE6nE ko-(G{=V1ڻn˵#/.9" Z.s#=PFWVF61Dy< ]f[2q (9æ,9#!|?ֱFBG=9Dw4omo9# WV܌KEd8F:lV9yE"?.޸AR f/3TUc3 z~zz #~'~[,cwTr"#QXl9Qd u#o9ĉk/bX,Yئqzs>7D "*65vfNy{br(Gclg>nyr rrό,a9;@1Pc 2H)f'{Ԭ勸&7~d^yE?|5,>@$a!`wQ| y  &8\6(L%^&R9P3D$ɿn)a0BF6~+D\\|ϔ#y~75[;y Qx`fC\A_|IXKQUˤx%Z5G2&FtǯooiT6w8ĵUuAҏ!sbҴd.#KYbe}ԿΈ~08J{s jC@CP cR~5ME!Y(A" QX Bl9ɣZ(=~R`_qj:J~3E W@SBL&mSAi_,ZЛkZN<;/ ɘ✷4GEJ\Cʑ!CbD˅&J1@ܬU3A5pjnO9"I9T]7'Dy`^ 'ʀa0jf);yYdрgk8̗TnF"CcP0ɿ؆1I>_Y P_EP|`I A /*?F~*ECDW3;M,Mqg|$MN|&׭SxCci0,Q̈8L2w`*Wn_Fq7V2F78 F3dx6+5CfeIA4N!3/F 'E~r%}FJ )zvR=O@g&f $!J -ZG$!{T T99( O?r :*-8~F28iY@U ZRod,fqwM{@|TxN}Gg!JHٔ4L(5 N{Ju;8GNywD-`IC:KnPS_{{%Y5kRe$#?4%I G5R;?2</wkX4>^7a tҽ¤/_r:Y"\4a_нr=21CF+@{`߹DP*[—B ~> 8ͫ/9Ѡr5nDժ9gVa}'O?M/NAT1# ͵}L$`W'O@5*Ne7 N[ꀲuU,4ydUßDr1DZW>O"AibpB" !2DjK.͗]dVpX;r(7߈*"Zcֈ@>DC"vIs.ډ=ݬ;jK|n/ <~i'3YJg󳀆p2L3g+rcVg>kǧ$[L(GbA }0< [1&?S7_خ#%5OabTPtxjv(:E70:hN vag9)q*]wwߨk@$q{r=p#d)ѪSZ ƣUk^?zD?{YpENpb"myo#C0NG?pD$51R؈4KNzQu0N<6+X@.^-J H>տج啍/h4r<|ɦGu|rY2$  05]~z> 1B 7v(D8m''5\J@FHbm0o0wǨg*}#̰p0sY$Cy>/ `.~h (Ń+צ9 I||CN&, jA*(}33 ,oH,A8*u0}\X*ZR4MX35c0@v#mQ\Ϻ Z]TՏDd _H@_p@a*00į0AS:)}mʃ*ӎwj`շygWx"ZyM߭,x,UErz3z>oS`Ace!w0 yoL&_5~F=">i1^1S GYW̕U7_~}lpDmOteDѓG|*2^*Z1~ arڙ30 cu~;_a 3scT q|4'Oc̿zﹿ9Ն Y&:gDg?swfeεjйPoӁ:iiɩ5i X#?~=ʝT1V~InLF pQqfjoŢGDpJCZWY'3:o&IjvN@쿲 Y#u_9H>9tACjW{5|ͨr;Jz]M$aw!iU 9H? x- s `W|Gr$ؤX '8)<^۶܀r0B N5U~! 1.$doO2W]T~!tyf(H"I1؉C_ǃgln@9 :%Y]E: 4>"GcEnDK?  Nko]8rL5R;o?n~Nϙ&5+#Ќ| orm໙zxҼz_:Fۥa: ( g ǟkfMuG_S`ã:"LrNE]Q΃ ݅3) G*xPKB20/ 1KCx/b$zKU9Le&/SFl4ʶ@|K`3*ƣQ .0y9ry/ϧf%+./D7vƻn ?~/.sNn`hP@g3Fzc˹vuD}4)Baj9+'mhegY| 2}Eܻj ` vP&'f 0W4d^S-@oM$ o^lZh<zqU&E/I5ɐ&0>z'P@&b 苣M J֛҆\6>rG~J@s|O?CxyY//er~—\H(jJ9O~8Ձ}S_?v !i'd*ݡ0oN?_@KhSd*Y6JTٟ"[峭(TV4s?s` t6N48c4=7Ga0Y{ڄ,'Mx+-h°<F,)hE  $ '=)?1GO `dkvc/j3Hr/zygb"Ȳ]؇QyR$7tE‹2z=~}XfM+PdͿf(xb%~CQwNUdu߼yثC X:`r 58\#E-.sb`z ꀺ'׀eH z{$ _ ?~Ct*e;!/=l $㞐vi;}sMfx%|U~13U!#Bi Y>a}+ )5dV$dܭws{ ~HuP}FяmOqEZMޓ`PF|vW RPwĠI N65;lܿޫL0 l8Eq?n*-CtFk#j(][؍K܀_F?a!0I^)˓<0S~$aD ʝa"#"(!!@0D+o%CL>ڼh/z~ݭ6L`@ p!72A D)`IAFdpQ'atAp8]33ץ5ۥai lNرcE$ddP"t@'h)<1CC?<:zst[-:ժg\ljĞg/V lV2' 4cK _?T|1=hTu tsַ|fl.U&^Z ct|.I`{$ėx+'A@kn'TIşnޕ"˂yC=Nf 4}^n+v7u k$aS[T{[?Y[hn 2tySLчioJ``" X0E+JJ̾J`$` }Vv*kv*1~+)5Sa[ةةHLчioJ``" X0E+J-*IENDB`ic09PNG  IHDRx$iCCPICC Profile8UoT>oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqxl+ pHYs  @IDATxi$qwܙY@9P(CIpO߾2+Ů2 &>+sUs̺nteYV۩寚Z: CC@@@@@Enm@@@@@(PD2D H 8EӔ 1)))#Q h_>_&ߟӍ"""",߻v:'?'$ٳ_䛺6UӋodӞ1in0xec:R R R R iIvIΓlSdɳd>K{J]*"gc|j(2e. Ect> >m_tEtxqu3d0_& 1qb)yM"g 8O:_βwi즬9u.nnQ O^ `?֐O]aՀnwzg+ҪL d)~xygb | !O:a' &p!(b&^ #"=16%8J*6ͲX b^'npZd !Ka~I߇9>A~fC ` [ & CbP@Ov yMK"""" "]g%:jb\}~[/oaĠo?+g~e5[5γCgSj)59P )T=YNRjIqQUgM 4&ۀ<_A@H!~MdN>۟^/f]scf~]ⶬԱO6KOg~7QU'g~S,tv^9 cpX@ kA@~g;$e7Ծ_x/n\>EpGٳ/h֚"auHZL(ܣH KH|gjQu'ݐ\i}9u_lF Ʌˡ( $w#YHq;Q0x Q"ABSGB2S3l]%7?g)))P 2K+nEk}-[10҇[ş U>=J?>`~o`6>K _ 0zW=TH`aS E^ UC@@@d>K |խn[dɺEvEso-[+Vṡ9H F~?w1!+חL5 ;,0n`|6&˘cX,./ϒ3={,W@@@d޻Vph5;Ų__ΰo7of/_qstϐc?OCV }[#/J?nKgϺ=K%Yٛ4ASu}N8 a% C>$7IiY.ߔ -Y7#"">n D#z/`ݹ̼dqO-| q_Bռ~7 =iz%󼈖$XŬr01d St,; o=ʤl諱""""N>.-Uȗy$y>Klc_οuT|Jm~Gm퓑 }оUNAur MxV =%pH4' MW\X@S^ J$cR1D D D D ڛ1S ^޶mV6MQ.uߟYn$-(z>=0^Yϵ—}!0T XO7XQJ $ /M2.a1\ڱp2o<_cg".|A0=n~7 C@@@1$E޻f,t |5fî_]Om;GFԿu [rFͪ+@?)g'~m ж>u~:V,C @r:KYM8Ip@88 E1rŧ9BO& M8 !XT>/Q@GG|6_Tk"q%Izw$Ùt 8}-~Kt0"egb~VGPo @%mwKr;>ǜPmoi*N90 ꀫ {ߑ(yZsq[,'s ]5[zDs@rPr>5]a_eM) 4H6P?-&dБ ]L% -i q;xMA2HHHHQ 2ɳ]}{t:t݊62~pɟ? X{kZHa)U> Ԝ'<Wt@fp3DH(a_l+A9Î!_泓ۤVT=x2rb)GJqb8Wq|/sM쇣Wue?;U&{9/7/V"ebe^b < U—b$mj@r} >Hq); fM,O68%jm +M@z2#.np!ie;#}s}G $xmHHg?j-sps o9 @O7%t(#Fhy1S.?6[1 'ٯp`XUh(&@[  {F 8I{[` 2 67`wEh))))(@GZ\+{d ߛOlÆv]6?yz{/7Q,Ѕ}mcfoY!>oL2^> l 5R?W72( gy0p,BvHv8mԶ SS%C@@J<'}oZ]]kyEsg抣w'YP_H? T }X- I.,X ˰?꘴A,ؐ`6ÃBv %y`ᠱp^V\axʓ$yz{h'5@<;")))70Y?iYY>&Ut7C }ׯvmsvCg,gW%Uq?oWHJA5[`e[2ORK5pP馪bn"ZcP LȲ VC0%JoF4Wرϙ @ +v7\tM_T7p 0K0rxFw{]=:mш;R R RS 2n.6*/fʥ k ׵xsG`@V@[~,ԶpH}C# )I_iSI3$Ih_]`N ` 5Mxy"2> 2x`@Vrv9=Td [iA(T 1"5|]Z/t!:Dk1wYr~sk ];:y9Vr̷ aZ$ Cs,O1 =B ) k} 7D*0ݠZA%]y&8q#"">| Dq=ן~Zݵm>b\yW]!h\{ Hr H5[ OVXK?E [Op>/!_"Z`RUbd D=xe@oXd]?gG޶L? 6˳uwu_Q#,gPozj|X~eq/_oPu+0Q)6v|/n"ʺD6v_-ߑcҗ%xm-$G;d NQ횘B,V=7Of.S@:/1Lyu %vqӟ6K쟰.+sbU4u` ڄ3 XS@`OCs֛ymZiG9q'?4Le:?\HAMI\t0Nlrz`VU=R MzԢSHb(`?x[h{t\c SMG t@Zt+}rb.-/[̇2<~BUJ!o>V]IA!SAfVHOK/Ljv܃ :^M  t@@G&!L0~ɷ? ۮ۶Y lKV]kʵt/KaL H  Ru/s0z-(uW5I ՀűHo)u"[JKZ CiINXZ805!QmzRdZg}d r g hgEoLO))R 2? K'}UM游w]o}ۺMU-ο,?ϟ֟/FW~`xDC!&ncJz_DC$׈`WzWAX{<L/!}6䬈y4>up" 5JatAmǺM3H ";ؒgrY>icw$_~3232#c))Q 2#}t Qϱi_+o.q;kv m Q7~dlǖ;O PX-f|ɥϱa8_jD TlwXνWC%SƬ=Q!+} )-Ot-#OH5J} ETKz) ‡sm8g<'^qӭܐA 瀿N{ i}G0suǁ -c2hiփiA1c^w_y|4Mdy"݀al$RL$z9:Mb:`pmH^/dIg0^G D D m ,"0Mouӂ/C05 &SR `ھ'#PT}30&bH546T Ѽc1HGtF1`!I']׸׮Hdv0PQ_|%&a8R R RS 2#lπdֻ=뎣m x `OɯkY8~_\ Wzt#+D@-mU ׽և Z8}]Y{QE[`Fc=h/c^Ѐ| 7 d %M@czv PЮC(av:WS mB+R R RQ 2?B>Ov]8v/ڞ=9{OsOQZQo0OZ@jcJam!| e54:Q m 7}},U _aZʏ)! 5B;!?\}.Lb$S~ :6HQ [@(h#dGk>]!KbȶBdV!+R R R1S 2?ý Q\֮>[>uo$_ gןv zo7 ro!Ǽr!-զpN{ͅ4mדe@uJ9lɀDPogё¹.xd@AD1~N&H0 4"""'"?7cX4%;<6>77now~9pe:,a_ F_U v0tCWAo~ĬsGu?CC1Oo0xe?*_ gЯkܡA-)oC ("'T6{;md [Lв4'{J8AE{_l/ //o TQ@@@d~K>?fHmQtjf{7 ]u˹6 ) ' ЏV pQ0߯hGcU 4@_!7ʏy,B>K8eQ⋈ 0vh ]|JM i"J1SATb;"+7IC4h"""~dD!_եVeyGZH Ob~i(O BCPaZsC-9N}ΘcA;yRH,^2`C༄*:R%R Қg™ )g${/lt΂ +O'#""}Zmr_Kkg;5rF-tI̪ @d'?q Z\ 7 :6Zl0az0 1G՞o*}$E$OSqʖ`\co*Q?oEZc/8?`Xr3HkV5L5>O1蟭.1=y|8)1D D < D/?m1M/g-,b%k: _CVX"J83v(ux5jkCcl!;o({aJQ Nru&b8l"L벪C0{Na8ۨ[R p eRlG0{NrV1D D D < D~Ha1'g`͹~;IN0[gɚro3i3` ʱ4BlZ e8P?|X_pJ 3-XFqh{̵& bltԆ[9dx"}#>QPtOgY]MK*Јb0aǵEaTa JhF D ' |Z1>r:)fp$x;t? DkL̷/o rl.j`?J t2]bj+;G<p5UM @Gׂ,E} cB-}+暚`E6~/LgK֟adp'5jѯY9ո/r8!.}+a̳t)|l|@px?'ˎRٰ^_b`bkp n'%6<9bRHX"""' D}kMœlfV{^C}3c>t>@!%?ZЏ?}NIʚoAP9b )[&{e(fAy 17@'uCiڮdCk^&šӖI6xHll+<m1 P-{1T]⣪Pv43d (>pB$B PnY'mG0&;5oDL,)-׺,peort ̉vv](cM>C9:Y= Z[U礳8 :d/6w `@ۘ5s- зɎGM@w'~튂wo8_쓗rVcQſ='t x ZM p$ELE D D | HPdR݆qF V}gC0Hd1IgisGg)28F!؃lj)|{{S3aq2MŇ*ʩw?/BQ  ݓ?<@nB 8Z)SwԞBåjkPA6}͔ yT_ylȊDnEu|1 l4_Y§ڋ_"ݞ$|erRܦSkȥK͐xsßo>`Io[ *@qm1_|E}o~_ijib;}Դ,-SαƘ:ЄC>F:cƗi?6A%̀bQsvm_=CZ~ڸ&9Lw~LE D D )F3 ð7X p% E=[΀`J=__^ʳp*F"`$LІn$uOu G­ɒZa6 5m| }xhR2|f!)[A9p>ڲ|QaWj5~L?ע_K]f.F+TIҖ`Ч9LsK9x8ΰ5]Z~r_%ȧs8 P܈!R R R/EM' 6^(4Tg1/|upxX eK۴l[=eerz|^Lg)S(LOs apȩٱ{Z(wT|# & <Ƒ?>zUm2+7<ڦ7]ݵ?v/>k=c0E\\',+Yڿ@G ԃ"0 ~7lxby$sB@'cTÊahq|ւ@bu^=Epc9>08ekJNhЄP^Q=x3+P,3>>_vVԮҤ &`pÏ.㴠,Y]ޥ]Vcy!s pW4pyӫ(Úhs'`J`)sװcoC6y"(%C}lԧĵ3 =S$7hFi݌k*tsS|UM} =C{ct+! uҟ`h4:AG+8)?%5-AsUy=F64틫@Ĥ.#)j{6yv4 'A,W<8|ҙ!=e`@&#j2j'Y}a#" i._6qYQE7d4 8Vkbt}<ʀr_f*[+][ݛg B$C%ł"}<"Ah&WPV V^CØ"RcW;6׷~#~17/MHˊÎ Z'I _qB֡]tY{!x!p2) ~@g@4)))R 2o?''y^-~|^\tts#3[c89`XTи~ {,,[YQ"oZ=sKCEt|ij/::v^E? W: t=SJ ҁ}!]@jskr[}Y9YnLb JSq8C Ae.d:wB<-Nad5!,ʆd ?" LG6+Wc?#?Lob)Aj' mXXM4 vm@@`1%/zl2Ž ~%L֒t-Z:dxzoR*$a`({Pc\hPq0_-PL%hK"h1yRŸ#T:+gz3Ļc 9*˛.8; MZ->]f\Ue\1eb?{_s~OZ#u(w(""B!0mQ8% W x׬+N3': 4AJpM4\kl3@ ]a%t X Vˆ&Xݎm҉joSapI2@޺im/\W;>z,$c TMy&m2cJ CJ&,cb6*h`_Ҍm sT40ϏiWhIR)!u\@e=h .nz ʟ}*j ǍЂⱬU]qˠzVQ=thg6t(9vsBQn_gS< ) Pя~?3*xl]})>lz5֊ÏG0G D | *?oO.UWWyVЭN WWox< W > ""/*VA{0Q T_~Kg?K[kWm`.H ~2 H@d~u-_Mc׵U*<\h|A`"V9}yОemQJ!_UM}1`$L }3=1<@ObDT5*|<={!bH@X:wpHHHJ-^v\>mŪkyjvgEߟF˪?/6e/?xml2@2hae9ֵl R^D5_Ҕlre &P(C9k/ 6t NjI/E*`Q W:_Sva}LIs~B'0B :ܧF`>,,S _L4h,A:سP*Qpv׌.я6AldZ Ɋ탎 aa;z}ƉAyl$W :'{סܤHLF D D Z*,2?oERG ^}`Z/g|O˽d db&6qJ(g{&)`̄Wë1g@ou$+TiKg9qHRB\fYQ&+5aZ]ia;gA4kE&&Cߑ߅; (M_dC`[]>[}R;s+i~"5 0/Wj W-QV5M}ZL?t,~C(mAB svK1v2; @< 00a\#G0͹'oJ?E@n{MGMQ:~E D |s?Z%J-+?n`/@+mp ='7 $xÓ4Po"P#?m;sD", 0AHʢdn!@kzOd HmHT7L"`K7-01ZSX_6tt%:@l׊6mNy61z iX^ H"=ʗ!$#Ă͑H])P=JȡYi፭ yP3)h#"' |t `^zg3d]Iq%fYݧD38} y>̖]Ͼ|NUwcF!.tPSL|FB30,N7 u,۲hmtiSV(ZY>f؉DMS22+d4hQ4ZH(Vt>&d2Cgi"S"v YaY,kCt? E#[=Dh1igҀѓJc3̱95y/MQi10WP{jZڸ6ml8zc@AJ1,qY|D#oم'@' K i]*] 5G\7_}u5L$~|cSHHH#&B+@y `3^ niHS2ZĹ--<d@IDAT cA޼,~Z)0GAv DHSTR#r(+H:HM X<[&\39b`6 ش5pSLnsƁ`bÆNފȯDF:`TeC-[cT( ~ǡLjƧPtS ؗZ[sمֳ4 jpU5e-ek pnp/(ze',5R% [~GE@E!R R RϣGIwtKK^+%ܚ ]mdr$gK}@oaV.m/uЎm2֊ n9{ ղJCT|d,9Nj9 -xB;UP֖5q{WƔ!c=6W!sr3!dY|ޭ]ǨrHa?*)Ic߈~&S?70-7<1hyҶi Jqp2H| gڵ500pHHH?0^z_|7U%~ܷ%/e,Mm?IKÿu |,-)\c%`'_o~@mֲR/|W?6xfuN*mvp! fw&Y̶tmH079w[4ɲ1kH@(HzkD<њ&>P'4S47qF,H1CҦol57c2i?tSBjKc6i  e,Jh:J Q3aRWU= BhhR'6sGbg' LI(бRL){1D D D 0tz+}fy-i4߼e_iX*XA[y '1eYSD.ûoi_C++p@Xk:;W-2e/s,zp l Pg(10,.H>9S@mr9aNh 7)hаվăZj3DgSmtZg\{L(@d}+9ԟ\'%A;2 i4"2-0Xar&* oA%:wƵW-L,;8Oe5y :5?f=ǯHHHwSc1e6\39 s޹OxoPʞ"sŷ RUZ# g;؀ $݋xW+:1Mw1% 'Ir a`d#8)p; utS&*'Bb.ѳusHuj18,Pi!ZE` 6<5[P@ D~Ë0 ToJȈc(3z1d~O-~n֚ק]qoLzD4%`3Vy>KB lx@co{:DOtSLxrt|Mw,k,{5{-|ްt03{D/Qp@т0%`&f "&E3iO;5{5<q<|VHa7|G"~/e)m'o/ִjdZ\H*.=./n[ Gwm]ȵa}1o5Yg#X{{_{6ڬKD5P>d-:a {|v5*-h1^v|YQ"+]ǵ#l7LU UNxzlɱuiG!؃ }e_xzjʾ|-,"We'ቶPBNr[>-PPX8 OQ 0~H#';rJ>)  ([_?`u)1TY}V"-{Oxo >w5+3ï Ldfg+zѿIG#&PTҗ#`&ƀk%8pۻ=+X?.vܽK7ʹ=`0U2]qi/αAyfW5dTp,pi8 Z XyR8I7 j/ieZ]eT95@:Z'hW:TSSs JFKȵ~b u M Mp 1O+ F͛4HN}Nf9ȉ8ύߑ(1Zs}+^K׵+ygqVt~+q LՎ{k}D0aկ7Ŗw29hx(C277^ral4H8tpe]¿bn#?yXYO)vzQqS//Z.٬ܔZwt5Unfk_ f ,Ce  wniKV v5m rk)p/>}RFɐ?x9-eT4義|P:+\7Ňl\Ϙ3&j螘JY}k d`$_4$Fg$l Ba$M@+e4|g 1D D  G?CY*.nαb[]8۝" ?ABǾ?J};Ф^_ᦎ6gq/!i^Ue5$;_ioGs(Q pGE> ~7YWfZ:9ee7 !BLkWlz0%)v yyh,Ӿnhn @3n`0Y²IY!bx@HE8ַ_/R+XP*1^RR, cl$ oBe.jpkWZTeci1. ¾*ȡeUHH"b\mlSCڟfSdٞ:z!J$0b1D D D x |0 )͖3w'p޻?YvhYϞ/YÞJ*l@vg Wqi_+ EC^z륮?SO>2e-k q~VS/Py_eYov/u[Veӧ=>f᷿F/<%C `?&r&}90՜#lY旸XUI,%Wh 0rSX˃i&J=Q]=9;@_2 ႒F\doA㕯& *mM՟LC+hD/Nok`W\ L@MX2%;;+ ) ]6Xc*R RcA~TttkB][d?+je0ʟ~?V C1k-=g  S;ȥAg^ڹ@Kvyww^!/<ԛ>GbF[$o g?mqq"%rp5'#:p//.շ ~hZ}@gyÐXO Fc?Ƨc{6|+cRٓU_]N۴/ln_\ ̩ƣNJSzZPZ} H6G7}t:6lّ1p`̤B?T g`y/DӇ.H)))pgxzq4UVVLVW[\ x/y#8Vŧ;"pӇת/{רǿxn/1AU^i^;u\-̀)˗fӞAPoXÔAМLfiLj^t-tR7h 7 zfOL< d?v jVMCa%i_NgZuy6j[S~[—EFL֠1.FTg)ɷFc*@e2` (DVؒ3Pj9uIMo&GNh))G_ڟenZ,ָT2\>g兌?]]ly2pp_{YGHoɻG젏;jX VeEAڵ R68!ON1,΄@^& A4"">F <:@3>(ųjn%&6uk^gXQ[`וv uJzk+;7 P!+[\ Xo8Y_ uqS Il$f‰j= nל5PSTT?m:PӟFK؛ K-򃊅ͼmAT"b_5'"_ZVoju~[]㳬zhr~苀>XZ”`O1τ 5-TW3{z`tJð65>*?#L1gwJ8;.O@ D0C~+;l W<;e9;@l/|I00ʘ(#‰? wgΡfu])FT;uC?U 0{ =K ,9U %TYɒP XsɏUsFge|S˾,?<<">a:/@b9Rb]/Q'l5Ģrb2'ȩ/F6S!qjV&iuS_PJC DL:Ve o!? *Jg p$88찇)A;[$ "">V <*`\*in!Gbu4?\k׬sޓRQE~~[ @^GPz[F,yc/v =}{y{>4&V"XʰfпAhU~V"%Oo뻎k(F.-0;V# _o"5|}zf{ö| B~(LzJ7gf1V`#%]йȿ|޹Nʰ`iӲ3*<71 yE(_NO$#EOpΪ#wQw'@ Vѕo{V~pV3[/dr'arxn+0U}=\F>7o]ß^adl,eYMS78*g`{!_0 a8uxe4i7ڎ#Ϩ;m5[: Ԙ^n,F6o@ቪ=w+ y\п]XֽP_*ahT$y҈faZ>~Hm7 #PWoUV7%HsS8PCGU`0peT ;` @z;-η>YTsj~7ήy {c)qQcA~vϱ jplrK%MӾI\C? >Vځ>/zqؓADcP!ǘeiEw:FlK0ݢer`aulw @?75jYr,t"[#BҚК8;Wd `y dȲ+l u<݊dނkF[qu[󣰖Y?b5-ԉ޵F>1YZαžw_!ux@Kl<'o9gHGy;Xƕ7NܦCKv0cs{vd#^41ث?F~PnRɨY1c4= TOfƖ: >#$>^SU7T_ m8б0?*~psH@xSvf+TyuCs$ j9Ҩ-l>`L0+ށWo.X\Vssox)_i~mwƁiPq?&vr*_Mu-$74ڛ/#遉l}%~VԻi?JڲWHxɍ?p׿s2o4'pI 5}_I^`e~+h8G>LJ /Ӂ[cjzMf s!LʪpPf{Zfh:6R1:kO=`:P^]YDcz0u{ ZNuUAy}]4l05 2h]@: fw'Ljauwd_v _ìp3Oۗ(ԀHxg +Ræ{֛/ Ҝ>Wqun}\$;>H֧tkbt_'?D{ @t*M *fn1ͦHKG,o;E{ۡW׶,mSkO. wwwYvq_a` `ƚDH#@nuY!Au!Nڠ)OU?ƺ&7d Ŕ9E(isӴaj`cP!XYu0f[!&[ ߮X,J9?ol\a~wx)n#;X"/%砌3WMz 8U m|Y>Z@">x ܰAQ%+nCt?` v?sxjЯU/P>[/v_^! j `?-V>ꁁ5 u^?87ox` Q>}P_3 Q;tlo̰6u&=y5+P 1<$Vx*j߶C Woe%1MVoS?fɗiLe# K^yL*D26z D;vհ"HCz'D#~)1z=d5zf?y|3Kހ+\?d*Q~>^ZUgTn,L4ET2Z#gucwӼixaS :tD̉XA((0HŨ$J !y *[#dI.%Q +={F\[؞"TMjt !b=vKp=)"(C 7{odYrUh.Fflژ(|ӣ^DIFE de]}{k F=yxDڌO5h4lK qkQ;5<҅*~.Xeʹ6ggEx=@Y(gsae ْ8cN 's/w $0`-|>n6~o^~lA=Ͱ8|>%m~2wwCerfbiB cلF)ۯvٝČ>8/ =k}AGkWGGN/)KPΨ9@Rz^$ \( |Np$CS:"קH~Ul "(RrxHnN8uQ?YXmsq?CL ؅߮!xٰ 0kٮ J#w dad5^=J .g^3;&Ӛj"'D# | Gh7Q3$g6~NGpk~>w[=s&*#^X5z?BX"6.{A)a!#.lӬh<a (蕱)iWO=juUebvvكl~C•[:nlO;= Hr#;PHT ?+ =0CoG+ hC/ m-C,-\#`pLsνĨ/L׏űѠιyG#N([' tܟw%U0A&ۚp}Ϙ\OWOR>g%iϗ}K윋P00BEh3vgcpH唭#EU `g)]^zQ,؊%r7vMwkzxc6R%Z.5] &-7xGc$)G2 3hɋA;BY@z@ sD3U<Dѷwq+K޽J?QsĨcaà (&3Hs ?Vu[_4AݍnYXwK4R~cy3ڪgr&3ZA\/3Tcn6`aȇp^qwltAkD:z^l~Zn{b+CBVv%h+\t!uW(@!> ȹ^*3+J޿lF 2.0m*~MS-2稖3iQЂ>vot)AQ+Y9bHP 3SE5 l;\/a'*/F׬)ى' (+0bHV?J >ym>zV pDdg1,`2I~a57!Q00!̨=S0t3,@f(Xcox4+ /[.Z Wq{_!->gq/S~_:GЧDQ*Y*# */bs]dvb 2 L85#xN~^Mghw撁)@*{;%,RO2LR:L^2>a_7@h5Ae@QxyEA(5dFtUݛC3q­cNAM\[DI1>А63xʩX0 Aڜ%:㾭 Y<N!SVBCm8:9ۗ0dv@/%*e@;oyd& |8PT'@ir"i^LΓsĚsT|٠\ pҶa`Qk`ΘlVd3yǫńylpr/^r>#x*(;t$8f߁' (=QO,Dύc.Xet H`L^ +ܟNhp. zY<1IΡ(N#(3Pᯧ8?ճ0-~LdX"=+bUh31fg+)-9󧏏Ÿ| ݌bt!l%Eo #3[ϐمW6%lTF:[@!_m/l#*Dzc\TrםɊ5##NL,X:DL/#QaeD~ӊxO%@E3&FQ>Y ;y .|ń <@@=rǜ51PEj5;Y' (Ch/⠟vNfkz708z_'#)=',w=dt-<>>Lr/y3;; @% e ;e߆;1"Kl|( b :'02Ƿȅ!XA` F|xVqNG-]Ɂ̀9QDm@/ΰ_197]!,.a tvO8K ={ fmџ T`I׊bS_mI3]o 1 kh08l~A ń\륤#AbqnTH5'ǡ?,S{T|j6;_m6WQ3r׌[/'L\ .^Ӡ`LH +@sW5lgVvjo(FrO$~(C^qYvudr?De`1s#b„U){d+xQyyP\arlw-.&G,,T:SS (f\&;mv+F 3 `2VgG^?+vg&`)ɜ(pGljO>pmFou`OS| /l-Yվ]\?ͼOG. (4oUȨbͩ.ĞP2]m~pbҖq|d{E;&Yx6Ymxo֓v膋 RL郾UQ~wT\arZ_?|o׫ OlS54EDFbQ7H 1i >xL^s6ZzNÀ6ܣ=i`Povvd(/nnnnn^LKNWtN@{K'D>|Bac\0>eEB+aCgw0xƦ[ܜy\@6a-҂=~a vEJsqPG`9eHD$NX/Ld e`F0+$|7zX6̯o%!%Ŕ51yFuvKsزL^T" p>T$}>Kv߷ gz2w(hp#+~=5*:-CbG^QJi&[ n ٦ufsl`]<+ō&0%(<ľ]+X?B1TT(vƏwu0!c,W^h@IDATtL;~MyFd3{0 g_'}#9E9L^M0`D02%' w1δ"77lTIEo3U{Tn;^0w{.U4Η"{>E5 O.8 7 WY=M- DqA8u6?Ӿ#]p!o|ga~1 , (횮|̉' (PB-9m?Sz%}[B0ex`&cqpbrCVLPpBYqD=@AɘۙgOW.U&* ;SSa]^q$$hK8!*/WWsvF_sJ !|hE  G Û˻'폷Gps[ J5ZDU <5hNׅ$`{VՙĞ$-Gy0/=6JH hQu΀`TfeWleKS&4NӥL Me8#t4qh&cmAxաhGi$z. @a6,#gE\6yBgϟ?o޳Gv_T9=n=߬YND/Ç0_WvDc>==rxŨ"sG7k 焩&Ynb8 (D_Fц Tg1jDBNL^lÏ\z|9z9^ZXFL3 ΃}g3tAh(w7Oaꋻ_\#w7\ֻhÁNkD,l8l҆821$9wW1*EtB=H|5]~ˇ7",A!Wm0(l[[KD\%!hn LZh?ܩ0hkI4Жy5RL%bΎ0(Gvl;fjl;.ZsOu@R7M"fTSF ݳݳ@T)+hɜ(p@  \e"{ohߑ=Cs|p,2 Q@XDGG0TC(8z|&*ec6eRh)@%")9]lKn>3kX?P+Ra|2y=z=<,,?_=/XvH%+ϙaq3RBriJeHWuf CVܷco(%|O)}p*a"f; :HKD ,P9;sb9bp yc읂 z˰%.eu0 1RyBX'sM | I~\5cxv\7v?{QicC?`,7ÙUM:ac", v9{4!# 7I>Χ"Ulb9Lfxhyk$dnxsS%/.Ӌhu[?c9\Pi{8KV-@EzBSꤢ? !~^w4{s6jЃ0]? 2 -7Wh[,ZQ Ͷdl>NPzS"A+̵-Ro-h*5rlG(D6kf 3@;"Ns>JZ lgҳ1u>@zz(pFoSœgϞ#CϷS@yGEP0ڗr O<); ?߯#Qtqe@SpH$< PN Z 6YL`gHCYdGI? >!:@ 4F&H '5oǛas{F`$Wdy<3߂KdY̹w1{شR%s `3k+Xlngoxzf7d/A?zɔ'/ѡX 8y9r%WdO_޽ 3ߣes.hKKD>X{zs5 9_n{3q,c~}Xi0d C'";a9o%i0t:;}!/o7`3_K>sCyrdi3^/F?I돑nr;;!)M1h-fL]9߽,f|)v,\2ke=qa1 |h?F&tr$ as}a{|o7 ^k3B!Pś (S@?`,dD%;ٔ> R63^m,;}kO.U<(وE!DK9nX[IehT,-tr7"Mw1->@\1i^n$ny;;nbK,߾+V$@yz(pEOQ\xrȂ|I7 qK8 OW3C8Bٺr4+Y<9IZzuQᇡ߂oX*9"z_0*,=\ VOJq䚀g6VL#|R_2Mٰplzԃ,34z]@͜+w*n">6nF )#_e8t 4w;LS* 1_DlE({}9 HهW>$aZx(:M6RϞ"Y:,݈#3{E bqK= w3$~TS`U}>J`LK" D<p8 I\_%F2x?~K üJ1qŷ} o0,a>}lDQtr$iF݄AS9k9*A@8ciNGt@5v֣S5͢JV6ATqW_=<0˗/WkW+FsFtG~]]90|qJUr'ߥV2;A}+g?VeI+8+T+ס]I? !% -s姀ϸ!>k `eϯD^-n PO/ -A~CAI`saFİѮ=.{+-Dl"Mn&܋)x~t9.JhW p2' | ?쫻ɫ/f ~pYo_Ȝp3¦ 9 @b_%F/Y59!~SdĶ@F;4u-$z]CG -df0jU?=%&X 5ﶳz\%T+E_5|t^~?FY?r|ïYwptoG;{=Gbvg9tվg7O\.^>~6-W^jV.m|ưLxZ!- !e@ E~?" wkZ)1wݣa$z`J%s/%; _Οo~u6F ONV(ABVtXνO8=e-\b& g %_0{0`.)[1+YD| +0ȼwVgC+u)d&fbi#b!!h Y@9[oP:g_ fs6lFr\!g'W*i~gO9`;?[,zbBwq<չi})^p+vy{, r0'@c;V`1x"[! RI};52Bܐ>m2"|'Ea.[ i`i ֶU-&lalo ֽe"(Ve}\V ڕ?F'&@lQSyP>.8}0BYd[9k"h\NX\AbW4}_BoQ74PiG ,|E/6b$9QDSƏ^OWs.(˂Gt*|)*x|؎ tv`Lr-`zF,hz{QDD)%MC zDyh0RH'*\(MtXޤqZR5O6IcqUO_nP: |ŽKOYj0۰Öfl_Ê/%{Se3t=oZaVcoV a$^:28*qb0/Aj 7g\g|SLDC^1!}g)\9JE+r~-C==>GV[a 9NV(^[0-#gӯvW׋v|9I`م8o{e LgE'{L)|iG "CX3=# d>*QtsAq@ؓsԄ޺YuW#=oSobl{M7系vikĆ?>Yr3^^>lZs|vv6{1]gSɋn>k'bfczG9yz;:߮8wd͚'/Y턊zSccXl ߌEh3J)꧗4RD"|ځ41mP#;I go?,J\XiyZ`9#>+i3@š,9C#9E1N)ʌ3rtI9g2C)aӟ[·BkmCxWqm.pqȈ߈kv]B,-Ǝp%+~Z5} WO>?q{rzqtXlw pd:s9d|p6OO O&XlbbF稸4l+g EZH6) Ct+"[>Ĭg֏ZW[r_ {w  {ܱ`j{N<.7L3 L_3ґzF^V[r6?IarpB+V{"7p;6Iy:y3Yv:׿?gw\<,.x¹DXPa}zh) - 6[4}jlc(~Xj zCcҏQJ6`dAYڪ*M[Y05~˫E&^,Jǫ߲6Ltn4 6*B׀bJὕyA^)Z* _=jPm01~Ce+9H/t{a,W~nE .(qm'LQZ?źȽCe}c.Q/{Cbt}1}jǚ:Z@b;=N8Q)AOG5b݂ _™.Y|>z $CXS'/[{p7VBB S* x49E2kòEaq:pJ'^ aƼ?Y,EVΗX@<;I'==2_zI!.)KwXCSkRq30k8Uh5V)wP}m~ ftĖ,S\hbtv總眢r[,\"cÑ \Xa8_ɶf(8(t9 Of{V@EAM9t:Ca.@|5:pkABNT mQzyfp@B$EpVL[j#=Պ݁wɥNQEtFwia0'8'@E5&)BXH=_cX@f9k5& {z(PC o}[N*!=ct*=C{0Xe0-{\"ʖ s CD KWB/>a Ppujtr{VO9_fe4Y1$1W"Уd13lZ7{iB- q7BkMAjpx{M/t`-kt޷[",x_E%{$Nd^?jHt"It=;|/A/U:c%-I٢ | $ 1yXJ-; d< + >P Uv& vj.ngh z@wuM T鿉c=/%a 65=yiM4?e |H3l^prr}Ý^)R%?[Ƶ~ Twib u K)gNx`q.DCrg+̎dlqYKƷ :XǑ',S,j`VuςSzS_ӭҞ4GwG#`՚H:|=i.Rb3>a~L[]El(,8E QxPsMF/49ݽ?NX B$5}`wLx!.݃ "nT)tiѤ]xʎB KjEt\ԑgU"3}У2UQ?hޮS>R2 ”Coϡ a(i2e! oќR4 ni4b`Zu-,:tb![d|tF E*ND>T>& 7\ p8a8~]GRTx 6! lg`9(E&P8cFZe|-+3&7;O~2(5.,XODU U#=si2Ρ^˘%Xz;dd`tq $)~Ig;jaqj0@VM;8~=ěaG^1 D&9:]+ *%,Ns$Lko3|2Zu!:*_ӻY9Qt!NҊP0q"P4u`ƮHZ;ͅPޘNc+|۠MEMeMd WI-F'ϩXgifz@> *p7%=$ixC U?˖Ma?asp]Xժ9)fwNpԖV8 {zm!W?߮VPpW՗_~AY+*' ( )AFʕ~ד~MpG'9t`,fGYGH8gCF,49!6:0øHG@0"G` -d\'7`aRmҡoM ɿm5A$u<.#-gN]gF\tRg9Y籪5D:[?lWFU62X,ol\*Vp&Gാk jX6*06 Eoe7[3ܖA}̩%]U2>K W%e2!Ϗ"&6u;Cs Ce<^TNj4sΣHihnUq̉' N[n?[{$ȏzjLqŊ-.RҠ0}Gbd͎2}l\+%$H q7:rqIT D@:Qs$IkĪ"5\ajer8T̼7xj*BTwp[k|کdœ͠ȘVE?az{S)4})ޏa3pɎeܻa[pê>5{W|ݸZ2TeiV76vNG1E[cI,7mALGs/ٳ D,QXɳh?m{HpND)>lXç!3#ȣ_|A0kyF \GwTbf}_3ec{`*e@9 ѯQfd/ BdqQYI7!]#@EY!E]mb[طƀ.=-\BP'3@?aU;0ʙb If1bfhيXP^Ml:KtHN Ū'!)},_̯ΰ f(/7"{0T.-\^-5h`zʍSCA~4(a}P9TT K?2+_U#mƻkP3apǔ mv5cRuH]?*2pˌk03"dy2ci,lᘀ׃sh#,18)&OB+] //fUja 9#y(x[ڹ g5%njb1X|s-nt5(wFQľ H(ae ):ґ" a#WA-#a) 1#> ]q3n'OA2߄YG$a0?!R ob,lRºUZ<}RsT`Z3p!(.B.nʄaV0F"LFQX%-Žxbh#O1-?-T:q{hbLrSs9(Cͫ# }ѡPQVàd:\dqCéIS<*~*Xq{&ЇU‡B+(bmhTއ?fJqu33}ZҶ٣g6\"͖iF?^О 7lyd>=Gʛ5g?{~*n_ٓD>Hu:sloRw̞t `2yEJXۢOo>Z6,cu%iAY Gwn$== r0{IN'ݹ/xX|[ 򆣇bqN*[iM@X ЦC5zRv-[-N]@FIfWດ<Ńd8+ZWRp`k5уSD'v 6OfВ O 'u0e]2K94spmR>;| [<95A'Y\ABN@x&12+(}xK }a>aWy=%qlѴ HaCw`ʄwJXܘ#D?ȯ>֢icFgW*jZ s>杅2#A}V*"GWծ APL[pۜ HQǐLH-]h=,wCݕ8Æ0x)lǩ+i:B.e>`H8'C܎J{Ъ w0>8reU*`EoK, 㸌P%i5)1kg 7Wl{เ%4ޱ߯1~{ܭ ~DpUܸe+zRd~$pE.FQS.\gDV`3ڊkjn@!w^X쎲d 1" stgK|-^gB$ճ'ViԈD=E  Hu@7ݫ >/*)ӋB D*U! Q#*C]+Բ˰8ȅzm0[ Ghڴ_K"(;| ?034B[DI(O׎u5ؚr'%Z[LOȲ]󎪋2:a6 ק^1?콙yfzڮvz:{`^OPqי &?ES@ཟ+{"}Ƿ/>#3wsb>3NdutP|T{R+kCɬ̍=`Xi/ #sA݀ P`ObBhD&m[[%{uCdґ2  / ҇pc^0{It_-vfۭPzUfSI@7a%eEgӔ[Wv\e-9'5 Z%{LJi 3{r'Kmk XB6D(QI-yrE  q-nXaC&iW8}B}>nSDm)#Tn.֢p f>5{F hX&AA=Mc%Wv16 ZgԊo9`ޙf/r?<՛{UI}$x^.(d7Cqx0P8f}bX/݊S*[(`xx2|Q;,=뢑!02}cVB] DPhԚH%ߋW (~n# :"fîYr'xF [x0T(-*?>hH) (ٌ )]6qОMDn6G^OMKݺZηb8qU%+|()Q`@⋻ɣK.ʹg==7>;!ݠs7\@s Q '0ugS*P%$b!q ?5MHfFΐX p`. 0n2+[ҕvåu6UĢ}?N;-SI; OyOႷ 3&hHk ŭVy[%WT⯰o`S !4b\bw^J'ُ ݖJv f:~2kɺK9oq5dN8(;?of<>b+X| اuN{<fȁex%e,cZ7>:b"Sn-nk1^<Pfel0GW%),Qd1P ?n\'˻̼eBLg@\3^qS [٫E$)xm*n[F+14 %m e=/,B|R-@CצҮ[au;gmbbʻ4&)?[Q,%oO(m< tmz +n}&l&eDe)opJ ʀ㵗c9aω7g 3೽^FbvcO8'j7Z4>9dN |OjsϽb甠ga]G?csws[_سWFv1()S+z 8!=bAk)#Q$%ʤC0J$BJž%9/1d%AB3A -%Œ|n0&Sb/x5ASc|L x̋>rn8Lg7i_Q:j@qzTBH -C ZQL<>.~"2][ xmz~?;n8eb+m1ۗ"Ξ^g`,O+✻7|e~lM/i7q:%PEj|:!GtAa7du<ĐTkqreieڽF= -L;2|&ol?&9#0OﶜV;8lv^> S\.O^rtw>7VP{<f-l_2 _*`|S~/{,A:B05B sVI,jBtGoy :GˑmKC(rtלAh&|h›d8( Uj$ιVyud6qSzˌPWDD@Lm yرWMjdjC&5w_YgLb SpkvIR`l0গt KYPυR1;iB9ʆj2h@uQVׇ( !6N=phGK}T9F3G,,0D0(@[Ypx`~t \jol;nn%&QӅJEq"ЈՊXڏϹkFhf= `ĭtY|$:>PgDXw`-n1!3P.42 *(#p*l|U q_aqTڲ}~Dc"^64 =lx2@Q &myG௩ O0cp@(Wliq2|WM( mXP"iL8ס9Sꓣ*9 T(´Ɩ);}> RzeBŠĸ ~2[V)GN|g|tU~ˉ`k%oaZ] .ĒvFg~-|Hԡ$TrbDjŞ'@˂ՙ%VpDF G2z3C[n@>6__ߍ^_@@̉8$fV6?}o^K zv>f'xۃ~^\>33fo| ѹ&OtZ3?^ߠ XkpG5 ㍾<\1 rL&/]ưfˤa1voY;YBI\O{&IJ+V)Hpg¨_ 7άbT֦!,[.8,r? ,;NuЌ^^nup,{Mzr_;q6U !&;+E B`oq2id˰{䃬o7Z86msoN~# 4aKPNb̓ \=yvLcQlqϗ6I`Kޞ4@0;`x?5T5B i8Of k='`7c=t KڏWUܭ9%h&~lZ!9lus{;|gM928=*qN')V!>F/W^fdgpvJxXo~"o2?UPXKQ~C;1duټ7tG! ^9n=t7vk@LPL`?DJF歷Rͱ(C›o+VQ->J󠁾w$D.#DX5'鋱pPQ`l1ꡇ *3xWj6E!f G˳Ga eE`/-v`qqզ rF;oU4=co)~; z#-08H|H)8 kndH}zspilTHc]`-]yaR]?92 fP ÿ{X*cG>@ो&V:'qCw#Pw*qS"<*bE.$M̹~tQ^xSț uO9SA^ *'F7*kp8p~F8?J]dq|'*(:hǩ(3FXTRF7JBv@MqX{=,MÇi?m!]W:iea邮` . Rp;M s3y`wNÌ 8~_)k+ fxzyzn_XɌvK:)SpQ`Is 1c[fpNR L ijǺ5SK* }DyaUerOS{Cv]щl! G`pY!tdJ=wֻix >aXPgT plSh=8$#|CڅExcj@0d%ɻd A4a+͗a4Swm єy_?>d),ЅaJ!njooa,J_!DUE *d@ c][C@ 7;^H7[v3eh&xiv%-G'B G92`wSc?16B>:#,j3㱹 ߳ 3?9ȅfr9 {*=訴'_u?\.|xK3xgMd{'3kۍn53>aae !SιIݐEziBW:Ԛ {@ F| o $E>2=(/Q[a>q\ .o)߅^18q ̯yxt)P4"òˬo;@ h fx6٬GcBQbEtihd!Nz0.Lw)p[H tgcWO`N}? 8$O~_U9#{1Zp&l߯GWi!=)G)V @8ˤL&uRޫ0}L `oȟAwǔEv̦I[dwR x䛈/\2iyD40"9s=!g9:~l7w?l9l[shQmCsr.?ar129[ӗ_ \5 >2”5:QwG"~ﯯ_#][Ub6fxpXe:bw L:d`A$uoG_\1 is _%fV,&x<ʑg U"32ZX;Y[Ua dF՗ ,+y0Ko`}-e< wđ06A[34d̚r94\P Yά,o~NB/2L0<׮Y"D5nFAN~/))Gn^~=_f 8;c#̈S=/Ə{nqN xǣ5 3 y:&0D.SK7+OWЖ_r8d2CCs3n 1ޏ]~Wq[gvL_3JzȪ,tPgϟ>BxG2mʚ0 N,5'&A +@;^(* 8vsIZ 3lk̡-9q>Qwߦ -frN D3+vpwGw8*_Vj'm56ӷۓ3.8Lc38?{dYrk{ު `<0ǰü4<`:pF4GGvVUKItwd7_+=!@3,*o<6\;QV84Ե ,=Cgnlr zLERTxj`@AJ(JzF*":./0!Ѯ6PwIpGT=jŏ<L QK*b9{W[J/|s5!l3 s왣zl` ћ/pÿ;^3pyIn"LL'"j߱ݻv_/-se?eyZǢScoёM3AapT"Φ?T yZ2my1iy ƥ؞<5T&}xzMg9}8)C{ k>ŌE|%`.3tXw%gr8; pޯfwWpZY;_ޒ&kr;\"Ϗ3+>:\5,9<?\C[>laf8dI}<qoqu;^0͡4yPAB{l@|l|5B(4Gg/q#F xȞXsc}LzxiŴt-0\w+pkBa#S(h#wSpGxYۂ(\}$A#*aQ6BP@W{<{[sِcطֽHeu $uve?cJrMxߎE9O lS?:X데X|'tlu*-ҋivkHDU𩻇}=1|ɶejaS>rW!`K 9p !ءĭXL@(+#Z˗͸>_fzg |K)U1Mw&z6{bm8'5ʻlz'GO=;OL:s8cq=2=3U%rp<.#8_Q:n7MR_ b:⬀};zy8}i># -iK<05/~ŀ?Pv}뜼s ~>bq D|¹͐q!pE}f˧ޡmN+5BXo 5<]Y=~/>u]o\**I r\Er"ڍ7>P&Ζ!{(#ή_ E[FE7 .v3N"a (Rkn*Nfk+t#k.Y%K>Z@8%8?vS෩X㚀7o 0ʪ@.Nod]L9vzli:m2bhCw]D(Ƙ?kڣuMzr"J/p/pc0dIדwO.Ԓ`.aі)f@R26kݝ "n#[f=3si]1e%kQ5N6кQ1ETy-Ds7l |R#94>p*7n#L_? ])hvCGnk U(!Z&YA`ClK~[)$yq׀-.~V `RlE;qLqd(x=P&m OCgcŽ jluT)vA|ҭ?'sqQ 砑E&Έ+@N 7/r ,8\iKN8]ˇ?3M)4 0lNS7#+5G4%v/{z=g20 y rgwpGтCa**7dݼ d\ "/#eHLtU;"((W΃aD?.-h2ٛĕ2V];2鎩ņ6+'l N. $T aM[zI(i (XWg5 @uL<ȿg>Bh-?tvTA}XЬ! ?9G|v3(66Shď-( ؝*.8ZJݝv6\P]2TGB|~)I:iºGI}%?Ic `u~/y6gKCNg$H AsJaSF/S,Uرw95,<[2Db!Îz-Wvj|cf?G`(pU#UV; <{P7ǯ´l{zz'W/^ؾyf|zt iDeriȃX@E1fn R~҄cgLzOtSìpW# 0:5D".B):[Q*3N $C0` 8 ,ހњn?wڭ)s۝~(;C}>mo׃d0ƫU( ;Iw2//W9J̧ XgL~bB{1gW/b['cX.#E.H2QT),W9w˞=1 0|CLvc=PN ]¿}[ `*C"@U:& MF/Ϸ |M>BAc:݂STcOmMԱpx5EIܛsA3V@M%Fs^psN#t% 1:1`'\@tSvKӣ;0@=OLޒ6s34VP 4*yݮ,􉯇vvϧU !SDu398Dco$@5؂B~'L!!~S!O*H޷ P %fprQ"` 4 B`3Ґt U, )~(?G#P( yr[lթTS0-qETuHT勴/P­P7tPD}{O4r;ݖҩ2 TCO66yS`ݗGZXCI_\,K?K-[Yכiq d(%4lNSwH4݁;O?ٮWUE/膆{qys\aE;dA#:aDM\2o1#{ʣmM9mu<Nju/ϗAGtGg_1( E:RM_^\ |Ͳgn7Fx"-?ȕ2J X7TIԑ;tC-O7vϩ} o] G"8tE fal3O'e=ospǷ d^yScNZT崘q1!6>6\2wwEgj͘*k6SYّ L ~R8`-jթOMxzXڢc?4L}vNJ9Qlr9𾶫N%A| /3u9s9lvln!,o}k mٜ)B7=<E@M68^ ^o7p5K,H g1qzk/אr^1in<3' "\ ̶%B#R;6nHVGn'vH|'*K{RKq|uw.Iyaz'4WEDIgS8{!h [USx&LڢJWopP&k_{K@Nn ,v2%=qDpC-#{L#X:N9-tzY)5 BytJsL~3d}0'SNۭyEC߲P 8Wey{@FX5?i xqˮZ;~UoƔu߁hQqÁ$Dv ʷ-M+cuD0*r=-tG?+Ywg'bלCL޳0˗.:[&Ϸ+9*Jy{S׊{OBW؎a;0y^9pߖ rvz@zn83V/O%d+0QUle cd-=~0F) %RX5flEjnzIshv<~'AhKܵ UXIBflY 3QP '+(rD ͋uVhdj+xN ۄO!,1r+= ^74#9 Gnda {qa>s/qaRSɱ"R8*#$< -WH}XYk86&óJN 3&f)d{O!Zʸ`JܓT]?~SjAV1$YÐP@OۏPrZxBh¿K3 8\իHaqtzP2ΓWr6g |(P,. pޓ9=s;d CrϚwL) %z#PStmF?nXnOTϠGbG5 4XՃ';M"4K$n( -8ScmXB.Cha&2w{䛻%,Laس&3y('Yj#Z(zrB mGIN'GJN vI^*^&=ka+lS෮lVioos4l嗓_[fㆮ52,;yr5xM5~ dΊ>ѭ|cx >L`G'?{, E ")d!89Z(JB9n36L$W9K!42 a5\f%ʼkvK0, OM1|)pz=AmXջɫ !I#"LT,7?S?ɵe!I/0^esz|twU/CnH O_bf`0}ɤ83wK(9=gΞUIw{|}+WtT_a VV]: ط|e|7ѓ14U|Oi=:]hBYĄpi@RvEܳf}MrR8BH &+VN֕\SWk~IT>3&2=foӼuPX΁gՈ|wl02J>hfW0oZ6F>H{ s-pb9$7?x9]k _RM[voݬ ]kx_N/n_q( Kg2azqB@3'_-Fj˗o/H&gYG5ޤA)5$ntʜ&BO`]wIzsVR_>PP7*2&2Gә>.v4+G IJ?(X{~s G߀J\hBmy䯐0"X)X9G;Y|KgAHݢ8X. /4dsWTWD;2N 0 q.5P@FQ%h䷚];[9v9EQ'yEK`L s+ aGwkcD`^ ,_^z ?N,VK$~:K%ߢuB Q8Q*uB2`7as^j5 vuzX\@p?gMs>(?^X,} q{6/O;fÇ}hzXSGyxy < 'ʲ3-9ʸ_ٍʁAՙ8҄= ホ{pݯ ,`[_O~9鎂ȏ7M0CT&QĀq!]J=}9'aNd~-Qwj# {mW8{=XC!;|8€W\׶ kw| ` QӋrlhZ&aEEƑ' %y_`2eXQ>pn`q8j@:  4o8_u9C I3~/,l}N@{ HC?K`NMj/R;.^橂Lc''nˣP? CмdU|v:sM4*BY4rM|\L~Y ,tAIđ3GO&?z?-]7 srmD-{4g=A_qj\!a:h;%~©RlPtrldt؇i}ɛe\]HܓjM4H}ߋ߶)zxC>_2uΜ: ~|OY1$wn%:%(o<Pl-1-?=Mx>?M&xN7C83~; ReM˗& X.=C8h.]pID28 +UiXe 򦳣|јJ"t 1ΎALS} xHK3Vw 6N `Iu1Pel|/q!Mg SY^ZN*^vmUvMpEoi\gEk?b(K1xk>i3ޱ_^j;O#I~I/-e̷wK˯Y莀Ƚ  3 }Grz^$, }{)͓PƐePCߕs@987Yp-p"7xGQJ$W\It ? X~I#V( 8[GT*W2N7'+o-9T4[vٽ`l@K`|;gaĮ/y*]lW nθtrqOdgVmKJ;Z\ *V1MXBaEZ#H|Nogi߂FgǮ|a ~#3 wRkpx͖L8?雿N8-8B9WG|7 QD8!So'.:WR6g~E )o1,SݍP#zQ" -$e)/&і .3x)ta8.p?\_ g@E@uk ޫNܚ:Jzq/M-Y&94HM"[ꭞNjA٬_vrO@-;ƺIžC,iX !POpm-.T9+V"1d5LVd&u5[p,"_ٜ)YPÚ7o͚Owοޞ;; MgY$9񽌸 2/&04Z4Iی5I+܏@8> a9B(ܤsʡ^[l/4:-!֐;7*cU%q .L00d{鸄 ˑcx^X? H=.WXQ'Iȹ`A0]$߲ PC[Vx/e{)hn/Cr 9Kgt-\Q5S6RKV@8ZQ|a zɈ=.N'<L`zfI3oDiǡȻ(YL;Ow4"-jWDe͊`1x"I\~nH"?MUm$uSvKm;v>8rN& L2fL3q3|OG5'9[@ow?yy/~/Z14y¯Li g N✀~\#hgȉYNaٵ"YѴ UDY掠6q,~Sң1һmJM.օ';YN&p 8W֟=MnO y19"{ƒnhOdcƘiS),cp(;慷NAm9ʗk`^1HV~1Es~1|Fl} {,~L\˫-+kϾ+Z&9/W ⳗW; ڋ>֕9:!jeΗ(nK8 L6XP[fJ_.]@96҈w(X5nU̸x~Dq|ɞxO r_6% Qԙ?3wzd@ H|QoT]2BG*"_ `Shu ll;ERpM+nlwQk?9?p>g͊: n9trLY~PcϮ3~G)덠$m޼sZ# |ŽWXݞ5v7h~&n2F-3)E(IeʪHXys"ݎ1^ɚun":7`ϓ*R>D`R.G2":|[:tU!w7 卷#6`\b G)*Ü{?~3zs,Q0nr2\ps˗,X娩xQ^8 ~%@[L`#9('qP9/F ea!6\Ey'Ui1Q*2yhSbRFj:oJ+M:m/7ƒ@/N5HiX2wҶQH +?u,'X^M3`Vꉥ$T4gszS kg&`ʚ)ۯV0WqGPX: /Tn ({C~$=f6fe q,;nX+8$Њ%okkL |gFW^&(Sndr5 3z=O5"ZFgT`0)-? W_ku6iXcy+p<22`3.'3Խ8&>˝`J7nW걈j( @IDAT )72^T@{@Zv1u#Nn'@ϓClWZf+wo7RmƱz+zKV/'5rAC# a箤w n}Vp N"Wc# *)eϲ}T&`I4ݯ(?;R~#/)k,ުßs4ʏ#\5uQ0޵eVe%4.0?u]#/Ļ)2 *snx*Cafce0aAJe.z71m+&é r9ėVƣ!N~S>fuugMQpz1M$[B=óVo~$X{~);wJ9? 'v/Xzn p$;SיF^qo525s~6?~iPmay~j{d94dmLe<,~#TkZxh,@ p֓B"JglEK{]p'jy衼("q`GzBg=!ص Kާoa{n[2 \gL'_?fcuO$cY 꺮nϟr}|;+s= ߐt|J$eݸJ'm/Ѐ\w|F >Vs `"IYfQQa(2}|쀜'Λ~G;,PowSFI9bCgfwo4Ւ͙+ |B;#,jM۷[xʚQp ~` J" (6 C3DF$H[4t^љ3+˖% ^}Č[OOnAʮ42ݧIQ8?SnޠS?%ֻOhuEbHIv,Ӻ$2Ǚ}eE[Q/.KV_0B0P2S`p : {U)PX!T"k޷.n4ޢC5Q(R.>:p9sp-"D&J e{Rqz7{[>tpoӭD4o &)9Oth\e!)r!-8ȓOB[~Z!*,,_ GyYǠ\g;Q B,%JEF@ 1"^pN~v7yGKstr7₏807+`gs9SGنuE8\]]MpD90%ǔM>`bnViO ˓ X힫vAC &2 Nt9$11⟇+b F߃:xzxO+T"*& \11qWUޞ!K-%qhmNI傴SAQtU{.\q/!C;Vp^UH`E+;v'lmQ6. kPr|n-WOӽA@50orfd8v_mZ`%t -͍G S-N҂sVLm7l`Q)Oe=HV'*Gڔ-QiC3|,@LD@tĖd(='5 ^& =X'EzQϙ?/-]2f(#Sp-X=$oS8` =\w'GW Ib=4Pg] )_Ip.\SBE|qx,7 ਖ਼815G!\h-mDaze%8sҭlQ s*nVO\HhSg 6W*l O۟uG j'M=^mgu/ nf2mptϟ8cV% "&S?(V`L`flm9 {A.~-^R_Tt9fL0,k l/a2*2#GXSO.` J[ɓX3 I6L2(%q +lʃL cT Q«aCѤQ(<䕰R\L  0c@"ӭCF7ǞaJ ߢ]EϘ0[c6J/!kzOmSX 5.lJ:W/Ys@6XG#t>\^J[I&S`0Ucz-AikfL4E"W1@l[sV[;Nc4y#V)FqqNw@(˕B;8'`9_{yM@#R;HIњ'|}EskOwf򈧥с&'CɨHiŝ}7TwTȇOSF&d!P 9t7f. CKs B+%\C% aG**O!#ְ3X/K󍲾-ac6ZTJxFD҄E`{z݂}L !C'bb5+e[P_׎@ Se|%\RH`rպ- BV1&@azM3Y%aEeO V-OGЎ\cnCd10әA=NC \*A-׳t=x[㼍'q*uÏ=~׬[\;!H t"o@љޛ6~oeq`@l2׭PD3<,eН4㩎)Rtś08:Y{>ƄAQi3q o&n9%>BQN?S,!УRecc\C|QJ: ySB`oH |j p1 X0z ہ"bfgCǃ都k.8K![ PO|N4>:~oFΆar=15gE/Ԝ v({>&hG5r~2m/85 ջh%r1zo cQ { `E=Λ=<)摹ll!p9~ ̴ +~ 8(f)e dG|/T⤆h>\Q_C5j eUaMG A9]哣.z|}M"=_p5Ïwm~} k<{)cɁK$pԲ#۵P`w3 rޣNqbzp3=qԦ%CPc|#AC?.$֛Gis'9 vM2l( ,ٻo5V Пɟz{~' x^*yW hI'k^|9OCkF/wFHbee=,Pi;6'6CAL?QhDQ9Dׂ=f-H:Iip *1FQr􎁊vp=[fa$X珞fQB46=G!Ȟх?h 9*PTL{* Yc٫U9P#cS) ^N=i ;=yFz|%& `\w?\0-5|S_$Ke<\4U%hyEaκU|WL+vJf^>w}'=\lC=-w Lx_IuV%)@m9'0I .?+m1.'X,wtBTEA$ٜ)3 𠠧l͖w 2g_Gxw y}H'T,&Hdjg}[|[,1g෯{G-S[ KpI {LF61O "a?KWds{Q,;I;vyXVcy_=L8?=hxm0]իRi b,n lG(VG"d}quR(BWp^%9ۯ֥Dr! hIgG.Lw`.z #.GnaN q#x:bI@L'5<; JSHKJѥ}0icD+WgLe[2H)Ű@Q蟤nlOi1y?~9vjݜ8~ɚ/r?yғ^ u_<0 ^"zArE3Q9[`!6f:3 V?LIxz9a9ɱI! $2'~g ,:kb,f2JU+9oIZuv< LD9%+3?yʞ9/DI}?ŸA/;ҟGPYqp?ҳSp2'$KA\0a'?ϸGQw ,t\ҝonxoj++Tpƃ>D}[ T|`һt2L_B)cݟgS2 RmF¼|| ?.˔  7?Oi_oC& 6qaS"k_䮭ږs(o˵3q/o)7Ys!7P+7GT5 ;R]`U I6P.TP؆9QhS>b /%imXBb0rR["9:t ov-'rRZv-4;LoPOtK<.&,{_ϷWw닋-rZC>s~) ah]?~L9=˗^s=g:Se K9wⓀV_sH<>U&@!"D T1#(:ӹlb@x:FtWOQB.NA/~VPVޝO71V1rn?u8lyv?R} ~n?3RS EG J=`%yLrwgyJwW؎>e3TCSF;ִ89n@ Q/n82"b/G7y# WT#_4߬98~ɬJ)ݍA1!7ϖz֮(CSYrCQ ;8Jl]6O\Ě%f<8Ώ3(6 f%D\+4lN r1 6Yy$3tr:ڝ? X!?˯X& ݒ$l\~?cKHvgIi. ̢˜P=ઇ5NX+җ1g ʋb?ʣmx4oC2Xm2?Ł<H=?)^2b׷цS+Pd*sdm.DQ:RIfo}onqXr%sv;}Ak5jԜ glc`>jMl~? gL ÓC_pe jS˳W&kɇe4͖r3 Dh DOS I*MQMpHU|o,e0s݆?e-ƔSHw% qsXc0LuiMqS W052ЁiZX--N_qūkk8>8fZK`b?yŜ]s`E3*1+}1f+b a k"aHn/&0ܡ6; ́5 |'OoQ\O\96o-9-B_r9-kD<--o}BnkmP-Һ|H2+\ALHio9?G؞E1حI_ZZCdB`$Q"Hrȿk (M_(ÀR5]V|pES rTtI-E`d{f9R8B5ZrZOX1l"ݰB &A6)c0m[w @:2@ ymb`e~|o>â|+.)JS*w @' Lׯo߾͚a ,7ឞ'+tig쏃Y kH8 )V{yeKWAN[X2#N:oHu{)ÇtYSUo|v\j 14{U(w0(ґap9Q|0*qϻӟ5NVCFu<*S]lDl\/[hyHKi^n"i;L=tN?(sճ\xM@JS>M|MȨ(^yx_Y=Zi U8ڣB!yG/usdtDԪS>|{8]7shDQmHļ,fDf%6q+AL^y^ɒy[0Z`+0λrdo0<5Os`0 b哙)f_!1]O1c?$]v: hpܸ ~gӅUS.2[MyWD??-ی*UmGem#Z҈L yZ@c$08^ bF"e;8R뀺*ʑys?V v}}%8V[oys8(r,tM=X@7&ZT֐E|e5V]Ӑ}0{MG|z W%>#u@Q\{E`fzmd ym؛&}C`b|{.` 1]c 4uřl`ݿ=Z@P-aꦾǐ8]e ul-^,Ԟq|)w[XK i3/)oE4^m`0pK}^e{y`]>ga ai7߼,~YSz۸p~`Io\~x{{`-[~wMU**ҝg |_w =WTa֑ k[ʘ\C_`k,\ Q4ozè( BaUxe䄣@BhP7H]<2vmINc̏d1]qh"Fѭ@,h 1s!cct7 5>1VJS_f%¿D pxg]öNJiӋWzjXLV5sn^opz'?1l)q |NR0sf^sps ]6ﶨ`.2005ð Mv&AS5cK0ٵ\ąKR a){A;A;=ѝxab_u5'͆>y FxE22%`=J:F〈S`9 %+~>!l#6my?/*L-,wQ&k0v?~Y] :1{LaHYg?N1 ;m=0SQcE(WVO`iaK1u< @rkowQ"43i<znz2 DcyT޸ iwz5eӭo짾u}=9039-Q1`a{(U V/Ł[;`9O fmL 9'|IaXxB?Xޜ KMiwK^Owa9m9Gdf(v쓗ŌI)rޱ NhFCv)\ V` no-0R?:'LIBhkK`Q\:$TPqg@|pǼI<8^|g݊.v~{Ξ :L.gK]Mhl.`7khu a>Ջ<$ƁQ\Y/'NG -:R 4ĎEk+6]o'MS5FP >UC)jmit[Ʋ۳ryΟ`=YjusQ0Od;jp: WS&ˠ,-5J}X=ЧR#;ڷoˏ&bȃ;nRfaX˪|tl.GWϠA@Ư'4t(UtuF=! VȚ+]v|c9wO[&w(0zu\/f_Cn?kX@ che{gޟ. "ܛvj~D^^أ~f}ocFicCɗL U c0.ApNLĎt&m1m+CȕAkS02<@: a-N2#s}Hf +g[;}@kg* 7d;O 7tSFzT8 &bT!{n=FPJ1DTu kBFVX:Hx74mvtF5-V~F]7 ϏoYqԌ7w~qy9llo]׏{ZvhtJ8T*~pdOn<==x L)ȀP}4@AQ,"$#. 9!#ucA 3-* DG^k{ߍiЇtG\V !*=;vm5: OtF!SF@ͫw NVO1tw7=uI={pY#JVuN|ȹ=CK-aJ aT'&N\"z5S|;>\q*f0ܰ&?,4pAkucxAx:SF$0kܠ `cUTc ,Ǧ+% F_`1&q t/Yk?) V@EQ 4 $8x12lc +}-/.Q^'OOLb4xC=Cl,0ʐDϔ#YGKP@ t Bpq̡ P]VUFzS#sLwh cSF?wKp~ gɢ3pgke\vIA6pl+[-?.]f;=;v ͵i!گ*߳=pcc%~&5m:L:#wQvL"@:}NVSɠ+\c M; lC:[P\1,JbfzyS9 dwxX¯׌l L|)04c:TeN~_՟5K5ʉq@}Q8O_`]FN_L]CUi0ejPLQIUUZjc,Q==^][gy׀.F^["p_Y׋`.. 1"+";)\z;FXdHQ^^Mŋ?G_pb铟1[ީhbYgcL//t;ɔ5fWAUS!Tt( .R!z5H8^z #M)QN(3786<{\w9g*z q΁ GfG!=Ih5OkwONQ6QxwWB쒹n^0^B@tL|QUvdHDm]{!$wW--%ȷfC"Z @7ؐKɗ<-M?e߅v,[E0JSߝvPχS>2ڿqaB5z~XES\E|-f/}lw?/L*5ydi:[8+rm !mX`/V/YNgHnvvl7~K)G;$6C"maCNZgB0.EiE"d7}C 7=)r\YN8 *8E|#<#\Bs( zחC .20js^ DW8;%`NQ+BprGi/GuaWz[)(;ѕ `UNhx`W!O9۳֢E#\!)"kb*NL%6pÒ՜㔭)=-s~֔!;]AGt۴؃>:=`:zn { %p3˟w^/&mGБiLY^j0!F{wgl704dXC|\-W- u)hqKMkB9 p6g δYgɾGVޣ sN|SN:7 &Td s7ݙKM?6)8u2!cw8xެYn41 Q&M'LJ@w-wU#NUU 0KfϞv=tf  {I'*٭\;vI'*oeL!/cC~iK{*AK:Sqx@IDAT[5zMcM{; ]'oL0uEC.%3V5^6[jqJ-g R:UH@!P}mZ8W Q=O9mr-@ tl7J +} wP:Lu-jlߴ3ͯ}%JU_%hϔ69^>82ATbKZ4y+_k?\O^&7/nr *X#`bm nۓ1_剼l(jށFQ )m V3ެL ] nI9uڍ֌m9 ic}=[׭= ua&qG/?_2;;gYX/Ħ (b{'خQ554w>)7?|7\{\,?~Bk;2PAG1'c ߬ˬ4m|oooN~ف7.7W]sl$Y^?:WxKmne:%EtT>7gYZX]ϱp'qK7NIa=铿|_{.&Cv~79#ݫƄȉRG"IУNBdmfri9ucK@adȪG6* O*O冗6Orӡa!_ȱ ߗԫMA)fvڬfO ]B`dQSb@=a_~(*TgA^JÚߑ/9.. 2N^º~Qb&2Р=&/  xLX1چvDq5X؟$x4lH0ۓTlck9b9_[y8Ym;*5REc)LY}i%L rL'O8)}cX`fn!3<]0<7au&ox*^KTc oҙAg!~r7;ߞZƢ4c!@8~=< ʀoh;멍#BT9`0y܍|m>l=j(Y4ȷcbm@ TzUxC9_l<*sfjo_)[laf!&d WocylD˵b\,HQJ-~sM@ NS;bzX߯C X{2CWV1LQC_멂cӿ|ODW:g^.9$AWcv"N8%52+-PpwKlNx98 nbLZoblGr} f6{ɶvlvo]LEs2p59G v9>$ޔ دˬvpxtw}r ~~/xJLzBh;~FbnecۛN)M3%1n' HeZn7sO4lqphp sTA}{`~rHd#&+LK3@t4#F=MQlPo+q\#= wQ<ĝyQ*ǝx4ya {zNCLv蔣  ĘvD퐴2ra33(Iqb-d4{"*iSnMurLxh%(e/l AI=Yo_'е4.L;#A֣UkꧥԳa\O\zCCJC}W{ʇ 3c-*(;IB˔Q9'kQ8 g~Εzl.XUS.`DOIӧatgZ?*wdss|a 8y2~̪4HR/Unwҍ}Yng7l Dp$´"8 ] dzm̻q,-#1ƓY q fv :PrA)R~H bDjvYq5oE_/KlhFi+.: KOθJ Sqǝ1eL=} dmUi^ϔ?-y\&4ä_*k7(xPJ?9gF?{DGF^Y_ghxc N4!ƼN(cp*qrK M; $)"+KVjzB6/,re].ԯiC!C0kJQNcU5" ho$QxTz5ah%@I\"Fj{JuRaGI0$"c8TjB$o3 ^F}'{j*;]b-|ê@GCX)GǀúŤpWk%Ef죑 ?(P=krg^H$?bh޲ʞ.CL" mXn3ڵ-| :GNF;j e WD[7g9ka3݂qwusI]ΧWw촂= YJ92?"uB S}8¸ά{4izxk4gA:d>[:!dV7w\Dn]WHZTT'.xWT BD!bv)!^әy6\i S8(z'BI=#3} R8GJ@x m_*)wJß(?3GY@eH}Yѕ'?H+<m¢=:w$98U[d JIx"#{ \$G1\%lUt5=h@N/:)'.P.\8υpT9 5͝j8mvw@ xY/xяЯPį6q-=-2ׇ;5%@5uw{ݲrofH_ïR aN]ŏGfprؙ̓=0(e *\U)r,ۧjdp$K[Yõ*R!P'x?fˆaCMR0bw?׽80ӯzf.EioHbGVd2-?D[B(fUogclŌ= ՟Fqd+qbǰIji[!m#BwۭQ/)LeG O9X"*lF}4؟Si\Ϟ<:sU/=|͑r25pRfY?j;?-:ݎle,P{Nsfa)R 3 L9\Ao0=:cy IHH6(g)Yc󠟘%[JPP_:Fuِ Mա' 5 O7׷dyuXV=瞹6X 6 ˔iCOR =mh=Cf.Q-= co?-;u{H ʐ"t}鹵FJ+i^|Ҁ9j3{8qڴJ)MQLg[m _ "_c*G` n}wA9HX@ †Y*[KBdUlEVVnPP6qD9&Dc I3u?3 d' %Y^j63 @r{4,bGlV̈́l77'l4z1%Kni.xuZO`JgtAw`'['wvܲ&˗חݞc;ѵ\Xzr^'2C#[f9YoCexxP~~p ~2 /7M-YMPRcFC"=q#i6m0[%rdyLPl`TsD-iI_c~"$ .lqi#\d*y6yr%lsu 5^Dt!Ct}k|6B(lXgMCܡlu&7B/4sGV췘Ͻl@ VdղS8pW|eigQUg:Aq9,|n;V̻B;Tm S_]o%H'}kTxo!$+*C8" oy%YrmzL^c6Ia~-^ɢ Ht^Den?ՖQPƵ=3-dK8 UbP<} S3;:`0ڦ}N<ឬv_  =FfoN|-(yz[7L>Qb ঠL L 1+խ/h(98\%tj^Mܭݝoq•7wMa'{Z'6aMk ].00o 1%G|EEEl-~"ZtGwwun0 3~&L T_.6?E߅K*Y-}c(e3cddh3Q:9[?8a@,YeOߧ 5ҁLEKd=vLvkIwB2 Ҍ6U1IT${A,@9nx$w d:9]pXtscg]"Uڎ:J=I0\~h!wRo)l\Ch\BV IjU Z@Gր,W5@y%!TtjL{O_\H c뼆$zo[x9A PUA/Ο~\m(2;5𭯫FIMwⱿJ' wS&y/WϽѷ\Sj?yAbf&ԝpU> s?wahg/  *PI4x-zrhy©$xM3:dq*"n+sHbe& V9{W%w[\A32y't%QSK`-^#75Q0YG%S!P1]kRL+w6mT$IPNU7:8Į@g_t;h`Wpd-GLdܣy'1L+UUp@V*MDqIC@g &kzZJRX2 Sg7gadʑETcTZ npC-6Fݍ5CGfJG="ʗXi!^*ykV`=Pemޟ<5Y R ̫TH"Y*G&'*@1 X>AE-RY>jЙulqu|F r>麷߼|RC{ I/t[a6Jj9XӤu`|15%6yqv9s˘3s͜]G: 8 Oe wAu`ItOKޫQw,"5kn{uc?b0=pQPT 7CNΝJGW UI82y{L}:uGp-Q3 ornZ# y;$=Q7DcH| ;8 #ăʲEE'lQhjx<%֩(gL'l E.^\x}UlFk#JNx @|:Iòo<-@qN@ȻE*zwގ9e !=Lۓ|Ov~X7ƙG7<[A[SpAo@"^L9rq]?;&7en3TbKi8(9p_Fu=%vC;@*(*+[LѺGm{Cy̥0 {U` ,hŒңݷ2 \i2jzRn(/1z+ݏ:x~80ܙY Z@z ާ[ pig`1RQ (A% 2NLt(ݮ*Pw.[V2B  >l1'_c6rWe=n[3SCq$!& rp0;Z ۡO"f783\X=eoeɢ~d}~Y[}ƫy.m{xL04q6-۳jq/ǬtFOa4Ncs1cKzW|Oaз%XLñ l QI> ުqxl«CX WB܁ըa^--M6 MT g#hߞ(D FVR;l5_ &K^]]N_z=s kKlSɿz/IeOXK *UFؐ|n8 S*Xc+ZKGVB u0E"ǖř23#i !G=6;oS$k.d91 2p(%?dgLKmK!\ BC߳b]s;F\P? WN/?~g2b $nMwBZlIèt_esЫzBnZy%8Á'#eERH猶h^(GQh0&kHT@EEö )T^bi UҔz[!ގۢ'g<9;|s@ޥW VYaKK*l7g{ 6tb?9?؂|V>/~1{f\=?tzq%˨V'[ C; {ٷqaqd1 Ŋ4PzV8j6 hD 2Tǁ3A5$x8RF[wН^zo+큡HP{s3ܿ<3^p7Sޫ P-0׽`GF VHuے`:5gԃ]('RNw#ڭ"*Ê{׌f#wk̈jPw2 G23vߡfm-Md8=W *V+XZ*ŝK{U׃}Hr}e FYY <~;C68!I-96m~*FhkR cpcf[n=G3Piʳ-y9B@|~"qZ-W5mM58;=5pR#Ç5ϟ_o^Ś-pv|}KtC@FgC/АZ{v^qoޟ7zIt#(;S  u>~b.Ti+ua^HȞ#Ym(xz΅{o62&DC$B;jt).|yW0Ϟh 0V%*ez2KiS]Ho7,+Իr`T"K,X51-?Gad9z;L;X[ }c\ ðq 4^ڨțѣd猯 KFdhwV}B/XLlrH#\`d׋nvU8th5*O%NIn5 #&@`͚feWk:usOUGAK p6=f3-|%0;dy4uw a%·R(_F([d.vK搻eių8Y2.c=zӅOHXݏn 8%9[z* 1>#C5CltSܔ>B\f mp #g˚f4ul B / a|(AO(z  C*><Þ~wbFc F)N@p׌ BT<6p1>S[i?+ ?@pJע=a7CӇhZ+|{²حL mW"Nd _곭H2uv#p CyU1>X+DLu8Z{~>?1㚀XvjNkRI ~rf|PgCx{]#g rhd#|Xkr8K8a:Vf>jg:|`0\G@?L!]|Zr/\2 ipZH3wђ{ۙow~c?)w,SFЅ\={9l/1YϹ0*6Bqd0tPX_^9Z!(]-&hmEH^T"`?E8JFnh4-˨2"چ=ccKgV4AL©w?M5frkޝ!r3yPlWح;W3|9~va˞+^8npw?#)p]aHr^F@Y%mt+ "ļ+ ՃJ_62PaG3,q*~tv| bۦy*إ˜ (+NQ`?\;}"}d2_i[Y.1X6uY`:gS++^ +bܜMK7Nx|\/^83pxwN w-B L- ̆5?z5 ?~xY(]!V5}1#8mǸ30΢G4Avrô9{`n{]$lYgkL̅5TR37f!5/M6Cn -ԈA<rNQ1K5`CT=x' z \{uvi>@Ӂ`yq՚G+pCUT= 󵨊Ᏼԁv/X15NasH@gh_Ճ<VG21 $JEW{.C{]㗣٤p5+hMޛ,mNiNS5^rNlNzwfwW5k9Tk 畝ϟ)a@r5(wwgLgETSǪjkyxqd`򎡸7 nd0Y0ܺ\3 5 ǝ/@{m0];xU@8=K3ڠg$^YN\C_yV!^DC'NI(Q*$͋ [nd ɣ8}zuo v}×77nbFP8"nrr)[hHmQ{Bcx/P. bygyq_4Td3/U)p>+>޷ѽ8q0 ىmjqt[2A!IvpL#6{]R\]GрQM-9.'uY=Gn\bdy`  >?LtZ?|ԜvŬooEsqgg.fayƆ{s!p3\1TsIRVq/+7~?ppFE`L:"aM=Gи`0EFAI]Q$8NQXE%m|/' c>=|Hwɹ ems #z“"90\wޕF<-gD?EZ%pO. %UdBH0]r:4{9ԽA?QDQNYuϡ୚ Wޅ#n}s^2=o_a#U\߸*v6?WuSfnSVdd?&oAjz/~GqG"MQpd=KZʞu0p,֑e 1aU{5%2T!J@}ִ^V49iym]LY2moB~ uAAD> ~?]⦙F+>]? پ_!$@4eNa Ndjvu=[ͦ p[ uۜUI3: aAФk+[e L~m?ҺgP2\s%3U hd)*tT%V@$[Bt>0֘ HkyQi3x(_IC< ePPU^1_A) K!oSg3LeʩO !zL ZAݳ]Z%-jjL[a}l 4Li_fnu[([f㓎GO_Z041sЗt?L( fk7Y re,av92dl'R17g ]]r) ЎC1zz|8)L`nv_>,.of5nqʛksOӷEFmf8m ;` 78 ⧯Gd)PdJa;ш`Uw萚$9T׌}9QP2ep}@-akn`?9k؆zJ q{At֩ g]x lRKޗB\! 03OΰmJ]wE(5pR>J֙+`w}PZ.sk(tdsrYޏfnCM+v_&3n @*ӡ]?mPʎ| P*ee‚.BBh;4y&A=-̫k*Ԅw= XjlD^7zgQg l8p\\LznP+-iNZW4T#if҇^t4Ƀ b>a:T) {-/9i xoE۹ ߽簯v8$dx:s۟[%?F[WJyURCq$/5=ba)M,|$ƓB_;YKC.*=z``qVk{ "9ɲkD NѼѓ_bzyYjʇ1a[}Trs킫H2 >@Y{PvvLX_1YQU8FB>o|8)\VpJۿ0 ߸@IDATZ070ɳgs {XEJA=vD #3fwac@e6 F")gQ(:pvn2$+l9B8s0860o5!vϥ (%B `nu\u2?<̓YG y8gmq!U\ 9$PfBjwxz҂_!|^ 5]k=/î-3 pkk$5g˯{=~F~fQ7>{RAwEVs9*"IΟ qiU'Ez n˧}U6Rz|un~18;?}hgE3*eE\3"mi$@!.+ÓoȢk8mmMl sdQYT'pX< SBW#+Le}/XjI߫ء x\G%lʽ|1r /$%+ڍbLtw>]+mNQ͜V]0n?>?~1/ptlst6  0 lv^G||vQ)Ӄ=CtC2$Wg`xGPb_ HPQȺ:-10#j9HP8]%tvyO tAȆPP(zw<”K7oG~2qN]NƺeT.pB6dpn-ه{+~uǐ Mc֋=yq~ߡWkMxŸMo;`D寶*w$ %O7a*צd*  __17nnRCUR_"mwv@O S_Bdifۢe;蔵+CEO<=>G㴖ԯU3 hs6 yFg\q@ngMv-Hц[RM>Zw0ߌW=L{3I8&̩ ws1/w?;!n&[n*oT9HQ4xg1?lnwvWhRQޏ2w<tCw=gG(H_%`$)_<%QS5Vp3|R=tpJ liHw\8Sss9BX w2{H|/qӍm99ڟv e?]ПxĻEJhG ̶wۢHzNe:=ƺKC?u`ޣ& ]yezX. @{E,>µ%|%#0|N=7H2:-`uΘA`#{:+o46!$dhamM/E@Kqq@t8㽺dN-Mo&:c)ɩe?YN o?On_z%pM׽b$i\Hݛ 5"/:Vݫ!VlŌ=cwO$*a\zvǑUN)JbBk45ŕ {k2"˴s!U8e|z>KaƄeXb;0'c3T лy%k5l:vͩ} rMޘ#+"v^`9k\Q Zd5i<'88+DN#8h C(LV;O=x6N Ec|Q11!Ӫ4SJYYTFf4 8N= gaM\<!Ę x)+Q%%oFu+{Ta'I %aCE\=$6Ȳ;aG31YױSnS 2Ew[?=;DFZnFNcIX5{GVgzvq3Y3;={A9B1z_{F &ϊ }б;&L9ˎ\{ɮQ(}X|8 Qr$Eɥm~ɆaѹqY* sӡzf=$X{$b J/¹"7E:9G#aS^ĚÜ}(ŽK'Qd.sԡ.a8>}eEgL%)W[5:@p ?C"0Xkp\Y}ǹ?̡7?a'G=l^0-^rSRgXN M& ea'?~>a/n{8|c=Kfˏ#(dspCm--9X6py2bE q5%yiN?̷!{coʸg[t9ogΊ!<iJv7[zNN@Ŷv^xՄk\]XB)7kXsZaa&S4rNxБvW6w>ߡ( Ȫ'Nd"MFZfQ^UP)zؖ6iJ=-u {ÉF+&MY{tM\Y?I _WEPj=Kn!+N;WlnQ"F60.»Up) o1>w/dɣ( Nn9zWVy" e@Ȝ^X] /Wlds+|=Ћ,H 4h;`+[`hgn kU w( !Cu{v_߳L`@f*.A^drڊ:,_{Yg?adPyh&9^ڀQbix 3`F߿iedhY<'%i~9YaCm.CPֿ%z%%^jCY̠uEXX]Tpp8󇷞]Ε?|QA@wO.?~~2kd@jo45kK:t-ۥn9{hχ0_?,__L7L5V.-~'9|Y2QDу+5vn A{SyQh1(fAg%p@wYYK(F_p q?udQ;\ o[R]ev*0_3a1 91Հ2;l{^B(i0e᜾s~z#]hBH %_  *ԪQB~UO0h;26",ij2_8v۰ħ";PyH1C&¬f۠ !O$)>;eR,e! %EMX*aGXhF&ޓՓ:^8Lׁq]Pvf9 Jm??'-2{tגgc]/ 5pR>|NsT 08XY39|q7ݎeh}˷Iu|H1gJd-4#؁4qw#^IVnBWN.T!tH?p' AzI#wU2cr!nq+"7=abεs'zUyYDG.0T *y"klbBeCE% *-8 gy~(@KLo )'?EڊO?:)zoCQ[q5< LiҍIv<<@GZ/et}Cc?'u[h{ =-ޡ~::@à.{(T(a,T~H "/>jxzOBB$)i^>E _t9AggO>8=YcAs=N (/>њ_W3Bw n]OخVfC)|̔*9u,^gv3I, =Ym cB4s SF8:($"_ňʜ'e#WMJd-G!w3$` n8Sԑ̡00zJ'![ֽw!>x o;Ek" 0B Y>qeoC@^C#Ctˡϡݭ~W,:5&ό"h'{ڣ9A81Z y "@V^` D(R0]|Cj&?4I Un⬨Άg CqI1y1jt[#$q`934eK^zOMy̸3ywڢ" BQB& ;G*bq9_` + ._s.f~y[heοwXJLF5?~EAq^兌;"o"Wp.;MO̧.7]ڄu&W\a`$,E@nM` 6n* jo) e{6Ȯ֡46+HUQ,vVdx&S .ټq;M.EQiťRP'krS鎁~RV}E|uoc%{bѡVKk].6 vqh< !@Q;̟UGVrwC ڎ;5⌰ҡI3:?8q|Q}% ĕdp!Dp1A6!?BX [ibZhv ֭P:1*hx_C*Srȸgc'ˈIp2?KL2jD%8%p:;.{MIUa3Ykm ]gkfso`X?Ÿ=aRs=ӥ? #q1º_o78 Cr I/<f)4=W^p](@18b͢|9^?qɪ! e # dM:Xa F軦 h|YU8X &,ʓ~A霝<Pl<&DCB+^M2kA-.Qf//^fޙfdd+5lS{0N,Õ ? C.Fc=,£ o$cUvlfY!>(DzۭC +7︸oL7JBT(,OѯV!~ʝɺ:ԔoXBh_!΂@z[nFd,o Il@0V ,PZ9)&v zwoT(W)UH[T@bK]_R &4;64XgkR7+!}5ZNxn z:,g l]ȣ};SXO-`LT!z Llge;-X\\/\`vSȇj壠g$]$p>ٟ]>/ 5gH|gk&g=c1aR/Yq~S>u+(n&`S1йº4zFvTYl U>h rad+uV{𣝡kk| 3[F@w+y .`=cſ֎мrHZv\ҏ!T$9y~my} . D! l~zm顼rCYO"|E [/ y0} G>48w%(A@=5`Q nFx^F0{3шf?JBQ#za*I^b;-we:#U; xfg'(7pe˻i5,h+KeQfq|5+޺W˳۳Ӌѣp2N G[gyӟ|hjzyv9 X!K=LpϿH>}r^ИdY#'ހS i~{,F0!OJC3.abYHAᦁ:LMĔ2Bih \YV ҸzЇ>0s2I`5Xxg!r-]񊊜a`nCQWu??pFH~XDN6 H K4Z(e߀<-yy8#\&)&@PC5Zs W峛-<!nʑ:5~ݝ򛈰cƘ(9*JL׼F6oFlv+fjo w`&03 drz؟˽3 Bxw7g4 0`DB W0.y`ӄ bZ Û{E;C#cv۲4i3G FEUN%9nȼ7e͜;m5$^##xFrL[sw~|CX1NSe _ kaHo'߲:Z7 A[AI_V~JUcDnj; ,"V%w3!*{q3 @wמqc|Y}o x,y4a~~&8Zngкᱶ%+]oX>޾ 0mqciϷ4֣[ݒq ]Yd )_}&ULbb %G:^fa#[}t<đW8!U9:YH?F{CgϿG' ;ָ4k`Ga9UrHCw);'CM %j-/֋7|]Yt2N~^[XE5)X0KnHڳ??) .bZu`OO9&W-²#$N[n !7x9흓C& B]gޜX̉B>tsY~f e&!npb2nY.gS[sN,G "x]3%2š3@г%`XI0?osKaADm/j:.󉛰%iSXu @~Cln|)]L?l_ך ÷u2YӾhsgP.:@_[ԪnŰ?4/دD$!sDtsz~8p)T ;fg?|/q߬f[.+Kz)S+$z}Ӽ1 @ 6tdh3}BG2 lQ6-x6cN?߃l*Qg>DtyȋSW ?'mY3CDAr`I 5acs?:dhWVkज़Cm5oi# # ,TC9pcPIqd\*S] #e#cT7j*ɀ̴x,! +sf>@ .Z-:ݱIaN=vGDp[f-[qA/t)hB &87]z2 mEp(%(-50 Ljx<߿msd~ϗ@y;=דk;}OY}gj`Q最ݎ)9 w ?GV!V]g$~09LKM 0@M™^.;9 QjWl(vq2*0kM'RFGR8bF86c*x=["}{/p<3"aЧ^YYuzǰ=;rsXlVX Ԗs3g)~K\2qW=2ĕ]#zc_ݟJ W@Rz/Õ,( fyD8`x w)y'Ai Uf6ES?ֿHWQ?N|/FVrW·:>0mZ@wSa0+&_~{ [)I[6|w>aG _:g\e+s8e^xd)ȤCj츚&s]qcc,~A!K(7,@MN[M7Ur 2(bsH5 ᣄ1<5_PC I }&09RX) ~rgGmrGV 5 2?8Z[8s$hg~;/卐5W WQB\|&~}`5k'gbo֗Y8z~twS1Lg\k SuCɔ)Tz'Ivͣ%@i91%s]7 1=eodCZu!u9:HxR!71AQ*^, H ` 22/Y>`O8غK,T~gk ;9atQC~| * JFqp%=ɢUyE |ILjiۨ{ lA"pӀm QھkF[BDXV kFDe< oL|kV:"39Zq>hc ay ޲^ϞTpm5Ǣ\G_;7q|<,`b!)7j1_sFƷ7}-p6V*:y_q nو=h}Ped޿>AjJO=$&JP4PJ)@ P3W\\Hl91B4EȀnT*O~FCWjD9t? Y Wo<@Cb֛ƩBo9NYkmRpN2 g6s?qMF@OƈEGCl`;Ab*#G#َqgqλׯaڶ3W Uf$-q\Uv3 $ ({kB  y~58[O=p`>cy@ Lo^O7/aY?\^nG_7f,aϮ 8/|$@zXb+/_xMKb ;lwu?#[>ֻelpfSVαw?"#u?z[kthf<# h0 }IPqCl5bR2^/pP#&0֜T|;cd)J?Jp!"Ǵm)myr~'aaT[itۀ?IGV'sƨ9;kJ;ѷ5ҟ䳟\=_< Es1./..E9ŧ!#~yv Wrz'MЈ{HcL@NML/0o[ ~Qp0A[{}~{^ϨmߧmlTQ=@c ~bF_3"/,e-GC.}  Lć Nf7Dg}6@frcvN9&[ ,%O]&y@qv'/ F 9(yA7F H)4Ui8N.6 s1bp]L q q 0Qlԛ0C8uK˜<[| *O^'xhjC@͆  C`0CȄQv{S}ތMv D5^:(Hw-wJTi~Oia q ߐfA+gMakNXQ$rreBFZr^&ɧ%31|7ȡr2CGJK' &n[SNUXfi~M @*P1@'"+|s8>g/&ń 涯vsf?GpэWLh YF@GAf ;!3m69PpfO{>jEBg');q HB%Enʑx/(y FJ,{;$Cz|ZWDKxIO ˍtiA6C0̊\! ;OHJ|TT #w'Q\nlo$ {3YU{5 Q UȇZC:hci ,6s xH"ʊB!ϢxǩRm%\&2Zl5Ëi:W&>/lYV QTX̽"J>+l`0׆@ w h_ӻps_f38bsRn=/gkb/׍onnϞ={¶VtǗ18lz?>p>#HDS@3ecl%zSXBHPm%PDD٧S7yA̞'mC՛Rc'J!QbD*6.7ӼHl{9q:B?=H{ Xͭp E*0 @oQR2gSkA ĎvɅNVoD]FN-15/B y"a,AyP p=^0y3w`%= 3?Wx50L0~MпEşGg#{!;;e4ƿ/w}Yot\w㊳W1ďB ;]85?O3%G ߪm+|ޕ]xw-`0O:d 4Rh]1BhH$CQpfAg!xWp]>fuzҋDUǷˆ$mLg5h}Ci>{1=I(IiwpFңS*5񯁠P+?',҅>8x|8#[Ht|֗70Dh'|Q=??8{rq='EA\W"* %EwAb/䍓ڎHLafq=|‘߹?>7@|fm7u9n;?r#'*|_N:DHCY nK weU8-Muj]@IDATb[ ڗkF!%RnZl"stҌUu*^߯O&~P&|+Tk76\6 +w੟j[ )~X%k6Tn~D 9~w4L ,R77.4mlWaN/0>"&^#|>e!O:q/-s(8 MH?bȻb-9 M\C~'K6|NŲd< 5fo@Q P4qj#FVe}6Bp:D2 d4lVFC̛ /7<8̳eU RPsmFt9y⿨Q_F"N Ef#'![ P5Ԇ{& AM؄- 5)Y R2\ kj$:(^AfX|Q`R<i{,结|{INEB2_{ЬHv>[$^3⏕zW_vtǻo;+yd/p?x}jW_m8bkD]^Jj;D>bMפ!3긘@¸!p٣{]3AUtũ &naŒ,^6G"H &M<,? d*}7M/尮U])22PʑHo I * (6:Eۏn>cDo7LQ,狯ٿv=}{rg@ z+rΏN~PrĽ/hBdq`Xo=5lbiCl:\-SnH H &MD< EU 5wK~xTZWNG0s[tQ;-v'.p;`!聆?):mAVGE|`=;?:$P̜2{ %@.xУiwpSC=-BwA߰URw  2h/˪*P i~b!pF CL6  Q6=~3ʬ ɤ?v9Nİw4mF{Fђ }|ceO޻6.C9w^%:1zd+ M6TagWp"a="JjaYO%Llq\qS|f~0N }֣dEceU&-"A@"mPF ue~} 5 2x?Q*3X!<{eRՙCW ү6 x"aoD"F"/2!0NϖHO?iGqԑ 53?e{UYM96ߏ=?c) lX;c|/? cl1'K pi:rM/r2[݌hO 1kk|SP@Sp`dqiq퍰)l5,\r1܀rp3MZ9qi,^j )\t=h#ht, ʉ&5dUh6CiOޜJH pl^YfQܘn %7d5/' ĔAS5Fnb|U V$ոb0k""FeGIx>*@71FBz (hlcs%KƷ$A0_}bGy  |fdI~gspN ֗mdZ %OHgqW^2l~P? ]w~߮Lqp|._ϯl1fի}EY r}T-p6>f!F@?=twb[^^\?2+T:*`Cbg$,CKLѹb4eី IA2$Niy)O@߉nrʦ*C~hJSޣ<>!أI ! h~}-a!a*b@:ߊŻi0UR}.dBrz*ucaQi&xPATƳj2OCI%鬩"C$% )Վ7*U #c6;huwdNjB#)aگ 7)# :eX U|T'^y}QX<.C `M ?͝MCÔ5 Ə/L;MTr?>^ʇ_q'|M?7l ! _ K@..{ f[.HaU=0z'ggDBwf(OJZ"oz:{HK"h}Ŀՙ&!;Uve03vu8؛L htAh>Prb>9 Uzv!^@u t Nna0@@hM9! 4#z?Ay=Ao-PFoRATr}  g;P 7U܈ׅmH[?=4Ļ{POpYkh.p:adߑ94>+g挳'-/=xOܻ2p؍0ily6>񚀋/pXlG{OMs O90eݚیC@*n.1*=Z$ :(tBnYsP֞9%AKr.-8WZP*Of҈#SDF RPR5ulj, Љ^Ň.e^)hnqIEf ,rB#tNSbY,)MZCѱSeRi⢍Na]gCU4>Ƣd0HzAGpK9V)ٲC߫]4pYM& ]F#i3?nE" |0Hinyw_~6ݺo?\VZZ-W^& 7e4{C5N> GmMǟk~:'Dd`(7 (2c^^R5Yd]H>BES5ITCa!4lT&CN!&}!u]RA;$u@VG84) @1AUt ߡ(B@ P>,CvZeqXE77KaBSru2?Ft1DK=.hH5tՅԈPE+?%oa''eKY;ȓ!0IV=#bh {D JQ$LJ5b͈-9v9>.GJxdgq8 WV& D$A,Ym,\-Z @*O%BS,kQzfdz 8T:|tD|A*ͩ?H"Nu(!3AC{_ڻt ̪+~5$u`-/A|-; WVW$p٠}E\H9RaX_F#iR1O,:$,ci)FN<FSzY)ǏqƇZ $!BN7'jH*梶y4R/op)pLLВoG[1] f/4e0li:Wc LVeKۑ~_L`qaEd)u,ꢑ>n'ƒ+Ҭk Y(/_o(lGvh媭;E͙As{1 b1z6Qdlǚsr|)7Փltg l_(V 5k${3`̆G/ fmכ X0XzaAQVS,+@1VJHZl|$/†Fumw[X>0ax([E݌,g \7AF}0xCah QJ;YRl4tpYb+/焠 Yʪ'&U@yH?~F*`G/wHx(5lk躢 tB4~CC{fٻ-GЯl$e&TWE6c7[`~7@eDfu(n>zYBiQїm LY(rAZH9"c^ x3Rp_mq^@},l|,oGƇx9@bc_/G 1ƌ]:yr|a'qwyC $.L^`R&5'D[ku~: 6Sj[1ʾ0#,r:!O35# am`شp~S NԐS4NhӖa ]WxJ)^3Џp8<}g6Vy$RH^|G›Ks8AFџ  M|i a*;|\h>7OXygҮr9HWg%c2z`Ϟ[ܬM{{\S·:|Ƿ]f8zݝLV`00} k6^fןtњ\p>,n\ڠXu?眀?cWneMꒃR_NK{ؑǸ pt)_%4q$3iKRog-eTav wH jBnfd Iˤw| J7}{l xi di'iGkg[!d!߃?&Z=T}}A5,g$@ٚVF[euQ[:'P,F NV,߃q߇@5IgXaQ߈hlXP⟇>#9gz9zrP_Vcj5`e2ݎVoFc*x@`ԅQ6pf^ϿiKl9AbvxYCSv.[}-p6?w`w9wC2\^pcNj#BE"?Eh* ~BZ8"-?͒Q]pXׄ{HLj} u5V𕩕ڡn5@-VFS0hu8-xe_Iotڵ!pWP#֨t驂{tJ~EWJ`ݐ||'ttO/aVc.ǟ[pbJS; ZLFm8:= , a&F;’k Fs!oT vQ\a ޻FDy;v\4094߲ޏK! XMWD3P?B&1Wf:<..TB^Ibe }8L qhȖjL&I땝͞JhjÏM'#e$+Ȓvu*Z!$Z YsUV~+(=A,(7 ~9~J1B84.ލ4eRߞ%)4 |rn^;z[z>`F'S~l⧗?]rk1?(@oXƉ#YɢӸ1?r+xzLΜ[@pxҘMv; g\n?oΚ\o&犷>>{eq5 >'r^!5mg`|bωM1&{V5f["8ٴYDV7+erMk. RIrKSxtj ́I#/I!@Nrm[lSUǯыW08a l l }QvZ3U@ VunwQ"v*d_?GyXBF}ZqDOk}OHh Wĵ9V0͹&=w\zip>hNx ,~騤g߿G|5*;/[>}(O.Wߞ3y1XM _~?nwZ`Ļ6)l?Zy 0&%pf&1'FhfU cv7X_9LO\,,>|W ]9۷{n{W/FX0E~Ɂ" =? .9 F׌))U@Ц9%(ZB82zcfɟL'/1}h'1i= qNUr6U}T2E.3A_sUe 0ʸYE_'4*. ˳n HbBM*@0h&[{5d#`NR37_E_ZTp pt [19Wq=`$v}Q~+[|;mbe]Cftv9׿]],_^<ӟz%4о4l aV.f=a߰qO ?0L1NYc0i IsZ,AȿzC (F'aa|A1,P\ >J~Juϗ߉;I3 M[@#@T!Vp@ٔsH,Eh-m=t3 ב 3} My䫑T̲Hޫ#_eX+"# S2?C}8TV4#6QIv0jq$JӀګPa^3P`GDT2A*+F)aZ "& eq(` ϶p7qϟʞ8XbW]/WP3?'?O(l%ՂF28%ch(UM<`ap[ pas@v;\qC%4$v"gg۞gj8gxaxT!T'5"ėNB,DDFIK25@DKÝf$@"se I /){N$bUG(4[7 9n4ҔHU3 ӑ*"LnUH diоɩ=2(hu9SiXO4b<=jgZQK. .T-J(WTIx=O)(xH~9-<|w*vtXͩ,|~<|ߥQa"Ragգ'/O.F/>x~9Xc` ]m? `,XŚoh=ܖQ  Hg@\qaAl=pC z]_L9gc˗/y;+mH:?~-p6~-z{iGN?ʤ_?lĉ 6zɤrhakd36 3~}n-9 d& Oīå]%cQri-^M/u[B'BLD$j o.W[xHdhϡ* 嚂ij— vS90NEPm 1K~@ V n$40, ,g9arwn}M3GbhIr #m$"Yb"Y&FuӬ6h|_ZW"!? `mH٘9v_iy.k=g%CPg¿? ]`Q8⯂?o{hݍP߰&{Oiц| 'G뚀-#c>]@ln[?xk^ؖ8}gl{|/I5JȄ9ZH̳[l9~-=N ?/G?Y7?kO B@q{9c<ªrdl2c⸓gJgQ1~-p6~xOG+S eƙD9t䖀_{blS3.Q3ϖtt}]%X\VV k@02*H TJ !ĦbK x@4G;F":8j#m]gR XPȴ?]` {< XfԳ7?a O] mp\fa?eed*v0ɵ%K /0w`„kld`-"%9"ԲRnS*)T;+@rU8 RO jWWէ{-:SCZ؈ ,_2K/so*`q*ܪHm#-TݫcqPԟ<]=[=]Ĝy`!\ =SVA%;9cg~W+gG2j߰]U8 + c$ @=qE+۞"lSaJam1)C;(w dPB?'BSI6)UrY?/X$߱؀gʢG~_?3WS:N:i@!>swH Ls0DhƐ6zICXp5%&c_T~Kb"_"NTv,^UZ;77O|tenW‹D ѯp2-kPX$91G~+EzZoih( UYH.ݮdޟ9xQ8+As킱&r[3# +/`g a7{4 4&=ɰ Z'32dW,p2mposFʩ:TmZl6vXZڑDO5;os^O^Nx`+o"a(G+GW~?ae=77+tR ߰QBţ5nIv@ L<0pNtP7*j'#"`au7-zhFclҠ>+3''En;j%j)zĤK݆#j X4|VNB#GeXb}YIg5{OR`_[K(H.U1FT8¶zf\CC ~bGF |bt F̜IG pΓpA,鳮.3b`p^9%=f b l0iQ>=cy^t__H(dg?5{E&m_"0?= eb6q0z*ګ S,?Ҭ4{tm A'-8+>c18V.BJvpUvŃd ¥S;ܯ̷bQh$ >kÇo ^}Agx `0$I G\B$984Y3 LbQ'JkGCK71_T T\0TZ0r,#?ߪh+o'U\ζn ]jَ7ͯ]_Osl>)0|[dӈ%%Nh6R|S X-9Ȯ5xVіr^ݬGx˹-77"Bg~0L#XI@\gp|W,|ti8?= %IClu$\c ?fEnrsL#Bb}/&ͯY̱ љ={iĚP. ND(?p9pVh P7*`DǏTrx(/h:EMY : 7e$\6(z%dOrl?1SegEC2/|xQ"̉x"#% o?h;|'Рu K<ӌ@#1s;w8Ao ƇA­O93daL@S;ٵkؿZA%2B2c.t=ߴ<4#c*-[g8&`aV%?6n\3< b ;\-P=5tB; @Tpoᡉ(F&Ś\*J≚v=V#G!"]MtL/ʏ+|ϴ/.0LBIˇ .? **: N LЫ b`v>qkz=RзOU, ( mH'i*Y~uPD C㦸AKvR4b\iVtE!FeȒvx=jFsDZ#~TE&PRd\gtƺk̉q8V@ъ^SM_P^=߬G3^b\:h շX)|4zAF'PEΘR! ~-W_l9yڀ$n_X9pnGy/[6p̘ g1q7s_pCaQDɚft{pshĝ ߤ0?PpoW7@2wzx&vCLpC '5YίFDEà)ҡ􁋩Uz|8 ǒ`"-3 "iÞ)aXL\a[&<̐fˋJF` \fHRb95ʐٍd%cBRg0(R]x/tY@M,yq \ 5_Qg.')CiERĢz1(SG^@㎃yãX9I0Q $ݠ/Pnc.W 1ޣp@iyz-po ǜ?C3}DƸXiGI/mm=i;.#ZUTJfVQF' u[<46|vg[jV\& =ғG~. /zW!KM" st5-VrJ0i-!w2+QPw] >S`* һGpQCNj;VgA' kMJ~,zԯz%V{Og8=u70ώ5n09>LіwH:!2ySza>7|h8*rpMF~_bxi0tw]F`a:bOnꈱXCl#KjsM@X7&38msH `xkCX25O~`P[H$Bj!z9<d(3+J$u!Mv"H@'S\ .SA G=K~&C7\oЧŮB* [ @IDAT+Oa1G_Ӫi΂{8{ )!"ǒF qy袜xLB LZcB"" I=m;$\7F|e G/×+TсPwL9]G:Gazg"k@F>*ZZn!ś)"@]V-my {6̥VGψ8OݭǾFhS| TW*b Nϗ Jlb;8S6-/yV-Zf [l [[zcKx^'kG0pzy9 &kr9iqB: L[)< Z-Bڴ8h 6zE!#ꃟdI Hc$Ñ6B/:.F]n+_ ʆWz0 ~.yqhdf X@ymD7tx4 Cݢ=TREfc|x<2y@FEŕ~$Z 8:([mBLmKpi:> d{7c'ѿm~/9ϘBKrp7{,WE;: ;S[s$4 ɜl $i|~W _ Wz7Nf2j'Vj+/ bx]gGzCqY0Jp }GƊ[j먷xbI`uU9Fłi Fbg8=pȅz:s'/^,Rt 1Ⱥ1Q k#<O:vAjp@+^VZ cjF,2f dkj8=+f #})˶؃i_᝞xsz 9zpc"?Ơ\}no-⬀ 0zt/X0Y z [Yx'M~T怯Ad:0lQ& n5`(@dOٝ 7nW%~$+0\ӟSM/ӱ@ڌ/Ś&g|aQ |ϐRH(/N2EhRpF7^ ->( ʠ|5TL$8z=I4PXMN)r&6C"槳ςYc fAGI#v U\.%X &ŪIjPP1!HJ.FșЁ FbۗOFD/˿-"L$nQ@~}n]_k|/X7G9/G}|c|P Ƚf5%9ΜW+Ƶ{ate@ѻ@^Chq4B4Dks**=&1#M53v&7p|څ_qʹS͊98"ۀ/:wl9{VlݽW, F8'I uwkdwF ZŬԏϝ ;1?nM OY0C\ Xgz6fi6-0BgG1wM91dJN?-)WT_ʘ:V26X..U|m؂:9kqS͏dƒl ]=%# n:6*xb2 > C#ƃ 6 $$(:lVR)Ƌ٩ *\ܒ4u"'0qYl9gTWE & +>LLEDž@K@"f mR->DZ}(9H\ l;pC(W_@<#/GF,TU~I =F d ݁w]0\q4hCozl.jg y$yĕZ0㢿ќ UqfaMn99P [3?ں-RwJ[mq${5{.*&i,;|/ Ai&Fgwnk kʋ] V"9&c%RL:L9BrI(Xd!NU\(kiF.d 1G7 ۣ+TStQU 6(7hTV#b&:u_GaFc9tg E2I*>}~$,|Qiط섓%Li ¹ִ@rQ!X_\? P ŒѿPmGp*#QƯwczq-C[yz*w.9u>vMEKï1-#5í=(/\Kљ;?w]*Yb)݃/ٟgw/KxK&'MN=|4\5=.-v$~0ocaVvT(U'zQ*u؊hP$_HRyGY|gv/Xt0_Iu>q^J,Ġ ]ҝst _GF0zG]Ar`!hQZ~Qh{hD'¥O"-`$Ѡ!l[<O/ w/ѩ,9vdˢWE*\\^>_nG3ڱ6`t%6=]R8>{\]ĩ4C|u5Fp^4:p)sMC#r8 [Ś SrZUxG~tz-&f|2 x1eb;-agVCxw|6*O10v$ĂG9 $>֕c:G{4HMk@bO# p) ܘQ_RyK.pƔ&Ý lGe3Q ` G pNnzptD.^%"t3nih*3++3m~gFUMWQeFkn:/ cjrijys@fC7()aO ͜~c}68XDŽ 5d&T[ah@ LzL4q:@Fbڌ|L,+HfbIm(foA#۬,0e#10+j}E< %Sa|'ur:j̧,'`Rc -ܱ7,*:*`b d&MQ0 _PU+zL<fJՊaȉ$DW_)#*iԫF=%O*F]]O)cBS<̅s %v{+%~FTh[w1bFSULlo+mBm vHn)gg[?Zs`pؘu٠ =^4 R1 \~?xߢ^ zrOa]f쇍U}r){|,+ G p\%`| ~[t^3R#?3G#p~F+ [ L Ķq8 `'3+GZ|dxp^XO@OoYv=N'.U't`{8W|nP#8@2]aa4 Dp=mX+YC$@RA!J/O\Vso@ot`u {rEbo,|/ c(>TNFsX' zh,=Sn w]' `!R0,̯0 pݯ ^eV EM0DaX1nؘEBW3+Ψo4kDKh# jwSL%/aX"x{? !`'9߀ji8~8Myd8zJˋv]vhD:ٻ@ WΟS8wp0/ x0QO2>^8tQ5d9ϭC^|t`{: Ƃj*RBbݔ. -Pl(krL1} (4-n^%]i5>!,Gin;H^S(U2{u;SØv}-hu3uݪ!Og>}*n𵊡\e+n^̘pBq'?Ru&OVx+:6sE* &c ϰ헲) G41z>rLR'`!~Z9xj!i rT}ɰeҴzg!~ƫ7}hm ҌXo;Iz貺@KKtHWw"G>Z ;tv!#V $.;/,L z$Ȉl ,C@RqO%fQ7nQq4^'wۘ/_$@B}]8]V p[|GO@F|O6 oAJC뻧g(~EkaK]nTI Y\Lȳ>|@o׿/j6qg3ˆMG Kq ^+:1{&;utwt* 6E^9(/UaXūu K%-'éax$aD" BIuv@Peq! u#Yy{ 0v8Q _L›qHG ϣHI_Vf„Egp+X?QXƙK9i3%5iO:Uc9gTSl񗨻g&loX6^l*<LG<嫊 w\bY R=""N| w /:Dcl-~O/awy "“8}NV(ty 3;`C_`ln3-N .$U90N3iGF@SPXӼ o42\Ӟ[ew.wÙ?zU{ )kb_͕2R=o!1!@Jb G+ԒSqiա ٨P+`꧕N  n*rnn=eIѽ^^ kUWs_u.>-/2  4ePA BHF-JHqa8f+15 UF[$1_WN(+{X9EXۮszU˕/TLsU[$īg *Ycu`J _p)YiKVM9\zTUe5И$Y"H og[_aHx.S׫ޗIh!C?DJk2]39yTx & ;Dtcg {cO@8Ej B2V_P'3aTR}m$`` ="2c 2F0ɔ$,r\,i>GH(m;;&P|(S·87ukvIW EsN- y}$CR Dj FW}l_U#R'+D^I厪 J%/:-#Rbijv \/5=չm+~{Zvo?^GJg"Yxi{$_ʄtm<D):(sD ':l0?98c5NY:L@&0B=gIf`]u(]t¹X[7h% &XƵj<7jvzKo;HW7`މt`މxğzK}HA 6wjZ=o8FA#"]v%(ˎpA}XPniN6:U"IQhGlΗBdt'q*vW9*_DWUk;[s/M{Si+ +Z| mOm+qJ q/Ra($HUbC҄M; d%3:O9tZ":ewu-A\]/ J晃*Ý9=~sV dZ^sltҵX'V, 3:S` 9~<^e^!`L™<#Ur$<9aUx̻2%8$}t俌5/~b`hz3J@_\M9*zFg=qӨ[aN%Nes B9SJOh`"Da@`%O9LHL\``%Hp&II.M7==-}}~|w5_A 808z1g/"!u&.PApT=HB @ď \;Dj&tjKVݒJ{Y ~jIRUU{W~R3(wԲ@k)wCOT;.m&4SZ^1=ֱ9R"W`5ssR̃3fvPl#dH 3ɨbӶMF}f9JO ѻ$2շ} ~ďcڴQ"Ws)R9%?R8tA95ia2/SF+Aэz;dL6h(&/ز}K0 T?A (rm.{:b&i~N n9wy3]^BB f[ֆhVK >MlV?dl= 3 `]a@jxT4"Cxm5gw`7-6'AEԔfE\)bO&NZa}>{RX--^&|u` $HuH|n}l^szR8()C=),A!jMudn)ă 9cvq?A.Z ۥt}PdCFP.'^AaI@l#eөBh>r99I9 <*iM285d`W3 0s! yHYf$nxYTcoD*=/*˥R*sy{݀K;0ZOј pi"?F}w]kړ5lބh9A8f!qЩWO߼C~?|?uEp{  ͸]'|<kY8O -04 @$-˪3YKy9OVY ԗ Km`iO EQr^{g@/ԎdI]iQ=UE#X.y5`ت2nM53[Kc2I$8|.b$rX1յßYhM9qn].Z$1RZqϖQ-Na7TFP@=>wH\mX/8dHd5-6^:a4܋[&߲sSMzyT;GSs#aN_`yUݔxl0F{p dc"yvlL} stYѯejvryW 9d`MkuƺQ @_ U%>xHCgs{(~3|XS2ZO>vw(xB;&^wJCqt>B,Y!,Z-ޢ0t"vys 򑽨*bYɞqJ'3iq](.e-yl}pʘ&ViW$IT"u'7yeb/5 :Ҥ8Ä8$cK4sc1F]j8=k\D!?7ȱ#Ak5''y.+-YZڹ#s O^/qOޟ9mK7g%z=x%(p¬T>jqǮ31O; W0j4?[ YX\5~3<4x@9 Mva0!(eN/L<^ #oC}ra:<-IJ1#Kqv̈́Q =O vy~f^/[ݕ%N͋؉/ C&N@ Y 80\d;Vq;a|ϘK%6: 5kUGNv {XhMFBT Zu<3-9#_Td Թw|K@ݶ6bjc@?0LX#-Qgڸyg #;6̀Bx@_. ;l-IlR6+Xj^&Q>o/R*|Se)@MК~ǿOS{PYo~5QN[ mPhOF ;tO`h$H<ېyՇ⪇!>KF(GP3, ^ G8幩n`Vb>$"=<%.'櫳a\“IfլxZ7J#$s团PgZ@C)Z>H iH?W_عQ E%^u4ch= `摔0Dk @_ 2A^0|=Y6i(Ҫ8B{~s?̀x<(Mu"m]!mo*i)*s@,$CIwr~ǜ WenBW0|BAjSR uy{~e__Բx[%؏٘HK?D{B/N^r?_  )ͧǁ'X>~Lۢ2jrJ:|q}N۬@%K/wMh8mK|[\? !†6ʦꍗdT寈kq{ƶO@WaQC!`𠚠\xHjO mHPFJPXh~Ƃ&,mOogI. MMlkѰ+t(Gz:6rDM sΓT򜦸E'APUßOl!f0}3 ǿz|j?!~cn@Am`f{{6vl; '>H+e *PXU|%s2\RP:a:2xW}g`O= ]k?k9ԥ Cƍ$DZub*ՊO%zK[$fvW$N4Z=^r6@2H3#t8ƍycp1nq s5X2v'Y @t!1A%^;/gS||7 )b|| !{O \#>ǠB>s$ʀLrQ!)]ha0oj{yR ~>jIt. 6L҆-s[Bn?Ym511,a2q1*J0UeIah -;JhiD^ƿr}pe^T癿iY0?7>CaKͽyS(SF߄5 &@] h2<8мe@y1VisM;4/ۍT~B:A+/{,4頤m;қmcg@[Xs03 -8vfMOph87U1(_64@i)1PuIƁ tIP/bnҘ _s6c@fcDn|3 =- -l~|E%bH3nZ `!O@)($-v;F˧&D0f@& RYe|D@8w ض ܒ<_ dwg%yqi:0os8@n΀VY%M}lw3T`?%H~ v$T?>ǑA-*qg KpI6glϭ ?M͕/~Wo]CQE$&ƒ ; \u'ʹW.}ȹyTrv/e@;'{ͻ͞ =ao'Wv^:"L&gWwO rJѵs%aO~N4ha'񇙣],&1?'s<5Dh'>zxraZ.Ni7KC;8JCQb鮄> NsD5+x !uOd\N'|}eO~1TZׇp_ .b&b0Xш6B ݰdbxӖ1\bIXlA<4!wק@@&5Nb}u`na˻|~x@|ÑzTR]^g_ Wp5 >(Πz& B D( c#*,WHuz xo(D@U=VzR\?TU9:k34-{H\)5X3_Nk@-/dN*"iMc Ʊ;Έ )ΚNwSH;"){sn}SM׾uy.ꄐpkןnTNu}-/W%W`)+ڸ[ueL/$,%e5NH!hi"ՃHƖ:)b[~(})!zD9yJ;PJmh$pT/(䞀 AܺxkP*Y fahO-z 8£-^hW (m;i \d۱.%޴2a\t{ KmjE5먈1 `a2w!̐݋Hr*~Wr^JFQF :$2?:&q\,aFh= z 8g,m0#* q`e(\"F0G;:s~#byZ<$ ۮV b`0ԌSh[vmysxT[v$L0!~p 3˒7w+_!9/(F)^zN`zu_ ;Sm&8- l#ru\c~8?|έH]x\FD;g}P'?=]Cus(r b/95oI`{XkyĐDTJ@{+d$b uKʔc'0>z߱.?l`ZC-m`JBSCس.D vYR'1vc b/|gvR\FnÔhXcxFH9e1 t-}9)t;B8̅Wz}{GtIadxG, ti=sR`;17m52$f\/q?; n6n=(bPIj3bx:0oxgDPόr[UL'r4t^KPȸ' c~gEOm Ԡ{vu D+xD ΡDV59)qJu*H_*5Xd6+Di֫2CfWpxG}Sȱ%c SBۮ]/1k%9&>=5[^ǵ'w*ve>DudzK|6|mW#չ `?;T+ MesFT%>DfP_F-D^,'wF9e?yָH7r"M ώsp>U;~mM6 c"`:xH9Uz_>o7vhX;gӣ)ω*hO"PoaܗǤ63l?jTNaɢsj^YqT9q<^a/YH,e|>=_'j&Ns*ӊ̽ )ldM@J_)S?=g@dPQ M}H} %0;ZgRk3hD% $tG+eG+@H쌯l$*T:f,Upa*0傓c`"[qsCg(EP39  g U68gY 9DBlwX]-1q._#9x+?28%:Pmtjhg3!9Jw psCLkƺ0φkKf%maqVCTy{V0}'^h<8"'@#/ YpA3G}y7}WmKSH7TKhGs2uegDy-i;q7`@58 Te^@xd5@FQ֫>NeXN+ey[ [(%!_zNoluO ͺ(XBCᡄ$%Eļ5P8ˆEt~8+B?UVRJ/UJ=T`SWIcRM1caSkr9SN^?<_&GH1N]rH0 އ"=݇ *S}ƛaql O"^s0UV V=>A )ߦ=\ޖw1l E`[}|S?G~T kfyҒ*8R(ߪ̍2Ko N'M)+y  i%i1d2oq=Z;{4aD(vcTZv;S=oE:0oc88uX!Q ]Mr׍G6А蛽6+&Rg,s*r vrC9`' j9.4ܪR<͒DeUU$T=TٯdH :4NI8 ݶyw,9 ;<23R/!p7 )CXa߲{7=?F'Jl:qv{1pI[crтS5HHJ؞K 'Rٮd\ЛE _| ’ w ryUђ{ͪ~Ez,R7ߓsSTɁB75َ e[[֠Co@ufk}I|:JJH jV% 1VbkCm?|EIJ|.X&54OXAyμ2̙ևiyQgZff`0+Ͷ5L~P ~ 6V▙1?'M |aD5"X}jU|:tdw;oq9f)r( ynDLtSR_HJr\5iQ+ )WdB-4}ہ\EiU@)˹xh̋`+'gCKwYM6'8OUC77rzwbezGv-*1 Z(]M  *[G;|b;*=2M_]u4g stB̏!3V$1밶B̆'@Ûj{M,ZKg7qq#&`܏"r1 \]F[9sDԡLx|ǪF7{v@ Mލu 2cjښ)|q*u?@se);.Ϯ7w/=`ßD{4Z. a t/ڰ<@BݰpƮc3P\?m&QKg0S!2۰w@ YݼC*J!0>ZpNA'TB-Ec\%+.ũuB9{lT}ɽ׻<)BbBt_44t: ̙(6bi9}_ӵoHw%H!Cjv-;if[?$V U:ޭ}/RBl+2UC{2_K!DyZBt!opnx  ^&0li 0Cʝ 5%c:6.e)d鿜rZȥ}S&`|QbUυRwXaP^2za?Q.,c]@8O0 1s6FX@?amz5T$)nmBmNl;B @1>=/?nNߎLt 3 !z0T$BSMK%Ձb$gZm:흳Wy 6ϑ%^7cśJ`eD;B|`ܡ] "qK _QƓZ p_xdtr!V?VF࠿ ('uO !3T3)>^PN||2(07܁?G>A//gubM}] /1{R(NT,^M:XC .P}4FR|r3/e&9aB\)-o0d|\іt?qF !';R*>R@x*_E \@0Y*:sb PAnsD7^"itCp 3 .==[h6uO<\;HD2F `ܗM[Qpn499Kcq6 Ò!Ax tGW#\a_ FD~ sm~0'=IW)LJk(6v?))yNrYmHbCMG!!@r$NK?e| m9\/\~xf ܝ_.ρÔ1_>Wc#_R`uWj&fqSg}89EIo@P dK x! PfE@h):(&](Ȏz+ J&.zv$xۭڮ~me@$/QA7ùL)FBi-vW9U]ރBD@<'1z%/%DĝfH'HMМD7P$z+FМ:I7o2f8)s]: d 8sVݲ]_CxI/T>jA pwZȒEv4 tthh8 1@e8),ota"? A'$G?9UR\_/udt$6 Oy~p̘pmF05Cyx6TZhMdNűGoaD2ȶ :qMPUla UrR]rS=a$*;4*${T[=k|g]HR% Zw{C.9'ue`]s)tFpָ c VAQP+1 ݈]=U.Mued%yYlz;R}gjg4}K ?@`ΠoJ}%p?Q F-`]>ektN233Úd=L VPz]7Ii{ClR={@\ä1I%PK.[\(YZhO0e{ybtQ~%V+iTMBG&Z&QN^ijQ`D\CWΡ~|{=!ч}sN [m~\HrO?3 *ìYA\b@ L7ޠx7N1L4 :@-?X̖MUyAȉx& [_@%' I4#LsWiKA`yC Tp96[LvAf\R5[GCl zUZXmB6HU ' \=\=UƔbc LcKX68;BpݭϸN F/{H'$8| ^`W *Ȑի8*y Ҫ>Z=4Xbcɞ Ȝx58R% C`v(co^t`T9rY9a]ݖW? 4脵1-FCb61Ib^AZ,]1_)_WF%ƣi5gp$1sɜiЁq9[6WK3]Є _DV뎺Ng `OOm@;<0=|g^Cj㽛?az5B9 p&Hg}LP6Mqh9C/>- 'BንP&':)֬ Rq$rqx'0+@ eJ HS+v%[z}"؇~|y8z(SWh_׆4l]dN4U|kČGIIRdDBEbݙtOw?f7r 8l"y"ѕTjN:( \EA.usMey̍7;r<#шiXS&C"Z}> YP1ߎQz= HjP xYuƒ ƈ+SfcȰ\}h k;xހ:Nȥ"c4H!ge⌥ټ`isȯ Sv iے =ǮE$}6C^]-|L~IM@$hIBw쳽8c`k 6K8qI{C #t!}` wNOhB |&~)lt|1=aC=ŷèjN ? j/s|yx 7mT 󻛌1ϓOxFWpGvd$FA|4M<`sΚn׬` W ^NxV 1MMSAYekCGg@Tųgϲwtmu&[֋1l<B$ )eGh(/$b U꠮$!0%4$, UPEe%qcHKGtOL!r GC=}D$$B1C˙jHNY1Sex_L\_@~Dbe备 Z6dOMq\ c;9pyi=s@ɵa~o9ٻw~nC#!igAd>^XFCn;HB *(ɗ>S8|uz92^qSs7&bl3i'3GOM}>^V #*Co4D7Sn>ir]Aq 3Tԯ)g08# ydtNm.Cs4]8 p:0o?2D<ƶ @iuS=W،B&n`[%y@Q87iAUn7YB9/pRɫcoKr̉R%ͅ#JR:IUI1 1$j| vy@L` +l:8rR"Q]OX0 -rxz=p T=6Ѻ zAqxC8AŸ=_yЈ41 x͡ 8NG gpIGBfK";3|oڲ |ObT)W;>ְm&:pD9m42$Dlq#saO9OaިmxHDl].f/e'$;,-j1>3hDP8Fꟕ0tXM;cC;H'Nby v&'nD^o=?0_|z;W5ن̅GnJ‰owP!M-V? 6S'w@AUbUjIMEQ6)wZ"Wj6NY8md/V /6({?B=*WC9\vag+ [U܂Oй3 V]і#uck"  A$\@UFiŌ H8%lYϹR1Sd ưaOyۂqQhX3=K!^xKī;q>|FfsY,K# we:}2,g30){p7 ,Zl=8䁳f}^^L N >WB^%Eku|o|߾}G5w#|;7TllbQw  p RdQHY11.H/? 3Pr%84HOC5, "C">H 1zlQ]Mjsz,:Vǐ\/ .DsO _?7'=¾6{I,| "rޣaa ! na.KH'.S @M5ONVZ]Mo_`c& =U aNdP.Y{:x͏O,@ rHfZ֩m0B7c8`:&0W# >/aӞm?HNsa4h s# گ[/> aPCol1 =af Oa*Q/7?~ϓgWpiKfπ+>vd$* "v_G?ɿd.*(s^//~ | |02Uԩ;Ion[,5e Hsa5} $ #ǦZ%|˗Lşvay;i"FbPmr -yŤ9"ò n#wWo ć-[;GCq~!  \k"` 8q`|*FMThrq ݛ@a/a2$m  B`w';Sy9ӃϬ&•BOfH@:;rϹYf<Hɪ⬇}| ;eQU., >urT  Cީ+ /tiOJ2_yoi|W^r;߼N@۱z.Wlot`:>? YqZp3TX7P/e0pl $IMP?HTqC*2>•GVB2 U bB0,ǽ~ӆT\X|yr7e6?`}0qBtW8k]U4\Ԇ2'7| iy2̨CvS mmd(7/iw6xkҁxk Q3^p^ ΉCԄ\3([G3 y>ŊIC0̘b vIeHο>j]Wi/`G_۟ArUo8bB򿹝6_,0Ÿ-0$ `Sy[ַ5va'~MmM,?@j]b Ԑ3,ȹe)DV:KnHe (v{=h>q&lm |-QR~  );Zե{_c;..004Zچ"RxWxq1cJNnz Xg2֨C+@c|P.M}+kuU߅֑3ԇ>n{qv"u|šr(ڭ6o$R b #޽6>7lI %& y |''&@r7 )> 4T;.Yn|$tԤX3ϢqIΰCNsF±2KnƇs4α',}pnt\QӉ΅yγU2j#duva!nZO[}kݾذsa@*Ňl?4sJӹ rN4h*$ͧ,FNm%ԯʗa u>0"O ymb Ƌ!(Q`"1A8>UXZ8"x}+sch1}0Bؚ8P*:Ik4.uS_g] Xa8[|ܹv$*ILM(g~KIotl+>$jI 0ҽ5z##yphw|V!<Y_Sf o5MR`Yyo!7 b_-my 1|oE:0oc8q|D2nȶtA->3Ik^ |EwP>) 4@3D޻HD@Z!ΐ<5%4A.<`V@{fO^`W\gӺ=~/GgQźdzf;_w6?۸de9k8% 4o[ry/5V̓pv*2 ׃ ܏D;_} F,w,a\+TX$aٲDv)c5N c~Oy:鎊$AD]!Ǯ]ƥ_-[ T8VҎ5 sf `{ -4*@Et|}lj(PeͺS9R {$5|˻=a|>0N!f0 @kP9JV\{z힁x[G|Ơ)w=|I3@t]xR4LHH{ `O54og0 !^ 0rm.C햳Y3}^_hsm,\=[n<>f~۱nw0p[wElPV$cVI/6 gi!EnHYg295NPIKN?>ZU} :CIe~xr(|8š9'6iְ+[`9A~ 9vz'c<%\V_¥cCy6tN\2<3 C8={$:}!l)R34 ~k,朼F9=NdN|g8 U*NHthiarlx4\f[gt17@IDATxuX>c-,&V| 4ˎBSsc-@sœy NxJ^ ̦<8Hٸ1? 7js {_ auSG)p_-o1,[c}Cf' _w:h?woD.jM?~wω:Au8-7`;*I + 8M#ǫv⩄NdfE`AKƔzŘJAr="Q5QɂE8W([?Rn)/ a|\-|x`yK5hŋk{> F%IFs8\I+xDez[$b"tw?.0i@Ճ"^uI!UHE.Ix,eڦMYAAq6oηWpg5H c:D Q`nv >*m)C9E. <%1бO= IUt~,CaHeWF4I`:<ȅD9nV'$;4ν} 8+`e vQZ>J.0GLci^)%~_h\~|>n?0(2ҾҾ{Qp+HRA nE X X1;tց%Bڏg m[f־+[waT!GoA:0oC8p? Fа{o%yŖ[U5z#AIIejF/g~st1Ǵf87M4j=c, hD|7bo c tݻmZ_f~Ht~SLB=ZpYAxD sk7QocW,p - S: 1Z֜C8G󲰼YR1n7z/P$ʢj?"hMZBƳDb㘇AjXfUyOĠ!$Rdp+Fn?n坩9w ys{8ϵCU,.ui0Ӎn=KXuQpG&P~ƓthmU t?><VҲFaƆ_``oP P\w? J~"vN3H&]~ܒJBWMs5-U-˒˯ݖ% |%w.z?*v3kmm|z|deEN]K~ZDsjǞo=_ǪZ~4)$Ԯmã0]ҀfL]RgێF;WHkQw@&Gi>D1 c aJҳ:N U-ܑepp{ X1t&qdeC8zR7ns7{Q\bE Z%mPjS)[2 4 s`f=BAz]-#LU(1γńV|Z乡QxĹ~ۼELNļ|a!X3*Y#aM9{v)2&AĽx(t;Αh5ފ ѵT}AIsHƋ2Ʈ1.#|]s(x,fE^p-WcJۉ%`*v%u#i=IiMp;8p6N5w#p\V5gj0 @|8~錄ԵvlRRM^Ծ>_|NQQ(8ݗXStTd͋'O)I7&zJ=dOģfp>(`#^.FԿY5 s|~oG$E16u p-U! ѣ7-bnb_r]H8[T6a<&}Wڽ#Ci 1}5xHV+_cXg+߾F5W`g{G곌$_]ݾGs s~E #y// )zUief>X7lj 23n?VjfNk `b?%`i%sۋB<ǑgB[''a% ȷPr. L9~ f6<.rS1y=61j}z7VsS8;90P`Sc\*7\wyUxvTCipnY 9hlH"!#1mp~/_iןdB8ʬX82ڀP; g)/e/l[xt+ncf>յ2MЎ|ls Jհ6 qc;s MZ,v`$eZ4ReZ `S-if*'U ãbOm/sK%X!xِ7otPṮ-C׾YOQ8_}.Is{X~-g+Þ~iB8NRr@u&Aዸ\:ާ[K*UM|Q',PzX%o.^-)MIKJ$MC{g%n)Hv[ڴ>Τ"c[@!T%  $BGk8YE,*9Yl,oɁa};"8Ǡh=D:oVHK?ߵ%P!+Böd~-x'Ho5.-EI !F1tD{]õGd&z7d[0|B8 {5!#,?aL'CdR|բlj~-c@EQτho2tQZ,17 |s;}ev}GEyX27nG7\Ixm&-,I૓@m!| я~tSM&5qN~ngo#>FP'yeW~}} !EoV|䬺ru;26yV[~Aux?ok_WǏo~ilrOX3=%7)zOeO (w0#ieZ*6 ǀG"C*xhЯ^x=ЉRc{` 9:^7:K6k֑ ȆGك>n P,3@zyqE*!u}+M3/_^2cESۤnH2d/G\_)쑲_^E2(|Gf!^~8l enٖw:;IxBZC=H"a[W= uU4stZRtX=G M?PdmM+{sia_p<}U3̪aq6ږ3nخ'qT~Wb絗O^ ZK;U1(105m`7,,7&<}YM#=Q>`6us otes01=WֻD-0BpOxo@GHj΢ @=џ* CĜpaw7zdn1}YP6X&B ܾ)xks4^%Ih+=8CqF \0&09YI#Ji%{_g;bN($xiqtآ a=zkxqr"Z ~]D *_hc30WBvih'WWS[b%^xqcٟf7$-'I딀JCEx߿VvBNBx(wCȶiSe4RVߴK^An8;e,ՀZcRw7bK 76E& |/9ȃ]bM3v#^YT/2cDţ\@rhۗ^P% ~4 /moWxp 6J _Azj|~px Brya6 cxئiutu (wAu9G|#\ƕ๜ƈwN18lpx.G*a2 XXƤA h]`ȭſrI꠹ (NNGC+ty#&{U6=V?ۻג}T΢?s`IVAJ/uxUnx,(#aH{xInəfB?~cߒߣ$\{;ux\ݪ.| *%0y9gvCo7˲2 g]߽8'@ 뚿˿wCTh) Y^'>sf (&gde/_brIz^{Ow9q /E7@  )`&"#711CUjw8HÜT9-k8z195 *ާNuZ=-k@̶DLost^)n\|&}ÈK\DJ+ˀ{G{r::bȈk&4\׼h9 dz0 !Gi{Fk+uWᰊaxpuMq%8w8[o zP_zAQ'k ϿvT( |D^'_ux.5$ K6|W M |tU*~n;r&Sv)_\o6g?wwEI~ ?BC'36ltnoOw 0vv//V)t7Pӵl8.!e`5&`Az/xC8;!Q@1P2eCΊ,ًDz@Ɓz&xT-Nh ;`0 g[[nԪFev_ZTٻ3ڠYц8CC]s CMVsR%zI^!K8SZxXU,,;j #k0!Wc=ۿWzKeLRMy ̦Bk%)7|.xƕQG7~˟zS,%zҲl CƏcp#|GU6cm_t?A.A=~O P:ߟq%"ZXZq`-VZSEm/EnǂUλ#cNc1DX9{1xRRm)[Y(lJZ-S?QLXΏt?F&-D9X vP_"筰#/ >sQK[0M! C$sp6&A@,03V`q(x '`, X7@P8%X¶0':?(,O&!W(9{NLĿ 1w0׆CEq?[7;DjRI 4 ӲceVhÙtXoo=LW$I-ܾ6o_ߏ6;gϞX)TοpW Xm7 &tVt;3)?ige"({5!N|&H8npr=oA pBn{T2-nJZ(cp,b\Bt.+y~:^BAy&[c cx;}+'nF^p=0šrJ#5I;&fF'yƸ!yBp,|PB0ί'`.k|A/e_׀;IzU0Z2(;m+Lcͦ^,/`C:.ݦ)/q1uw5uim+9&%}Z Og( ;/ὣ0|샯s@+9ifݶjrB"`L*m$ְFP}寕+?0rμf xrY/1h] 0H̃µNښ&/n ?8-?z@Vqƴ8t[.hE(CCLꦏ-Mr΍d*$3ڣu+(J ϜGxd;0XhtK,.?^oC[_z\Cs#+Z,Y#2HWh+- SpU\@u#Y)$=]aFlܹ% $ $ $p*+V jG!jSl` G0 R/x樾!ȁ}6X*q9.c'^T( (9+ aM@O]2Ճu@])׎FlIx#nc$$W-Ka!CYUźk?YںfB~2Pa8OՇ4jJ*^ꮖf;-L3/G( `[PCcknalp;EġxC +M@wHtd{jUQ$Ǐ9Oa`>?xxe^#3xl0)(v\b1A#H($Ri:5s𕥊%5oUlːq§t//\X oбY? R=n8{Y >bUòjxQ3]L@gI-?<~y_R'y kOn+GI:`@!((''\xJڌ(à`>𑗢9u 5! 64 ;Q=Y@[18(A+%|} ~IEa<=!ϟ:_˶YAX.Q~uOyboXp<-jovj9W$I I I3$G֤ ^;gNu}k^Q v a j<2ΫA+h@]Z[\B!fzX˒bQ 0 tS aEY\v~) Cv٘yT*uV*/%8)A-#aj9-ѮX9TrX @@"a"a[ +W}pҡC2${q2Wc>X HSn@d={'!?ͧUhW#ykѳA_!mrNն;5KVq[R޸[.(I I%6$ 4:XT)rikcĉMVȏAk@cx׋gQ {#rA Th|M=ơbm! %[o]3kP. 8.6}!ټ{c *nܱLUG@m+ P@YsSw|Pcxely+*2o!sO~+#;n~8$'[3LHm2(7P$Glo7ަ+KH Q'"ր_49_?wkξNЖ)?Ima |S Vjo+ ?؜~?j /' **95~/t=!P  Fgev}?Ȟ]Ҟ> xp@͂-"V ڹoŋ(>/r YEIĻhJר{]럑oEAI*x_OBP!a?DN?}6rqӓºmʋ|q.Pۿ^j9H%.@VPI-)o]Mה$$].@9Q#x<]'G*EL0Z6c)Y( p ȹNT.kA' xsZpŕE沞@Aq+@4'z\/dO6f-&p z'vsW;8lp`? xobD1q#Q8h4"2`7pPTVm&@9% f߻񘠔QZp  䠒Eq܄0)5ZͤY 7\ْ <ʯ8 [XG_}L~㷤8]`@+JnNw?|4,qSvyf asBSOzN3Z܅@\ ,??GNqNO =NHjQ{/h@thRdl -)3ʞ}iX{'VٜC-ٯ_d7uY4p~EPPNh죕^^[6e=yg$O:5i-!],Jp l_`;? JPzv$ ;*uņxKiC/{pպD!M ۭaoA8_%p>;3 [O)w9[ !2ufh7+.ak=kx/rQ?mg@ }"q#0<%Z%U25ɝTTR7}VO?$(duX.bIEc0=x[%[tӥ& $ |! tհLݡ|9[H z`N{>&fRh̼&-pz$UsqM=N4}FG3E~vӜwMp GJV`b 1 @?%  0H5$.[.#-OP_?CYՏ҂+>7xϚhtP'9<#x"mddp:Ec'G-]s^O: '({ _dE*u 8Z6A |A}Cھ>gjeS%j~K@b,aC73:W`r0ŀʁsAs l L>bTUxZXg(\(`PEFxvE/W];FsX(6izb6qt ]s7o7~K & $ % `]~g׻%|E0rm2]QDq\;M^@ nMlvm* n8kc 氹*#8Q9x~w]cp O I[Q>z׋P269$qgcS#pz,@dS{T TDΏ`a,9v*Tk4uv8GbKm}}ڐ@R I I I%nTmG#u˦R\f1u >{wwx~PHt-u,,rkVn1Ga z78i+؍X}( A!< .?d>r ƿDA}L 5ro ؏J*7zs_HB?OZ[+0EUsH7m/PoDp}ڐ@R I I I$/7aWU fwCjzem3r5k1+@ vL,eYsy7ϴЯ}T'潀N+au бI6y<9A xǫETAqv яs=X1Xkt#1L?ʋ#fuX]&od^{+YQ@8v)0͏_.L'">0\5~d]4#8n*/ ml7%O9p6PtYo{>vG5L#=MHKn9:N{,$ĥWpk!n-_-r?bo:WeU,p7毃vcjLۯBz$$$'% XJv?uxZ5հ*`y<)[sF$rޗ&;$A=0œm-SfR'A-z qt#NɀD >`@Vѕ< zV6^=#_,߃Y uYkF9@Ray_?\AIz80uʘdPV`,QP0jǼwFbSJeTSxWi@RnE$ $ $ |͸oލ|SE7yQbWN@7 |Qp^|L+ِ 96 )1v4܀^Qx{laJI|޿gƎ`fpL{A\8"a½;Wi~5X/X=#.*s Xb b?]tjNbѮ #J)esFb~i$%F@@+I❸ܴ Y%'lkw @e/t7Uo_ט@[Vwu8nVNE{*=Ә!L+'@Z4{/zU!^#B hD(k''%,~ȂM̟TGctGK2U65 #Kqʦ1%Qw!]I%v`Y.zoDӟz⣋H '^& $ |{%t$)j}wݠƴNL%z{BӮZu)!W Z ~v{ Gzc~8+ÓAhT;p q7[ pc}'`[y@Y,;6g{_D :Ś K3/.FC9d&2L(,# mp .|^{p zR`\5]#%΁,zVUH7?gRIc1O_VoIVtII=A{{\׻Ń`9#|NF[pg绲0cq¥3d5V~+=(vӚ0i H?:# JRc􄫟TUÃa(?\y` r슲{ N ۷8:Lt,9 U`Mu=*sc#**ĈғqNmkȌ t Fy1%caa^l6׳|3["ηwlI"J& $ $ ܑ0kDTVjwm>kAGlo=(+=8 -\댐=/? ImF}7+@#p/PZ84mU?Hx, dqEǭ?e0xq!ď ?Y݆ˢmҜv szͺfa:%WT:,I I Is$aq@aSD&5z-ڪSF l@qҕ@9+Tx.+w@ "2",jmWm{uk>z Bg0o``55%#& Yq(_׿֨jӗu֡wWKaA98@5ƴțEVTӮgu5)k*-쎲+OX m_@IJ& $ |$pW}|##OyOW ńϲ|Ϩp{ڌ ȇp`i]w*:|O >:} }=z 萶w{IDATe?nN@Es! *Xc1M-v+/Ogb~?xEgssYwї/!~AW9pm[( ,r}7ɂʭ8UGs|O߾oa[Ug`s0OR rI& $ $ |Q @jztϞ=PkLI՝Svz.*^R0<IG{ *l%a_!5@$=^b?u0kSsS/Xa؇`.-H&/1P^(ITdTnFfJdŽ+ j 4i͹yUaQ.˒pJ7 mg 0$$$N~kwӁ>wn9fuG@` F?,xp4b: Z'@NMXѐ:4)Hρ}\`G>_.Ռ*,l]\Rgref譨HEkjto?ID@KB6ipNW)KZ(6yއEK@R!!8Xwc`p:ƨ}o=׍MgW{?V{A_')1)>tC]% ßkp%}EcHs-uB)X-sM]&jvCu6lo?Ay2H E ><b6,v+@:F^qXVu'~M>.nwy\yZ"crW:iH Y:#I I IU$ HrL" 9V2F~t?" ,ځՐ1F7O|5PudoX0AM Bj1B_eB}·]V?"6Uv~9ufd \^dxB?0U($Evx~XbH*i~Y~o,mhr1_>w;}D$;elI2HHH jh&ɖ-z`Sݮ #~ Jz3j7&9Т;5ۆؼqG` m49{ A8>5!揋7` P΀?~kȈAQ?0(*"~54 Df;e /öZB[XՃQ/|Eӟ/AIHHHx t*W0O+;fAy6AQhp[{Zdu݇#?x[87&G9x?s\40b Sp>l.U(8. 9(,LgLw`ʁy$YhKϸ 8Ů̳r͊( מ|9H #4J@@x/[N@vmDŽ1IY$2 + yHW |BMC& $ $ |1@ rE}zt͇C [?O 5 2ڀnx02`Mǿƚ痟QGQ9X>to, 7+c o!"I j L@S}Gş/qj0XP5V Q-ť+@R"a>Gp8 @鉻&;;׿NFB] 6Z¾m`Z>Z տXJ4o,Q$>e \~K-QFdgzDݐpI |Y"]y}MU k4X7V@R*ɦq8Xh`{:?'yj fiZ r _!=Oqwgِ@0{hC@AC0_b)"B_Qg1OXnY ("v/GN3f5ȋ[q*1⌸ʫ bQ|߭.Twj I<,Qھ $Kb"I I IJkSx ҷr`-qN#q0:WTIA-u-qRbOR-竖a`1_p_@|Cq(xޘi:&n`A?2 z{C$3a'aCr;>_t P,Igp42xHM5r8#]lھ& $kt&I I Is$ЮV+Y,uwR\P~^Pp~?-0K_hQd3RZv P %@=xN wU4PihA_5A`&(lpCCJg(+3V qQ6Bx5rFGK=H^I==M$$$1 e˿ۿ=|o8a" b?Or0C`ᮧ Jz5:׈/prTer#応C㠰"QR8 ÑlɃmّ@_qSm!Ma?3HE"0o/gywcg<';$<_;UZi$$$Wŋ&{t /M#{0Y80o3=l3vVZ?\w xDP5O㊴Ↄ1򗣢ZUu[)x݃pBOS& $ $ L~p %pζ]X4>1w2z=p4_?kxk ^W </X]uɈd^RhAѢi7ΚCAI~!. m,OHH4 ol}';j _8 )5JS( "6 ww4 BEzwj@1"zz٨~]݌ ! ,!.˺^n|q['^lɉ2?p I I I_IܭxEvt+R<(淨ܿ rV2K<z־{6o>EAoaSP𧓯 Cٔ+fd4:~~_|O࿗IkHHHHJ/P41uM ]vN!9r0)wb`VyRwP!gZϛoR|o:%lN zuGɣG;<'Ok&f7$-'I I I3$n6z4_QXwU^9 5w7z ߿jA81/`1 FGl]tԖ8g9OQL(h׿H7ux;q^֐$$$9[N~wN;GJJpL!B!%*C PPJ*G^aǽnV>?ujȆ}8v`Yq9?Ge^P_EqrR`?)so/ɧyDit[N?=ze83 槚cC8xi:) P ;yGၺ.F=7pւ"Sr.x1솋6߮_?|wb =M -4_@@QԜ" 6mnapu`[~$'W<=0& ޣ0sFO`G@?wꂥ}̽jTM6~Yg~doIxPZ_@@K_ ?ݒK g`;[|S&`M>7Xϗ2/!H@S2g|#8%%B3[ٿ:)Fow/ ?^&ർ-iQIII-=x~ފl̫7Cl1]Y=R=ŝ_ v%%},_e$ɻf9~ωKZh:Cs5qWGG{{d}{>I vGz^A-} hoרC>ڔ:´Lʢ8"/p`aIA2 qSPڂY=j"e*h7Mݭf^c$+ܻ吤.w"#I I IK`'?ڎF[hx@ n}?@!*߳ 6? h!  ن P1Zr[W&=1%H }^Eo7|p Lk2kS`ݍ Ch $l~1@ tv~?+ A٭V9Λuw]{x_̽߳K7E7Nu& $ $ ?wɪ_ p'O;v}PZSqe^oiC\/>Ng]]ew< ?lϹ 'QR^;֓$$$o^ 8E׽[wϞ;nu2&VAv[H{e ͒@ |WZm@@gJ81[3-t]] KL.-l;gYf񡃛Ct III {>Xo9Pf !|cL`!"P;9 _AߠCRtR>a-?Q?>~Pc:sA!aH )ߐ$$$y|cYO A} |3[Zu@@!'/c i{@$4m@@@@}J Si$$$mON1?_7 $$$$$zJ )}IJHHHHJ%Ti$$$$$S) /iUIII_>|u!qOH{|6I I I I I>%~;I I I I I${|6I I I I I>%~;I I I I I${|6I I I I I>%~;I I I I I${|6I I I I I>%~;I I I I I${|6I I I I I>%~;I I I I I${|6I I I I I>%~;I I I I I${|6I I I I I>%~;I I I I I${|6I I I I I>%~;I I I I I${|6I I I I I>%~;I I I I I${|6I I I I I>%~;I I I I I${|6I I I I I>%~;I I I I I${|6I I I I I>%h= fIENDB`ic12͉PNG  IHDR@@iq$iCCPICC Profile8UoT>oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqxl+ pHYs%%IR$GIDATxZ t~wMn ! EPf2DZZv mUZΌs3sP%tz՗JC,fSW^Ԝ<(*)\!lWf\!\jبs%Ś]b#EӓaE9k5?Z ejdH$l`:QӖN{qf  / cQUU2-lQ"BD.2jk{CFf w_'C ~8J2m$Ax;B,`(2G,3{\Ӧsi1A,hEYI}44lX1Yв@N\!fS'l 6. Kubyt؍[? y^$}9ʇ=?-ɴ $2I=E2"r$kR.˽[][&+rԇ?/ˠ\w")'r߉ƞ; QU,ּʖ.+1[ӣcW=!+8dYw`V!Pۻ;b><51뗺A^<3ECsz0DyYKUH@6(<38$C "3Q=s2_D``melH|xk1 N ֠]D^zHo^TZD&x x58ynkzĈ$䊈@$5vmEqPÖn`Lz nUlKY=5gbKϠ(-V"X--Dq[X.M0a\N Gٳ"HM `, eÚF-qS>.2-d2^J'N,8¦7d[3@H,  CN0-3QC BA>ȚWO{. B:ɠ,OHxo$<0,HɱSe߽!՝DxLϹq! Vfm"x== 7HP'H4Fz(L`S,PG"o"pJ,d2"<4*3vL&)ʭۻx ".&gx Y ӔbB&GO[dJ"1!ou)gj_i&ƢwANP][=?oO^t/,xH3h.Y(/HEOe;)6TiC$ .8nm׭⇪<g#.ljB?)Fw 5yW۰\%Ui`֘±mn8޹Sd$$Pu,J꤯O+#WS"9]J4wAs&=҉.$Ͻ8["bg]E#dy2R*-Ky0_ i?# 1ysΗ`PιW$3i#qnb\#pECжh rwl/rRT^˿eǗ F؃sXիXQ9sr{؜a`A[/\\㊊h\ .Xs O@OQQ,H49F 3@Ze)`Ub9x e\ÿ́ ^:PvDxk-SE?͝3 a3_ǷIL(PyY!Ta)l%u`h @Шrţ>;K<>rlU.0葲 ftE}E0;_[֭[dwڽ) N܆ñ^ްvu q` )Hn0cԑ*[ٳ΀Лmi#誂vBEQoXh!hP:'[@I 烔B@OȲ o"pfփ' XN$vf= WhHSњ ]ݞZx40 uk, Kε +vEQڻa;m8AkVAj4Red/eBA{r|KM$Ap&=*nys< @DQyF >ii^8yĈ^@^%ADs;*,v k)P#9oϿNz}>lP(3E/lу$jnLPaGO۵P*m< 1znx WE1A G-yǤR4-vgO;cq;T\V5TK^C[`?5<0kN=݆u?~"Mz8Vߏ 9xbCzok7D4bd1Jn_>Gku[[in@~:OԘY!3[e08. g%*^v!4oXPV5Y?UHZt{[eRn$CO *gM [؆aӖaX1lv\o,8# *vD'z`›2XYCDi%/v, =χ~Oeg`{l^ms˝`iSU|7T12k+K}<IŚEp]v 9FQt])LE!)hkgT-[|I%pCgp=[ pLѝ'LQCᅫ~%ZgҬ *@MwnP_o`_`Aqcł-F<pbfNJjnz@~Php<l4>FOL7]"[[uO2~ieɢ" :+C 3UUz xY6[&4ξdp`+k G =./R@ӦUҘ#)+`N`έCAd.:EV<+* G [c @x|F! _vbc_5A#58қp Z[&/9l;LͫXin3=e,yZx,E+ 0 s'$).5͂{+H r{ xć7ODXByt:m~ds(cȋi?Fat=r93&Pfѕ瀅JYAY%01i3#9awغq]=wCz&^0=<_QҒ/o7B~ƌ*:i\)=:,+g5hզ"M?@]q?)9ns{HOY۷l|$@?+[k9ǃEzA@⫦ӷf+Cw|Bml \pƉt"Z-&ЂI/ZCoG֐.9_XCحd*@s8= ly[?e902if) (xɴn'EgҙKi_0^{}5zC`#XMª0d_3ό5X֭~L)ʼn K,Ǘ[MH y3h2 pתirZ_)չJ2]5DZZ1 ȡwMȒ>kCR s_ז][ەx)3Ï$ԍAА)VKOsNƁ꛴cG]uY/ߢi6FfIwlt[صoS%~b2{i>nh+[`л.P]}*?;>i,lX՞;;^i:NR.vSk`5ͬL?;镵 gZ[7c7}Pe'^<ܧ}4R:Fýnr;X%iZ>q_!Y~"k8]Dt34d j%݉tXj4\lKS&\.}b<3n|EG +^Ho5ұ&;^K.xdǗ>ao%UDA5ݱ2Ԟ~UӮ=}9q)cwM1LKnP.RV:u5R@Y@pg}D4ܖHW" W< K/ΜKwIENDB`ic07RoPNG  IHDR>a$iCCPICC Profile8UoT>oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqxl+ pHYs  @IDATx]guLMQ,ɖdKm՘blSLI(!z>@ ;7n!f{z/۾{fFmY{4:gZ껶ܞ3zoc 6xZ*Hڱ1H?#^U]mX{s{nVCcCj tYA x`~ܕ6 ?=|l8^9j5 BޗFr<<\{0SYs 4CřK*Hr 3~W*լ@LI$8F x`N_ts}p4k` P,dZ-Z17cJ~,NߓHǾx]$ H=nÉ^kEH$nzf=PU-0k4^$ں{`$U76?]6 ,t.8n7p^"&={Ӫ~gGH jf^8lr~"qhSG~>oUOC<O9@{]{نl4>Ҋ:z` c F`XڻukJ|XEg_'?NtF8:ɞ~?"ek6֬-ABo$ށP~bl\, F+zӹb?#tab%kHĻ{P$uKh`à'h=`u~Ñ:sM^`\b2//T92;{q'&,OzFXbp(bAǃ $j!ԂX6gxƂ=~YDёNW[Yּxi)=wݻ0&1㟚gDŽ'Z_s%bD{Wh9 !z.Ą!DC-H ߱ PalrK$hqŨxR<02"oPq5d*֖hz`7 jۻ@, z8 qir=4H58#+GhO$":,;iFdi`Uv/ڿV@ Lpt8$<8^Imn_z&Jud6CmK߻́Ple\lztϡ9p4sN T~Z"u~a]͎jd(rjun$h ,H~Rh^ v].Z 7֕Ѩ"іx_Ԛ(f-}>6⻠`4_pBBy8r)w H~\*&&Gbj2u?s$T9ڸ2ywOfek 0'@;@D8)P,@E&2:#8I37^diLc3sT\n)پ=&4QKmk-̝Z87*yT! 5ccC_fi}[+|07CHGF/tb ꢋBJ0݃~8-㹹1.ټzg lkRjꎥRY67 2R379fkoٍ{CpܒAJCQ CA|v9qk*!}1 YbQԱYku Y3…5smܠk?[Ge&}}-ju :\Q,p_*^4h龞c sG;}"bK` rȗ@'@P4 C>8- 2*T)Ylg ʍS T[;N2fbhSV/T-̞j'Y$X#J5L02Ge2ñB盓/yJDnr2#HIZ' -{ R)DZaūzuKҥ׬9 ng ?mfP&E=ht<YDWF$Of\;uҥ2E F`ӯ`S-koF`RQMR( DU]J8Ra&C9lGlđ듓`GWu[2Ϙ~I:En|NFJW2 kSGa[]N/,KY/$ߺ%bivC#Yc!WH8aua-;QC} R*6Q<6sQjZzbIldK]d^ٹ߉(@iߊK[;@x$ɒQHC!V1!r:D/u+/"*!,,)I(#$]L 1!&;}PW «_},(1fTj0IdwX\:ߪ]bU2]N%DtNj_="t2$E:^1 +e7=rhwfo694` 'UM׉ܗ\^5Q?NƓ)?A B#AjQu9)Z %u D tIӢ!iD m4l@"q~!JԊZRAF,gŘٝdJq.$@*Uh"VT>#rD\s5 D3l'D_BDemˉdm,sކmU)C6pL*"@ 9XY,Ry0;*9 !&7w_Eѳs^4n_ʭaNM fsbu~ 2T`6 H\@wg3Uc3[XF3^J!*^8(T sQA*f(0YA8U?l 1Siy(w utK:0B!78FWj(C !%B1G#qH0DqQ :)qZ`ZǢW\{WŠ" `:"S/U krku~g3itl>$^zgMMxUaqްSwė* GU ezc@Rj0xzܘ&!#p֮]f/*cE?Q."(JO29 ^2 j,IkI$g.a^h"pvBL+3t^" VQp'BEj:X2o"1ťIV$ ;h”SKG(h*c/{DaJ1g`l^ޫ3;͜wޚT,uPzYR_ 2ō12s@X`F*YNYAY8br8*;8WF5`NQ& "PW^I)0u(&(b~K9 "vhn+N klbtJWԬiN9uThW!jxRyCV 6~`)EoGPO^6Ni LM7[cWSO7Sp2%CXKeX"srV &՗RexmrgQ\,*1PE!N! jH(R)c0/>h3Y?B]vVk_i9 BlgLMN IݗGLOKڀ|l׈O9xtk'k֨>q3 ~ LPNL2Ux d8"R0Pw''@_qYp]*kaDX@1A"eN/ƫdz,t*͊Ӧ:\g 9S]l7m`O+kVZnrĺZ[^ *c]CjI]PjeTG"7٩-SB묭]]m?(1El˧k`~>X83<YX#%xd(1DZ'h&!ra^SH >%xnq PCOF^|;5|ĆFu+lQw6A9yd΂iwG:]PnxL[ V%1k,A-d 0vZ}Ԋpk8GJƣ1P5^B9خ@G<3_^t#zsޚ5F{R2/X]+0+,v+4˟Fj{WX)* [C "UR 8-]f+'1OYsYMh)_19vd1<%!Hd%k֖jvdڷz&xxUFlrNf-IXUV bjJ9#+#gQr~ƛ8z(MzS.T13 5k\ͦ,_ lF̹V]^w\d-3;ӈ}d H:}Nz:4흎Y5ߔU.\fӆl~ygZ8eْO6,B|Fк3v :{,DM&-9^A|> e 0fA B?4`: A\`QL͌ T˥cOiS%̲;`G(ğx ;-vm~mqaxž]Mym Y ÐCIPK0PUF(x)fiom[ѿr#NH@DPRAEE|* Ǽx>TߐN&9:9 <}7m[n7Wʧ(U%RW_tD`RцP@1l;'(UU$E_CsP0C^ t*a3CpӯOWmė֯h/BWQ'zpU ,0 i>aQ޺%dLI}JmvtMƫ+b?!VZwb?ݵ\$EZr ||3||~ m:VofSwiϢ 4yL y^uqA]GV|{ESYw)R`̌rNٰlw>mg-Dos~q ?JQEIXSI.r-as_KyCtԞTB=TH.b)VE=/?7w!f矺s{B [&&^!j K#El͓d_G˯Wg:n 3brMt] <rW#/}WM$|G͑Jsiy!P"Ưj |ХZEɰII,@D^hBbuQ@!=$n#VQJT%0]^ǺNž>gjf5WW*Ww=$ͱۢТJ9@SiG;צPIv{b|_Hk*)_R_:{$ZD B"Wh)HR3ͬ(~vkiY%+khscTQ]V[McWLn0>>2޷81[ͽpy+tw?@uoL4V/@--Ih: Lb1J$l #'EJA d!bʾeBeH)Iq a(Ⱥdq@b\ySt)U_$d-P"=7V[(,H3TB؃"RK<tO%Ė  )ÑJg:AD87WnXWVbF7f7.\>Ӷ;KBB*0x_z԰ԵT!&u|`Oddminmg(NZ(*'t\Da*MZ9<1BJV#q7Ny+֛aX)A148ׯ[E^C \nf sP mdʵK ^jѢunDŽt;wO W=a]=AK kd?{(4JehTܮ<(km."6a(2 1ąlBH(ǾPp *@ gi;n96sI,ﱵ{cFBDRh,@cPw-ڻqfebX1r}?9zűXe}O&h#7s,61uWwtѠiB*&aç|Lwa`+M.AW&tY>s]Y|EtTLVvNj STa*>!{Y DAqXƖuۦۃvNLqbʍ82s.<܇)*z~h͠(TFKfJ"}}r:C8I8ɶ0={'5(8^ie@1rgHeR:+1;tdsȊݵgڊ5u &W U\᧌^/I.Uy0.lr&bRb@~P3K)b΅ܺNWVAN$ۺLZ|\)I2{-:1Enˑ@*N=Yj1K{D`<D JU%Њ Icv(C-H:< i4"]A+51C)Gj`(XUdwGXuQDZZ )qWk^;2>SVrzL\SBH camPд*}bRm1Gɶ(Rql4I9!THQL!\Cm z0 /WVv%zff`)̩Mg/!noL07W2OG^0*P+4;0rÈ˨)hjr 9JQF¶MtC:OJ3 _FRsTl?OImPn%e ڢ5(FڂJg>Z~K∫pTYUKVeNȶV}2l_47wQu{R@wa`r* x<AVP@3R@.k}ךP_9{.l⏻Fpʼn8\T5sR+>1RnԪE {5 (hR~ f:IĒW2J;x9Db:dк?u_aLZc4P(w=4/_yt|bz'hsj֫Igʵ0Aּ'|<:L¨'۰30BJ_ƣ$8F,_g~an:LPֺ-&3{*O7ǻڬl; +G 8נ_IZi<\%.,&MvĶ-IFCRAP\Me[+~-k&Z=n~pkś6]Ցig@ AUU0S0^4R F\ /P"luʼNYYr}^ޤoH vGmi.߰K6AMྑ|?c߻hHlxIϴ ٹXf[Fd8ʕSi AeܿR2bյDYGUpT<pAdihX%~Uȃ73'wEc9u~wd:@~Y)0DL.k]3# _.s Hygr$ZLƽPfkVŞdtI쇻x5 65xV}FIQFS͔)@U1{1Gi<˫"DDe .9r{]8&'WFoJUS)awiٷzkL##F&l]Xp&W~?nP?]ƨ5c%SHXdpgȨ¥#b6YbȦZ4ɢ{`W<﶐+d* V9Gm@ڐLg݂okMS> "jT%%YH$rmZFA[8[B \*q O4AYȯ^&}iv1EL0|# ͔ ȧ,=z@V4/8}sHĹ, ,LFO3V(Z ռ-A۴cE0-&RG p8V H"< 0_)./2d̓SA? &PJ ޡE sAS2gr@%1~HdeyDb?e䙟)S-1^_t晝wY)x"t+-8$ N1@dM mW 9R.\CtjDR%#U JxdxD2CFQ-oPkiCD%zBR aOk!{{8C1K9Tp?G*.Gt8%g;:zqm;?$Gw9q/+%:Jd/&]QֈM +)P;B4d=E4Zb Je/Z )2Z@deZIHJqtǎh@0+]B̡VDH!ܒQ'?Ea-W3_ !ϣmXz^i[wyz2_RX1%^bŚ%Kl]f_q y-/_-)ӂXlN˺|Ork)o%* 3s!x*t'PT;T6C/_!@2$J8> #8NDZ3J|ej'FseH/5\ЫCTV#ÑZ|)Ԅ'@8]v{Ge %i H_mS(__ir "]CP@S #ҕa D\ɮxr:VRy8¨XAI?;5ydxT V7i;IW^b(3vBPqIZRH[+vױ0 eaNb\XCsDɳ`lUɾe'apI|V?%\>>.-uɵYPs=,P-M_}SZx2?m@7}'ѾNy_NFCpbMi_G0 I. H(D$ h-PASK;ID"l!JSpG@p߻hN9HImn8LwU/XGiֽ;~KF>q\efM\3דBUΨR;:C, B9 =,4P,u ZgN?k&`Tj PF=Ve4 HI a-tZ!p LA X4[_x] Ky[3h\=\qܞ8c1!-~5L& Ȼ@ f\O !(M6:V`]/]-ioyWZiHd'hu7C%bUx5A;@E p5(Jdb&rHv\8 )i`m_f}'3 Nbãou^nc@dt{Zy՝=op:ɪB D2WPZ #"[FxXERU%@TDV6+!sP@yahu x dŽdhz IRt<qUG W1H 80RcI[>r3 |n.=]"[YlНKOZ%~/v6%s-Pe1 "" #A;{@K mYdtۑSBiӀjiH"<W}y ʕaH?$r.*saRs=VVv\6j XoLwX:׾zۄ4QM4bA]b1bq3b oC._DWh(B7+[P.@9(ֺG>b B uʨ QF'wM< nvQ  #`9UhcpRE5q]H[-ꥯ QFGY(EO .ڥ/[oo>4yk&NX  vt'=c` 7o>K@o!_ST _RIZ*X$V} Wݡ<)K s KV#:ק kE Q4CF"闽!Q#)Q[--WoHC\6и}7;d1 "Ng|3?:xƨM6n\έ[/QOߩh2V[$Z|@^;,lBJȨ@I}C(w.ΗhHѯԄ&$v!ā"IUːXwnK_֒Z>ݲg܂50Pd\s[vLU_o>yUsO|{1nU7H[=T*h"S X^$ad9ErWA A,nZK @)h!zaXD# sBl@dܤmڸ6mY75VxF ikV/^ ۤjVw$- ` Œ-Y~/^iI`߷dj0 c$ǽ=#`.{* _g./1A\Ki$~UW!"*`?A;4vzt ό81b5 \Ζw箵@5 .h)[.$8u ?KzOeJ G+cU_u,E L-{S4&`.$XyXfٳpP@5לHU¹UA_ac#8;Տ Mxh?-gêq+,X@Uz\*B+muGƳSsHv 5c)6;~55 /{F,lȢ&!e흯}!+^[;8]@sDg<8RVvJ2VHU?BLAqDBʥ6VX?_.6x*iE=N=mɫ 3߿n1̎,-# XmWۭඃԮ%]KZE(Ai;wy頕1$\:hT^+oqP ;mkgܿ5‰ _##Asc!M[0 +ȩXm 61@iiz)7':Lك3zn!)t?LkoLۗ:۾VR̞VCj ϳΣ`m^W$b'frD\r"*^үVN@XߊbA:Fxt=ψcLvJU9J5q<˖Zy(IWVF>%g`߻nq<뀄%AƬm8c}gݳOuv QJy@K/ _ꨃM+ށXQy4u;!@7};#f$T#BPJGҭܾ A\٘3[`HW)˗G0ellPvt#ֵGxh?pME|5l M,~Wo<~젞Yů``Fak*qK쭯l3hmVQd xR|g0|O"ѱDX'> {mɩ+.ĉہձt{PA 2+o +q(y:{Anc־Zӭi\~-x{CX_G򴰃ZLNe-ۆl__gں0cUkk{v{Gm^c:}XD[)c[GM/wVlZ;6LC͍x8pG?z? ƆccS_7; &cF0T.2ɓ(W+'Oa,Ve{6/ZM$ϳN[l leGzhKQ5 v]Cm B ٍ7dHuO5 C]=mߙb-Ą=NգIHdvrb}?q=p#l' " kI IDAT mۻ皳cb&6!P!FG+_ErTҦ8H%y4H+mphQS,4$}kNc}mqC Qg lp7Ga@D8Sy۳o%HLm6_}+Y| 1 l-BAMWօo߾R}/^$@ [@ `hPAQ\Ԙ?=9amKۢV[zxH*,] NԄӏmhEC@"8C8kz7eqZ|[l#hmC1(37m޴Gv -f taˆ+]mdk>lFS]U~ݟ`y#o'<ݻw7]B> _E>KQSƹWޢPtAg;?9>Dz]}؃Gi>Ɗ&zgC6赛ltrwM!M=hEפazveכ]G>wG_|^Ѧ%W~D bf)mvЎ#7jF#x7< p3xL}] ݧbkA\ Ka%PnFZҤQ4DGtgT{m71[eM#$ $}S}n=#Sq}R< o-RGD)_ok@Acӷl ƪSvſ_g##) |Z۷cR\?~D۶Ԫg /lgm۶Tl/|`+35L#JVt[6UFe&d)?=Kհﰻ~>5t:$\a*;cj[kMlﻷcZM 3(MTF',,0::;)5/&ړ f/z*VӞ"v1Yt]߼%ןc㇒&n}w_6,m?xyֻd@nODnaKdg&&}auQs +[S~3Cw0H tY~ʩr-'B۳{b9.Lނ4mٲԌO㪌[_KOOㅶ4 pJ(7ݷ˾]kum%gokeKzɈkmIUn:hnfa/2W1Jv~qVvaz&+qcoGKo<ūɎWrߣMIgߖ$S+3E:>W"b<@U0i Τg}[T~m)0fiOֻﵫ=}< hc ;Q[a1;fG#wC3;DG$<Wd aؿ˳ ;>fKsU?77=kԂ}~jc9@'Ɯ Di_C^~)iͶ]}JUYNv`f7=bLʏ&~irOnїTD8!C yZh\.N>4V+? 5Na K=Z) n?|v/z;22Nת`CvIYLI=};Z Ox;;=+>* MۯaÆ`4P=Nt3).|&wg"Ϊ$a:$LAw~r}[٫[g}f{0_"\vڲx ^}lGfnz olw\`]bILZ.F%6 gްb !;BQ{{H#dtԡI]Nn'د==?2|>lK6^WYa3aH)" A;6Rk#&pσc6:V6kkx5Y/_8zd/?j >:it73jtȄg۩?L򳲟~ p7q +:ʔ<9lٲ~IxZ$4H"$(6ҬxCz_{Rw|7|D$N27r+{xmRb8O¤>)O?Aq3D&SPL-nkĕࣝX~wl>sɅ[vm{[Gk]oDc#F[\±0_$t?`-.<}J9NV$vW;7o$VD-`g01uGN2#\̠J;XE˟L=U34IxIxfirݓ 4!S5 T=e[IENDB`il32% 3" -!!"! +"$$ (3$ !! !$;&! "$. #"!"$#""C!""%&&%""$#!##"#!$"5!#"#$" $&$(*'(%#3$#$""!%&& "E"!!3"%$& !I̭?!$5%$$),!+#$ 0#$'*S3%!#3%#"" !&"$% <"#( Q1*&$% 3% 5&$%%$%%#W3#%*!)&(&$%$$!-7"%)+&#(&(-+*5#$%) *+/h1 ,&&%*&))(r4.'')'))o3-'(('$_<*'"".Ͽ,.( SɾG UZ4 aن8. q82!0U "!'*  ($() #'"#&+'&3?.%&&(+ ,>/'&$$&,!+"3-&'&&). "*'"(!(&)+,,+ ",((+""&'(',+3))(*+(&)+*,/10*+(5,+*((&*-+6KX>('*&3*,*- *3oQ),( :-,,05%M%"*,(4,+-3e<+',)5-)'9͖%.)*.)>*(,cƧ>1/+-+7,-*'; ,+,-+--/!B7+.1"&0./-*,--*+9+.12.).-.533')9,,+0/0/136_B 2//,1.0/,gF1//0/01!eؤG/1011+WӪQ.0+*6νܯ27&-`ՑR U(iۈB )nԏE! )~H-$0# ($*- "!,',- &+$')/+)7A1((),.#/;&')'%(1#/ -))*)-2 $.*%(#+*,/00/&/-,/$&)*+)**//3-.,-/,)-/./374,.,51..,,(-0/9JGC.).)3.0.010./PQIJG"+0+ :10059(=`\VTU*%-0+207"Jcgim[0!.*/,51-* -qwrS (1,-0,>.,0J{zg453../0. 7/1."+"/0/014"B7015&!(3230-012.+9/1561-112;87+*9/00534 89*Fv<03205244.&JjA1325344,HssC04365/@yzK05./3|2;$-ReG U.\\9 /bg>, -qD4&4+l8mk YZZ Z []R]  ZHnttsutx}#~ywic11 PNG  IHDR szz$iCCPICC Profile8UoT>oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqxl+ pHYs%%IR$uIDATX V}l3;{{|gP|i5UHqCTUH@J m%E4 J( M2MAG0n@Ȧsgvrڦvꐎtޛq`pzwgv0i^y6|.#pdq#e|f[)#pjjpi,;|(GGG3cO} iWok=eR6؎4c^5~'3{?A|y+cajT`l%4Υ?\WHk}I_/Cb4QkT3fZUcR< {ƸU. xc0>o=え_?{nβiΝH, *Ư&n@$&!3x!7v12;[[?^؎q,\ dgק1օ>e_dS]--ꅉؽ͑{8 k]VH|5/L0T-kl\rL_ H[8QX63:a6 _|&4p' 8 Uu"WF>:.'nhO0W9g;c+A*Gh0X pW\sRlƥT^A#D0/  J$>0Dѣ/ )k8JrKHVic~"`@C~ԬpH'ް A$n̦OǕL!Ũ  IA5DC!a`4i0,WTBzoCni8׷'|ݗU3rn},YE8|. ;\/*0U"@bIK|sA4@M&T*~j<[FXs_ׄ>yyHk4sG7X+_+iXtǁCGӎZL$3ŧЗ5ccXi~,T+`To%bjW֙[49[)իxi`2fI W,Hp0~`h$S9jzEܤD޻$9v;Rm>Ye#0Km{ng-@{pGS~#gz?x_\ 6 iIgw=cO!9>Cg~gZ{V9dWƤWl(8% uOk{kuv`oYuw9 Uqɻvgr%pY9#4kn~bL^geK5Do) 3#t3QےVM˨񕛥IpL}߷wom'}[4prӠt9@WJN5R(/IENDB`is32U ,'"%! 34!!, %3##&$" %"%>,(%) [Q!<(&&"<+[J%&Q5((&$> -**)(4 +))%2 ))u7B;4+@f  *,+& ;8$($ -&'&*( !,&#))0'$>,/,.+hS"!<.-+ۖ-&<1^K#-.$<5."".-.8-0.(7$ +.0/6ض )1$ս}7BEݎ<'@f  ,//+ $;4'+$ 0&*(.( %0)&-06/$>#301/HO<*"<12,bsT#0(33$Ak5*/1'<53(")203%8 -254204_& +1542h )2)ca7B=h4j+@fs8mk+:5t@4^<42/-&")"$%9%z5ic14PNG  IHDRx$iCCPICC Profile8UoT>oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqxl+ pHYs%%IR$@IDATxi$qwܙY@9P(CIpO߾2+Ů2 &>+sUs̺nteYV۩寚Z: CC@@@@@Enm@@@@@(PD2D H 8EӔ 1)))#Q h_>_&ߟӍ"""",߻v:'?'$ٳ_䛺6UӋodӞ1in0xec:R R R R iIvIΓlSdɳd>K{J]*"gc|j(2e. Ect> >m_tEtxqu3d0_& 1qb)yM"g 8O:_βwi즬9u.nnQ O^ `?֐O]aՀnwzg+ҪL d)~xygb | !O:a' &p!(b&^ #"=16%8J*6ͲX b^'npZd !Ka~I߇9>A~fC ` [ & CbP@Ov yMK"""" "]g%:jb\}~[/oaĠo?+g~e5[5γCgSj)59P )T=YNRjIqQUgM 4&ۀ<_A@H!~MdN>۟^/f]scf~]ⶬԱO6KOg~7QU'g~S,tv^9 cpX@ kA@~g;$e7Ծ_x/n\>EpGٳ/h֚"auHZL(ܣH KH|gjQu'ݐ\i}9u_lF Ʌˡ( $w#YHq;Q0x Q"ABSGB2S3l]%7?g)))P 2K+nEk}-[10҇[ş U>=J?>`~o`6>K _ 0zW=TH`aS E^ UC@@@d>K |խn[dɺEvEso-[+Vṡ9H F~?w1!+חL5 ;,0n`|6&˘cX,./ϒ3={,W@@@d޻Vph5;Ų__ΰo7of/_qstϐc?OCV }[#/J?nKgϺ=K%Yٛ4ASu}N8 a% C>$7IiY.ߔ -Y7#"">n D#z/`ݹ̼dqO-| q_Bռ~7 =iz%󼈖$XŬr01d St,; o=ʤl諱""""N>.-Uȗy$y>Klc_οuT|Jm~Gm퓑 }оUNAur MxV =%pH4' MW\X@S^ J$cR1D D D D ڛ1S ^޶mV6MQ.uߟYn$-(z>=0^Yϵ—}!0T XO7XQJ $ /M2.a1\ڱp2o<_cg".|A0=n~7 C@@@1$E޻f,t |5fî_]Om;GFԿu [rFͪ+@?)g'~m ж>u~:V,C @r:KYM8Ip@88 E1rŧ9BO& M8 !XT>/Q@GG|6_Tk"q%Izw$Ùt 8}-~Kt0"egb~VGPo @%mwKr;>ǜPmoi*N90 ꀫ {ߑ(yZsq[,'s ]5[zDs@rPr>5]a_eM) 4H6P?-&dБ ]L% -i q;xMA2HHHHQ 2ɳ]}{t:t݊62~pɟ? X{kZHa)U> Ԝ'<Wt@fp3DH(a_l+A9Î!_泓ۤVT=x2rb)GJqb8Wq|/sM쇣Wue?;U&{9/7/V"ebe^b < U—b$mj@r} >Hq); fM,O68%jm +M@z2#.np!ie;#}s}G $xmHHg?j-sps o9 @O7%t(#Fhy1S.?6[1 'ٯp`XUh(&@[  {F 8I{[` 2 67`wEh))))(@GZ\+{d ߛOlÆv]6?yz{/7Q,Ѕ}mcfoY!>oL2^> l 5R?W72( gy0p,BvHv8mԶ SS%C@@J<'}oZ]]kyEsg抣w'YP_H? T }X- I.,X ˰?꘴A,ؐ`6ÃBv %y`ᠱp^V\axʓ$yz{h'5@<;")))70Y?iYY>&Ut7C }ׯvmsvCg,gW%Uq?oWHJA5[`e[2ORK5pP馪bn"ZcP LȲ VC0%JoF4Wرϙ @ +v7\tM_T7p 0K0rxFw{]=:mш;R R RS 2n.6*/fʥ k ׵xsG`@V@[~,ԶpH}C# )I_iSI3$Ih_]`N ` 5Mxy"2> 2x`@Vrv9=Td [iA(T 1"5|]Z/t!:Dk1wYr~sk ];:y9Vr̷ aZ$ Cs,O1 =B ) k} 7D*0ݠZA%]y&8q#"">| Dq=ן~Zݵm>b\yW]!h\{ Hr H5[ OVXK?E [Op>/!_"Z`RUbd D=xe@oXd]?gG޶L? 6˳uwu_Q#,gPozj|X~eq/_oPu+0Q)6v|/n"ʺD6v_-ߑcҗ%xm-$G;d NQ횘B,V=7Of.S@:/1Lyu %vqӟ6K쟰.+sbU4u` ڄ3 XS@`OCs֛ymZiG9q'?4Le:?\HAMI\t0Nlrz`VU=R MzԢSHb(`?x[h{t\c SMG t@Zt+}rb.-/[̇2<~BUJ!o>V]IA!SAfVHOK/Ljv܃ :^M  t@@G&!L0~ɷ? ۮ۶Y lKV]kʵt/KaL H  Ru/s0z-(uW5I ՀűHo)u"[JKZ CiINXZ805!QmzRdZg}d r g hgEoLO))R 2? K'}UM游w]o}ۺMU-ο,?ϟ֟/FW~`xDC!&ncJz_DC$׈`WzWAX{<L/!}6䬈y4>up" 5JatAmǺM3H ";ؒgrY>icw$_~3232#c))Q 2#}t Qϱi_+o.q;kv m Q7~dlǖ;O PX-f|ɥϱa8_jD TlwXνWC%SƬ=Q!+} )-Ot-#OH5J} ETKz) ‡sm8g<'^qӭܐA 瀿N{ i}G0suǁ -c2hiփiA1c^w_y|4Mdy"݀al$RL$z9:Mb:`pmH^/dIg0^G D D m ,"0Mouӂ/C05 &SR `ھ'#PT}30&bH546T Ѽc1HGtF1`!I']׸׮Hdv0PQ_|%&a8R R RS 2#lπdֻ=뎣m x `OɯkY8~_\ Wzt#+D@-mU ׽և Z8}]Y{QE[`Fc=h/c^Ѐ| 7 d %M@czv PЮC(av:WS mB+R R RQ 2?B>Ov]8v/ڞ=9{OsOQZQo0OZ@jcJam!| e54:Q m 7}},U _aZʏ)! 5B;!?\}.Lb$S~ :6HQ [@(h#dGk>]!KbȶBdV!+R R R1S 2?ý Q\֮>[>uo$_ gןv zo7 ro!Ǽr!-զpN{ͅ4mדe@uJ9lɀDPogё¹.xd@AD1~N&H0 4"""'"?7cX4%;<6>77now~9pe:,a_ F_U v0tCWAo~ĬsGu?CC1Oo0xe?*_ gЯkܡA-)oC ("'T6{;md [Lв4'{J8AE{_l/ //o TQ@@@d~K>?fHmQtjf{7 ]u˹6 ) ' ЏV pQ0߯hGcU 4@_!7ʏy,B>K8eQ⋈ 0vh ]|JM i"J1SATb;"+7IC4h"""~dD!_եVeyGZH Ob~i(O BCPaZsC-9N}ΘcA;yRH,^2`C༄*:R%R Қg™ )g${/lt΂ +O'#""}Zmr_Kkg;5rF-tI̪ @d'?q Z\ 7 :6Zl0az0 1G՞o*}$E$OSqʖ`\co*Q?oEZc/8?`Xr3HkV5L5>O1蟭.1=y|8)1D D < D/?m1M/g-,b%k: _CVX"J83v(ux5jkCcl!;o({aJQ Nru&b8l"L벪C0{Na8ۨ[R p eRlG0{NrV1D D D < D~Ha1'g`͹~;IN0[gɚro3i3` ʱ4BlZ e8P?|X_pJ 3-XFqh{̵& bltԆ[9dx"}#>QPtOgY]MK*Јb0aǵEaTa JhF D ' |Z1>r:)fp$x;t? DkL̷/o rl.j`?J t2]bj+;G<p5UM @Gׂ,E} cB-}+暚`E6~/LgK֟adp'5jѯY9ո/r8!.}+a̳t)|l|@px?'ˎRٰ^_b`bkp n'%6<9bRHX"""' D}kMœlfV{^C}3c>t>@!%?ZЏ?}NIʚoAP9b )[&{e(fAy 17@'uCiڮdCk^&šӖI6xHll+<m1 P-{1T]⣪Pv43d (>pB$B PnY'mG0&;5oDL,)-׺,peort ̉vv](cM>C9:Y= Z[U礳8 :d/6w `@ۘ5s- зɎGM@w'~튂wo8_쓗rVcQſ='t x ZM p$ELE D D | HPdR݆qF V}gC0Hd1IgisGg)28F!؃lj)|{{S3aq2MŇ*ʩw?/BQ  ݓ?<@nB 8Z)SwԞBåjkPA6}͔ yT_ylȊDnEu|1 l4_Y§ڋ_"ݞ$|erRܦSkȥK͐xsßo>`Io[ *@qm1_|E}o~_ijib;}Դ,-SαƘ:ЄC>F:cƗi?6A%̀bQsvm_=CZ~ڸ&9Lw~LE D D )F3 ð7X p% E=[΀`J=__^ʳp*F"`$LІn$uOu G­ɒZa6 5m| }xhR2|f!)[A9p>ڲ|QaWj5~L?ע_K]f.F+TIҖ`Ч9LsK9x8ΰ5]Z~r_%ȧs8 P܈!R R R/EM' 6^(4Tg1/|upxX eK۴l[=eerz|^Lg)S(LOs apȩٱ{Z(wT|# & <Ƒ?>zUm2+7<ڦ7]ݵ?v/>k=c0E\\',+Yڿ@G ԃ"0 ~7lxby$sB@'cTÊahq|ւ@bu^=Epc9>08ekJNhЄP^Q=x3+P,3>>_vVԮҤ &`pÏ.㴠,Y]ޥ]Vcy!s pW4pyӫ(Úhs'`J`)sװcoC6y"(%C}lԧĵ3 =S$7hFi݌k*tsS|UM} =C{ct+! uҟ`h4:AG+8)?%5-AsUy=F64틫@Ĥ.#)j{6yv4 'A,W<8|ҙ!=e`@&#j2j'Y}a#" i._6qYQE7d4 8Vkbt}<ʀr_f*[+][ݛg B$C%ł"}<"Ah&WPV V^CØ"RcW;6׷~#~17/MHˊÎ Z'I _qB֡]tY{!x!p2) ~@g@4)))R 2o?''y^-~|^\tts#3[c89`XTи~ {,,[YQ"oZ=sKCEt|ij/::v^E? W: t=SJ ҁ}!]@jskr[}Y9YnLb JSq8C Ae.d:wB<-Nad5!,ʆd ?" LG6+Wc?#?Lob)Aj' mXXM4 vm@@`1%/zl2Ž ~%L֒t-Z:dxzoR*$a`({Pc\hPq0_-PL%hK"h1yRŸ#T:+gz3Ļc 9*˛.8; MZ->]f\Ue\1eb?{_s~OZ#u(w(""B!0mQ8% W x׬+N3': 4AJpM4\kl3@ ]a%t X Vˆ&Xݎm҉joSapI2@޺im/\W;>z,$c TMy&m2cJ CJ&,cb6*h`_Ҍm sT40ϏiWhIR)!u\@e=h .nz ʟ}*j ǍЂⱬU]qˠzVQ=thg6t(9vsBQn_gS< ) Pя~?3*xl]})>lz5֊ÏG0G D | *?oO.UWWyVЭN WWox< W > ""/*VA{0Q T_~Kg?K[kWm`.H ~2 H@d~u-_Mc׵U*<\h|A`"V9}yОemQJ!_UM}1`$L }3=1<@ObDT5*|<={!bH@X:wpHHHJ-^v\>mŪkyjvgEߟF˪?/6e/?xml2@2hae9ֵl R^D5_Ҕlre &P(C9k/ 6t NjI/E*`Q W:_Sva}LIs~B'0B :ܧF`>,,S _L4h,A:سP*Qpv׌.я6AldZ Ɋ탎 aa;z}ƉAyl$W :'{סܤHLF D D Z*,2?oERG ^}`Z/g|O˽d db&6qJ(g{&)`̄Wë1g@ou$+TiKg9qHRB\fYQ&+5aZ]ia;gA4kE&&Cߑ߅; (M_dC`[]>[}R;s+i~"5 0/Wj W-QV5M}ZL?t,~C(mAB svK1v2; @< 00a\#G0͹'oJ?E@n{MGMQ:~E D |s?Z%J-+?n`/@+mp ='7 $xÓ4Po"P#?m;sD", 0AHʢdn!@kzOd HmHT7L"`K7-01ZSX_6tt%:@l׊6mNy61z iX^ H"=ʗ!$#Ă͑H])P=JȡYi፭ yP3)h#"' |t `^zg3d]Iq%fYݧD38} y>̖]Ͼ|NUwcF!.tPSL|FB30,N7 u,۲hmtiSV(ZY>f؉DMS22+d4hQ4ZH(Vt>&d2Cgi"S"v YaY,kCt? E#[=Dh1igҀѓJc3̱95y/MQi10WP{jZڸ6ml8zc@AJ1,qY|D#oم'@' K i]*] 5G\7_}u5L$~|cSHHH#&B+@y `3^ niHS2ZĹ--<d@IDAT cA޼,~Z)0GAv DHSTR#r(+H:HM X<[&\39b`6 ش5pSLnsƁ`bÆNފȯDF:`TeC-[cT( ~ǡLjƧPtS ؗZ[sمֳ4 jpU5e-ek pnp/(ze',5R% [~GE@E!R R RϣGIwtKK^+%ܚ ]mdr$gK}@oaV.m/uЎm2֊ n9{ ղJCT|d,9Nj9 -xB;UP֖5q{WƔ!c=6W!sr3!dY|ޭ]ǨrHa?*)Ic߈~&S?70-7<1hyҶi Jqp2H| gڵ500pHHH?0^z_|7U%~ܷ%/e,Mm?IKÿu |,-)\c%`'_o~@mֲR/|W?6xfuN*mvp! fw&Y̶tmH079w[4ɲ1kH@(HzkD<њ&>P'4S47qF,H1CҦol57c2i?tSBjKc6i  e,Jh:J Q3aRWU= BhhR'6sGbg' LI(бRL){1D D D 0tz+}fy-i4߼e_iX*XA[y '1eYSD.ûoi_C++p@Xk:;W-2e/s,zp l Pg(10,.H>9S@mr9aNh 7)hаվăZj3DgSmtZg\{L(@d}+9ԟ\'%A;2 i4"2-0Xar&* oA%:wƵW-L,;8Oe5y :5?f=ǯHHHwSc1e6\39 s޹OxoPʞ"sŷ RUZ# g;؀ $݋xW+:1Mw1% 'Ir a`d#8)p; utS&*'Bb.ѳusHuj18,Pi!ZE` 6<5[P@ D~Ë0 ToJȈc(3z1d~O-~n֚ק]qoLzD4%`3Vy>KB lx@co{:DOtSLxrt|Mw,k,{5{-|ްt03{D/Qp@т0%`&f "&E3iO;5{5<q<|VHa7|G"~/e)m'o/ִjdZ\H*.=./n[ Gwm]ȵa}1o5Yg#X{{_{6ڬKD5P>d-:a {|v5*-h1^v|YQ"+]ǵ#l7LU UNxzlɱuiG!؃ }e_xzjʾ|-,"We'ቶPBNr[>-PPX8 OQ 0~H#';rJ>)  ([_?`u)1TY}V"-{Oxo >w5+3ï Ldfg+zѿIG#&PTҗ#`&ƀk%8pۻ=+X?.vܽK7ʹ=`0U2]qi/αAyfW5dTp,pi8 Z XyR8I7 j/ieZ]eT95@:Z'hW:TSSs JFKȵ~b u M Mp 1O+ F͛4HN}Nf9ȉ8ύߑ(1Zs}+^K׵+ygqVt~+q LՎ{k}D0aկ7Ŗw29hx(C277^ral4H8tpe]¿bn#?yXYO)vzQqS//Z.٬ܔZwt5Unfk_ f ,Ce  wniKV v5m rk)p/>}RFɐ?x9-eT4義|P:+\7Ňl\Ϙ3&j螘JY}k d`$_4$Fg$l Ba$M@+e4|g 1D D  G?CY*.nαb[]8۝" ?ABǾ?J};Ф^_ᦎ6gq/!i^Ue5$;_ioGs(Q pGE> ~7YWfZ:9ee7 !BLkWlz0%)v yyh,Ӿnhn @3n`0Y²IY!bx@HE8ַ_/R+XP*1^RR, cl$ oBe.jpkWZTeci1. ¾*ȡeUHH"b\mlSCڟfSdٞ:z!J$0b1D D D x |0 )͖3w'p޻?YvhYϞ/YÞJ*l@vg Wqi_+ EC^z륮?SO>2e-k q~VS/Py_eYov/u[Veӧ=>f᷿F/<%C `?&r&}90՜#lY旸XUI,%Wh 0rSX˃i&J=Q]=9;@_2 ႒F\doA㕯& *mM՟LC+hD/Nok`W\ L@MX2%;;+ ) ]6Xc*R RcA~TttkB][d?+je0ʟ~?V C1k-=g  S;ȥAg^ڹ@Kvyww^!/<ԛ>GbF[$o g?mqq"%rp5'#:p//.շ ~hZ}@gyÐXO Fc?Ƨc{6|+cRٓU_]N۴/ln_\ ̩ƣNJSzZPZ} H6G7}t:6lّ1p`̤B?T g`y/DӇ.H)))pgxzq4UVVLVW[\ x/y#8Vŧ;"pӇת/{רǿxn/1AU^i^;u\-̀)˗fӞAPoXÔAМLfiLj^t-tR7h 7 zfOL< d?v jVMCa%i_NgZuy6j[S~[—EFL֠1.FTg)ɷFc*@e2` (DVؒ3Pj9uIMo&GNh))G_ڟenZ,ָT2\>g兌?]]ly2pp_{YGHoɻG젏;jX VeEAڵ R68!ON1,΄@^& A4"">F <:@3>(ųjn%&6uk^gXQ[`וv uJzk+;7 P!+[\ Xo8Y_ uqS Il$f‰j= nל5PSTT?m:PӟFK؛ K-򃊅ͼmAT"b_5'"_ZVoju~[]㳬zhr~苀>XZ”`O1τ 5-TW3{z`tJð65>*?#L1gwJ8;.O@ D0C~+;l W<;e9;@l/|I00ʘ(#‰? wgΡfu])FT;uC?U 0{ =K ,9U %TYɒP XsɏUsFge|S˾,?<<">a:/@b9Rb]/Q'l5Ģrb2'ȩ/F6S!qjV&iuS_PJC DL:Ve o!? *Jg p$88찇)A;[$ "">V <*`\*in!Gbu4?\k׬sޓRQE~~[ @^GPz[F,yc/v =}{y{>4&V"XʰfпAhU~V"%Oo뻎k(F.-0;V# _o"5|}zf{ö| B~(LzJ7gf1V`#%]йȿ|޹Nʰ`iӲ3*<71 yE(_NO$#EOpΪ#wQw'@ Vѕo{V~pV3[/dr'arxn+0U}=\F>7o]ß^adl,eYMS78*g`{!_0 a8uxe4i7ڎ#Ϩ;m5[: Ԙ^n,F6o@ቪ=w+ y\п]XֽP_*ahT$y҈faZ>~Hm7 #PWoUV7%HsS8PCGU`0peT ;` @z;-η>YTsj~7ήy {c)qQcA~vϱ jplrK%MӾI\C? >Vځ>/zqؓADcP!ǘeiEw:FlK0ݢer`aulw @?75jYr,t"[#BҚК8;Wd `y dȲ+l u<݊dނkF[qu[󣰖Y?b5-ԉ޵F>1YZαžw_!ux@Kl<'o9gHGy;Xƕ7NܦCKv0cs{vd#^41ث?F~PnRɨY1c4= TOfƖ: >#$>^SU7T_ m8б0?*~psH@xSvf+TyuCs$ j9Ҩ-l>`L0+ށWo.X\Vssox)_i~mwƁiPq?&vr*_Mu-$74ڛ/#遉l}%~VԻi?JڲWHxɍ?p׿s2o4'pI 5}_I^`e~+h8G>LJ /Ӂ[cjzMf s!LʪpPf{Zfh:6R1:kO=`:P^]YDcz0u{ ZNuUAy}]4l05 2h]@: fw'Ljauwd_v _ìp3Oۗ(ԀHxg +Ræ{֛/ Ҝ>Wqun}\$;>H֧tkbt_'?D{ @t*M *fn1ͦHKG,o;E{ۡW׶,mSkO. wwwYvq_a` `ƚDH#@nuY!Au!Nڠ)OU?ƺ&7d Ŕ9E(isӴaj`cP!XYu0f[!&[ ߮X,J9?ol\a~wx)n#;X"/%砌3WMz 8U m|Y>Z@">x ܰAQ%+nCt?` v?sxjЯU/P>[/v_^! j `?-V>ꁁ5 u^?87ox` Q>}P_3 Q;tlo̰6u&=y5+P 1<$Vx*j߶C Woe%1MVoS?fɗiLe# K^yL*D26z D;vհ"HCz'D#~)1z=d5zf?y|3Kހ+\?d*Q~>^ZUgTn,L4ET2Z#gucwӼixaS :tD̉XA((0HŨ$J !y *[#dI.%Q +={F\[؞"TMjt !b=vKp=)"(C 7{odYrUh.Fflژ(|ӣ^DIFE de]}{k F=yxDڌO5h4lK qkQ;5<҅*~.Xeʹ6ggEx=@Y(gsae ْ8cN 's/w $0`-|>n6~o^~lA=Ͱ8|>%m~2wwCerfbiB cلF)ۯvٝČ>8/ =k}AGkWGGN/)KPΨ9@Rz^$ \( |Np$CS:"קH~Ul "(RrxHnN8uQ?YXmsq?CL ؅߮!xٰ 0kٮ J#w dad5^=J .g^3;&Ӛj"'D# | Gh7Q3$g6~NGpk~>w[=s&*#^X5z?BX"6.{A)a!#.lӬh<a (蕱)iWO=juUebvvكl~C•[:nlO;= Hr#;PHT ?+ =0CoG+ hC/ m-C,-\#`pLsνĨ/L׏űѠιyG#N([' tܟw%U0A&ۚp}Ϙ\OWOR>g%iϗ}K윋P00BEh3vgcpH唭#EU `g)]^zQ,؊%r7vMwkzxc6R%Z.5] &-7xGc$)G2 3hɋA;BY@z@ sD3U<Dѷwq+K޽J?QsĨcaà (&3Hs ?Vu[_4AݍnYXwK4R~cy3ڪgr&3ZA\/3Tcn6`aȇp^qwltAkD:z^l~Zn{b+CBVv%h+\t!uW(@!> ȹ^*3+J޿lF 2.0m*~MS-2稖3iQЂ>vot)AQ+Y9bHP 3SE5 l;\/a'*/F׬)ى' (+0bHV?J >ym>zV pDdg1,`2I~a57!Q00!̨=S0t3,@f(Xcox4+ /[.Z Wq{_!->gq/S~_:GЧDQ*Y*# */bs]dvb 2 L85#xN~^Mghw撁)@*{;%,RO2LR:L^2>a_7@h5Ae@QxyEA(5dFtUݛC3q­cNAM\[DI1>А63xʩX0 Aڜ%:㾭 Y<N!SVBCm8:9ۗ0dv@/%*e@;oyd& |8PT'@ir"i^LΓsĚsT|٠\ pҶa`Qk`ΘlVd3yǫńylpr/^r>#x*(;t$8f߁' (=QO,Dύc.Xet H`L^ +ܟNhp. zY<1IΡ(N#(3Pᯧ8?ճ0-~LdX"=+bUh31fg+)-9󧏏Ÿ| ݌bt!l%Eo #3[ϐمW6%lTF:[@!_m/l#*Dzc\TrםɊ5##NL,X:DL/#QaeD~ӊxO%@E3&FQ>Y ;y .|ń <@@=rǜ51PEj5;Y' (Ch/⠟vNfkz708z_'#)=',w=dt-<>>Lr/y3;; @% e ;e߆;1"Kl|( b :'02Ƿȅ!XA` F|xVqNG-]Ɂ̀9QDm@/ΰ_197]!,.a tvO8K ={ fmџ T`I׊bS_mI3]o 1 kh08l~A ń\륤#AbqnTH5'ǡ?,S{T|j6;_m6WQ3r׌[/'L\ .^Ӡ`LH +@sW5lgVvjo(FrO$~(C^qYvudr?De`1s#b„U){d+xQyyP\arlw-.&G,,T:SS (f\&;mv+F 3 `2VgG^?+vg&`)ɜ(pGljO>pmFou`OS| /l-Yվ]\?ͼOG. (4oUȨbͩ.ĞP2]m~pbҖq|d{E;&Yx6Ymxo֓v膋 RL郾UQ~wT\arZ_?|o׫ OlS54EDFbQ7H 1i >xL^s6ZzNÀ6ܣ=i`Povvd(/nnnnn^LKNWtN@{K'D>|Bac\0>eEB+aCgw0xƦ[ܜy\@6a-҂=~a vEJsqPG`9eHD$NX/Ld e`F0+$|7zX6̯o%!%Ŕ51yFuvKsزL^T" p>T$}>Kv߷ gz2w(hp#+~=5*:-CbG^QJi&[ n ٦ufsl`]<+ō&0%(<ľ]+X?B1TT(vƏwu0!c,W^h@IDATtL;~MyFd3{0 g_'}#9E9L^M0`D02%' w1δ"77lTIEo3U{Tn;^0w{.U4Η"{>E5 O.8 7 WY=M- DqA8u6?Ӿ#]p!o|ga~1 , (횮|̉' (PB-9m?Sz%}[B0ex`&cqpbrCVLPpBYqD=@AɘۙgOW.U&* ;SSa]^q$$hK8!*/WWsvF_sJ !|hE  G Û˻'폷Gps[ J5ZDU <5hNׅ$`{VՙĞ$-Gy0/=6JH hQu΀`TfeWleKS&4NӥL Me8#t4qh&cmAxաhGi$z. @a6,#gE\6yBgϟ?o޳Gv_T9=n=߬YND/Ç0_WvDc>==rxŨ"sG7k 焩&Ynb8 (D_Fц Tg1jDBNL^lÏ\z|9z9^ZXFL3 ΃}g3tAh(w7Oaꋻ_\#w7\ֻhÁNkD,l8l҆821$9wW1*EtB=H|5]~ˇ7",A!Wm0(l[[KD\%!hn LZh?ܩ0hkI4Жy5RL%bΎ0(Gvl;fjl;.ZsOu@R7M"fTSF ݳݳ@T)+hɜ(p@  \e"{ohߑ=Cs|p,2 Q@XDGG0TC(8z|&*ec6eRh)@%")9]lKn>3kX?P+Ra|2y=z=<,,?_=/XvH%+ϙaq3RBriJeHWuf CVܷco(%|O)}p*a"f; :HKD ,P9;sb9bp yc읂 z˰%.eu0 1RyBX'sM | I~\5cxv\7v?{QicC?`,7ÙUM:ac", v9{4!# 7I>Χ"Ulb9Lfxhyk$dnxsS%/.Ӌhu[?c9\Pi{8KV-@EzBSꤢ? !~^w4{s6jЃ0]? 2 -7Wh[,ZQ Ͷdl>NPzS"A+̵-Ro-h*5rlG(D6kf 3@;"Ns>JZ lgҳ1u>@zz(pFoSœgϞ#CϷS@yGEP0ڗr O<); ?߯#Qtqe@SpH$< PN Z 6YL`gHCYdGI? >!:@ 4F&H '5oǛas{F`$Wdy<3߂KdY̹w1{شR%s `3k+Xlngoxzf7d/A?zɔ'/ѡX 8y9r%WdO_޽ 3ߣes.hKKD>X{zs5 9_n{3q,c~}Xi0d C'";a9o%i0t:;}!/o7`3_K>sCyrdi3^/F?I돑nr;;!)M1h-fL]9߽,f|)v,\2ke=qa1 |h?F&tr$ as}a{|o7 ^k3B!Pś (S@?`,dD%;ٔ> R63^m,;}kO.U<(وE!DK9nX[IehT,-tr7"Mw1->@\1i^n$ny;;nbK,߾+V$@yz(pEOQ\xrȂ|I7 qK8 OW3C8Bٺr4+Y<9IZzuQᇡ߂oX*9"z_0*,=\ VOJq䚀g6VL#|R_2Mٰplzԃ,34z]@͜+w*n">6nF )#_e8t 4w;LS* 1_DlE({}9 HهW>$aZx(:M6RϞ"Y:,݈#3{E bqK= w3$~TS`U}>J`LK" D<p8 I\_%F2x?~K üJ1qŷ} o0,a>}lDQtr$iF݄AS9k9*A@8ciNGt@5v֣S5͢JV6ATqW_=<0˗/WkW+FsFtG~]]90|qJUr'ߥV2;A}+g?VeI+8+T+ס]I? !% -s姀ϸ!>k `eϯD^-n PO/ -A~CAI`saFİѮ=.{+-Dl"Mn&܋)x~t9.JhW p2' | ?쫻ɫ/f ~pYo_Ȝp3¦ 9 @b_%F/Y59!~SdĶ@F;4u-$z]CG -df0jU?=%&X 5ﶳz\%T+E_5|t^~?FY?r|ïYwptoG;{=Gbvg9tվg7O\.^>~6-W^jV.m|ưLxZ!- !e@ E~?" wkZ)1wݣa$z`J%s/%; _Οo~u6F ONV(ABVtXνO8=e-\b& g %_0{0`.)[1+YD| +0ȼwVgC+u)d&fbi#b!!h Y@9[oP:g_ fs6lFr\!g'W*i~gO9`;?[,zbBwq<չi})^p+vy{, r0'@c;V`1x"[! RI};52Bܐ>m2"|'Ea.[ i`i ֶU-&lalo ֽe"(Ve}\V ڕ?F'&@lQSyP>.8}0BYd[9k"h\NX\AbW4}_BoQ74PiG ,|E/6b$9QDSƏ^OWs.(˂Gt*|)*x|؎ tv`Lr-`zF,hz{QDD)%MC zDyh0RH'*\(MtXޤqZR5O6IcqUO_nP: |ŽKOYj0۰Öfl_Ê/%{Se3t=oZaVcoV a$^:28*qb0/Aj 7g\g|SLDC^1!}g)\9JE+r~-C==>GV[a 9NV(^[0-#gӯvW׋v|9I`م8o{e LgE'{L)|iG "CX3=# d>*QtsAq@ؓsԄ޺YuW#=oSobl{M7系vikĆ?>Yr3^^>lZs|vv6{1]gSɋn>k'bfczG9yz;:߮8wd͚'/Y턊zSccXl ߌEh3J)꧗4RD"|ځ41mP#;I go?,J\XiyZ`9#>+i3@š,9C#9E1N)ʌ3rtI9g2C)aӟ[·BkmCxWqm.pqȈ߈kv]B,-Ǝp%+~Z5} WO>?q{rzqtXlw pd:s9d|p6OO O&XlbbF稸4l+g EZH6) Ct+"[>Ĭg֏ZW[r_ {w  {ܱ`j{N<.7L3 L_3ґzF^V[r6?IarpB+V{"7p;6Iy:y3Yv:׿?gw\<,.x¹DXPa}zh) - 6[4}jlc(~Xj zCcҏQJ6`dAYڪ*M[Y05~˫E&^,Jǫ߲6Ltn4 6*B׀bJὕyA^)Z* _=jPm01~Ce+9H/t{a,W~nE .(qm'LQZ?źȽCe}c.Q/{Cbt}1}jǚ:Z@b;=N8Q)AOG5b݂ _™.Y|>z $CXS'/[{p7VBB S* x49E2kòEaq:pJ'^ aƼ?Y,EVΗX@<;I'==2_zI!.)KwXCSkRq30k8Uh5V)wP}m~ ftĖ,S\hbtv總眢r[,\"cÑ \Xa8_ɶf(8(t9 Of{V@EAM9t:Ca.@|5:pkABNT mQzyfp@B$EpVL[j#=Պ݁wɥNQEtFwia0'8'@E5&)BXH=_cX@f9k5& {z(PC o}[N*!=ct*=C{0Xe0-{\"ʖ s CD KWB/>a Ppujtr{VO9_fe4Y1$1W"Уd13lZ7{iB- q7BkMAjpx{M/t`-kt޷[",x_E%{$Nd^?jHt"It=;|/A/U:c%-I٢ | $ 1yXJ-; d< + >P Uv& vj.ngh z@wuM T鿉c=/%a 65=yiM4?e |H3l^prr}Ý^)R%?[Ƶ~ Twib u K)gNx`q.DCrg+̎dlqYKƷ :XǑ',S,j`VuςSzS_ӭҞ4GwG#`՚H:|=i.Rb3>a~L[]El(,8E QxPsMF/49ݽ?NX B$5}`wLx!.݃ "nT)tiѤ]xʎB KjEt\ԑgU"3}У2UQ?hޮS>R2 ”Coϡ a(i2e! oќR4 ni4b`Zu-,:tb![d|tF E*ND>T>& 7\ p8a8~]GRTx 6! lg`9(E&P8cFZe|-+3&7;O~2(5.,XODU U#=si2Ρ^˘%Xz;dd`tq $)~Ig;jaqj0@VM;8~=ěaG^1 D&9:]+ *%,Ns$Lko3|2Zu!:*_ӻY9Qt!NҊP0q"P4u`ƮHZ;ͅPޘNc+|۠MEMeMd WI-F'ϩXgifz@> *p7%=$ixC U?˖Ma?asp]Xժ9)fwNpԖV8 {zm!W?߮VPpW՗_~AY+*' ( )AFʕ~ד~MpG'9t`,fGYGH8gCF,49!6:0øHG@0"G` -d\'7`aRmҡoM ɿm5A$u<.#-gN]gF\tRg9Y籪5D:[?lWFU62X,ol\*Vp&Gാk jX6*06 Eoe7[3ܖA}̩%]U2>K W%e2!Ϗ"&6u;Cs Ce<^TNj4sΣHihnUq̉' N[n?[{$ȏzjLqŊ-.RҠ0}Gbd͎2}l\+%$H q7:rqIT D@:Qs$IkĪ"5\ajer8T̼7xj*BTwp[k|کdœ͠ȘVE?az{S)4})ޏa3pɎeܻa[pê>5{W|ݸZ2TeiV76vNG1E[cI,7mALGs/ٳ D,QXɳh?m{HpND)>lXç!3#ȣ_|A0kyF \GwTbf}_3ec{`*e@9 ѯQfd/ BdqQYI7!]#@EY!E]mb[طƀ.=-\BP'3@?aU;0ʙb If1bfhيXP^Ml:KtHN Ū'!)},_̯ΰ f(/7"{0T.-\^-5h`zʍSCA~4(a}P9TT K?2+_U#mƻkP3apǔ mv5cRuH]?*2pˌk03"dy2ci,lᘀ׃sh#,18)&OB+] //fUja 9#y(x[ڹ g5%njb1X|s-nt5(wFQľ H(ae ):ґ" a#WA-#a) 1#> ]q3n'OA2߄YG$a0?!R ob,lRºUZ<}RsT`Z3p!(.B.nʄaV0F"LFQX%-Žxbh#O1-?-T:q{hbLrSs9(Cͫ# }ѡPQVàd:\dqCéIS<*~*Xq{&ЇU‡B+(bmhTއ?fJqu33}ZҶ٣g6\"͖iF?^О 7lyd>=Gʛ5g?{~*n_ٓD>Hu:sloRw̞t `2yEJXۢOo>Z6,cu%iAY Gwn$== r0{IN'ݹ/xX|[ 򆣇bqN*[iM@X ЦC5zRv-[-N]@FIfWດ<Ńd8+ZWRp`k5уSD'v 6OfВ O 'u0e]2K94spmR>;| [<95A'Y\ABN@x&12+(}xK }a>aWy=%qlѴ HaCw`ʄwJXܘ#D?ȯ>֢icFgW*jZ s>杅2#A}V*"GWծ APL[pۜ HQǐLH-]h=,wCݕ8Æ0x)lǩ+i:B.e>`H8'C܎J{Ъ w0>8reU*`EoK, 㸌P%i5)1kg 7Wl{เ%4ޱ߯1~{ܭ ~DpUܸe+zRd~$pE.FQS.\gDV`3ڊkjn@!w^X쎲d 1" stgK|-^gB$ճ'ViԈD=E  Hu@7ݫ >/*)ӋB D*U! Q#*C]+Բ˰8ȅzm0[ Ghڴ_K"(;| ?034B[DI(O׎u5ؚr'%Z[LOȲ]󎪋2:a6 ק^1?콙yfzڮvz:{`^OPqי &?ES@ཟ+{"}Ƿ/>#3wsb>3NdutP|T{R+kCɬ̍=`Xi/ #sA݀ P`ObBhD&m[[%{uCdґ2  / ҇pc^0{It_-vfۭPzUfSI@7a%eEgӔ[Wv\e-9'5 Z%{LJi 3{r'Kmk XB6D(QI-yrE  q-nXaC&iW8}B}>nSDm)#Tn.֢p f>5{F hX&AA=Mc%Wv16 ZgԊo9`ޙf/r?<՛{UI}$x^.(d7Cqx0P8f}bX/݊S*[(`xx2|Q;,=뢑!02}cVB] DPhԚH%ߋW (~n# :"fîYr'xF [x0T(-*?>hH) (ٌ )]6qОMDn6G^OMKݺZηb8qU%+|()Q`@⋻ɣK.ʹg==7>;!ݠs7\@s Q '0ugS*P%$b!q ?5MHfFΐX p`. 0n2+[ҕvåu6UĢ}?N;-SI; OyOႷ 3&hHk ŭVy[%WT⯰o`S !4b\bw^J'ُ ݖJv f:~2kɺK9oq5dN8(;?of<>b+X| اuN{<fȁex%e,cZ7>:b"Sn-nk1^<Pfel0GW%),Qd1P ?n\'˻̼eBLg@\3^qS [٫E$)xm*n[F+14 %m e=/,B|R-@CצҮ[au;gmbbʻ4&)?[Q,%oO(m< tmz +n}&l&eDe)opJ ʀ㵗c9aω7g 3೽^FbvcO8'j7Z4>9dN |OjsϽb甠ga]G?csws[_سWFv1()S+z 8!=bAk)#Q$%ʤC0J$BJž%9/1d%AB3A -%Œ|n0&Sb/x5ASc|L x̋>rn8Lg7i_Q:j@qzTBH -C ZQL<>.~"2][ xmz~?;n8eb+m1ۗ"Ξ^g`,O+✻7|e~lM/i7q:%PEj|:!GtAa7du<ĐTkqreieڽF= -L;2|&ol?&9#0OﶜV;8lv^> S\.O^rtw>7VP{<f-l_2 _*`|S~/{,A:B05B sVI,jBtGoy :GˑmKC(rtלAh&|h›d8( Uj$ιVyud6qSzˌPWDD@Lm yرWMjdjC&5w_YgLb SpkvIR`l0গt KYPυR1;iB9ʆj2h@uQVׇ( !6N=phGK}T9F3G,,0D0(@[Ypx`~t \jol;nn%&QӅJEq"ЈՊXڏϹkFhf= `ĭtY|$:>PgDXw`-n1!3P.42 *(#p*l|U q_aqTڲ}~Dc"^64 =lx2@Q &myG௩ O0cp@(Wliq2|WM( mXP"iL8ס9Sꓣ*9 T(´Ɩ);}> RzeBŠĸ ~2[V)GN|g|tU~ˉ`k%oaZ] .ĒvFg~-|Hԡ$TrbDjŞ'@˂ՙ%VpDF G2z3C[n@>6__ߍ^_@@̉8$fV6?}o^K zv>f'xۃ~^\>33fo| ѹ&OtZ3?^ߠ XkpG5 ㍾<\1 rL&/]ưfˤa1voY;YBI\O{&IJ+V)Hpg¨_ 7άbT֦!,[.8,r? ,;NuЌ^^nup,{Mzr_;q6U !&;+E B`oq2id˰{䃬o7Z86msoN~# 4aKPNb̓ \=yvLcQlqϗ6I`Kޞ4@0;`x?5T5B i8Of k='`7c=t KڏWUܭ9%h&~lZ!9lus{;|gM928=*qN')V!>F/W^fdgpvJxXo~"o2?UPXKQ~C;1duټ7tG! ^9n=t7vk@LPL`?DJF歷Rͱ(C›o+VQ->J󠁾w$D.#DX5'鋱pPQ`l1ꡇ *3xWj6E!f G˳Ga eE`/-v`qqզ rF;oU4=co)~; z#-08H|H)8 kndH}zspilTHc]`-]yaR]?92 fP ÿ{X*cG>@ो&V:'qCw#Pw*qS"<*bE.$M̹~tQ^xSț uO9SA^ *'F7*kp8p~F8?J]dq|'*(:hǩ(3FXTRF7JBv@MqX{=,MÇi?m!]W:iea邮` . Rp;M s3y`wNÌ 8~_)k+ fxzyzn_XɌvK:)SpQ`Is 1c[fpNR L ijǺ5SK* }DyaUerOS{Cv]щl! G`pY!tdJ=wֻix >aXPgT plSh=8$#|CڅExcj@0d%ɻd A4a+͗a4Swm єy_?>d),ЅaJ!njooa,J_!DUE *d@ c][C@ 7;^H7[v3eh&xiv%-G'B G92`wSc?16B>:#,j3㱹 ߳ 3?9ȅfr9 {*=訴'_u?\.|xK3xgMd{'3kۍn53>aae !SιIݐEziBW:Ԛ {@ F| o $E>2=(/Q[a>q\ .o)߅^18q ̯yxt)P4"òˬo;@ h fx6٬GcBQbEtihd!Nz0.Lw)p[H tgcWO`N}? 8$O~_U9#{1Zp&l߯GWi!=)G)V @8ˤL&uRޫ0}L `oȟAwǔEv̦I[dwR x䛈/\2iyD40"9s=!g9:~l7w?l9l[shQmCsr.?ar129[ӗ_ \5 >2”5:QwG"~ﯯ_#][Ub6fxpXe:bw L:d`A$uoG_\1 is _%fV,&x<ʑg U"32ZX;Y[Ua dF՗ ,+y0Ko`}-e< wđ06A[34d̚r94\P Yά,o~NB/2L0<׮Y"D5nFAN~/))Gn^~=_f 8;c#̈S=/Ə{nqN xǣ5 3 y:&0D.SK7+OWЖ_r8d2CCs3n 1ޏ]~Wq[gvL_3JzȪ,tPgϟ>BxG2mʚ0 N,5'&A +@;^(* 8vsIZ 3lk̡-9q>Qwߦ -frN D3+vpwGw8*_Vj'm56ӷۓ3.8Lc38?{dYrk{ު `<0ǰü4<`:pF4GGvVUKItwd7_+=!@3,*o<6\;QV84Ե ,=Cgnlr zLERTxj`@AJ(JzF*":./0!Ѯ6PwIpGT=jŏ<L QK*b9{W[J/|s5!l3 s왣zl` ћ/pÿ;^3pyIn"LL'"j߱ݻv_/-se?eyZǢScoёM3AapT"Φ?T yZ2my1iy ƥ؞<5T&}xzMg9}8)C{ k>ŌE|%`.3tXw%gr8; pޯfwWpZY;_ޒ&kr;\"Ϗ3+>:\5,9<?\C[>laf8dI}<qoqu;^0͡4yPAB{l@|l|5B(4Gg/q#F xȞXsc}LzxiŴt-0\w+pkBa#S(h#wSpGxYۂ(\}$A#*aQ6BP@W{<{[sِcطֽHeu $uve?cJrMxߎE9O lS?:X데X|'tlu*-ҋivkHDU𩻇}=1|ɶejaS>rW!`K 9p !ءĭXL@(+#Z˗͸>_fzg |K)U1Mw&z6{bm8'5ʻlz'GO=;OL:s8cq=2=3U%rp<.#8_Q:n7MR_ b:⬀};zy8}i># -iK<05/~ŀ?Pv}뜼s ~>bq D|¹͐q!pE}f˧ޡmN+5BXo 5<]Y=~/>u]o\**I r\Er"ڍ7>P&Ζ!{(#ή_ E[FE7 .v3N"a (Rkn*Nfk+t#k.Y%K>Z@8%8?vS෩X㚀7o 0ʪ@.Nod]L9vzli:m2bhCw]D(Ƙ?kڣuMzr"J/p/pc0dIדwO.Ԓ`.aі)f@R26kݝ "n#[f=3si]1e%kQ5N6кQ1ETy-Ds7l |R#94>p*7n#L_? ])hvCGnk U(!Z&YA`ClK~[)$yq׀-.~V `RlE;qLqd(x=P&m OCgcŽ jluT)vA|ҭ?'sqQ 砑E&Έ+@N 7/r ,8\iKN8]ˇ?3M)4 0lNS7#+5G4%v/{z=g20 y rgwpGтCa**7dݼ d\ "/#eHLtU;"((W΃aD?.-h2ٛĕ2V];2鎩ņ6+'l N. $T aM[zI(i (XWg5 @uL<ȿg>Bh-?tvTA}XЬ! ?9G|v3(66Shď-( ؝*.8ZJݝv6\P]2TGB|~)I:iºGI}%?Ic `u~/y6gKCNg$H AsJaSF/S,Uرw95,<[2Db!Îz-Wvj|cf?G`(pU#UV; <{P7ǯ´l{zz'W/^ؾyf|zt iDeriȃX@E1fn R~҄cgLzOtSìpW# 0:5D".B):[Q*3N $C0` 8 ,ހњn?wڭ)s۝~(;C}>mo׃d0ƫU( ;Iw2//W9J̧ XgL~bB{1gW/b['cX.#E.H2QT),W9w˞=1 0|CLvc=PN ]¿}[ `*C"@U:& MF/Ϸ |M>BAc:݂STcOmMԱpx5EIܛsA3V@M%Fs^psN#t% 1:1`'\@tSvKӣ;0@=OLޒ6s34VP 4*yݮ,􉯇vvϧU !SDu398Dco$@5؂B~'L!!~S!O*H޷ P %fprQ"` 4 B`3Ґt U, )~(?G#P( yr[lթTS0-qETuHT勴/P­P7tPD}{O4r;ݖҩ2 TCO66yS`ݗGZXCI_\,K?K-[Yכiq d(%4lNSwH4݁;O?ٮWUE/膆{qys\aE;dA#:aDM\2o1#{ʣmM9mu<Nju/ϗAGtGg_1( E:RM_^\ |Ͳgn7Fx"-?ȕ2J X7TIԑ;tC-O7vϩ} o] G"8tE fal3O'e=ospǷ d^yScNZT崘q1!6>6\2wwEgj͘*k6SYّ L ~R8`-jթOMxzXڢc?4L}vNJ9Qlr9𾶫N%A| /3u9s9lvln!,o}k mٜ)B7=<E@M68^ ^o7p5K,H g1qzk/אr^1in<3' "\ ̶%B#R;6nHVGn'vH|'*K{RKq|uw.Iyaz'4WEDIgS8{!h [USx&LڢJWopP&k_{K@Nn ,v2%=qDpC-#{L#X:N9-tzY)5 BytJsL~3d}0'SNۭyEC߲P 8Wey{@FX5?i xqˮZ;~UoƔu߁hQqÁ$Dv ʷ-M+cuD0*r=-tG?+Ywg'bלCL޳0˗.:[&Ϸ+9*Jy{S׊{OBW؎a;0y^9pߖ rvz@zn83V/O%d+0QUle cd-=~0F) %RX5flEjnzIshv<~'AhKܵ UXIBflY 3QP '+(rD ͋uVhdj+xN ۄO!,1r+= ^74#9 Gnda {qa>s/qaRSɱ"R8*#$< -WH}XYk86&óJN 3&f)d{O!Zʸ`JܓT]?~SjAV1$YÐP@OۏPrZxBh¿K3 8\իHaqtzP2ΓWr6g |(P,. pޓ9=s;d CrϚwL) %z#PStmF?nXnOTϠGbG5 4XՃ';M"4K$n( -8ScmXB.Cha&2w{䛻%,Laس&3y('Yj#Z(zrB mGIN'GJN vI^*^&=ka+lS෮lVioos4l嗓_[fㆮ52,;yr5xM5~ dΊ>ѭ|cx >L`G'?{, E ")d!89Z(JB9n36L$W9K!42 a5\f%ʼkvK0, OM1|)pz=AmXջɫ !I#"LT,7?S?ɵe!I/0^esz|twU/CnH O_bf`0}ɤ83wK(9=gΞUIw{|}+WtT_a VV]: ط|e|7ѓ14U|Oi=:]hBYĄpi@RvEܳf}MrR8BH &+VN֕\SWk~IT>3&2=foӼuPX΁gՈ|wl02J>hfW0oZ6F>H{ s-pb9$7?x9]k _RM[voݬ ]kx_N/n_q( Kg2azqB@3'_-Fj˗o/H&gYG5ޤA)5$ntʜ&BO`]wIzsVR_>PP7*2&2Gә>.v4+G IJ?(X{~s G߀J\hBmy䯐0"X)X9G;Y|KgAHݢ8X. /4dsWTWD;2N 0 q.5P@FQ%h䷚];[9v9EQ'yEK`L s+ aGwkcD`^ ,_^z ?N,VK$~:K%ߢuB Q8Q*uB2`7as^j5 vuzX\@p?gMs>(?^X,} q{6/O;fÇ}hzXSGyxy < 'ʲ3-9ʸ_ٍʁAՙ8҄= ホ{pݯ ,`[_O~9鎂ȏ7M0CT&QĀq!]J=}9'aNd~-Qwj# {mW8{=XC!;|8€W\׶ kw| ` QӋrlhZ&aEEƑ' %y_`2eXQ>pn`q8j@:  4o8_u9C I3~/,l}N@{ HC?K`NMj/R;.^橂Lc''nˣP? CмdU|v:sM4*BY4rM|\L~Y ,tAIđ3GO&?z?-]7 srmD-{4g=A_qj\!a:h;%~©RlPtrldt؇i}ɛe\]HܓjM4H}ߋ߶)zxC>_2uΜ: ~|OY1$wn%:%(o<Pl-1-?=Mx>?M&xN7C83~; ReM˗& X.=C8h.]pID28 +UiXe 򦳣|јJ"t 1ΎALS} xHK3Vw 6N `Iu1Pel|/q!Mg SY^ZN*^vmUvMpEoi\gEk?b(K1xk>i3ޱ_^j;O#I~I/-e̷wK˯Y莀Ƚ  3 }Grz^$, }{)͓PƐePCߕs@987Yp-p"7xGQJ$W\It ? X~I#V( 8[GT*W2N7'+o-9T4[vٽ`l@K`|;gaĮ/y*]lW nθtrqOdgVmKJ;Z\ *V1MXBaEZ#H|Nogi߂FgǮ|a ~#3 wRkpx͖L8?雿N8-8B9WG|7 QD8!So'.:WR6g~E )o1,SݍP#zQ" -$e)/&і .3x)ta8.p?\_ g@E@uk ޫNܚ:Jzq/M-Y&94HM"[ꭞNjA٬_vrO@-;ƺIžC,iX !POpm-.T9+V"1d5LVd&u5[p,"_ٜ)YPÚ7o͚Owοޞ;; MgY$9񽌸 2/&04Z4Iی5I+܏@8> a9B(ܤsʡ^[l/4:-!֐;7*cU%q .L00d{鸄 ˑcx^X? H=.WXQ'Iȹ`A0]$߲ PC[Vx/e{)hn/Cr 9Kgt-\Q5S6RKV@8ZQ|a zɈ=.N'<L`zfI3oDiǡȻ(YL;Ow4"-jWDe͊`1x"I\~nH"?MUm$uSvKm;v>8rN& L2fL3q3|OG5'9[@ow?yy/~/Z14y¯Li g N✀~\#hgȉYNaٵ"YѴ UDY掠6q,~Sң1һmJM.օ';YN&p 8W֟=MnO y19"{ƒnhOdcƘiS),cp(;慷NAm9ʗk`^1HV~1Es~1|Fl} {,~L\˫-+kϾ+Z&9/W ⳗW; ڋ>֕9:!jeΗ(nK8 L6XP[fJ_.]@96҈w(X5nU̸x~Dq|ɞxO r_6% Qԙ?3wzd@ H|QoT]2BG*"_ `Shu ll;ERpM+nlwQk?9?p>g͊: n9trLY~PcϮ3~G)덠$m޼sZ# |ŽWXݞ5v7h~&n2F-3)E(IeʪHXys"ݎ1^ɚun":7`ϓ*R>D`R.G2":|[:tU!w7 卷#6`\b G)*Ü{?~3zs,Q0nr2\ps˗,X娩xQ^8 ~%@[L`#9('qP9/F ea!6\Ey'Ui1Q*2yhSbRFj:oJ+M:m/7ƒ@/N5HiX2wҶQH +?u,'X^M3`Vꉥ$T4gszS kg&`ʚ)ۯV0WqGPX: /Tn ({C~$=f6fe q,;nX+8$Њ%okkL |gFW^&(Sndr5 3z=O5"ZFgT`0)-? W_ku6iXcy+p<22`3.'3Խ8&>˝`J7nW걈j( @IDAT )72^T@{@Zv1u#Nn'@ϓClWZf+wo7RmƱz+zKV/'5rAC# a箤w n}Vp N"Wc# *)eϲ}T&`I4ݯ(?;R~#/)k,ުßs4ʏ#\5uQ0޵eVe%4.0?u]#/Ļ)2 *snx*Cafce0aAJe.z71m+&é r9ėVƣ!N~S>fuugMQpz1M$[B=óVo~$X{~);wJ9? 'v/Xzn p$;SיF^qo525s~6?~iPmay~j{d94dmLe<,~#TkZxh,@ p֓B"JglEK{]p'jy衼("q`GzBg=!ص Kާoa{n[2 \gL'_?fcuO$cY 꺮nϟr}|;+s= ߐt|J$eݸJ'm/Ѐ\w|F >Vs `"IYfQQa(2}|쀜'Λ~G;,PowSFI9bCgfwo4Ւ͙+ |B;#,jM۷[xʚQp ~` J" (6 C3DF$H[4t^љ3+˖% ^}Č[OOnAʮ42ݧIQ8?SnޠS?%ֻOhuEbHIv,Ӻ$2Ǚ}eE[Q/.KV_0B0P2S`p : {U)PX!T"k޷.n4ޢC5Q(R.>:p9sp-"D&J e{Rqz7{[>tpoӭD4o &)9Oth\e!)r!-8ȓOB[~Z!*,,_ GyYǠ\g;Q B,%JEF@ 1"^pN~v7yGKstr7₏807+`gs9SGنuE8\]]MpD90%ǔM>`bnViO ˓ X힫vAC &2 Nt9$11⟇+b F߃:xzxO+T"*& \11qWUޞ!K-%qhmNI傴SAQtU{.\q/!C;Vp^UH`E+;v'lmQ6. kPr|n-WOӽA@50orfd8v_mZ`%t -͍G S-N҂sVLm7l`Q)Oe=HV'*Gڔ-QiC3|,@LD@tĖd(='5 ^& =X'EzQϙ?/-]2f(#Sp-X=$oS8` =\w'GW Ib=4Pg] )_Ip.\SBE|qx,7 ਖ਼815G!\h-mDaze%8sҭlQ s*nVO\HhSg 6W*l O۟uG j'M=^mgu/ nf2mptϟ8cV% "&S?(V`L`flm9 {A.~-^R_Tt9fL0,k l/a2*2#GXSO.` J[ɓX3 I6L2(%q +lʃL cT Q«aCѤQ(<䕰R\L  0c@"ӭCF7ǞaJ ߢ]EϘ0[c6J/!kzOmSX 5.lJ:W/Ys@6XG#t>\^J[I&S`0Ucz-AikfL4E"W1@l[sV[;Nc4y#V)FqqNw@(˕B;8'`9_{yM@#R;HIњ'|}EskOwf򈧥с&'CɨHiŝ}7TwTȇOSF&d!P 9t7f. CKs B+%\C% aG**O!#ְ3X/K󍲾-ac6ZTJxFD҄E`{z݂}L !C'bb5+e[P_׎@ Se|%\RH`rպ- BV1&@azM3Y%aEeO V-OGЎ\cnCd10әA=NC \*A-׳t=x[㼍'q*uÏ=~׬[\;!H t"o@љޛ6~oeq`@l2׭PD3<,eН4㩎)Rtś08:Y{>ƄAQi3q o&n9%>BQN?S,!УRecc\C|QJ: ySB`oH |j p1 X0z ہ"bfgCǃ都k.8K![ PO|N4>:~oFΆar=15gE/Ԝ v({>&hG5r~2m/85 ջh%r1zo cQ { `E=Λ=<)摹ll!p9~ ̴ +~ 8(f)e dG|/T⤆h>\Q_C5j eUaMG A9]哣.z|}M"=_p5Ïwm~} k<{)cɁK$pԲ#۵P`w3 rޣNqbzp3=qԦ%CPc|#AC?.$֛Gis'9 vM2l( ,ٻo5V Пɟz{~' x^*yW hI'k^|9OCkF/wFHbee=,Pi;6'6CAL?QhDQ9Dׂ=f-H:Iip *1FQr􎁊vp=[fa$X珞fQB46=G!Ȟх?h 9*PTL{* Yc٫U9P#cS) ^N=i ;=yFz|%& `\w?\0-5|S_$Ke<\4U%hyEaκU|WL+vJf^>w}'=\lC=-w Lx_IuV%)@m9'0I .?+m1.'X,wtBTEA$ٜ)3 𠠧l͖w 2g_Gxw y}H'T,&Hdjg}[|[,1g෯{G-S[ KpI {LF61O "a?KWds{Q,;I;vyXVcy_=L8?=hxm0]իRi b,n lG(VG"d}quR(BWp^%9ۯ֥Dr! hIgG.Lw`.z #.GnaN q#x:bI@L'5<; JSHKJѥ}0icD+WgLe[2H)Ű@Q蟤nlOi1y?~9vjݜ8~ɚ/r?yғ^ u_<0 ^"zArE3Q9[`!6f:3 V?LIxz9a9ɱI! $2'~g ,:kb,f2JU+9oIZuv< LD9%+3?yʞ9/DI}?ŸA/;ҟGPYqp?ҳSp2'$KA\0a'?ϸGQw ,t\ҝonxoj++Tpƃ>D}[ T|`һt2L_B)cݟgS2 RmF¼|| ?.˔  7?Oi_oC& 6qaS"k_䮭ږs(o˵3q/o)7Ys!7P+7GT5 ;R]`U I6P.TP؆9QhS>b /%imXBb0rR["9:t ov-'rRZv-4;LoPOtK<.&,{_ϷWw닋-rZC>s~) ah]?~L9=˗^s=g:Se K9wⓀV_sH<>U&@!"D T1#(:ӹlb@x:FtWOQB.NA/~VPVޝO71V1rn?u8lyv?R} ~n?3RS EG J=`%yLrwgyJwW؎>e3TCSF;ִ89n@ Q/n82"b/G7y# WT#_4߬98~ɬJ)ݍA1!7ϖz֮(CSYrCQ ;8Jl]6O\Ě%f<8Ώ3(6 f%D\+4lN r1 6Yy$3tr:ڝ? X!?˯X& ݒ$l\~?cKHvgIi. ̢˜P=ઇ5NX+җ1g ʋb?ʣmx4oC2Xm2?Ł<H=?)^2b׷цS+Pd*sdm.DQ:RIfo}onqXr%sv;}Ak5jԜ glc`>jMl~? gL ÓC_pe jS˳W&kɇe4͖r3 Dh DOS I*MQMpHU|o,e0s݆?e-ƔSHw% qsXc0LuiMqS W052ЁiZX--N_qūkk8>8fZK`b?yŜ]s`E3*1+}1f+b a k"aHn/&0ܡ6; ́5 |'OoQ\O\96o-9-B_r9-kD<--o}BnkmP-Һ|H2+\ALHio9?G؞E1حI_ZZCdB`$Q"Hrȿk (M_(ÀR5]V|pES rTtI-E`d{f9R8B5ZrZOX1l"ݰB &A6)c0m[w @:2@ ymb`e~|o>â|+.)JS*w @' Lׯo߾͚a ,7ឞ'+tig쏃Y kH8 )V{yeKWAN[X2#N:oHu{)ÇtYSUo|v\j 14{U(w0(ґap9Q|0*qϻӟ5NVCFu<*S]lDl\/[hyHKi^n"i;L=tN?(sճ\xM@JS>M|MȨ(^yx_Y=Zi U8ڣB!yG/usdtDԪS>|{8]7shDQmHļ,fDf%6q+AL^y^ɒy[0Z`+0λrdo0<5Os`0 b哙)f_!1]O1c?$]v: hpܸ ~gӅUS.2[MyWD??-ی*UmGem#Z҈L yZ@c$08^ bF"e;8R뀺*ʑys?V v}}%8V[oys8(r,tM=X@7&ZT֐E|e5V]Ӑ}0{MG|z W%>#u@Q\{E`fzmd ym؛&}C`b|{.` 1]c 4uřl`ݿ=Z@P-aꦾǐ8]e ul-^,Ԟq|)w[XK i3/)oE4^m`0pK}^e{y`]>ga ai7߼,~YSz۸p~`Io\~x{{`-[~wMU**ҝg |_w =WTa֑ k[ʘ\C_`k,\ Q4ozè( BaUxe䄣@BhP7H]<2vmINc̏d1]qh"Fѭ@,h 1s!cct7 5>1VJS_f%¿D pxg]öNJiӋWzjXLV5sn^opz'?1l)q |NR0sf^sps ]6ﶨ`.2005ð Mv&AS5cK0ٵ\ąKR a){A;A;=ѝxab_u5'͆>y FxE22%`=J:F〈S`9 %+~>!l#6my?/*L-,wQ&k0v?~Y] :1{LaHYg?N1 ;m=0SQcE(WVO`iaK1u< @rkowQ"43i<znz2 DcyT޸ iwz5eӭo짾u}=9039-Q1`a{(U V/Ł[;`9O fmL 9'|IaXxB?Xޜ KMiwK^Owa9m9Gdf(v쓗ŌI)rޱ NhFCv)\ V` no-0R?:'LIBhkK`Q\:$TPqg@|pǼI<8^|g݊.v~{Ξ :L.gK]Mhl.`7khu a>Ջ<$ƁQ\Y/'NG -:R 4ĎEk+6]o'MS5FP >UC)jmit[Ʋ۳ryΟ`=YjusQ0Od;jp: WS&ˠ,-5J}X=ЧR#;ڷoˏ&bȃ;nRfaX˪|tl.GWϠA@Ư'4t(UtuF=! VȚ+]v|c9wO[&w(0zu\/f_Cn?kX@ che{gޟ. "ܛvj~D^^أ~f}ocFicCɗL U c0.ApNLĎt&m1m+CȕAkS02<@: a-N2#s}Hf +g[;}@kg* 7d;O 7tSFzT8 &bT!{n=FPJ1DTu kBFVX:Hx74mvtF5-V~F]7 ϏoYqԌ7w~qy9llo]׏{ZvhtJ8T*~pdOn<==x L)ȀP}4@AQ,"$#. 9!#ucA 3-* DG^k{ߍiЇtG\V !*=;vm5: OtF!SF@ͫw NVO1tw7=uI={pY#JVuN|ȹ=CK-aJ aT'&N\"z5S|;>\q*f0ܰ&?,4pAkucxAx:SF$0kܠ `cUTc ,Ǧ+% F_`1&q t/Yk?) V@EQ 4 $8x12lc +}-/.Q^'OOLb4xC=Cl,0ʐDϔ#YGKP@ t Bpq̡ P]VUFzS#sLwh cSF?wKp~ gɢ3pgke\vIA6pl+[-?.]f;=;v ͵i!گ*߳=pcc%~&5m:L:#wQvL"@:}NVSɠ+\c M; lC:[P\1,JbfzyS9 dwxX¯׌l L|)04c:TeN~_՟5K5ʉq@}Q8O_`]FN_L]CUi0ejPLQIUUZjc,Q==^][gy׀.F^["p_Y׋`.. 1"+";)\z;FXdHQ^^Mŋ?G_pb铟1[ީhbYgcL//t;ɔ5fWAUS!Tt( .R!z5H8^z #M)QN(3786<{\w9g*z q΁ GfG!=Ih5OkwONQ6QxwWB쒹n^0^B@tL|QUvdHDm]{!$wW--%ȷfC"Z @7ؐKɗ<-M?e߅v,[E0JSߝvPχS>2ڿqaB5z~XES\E|-f/}lw?/L*5ydi:[8+rm !mX`/V/YNgHnvvl7~K)G;$6C"maCNZgB0.EiE"d7}C 7=)r\YN8 *8E|#<#\Bs( zחC .20js^ DW8;%`NQ+BprGi/GuaWz[)(;ѕ `UNhx`W!O9۳֢E#\!)"kb*NL%6pÒ՜㔭)=-s~֔!;]AGt۴؃>:=`:zn { %p3˟w^/&mGБiLY^j0!F{wgl704dXC|\-W- u)hqKMkB9 p6g δYgɾGVޣ sN|SN:7 &Td s7ݙKM?6)8u2!cw8xެYn41 Q&M'LJ@w-wU#NUU 0KfϞv=tf  {I'*٭\;vI'*oeL!/cC~iK{*AK:Sqx@IDAT[5zMcM{; ]'oL0uEC.%3V5^6[jqJ-g R:UH@!P}mZ8W Q=O9mr-@ tl7J +} wP:Lu-jlߴ3ͯ}%JU_%hϔ69^>82ATbKZ4y+_k?\O^&7/nr *X#`bm nۓ1_剼l(jށFQ )m V3ެL ] nI9uڍ֌m9 ic}=[׭= ua&qG/?_2;;gYX/Ħ (b{'خQ554w>)7?|7\{\,?~Bk;2PAG1'c ߬ˬ4m|oooN~ف7.7W]sl$Y^?:WxKmne:%EtT>7gYZX]ϱp'qK7NIa=铿|_{.&Cv~79#ݫƄȉRG"IУNBdmfri9ucK@adȪG6* O*O冗6Orӡa!_ȱ ߗԫMA)fvڬfO ]B`dQSb@=a_~(*TgA^JÚߑ/9.. 2N^º~Qb&2Р=&/  xLX1چvDq5X؟$x4lH0ۓTlck9b9_[y8Ym;*5REc)LY}i%L rL'O8)}cX`fn!3<]0<7au&ox*^KTc oҙAg!~r7;ߞZƢ4c!@8~=< ʀoh;멍#BT9`0y܍|m>l=j(Y4ȷcbm@ TzUxC9_l<*sfjo_)[laf!&d WocylD˵b\,HQJ-~sM@ NS;bzX߯C X{2CWV1LQC_멂cӿ|ODW:g^.9$AWcv"N8%52+-PpwKlNx98 nbLZoblGr} f6{ɶvlvo]LEs2p59G v9>$ޔ دˬvpxtw}r ~~/xJLzBh;~FbnecۛN)M3%1n' HeZn7sO4lqphp sTA}{`~rHd#&+LK3@t4#F=MQlPo+q\#= wQ<ĝyQ*ǝx4ya {zNCLv蔣  ĘvD퐴2ra33(Iqb-d4{"*iSnMurLxh%(e/l AI=Yo_'е4.L;#A֣UkꧥԳa\O\zCCJC}W{ʇ 3c-*(;IB˔Q9'kQ8 g~Εzl.XUS.`DOIӧatgZ?*wdss|a 8y2~̪4HR/Unwҍ}Yng7l Dp$´"8 ] dzm̻q,-#1ƓY q fv :PrA)R~H bDjvYq5oE_/KlhFi+.: KOθJ Sqǝ1eL=} dmUi^ϔ?-y\&4ä_*k7(xPJ?9gF?{DGF^Y_ghxc N4!ƼN(cp*qrK M; $)"+KVjzB6/,re].ԯiC!C0kJQNcU5" ho$QxTz5ah%@I\"Fj{JuRaGI0$"c8TjB$o3 ^F}'{j*;]b-|ê@GCX)GǀúŤpWk%Ef죑 ?(P=krg^H$?bh޲ʞ.CL" mXn3ڵ-| :GNF;j e WD[7g9ka3݂qwusI]ΧWw촂= YJ92?"uB S}8¸ά{4izxk4gA:d>[:!dV7w\Dn]WHZTT'.xWT BD!bv)!^әy6\i S8(z'BI=#3} R8GJ@x m_*)wJß(?3GY@eH}Yѕ'?H+<m¢=:w$98U[d JIx"#{ \$G1\%lUt5=h@N/:)'.P.\8υpT9 5͝j8mvw@ xY/xяЯPį6q-=-2ׇ;5%@5uw{ݲrofH_ïR aN]ŏGfprؙ̓=0(e *\U)r,ۧjdp$K[Yõ*R!P'x?fˆaCMR0bw?׽80ӯzf.EioHbGVd2-?D[B(fUogclŌ= ՟Fqd+qbǰIji[!m#BwۭQ/)LeG O9X"*lF}4؟Si\Ϟ<:sU/=|͑r25pRfY?j;?-:ݎle,P{Nsfa)R 3 L9\Ao0=:cy IHH6(g)Yc󠟘%[JPP_:Fuِ Mա' 5 O7׷dyuXV=瞹6X 6 ˔iCOR =mh=Cf.Q-= co?-;u{H ʐ"t}鹵FJ+i^|Ҁ9j3{8qڴJ)MQLg[m _ "_c*G` n}wA9HX@ †Y*[KBdUlEVVnPP6qD9&Dc I3u?3 d' %Y^j63 @r{4,bGlV̈́l77'l4z1%Kni.xuZO`JgtAw`'['wvܲ&˗חݞc;ѵ\Xzr^'2C#[f9YoCexxP~~p ~2 /7M-YMPRcFC"=q#i6m0[%rdyLPl`TsD-iI_c~"$ .lqi#\d*y6yr%lsu 5^Dt!Ct}k|6B(lXgMCܡlu&7B/4sGV췘Ͻl@ VdղS8pW|eigQUg:Aq9,|n;V̻B;Tm S_]o%H'}kTxo!$+*C8" oy%YrmzL^c6Ia~-^ɢ Ht^Den?ՖQPƵ=3-dK8 UbP<} S3;:`0ڦ}N<ឬv_  =FfoN|-(yz[7L>Qb ঠL L 1+խ/h(98\%tj^Mܭݝoq•7wMa'{Z'6aMk ].00o 1%G|EEEl-~"ZtGwwun0 3~&L T_.6?E߅K*Y-}c(e3cddh3Q:9[?8a@,YeOߧ 5ҁLEKd=vLvkIwB2 Ҍ6U1IT${A,@9nx$w d:9]pXtscg]"Uڎ:J=I0\~h!wRo)l\Ch\BV IjU Z@Gր,W5@y%!TtjL{O_\H c뼆$zo[x9A PUA/Ο~\m(2;5𭯫FIMwⱿJ' wS&y/WϽѷ\Sj?yAbf&ԝpU> s?wahg/  *PI4x-zrhy©$xM3:dq*"n+sHbe& V9{W%w[\A32y't%QSK`-^#75Q0YG%S!P1]kRL+w6mT$IPNU7:8Į@g_t;h`Wpd-GLdܣy'1L+UUp@V*MDqIC@g &kzZJRX2 Sg7gadʑETcTZ npC-6Fݍ5CGfJG="ʗXi!^*ykV`=Pemޟ<5Y R ̫TH"Y*G&'*@1 X>AE-RY>jЙulqu|F r>麷߼|RC{ I/t[a6Jj9XӤu`|15%6yqv9s˘3s͜]G: 8 Oe wAu`ItOKޫQw,"5kn{uc?b0=pQPT 7CNΝJGW UI82y{L}:uGp-Q3 ornZ# y;$=Q7DcH| ;8 #ăʲEE'lQhjx<%֩(gL'l E.^\x}UlFk#JNx @|:Iòo<-@qN@ȻE*zwގ9e !=Lۓ|Ov~X7ƙG7<[A[SpAo@"^L9rq]?;&7en3TbKi8(9p_Fu=%vC;@*(*+[LѺGm{Cy̥0 {U` ,hŒңݷ2 \i2jzRn(/1z+ݏ:x~80ܙY Z@z ާ[ pig`1RQ (A% 2NLt(ݮ*Pw.[V2B  >l1'_c6rWe=n[3SCq$!& rp0;Z ۡO"f783\X=eoeɢ~d}~Y[}ƫy.m{xL04q6-۳jq/ǬtFOa4Ncs1cKzW|Oaз%XLñ l QI> ުqxl«CX WB܁ըa^--M6 MT g#hߞ(D FVR;l5_ &K^]]N_z=s kKlSɿz/IeOXK *UFؐ|n8 S*Xc+ZKGVB u0E"ǖř23#i !G=6;oS$k.d91 2p(%?dgLKmK!\ BC߳b]s;F\P? WN/?~g2b $nMwBZlIèt_esЫzBnZy%8Á'#eERH猶h^(GQh0&kHT@EEö )T^bi UҔz[!ގۢ'g<9;|s@ޥW VYaKK*l7g{ 6tb?9?؂|V>/~1{f\=?tzq%˨V'[ C; {ٷqaqd1 Ŋ4PzV8j6 hD 2Tǁ3A5$x8RF[wН^zo+큡HP{s3ܿ<3^p7Sޫ P-0׽`GF VHuے`:5gԃ]('RNw#ڭ"*Ê{׌f#wk̈jPw2 G23vߡfm-Md8=W *V+XZ*ŝK{U׃}Hr}e FYY <~;C68!I-96m~*FhkR cpcf[n=G3Piʳ-y9B@|~"qZ-W5mM58;=5pR#Ç5ϟ_o^Ś-pv|}KtC@FgC/АZ{v^qoޟ7zIt#(;S  u>~b.Ti+ua^HȞ#Ym(xz΅{o62&DC$B;jt).|yW0Ϟh 0V%*ez2KiS]Ho7,+Իr`T"K,X51-?Gad9z;L;X[ }c\ ðq 4^ڨțѣd猯 KFdhwV}B/XLlrH#\`d׋nvU8th5*O%NIn5 #&@`͚feWk:usOUGAK p6=f3-|%0;dy4uw a%·R(_F([d.vK搻eių8Y2.c=zӅOHXݏn 8%9[z* 1>#C5CltSܔ>B\f mp #g˚f4ul B / a|(AO(z  C*><Þ~wbFc F)N@p׌ BT<6p1>S[i?+ ?@pJע=a7CӇhZ+|{²حL mW"Nd _곭H2uv#p CyU1>X+DLu8Z{~>?1㚀XvjNkRI ~rf|PgCx{]#g rhd#|Xkr8K8a:Vf>jg:|`0\G@?L!]|Zr/\2 ipZH3wђ{ۙow~c?)w,SFЅ\={9l/1YϹ0*6Bqd0tPX_^9Z!(]-&hmEH^T"`?E8JFnh4-˨2"چ=ccKgV4AL©w?M5frkޝ!r3yPlWح;W3|9~va˞+^8npw?#)p]aHr^F@Y%mt+ "ļ+ ՃJ_62PaG3,q*~tv| bۦy*إ˜ (+NQ`?\;}"}d2_i[Y.1X6uY`:gS++^ +bܜMK7Nx|\/^83pxwN w-B L- ̆5?z5 ?~xY(]!V5}1#8mǸ30΢G4Avrô9{`n{]$lYgkL̅5TR37f!5/M6Cn -ԈA<rNQ1K5`CT=x' z \{uvi>@Ӂ`yq՚G+pCUT= 󵨊Ᏼԁv/X15NasH@gh_Ճ<VG21 $JEW{.C{]㗣٤p5+hMޛ,mNiNS5^rNlNzwfwW5k9Tk 畝ϟ)a@r5(wwgLgETSǪjkyxqd`򎡸7 nd0Y0ܺ\3 5 ǝ/@{m0];xU@8=K3ڠg$^YN\C_yV!^DC'NI(Q*$͋ [nd ɣ8}zuo v}×77nbFP8"nrr)[hHmQ{Bcx/P. bygyq_4Td3/U)p>+>޷ѽ8q0 ىmjqt[2A!IvpL#6{]R\]GрQM-9.'uY=Gn\bdy`  >?LtZ?|ԜvŬooEsqgg.fayƆ{s!p3\1TsIRVq/+7~?ppFE`L:"aM=Gи`0EFAI]Q$8NQXE%m|/' c>=|Hwɹ ems #z“"90\wޕF<-gD?EZ%pO. %UdBH0]r:4{9ԽA?QDQNYuϡ୚ Wޅ#n}s^2=o_a#U\߸*v6?WuSfnSVdd?&oAjz/~GqG"MQpd=KZʞu0p,֑e 1aU{5%2T!J@}ִ^V49iym]LY2moB~ uAAD> ~?]⦙F+>]? پ_!$@4eNa Ndjvu=[ͦ p[ uۜUI3: aAФk+[e L~m?ҺgP2\s%3U hd)*tT%V@$[Bt>0֘ HkyQi3x(_IC< ePPU^1_A) K!oSg3LeʩO !zL ZAݳ]Z%-jjL[a}l 4Li_fnu[([f㓎GO_Z041sЗt?L( fk7Y re,av92dl'R17g ]]r) ЎC1zz|8)L`nv_>,.of5nqʛksOӷEFmf8m ;` 78 ⧯Gd)PdJa;ш`Uw萚$9T׌}9QP2ep}@-akn`?9k؆zJ q{At֩ g]x lRKޗB\! 03OΰmJ]wE(5pR>J֙+`w}PZ.sk(tdsrYޏfnCM+v_&3n @*ӡ]?mPʎ| P*ee‚.BBh;4y&A=-̫k*Ԅw= XjlD^7zgQg l8p\\LznP+-iNZW4T#if҇^t4Ƀ b>a:T) {-/9i xoE۹ ߽簯v8$dx:s۟[%?F[WJyURCq$/5=ba)M,|$ƓB_;YKC.*=z``qVk{ "9ɲkD NѼѓ_bzyYjʇ1a[}Trs킫H2 >@Y{PvvLX_1YQU8FB>o|8)\VpJۿ0 ߸@IDATZ070ɳgs {XEJA=vD #3fwac@e6 F")gQ(:pvn2$+l9B8s0860o5!vϥ (%B `nu\u2?<̓YG y8gmq!U\ 9$PfBjwxz҂_!|^ 5]k=/î-3 pkk$5g˯{=~F~fQ7>{RAwEVs9*"IΟ qiU'Ez n˧}U6Rz|un~18;?}hgE3*eE\3"mi$@!.+ÓoȢk8mmMl sdQYT'pX< SBW#+Le}/XjI߫ء x\G%lʽ|1r /$%+ڍbLtw>]+mNQ͜V]0n?>?~1/ptlst6  0 lv^G||vQ)Ӄ=CtC2$Wg`xGPb_ HPQȺ:-10#j9HP8]%tvyO tAȆPP(zw<”K7oG~2qN]NƺeT.pB6dpn-ه{+~uǐ Mc֋=yq~ߡWkMxŸMo;`D寶*w$ %O7a*צd*  __17nnRCUR_"mwv@O S_Bdifۢe;蔵+CEO<=>G㴖ԯU3 hs6 yFg\q@ngMv-Hц[RM>Zw0ߌW=L{3I8&̩ ws1/w?;!n&[n*oT9HQ4xg1?lnwvWhRQޏ2w<tCw=gG(H_%`$)_<%QS5Vp3|R=tpJ liHw\8Sss9BX w2{H|/qӍm99ڟv e?]ПxĻEJhG ̶wۢHzNe:=ƺKC?u`ޣ& ]yezX. @{E,>µ%|%#0|N=7H2:-`uΘA`#{:+o46!$dhamM/E@Kqq@t8㽺dN-Mo&:c)ɩe?YN o?On_z%pM׽b$i\Hݛ 5"/:Vݫ!VlŌ=cwO$*a\zvǑUN)JbBk45ŕ {k2"˴s!U8e|z>KaƄeXb;0'c3T лy%k5l:vͩ} rMޘ#+"v^`9k\Q Zd5i<'88+DN#8h C(LV;O=x6N Ec|Q11!Ӫ4SJYYTFf4 8N= gaM\<!Ę x)+Q%%oFu+{Ta'I %aCE\=$6Ȳ;aG31YױSnS 2Ew[?=;DFZnFNcIX5{GVgzvq3Y3;={A9B1z_{F &ϊ }б;&L9ˎ\{ɮQ(}X|8 Qr$Eɥm~ɆaѹqY* sӡzf=$X{$b J/¹"7E:9G#aS^ĚÜ}(ŽK'Qd.sԡ.a8>}eEgL%)W[5:@p ?C"0Xkp\Y}ǹ?̡7?a'G=l^0-^rSRgXN M& ea'?~>a/n{8|c=Kfˏ#(dspCm--9X6py2bE q5%yiN?̷!{coʸg[t9ogΊ!<iJv7[zNN@Ŷv^xՄk\]XB)7kXsZaa&S4rNxБvW6w>ߡ( Ȫ'Nd"MFZfQ^UP)zؖ6iJ=-u {ÉF+&MY{tM\Y?I _WEPj=Kn!+N;WlnQ"F60.»Up) o1>w/dɣ( Nn9zWVy" e@Ȝ^X] /Wlds+|=Ћ,H 4h;`+[`hgn kU w( !Cu{v_߳L`@f*.A^drڊ:,_{Yg?adPyh&9^ڀQbix 3`F߿iedhY<'%i~9YaCm.CPֿ%z%%^jCY̠uEXX]Tpp8󇷞]Ε?|QA@wO.?~~2kd@jo45kK:t-ۥn9{hχ0_?,__L7L5V.-~'9|Y2QDу+5vn A{SyQh1(fAg%p@wYYK(F_p q?udQ;\ o[R]ev*0_3a1 91Հ2;l{^B(i0e᜾s~z#]hBH %_  *ԪQB~UO0h;26",ij2_8v۰ħ";PyH1C&¬f۠ !O$)>;eR,e! %EMX*aGXhF&ޓՓ:^8Lׁq]Pvf9 Jm??'-2{tגgc]/ 5pR>|NsT 08XY39|q7ݎeh}˷Iu|H1gJd-4#؁4qw#^IVnBWN.T!tH?p' AzI#wU2cr!nq+"7=abεs'zUyYDG.0T *y"klbBeCE% *-8 gy~(@KLo )'?EڊO?:)zoCQ[q5< LiҍIv<<@GZ/et}Cc?'u[h{ =-ޡ~::@à.{(T(a,T~H "/>jxzOBB$)i^>E _t9AggO>8=YcAs=N (/>њ_W3Bw n]OخVfC)|̔*9u,^gv3I, =Ym cB4s SF8:($"_ňʜ'e#WMJd-G!w3$` n8Sԑ̡00zJ'![ֽw!>x o;Ek" 0B Y>qeoC@^C#Ctˡϡݭ~W,:5&ό"h'{ڣ9A81Z y "@V^` D(R0]|Cj&?4I Un⬨Άg CqI1y1jt[#$q`934eK^zOMy̸3ywڢ" BQB& ;G*bq9_` + ._s.f~y[heοwXJLF5?~EAq^兌;"o"Wp.;MO̧.7]ڄu&W\a`$,E@nM` 6n* jo) e{6Ȯ֡46+HUQ,vVdx&S .ټq;M.EQiťRP'krS鎁~RV}E|uoc%{bѡVKk].6 vqh< !@Q;̟UGVrwC ڎ;5⌰ҡI3:?8q|Q}% ĕdp!Dp1A6!?BX [ibZhv ֭P:1*hx_C*Srȸgc'ˈIp2?KL2jD%8%p:;.{MIUa3Ykm ]gkfso`X?Ÿ=aRs=ӥ? #q1º_o78 Cr I/<f)4=W^p](@18b͢|9^?qɪ! e # dM:Xa F軦 h|YU8X &,ʓ~A霝<Pl<&DCB+^M2kA-.Qf//^fޙfdd+5lS{0N,Õ ? C.Fc=,£ o$cUvlfY!>(DzۭC +7︸oL7JBT(,OѯV!~ʝɺ:ԔoXBh_!΂@z[nFd,o Il@0V ,PZ9)&v zwoT(W)UH[T@bK]_R &4;64XgkR7+!}5ZNxn z:,g l]ȣ};SXO-`LT!z Llge;-X\\/\`vSȇj壠g$]$p>ٟ]>/ 5gH|gk&g=c1aR/Yq~S>u+(n&`S1йº4zFvTYl U>h rad+uV{𣝡kk| 3[F@w+y .`=cſ֎мrHZv\ҏ!T$9y~my} . D! l~zm顼rCYO"|E [/ y0} G>48w%(A@=5`Q nFx^F0{3шf?JBQ#za*I^b;-we:#U; xfg'(7pe˻i5,h+KeQfq|5+޺W˳۳Ӌѣp2N G[gyӟ|hjzyv9 X!K=LpϿH>}r^ИdY#'ހS i~{,F0!OJC3.abYHAᦁ:LMĔ2Bih \YV ҸzЇ>0s2I`5Xxg!r-]񊊜a`nCQWu??pFH~XDN6 H K4Z(e߀<-yy8#\&)&@PC5Zs W峛-<!nʑ:5~ݝ򛈰cƘ(9*JL׼F6oFlv+fjo w`&03 drz؟˽3 Bxw7g4 0`DB W0.y`ӄ bZ Û{E;C#cv۲4i3G FEUN%9nȼ7e͜;m5$^##xFrL[sw~|CX1NSe _ kaHo'߲:Z7 A[AI_V~JUcDnj; ,"V%w3!*{q3 @wמqc|Y}o x,y4a~~&8Zngкᱶ%+]oX>޾ 0mqciϷ4֣[ݒq ]Yd )_}&ULbb %G:^fa#[}t<đW8!U9:YH?F{CgϿG' ;ָ4k`Ga9UrHCw);'CM %j-/֋7|]Yt2N~^[XE5)X0KnHڳ??) .bZu`OO9&W-²#$N[n !7x9흓C& B]gޜX̉B>tsY~f e&!npb2nY.gS[sN,G "x]3%2š3@г%`XI0?osKaADm/j:.󉛰%iSXu @~Cln|)]L?l_ך ÷u2YӾhsgP.:@_[ԪnŰ?4/دD$!sDtsz~8p)T ;fg?|/q߬f[.+Kz)S+$z}Ӽ1 @ 6tdh3}BG2 lQ6-x6cN?߃l*Qg>DtyȋSW ?'mY3CDAr`I 5acs?:dhWVkज़Cm5oi# # ,TC9pcPIqd\*S] #e#cT7j*ɀ̴x,! +sf>@ .Z-:ݱIaN=vGDp[f-[qA/t)hB &87]z2 mEp(%(-50 Ljx<߿msd~ϗ@y;=דk;}OY}gj`Q最ݎ)9 w ?GV!V]g$~09LKM 0@M™^.;9 QjWl(vq2*0kM'RFGR8bF86c*x=["}{/p<3"aЧ^YYuzǰ=;rsXlVX Ԗs3g)~K\2qW=2ĕ]#zc_ݟJ W@Rz/Õ,( fyD8`x w)y'Ai Uf6ES?ֿHWQ?N|/FVrW·:>0mZ@wSa0+&_~{ [)I[6|w>aG _:g\e+s8e^xd)ȤCj츚&s]qcc,~A!K(7,@MN[M7Ur 2(bsH5 ᣄ1<5_PC I }&09RX) ~rgGmrGV 5 2?8Z[8s$hg~;/卐5W WQB\|&~}`5k'gbo֗Y8z~twS1Lg\k SuCɔ)Tz'Ivͣ%@i91%s]7 1=eodCZu!u9:HxR!71AQ*^, H ` 22/Y>`O8غK,T~gk ;9atQC~| * JFqp%=ɢUyE |ILjiۨ{ lA"pӀm QھkF[BDXV kFDe< oL|kV:"39Zq>hc ay ޲^ϞTpm5Ǣ\G_;7q|<,`b!)7j1_sFƷ7}-p6V*:y_q nو=h}Ped޿>AjJO=$&JP4PJ)@ P3W\\Hl91B4EȀnT*O~FCWjD9t? Y Wo<@Cb֛ƩBo9NYkmRpN2 g6s?qMF@OƈEGCl`;Ab*#G#َqgqλׯaڶ3W Uf$-q\Uv3 $ ({kB  y~58[O=p`>cy@ Lo^O7/aY?\^nG_7f,aϮ 8/|$@zXb+/_xMKb ;lwu?#[>ֻelpfSVαw?"#u?z[kthf<# h0 }IPqCl5bR2^/pP#&0֜T|;cd)J?Jp!"Ǵm)myr~'aaT[itۀ?IGV'sƨ9;kJ;ѷ5ҟ䳟\=_< Es1./..E9ŧ!#~yv Wrz'MЈ{HcL@NML/0o[ ~Qp0A[{}~{^ϨmߧmlTQ=@c ~bF_3"/,e-GC.}  Lć Nf7Dg}6@frcvN9&[ ,%O]&y@qv'/ F 9(yA7F H)4Ui8N.6 s1bp]L q q 0Qlԛ0C8uK˜<[| *O^'xhjC@͆  C`0CȄQv{S}ތMv D5^:(Hw-wJTi~Oia q ߐfA+gMakNXQ$rreBFZr^&ɧ%31|7ȡr2CGJK' &n[SNUXfi~M @*P1@'"+|s8>g/&ń 涯vsf?GpэWLh YF@GAf ;!3m69PpfO{>jEBg');q HB%Enʑx/(y FJ,{;$Cz|ZWDKxIO ˍtiA6C0̊\! ;OHJ|TT #w'Q\nlo$ {3YU{5 Q UȇZC:hci ,6s xH"ʊB!ϢxǩRm%\&2Zl5Ëi:W&>/lYV QTX̽"J>+l`0׆@ w h_ӻps_f38bsRn=/gkb/׍onnϞ={¶VtǗ18lz?>p>#HDS@3ecl%zSXBHPm%PDD٧S7yA̞'mC՛Rc'J!QbD*6.7ӼHl{9q:B?=H{ Xͭp E*0 @oQR2gSkA ĎvɅNVoD]FN-15/B y"a,AyP p=^0y3w`%= 3?Wx50L0~MпEşGg#{!;;e4ƿ/w}Yot\w㊳W1ďB ;]85?O3%G ߪm+|ޕ]xw-`0O:d 4Rh]1BhH$CQpfAg!xWp]>fuzҋDUǷˆ$mLg5h}Ci>{1=I(IiwpFңS*5񯁠P+?',҅>8x|8#[Ht|֗70Dh'|Q=??8{rq='EA\W"* %EwAb/䍓ڎHLafq=|‘߹?>7@|fm7u9n;?r#'*|_N:DHCY nK weU8-Muj]@IDATb[ ڗkF!%RnZl"stҌUu*^߯O&~P&|+Tk76\6 +w੟j[ )~X%k6Tn~D 9~w4L ,R77.4mlWaN/0>"&^#|>e!O:q/-s(8 MH?bȻb-9 M\C~'K6|NŲd< 5fo@Q P4qj#FVe}6Bp:D2 d4lVFC̛ /7<8̳eU RPsmFt9y⿨Q_F"N Ef#'![ P5Ԇ{& AM؄- 5)Y R2\ kj$:(^AfX|Q`R<i{,结|{INEB2_{ЬHv>[$^3⏕zW_vtǻo;+yd/p?x}jW_m8bkD]^Jj;D>bMפ!3긘@¸!p٣{]3AUtũ &naŒ,^6G"H &M<,? d*}7M/尮U])22PʑHo I * (6:Eۏn>cDo7LQ,狯ٿv=}{rg@ z+rΏN~PrĽ/hBdq`Xo=5lbiCl:\-SnH H &MD< EU 5wK~xTZWNG0s[tQ;-v'.p;`!聆?):mAVGE|`=;?:$P̜2{ %@.xУiwpSC=-BwA߰URw  2h/˪*P i~b!pF CL6  Q6=~3ʬ ɤ?v9Nİw4mF{Fђ }|ceO޻6.C9w^%:1zd+ M6TagWp"a="JjaYO%Llq\qS|f~0N }֣dEceU&-"A@"mPF ue~} 5 2x?Q*3X!<{eRՙCW ү6 x"aoD"F"/2!0NϖHO?iGqԑ 53?e{UYM96ߏ=?c) lX;c|/? cl1'K pi:rM/r2[݌hO 1kk|SP@Sp`dqiq퍰)l5,\r1܀rp3MZ9qi,^j )\t=h#ht, ʉ&5dUh6CiOޜJH pl^YfQܘn %7d5/' ĔAS5Fnb|U V$ոb0k""FeGIx>*@71FBz (hlcs%KƷ$A0_}bGy  |fdI~gspN ֗mdZ %OHgqW^2l~P? ]w~߮Lqp|._ϯl1fի}EY r}T-p6>f!F@?=twb[^^\?2+T:*`Cbg$,CKLѹb4eី IA2$Niy)O@߉nrʦ*C~hJSޣ<>!أI ! h~}-a!a*b@:ߊŻi0UR}.dBrz*ucaQi&xPATƳj2OCI%鬩"C$% )Վ7*U #c6;huwdNjB#)aگ 7)# :eX U|T'^y}QX<.C `M ?͝MCÔ5 Ə/L;MTr?>^ʇ_q'|M?7l ! _ K@..{ f[.HaU=0z'ggDBwf(OJZ"oz:{HK"h}Ŀՙ&!;Uve03vu8؛L htAh>Prb>9 Uzv!^@u t Nna0@@hM9! 4#z?Ay=Ao-PFoRATr}  g;P 7U܈ׅmH[?=4Ļ{POpYkh.p:adߑ94>+g挳'-/=xOܻ2p؍0ily6>񚀋/pXlG{OMs O90eݚیC@*n.1*=Z$ :(tBnYsP֞9%AKr.-8WZP*Of҈#SDF RPR5ulj, Љ^Ň.e^)hnqIEf ,rB#tNSbY,)MZCѱSeRi⢍Na]gCU4>Ƣd0HzAGpK9V)ٲC߫]4pYM& ]F#i3?nE" |0Hinyw_~6ݺo?\VZZ-W^& 7e4{C5N> GmMǟk~:'Dd`(7 (2c^^R5Yd]H>BES5ITCa!4lT&CN!&}!u]RA;$u@VG84) @1AUt ߡ(B@ P>,CvZeqXE77KaBSru2?Ft1DK=.hH5tՅԈPE+?%oa''eKY;ȓ!0IV=#bh {D JQ$LJ5b͈-9v9>.GJxdgq8 WV& D$A,Ym,\-Z @*O%BS,kQzfdz 8T:|tD|A*ͩ?H"Nu(!3AC{_ڻt ̪+~5$u`-/A|-; WVW$p٠}E\H9RaX_F#iR1O,:$,ci)FN<FSzY)ǏqƇZ $!BN7'jH*梶y4R/op)pLLВoG[1] f/4e0li:Wc LVeKۑ~_L`qaEd)u,ꢑ>n'ƒ+Ҭk Y(/_o(lGvh媭;E͙As{1 b1z6Qdlǚsr|)7Փltg l_(V 5k${3`̆G/ fmכ X0XzaAQVS,+@1VJHZl|$/†Fumw[X>0ax([E݌,g \7AF}0xCah QJ;YRl4tpYb+/焠 Yʪ'&U@yH?~F*`G/wHx(5lk躢 tB4~CC{fٻ-GЯl$e&TWE6c7[`~7@eDfu(n>zYBiQїm LY(rAZH9"c^ x3Rp_mq^@},l|,oGƇx9@bc_/G 1ƌ]:yr|a'qwyC $.L^`R&5'D[ku~: 6Sj[1ʾ0#,r:!O35# am`شp~S NԐS4NhӖa ]WxJ)^3Џp8<}g6Vy$RH^|G›Ks8AFџ  M|i a*;|\h>7OXygҮr9HWg%c2z`Ϟ[ܬM{{\S·:|Ƿ]f8zݝLV`00} k6^fןtњ\p>,n\ڠXu?眀?cWneMꒃR_NK{ؑǸ pt)_%4q$3iKRog-eTav wH jBnfd Iˤw| J7}{l xi di'iGkg[!d!߃?&Z=T}}A5,g$@ٚVF[euQ[:'P,F NV,߃q߇@5IgXaQ߈hlXP⟇>#9gz9zrP_Vcj5`e2ݎVoFc*x@`ԅQ6pf^ϿiKl9AbvxYCSv.[}-p6?w`w9wC2\^pcNj#BE"?Eh* ~BZ8"-?͒Q]pXׄ{HLj} u5V𕩕ڡn5@-VFS0hu8-xe_Iotڵ!pWP#֨t驂{tJ~EWJ`ݐ||'ttO/aVc.ǟ[pbJS; ZLFm8:= , a&F;’k Fs!oT vQ\a ޻FDy;v\4094߲ޏK! XMWD3P?B&1Wf:<..TB^Ibe }8L qhȖjL&I땝͞JhjÏM'#e$+Ȓvu*Z!$Z YsUV~+(=A,(7 ~9~J1B84.ލ4eRߞ%)4 |rn^;z[z>`F'S~l⧗?]rk1?(@oXƉ#YɢӸ1?r+xzLΜ[@pxҘMv; g\n?oΚ\o&犷>>{eq5 >'r^!5mg`|bωM1&{V5f["8ٴYDV7+erMk. RIrKSxtj ́I#/I!@Nrm[lSUǯыW08a l l }QvZ3U@ VunwQ"v*d_?GyXBF}ZqDOk}OHh Wĵ9V0͹&=w\zip>hNx ,~騤g߿G|5*;/[>}(O.Wߞ3y1XM _~?nwZ`Ļ6)l?Zy 0&%pf&1'FhfU cv7X_9LO\,,>|W ]9۷{n{W/FX0E~Ɂ" =? .9 F׌))U@Ц9%(ZB82zcfɟL'/1}h'1i= qNUr6U}T2E.3A_sUe 0ʸYE_'4*. ˳n HbBM*@0h&[{5d#`NR37_E_ZTp pt [19Wq=`$v}Q~+[|;mbe]Cftv9׿]],_^<ӟz%4о4l aV.f=a߰qO ?0L1NYc0i IsZ,AȿzC (F'aa|A1,P\ >J~Juϗ߉;I3 M[@#@T!Vp@ٔsH,Eh-m=t3 ב 3} My䫑T̲Hޫ#_eX+"# S2?C}8TV4#6QIv0jq$JӀګPa^3P`GDT2A*+F)aZ "& eq(` ϶p7qϟʞ8XbW]/WP3?'?O(l%ՂF28%ch(UM<`ap[ pas@v;\qC%4$v"gg۞gj8gxaxT!T'5"ėNB,DDFIK25@DKÝf$@"se I /){N$bUG(4[7 9n4ҔHU3 ӑ*"LnUH diоɩ=2(hu9SiXO4b<=jgZQK. .T-J(WTIx=O)(xH~9-<|w*vtXͩ,|~<|ߥQa"Ragգ'/O.F/>x~9Xc` ]m? `,XŚoh=ܖQ  Hg@\qaAl=pC z]_L9gc˗/y;+mH:?~-p6~-z{iGN?ʤ_?lĉ 6zɤrhakd36 3~}n-9 d& Oīå]%cQri-^M/u[B'BLD$j o.W[xHdhϡ* 嚂ij— vS90NEPm 1K~@ V n$40, ,g9arwn}M3GbhIr #m$"Yb"Y&FuӬ6h|_ZW"!? `mH٘9v_iy.k=g%CPg¿? ]`Q8⯂?o{hݍP߰&{Oiц| 'G뚀-#c>]@ln[?xk^ؖ8}gl{|/I5JȄ9ZH̳[l9~-=N ?/G?Y7?kO B@q{9c<ªrdl2c⸓gJgQ1~-p6~xOG+S eƙD9t䖀_{blS3.Q3ϖtt}]%X\VV k@02*H TJ !ĦbK x@4G;F":8j#m]gR XPȴ?]` {< XfԳ7?a O] mp\fa?eed*v0ɵ%K /0w`„kld`-"%9"ԲRnS*)T;+@rU8 RO jWWէ{-:SCZ؈ ,_2K/so*`q*ܪHm#-TݫcqPԟ<]=[=]Ĝy`!\ =SVA%;9cg~W+gG2j߰]U8 + c$ @=qE+۞"lSaJam1)C;(w dPB?'BSI6)UrY?/X$߱؀gʢG~_?3WS:N:i@!>swH Ls0DhƐ6zICXp5%&c_T~Kb"_"NTv,^UZ;77O|tenW‹D ѯp2-kPX$91G~+EzZoih( UYH.ݮdޟ9xQ8+As킱&r[3# +/`g a7{4 4&=ɰ Z'32dW,p2mposFʩ:TmZl6vXZڑDO5;os^O^Nx`+o"a(G+GW~?ae=77+tR ߰QBţ5nIv@ L<0pNtP7*j'#"`au7-zhFclҠ>+3''En;j%j)zĤK݆#j X4|VNB#GeXb}YIg5{OR`_[K(H.U1FT8¶zf\CC ~bGF |bt F̜IG pΓpA,鳮.3b`p^9%=f b l0iQ>=cy^t__H(dg?5{E&m_"0?= eb6q0z*ګ S,?Ҭ4{tm A'-8+>c18V.BJvpUvŃd ¥S;ܯ̷bQh$ >kÇo ^}Agx `0$I G\B$984Y3 LbQ'JkGCK71_T T\0TZ0r,#?ߪh+o'U\ζn ]jَ7ͯ]_Osl>)0|[dӈ%%Nh6R|S X-9Ȯ5xVіr^ݬGx˹-77"Bg~0L#XI@\gp|W,|ti8?= %IClu$\c ?fEnrsL#Bb}/&ͯY̱ љ={iĚP. ND(?p9pVh P7*`DǏTrx(/h:EMY : 7e$\6(z%dOrl?1SegEC2/|xQ"̉x"#% o?h;|'Рu K<ӌ@#1s;w8Ao ƇA­O93daL@S;ٵkؿZA%2B2c.t=ߴ<4#c*-[g8&`aV%?6n\3< b ;\-P=5tB; @Tpoᡉ(F&Ś\*J≚v=V#G!"]MtL/ʏ+|ϴ/.0LBIˇ .? **: N LЫ b`v>qkz=RзOU, ( mH'i*Y~uPD C㦸AKvR4b\iVtE!FeȒvx=jFsDZ#~TE&PRd\gtƺk̉q8V@ъ^SM_P^=߬G3^b\:h շX)|4zAF'PEΘR! ~-W_l9yڀ$n_X9pnGy/[6p̘ g1q7s_pCaQDɚft{pshĝ ߤ0?PpoW7@2wzx&vCLpC '5YίFDEà)ҡ􁋩Uz|8 ǒ`"-3 "iÞ)aXL\a[&<̐fˋJF` \fHRb95ʐٍd%cBRg0(R]x/tY@M,yq \ 5_Qg.')CiERĢz1(SG^@㎃yãX9I0Q $ݠ/Pnc.W 1ޣp@iyz-po ǜ?C3}DƸXiGI/mm=i;.#ZUTJfVQF' u[<46|vg[jV\& =ғG~. /zW!KM" st5-VrJ0i-!w2+QPw] >S`* һGpQCNj;VgA' kMJ~,zԯz%V{Og8=u70ώ5n09>LіwH:!2ySza>7|h8*rpMF~_bxi0tw]F`a:bOnꈱXCl#KjsM@X7&38msH `xkCX25O~`P[H$Bj!z9<d(3+J$u!Mv"H@'S\ .SA G=K~&C7\oЧŮB* [ @IDAT+Oa1G_Ӫi΂{8{ )!"ǒF qy袜xLB LZcB"" I=m;$\7F|e G/×+TсPwL9]G:Gazg"k@F>*ZZn!ś)"@]V-my {6̥VGψ8OݭǾFhS| TW*b Nϗ Jlb;8S6-/yV-Zf [l [[zcKx^'kG0pzy9 &kr9iqB: L[)< Z-Bڴ8h 6zE!#ꃟdI Hc$Ñ6B/:.F]n+_ ʆWz0 ~.yqhdf X@ymD7tx4 Cݢ=TREfc|x<2y@FEŕ~$Z 8:([mBLmKpi:> d{7c'ѿm~/9ϘBKrp7{,WE;: ;S[s$4 ɜl $i|~W _ Wz7Nf2j'Vj+/ bx]gGzCqY0Jp }GƊ[j먷xbI`uU9Fłi Fbg8=pȅz:s'/^,Rt 1Ⱥ1Q k#<O:vAjp@+^VZ cjF,2f dkj8=+f #})˶؃i_᝞xsz 9zpc"?Ơ\}no-⬀ 0zt/X0Y z [Yx'M~T怯Ad:0lQ& n5`(@dOٝ 7nW%~$+0\ӟSM/ӱ@ڌ/Ś&g|aQ |ϐRH(/N2EhRpF7^ ->( ʠ|5TL$8z=I4PXMN)r&6C"槳ςYc fAGI#v U\.%X &ŪIjPP1!HJ.FșЁ FbۗOFD/˿-"L$nQ@~}n]_k|/X7G9/G}|c|P Ƚf5%9ΜW+Ƶ{ate@ѻ@^Chq4B4Dks**=&1#M53v&7p|څ_qʹS͊98"ۀ/:wl9{VlݽW, F8'I uwkdwF ZŬԏϝ ;1?nM OY0C\ Xgz6fi6-0BgG1wM91dJN?-)WT_ʘ:V26X..U|m؂:9kqS͏dƒl ]=%# n:6*xb2 > C#ƃ 6 $$(:lVR)Ƌ٩ *\ܒ4u"'0qYl9gTWE & +>LLEDž@K@"f mR->DZ}(9H\ l;pC(W_@<#/GF,TU~I =F d ݁w]0\q4hCozl.jg y$yĕZ0㢿ќ UqfaMn99P [3?ں-RwJ[mq${5{.*&i,;|/ Ai&Fgwnk kʋ] V"9&c%RL:L9BrI(Xd!NU\(kiF.d 1G7 ۣ+TStQU 6(7hTV#b&:u_GaFc9tg E2I*>}~$,|Qiط섓%Li ¹ִ@rQ!X_\? P ŒѿPmGp*#QƯwczq-C[yz*w.9u>vMEKï1-#5í=(/\Kљ;?w]*Yb)݃/ٟgw/KxK&'MN=|4\5=.-v$~0ocaVvT(U'zQ*u؊hP$_HRyGY|gv/Xt0_Iu>q^J,Ġ ]ҝst _GF0zG]Ar`!hQZ~Qh{hD'¥O"-`$Ѡ!l[<O/ w/ѩ,9vdˢWE*\\^>_nG3ڱ6`t%6=]R8>{\]ĩ4C|u5Fp^4:p)sMC#r8 [Ś SrZUxG~tz-&f|2 x1eb;-agVCxw|6*O10v$ĂG9 $>֕c:G{4HMk@bO# p) ܘQ_RyK.pƔ&Ý lGe3Q ` G pNnzptD.^%"t3nih*3++3m~gFUMWQeFkn:/ cjrijys@fC7()aO ͜~c}68XDŽ 5d&T[ah@ LzL4q:@Fbڌ|L,+HfbIm(foA#۬,0e#10+j}E< %Sa|'ur:j̧,'`Rc -ܱ7,*:*`b d&MQ0 _PU+zL<fJՊaȉ$DW_)#*iԫF=%O*F]]O)cBS<̅s %v{+%~FTh[w1bFSULlo+mBm vHn)gg[?Zs`pؘu٠ =^4 R1 \~?xߢ^ zrOa]f쇍U}r){|,+ G p\%`| ~[t^3R#?3G#p~F+ [ L Ķq8 `'3+GZ|dxp^XO@OoYv=N'.U't`{8W|nP#8@2]aa4 Dp=mX+YC$@RA!J/O\Vso@ot`u {rEbo,|/ c(>TNFsX' zh,=Sn w]' `!R0,̯0 pݯ ^eV EM0DaX1nؘEBW3+Ψo4kDKh# jwSL%/aX"x{? !`'9߀ji8~8Myd8zJˋv]vhD:ٻ@ WΟS8wp0/ x0QO2>^8tQ5d9ϭC^|t`{: Ƃj*RBbݔ. -Pl(krL1} (4-n^%]i5>!,Gin;H^S(U2{u;SØv}-hu3uݪ!Og>}*n𵊡\e+n^̘pBq'?Ru&OVx+:6sE* &c ϰ헲) G41z>rLR'`!~Z9xj!i rT}ɰeҴzg!~ƫ7}hm ҌXo;Iz貺@KKtHWw"G>Z ;tv!#V $.;/,L z$Ȉl ,C@RqO%fQ7nQq4^'wۘ/_$@B}]8]V p[|GO@F|O6 oAJC뻧g(~EkaK]nTI Y\Lȳ>|@o׿/j6qg3ˆMG Kq ^+:1{&;utwt* 6E^9(/UaXūu K%-'éax$aD" BIuv@Peq! u#Yy{ 0v8Q _L›qHG ϣHI_Vf„Egp+X?QXƙK9i3%5iO:Uc9gTSl񗨻g&loX6^l*<LG<嫊 w\bY R=""N| w /:Dcl-~O/awy "“8}NV(ty 3;`C_`ln3-N .$U90N3iGF@SPXӼ o42\Ӟ[ew.wÙ?zU{ )kb_͕2R=o!1!@Jb G+ԒSqiա ٨P+`꧕N  n*rnn=eIѽ^^ kUWs_u.>-/2  4ePA BHF-JHqa8f+15 UF[$1_WN(+{X9EXۮszU˕/TLsU[$īg *Ycu`J _p)YiKVM9\zTUe5И$Y"H og[_aHx.S׫ޗIh!C?DJk2]39yTx & ;Dtcg {cO@8Ej B2V_P'3aTR}m$`` ="2c 2F0ɔ$,r\,i>GH(m;;&P|(S·87ukvIW EsN- y}$CR Dj FW}l_U#R'+D^I厪 J%/:-#Rbijv \/5=չm+~{Zvo?^GJg"Yxi{$_ʄtm<D):(sD ':l0?98c5NY:L@&0B=gIf`]u(]t¹X[7h% &XƵj<7jvzKo;HW7`މt`މxğzK}HA 6wjZ=o8FA#"]v%(ˎpA}XPniN6:U"IQhGlΗBdt'q*vW9*_DWUk;[s/M{Si+ +Z| mOm+qJ q/Ra($HUbC҄M; d%3:O9tZ":ewu-A\]/ J晃*Ý9=~sV dZ^sltҵX'V, 3:S` 9~<^e^!`L™<#Ur$<9aUx̻2%8$}t俌5/~b`hz3J@_\M9*zFg=qӨ[aN%Nes B9SJOh`"Da@`%O9LHL\``%Hp&II.M7==-}}~|w5_A 808z1g/"!u&.PApT=HB @ď \;Dj&tjKVݒJ{Y ~jIRUU{W~R3(wԲ@k)wCOT;.m&4SZ^1=ֱ9R"W`5ssR̃3fvPl#dH 3ɨbӶMF}f9JO ѻ$2շ} ~ďcڴQ"Ws)R9%?R8tA95ia2/SF+Aэz;dL6h(&/ز}K0 T?A (rm.{:b&i~N n9wy3]^BB f[ֆhVK >MlV?dl= 3 `]a@jxT4"Cxm5gw`7-6'AEԔfE\)bO&NZa}>{RX--^&|u` $HuH|n}l^szR8()C=),A!jMudn)ă 9cvq?A.Z ۥt}PdCFP.'^AaI@l#eөBh>r99I9 <*iM285d`W3 0s! yHYf$nxYTcoD*=/*˥R*sy{݀K;0ZOј pi"?F}w]kړ5lބh9A8f!qЩWO߼C~?|?uEp{  ͸]'|<kY8O -04 @$-˪3YKy9OVY ԗ Km`iO EQr^{g@/ԎdI]iQ=UE#X.y5`ت2nM53[Kc2I$8|.b$rX1յßYhM9qn].Z$1RZqϖQ-Na7TFP@=>wH\mX/8dHd5-6^:a4܋[&߲sSMzyT;GSs#aN_`yUݔxl0F{p dc"yvlL} stYѯejvryW 9d`MkuƺQ @_ U%>xHCgs{(~3|XS2ZO>vw(xB;&^wJCqt>B,Y!,Z-ޢ0t"vys 򑽨*bYɞqJ'3iq](.e-yl}pʘ&ViW$IT"u'7yeb/5 :Ҥ8Ä8$cK4sc1F]j8=k\D!?7ȱ#Ak5''y.+-YZڹ#s O^/qOޟ9mK7g%z=x%(p¬T>jqǮ31O; W0j4?[ YX\5~3<4x@9 Mva0!(eN/L<^ #oC}ra:<-IJ1#Kqv̈́Q =O vy~f^/[ݕ%N͋؉/ C&N@ Y 80\d;Vq;a|ϘK%6: 5kUGNv {XhMFBT Zu<3-9#_Td Թw|K@ݶ6bjc@?0LX#-Qgڸyg #;6̀Bx@_. ;l-IlR6+Xj^&Q>o/R*|Se)@MК~ǿOS{PYo~5QN[ mPhOF ;tO`h$H<ېyՇ⪇!>KF(GP3, ^ G8幩n`Vb>$"=<%.'櫳a\“IfլxZ7J#$s团PgZ@C)Z>H iH?W_عQ E%^u4ch= `摔0Dk @_ 2A^0|=Y6i(Ҫ8B{~s?̀x<(Mu"m]!mo*i)*s@,$CIwr~ǜ WenBW0|BAjSR uy{~e__Բx[%؏٘HK?D{B/N^r?_  )ͧǁ'X>~Lۢ2jrJ:|q}N۬@%K/wMh8mK|[\? !†6ʦꍗdT寈kq{ƶO@WaQC!`𠚠\xHjO mHPFJPXh~Ƃ&,mOogI. MMlkѰ+t(Gz:6rDM sΓT򜦸E'APUßOl!f0}3 ǿz|j?!~cn@Am`f{{6vl; '>H+e *PXU|%s2\RP:a:2xW}g`O= ]k?k9ԥ Cƍ$DZub*ՊO%zK[$fvW$N4Z=^r6@2H3#t8ƍycp1nq s5X2v'Y @t!1A%^;/gS||7 )b|| !{O \#>ǠB>s$ʀLrQ!)]ha0oj{yR ~>jIt. 6L҆-s[Bn?Ym511,a2q1*J0UeIah -;JhiD^ƿr}pe^T癿iY0?7>CaKͽyS(SF߄5 &@] h2<8мe@y1VisM;4/ۍT~B:A+/{,4頤m;қmcg@[Xs03 -8vfMOph87U1(_64@i)1PuIƁ tIP/bnҘ _s6c@fcDn|3 =- -l~|E%bH3nZ `!O@)($-v;F˧&D0f@& RYe|D@8w ض ܒ<_ dwg%yqi:0os8@n΀VY%M}lw3T`?%H~ v$T?>ǑA-*qg KpI6glϭ ?M͕/~Wo]CQE$&ƒ ; \u'ʹW.}ȹyTrv/e@;'{ͻ͞ =ao'Wv^:"L&gWwO rJѵs%aO~N4ha'񇙣],&1?'s<5Dh'>zxraZ.Ni7KC;8JCQb鮄> NsD5+x !uOd\N'|}eO~1TZׇp_ .b&b0Xш6B ݰdbxӖ1\bIXlA<4!wק@@&5Nb}u`na˻|~x@|ÑzTR]^g_ Wp5 >(Πz& B D( c#*,WHuz xo(D@U=VzR\?TU9:k34-{H\)5X3_Nk@-/dN*"iMc Ʊ;Έ )ΚNwSH;"){sn}SM׾uy.ꄐpkןnTNu}-/W%W`)+ڸ[ueL/$,%e5NH!hi"ՃHƖ:)b[~(})!zD9yJ;PJmh$pT/(䞀 AܺxkP*Y fahO-z 8£-^hW (m;i \d۱.%޴2a\t{ KmjE5먈1 `a2w!̐݋Hr*~Wr^JFQF :$2?:&q\,aFh= z 8g,m0#* q`e(\"F0G;:s~#byZ<$ ۮV b`0ԌSh[vmysxT[v$L0!~p 3˒7w+_!9/(F)^zN`zu_ ;Sm&8- l#ru\c~8?|έH]x\FD;g}P'?=]Cus(r b/95oI`{XkyĐDTJ@{+d$b uKʔc'0>z߱.?l`ZC-m`JBSCس.D vYR'1vc b/|gvR\FnÔhXcxFH9e1 t-}9)t;B8̅Wz}{GtIadxG, ti=sR`;17m52$f\/q?; n6n=(bPIj3bx:0oxgDPόr[UL'r4t^KPȸ' c~gEOm Ԡ{vu D+xD ΡDV59)qJu*H_*5Xd6+Di֫2CfWpxG}Sȱ%c SBۮ]/1k%9&>=5[^ǵ'w*ve>DudzK|6|mW#չ `?;T+ MesFT%>DfP_F-D^,'wF9e?yָH7r"M ώsp>U;~mM6 c"`:xH9Uz_>o7vhX;gӣ)ω*hO"PoaܗǤ63l?jTNaɢsj^YqT9q<^a/YH,e|>=_'j&Ns*ӊ̽ )ldM@J_)S?=g@dPQ M}H} %0;ZgRk3hD% $tG+eG+@H쌯l$*T:f,Upa*0傓c`"[qsCg(EP39  g U68gY 9DBlwX]-1q._#9x+?28%:Pmtjhg3!9Jw psCLkƺ0φkKf%maqVCTy{V0}'^h<8"'@#/ YpA3G}y7}WmKSH7TKhGs2uegDy-i;q7`@58 Te^@xd5@FQ֫>NeXN+ey[ [(%!_zNoluO ͺ(XBCᡄ$%Eļ5P8ˆEt~8+B?UVRJ/UJ=T`SWIcRM1caSkr9SN^?<_&GH1N]rH0 އ"=݇ *S}ƛaql O"^s0UV V=>A )ߦ=\ޖw1l E`[}|S?G~T kfyҒ*8R(ߪ̍2Ko N'M)+y  i%i1d2oq=Z;{4aD(vcTZv;S=oE:0oc88uX!Q ]Mr׍G6А蛽6+&Rg,s*r vrC9`' j9.4ܪR<͒DeUU$T=TٯdH :4NI8 ݶyw,9 ;<23R/!p7 )CXa߲{7=?F'Jl:qv{1pI[crтS5HHJ؞K 'Rٮd\ЛE _| ’ w ryUђ{ͪ~Ez,R7ߓsSTɁB75َ e[[֠Co@ufk}I|:JJH jV% 1VbkCm?|EIJ|.X&54OXAyμ2̙ևiyQgZff`0+Ͷ5L~P ~ 6V▙1?'M |aD5"X}jU|:tdw;oq9f)r( ynDLtSR_HJr\5iQ+ )WdB-4}ہ\EiU@)˹xh̋`+'gCKwYM6'8OUC77rzwbezGv-*1 Z(]M  *[G;|b;*=2M_]u4g stB̏!3V$1밶B̆'@Ûj{M,ZKg7qq#&`܏"r1 \]F[9sDԡLx|ǪF7{v@ Mލu 2cjښ)|q*u?@se);.Ϯ7w/=`ßD{4Z. a t/ڰ<@BݰpƮc3P\?m&QKg0S!2۰w@ YݼC*J!0>ZpNA'TB-Ec\%+.ũuB9{lT}ɽ׻<)BbBt_44t: ̙(6bi9}_ӵoHw%H!Cjv-;if[?$V U:ޭ}/RBl+2UC{2_K!DyZBt!opnx  ^&0li 0Cʝ 5%c:6.e)d鿜rZȥ}S&`|QbUυRwXaP^2za?Q.,c]@8O0 1s6FX@?amz5T$)nmBmNl;B @1>=/?nNߎLt 3 !z0T$BSMK%Ձb$gZm:흳Wy 6ϑ%^7cśJ`eD;B|`ܡ] "qK _QƓZ p_xdtr!V?VF࠿ ('uO !3T3)>^PN||2(07܁?G>A//gubM}] /1{R(NT,^M:XC .P}4FR|r3/e&9aB\)-o0d|\іt?qF !';R*>R@x*_E \@0Y*:sb PAnsD7^"itCp 3 .==[h6uO<\;HD2F `ܗM[Qpn499Kcq6 Ò!Ax tGW#\a_ FD~ sm~0'=IW)LJk(6v?))yNrYmHbCMG!!@r$NK?e| m9\/\~xf ܝ_.ρÔ1_>Wc#_R`uWj&fqSg}89EIo@P dK x! PfE@h):(&](Ȏz+ J&.zv$xۭڮ~me@$/QA7ùL)FBi-vW9U]ރBD@<'1z%/%DĝfH'HMМD7P$z+FМ:I7o2f8)s]: d 8sVݲ]_CxI/T>jA pwZȒEv4 tthh8 1@e8),ota"? A'$G?9UR\_/udt$6 Oy~p̘pmF05Cyx6TZhMdNűGoaD2ȶ :qMPUla UrR]rS=a$*;4*${T[=k|g]HR% Zw{C.9'ue`]s)tFpָ c VAQP+1 ݈]=U.Mued%yYlz;R}gjg4}K ?@`ΠoJ}%p?Q F-`]>ektN233Úd=L VPz]7Ii{ClR={@\ä1I%PK.[\(YZhO0e{ybtQ~%V+iTMBG&Z&QN^ijQ`D\CWΡ~|{=!ч}sN [m~\HrO?3 *ìYA\b@ L7ޠx7N1L4 :@-?X̖MUyAȉx& [_@%' I4#LsWiKA`yC Tp96[LvAf\R5[GCl zUZXmB6HU ' \=\=UƔbc LcKX68;BpݭϸN F/{H'$8| ^`W *Ȑի8*y Ҫ>Z=4Xbcɞ Ȝx58R% C`v(co^t`T9rY9a]ݖW? 4脵1-FCb61Ib^AZ,]1_)_WF%ƣi5gp$1sɜiЁq9[6WK3]Є _DV뎺Ng `OOm@;<0=|g^Cj㽛?az5B9 p&Hg}LP6Mqh9C/>- 'BንP&':)֬ Rq$rqx'0+@ eJ HS+v%[z}"؇~|y8z(SWh_׆4l]dN4U|kČGIIRdDBEbݙtOw?f7r 8l"y"ѕTjN:( \EA.usMey̍7;r<#шiXS&C"Z}> YP1ߎQz= HjP xYuƒ ƈ+SfcȰ\}h k;xހ:Nȥ"c4H!ge⌥ټ`isȯ Sv iے =ǮE$}6C^]-|L~IM@$hIBw쳽8c`k 6K8qI{C #t!}` wNOhB |&~)lt|1=aC=ŷèjN ? j/s|yx 7mT 󻛌1ϓOxFWpGvd$FA|4M<`sΚn׬` W ^NxV 1MMSAYekCGg@Tųgϲwtmu&[֋1l<B$ )eGh(/$b U꠮$!0%4$, UPEe%qcHKGtOL!r GC=}D$$B1C˙jHNY1Sex_L\_@~Dbe备 Z6dOMq\ c;9pyi=s@ɵa~o9ٻw~nC#!igAd>^XFCn;HB *(ɗ>S8|uz92^qSs7&bl3i'3GOM}>^V #*Co4D7Sn>ir]Aq 3Tԯ)g08# ydtNm.Cs4]8 p:0o?2D<ƶ @iuS=W،B&n`[%y@Q87iAUn7YB9/pRɫcoKr̉R%ͅ#JR:IUI1 1$j| vy@L` +l:8rR"Q]OX0 -rxz=p T=6Ѻ zAqxC8AŸ=_yЈ41 x͡ 8NG gpIGBfK";3|oڲ |ObT)W;>ְm&:pD9m42$Dlq#saO9OaިmxHDl].f/e'$;,-j1>3hDP8Fꟕ0tXM;cC;H'Nby v&'nD^o=?0_|z;W5ن̅GnJ‰owP!M-V? 6S'w@AUbUjIMEQ6)wZ"Wj6NY8md/V /6({?B=*WC9\vag+ [U܂Oй3 V]і#uck"  A$\@UFiŌ H8%lYϹR1Sd ưaOyۂqQhX3=K!^xKī;q>|FfsY,K# we:}2,g30){p7 ,Zl=8䁳f}^^L N >WB^%Eku|o|߾}G5w#|;7TllbQw  p RdQHY11.H/? 3Pr%84HOC5, "C">H 1zlQ]Mjsz,:Vǐ\/ .DsO _?7'=¾6{I,| "rޣaa ! na.KH'.S @M5ONVZ]Mo_`c& =U aNdP.Y{:x͏O,@ rHfZ֩m0B7c8`:&0W# >/aӞm?HNsa4h s# گ[/> aPCol1 =af Oa*Q/7?~ϓgWpiKfπ+>vd$* "v_G?ɿd.*(s^//~ | |02Uԩ;Ion[,5e Hsa5} $ #ǦZ%|˗Lşvay;i"FbPmr -yŤ9"ò n#wWo ć-[;GCq~!  \k"` 8q`|*FMThrq ݛ@a/a2$m  B`w';Sy9ӃϬ&•BOfH@:;rϹYf<Hɪ⬇}| ;eQU., >urT  Cީ+ /tiOJ2_yoi|W^r;߼N@۱z.Wlot`:>? YqZp3TX7P/e0pl $IMP?HTqC*2>•GVB2 U bB0,ǽ~ӆT\X|yr7e6?`}0qBtW8k]U4\Ԇ2'7| iy2̨CvS mmd(7/iw6xkҁxk Q3^p^ ΉCԄ\3([G3 y>ŊIC0̘b vIeHο>j]Wi/`G_۟ArUo8bB򿹝6_,0Ÿ-0$ `Sy[ַ5va'~MmM,?@j]b Ԑ3,ȹe)DV:KnHe (v{=h>q&lm |-QR~  );Zե{_c;..004Zچ"RxWxq1cJNnz Xg2֨C+@c|P.M}+kuU߅֑3ԇ>n{qv"u|šr(ڭ6o$R b #޽6>7lI %& y |''&@r7 )> 4T;.Yn|$tԤX3ϢqIΰCNsF±2KnƇs4α',}pnt\QӉ΅yγU2j#duva!nZO[}kݾذsa@*Ňl?4sJӹ rN4h*$ͧ,FNm%ԯʗa u>0"O ymb Ƌ!(Q`"1A8>UXZ8"x}+sch1}0Bؚ8P*:Ik4.uS_g] Xa8[|ܹv$*ILM(g~KIotl+>$jI 0ҽ5z##yphw|V!<Y_Sf o5MR`Yyo!7 b_-my 1|oE:0oc8q|D2nȶtA->3Ik^ |EwP>) 4@3D޻HD@Z!ΐ<5%4A.<`V@{fO^`W\gӺ=~/GgQźdzf;_w6?۸de9k8% 4o[ry/5V̓pv*2 ׃ ܏D;_} F,w,a\+TX$aٲDv)c5N c~Oy:鎊$AD]!Ǯ]ƥ_-[ T8VҎ5 sf `{ -4*@Et|}lj(PeͺS9R {$5|˻=a|>0N!f0 @kP9JV\{z힁x[G|Ơ)w=|I3@t]xR4LHH{ `O54og0 !^ 0rm.C햳Y3}^_hsm,\=[n<>f~۱nw0p[wElPV$cVI/6 gi!EnHYg295NPIKN?>ZU} :CIe~xr(|8š9'6iְ+[`9A~ 9vz'c<%\V_¥cCy6tN\2<3 C8={$:}!l)R34 ~k,朼F9=NdN|g8 U*NHthiarlx4\f[gt17@IDATxuX>c-,&V| 4ˎBSsc-@sœy NxJ^ ̦<8Hٸ1? 7js {_ auSG)p_-o1,[c}Cf' _w:h?woD.jM?~wω:Au8-7`;*I + 8M#ǫv⩄NdfE`AKƔzŘJAr="Q5QɂE8W([?Rn)/ a|\-|x`yK5hŋk{> F%IFs8\I+xDez[$b"tw?.0i@Ճ"^uI!UHE.Ix,eڦMYAAq6oηWpg5H c:D Q`nv >*m)C9E. <%1бO= IUt~,CaHeWF4I`:<ȅD9nV'$;4ν} 8+`e vQZ>J.0GLci^)%~_h\~|>n?0(2ҾҾ{Qp+HRA nE X X1;tց%Bڏg m[f־+[waT!GoA:0oC8p? Fа{o%yŖ[U5z#AIIejF/g~st1Ǵf87M4j=c, hD|7bo c tݻmZ_f~Ht~SLB=ZpYAxD sk7QocW,p - S: 1Z֜C8G󲰼YR1n7z/P$ʢj?"hMZBƳDb㘇AjXfUyOĠ!$Rdp+Fn?n坩9w ys{8ϵCU,.ui0Ӎn=KXuQpG&P~ƓthmU t?><VҲFaƆ_``oP P\w? J~"vN3H&]~ܒJBWMs5-U-˒˯ݖ% |%w.z?*v3kmm|z|deEN]K~ZDsjǞo=_ǪZ~4)$Ԯmã0]ҀfL]RgێF;WHkQw@&Gi>D1 c aJҳ:N U-ܑepp{ X1t&qdeC8zR7ns7{Q\bE Z%mPjS)[2 4 s`f=BAz]-#LU(1γńV|Z乡QxĹ~ۼELNļ|a!X3*Y#aM9{v)2&AĽx(t;Αh5ފ ѵT}AIsHƋ2Ʈ1.#|]s(x,fE^p-WcJۉ%`*v%u#i=IiMp;8p6N5w#p\V5gj0 @|8~錄ԵvlRRM^Ծ>_|NQQ(8ݗXStTd͋'O)I7&zJ=dOģfp>(`#^.FԿY5 s|~oG$E16u p-U! ѣ7-bnb_r]H8[T6a<&}Wڽ#Ci 1}5xHV+_cXg+߾F5W`g{G곌$_]ݾGs s~E #y// )zUief>X7lj 23n?VjfNk `b?%`i%sۋB<ǑgB[''a% ȷPr. L9~ f6<.rS1y=61j}z7VsS8;90P`Sc\*7\wyUxvTCipnY 9hlH"!#1mp~/_iןdB8ʬX82ڀP; g)/e/l[xt+ncf>յ2MЎ|ls Jհ6 qc;s MZ,v`$eZ4ReZ `S-if*'U ãbOm/sK%X!xِ7otPṮ-C׾YOQ8_}.Is{X~-g+Þ~iB8NRr@u&Aዸ\:ާ[K*UM|Q',PzX%o.^-)MIKJ$MC{g%n)Hv[ڴ>Τ"c[@!T%  $BGk8YE,*9Yl,oɁa};"8Ǡh=D:oVHK?ߵ%P!+Böd~-x'Ho5.-EI !F1tD{]õGd&z7d[0|B8 {5!#,?aL'CdR|բlj~-c@EQτho2tQZ,17 |s;}ev}GEyX27nG7\Ixm&-,I૓@m!| я~tSM&5qN~ngo#>FP'yeW~}} !EoV|䬺ru;26yV[~Aux?ok_WǏo~ilrOX3=%7)zOeO (w0#ieZ*6 ǀG"C*xhЯ^x=ЉRc{` 9:^7:K6k֑ ȆGك>n P,3@zyqE*!u}+M3/_^2cESۤnH2d/G\_)쑲_^E2(|Gf!^~8l enٖw:;IxBZC=H"a[W= uU4stZRtX=G M?PdmM+{sia_p<}U3̪aq6ږ3nخ'qT~Wb絗O^ ZK;U1(105m`7,,7&<}YM#=Q>`6us otes01=WֻD-0BpOxo@GHj΢ @=џ* CĜpaw7zdn1}YP6X&B ܾ)xks4^%Ih+=8CqF \0&09YI#Ji%{_g;bN($xiqtآ a=zkxqr"Z ~]D *_hc30WBvih'WWS[b%^xqcٟf7$-'I딀JCEx߿VvBNBx(wCȶiSe4RVߴK^An8;e,ՀZcRw7bK 76E& |/9ȃ]bM3v#^YT/2cDţ\@rhۗ^P% ~4 /moWxp 6J _Azj|~px Brya6 cxئiutu (wAu9G|#\ƕ๜ƈwN18lpx.G*a2 XXƤA h]`ȭſrI꠹ (NNGC+ty#&{U6=V?ۻג}T΢?s`IVAJ/uxUnx,(#aH{xInəfB?~cߒߣ$\{;ux\ݪ.| *%0y9gvCo7˲2 g]߽8'@ 뚿˿wCTh) Y^'>sf (&gde/_brIz^{Ow9q /E7@  )`&"#711CUjw8HÜT9-k8z195 *ާNuZ=-k@̶DLost^)n\|&}ÈK\DJ+ˀ{G{r::bȈk&4\׼h9 dz0 !Gi{Fk+uWᰊaxpuMq%8w8[o zP_zAQ'k ϿvT( |D^'_ux.5$ K6|W M |tU*~n;r&Sv)_\o6g?wwEI~ ?BC'36ltnoOw 0vv//V)t7Pӵl8.!e`5&`Az/xC8;!Q@1P2eCΊ,ًDz@Ɓz&xT-Nh ;`0 g[[nԪFev_ZTٻ3ڠYц8CC]s CMVsR%zI^!K8SZxXU,,;j #k0!Wc=ۿWzKeLRMy ̦Bk%)7|.xƕQG7~˟zS,%zҲl CƏcp#|GU6cm_t?A.A=~O P:ߟq%"ZXZq`-VZSEm/EnǂUλ#cNc1DX9{1xRRm)[Y(lJZ-S?QLXΏt?F&-D9X vP_"筰#/ >sQK[0M! C$sp6&A@,03V`q(x '`, X7@P8%X¶0':?(,O&!W(9{NLĿ 1w0׆CEq?[7;DjRI 4 ӲceVhÙtXoo=LW$I-ܾ6o_ߏ6;gϞX)TοpW Xm7 &tVt;3)?ige"({5!N|&H8npr=oA pBn{T2-nJZ(cp,b\Bt.+y~:^BAy&[c cx;}+'nF^p=0šrJ#5I;&fF'yƸ!yBp,|PB0ί'`.k|A/e_׀;IzU0Z2(;m+Lcͦ^,/`C:.ݦ)/q1uw5uim+9&%}Z Og( ;/ὣ0|샯s@+9ifݶjrB"`L*m$ְFP}寕+?0rμf xrY/1h] 0H̃µNښ&/n ?8-?z@Vqƴ8t[.hE(CCLꦏ-Mr΍d*$3ڣu+(J ϜGxd;0XhtK,.?^oC[_z\Cs#+Z,Y#2HWh+- SpU\@u#Y)$=]aFlܹ% $ $ $p*+V jG!jSl` G0 R/x樾!ȁ}6X*q9.c'^T( (9+ aM@O]2Ճu@])׎FlIx#nc$$W-Ka!CYUźk?YںfB~2Pa8OՇ4jJ*^ꮖf;-L3/G( `[PCcknalp;EġxC +M@wHtd{jUQ$Ǐ9Oa`>?xxe^#3xl0)(v\b1A#H($Ri:5s𕥊%5oUlːq§t//\X oбY? R=n8{Y >bUòjxQ3]L@gI-?<~y_R'y kOn+GI:`@!((''\xJڌ(à`>𑗢9u 5! 64 ;Q=Y@[18(A+%|} ~IEa<=!ϟ:_˶YAX.Q~uOyboXp<-jovj9W$I I I3$G֤ ^;gNu}k^Q v a j<2ΫA+h@]Z[\B!fzX˒bQ 0 tS aEY\v~) Cv٘yT*uV*/%8)A-#aj9-ѮX9TrX @@"a"a[ +W}pҡC2${q2Wc>X HSn@d={'!?ͧUhW#ykѳA_!mrNն;5KVq[R޸[.(I I%6$ 4:XT)rikcĉMVȏAk@cx׋gQ {#rA Th|M=ơbm! %[o]3kP. 8.6}!ټ{c *nܱLUG@m+ P@YsSw|Pcxely+*2o!sO~+#;n~8$'[3LHm2(7P$Glo7ަ+KH Q'"ր_49_?wkξNЖ)?Ima |S Vjo+ ?؜~?j /' **95~/t=!P  Fgev}?Ȟ]Ҟ> xp@͂-"V ڹoŋ(>/r YEIĻhJר{]럑oEAI*x_OBP!a?DN?}6rqӓºmʋ|q.Pۿ^j9H%.@VPI-)o]Mה$$].@9Q#x<]'G*EL0Z6c)Y( p ȹNT.kA' xsZpŕE沞@Aq+@4'z\/dO6f-&p z'vsW;8lp`? xobD1q#Q8h4"2`7pPTVm&@9% f߻񘠔QZp  䠒Eq܄0)5ZͤY 7\ْ <ʯ8 [XG_}L~㷤8]`@+JnNw?|4,qSvyf asBSOzN3Z܅@\ ,??GNqNO =NHjQ{/h@thRdl -)3ʞ}iX{'VٜC-ٯ_d7uY4p~EPPNh죕^^[6e=yg$O:5i-!],Jp l_`;? JPzv$ ;*uņxKiC/{pպD!M ۭaoA8_%p>;3 [O)w9[ !2ufh7+.ak=kx/rQ?mg@ }"q#0<%Z%U25ɝTTR7}VO?$(duX.bIEc0=x[%[tӥ& $ |! tհLݡ|9[H z`N{>&fRh̼&-pz$UsqM=N4}FG3E~vӜwMp GJV`b 1 @?%  0H5$.[.#-OP_?CYՏ҂+>7xϚhtP'9<#x"mddp:Ec'G-]s^O: '({ _dE*u 8Z6A |A}Cھ>gjeS%j~K@b,aC73:W`r0ŀʁsAs l L>bTUxZXg(\(`PEFxvE/W];FsX(6izb6qt ]s7o7~K & $ % `]~g׻%|E0rm2]QDq\;M^@ nMlvm* n8kc 氹*#8Q9x~w]cp O I[Q>z׋P269$qgcS#pz,@dS{T TDΏ`a,9v*Tk4uv8GbKm}}ڐ@R I I I%nTmG#u˦R\f1u >{wwx~PHt-u,,rkVn1Ga z78i+؍X}( A!< .?d>r ƿDA}L 5ro ؏J*7zs_HB?OZ[+0EUsH7m/PoDp}ڐ@R I I I$/7aWU fwCjzem3r5k1+@ vL,eYsy7ϴЯ}T'潀N+au бI6y<9A xǫETAqv яs=X1Xkt#1L?ʋ#fuX]&od^{+YQ@8v)0͏_.L'">0\5~d]4#8n*/ ml7%O9p6PtYo{>vG5L#=MHKn9:N{,$ĥWpk!n-_-r?bo:WeU,p7毃vcjLۯBz$$$'% XJv?uxZ5հ*`y<)[sF$rޗ&;$A=0œm-SfR'A-z qt#NɀD >`@Vѕ< zV6^=#_,߃Y uYkF9@Ray_?\AIz80uʘdPV`,QP0jǼwFbSJeTSxWi@RnE$ $ $ |͸oލ|SE7yQbWN@7 |Qp^|L+ِ 96 )1v4܀^Qx{laJI|޿gƎ`fpL{A\8"a½;Wi~5X/X=#.*s Xb b?]tjNbѮ #J)esFb~i$%F@@+I❸ܴ Y%'lkw @e/t7Uo_ט@[Vwu8nVNE{*=Ә!L+'@Z4{/zU!^#B hD(k''%,~ȂM̟TGctGK2U65 #Kqʦ1%Qw!]I%v`Y.zoDӟz⣋H '^& $ |{%t$)j}wݠƴNL%z{BӮZu)!W Z ~v{ Gzc~8+ÓAhT;p q7[ pc}'`[y@Y,;6g{_D :Ś K3/.FC9d&2L(,# mp .|^{p zR`\5]#%΁,zVUH7?gRIc1O_VoIVtII=A{{\׻Ń`9#|NF[pg绲0cq¥3d5V~+=(vӚ0i H?:# JRc􄫟TUÃa(?\y` r슲{ N ۷8:Lt,9 U`Mu=*sc#**ĈғqNmkȌ t Fy1%caa^l6׳|3["ηwlI"J& $ $ ܑ0kDTVjwm>kAGlo=(+=8 -\댐=/? ImF}7+@#p/PZ84mU?Hx, dqEǭ?e0xq!ď ?Y݆ˢmҜv szͺfa:%WT:,I I Is$aq@aSD&5z-ڪSF l@qҕ@9+Tx.+w@ "2",jmWm{uk>z Bg0o``55%#& Yq(_׿֨jӗu֡wWKaA98@5ƴțEVTӮgu5)k*-쎲+OX m_@IJ& $ |$pW}|##OyOW ńϲ|Ϩp{ڌ ȇp`i]w*:|O >:} }=z 萶w{IDATe?nN@Es! *Xc1M-v+/Ogb~?xEgssYwї/!~AW9pm[( ,r}7ɂʭ8UGs|O߾oa[Ug`s0OR rI& $ $ |Q @jztϞ=PkLI՝Svz.*^R0<IG{ *l%a_!5@$=^b?u0kSsS/Xa؇`.-H&/1P^(ITdTnFfJdŽ+ j 4i͹yUaQ.˒pJ7 mg 0$$$N~kwӁ>wn9fuG@` F?,xp4b: Z'@NMXѐ:4)Hρ}\`G>_.Ռ*,l]\Rgref譨HEkjto?ID@KB6ipNW)KZ(6yއEK@R!!8Xwc`p:ƨ}o=׍MgW{?V{A_')1)>tC]% ßkp%}EcHs-uB)X-sM]&jvCu6lo?Ay2H E ><b6,v+@:F^qXVu'~M>.nwy\yZ"crW:iH Y:#I I IU$ HrL" 9V2F~t?" ,ځՐ1F7O|5PudoX0AM Bj1B_eB}·]V?"6Uv~9ufd \^dxB?0U($Evx~XbH*i~Y~o,mhr1_>w;}D$;elI2HHH jh&ɖ-z`Sݮ #~ Jz3j7&9Т;5ۆؼqG` m49{ A8>5!揋7` P΀?~kȈAQ?0(*"~54 Df;e /öZB[XՃQ/|Eӟ/AIHHHx t*W0O+;fAy6AQhp[{Zdu݇#?x[87&G9x?s\40b Sp>l.U(8. 9(,LgLw`ʁy$YhKϸ 8Ů̳r͊( מ|9H #4J@@x/[N@vmDŽ1IY$2 + yHW |BMC& $ $ |1@ rE}zt͇C [?O 5 2ڀnx02`Mǿƚ痟QGQ9X>to, 7+c o!"I j L@S}Gş/qj0XP5V Q-ť+@R"a>Gp8 @鉻&;;׿NFB] 6Z¾m`Z>Z տXJ4o,Q$>e \~K-QFdgzDݐpI |Y"]y}MU k4X7V@R*ɦq8Xh`{:?'yj fiZ r _!=Oqwgِ@0{hC@AC0_b)"B_Qg1OXnY ("v/GN3f5ȋ[q*1⌸ʫ bQ|߭.Twj I<,Qھ $Kb"I I IJkSx ҷr`-qN#q0:WTIA-u-qRbOR-竖a`1_p_@|Cq(xޘi:&n`A?2 z{C$3a'aCr;>_t P,Igp42xHM5r8#]lھ& $kt&I I Is$ЮV+Y,uwR\P~^Pp~?-0K_hQd3RZv P %@=xN wU4PihA_5A`&(lpCCJg(+3V qQ6Bx5rFGK=H^I==M$$$1 e˿ۿ=|o8a" b?Or0C`ᮧ Jz5:׈/prTer#応C㠰"QR8 ÑlɃmّ@_qSm!Ma?3HE"0o/gywcg<';$<_;UZi$$$Wŋ&{t /M#{0Y80o3=l3vVZ?\w xDP5O㊴Ↄ1򗣢ZUu[)x݃pBOS& $ $ L~p %pζ]X4>1w2z=p4_?kxk ^W </X]uɈd^RhAѢi7ΚCAI~!. m,OHH4 ol}';j _8 )5JS( "6 ww4 BEzwj@1"zz٨~]݌ ! ,!.˺^n|q['^lɉ2?p I I I_IܭxEvt+R<(淨ܿ rV2K<z־{6o>EAoaSP𧓯 Cٔ+fd4:~~_|O࿗IkHHHHJ/P41uM ]vN!9r0)wb`VyRwP!gZϛoR|o:%lN zuGɣG;<'Ok&f7$-'I I I3$n6z4_QXwU^9 5w7z ߿jA81/`1 FGl]tԖ8g9OQL(h׿H7ux;q^֐$$$9[N~wN;GJJpL!B!%*C PPJ*G^aǽnV>?ujȆ}8v`Yq9?Ge^P_EqrR`?)so/ɧyDit[N?=ze83 槚cC8xi:) P ;yGၺ.F=7pւ"Sr.x1솋6߮_?|wb =M -4_@@QԜ" 6mnapu`[~$'W<=0& ޣ0sFO`G@?wꂥ}̽jTM6~Yg~doIxPZ_@@K_ ?ݒK g`;[|S&`M>7Xϗ2/!H@S2g|#8%%B3[ٿ:)Fow/ ?^&ർ-iQIII-=x~ފl̫7Cl1]Y=R=ŝ_ v%%},_e$ɻf9~ωKZh:Cs5qWGG{{d}{>I vGz^A-} hoרC>ڔ:´Lʢ8"/p`aIA2 qSPڂY=j"e*h7Mݭf^c$+ܻ吤.w"#I I IK`'?ڎF[hx@ n}?@!*߳ 6? h!  ن P1Zr[W&=1%H }^Eo7|p Lk2kS`ݍ Ch $l~1@ tv~?+ A٭V9Λuw]{x_̽߳K7E7Nu& $ $ ?wɪ_ p'O;v}PZSqe^oiC\/>Ng]]ew< ?lϹ 'QR^;֓$$$o^ 8E׽[wϞ;nu2&VAv[H{e ͒@ |WZm@@gJ81[3-t]] KL.-l;gYf񡃛Ct III {>Xo9Pf !|cL`!"P;9 _AߠCRtR>a-?Q?>~Pc:sA!aH )ߐ$$$y|cYO A} |3[Zu@@!'/c i{@$4m@@@@}J Si$$$mON1?_7 $$$$$zJ )}IJHHHHJ%Ti$$$$$S) /iUIII_>|u!qOH{|6I I I I I>%~;I I I I I${|6I I I I I>%~;I I I I I${|6I I I I I>%~;I I I I I${|6I I I I I>%~;I I I I I${|6I I I I I>%~;I I I I I${|6I I I I I>%~;I I I I I${|6I I I I I>%~;I I I I I${|6I I I I I>%~;I I I I I${|6I I I I I>%~;I I I I I${|6I I I I I>%~;I I I I I${|6I I I I I>%~;I I I I I${|6I I I I I>%h= fIENDB`yubikey-personalization-gui-3.1.23/resources/mac/Info.plist.in0000664000175000017500000000163212603205714023063 0ustar klasklas CFBundleIconFile Yubico.icns CFBundlePackageType APPL CFBundleSignature ???? CFBundleExecutable YubiKey Personalization Tool CFBundleIdentifier com.yubico.YKPersonalization CFBundleName YubiKey Personalization Tool CFBundleVersion @@version@@ CFBundleShortVersionString @@version@@ LSApplicationCategoryType public.app-category.utilities yubikey-personalization-gui-3.1.23/resources/mac/Entitlements.plist0000664000175000017500000000057412603205714024242 0ustar klasklas com.apple.security.app-sandbox com.apple.security.files.user-selected.read-write com.apple.security.device.usb yubikey-personalization-gui-3.1.23/resources/lin/0000775000175000017500000000000012603205714020526 5ustar klasklasyubikey-personalization-gui-3.1.23/resources/lin/yubikey-personalization-gui.xpm0000664000175000017500000000232012603205714026733 0ustar klasklas/* XPM */ static char * icon_xpm[] = { "32 32 2 1", " c None", ". c #8BBF41", " ........ ", " .... .... ", " ... ... ", " ... ... ", " .. .. ", " .. .. ", " . . ", " .. .. ", " .. .... ... .. ", " .. .... .... .. ", " . ... .... . ", " .. .... ... .. ", " .. ... .... .. ", " . ... ... . ", ".. .... ... ..", ".. ....... ..", ".. ...... ..", " . ...... . ", " .. ..... .. ", " .. .... .. ", " .. .... .. ", " . .... . ", " .. .... .. ", " . ..... . ", " .. .. ", " .. .. ", " .. .. ", " .. .. ", " ... ... ", " .... .... ", " ........ ", " "}; yubikey-personalization-gui-3.1.23/resources/lin/yubikey-personalization-gui.png0000664000175000017500000000220712603205714026717 0ustar klasklasPNG  IHDRsRGBqPLTEWABCDEEFGHHIJKLNOPQQTXZ[\]]`abcdeffghijkklmvyz{|}Ԁֆׇ׈׉؊؋،،ُڒەܖܘݙݚݚݛޜޝޞtRNS@f pHYs  tIME (.e=tEXtCommentCreated with GIMPWjIDATxR0 DP)P(GfriծfbkOdc˱bvaڢUjhV(-hQ+"4Ԋ9-iIF1@?ڡ< B{7ࡼ?6 Fi>2@`-EF`> AgL46\= A"q5 7`\kU*v1{!?7-ai>? t65|Z!sF:cO`}!d +B0@10d0s5t9)  1 /Y ~g;P`j.WAV/l(=A{l`\f +m W6);U2%J,Qˋٔ|M3ypc"֤֖Ւ*Q/nE=MQ]_Xʿo\+ѬX 0ˇ(LiWOoU9/IENDB`yubikey-personalization-gui-3.1.23/resources/lin/yubikey-personalization-gui.desktop0000664000175000017500000000047312603205714027607 0ustar klasklas[Desktop Entry] Name=YubiKey Personalization Tool GenericName=YubiKey Personalization Tool Comment=Graphical interface for programing a YubiKey Exec=yubikey-personalization-gui Icon=yubikey-personalization-gui StartupNotify=true Terminal=false Type=Application Categories=Utility; Keywords=YubiKey;Personalization; yubikey-personalization-gui-3.1.23/resources/lin/yubikey-personalization-gui.10000664000175000017500000000405012603205714026271 0ustar klasklas.\" Copyright (c) 2012-2013 Yubico AB .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are .\" met: .\" .\" * Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" .\" * Redistributions in binary form must reproduce the above .\" copyright notice, this list of conditions and the following .\" disclaimer in the documentation and/or other materials provided .\" with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS .\" "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT .\" LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR .\" A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT .\" OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, .\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT .\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, .\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY .\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE .\" OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .\" The following commands are required for all man pages. .de URL \\$2 \(laURL: \\$1 \(ra\\$3 .. .if \n[.g] .mso www.tmac .TH yubikey-personalization-gui "1" "June 2012" "yubikey-personalization-gui" .SH NAME yubikey-personalization-gui - personalize YubiKey OTP tokens .SH SYNOPSIS .B yubikey-personalization-gui .SH DESCRIPTION Graphical interface for configuration fo YubiKey OTP tokens. Help is available from within the program. .SH BUGS Report yubikey-personalization-gui bugs in .URL "https://github.com/Yubico/yubikey-personalization-gui/issues" "the issue tracker" .SH "SEE ALSO" YubiKeys can be obtained from .URL "http://www.yubico.com/" "Yubico" "." yubikey-personalization-gui-3.1.23/resources/lin/YubiKey Personalization Tool.sh0000664000175000017500000000040312603205714026500 0ustar klasklas#!/bin/sh appname="yubikey-personalization-gui" dirname=`dirname "$0"` tmp="${dirname#?}" if [ "${dirname%$tmp}" != "/" ]; then dirname=$PWD/$dirname fi LD_LIBRARY_PATH=$dirname export LD_LIBRARY_PATH exec $dirname/$appname 2>/dev/null >/dev/null $* exit yubikey-personalization-gui-3.1.23/resources/images/0000775000175000017500000000000012603205714021211 5ustar klasklasyubikey-personalization-gui-3.1.23/resources/images/yubikey_devel.png0000664000175000017500000002445612603205714024572 0ustar klasklasPNG  IHDR$c`sRGBbKGDC pHYs  tIME ʕ` IDATxڥwey{˩~uۂ@$P(#J-YX)rSL&(3ǒ#O28%S$EK&E, \`~Է \.&;s9W:^_<Iew T'e)wk+W.mS $D m=eiلe10=w'!f]M4"`c䙌z&\c>ht16R*7o %/gsJ̩ØrnuCMm؟\19ڪ _o#ngZ{Ook-8 J4 Ajk*͂*֙o^emkgۻ r»rLH |RxTę"=IB;pQ$yXnxO\=*;~Z;p'?)6bs,AK@9DD ).xT &xpjCy c2{@ sc xڊV'4iqxBR:I\{I]jD>ѳMI訾%o=PQXV_ۤDgmɺ QPF "%#b@Qت,JƴƲq}o #VI]׼MwPO pge_zr82^ܭ9m;Ycfsu$w q*A />3>O~{ 󈽪a2B_6 u$zt+Lk>ů+Z_4u[N2pr%#ߞ ziT:ZF?|cOSY8Oy kWY Bp.+3w[?(G/%tu8 HDoxs|S;{8ym ,ekHL+l s[6G(oG4-ioxۗ Hi=-ܕ+ ŔUO1(>#ta] 5~|#x**f!;2iP"8z'GϬ)f>7_:ĹVj$$ R:(N+sfB)OIް`yzo},:D X  8l/@dAX807ɔR9, D3^|>>}'%ݞBYo:.R8MS64ӊ7ɏ&%%yc/ws)mY#Mo w=bevּtcɉ_1篓7(& S w}$qdzezz1Ũbfv<&O~sG)kTaDy'z ƇO8<{ko#mcx79rY>?GuibZҵU|KQs*[ɐf08F`ЩBiMHO~cYG͓9x(F-ζjPqo,v=!"r :a'~Ɩ?l5 fGs/f1\߆+2 B|✀8vzů^hwwRpqsUFpi:Cؾ:W/V#8Vx#ӖP|p M@(PQ JC 4T rRhB@fD-0\bE4H@ p-7Pk >x3h;A@ zE~v

        B%s@;a U/5t1R|(5#V>4^,Jj̢[G=/iZK4s ˉ B 5A}S =A@)Dc C@'HO$8+0 HhJE(-AL᱋@4:YUJ&4lo*!)T2X[KpK B.%ix)KtwHD$H#E b-s Zc 4Nmy)#cd7ϐJvzD.2-_aH T^ W{ [D pm70k ss!ūd 4S4đ"$:$IFQyj!xYDV׭4-%4`Hh5Y:JJCt|&~u TG6Ld7UjcBXDAm#uI:(v+\~cב; RV=+.O*ܱ¹KG([BI!v \^̽nt]և N 9wm=6A޳.yNrÛwuE`BY_#r|qɧGSk&1ߞK5 sLEvFۗ6p&1}G"#}g '7{\g:)yWSh XƼ .Z:+ClFwIٯ?O+\-pq}y,OhQ]gN0- e  N$1O<,p?c1iɺ9_.NQ 3.^Q}Xz7Je:@ifa \iE&5yk:s1X:h{Or9>އ޺usXd1K^vQDcyıM˝[l0+<΃ޔ(T8wq!9֊k-C)^J*ؽbV*⨩IbM4T{#F_BTȶMo<;:dB% f2: 8Hu-Q&) <^xvp7,IBh >Xb֚6ek9.Z l-Zs"2"5iB%(1ƀLbd=e{D% =?Wx+}|yDp:QE !t$#J#r2q :OBF]:7)'G+f$T^X̛aym|#h2:Ӵa7a@Ea|uoZ8kT G3\C9;[AzxPQF [[\r# Jґ|N["] 4iHA$!L2 Ty1*-D^MI' ޒ) l=cSy>=.^=*ݜdyăU3K1te|4FSΧ7ε+A hMA [O\Rt>ķ!lSDx/\ W8pj?x~,1[DGK$ss#e\n.m1=DXwc wì1Nxa{JV_8/"DL$5e{DH:dA3G)$ۻ{gsz ?q"$D @YNJg詘C3aZi!.bѬ6Zex>c1siƍJ}tKlcACTu9~gNB%3Q?Ǟ^f>=0X{x2^VW{#$%vƌ6M"{B{J[٠8 #--"N{yC7ANgv:~ hkCkґ J#l!xOg(iEXܨʆqEpk 2|1C5u5cvx@3o@|WO;0JtI4(SGSVV%δuyB$H -s:.3!ͤ;Czںtٗh!RtԩMPk*JÒ7,&% (dkPfŬhVSq19do{A7O^ 4BFV8G5VCф,fx|Ȭ^N`L}F+yN[в4~ʴ1;%$ʐ'yj"x k Dib>=W͹2.6Xu$z7e^-@KKG\-Hd^ >|C([m+(-fo+4YBIx]5RD l/V ݣIf!Z6a$DRcR8~RĒZeQWo95:YB֔'߼xąk)=X. ;W>m)'^ >ηnsNLxJ4GcIR A}0`V2Ĝ28waD(/:ԍD[V]vBqqI}3w}*<3_}n b^Th^ÇdVoKzYQ'C͢i*&ꆾ$YF4UMZsؾ>artAJ)IzȳZ(2ƝmBh& )Z\!nƖTmI/+G4F6{<$QGo!,Lk ^+g^yj';V,< sTeɱUdbb4*98S-BGk=:X[[EE)c+hE!B NnU E:\>%2ֳŜX ư6V(d=VcږLD, Cbo$ÁpJ 'WO\:11+kZq~wU*B e Z>%%st; 2M' 4ۇ dlsֻ)Be, I# zIxFf dY[uCᡖ M K5MįlSUMj'g^xhE`R\Qâ\<3V:],B h^'֒ڴD喦k="x&u˸jgst05X&1ۓ9VJbP&byN[pZc׀ %$(,"qx8G dٙ-fְ d Fb*N3uƳ7qޣrv?$M"R Tu|6UYS4 {9]K"/X%X:m0+jYP5[͉a!`nqpʸ(Bi婫r 4Ǚijgq vUSnl-E424+ep.> d@ I'8#)CB:cPJ4N?0㪵IENDB`yubikey-personalization-gui-3.1.23/resources/images/v2-3-animated.mng0000664000175000017500000010166612603205714024175 0ustar klasklasMNG  MHDRd = TERMXssRGB pHYsHHFk>BACK)bKGD X FRAMG IHDR>a/rIDATxi,y{{}w߱HBfd(&^ȶ*:T*)Hʕ8JʎlW*(J,JHI$( HH\\ng93=w}z̹T:wfzzy,-CoIpHw>CPs:>CIp?"EqWP %IRAvp(w4EQ\w{qfFH)mWIyI$ I1Mbqp_ \\aLHeJH 4MRN͂4wD(g0tk)g:K$iBS xMӨT*j5*ZjR1Q))SQ\ I|GTw5-KDH `4@fLTMvkC)a2Lp RNmmteR !2/3\QfeS1*UM;$IhO$M42m/gb=o&< r[C 6)_d%yN_J$X>6TU5MnjA.Ʉ( P əXf?˿ 0 "\7{ݬ7J:Hi$ #SdVU?\04$L鴻3:@i.a0iUU ap=VSp(7IQ*?c$rf7S9I$s(uTU% 6qFL&NqIWv}QH!AGEQFY^av] HJL&D(>ðr/:B )( zs  1E0/3;} M!DEQp)}p`a6+ br+m80t@B@!j5tԉTi:Zz Mm7Sov]W$YՎ'10e3;e_f0٢9д Q#ӈ8 H!"(;]!>l"ث30~߲6U٭;]t3צ( uI4@ U;dB>iiRqꘕ*!!cg{m1zEQ:q'ۮDQ[83{{_{ /_^=(y0btUvk5LDuLFn\WH+B0$5LeV2Aʔd j'(L`hF Lou]'ISBr1Zk#³PeY459iloo' D,Dy`ʼB)zQ׼ϯ׃)%QWyb ,/b A%2a0&zvv4M, @ՌBWsk\2$"IZC}݋6VQj'KoiQ> wȓ-3?O4LӼ)'-oGH"iIJFb(}!^g`8q0ȖeN;x"=0\(w$a0P1+Y<ǬʠdgZ{/Ayd2z cNDQjZ210gK\mW*6#{&'67pUUdU'9L)*]ZiY='9noK1)E:Wl2ry ȴ( u2,? 1BD ҴdgٛkU(A4PW@JUތ/;l,Juynyw?1!egBEPn1iX &UBZ!BfiVi4ޘ/3 pN+v|9,\d`~ ҙ(1gUT|Yݼ#bٔmgRTȮ[T7ȳ~shE!Rryi\f^}Q\BfbqqRww=@ވx.Obgݨ-^ΐENU]a7 /n8+kڧNPQrDE ʻl&םQia90Ӽ=.Wd2uUR xPH["kº) 旵I^x!Y|j'ݬ\J䌕 UVFQLSD"$b*B TB#wR ;r:(j(;=VߢT"P*G TU}(FJt7y><7[|2jUV~W'IBxDQDǤQJW/BE+躉Zdː"ߣ̸7?"S5*T E"1{ɠ0, yth48w&.?6fYE!)'!K?\B3o\DͲ05 ˰Qmk9s 8 cƲG>_3NuZJk8~ev~HN5\^ܯzDAXmehE8׽*I>w2Uc.+/|5z *BFxo_p]4HҘ а5nnШY;hO0lAw$I fxmv|:ie._~Μgw2rq@/sQT4Z :W.>u4FE?7bq$MPJu.VfaٻV8~"E2h,p$Q̏ ,& Cud* <̹xEtCЅL܀^¹$3ŪΕ+?kcW<"g9zjij9A"s8 |4NP EA3*tz=Zy!wMriwq QMc|~\Yʐ!?_<գ۷X]cU|/`86Xo5% 6v nJ* ș!1q'SU7,awʴg_%p+86DxԪ:R\?n1r`LPCG[˯NVcyy88.FEw8w:grO+;e'<# !IJբjQj7;;;b\8KLwf > cz Uɐ~h4u6Nr5V(r*5akgۢYoycǥA5 vxAHJ3z|<۶iTշ;*? p aW|Ђw.Z,UPBP]v,\:zc5jH~J̉HT[akU ǝ*~7zi$HT`TkEe,]AZ*rv{z= So0m y_~+Ӗ4JN,r_Ky'0ɫiTAo?(R=C8wr^X?`gzaVhTct]1*BKFFT]TI}mpc<#9߹@G8UАĨT];y[r-}L-~~|ٓ_d#mjY0ɛ/FK'~8׿KgΜ+aq]lըU|ߥbJ蚞 P4*^CU >89Z>al>vu[Iy|ٔ- #[tH3“]0;$}}\vgB67-67cY&Сm3xjBS4٤V_&ub} ô,в/`!(dNN5D,/똦µPpÏF#&( g3f !Yt̼IJ#K?A&>?z}g&W.]Z:&qc5 M4K=1dH!+Fa^Ҍo\,He:I30Pg_]+G8x/DQT(FTͬbUee4jJг'_ x<ƛV/ ϫy91! #KRH5 P2?mZV%o~ (a4^/j-M' _vY162rv3{NQl3cPgy x$Wv!ּXT>^u"Wd <_|Yvg͝~0LN_TdTqA"U+!AyF Vkc**/v"XɦE{|ZdEQIQU&)2I`6iL[tˡ|nnn8#\ϡ٬0JܺFݮbۭV,;NoE _d( 3Mjݺ(9&(ljuI(%'Qg> JjywQ8?yr7?FQ 7 bm4R4$; >/'~ƃwLuS wZ^6^) . ?tF {fRn^(D60 ,g=75k}[ ]qi|W ǮKYhEu_t틐| ȧDMSw00S,ˢPըT* @~x=*BXJ 慧ŷ>*m\i&: *Ͻ>|jв:>FȵöaTEdR"%"!|jUJj"߅i(gs,t]5w]'YO&#gB&H'ƟodkY^iѨ/M6V%c>pgȏ9v,;c&#uj9V (/ U |関(2EѴd˾睽w$y+3q)( v6xEt+MǢcs>0 ^˲0M&s)PdP =ޘ(~%yp2S#wX;F. ?h;s F4&G*sά9{$Wv O: cV] Ջœ!ы IˌBdAH:M+K)%PUɊYgqm<'j֘-|Gl9kS7j]K/@ TU*G?3*jSM^XH(H&%Dtz>i2g`gk RbTB"!&;e]8ǫO!C+=}saݲi!ʀffx5\מ|EPҘeѵMp`9 >OG:0 0qLjThz"^|ZM0DMY5~*c_Go,}B(Y{0;dww!DVm@ô%+f*clU޶8f{{ppg1M ˪eNB΀\} #ڵtiw\|K-L%a|gH,p(}Zv^>BkuZw>=>G5j(S$ 3a41ڤdU#ًSa0jђfݖ}^@lP4 dvUJ?p n^!ʝPVv{T*fьnc~QͭG,LgB3 wY=z8l )'2ݺO ?E$,ec{?%R.ѩZ W.b׫؍R]_~O *qMv,TSƓ4MaDd9qhjpXsOzT; B$|&30$iYP$qhE?DT'vaݥ]kizR+[_U񿰴 ( f8QJFA@Ŭh60 Un[L&`$ae+wV%IycFိW8yAB)h*J /7O:N=7^4{?a'W^[FU5Aϟ%dlQ)ڪ6y6!LoZtm&OaF"e ?|.uU.;[k=:'+ZBi*Rf\𥩤j0*·#,TUp2v\֎#I)\|KƗ"dkGe>KCegVTT>I!Q/SVi4^CUtS000;-TEaiy˲PЎ>zK͡Bui;,2Ia7W9~8dD4Wu_eWWn]4n4,z^ĺ_zHorshH8hwx4`9ziYg^D! :Bh>- uiR5*[nwmۤi61QH鯭P(iXHLއQImI1z"r՝?jv.kGבBLA EQIBd<4~]3r)= "gT@*k;%c6zӧ_Y/}L$4HtĶj;n5`82, RLg^[2$*MS(z8.JTU4MZNQwgFسC{t&la:IDATxwdU;SDfC%A$(A2` (`@,zf`bO:콿?^p`<> ꜽk]9njm&7Mk3یl68fn3یl68fn3یl68fn3Y3Io(q'̈́O=Yg=am}_zS4 ɳ^tጬYRkc~_?e]wݤq&I<4_Sghh4Q!$(Ij!@*I$ƉN~ I2^b=38j/?,~k 8,}ZZ9|9ht$Zuk1b qi(Haxъ'kKy}w[@b,Y! Jȝ:*d%PBUvx*=*Zk*&̛7V0:qi/\c*𥯳n{$J*˰6Y@H4Z`D'(>; ]I֚4?˲ׁzzxǻOC[`>uvY;-9&V/3-$|=/;, M3N~Y}i#mYӷ1yTY}N :)ӾZO7[ocRJz݆R&!cwc~7zXz;+W"8='kY;~}c!$JE~;w;uR}T%Y\$#nM(  BAgY_oL SiAͿ1g|{ΚU<  8(%pD pZK7EpTXw`mA2PJw""bbٍuC u8)aL5*Xp&uYW]qú+N!02fq&Y]|`])NGppH/J9@d <FF3~Xd |t @#f}gXJO9BD3b鷿z 72ɚBCRS )4us '@*ha(QȰ0;,Z-Y'gn,'B{6q-"y.VgZ\!wɼs!Dcz)D'!(p|Eρ<|xp4`QHD@ጶT'?O9#=j=>E~lg8Y3("˝{5"|."sjgCﺜR_SW*36$uƒ)':HoHm nֵ؀έ/.R!}OIEE+YZ"}P!18>:iLQ$Eo| >h.|>OR;CdݎVF҅eA+1ixhؿDPJG6ʬb.HJIj JIL 돁$ˈb"s~Goq*B8vnI台{/~B.u6}f&a06#Qg総-Y̒"()! ,(ZHb)"o )dg!ߨ]wR(O ;P2!3.DRIlum =iIW UPt*0jg YR^gb|CCdCrʱ[p"FVm"㷿o=oklYb8 D59]rμ x'1!̚L$S_ZO&uҏy8GFBZHͬl4#fg[O*g˼s)TyR !'_Jh)1Qh0%:9ZI2EA4lg7{6O"i9WИ Ӗm<, N"_vwW%2P|ʗ0A/I1 *RTY!^rl05=EC1M3zHZM$2WG."p9Q!9RJsG<P)tDOQ*f`}}{{ࢋy{LO+0rջϕWI^L; daWHtra$Tz 2: R=u>dv`LB254qgb|b 4! 8IK..fO8#Mpk2*d.5>,Ё/h7s+D/TSULU>R;=2s0w}#IRa"ohwAE* Qg-S9^EWWB@c|4Ů &B`||B/Ĺ .";9_ RN8']Ht 5s Ɖз0ka=#CjO:&-j=̛;c8 N=l zO /~ũukWI 80+ԭ>FXp>Dj#f|qDI+*݃4c(uuK8:ѱ$k+%6HwjNcU$A q!_D @p(V\_<&KpgQqDw(J̚GOo79-o=Qɏ6y/}b&,3mmȲ*21Mtd8HSl,2|. y-#oHGVG3f3:z0hk}%^~/ZLVc#+*V1-OwǛҬW~r/8=ƥ@(&iM"zR%`:s &C+?w j=1GR⿼Oy̿>g&WtL6UiS 'GQ_8Jwƶ1DD6appXXr-zNj$IFVg|g$W8+1E9dI832OP1BHuI?%,H48eFfo% %t&ER3+҄9sQW\~;86S7~zQ1Yhu:3! 0-|M(?ё EcZ$55M/P15>1{N=sp{3554z:Ҿ %B,IEĴk '1(GfZ.[ JWz5P7g-XN2w޼.O\rn/))ee1ևz_9lmPBՓ%|PR!DJqa\cjb9d-jeь[ET Ely!`b0EEMxEԤ$QD,];`(A(!"'iXǾqewiL Ş^J.|`8rᒋ(_p?7;pZAZj t4(YsvB @4r3%8tr5")edh9HU+lD4P!fxxBT` Kdv !8&2DsߖsCY/|WOYZLä@K $zi6<[R#[/}'zHGYtcۓ\z=hN `{>D[סoI1v/tDs*] 5Y;w1nB1ͺU*U|V3%K28H8fI'pҳTi ]EP:U~JV ?DQ-P8|F̙;U`%[o|ن|pO?i05=G5WgŸ݉)L@RB""MRr?L¼-q̑5}m-z\dOĞ$pOCzDGY#0da 0BX 2I:DIݖrERȬEX+`͢9>ѽ\ &I)tbf8cZ+y~KF8hVbo@E>7A*3~80|bGKh>Fs=ufm))}./;ʓO|^F KSVadJJlfB~zQ>B Piօ`=¸nڍ'[(dQDNGA2h5(#u H*YG*rI呉7zĬW@PBuF|u BB208qt3g,J"W_>]㓾7 Ш,MuV^ β`B*]eveg>Ň\Z*$t ]ͼY;/ػstf۬\ølM# \dւ eaܕ^ %÷79RB?eI\iY2E(1\ѱ|;ҟJ)P8 *Š tpOOֺ111ACo8S8sֺ҅czz]vܞoIH6#':mm].(g í -Blq9?aK߿o.=y|V,ڶAT[Q*ul% Kr]|G3M%!Jc3t}6XU[8!j$YS롯KW&>'M Fs],S,Rb=`̜}Qݯ[Gi^'ơRwp"0:Qa-*f44Zf]vSN#bIDI<'m) w8(' 蚏(L|@Ѷqw2=o;CTug柕N__H̶Sf1?yw󎫮WǬY6?yP((~Xk3(g|Y!KNipddY*&SJ!CG'aRh!h0~@sݷQaJSA A =/%^(3oy|#׳ǹ'JT -NyL#4Q>ĘS2o+yk;/O.=f͜uA0 Dy7^i~k%֡uDhcEQ @dB3]Gj]<= JWo300(Րmt$# MHbr]`.ݟ+FTS'/R4AK, c>7<ۂN;mbd& Bڑ̷qTxX\g1q)>tQ .GW_l=ٶp%o+ 8VZЋZ^y[/܂qɇZiJUwAyF[~ yIw)Td7|i6HmYۑ=' /dRn/0U˔jLQTP럋[ {ET8ڡa,|[iWj2UWe&UJj:1 Chm@[؅| Hp!S 0O+B?Xy[o틜l*}:]CWDO_XG} oa``(zf ^GKÏ`{QB?V NB;iOZ d]\|w@rn, yA(mPZ`= A0vQ AqƠ 7VsՇ#tv#WDooSM?qxÒ R.穖Kd\sl֬| 4&SYr Xv(u@j_blq)q" Xp-;˘ՄR#*:g4#Mk_.|.tL3ߵB]ќƵmkRŎ;Bqfc>旀@FG{)IX&khR*v՟xߠlqoVW.Ml6 MO7p^ğn ]Mk;Gy)Ό`CG4K\M{ԃ|)Q_ȋْ~} t~R}Z@:R]m/יo+DJyVb"42@'|h111EVC9ّ\yյlŇWC+iKˢE[j/܍5wQ(v3t2.䳮c8ya8-8ieP&y;c0~,D:hRs,hNՅq%J#u`ģov x~ .[5j=TIt~ rQsX E= 9fw]ɜs5{pSFh4)ΜʷH%7 /g+H #kW]a>ʖ58ZHȕzY7W}릈"%<`j:jJsUH+#I.TrD4{)+\w_H>M7G@|9ifpDdu'_5>F!#4')VopdD̫Jr\7&Xbn_6Q'^Ëלtζ5:WJ> eYgN 3D ^S7s|[..W(!rI&0Rwm's4lQ1,栗]Dpʋ.c2m EH\޾QK&~$ 'k ƥ^@vZEqчsƙV 3:O{Ѓaj|J@Gy;1:ZlZik40:%vSfy-8EX'@p 5S|.|hM_xŲ#%.Kyo~:G];^u#t"5(%.#9I2ad)\B[I'ifi!V1jg{!HӔwڅ+sss]ʕoޟjYhU P\.sEW+Ep9[Tɦ)Vfqϲ<\N:h . ! "MBP*k*\}6H?1@+pMZcdL3t(c k2 "YuS/L-.w\;@WS3t0 Y$-Xw,M g4Jfs0HŖ׿EIJRH5n^7|Kۋ7=B9W$sI`2K(A?g_J@j:u7q>{I\A[_vW# qɲ4.T)S-uȃ+uUJdf_'oy1g l:2FFBIMW _^gٖtbb\:o:] '>h E(#MȲBu.Z.ƦU>Ri/Ĩփ:r{Xa򅘁>,߉k?|=?M>)MGQDTO;]wG5XVYnc%rV4Y1&7BMH nsv;29b4 QaGvd)5o;c7:h.~Fsk?!IӜNSs?u (*vYΝM1_$I|ȡSvoV?3sn~뛹ץp%̝=ڱ5D2"Ke΀$WہN(j^pҮFpw|'O@lAj4hހkM(bb8])BPbZE}}u&h4|jw^{E_3TX b?~kf`VpPwѷ b|<.8 ^^]"ɁH(wo.41߶[_ T+i(*=|gF8$q>"&'骔iNO3ɉI$T< Ʃf[_/:T5 ᡥKp>>/]$ܞv^5?gӼ8h6ƃ¤M\9uѧot\x출C_fDqM׶W_Glᤢ^alz ԻwwĊ5ӟ(dx2.fZ~ǧcݸ}gܹϺF0u_KP@EWORV,[ĸs Sc h6SrUdA*`QQqoci) |b+ui5en 5M֎ML "ծnƉdN_/;+p ǟr2ݞYdh(XP,)W,zkfq4v̚=fv? |Z}|?GV#!s MB`uCh%(jwn<װ|kЧK\_~db弚pqMob>gJ]5DHMVj/rO>Ï=mʋIg)$?wkjdNg_*gQx䑇y׾ɏ٤ |b|sG?%+VBp5J1]<zj5#vհ,#-"^q߲uLL& ZiVtzuNҷ1k\.T\|oh5M׵nuX0姟TͿkV׿LݍLOѓw\{̟w:B\-11"3U)"uᑵJ8װpVhl]Gp9$vySƌy?IFKbh*none!/h-NFx!#n8 G%4YQ|YVL56(T˔syVayֻy'rOZO=&Vpw=LNM[~;Hj/k}w UHG^5nRqL2St׺GJ@}y/HRyZO>11(b,[Wu&_ HNX)l׮vY1ИjduScbzBD%g-$nO= ,c"9`U  3fhAiyxVjrҹbdI5]]NW 5l+Ymezj&+9$Z-/W6b1 ^z fAzbd{w06=#<;fJVkL7԰l.yӎ3g&'0::}wC'?y;i~)) 4- =]8g…gAV ";e_tc("H[ }=kU:,?T=g,ؿz*VZ^ò!)sԺ׿tLifE%lZ֮^>{hDwL&eWbhjV\lm۞Zsmt@.r̠(nOglm6sqf`3m6sq?¾DIENDB` IHDR>aIDATxyTŹUuN/3/n1 (ū#E`1((D⾡#EQ!ĝaT}:=W>[V!AB $(.888888888888888888888888888888888888888888888888888888888888888888887l]'ҬYSv ۴u(mmJ/8}"1!ee5isW}zݺ'ڤmF_]Gb Dq "֮emZZ5ϒ_1S3-TnŶOJDds˰CAӠ"BV)i ڶDTv!Mo m$6;&v;]z)6nDDJ)0ʠ4Aehp~/;d7r֡T DgH5Atemf%ckŊ%,JiD@)akP;8˙sAi RCn*~l8L{p*_TJscP(5 ڽ%CM(EpLK2 NŶߏ;j6t2X~nhp11֠JQ  4K1m|:nh*,nJUۻoWP8>E8B!7a"=2hN8 *DM"ۺ{mF_b\@`4D3L." ;IDs YܑN=TT Zchy ;C]gfjW쨫1^1h/:!rh}PlR"RO_v(ϷL9u᝷ϒ9H+w=?>]=Ȇ8?ၱ1^S(iJ|:k (d?[r),RW?.%hnw~؍rf ޽bGt!N"ʌ[ѥq\ QXr9=̼]zhXxCBsF)'&gZ`T A+ARԤ-o{kǎk /C2(_)!E`*U6DY.v8KA5N+-qpk'P(O.`âpQmx Sá\Ï+ٱu>ƍ 3A8'BwI(%BRHL2RvR @ia)f~Z? g˩(La2uT_mB넞CiTYYQ "B*Ԍv&:{ڕ}f9_@ /Q89;~ZH` "yDT5o[4 8?Ͻb 8[)AqG`RiakߵQ<ȴ>C+}c8Yg]1is?:Z(hPZo6(b)9zȾ *Bm-ߊW~_A+9'Б GBq^:O/\»e)kTqUS]W(~%xaB!LCqXL{FqN\#KyIW/8!Ͼ;c\Hiwb̹Y6h[ę&Ǫ9pȭ{s {ⶱS^^QToj1 W⽍S_ߋơx4?1oլf$7$wsXCߕ+4b̹QƗiqDd٧v4}h# !&}!QQYi5<Pm|$% 8gQJ껇Q|\e90} &$HW~ŇT-Ql{oqx`\JQjn>{ ;^"[m41}C@eu!F~aEa'0't^̾c#@oQ9 5Ny!7M|Elj[\՛VloQ`9p l&x)My L{ʀ*d !\wvldYovGLqy)ÔqHcNX-vޅ^Y=Fqw u"Ղź8DC#؟-Hd Ŷ"ݓbY88 ЩuɗvĺOTa-%zmNl.ir>+ypҊaө}{;= ƀA9Y,[^O@B.ˀ6M-n69Ylo nw " Chծ ~`SP_ruLνuΡ2/t߱+NPpu36)I/3%B+7Q5NPZ1 ]l9yg͸q#ĥXk9ksn5~C!Dx; I>͹7/F)fq(vm4(E" pj?!ҔJm|Q@!s(,kQާdYYj(7r4hFxU Oiw]PloP"" 9fa&oJ8ڌI7CQ}O޹gsôňu̸uZ]LPmu5^4'Cvk? .E$ݎXISxgކ_s~z o*zCLN͙ԫ4kYڽ| }y>(MߨкpXPhXX2u4"ryGϝx#iҢeܬQ>THcWUxޟ=%'m E}/Q\m8XcVq8.\{;+O[ڹ/UQ|UBøx׊mC\\]&|-PlC#_p;=W_< Ăq'%w1%_֢ F'Cc#i~ =h;B0!"N<)0dGmCWU'GSYtB  )8{lZz0J2 oτTաbWp)*?ugїӀŐy 8bc`t >Q\IkZ,p=0av%Q 5Z>dhʲZٺ/:|u"R7Xaf+9{y| /;:KL1w3*k(Vc%GK>QeU ua}0aāy()g]֕n9>}~s )(%O&ҤI%a],E㡕 0 ɰϯ{EGjJS6g9Ѽe3~h>˖YRctA4ߏs6 |˟%Wg.OP&"%L<O\H>V)xvh|itO‹Kf}eO#D 'BYYFI3H}|ч3X:(H{%~En7;u99?ך2_Mgžسusq3\2 "4 NsuخX|fgO//P N2P)gA ڹ3s~/:t6y٣Ǟݴ@՗[.eh <&1c#Oߏs6vͅ\q3fB"}o>mgFH$~>&#~c _xacZ^tm-\ɔ)&S( O ~8wiq; pީFf0&ӡ(E]m5W0;DVݭ[Ŷ_8|xT*&ٸӦ5 Z(܂JG?؁@mc՗+0Vp\[[Oe3+f -7\6tIm=YCG>qq픥DN JkRT A|m[7oɃӧ'7xjJLl_`9~T絛e#&]{%A+WQ3X8m`G㳂zz.;iϭAkUߜB@pP:AXPZѾMk>$ڗvj? q_{MPlgԚ|TDIbX *R3bj~wll#JAû2=aBD|AU3ʪzY1+'|CB kHrh,责LbۣMQ]]Ýb/1KܥsbQm낁IENDB`MEND! yubikey-personalization-gui-3.1.23/resources/images/v2-2-animated.mng0000664000175000017500000014047512603205714024175 0ustar klasklasMNG  MHDRd = TERMXssRGB pHYsHHFk>BACK)bKGD X FRAMG IHDR>a:IDATxwdU;SDfC%A$(A2` (`@,zf`bO:콿?^p`<> ꜽk]9njm&7Mk3یl68fn3یl68fn3یl68fn3Y3Io(q'̈́O=Yg=am}_zS4 ɳ^tጬYRkc~_?e]wݤq&I<4_Sghh4Q!$(Ij!@*I$ƉN~ I2^b=38j/?,~k 8,}ZZ9|9ht$Zuk1b qi(Haxъ'kKy}w[@b,Y! Jȝ:*d%PBUvx*=*Zk*&̛7V0:qi/\c*𥯳n{$J*˰6Y@H4Z`D'(>; ]I֚4?˲ׁzzxǻOC[`>uvY;-9&V/3-$|=/;, M3N~Y}i#mYӷ1yTY}N :)ӾZO7[ocRJz݆R&!cwc~7zXz;+W"8='kY;~}c!$JE~;w;uR}T%Y\$#nM(  BAgY_oL SiAͿ1g|{ΚU<  8(%pD pZK7EpTXw`mA2PJw""bbٍuC u8)aL5*Xp&uYW]qú+N!02fq&Y]|`])NGppH/J9@d <FF3~Xd |t @#f}gXJO9BD3b鷿z 72ɚBCRS )4us '@*ha(QȰ0;,Z-Y'gn,'B{6q-"y.VgZ\!wɼs!Dcz)D'!(p|Eρ<|xp4`QHD@ጶT'?O9#=j=>E~lg8Y3("˝{5"|."sjgCﺜR_SW*36$uƒ)':HoHm nֵ؀έ/.R!}OIEE+YZ"}P!18>:iLQ$Eo| >h.|>OR;CdݎVF҅eA+1ixhؿDPJG6ʬb.HJIj JIL 돁$ˈb"s~Goq*B8vnI台{/~B.u6}f&a06#Qg総-Y̒"()! ,(ZHb)"o )dg!ߨ]wR(O ;P2!3.DRIlum =iIW UPt*0jg YR^gb|CCdCrʱ[p"FVm"㷿o=oklYb8 D59]rμ x'1!̚L$S_ZO&uҏy8GFBZHͬl4#fg[O*g˼s)TyR !'_Jh)1Qh0%:9ZI2EA4lg7{6O"i9WИ Ӗm<, N"_vwW%2P|ʗ0A/I1 *RTY!^rl05=EC1M3zHZM$2WG."p9Q!9RJsG<P)tDOQ*f`}}{{ࢋy{LO+0rջϕWI^L; daWHtra$Tz 2: R=u>dv`LB254qgb|b 4! 8IK..fO8#Mpk2*d.5>,Ё/h7s+D/TSULU>R;=2s0w}#IRa"ohwAE* Qg-S9^EWWB@c|4Ů &B`||B/Ĺ .";9_ RN8']Ht 5s Ɖз0ka=#CjO:&-j=̛;c8 N=l zO /~ũukWI 80+ԭ>FXp>Dj#f|qDI+*݃4c(uuK8:ѱ$k+%6HwjNcU$A q!_D @p(V\_<&KpgQqDw(J̚GOo79-o=Qɏ6y/}b&,3mmȲ*21Mtd8HSl,2|. y-#oHGVG3f3:z0hk}%^~/ZLVc#+*V1-OwǛҬW~r/8=ƥ@(&iM"zR%`:s &C+?w j=1GR⿼Oy̿>g&WtL6UiS 'GQ_8Jwƶ1DD6appXXr-zNj$IFVg|g$W8+1E9dI832OP1BHuI?%,H48eFfo% %t&ER3+҄9sQW\~;86S7~zQ1Yhu:3! 0-|M(?ё EcZ$55M/P15>1{N=sp{3554z:Ҿ %B,IEĴk '1(GfZ.[ JWz5P7g-XN2w޼.O\rn/))ee1ևz_9lmPBՓ%|PR!DJqa\cjb9d-jeь[ET Ely!`b0EEMxEԤ$QD,];`(A(!"'iXǾqewiL Ş^J.|`8rᒋ(_p?7;pZAZj t4(YsvB @4r3%8tr5")edh9HU+lD4P!fxxBT` Kdv !8&2DsߖsCY/|WOYZLä@K $zi6<[R#[/}'zHGYtcۓ\z=hN `{>D[סoI1v/tDs*] 5Y;w1nB1ͺU*U|V3%K28H8fI'pҳTi ]EP:U~JV ?DQ-P8|F̙;U`%[o|ن|pO?i05=G5WgŸ݉)L@RB""MRr?L¼-q̑5}m-z\dOĞ$pOCzDGY#0da 0BX 2I:DIݖrERȬEX+`͢9>ѽ\ &I)tbf8cZ+y~KF8hVbo@E>7A*3~80|bGKh>Fs=ufm))}./;ʓO|^F KSVadJJlfB~zQ>B Piօ`=¸nڍ'[(dQDNGA2h5(#u H*YG*rI呉7zĬW@PBuF|u BB208qt3g,J"W_>]㓾7 Ш,MuV^ β`B*]eveg>Ň\Z*$t ]ͼY;/ػstf۬\ølM# \dւ eaܕ^ %÷79RB?eI\iY2E(1\ѱ|;ҟJ)P8 *Š tpOOֺ111ACo8S8sֺ҅czz]vܞoIH6#':mm].(g í -Blq9?aK߿o.=y|V,ڶAT[Q*ul% Kr]|G3M%!Jc3t}6XU[8!j$YS롯KW&>'M Fs],S,Rb=`̜}Qݯ[Gi^'ơRwp"0:Qa-*f44Zf]vSN#bIDI<'m) w8(' 蚏(L|@Ѷqw2=o;CTug柕N__H̶Sf1?yw󎫮WǬY6?yP((~Xk3(g|Y!KNipddY*&SJ!CG'aRh!h0~@sݷQaJSA A =/%^(3oy|#׳ǹ'JT -NyL#4Q>ĘS2o+yk;/O.=f͜uA0 Dy7^i~k%֡uDhcEQ @dB3]Gj]<= JWo300(Րmt$# MHbr]`.ݟ+FTS'/R4AK, c>7<ۂN;mbd& Bڑ̷qTxX\g1q)>tQ .GW_l=ٶp%o+ 8VZЋZ^y[/܂qɇZiJUwAyF[~ yIw)Td7|i6HmYۑ=' /dRn/0U˔jLQTP럋[ {ET8ڡa,|[iWj2UWe&UJj:1 Chm@[؅| Hp!S 0O+B?Xy[o틜l*}:]CWDO_XG} oa``(zf ^GKÏ`{QB?V NB;iOZ d]\|w@rn, yA(mPZ`= A0vQ AqƠ 7VsՇ#tv#WDooSM?qxÒ R.穖Kd\sl֬| 4&SYr Xv(u@j_blq)q" Xp-;˘ՄR#*:g4#Mk_.|.tL3ߵB]ќƵmkRŎ;Bqfc>旀@FG{)IX&khR*v՟xߠlqoVW.Ml6 MO7p^ğn ]Mk;Gy)Ό`CG4K\M{ԃ|)Q_ȋْ~} t~R}Z@:R]m/יo+DJyVb"42@'|h111EVC9ّ\yյlŇWC+iKˢE[j/܍5wQ(v3t2.䳮c8ya8-8ieP&y;c0~,D:hRs,hNՅq%J#u`ģov x~ .[5j=TIt~ rQsX E= 9fw]ɜs5{pSFh4)ΜʷH%7 /g+H #kW]a>ʖ58ZHȕzY7W}릈"%<`j:jJsUH+#I.TrD4{)+\w_H>M7G@|9ifpDdu'_5>F!#4')VopdD̫Jr\7&Xbn_6Q'^Ëלtζ5:WJ> eYgN 3D ^S7s|[..W(!rI&0Rwm's4lQ1,栗]Dpʋ.c2m EH\޾QK&~$ 'k ƥ^@vZEqчsƙV 3:O{Ѓaj|J@Gy;1:ZlZik40:%vSfy-8EX'@p 5S|.|hM_xŲ#%.Kyo~:G];^u#t"5(%.#9I2ad)\B[I'ifi!V1jg{!HӔwڅ+sss]ʕoޟjYhU P\.sEW+Ep9[Tɦ)Vfqϲ<\N:h . ! "MBP*k*\}6H?1@+pMZcdL3t(c k2 "YuS/L-.w\;@WS3t0 Y$-Xw,M g4Jfs0HŖ׿EIJRH5n^7|Kۋ7=B9W$sI`2K(A?g_J@j:u7q>{I\A[_vW# qɲ4.T)S-uȃ+uUJdf_'oy1g l:2FFBIMW _^gٖtbb\:o:] '>h E(#MȲBu.Z.ƦU>Ri/Ĩփ:r{Xa򅘁>,߉k?|=?M>)MGQDTO;]wG5XVYnc%rV4Y1&7BMH nsv;29b4 QaGvd)5o;c7:h.~Fsk?!IӜNSs?u (*vYΝM1_$I|ȡSvoV?3sn~뛹ץp%̝=ڱ5D2"Ke΀$WہN(j^pҮFpw|'O@lAj4hހkM(bb8])BPbZE}}u&h4|jw^{E_3TX b?~kf`VpPwѷ b|<.8 ^^]"ɁH(wo.41߶[_ T+i(*=|gF8$q>"&'骔iNO3ɉI$T< Ʃf[_/:T5 ᡥKp>>/]$ܞv^5?gӼ8h6ƃ¤M\9uѧot\x출C_fDqM׶W_Glᤢ^alz ԻwwĊ5ӟ(dx2.fZ~ǧcݸ}gܹϺF0u_KP@EWORV,[ĸs Sc h6SrUdA*`QQqoci) |b+ui5en 5M֎ML "ծnƉdN_/;+p ǟr2ݞYdh(XP,)W,zkfq4v̚=fv? |Z}|?GV#!s MB`uCh%(jwn<װ|kЧK\_~db弚pqMob>gJ]5DHMVj/rO>Ï=mʋIg)$?wkjdNg_*gQx䑇y׾ɏ٤ |b|sG?%+VBp5J1]<zj5#vհ,#-"^q߲uLL& ZiVtzuNҷ1k\.T\|oh5M׵nuX0姟TͿkV׿LݍLOѓw\{̟w:B\-11"3U)"uᑵJ8װpVhl]Gp9$vySƌy?IFKbh*none!/h-NFx!#n8 G%4YQ|YVL56(T˔syVayֻy'rOZO=&Vpw=LNM[~;Hj/k}w UHG^5nRqL2St׺GJ@}y/HRyZO>11(b,[Wu&_ HNX)l׮vY1ИjduScbzBD%g-$nO= ,c"9`U  3fhAiyxVjrҹbdI5]]NW 5l+Ymezj&+9$Z-/W6b1 ^z fAzbd{w06=#<;fJVkL7԰l.yӎ3g&'0::}wC'?y;i~)) 4- =]8g…gAV ";e_tc("H[ }=kU:,?T=g,ؿz*VZ^ò!)sԺ׿tLifE%lZ֮^>{hDwL&eWbhjV\lm۞Zsmt@.r̠(nOglm6sqf`3m6sq?¾DIENDB` IHDR>a/rIDATxi,y{{}w߱HBfd(&^ȶ*:T*)Hʕ8JʎlW*(J,JHI$( HH\\ng93=w}z̹T:wfzzy,-CoIpHw>CPs:>CIp?"EqWP %IRAvp(w4EQ\w{qfFH)mWIyI$ I1Mbqp_ \\aLHeJH 4MRN͂4wD(g0tk)g:K$iBS xMӨT*j5*ZjR1Q))SQ\ I|GTw5-KDH `4@fLTMvkC)a2Lp RNmmteR !2/3\QfeS1*UM;$IhO$M42m/gb=o&< r[C 6)_d%yN_J$X>6TU5MnjA.Ʉ( P əXf?˿ 0 "\7{ݬ7J:Hi$ #SdVU?\04$L鴻3:@i.a0iUU ap=VSp(7IQ*?c$rf7S9I$s(uTU% 6qFL&NqIWv}QH!AGEQFY^av] HJL&D(>ðr/:B )( zs  1E0/3;} M!DEQp)}p`a6+ br+m80t@B@!j5tԉTi:Zz Mm7Sov]W$YՎ'10e3;e_f0٢9д Q#ӈ8 H!"(;]!>l"ث30~߲6U٭;]t3צ( uI4@ U;dB>iiRqꘕ*!!cg{m1zEQ:q'ۮDQ[83{{_{ /_^=(y0btUvk5LDuLFn\WH+B0$5LeV2Aʔd j'(L`hF Lou]'ISBr1Zk#³PeY459iloo' D,Dy`ʼB)zQ׼ϯ׃)%QWyb ,/b A%2a0&zvv4M, @ՌBWsk\2$"IZC}݋6VQj'KoiQ> wȓ-3?O4LӼ)'-oGH"iIJFb(}!^g`8q0ȖeN;x"=0\(w$a0P1+Y<ǬʠdgZ{/Ayd2z cNDQjZ210gK\mW*6#{&'67pUUdU'9L)*]ZiY='9noK1)E:Wl2ry ȴ( u2,? 1BD ҴdgٛkU(A4PW@JUތ/;l,Juynyw?1!egBEPn1iX &UBZ!BfiVi4ޘ/3 pN+v|9,\d`~ ҙ(1gUT|Yݼ#bٔmgRTȮ[T7ȳ~shE!Rryi\f^}Q\BfbqqRww=@ވx.Obgݨ-^ΐENU]a7 /n8+kڧNPQrDE ʻl&םQia90Ӽ=.Wd2uUR xPH["kº) 旵I^x!Y|j'ݬ\J䌕 UVFQLSD"$b*B TB#wR ;r:(j(;=VߢT"P*G TU}(FJt7y><7[|2jUV~W'IBxDQDǤQJW/BE+躉Zdː"ߣ̸7?"S5*T E"1{ɠ0, yth48w&.?6fYE!)'!K?\B3o\DͲ05 ˰Qmk9s 8 cƲG>_3NuZJk8~ev~HN5\^ܯzDAXmehE8׽*I>w2Uc.+/|5z *BFxo_p]4HҘ а5nnШY;hO0lAw$I fxmv|:ie._~Μgw2rq@/sQT4Z :W.>u4FE?7bq$MPJu.VfaٻV8~"E2h,p$Q̏ ,& Cud* <̹xEtCЅL܀^¹$3ŪΕ+?kcW<"g9zjij9A"s8 |4NP EA3*tz=Zy!wMriwq QMc|~\Yʐ!?_<գ۷X]cU|/`86Xo5% 6v nJ* ș!1q'SU7,awʴg_%p+86DxԪ:R\?n1r`LPCG[˯NVcyy88.FEw8w:grO+;e'<# !IJբjQj7;;;b\8KLwf > cz Uɐ~h4u6Nr5V(r*5akgۢYoycǥA5 vxAHJ3z|<۶iTշ;*? p aW|Ђw.Z,UPBP]v,\:zc5jH~J̉HT[akU ǝ*~7zi$HT`TkEe,]AZ*rv{z= So0m y_~+Ӗ4JN,r_Ky'0ɫiTAo?(R=C8wr^X?`gzaVhTct]1*BKFFT]TI}mpc<#9߹@G8UАĨT];y[r-}L-~~|ٓ_d#mjY0ɛ/FK'~8׿KgΜ+aq]lըU|ߥbJ蚞 P4*^CU >89Z>al>vu[Iy|ٔ- #[tH3“]0;$}}\vgB67-67cY&Сm3xjBS4٤V_&ub} ô,в/`!(dNN5D,/똦µPpÏF#&( g3f !Yt̼IJ#K?A&>?z}g&W.]Z:&qc5 M4K=1dH!+Fa^Ҍo\,He:I30Pg_]+G8x/DQT(FTͬbUee4jJг'_ x<ƛV/ ϫy91! #KRH5 P2?mZV%o~ (a4^/j-M' _vY162rv3{NQl3cPgy x$Wv!ּXT>^u"Wd <_|Yvg͝~0LN_TdTqA"U+!AyF Vkc**/v"XɦE{|ZdEQIQU&)2I`6iL[tˡ|nnn8#\ϡ٬0JܺFݮbۭV,;NoE _d( 3Mjݺ(9&(ljuI(%'Qg> JjywQ8?yr7?FQ 7 bm4R4$; >/'~ƃwLuS wZ^6^) . ?tF {fRn^(D60 ,g=75k}[ ]qi|W ǮKYhEu_t틐| ȧDMSw00S,ˢPըT* @~x=*BXJ 慧ŷ>*m\i&: *Ͻ>|jв:>FȵöaTEdR"%"!|jUJj"߅i(gs,t]5w]'YO&#gB&H'ƟodkY^iѨ/M6V%c>pgȏ9v,;c&#uj9V (/ U |関(2EѴd˾睽w$y+3q)( v6xEt+MǢcs>0 ^˲0M&s)PdP =ޘ(~%yp2S#wX;F. ?h;s F4&G*sά9{$Wv O: cV] Ջœ!ы IˌBdAH:M+K)%PUɊYgqm<'j֘-|Gl9kS7j]K/@ TU*G?3*jSM^XH(H&%Dtz>i2g`gk RbTB"!&;e]8ǫO!C+=}saݲi!ʀffx5\מ|EPҘeѵMp`9 >OG:0 0qLjThz"^|ZM0DMY5~*c_Go,}B(Y{0;dww!DVm@ô%+f*clU޶8f{{ppg1M ˪eNB΀\} #ڵtiw\|K-L%a|gH,p(}Zv^>BkuZw>=>G5j(S$ 3a41ڤdU#ًSa0jђfݖ}^@lP4 dvUJ?p n^!ʝPVv{T*fьnc~QͭG,LgB3 wY=z8l )'2ݺO ?E$,ec{?%R.ѩZ W.b׫؍R]_~O *qMv,TSƓ4MaDd9qhjpXsOzT; B$|&30$iYP$qhE?DT'vaݥ]kizR+[_U񿰴 ( f8QJFA@Ŭh60 Un[L&`$ae+wV%IycFိW8yAB)h*J /7O:N=7^4{?a'W^[FU5Aϟ%dlQ)ڪ6y6!LoZtm&OaF"e ?|.uU.;[k=:'+ZBi*Rf\𥩤j0*·#,TUp2v\֎#I)\|KƗ"dkGe>KCegVTT>I!Q/SVi4^CUtS000;-TEaiy˲PЎ>zK͡Bui;,2Ia7W9~8dD4Wu_eWWn]4n4,z^ĺ_zHorshH8hwx4`9ziYg^D! :Bh>- uiR5*[nwmۤi61QH鯭P(iXHLއQImI1z"r՝?jv.kGבBLA EQIBd<4~]3r)= "gT@*k;%c6zӧ_Y/}L$4HtĶj;n5`82, RLg^[2$*MS(z8.JTU4MZNQwgFسC{t&la=VIDATxwUSnMBz# RTDw)J#: ? buDePDANH( $~{q H $׻ʳlsl~[lml6smqܶ8fnzS͜sX7H!Bl^B㗿6o㏡Ztomc>EN>׮Bkw{1yrF\[Rs:y,}c]va>-{ǐ!<.CJ=<|Fl[Ky'1n5H0 pEJBǷuB9z| c 2B ;nz k׮?ߖ7Xg?O1JZ >#pw d`kM 3Z~ҚR[$k`Z1P=ٗo}Nzs/CwqX`!4L֏v28It85 B(8됑fRw7FC4ju\HƦNg2iRqA? tww v qE5p)@JHE @@f_I38gCxTd3YV"N(,3c RI  g?`}?qMcPaDuYVۿtӿBKpBsT h֮]4|!Xc.!%(G&kcc8H"wsL>пf=^nu q84aMIG6 swc J+1H{|!ZbQ ctW6!i$X#(稏6R30:0BJ1>*xC$%o|^yΟ}w8wq{[a;q)RZ\Jp< " |Q(E E *<]]Uo.چJTV<'- k zSHfBkRo};_LzNv~9S@1&Oacýiy9Z_*Ӛ@ &~%1}L-ϙgŜٳh+!cZGY}Ǘ<̃>/gxdJmq #:QfK #I~i6jhEm}QF<_bA [xWAbLf=}gŌ[DzoB*]yvr "³"QI|avWVt9@b?|c򺟑QK&|(K$ _!Qsdc}!_[_ R 4Eq'3w̿JBq=fVc c+l^bq֡u\m}N>?[ӄp=~3yN͚Ɠ˗dDZsڞZ!F7A?ܴbs9rb8pB\xjWpk=& s-z9&I~ޣ#NVKA++o>084ظ I-}4_߈'9˧H7^O|["֠h@:!tΣRH!_ssF#WU~ X "t!R"/ vi!/q?سW4_ẃ|n.IPZYZ 6qk(ZOXA]5@ I-)QN8Xnw4q,l,Ys\kJhКHlB+ ,~/P^xᅛ6 ˾YȆUXg]R&|e(B9OWa3{$8'!GRX*Zfy`$4&#coXZqtZ&2PJejW>444W/:]t16 tlZkݸ,gX˙B>O#a3?S:o!{hѾPDJLphA --=C9>ZIeo( 'Ch!Q+1/ CkA3hu*ugRHE@e( 0&16BJ֒(B&\xSfifPјE̸PR aL/.EH VnfsK X*Rn/~e:@$b=,t4 ByN All :gym6nJOz$iL|A kta_r°Ya$ FI%bwQfBh@jB6EUl.GZah|SbZVh^y0Z_{j#Zti+)$xp.<5?V*EXdO,{$8dՂP ll$$M1(j]'|ycո Kq6ĄF 5)Qc,R%D(TCP gTWy׬Z5#~h g>(@- 2*+ J8*.ڪUs,yb18&c8YEM.E c,Y: ?ݏ$ZI"MҪ%Xش5T*'+y4&0$#_2ѬpXcQő}lXZ}I{(hqyg3ka_m`bV\ŧ?i~oiM3Τ32R@{R-T` "ǾN7MbJod{&BT0u\{*zVzd|-99AQe D}҅Q?\<Č-R]G_JيZgh/Ԓ)SrYgO_h4Y}Q<~o.Ti1ւjq(H?&a5WU0V&I;0wvH :* ud2FlZ{IFgĥ8Ed\ XJ-SJlgϵ6ҖTw.7ad_ 0jte4=_M{^ -'.s!/;̈́_.Yf%8a;#\i !}HlbHmxQߪGO]HogD(: =? L< R#e貇xl}\B_0`&ErXI'ZIErĺqỊ44UnC{xi1slYeY6l_*|BK[&_)E#3HABk-#-HJPRyŘ$P7vXEBUfD)$5|z>4CI HL8hÚ ,t$B&e#?{G"P@Rf"h6T@Y3:8_րV(r(ӂv^uFo n]+; )΃=I tL*:L*Б(UrS!5نK>9^y2B7qʩR@e~w!ckZÙ%+8!T%8!t}GoR 2HY0@%+bmgR'^"Cry3z`'s>٘lޱTq ) gvQ(~l 280mҢ/rS'}M fTn'11SNo#*(>vT*}-l:@pqqKALlij7oBES]*D*Al I Z+$ wp Q&1 rmkp~CS~|M[]vl0TJ(al:+Jkcd$>eUDb_<볊0rv -BX2 yf*,z׊3qÎyއ|Wp? 5D&'*j?5E(AN;Oؘ1Eh/E~R)f 38$#Sym kpÎg,ff)sQNai9d0'5XZ52zbR>G~:JWQQ7'ǜp"- Ͻx`M:>K_"qf !4k8-Ilb[\=g,*8clj֑$1 TǑg":B37jŴFkarVwLk h$#(amZ*<-Ja=Oc'R/!l;l1K#ÏRp<=ok=Z'H(`$1+)uI$ǢvX(`/:T=!$q wޓ\kU$`T~?Nz&P`Ȍ.&n'l4P2sӏ}voĢu4ߧx1䫰qv'bB$I@/-GX3tV;*io}3ʶ;^`e\r10I-]X I"jpBd$81(z/׷?I.D@Z"%15(*"D:H$8cP(P ?БkHWOﯱtOIRzXV8DxcHUPӻ%!;K4sq4]]M!4HaS+8ē7/.G=b o-Vĉ($![kQ35٪ ƣ8qc7:}kUXA6W؄0$(Cj0I2"6u8Բf3FO5ʕ.rEnۙ3<gzڋg^|#OXKv*%֤δmh^^Iy -U$\1v>[rc]zqM(2$njw IŠq !4Q&fx}ީ=-/۞$!зMd)g PKĵQT;)e L=gُJ ^a5Ȱ[l钥/b-቗&0nSoA&o|Bn){Vï^ͯ^Ŷ3 7'KV(rوxK1)ǰ23p螕1.B k͌(J nXY%ͰE`Kz:N;ȲOѨ>cyo6nOs8.yEZ4cKϚLTiB`rr>ςp4bkƌŌ4=@)*0=!-0kniINMJ[Nbdٗ7r9.Oa˨~R~Xj r+&4 g8j4p82$]vxPa8 kM_yMT0EH :lڰ#b*-BD*"+ AD-GɡGF侗*ծ.O4ҥ$XTwZMz u-0'ɨ(P\K3~bf  "O$AI/$"6H*k@Iq٘@VBuo*TP0 Te;:8S{Ȥ6O;^޾[aU,ƥr)#),*HAʏzX'q)"bø %8o x wzŤNy R-_(Z+gaGQ5؄Rj{ H-iC\d\OOww&=2ӧ`EA`b^i3s==Ņ7=avΝ 0aVN 8Е*f:Hs@؄u?1- 'd.1[WPC.C$I墱P騐E[OXbRw=*y'.SڝVʛSmRB@{| k"$YuKjTkKKg KɟC Zа K€Ivb_ N! xZ0֢u>-6|"eĤ Y\RiaGƔ)S_7$&a^˾ϮB&$,R~d,ʕ2׻4Z8KeRX&ܸ~sDQbgy$1IX'/gY)S~ZLDOO7׀NSOo?jl"qb*N<$|m%(УkL;[[ب! 7g _kcZVGH^EIDh 0(\>CJtK?vR*?TJEq Rx%i%RY$ծnV<8]v2/yv9lT/"@soo<Ǘ\;I֬^ 3s.` ;y hs)T1xwbA3=us^jY:0*2#CCy:;*d*yfMɧ^Z7Y>;0ׯA ؤ53BY2ڄRq1~.FRI&x*Fk>4KbN]z!6H8pZ]&:"a@x Nqq->tVP k$S^(ÎsgլYts_`tηM>sgڰVD nbcHrB@.Ïi3M:V]>.PV^,,Y9ȇZTCB 0 OM:?d4o2=&7v$,~~~: Zxq Jj\sE b;|ݶTL~ML&%2LP\3N{S69cOSNOw.R*1sz睰=dA8Թgs߼u&9c9E5=爝A#|?n֓$ *±KNRNA&v΅QhB5- A;[%?v֋A*d EYMwgbysp;P^whpM|%K.Th4GNN=jPD@!ew^un*q`f <mg)T;^Iz҅ZR}[i6a^I te˿Ἔ{FF)Tȶ)k9S;w>Rt?1{Wr>D\V@kMƎp}NDLZU 疻igB31 !Q.]T}LѶYN3NZy>!U2:tRJ2W0I0s 5=i:KV 'w2<\g6BOwR|.;y0>(LJ6oa`|_Gj39]8>d:HO/WQy4>G8W,w>ƙGo.;h,Io~zS4jB#G,ɳ˨bT7vR+OL>( #$tuP.V)r)L4YWǼ"I<$gq&w[")h,&'nO&L3G_˰T<7~j7RFҝ N"V đog>xɧHCE!RI9kɧY(aN`KE\RWPw:S:wޙM}^ݞ7p+9|rѬ9(拾ҁ !"rR?-9>u.L+1HPZiEƂYx\CT(H9>޲׌0.yc}9_x oغOܑ(wv,iwsfqۦlΟuXf;OrA MW>=lݗ:^N`Riv"aB2 $ Sz( r8|ǡ̘3RK$p7eVR"-cݚ)=%ECkJlFs?sR8殠 .u?qe\|̙Nb tλ,oҦ"ޱڎHIƥ?0<:1d3y R~.uC$|!͗ϖ]Wl&GXfpdLAeqݘ5s&sh`xdk~r##(Ad`1D hfks\.;MuIKߐ_ݓIlcGQ??1rM',:Ws#d=:9X7 =0cR@ݴ+[BӅQVehdZy ֔A *ĸ:RZ2(a^kVq컶 s|c*'kzVJ[Ŷ~b1p)۱U_f#A:G!-d\gg@Fh4J(a^IBVJTD_EsZNJ638#;w.]]]*dy;@{{'Sfb׎ap#O>Z0\Q) HoV`u޽~xr~xüټm41Iwd8}cQZ4F"Adڹ>;ef`T*lX)TB;$c"RMF===i+w7q1'0c=_殺0uT8MIk~c,s_zbhS{^S/i$SPė0Zz"՛hT204B0S8pwP`͆ Uds l6K1YxG=cOg rsڄԓ, ) j ?[o+DA_?懿XF_G^ۃ1MDw}aR|ܝ("b3f}@ZOoo8XR7 Z)m [CgGv}nx!ttlMa``5UʝUnFc0)dyyaG2"&/4P,0k\479??c /YXӒfPʋ8r >w5(i8hy 9,qQ_n ݌Hs8RB"28@}G[@3n2<4P7jeddvn{v}7M o7C<=07K~?ab-&&L!b%+7uq I\ )qV ⤠^wG >zN,S)z!^>ٛydMqTQ364jf̚vetwvQ.T.ϓjږpW̛3{rn5HWQ, )ҞtgM8RтVH.oYIHb)dRn;P)?󷿻TVh!*XkmkA 4IrW\7 IZ%c'6c|8i #lk#eX?i}i+9wf M:>`@1bnn֯Ej=Rg4ڽ| TPY_??Ib#'1} 2d35u>h^<\nKb /|./,JdrysrYc 702:ntkhk6Fm|{~bHaL˂85;2e2ƫٞ׷&LVxk֮\;fo}|>j( HK.'fXn]=T|ہdJWn+^r+Vw|X~Mk[HDcqr[&i0<6´3݇ξK>^B V{qG٤^Yii{^67@T\2: f,3~/;Sz7 p/V[mb7?`hpZrوBQ&̩}l"8Dvv{:7wY L>i(cPvL6G284@gWjwۓO{s-TmjJHkN\fZV> $ӧNPP{ۙՌ--^K)ԭB(Jn/ɯQ7pB0w\:HvsO70kۨ:׭clXO.chhɓ1o>SNcKF2yzq5fͻ{9Kvu{yږfn[`3-ml6smq?ΉcIENDB` IHDR>aIDATxyTŹUuN/3/n1 (ū#E`1((D⾡#EQ!ĝaT}:=W>[V!AB $(.888888888888888888888888888888888888888888888888888888888888888888887l]'ҬYSv ۴u(mmJ/8}"1!ee5isW}zݺ'ڤmF_]Gb Dq "֮emZZ5ϒ_1S3-TnŶOJDds˰CAӠ"BV)i ڶDTv!Mo m$6;&v;]z)6nDDJ)0ʠ4Aehp~/;d7r֡T DgH5Atemf%ckŊ%,JiD@)akP;8˙sAi RCn*~l8L{p*_TJscP(5 ڽ%CM(EpLK2 NŶߏ;j6t2X~nhp11֠JQ  4K1m|:nh*,nJUۻoWP8>E8B!7a"=2hN8 *DM"ۺ{mF_b\@`4D3L." ;IDs YܑN=TT Zchy ;C]gfjW쨫1^1h/:!rh}PlR"RO_v(ϷL9u᝷ϒ9H+w=?>]=Ȇ8?ၱ1^S(iJ|:k (d?[r),RW?.%hnw~؍rf ޽bGt!N"ʌ[ѥq\ QXr9=̼]zhXxCBsF)'&gZ`T A+ARԤ-o{kǎk /C2(_)!E`*U6DY.v8KA5N+-qpk'P(O.`âpQmx Sá\Ï+ٱu>ƍ 3A8'BwI(%BRHL2RvR @ia)f~Z? g˩(La2uT_mB넞CiTYYQ "B*Ԍv&:{ڕ}f9_@ /Q89;~ZH` "yDT5o[4 8?Ͻb 8[)AqG`RiakߵQ<ȴ>C+}c8Yg]1is?:Z(hPZo6(b)9zȾ *Bm-ߊW~_A+9'Б GBq^:O/\»e)kTqUS]W(~%xaB!LCqXL{FqN\#KyIW/8!Ͼ;c\Hiwb̹Y6h[ę&Ǫ9pȭ{s {ⶱS^^QToj1 W⽍S_ߋơx4?1oլf$7$wsXCߕ+4b̹QƗiqDd٧v4}h# !&}!QQYi5<Pm|$% 8gQJ껇Q|\e90} &$HW~ŇT-Ql{oqx`\JQjn>{ ;^"[m41}C@eu!F~aEa'0't^̾c#@oQ9 5Ny!7M|Elj[\՛VloQ`9p l&x)My L{ʀ*d !\wvldYovGLqy)ÔqHcNX-vޅ^Y=Fqw u"Ղź8DC#؟-Hd Ŷ"ݓbY88 ЩuɗvĺOTa-%zmNl.ir>+ypҊaө}{;= ƀA9Y,[^O@B.ˀ6M-n69Ylo nw " Chծ ~`SP_ruLνuΡ2/t߱+NPpu36)I/3%B+7Q5NPZ1 ]l9yg͸q#ĥXk9ksn5~C!Dx; I>͹7/F)fq(vm4(E" pj?!ҔJm|Q@!s(,kQާdYYj(7r4hFxU Oiw]PloP"" 9fa&oJ8ڌI7CQ}O޹gsôňu̸uZ]LPmu5^4'Cvk? .E$ݎXISxgކ_s~z o*zCLN͙ԫ4kYڽ| }y>(MߨкpXPhXX2u4"ryGϝx#iҢeܬQ>THcWUxޟ=%'m E}/Q\m8XcVq8.\{;+O[ڹ/UQ|UBøx׊mC\\]&|-PlC#_p;=W_< Ăq'%w1%_֢ F'Cc#i~ =h;B0!"N<)0dGmCWU'GSYtB  )8{lZz0J2 oτTաbWp)*?ugїӀŐy 8bc`t >Q\IkZ,p=0av%Q 5Z>dhʲZٺ/:|u"R7Xaf+9{y| /;:KL1w3*k(Vc%GK>QeU ua}0aāy()g]֕n9>}~s )(%O&ҤI%a],E㡕 0 ɰϯ{EGjJS6g9Ѽe3~h>˖YRctA4ߏs6 |˟%Wg.OP&"%L<O\H>V)xvh|itO‹Kf}eO#D 'BYYFI3H}|ч3X:(H{%~En7;u99?ך2_Mgžسusq3\2 "4 NsuخX|fgO//P N2P)gA ڹ3s~/:t6y٣Ǟݴ@՗[.eh <&1c#Oߏs6vͅ\q3fB"}o>mgFH$~>&#~c _xacZ^tm-\ɔ)&S( O ~8wiq; pީFf0&ӡ(E]m5W0;DVݭ[Ŷ_8|xT*&ٸӦ5 Z(܂JG?؁@mc՗+0Vp\[[Oe3+f -7\6tIm=YCG>qq픥DN JkRT A|m[7oɃӧ'7xjJLl_`9~T絛e#&]{%A+WQ3X8m`G㳂zz.;iϭAkUߜB@pP:AXPZѾMk>$ڗvj? q_{MPlgԚ|TDIbX *R3bj~wll#JAû2=aBD|AU3ʪzY1+'|CB kHrh,责LbۣMQ]]Ýb/1KܥsbQm낁IENDB`MEND! yubikey-personalization-gui-3.1.23/resources/images/v1-3-not-animated.png0000664000175000017500000001323512603205714024767 0ustar klasklasPNG  IHDR@_XsRGBPLTEN˝@n02+'ګEݱLԪK͡EěBҤC405&$*جS94:*%*S$#(.(.$!&;4"D=B(&,IBET,*0B;$ݰRY2,2ugqMթD #ҦI\" %1.4Q!$ +%N*(.ܭI(#&I:IA&N628#=Z٭NXD'ܯM\RVQA:=٭H2-iYgtX*تIQ7.,2RIJbX[dF(:36#!#<7<0*0YU!V>%50"3.481 -* y4!"WJRU>8#{,'-تMHD5K;#e.FB3"41-E>(J$.))%$&hR(%!",&)(#)$!ݯG"!&! %H7#4.1J)(*R#!(߯J:5)>9?rK*߲Vq}!MܫNV08/3 *)0=*:'&+`)!$$֧I .,- ޮQF#"'#5$0YSEz\. !&#"$NO3$bll?9'NH5JB4,۪IP*<82  )ΦNN=(,(4.8"NEMjV9*'.S>;&%!.,(NٰK# 0-4>."/01&D/C89b(1?Y2 S)M5( 1@T蒩+u5J2?0)Y/$%4J~)K*.MdIwG(Tw%lT1=SZ U]*e]*T%Jӓ.95rOZE Eu, h9fPTSӋ:d+/7ҢXUjIsUb2.+jjA/0+U\-&|UQ6^ҬT C_U+Rΐ*Ԛ$ Hw\eB\=ɽӊxFX`TUU< t; ɞgx&UKjzraV PuWvM)?zj3*UI~+,Փ/bLlHJ:@UuI^14ٔu%ׯWU e,jR R~2,]2KA%W1IƂN-U#%|Z󠗔tUYhխg3id%=s^2jB%I g,YZ=//;?,R뺦`4=I%o/ZjɄ \J}K-\ee,&5ee+; N\*M$S!QAEN􊙃RJ`{/4eIt5KT3]Mdj̓uMϫR5OM \%0 ${3Q $'9QJUOLS {;Pt/T_5+UTOR$]N0T\-R 碣jTE-WUk5TUsg\U$הઠyyw9QLW9TȪWj5+&\— A炠yR&Ԧ+Kզ[.֪@'i굠q#U E8>*^FVH}8S?ú!bzM\Bg8| ZquC8aC YHƂ"q8CX\7Q|Џ0BLL?e y<}FӜi%I63lN-ĜӐP,X״ "TAI!Cbؾ)6"pXDZ ӄOGT<&@e,|Gw·>A+-409F`*Qǩ͖k.6X1,?3FA1R,T0q c|:#rDS KǨú\JYD41v"G1THB1%,)@XE8,o n2km2GZҕBP1 E ƀ`$_Pقǘ"ٴ` \4 2<1K8@5" iFJ% urEzL_ﲺY&pb3ʖh웃CCCÄ54e-,@0fޝ(3,ƨ`E51gPȡ7?4U!EZiŕm.F")Bcx`Νo|3T2; !|dZSaiT4{3,H816M"guDv~ hd~"HZr4(Ic0~?4>H.^%w T ?'a9@L+X|XᑀT,w4ȶ  ~ELvz/ `RDD#}q;?8 CTw). AXBV`ֈ G8 LA\(ir(؈s)"04FpdvG+Nr`E#,& r7ph i(e 36 wj0 )AjҮR(G}c@SW 1 1G 5ܙdJ#L&[zgƦh*ebNJ18~ ' mDcP'(&H&pR/dQ_ |gR 8NCc`(kA5ŠE>=y\gֵ"/>OZ=!( $!w"c.6pA%QCi:Qq   2ƨ;+cEXcsdRVXH`oacAӔk|~¡ΝNBUA=x*J+&i#b[;G‡:/\ GiǷDÐ" ,dHB%6;y!珈Ȇn!ĶȂB_Ȇ,F9Z3?';P38PA"-LCE4h f:oA 2H( h!!Jij;:01< %|b-fSθL F@ >Y:~!ZRԀ1bXnd6ku𑰊Y 4r)0JI*FTTaraq5 Zr\alȎ@LQy`l aǤzbAfwߏp‹ 6~L~3jOBjҙ0}g*;Ss-R/Z!kfAiMT *>N&Lp,-vsiPi ^$ƀjւ'+CYH3 QAD3aoL@7EcZ!LĆ 6?BZ@\+XW4v Sim ZiBkʁ[" n0tYOiPڂ.0N.SY Hpc4 HA|Gln{ЧY  lgb"‰%Ʋ@Da=Ρ0_ZP[G9 i$P̰L"Vn֒ n@5Fɦ>]"ELðS 5P!(%tgkJARQ''Va K ?QI9,L@Z`wQiEjoޝ` ШwҴT]Ȩ `N0eASM Ei:')# *‘(tЃDcx(RG=cHOCN&,hVD4]WB=ђ :ەeü$B!Ѭ_ګ&n(%#M"hğ:B]h | 哣og9{vlPnT*Iq@|L,THB?3xҤݏ6J(ÇjN>=ӭmek>Zov~СQz|uv}b~w?ZxgkshTY1EYzm[]xR{߽nwイgU4MWyv,'~s wew|fʫknnσvl}Əjoox*QMȓl[_] XD[}$c:vc_v}Vκ/\=>`3Fy۝wtLt];vm}{n]S0s-1Y0Wf]`fw> \k[ݿKUD~-'{?.?cnJq5 Jl]s𝇏jM]kk?uofr58SU7=|O߿>*<ܙyjnɶ}\yʕ;=}lz\H o{||ޗ<5u{wqVhԽ3go^/7nw'Ϸ=(ۯ=Vk[sxm{{ʧ7~)Buk5-Mw?ysݿJ[񗟼ֶD/]޿}or_j߾-gU1칻vm'=ϾM6oֹWɊcQVٲg㋍wygjs_Oԃɿ8k6{Txy~gy}zR՞gv:[7>fԘ8|em U-kg=l}O}hS_\ hyg^>OΎO'O_e6ɩ{5%er3>j9y{jRƚs`.WV+i~ĕϼ4M2Lf*y[}V8):hYsU\zwS7#:99yAoS'=*G}w}۫?į7&6є'&rLS^Y^-ZdCIENDB`yubikey-personalization-gui-3.1.23/resources/images/tick.png0000664000175000017500000000064312603205714022654 0ustar klasklasPNG  IHDRatIME 5+أG pHYsiTSgAMA a2IDATxc`* ]36 OnIۓg"VX'g& eop+^0dDfYii_~3l\(FŸV I3WWU])MJJϿ?`ͷ`2ߟjqj2h+k2 ^cönhaĸ`>]AG࿣ÿ޾i?5P\+3ƍ7WWasõW9%ٙ>2GT:0Y,2oo3`Ռfq7 z>IENDB`yubikey-personalization-gui-3.1.23/resources/images/right.png0000664000175000017500000000130012603205714023026 0ustar klasklasPNG  IHDRw=gAMA atEXtSoftwareAdobe ImageReadyqe<RIDATHKKSQ |/e)HS *,d5M RlFbmpLt=9'Y`u!\t̜Mpsׁttt粳3EjӼSM=R a6:K[Ldbn~:) ^2^ho+J8:D+pq6pC{z]OTz^&I'x|eO$xO@-"^!4+`?>%M0V"*lb"uJܡ I_9]PXJ1Ҹ!ѤF&Ku#$eAڶ 7up˰A\3nG|a6yܘx" 6MvEhPl9ܻǔuUdp&UhDײPq5CA ̪WNĻ7\IyIENDB`yubikey-personalization-gui-3.1.23/resources/images/recommend.png0000664000175000017500000000271412603205714023674 0ustar klasklasPNG  IHDRw=IDATxڕV{LSW{R*PEc2̅]m?|u.F˖mnQ42u.i2HQy((*컧-D3=M{},]VX9 I3v~{V|?IU`vrc(AaO^%uwza07@T#Z=Prh=. RC*FPuat!n Odž!L>f7K|R;(~U.h`(l]3aQ^6Ί^!_iSOT<_"`XZ:p6֤mbEԖc\x` J<^[@au3V hsuXY'ox:.G΂Xt ?7`8D 0beyZ5 (d-vmVxx Edʚk=X/⥙Z#HGeY&\'E  1/jڰ -.'?쩱d>Tqb<9>x|ՅV ș$!j#٘:q4|+4FEc` !GIĠ؆39|X(,r頗hWo.yB;n>W:'$nDջ`hR`cFk<gG2c#xykW`γqpAr`F~l "E ţ5`\r穀zYKj=p 2P]G.>6{RϗPŋÇ*`E~_XHk7GGFNr2ߋEd}c"mG: '21'P v{cG]Z܎,^0tMjӳrۅ3_my"w.FQC1ߨ&|SLVqǯ86G^YFDS)Ee1`T/5=?<\G1]K ! 5`d م\tX97a6Yz٭Ck^ÔwF*VuQ$z((ȧ3K1li-ڄE)16&. ٱK5~S{`RV(.dǾ >t%\? w5n9pl7Klg,b;  ~mOgF/UrWzuFK$v Ɍqu{a*o zEp.lEx(-/B?$ЙZ1R {$T*XU`^us153un-d7OwمuI|~IDATxLTmHSQ~{w^Vb-e ˢ/EGZՏ *~DPD!)AA}Q13 nr܇ssϹ={5mmmh4jLOX D0ϐљτ1 Z +dYV7xG0 BS?!z救wp:g~J!JDS-(R3rpuuu,EJPTV**++-@8n%q21^QSMMͦ @&:wFtt'KG8^?8tohA$8<0.Xl-C0_ͩ$&=lXDiqg,)la, HfT70d e(J\8~Dbѱ_Ӹ| N@*Wm3,b"eR*HpUQplU2 $9 4K/7uό,@Vm-H2@oM@XNJUU5ƠLgP#`xxǸLrooļ$tz2֜ȹ$Tdh>q9јѡOq,{ʏXN2q|,SyH8k@oo}獛 Xc^!;LF}X0}8wx\ޞ.7#SnW;K\.f[|]mJo7o^{ !v,*4ޛ0/U< |E$~ 0=Qi9}IENDB`yubikey-personalization-gui-3.1.23/resources/images/plus.mng0000664000175000017500000012316412603205714022706 0ustar klasklasMNG  MHDRd = TERMCsRGB pHYs  BACKQ2L"bKGDC FRAMȏT IHDR>a:zIDATxyeUu{8ηz0D|F`4G4NQc9Q&QF0)&D@f蹻z眽6J@zxukֻwms}m~m K/5::? !@.cӃ^cO;y\>~{&c  `T*Eih4uR!bTk͡ 8,j044N4B9'̙K!`xx\.8-oy b_Wx㍏F|3={67ofŊoeRJstIi xiTչ1T3hi]f{Hz׻Rl6Yjg[o}7by`cʕlڴiֺDZ;3i-t3H_,JH)կ~:;}_sa1111C>9 6epZr\.z "^b N;|ٲedYFǼ/@R9Nj^":n馇Dk-˗/g!~ﱱv=,raA)R cL7wv1N8y^Rt)QGEq*cLס6WVuG9_k֤eW|h ?VbѢEq1C$ t?668}}}y\s5~grXk 7@eơ|Q(h/W?Wڛw;Cw{[kYjJ)Yx17nDkR 5_|1VYf7b͛˻l6/~7|CYeEw4BYh΂ŒA>uf}|0c nR?\wg._[]-[EV c ׯZ$I8s%"&SSS]ȸdY4IjGT婛KV[! s9\+*4R/gvYi]]T.!dǎ/511XޣN!=D ;fϞ-O>j7Y:\!.#9`@J،o< O=k2+Wl dɒckf*ֵ^;yqǕΝ[zjr,=Nodq}FZE*P2 'RjL(BX a\Fsdw}y/}s߳v=bne]6=oiADMi.# Z DJPCB)I<)@8RR57_/M`ť.L{ュ+V4,Yl6󃃃===pòn,r1̞=[j9sz8ʡ*mݖ?nwC9o6Z\sscX )8 JZࣅ%xkzg7GnߗRZR)BTvpb1TEUcLιֺb+JYյ% iT*zT*(璕LگU}3!J#|BbMp?D8?B s4G9rmo9;RRHAfzͷƿ}j) 883|!!fW"A+p&A 0YPۺ_9w9GrE &)˾JOLe)ib'|$AҜ( x;sΜ~չc?p`ԋQX "Uk}u%pS8P0m+Pk@;b-Q?`ԧV#AV0Iv<ՒV:vqP>[ 56m#u l@ aC \fJ#a5}jPoi-F,W`fxL XV:ĦƭZw߱F4RO/PR}wyWxe)Vs!/q8pEi(rd4?s9C6:Y^m=3\8 XLNZ4q&ΜGT;k{oN_OHZ~P:c+3,PC!c5aa+_?gEXڛ!RI$8TgMs-_.x:P✥1[?]x?o._+/D OJL_C`L+ ҅ 4h߿jo?lq!#>TűY˛Du)7G6T-]L:0K48g~v:ԓv}7ޝ3HGJݪC%h(™ 'g@ a{d.K pLlo孽r`+״\R?KRʇ4ƬnwO5~ў_ER1^\#5Z,ЪOc[MozP쮲]sdJ뜊B~]N)# PK}CǚADg"_zݳYݪ_v~w␥f>~"Ewp/ѕ*_?kbOG$EHJk=crMbvFZ=#"'B)+)n&\Gc̞iSždN. .ˈu|_/r]`xjg,2.E8() {NHl!@*:RbO]%XT|\-q!yR8p;w;W2&`+iW>fuOEmӓ5V("Bj^-[Bf-:ZWR#Bȷow)1w_ D_gPc|1,mg\,͜&p>A!CB<֐}K33p>1THiZ8iY^?P8g= 3=, (z9Lc|_z8(B CƒCJ<;U{M F/'3rn*seXAZ%!$RID!{OȜu0ΗH!= }R% S[os[ԧEGB×h)a\!;2,٩nvaW?>!Dp2IBFXI\fB|ɜT 'o5B*T#u>t.:RdSXFsS>@Ω]WJ)Ml]u_۫}hߥ68#]Ƒw1)d)QcAFf}I%7)#BMʇ ,z%%öƗB<:TY_V:^Bp64$ .)H@` B"bzh n 9DlIarؾq(f bwJA*D 缔XI0ҌՠUcZ-hJJ|.P$ƙ(p/1+ ]*pC3ѓIl@Ĕ$5F:BZ:PA(I((%p&cj:!2EDVYzKUOy8ߵ}AS^(_ pT4ÛC=(qKy\^AO@J%}I "!{`t"lv7hGI@`3Ad8$R+(>:B{j#ӈ ҟ 9wam^4O*9gO῍_9t{8t7 t֗NΒH_vLx[Pk!(ؑG"PCofTD~L3%~rva `63_:ϼG4 ` E(9ٴeVDI`#ҹZ9GH0j$~ﲚΊyJ^ߩH"A$.I70XK=%5R&֯)hC֨ԃZY;uo>饣,rpuc/P?(| ~\h֟Y pF`hsG/d{3{5d8ա ha˯,@̟Ey,TT𰯌B9wq]aΏsL E|$"NH:C$&U`HQ>]7}y\l;e^7d'pC!,B(nX4h6=87 &V g<(dIZc!K"YoBbL LnJiRTZ@(k 3r2+x̮SN7x!ϕt c1;b,& RH3!0H}DۙIBE#ඍAӡF80k G;{8m :ڃ@ 'gЀ%Y U90X#K˟|ML $U'Y@CAJv OZ ,H&!ԧ'hSMdMU/ak?x/=*3h_+!oc8CIxo'#ܷG 1)Nľwp !*@VL[j?S;bǿ=0&QUB4 c4Y,(YyuB-da:A$:Ӿq+&'pn{u= DGjm|[ZV tK{l&#:Wi!Z)0 sR !9 ~ b~%8$~e| (a R{$R  $Y*p\. ]Cq;L'&J|IhS }?=u|RiM׷y/+H$ 2/•oӷalx?[4+`!4h B '} Ō#l HF-lSLKMaDT}=0,z04g09Fu[aL@xܠUoщ'4!"L2i3nhYtK2w6'<Ҟݱ{ G_*fHH9kZJfl<|b_Pw%m8xh5@ =u>2)Abt>s I` YKJ?#@j剚! BVahID:@Jߺ8[hn*oGw]V\S-{,Ú J1$tw~H&dY^m\=',C9t̪vJ1u.LS9`Ġ=<8tJSSf TBX?AÓ 4I\d[FD#n=;|{X͞}׿qV^_:pB!ghwQ1;?]ץ~gP4#}\:m7Eݍ_8:;Y:MvF:Q,DƛD'qh[Io]`.+#WHjb,@v,-Ló&t/US<:dE6еgrܲ ~ԫN|qX=¿}}dW(.^HGݞ~:RZaXUCB(e(L lYp5ZȖ 3?m7i5nBBjJ(d@=];B%B+E6Ech;L4<~T82n->=ז&Ǖ4% Q:X;Hr.p\ .-u <+yh&-D/R/U0{|AJ/*,*-Z!"Pk#H 4'Z@{R).O`CpbI!hX3>4Da+L52_±')`ѬWJ75LoڄIS :/7fG%w4 e+:zy;X^꫄u&x+|':3QZr17w)8?yUF5Kx>ڙ'>ǯ{,cϝJrdzEy$/zA*eMb%3M$JJ0dZ罎>pe~HDz↓ߒßO *ѤaZ薿 @i>#ӭF?xJՊJgLA`Fm&Lxs[[u95 g ɰďswek#_8:OwŢ;؅\DEC)j4V&!SO_{sd]|rZ#EJ1&3 g@^`Imhly5^zO9k绫";$gC|km7 `.Ys s^B&v" ÜT!%kfȲ|.h3 q0g|G>=fh6ۍ^T[zgxVIM{HTP^0~rG w:gċ T!p6}fI<™_tac*SE"?EMY cuk)Tvj5~N'k֯ZӕX/WE~Qs -)P^HaN_igĔ'nJc7 IJ{x%P]Վ%4&II0YFZfr67d FDl[;Z&zvm{vzTCD]#W=`1vԶLMJ1H pcdLEr4ukiڀJPmERYI_=87]=u?%9 6epI?'v qG2la(sqqMjCBb:'uiIB@Ú:&D,lx~EM>N.~r{"ݸxb➋~XQJ<.=rkrOߠֵ,HY2R+~k]?YO"Dr%mS]u!sR=ңuYb|8#ڴ1ք@gBJBk\G%Ym ,ebj}[!3_&:'X})1s5r0f`2. 8\P;'}+Id1HyAz]ڥA,q]c=]CϦ;+P|]@ba*A$(V˓g,\-=aX7mϽV"Hui^=o).#yhs29;Gn!m/R]KBt " }$|a8+ +ns1[4U˟ȸq[⟎F^aS-$*}l9C4&ǐJx~kSEc@ I%b+u AgVv^LsEFׯz#LQ{yru߾oU~?f̞Q &W.[GW@b4lY*$Mgg~.!9[QǺ0w_F0qo10WCzX۝ 'o#Yb iOcd&$* *Bу>YqZC[`2EE%kZN=b0Yg^(48_Bd63 sAOץr[~>;%_(#,t 7%;Й"$5}7ss?=D}lOvI)cթmX-%RG'GRfrZk`JQ[u :Qst>(&,"=vǂ^GWmMI#̶%_>:0;Bcd*q}?aGΧc}j.PrUl2/%n}E RR)\B!$|`t(-eZp)S?>ks,VPlMM hK0]&9s9fl2Ʉ|F~cйBgLe?+7[xJ8E23޿\ey4v֍A,/e {p:ToZ1:H磄i?; o{|cXl>VBZvGȚd>+>u Ju=:a֧|׳ߟC#k ZJ|㿇U~q:W-e }&~mToH6<[D+0WA!sP(iNMMDڞ $$}vrNƦ7BB҃hiV\`R6MynY.!:WH. 8gx(΅TT ;X:/g /,}o8YiPZ$vH$r2AڐTbAR4: "-"z\cc$C=, JF\;UFrB[&K\vYČ^6yEn!w}3&}dĞt' %q5l%njÏ~4%jrB7zK=<-LPȆC%&6pʱǍnzy5]΍I\@RbMd[Q5K"\bXpQ7_ιC^~t8/#%Zkf~3Oy>Q?^{Tnů{ ;G>.1"$m$|@|9YƹWe6*·#2ʑZɟ}׌ ˆmD[O5 /{7?}|lwz_%%ET'^$hd ^sUƔ5\\Z9U24!76Ii.|dVb3{Z;!Lx8u)pH ޱl[ "X@ ؾf-4SU͉I~u'ݴq ~=15;_W3Z,yto*@8WƶIkYJLpαUN=|&1XZNyrbPkpjՑb޾>&Fv0q3*|6_Z8gSAox.M{U~+pI6:PIeN>l4fyͧo仟8#kf0)V(" PT{qك YGsA$ęd\m\n q |Q>@ʄ0/3v]“V_k.sQ gSdM Fk\ ﹇lVSp9l30/}ҹa:!kln>=S9-p4č^2;ٳ~'H6liˎ8BD1՞2VޏkyOd/!7L k%hBn,i5|PKI\֓7`V޳|1g*&^ReIݾKZzߍGBo7|cmj;3(\"5NYqkw ~Zf9}v rT{z1m9d@]+ O #*~0ogmd&ኔ W Ra58,hVqJSaۚLm #r1nyqϭ3!]{u=~%?&dbIF{ɥW9ml&ƧyC FF*H)b#wwSH' Əh~+l/@lotwlD1JE詰λm*"61Zv.=g.w/QfSXO9ȗ N]/RO_v <7W>R߶ b0Q bJ qFX In+]$V2|og-ٗhlݎQ>X.0v-M mbDg?g70޴]>"]gviKYv1eW#{Û/oOvˌ7}~q)67{ #6w^~K؟?Il ~q?.H%8xo<{i,~{d{^'Iqw};>n`~mqw}?7C &*IENDB` IHDR>a:IDATxweUu{sέ}3.E,%~lF4$nc7Dƚ؈oDш^[TT2afs9{Df3s^{do`X٥;R\?yWJgROU Iuvvcqvn\aZkO 9GT"c4eii.19sQqA&I:+ n<4MR*bŊ^vYGU~LLL"$Ixk_KXl~uqW>;0/_k֬yNeh琦)ꫯhPTV:禍1?{{{O?EQ] "oEkMVcݺu,_k^9!w};3[n[(*$I"~zsl=J%8җ6$`+),W&#"(ؼy3Y\\Ε܎~POVqI'Ě5k8~K/,Hg=Y(0033{N>d<]uUgEseժU(mFPZ1cֶM{k[k9ϫ*kXky ^GIxOu$Is]]]qLVc~~ vaX`ʕLLLpaqwl6v|R]aqYJIdRX$8!!jKIq\]2>>^ 곳хQJ!HWWW[qΡ˗SN9$#rQ;Z&߿#_hH !Eʅzʜ35 zwygP({]~ -.[\V_|1S^re޻8U.551o_[OAEE9) "h#V:%c]0 l4_mL\nhEg5 d_8ͦ_𒗼sʕ- DDdnii~!YᨧUtO/S()hxp+Tr`g}T7._Uٙ/XkZe+_+duƍK/U[XXȭ]]piE]4w 7m6{-W]uo\ A PR4Z) C52J9Ѓ 9X*^{U:]wU_f{Y]Z'h,lr,_\/..WXѵ>ttA]im<㌹?3@'91)DJc""PFEPƠPP(YkW1wݍ%x zTJR@ciiIb>M8+REڪ1eY5UմT*jT*Ӝnl:k 9]*#~@k`PMO֡!ڠ48~Q鈬Qc|b/\߳X|/O뮯>RIrMS`e6`9h:p>8t[ )ESMG{{mQyB$n_?٥B.AoFkAe8k9+S BtX|qOh8 q.Oײl~ z/ܣvY!.M{}rIE((s(cf~' k|,@ y(3X2$!@TR09Ίϝ]h}] M|)W:D1kU& ooFi\X|MqpP(D@3N0w+Y8_9{rמ}3/Ad&^x DItyQ7u;\s1>@+p K mefa9ki=q.2JkPJ#d8rl{ٟw)l|?g^DE#ɲ1Wsz`ZyUi:"(fvf-Slaͬ14F b ;; J8}dv|5],-̕\:q(mnZ?GDEֽm4c]qSLvvP9Y \ۯ_*s K z YSub߽ojO}~] pmܴ˅>,`:!m(f$Mx%q5R (a,עHxI]$Th4-Ku 1Щ9Zʡ8 (\ڤ63E|'9K(&إAFq{7cS:'BGH3)w(Q{*bqz9slµ&:8}>~ܹvBO>\:3uKqR.wn킒L@Ҍgv] r _pM$2(7|ze3llA[t5 "[rW*Ώ^5klnDDGɾ5 WN!J{dؿ|ԑ?vj (]-ݾY:{|$d͆3IM\ч>yCɗ+ɴ[Ɇ5suuxU+^s;X['iB{Jb>Gt33i`׿_jET Ei488#w!:Dh Jk  QRD"ݓze>{(/}eg:6'D- ^4^as wJMŕҩ$A)L O:R m4@,b}^eDZ d/~!r-K>G6SX?;Ai"YF((Ӈ 7l jwiz!H 0Qd)NA̯l!eƜ>H5H](koS<@ : "LP5S;, ݱj%zㆂTQA4Y POs~7hgۋA`P8:17h_Q$ $1wY߻/RJ+B=y+'1` y)j3R_BFrIe]8qwV8Ѹl[sl*oj}gÉ#[(N\(Bel8}:#N/<.tKK/yEҳ4PJ# T,YJ/Tha1e4-g_Oi཯ݢe;9(KYP|Ѕ%[{i zf@YP~L@'ׁҔ ؑOϾbLҍiv{RҦPB$xeֹw(tsL#Pz ent/~oSeQkmc#xY Ems'7,;]Np#΢ěL[AD|0ψwY6(m@|7_@D5S6~h h)2FC)! s5YF1,5W̎;Z<)] 7ggʪX<ۅ..%'SB&ڌfjΡhZ Ax`(!+ Dy-N'XqcT-tQ/@" S}q((+zt $yj",)3n_NF:knϬz C91hԦ5Ge)f>0$O XqfR\{~]O֫?"W.\r$2!NlDakk4ZyI3#2'x -WP `ġшK=Dܪ (6*t9"ȜDoTXXE@3Q2AVexx2RBړB:ܕ_J4F9ZTF Q'2!҆8HBm 9)J _ TH-CH#:}੼Ϝ`!F˕P}!,Y s3BqHŠ s3S OO2}4 ,#Y+WW7|b|7ty< g%sʯM+1=3 3 ",hmX ;tщʜtiP(Ɖ7&Qy0d&X 8K̡@lB(!k1 # W S]I>&/xV/|anc,1!^X"#4.gpl #LbC"(\9berzggؽE҉S>+@{+ bt .V<Jhͼ e|ͰV}\!i2> 0u | =4C`f)'s{~ނ'd.ntzg. >vγr9p3E6p֢3@g/zHWor*|ˮcjh}2(b1?]/ah!X%qDtK:qY=TabCcN拝XcPt?SY>>2tAJG9>C|N@ɤEP )"kbCbxHu.[+ MuTIOײIâ&"i@o  AǑ P 2Z=FLυiE|@*I#3 1M-W"rw ?

        )\xڪ:,AkO֑Yc0\ZT 4,Z}޿#iD`: vFETԛ &Ӕ F= D(ވ8$/S}^1.lƻ> FfѼPSPZcBE1 i4s6iY3Dr mZY֛<]˩劤Z{6Kz>.q^*\WX w60p57-#bY!MЗ產0$.v۫DFer.K5dρkN)(A&Nr餱N^%PQN#i]k9G>X$҈2ٺFcBD8g7ocHJ,޺>RI:C,q ݷJPQ?@b &`s-2E&ĉٴ IШ7@QdA(ę:mYjÄK-I(2 Yx-ctt171h} eʧ q٧9ċ#0ykz:fQ,r ֡|AB `=G]/7a;79ͰMײnW IhA9+SJt.n#Dpix b"JcCX?93ԹjL=^{ԾeOPy\X5o~ӓLq>3(QϊÄlph  &jrV՟~1Ç؋*.8_"ʥ[#E16}/`]Ƨ-[` $4 1Lli4KWzIMLʹ3W};x6VMGV?lذ]&~4),/*c Ɗ#Rߓ۵}!W~m:ẻfqs^P-7B -q1QC|Ǒk6+Ef-6^aEFGb7b4 zA a.>1=}_ nUG#pk'4ՕphQ:d̀yVE>Vǎ+L2PkO!#|oB/(˱*CKi(V!5Qg!qPyLix{ WX,w,6/yIz h͍o; =\oN1@áM*P%{`SS\o-@k xYbC$ATAL *;WMTk?MkxҦxoLNrmfİNьs8GϿ+(zLW^fgsZ3]@%ZnS> WBPʀR %VXG}j`UXXH{h 8Q,b11- "a0TRPL}s4V@̴m&]FgxXXecRf{8aQ||AZ|؎1@snv3%RHՍz΅0#T|c0>aX{(tnFN|͡ >֠.L "ao,l[=EE>;=UɷP|tJkWC% 0脉RKGXXZtp8d6}eX V_ޟ' ˧oCBZqwE|lцLR4)ELi2QXHEJH&.urϹYCۄg;TcV`5j,Aw+?9>Wj"g0LpR&"+W6mlŇz]#W>z`B OOx)@ğAy5"f ^ ܵ܋ZyZ?rxFu }R:ҊdmʓP8ƙA >$!_-㘣ky L^{}JuH>"+!L$P2LMQX6 }V;/'k!X@p,RʢĢ *"~w c ˶Q< QL:6oU6KLu &9@䤷a?=C XX̪@^#_, {V&37ZTk~c{YXKX~R\p ڻJOؿ>c3\Qz<.>l 0k|IJW7ĸkss4&?,[Fi[ Ѣ~oЁ+hT6|V; yk*xqau8i3}!.ahz1'L:;i*R}˕yAKIV-\7CXq,3G-#Gdwc&ENzPqDlbL!i#5ւ<|>|8 }8뫋Z [73 \q.b%՜| g[Ts_B?ol.<1Srw{VQtʕI3gifYi2M Y+Wvt161ߧۧpؐbO8ɳjD:nOisZRkҡ@;Bh. 1}&)mZˆX[bK^lcȚ=K~YydOmȣnwϝ;.ÒѬ1\-5zI]F49cP&W䚱qi%-hXq0&ys!jdz87ǨM{/j3Z9_ S :2/0<;ͰuL;fg壗bg oh*@cKdF3=~ *]h4Ohzl<{ hg~R+]xN]D,I;~V6dsl=v(Ib:L0 -RlSOIn._yB?GE6.^{ I)cC(h/{0?:-i:+]DHM#NbtRu+}D>k  uDGy ;zXy?ۙD+ 8ɑiVF FM|$Xx3w;yWlw{ϭ{+1VTor稣 K, GCOrVp>2-DHq<{vc,6Eڌ$ S5`d|޵ުDS[g*L1QL:<Ȩ͘ȕY,THCֱTq>= umo_7:rԴ"5k|8+ 1{7Ŏ؝#Ӕ6G1Vk.8^Wjϻm""uk`dhl6|Т;clZǻb4q㣌bPaЁ S:O^qi)G<"h\zu7m(S*4 87[>x,Ix eGACŜw7أIWjUZ("3ӹ\Vx:6~_xEߘNnIm3BLcrv33ꈙbY@F]/tM矐QQ.^y1R)gQBh6֛td/{dMgКwL[>+̻WSU3M)Б/C_V '(ɔCt֗'DR9@l%[([9?=ԵP&mHXgM⁥Cw7&ORzk,zkE(ʚGqѻe8t߲7qn>zꙸ҂|6|oJE:!q-t5/' CPiZ)Q}zfx&Y#βud+#e"WZFg}*aqW^ưϤ^8Ѿ$1,TxN!3H{E/]ǑUyJr^rT*%C dMv#W}&E#۪vnh_qCcfPV)QdЏ0w1O XC*@Vo: y}ٔ;*Ŵsܳw|Dh͟V%$|sWWr+<:C8hc~}w9G1_@ۦۭY֬G.Z;\$t26*IfxnQ3[籡T}kqUA`n݆=(.0yVc/)O/)Mg cPZax?i!PDXYwطb.O?/ɔ9zdd:V&9zcqTVo_#OF#$14fQcM%8 ‡/ゲXU?ܭ/QgܿV4a{G\mEQ­^7?vN (%Lp 9 )bekĹ,RD]&f׷,B3|˸Vile8L:X*u{(Էq?' y@XoO}z}˨9˂l)xux cE_]}f`> _8#KoЭ~.,oȯy]_]}s9_ֈpY)zVbE?+tP(_\`8#)tR/`qX.<gӵe{61ʾwԁi SQ/=?ih;y娃BO HF-xÇ.?>p,he߭6,/E|4ZX;#7i:365`u1 snqiR5MdΟ"ðnK,cH̥Qh\F$!xO_͑@0"DG18yջvheY6l%o?9o7)缌Gh_6(ҚpKZVu&}@o;9Crd[TtZ'S`ꩇ/|kÝθ}qg%XO;ؽ;5y~ߪ tr/ڭѫJk誵ϧF ?wr #\_bz8_NSٹM)&ML%diudv,,-eFseNRij^w;ߵaG\@Ltq.7~J鷽<0KB$4aKox+nE >v703Sl^X`T *?ĭ5ٽYcO %q89ˌ+4/FO]VSD&g_WZ/R"xgK?528&rמm;y[WIʼm˲a dlZ_ׇ>{/L@ikr97S+5#iƖAP(dGeY_W]E}،D\,nY :., {۫- eβ ),8DUA11O\w|')k7-O^/\| "-}e9b8hb8frf[gu: ᦻm%ii_bוEQ'r9C? \ yN_*pM|1Fpsp{{\{ŕM3-ohbu'6Ik| 7.yOmFt8#C#Q\4Is_sYtf^ϡYfIf3?Ǧlo}~7yP$PDz~}ݷ,Pʐ 8V"uɯ?HzS<#v9qὼIl/J)+e2Yt)o|>k; ?nqJIS}4!k:e}nNpN :bb>J>L9}75ȅ9FgBWk_%vo@h3~;ihe9Jf.c)[bs{*g}[3ɗ>!)-Хu>8`QpD)rq$*&VXyg(woIbվ竧oKY5 w+O݇Qۂ=q(ε3w%|[FGkL'E.P_"DdJt(:~jWLy  N U,1H;!`" F2\LR^' $:ek/~UrԊ,PǴua/IDATxi%uf[kݍ$H %Jcň!3c8²3a[왐,R3)BEJ @.Xbot7zk.^|{UՍ4NUݼܳ97ֲF-ɳ=5:&9 yNZ7-JI>+Vyfbb!jטŇzhK&9}H;Z~r1B뺄aH^qJ)c0ƜK+@J|Bv8rz P!\kشi4kZҐX\\$8?\FW_}57nѣ'ZDQk-<au]G qw}rr o6cÆ (WL(駟+/'fΝ}[Or?^׾5o|+uZ8~ wR橩){9 V=ad2ycO?gsNN5ulI!@J!m@BP8[5*?}oaϞ=(X~=;vСC8R q׿Nevv/}Ky=ʣ>ڿg{GgBrn }wJAY{C`ݺu}菰WSO=Џ~m;t]8pc B _*Kӡ^!EF v}RcGhlc'2^f+A%ґ]?^ !θ&! G}[VO魺:&vrr@nܸQ>'u)"2d2M͜adT.E3 uQ_r9sn4??ߜ-Z?^[7o^QfX,J`L>Bxd%!0\%ۉHxRkF>0F#{n裏aF=X矷J+T_z%gsZB)cQ!2㉨)mgb+ 8"L!;{)|)elVR;,L_ތe\׵;55]veyu#G8닋^x\wuoRHB)N-AT numV;vo7x/w9tׯN" (}7Q 9Zk6n(f~ӦM^xW\!|s=_|.Q Ba?jVVRJ\'MNC lv B(vm|6 úZkpmqƴ-T!8 jZaPZVP(sچ T(O4{ChtP|]f>$YiXmDžz_nXcZUd=QӚs lƗH֞@&)nxuq86ҮPR{ƏzzR{B2Gz)5kp22TSrTѼwD6VXkokQOש7q*oMV'kYƮ3?Q OhM٢ۨ |6)p\HP{uHi\4k2&|(JVrztd6rRiF4VH SLejjɉ rcZNT)ޗ9XQ4m(r9xoF`?GMM_|~7⸂}{#]ɎKv1=\hMkm8{ٶGL'd;ѵ'Y,̳g[dx (XC.璕B}^!/Anq prvw,jڦS̟4a @BVgk%`/.2Vؾm+SE~1ע Bnpޙ8hP)369tݑхˡ}6;m{ש5T!pg%oYFώpSnj,Xsyg?+rxPwŻ.rbx ;w v)kGƑw𮺧M(TMP)4W-oYIO ? -E m;:\ů̏[\~"RG֮7\Xo4y+6E8B{+0{/]#zBIlT+t )3cLV 8DRr91=:@ l[c JV&R顀B"$_(ƋQSmx+W)_S`hR6TT+eXێ:])bАg,oD_>cIgHb툾_h39Z)lG?,wBEAH٢TfTAAiCXm-J׉ce|o CZ5)qP] F|AЗ<+cЪy-4M %uU8BR,旡 (Zvct(bEvKѠjn6t:'&Q(+)9\!UM;W/~iA\=!ZQǬ5tZZ]NF3efY\~Z;F?[6\fϫ 2FI\CǏﶨm Rp <Ⱥ [`^icdr9 _)ŲÓע(lQYZ,F bA"m/t[-N.s2 u|!e޿zt8^}gTq"]I1OXXj <^]L=ҫoK.gf,ʼnIahdŲ-&.b0h4[KeJKU RH,0kbałsNLdj& U;‹xVTP,hr!^z?۶DkA a (G|E{rv Ҫ_eڭŎI~NcFRBTqǝEѽN)0A0FI!kLB6G}L/|2-7 LR*TXU*m+1ݞOuDž TwOȞZJJٱ\(PX\,ht8t Lۮ<ٜ+>@A$3ᕉ՘D$B ]#y滏s%+/`7XM \"UhEn¸L% | õkʽNA֘X .XNb]> k{3ݿIiGT$7aȶ3208a4Mʋ%J54!cJw|#&UR)O&L^Z&|LX `D bQX,Ų$\,2&ª,E`Q႐L̓l4IРX$O5"UShlQ9~tZ .au'JGM qd7%j[$Ьn"VbdMXƦC&X[B"d w]rB"rh妇8keӐ?@Cޠ\r1V( 33sw{ahQJ een~cLb%tFcm(H<,ƪBw@e&bD Q~4A0VF"F}wDl~aB{o! Csm6'6@ զ:(AjJ'IyZ-ϋ}9~nx;^&fM1tt` ;M#l7!VX&xz cxҜ A*okxwtmKK*KHv%|_a`a]wQtmf4ZM^VtZN ,~MY} cWKv phdaLYA G8$X":rTkbB|}ÓRA6juC2޺_{HXF(c/_ #otzxFw_µ>W혌A@$f: A.Nf]nZtSIDONGMlUk/!Ae.j\}䩚+fj{RI嬐$'hAF{ĞIHVEz̠xSJl'd 23X&I AE٤\mT! DZ~V˿? `¨6[Qb_=єjs gYZ"@X4@#{Ev 3DM%ok & ZanLBzHa7]=qdt yuJ^%l165phL<WMAQKʀ;;iHOx\X0QS^\b~L7nm-q3WM1n8seѡZ<ưfX9߶tF_z5ZdrU/"%Ӧh87b( >yW<+~ř;SPťf2X&QCWQ7bƕ.kET,`Dz5|6k5vJ`\TODdG묽!t5:c`Z܅yFI Rѭ` ڛucq >+r*1,}r F鸱Dzi7]3y&u[Jq]۶pZ''_:; yli>.&}NM}.i$MN]zN\apSEtC_zr' yef%ˋ0r^iALg*4Uj: K$l1Ɛ/djγ:&c`7P!VԹj8z0j  ɂI+G. Vc?>R RCB4XHST,,2XEXC-] f'n}ٴa=ʼnIP xjp]R9pLS+"?ahaU}la{O\Tb~noM Ns8ODtLmىC^ӱ.(7;v CD^DQ\tٯuӤo/8.{I3Yb拤+hw,?>ct#Ao0 _x|8c;>""COwpF] cĿ|U&p\ًv^Gq|S(=mjjcRFFERcnnfW\r]tګvN'QF6/GZcV~ 5\k cb \xG) qX4kHCx#){m;0\ЍlLTb/AH^\XFR)Qoq״7μ7t|!-kpFǶo/bL*B)C^xcn(c&RLy{c7RL/K⑧HL\pn/+=aI@P(*u( tn \*h 6o@G!"g6Dq/OeD7nƗjʻɏ!!SBaofr\\;npkV2=5*@CբVX K5ݹ8Igw/֍楫 "|O.b@*F_l۔˭ R ;B0اGP {x \!{# y: iT5K|:X9y׼5~ @4md0i ĝ7E6Lre8^!~Bo,=̮n&_HH)<705|>?RX*௔ {P_1|OVRHu]Tl0޾y{c0N &硣JKO3;;wlRJ\ɫ[q6Z(yb]7#.]9c `jj|8 z9 IRjS-WY\o@H$Zh[m9wJ'kMXouU&JENo?5^Rbz<pz>QcǸl˧fA.r FGI)t\v*5Lͬ#?VDԫ_zI?=Ȁ2M* Kmb!c#Lc [N,vMd.ZaPmy5~&5.ǣ;ͳ}DBW*13 '1 ?hR%.JyqT S*Z]mnXiA^wk3RQk 77ޠC&_X7;_ډ .gu-d9RC(ݯJFX&)NM%D)jϟ_D8E֚ /Z˧6c&--Đ&BOw/7FV"q_4>m#^Pd?=ۂ{>pշ+Q5)P.ej qT&HTFvVj,.,X"2/8:ؚY?}N#{Vňl7KjgmdR3k,(s:mI1*c?mUpKhs5qNڝs\pd26J%&Xr0~̳̮fݺ) cqy 4K2VEuijB)'4?1j{-0iKOe!n(̭L8bA>~sٙudUv6$_yhlI%U N5/`jfLM{+K$۸Y?h"O0Cab<^e5/W[l# ֚b!S'>4λeirFJi b:Q@VT*3w|nd^h.d[\l3l aG3mq(C37c/E$= a\~+D׷ 7=E q$Ml߾?1;w/,Ѫ7h}u( )Zǣӊ۰Jh"a-Apά>+;O߶cKn b~YzͼVo>o~"RJk+7O79]fE_#oq%.t w/{qoΡw~;}q >/TSiO4/V;/L=IUG(/@;CRҊQ@37\۷%B`TaHBLŎOeY^ *^7i+3316oä#7#c@e2 ,a?xx!贚/#RJ[˦MOG9^ץ?>Ň ?*P)-_˦[c|=0aRhHsQ  _~xg=b8pßo?+N+\Oo^7qA jj2J|mg>1Xkͷ[F15:H!:n]z%L晢" w7ͱ1B"G_wIss:OkkлZQ;/ޑ #]spnư %$xqaDIY{s%\!՚X8tZn޴ey=[Bx# Kϲyǎ/VÄ8aҽ!AX̅5]O.']f1J:*7 2_zplxMlBO/gojiSWCf7nP#hT:4Dxy\GqٞWcȋQ^]~6m߆њ0 haϿĵj+y^.CP^Z,;NG crX뎻o>;e;^|0O>Ħ[0:vh-_)2LG)cͣ5 ) |?=&~n܈"($cBR;v#GY\,W@5g,)~/^}ƒ6c(q=Fcڳz'7J!`ڳDt=B_~_dzf]\h*𾷩T~b1C]2B|E\L6t,,P/Ui/i)|ӲE̓TR*n5"[n~/=F1]Dmq4!R(iG~sq5{ְ5Z<58iMsZ<58iMsZ<58iMsZxN2IENDB`MEND! yubikey-personalization-gui-3.1.23/resources/images/neo_transparent.png0000664000175000017500000003675712603205714025143 0ustar klasklasPNG  IHDR>a EiCCPICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧ5bKGD pHYs$$P$tIME  '+4 IDATx]gTU~vLHPX@EQea1-5fQuM *fLƞaӇz`nnթ[u(E)JQR(E)JQR(PR'YgMũD$N'ӲExI."uG~?'IN%ԯl:x8' )22*Ghw+'%W]yaeUe'J:ƐT"dFԟ_zV'ʱ'^6TnXP9B֭gS~v]/p?Xk/.h#mff@.! @П|juV~vsCN=c|7_" zO>cY: DJQ\c@l6 =b+}(U %W\qӍ\{ZmM Kn" ̶c0Wה}@ KɽU;yփh k#=gzmj43KT p|pרI}7:y?IɼtM^=t )%U{ڃ*s `1q7=$.vc?68ޏaA ₸P9Jmo6|Ǟh?ňcF-?ݥHJS.\J%B *_#oKXT4$]a6aFA,4m]v38 oϮC Wh"Aa&2'!P\NԹ"Hϟ2t5yCt@lښ:z7Nwh7.(z(]pȇf>4U?x\|Oyi`7T$B !ŚGw]3 `s^Gi+PϜ,EHi7qA8@HBū"9+!>Ax Ah::}<~SZzڢ2bO. x듅/ln{ 3w_0Puq0r9 uVAc%tݍ)>d޼_x~3Μ^}?{z`kxb܇Nq>x҃/ 6Wo6Ah08\6 FRݠ23@Bi4hwE21W>pgkBcf)Ki5 >=B0Lm55%#SZOeM|l}o|.yﵦ[6׈d u9 Q|5za3&tgm-@ 7_^bmS~E=a&6WWvݳcmCyx[ !MǨ&MנkrgCJ,mZ_|%Evcm5 AVDLA(mw eN"aYǶ$XrA)\ALӴs1'Mz{>öUF~v:xzxza*Pnm}7h߱#Dd'1p"HK$f:љf "1Żo۶M 4" D>b4Q l)<˞{|[:Y3^s"X +B40ui՛otϿd{hJm %:y_D9)?(H`XU+Hb;5k|_G[7֛e !4H??waHeö%LXtޣæ/=SzIN?z3f}r !HJRTyF)PD9!! 5 G`ak "m+ʐN?3vu5 AϪHKN)#ApСc;kRH 3z=_iVg䪸qAl'7g pB(C'D$PSS 6[wTDҳ? 8 ֮}L껐#?ૅo,n|u퐳Da8 `yC% z`p?N˂,^Ha TUx'Ҷذa]Cڷoʷ+-SI0NNrP.)w`۶CQIJPVsN2;m|<+0GKHEhU슝> 52z`2׉FOc﮻68~@`Q+D3t]`KƢHh$`ټU\X =a됶5j 3jmV;U/~hQ޵2acG )U\:q )?NgMYʮl5Mxc| JUhJfMO6 a}4gjҸL#[_k4U>iuHYlej cu#6-Hʍ!I5ضAB--?@U@Pp1!Hu[amgWC2BV%7AWAA#P p040V O$LLv 6lW^zN2iѽ{rr_>My@rb]S~=Z#oK cz\ *ڴqzp=Tńyxb1 {OtH^jL+<\_tϻ5\›8BC"G&]h4zDSO?}LC~qՌf֜́) $$N6.:?r,+É݁ޝ,q UO5fFڕ>pK}D|U7Rt='ǖ24OF |C, ֜ 3v79D6 h_aDc_ݥ=:jLRm+Eu" 2̓D"T* A55ܦM܈cGsI+]0~􉇎7yΪkF,5kƒ0Յf s ,aI uvI$|}֬E,CԌf[ T"Uqݱ[*R -h tYװb4C 8Y*-*) aAM n'4MǞ葇gODW}p>cdHO`ruŪ7(%ca^ Ȗ6u DE6ttfUe nr*ם x}@! |0 o!!G"x,X,DoUW^6hK'?|̝/۝-Dˈ۵ܤ\6)i+\^a"F,G"g3SƟrѸ'_#A?XV9wR߷F=0%a-H\S~,@4[-Bݚ f@.^xO 糺2AhgKVxN)2 /]' NM3lI9$-5cO8񧌹gGG-ϟrfwWW6vƒ++C D%XJh󮙋A-&pٮAh`Q^¡V!('@ Ć[pE !` A߻<8\ `13H$qnݪG}©#uyq'w}>Ħ-[u0t90PAz0gC`O8ɓ$Q .Q$z]-֮v69Yw=ƍ&4 ZL Y}aSg`}3~' wMx2libFr9_n施{zGG1QGcs^xi Wnxȯ]<с@֩ ~غy6A.(CJ*Klnܙeov qQ;ՔY_AcHRh 8x?O8;tI o{]{4Ѕ@βdBaB2u=9 `CIS+9&8W%4-[p3j D60 dٶ1?]razzk.={:$<w;WiV;h~\J^V<"'4t `3 0@Ί6RHDIp1moJf@"@,9Ѿ 7^7I躱0c^ŅsAz~NXTWWu ^^TcA2#o9FSGjTu542, a K @4Mo~(?uofzR"ƣ:o}s>.7A6zEz*mL?I & ]$K5t83@GD\c$6;BuAHeR0,L2y O{Ֆߡ`ƻD-[-) P8u/\&y5}CkWHmL){ՄCpB6o-hT;d 3^&n'iz/#]d8OQyEM~~{$pG׬^}EުPz0*Ah:|.tZڠp\KUh7K5 >#vWƩ $UJ@hD2lTn:tpC~Yvx/IS:7jTߺe# gR:*B(<(][?d9}@2ApW@ҪGrsDBGee9 iNճ/A?|C^xJeO~\ %wK^JTy X=oH1R(JJKɔp&[n<(Ɵ|c|d ^  hU&cQr ad/ I { =`ljB+S)S*D*i&E1|'Lr1f~}|vl1#a[@pAS18 ˝-Lui#@Ht5{U@ףi87iTIm(^O?ȑG/y%Jftkv+{!@d0q DBmNEwICGe7h|mwM$ D2C=ۈG~_LlCz[Av&R,$I _?v@5.0 ۽# ;&n~]!t-BIYEDebnݾYU0^x<G2F&iˮJ`p5Wڧ[׷? uöOnh E0?,U@5h FXqpCva@!`ƼopٙqQ m}5IS`7AضE­Zmݼ݇NP#(.E:B,jQ#7a߱ H=pͥk荒rjq>ɣZ`I8r!! 0f~9H ^{vmi3|QyƟ\Cx/GoO !"Xa#ss %^B3 *۝ohЭH;Tt8bF-ڲ}c=jc]unWƸO=o4鰭νq%٤[ o3A6/{=H7 w=,Сi^14TV5BNG[|9h۷߆]HrC9W\W޶jXmֻ7SX2,ۆaDA?mm3 X*QB0=&\W 'DaHDz\x4D5 =:eG|wJxPoxݖ3s%&~F@)6JHۆd`f Q>.d5l̘vVvؐ/c:fؐ?9#X4 cVa鿅G55L>"LClB ~ao׫KDjk?؄{/;ݻuF>Q[SKր>{ӌ; |2~.GԿ rCwf NgJ!jF1O|.,&%mɘxTs6z_(}`pץJ\u|=5l rZ4oP18s`یF, t5Ez}XƂmo3E`[y4X66t5 `q)q&4v„ ;S ͨ,dafP Vaߡ}NF@h6o/~/`H,.=/4V&[qoa9H!Z@^}}\6~fzRW ҧE :Ë~- BBӈ/\]-u߳3'ާGk+9숗>[6mM m5&ׁ{/{h?[e3tpҀ8@X}^O6-w0$ v=n z[ߋgHh lن?,f/Xy#5p&0oPf4h4L xf/qߝW$GY0bi¦A ZyOތTR˗N*p٩0>P\ v&˲p-pp=1|7<}Mѱ*X1Ⴙx˜{@h[9A*fF#H$ʐ͖\u+s17=ܳ+=Ns) Toެn ”>$\⧚竮ހ?k-qxz)"CJK  |8wzDҭiزՂ»:=[G&)p+$QD"i$iz b3Cǟq6k֬E_/_1zŊIE pnr/Qt0tV2\Rs+tj!>d)N:1!h޼ Hu?C\|<M0>-&OC( Cx΅ s潁ӮxIuhԀnDP^JQnߐ@4!G"6ڶlIS'uqW*.$Eo.M$l' ȹ9͘zl+-mi! Ԑ-{txȣG>PTav߼nF $mAde ۦn{uTY>`74u, jQSSӌFrp_[vm/'0{[cja6"NbaU6viaiEFp/!H6˟:wY.D= i &MhGߡ]ڢ~Bwy]t˯h|9+]ӱu[5cvNsBiYS{:~9\>\p:wja|@$&UUtI'_3SEzZ̙c_`(H"֭a[[+WiKmv7m8Z݅ΥCSto{C4i9?rx1~ (N?cŬُ"r5[a-o`&?/Zl i9̙.+,uۆ׳N Y-mHYh{o}}5ihcQM0ʫlTYM7sI&x͈1arF)~Aٜcy܀Ɯ7M&G cf7oڔ[ޒ rY:͓O?sɲ//Xފ7j*+˫SGG *6)&ǍL(gRqn٢ 7 ΦqE9_͝TxpdJdYI9dJ4[DcQeɘɍ*2{*./-㲒R*;~ŧ·2Q<[*T5r.+-47iF.+Is:L*++K+x-_vO8i}=pV3W+Ź$mZϿ ΛIEcQ#ʦ2tFvlݎ' m;&U8Hs:t"̓<'+o}[/Oa:IDATxwU)iPTDT"bqFQg2ufqt:3*E:(~Rš7E@@HIN-k("-HuNr>{g=)}/l~l&ml&&&vZwڵ_xB>^{EexBxb /Nlf3Գ1pzvae]FUU$I_r({x,XoW_}Cs+ !#l؟$T{(PJaҗyb``;z,X,ox+^\Vc}eѢE{lf(6gQٟ8@UU\yn\|\zyge]Ư~+FGG?j,?կ8mݰ$ {7+Vx#mo8g,K: va6Sc,۲z̜Yu%Rlоօj)ewqwbΜ9l<hQJSNzβe83_Kr5<#3,X-6B9iTU(R)+9UUx/X`[o|*_:}7}QG%CCCٜ9sjkk:UU?^\yn͚5/*/2rgyfYeuEMtM~llln_ p<?<75Pו@19OQBpS(1{{6ڧ ֢|Pg{PJRRJٳg͙3 3fT;Sc.]֝<'GFF7|[`A%/yɳvpOo6{c' UYaA*V'YR6g͔8\ySv駟.~wo:N6gΜᡡY###2sWUuk-sΕ-bxe]ĝwٹ>gs%K25)dn:sJ!qޣ @HɌA<+.bz}GJ6R1v,Ic 6ֶRZZPZhZVh43s҉'>5Zf֚, !-mEb NZἣ,>&eU&C)#VsM5@l:$ V%$J J+lUUB!D AYYjiJF)Eb4:D3>>TԲ EG 391w5ǼO -_ZI-j#$Mx߷_:69pMCC4rC.*v?1^l 6n1%I1Fh6|*j8ރ 'Jc4y7G)IA Vpvtluԛg>H)q~]Ǿ-xR#TOH Ҩ93cߘ#@>/*M*QR+ Pe)leYQLY@_LOBPpQcc43Axd}(8|lݭ*!Z+ʢI6Qm6bKqŵ$.֡>Oe $IdYFx2nZ+nNYԳ OxO8u,>]jN$I:,UU>xIpΛqێ}`N8ۓ{W!I ;k-HBҧMu\h<޻ !B9pJ[1nfƌaҗ&{?=ιRipJET@(I%_㛵z iCm{$,+ZEa+U>u I2Gk.WHzX=:ت G H4 w@(EY E)Mh (-_ɩ$I e^[OP0XZQ&1yxDmnpn$Mg]_0uuY_gIT* @(cq(pDŽ/ \TeE%ʅow,B  [Oeˈ`KGKI,ie?):N&*y7MاXjZ6X3TJ^ϪܳnuzGKAɀޑ @)AY}c?Y^Y,Ź-< XUY@鸘.@ B%>sI4IDxއO@ߔh))Z e^$&4Ҍѵk#Txr?~[?:o9n7",-<֖4Ij1 Zkڝ62{=nȻyWڃ٪D)`΅am 8H%I9p㼥n +K3``ي8I: ʢPȚ?㏀r]MM4: R<6LutYK30djz:Mp=~#I Y088BR/ Hg#+lΆe@cB`(~i`V%LeSk4۟YhlUt@iCbjH];!}gtv_ 4E~m,DةLHҤ 鴹w [9udC-%VѵnuHӄF34bl( QPK !زBQBQVEPfeQDFDRUY֐lUQAE"]&''I )B9v?!>c#'8~t98xrkQ"' 4HUo@ p[dSS>,|xm.$I4& އEDЇ4*I}HeC:X cjh"*L>ŇgH7zgi]De!Bs^](:K-*>p.xς ˀPk$0J >2>략Q080p:| G q/ = %hVIȪߠR$2T=8 {:Q`n##pNȵTW(#ǺEX8iJ^geTUVu6g q BƳ_ƿR.Qw1$IEQ҇wgR-C(WJtckZPlLjzNIN8Ɯ[`bgl|< tX#pGV8cc잶G̝=Ǐ6;]ݪ; ֩ײ4UEee;A‚$| Cm+ҷ[ E ^Sv(eI$P }¨6((+u9f#.~8p6` YFatt[muג9 's# lj\b*3,-I1v=?t6o6(p2Dd8]h?v-GkG9҄PNQݶBȋn<ObN[9y3v-V{ k059EQ:h =o~c_~o}+ BViH "@*F#,[a#o). G&~BlrЂ[ɯnO^u~-A)嫰B4LJ*9&v+=ENx0J!LhjuʲdQp"tڊN㮽 &xvv-w6Si[΅.'dyYÖ(}C-lfTs;2U'sF֬`|7>[nP׋%: 40D a-@,`aLm"hwڬ\ $YUYk֬t ,xO Ko6kNwkZzJ*!4+*"9krO!loQN&4|7Ľw䬋df)>qq Uŧ>Q*x&x{Wkio:g)cVdZ֮%1)^X7M n308(y#0ER:>t׃袥,cʪ vftwټގa]g=7'ےw;[  DGi¢m8]@(M1b+$Q95KSF֬$5N&'ԅ!{Om2оp&4)Ȼ9Y1J`@EITT8'nUeщB wcfSR51]w׭:iCXCCkO%F3p w}T^F@)Ue$cYUcc 4XWjMW]M`t /[dYsZw/g@JWee)c$' ,RFt[Z!+M1翔!Aņ,=Gh!CWUA(ڇ1Z-he$a5HR(*[2oȚn},qaycbt;@P*~!w:DT5UβqffEZ*\3yC?pB&Y *.|P!ɲ^M҄(\Z `jӌOLbL6)M#k[vSYw+/϶ ZsRNN\$a_QK#!¹ wv(I2e.6Tf>}^y\W.J"S.ZBf@cLd>Ia8ܒ$a8y(ww?SZ}H)%v^,"-Ҟ{)E̬E1GhN[TUYdrb wYÑzNNTQcAu`%I/miAspOO+H*ULzlRV%+V@t`9uUqT;Srz?-]|v||^.(c:kqUإEx (Nڒ(qp:2nXٗ[MtO]ˑ2l_2iQՃ!Xޥ|P?!H ~vq@3Ve-zTd^ LNObJ$5 Ɏ;n_#_Кn;l9\G)֚n@B`"Fk$1 Hρ PDDDI H%K' 'g;ZG r=zzQ_^}{ "$a0mt˄3ƆJL m!*IB)yĺkh I,vG>`>i28C/~#|qh6i6ASSV^VdYQk;~wzTa5l248ċ@^zA*(JI2$n .)m= }=B 6_~C#Wqօ;͎$ALJ.;  fΚ&q>[L`nd 9Բ5kiMO$JU;lt ?_LE'Zz*˒4M9J[: -J%P*~\ mtztb8⍇;!LMNuu~,f!EU4-_ߟicBt2l"(ցXEۻGIIAYVOe)]EQVB1Q Oxvmҥmwnh"/YuR!'padI`IY}|`C:tJȋҖe}UA=*AbSxg)Pt]fƘYϠf VnIZP*Ї?0vA~${*Z^>~ϨL19=I ́0>-".})4Gf)@8Kw{x$+hyNfxȋ"+Dޥ=$Q0n1C4‘UYcRNn vm󟈭2vv;ղZt5X'$iV*ra4E9`KAwXgR`*^C[K Pw eF{Y授R#y%Ix+I c#LM0: 0GxipՕWoMjZIMU.xLwGlEbzz #?(PF*t~i+\8λ;a**wdP@'IST)KQAkZH y``tØG}O/^8Z?gbYf$ gfis[i{H,ڭ@pjvnZ ky^i=J'ɫ؅a:G DLIP^*)deA$HS:裟d;=ewzb|`w~;IVg`p04U#8(8g)$r>N m7+لP 4hMuZiV 2n1'pΓeeU?tF= # xbb߹c?ܞ#{Ϫ?g{{eKza DU.yyjsX1s˄VT{"hy}^҈^ p焄-Ex/w AFpZ ҰxjYfkFBUמnMg?ipgM )e noo*"&rC^{<ϑ\}ѼxvMQhmT/CN`10:` reL_ MMʊZ]cp֑\K ! `dt S)(wO[jZq?=#@3Noe{}%\Z ќ}2nvs0+ ./=~dpphh lep'.UFq!ɋ]Cp+G ؂R  J%FiZիWM _/@gr4ADŽm .+nFZu*⣟}l𵻇he : Y= i@0[ߊHoGp CE(vԻ5|ך5kBExs*ϟFO=#?Ӛ\rffx ߫/O<Ȟ|-r[ջQH\="5;cْ)ðHőn71 UYz *Ȩ䙥)pqH^eY{ݜ5k+P=5՚Tϖ\p<{7Z[xקU[n}wTNq]^>K8{Gsǰp?E*L *y7ڥdÍ=!GחQW@!sC'eLNOjM$):vy/uy!c9q>{^ ksv͋X4C=/斛~q(H׮b!}Ix;ŮƒipD?m J ɤ:^KErevn0Zl4i iwON~ϨIu"ϋW9159(˂7_Ra"R&q-YxPy1 Ao{_wpI);c3X9>ȩ,(.Ҍn7>cVO|H(WFiOlv1cYpwtbjz!#}#Cڮb.oޚ5,#%YšU<-q+yx[.31ȑxD "&Bλy4MbhI(f=vHRYޝ%KŇ>αzgmY.%epg^{Ȟ AF{ >pw$Yă"k3o1p_Bp)KS`lZ<\JpC@O[h , *UUuz ^(Ө%(C~_xƗxO>p&hmlɠ.{SVV|O:6n#9|n|/RHy<|Sjjsi{BN$U{+At_hB"Xf!dw;^q^~~Ǿ]Jϗ+8H(#GrR+8y>Dž [{:˘ȲsGX-J^ǖ1'I+s5'++Z_w9CP F;vF½{*ZYf,R>#[ǪOjRJ_47>jb^x& }~za ]OgiT9mP(Cw˽mӹ췒IL  ϻ>S`Uh¯ᦌA$ djjeRP*2e/{iŸiYpg*Kg͞FBu5{gT9u{=r ]t'p(z?\K|:-\q1u~DBZrFi1UAV$ih.RƋ&vbOPo}CCz!6=lq]GW giQ!]s$sk="4+y_͟z%C GBpCt"0/<7>;t` xM벥KR2cx$/rF :^:Huҿ%;~[,/:W:Ib|;~Vle3ǽ8ŷt8d8[u:0YJ:\zlT;׊/~ZN^LV|tna{Re|N:eb'*ι^N>xgbr clv]twjyH_Қϯ|.i77gIl٣[m)ih4{Лdj](.|)_pLw| 3y?-Q&AF-Y3޻) S8CN?=Ԯo8ri1`>]Q'''tIb6/22pEs~0/us2ᓗi;=aLJ=+ڳ9xhyPAG AQgR SSx w?mųln1A֮]i;Ac` £C$ {e]Yxcu^Jοd 2LTβbJ2(i~ۛ=cח=fLev[vI1#Tr .?u>?.aJ>%=< 4`dL!lsS600i7'{̐y[SW]wEQK8j-e%whviLTw0{빜z1`/cQFUY?Ʀ_@;]4i255wDx1߅9C%wޑ{x<_E:܈yEEI2&&W:M .엓o|Ñ (o}b/:|0pe ҌNȚnx]_țO C?gc>bpnR?}՞|+7@Z+wwrz5k֒$nm$ɦfShO 9G?soh{넩Y@ZkXjuݜ_G6-'-߽wݚ}n (4;Wh/[i_ߐ3Оt;_/AFHIݦ,p!s7 ֓B?ǦO<ᄦ$\Jqd_ҹ_l&^4/7Q)B '7-ַL\~WͺZ dO7z ~q&۰6rmr69Fn`#M&ml6rmr?ZPyIENDB` IHDR>aQIDATxyx3]@dViT"ԢT꣭VVk UEAB$ d @H g17WPjӛy$ϝs}939eY8Oyqp8G 9sĎ9 !Ŀ+xl_[=bĈ^?D[?~4M iH+Nei'Э[7$IYA,bĈiBZ%ڶm 7j}z aҤI 6f͚G~lrHeY 2M[R8YYYL<*ryUj3f̘(\5$˲$h4Jyy9_y 41 k{RVVFee' IM߽=5f̘|@2M`0$I? ''l˲$G]]zaYB݋)7##Ûm R2p@l#^\\x< Y=n?˲?~w !I4rrrRz{ǫ A֣&%/a^PP9P +-m+[`];';(B$[LFNZĒ#}bfMރdq6d` ^ùV]C]szf@vsoJP8x/l|1-, 07dɌa ,xv4(S\ SF)z}<IY3vѹ.hGi[k.2@|vdηn"=̴[-k gߡM~6#.c,t 3{SXD~5|ڎ. J65-=SA:['5L"䵿,~?dԕxγ>_HIa`NjԗN":`6  `uů`othhh2'Ա]Onj^?qUʗ$|:Ѩo|yO C{T y#o*&p_1H ,]Yоmxށx˂&2} 5`$Ki'mGJXvsOvJ~$,Y^6P2@ΰo.K 7Af=4{aqťg滕RHǼɜǮgAYy5r :hiM y!ML@M*!qb7p}G>`6X̚>)uw;9j;I+yhV)YNtw+$0v ՞qÄsyξe]6-.$|\uL&T eP<ѣlYc3ֳ[+0rzYLJMHF&\6a'z~ KNVea`(֮e$ر+_giC=rLIag1~"<>b ^@IxU8RjftK7I 7 Þ_-G.ˋ2^@ a?܃ .y9 ozmӊP>{_9y$$͛QzFV4j|HC\rlX_&߿㮛;QNr%t,[a|YP $%Ƭ ̘5p/2ٴ>"d̞WEiu0RБdOA{C>N E4cԥ<2dװCdP4sV؟<'/3yw>8:vnͯW}&+M w`]ƀXf\+ V͛d˥bxLvnO V="~0^~q,T;>`Eh~?yXBP YD}z /Z O[v0dxDBow&(^^xe;B1Wodxy2ʶWrmдiddzT 4I&[Li45wIk+460#3zmEg;LY?0/Y!.9=&gErP\ttFc;9i/3Œ1/6йkuKdOX\>i6f^"v#EOȘLy+6|Je* /=x^7%F'N]-{/D.JVh$<͔ByhD֭}KZl 4抋DL퉳f{^ #+d!44J4!D+~6|1r.Zgtˎ}80+qp88W p\+qp88W p\+qp88W p\+qp88W p\+qp88W p\+qp8o=IENDB`MEND! yubikey-personalization-gui-3.1.23/resources/images/neo_production.png0000664000175000017500000003710112603205714024750 0ustar klasklasPNG  IHDR>a MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3bKGDC pHYs  tIME_ IDATxwlUy^m=3BU:"bB, cb{hѠ&*Hh"*"( V\noeY3h3u9{eάg?,c>kz`d#F6r`d#F6r`d#F6rn7۰ ]^mky[֬i>ͯnFŶ[GuV& $FD ][5JBN9[gMQ,,(ce|z(ܻ,>fYUцւ#YQ!DV sAӳ\v7f#Fnl?w]fM!ZF)ROHnjbb 1bBiͲ : S߾ۋ#8c"2caH Xki0J"MUጡg-hi8cǾ__YU}o22X4Hex)nj hhES7R-ƈw:GGA)0Bc [lϝ5g5(vZs=;. JKJa(-7 H 9- Fu(d9G 4RXr%{.# Zws1v J4b{m֬Yk?+BNѡ[.Un@*/uQF333/g_xnjONe NhgnYd( ,KZ"ݥ%)_8󓟘>g.֪6m !P33-u~w7MS+k uU[)>eӟQ[V/oVnePb*4jb h"YQD4ESYAX鉷PK꺦]Dpً6ؼ(Ȳ,mxlZ Z dyƗe>ԥ?>:ءvPʸzDA#Eu9 4>@2E<1MR2!2ϡ %,[6A/_tq=!Ac!D#jLs%wN~sfF)g9KyYU*b!jr9R<>x'rBPDY{/C!F>C`jr?3HgϽ"3ad܌L}D>M]#tygw|PNQ]F$eMSTꪦd.CsV㬄T _B +Z:8g1`#6n0e?^ Ȅ0usD6JiIa$kZY8q>_w9]kdxټ5jj#hʒॅnhM4e<(˨,YXXkڝ/yKuz颅]vY]\qhyt$S@}C\zec>ԅd x[޶xi-BEN b>cYF]7+ZWT(Yj#4!9GYUdYFUX,K,*<*+%N8^ri&uUW/\vGMd""!x2+b ,7Lo߽Cܾ8@s̓m묌Xӓj' =2B 86Hm-%hATuC e u]g@ic,UYb]V0b7Q>zOW4}YQ3!b 4JAed.\(> xD28gOrЁ[;[Vw?0,F mG" !TAY~dYNS7dEo|C'gQZm G_'̿Ou_{ش2V(q,% ,z5ҥDG䭂^/#FٗOsM6au3kkcwҁ2%&UTThӢIi>P*!g%"V4Uxú 1mTTUmU)`qa~f:v:HT-:.[yA%+ݙyed>e"˘*kkx"1|bodotIsTU9,62cdTW%NÝ7 ^9ud%) ~zs?'Gp|:X԰7VJN45Sz]nZ:}}o գkQb{O4,.Θ b54`x@@hQhcak-Z-N0>M3??Oh%pk3Ok_DʈEK )k-VA↛nƧ/WIAb߀s.\/tڀRuhw:C~@R9B)Jb(|UVlD]UZq:KeJ*uei{ ^0u㞺ʲ+ZaD&puVNN]bmNGؕٺTuZ yHJ;X[ru]#BI7YkY;tk%5>b.K4tk"9'bd4 X"GkŭoB9~v!W {쳟Ί"2O\°.3n1?=|754\'blq#Dh Z!܃*f4[TaqDih|Hn<*mp(cJ 2ȉvCORi9}` "@ 2. blܼ k3iCS,[6_}Žfx/}vxOUW!20jZU-aPMëۅk=2 YDNB4`tA22FiG/%(-LYɦ1ˈQ*BdBk4Z½:!c6sslش ZX1c"_|5mHAAYn=MwM/9D|) >H 1h b 6q /8T!`|Ta$¹L%$Јoȳ,p@5 yyl&\K^~7\x~o|Cކ-[$O ZZ-Am6_G4\1೔DF "xn4d8W4u]vyifvCnz?yaA;gA&yZkqcei8SړeۦQ1Vӎ--?p4i'?a_sƒ~ĩo8Mc:sB©'*7Bq$m,޶ ]YY[Y_ ~g~˟unt0_3egg6}hT 2~ZV])^1Zv>^A 1upOdlb'Rro6?7Hy L\6U (&eO#UUe9qզknd57{!,cM1.>k~rc Q3 S*첮Ҳ )tʶOE5;.|n#y~alٺ/1\{o$}Mqhsye&dƧ4ȓ |$˲!*u˚$.`huٸi 5 EU[n r-o\z;eТҴ-iN:J&my.px0 l\C Hh("dAG%+d~TTj5L(`E(i_ݺR@iD詪E9ib*p&yM"2Q{l۶e.5so֍8>}ƧV?`v5N-N#aLz%vDR UbekX6`ȓS/Pv-}riM_ot) (@73JҒ8L͋"s8W`]x3t~ZLLLdwyܙm`xs~eIGF2C,wDM!"A!aD0IxeE\y:)^:ZB;P 9Ƞ]Q",/m@\bIh)e6nѬ%Ni>u_g/чrKKKsr&Gjw{uxn<`GFU1;}12mVkeZ-%֙urۤV1KÖO4׭hicѤBo*ƨ 6`M5v(0CSk?`;&;<[ܶ]1iE'4\|85uUSjX=[@]+P |7 yIՃT޵M7(DLnx[OV錏aABéah# y28dž qEPZޓۧ?3UY;RSmWgx{=a*KHk-xA:uKon.ƅr,SnCL%a|ϓdcb|~+^rwfMvǧ&&B"{iU+Z`8A9Mz{MSC(mFO3 O|eʒ^W3ZDڭ xǿ/o_zYgK0=}ȣe+!?ӯ#oıϺX$OCgTDQ 2G2aڵ)Z"Ō ^LB(*u+РD0FS˓ŧ7> Vk|dN4xA u?+x;`v"D/\_r~L| ġoEp8.{ i[nciq,+0ZnJwk~ 讳;4\'\\> dֵ]u]ٰfPIi&Em*KڝP)B^+=mWoF0TB:kMrRX] I'1OP.=-[PU5c48|]ל8 n=w= -nrh(#mR Zy7($95cD&!⭱8%mRkE4uEuMf eݤSe_7uq h1ZxD02v$mܸ1m:1zb>?'>q9wk^W-h[3YGBѢ (u"f)RHq(7q$t#QB)Zpe/)&z:TeI@Өxa2 , l'ch#Я,Kbr\OeILtcfȸ>x3~S_Lba~l/|Cc6Fh!|pfn%7u C3kXxQ4ZS(kF~5:4Y+G 75.)}Z"`vnmd x|k׮wÿvgn,UPVBa6~gA0pe)˜ܹ 5u] UQش!PV%ZNQpODR%\f {VC`|l2+-YcIQ5J[҇UiHh-4ȿU-7w$Ҋ+h2똞ro%xܼeޭMW|犥vۣ[-kK~W>}9׋gF&~3N@OL~B-=!\x2yuB!D<Ǥ1V^zjE^VFק 2l,@* ^\funG0oxӶO}+:ccd̪ӎ'4~`,/Ro(vRwIH! ^-+ZUPYK/1Jh nulB@$᥽4Z3>>Deh#>\:;܃v,_3ɤOAާfbjR&6N |'[m'&dtӢ^@)Rr1m 77hٔ2wXZ\ҫs#7EKdRMB( IտL;IΊnq˟_=ncdӆM {7EKuͣ015T|hXu_XHBQq ˜'? ۗwZEעbL;IDЉmb%*Zu:,..mf km]Ksxy tPGkY sw3 qX9MÖmc? {V(/]{ӟnGzcyVEDŽ=&*.0>5hijd׽J?É$TQo1119dztY{!Z8-]Mo%w@#a0 =, }8@BCRںut&K7wy.zO^{Up/S 7.jcy^c׭Xuho}'{~wjێ^T0Y^DGӫ~X"_v1:iwN|ҁL{uKrCe;g& v9EKiZԷ,9}"v͍NjOIuDs䬏<0pXCqY~%g?8 5SS}@[I4xOQw4֙@9 U]lu]Ww-t7f3>:_3ak~ɣLNwV5y-?o>z>n2紫Լg @4BG&شa39B299ryQ~^` MhnA)-UR—trՋ/=/2<_kjY'@wTJ6'r>v*JܗÇ8meb9uOzοq?<=~&BĤbڍ (-NV7"ɽ _`p9mJ 3řܻgYbEuͿZNX֞o& 9·dR= QE*Ӟ)0jFt!Ƶ}σ*&~뮽)}W\ ?䦌J"ꯊYXǸ\Zq"j3g7My3I[ %f,yŋ}Oxp3;XR N8jw^GH=90"W_?3^v tM뺵kZlj J:펐OC@r6o, R b)˞o}~|>N9ڭ6*F_}.0r#W?J{Gs'9#Gʩ:Ï0_k]q.*I{'Z{>}θ&\Ju5ٳ'aZE '{'<`iE&j^sYNeMSa& U{W o~O?cW'ogaq^~첋 audN klj ДYXn.Rr|&͉QP1L27st'z7|C1{ޭO\9@._я),3?.K]]nM3ޓ۪e6(t:|]YΓz[q:iX6ůnj6LJ;fsSC]߶\yUoӟ۸y<˧SN{<W(D:K-mco?\ ݕ}YeD(Eշc2Ͽ^he{mV^xGK$Ys?w9r3&lKxߝ*@fjE<6nDю?y\.vtj|l"$lm Ts\r9?/a2+ד ǘc֭@qǕb|||4ACv߮+]qepQw+'s; 33çxs/[7bjb[ׯciExVzoUgtw3qWlbc5*FNyaݹiKÎ:_lcp1ofe |_|zڝ#7g>&jbbTeGt(^`Y iӼRLL%DeimvJG #vv)'By51>&Yio~=`"oӕ;ĝ_\dmdY veIehXsOr~_2N5}qy&Qݸe7\vGw;qCഏ׿~:3[kɬaiK]d[ʿ|xwiqxǸ(t b4X+N׭\GWth9sow|o+ r0Jk.uUeDvyU2Gv)_~>v WcrB91}_U9fN|Q).DĿo} |Xr&Fo}Fv_L#9F0l#9F0l#9F0nc+G. IENDB`yubikey-personalization-gui-3.1.23/resources/images/logo.png0000664000175000017500000000607112603205714022663 0ustar klasklasPNG  IHDR+obKGD pHYs  tIME %3P IDATx{U?r j5⃪j4GR_5jIcRP|T+6JUC,E EUCvwxfιUKnvs79%#hx}MYm2~׿E%`MyzxV~o{XvA+ ȷGޮ5[-`mE-j{3w uZ`ke &I<&;F|ʵ0ldmC>$+{>1L#r]3xDN9StGkQJĹEx`Kml e4MYm7ʮX <] d_]\DP`w`#=`QvMuXq"yQvCOl` .bK2<^{0rZ 0Y`KB<*X3 qI88q 0 8HgχSeR>-=u8}2OExFe8뀷#o5ޕcJ<$ HusET%qn2ϣ5@g3 9Hd4.`e`QvQSf>h!iğ!RE=Ebhd(n `QGN? |KvA9=({ypCeYԓI\Lv-o@&+9=8:4H|p|FOXǙ@g'DNYQ7;lGjHD[i/ׁJ H}l⪍K%X #oV&iZ"DGo 4*0NyFًgqoT(NKFYhw%}*#lS+dѮ΋ks dK""i:;nn5NOQJqӧegSQ!tGrQLېVX.~x~Dd Mu4'ϩ-Q(u#0'>?c!'ׇQG?-U;yN]Xgg({6䫕Z=9c\5 k&2Wϥs ˍWemJYy(C2pXt{>!r)[!Vȗ"/nM`w }@"1{~jc{d1'QX@;Ȧjv&Mkl-'=L|:O0xPEN%ODa=b]٠VZ+\7+Ӝ~>hbnG}dEeƜ5\79*q 6JlEsLϖ&AMKoSΙK_٣/$#?gUzGG5iZKU= csRJeO5q`WO5왕R -wR/I|q*ތDNI= _ PJw%}XWeז܃0DO>I:!ss,e0 >x4E"~x~4!C83pCWXډg93lK?q@LW'jg26GNϐnRk>"\49=8%9q׈;C1vj]5j&SyEtpQvY"ZM"LѼ}4,dѮgQvi铥{6k1qiA8xZ!{W=|oiӋfq>qdV.C !_GW*-:`LC}>!"{';5,0iFUae;#/^ËQWh#Bv%ͦ!W+Vٛ/4ɄV%rlzP+($sTݑӓ;{F|%q t;fWZZnbLcE?Q&nResT]hV#tc1C<>Nw l>،D@F9ELH2f kq○nh2)':ZsBc({;sq˓x(@3ȯR@PagQHkk=Z@< ]((mX^~B\άM6K _M؈?KLLjQ׈802'q|T \˧U$|0rUhli}`@ 8&rw K|hggYtItb&k| 3E[H|@(>7+4[2Sc.B\We6'"GHTo(*cQ\g,@ )oQEe[nTǹX5ʾW'#Rj<&tnM6DV`ТfmD>I$RZ5gMDIENDB`yubikey-personalization-gui-3.1.23/resources/images/edge.mng0000664000175000017500000004635412603205714022634 0ustar klasklasMNG  MHDRd = TERMCsRGB pHYs  BACKQ2L"bKGDC FRAMȏT IHDR>a6IDATxy]U6;ߺUBHBB@~Ȥ-ڭm4""-6⫍ (MB40#I*I%5ܪ;39"aHjnᬵgCR r =o`@ a.p +B{5 eYL L&5cƌ#l{(> }h4@Jx<!\ETc)%s=@)ei=BPTg̘!\%"mmmMZ{Uv]]]meYX,^ /';v,Z[[uV,]N8<J)uYp]6 Z"JK){cM=PGSSuEU81 ^ J)|+_rk׮Ekk+^|ſDRJ_/L+V-[jo9Z.A2z/؇M~A)wygw'I~BzqaĉD"PJM6<8H$}>6B`Xt)`ƌ~ܹ<e3!1d]G?QL0!ق v"RJ<8ꨣ@yǰ1 FޖP)>c`е'}L6 bd2|qb„ p]K,vi83EQ|ذa֯_1va%o30|3FٳOaÆzܹx>Y=܃{?`̘1}?|eY4i`Ҁ{yW%[]s&ر#}@cccb@9CWW\Yg#F#QPg20ywݥR)| Zbݺu( aY>L?O+}%S.WcL:p{_vZ 2eaĉp ۋl6L&K/O=.Bb6N )eXM̟?j@_)/(ϝ71JBD,>2Op_[T7˯?Ք0K)vZ0܌Cb19>T*/G,֭[1s92͛,\pxC,T*cF ēRR"O`SGwX@]`qV,C<R*Ɂ+NR HBT*˲  @\F. !cdž@{{;0vX,_`֭+" 4^|)TpA`*P@R49js̙3+}}}{b!&!4( {Jh, vJ+PQPJ"H (((yXe+;m}Y\{g)^ Lsi%@hlt%- Q2B@!5T(K]nv{ uH$/7 j7(B BT@tOì0X@Yx%q0Ǐcoغs.\.Nٱ%H&Lm5))äFV|@Ji1FcRjQ.Ở\bGAl?fM$,PƌW W-K7RI  /MiH ,۶O\A\z:?0Ԓrn⽱lYq! Opŗ$҃tu}Oj RJA>!OY?-yFpð, 2(E*JEaCS*{Q_{1[ Z@}HiN9tI^ZP(%ŐG!7FO~!D"QDqH_UR W^:t"[T*ycFrيzTe}_T2Jt' JCX6z!=P@Ģ8e<CG|b< -B"+ Ž3e8X+aܫ[2`ur©'S-KxS?$ҧT40)%J2b\p\{7*T< ., ҊWƿ=$HR`ϥITᕫj+9|0;=wJe9Ӎ{_@:T] (Ra (|&\Xu]"Ѿ[c=(>=cF۸W!l DV=@ZmUǁrpѢ1GgOpHȏeKS Mʠ kVQ}P(|2)(Mxu N\x%Iyeb5o}q?}79qDf1%Ap")S$|Oa e{ۏT+׬%i0 `.3 Wڥ+i~n>VWg ǒ6tt6cl(c8tjť'Y I4!a̲q#/58l G+3rdL "hصRu<蓮@Ӊ2-_ʘ>hj\_ >1a 4a-'B 9@ aH$ms>Ѿ{RR!2}@ l+z (&DP rBtCTW+:(m.7 Рe),b6>;wE9 r+Ϛh45D v|ӍB51>h+^I\BjבH,@Ye5QXy %!ӟTO!Ĕ_I{} I$p%df=p;aa])fS˲@@L`i`5dCr `ƣ"6& $It\|kjݓ{RLKW^Q#TF7L5`$ߺ6vǟ|2JEj4`cb7}ah.%c7SJ /nDPTQ1=t}HAW\翰Fc&Դe<2t?B gx~Ҥɓ'@R|Idv, Y45)٫I|} (4W\=j~( eE4 AJ & F"V^)e^wn/%+uz\/$":Q`a{t/G$böm ޢ|C"ѡJ ?a P;w_3;~g|"JBvFA| h%jmAPs{RS5iQ1玄=TGҊ7hu1B Ϡ:paG"vJD[ׇ .> /0'˯a,% pq$ L#Q@\AZpìi% h-Og ɦPн>%}];:K ưz)LޅC0۶W&h,N}ü5P6+x 8<:|ASdY#z{(,a0J`͚nKK.|C[On-f  -(۶#::֭Z>YMDM:ٱRd2BLk)%oBJH+CR*$ZARb*>@P#AFm! \X:oPurM---oVYZn]2Hk3z*d\;: )qamQLׄ5)P,XK{<:+d]:T:$L^@B Gg(e<%B Rs6hqדT p˪C !ӬԩSw8 `͕q/bv$2]kM(8x0_r !8V3PʴܾKnx /,+HE` m3RSp ]ldԬA;a$0]F˃h,KeX\-Fk=6}RórW]qE*Ԥ]إPqBgT[7mTAW ǥnG 9fhOq=8yA,C4n>`KE77hR' F}oWQ+^bQ:no^!5GU^==d /|H&u]}>ӱS*}Յѧ\D{aϦpge%@J6\x {زW F`2dRѷ AJ C|XUy((eڹRJpE|5[~w|73Q7fs#˫7VJt@aX3< LZwfW䇰0ga \1qtT8G)tCBi]?L "X("(BB F3]HYrَD,4̬i8e۷m^ Q&ןdcQVP<>sZ`8馋2\@( Qy$wI x$ H PE {H)(ʵ7P>.:w(`UP.xPό X(P Hة}[zy/k 1DGF*˅tЮ='нoRYzz{kJ'Gk}D<[ J8̑Sx,ο%}[;Ji@)E4A:0@ bT Ay'AbԔL%н Be.0B{[kymA堀C=8(i5R׍ F%,LPԦx ß`6a:u8O ܶ (տ?_XՑGn?l2:" psP:3ʴL\]Uc*J/JSn{{a ફ;x`4ꔩrT:]kØӡ+8vnAh,S o.( DPa*_ +Ts0Pu<ĩk/i֤&1R!c0Bzd`j}D#t `܁R( xGgs^0~ `kGGnSb"OJ>ɔR^h0&NmhD)Qp}m`fȢǯ^HJE{Gaɭ=f'k/yhN֑DCT Z"HS u" ²*7mmm{}1{~7Tq].!j50m`` ^[_ (:4W}Om06]~d0@A$9'"zЯ V-o|29عS'A `_P(pM7O[@ (JS;:X,# KKVT+TJ( )bp"2]ʇ~/N>XD2Kz^_2L1hJPJ#(L9m>U> 7Tl;oD":lɪ :&nKNdNX4 ."(.u.@t)!O:}ku⧽˽9/eLV+_`ǔRPƐH& (!,pn[[Ks6?_ u\o,SaYPf9sw!nٴY /`\wcPhh@O_m>PeiWN):qVx0cC@8c O<2d 13h|>(b(vl݆\K{PsU^_H$$><쳮T\)UJe2%~fZ@ p^u7͔]F5fcd6t0Cq"!oK1. "d`نN!ĭw/|u46 id;F,˂[7oAqeG@B\o7T߿[ٗU߬*%ү`a z 1XDS2C #i]w`ދ=?9#nrCy7Ϙ!iJ _~y8$A XW*v4 q 8 W!˯:Æ{xj c#iV ޭGH0Ey$ *$ Wt2xW&J63X<߽nFـLcJ2NJ%|EGWKVo]>G!A=@w#VI\Bh}( fٓ>t}W['Nd;dCZϿ-ƋPci`{7pj)R @iҫ%iݖ.hH4o=` [*&gf֐-3M(=('Q#=^_YBnCbAnT_} ek_~V\|Kb|L&JՃ=5*$ HALux]9hB- bS;}ː[Wy6n]2cBVПT kN}%%r9wQC lKXvRvEP445i^i65wcR$Aa0_kPh\?U#Ic*nXD!!l`np$"UpK8. p U!9:Њ}Org*\s!J'C3j%:' J/JJg2f `!P: 9iZ XZ'\PҼuxMO 8gp]٬vsCA>/~e3fqU'/}9C%f2{ 4x|oHCoNza* O`Gr js5>@`,йՓA٧% (%(ӋlF_J D<^~x"k7s_7C3yIG}$L@ ǵ+,X> `6cu/G*\:-o;V<Ʀ4V$w\.mr-A}drz!3A늸ڒDP/$2,9k ѹUeq,\)~\=k!8ǯo}'KƉ /ӆ%z(Jpt t V4jXnowێ L ~+^kkD!F 6%޺탂c[!8-ZЛ8i>b˯<裱T: B)Hp`<Ÿ ۊ:4nWCՉaw,+T:TS|AU 0|S6~@jLV׵5 6vR d2Y|m"L7ξS7vR )PBa ,Th&n}=.7,^x `("S5w, ta9QTN/_]qC`[zQ@%"o?gb:Yt(59HΝ9Pp\.{߽q~wBݿxߌfDIy!GaEf/nϩ#Y>`m8gjȀ2Lu}z) $i‡"m[^ A~8N>M\&op\{KNvȀ;Eޭ_zY?9OqǾZȴP?7/m MBw_ O㛷ίV(c2X'B[/HErn]>]m] R ( (KoljRbYAG:VǏ/Kb"J33t*@N(EY /sS:$T*>BN-'+xq chhlש¤F[) 7zЅ^HTLS"D3lt5?_OZ~ORw,^Rmoi^5E5ESxiE@uV?Lt4 %z W7[SD<POnl6)"ٽ$R`JIT*eJg b޾% \T|BoM_z2Ә1lqe+>(fػp9yMw>~6nUX(C{*זo<` HǓoZLccfӻ'=R;E,|akX1:򹼡hsn0 ș.q^oww$!m#.yxiE(#Ӗ&t'v8gƯx>D_i >=Ἇ=l>` h84y( ֬i# F ?)$)40ӐvV^ E@ `I'[ƌn`xgW 4Is9\å?jǘQzQ| =(. [_X-yWyh>7TRf`ol_kVm' ]?[|'qt wpuS+E_6kڠk;uk}rJ.f <3d{z8U0Fa`OַrO͙߭ -[՘ k% +\7fϝ?IB ozcnjቆs;gX ܆?g77Ơ(@i|sgF6`YjF+Ds;6>e b15kc,{3Axu 68cMU4@WvN2wWc错s#gc?Ǻ2>^taLCQiyݏ'~q*5E۾ 8v:'4XX :9#mKؼusK" }Fˎ@z.|ˇe|Uڢ%8Ss:[{Svk&LlXgBm,A\ !%K(lw E, , s_ͳgADzWVEa]gt"(z:8`B -H7mdM ' 9<ϩu u\*zk9][oznjIe25Vas>?psON?}2l~s=Y&GDIBj'>[W WJ)2q:R. 03 <.zWW7jq\ox!;X,a+/WƌsM$в_ƫ3'מ @ W9fݱPe͠l;x)߇tc#!^MoL1,BRL/>{0F yBfzc'D E8QH767.O#vj[wȑ{iop}^"sN'\ƌY~\7 OLE̶<ɆnsA4ᓗ?4#ldžuQ,\=`\yPSiX<>н(2x`̼9e UMzS_R5D[n:<2i9H6f4c9y顗[ PTv64ceCWZPޗDy窗]vׅTCf:J EAz_t |ل`1#W%# VDs -vƦ |TX,_/}igR_x2͗KY5z6̚J 3< ' 7XVR#{jEw\aG@AcS# o%JbYh7~ê9}RT*ԕ+^o*ZZ5A)σqsp6= [; ח =mm克6/VW!yWǒA,B% N~,Z jiիC !wny6ɠn^‹/*G0kn?n1!8yؑMB!UVs= ZQT*U7b 7A_K:ndT WMٰc1(($IHufh^}9 e?dL{ʋ_ߨ'=1J ²TٞAhhii|) {e8'=qU4,}\E#i@Ǜџ30rɥ+Ed?;oTT( #Hh<zx㽰 ׿O>1P` "*{۹c˵3.88sJƍ;kRdlr1G}aY=sΚu ^_JĆ kܱ'-cq)l!㉄̅Y€*9o? V[ȁ8es0\ 08es0\ 08es0\-x!WIENDB` IHDR>a'IDATxyŝUy3a!!Yl*F@A: *h057 fU7&hT́QPB( rE"AxsL{=2t>^w׷~WBk,m8|Bҁ@@EQ*** ?|>#$u]&J)"ea6dC 0 (PJ}䗚IRYA:+++-۶ZnݺuƏZ+D 7H5SNEJI*b픕+|莔Rhزe H7hf8ǗR)n 0?H$3fh DKMB Z#`޽8;8 m}:*,F͛Q꽡-<@qqq$ <:gmFI߾}[`~ZEEEѡ;L 7}뺭Be2vA<oM4>_S/"`nj4,~ P\\f20 ~ߣnVhڵ*,"N.{A)l6ˬY(,,IJ,RMMMC-y8477fIӭMJSSSS~>r… 7S!>A]XXؚ@kmoGs9S TM' ݲeK:޽{܎]vO$e˖52$.va_SoF|]rH 2ؘVI7>͓Ow8 -ry}S7ph p9W_JdM>=%H7A" ˯=vEs^N wܠJ)}ÔlܧgV ?]+݅<~h~>{v (P.+.[?ƪw>1}d2ן}SN<0PZܪ$26֤IȤwh*{v$[[q>wSS[EmzwO ;?"РɅt'4 n*ĕgᮩ[ wY&*ŏ<;a7{IEoK}5Wj{ruIaa'ܛF "p@9`H?'Vlg1ΗχnNAob=X闝r#{oy Г& IpD$Zm(WAh@"C4n[w^jp92vá,z0y `+cՁd!'Y0 L: '9UHy$+BrB';z)7-d xwI" 9oѭ^cq\}i't&cÊ/ J>+S`m{C}U %|h J-0Tm'°gnyaCsKypm[I:|+a ҅?w:5o6Et-A+!i=+Z"Xثq1/͢h6sݯV0qʺqCkѷ \ W@`1W9[srm 7N$nw@@ii׎popB }#K89}}Awt _oɬXNVu aPh; !.yo"Cʂ]u ەtJIC PHg"1 kQ1v3oˆ8 #=FbO|k/%D6事hpqӥ\ySFC=L5?(.W\u:w2m 5%@z%g6ux1#}`~3[HDk(a sK(@yd0'dGg\DA$@9iIha/my3{do7[9gB:esSUt1!fq7rdlUh䑚V(KXw# habZ+76qٕәt Q0r+Ci@Zјt 2OYvM&^~eZy*#\nrXd)wB\B(4KMd]0"Bg ~-_Ͼ ]:T3[w~khi4R odQLĈF_$ݺi[=Fp.]7/?|(jJr\sioƏJ h {?ySxmv[G(RH@bX۹Ѩ8C, UUSy\S.q2p U$tsehlgUqW9ѫ\ DN!5qdƿi4JK2<r3ȶuVݿv-]MS,HپfloI1??{eZT=K3h'? ;bp*?,=r\%I X{d $@j B`I85)I!!%av^AUYFdL$"%=KC7^~"'鏢ZF OӠL&4Œ޻vҶ!@Mm3afsS-y"ź9S/knI\E58ۄ:H 3mG-B66} _F]YM*Woxo[0;c*LCjT]LA^XŭGR憆5P"%˙~MM&Ma;N kk 2f;ݟt..6.Y*W0Bi'Sټ k󧇧s @j!#š9Bd4鴦},Ps+Ϋ0\ER -8as O :dnlbw^zMC P[WtC lw ͽH @{IGw.vMta4jTnͦ"6n$ K-$1~7dդY"Fpuuij!ڱkin2ΚrC47!UܳNb;DcqccuuG|E#*cJJ1!<3NU\YIsm^MF~or v?QyyA-CzF}uWm])E9ؽOwڥ] ~Z<#$*/ dL!67;߽Or_^ BvuCСsүW#_NS*8i2I}M+."Ʀ!/>x,m 稝|rQ.jwxRvܞ#w'x,y?x_ q|lin].v6+d=v{e4ڷJտwzF-%Ou0ףtY -?"z|mO room@+ IENDB`yubikey-personalization-gui-3.1.23/resources/images/clipboard.png0000664000175000017500000000120412603205714023653 0ustar klasklasPNG  IHDR sBIT|d pHYs  ~tEXtCreation Time04/11/08atEXtSoftwareAdobe Fireworks CS4ӠIDAT81SA\!!Ia!$6]@ʏJk{-A9,RD6lLffYϵ.`._ZU ڏ(#`9=xt-_^ҩ*T}K_5z z!X^RR[88KMt: ޏ>jت¹@`82=UUZNsj`.ABnIk-ZDZd247 !B*"sU97',w`F("K^:•';^mE羆K^;<9%QD0$E%tz9f ,."lKhH GQ\&4J׻8HlNE(to3x0Þe{e/ =[ [&gE 3nw/sK)p1,}H؈iIENDB`yubikey-personalization-gui-3.1.23/resources/images/blank.png0000664000175000017500000000011612603205714023004 0ustar klasklasPNG  IHDR IDATxc``Q0 T2IENDB`yubikey-personalization-gui-3.1.23/resources/images/V2-0-2-1-animated.mng0000664000175000017500000002733412603205714024426 0ustar klasklasMNG  MHDR9d l TERM,sRGB pHYsHHFk>BACK)bKGD X FRAM,1(, IHDR91 PLTE,/,̶ʵE9ůxcONLѼss+ɳíx]ƶq4)͹ptjsrM)㓖Ыr]˶<2+"Ӿ*K@hgϺsz[ ƫͷ[J{'ʾvgóQCcQruw {XT տ"DzMP*:B[a e\jm ͹ímYdg  ͻ`M$& ԼֿIJμiTRUFͶҺǯr{aT ­mr [U˲ϻ© ůZL UI85SJ QC ѾGQǯl] Ӫ #! ϽndY Ġεʨ §^WFJEϿū˶\YUê;;7iq YcH ߻ū˹¿ʰ2*DZǵɯ gT ҷÿ+0Ӽp\ADAβeY͵bg1ǵXFDQ1; DZűdzŰɳDZdzɵϻųų˷ ͷ#z|_V!ȴw}qtRNSm7 IDATXřkgDž sȭ=b A a fDzQ|P  LK 5l),KOn{>؞q7b˾o>gޙT.Q?qo/~z'0%ѧWcmmtr\~z+ֿ,k"c%G;3U]*8<8 x"±% #8/Ƨb,VxS82LgW*uO@ttս+qgP!: \ Q yRp0*G/W'YPeYPbʛ<_&0[\PTejfH^G%R d>*Z"ƬEqDcZY5J%;ɢJLn,,/gqh I+SY"#N sz`?+Ge2 nd+%?#y|Hvf4g~V"%!Ep5Zd+dX[Uŗʧ2Z 5Y Kht&K=u صu`k!*>[ rZZLuj`V|qhFZ&]_?!B-A$#GQZ>f'dUJm-UIZw PfQϡC*z-'[Z`1PGj'E+lDdBRP W턒PuS&F$UX$əԤO\dJU/jK:܆A԰+`d7׊R07|yqxIj tBTy3#mIKRDN|U2s- ēmBTZ+Ԡ ;H+Yaoja/޻2cNT$mZ!8eowvv(xwD FEXs@VAffcʹ <M[U+gVQC/2h\n1$+PH8fm(Q YX۴A]]Ǯ;K ≂y~>AlEZ- xV ҢԈev+sSD$R)5)i#}L9;eM%kE'']9uDEROyp U$es'bks&)fʤ tu)ky3t0Y_*iKVq1Vb' ǖɯHZf^$co/ia; tkn$X/jqYiz@d/䞡JONjeNH#jF~}KIYn{@K5sP}.dBgW r?QrX'4,@,]=Sprއrk]מ^ZH$|nԇTm}ɰmaw.ug]ByZ-%ﺭ9n Yw?|[6Aaw7,6վ1YR?ZN~sZ3δ3l~ZM &f1w5hFD% )bO͍VsgIl8f6s6?%5ө[ig73p)δiv-хSTǻX jvjZ9-&OF$;jgwnnF>5H6x6zh8NlYOV|Ԃ?4taNqk/BW``4xcȵwxW QK"tq4wCn,&RO{>N^|r:UFgg|gWc?-O>o-'o}!HqIENDB`FRAM IHDR98IDATxIeuq3k议ꪞҢH%ʤM0l0 ^hiomw^ho0 ˦ũEʪ_;!+3ق 2߻ވ9qΉsNS{_/W݁3*ٓn(I;D λ=~2Q*"Z]hpYju}<㣅*/S+mH .PQܑds]A!;%;orsh=DXUdvw 0-u߮ !0oY38[4/E@ƭ"ppW^wڒէ4%d`:BliUci^D^P %DrKA%Yk wիYsXD)F'lӭT֛piOjfߙ I]LD%P:"HZ@cJDw\48tnolZ9bDab@>ڽB9D5A=H]ʩ! Dje}tI?Kamg.鬥XǖOs}!/ٛ";TC%jz.I/B,\~bgG1O񽷽s`oXu`C{q0׮sғՒm٤*VXvO?;~\Lqb6Ec52{͝~%W# \`ΔuLeOį-?M>X"pĕhXAAa)HW`1@kWNA2iCFC`UzI0d&нȠ yRQPK@[TpJEPxqX )<$:b;q]`sa"]vkaaY< dLbj=8[D (ĨjM%39P fYV֙sRTmh{8 sTR|.*%qk;2Kw:IͰ&A(SڡժQ2D|X8n xMfG*A:J-!o, MN3[lYJ3d[R(ap L'!@@tC*9T<1@ L^%%T]k.ii[vO.O] i`kTsHz:*"8iIsdC%kp@&[ IkРJ <f A'p纈nUz+\gQa{-37Zs i}WQMVM/}gGRRYaN\Yk|7+6m;KVG2 ZRJ:/x?g4*4͎oY/輝uFHv1h.%C,O6$쒙T7\ R(=pig!A1gYpqԿ!pOvxUoqJY$H;4A+z㯳c;r6s R̴b|bQP"B81e1%`eddH-Yc4UD8Jkm ^U1c eax]b!t/-6olY Z24ugy-)^U:+  g :1ܻ3np7Hɔ;\0{ě?=7a{k;hgMƜp?s( )KiAP|*Ly&sHɦ~2ehfK[iaJ+ >rtY+^ḷdKgIhv)X:Ҙe̵wsdJ{.Z- 4aH<.XDY)x7G_j? A~IG{#~hX0ucSTw< Mhvrޔ-0U󢞁y&V|1V2s["վaqmE1蓂b 7dTy6=. z}zM!OR@9|9PY5g7է弨C+Y 6auWTwbc]q8L蕌LޤgVh2:cu6H^C.+6M2Gl8{CUQ0!<:2zz}ϕk8:Aop+tGcr|r*uis8Ql>?Synu.~W*^{}.W+tVjzWɲl\kwmiL+KY!k9/ Җ lrV Fyײs]_r-5՝3uzrHO<ÂN:/pENg>s۫W^rwyWpu՝;r4,X jh7f )OoH{.;)N:cJnl뷷88U=\ݬa}+'˧ tE՜ӱg`l`Mբf3 +dѹ+vC^r#]^ɸwѿ?u:1Tb v3\^Δ 1SNg()7 dHP' rNUU礴q <W2:+A`MJK]ZZ#(Ah|H#KYTƔh74:kh'#)ѵ\᾵Mw?j@{S&e| ^' 7y WBeY5U6/.C\&YIw$RL f'v#w@kyL5g%gβ_w~x̽?=Cry d>ō3`}—(a4TBDZ,lJ &L~AWJwi1c0ݜ/4b1eaS2"Jۅ9y(L>*fͮ鳈ڬFΩst䀦4\ %Kvyv|nLoqЙ fY\MQqJشM)3y_B3 "R--)_]iÝbFD#"d1T/"-g+{dXэmYJI5OZyz-N2@T;W/s I] BtbL;em!Wm얆Nv CWlb`UsHޥ(Yѱ'Dn}1Bc78.T1t# h!⢌(E#}U. $ 7;̪S{Q2+T\֋AI#jn d\qY9ӵuݔDhYH`U;J*^3* "jSڹAFɓ )nf"*]JH7b1e\I;9! q uRSn0pIPe:n.2H:H9{D֩k]I# =/ $Xz:.Pf“:wܠک۔~*%H[Pq*]%T-BmK]c!35qiCZ9#7&Xډlh@oumFܔ6[P%$C0\L۬D%[YzGGD!J*nNl u>&\Oe5uٴ? u*=^=TVQMZ[H@6y]%il& EkГuzSZSMo:1;NEtC鱌(ts5Ơ6ǜO[Q@Y gM&U-*3ޥ5կ\f٦md@b'aj[6戲|Dǣyf¥9m(}gQh pO>d!p(ٲt޵V\ {bYꁠ ߇U%ZʎH&ݘ'M,1e9OMhq*C!>&tRv5*l3v%*"Uq8l=$015'sJzֶ-(ȜRL]] :Ga\pv*RKڐnn|o]XF-h org=/19Kau{?衭頉ށXDwYݺCoY.ꬣO/hLO 9{My?`ГLuk N>85@?^[8W,ل|_]TtkK7_WBQzڀ&Β<}EP+ot, o|~stslF'< yoq#?uY(ŀxg."5񔣇(JmrjIщUr2T,Nt#J4 jt)YAKRKԣ!L{u0NO)r0)v6F a< GAx]HzL(z5Pb*gҘ2#@ŀak(0  GƒkSWg)O=ρ譣 b/>,a E}-9Q @=yΩK`&cUI S(vx3 Sa:J=|X{u*=Hy8 8Q3*9X6>s.e@Sv4NƊt~7XOw/˃ a~:Vkv^ѱo ͖uKJUcxt @OC֦%gn\s7QV}y|PwX &Q-}aۦxO=;kapӐ뜃T_:bl8eZF<&ŴxNStm8*Zegr4)6+FEwuDm)(ܼvrkl~7;Fb_uI$Wn}c|*JJL,􀝵6Oe< :}EYNsrgvm<ؔ~z3-DDbj)䌵lɮQѢPb$E@, ^~5fvhT5AN1@SKխyL#0=Ōɮvj*lmӲh_Ϥy ǁ[Zdצ ɻ:RQ M&w5֓nk6OBfT(6uO⦳*ykg37?M7?ݜ Ll1¨UZF5܉\>7*wm¹5pxrh hcRD+%k0e+?޸O][Nw?\!:٘Cy-֫&3r:qxO2ȅnNT7!ϣc#PɂC_Bxꀠ">hX/ RcAY]nONeCVEQymT|/3uk3Xşb* K,l?Ŵ{ Mg 0h=ATJì<kF}}OOu{Ͽ_l2*YIK[D\s*2sU8M)Ř3^ʕg"WP=\a #include "common.h" class YubiKeyUtil { public: ~YubiKeyUtil(); static int hexModhexDecode (unsigned char *result, size_t *resultLen, const char *str, size_t strLen, size_t minSize, size_t maxSize, bool modhex); static int hexModhexEncode (char *result, size_t *resultLen, const unsigned char *str, size_t strLen, bool modhex); static QString qstrHexEncode (const unsigned char *str, size_t strLen); static void qstrHexDecode (unsigned char *result, size_t *resultLen, const QString &str); static QString qstrModhexEncode (const unsigned char *str, size_t strLen); static void qstrModhexDecode (unsigned char *result, size_t *resultLen, const QString &str); static void qstrDecDecode (unsigned char *result, size_t *resultLen, const QString &str); static void qstrToRaw (char *result, size_t resultLen, const QString &str); static void qstrClean (QString *str, size_t maxSize, bool reverse = false); static void qstrModhexClean (QString *str, size_t maxSize, bool reverse = false); static int generateRandom (unsigned char *result, size_t resultLen); static QString generateRandomHex (size_t resultLen); static QString generateRandomModhex( size_t resultLen); static QString getNextHex (size_t resultLen, const QString &str, int scheme); static QString getNextModhex( size_t resultLen, const QString &str, int scheme); }; #endif // YUBIKEYUTIL_H yubikey-personalization-gui-3.1.23/lib/yubikeyutil.cpp0000664000175000017500000002264212603205714021571 0ustar klasklas/* Copyright (C) 2011-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "yubikeyutil.h" #include #include #include #ifdef Q_OS_WIN #include "crandom.h" #endif YubiKeyUtil::~YubiKeyUtil() { } int YubiKeyUtil::hexModhexDecode(unsigned char *result, size_t *resultLen, const char *str, size_t strLen, size_t minSize, size_t maxSize, bool modhex) { if ((strLen % 2 != 0) || (strLen < minSize) || (strLen > maxSize)) { *resultLen = 0; return -1; } *resultLen = strLen / 2; if (modhex) { if (yubikey_modhex_p(str)) { yubikey_modhex_decode((char *)result, str, *resultLen); return 1; } } else { if (yubikey_hex_p(str)) { yubikey_hex_decode((char *)result, str, *resultLen); return 1; } } return 0; } int YubiKeyUtil::hexModhexEncode(char *result, size_t *resultLen, const unsigned char *str, size_t strLen, bool modhex) { *resultLen = strLen * 2; if (modhex) { yubikey_modhex_encode((char *)result, (char *)str, strLen); return 1; } else { yubikey_hex_encode((char *)result, (char *)str, strLen); return 1; } return 0; } QString YubiKeyUtil::qstrHexEncode(const unsigned char *str, size_t strLen) { char result[strLen * 2 + 1]; size_t resultLen; memset(&result, 0, sizeof(result)); int rc = hexModhexEncode(result, &resultLen, str, strLen, false); if(rc > 0) { qDebug() << "hex encoded string: " << QString(result) << sizeof(result); return QString::fromLocal8Bit(result); } return QString(""); } void YubiKeyUtil::qstrHexDecode(unsigned char *result, size_t *resultLen, const QString &str) { if(str.size() % 2 != 0) { return; } char hex[MAX_SIZE]; YubiKeyUtil::qstrToRaw(hex, sizeof(hex), str); size_t hexLen = strlen(hex); //Hex decode hexModhexDecode(result, resultLen, hex, hexLen, 0, MAX_SIZE, false); } QString YubiKeyUtil::qstrModhexEncode(const unsigned char *str, size_t strLen) { char result[strLen * 2 + 1]; size_t resultLen; memset(&result, 0, sizeof(result)); int rc = hexModhexEncode(result, &resultLen, str, strLen, true); if(rc > 0) { qDebug() << "modhex encoded string: " << QString(result) << sizeof(result); return QString::fromLocal8Bit(result); } return QString(""); } void YubiKeyUtil::qstrModhexDecode(unsigned char *result, size_t *resultLen, const QString &str) { if(str.size() % 2 != 0) { *resultLen = 0; return; } char modhex[MAX_SIZE]; YubiKeyUtil::qstrToRaw(modhex, sizeof(modhex), str); size_t modhexLen = strlen(modhex); //Hex decode hexModhexDecode(result, resultLen, modhex, modhexLen, 0, MAX_SIZE, true); } void YubiKeyUtil::qstrDecDecode(unsigned char *result, size_t *resultLen, const QString &str) { if(str.size() % 2 != 0) { *resultLen = 0; return; } *resultLen = str.size() / 2; for(size_t i = 0; i < *resultLen; i++) { unsigned char val = str.mid(i * 2, 2).toInt(); result[i] = ((val / 10) << 4) | (val % 10); } } void YubiKeyUtil::qstrToRaw(char *result, size_t resultLen, const QString &str) { QByteArray strByteArr = str.toLocal8Bit(); size_t strLen = strByteArr.size() + 1; strLen = (resultLen < strLen)? resultLen : strLen; memset(result, 0, strLen); strncpy(result, (char *) strByteArr.data(), strLen); } void YubiKeyUtil::qstrClean(QString *str, size_t maxSize, bool reverse) { *str = str->toLower(); QRegExp rx("[^0-9a-f]"); *str = str->replace(rx, QString("")); if(maxSize > 0) { if(reverse) { *str = str->rightJustified(maxSize, '0', true); } else { *str = str->leftJustified(maxSize, '0', true); } } } void YubiKeyUtil::qstrModhexClean(QString *str, size_t maxSize, bool reverse) { *str = str->toLower(); QRegExp rx("[^b-lnrt-v]"); *str = str->replace(rx, QString("")); if(maxSize > 0) { if(reverse) { *str = str->rightJustified(maxSize, 'c', true); } else { *str = str->leftJustified(maxSize, 'c', true); } } } int YubiKeyUtil::generateRandom(unsigned char *result, size_t resultLen) { size_t bufSize = resultLen; unsigned char buf[bufSize]; memset(&buf, 0, sizeof(buf)); size_t bufLen = 0; #ifdef Q_OS_WIN CRandom random; random.getRand(buf, bufSize); bufLen = sizeof(buf); #else const char *random_places[] = { "/dev/srandom", "/dev/urandom", "/dev/random", 0 }; const char **random_place; for (random_place = random_places; *random_place; random_place++) { FILE *random_file = fopen(*random_place, "r"); if (random_file) { size_t read_bytes = 0; while (read_bytes < bufSize) { size_t n = fread(&buf[read_bytes], 1, bufSize - read_bytes, random_file); read_bytes += n; } fclose(random_file); bufLen = sizeof(buf); break; /* from for loop */ } } #endif if(bufLen > 0) { memcpy(result, buf, bufLen); return 1; } return 0; } QString YubiKeyUtil::generateRandomHex(size_t resultLen) { QString result(""); if (resultLen % 2 != 0) { return result; } size_t bufSize = resultLen / 2; unsigned char buf[bufSize]; memset(&buf, 0, sizeof(buf)); if(generateRandom(buf, bufSize) > 0) { result = qstrHexEncode(buf, bufSize); } return result; } QString YubiKeyUtil::generateRandomModhex(size_t resultLen) { QString result(""); if (resultLen % 2 != 0) { return result; } size_t bufSize = resultLen / 2; unsigned char buf[bufSize]; memset(&buf, 0, sizeof(buf)); if(generateRandom(buf, bufSize) > 0) { result = qstrModhexEncode(buf, bufSize); } return result; } QString YubiKeyUtil::getNextHex(size_t resultLen, const QString &str, int scheme) { QString result(""); qDebug() << "str = " << str << " len = " << str.length(); switch(scheme) { case GEN_SCHEME_FIXED: result = str; break; case GEN_SCHEME_INCR: { //Hex clean QString hexStr(str); qstrClean(&hexStr, resultLen); //Hex decode unsigned char hexDecoded[MAX_SIZE]; size_t hexDecodedLen = 0; memset(&hexDecoded, 0, sizeof(hexDecoded)); qstrHexDecode(hexDecoded, &hexDecodedLen, hexStr); if(hexDecodedLen <= 0) { break; } qDebug() << "hexDecoded = " << QString((char*)hexDecoded) << " len = " << hexDecodedLen; //Increment for (int i = hexDecodedLen; i--; ) { if (++hexDecoded[i]) { break; } } //Hex encode result = qstrHexEncode(hexDecoded, hexDecodedLen); qDebug() << "hexEncoded = " << result << " len = " << result.size(); } break; case GEN_SCHEME_RAND: result = generateRandomHex(resultLen); break; } return result; } QString YubiKeyUtil::getNextModhex(size_t resultLen, const QString &str, int scheme) { unsigned char result[resultLen]; size_t len; QString hex; qstrModhexDecode(result, &len, str); if(len == 0) { return ""; } hex = qstrHexEncode(result, len); hex = getNextHex(resultLen, hex, scheme); qstrHexDecode(result, &len, hex); return qstrModhexEncode(result, len); } yubikey-personalization-gui-3.1.23/lib/us-scanedit.h0000664000175000017500000000271612603205714021076 0ustar klasklas/* Copyright (C) 2015 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef US_SCANEDIT_H #define US_SCANEDIT_H #include "scanedit.h" class UsScanEdit : public ScanEdit { public: UsScanEdit(); }; #endif // US_SCANEDIT_H yubikey-personalization-gui-3.1.23/lib/us-scanedit.cpp0000664000175000017500000001310012603205714021416 0ustar klasklas/* Copyright (C) 2015 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "us-scanedit.h" #define SHIFT 0x80 UsScanEdit::UsScanEdit() { keyMap = QMap(); keyMap[0x00] = 0; keyMap[0x01] = 0; keyMap[0x02] = 0; keyMap[0x03] = 0; keyMap[0x04] = 0; keyMap[0x05] = 0; keyMap[0x06] = 0; keyMap[0x07] = 0; keyMap[0x08] = 0; keyMap[0x09] = 0x2b; /* \t */ keyMap[0x0a] = 0x28; /* \n */ keyMap[0x0b] = 0; keyMap[0x0c] = 0; keyMap[0x0d] = 0; keyMap[0x0e] = 0; keyMap[0x0f] = 0; keyMap[0x10] = 0; keyMap[0x11] = 0; keyMap[0x12] = 0; keyMap[0x13] = 0; keyMap[0x14] = 0; keyMap[0x15] = 0; keyMap[0x16] = 0; keyMap[0x17] = 0; keyMap[0x18] = 0; keyMap[0x19] = 0; keyMap[0x1a] = 0; keyMap[0x1b] = 0; keyMap[0x1c] = 0; keyMap[0x1d] = 0; keyMap[0x1e] = 0; keyMap[0x1f] = 0; keyMap[0x20] = 0x2c; /* */ keyMap[0x21] = 0x1e | SHIFT; /* ! */ keyMap[0x22] = 0x34 | SHIFT; /* " */ keyMap[0x23] = 0x20 | SHIFT; /* # */ keyMap[0x24] = 0x21 | SHIFT; /* $ */ keyMap[0x25] = 0x22 | SHIFT; /* % */ keyMap[0x26] = 0x24 | SHIFT; /* & */ keyMap[0x27] = 0x34; /* ' */ keyMap[0x28] = 0x26 | SHIFT; /* ( */ keyMap[0x29] = 0x27 | SHIFT; /* ) */ keyMap[0x2a] = 0x25 | SHIFT; /* * */ keyMap[0x2b] = 0x2e | SHIFT; /* + */ keyMap[0x2c] = 0x36; /* , */ keyMap[0x2d] = 0x2d; /* - */ keyMap[0x2e] = 0x37; /* . */ keyMap[0x2f] = 0x38; /* / */ keyMap[0x30] = 0x27; /* 0 */ keyMap[0x31] = 0x1e; /* 1 */ keyMap[0x32] = 0x1f; /* 2 */ keyMap[0x33] = 0x20; /* 3 */ keyMap[0x34] = 0x21; /* 4 */ keyMap[0x35] = 0x22; /* 5 */ keyMap[0x36] = 0x23; /* 6 */ keyMap[0x37] = 0x24; /* 7 */ keyMap[0x38] = 0x25; /* 8 */ keyMap[0x39] = 0x26; /* 9 */ keyMap[0x3a] = 0x33 | SHIFT; /* : */ keyMap[0x3b] = 0x33; /* ; */ keyMap[0x3c] = 0x36 | SHIFT; /* < */ keyMap[0x3d] = 0x2e; /* = */ keyMap[0x3e] = 0x37 | SHIFT; /* > */ keyMap[0x3f] = 0x38 | SHIFT; /* ? */ keyMap[0x40] = 0x1f | SHIFT; /* @ */ keyMap[0x41] = 0x04 | SHIFT; /* A */ keyMap[0x42] = 0x05 | SHIFT; /* B */ keyMap[0x43] = 0x06 | SHIFT; /* C */ keyMap[0x44] = 0x07 | SHIFT; /* D */ keyMap[0x45] = 0x08 | SHIFT; /* E */ keyMap[0x46] = 0x09 | SHIFT; /* F */ keyMap[0x47] = 0x0a | SHIFT; /* G */ keyMap[0x48] = 0x0b | SHIFT; /* H */ keyMap[0x49] = 0x0c | SHIFT; /* I */ keyMap[0x4a] = 0x0d | SHIFT; /* J */ keyMap[0x4b] = 0x0e | SHIFT; /* K */ keyMap[0x4c] = 0x0f | SHIFT; /* L */ keyMap[0x4d] = 0x10 | SHIFT; /* M */ keyMap[0x4e] = 0x11 | SHIFT; /* N */ keyMap[0x4f] = 0x12 | SHIFT; /* O */ keyMap[0x50] = 0x13 | SHIFT; /* P */ keyMap[0x51] = 0x14 | SHIFT; /* Q */ keyMap[0x52] = 0x15 | SHIFT; /* R */ keyMap[0x53] = 0x16 | SHIFT; /* S */ keyMap[0x54] = 0x17 | SHIFT; /* T */ keyMap[0x55] = 0x18 | SHIFT; /* U */ keyMap[0x56] = 0x19 | SHIFT; /* V */ keyMap[0x57] = 0x1a | SHIFT; /* W */ keyMap[0x58] = 0x1b | SHIFT; /* X */ keyMap[0x59] = 0x1c | SHIFT; /* Y */ keyMap[0x5a] = 0x1d | SHIFT; /* Z */ keyMap[0x5b] = 0x2f; /* [ */ keyMap[0x5c] = 0x32; /* \ */ keyMap[0x5d] = 0x30; /* ] */ keyMap[0x5e] = 0x23 | SHIFT; /* ^ */ keyMap[0x5f] = 0x2d | SHIFT; /* _ */ keyMap[0x60] = 0x35; /* ` */ keyMap[0x61] = 0x04; /* a */ keyMap[0x62] = 0x05; /* b */ keyMap[0x63] = 0x06; /* c */ keyMap[0x64] = 0x07; /* d */ keyMap[0x65] = 0x08; /* e */ keyMap[0x66] = 0x09; /* f */ keyMap[0x67] = 0x0a; /* g */ keyMap[0x68] = 0x0b; /* h */ keyMap[0x69] = 0x0c; /* i */ keyMap[0x6a] = 0x0d; /* j */ keyMap[0x6b] = 0x0e; /* k */ keyMap[0x6c] = 0x0f; /* l */ keyMap[0x6d] = 0x10; /* m */ keyMap[0x6e] = 0x11; /* n */ keyMap[0x6f] = 0x12; /* o */ keyMap[0x70] = 0x13; /* p */ keyMap[0x71] = 0x14; /* q */ keyMap[0x72] = 0x15; /* r */ keyMap[0x73] = 0x16; /* s */ keyMap[0x74] = 0x17; /* t */ keyMap[0x75] = 0x18; /* u */ keyMap[0x76] = 0x19; /* v */ keyMap[0x77] = 0x1a; /* w */ keyMap[0x78] = 0x1b; /* x */ keyMap[0x79] = 0x1c; /* y */ keyMap[0x7a] = 0x1d; /* z */ keyMap[0x7b] = 0x2f | SHIFT; /* { */ keyMap[0x7c] = 0x32 | SHIFT; /* | */ keyMap[0x7d] = 0x30 | SHIFT; /* } */ keyMap[0x7e] = 0x35 | SHIFT; /* ~ */ keyMap[0x7f] = 0; } yubikey-personalization-gui-3.1.23/lib/scanedit.h0000664000175000017500000000311012603205714020436 0ustar klasklas/* Copyright (C) 2015 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SCANEDIT_H #define SCANEDIT_H #include #include class ScanEdit { protected: QMap keyMap; ScanEdit(); public: QString textToScanCodes(const QString text); QString scanCodesToText(const QString scanCode); }; #endif // SCANEDIT_H yubikey-personalization-gui-3.1.23/lib/scanedit.cpp0000664000175000017500000000533412603205714021003 0ustar klasklas/* Copyright (C) 2011-2015 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "scanedit.h" #include "yubikeyutil.h" #include "common.h" #include ScanEdit::ScanEdit() { } QString ScanEdit::textToScanCodes(const QString text) { QString scanCode; for(int i = 0; i < text.length(); i++) { QChar ch = text.at(i); unsigned char code = 0; if(ch == '\\') { if(i + 1 != text.length()) { QChar next = text.at(i + 1); if(next == '\\') { i++; } else if(next == 't') { i++; ch = '\t'; } else if(next == 'n') { i++; ch = '\n'; } } } code = keyMap.value(ch.toLatin1() & 0xff, 0); if(code == 0) { qDebug() << "no mapping for" << ch; } QString hexTxt = YubiKeyUtil::qstrHexEncode(&code, 1); scanCode += hexTxt; } return scanCode; } QString ScanEdit::scanCodesToText(const QString scanCode) { QString text; for(int i = 0; i < scanCode.length(); i += 2) { bool ok; unsigned int code = scanCode.mid(i, 2).toUInt(&ok, 16); if(ok == true) { QString key; key += keyMap.key(code, 0); if(key == "\n") key = "\\n"; if(key == "\t") key = "\\t"; if(key == "\\") key = "\\\\"; text += key; } } return text; } yubikey-personalization-gui-3.1.23/lib/otpdef.h0000664000175000017500000000431712603205714020137 0ustar klasklas/* Copyright (C) 2011-2013 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef OTPDEF_H #define OTPDEF_H #define YUBICO_OTP_SERVER_PUBLIC_ID_PREFIX "vv" #define YUBICO_OTP_SERVER_PUBLIC_ID_SIZE 2 #define ACCESS_CODE_DEFAULT "000000000000" #define PUBLIC_ID_DEFAULT_SIZE 6 #define OATH_HOTP_PUBLIC_ID_SIZE 6 #define OATH_HOTP_OMP_SIZE 1 #define OATH_HOTP_TT_SIZE 1 #define OATH_HOTP_MUI_SIZE 4 #define MIN_CUSTOMER_PREFIX 1 #define MAX_CUSTOMER_PREFIX 99999 #define MAX_YUBICO_SERIAL 0x00ffffffUL #define MAX_OATH_SERIAL 99999UL #define OATH_HOTP_CUSTOMER_PREFIX_START 190 // openauthentication.org assigned manufacturer prefix #define YUBICO_OATH_MFG_PREFIX "e1" #define YUBICO_OMP_CODE 0xe1 // Modhex equivalent #define MAX_SCAN_EDIT_SIZE 38 #endif // OTPDEF_H yubikey-personalization-gui-3.1.23/lib/lib.pro0000664000175000017500000000307012603205714017770 0ustar klasklasTEMPLATE = lib CONFIG += exceptions staticlib !nosilent { CONFIG += silent } CONFIG(debug, debug|release) { message("Debug build") CONFIG += console no_lflags_merge warn_on DESTDIR = debug/ } else { message("Release build") DEFINES += QT_NO_DEBUG_OUTPUT DESTDIR = release/ } HEADERS += \ scanedit.h \ us-scanedit.h \ de-scanedit.h \ common.h \ otpdef.h \ yubikeyutil.h SOURCES += \ scanedit.cpp \ us-scanedit.cpp \ de-scanedit.cpp \ yubikeyutil.cpp QMAKE_CXXFLAGS += $$CXXFLAGS $$CPPFLAGS QMAKE_LFLAGS += $$LDFLAGS cross { message("Doing a cross platform build..") # pickup compiler from environment isEmpty(TARGET_ARCH) { error("Cross compiling without a target is completely invalid, set TARGET_ARCH") } QMAKE_CC = $${TARGET_ARCH}-gcc QMAKE_CXX = $${TARGET_ARCH}-g++ QMAKE_LINK = $$QMAKE_CXX QMAKE_LINK_C = $$QMAKE_CC win32 { QMAKE_LIB = $${TARGET_ARCH}-ar -ru QMAKE_RC = $${TARGET_ARCH}-windres $$quote(-DVERSION_WIN_STR=\'\\\"$${VERSION}\\0\\\"\') QMAKE_MOC = $$[QT_INSTALL_BINS]/moc QMAKE_UIC = $$[QT_INSTALL_BINS]/uic QMAKE_IDC = $$[QT_INSTALL_BINS]/idc QMAKE_RCC = $$[QT_INSTALL_BINS]/rcc QMAKE_LFLAGS += -static-libstdc++ -static-libgcc } } # # Windows specific configuration # win32 { HEADERS += crandom.h SOURCES += crandom.cpp INCLUDEPATH += ../libs/win32/include } macx:!force_pkgconfig { INCLUDEPATH += ../libs/macx/include CONFIG += x86_64 } yubikey-personalization-gui-3.1.23/lib/de-scanedit.h0000664000175000017500000000271612603205714021037 0ustar klasklas/* Copyright (C) 2015 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef DE_SCANEDIT_H #define DE_SCANEDIT_H #include "scanedit.h" class DeScanEdit : public ScanEdit { public: DeScanEdit(); }; #endif // DE_SCANEDIT_H yubikey-personalization-gui-3.1.23/lib/de-scanedit.cpp0000664000175000017500000001226012603205714021365 0ustar klasklas/* Copyright (C) 2015 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "de-scanedit.h" #define SHIFT 0x80 DeScanEdit::DeScanEdit() { keyMap = QMap(); keyMap[0x09] = 0x2b; /* \t */ keyMap[0x0a] = 0x28; /* \n */ keyMap[0x20] = 0x2c; /* */ keyMap[0x21] = 0x1e | SHIFT; /* ! */ keyMap[0x22] = 0x1f | SHIFT; /* " */ keyMap[0x23] = 0x32; /* # */ keyMap[0x24] = 0x21 | SHIFT; /* $ */ keyMap[0x25] = 0x22 | SHIFT; /* % */ keyMap[0x26] = 0x23 | SHIFT; /* & */ keyMap[0x27] = 0x32 | SHIFT; /* ' */ keyMap[0x28] = 0x25 | SHIFT; /* ( */ keyMap[0x29] = 0x26 | SHIFT; /* ) */ keyMap[0x2a] = 0x30 | SHIFT; /* * */ keyMap[0x2b] = 0x30; /* + */ keyMap[0x2c] = 0x36; /* , */ keyMap[0x2d] = 0x38; /* - */ keyMap[0x2e] = 0x37; /* . */ keyMap[0x2f] = 0x24 | SHIFT; /* / */ keyMap[0x30] = 0x27; /* 0 */ keyMap[0x31] = 0x1e; /* 1 */ keyMap[0x32] = 0x1f; /* 2 */ keyMap[0x33] = 0x20; /* 3 */ keyMap[0x34] = 0x21; /* 4 */ keyMap[0x35] = 0x22; /* 5 */ keyMap[0x36] = 0x23; /* 6 */ keyMap[0x37] = 0x24; /* 7 */ keyMap[0x38] = 0x25; /* 8 */ keyMap[0x39] = 0x26; /* 9 */ keyMap[0x3a] = 0x37 | SHIFT; /* : */ keyMap[0x3b] = 0x36 | SHIFT; /* ; */ keyMap[0x3c] = 0x64; /* < */ keyMap[0x3d] = 0x27 | SHIFT; /* = */ keyMap[0x3e] = 0x64 | SHIFT; /* > */ keyMap[0x3f] = 0x2d | SHIFT; /* ? */ keyMap[0x40] = 0; /* @ */ keyMap[0x41] = 0x04 | SHIFT; /* A */ keyMap[0x42] = 0x05 | SHIFT; /* B */ keyMap[0x43] = 0x06 | SHIFT; /* C */ keyMap[0x44] = 0x07 | SHIFT; /* D */ keyMap[0x45] = 0x08 | SHIFT; /* E */ keyMap[0x46] = 0x09 | SHIFT; /* F */ keyMap[0x47] = 0x0a | SHIFT; /* G */ keyMap[0x48] = 0x0b | SHIFT; /* H */ keyMap[0x49] = 0x0c | SHIFT; /* I */ keyMap[0x4a] = 0x0d | SHIFT; /* J */ keyMap[0x4b] = 0x0e | SHIFT; /* K */ keyMap[0x4c] = 0x0f | SHIFT; /* L */ keyMap[0x4d] = 0x10 | SHIFT; /* M */ keyMap[0x4e] = 0x11 | SHIFT; /* N */ keyMap[0x4f] = 0x12 | SHIFT; /* O */ keyMap[0x50] = 0x13 | SHIFT; /* P */ keyMap[0x51] = 0x14 | SHIFT; /* Q */ keyMap[0x52] = 0x15 | SHIFT; /* R */ keyMap[0x53] = 0x16 | SHIFT; /* S */ keyMap[0x54] = 0x17 | SHIFT; /* T */ keyMap[0x55] = 0x18 | SHIFT; /* U */ keyMap[0x56] = 0x19 | SHIFT; /* V */ keyMap[0x57] = 0x1a | SHIFT; /* W */ keyMap[0x58] = 0x1b | SHIFT; /* X */ keyMap[0x59] = 0x1d | SHIFT; /* Y */ keyMap[0x5a] = 0x1c | SHIFT; /* Z */ keyMap[0x5b] = 0; /* [ */ keyMap[0x5c] = 0; /* \ */ keyMap[0x5d] = 0; /* ] */ keyMap[0x5e] = 0x35; /* ^ */ keyMap[0x5f] = 0x38 | SHIFT; /* _ */ keyMap[0x60] = 0x2d | SHIFT; /* ` */ keyMap[0x61] = 0x04; /* a */ keyMap[0x62] = 0x05; /* b */ keyMap[0x63] = 0x06; /* c */ keyMap[0x64] = 0x07; /* d */ keyMap[0x65] = 0x08; /* e */ keyMap[0x66] = 0x09; /* f */ keyMap[0x67] = 0x0a; /* g */ keyMap[0x68] = 0x0b; /* h */ keyMap[0x69] = 0x0c; /* i */ keyMap[0x6a] = 0x0d; /* j */ keyMap[0x6b] = 0x0e; /* k */ keyMap[0x6c] = 0x0f; /* l */ keyMap[0x6d] = 0x10; /* m */ keyMap[0x6e] = 0x11; /* n */ keyMap[0x6f] = 0x12; /* o */ keyMap[0x70] = 0x13; /* p */ keyMap[0x71] = 0x14; /* q */ keyMap[0x72] = 0x15; /* r */ keyMap[0x73] = 0x16; /* s */ keyMap[0x74] = 0x17; /* t */ keyMap[0x75] = 0x18; /* u */ keyMap[0x76] = 0x19; /* v */ keyMap[0x77] = 0x1a; /* w */ keyMap[0x78] = 0x1b; /* x */ keyMap[0x79] = 0x1d; /* y */ keyMap[0x7a] = 0x1c; /* z */ keyMap[0x7b] = 0; /* { */ keyMap[0x7c] = 0; /* | */ keyMap[0x7d] = 0; /* } */ keyMap[0x7e] = 0; /* ~ */ keyMap[0xa7] = 0x20 | SHIFT; /* § */ keyMap[0xb4] = 0x2e; /* ´ */ keyMap[0xc4] = 0x34 | SHIFT; /* Ä */ keyMap[0xd6] = 0x33 | SHIFT; /* Ö */ keyMap[0xdc] = 0x2f | SHIFT; /* Ü */ keyMap[0xdf] = 0x2d; /* ß */ keyMap[0xe4] = 0x34; /* ä */ keyMap[0xf6] = 0x33; /* ö */ keyMap[0xfc] = 0x2f; /* ü */ } yubikey-personalization-gui-3.1.23/lib/crandom.h0000664000175000017500000000304212603205714020273 0ustar klasklas/* Copyright (C) 2011-2013 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef CRANDOM_H #define CRANDOM_H #include #include class CRandom { private: HCRYPTPROV m_crypt; public: CRandom(); ~CRandom(void); bool getRand(BYTE *buf, int size); }; #endif // CRANDOM_H yubikey-personalization-gui-3.1.23/lib/crandom.cpp0000664000175000017500000000335212603205714020632 0ustar klasklas/* Copyright (C) 2011-2013 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "crandom.h" CRandom::CRandom(void) { m_crypt = 0; if (!CryptAcquireContext(&m_crypt, 0, 0, PROV_RSA_FULL, 0)) if (!CryptAcquireContext(&m_crypt, 0, 0, PROV_RSA_FULL, CRYPT_NEWKEYSET)) m_crypt = 0; } CRandom::~CRandom(void) { if (m_crypt) CryptReleaseContext(m_crypt, 0); } bool CRandom::getRand(BYTE *buf, int size) { if (!m_crypt) return false; return CryptGenRandom(m_crypt, size, buf) != 0; } yubikey-personalization-gui-3.1.23/lib/common.h0000664000175000017500000002346212603205714020150 0ustar klasklas/* Copyright (C) 2011-2013 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef COMMON_H #define COMMON_H #include "otpdef.h" #define YK_VERSION(MAJOR, MINOR, BUILD) (MAJOR * 10000 + MINOR * 100 + BUILD) //typedef std::vector::size_type size_t; enum AccMode { Acc_None, Acc_Serial, Acc_Random, }; #define MAX_SIZE 256 #define SCHEME_INCR_ID_RAND_SECRET 0 #define SCHEME_RAND_SECRET 0 #define SCHEME_RAND_ALL 1 #define SCHEME_ID_FROM_SERIAL_RAND_SECRET 2 #define SCHEME_FIXED 2 #define GEN_SCHEME_FIXED 0 #define GEN_SCHEME_INCR 1 #define GEN_SCHEME_RAND 2 #define GEN_SCHEME_SERIAL 3 #define WRITE_CONFIG 0 #define EXPORT_CONFIG 1 #define SUPPORT_LINK "http://yubi.co/forum" #define UPLOAD_URL "upload

        serial:
        prefix:
        uid:
        aeskey:

        " #define ERR_NOERROR 0 #define ERR_OTHER 1 #define ERR_NOKEY 2 #define ERR_MORETHANONE 3 #define ERR_UNKNOWN_FIRMWARE 4 #define KEYMAP_NONE 0 #define KEYMAP_US 1 #define KEYMAP_DE 2 //Timeouts #define TIMEOUT_STATUS 10000 #define TIMEOUT_FINDER 1000 //Stylesheets #define SS_MENU_CHECKED "color:rgb(0,0,0);border:2px groove rgb(255,255,255);" #define SS_MENU_UNCHECKED "color:rgb(122,171,32);border:2px groove rgb(255,255,255);" #define SS_MENU_DISABLED "color:rgb(118,116,108);border:2px groove rgb(255,255,255);" #define SS_STATUS_SUCCESS "font:12px \"Verdana\";color:green;" #define SS_STATUS_ERROR "font:12px \"Verdana\";color:rgb(221,97,99);" #define SS_YKSTATUS_SUCCESS "font:11px \"Verdana\";font-weight:bold;color:rgb(122,171,32);" #define SS_YKSTATUS_ERROR "font:11px \"Verdana\";font-weight:bold;color:rgb(221, 97, 99);" #define SS_COPY_BTN "background-image: url(:/res/images/clipboard.png); border-radius: 2px;" #define SS_BLANK_BTN "background-image: url(:/res/images/blank.png); border-radius: 2px;" #define SS_LINK_ENABLED "font: 12px \"Verdana\"; text-decoration: underline; text-align: left; color: rgb(5, 67, 168);" #define SS_LINK_DISABLED "font: 12px \"Verdana\"; text-decoration: underline; text-align: left; color: rgb(118,116,108);" //Messages #define ERR "Error" #define NA "N/A" #define TOVERFLOW "Overflow" #define KEY_FOUND "YubiKey is inserted" #define NO_KEY_FOUND "No YubiKey inserted" #define MORE_THAN_ONE "More than one\nYubiKey inserted" #define OTHER_ERROR "Unknown error occurred" #define UNKNOWN_FIRMWARE "Unknown firmware" #define KEY_CONFIGURED "YubiKey%1 has been successfully configured" #define KEY_EXPORTED "YubiKey configuration has been successfully exported" #define REMOVE_KEY "Please remove this YubiKey" #define SETTINGS_SAVED "Settings have been successfully saved" #define SETTINGS_RESTORED "Default settings have been restored" #define VALUE_COPIED "Value copied to clipboard" #define ERR_KEY_NOT_FOUND "YubiKey not found. Please insert YubiKey in USB port" #define ERR_FEATURE_NOT_SUPPORTED "Selected configuration is not supported by the YubiKey being programmed" #define ERR_FIRMWARE_NOT_SUPPORTED "This YubiKey firmware version is not supported" #define ERR_PROCESSING "YubiKey could not be configured. Perhaps protected with configuration protection access code?" #define ERR_PROCESSING_CHALRESP "Challenge response could not be performed. Perhaps the YubiKey is not configured for challenge-response?" #define ERR_CONF_SLOT_NOT_SELECTED "No configuration slot selected. Please select the configuration slot to be programmed" #define ERR_CHAL_TYPE_NOT_SELECTED "No Challenge-Response Type selected. Please select the one to use" //Warnings #define OVERWRITE_CONF_SLOT1 "Overwrite configuration slot 1?" #define WARN_OVERWRITE_CONF_SLOT1 "If you have a YubiKey VIP, this slot should contain a Symantec VIP credential by default. You should refrain from rewriting this Slot as a Symantec VIP credential can only be programmed during manufacture - you will thus not be able to get a new one.\n\nIf you have any other YubiKey, this slot should contain a Yubico OTP credential by default. This credential is required for using the YubiKey with many of our services and that of our partners. If you overwrite this and want to use it again later, you will need to reprogram it and upload the new one to our YubiCloud validation service.\n\nAre you sure you want to overwrite the configuration slot 1?" #define RESTORE_SETTING "Restore default settings?" #define WARN_RESTORE_SETTING "Are you sure you want to restore the default settings?" #define WARN_EMPTY_PASS "No password set. Please set the password" #define DIFF_PUBLIC_ID_LEN "Change Public Identity length?" #define WARN_DIFF_PUBLIC_ID_LEN "Yubico OTP validation server requires Public Identity to be of 12 characters (6 bytes) in order to correctly extract the Secret Key. If you change the Public Identity to any other length, the Yubico OTP validation server won't be able to extract the Secret Key and the OTP validation will fail.\n\nAre you sure you want to change the default Public Idenity length?" #define ENABLE_CONF_PROTECTION "Enable configuration protection?" #define WARN_ENABLE_CONF_PROTECTION "YubiKey Personalization Tool logging is currently disabled. It is not possible to retrieve the configuration protection access code from the YubiKey. If protection access code is forgotten, you may not be able to program the YubiKey again. Yubico highly recommends to enable logging and archive the relevant log records. \n\nAre you sure you still want to enable the configuration protection?" #define NDEF_WITHOUT_HTTP "Write NDEF without HTTP?" #define WARN_NDEF_WITHOUT_HTTP "The NDEF URI entered does not start with http, are you sure that is what you want?" //Settings #define SG_CUSTOMER_PREFIX_USED "Customer/Used" #define SG_CUSTOMER_PREFIX "Customer/Prefix" #define SG_LOG_DISABLED "Log/Disabled" #define SG_LOG_FILENAME "Log/Filename" #define SG_LOG_FORMAT "Log/Format" #define SG_LOG_FLEXIBLE "Log/Flexible" #define SG_EXPORT_FILENAME "Export/Filename" #define SG_IMPORT_FILENAME "Import/Filename" #define SG_TAB_FIRST "Flag/TabTirst" #define SG_APPEND_TAB1 "Flag/AppendTab1" #define SG_APPEND_TAB2 "Flag/AppendTab2" #define SG_APPEND_CR "Flag/AppendCr" #define SG_APPEND_DELAY1 "Flag/AppendDelay1" #define SG_APPEND_DELAY2 "Flag/AppendDelay2" #define SG_SR_BTN_VISIBLE "Flag/SerialBtnVisible" #define SG_SR_USB_VISIBLE "Flag/serialUsbVisible" #define SG_SR_API_VISIBLE "Flag/serialApiVisible" #define SG_PACING_10MS "Flag/Pacing10ms" #define SG_PACING_20MS "Flag/Pacing20ms" #define SG_MAN_UPDATE "Flag/ManUpdate" #define SG_ALLOW_UPDATE "Flag/AllowUpdate" #define SG_FAST_TRIG "Flag/FastTrig" #define SG_USE_NUMERIC_KEYPAD "Flag/UseNumericKeypad" #define SG_LED_INVERT "Flag/LedInvert" #define SG_OATH_HOTP8 "Flag/OathHotp8" #define SG_REQUIRE_INPUT "Flag/RequireInput" #define SG_HMAC_LT64 "Flag/HmacLt64" #define SG_STRONG_PW1 "Flag/StrongPw1" #define SG_STRONG_PW2 "Flag/StrongPw2" #define SG_STRONG_PW3 "Flag/StrongPw3" #define SG_OVERWRITE_CONF_SLOT1 "DontAsk/Slot1Overwriting" #define SG_DIFF_PUBLIC_ID_LEN "DontAsk/PublicIdLen" #define SG_ENABLE_CONF_PROTECTION "DontAsk/ConfProtection" #define SG_NDEF_WITHOUT_HTTP "DontAsk/NdefWithoutHttp" #define SG_ANIMATIONS_PREFERENCE "Preference/Animations" #define SG_EXPORT_PREFERENCE "Preference/Export" #endif // COMMON_H yubikey-personalization-gui-3.1.23/installer/0000775000175000017500000000000012603205714017727 5ustar klasklasyubikey-personalization-gui-3.1.23/installer/win-nsis/0000775000175000017500000000000012603205714021476 5ustar klasklasyubikey-personalization-gui-3.1.23/installer/win-nsis/yubico_logo.bmp0000664000175000017500000040173012603205714024515 0ustar klasklasBM6(n  ۃݿ̛˛˛˛˛˛˛˛˛˛˛˛˛˛˛˛˚ˌ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚhֱ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚD̞<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚNϤ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚZҩ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚݾ޿<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚbԮ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^Ӭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚIΡ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚxڹ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚzۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚVѧ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚZҩ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚm׳<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚJΡ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚMϣ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ߱קѥЦѫӹtٷ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚk׳}ܼYҩ=ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ>˛^ӫܽݩҘʌÂݾ}ܼ{ۻ}ܼݿŠζל̇uڸ^ӬE̟=ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚB̝Xҩtٷ͸הzۺUѧ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚC̞hֱ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚG͠<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚK΢ۋÛ˛˛˛˛˛˛˛˛˛˛˛˛˛˛˛ˈۋÛ˛˛˛˛˛˛˛˛˛˛˛˛˛˛ˎįUѧ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚRХĜ̝̝̝̝̝̝̝̝̝̝̝̝̝̝̝̑ƮuڸJΡ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ=ʚXҩ\ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚD̞{ۻ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ=ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚtٷ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ=ʚQХ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚTѧ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ[Ҫ]ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚMϣ~ܼdկ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚIΡhֱ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚIΡE̟<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ>˛yۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚܽ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚIΡ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫxڹ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚQХTЦ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚݾ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚK΢yۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚXѨNϤ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚeկ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫl׳<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ_Ԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚhֱ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚܽyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ>ʛ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚtٷ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ\ӫQХ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚNϣ{ۻ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫOϤ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ}ܼ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ>ʛ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚݾG͠<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚو<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ^Ӭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚl׳<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚH͠{ۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ>˛?˜<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ[Ҫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸhֱ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ~ܼ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ~ܼ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚTѧ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚNϣ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚTЦ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚܽ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫD̞<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚA˝H͠G͠>˛<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚnش<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ>˛rٶ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ>˛D̞G͠G͠A˝<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫxڹ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚA˝jֲݾÐƏʼnݾjֲD̞<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸrٶ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚJΡnش<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚQХ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚTЦ~ܼwڸG͠<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚUѧkײ?˜<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚA˝wڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚiֱ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚUѧ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚWѨ¬Զٻؙܻܳk׳F͟<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ|ۻC̞<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚOϤD̞<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ]ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ_Ԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚXѨ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚsٷIΡ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ{ۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚXѨ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚcծ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚcծ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ|ۻ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚOϤ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚXҩ<ʚ<ʚ<ʚ<ʚ<ʚwڸvڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚIΡ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚݾ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ޿<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ|ۻ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚܼ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ\ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚA˜<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚnش<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚF͟zۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚfհ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ>ʛ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚݾ<ʚ<ʚ<ʚuڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ[Ҫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚOϤ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ[Ҫfհ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚݾzۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫWѨ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚJΡ<ʚ<ʚݿ|ۻ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚTЦ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚZҩ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚbԮ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚsٷ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ}ܼ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚH͠<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚE̟H͠<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚrٶaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚZҩ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚC̞<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^Ӭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚoص<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚMϣyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚSЦ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫxڹ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚݾ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚSЦ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚTЦB̝<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚkײyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ[Ҫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚkײ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚG͠Vѧ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚPϤaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚvڸyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫG͠<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚpص<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚݾ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚgְ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ{ۻ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚݾyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚݾ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚXҩQХ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚA˜<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚhֱaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚiֱ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚxڹA˝<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚNϤ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚRХbԮ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚA˜<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ\ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚZҩ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚE̟<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚK΢<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚTѧ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^Ӭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚG͠aԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚYҩ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚMϣ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚcծ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ}ܼpص<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ`ԭk׳<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^Ӭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚJΡ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚdկ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚzۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚgְaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^Ӭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚJΡ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ~ܼ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚA˜<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚXѨ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚK΢<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ]ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚUѧ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚuڸoص<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚIΡ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚNϤ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ~ܼ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚXѨ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚE̟aԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ@˜<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚUѧ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚeկD̞<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚK΢<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚrٶ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚL΢G͠<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ[Ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ@˜<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚA˜Vѧ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚzۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚcծaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚhֱ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫPϤ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚtٷ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚtٷ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚxڹ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫeկ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ]ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ=ʚXҩ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚZҩK΢<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ~ܼaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ{ۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ[Ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚݾ=ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚXѨ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚD̞aԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚVѧ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚTЦ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚuٷvڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ>˛<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚzۺNϤ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ|ۻ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚvڸRХ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚZҩaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ|ۻ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚD̞<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫk׳<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚzۺ<ʚ<ʚvڸݾ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚA˜<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚcծ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚRХ^ӫ<ʚ<ʚ<ʚvڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚF͟<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚUѧ[Ҫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚG͠<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚܽaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚl׳<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚݿ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚuڸD̞<ʚ<ʚ<ʚ<ʚwڸA˜<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚK΢<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ_Ԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ[Ҫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫݾ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸܽ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ|ۻ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚxڹ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚܼ{ۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ>ʛ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚgְG͠<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚNϤ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚk׳@˜<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚbԮ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚQХaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚgְK΢<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ{ۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚC̞RХ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸiֱ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚL΢<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚiֱ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚMϣnشǩҬԫӡ~ܼWѨ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ@˜<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚB̝uٷ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ\ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚtٷ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚuٷaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚNϣ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚF͟aԭrٶ{ۺܼ|ۻuٷhֱTЦ=ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸݾ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚK΢}ܼوZҩ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚnش=ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫk׳<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸA˝<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚl׳<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚOϤ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫPϤ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ]ӫF͟<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ@˜<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚTЦaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚC̞<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚܽD̞<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚfհ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ{ۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ`ԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚݾ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚk׳aԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸsٷ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚXҩ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚqصnش<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫNϣ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸvڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚG͠<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ|ۻ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫuڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚvڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚF͟G͠<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚK΢aԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ>˛<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫD̞<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚuٷD̞<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚqص<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚgְ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫ>˛<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚPϤ~ܼ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚD̞m׳<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ[Ҫ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭaԭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚyۺ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚYҩ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚNϤ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^ӫD̞<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚtٷgְ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ=ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚD̞<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ^Ӭ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚYҩ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚD̞<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ[Ҫxڹ>˛<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚoصݾ?˜<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚWѨ¢ϠΠΠΠΠΠΠΠΠΠΠΠΠΠΠΠΒǷǟ͠ΠΠΠΠΠΠΠΠΠΠΠΠΠΠ΢ϊהȠΠΠΠΠΠΠΠΠΠΠΠΠΠΠΠΏݑƠΠΠΠΠΠΠΠΠΠΠΠΠΠΠΠΏwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚvڸG͠<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚaԭƟ͠ΠΠΠΠΠΠΠΠΠΠΠΠΠΠΕȰ݅eկE̟<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ>ʛ[Ӫ|ۻvڸPϤ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ>˛^Ӭwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚqصYҩMϣC̞<ʚ<ʚ>ʛG͠SЦbԮµ֕oص^ӬTѧK΢C̞=ʚ<ʚ<ʚ@˜G͠OϤYҩeկݾѾՈbԮRХA˜<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚH͠Xҩoص̼wڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ߼ܹۺ۾wڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚK΢<ʚB̝B̝B̝B̝B̝B̝B̝B̝B̝B̝B̝B̝B̝B̝B̝B̝A˜<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚE̟<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚE̟<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚE̟<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚE̟<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚE̟<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚE̟<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚE̟<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚE̟<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚE̟<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚE̟<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚE̟<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚwڸ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚE̟<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚtٷ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚE̟<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ<ʚ܍ĝ̝̝̝̝̝̝̝̝̝̝̝̝̝̝̝̌ϕȝ̝̝̝̝̝̝̝̝̝̝̝̝̝̝̝̜̎yubikey-personalization-gui-3.1.23/installer/win-nsis/ykpers.nsi0000664000175000017500000001324612603205714023534 0ustar klasklas!include "MUI.nsh" ; The name of the installer Name "YubiKey Personalization Tool" ; The file to write OutFile "../../build/release/yubikey-personalization-gui-${YKPERS_VERSION}.exe" ; The default installation directory InstallDir "$PROGRAMFILES\Yubico\YubiKey Personalization Tool" ; Registry key to check for directory (so if you install again, it will ; overwrite the old one automatically) InstallDirRegKey HKLM "Software\Yubico\yubikey-personalization-gui" "Install_Dir" SetCompressor /SOLID lzma ShowInstDetails show Var MUI_TEMP Var STARTMENU_FOLDER Function .onInit # Display splash image. InitPluginsDir File /oname=$PLUGINSDIR\splash.bmp "yubico_logo.bmp" advsplash::show 1000 600 400 0x04025C $PLUGINSDIR\splash Pop $0 Delete $PLUGINSDIR\splash.bmp FunctionEnd ;Interface Settings !define MUI_ABORTWARNING ;-------------------------------- ; Pages !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_DIRECTORY ;Start Menu Folder Page Configuration !define MUI_STARTMENUPAGE_DEFAULTFOLDER "Yubico\YubiKey Personalization Tool" !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU" !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\Yubico\YubiKey Personalization Tool" !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES ;Languages !insertmacro MUI_LANGUAGE "English" ;-------------------------------- Section "YubiKey Personalization Tool" SectionIn RO SetOutPath $INSTDIR FILE ../../build/release/yubikey-personalization-gui.exe FILE ../../build/release/libjson-c-2.dll FILE ../../build/release/libyubikey-0.dll FILE ../../build/release/libykpers-1-1.dll FILE ../../build/release/Qt5Core.dll FILE ../../build/release/Qt5Gui.dll FILE ../../build/release/Qt5Widgets.dll FILE ../../build/release/libgcc_s_dw2-1.dll FILE ../../build/release/libwinpthread-1.dll FILE ../../build/release/libstdc++-6.dll FILE ../../build/release/icuin52.dll FILE ../../build/release/icuuc52.dll FILE ../../build/release/icudt52.dll SetOutPath $INSTDIR\licenses FILE /r ../../build/release/licenses/ SetOutPath $INSTDIR\imageformats FILE ../../build/release/qmng.dll SetOutPath $INSTDIR\accessible FILE ../../build/release/qtaccessiblewidgets.dll SetOutPath $INSTDIR\platforms FILE ../../build/release/qwindows.dll SectionEnd Var MYTMP # Last section is a hidden one. Section WriteUninstaller "$INSTDIR\uninstall.exe" ; Write the installation path into the registry WriteRegStr HKLM "Software\Yubico\yubikey-personalization-gui" "Install_Dir" "$INSTDIR" # Windows Add/Remove Programs support StrCpy $MYTMP "Software\Microsoft\Windows\CurrentVersion\Uninstall\yubikey-personalization-gui" WriteRegStr HKLM $MYTMP "DisplayName" "YubiKey Personalization Tool" WriteRegExpandStr HKLM $MYTMP "UninstallString" '"$INSTDIR\uninstall.exe"' WriteRegExpandStr HKLM $MYTMP "InstallLocation" "$INSTDIR" WriteRegStr HKLM $MYTMP "DisplayVersion" "${YKPERS_VERSION}" WriteRegStr HKLM $MYTMP "Publisher" "Yubico AB" WriteRegStr HKLM $MYTMP "URLInfoAbout" "http://www.yubico.com" WriteRegDWORD HKLM $MYTMP "NoModify" "1" WriteRegDWORD HKLM $MYTMP "NoRepair" "1" !insertmacro MUI_STARTMENU_WRITE_BEGIN Application ;Create shortcuts SetShellVarContext all SetOutPath "$SMPROGRAMS\$STARTMENU_FOLDER" CreateShortCut "YubiKey Personalization Tool.lnk" "$INSTDIR\yubikey-personalization-gui.exe" "" "$INSTDIR\yubikey-personalization-gui.exe" 0 CreateShortCut "Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 1 WriteINIStr "$SMPROGRAMS\$STARTMENU_FOLDER\Yubico Web page.url" \ "InternetShortcut" "URL" "http://www.yubico.com/" !insertmacro MUI_STARTMENU_WRITE_END SectionEnd ; Uninstaller Section "Uninstall" ; Remove registry keys DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\yubikey-personalization-gui" DeleteRegKey HKLM "Software\Yubico\yubikey-personalization-gui" DELETE "$INSTDIR\yubikey-personalization-gui.exe" DELETE "$INSTDIR\libjson-c-2.dll" DELETE "$INSTDIR\libyubikey-0.dll" DELETE "$INSTDIR\libykpers-1-1.dll" DELETE "$INSTDIR\Qt5Core.dll" DELETE "$INSTDIR\Qt5Gui.dll" DELETE "$INSTDIR\Qt5Widgets.dll" DELETE "$INSTDIR\libgcc_s_dw2-1.dll" DELETE "$INSTDIR\libwinpthread-1.dll" DELETE "$INSTDIR\libstdc++-6.dll" DELETE "$INSTDIR\icuin52.dll" DELETE "$INSTDIR\icuuc52.dll" DELETE "$INSTDIR\icudt52.dll" DELETE "$INSTDIR\licenses\*" DELETE "$INSTDIR\imageformats\qmng.dll" DELETE "$INSTDIR\accessible\qtaccessiblewidgets.dll" DELETE "$INSTDIR\platforms\qwindows.dll" RMDir "$INSTDIR\licenses" RMDir "$INSTDIR\imageformats" RMDir "$INSTDIR\accessible" RMDir "$INSTDIR\platforms" ; Remove uninstaller Delete $INSTDIR\uninstall.exe ; Remove shortcuts, if any !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP SetShellVarContext all Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk" Delete "$SMPROGRAMS\$MUI_TEMP\Yubico Web page.url" Delete "$SMPROGRAMS\$MUI_TEMP\YubiKey Personalization Tool.lnk" ;Delete empty start menu parent diretories StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP" startMenuDeleteLoop: ClearErrors RMDir $MUI_TEMP GetFullPathName $MUI_TEMP "$MUI_TEMP\.." IfErrors startMenuDeleteLoopDone StrCmp $MUI_TEMP $SMPROGRAMS startMenuDeleteLoopDone startMenuDeleteLoop startMenuDeleteLoopDone: DeleteRegKey /ifempty HKCU "Software\Yubico\yubikey-personalization-gui" ; Remove directories used RMDir "$INSTDIR" SectionEnd yubikey-personalization-gui-3.1.23/do-source-release.sh0000775000175000017500000000261712603205714021615 0ustar klasklas#!/bin/sh set -e VERSION=$1 PGP_KEYID=$2 if [ "x$PGP_KEYID" = "x" ]; then echo "try with $0 VERSION PGP_KEYID" echo "example: $0 3.0.4 9D1C0E79" exit fi if ! head -3 NEWS | grep -q "Version $VERSION .released `date -I`"; then echo "You need to update date/version in NEWS" exit fi if ! head -10 src/src.pro | grep -q "VERSION_MAJOR.*= `echo $VERSION | cut -d. -f1`"; then echo "You need to update version in src/src.pro" exit fi if ! head -10 src/src.pro | grep -q "VERSION_MINOR.*= `echo $VERSION | cut -d. -f2`"; then echo "You need to update version in src/src.pro" exit fi if ! head -10 src/src.pro | grep -q "VERSION_BUILD.*= `echo $VERSION | cut -d. -f3`"; then echo "You need to update version in src/src.pro" exit fi if [ "x$YUBICO_GITHUB_REPO" = "x" ]; then echo "you need to define YUBICO_GITHUB_REPO" exit fi releasename=yubikey-personalization-gui-${VERSION} git push git tag -u ${PGP_KEYID}! -m $VERSION $releasename git push --tags tmpdir=`mktemp -d /tmp/release.XXXXXX` releasedir=${tmpdir}/${releasename} mkdir -p $releasedir git archive $releasename --format=tar | tar -xC $releasedir git2cl > $releasedir/ChangeLog tar -cz --directory=$tmpdir --file=${releasename}.tar.gz $releasename gpg --detach-sign --default-key $PGP_KEYID ${releasename}.tar.gz $YUBICO_GITHUB_REPO/publish yubikey-personalization-gui $VERSION ${releasename}.tar.gz* rm -rf $tmpdir rm -rf $stagedir yubikey-personalization-gui-3.1.23/YKPersonalization.pro0000664000175000017500000000025012603205714022076 0ustar klasklasTEMPLATE = subdirs CONFIG += ordered SUBDIRS = \ lib \ src \ tests src.depends = lib tests.depends = lib QMAKE_CLEAN += src/Makefile tests/Makefile lib/Makefile yubikey-personalization-gui-3.1.23/README.binary_dists0000664000175000017500000000117612603205714021310 0ustar klasklasThese are good-to-have qmake invocations for windows and osx binary distributions: windows cross compiled with installer and signed binaries: $ TARGET_ARCH=i686-w64-mingw32 QTDIR=$win_qt_location SPC_FILE=$spc_file PVK_FILE=$pvk_file qmake -spec win32-g++-4.6 "CONFIG+= cross build_installer sign_binaries" os x native compile with installer and signed binaries: $ qmake -spec macx-llvm "CONFIG += build_installer release" os x cross compiled, just application: TARGET_ARCH=x86_64-apple-darwin11 OSX_SDK=$sdk_location QT_LIBDIR=$qt_library_frameworks_location QT_PLUGINDIR=$qt_plugins_location qmake -spec macx-g++42 "CONFIG += cross" yubikey-personalization-gui-3.1.23/README.adoc0000777000175000017500000000000012603205714020372 2READMEustar klasklasyubikey-personalization-gui-3.1.23/README0000664000175000017500000000766612603205714016631 0ustar klasklasQt based Cross-Platform YubiKey Personalization Tool ==================================================== See the file COPYING for copyright and license statement. Introduction ------------ The YubiKey Personalization Tool is a Qt based Cross-Platform utility designed to facilitate re-configuration of YubiKeys on Windows, Linux and Mac platforms. The tool provides a same simple step-by-step approach to make configuration of YubiKeys easy to follow and understand, while still being powerful enough to exploit all functionality both of the YubiKey 1 and YubiKey 2 generation of keys. The tool provides the same functionality and user interface on Windows, Linux and Mac platforms. The Cross-Platform YubiKey Personalization Tool provides the following main functions: * Programming the YubiKey in "Yubico OTP" mode * Programming the YubiKey in "OATH-HOTP" mode * Programming the YubiKey in "Static Password" mode * Programming the YubiKey in "Challenge-Response" mode * Programming the NDEF feature of the YubiKey NEO * Testing the challenge-response functionality of a YubiKey * Deleting the configuration of a YubiKey * Checking type and firmware version of the YubiKey Building from Git ----------------- You may check out the sources using Git with the following command: ----------- $ git clone git://github.com/Yubico/yubikey-personalization-gui.git ----------- This will create a directory 'yubikey-personalization-gui'. Enter the directory: ----------- $ cd yubikey-personalization-gui ----------- Dependencies ------------ yubikey-personalization-gui depends on version 1.14.0 or higher of libykpers. When building on Windows and mac you will need a binary build of https://developers.yubico.com/yubikey-personalization[yubikey-personalization], the contents should then be places in libs/win32, libs/win64 and libs/macx respectively. For building on linux pkg-config is used to find these dependencies. ----------- $ sudo apt-get install libusb-1.0-0-dev qt4-qmake libykpers-1-dev \ libyubikey-dev libqt4-dev ----------- Command-line build ------------------ Run these commands: ----------- $ qmake && make ----------- Cross Compiling from Linux -------------------------- The project can be cross compiled from linux for OS X and Windows. As a first step you need a cross-compiler chain for that OS, for windows you want mingw-w64. Then you need unpacked http://qt-project.org[Qt binaries] for that platform. You can then do (for Windows): TARGET_ARCH=i686-w64-mingw32 QTDIR= qmake \ -spec win32-g++-4.6 "CONFIG+=cross" To build installers you can add build_installer to the CONFIG variable for qmake. This requires makensis to be in path for windows and genisoimage and dmg (from libhfs-dmg) for Mac. Opening the project in Qt designer ---------------------------------- Locate the qtcreator executable file and click on it to open the Qt Designer. To open the project in Qt Designer, select 'File' > 'Open File or Project' from the tool bar, navigate to the project folder, select YKPersonalisation.pro file and click on the 'Open' button. To set the path of the 'Build' diractory select 'Projects' > 'Build Settings' Browse project folder path. Building -------- To generate the build system, select 'Build' > "Clean Project YKPersonalization" option from the tool bar. Then select 'Build' > 'Run qmake' option from the tool bar. To build the project, select 'Build' > 'Build Project YKPersonalization' option from the tool bar. Based on your platform, the successful build will create a 'YubiKey Personalization Tool' executable file into the respective build folder. The build creates a `YKPersonalization.exe` file on Windows, `YubiKey Personalization Tool.sh` file on Linux and `YubiKey Personalization Tool.app` file on Mac. Example on Linux: To run the YubiKey Personalization Tool, open the command shell and execute the following command: [source, sh] ----------- $ build/release/yubikey-personalization-gui ----------- yubikey-personalization-gui-3.1.23/NEWS0000664000175000017500000001420012603205714016426 0ustar klasklasyubikey-personalization-gui NEWS -- History of user-visible changes. -*- outline -*- * Version 3.1.23 (released 2015-10-01) ** Fix a bug that caused a crash on selecting keyboard layout. * Version 3.1.22 (released 2015-09-25) ** Fix so version detection works correctly for versions with more than one digit. ** Add german keyboard layout. ** Fixup neo-n picture * Version 3.1.21 (released 2015-05-29) ** Fix a bug where decode functions where given src length instead of result. ** Fix an issue where test cases where installed by default. ** Update pictures. * Version 3.1.20 (released 2015-04-01) ** Some new pictures. ** Add some simplistic unit tests. ** Fix bug with translation of | in scancode to text. * Version 3.1.19 (released 2015-03-13) ** Remove build timestamp. ** Add picture of Neo-N * Version 3.1.18 (released 2014-11-28) ** Image and correct features for plus. * Version 3.1.17 (released 2014-10-30) ** Fixup the Yubico logformat so accesscode is padded out with 0 ** Make texts translatable. ** Include the accessibility plugin in bundles. ** Show U2F as a feature. ** Switch the mac bundle to qt5. * Version 3.1.16 (released 2014-09-16) ** Fix bug where no random numbers where generated on windows. * Version 3.1.15 (released 2014-09-11) ** Add logging output format PSKC. ** Force selection of keyboard layout before programing scancode mode. ** Text changes. ** New picture for YubiKey 3.3. * Version 3.1.14 (released 2014-01-10) ** Fix layout of the confirmbox window. * Version 3.1.13 (released 2014-01-10) ** Add a diagnostics view by right-clicking the Yubico logo shows a window with info about what's happening. ** Make the help window non-modal so it can be open while interacting with the interface. ** Change the NDEF-URL placeholder to a default string. * Version 3.1.12 (released 2013-12-30) ** Text fixes. * Version 3.1.11 (released 2013-10-09) ** Make sure there is no extra box shown around import on tools page. ** Show correct error when there's more than one key detected. ** Support for building and using qt5. ** Allow writing of a YubiKey with unknown firmware. ** Recheck the key properly after regaining focus, might be a new key. ** Add a "flexible" logging scheme, possible to be configured from the GUI. * Version 3.1.10 (released 2013-07-04) ** Add import page under tools for importing ycfg. ** Minor UI fixes. ** Fix for crash on scan-code entry. ** Fix for crash on the number-converter. ** Add serial-number checkbox for access code entry. * Version 3.1.9 (released 2013-04-22) ** Add experimental export support to ycfg-json format. ** Always ask what file to log to when saving configuration. ** Rework build-system to never compile-in libykpers and libyubikey. * Version 3.1.8 (released 2013-03-18) ** Fix programming of OATH MUI Identifier was never added to the token, broken since release 3.1.3. * Version 3.1.7 (released 2013-03-14) ** Try to make some version dependencies in the GUI clearer. ** Change around the "Upload to Yubico" feature: It used to spawn a web browser with a standard URL with all fields, instead write down a html page with a self-submitting POST form to a temp directory and point the web browser at that. ** Fixup entering of OATH MUI. ** Add support for new YubiKey feature: Inversed LED, appearing in firmware 2.4 and 3.1. * Version 3.1.6 (released 2013-02-21) ** Only lock the key when window has focus. ** Fix OATH configuration for 2.1 keys. ** Make the override box on the http warning for NDEF work. * Version 3.1.5 (released 2013-01-10) ** Fixup building on osx. * Version 3.1.4 (released 2013-01-09) ** Display library version on About page. ** Do confirmation if NDEF does not start with http. * Version 3.1.3 (released 2012-12-21) ** Bugfix for publidId as serial in multi-key writes. ** Correctly show and enable what the production NEO is capable of. ** Support for writing SLOT_NDEF2 for production NEO. ** Fix saving of pacing options. ** Switch animations to mng, higher quality. ** Create a setting for toggling animations on and off, accessible from context menu. ** Different error message for challenge-response than configuring. ** Fix a resource leak when auto-programming keys. ** Fix oath identity increments. * Version 3.1.2 (released 2012-11-07) ** Support for deleting YubiKey configurations. ** Re-read key after writing it, so we can see it changed. ** Add Access-code entry for NDEF programming. ** Fix bug which wrote same key multiple times in multi-write mode. ** Small windows installer fixes. * Version 3.1.1 (released 2012-10-17) ** For native mac builds, sign and use pkgbuilder to create pkg installer. ** Add logging format "Yubico" that corresponds to other tools. ** Show which slots of a key contain valid configuration. ** Refactor scancode input for static keys, now allows editing, pasting and entering raw scancodes. ** When scanning if the key is present, keep it open for as short as possible, should increase possibility for other concurrent accesses. * Version 3.1.0 (released 2012-09-28) ** Support for features in YubiKey 2.3. Requires updating the ykpers library to version 1.8.0. ** Support for writing NDEF of YubiKey NEO. ** Removes the dj prefix that was added for customer prefixes. ** Support for entering customer prefix in modhex or hex as well, show all formats. ** Option to allow public id to be based on key serial. ** View for testing out challenge response with YubiKey. ** Autosave settings when changing. ** Don't write HMAC-SHA1 without variable input on 2.2 key. ** Oath IMF is set as direct number, not as what was entered * 16, also use higher ceiling for this. ** New windows installer based on nsis. ** New pictures, and changing picture depending on YubiKey version. * Version 3.0.6 (released 2012-06-07) ** Bump copyright years. ** Drop deps/ and libs/ explaining in README where you get them. * Version 3.0.5 (released 2012-06-05) ** release scripting, fixed NEWS file. * Version 3.0.4 (released 2012-06-05) ** NEWS file, release scripting, drop libusb dependency. * Version 3.0.3 (released 2012-06-04) ** Fixes to build system to allow building without bundled dependencies on ** linux. yubikey-personalization-gui-3.1.23/COPYING0000664000175000017500000000245412603205714016772 0ustar klasklasCopyright (C) 2011-2014 Yubico AB. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. yubikey-personalization-gui-3.1.23/BLURB0000664000175000017500000000047512603205714016531 0ustar klasklasAuthor: Yubico Basename: yubikey-personalization-gui Homepage: http://opensource.yubico.com/yubikey-personalization-gui/ License: BSD-2-Clause Name: yubikey-personalization-gui Project: yubikey-personalization-gui Summary: Qt based Cross-Platform YubiKey Personalization Tool Yubico-Category: YubiKey Personalization yubikey-personalization-gui-3.1.23/.travis.yml0000664000175000017500000000047012603205714020044 0ustar klasklaslanguage: cpp compiler: - gcc - clang before_install: - sudo add-apt-repository -y ppa:yubico/stable - sudo apt-get update -qq - sudo apt-get install -qq -y --no-install-recommends libyubikey-dev libykpers-1-dev qt4-qmake libqt4-dev install: - qmake 'CONFIG += debug' - make all script: make check yubikey-personalization-gui-3.1.23/.gitignore0000664000175000017500000000124212603205714017721 0ustar klasklasYKPersonalization.pro.user Makefile Makefile.Release Makefile.Debug src/ui/ui_*.h build/ deps/ libs/ object_script.yubikey-personalization-gui.Debug object_script.yubikey-personalization-gui.Release .*.swp yubikey-personalization-gui-*.tar.gz yubikey-personalization-gui-*.tar.gz.sig .DS_Store lib/debug/ lib/release/ tests/tests.pro.user lib/scanedit.o lib/de-scanedit.o lib/us-scanedit.o lib/yubikeyutil.o tests/moc_scanedittest.cpp tests/moc_scanedittest.o tests/scanedittest.o tests/moc_yubikeyutiltest.cpp tests/moc_yubikeyutiltest.o tests/test.o tests/yubikeyutiltest.o tests/versiontest.o tests/moc_versiontest.cpp tests/moc_versiontest.o tests/release/ tests/debug/