From d26ffc2e84c672199247e9369fb23a994fe2bad8 Mon Sep 17 00:00:00 2001 From: oddluck <39967334+oddluck@users.noreply.github.com> Date: Fri, 1 Mar 2019 01:43:03 -0500 Subject: [PATCH] Removing old Jeopardy plugin --- Jeopardy/.gitignore | 41 - Jeopardy/.idea/TriviaTime.iml | 16 - Jeopardy/LICENSE | 202 - Jeopardy/README.md | 49 - Jeopardy/__init__.py | 44 - Jeopardy/config.py | 179 - Jeopardy/local/__init__.py | 1 - Jeopardy/php/.htaccess | 8 - Jeopardy/php/app.php | 42 - Jeopardy/php/config/.htaccess | 1 - Jeopardy/php/config/config.php | 36 - Jeopardy/php/config/routes.php | 38 - Jeopardy/php/controllers/.htaccess | 1 - Jeopardy/php/controllers/AboutController.php | 8 - .../php/controllers/AdminDeleteController.php | 148 - .../php/controllers/AdminEditController.php | 145 - .../php/controllers/AdminNewController.php | 145 - .../php/controllers/AdminReportController.php | 105 - Jeopardy/php/controllers/IndexController.php | 40 - Jeopardy/php/controllers/LoginController.php | 75 - .../php/controllers/ReportsController.php | 103 - Jeopardy/php/controllers/StatsController.php | 126 - Jeopardy/php/controllers/UserController.php | 186 - Jeopardy/php/css/bootstrap-responsive.css | 1109 --- Jeopardy/php/css/bootstrap-responsive.min.css | 9 - Jeopardy/php/css/bootstrap.css | 6167 ----------------- Jeopardy/php/css/bootstrap.min.css | 9 - Jeopardy/php/css/triviatime.css | 96 - .../fonts/glyphicons-halflings-regular.eot | Bin 20290 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 229 - .../fonts/glyphicons-halflings-regular.ttf | Bin 41236 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23292 -> 0 bytes .../php/img/glyphicons-halflings-white.png | Bin 8777 -> 0 bytes Jeopardy/php/img/glyphicons-halflings.png | Bin 12799 -> 0 bytes Jeopardy/php/includes/.htaccess | 1 - Jeopardy/php/includes/Bootstrap.php | 114 - Jeopardy/php/includes/Controller.php | 54 - Jeopardy/php/includes/Login.php | 110 - Jeopardy/php/includes/LoginUser.php | 19 - Jeopardy/php/includes/Paginator.php | 156 - Jeopardy/php/includes/Renderer.php | 52 - Jeopardy/php/includes/Route.php | 73 - Jeopardy/php/includes/Router.php | 105 - Jeopardy/php/includes/Storage.php | 708 -- Jeopardy/php/includes/autoload.php | 13 - Jeopardy/php/js/bootstrap.js | 2280 ------ Jeopardy/php/js/bootstrap.min.js | 6 - Jeopardy/php/js/html5shiv.min.js | 8 - Jeopardy/php/js/triviatime.js | 36 - Jeopardy/php/views/.htaccess | 1 - Jeopardy/php/views/404.html.php | 6 - Jeopardy/php/views/about.html.php | 24 - Jeopardy/php/views/admin.json.php | 5 - Jeopardy/php/views/footer.html.php | 12 - Jeopardy/php/views/header.html.php | 81 - Jeopardy/php/views/home.html.php | 64 - Jeopardy/php/views/login.html.php | 33 - Jeopardy/php/views/profile.html.php | 117 - Jeopardy/php/views/reports.html.php | 243 - Jeopardy/php/views/stats.html.php | 126 - Jeopardy/php/views/top.html.php | 52 - Jeopardy/php/views/user.html.php | 64 - Jeopardy/plugin.py | 4291 ------------ Jeopardy/requirements.txt | 2 - Jeopardy/storage/questions | 1000 --- Jeopardy/test.py | 14 - 66 files changed, 19228 deletions(-) delete mode 100644 Jeopardy/.gitignore delete mode 100644 Jeopardy/.idea/TriviaTime.iml delete mode 100644 Jeopardy/LICENSE delete mode 100644 Jeopardy/README.md delete mode 100644 Jeopardy/__init__.py delete mode 100644 Jeopardy/config.py delete mode 100644 Jeopardy/local/__init__.py delete mode 100644 Jeopardy/php/.htaccess delete mode 100644 Jeopardy/php/app.php delete mode 100644 Jeopardy/php/config/.htaccess delete mode 100644 Jeopardy/php/config/config.php delete mode 100644 Jeopardy/php/config/routes.php delete mode 100644 Jeopardy/php/controllers/.htaccess delete mode 100644 Jeopardy/php/controllers/AboutController.php delete mode 100644 Jeopardy/php/controllers/AdminDeleteController.php delete mode 100644 Jeopardy/php/controllers/AdminEditController.php delete mode 100644 Jeopardy/php/controllers/AdminNewController.php delete mode 100644 Jeopardy/php/controllers/AdminReportController.php delete mode 100644 Jeopardy/php/controllers/IndexController.php delete mode 100644 Jeopardy/php/controllers/LoginController.php delete mode 100644 Jeopardy/php/controllers/ReportsController.php delete mode 100644 Jeopardy/php/controllers/StatsController.php delete mode 100644 Jeopardy/php/controllers/UserController.php delete mode 100644 Jeopardy/php/css/bootstrap-responsive.css delete mode 100644 Jeopardy/php/css/bootstrap-responsive.min.css delete mode 100644 Jeopardy/php/css/bootstrap.css delete mode 100644 Jeopardy/php/css/bootstrap.min.css delete mode 100644 Jeopardy/php/css/triviatime.css delete mode 100644 Jeopardy/php/fonts/glyphicons-halflings-regular.eot delete mode 100644 Jeopardy/php/fonts/glyphicons-halflings-regular.svg delete mode 100644 Jeopardy/php/fonts/glyphicons-halflings-regular.ttf delete mode 100644 Jeopardy/php/fonts/glyphicons-halflings-regular.woff delete mode 100644 Jeopardy/php/img/glyphicons-halflings-white.png delete mode 100644 Jeopardy/php/img/glyphicons-halflings.png delete mode 100644 Jeopardy/php/includes/.htaccess delete mode 100644 Jeopardy/php/includes/Bootstrap.php delete mode 100644 Jeopardy/php/includes/Controller.php delete mode 100644 Jeopardy/php/includes/Login.php delete mode 100644 Jeopardy/php/includes/LoginUser.php delete mode 100644 Jeopardy/php/includes/Paginator.php delete mode 100644 Jeopardy/php/includes/Renderer.php delete mode 100644 Jeopardy/php/includes/Route.php delete mode 100644 Jeopardy/php/includes/Router.php delete mode 100644 Jeopardy/php/includes/Storage.php delete mode 100644 Jeopardy/php/includes/autoload.php delete mode 100644 Jeopardy/php/js/bootstrap.js delete mode 100644 Jeopardy/php/js/bootstrap.min.js delete mode 100644 Jeopardy/php/js/html5shiv.min.js delete mode 100644 Jeopardy/php/js/triviatime.js delete mode 100644 Jeopardy/php/views/.htaccess delete mode 100644 Jeopardy/php/views/404.html.php delete mode 100644 Jeopardy/php/views/about.html.php delete mode 100644 Jeopardy/php/views/admin.json.php delete mode 100644 Jeopardy/php/views/footer.html.php delete mode 100644 Jeopardy/php/views/header.html.php delete mode 100644 Jeopardy/php/views/home.html.php delete mode 100644 Jeopardy/php/views/login.html.php delete mode 100644 Jeopardy/php/views/profile.html.php delete mode 100644 Jeopardy/php/views/reports.html.php delete mode 100644 Jeopardy/php/views/stats.html.php delete mode 100644 Jeopardy/php/views/top.html.php delete mode 100644 Jeopardy/php/views/user.html.php delete mode 100644 Jeopardy/plugin.py delete mode 100644 Jeopardy/requirements.txt delete mode 100644 Jeopardy/storage/questions delete mode 100644 Jeopardy/test.py diff --git a/Jeopardy/.gitignore b/Jeopardy/.gitignore deleted file mode 100644 index d84b9da..0000000 --- a/Jeopardy/.gitignore +++ /dev/null @@ -1,41 +0,0 @@ -*.py[cod] - -# C extensions -*.so - -# Packages -*.egg -*.egg-info -dist -build -eggs -parts -bin -var -sdist -develop-eggs -.installed.cfg -lib -lib64 - -# Installer logs -pip-log.txt - -# Unit test / coverage reports -.coverage -.tox -nosetests.xml - -# Translations -*.mo - -# Mr Developer -.mr.developer.cfg -.project -.pydevproject - -# PyCharm -*.iml - -# trivia.db -*.db diff --git a/Jeopardy/.idea/TriviaTime.iml b/Jeopardy/.idea/TriviaTime.iml deleted file mode 100644 index cb7a849..0000000 --- a/Jeopardy/.idea/TriviaTime.iml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - diff --git a/Jeopardy/LICENSE b/Jeopardy/LICENSE deleted file mode 100644 index 427e6b2..0000000 --- a/Jeopardy/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - -Eclipse Public License - v 1.0 - -THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC -LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM -CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - -1. DEFINITIONS - -"Contribution" means: - -a) in the case of the initial Contributor, the initial code and documentation - distributed under this Agreement, and -b) in the case of each subsequent Contributor: - i) changes to the Program, and - ii) additions to the Program; - - where such changes and/or additions to the Program originate from and are - distributed by that particular Contributor. A Contribution 'originates' from - a Contributor if it was added to the Program by such Contributor itself or - anyone acting on such Contributor's behalf. Contributions do not include - additions to the Program which: (i) are separate modules of software - distributed in conjunction with the Program under their own license - agreement, and (ii) are not derivative works of the Program. - -"Contributor" means any person or entity that distributes the Program. - -"Licensed Patents" mean patent claims licensable by a Contributor which are -necessarily infringed by the use or sale of its Contribution alone or when -combined with the Program. - -"Program" means the Contributions distributed in accordance with this Agreement. - -"Recipient" means anyone who receives the Program under this Agreement, -including all Contributors. - -2. GRANT OF RIGHTS - a) Subject to the terms of this Agreement, each Contributor hereby grants - Recipient a non-exclusive, worldwide, royalty-free copyright license to - reproduce, prepare derivative works of, publicly display, publicly perform, - distribute and sublicense the Contribution of such Contributor, if any, and - such derivative works, in source code and object code form. - b) Subject to the terms of this Agreement, each Contributor hereby grants - Recipient a non-exclusive, worldwide, royalty-free patent license under - Licensed Patents to make, use, sell, offer to sell, import and otherwise - transfer the Contribution of such Contributor, if any, in source code and - object code form. This patent license shall apply to the combination of the - Contribution and the Program if, at the time the Contribution is added by - the Contributor, such addition of the Contribution causes such combination - to be covered by the Licensed Patents. The patent license shall not apply - to any other combinations which include the Contribution. No hardware per - se is licensed hereunder. - c) Recipient understands that although each Contributor grants the licenses to - its Contributions set forth herein, no assurances are provided by any - Contributor that the Program does not infringe the patent or other - intellectual property rights of any other entity. Each Contributor - disclaims any liability to Recipient for claims brought by any other entity - based on infringement of intellectual property rights or otherwise. As a - condition to exercising the rights and licenses granted hereunder, each - Recipient hereby assumes sole responsibility to secure any other - intellectual property rights needed, if any. For example, if a third party - patent license is required to allow Recipient to distribute the Program, it - is Recipient's responsibility to acquire that license before distributing - the Program. - d) Each Contributor represents that to its knowledge it has sufficient - copyright rights in its Contribution, if any, to grant the copyright - license set forth in this Agreement. - -3. REQUIREMENTS - -A Contributor may choose to distribute the Program in object code form under its -own license agreement, provided that: - - a) it complies with the terms and conditions of this Agreement; and - b) its license agreement: - i) effectively disclaims on behalf of all Contributors all warranties and - conditions, express and implied, including warranties or conditions of - title and non-infringement, and implied warranties or conditions of - merchantability and fitness for a particular purpose; - ii) effectively excludes on behalf of all Contributors all liability for - damages, including direct, indirect, special, incidental and - consequential damages, such as lost profits; - iii) states that any provisions which differ from this Agreement are offered - by that Contributor alone and not by any other party; and - iv) states that source code for the Program is available from such - Contributor, and informs licensees how to obtain it in a reasonable - manner on or through a medium customarily used for software exchange. - -When the Program is made available in source code form: - - a) it must be made available under this Agreement; and - b) a copy of this Agreement must be included with each copy of the Program. - Contributors may not remove or alter any copyright notices contained within - the Program. - -Each Contributor must identify itself as the originator of its Contribution, if -any, in a manner that reasonably allows subsequent Recipients to identify the -originator of the Contribution. - -4. COMMERCIAL DISTRIBUTION - -Commercial distributors of software may accept certain responsibilities with -respect to end users, business partners and the like. While this license is -intended to facilitate the commercial use of the Program, the Contributor who -includes the Program in a commercial product offering should do so in a manner -which does not create potential liability for other Contributors. Therefore, if -a Contributor includes the Program in a commercial product offering, such -Contributor ("Commercial Contributor") hereby agrees to defend and indemnify -every other Contributor ("Indemnified Contributor") against any losses, damages -and costs (collectively "Losses") arising from claims, lawsuits and other legal -actions brought by a third party against the Indemnified Contributor to the -extent caused by the acts or omissions of such Commercial Contributor in -connection with its distribution of the Program in a commercial product -offering. The obligations in this section do not apply to any claims or Losses -relating to any actual or alleged intellectual property infringement. In order -to qualify, an Indemnified Contributor must: a) promptly notify the Commercial -Contributor in writing of such claim, and b) allow the Commercial Contributor to -control, and cooperate with the Commercial Contributor in, the defense and any -related settlement negotiations. The Indemnified Contributor may participate in -any such claim at its own expense. - -For example, a Contributor might include the Program in a commercial product -offering, Product X. That Contributor is then a Commercial Contributor. If that -Commercial Contributor then makes performance claims, or offers warranties -related to Product X, those performance claims and warranties are such -Commercial Contributor's responsibility alone. Under this section, the -Commercial Contributor would have to defend claims against the other -Contributors related to those performance claims and warranties, and if a court -requires any other Contributor to pay any damages as a result, the Commercial -Contributor must pay those damages. - -5. NO WARRANTY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR -IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, -NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each -Recipient is solely responsible for determining the appropriateness of using and -distributing the Program and assumes all risks associated with its exercise of -rights under this Agreement , including but not limited to the risks and costs -of program errors, compliance with applicable laws, damage to or loss of data, -programs or equipment, and unavailability or interruption of operations. - -6. DISCLAIMER OF LIABILITY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY -CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST -PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS -GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -7. GENERAL - -If any provision of this Agreement is invalid or unenforceable under applicable -law, it shall not affect the validity or enforceability of the remainder of the -terms of this Agreement, and without further action by the parties hereto, such -provision shall be reformed to the minimum extent necessary to make such -provision valid and enforceable. - -If Recipient institutes patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Program itself -(excluding combinations of the Program with other software or hardware) -infringes such Recipient's patent(s), then such Recipient's rights granted under -Section 2(b) shall terminate as of the date such litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it fails to -comply with any of the material terms or conditions of this Agreement and does -not cure such failure in a reasonable period of time after becoming aware of -such noncompliance. If all Recipient's rights under this Agreement terminate, -Recipient agrees to cease use and distribution of the Program as soon as -reasonably practicable. However, Recipient's obligations under this Agreement -and any licenses granted by Recipient relating to the Program shall continue and -survive. - -Everyone is permitted to copy and distribute copies of this Agreement, but in -order to avoid inconsistency the Agreement is copyrighted and may only be -modified in the following manner. The Agreement Steward reserves the right to -publish new versions (including revisions) of this Agreement from time to time. -No one other than the Agreement Steward has the right to modify this Agreement. -The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation -may assign the responsibility to serve as the Agreement Steward to a suitable -separate entity. Each new version of the Agreement will be given a -distinguishing version number. The Program (including Contributions) may always -be distributed subject to the version of the Agreement under which it was -received. In addition, after a new version of the Agreement is published, -Contributor may elect to distribute the Program (including its Contributions) -under the new version. Except as expressly stated in Sections 2(a) and 2(b) -above, Recipient receives no rights or licenses to the intellectual property of -any Contributor under this Agreement, whether expressly, by implication, -estoppel or otherwise. All rights in the Program not expressly granted under -this Agreement are reserved. - -This Agreement is governed by the laws of the State of New York and the -intellectual property laws of the United States of America. No party to this -Agreement will bring a legal action under this Agreement more than one year -after the cause of action arose. Each party waives its rights to a jury trial in -any resulting litigation. - - - \ No newline at end of file diff --git a/Jeopardy/README.md b/Jeopardy/README.md deleted file mode 100644 index 7ff115c..0000000 --- a/Jeopardy/README.md +++ /dev/null @@ -1,49 +0,0 @@ -This plugin, a modification of TriviaTime, uses the jservice.io api to supply questions. - -This no longer uses the internal question database, rendering question reporting, editing, etc. obsolete. Consider this a hack, though a fully functional one. Previous user stats are not affected by the change. At some point I will break this out into its own plugin with options to choose category/value, but for now it works well enough as is. - -#Configuration - -Requires Limnoria and Python 3 - -## Setting up the plugin -1. Download [Limnoria][] -2. Download TriviaTime and place it into the plugins folder -3. Load TriviaTime -4. Configure your question file and database location in config.py or with commands -5. Use 'addquestionfile [filename]' command to load questions, the argument is optional - -## IMPORTANT: How to update -1. Stop the game, if it is currently in progress. -2. Backup your entire Supybot directory. The most important file needed is the database in /storage/, but it's best to be safe. -3. Unload TriviaTime. Since you are unloading the plugin, you will not have to restart or kill your bot. -4. Do not delete any files in TriviaTime/storage during this process (aside from samplequestions, if you wish). -5. Copy over the changed files. - * Version v1.1 to v1.3.2 files changed: **plugin.py, config.py, __init__.py, samplequestions -> questions** (changes to config adds new value, removes another, improves others) - * Version v1.2 to v1.3.2 files changed: **plugin.py, config.py, __init__.py, samplequestions -> questions** (changes to config adds new value, improves others) - * Version v1.3(.1) to v1.3.2 files changed: **plugin.py, __init.py** -6. If there were any changes to the database, they should be updated automatically. Otherwise, further instructions for updating that version will appear here. -7. If config.py was changed, you will need to manually add your desired values again. You can compare the previous file (the backup) to the new file. (v1.1) -8. Load TriviaTime again. If you followed the instructions correctly, you won't have an error. -9. If everything went smoothly, you have now sucessfully updated the plugin to the latest version. Use .info to verify you are on the latest version. - -## Question editing tools -TriviaTime was designed to make editing, deleting, and adding questions a breeze, for both administrators and players. However, due to the amount of tools available, it can be complicated to new players. Instructions on these tools are available [here][]. - -#How to set up the website - -## Download and Install -1. Install PHP (for PDO) and PHP-SQLite. -2. Configure config.php to point to your TriviaTime database in the plugin/TriviaTime/Storage/db folder -3. mod_rewrite should be enabled for Apache servers (nginx servers may be a bit different) - -## Setting up permissions for SQLite - -In order to use the website to delete/accept edits, reports, new questions, and deletes, you will need to set the proper permissions for the SQLite db, called 'trivia.db' by default. The default location for the database is inside of the supybot's directory, with the .conf file, inside of plugins/TriviaTime/storage/db. - -PHP's PDO requires that the user that PHP is run under has write access to the folder that the db is stored in. For this reason I would suggest moving the database to its own folder, which the webservers user has write access. - -I would recommend either creating a new group and adding the user that runs supybot and the webservers user to it, or changing the permissions of the database so that the group who owns it is the webserver, and the user who owns it is the user who runs supybot. After doing that, changing permissions to 775 will allow the group who owns the file to write to the database. - - [Limnoria]: https://github.com/ProgVal/Limnoria - [here]: http://trivialand.org/ diff --git a/Jeopardy/__init__.py b/Jeopardy/__init__.py deleted file mode 100644 index a174abe..0000000 --- a/Jeopardy/__init__.py +++ /dev/null @@ -1,44 +0,0 @@ -### -# Copyright (c) 2013, tann -# All rights reserved. -# -# -### - -""" -A feature-packed trivia plugin designed exclusively for #trivialand on Freenode. -""" - -import supybot -import supybot.world as world -import imp - -# Use this for the version of this plugin. You may wish to put a CVS keyword -# in here if you're keeping the plugin in CVS or some similar system. -__version__ = "v1.3.2" - -# XXX Replace this with an appropriate author or supybot.Author instance. -__author__ = supybot.Author('Tanner', 'tann', - 'tann@trivialand.org') - -# This is a dictionary mapping supybot.Author instances to lists of -# contributions. -__contributors__ = {'rootcoma', 'Th0masR0ss', 'brrr'} - -# This is a url where the most recent plugin package can be downloaded. -__url__ = 'https://github.com/tannn/TriviaTime/tree/master' - -from . import config -from . import plugin -imp.reload(plugin) # In case we're being reloaded. -# Add more reloads here if you add third-party modules and want them to be -# reloaded when this plugin is reloaded. Don't forget to import them as well! - -if world.testing: - from . import test - -Class = plugin.Class -configure = config.configure - - -# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: diff --git a/Jeopardy/config.py b/Jeopardy/config.py deleted file mode 100644 index 2c1f0dc..0000000 --- a/Jeopardy/config.py +++ /dev/null @@ -1,179 +0,0 @@ -### -# Copyright (c) 2013, tann -# All rights reserved. -# -# -### - -import supybot.conf as conf -import supybot.registry as registry - -def configure(advanced): - # This will be called by supybot to configure this module. advanced is - # a bool that specifies whether the user identified himself as an advanced - # user or not. You should effect your configuration by manipulating the - # registry as appropriate. - from supybot.questions import expect, anything, something, yn - conf.registerPlugin('TriviaTime', True) - -TriviaTime = conf.registerPlugin('TriviaTime') - -# Config groups -conf.registerGroup(TriviaTime, 'kaos') -conf.registerGroup(TriviaTime, 'admin') -conf.registerGroup(TriviaTime, 'questions') -conf.registerGroup(TriviaTime, 'general') -conf.registerGroup(TriviaTime, 'commands') -conf.registerGroup(TriviaTime, 'voice') -conf.registerGroup(TriviaTime, 'skip') -conf.registerGroup(TriviaTime, 'hints') - -# CONFIGURATION -# file locations for database and question -conf.registerChannelValue(TriviaTime.admin, 'db', - registry.NormalizedString("""plugins/TriviaTime/storage/db/trivia.db""", - """Location of sqlite database file""") - ) - -conf.registerChannelValue(TriviaTime.admin, 'file', - registry.NormalizedString("""plugins/TriviaTime/storage/questions""", - """Location of question file. Reload the plugin if changed.""") - ) - -# timeout, number of hints, values -conf.registerChannelValue(TriviaTime.commands, 'extraHint', - registry.NormalizedString(""".""", - """The command to show extra hints and remaining KAOS""") - ) - -conf.registerChannelValue(TriviaTime.general, 'logGames', - registry.Boolean(True, - """Log changes to questions and games""") - ) - -conf.registerChannelValue(TriviaTime.general, 'globalStats', - registry.Boolean(False, - """Stats are global across all channels""") - ) - -conf.registerChannelValue(TriviaTime.hints, 'extraHintTime', - registry.Integer(90, - """Number of seconds a user must wait between uses of the extra hint command.""") - ) - -conf.registerChannelValue(TriviaTime.hints, 'vowelsHint', - registry.Boolean(True, - """Show all vowels on the third hint. If false, random letters will be shown instead""") - ) - -conf.registerChannelValue(TriviaTime.general, 'showStats', - registry.Boolean(True, - """Show player stats after correct answer""") - ) - -conf.registerChannelValue(TriviaTime.skip, 'skipThreshold', - registry.Float(.5, - """Percentage of active players who need to vote for a question to be skipped""") - ) - -conf.registerChannelValue(TriviaTime.skip, 'skipActiveTime', - registry.Integer((10*60), - """Amount of seconds a user is considered active after answering a question""") - ) - -conf.registerChannelValue(TriviaTime.skip, 'skipTime', - registry.Integer(90, - """Seconds a user must wait to skip a question again after skipping""") - ) - -conf.registerChannelValue(TriviaTime.questions, 'hintTime', - registry.Integer(10, - """Seconds between hints""") - ) - -conf.registerChannelValue(TriviaTime.kaos, 'hintKAOS', - registry.Integer(15, - """Seconds between KAOS hints""") - ) - -conf.registerChannelValue(TriviaTime.general, 'waitTime', - registry.Integer(15, - """Seconds between the end of one question and the start of another""") - ) - -conf.registerChannelValue(TriviaTime.voice, 'enableVoice', - registry.Boolean(True, - """Voice top players for week, month, and year""") - ) - -conf.registerChannelValue(TriviaTime.hints, 'enableExtraHints', - registry.Boolean(True, - """Shows extra hint using command. Rate-limited by default""") - ) - -conf.registerChannelValue(TriviaTime.voice, 'timeoutVoice', - registry.Integer(60, - """The minimum amount of seconds between anouncing the topped users that were voiced""") - ) - -conf.registerChannelValue(TriviaTime.voice, 'numTopToVoice', - registry.Integer(10, - """The number of top players who are elligible for voice""") - ) - -conf.registerChannelValue(TriviaTime.voice, 'minPointsVoiceWeek', - registry.Integer(30000, - """Points required to be voiced for being top player in the week""") - ) - -conf.registerChannelValue(TriviaTime.voice, 'minPointsVoiceMonth', - registry.Integer(100000, - """Points required to be voiced for being top player in the month""") - ) - -conf.registerChannelValue(TriviaTime.voice, 'minPointsVoiceYear', - registry.Integer(5000000, - """Points required to be voiced for being top player in the year""") - ) - -conf.registerChannelValue(TriviaTime.kaos, 'payoutKAOS', - registry.Integer(1000, - """Extra points for teamwork on KAOS""") - ) - -conf.registerChannelValue(TriviaTime.general, 'timeout', - registry.Integer(600, - """Time before game shuts off in seconds""") - ) - -conf.registerChannelValue(TriviaTime.questions, 'defaultPoints', - registry.Integer(500, - """Default points for a correct answer to a normal question""") - ) - -conf.registerChannelValue(TriviaTime.kaos, 'defaultKAOS', - registry.Integer(300, - """Default points for a correct KAOS answer""") - ) - -conf.registerChannelValue(TriviaTime.hints, 'hintRatio', - registry.Integer(35, - """Percent of word to show per hint""") - ) - -conf.registerChannelValue(TriviaTime.hints, 'charMask', - registry.NormalizedString('*', - """Masking character for hints""") - ) - -conf.registerChannelValue(TriviaTime.general, 'nextMinStreak', - registry.Integer(5, - """The streak needed to use the Next command""") - ) - -conf.registerChannelValue(TriviaTime.general, 'minBreakStreak', - registry.Integer(4, - """The streak needed to award breaking the streak""") - ) - -# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: diff --git a/Jeopardy/local/__init__.py b/Jeopardy/local/__init__.py deleted file mode 100644 index e86e97b..0000000 --- a/Jeopardy/local/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# Stub so local is a module, used for third-party modules diff --git a/Jeopardy/php/.htaccess b/Jeopardy/php/.htaccess deleted file mode 100644 index 87f02ed..0000000 --- a/Jeopardy/php/.htaccess +++ /dev/null @@ -1,8 +0,0 @@ - - Order Allow,Deny - Deny from all - -Options +FollowSymLinks -RewriteEngine On -RewriteCond %{REQUEST_URI} !^(.+/|/?)(css|js|fonts|img)/ -RewriteRule ^(.*)$ app.php [NC,L] diff --git a/Jeopardy/php/app.php b/Jeopardy/php/app.php deleted file mode 100644 index 3ce1707..0000000 --- a/Jeopardy/php/app.php +++ /dev/null @@ -1,42 +0,0 @@ -$config['baseFolder'] . $config['baseRoute'], "routes"=>$routes); - -// Create the container -$container = new Bootstrap($config, $routeInfo); - - -// Start the application based on the route -// TODO: Should this be in the Bootstrap? -$currentRoute = $container->router->matchCurrentRequest(); -if(!$currentRoute) { - $container->render404(); -} - -$params = $currentRoute->getParameters(); -$target = $currentRoute->getTarget(); - -$parts = explode(':', $target); -if(count($parts) < 2) { - // configuration error - throw new Exception("Route is not properly configured."); -} - -$controllerName = $parts[0]; -$action = $parts[1]; - -$className = $controllerName . 'Controller'; -$actionName = $action . 'Action'; -$controller = new $className($container); -$controller->$actionName($params); diff --git a/Jeopardy/php/config/.htaccess b/Jeopardy/php/config/.htaccess deleted file mode 100644 index 8d2f256..0000000 --- a/Jeopardy/php/config/.htaccess +++ /dev/null @@ -1 +0,0 @@ -deny from all diff --git a/Jeopardy/php/config/config.php b/Jeopardy/php/config/config.php deleted file mode 100644 index b60a801..0000000 --- a/Jeopardy/php/config/config.php +++ /dev/null @@ -1,36 +0,0 @@ -"/","target"=>'Index:index', "args"=>array("name"=>"home")); - -// About -$routes[] = array("pattern"=>"/about", "target"=>"About:about", "args"=>array("name"=>"about")); - -// Stats -$routes[] = array("pattern"=>"/stats", "target"=>"Stats:stats", "args"=>array("name"=>"stats")); -$routes[] = array("pattern"=>"/top/:timespan", "target"=>"Stats:top", "args"=>array("name"=>"top")); - -// Players -$routes[] = array("pattern"=>"/search", "target"=>"User:search", "args"=>array("name"=>"search")); -$routes[] = array("pattern"=>"/profile/:username", "target"=>"User:profile", "args"=>array("name"=>"profile", "filters" => array("username" => "([a-zA-Z\d_\-\[\]\\^{}|`%]*)"))); - -// Reports -$routes[] = array("pattern"=>"/reports", "target"=>"Reports:list", "args"=>array("name"=>"reports")); - -// Login/Logout -$routes[] = array("pattern"=>"/login", "target"=>"Login:login", "args"=>array("name"=>"login")); -$routes[] = array("pattern"=>"/logout", "target"=>"Login:logout", "args"=>array("name"=>"logout")); - -// Admin Report remove -$routes[] = array("pattern"=>"/manage/report/:id/remove", "target"=>"AdminReport:removeReport", "args"=>array("name"=>"remove-report", "filters"=> array("id"=>"([\d]+)"))); - -// Admin Edit accept/remove -$routes[] = array("pattern"=>"/manage/edit/:id/accept", "target"=>"AdminEdit:acceptEdit", "args"=>array("name"=>"accept-edit", "filters"=> array("id"=>"([\d]+)"))); -$routes[] = array("pattern"=>"/manage/edit/:id/remove", "target"=>"AdminEdit:removeEdit", "args"=>array("name"=>"remove-edit", "filters"=> array("id"=>"([\d]+)"))); - -// Admin Delete accept/remove -$routes[] = array("pattern"=>"/manage/delete/:id/accept", "target"=>"AdminDelete:acceptDelete", "args"=>array("name"=>"accept-delete", "filters"=> array("id"=>"([\d]+)"))); -$routes[] = array("pattern"=>"/manage/delete/:id/remove", "target"=>"AdminDelete:removeDelete", "args"=>array("name"=>"remove-delete", "filters"=> array("id"=>"([\d]+)"))); - -// Admin new accept/remove -$routes[] = array("pattern"=>"/manage/new/:id/accept", "target"=>"AdminNew:acceptNew", "args"=>array("name"=>"accept-new", "filters"=> array("id"=>"([\d]+)"))); -$routes[] = array("pattern"=>"/manage/new/:id/remove", "target"=>"AdminNew:removeNew", "args"=>array("name"=>"remove-new", "filters"=> array("id"=>"([\d]+)"))); diff --git a/Jeopardy/php/controllers/.htaccess b/Jeopardy/php/controllers/.htaccess deleted file mode 100644 index 8d2f256..0000000 --- a/Jeopardy/php/controllers/.htaccess +++ /dev/null @@ -1 +0,0 @@ -deny from all diff --git a/Jeopardy/php/controllers/AboutController.php b/Jeopardy/php/controllers/AboutController.php deleted file mode 100644 index f7be20e..0000000 --- a/Jeopardy/php/controllers/AboutController.php +++ /dev/null @@ -1,8 +0,0 @@ -setTitle('About'); - $this->render('about.html.php'); - } -} diff --git a/Jeopardy/php/controllers/AdminDeleteController.php b/Jeopardy/php/controllers/AdminDeleteController.php deleted file mode 100644 index 6eb68a4..0000000 --- a/Jeopardy/php/controllers/AdminDeleteController.php +++ /dev/null @@ -1,148 +0,0 @@ -getFormat(); - - $id = -1; - if(array_key_exists('id', $args)) { - $id = $args['id']; - } - - if($id < 0) { - $response = $this->createResponseArray(true, 'error', 'Id can only be positive.'); - $this->doResponse($response, $format); - } - - $login = $this->container->login; - if(!$login->isLoggedIn()) { - $response = $this->createResponseArray(true, 'error', 'You must be logged in to remove pending deletions.'); - $this->doResponse($response, $format); - } - - try { - $reportExists = $this->container->storage->deleteExists($id); - } catch(StorageException $e) { - $this->doDbErrorResponse($format); - } - if(!$reportExists) { - $response = $this->createResponseArray(true, 'error', 'That pending deletion does not exist.'); - $this->doResponse($response, $format); - } - - $count = 0; - try { - $this->container->storage->removeDelete($id); - } catch(StorageException $e) { - $this->doDbErrorResponse($format); - } - $response = $this->createResponseArray(false, 'success', 'Pending deletion has been removed.'); - $this->doResponse($response, $format); - } - - public function createDeleteAction($args) { - - } - - public function acceptDeleteAction($args) { - $format = $this->getFormat(); - - $id = -1; - if(array_key_exists('id', $args)) { - $id = $args['id']; - } - - if($id < 0) { - $response = $this->createResponseArray(true, 'error', 'Id can only be positive.'); - $this->doResponse($response, $format); - } - - $login = $this->container->login; - if(!$login->isLoggedIn()) { - $response = $this->createResponseArray(true, 'error', 'You must be logged in to accept pending deletions.'); - $this->doResponse($response, $format); - } - - try { - $delete = $this->container->storage->getDeleteById($id); - } catch(StorageException $e) { - $this->doDbErrorResponse($format); - } - if(count($delete) < 1) { - $response = $this->createResponseArray(true, 'error', 'That pending deletion does not exist.'); - $this->doResponse($response, $format); - } - $delete = $delete[0]; - - $count = 0; - try { - $this->container->storage->removeQuestion($delete['line_num']); - $this->container->storage->removeDelete($id); - } catch(StorageException $e) { - $this->doDbErrorResponse($format); - } - $response = $this->createResponseArray(false, 'success', 'Deletion has been accepted. Question has been deleted.'); - $this->doResponse($response, $format); - } - - protected $formats = array('html', 'json'); - - protected function getGetVariable($key) { - if(array_key_exists($key, $_GET)) { - return $_GET[$key]; - } - return null; - } - - protected function getFormat() { - $format = $this->getGetVariable('format'); - if(is_null($format) || !in_array($format, $this->formats)) { - $format = 'html'; - } - return $format; - } - - protected function createResponseArray($errorBool, $status, $message) { - $response = array(); - if($errorBool) { - $errorBool = true; - } else { - $errorBool = false; - } - $response['error'] = $errorBool; - $response['status'] = strval($status); - $response['message'] = strval($message); - return $response; - } - - protected function doHtmlResponse($response) { - if(isset($response['error'])){ - if($response['error']) { - $this->setError("Error: " . $response['message']); - } else { - $this->setNotice("Success: " . $response['message']); - } - } - $this->redirect($this->container->router->generate('reports')); - } - - protected function doJsonResponse($response) { - $this->render('admin.json.php', $response, false); - die(); - } - - protected function doDbErrorResponse($format) { - $response = $this->createResponseArray(true, "error", "Encountered database error."); - $this->doResponse($response, $format); - } - - protected function doResponse($response, $format) { - if($format==='json') { - $this->doJsonResponse($response); - } else { - $this->doHtmlResponse($response); - } - } - - -} diff --git a/Jeopardy/php/controllers/AdminEditController.php b/Jeopardy/php/controllers/AdminEditController.php deleted file mode 100644 index 1c8ffce..0000000 --- a/Jeopardy/php/controllers/AdminEditController.php +++ /dev/null @@ -1,145 +0,0 @@ -getGetVariable('format'); - if(is_null($format) || !in_array($format, $this->formats)) { - $format = 'html'; - } - return $format; - } - - protected function createResponseArray($errorBool, $status, $message) { - $response = array(); - if($errorBool) { - $errorBool = true; - } else { - $errorBool = false; - } - $response['error'] = $errorBool; - $response['status'] = strval($status); - $response['message'] = strval($message); - return $response; - } - - protected function doHtmlResponse($response) { - if(isset($response['error'])){ - if($response['error']) { - $this->setError("Error: " . $response['message']); - } else { - $this->setNotice("Success: " . $response['message']); - } - } - $this->redirect($this->container->router->generate('reports')); - } - - protected function doJsonResponse($response) { - $this->render('admin.json.php', $response, false); - die(); - } - - protected function doDbErrorResponse($format) { - $response = $this->createResponseArray(true, "error", "Encountered database error."); - $this->doResponse($response, $format); - } - - protected function doResponse($response, $format) { - if($format==='json') { - $this->doJsonResponse($response); - } else { - $this->doHtmlResponse($response); - } - } - - public function removeEditAction($args) { - $format = $this->getFormat(); - - $id = -1; - if(array_key_exists('id', $args)) { - $id = $args['id']; - } - - if($id < 0) { - $response = $this->createResponseArray(true, 'error', 'Id can only be positive.'); - $this->doResponse($response, $format); - } - - $login = $this->container->login; - if(!$login->isLoggedIn()) { - $response = $this->createResponseArray(true, 'error', 'You must be logged in to remove edits.'); - $this->doResponse($response, $format); - } - - try { - $editExists = $this->container->storage->editExists($id); - } catch(StorageException $e) { - $this->doDbErrorResponse($format); - } - if(!$editExists) { - $response = $this->createResponseArray(true, 'error', 'That edit does not exist.'); - $this->doResponse($response, $format); - } - - try { - $this->container->storage->removeEdit($id); - } catch(StorageException $e) { - $this->doDbErrorResponse($format); - } - $response = $this->createResponseArray(false, 'success', 'Edit has been removed.'); - $this->doResponse($response, $format); - } - - public function createEditAction($args) { - - } - - public function acceptEditAction($args) { - $format = $this->getFormat(); - - $id = -1; - if(array_key_exists('id', $args)) { - $id = $args['id']; - } - - if($id < 0) { - $response = $this->createResponseArray(true, 'error', 'Id can only be positive.'); - $this->doResponse($response, $format); - } - - $login = $this->container->login; - if(!$login->isLoggedIn()) { - $response = $this->createResponseArray(true, 'error', 'You must be logged in to accept edits.'); - $this->doResponse($response, $format); - } - - try { - $edit = $this->container->storage->getEditById($id); - } catch(StorageException $e) { - $this->doDbErrorResponse($format); - } - if(count($edit) < 1) { - $response = $this->createResponseArray(true, 'error', 'That edit does not exist.'); - $this->doResponse($response, $format); - } - $edit = $edit[0]; - - $count = 0; - try { - $this->container->storage->updateQuestion($edit['question_id'], $edit['question']); - $this->container->storage->removeEdit($id); - } catch(StorageException $e) { - $this->doDbErrorResponse($format); - } - $response = $this->createResponseArray(false, 'success', 'Edit has been accepted. Question has been updated.'); - $this->doResponse($response, $format); - } -} diff --git a/Jeopardy/php/controllers/AdminNewController.php b/Jeopardy/php/controllers/AdminNewController.php deleted file mode 100644 index f76a88b..0000000 --- a/Jeopardy/php/controllers/AdminNewController.php +++ /dev/null @@ -1,145 +0,0 @@ -getGetVariable('format'); - if(is_null($format) || !in_array($format, $this->formats)) { - $format = 'html'; - } - return $format; - } - - protected function createResponseArray($errorBool, $status, $message) { - $response = array(); - if($errorBool) { - $errorBool = true; - } else { - $errorBool = false; - } - $response['error'] = $errorBool; - $response['status'] = strval($status); - $response['message'] = strval($message); - return $response; - } - - protected function doHtmlResponse($response) { - if(isset($response['error'])){ - if($response['error']) { - $this->setError("Error: " . $response['message']); - } else { - $this->setNotice("Success: " . $response['message']); - } - } - $this->redirect($this->container->router->generate('reports')); - } - - protected function doJsonResponse($response) { - $this->render('admin.json.php', $response, false); - die(); - } - - protected function doDbErrorResponse($format) { - $response = $this->createResponseArray(true, "error", "Encountered database error."); - $this->doResponse($response, $format); - } - - protected function doResponse($response, $format) { - if($format==='json') { - $this->doJsonResponse($response); - } else { - $this->doHtmlResponse($response); - } - } - - public function createNewAction($args) { - - } - - public function removeNewAction($args) { - $format = $this->getFormat(); - - $id = -1; - if(array_key_exists('id', $args)) { - $id = $args['id']; - } - - if($id < 0) { - $response = $this->createResponseArray(true, 'error', 'Id can only be positive.'); - $this->doResponse($response, $format); - } - - $login = $this->container->login; - if(!$login->isLoggedIn()) { - $response = $this->createResponseArray(true, 'error', 'You must be logged in to remove new questions.'); - $this->doResponse($response, $format); - } - - try { - $newExists = $this->container->storage->temporaryQuestionExists($id); - } catch(StorageException $e) { - $this->doDbErrorResponse($format); - } - if(!$newExists) { - $response = $this->createResponseArray(true, 'error', 'That new question does not exist.'); - $this->doResponse($response, $format); - } - - try { - $this->container->storage->removeTemporaryQuestion($id); - } catch(StorageException $e) { - $this->doDbErrorResponse($format); - } - $response = $this->createResponseArray(false, 'success', 'New question has been removed.'); - $this->doResponse($response, $format); - } - - public function acceptNewAction($args) { - $format = $this->getFormat(); - - $id = -1; - if(array_key_exists('id', $args)) { - $id = $args['id']; - } - - if($id < 0) { - $response = $this->createResponseArray(true, 'error', 'Id can only be positive.'); - $this->doResponse($response, $format); - } - - $login = $this->container->login; - if(!$login->isLoggedIn()) { - $response = $this->createResponseArray(true, 'error', 'You must be logged in to accept new questions.'); - $this->doResponse($response, $format); - } - - try { - $new = $this->container->storage->getTemporaryQuestionById($id); - } catch(StorageException $e) { - $this->doDbErrorResponse($format); - } - if(count($new) < 1) { - $response = $this->createResponseArray(true, 'error', 'That new question does not exist.'); - $this->doResponse($response, $format); - } - $new = $new[0]; - - $count = 0; - try { - $this->container->storage->insertQuestion($new['question']); - $this->container->storage->removeTemporaryQuestion($id); - } catch(StorageException $e) { - $this->doDbErrorResponse($format); - } - $response = $this->createResponseArray(false, 'success', 'Question has been successfuly accepted.'); - $this->doResponse($response, $format); - } -} diff --git a/Jeopardy/php/controllers/AdminReportController.php b/Jeopardy/php/controllers/AdminReportController.php deleted file mode 100644 index e69c742..0000000 --- a/Jeopardy/php/controllers/AdminReportController.php +++ /dev/null @@ -1,105 +0,0 @@ -getGetVariable('format'); - if(is_null($format) || !in_array($format, $this->formats)) { - $format = 'html'; - } - return $format; - } - - protected function createResponseArray($errorBool, $status, $message) { - $response = array(); - if($errorBool) { - $errorBool = true; - } else { - $errorBool = false; - } - $response['error'] = $errorBool; - $response['status'] = strval($status); - $response['message'] = strval($message); - return $response; - } - - protected function doHtmlResponse($response) { - if(isset($response['error'])){ - if($response['error']) { - $this->setError("Error: " . $response['message']); - } else { - $this->setNotice("Success: " . $response['message']); - } - } - $this->redirect($this->container->router->generate('reports')); - } - - protected function doJsonResponse($response) { - $this->render('admin.json.php', $response, false); - die(); - } - - protected function doDbErrorResponse($format) { - $response = $this->createResponseArray(true, "error", "Encountered database error."); - $this->doResponse($response, $format); - } - - protected function doResponse($response, $format) { - if($format==='json') { - $this->doJsonResponse($response); - } else { - $this->doHtmlResponse($response); - } - } - - public function removeReportAction($args) { - $format = $this->getFormat(); - - $id = -1; - if(array_key_exists('id', $args)) { - $id = $args['id']; - } - - if($id < 0) { - $response = $this->createResponseArray(true, 'error', 'Id can only be positive.'); - $this->doResponse($response, $format); - } - - $login = $this->container->login; - if(!$login->isLoggedIn()) { - $response = $this->createResponseArray(true, 'error', 'You must be logged in to remove reports.'); - $this->doResponse($response, $format); - } - - try { - $reportExists = $this->container->storage->reportExists($id); - } catch(StorageException $e) { - $this->doDbErrorResponse($format); - } - if(!$reportExists) { - $response = $this->createResponseArray(true, 'error', 'That report does not exist.'); - $this->doResponse($response, $format); - } - - $count = 0; - try { - $this->container->storage->removeReport($id); - } catch(StorageException $e) { - $this->doDbErrorResponse($format); - } - $response = $this->createResponseArray(false, 'success', 'Report has been successfully deleted.'); - $this->doResponse($response, $format); - } - - public function createReportAction($args) { - - } -} diff --git a/Jeopardy/php/controllers/IndexController.php b/Jeopardy/php/controllers/IndexController.php deleted file mode 100644 index 7cffe23..0000000 --- a/Jeopardy/php/controllers/IndexController.php +++ /dev/null @@ -1,40 +0,0 @@ -container; - $storage = $container->getStorage(); - - $errorsQ = array(); - $resultQ = array(); - try { - $resultQ = $storage->getRecentAskedQuestions(); - } catch(StorageSchemaException $e) { - $errorsQ[] = "Error: Database schema is not queryable"; - } catch(StorageConnectionException $e) { - $errorsQ[] = "Error: Database is not available"; - } - - $errorsA = array(); - $resultA = array(); - try { - $resultA = $storage->getRecentActivities(); - } catch(StorageSchemaException $e) { - $errorsA[] = "Error: Database schema is not queryable"; - } catch(StorageConnectionException $e) { - $errorsA[] = "Error: Database is not available"; - } - $storage->close(); - - $values = array(); - - $values['resultQuestions'] = $resultQ; - $values['errorsQuestions'] = $errorsQ; - $values['resultActivities'] = $resultA; - $values['errorsActivities'] = $errorsA; - - $container->setTitle('Home'); - - $container->render('home.html.php', $values); - } -} diff --git a/Jeopardy/php/controllers/LoginController.php b/Jeopardy/php/controllers/LoginController.php deleted file mode 100644 index 3196c30..0000000 --- a/Jeopardy/php/controllers/LoginController.php +++ /dev/null @@ -1,75 +0,0 @@ -container->config['defaultLoginRedirectPage']; - if(array_key_exists('lastPage', $_SESSION)) { - $this->redirect($_SESSION('lastPage')); - } else { - $this->redirect($this->container->router->generate($defaultPage)); - } - } - - public function loginAction() { - $login = $this->container->getLogin(); - - if($login->isLoggedIn()) { - $this->doRedirect(); - } - - $errors = array(); - if($_SERVER['REQUEST_METHOD'] === 'POST') { - $username = $this->getPostVariable("username"); - $password = $this->getPostVariable("password"); - - if(empty($username)) { - $errors['username'] = "Please enter a Username."; - } - if(empty($password)) { - $errors['password'] = "Please enter a Password."; - } - if(!empty($username) && !empty($password)) { - try { - if($login->login($username, $password)) { - $this->container->setNotice("Success! You have been successfully logged in."); - $this->doRedirect(); - } else { - $errors['login'] = "Invalid credentials. Please check your username and password, and try again."; - } - } catch (StorageException $e) { - $errors['login'] = "Error: Database is not available."; - } - - - } - } - - $values = array(); - $values['errors'] = $errors; - - $this->container->setTitle("Login"); - $this->container->render("login.html.php", $values); - } - - public function logoutAction() { - $login = $this->container->getLogin(); - - $login->logout(); - - // force a new session, for the notice - $this->container->login = new Login($this->container->storage); - - $this->container->setNotice("Success! You have been successfully logged out."); - $this->doRedirect(); - } -} diff --git a/Jeopardy/php/controllers/ReportsController.php b/Jeopardy/php/controllers/ReportsController.php deleted file mode 100644 index 865ecc3..0000000 --- a/Jeopardy/php/controllers/ReportsController.php +++ /dev/null @@ -1,103 +0,0 @@ -container; - $storage = $container->getStorage(); - - $reportPage = $this->getPageVariable('rp'); - $editPage = $this->getPageVariable('ep'); - $newPage = $this->getPageVariable('np'); - $deletePage = $this->getPageVariable('dp'); - - $maxResults = 5; - - $reportResultCount = 0; - $reportResult = array(); - $reportErrors = array(); - try { - $reportResult = $storage->getTopReports($reportPage, $maxResults); - $reportResultCount = $storage->getCountReports(); - } catch(StorageSchemaException $e) { - $reportErrors[] = "Error: Database schema is not queryable"; - } catch(StorageConnectionException $e) { - $reportErrors[] = "Error: Database is not available"; - } - - $editResultCount = 0; - $editResult = array(); - $editErrors = array(); - try { - $editResult = $storage->getTopEdits($editPage, $maxResults); - $editResultCount = $storage->getCountEdits(); - } catch(StorageSchemaException $e) { - $editErrors[] = "Error: Database schema is not queryable"; - } catch(StorageConnectionException $e) { - $editErrors[] = "Error: Database is not available"; - } - - $newResultCount = 0; - $newResult = array(); - $newErrors = array(); - try { - $newResult = $storage->getTopNewQuestions($newPage, $maxResults); - $newResultCount = $storage->getCountNewQuestions(); - } catch(StorageSchemaException $e) { - $newErrors[] = "Error: Database schema is not queryable"; - } catch(StorageConnectionException $e) { - $newErrors[] = "Error: Database is not available"; - } - - $deleteResultCount = 0; - $deleteResult = array(); - $deleteErrors = array(); - try { - $deleteResult = $storage->getTopDeletions($deletePage, $maxResults); - $deleteResultCount = $storage->getCountDeletions(); - } catch(StorageSchemaException $e) { - $deleteErrors[] = "Error: Database schema is not queryable"; - } catch(StorageConnectionException $e) { - $deleteErrors[] = "Error: Database is not available"; - } - - $values = array(); - $values['maxResults'] = $maxResults; - - $values['reportResultCount'] = $reportResultCount; - $values['reportResult'] = $reportResult; - $values['reportErrors'] = $reportErrors; - $values['reportPage'] = $reportPage; - - $values['editResultCount'] = $editResultCount; - $values['editResult'] = $editResult; - $values['editErrors'] = $editErrors; - $values['editPage'] = $editPage; - - $values['newResultCount'] = $newResultCount; - $values['newResult'] = $newResult; - $values['newErrors'] = $newErrors; - $values['newPage'] = $newPage; - - $values['deleteResultCount'] = $deleteResultCount; - $values['deleteResult'] = $deleteResult; - $values['deleteErrors'] = $deleteErrors; - $values['deletePage'] = $deletePage; - - $container->setTitle('Reports'); - - $container->render('reports.html.php', $values); - } -} diff --git a/Jeopardy/php/controllers/StatsController.php b/Jeopardy/php/controllers/StatsController.php deleted file mode 100644 index 4b451b7..0000000 --- a/Jeopardy/php/controllers/StatsController.php +++ /dev/null @@ -1,126 +0,0 @@ -container; - $storage = $container->getStorage(); - - $dayResult = array(); - $dayErrors = array(); - try { - $dayResult = $storage->getDayTopScores(1, 10); - } catch(StorageSchemaException $e) { - $dayErrors[] = "Error: Database schema is not queryable"; - } catch(StorageConnectionException $e) { - $dayErrors[] = "Error: Database is not available"; - } - - $weekResult = array(); - $weekErrors = array(); - try { - $weekResult = $storage->getWeekTopScores(1, 10); - } catch(StorageSchemaException $e) { - $weekErrors[] = "Error: Database schema is not queryable"; - } catch(StorageConnectionException $e) { - $weekErrors[] = "Error: Database is not available"; - } - - $monthResult = array(); - $monthErrors = array(); - try { - $monthResult = $storage->getMonthTopScores(1, 10); - } catch(StorageSchemaException $e) { - $monthErrors[] = "Error: Database schema is not queryable"; - } catch(StorageConnectionException $e) { - $monthErrors[] = "Error: Database is not available"; - } - - $yearResult = array(); - $yearErrors = array(); - try { - $yearResult = $storage->getYearTopScores(1, 10); - } catch(StorageSchemaException $e) { - $yearErrors[] = "Error: Database schema is not queryable"; - } catch(StorageConnectionException $e) { - $yearErrors[] = "Error: Database is not available"; - } - - $values = array(); - $values['dayResult'] = $dayResult; - $values['dayErrors'] = $dayErrors; - $values['weekResult'] = $weekResult; - $values['weekErrors'] = $weekErrors; - $values['monthResult'] = $monthResult; - $values['monthErrors'] = $monthErrors; - $values['yearResult'] = $yearResult; - $values['yearErrors'] = $yearErrors; - - $container->setTitle('Stats'); - - $container->render('stats.html.php', $values); - - } - - public function topAction($args) { - $container = $this->container; - $storage = $container->getStorage(); - - $timespans = array('day'=>'Day', 'week'=>'Week', 'month'=>'Month', 'year'=>'Year'); - $timespan = 'day'; - $timeDesc = 'Day'; - if(array_key_exists('timespan', $args)) { - if(array_key_exists(strtolower($args['timespan']), $timespans)) { - $timespan = strtolower($args['timespan']); - $timeDesc = $timespans[$timespan]; - } - } - - if(array_key_exists('page', $_GET)) { - $page = $_GET['page']; - } - if(!isset($page)) { - $page = 1; - } - if($page < 1) { - $page = 1; - } - - $maxResults = 20; - - $resultCount = 0; - $result = array(); - $errors = array(); - try { - if ($timespan == 'week') { - $result = $storage->getWeekTopScores($page, $maxResults); - $resultCount = $storage->getCountWeekTopScores(); - } else if ($timespan == 'month') { - $result = $storage->getMonthTopScores($page, $maxResults); - $resultCount = $storage->getCountMonthTopScores(); - } else if ($timespan == 'year') { - $result = $storage->getYearTopScores($page, $maxResults); - $resultCount = $storage->getCountYearTopScores(); - } else { - $result = $storage->getDayTopScores($page, $maxResults); - $resultCount = $storage->getCountDayTopScores(); - } - } catch(StorageSchemaException $e) { - $errors[] = "Error: Database schema is not queryable"; - } catch(StorageConnectionException $e) { - $errors[] = "Error: Database is not available"; - } - - $values = array(); - $values['result'] = $result; - $values['resultCount'] = $resultCount; - $values['maxResults'] = $maxResults; - $values['page'] = $page; - $values['timespan'] = $timespan; - $values['timeDesc'] = $timeDesc; - $values['errors'] = $errors; - - $container->setTitle('Top Scores for ' . $timeDesc); - - $container->render('top.html.php', $values); - } -} diff --git a/Jeopardy/php/controllers/UserController.php b/Jeopardy/php/controllers/UserController.php deleted file mode 100644 index 8abca44..0000000 --- a/Jeopardy/php/controllers/UserController.php +++ /dev/null @@ -1,186 +0,0 @@ -container; - $storage = $container->getStorage(); - - $username = ''; - $usernameCanonical = ''; - - if(array_key_exists('username', $_GET)) { - // Convert username to lowercase in irc - $username = $_GET['username']; - $ircLowerSymbols = array("\\"=>"|", "["=>"{", "]"=>"}", "~"=>"^"); - $usernameCanonical = strtr($username, $ircLowerSymbols); - $usernameCanonical = strtolower($usernameCanonical); - } - - if(array_key_exists('page', $_GET)) { - $page = $_GET['page']; - } - if(!isset($page)) { - $page = 1; - } - if($page < 1) { - $page = 1; - } - - $maxResults = 10; - $usersCount = 0; - $users = array(); - $errors = array(); - - try { - $users = $storage->getUserLikeUsernameCanonical($usernameCanonical, $page, $maxResults); - $usersCount = $storage->getCountUserLikeUsernameCanonical($usernameCanonical); - } catch(StorageSchemaException $e) { - $errors[] = "Error: Database schema is not queryable"; - } catch(StorageConnectionException $e) { - $errors[] = "Error: Database is not available"; - } - - $storage->close(); - - // Redirect to profile if only 1 result found - if(count($users) == 1) { - $container->redirect($container->router->generate('profile', array("username"=>$users[0]['username']))); - } - - $values = array(); - $values['username'] = $username; - $values['usernameCanonical'] = $usernameCanonical; - $values['page'] = $page; - $values['maxResults'] = $maxResults; - $values['usersCount'] = $usersCount; - $values['users'] = $users; - $values['errors'] = $errors; - - $container->setTitle('Players'); - - $container->render('user.html.php', $values); - } - - public function profileAction($args) { - $container = $this->container; - $storage = $container->getStorage(); - - $username = ''; - $usernameCanonical = ''; - - if(array_key_exists('username', $args)) { - $username = $args['username']; - } - - $username = str_replace('+', '%2b', $username); - $username = urldecode($username); - - $ircLowerSymbols = array("\\"=>"|", "["=>"{", "]"=>"}", "~"=>"^"); - $usernameCanonical = strtr($username, $ircLowerSymbols); - $usernameCanonical = strtolower($usernameCanonical); - - $lastSeen = 'Never'; - - $result = array(); - $result['usrname'] = "Not found"; - $result['count'] = 0; - $result['score'] = 0; - $result['points'] = 0; - $result['q_asked'] = 0; - $result['num_e'] = 0; - $result['num_e_accepted'] = 0; - $result['num_q'] = 0; - $result['num_q_accepted'] = 0; - $result['num_r'] = 0; - $result['highest_streak'] = 0; - - $userProfile = $result; - $errors = array(); - - if ($username != '') { - try { - $profileResult = $storage->getUserProfileInformation($usernameCanonical); - if(count($profileResult) > 0) { - if(array_key_exists('usrname', $profileResult[0])) { - if(!is_null($profileResult[0]['usrname'])) { - $userProfile = $profileResult[0]; - } - } - } - $lastSeenQuery = $storage->getTimeSinceLastPlayed($usernameCanonical); - if(count($lastSeenQuery) > 0) { - if(array_key_exists('last_updated', $lastSeenQuery[0])) { - if(!is_null($lastSeenQuery[0]['last_updated'])) { - $lastSeenSeconds = strtotime("now") - $lastSeenQuery[0]['last_updated']; - $lastSeenObj = $this->secondsToTime($lastSeenSeconds); - $lastSeen = ''; - if($lastSeenObj["d"] > 0) { - $lastSeen .= $lastSeenObj["d"] . ' days '; - } - if($lastSeenObj["h"] > 0) { - $lastSeen .= $lastSeenObj["h"] . ' hours '; - } - if($lastSeenObj["m"] > 0) { - $lastSeen .= $lastSeenObj["m"] . ' mins '; - } - if($lastSeenObj["s"] > 0) { - $lastSeen .= $lastSeenObj["s"] . ' secs'; - } - if($lastSeen != '') { - $lastSeen .= ' ago'; - } - } - } - } - } catch(StorageSchemaException $e) { - $errors[] = "Error: Database schema is not queryable"; - } catch(StorageConnectionException $e) { - $errors[] = "Error: Database is not available"; - } - $storage->close(); - } - - $values = array(); - - $values['userProfile'] = $userProfile; - $values['username'] = $username; - $values['usernameCanonical'] = $usernameCanonical; - $values['errors'] = $errors; - $values['lastSeen'] = $lastSeen; - - $container->setTitle($username); - - $container->render('profile.html.php', $values); - } - - protected function secondsToTime($inputSeconds) { - $secondsInAMinute = 60; - $secondsInAnHour = 60 * $secondsInAMinute; - $secondsInADay = 24 * $secondsInAnHour; - - // extract days - $days = floor($inputSeconds / $secondsInADay); - - // extract hours - $hourSeconds = $inputSeconds % $secondsInADay; - $hours = floor($hourSeconds / $secondsInAnHour); - - // extract minutes - $minuteSeconds = $hourSeconds % $secondsInAnHour; - $minutes = floor($minuteSeconds / $secondsInAMinute); - - // extract the remaining seconds - $remainingSeconds = $minuteSeconds % $secondsInAMinute; - $seconds = ceil($remainingSeconds); - - // return the final array - $obj = array( - 'd' => (int) $days, - 'h' => (int) $hours, - 'm' => (int) $minutes, - 's' => (int) $seconds, - ); - return $obj; - } - -} diff --git a/Jeopardy/php/css/bootstrap-responsive.css b/Jeopardy/php/css/bootstrap-responsive.css deleted file mode 100644 index c0bba15..0000000 --- a/Jeopardy/php/css/bootstrap-responsive.css +++ /dev/null @@ -1,1109 +0,0 @@ -/*! - * Bootstrap Responsive v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */ - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - line-height: 0; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -@-ms-viewport { - width: device-width; -} - -.hidden { - display: none; - visibility: hidden; -} - -.visible-phone { - display: none !important; -} - -.visible-tablet { - display: none !important; -} - -.hidden-desktop { - display: none !important; -} - -.visible-desktop { - display: inherit !important; -} - -@media (min-width: 768px) and (max-width: 979px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important ; - } - .visible-tablet { - display: inherit !important; - } - .hidden-tablet { - display: none !important; - } -} - -@media (max-width: 767px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important; - } - .visible-phone { - display: inherit !important; - } - .hidden-phone { - display: none !important; - } -} - -.visible-print { - display: none !important; -} - -@media print { - .visible-print { - display: inherit !important; - } - .hidden-print { - display: none !important; - } -} - -@media (min-width: 1200px) { - .row { - margin-left: -30px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - line-height: 0; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 30px; - } - .container, - .navbar-static-top .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 1170px; - } - .span12 { - width: 1170px; - } - .span11 { - width: 1070px; - } - .span10 { - width: 970px; - } - .span9 { - width: 870px; - } - .span8 { - width: 770px; - } - .span7 { - width: 670px; - } - .span6 { - width: 570px; - } - .span5 { - width: 470px; - } - .span4 { - width: 370px; - } - .span3 { - width: 270px; - } - .span2 { - width: 170px; - } - .span1 { - width: 70px; - } - .offset12 { - margin-left: 1230px; - } - .offset11 { - margin-left: 1130px; - } - .offset10 { - margin-left: 1030px; - } - .offset9 { - margin-left: 930px; - } - .offset8 { - margin-left: 830px; - } - .offset7 { - margin-left: 730px; - } - .offset6 { - margin-left: 630px; - } - .offset5 { - margin-left: 530px; - } - .offset4 { - margin-left: 430px; - } - .offset3 { - margin-left: 330px; - } - .offset2 { - margin-left: 230px; - } - .offset1 { - margin-left: 130px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - line-height: 0; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.564102564102564%; - *margin-left: 2.5109110747408616%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.564102564102564%; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; - } - .row-fluid .span11 { - width: 91.45299145299145%; - *width: 91.39979996362975%; - } - .row-fluid .span10 { - width: 82.90598290598291%; - *width: 82.8527914166212%; - } - .row-fluid .span9 { - width: 74.35897435897436%; - *width: 74.30578286961266%; - } - .row-fluid .span8 { - width: 65.81196581196582%; - *width: 65.75877432260411%; - } - .row-fluid .span7 { - width: 57.26495726495726%; - *width: 57.21176577559556%; - } - .row-fluid .span6 { - width: 48.717948717948715%; - *width: 48.664757228587014%; - } - .row-fluid .span5 { - width: 40.17094017094017%; - *width: 40.11774868157847%; - } - .row-fluid .span4 { - width: 31.623931623931625%; - *width: 31.570740134569924%; - } - .row-fluid .span3 { - width: 23.076923076923077%; - *width: 23.023731587561375%; - } - .row-fluid .span2 { - width: 14.52991452991453%; - *width: 14.476723040552828%; - } - .row-fluid .span1 { - width: 5.982905982905983%; - *width: 5.929714493544281%; - } - .row-fluid .offset12 { - margin-left: 105.12820512820512%; - *margin-left: 105.02182214948171%; - } - .row-fluid .offset12:first-child { - margin-left: 102.56410256410257%; - *margin-left: 102.45771958537915%; - } - .row-fluid .offset11 { - margin-left: 96.58119658119658%; - *margin-left: 96.47481360247316%; - } - .row-fluid .offset11:first-child { - margin-left: 94.01709401709402%; - *margin-left: 93.91071103837061%; - } - .row-fluid .offset10 { - margin-left: 88.03418803418803%; - *margin-left: 87.92780505546462%; - } - .row-fluid .offset10:first-child { - margin-left: 85.47008547008548%; - *margin-left: 85.36370249136206%; - } - .row-fluid .offset9 { - margin-left: 79.48717948717949%; - *margin-left: 79.38079650845607%; - } - .row-fluid .offset9:first-child { - margin-left: 76.92307692307693%; - *margin-left: 76.81669394435352%; - } - .row-fluid .offset8 { - margin-left: 70.94017094017094%; - *margin-left: 70.83378796144753%; - } - .row-fluid .offset8:first-child { - margin-left: 68.37606837606839%; - *margin-left: 68.26968539734497%; - } - .row-fluid .offset7 { - margin-left: 62.393162393162385%; - *margin-left: 62.28677941443899%; - } - .row-fluid .offset7:first-child { - margin-left: 59.82905982905982%; - *margin-left: 59.72267685033642%; - } - .row-fluid .offset6 { - margin-left: 53.84615384615384%; - *margin-left: 53.739770867430444%; - } - .row-fluid .offset6:first-child { - margin-left: 51.28205128205128%; - *margin-left: 51.175668303327875%; - } - .row-fluid .offset5 { - margin-left: 45.299145299145295%; - *margin-left: 45.1927623204219%; - } - .row-fluid .offset5:first-child { - margin-left: 42.73504273504273%; - *margin-left: 42.62865975631933%; - } - .row-fluid .offset4 { - margin-left: 36.75213675213675%; - *margin-left: 36.645753773413354%; - } - .row-fluid .offset4:first-child { - margin-left: 34.18803418803419%; - *margin-left: 34.081651209310785%; - } - .row-fluid .offset3 { - margin-left: 28.205128205128204%; - *margin-left: 28.0987452264048%; - } - .row-fluid .offset3:first-child { - margin-left: 25.641025641025642%; - *margin-left: 25.53464266230224%; - } - .row-fluid .offset2 { - margin-left: 19.65811965811966%; - *margin-left: 19.551736679396257%; - } - .row-fluid .offset2:first-child { - margin-left: 17.094017094017094%; - *margin-left: 16.98763411529369%; - } - .row-fluid .offset1 { - margin-left: 11.11111111111111%; - *margin-left: 11.004728132387708%; - } - .row-fluid .offset1:first-child { - margin-left: 8.547008547008547%; - *margin-left: 8.440625568285142%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 30px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 1156px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 1056px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 956px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 856px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 756px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 656px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 556px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 456px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 356px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 256px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 156px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 56px; - } - .thumbnails { - margin-left: -30px; - } - .thumbnails > li { - margin-left: 30px; - } - .row-fluid .thumbnails { - margin-left: 0; - } -} - -@media (min-width: 768px) and (max-width: 979px) { - .row { - margin-left: -20px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - line-height: 0; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; - } - .container, - .navbar-static-top .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 724px; - } - .span12 { - width: 724px; - } - .span11 { - width: 662px; - } - .span10 { - width: 600px; - } - .span9 { - width: 538px; - } - .span8 { - width: 476px; - } - .span7 { - width: 414px; - } - .span6 { - width: 352px; - } - .span5 { - width: 290px; - } - .span4 { - width: 228px; - } - .span3 { - width: 166px; - } - .span2 { - width: 104px; - } - .span1 { - width: 42px; - } - .offset12 { - margin-left: 764px; - } - .offset11 { - margin-left: 702px; - } - .offset10 { - margin-left: 640px; - } - .offset9 { - margin-left: 578px; - } - .offset8 { - margin-left: 516px; - } - .offset7 { - margin-left: 454px; - } - .offset6 { - margin-left: 392px; - } - .offset5 { - margin-left: 330px; - } - .offset4 { - margin-left: 268px; - } - .offset3 { - margin-left: 206px; - } - .offset2 { - margin-left: 144px; - } - .offset1 { - margin-left: 82px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - line-height: 0; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.7624309392265194%; - *margin-left: 2.709239449864817%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.7624309392265194%; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; - } - .row-fluid .span11 { - width: 91.43646408839778%; - *width: 91.38327259903608%; - } - .row-fluid .span10 { - width: 82.87292817679558%; - *width: 82.81973668743387%; - } - .row-fluid .span9 { - width: 74.30939226519337%; - *width: 74.25620077583166%; - } - .row-fluid .span8 { - width: 65.74585635359117%; - *width: 65.69266486422946%; - } - .row-fluid .span7 { - width: 57.18232044198895%; - *width: 57.12912895262725%; - } - .row-fluid .span6 { - width: 48.61878453038674%; - *width: 48.56559304102504%; - } - .row-fluid .span5 { - width: 40.05524861878453%; - *width: 40.00205712942283%; - } - .row-fluid .span4 { - width: 31.491712707182323%; - *width: 31.43852121782062%; - } - .row-fluid .span3 { - width: 22.92817679558011%; - *width: 22.87498530621841%; - } - .row-fluid .span2 { - width: 14.3646408839779%; - *width: 14.311449394616199%; - } - .row-fluid .span1 { - width: 5.801104972375691%; - *width: 5.747913483013988%; - } - .row-fluid .offset12 { - margin-left: 105.52486187845304%; - *margin-left: 105.41847889972962%; - } - .row-fluid .offset12:first-child { - margin-left: 102.76243093922652%; - *margin-left: 102.6560479605031%; - } - .row-fluid .offset11 { - margin-left: 96.96132596685082%; - *margin-left: 96.8549429881274%; - } - .row-fluid .offset11:first-child { - margin-left: 94.1988950276243%; - *margin-left: 94.09251204890089%; - } - .row-fluid .offset10 { - margin-left: 88.39779005524862%; - *margin-left: 88.2914070765252%; - } - .row-fluid .offset10:first-child { - margin-left: 85.6353591160221%; - *margin-left: 85.52897613729868%; - } - .row-fluid .offset9 { - margin-left: 79.8342541436464%; - *margin-left: 79.72787116492299%; - } - .row-fluid .offset9:first-child { - margin-left: 77.07182320441989%; - *margin-left: 76.96544022569647%; - } - .row-fluid .offset8 { - margin-left: 71.2707182320442%; - *margin-left: 71.16433525332079%; - } - .row-fluid .offset8:first-child { - margin-left: 68.50828729281768%; - *margin-left: 68.40190431409427%; - } - .row-fluid .offset7 { - margin-left: 62.70718232044199%; - *margin-left: 62.600799341718584%; - } - .row-fluid .offset7:first-child { - margin-left: 59.94475138121547%; - *margin-left: 59.838368402492065%; - } - .row-fluid .offset6 { - margin-left: 54.14364640883978%; - *margin-left: 54.037263430116376%; - } - .row-fluid .offset6:first-child { - margin-left: 51.38121546961326%; - *margin-left: 51.27483249088986%; - } - .row-fluid .offset5 { - margin-left: 45.58011049723757%; - *margin-left: 45.47372751851417%; - } - .row-fluid .offset5:first-child { - margin-left: 42.81767955801105%; - *margin-left: 42.71129657928765%; - } - .row-fluid .offset4 { - margin-left: 37.01657458563536%; - *margin-left: 36.91019160691196%; - } - .row-fluid .offset4:first-child { - margin-left: 34.25414364640884%; - *margin-left: 34.14776066768544%; - } - .row-fluid .offset3 { - margin-left: 28.45303867403315%; - *margin-left: 28.346655695309746%; - } - .row-fluid .offset3:first-child { - margin-left: 25.69060773480663%; - *margin-left: 25.584224756083227%; - } - .row-fluid .offset2 { - margin-left: 19.88950276243094%; - *margin-left: 19.783119783707537%; - } - .row-fluid .offset2:first-child { - margin-left: 17.12707182320442%; - *margin-left: 17.02068884448102%; - } - .row-fluid .offset1 { - margin-left: 11.32596685082873%; - *margin-left: 11.219583872105325%; - } - .row-fluid .offset1:first-child { - margin-left: 8.56353591160221%; - *margin-left: 8.457152932878806%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 710px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 648px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 586px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 524px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 462px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 400px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 338px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 276px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 214px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 152px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 90px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 28px; - } -} - -@media (max-width: 767px) { - body { - padding-right: 20px; - padding-left: 20px; - } - .navbar-fixed-top, - .navbar-fixed-bottom, - .navbar-static-top { - margin-right: -20px; - margin-left: -20px; - } - .container-fluid { - padding: 0; - } - .dl-horizontal dt { - float: none; - width: auto; - clear: none; - text-align: left; - } - .dl-horizontal dd { - margin-left: 0; - } - .container { - width: auto; - } - .row-fluid { - width: 100%; - } - .row, - .thumbnails { - margin-left: 0; - } - .thumbnails > li { - float: none; - margin-left: 0; - } - [class*="span"], - .uneditable-input[class*="span"], - .row-fluid [class*="span"] { - display: block; - float: none; - width: 100%; - margin-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .span12, - .row-fluid .span12 { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="offset"]:first-child { - margin-left: 0; - } - .input-large, - .input-xlarge, - .input-xxlarge, - input[class*="span"], - select[class*="span"], - textarea[class*="span"], - .uneditable-input { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .input-prepend input, - .input-append input, - .input-prepend input[class*="span"], - .input-append input[class*="span"] { - display: inline-block; - width: auto; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 0; - } - .modal { - position: fixed; - top: 20px; - right: 20px; - left: 20px; - width: auto; - margin: 0; - } - .modal.fade { - top: -100px; - } - .modal.fade.in { - top: 20px; - } -} - -@media (max-width: 480px) { - .nav-collapse { - -webkit-transform: translate3d(0, 0, 0); - } - .page-header h1 small { - display: block; - line-height: 20px; - } - input[type="checkbox"], - input[type="radio"] { - border: 1px solid #ccc; - } - .form-horizontal .control-label { - float: none; - width: auto; - padding-top: 0; - text-align: left; - } - .form-horizontal .controls { - margin-left: 0; - } - .form-horizontal .control-list { - padding-top: 0; - } - .form-horizontal .form-actions { - padding-right: 10px; - padding-left: 10px; - } - .media .pull-left, - .media .pull-right { - display: block; - float: none; - margin-bottom: 10px; - } - .media-object { - margin-right: 0; - margin-left: 0; - } - .modal { - top: 10px; - right: 10px; - left: 10px; - } - .modal-header .close { - padding: 10px; - margin: -10px; - } - .carousel-caption { - position: static; - } -} - -@media (max-width: 979px) { - body { - padding-top: 0; - } - .navbar-fixed-top, - .navbar-fixed-bottom { - position: static; - } - .navbar-fixed-top { - margin-bottom: 20px; - } - .navbar-fixed-bottom { - margin-top: 20px; - } - .navbar-fixed-top .navbar-inner, - .navbar-fixed-bottom .navbar-inner { - padding: 5px; - } - .navbar .container { - width: auto; - padding: 0; - } - .navbar .brand { - padding-right: 10px; - padding-left: 10px; - margin: 0 0 0 -5px; - } - .nav-collapse { - clear: both; - } - .nav-collapse .nav { - float: none; - margin: 0 0 10px; - } - .nav-collapse .nav > li { - float: none; - } - .nav-collapse .nav > li > a { - margin-bottom: 2px; - } - .nav-collapse .nav > .divider-vertical { - display: none; - } - .nav-collapse .nav .nav-header { - color: #777777; - text-shadow: none; - } - .nav-collapse .nav > li > a, - .nav-collapse .dropdown-menu a { - padding: 9px 15px; - font-weight: bold; - color: #777777; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - } - .nav-collapse .btn { - padding: 4px 10px 4px; - font-weight: normal; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .nav-collapse .dropdown-menu li + li a { - margin-bottom: 2px; - } - .nav-collapse .nav > li > a:hover, - .nav-collapse .nav > li > a:focus, - .nav-collapse .dropdown-menu a:hover, - .nav-collapse .dropdown-menu a:focus { - background-color: #f2f2f2; - } - .navbar-inverse .nav-collapse .nav > li > a, - .navbar-inverse .nav-collapse .dropdown-menu a { - color: #999999; - } - .navbar-inverse .nav-collapse .nav > li > a:hover, - .navbar-inverse .nav-collapse .nav > li > a:focus, - .navbar-inverse .nav-collapse .dropdown-menu a:hover, - .navbar-inverse .nav-collapse .dropdown-menu a:focus { - background-color: #111111; - } - .nav-collapse.in .btn-group { - padding: 0; - margin-top: 5px; - } - .nav-collapse .dropdown-menu { - position: static; - top: auto; - left: auto; - display: none; - float: none; - max-width: none; - padding: 0; - margin: 0 15px; - background-color: transparent; - border: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - } - .nav-collapse .open > .dropdown-menu { - display: block; - } - .nav-collapse .dropdown-menu:before, - .nav-collapse .dropdown-menu:after { - display: none; - } - .nav-collapse .dropdown-menu .divider { - display: none; - } - .nav-collapse .nav > li > .dropdown-menu:before, - .nav-collapse .nav > li > .dropdown-menu:after { - display: none; - } - .nav-collapse .navbar-form, - .nav-collapse .navbar-search { - float: none; - padding: 10px 15px; - margin: 10px 0; - border-top: 1px solid #f2f2f2; - border-bottom: 1px solid #f2f2f2; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - } - .navbar-inverse .nav-collapse .navbar-form, - .navbar-inverse .nav-collapse .navbar-search { - border-top-color: #111111; - border-bottom-color: #111111; - } - .navbar .nav-collapse .nav.pull-right { - float: none; - margin-left: 0; - } - .nav-collapse, - .nav-collapse.collapse { - height: 0; - overflow: hidden; - } - .navbar .btn-navbar { - display: block; - } - .navbar-static .navbar-inner { - padding-right: 10px; - padding-left: 10px; - } -} - -@media (min-width: 980px) { - .nav-collapse.collapse { - height: auto !important; - overflow: visible !important; - } -} diff --git a/Jeopardy/php/css/bootstrap-responsive.min.css b/Jeopardy/php/css/bootstrap-responsive.min.css deleted file mode 100644 index 96a435b..0000000 --- a/Jeopardy/php/css/bootstrap-responsive.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap Responsive v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} diff --git a/Jeopardy/php/css/bootstrap.css b/Jeopardy/php/css/bootstrap.css deleted file mode 100644 index 5b7fe7e..0000000 --- a/Jeopardy/php/css/bootstrap.css +++ /dev/null @@ -1,6167 +0,0 @@ -/*! - * Bootstrap v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */ - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - line-height: 0; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} - -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} - -audio:not([controls]) { - display: none; -} - -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -a:hover, -a:active { - outline: 0; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - width: auto\9; - height: auto; - max-width: 100%; - vertical-align: middle; - border: 0; - -ms-interpolation-mode: bicubic; -} - -#map_canvas img, -.google-maps img { - max-width: none; -} - -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} - -button, -input { - *overflow: visible; - line-height: normal; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} - -label, -select, -button, -input[type="button"], -input[type="reset"], -input[type="submit"], -input[type="radio"], -input[type="checkbox"] { - cursor: pointer; -} - -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} - -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -@media print { - * { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - .ir a:after, - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - @page { - margin: 0.5cm; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } -} - -body { - margin: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 20px; - color: #333333; - background-color: #ffffff; -} - -a { - color: #0088cc; - text-decoration: none; -} - -a:hover, -a:focus { - color: #005580; - text-decoration: underline; -} - -.img-rounded { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.img-polaroid { - padding: 4px; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); -} - -.img-circle { - -webkit-border-radius: 500px; - -moz-border-radius: 500px; - border-radius: 500px; -} - -.row { - margin-left: -20px; - *zoom: 1; -} - -.row:before, -.row:after { - display: table; - line-height: 0; - content: ""; -} - -.row:after { - clear: both; -} - -[class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; -} - -.container, -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.span12 { - width: 940px; -} - -.span11 { - width: 860px; -} - -.span10 { - width: 780px; -} - -.span9 { - width: 700px; -} - -.span8 { - width: 620px; -} - -.span7 { - width: 540px; -} - -.span6 { - width: 460px; -} - -.span5 { - width: 380px; -} - -.span4 { - width: 300px; -} - -.span3 { - width: 220px; -} - -.span2 { - width: 140px; -} - -.span1 { - width: 60px; -} - -.offset12 { - margin-left: 980px; -} - -.offset11 { - margin-left: 900px; -} - -.offset10 { - margin-left: 820px; -} - -.offset9 { - margin-left: 740px; -} - -.offset8 { - margin-left: 660px; -} - -.offset7 { - margin-left: 580px; -} - -.offset6 { - margin-left: 500px; -} - -.offset5 { - margin-left: 420px; -} - -.offset4 { - margin-left: 340px; -} - -.offset3 { - margin-left: 260px; -} - -.offset2 { - margin-left: 180px; -} - -.offset1 { - margin-left: 100px; -} - -.row-fluid { - width: 100%; - *zoom: 1; -} - -.row-fluid:before, -.row-fluid:after { - display: table; - line-height: 0; - content: ""; -} - -.row-fluid:after { - clear: both; -} - -.row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.127659574468085%; - *margin-left: 2.074468085106383%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.row-fluid [class*="span"]:first-child { - margin-left: 0; -} - -.row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.127659574468085%; -} - -.row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; -} - -.row-fluid .span11 { - width: 91.48936170212765%; - *width: 91.43617021276594%; -} - -.row-fluid .span10 { - width: 82.97872340425532%; - *width: 82.92553191489361%; -} - -.row-fluid .span9 { - width: 74.46808510638297%; - *width: 74.41489361702126%; -} - -.row-fluid .span8 { - width: 65.95744680851064%; - *width: 65.90425531914893%; -} - -.row-fluid .span7 { - width: 57.44680851063829%; - *width: 57.39361702127659%; -} - -.row-fluid .span6 { - width: 48.93617021276595%; - *width: 48.88297872340425%; -} - -.row-fluid .span5 { - width: 40.42553191489362%; - *width: 40.37234042553192%; -} - -.row-fluid .span4 { - width: 31.914893617021278%; - *width: 31.861702127659576%; -} - -.row-fluid .span3 { - width: 23.404255319148934%; - *width: 23.351063829787233%; -} - -.row-fluid .span2 { - width: 14.893617021276595%; - *width: 14.840425531914894%; -} - -.row-fluid .span1 { - width: 6.382978723404255%; - *width: 6.329787234042553%; -} - -.row-fluid .offset12 { - margin-left: 104.25531914893617%; - *margin-left: 104.14893617021275%; -} - -.row-fluid .offset12:first-child { - margin-left: 102.12765957446808%; - *margin-left: 102.02127659574467%; -} - -.row-fluid .offset11 { - margin-left: 95.74468085106382%; - *margin-left: 95.6382978723404%; -} - -.row-fluid .offset11:first-child { - margin-left: 93.61702127659574%; - *margin-left: 93.51063829787232%; -} - -.row-fluid .offset10 { - margin-left: 87.23404255319149%; - *margin-left: 87.12765957446807%; -} - -.row-fluid .offset10:first-child { - margin-left: 85.1063829787234%; - *margin-left: 84.99999999999999%; -} - -.row-fluid .offset9 { - margin-left: 78.72340425531914%; - *margin-left: 78.61702127659572%; -} - -.row-fluid .offset9:first-child { - margin-left: 76.59574468085106%; - *margin-left: 76.48936170212764%; -} - -.row-fluid .offset8 { - margin-left: 70.2127659574468%; - *margin-left: 70.10638297872339%; -} - -.row-fluid .offset8:first-child { - margin-left: 68.08510638297872%; - *margin-left: 67.9787234042553%; -} - -.row-fluid .offset7 { - margin-left: 61.70212765957446%; - *margin-left: 61.59574468085106%; -} - -.row-fluid .offset7:first-child { - margin-left: 59.574468085106375%; - *margin-left: 59.46808510638297%; -} - -.row-fluid .offset6 { - margin-left: 53.191489361702125%; - *margin-left: 53.085106382978715%; -} - -.row-fluid .offset6:first-child { - margin-left: 51.063829787234035%; - *margin-left: 50.95744680851063%; -} - -.row-fluid .offset5 { - margin-left: 44.68085106382979%; - *margin-left: 44.57446808510638%; -} - -.row-fluid .offset5:first-child { - margin-left: 42.5531914893617%; - *margin-left: 42.4468085106383%; -} - -.row-fluid .offset4 { - margin-left: 36.170212765957444%; - *margin-left: 36.06382978723405%; -} - -.row-fluid .offset4:first-child { - margin-left: 34.04255319148936%; - *margin-left: 33.93617021276596%; -} - -.row-fluid .offset3 { - margin-left: 27.659574468085104%; - *margin-left: 27.5531914893617%; -} - -.row-fluid .offset3:first-child { - margin-left: 25.53191489361702%; - *margin-left: 25.425531914893618%; -} - -.row-fluid .offset2 { - margin-left: 19.148936170212764%; - *margin-left: 19.04255319148936%; -} - -.row-fluid .offset2:first-child { - margin-left: 17.02127659574468%; - *margin-left: 16.914893617021278%; -} - -.row-fluid .offset1 { - margin-left: 10.638297872340425%; - *margin-left: 10.53191489361702%; -} - -.row-fluid .offset1:first-child { - margin-left: 8.51063829787234%; - *margin-left: 8.404255319148938%; -} - -[class*="span"].hide, -.row-fluid [class*="span"].hide { - display: none; -} - -[class*="span"].pull-right, -.row-fluid [class*="span"].pull-right { - float: right; -} - -.container { - margin-right: auto; - margin-left: auto; - *zoom: 1; -} - -.container:before, -.container:after { - display: table; - line-height: 0; - content: ""; -} - -.container:after { - clear: both; -} - -.container-fluid { - padding-right: 20px; - padding-left: 20px; - *zoom: 1; -} - -.container-fluid:before, -.container-fluid:after { - display: table; - line-height: 0; - content: ""; -} - -.container-fluid:after { - clear: both; -} - -p { - margin: 0 0 10px; -} - -.lead { - margin-bottom: 20px; - font-size: 21px; - font-weight: 200; - line-height: 30px; -} - -small { - font-size: 85%; -} - -strong { - font-weight: bold; -} - -em { - font-style: italic; -} - -cite { - font-style: normal; -} - -.muted { - color: #999999; -} - -a.muted:hover, -a.muted:focus { - color: #808080; -} - -.text-warning { - color: #c09853; -} - -a.text-warning:hover, -a.text-warning:focus { - color: #a47e3c; -} - -.text-error { - color: #b94a48; -} - -a.text-error:hover, -a.text-error:focus { - color: #953b39; -} - -.text-info { - color: #3a87ad; -} - -a.text-info:hover, -a.text-info:focus { - color: #2d6987; -} - -.text-success { - color: #468847; -} - -a.text-success:hover, -a.text-success:focus { - color: #356635; -} - -.text-left { - text-align: left; -} - -.text-right { - text-align: right; -} - -.text-center { - text-align: center; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 10px 0; - font-family: inherit; - font-weight: bold; - line-height: 20px; - color: inherit; - text-rendering: optimizelegibility; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - line-height: 1; - color: #999999; -} - -h1, -h2, -h3 { - line-height: 40px; -} - -h1 { - font-size: 38.5px; -} - -h2 { - font-size: 31.5px; -} - -h3 { - font-size: 24.5px; -} - -h4 { - font-size: 17.5px; -} - -h5 { - font-size: 14px; -} - -h6 { - font-size: 11.9px; -} - -h1 small { - font-size: 24.5px; -} - -h2 small { - font-size: 17.5px; -} - -h3 small { - font-size: 14px; -} - -h4 small { - font-size: 14px; -} - -.page-header { - padding-bottom: 9px; - margin: 20px 0 30px; - border-bottom: 1px solid #eeeeee; -} - -ul, -ol { - padding: 0; - margin: 0 0 10px 25px; -} - -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} - -li { - line-height: 20px; -} - -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} - -ul.inline, -ol.inline { - margin-left: 0; - list-style: none; -} - -ul.inline > li, -ol.inline > li { - display: inline-block; - *display: inline; - padding-right: 5px; - padding-left: 5px; - *zoom: 1; -} - -dl { - margin-bottom: 20px; -} - -dt, -dd { - line-height: 20px; -} - -dt { - font-weight: bold; -} - -dd { - margin-left: 10px; -} - -.dl-horizontal { - *zoom: 1; -} - -.dl-horizontal:before, -.dl-horizontal:after { - display: table; - line-height: 0; - content: ""; -} - -.dl-horizontal:after { - clear: both; -} - -.dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; -} - -.dl-horizontal dd { - margin-left: 180px; -} - -hr { - margin: 20px 0; - border: 0; - border-top: 1px solid #eeeeee; - border-bottom: 1px solid #ffffff; -} - -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999999; -} - -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} - -blockquote { - padding: 0 0 0 15px; - margin: 0 0 20px; - border-left: 5px solid #eeeeee; -} - -blockquote p { - margin-bottom: 0; - font-size: 17.5px; - font-weight: 300; - line-height: 1.25; -} - -blockquote small { - display: block; - line-height: 20px; - color: #999999; -} - -blockquote small:before { - content: '\2014 \00A0'; -} - -blockquote.pull-right { - float: right; - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; -} - -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} - -blockquote.pull-right small:before { - content: ''; -} - -blockquote.pull-right small:after { - content: '\00A0 \2014'; -} - -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} - -address { - display: block; - margin-bottom: 20px; - font-style: normal; - line-height: 20px; -} - -code, -pre { - padding: 0 3px 2px; - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; - font-size: 12px; - color: #333333; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -code { - padding: 2px 4px; - color: #d14; - white-space: nowrap; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} - -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 20px; - word-break: break-all; - word-wrap: break-word; - white-space: pre; - white-space: pre-wrap; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -pre.prettyprint { - margin-bottom: 20px; -} - -pre code { - padding: 0; - color: inherit; - white-space: pre; - white-space: pre-wrap; - background-color: transparent; - border: 0; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -form { - margin: 0 0 20px; -} - -fieldset { - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: 40px; - color: #333333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} - -legend small { - font-size: 15px; - color: #999999; -} - -label, -input, -button, -select, -textarea { - font-size: 14px; - font-weight: normal; - line-height: 20px; -} - -input, -button, -select, -textarea { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} - -label { - display: block; - margin-bottom: 5px; -} - -select, -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - display: inline-block; - height: 20px; - padding: 4px 6px; - margin-bottom: 10px; - font-size: 14px; - line-height: 20px; - color: #555555; - vertical-align: middle; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -input, -textarea, -.uneditable-input { - width: 206px; -} - -textarea { - height: auto; -} - -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - background-color: #ffffff; - border: 1px solid #cccccc; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; -} - -textarea:focus, -input[type="text"]:focus, -input[type="password"]:focus, -input[type="datetime"]:focus, -input[type="datetime-local"]:focus, -input[type="date"]:focus, -input[type="month"]:focus, -input[type="time"]:focus, -input[type="week"]:focus, -input[type="number"]:focus, -input[type="email"]:focus, -input[type="url"]:focus, -input[type="search"]:focus, -input[type="tel"]:focus, -input[type="color"]:focus, -.uneditable-input:focus { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); -} - -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - *margin-top: 0; - line-height: normal; -} - -input[type="file"], -input[type="image"], -input[type="submit"], -input[type="reset"], -input[type="button"], -input[type="radio"], -input[type="checkbox"] { - width: auto; -} - -select, -input[type="file"] { - height: 30px; - /* In IE7, the height of the select element cannot be changed by height, only font-size */ - - *margin-top: 4px; - /* For IE7, add top margin to align select with labels */ - - line-height: 30px; -} - -select { - width: 220px; - background-color: #ffffff; - border: 1px solid #cccccc; -} - -select[multiple], -select[size] { - height: auto; -} - -select:focus, -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.uneditable-input, -.uneditable-textarea { - color: #999999; - cursor: not-allowed; - background-color: #fcfcfc; - border-color: #cccccc; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); -} - -.uneditable-input { - overflow: hidden; - white-space: nowrap; -} - -.uneditable-textarea { - width: auto; - height: auto; -} - -input:-moz-placeholder, -textarea:-moz-placeholder { - color: #999999; -} - -input:-ms-input-placeholder, -textarea:-ms-input-placeholder { - color: #999999; -} - -input::-webkit-input-placeholder, -textarea::-webkit-input-placeholder { - color: #999999; -} - -.radio, -.checkbox { - min-height: 20px; - padding-left: 20px; -} - -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -20px; -} - -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} - -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} - -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} - -.input-mini { - width: 60px; -} - -.input-small { - width: 90px; -} - -.input-medium { - width: 150px; -} - -.input-large { - width: 210px; -} - -.input-xlarge { - width: 270px; -} - -.input-xxlarge { - width: 530px; -} - -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"] { - float: none; - margin-left: 0; -} - -.input-append input[class*="span"], -.input-append .uneditable-input[class*="span"], -.input-prepend input[class*="span"], -.input-prepend .uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"], -.row-fluid .input-prepend [class*="span"], -.row-fluid .input-append [class*="span"] { - display: inline-block; -} - -input, -textarea, -.uneditable-input { - margin-left: 0; -} - -.controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; -} - -input.span12, -textarea.span12, -.uneditable-input.span12 { - width: 926px; -} - -input.span11, -textarea.span11, -.uneditable-input.span11 { - width: 846px; -} - -input.span10, -textarea.span10, -.uneditable-input.span10 { - width: 766px; -} - -input.span9, -textarea.span9, -.uneditable-input.span9 { - width: 686px; -} - -input.span8, -textarea.span8, -.uneditable-input.span8 { - width: 606px; -} - -input.span7, -textarea.span7, -.uneditable-input.span7 { - width: 526px; -} - -input.span6, -textarea.span6, -.uneditable-input.span6 { - width: 446px; -} - -input.span5, -textarea.span5, -.uneditable-input.span5 { - width: 366px; -} - -input.span4, -textarea.span4, -.uneditable-input.span4 { - width: 286px; -} - -input.span3, -textarea.span3, -.uneditable-input.span3 { - width: 206px; -} - -input.span2, -textarea.span2, -.uneditable-input.span2 { - width: 126px; -} - -input.span1, -textarea.span1, -.uneditable-input.span1 { - width: 46px; -} - -.controls-row { - *zoom: 1; -} - -.controls-row:before, -.controls-row:after { - display: table; - line-height: 0; - content: ""; -} - -.controls-row:after { - clear: both; -} - -.controls-row [class*="span"], -.row-fluid .controls-row [class*="span"] { - float: left; -} - -.controls-row .checkbox[class*="span"], -.controls-row .radio[class*="span"] { - padding-top: 5px; -} - -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - cursor: not-allowed; - background-color: #eeeeee; -} - -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"][readonly], -input[type="checkbox"][readonly] { - background-color: transparent; -} - -.control-group.warning .control-label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #c09853; -} - -.control-group.warning .checkbox, -.control-group.warning .radio, -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #c09853; -} - -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - border-color: #c09853; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; -} - -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} - -.control-group.error .control-label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #b94a48; -} - -.control-group.error .checkbox, -.control-group.error .radio, -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #b94a48; -} - -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - border-color: #b94a48; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #953b39; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; -} - -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #b94a48; - background-color: #f2dede; - border-color: #b94a48; -} - -.control-group.success .control-label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #468847; -} - -.control-group.success .checkbox, -.control-group.success .radio, -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #468847; -} - -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - border-color: #468847; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; -} - -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} - -.control-group.info .control-label, -.control-group.info .help-block, -.control-group.info .help-inline { - color: #3a87ad; -} - -.control-group.info .checkbox, -.control-group.info .radio, -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - color: #3a87ad; -} - -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - border-color: #3a87ad; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.info input:focus, -.control-group.info select:focus, -.control-group.info textarea:focus { - border-color: #2d6987; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; -} - -.control-group.info .input-prepend .add-on, -.control-group.info .input-append .add-on { - color: #3a87ad; - background-color: #d9edf7; - border-color: #3a87ad; -} - -input:focus:invalid, -textarea:focus:invalid, -select:focus:invalid { - color: #b94a48; - border-color: #ee5f5b; -} - -input:focus:invalid:focus, -textarea:focus:invalid:focus, -select:focus:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} - -.form-actions { - padding: 19px 20px 20px; - margin-top: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-top: 1px solid #e5e5e5; - *zoom: 1; -} - -.form-actions:before, -.form-actions:after { - display: table; - line-height: 0; - content: ""; -} - -.form-actions:after { - clear: both; -} - -.help-block, -.help-inline { - color: #595959; -} - -.help-block { - display: block; - margin-bottom: 10px; -} - -.help-inline { - display: inline-block; - *display: inline; - padding-left: 5px; - vertical-align: middle; - *zoom: 1; -} - -.input-append, -.input-prepend { - display: inline-block; - margin-bottom: 10px; - font-size: 0; - white-space: nowrap; - vertical-align: middle; -} - -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input, -.input-append .dropdown-menu, -.input-prepend .dropdown-menu, -.input-append .popover, -.input-prepend .popover { - font-size: 14px; -} - -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input { - position: relative; - margin-bottom: 0; - *margin-left: 0; - vertical-align: top; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-append input:focus, -.input-prepend input:focus, -.input-append select:focus, -.input-prepend select:focus, -.input-append .uneditable-input:focus, -.input-prepend .uneditable-input:focus { - z-index: 2; -} - -.input-append .add-on, -.input-prepend .add-on { - display: inline-block; - width: auto; - height: 20px; - min-width: 16px; - padding: 4px 5px; - font-size: 14px; - font-weight: normal; - line-height: 20px; - text-align: center; - text-shadow: 0 1px 0 #ffffff; - background-color: #eeeeee; - border: 1px solid #ccc; -} - -.input-append .add-on, -.input-prepend .add-on, -.input-append .btn, -.input-prepend .btn, -.input-append .btn-group > .dropdown-toggle, -.input-prepend .btn-group > .dropdown-toggle { - vertical-align: top; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-append .active, -.input-prepend .active { - background-color: #a9dba9; - border-color: #46a546; -} - -.input-prepend .add-on, -.input-prepend .btn { - margin-right: -1px; -} - -.input-prepend .add-on:first-child, -.input-prepend .btn:first-child { - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.input-append input, -.input-append select, -.input-append .uneditable-input { - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.input-append input + .btn-group .btn:last-child, -.input-append select + .btn-group .btn:last-child, -.input-append .uneditable-input + .btn-group .btn:last-child { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-append .add-on, -.input-append .btn, -.input-append .btn-group { - margin-left: -1px; -} - -.input-append .add-on:last-child, -.input-append .btn:last-child, -.input-append .btn-group:last-child > .dropdown-toggle { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-prepend.input-append input, -.input-prepend.input-append select, -.input-prepend.input-append .uneditable-input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-prepend.input-append input + .btn-group .btn, -.input-prepend.input-append select + .btn-group .btn, -.input-prepend.input-append .uneditable-input + .btn-group .btn { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-prepend.input-append .add-on:first-child, -.input-prepend.input-append .btn:first-child { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.input-prepend.input-append .add-on:last-child, -.input-prepend.input-append .btn:last-child { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-prepend.input-append .btn-group:first-child { - margin-left: 0; -} - -input.search-query { - padding-right: 14px; - padding-right: 4px \9; - padding-left: 14px; - padding-left: 4px \9; - /* IE7-8 doesn't have border-radius, so don't indent the padding */ - - margin-bottom: 0; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -/* Allow for input prepend/append in search forms */ - -.form-search .input-append .search-query, -.form-search .input-prepend .search-query { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.form-search .input-append .search-query { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} - -.form-search .input-append .btn { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} - -.form-search .input-prepend .search-query { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} - -.form-search .input-prepend .btn { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} - -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input, -.form-search .input-prepend, -.form-inline .input-prepend, -.form-horizontal .input-prepend, -.form-search .input-append, -.form-inline .input-append, -.form-horizontal .input-append { - display: inline-block; - *display: inline; - margin-bottom: 0; - vertical-align: middle; - *zoom: 1; -} - -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} - -.form-search label, -.form-inline label, -.form-search .btn-group, -.form-inline .btn-group { - display: inline-block; -} - -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - margin-bottom: 0; -} - -.form-search .radio, -.form-search .checkbox, -.form-inline .radio, -.form-inline .checkbox { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} - -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"], -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-right: 3px; - margin-left: 0; -} - -.control-group { - margin-bottom: 10px; -} - -legend + .control-group { - margin-top: 20px; - -webkit-margin-top-collapse: separate; -} - -.form-horizontal .control-group { - margin-bottom: 20px; - *zoom: 1; -} - -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { - display: table; - line-height: 0; - content: ""; -} - -.form-horizontal .control-group:after { - clear: both; -} - -.form-horizontal .control-label { - float: left; - width: 160px; - padding-top: 5px; - text-align: right; -} - -.form-horizontal .controls { - *display: inline-block; - *padding-left: 20px; - margin-left: 180px; - *margin-left: 0; -} - -.form-horizontal .controls:first-child { - *padding-left: 180px; -} - -.form-horizontal .help-block { - margin-bottom: 0; -} - -.form-horizontal input + .help-block, -.form-horizontal select + .help-block, -.form-horizontal textarea + .help-block, -.form-horizontal .uneditable-input + .help-block, -.form-horizontal .input-prepend + .help-block, -.form-horizontal .input-append + .help-block { - margin-top: 10px; -} - -.form-horizontal .form-actions { - padding-left: 180px; -} - -table { - max-width: 100%; - background-color: transparent; - border-collapse: collapse; - border-spacing: 0; -} - -.table { - width: 100%; - margin-bottom: 20px; -} - -.table th, -.table td { - padding: 8px; - line-height: 20px; - text-align: left; - vertical-align: top; - border-top: 1px solid #dddddd; -} - -.table th { - font-weight: bold; -} - -.table thead th { - vertical-align: bottom; -} - -.table caption + thead tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child th, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child th, -.table thead:first-child tr:first-child td { - border-top: 0; -} - -.table tbody + tbody { - border-top: 2px solid #dddddd; -} - -.table .table { - background-color: #ffffff; -} - -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} - -.table-bordered { - border: 1px solid #dddddd; - border-collapse: separate; - *border-collapse: collapse; - border-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.table-bordered th, -.table-bordered td { - border-left: 1px solid #dddddd; -} - -.table-bordered caption + thead tr:first-child th, -.table-bordered caption + tbody tr:first-child th, -.table-bordered caption + tbody tr:first-child td, -.table-bordered colgroup + thead tr:first-child th, -.table-bordered colgroup + tbody tr:first-child th, -.table-bordered colgroup + tbody tr:first-child td, -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} - -.table-bordered thead:first-child tr:first-child > th:first-child, -.table-bordered tbody:first-child tr:first-child > td:first-child, -.table-bordered tbody:first-child tr:first-child > th:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-bordered thead:first-child tr:first-child > th:last-child, -.table-bordered tbody:first-child tr:first-child > td:last-child, -.table-bordered tbody:first-child tr:first-child > th:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; -} - -.table-bordered thead:last-child tr:last-child > th:first-child, -.table-bordered tbody:last-child tr:last-child > td:first-child, -.table-bordered tbody:last-child tr:last-child > th:first-child, -.table-bordered tfoot:last-child tr:last-child > td:first-child, -.table-bordered tfoot:last-child tr:last-child > th:first-child { - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; -} - -.table-bordered thead:last-child tr:last-child > th:last-child, -.table-bordered tbody:last-child tr:last-child > td:last-child, -.table-bordered tbody:last-child tr:last-child > th:last-child, -.table-bordered tfoot:last-child tr:last-child > td:last-child, -.table-bordered tfoot:last-child tr:last-child > th:last-child { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; -} - -.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { - -webkit-border-bottom-left-radius: 0; - border-bottom-left-radius: 0; - -moz-border-radius-bottomleft: 0; -} - -.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 0; - border-bottom-right-radius: 0; - -moz-border-radius-bottomright: 0; -} - -.table-bordered caption + thead tr:first-child th:first-child, -.table-bordered caption + tbody tr:first-child td:first-child, -.table-bordered colgroup + thead tr:first-child th:first-child, -.table-bordered colgroup + tbody tr:first-child td:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-bordered caption + thead tr:first-child th:last-child, -.table-bordered caption + tbody tr:first-child td:last-child, -.table-bordered colgroup + thead tr:first-child th:last-child, -.table-bordered colgroup + tbody tr:first-child td:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; -} - -.table-striped tbody > tr:nth-child(odd) > td, -.table-striped tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} - -.table-hover tbody tr:hover > td, -.table-hover tbody tr:hover > th { - background-color: #f5f5f5; -} - -table td[class*="span"], -table th[class*="span"], -.row-fluid table td[class*="span"], -.row-fluid table th[class*="span"] { - display: table-cell; - float: none; - margin-left: 0; -} - -.table td.span1, -.table th.span1 { - float: none; - width: 44px; - margin-left: 0; -} - -.table td.span2, -.table th.span2 { - float: none; - width: 124px; - margin-left: 0; -} - -.table td.span3, -.table th.span3 { - float: none; - width: 204px; - margin-left: 0; -} - -.table td.span4, -.table th.span4 { - float: none; - width: 284px; - margin-left: 0; -} - -.table td.span5, -.table th.span5 { - float: none; - width: 364px; - margin-left: 0; -} - -.table td.span6, -.table th.span6 { - float: none; - width: 444px; - margin-left: 0; -} - -.table td.span7, -.table th.span7 { - float: none; - width: 524px; - margin-left: 0; -} - -.table td.span8, -.table th.span8 { - float: none; - width: 604px; - margin-left: 0; -} - -.table td.span9, -.table th.span9 { - float: none; - width: 684px; - margin-left: 0; -} - -.table td.span10, -.table th.span10 { - float: none; - width: 764px; - margin-left: 0; -} - -.table td.span11, -.table th.span11 { - float: none; - width: 844px; - margin-left: 0; -} - -.table td.span12, -.table th.span12 { - float: none; - width: 924px; - margin-left: 0; -} - -.table tbody tr.success > td { - background-color: #dff0d8; -} - -.table tbody tr.error > td { - background-color: #f2dede; -} - -.table tbody tr.warning > td { - background-color: #fcf8e3; -} - -.table tbody tr.info > td { - background-color: #d9edf7; -} - -.table-hover tbody tr.success:hover > td { - background-color: #d0e9c6; -} - -.table-hover tbody tr.error:hover > td { - background-color: #ebcccc; -} - -.table-hover tbody tr.warning:hover > td { - background-color: #faf2cc; -} - -.table-hover tbody tr.info:hover > td { - background-color: #c4e3f3; -} - -[class^="icon-"], -[class*=" icon-"] { - display: inline-block; - width: 14px; - height: 14px; - margin-top: 1px; - *margin-right: .3em; - line-height: 14px; - vertical-align: text-top; - background-image: url("../img/glyphicons-halflings.png"); - background-position: 14px 14px; - background-repeat: no-repeat; -} - -/* White icons with optional class, or on hover/focus/active states of certain elements */ - -.icon-white, -.nav-pills > .active > a > [class^="icon-"], -.nav-pills > .active > a > [class*=" icon-"], -.nav-list > .active > a > [class^="icon-"], -.nav-list > .active > a > [class*=" icon-"], -.navbar-inverse .nav > .active > a > [class^="icon-"], -.navbar-inverse .nav > .active > a > [class*=" icon-"], -.dropdown-menu > li > a:hover > [class^="icon-"], -.dropdown-menu > li > a:focus > [class^="icon-"], -.dropdown-menu > li > a:hover > [class*=" icon-"], -.dropdown-menu > li > a:focus > [class*=" icon-"], -.dropdown-menu > .active > a > [class^="icon-"], -.dropdown-menu > .active > a > [class*=" icon-"], -.dropdown-submenu:hover > a > [class^="icon-"], -.dropdown-submenu:focus > a > [class^="icon-"], -.dropdown-submenu:hover > a > [class*=" icon-"], -.dropdown-submenu:focus > a > [class*=" icon-"] { - background-image: url("../img/glyphicons-halflings-white.png"); -} - -.icon-glass { - background-position: 0 0; -} - -.icon-music { - background-position: -24px 0; -} - -.icon-search { - background-position: -48px 0; -} - -.icon-envelope { - background-position: -72px 0; -} - -.icon-heart { - background-position: -96px 0; -} - -.icon-star { - background-position: -120px 0; -} - -.icon-star-empty { - background-position: -144px 0; -} - -.icon-user { - background-position: -168px 0; -} - -.icon-film { - background-position: -192px 0; -} - -.icon-th-large { - background-position: -216px 0; -} - -.icon-th { - background-position: -240px 0; -} - -.icon-th-list { - background-position: -264px 0; -} - -.icon-ok { - background-position: -288px 0; -} - -.icon-remove { - background-position: -312px 0; -} - -.icon-zoom-in { - background-position: -336px 0; -} - -.icon-zoom-out { - background-position: -360px 0; -} - -.icon-off { - background-position: -384px 0; -} - -.icon-signal { - background-position: -408px 0; -} - -.icon-cog { - background-position: -432px 0; -} - -.icon-trash { - background-position: -456px 0; -} - -.icon-home { - background-position: 0 -24px; -} - -.icon-file { - background-position: -24px -24px; -} - -.icon-time { - background-position: -48px -24px; -} - -.icon-road { - background-position: -72px -24px; -} - -.icon-download-alt { - background-position: -96px -24px; -} - -.icon-download { - background-position: -120px -24px; -} - -.icon-upload { - background-position: -144px -24px; -} - -.icon-inbox { - background-position: -168px -24px; -} - -.icon-play-circle { - background-position: -192px -24px; -} - -.icon-repeat { - background-position: -216px -24px; -} - -.icon-refresh { - background-position: -240px -24px; -} - -.icon-list-alt { - background-position: -264px -24px; -} - -.icon-lock { - background-position: -287px -24px; -} - -.icon-flag { - background-position: -312px -24px; -} - -.icon-headphones { - background-position: -336px -24px; -} - -.icon-volume-off { - background-position: -360px -24px; -} - -.icon-volume-down { - background-position: -384px -24px; -} - -.icon-volume-up { - background-position: -408px -24px; -} - -.icon-qrcode { - background-position: -432px -24px; -} - -.icon-barcode { - background-position: -456px -24px; -} - -.icon-tag { - background-position: 0 -48px; -} - -.icon-tags { - background-position: -25px -48px; -} - -.icon-book { - background-position: -48px -48px; -} - -.icon-bookmark { - background-position: -72px -48px; -} - -.icon-print { - background-position: -96px -48px; -} - -.icon-camera { - background-position: -120px -48px; -} - -.icon-font { - background-position: -144px -48px; -} - -.icon-bold { - background-position: -167px -48px; -} - -.icon-italic { - background-position: -192px -48px; -} - -.icon-text-height { - background-position: -216px -48px; -} - -.icon-text-width { - background-position: -240px -48px; -} - -.icon-align-left { - background-position: -264px -48px; -} - -.icon-align-center { - background-position: -288px -48px; -} - -.icon-align-right { - background-position: -312px -48px; -} - -.icon-align-justify { - background-position: -336px -48px; -} - -.icon-list { - background-position: -360px -48px; -} - -.icon-indent-left { - background-position: -384px -48px; -} - -.icon-indent-right { - background-position: -408px -48px; -} - -.icon-facetime-video { - background-position: -432px -48px; -} - -.icon-picture { - background-position: -456px -48px; -} - -.icon-pencil { - background-position: 0 -72px; -} - -.icon-map-marker { - background-position: -24px -72px; -} - -.icon-adjust { - background-position: -48px -72px; -} - -.icon-tint { - background-position: -72px -72px; -} - -.icon-edit { - background-position: -96px -72px; -} - -.icon-share { - background-position: -120px -72px; -} - -.icon-check { - background-position: -144px -72px; -} - -.icon-move { - background-position: -168px -72px; -} - -.icon-step-backward { - background-position: -192px -72px; -} - -.icon-fast-backward { - background-position: -216px -72px; -} - -.icon-backward { - background-position: -240px -72px; -} - -.icon-play { - background-position: -264px -72px; -} - -.icon-pause { - background-position: -288px -72px; -} - -.icon-stop { - background-position: -312px -72px; -} - -.icon-forward { - background-position: -336px -72px; -} - -.icon-fast-forward { - background-position: -360px -72px; -} - -.icon-step-forward { - background-position: -384px -72px; -} - -.icon-eject { - background-position: -408px -72px; -} - -.icon-chevron-left { - background-position: -432px -72px; -} - -.icon-chevron-right { - background-position: -456px -72px; -} - -.icon-plus-sign { - background-position: 0 -96px; -} - -.icon-minus-sign { - background-position: -24px -96px; -} - -.icon-remove-sign { - background-position: -48px -96px; -} - -.icon-ok-sign { - background-position: -72px -96px; -} - -.icon-question-sign { - background-position: -96px -96px; -} - -.icon-info-sign { - background-position: -120px -96px; -} - -.icon-screenshot { - background-position: -144px -96px; -} - -.icon-remove-circle { - background-position: -168px -96px; -} - -.icon-ok-circle { - background-position: -192px -96px; -} - -.icon-ban-circle { - background-position: -216px -96px; -} - -.icon-arrow-left { - background-position: -240px -96px; -} - -.icon-arrow-right { - background-position: -264px -96px; -} - -.icon-arrow-up { - background-position: -289px -96px; -} - -.icon-arrow-down { - background-position: -312px -96px; -} - -.icon-share-alt { - background-position: -336px -96px; -} - -.icon-resize-full { - background-position: -360px -96px; -} - -.icon-resize-small { - background-position: -384px -96px; -} - -.icon-plus { - background-position: -408px -96px; -} - -.icon-minus { - background-position: -433px -96px; -} - -.icon-asterisk { - background-position: -456px -96px; -} - -.icon-exclamation-sign { - background-position: 0 -120px; -} - -.icon-gift { - background-position: -24px -120px; -} - -.icon-leaf { - background-position: -48px -120px; -} - -.icon-fire { - background-position: -72px -120px; -} - -.icon-eye-open { - background-position: -96px -120px; -} - -.icon-eye-close { - background-position: -120px -120px; -} - -.icon-warning-sign { - background-position: -144px -120px; -} - -.icon-plane { - background-position: -168px -120px; -} - -.icon-calendar { - background-position: -192px -120px; -} - -.icon-random { - width: 16px; - background-position: -216px -120px; -} - -.icon-comment { - background-position: -240px -120px; -} - -.icon-magnet { - background-position: -264px -120px; -} - -.icon-chevron-up { - background-position: -288px -120px; -} - -.icon-chevron-down { - background-position: -313px -119px; -} - -.icon-retweet { - background-position: -336px -120px; -} - -.icon-shopping-cart { - background-position: -360px -120px; -} - -.icon-folder-close { - width: 16px; - background-position: -384px -120px; -} - -.icon-folder-open { - width: 16px; - background-position: -408px -120px; -} - -.icon-resize-vertical { - background-position: -432px -119px; -} - -.icon-resize-horizontal { - background-position: -456px -118px; -} - -.icon-hdd { - background-position: 0 -144px; -} - -.icon-bullhorn { - background-position: -24px -144px; -} - -.icon-bell { - background-position: -48px -144px; -} - -.icon-certificate { - background-position: -72px -144px; -} - -.icon-thumbs-up { - background-position: -96px -144px; -} - -.icon-thumbs-down { - background-position: -120px -144px; -} - -.icon-hand-right { - background-position: -144px -144px; -} - -.icon-hand-left { - background-position: -168px -144px; -} - -.icon-hand-up { - background-position: -192px -144px; -} - -.icon-hand-down { - background-position: -216px -144px; -} - -.icon-circle-arrow-right { - background-position: -240px -144px; -} - -.icon-circle-arrow-left { - background-position: -264px -144px; -} - -.icon-circle-arrow-up { - background-position: -288px -144px; -} - -.icon-circle-arrow-down { - background-position: -312px -144px; -} - -.icon-globe { - background-position: -336px -144px; -} - -.icon-wrench { - background-position: -360px -144px; -} - -.icon-tasks { - background-position: -384px -144px; -} - -.icon-filter { - background-position: -408px -144px; -} - -.icon-briefcase { - background-position: -432px -144px; -} - -.icon-fullscreen { - background-position: -456px -144px; -} - -.dropup, -.dropdown { - position: relative; -} - -.dropdown-toggle { - *margin-bottom: -3px; -} - -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - border-top: 4px solid #000000; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - content: ""; -} - -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - list-style: none; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.dropdown-menu .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 20px; - color: #333333; - white-space: nowrap; -} - -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus, -.dropdown-submenu:hover > a, -.dropdown-submenu:focus > a { - color: #ffffff; - text-decoration: none; - background-color: #0081c2; - background-image: -moz-linear-gradient(top, #0088cc, #0077b3); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); - background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); - background-image: -o-linear-gradient(top, #0088cc, #0077b3); - background-image: linear-gradient(to bottom, #0088cc, #0077b3); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); -} - -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #ffffff; - text-decoration: none; - background-color: #0081c2; - background-image: -moz-linear-gradient(top, #0088cc, #0077b3); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); - background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); - background-image: -o-linear-gradient(top, #0088cc, #0077b3); - background-image: linear-gradient(to bottom, #0088cc, #0077b3); - background-repeat: repeat-x; - outline: 0; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); -} - -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #999999; -} - -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: default; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.open { - *z-index: 1000; -} - -.open > .dropdown-menu { - display: block; -} - -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} - -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid #000000; - content: ""; -} - -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} - -.dropdown-submenu { - position: relative; -} - -.dropdown-submenu > .dropdown-menu { - top: 0; - left: 100%; - margin-top: -6px; - margin-left: -1px; - -webkit-border-radius: 0 6px 6px 6px; - -moz-border-radius: 0 6px 6px 6px; - border-radius: 0 6px 6px 6px; -} - -.dropdown-submenu:hover > .dropdown-menu { - display: block; -} - -.dropup .dropdown-submenu > .dropdown-menu { - top: auto; - bottom: 0; - margin-top: 0; - margin-bottom: -2px; - -webkit-border-radius: 5px 5px 5px 0; - -moz-border-radius: 5px 5px 5px 0; - border-radius: 5px 5px 5px 0; -} - -.dropdown-submenu > a:after { - display: block; - float: right; - width: 0; - height: 0; - margin-top: 5px; - margin-right: -10px; - border-color: transparent; - border-left-color: #cccccc; - border-style: solid; - border-width: 5px 0 5px 5px; - content: " "; -} - -.dropdown-submenu:hover > a:after { - border-left-color: #ffffff; -} - -.dropdown-submenu.pull-left { - float: none; -} - -.dropdown-submenu.pull-left > .dropdown-menu { - left: -100%; - margin-left: 10px; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} - -.dropdown .dropdown-menu .nav-header { - padding-right: 20px; - padding-left: 20px; -} - -.typeahead { - z-index: 1051; - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} - -.well-large { - padding: 24px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.well-small { - padding: 9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} - -.fade.in { - opacity: 1; -} - -.collapse { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; -} - -.collapse.in { - height: auto; -} - -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 20px; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} - -.close:hover, -.close:focus { - color: #000000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - filter: alpha(opacity=40); -} - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} - -.btn { - display: inline-block; - *display: inline; - padding: 4px 12px; - margin-bottom: 0; - *margin-left: .3em; - font-size: 14px; - line-height: 20px; - color: #333333; - text-align: center; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - vertical-align: middle; - cursor: pointer; - background-color: #f5f5f5; - *background-color: #e6e6e6; - background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); - background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); - background-repeat: repeat-x; - border: 1px solid #cccccc; - *border: 0; - border-color: #e6e6e6 #e6e6e6 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - border-bottom-color: #b3b3b3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn:hover, -.btn:focus, -.btn:active, -.btn.active, -.btn.disabled, -.btn[disabled] { - color: #333333; - background-color: #e6e6e6; - *background-color: #d9d9d9; -} - -.btn:active, -.btn.active { - background-color: #cccccc \9; -} - -.btn:first-child { - *margin-left: 0; -} - -.btn:hover, -.btn:focus { - color: #333333; - text-decoration: none; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} - -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.btn.active, -.btn:active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn.disabled, -.btn[disabled] { - cursor: default; - background-image: none; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-large { - padding: 11px 19px; - font-size: 17.5px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.btn-large [class^="icon-"], -.btn-large [class*=" icon-"] { - margin-top: 4px; -} - -.btn-small { - padding: 2px 10px; - font-size: 11.9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.btn-small [class^="icon-"], -.btn-small [class*=" icon-"] { - margin-top: 0; -} - -.btn-mini [class^="icon-"], -.btn-mini [class*=" icon-"] { - margin-top: -1px; -} - -.btn-mini { - padding: 0 6px; - font-size: 10.5px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.btn-block { - display: block; - width: 100%; - padding-right: 0; - padding-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.btn-block + .btn-block { - margin-top: 5px; -} - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} - -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active, -.btn-inverse.active { - color: rgba(255, 255, 255, 0.75); -} - -.btn-primary { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #006dcc; - *background-color: #0044cc; - background-image: -moz-linear-gradient(top, #0088cc, #0044cc); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); - background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); - background-image: -o-linear-gradient(top, #0088cc, #0044cc); - background-image: linear-gradient(to bottom, #0088cc, #0044cc); - background-repeat: repeat-x; - border-color: #0044cc #0044cc #002a80; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - color: #ffffff; - background-color: #0044cc; - *background-color: #003bb3; -} - -.btn-primary:active, -.btn-primary.active { - background-color: #003399 \9; -} - -.btn-warning { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #faa732; - *background-color: #f89406; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - color: #ffffff; - background-color: #f89406; - *background-color: #df8505; -} - -.btn-warning:active, -.btn-warning.active { - background-color: #c67605 \9; -} - -.btn-danger { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #da4f49; - *background-color: #bd362f; - background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); - background-repeat: repeat-x; - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - color: #ffffff; - background-color: #bd362f; - *background-color: #a9302a; -} - -.btn-danger:active, -.btn-danger.active { - background-color: #942a25 \9; -} - -.btn-success { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #5bb75b; - *background-color: #51a351; - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(to bottom, #62c462, #51a351); - background-repeat: repeat-x; - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - color: #ffffff; - background-color: #51a351; - *background-color: #499249; -} - -.btn-success:active, -.btn-success.active { - background-color: #408140 \9; -} - -.btn-info { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #49afcd; - *background-color: #2f96b4; - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); - background-repeat: repeat-x; - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - color: #ffffff; - background-color: #2f96b4; - *background-color: #2a85a0; -} - -.btn-info:active, -.btn-info.active { - background-color: #24748c \9; -} - -.btn-inverse { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #363636; - *background-color: #222222; - background-image: -moz-linear-gradient(top, #444444, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); - background-image: -webkit-linear-gradient(top, #444444, #222222); - background-image: -o-linear-gradient(top, #444444, #222222); - background-image: linear-gradient(to bottom, #444444, #222222); - background-repeat: repeat-x; - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-inverse:hover, -.btn-inverse:focus, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - color: #ffffff; - background-color: #222222; - *background-color: #151515; -} - -.btn-inverse:active, -.btn-inverse.active { - background-color: #080808 \9; -} - -button.btn, -input[type="submit"].btn { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} - -button.btn.btn-large, -input[type="submit"].btn.btn-large { - *padding-top: 7px; - *padding-bottom: 7px; -} - -button.btn.btn-small, -input[type="submit"].btn.btn-small { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn.btn-mini, -input[type="submit"].btn.btn-mini { - *padding-top: 1px; - *padding-bottom: 1px; -} - -.btn-link, -.btn-link:active, -.btn-link[disabled] { - background-color: transparent; - background-image: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-link { - color: #0088cc; - cursor: pointer; - border-color: transparent; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-link:hover, -.btn-link:focus { - color: #005580; - text-decoration: underline; - background-color: transparent; -} - -.btn-link[disabled]:hover, -.btn-link[disabled]:focus { - color: #333333; - text-decoration: none; -} - -.btn-group { - position: relative; - display: inline-block; - *display: inline; - *margin-left: .3em; - font-size: 0; - white-space: nowrap; - vertical-align: middle; - *zoom: 1; -} - -.btn-group:first-child { - *margin-left: 0; -} - -.btn-group + .btn-group { - margin-left: 5px; -} - -.btn-toolbar { - margin-top: 10px; - margin-bottom: 10px; - font-size: 0; -} - -.btn-toolbar > .btn + .btn, -.btn-toolbar > .btn-group + .btn, -.btn-toolbar > .btn + .btn-group { - margin-left: 5px; -} - -.btn-group > .btn { - position: relative; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group > .btn + .btn { - margin-left: -1px; -} - -.btn-group > .btn, -.btn-group > .dropdown-menu, -.btn-group > .popover { - font-size: 14px; -} - -.btn-group > .btn-mini { - font-size: 10.5px; -} - -.btn-group > .btn-small { - font-size: 11.9px; -} - -.btn-group > .btn-large { - font-size: 17.5px; -} - -.btn-group > .btn:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-topleft: 4px; -} - -.btn-group > .btn:last-child, -.btn-group > .dropdown-toggle { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-bottomright: 4px; -} - -.btn-group > .btn.large:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 6px; - border-bottom-left-radius: 6px; - -webkit-border-top-left-radius: 6px; - border-top-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topleft: 6px; -} - -.btn-group > .btn.large:last-child, -.btn-group > .large.dropdown-toggle { - -webkit-border-top-right-radius: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - border-bottom-right-radius: 6px; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 6px; -} - -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active { - z-index: 2; -} - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - -.btn-group > .btn + .dropdown-toggle { - *padding-top: 5px; - padding-right: 8px; - *padding-bottom: 5px; - padding-left: 8px; - -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group > .btn-mini + .dropdown-toggle { - *padding-top: 2px; - padding-right: 5px; - *padding-bottom: 2px; - padding-left: 5px; -} - -.btn-group > .btn-small + .dropdown-toggle { - *padding-top: 5px; - *padding-bottom: 4px; -} - -.btn-group > .btn-large + .dropdown-toggle { - *padding-top: 7px; - padding-right: 12px; - *padding-bottom: 7px; - padding-left: 12px; -} - -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group.open .btn.dropdown-toggle { - background-color: #e6e6e6; -} - -.btn-group.open .btn-primary.dropdown-toggle { - background-color: #0044cc; -} - -.btn-group.open .btn-warning.dropdown-toggle { - background-color: #f89406; -} - -.btn-group.open .btn-danger.dropdown-toggle { - background-color: #bd362f; -} - -.btn-group.open .btn-success.dropdown-toggle { - background-color: #51a351; -} - -.btn-group.open .btn-info.dropdown-toggle { - background-color: #2f96b4; -} - -.btn-group.open .btn-inverse.dropdown-toggle { - background-color: #222222; -} - -.btn .caret { - margin-top: 8px; - margin-left: 0; -} - -.btn-large .caret { - margin-top: 6px; -} - -.btn-large .caret { - border-top-width: 5px; - border-right-width: 5px; - border-left-width: 5px; -} - -.btn-mini .caret, -.btn-small .caret { - margin-top: 8px; -} - -.dropup .btn-large .caret { - border-bottom-width: 5px; -} - -.btn-primary .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.btn-group-vertical { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; -} - -.btn-group-vertical > .btn { - display: block; - float: none; - max-width: 100%; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group-vertical > .btn + .btn { - margin-top: -1px; - margin-left: 0; -} - -.btn-group-vertical > .btn:first-child { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.btn-group-vertical > .btn:last-child { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.btn-group-vertical > .btn-large:first-child { - -webkit-border-radius: 6px 6px 0 0; - -moz-border-radius: 6px 6px 0 0; - border-radius: 6px 6px 0 0; -} - -.btn-group-vertical > .btn-large:last-child { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} - -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 20px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.alert, -.alert h4 { - color: #c09853; -} - -.alert h4 { - margin: 0; -} - -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 20px; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.alert-success h4 { - color: #468847; -} - -.alert-danger, -.alert-error { - color: #b94a48; - background-color: #f2dede; - border-color: #eed3d7; -} - -.alert-danger h4, -.alert-error h4 { - color: #b94a48; -} - -.alert-info { - color: #3a87ad; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.alert-info h4 { - color: #3a87ad; -} - -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} - -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} - -.alert-block p + p { - margin-top: 5px; -} - -.nav { - margin-bottom: 20px; - margin-left: 0; - list-style: none; -} - -.nav > li > a { - display: block; -} - -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} - -.nav > li > a > img { - max-width: none; -} - -.nav > .pull-right { - float: right; -} - -.nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 20px; - color: #999999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} - -.nav li + .nav-header { - margin-top: 9px; -} - -.nav-list { - padding-right: 15px; - padding-left: 15px; - margin-bottom: 0; -} - -.nav-list > li > a, -.nav-list .nav-header { - margin-right: -15px; - margin-left: -15px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); -} - -.nav-list > li > a { - padding: 3px 15px; -} - -.nav-list > .active > a, -.nav-list > .active > a:hover, -.nav-list > .active > a:focus { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #0088cc; -} - -.nav-list [class^="icon-"], -.nav-list [class*=" icon-"] { - margin-right: 2px; -} - -.nav-list .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.nav-tabs, -.nav-pills { - *zoom: 1; -} - -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - line-height: 0; - content: ""; -} - -.nav-tabs:after, -.nav-pills:after { - clear: both; -} - -.nav-tabs > li, -.nav-pills > li { - float: left; -} - -.nav-tabs > li > a, -.nav-pills > li > a { - padding-right: 12px; - padding-left: 12px; - margin-right: 2px; - line-height: 14px; -} - -.nav-tabs { - border-bottom: 1px solid #ddd; -} - -.nav-tabs > li { - margin-bottom: -1px; -} - -.nav-tabs > li > a { - padding-top: 8px; - padding-bottom: 8px; - line-height: 20px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.nav-tabs > li > a:hover, -.nav-tabs > li > a:focus { - border-color: #eeeeee #eeeeee #dddddd; -} - -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover, -.nav-tabs > .active > a:focus { - color: #555555; - cursor: default; - background-color: #ffffff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} - -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.nav-pills > .active > a, -.nav-pills > .active > a:hover, -.nav-pills > .active > a:focus { - color: #ffffff; - background-color: #0088cc; -} - -.nav-stacked > li { - float: none; -} - -.nav-stacked > li > a { - margin-right: 0; -} - -.nav-tabs.nav-stacked { - border-bottom: 0; -} - -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-topleft: 4px; -} - -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomright: 4px; - -moz-border-radius-bottomleft: 4px; -} - -.nav-tabs.nav-stacked > li > a:hover, -.nav-tabs.nav-stacked > li > a:focus { - z-index: 2; - border-color: #ddd; -} - -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} - -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} - -.nav-tabs .dropdown-menu { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} - -.nav-pills .dropdown-menu { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.nav .dropdown-toggle .caret { - margin-top: 6px; - border-top-color: #0088cc; - border-bottom-color: #0088cc; -} - -.nav .dropdown-toggle:hover .caret, -.nav .dropdown-toggle:focus .caret { - border-top-color: #005580; - border-bottom-color: #005580; -} - -/* move down carets for tabs */ - -.nav-tabs .dropdown-toggle .caret { - margin-top: 8px; -} - -.nav .active .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} - -.nav-tabs .active .dropdown-toggle .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.nav > .dropdown.active > a:hover, -.nav > .dropdown.active > a:focus { - cursor: pointer; -} - -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > li.dropdown.open.active > a:hover, -.nav > li.dropdown.open.active > a:focus { - color: #ffffff; - background-color: #999999; - border-color: #999999; -} - -.nav li.dropdown.open .caret, -.nav li.dropdown.open.active .caret, -.nav li.dropdown.open a:hover .caret, -.nav li.dropdown.open a:focus .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; - opacity: 1; - filter: alpha(opacity=100); -} - -.tabs-stacked .open > a:hover, -.tabs-stacked .open > a:focus { - border-color: #999999; -} - -.tabbable { - *zoom: 1; -} - -.tabbable:before, -.tabbable:after { - display: table; - line-height: 0; - content: ""; -} - -.tabbable:after { - clear: both; -} - -.tab-content { - overflow: auto; -} - -.tabs-below > .nav-tabs, -.tabs-right > .nav-tabs, -.tabs-left > .nav-tabs { - border-bottom: 0; -} - -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} - -.tab-content > .active, -.pill-content > .active { - display: block; -} - -.tabs-below > .nav-tabs { - border-top: 1px solid #ddd; -} - -.tabs-below > .nav-tabs > li { - margin-top: -1px; - margin-bottom: 0; -} - -.tabs-below > .nav-tabs > li > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.tabs-below > .nav-tabs > li > a:hover, -.tabs-below > .nav-tabs > li > a:focus { - border-top-color: #ddd; - border-bottom-color: transparent; -} - -.tabs-below > .nav-tabs > .active > a, -.tabs-below > .nav-tabs > .active > a:hover, -.tabs-below > .nav-tabs > .active > a:focus { - border-color: transparent #ddd #ddd #ddd; -} - -.tabs-left > .nav-tabs > li, -.tabs-right > .nav-tabs > li { - float: none; -} - -.tabs-left > .nav-tabs > li > a, -.tabs-right > .nav-tabs > li > a { - min-width: 74px; - margin-right: 0; - margin-bottom: 3px; -} - -.tabs-left > .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} - -.tabs-left > .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.tabs-left > .nav-tabs > li > a:hover, -.tabs-left > .nav-tabs > li > a:focus { - border-color: #eeeeee #dddddd #eeeeee #eeeeee; -} - -.tabs-left > .nav-tabs .active > a, -.tabs-left > .nav-tabs .active > a:hover, -.tabs-left > .nav-tabs .active > a:focus { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #ffffff; -} - -.tabs-right > .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} - -.tabs-right > .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.tabs-right > .nav-tabs > li > a:hover, -.tabs-right > .nav-tabs > li > a:focus { - border-color: #eeeeee #eeeeee #eeeeee #dddddd; -} - -.tabs-right > .nav-tabs .active > a, -.tabs-right > .nav-tabs .active > a:hover, -.tabs-right > .nav-tabs .active > a:focus { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #ffffff; -} - -.nav > .disabled > a { - color: #999999; -} - -.nav > .disabled > a:hover, -.nav > .disabled > a:focus { - text-decoration: none; - cursor: default; - background-color: transparent; -} - -.navbar { - *position: relative; - *z-index: 2; - margin-bottom: 20px; - overflow: visible; -} - -.navbar-inner { - min-height: 40px; - padding-right: 20px; - padding-left: 20px; - background-color: #fafafa; - background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); - background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); - background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); - background-repeat: repeat-x; - border: 1px solid #d4d4d4; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); - *zoom: 1; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); -} - -.navbar-inner:before, -.navbar-inner:after { - display: table; - line-height: 0; - content: ""; -} - -.navbar-inner:after { - clear: both; -} - -.navbar .container { - width: auto; -} - -.nav-collapse.collapse { - height: auto; - overflow: visible; -} - -.navbar .brand { - display: block; - float: left; - padding: 10px 20px 10px; - margin-left: -20px; - font-size: 20px; - font-weight: 200; - color: #777777; - text-shadow: 0 1px 0 #ffffff; -} - -.navbar .brand:hover, -.navbar .brand:focus { - text-decoration: none; -} - -.navbar-text { - margin-bottom: 0; - line-height: 40px; - color: #777777; -} - -.navbar-link { - color: #777777; -} - -.navbar-link:hover, -.navbar-link:focus { - color: #333333; -} - -.navbar .divider-vertical { - height: 40px; - margin: 0 9px; - border-right: 1px solid #ffffff; - border-left: 1px solid #f2f2f2; -} - -.navbar .btn, -.navbar .btn-group { - margin-top: 5px; -} - -.navbar .btn-group .btn, -.navbar .input-prepend .btn, -.navbar .input-append .btn, -.navbar .input-prepend .btn-group, -.navbar .input-append .btn-group { - margin-top: 0; -} - -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} - -.navbar-form:before, -.navbar-form:after { - display: table; - line-height: 0; - content: ""; -} - -.navbar-form:after { - clear: both; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: 5px; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .btn { - display: inline-block; - margin-bottom: 0; -} - -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} - -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 5px; - white-space: nowrap; -} - -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} - -.navbar-search { - position: relative; - float: left; - margin-top: 5px; - margin-bottom: 0; -} - -.navbar-search .search-query { - padding: 4px 14px; - margin-bottom: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -.navbar-static-top { - position: static; - margin-bottom: 0; -} - -.navbar-static-top .navbar-inner { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - margin-bottom: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - border-width: 0 0 1px; -} - -.navbar-fixed-bottom .navbar-inner { - border-width: 1px 0 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner { - padding-right: 0; - padding-left: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.navbar-fixed-top { - top: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); -} - -.navbar-fixed-bottom { - bottom: 0; -} - -.navbar-fixed-bottom .navbar-inner { - -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); - box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); -} - -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} - -.navbar .nav.pull-right { - float: right; - margin-right: 0; -} - -.navbar .nav > li { - float: left; -} - -.navbar .nav > li > a { - float: none; - padding: 10px 15px 10px; - color: #777777; - text-decoration: none; - text-shadow: 0 1px 0 #ffffff; -} - -.navbar .nav .dropdown-toggle .caret { - margin-top: 8px; -} - -.navbar .nav > li > a:focus, -.navbar .nav > li > a:hover { - color: #333333; - text-decoration: none; - background-color: transparent; -} - -.navbar .nav > .active > a, -.navbar .nav > .active > a:hover, -.navbar .nav > .active > a:focus { - color: #555555; - text-decoration: none; - background-color: #e5e5e5; - -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); -} - -.navbar .btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-right: 5px; - margin-left: 5px; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #ededed; - *background-color: #e5e5e5; - background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); - background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); - background-repeat: repeat-x; - border-color: #e5e5e5 #e5e5e5 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); -} - -.navbar .btn-navbar:hover, -.navbar .btn-navbar:focus, -.navbar .btn-navbar:active, -.navbar .btn-navbar.active, -.navbar .btn-navbar.disabled, -.navbar .btn-navbar[disabled] { - color: #ffffff; - background-color: #e5e5e5; - *background-color: #d9d9d9; -} - -.navbar .btn-navbar:active, -.navbar .btn-navbar.active { - background-color: #cccccc \9; -} - -.navbar .btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} - -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} - -.navbar .nav > li > .dropdown-menu:before { - position: absolute; - top: -7px; - left: 9px; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ''; -} - -.navbar .nav > li > .dropdown-menu:after { - position: absolute; - top: -6px; - left: 10px; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - border-left: 6px solid transparent; - content: ''; -} - -.navbar-fixed-bottom .nav > li > .dropdown-menu:before { - top: auto; - bottom: -7px; - border-top: 7px solid #ccc; - border-bottom: 0; - border-top-color: rgba(0, 0, 0, 0.2); -} - -.navbar-fixed-bottom .nav > li > .dropdown-menu:after { - top: auto; - bottom: -6px; - border-top: 6px solid #ffffff; - border-bottom: 0; -} - -.navbar .nav li.dropdown > a:hover .caret, -.navbar .nav li.dropdown > a:focus .caret { - border-top-color: #333333; - border-bottom-color: #333333; -} - -.navbar .nav li.dropdown.open > .dropdown-toggle, -.navbar .nav li.dropdown.active > .dropdown-toggle, -.navbar .nav li.dropdown.open.active > .dropdown-toggle { - color: #555555; - background-color: #e5e5e5; -} - -.navbar .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #777777; - border-bottom-color: #777777; -} - -.navbar .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.navbar .pull-right > li > .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu:before, -.navbar .nav > li > .dropdown-menu.pull-right:before { - right: 12px; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu:after, -.navbar .nav > li > .dropdown-menu.pull-right:after { - right: 13px; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { - right: 100%; - left: auto; - margin-right: -1px; - margin-left: 0; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} - -.navbar-inverse .navbar-inner { - background-color: #1b1b1b; - background-image: -moz-linear-gradient(top, #222222, #111111); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); - background-image: -webkit-linear-gradient(top, #222222, #111111); - background-image: -o-linear-gradient(top, #222222, #111111); - background-image: linear-gradient(to bottom, #222222, #111111); - background-repeat: repeat-x; - border-color: #252525; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); -} - -.navbar-inverse .brand, -.navbar-inverse .nav > li > a { - color: #999999; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} - -.navbar-inverse .brand:hover, -.navbar-inverse .nav > li > a:hover, -.navbar-inverse .brand:focus, -.navbar-inverse .nav > li > a:focus { - color: #ffffff; -} - -.navbar-inverse .brand { - color: #999999; -} - -.navbar-inverse .navbar-text { - color: #999999; -} - -.navbar-inverse .nav > li > a:focus, -.navbar-inverse .nav > li > a:hover { - color: #ffffff; - background-color: transparent; -} - -.navbar-inverse .nav .active > a, -.navbar-inverse .nav .active > a:hover, -.navbar-inverse .nav .active > a:focus { - color: #ffffff; - background-color: #111111; -} - -.navbar-inverse .navbar-link { - color: #999999; -} - -.navbar-inverse .navbar-link:hover, -.navbar-inverse .navbar-link:focus { - color: #ffffff; -} - -.navbar-inverse .divider-vertical { - border-right-color: #222222; - border-left-color: #111111; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { - color: #ffffff; - background-color: #111111; -} - -.navbar-inverse .nav li.dropdown > a:hover .caret, -.navbar-inverse .nav li.dropdown > a:focus .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #999999; - border-bottom-color: #999999; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .navbar-search .search-query { - color: #ffffff; - background-color: #515151; - border-color: #111111; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -webkit-transition: none; - -moz-transition: none; - -o-transition: none; - transition: none; -} - -.navbar-inverse .navbar-search .search-query:-moz-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query:focus, -.navbar-inverse .navbar-search .search-query.focused { - padding: 5px 15px; - color: #333333; - text-shadow: 0 1px 0 #ffffff; - background-color: #ffffff; - border: 0; - outline: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); -} - -.navbar-inverse .btn-navbar { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e0e0e; - *background-color: #040404; - background-image: -moz-linear-gradient(top, #151515, #040404); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); - background-image: -webkit-linear-gradient(top, #151515, #040404); - background-image: -o-linear-gradient(top, #151515, #040404); - background-image: linear-gradient(to bottom, #151515, #040404); - background-repeat: repeat-x; - border-color: #040404 #040404 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.navbar-inverse .btn-navbar:hover, -.navbar-inverse .btn-navbar:focus, -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active, -.navbar-inverse .btn-navbar.disabled, -.navbar-inverse .btn-navbar[disabled] { - color: #ffffff; - background-color: #040404; - *background-color: #000000; -} - -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active { - background-color: #000000 \9; -} - -.breadcrumb { - padding: 8px 15px; - margin: 0 0 20px; - list-style: none; - background-color: #f5f5f5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.breadcrumb > li { - display: inline-block; - *display: inline; - text-shadow: 0 1px 0 #ffffff; - *zoom: 1; -} - -.breadcrumb > li > .divider { - padding: 0 5px; - color: #ccc; -} - -.breadcrumb > .active { - color: #999999; -} - -.pagination { - margin: 20px 0; -} - -.pagination ul { - display: inline-block; - *display: inline; - margin-bottom: 0; - margin-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - *zoom: 1; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.pagination ul > li { - display: inline; -} - -.pagination ul > li > a, -.pagination ul > li > span { - float: left; - padding: 4px 12px; - line-height: 20px; - text-decoration: none; - background-color: #ffffff; - border: 1px solid #dddddd; - border-left-width: 0; -} - -.pagination ul > li > a:hover, -.pagination ul > li > a:focus, -.pagination ul > .active > a, -.pagination ul > .active > span { - background-color: #f5f5f5; -} - -.pagination ul > .active > a, -.pagination ul > .active > span { - color: #999999; - cursor: default; -} - -.pagination ul > .disabled > span, -.pagination ul > .disabled > a, -.pagination ul > .disabled > a:hover, -.pagination ul > .disabled > a:focus { - color: #999999; - cursor: default; - background-color: transparent; -} - -.pagination ul > li:first-child > a, -.pagination ul > li:first-child > span { - border-left-width: 1px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-topleft: 4px; -} - -.pagination ul > li:last-child > a, -.pagination ul > li:last-child > span { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-bottomright: 4px; -} - -.pagination-centered { - text-align: center; -} - -.pagination-right { - text-align: right; -} - -.pagination-large ul > li > a, -.pagination-large ul > li > span { - padding: 11px 19px; - font-size: 17.5px; -} - -.pagination-large ul > li:first-child > a, -.pagination-large ul > li:first-child > span { - -webkit-border-bottom-left-radius: 6px; - border-bottom-left-radius: 6px; - -webkit-border-top-left-radius: 6px; - border-top-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topleft: 6px; -} - -.pagination-large ul > li:last-child > a, -.pagination-large ul > li:last-child > span { - -webkit-border-top-right-radius: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - border-bottom-right-radius: 6px; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 6px; -} - -.pagination-mini ul > li:first-child > a, -.pagination-small ul > li:first-child > a, -.pagination-mini ul > li:first-child > span, -.pagination-small ul > li:first-child > span { - -webkit-border-bottom-left-radius: 3px; - border-bottom-left-radius: 3px; - -webkit-border-top-left-radius: 3px; - border-top-left-radius: 3px; - -moz-border-radius-bottomleft: 3px; - -moz-border-radius-topleft: 3px; -} - -.pagination-mini ul > li:last-child > a, -.pagination-small ul > li:last-child > a, -.pagination-mini ul > li:last-child > span, -.pagination-small ul > li:last-child > span { - -webkit-border-top-right-radius: 3px; - border-top-right-radius: 3px; - -webkit-border-bottom-right-radius: 3px; - border-bottom-right-radius: 3px; - -moz-border-radius-topright: 3px; - -moz-border-radius-bottomright: 3px; -} - -.pagination-small ul > li > a, -.pagination-small ul > li > span { - padding: 2px 10px; - font-size: 11.9px; -} - -.pagination-mini ul > li > a, -.pagination-mini ul > li > span { - padding: 0 6px; - font-size: 10.5px; -} - -.pager { - margin: 20px 0; - text-align: center; - list-style: none; - *zoom: 1; -} - -.pager:before, -.pager:after { - display: table; - line-height: 0; - content: ""; -} - -.pager:after { - clear: both; -} - -.pager li { - display: inline; -} - -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #f5f5f5; -} - -.pager .next > a, -.pager .next > span { - float: right; -} - -.pager .previous > a, -.pager .previous > span { - float: left; -} - -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999999; - cursor: default; - background-color: #fff; -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000000; -} - -.modal-backdrop.fade { - opacity: 0; -} - -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.modal { - position: fixed; - top: 10%; - left: 50%; - z-index: 1050; - width: 560px; - margin-left: -280px; - background-color: #ffffff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - outline: none; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} - -.modal.fade { - top: -25%; - -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; - -moz-transition: opacity 0.3s linear, top 0.3s ease-out; - -o-transition: opacity 0.3s linear, top 0.3s ease-out; - transition: opacity 0.3s linear, top 0.3s ease-out; -} - -.modal.fade.in { - top: 10%; -} - -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} - -.modal-header .close { - margin-top: 2px; -} - -.modal-header h3 { - margin: 0; - line-height: 30px; -} - -.modal-body { - position: relative; - max-height: 400px; - padding: 15px; - overflow-y: auto; -} - -.modal-form { - margin-bottom: 0; -} - -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - text-align: right; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - line-height: 0; - content: ""; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} - -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} - -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} - -.tooltip { - position: absolute; - z-index: 1030; - display: block; - font-size: 11px; - line-height: 1.4; - opacity: 0; - filter: alpha(opacity=0); - visibility: visible; -} - -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} - -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} - -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} - -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} - -.tooltip-inner { - max-width: 200px; - padding: 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-right-color: #000000; - border-width: 5px 5px 5px 0; -} - -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-left-color: #000000; - border-width: 5px 0 5px 5px; -} - -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - white-space: normal; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.popover.top { - margin-top: -10px; -} - -.popover.right { - margin-left: 10px; -} - -.popover.bottom { - margin-top: 10px; -} - -.popover.left { - margin-left: -10px; -} - -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - -webkit-border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} - -.popover-title:empty { - display: none; -} - -.popover-content { - padding: 9px 14px; -} - -.popover .arrow, -.popover .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.popover .arrow { - border-width: 11px; -} - -.popover .arrow:after { - border-width: 10px; - content: ""; -} - -.popover.top .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, 0.25); - border-bottom-width: 0; -} - -.popover.top .arrow:after { - bottom: 1px; - margin-left: -10px; - border-top-color: #ffffff; - border-bottom-width: 0; -} - -.popover.right .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, 0.25); - border-left-width: 0; -} - -.popover.right .arrow:after { - bottom: -10px; - left: 1px; - border-right-color: #ffffff; - border-left-width: 0; -} - -.popover.bottom .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, 0.25); - border-top-width: 0; -} - -.popover.bottom .arrow:after { - top: 1px; - margin-left: -10px; - border-bottom-color: #ffffff; - border-top-width: 0; -} - -.popover.left .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, 0.25); - border-right-width: 0; -} - -.popover.left .arrow:after { - right: 1px; - bottom: -10px; - border-left-color: #ffffff; - border-right-width: 0; -} - -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} - -.thumbnails:before, -.thumbnails:after { - display: table; - line-height: 0; - content: ""; -} - -.thumbnails:after { - clear: both; -} - -.row-fluid .thumbnails { - margin-left: 0; -} - -.thumbnails > li { - float: left; - margin-bottom: 20px; - margin-left: 20px; -} - -.thumbnail { - display: block; - padding: 4px; - line-height: 20px; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -webkit-transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -a.thumbnail:hover, -a.thumbnail:focus { - border-color: #0088cc; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} - -.thumbnail > img { - display: block; - max-width: 100%; - margin-right: auto; - margin-left: auto; -} - -.thumbnail .caption { - padding: 9px; - color: #555555; -} - -.media, -.media-body { - overflow: hidden; - *overflow: visible; - zoom: 1; -} - -.media, -.media .media { - margin-top: 15px; -} - -.media:first-child { - margin-top: 0; -} - -.media-object { - display: block; -} - -.media-heading { - margin: 0 0 5px; -} - -.media > .pull-left { - margin-right: 10px; -} - -.media > .pull-right { - margin-left: 10px; -} - -.media-list { - margin-left: 0; - list-style: none; -} - -.label, -.badge { - display: inline-block; - padding: 2px 4px; - font-size: 11.844px; - font-weight: bold; - line-height: 14px; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - white-space: nowrap; - vertical-align: baseline; - background-color: #999999; -} - -.label { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.badge { - padding-right: 9px; - padding-left: 9px; - -webkit-border-radius: 9px; - -moz-border-radius: 9px; - border-radius: 9px; -} - -.label:empty, -.badge:empty { - display: none; -} - -a.label:hover, -a.label:focus, -a.badge:hover, -a.badge:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.label-important, -.badge-important { - background-color: #b94a48; -} - -.label-important[href], -.badge-important[href] { - background-color: #953b39; -} - -.label-warning, -.badge-warning { - background-color: #f89406; -} - -.label-warning[href], -.badge-warning[href] { - background-color: #c67605; -} - -.label-success, -.badge-success { - background-color: #468847; -} - -.label-success[href], -.badge-success[href] { - background-color: #356635; -} - -.label-info, -.badge-info { - background-color: #3a87ad; -} - -.label-info[href], -.badge-info[href] { - background-color: #2d6987; -} - -.label-inverse, -.badge-inverse { - background-color: #333333; -} - -.label-inverse[href], -.badge-inverse[href] { - background-color: #1a1a1a; -} - -.btn .label, -.btn .badge { - position: relative; - top: -1px; -} - -.btn-mini .label, -.btn-mini .badge { - top: 0; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-ms-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -} - -.progress .bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - color: #ffffff; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(to bottom, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} - -.progress .bar + .bar { - -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); -} - -.progress-striped .bar { - background-color: #149bdf; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} - -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} - -.progress-danger .bar, -.progress .bar-danger { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); -} - -.progress-danger.progress-striped .bar, -.progress-striped .bar-danger { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-success .bar, -.progress .bar-success { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(to bottom, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); -} - -.progress-success.progress-striped .bar, -.progress-striped .bar-success { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-info .bar, -.progress .bar-info { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(to bottom, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); -} - -.progress-info.progress-striped .bar, -.progress-striped .bar-info { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-warning .bar, -.progress .bar-warning { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); -} - -.progress-warning.progress-striped .bar, -.progress-striped .bar-warning { - background-color: #fbb450; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.accordion { - margin-bottom: 20px; -} - -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.accordion-heading { - border-bottom: 0; -} - -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} - -.accordion-toggle { - cursor: pointer; -} - -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} - -.carousel { - position: relative; - margin-bottom: 20px; - line-height: 1; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} - -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - line-height: 1; -} - -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} - -.carousel-inner > .active { - left: 0; -} - -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} - -.carousel-inner > .next { - left: 100%; -} - -.carousel-inner > .prev { - left: -100%; -} - -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} - -.carousel-inner > .active.left { - left: -100%; -} - -.carousel-inner > .active.right { - left: 100%; -} - -.carousel-control { - position: absolute; - top: 40%; - left: 15px; - width: 40px; - height: 40px; - margin-top: -20px; - font-size: 60px; - font-weight: 100; - line-height: 30px; - color: #ffffff; - text-align: center; - background: #222222; - border: 3px solid #ffffff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} - -.carousel-control.right { - right: 15px; - left: auto; -} - -.carousel-control:hover, -.carousel-control:focus { - color: #ffffff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} - -.carousel-indicators { - position: absolute; - top: 15px; - right: 15px; - z-index: 5; - margin: 0; - list-style: none; -} - -.carousel-indicators li { - display: block; - float: left; - width: 10px; - height: 10px; - margin-left: 5px; - text-indent: -999px; - background-color: #ccc; - background-color: rgba(255, 255, 255, 0.25); - border-radius: 5px; -} - -.carousel-indicators .active { - background-color: #fff; -} - -.carousel-caption { - position: absolute; - right: 0; - bottom: 0; - left: 0; - padding: 15px; - background: #333333; - background: rgba(0, 0, 0, 0.75); -} - -.carousel-caption h4, -.carousel-caption p { - line-height: 20px; - color: #ffffff; -} - -.carousel-caption h4 { - margin: 0 0 5px; -} - -.carousel-caption p { - margin-bottom: 0; -} - -.hero-unit { - padding: 60px; - margin-bottom: 30px; - font-size: 18px; - font-weight: 200; - line-height: 30px; - color: inherit; - background-color: #eeeeee; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - letter-spacing: -1px; - color: inherit; -} - -.hero-unit li { - line-height: 30px; -} - -.pull-right { - float: right; -} - -.pull-left { - float: left; -} - -.hide { - display: none; -} - -.show { - display: block; -} - -.invisible { - visibility: hidden; -} - -.affix { - position: fixed; -} diff --git a/Jeopardy/php/css/bootstrap.min.css b/Jeopardy/php/css/bootstrap.min.css deleted file mode 100644 index df96c86..0000000 --- a/Jeopardy/php/css/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap v2.3.2 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/Jeopardy/php/css/triviatime.css b/Jeopardy/php/css/triviatime.css deleted file mode 100644 index 9bce221..0000000 --- a/Jeopardy/php/css/triviatime.css +++ /dev/null @@ -1,96 +0,0 @@ -body { - padding-top: 40px; -} -.strong-text { - color: inherit; - font-size: 18px; - font-weight: 200; - line-height: 30px; -} -.profile-header h1 { - font-size: 30px; - line-height: 30px; -} -.profile-header { - padding: 30px 14px; - background-color: #f0f0f0; - border-radius: 6px 6px 6px 6px; - color: inherit; - font-size: 16px; - font-weight: 200; - line-height: 16px; - margin-bottom: 10px; - margin-right:0px; - margin-left:0px; -} -.padded-row { - margin-top: 60px; - margin-bottom: 60px; -} -.breakable { - word-wrap: break-word; - overflow-wrap: break-word; - -ms-word-break: break-all; - word-break: break-all; -} -.modal-table tbody tr:hover { - background-color: #E0E0E0; - cursor: pointer; -} -.form-signin { - max-width: 300px; - padding: 19px 29px 29px; - margin: 0 auto 20px; - background-color: #fff; - border: 1px solid #e5e5e5; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.05); - -moz-box-shadow: 0 1px 2px rgba(0,0,0,.05); - box-shadow: 0 1px 2px rgba(0,0,0,.05); -} -.form-signin .form-signin-heading, -.form-signin .checkbox { - margin-bottom: 10px; -} -.form-signin input[type="text"], -.form-signin input[type="password"] { - font-size: 16px; - height: auto; - margin-bottom: 15px; - padding: 7px 9px; -} -@media (max-width: 980px) { - /* Enable use of floated navbar text */ - .navbar-text.pull-right { - float: none; - padding-left: 5px; - padding-right: 5px; - } -} -@media screen and (max-height: 600px) { - .modal-body { - max-height: 340px; - } -} -@media screen and (max-height: 520px) { - .modal-body { - max-height: 260px; - } -} -@media screen and (max-height: 438px) { - .modal-body { - max-height: 200px; - } -} -@media screen and (max-height: 370px) { - .modal-body { - max-height: 150px; - } -} -@media screen and (max-height: 320px) { - .modal-body { - max-height: 70px; - } -} diff --git a/Jeopardy/php/fonts/glyphicons-halflings-regular.eot b/Jeopardy/php/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index 423bd5d3a20b804f596e04e5cd02fb4f16cfcbc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20290 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Jeopardy/php/fonts/glyphicons-halflings-regular.ttf b/Jeopardy/php/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index a498ef4e7c8b556fc36f580c5ff524025bb11c84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41236 zcmc${34B}Cl|TOOdr!M8>1nlW%aSZh@-ADltvHKgvhN959SD$s!WNdWGz16%Qr5Hq zLm`wxhZF|Lu$1?dP}&a6w6rkl;x0@`ftk{z3q#8?Eo6ReL;Ujlp8MoA3AF$DeLjCD zlHMl0d(S=h+;hHXc>)szLBX3Wc;?Jmx%k3A|K_)Xz-n-`X6~%nbC?xp1U3o#v85|A z*$bXrcnkLXvA_PjOE+x(^}IzP?0-`b#EZ|{a&=5-kZ#A1)#JSN{LL3!x?+FkN$j`a z{KgA5T(ud;J%V7qkIr9k$+hP<{q(UrvH!3j+*x_y#tj7~Z^HK7`*FVeLL9JXWjFTU z$A0~VmtMW~yZ@@(EeHen4e`h&m!G#Gd;iMo1mR26#&2G_Ve4j5W_twTz87(Q?6M7) zZanZW4}OgO{}cpi+vdx!y86eb4XhS~FQfg|TQ*<0akKhSvtJPQ;Jnaw&Bk-j-=Htg z3&Pi&*f--v)DeC>?a`mo=TFXRd%*bg-oVeeuvbY(1QGj8cndGI1beuhd@~ymOoA*q z#h+pS4C9miqmUIrEdi%a{ep`JtY53N14 z{?J8-u03?;p$87z4u=mn9_~3j=kWZ)YY$&^_}asF9=`wZgTEGzAIGm5zt@D{6DItg zaL9DXb0~JG{ZQYbW%#{w4{bhl)1iUG?6Bu>>~Q!asH*G5-F7f0ttPmA`|67~Nd|1t2u@Q*SYReFv6!$}$f<4-=-kPct) z|MMp?^teB8{@?g_x6mN|MHO09!M9Ldw5(rUuw|_(B&JuY=H~usYx%Jo*2WH~%-2@g zsMRu8VN#&!Ke z)gP>_PQ+DHbH6%g%UXV7?OObvsik7w8Lg_hMXO_X;O?xckEv2}ej=vIsRgRAtbgamof~4bF{wHpUt7JC?=3g>=!SNq zb)ITZ95->a#9rgwakj)Vs-<~de=IgPF=xZYvHn=$T;nI`x(d28ZXMeho4a$)hQ!X; z&IG?*LKT+xt9`f<{iEBeeH&>9-*NFfO*>c_k5|VI?gSa|rTJ*vs&d=VK3wK*NyHA8 zZ=Q(tFI-U_SJ~SBo#@c~#Lh%)=lq?C4b&3q4!u)*JTwem41+=)pbhVY4xpilIf)Gy zuOHhJ`l_!5o!EIhk!?XCvD2c)mi14q{tnLgTlNWktZ&8)w(y%C;XHxA)5WXM^4QMh z{fTqY`oxTCe6Yj}P`+<@e^H1DGtZk*WHE*hHFlmF-dMw1ieC)0s5lC`;H{My60#JM z#*Nw5fSn7a7$%uTXw#UGnOd~S;s;sHZ2HfsMM=b_phUL-FPLPEWu3K_K`r?NrSk!5OSM)e(3Ohp!Upus`hn3ceKQ;2eKyHol)oqyLDikr zdRVhomsh;1rAKX5ijG*er>BRgn9p_Q6Zu?szB`u<1w)C>HZf7>5-o8{+#JALt(?pD zid{Lg#hj>1x3P4gaE0lu!tKe0pWFY@=BeiAbBh+#R`$%A?qk;%^aEzL8}GLEo|(Bo zWWl1`*P|OYJvn$y{R}5NQpj`_o;+jMOBY<6?{5$LTh8b$v~?F2Ts@=NUDdv(>zRu` z_YZAPZ{>VeVgvFb@kQ{Lm-B)&$W%F_nT(MKSxeF_$F>nUY53Ujk64TRvV58l6rzGE zWmNZ|YR6YX8Lbju(d?4q)tug*p7svOAI!zG-CdojM4hFLCF;xpf5^pLS1c7j-1^j0 zTiaS%p1hbYJ@cvJ@8+p&HNT`ZJmNyTPT z*gy%b{$v?z(GQ6IVn0T^r9cPu%_Y8fWax46Ox?*^hW4V(((#Xve=NTwzl7OjCf&=D z1Uoal^4*;oma4N-i8Z1gy;vC5Y#{3@Sg5?$nX;H%EP!KXx&Dr& zr-2xK3zn|&Dt9iOv%+N`^4MM2|H5UBRe|+Q;@J-k{n-<$y0Sap7!IADm#(lor0+^T z`_NLQGE6Ib==l5c_vHr#pHMBV6^c-tnpJN`4GpT*8T5v!H5rv1R0D%*z(cY@HDL~b z-NOOJyH655-uh6FYEr=Yg64H$3fOwokfM5e)N1cOCRj{3-`?T%phE$_g$4a?X0A&! zu)F99#=1SJScuht)oPZo7K`OltKX_0xaO|X=U-;t?|xVRkbOYs^xu~5x<)^Mlb2d7 ztYwLKiT=lzzl$qqSV*?@%g@QPgs>10m|B%lg@dYV5dXDmgQYur#ab4^n;7uBBukrI zm~_T9*Ie7ue*M@#__LjZ9y-(h9?M%tjw`E1EJb%{gd2;KDEqy)L-gIMe)vDr+ zH(d)_9si~{s`S_p&$i9rx%r={xSdPn2R@DE&d7 z&V2d@>|gPTwo2oEBM3cOt$_IDVn_xPm8TRY(%4`3g)I3{I-f{ePQ1^|@6Z3v_ZEEj zy~RsTa!2v%yMFz}UBCO{zyCX@6W%btpv{1nyI5CUY8vb8&ITjQZ%zbQfDI(4tAA0a zC)vQ=j1}(BmA0wswo>l?f_@z42h9ii{vy6EIj~asu$ojuCM1M3H0=y#genwqQL`!! zYLzhvN=rtq%c<5uwLYslGHNQPItSH;tm@9FO*z#wsJ3KPUq)@qss2H=Jxl$s&E|+4 zOzq_3C=c$lIz9gSP*#;aB%=1&DwF{2Rt~B)csIB*l2v1a`|2B7+UZoxqs4J$vaz*; zcBMhBiv*R^0YOz&-P5DG6|E*h0;_|smtBdj-1wIdQV_E=&L$kE>tywl{e_V~h@YXo z{Pp6N@q7Da4?`?OyhN_Fh+RnKKqRG5pY2u5((&= z>3wut>>s-~b~`(IQAE6S%+AnDV|K=!5gQ6z;}a&8eVGy#$N^ zM(Qkpks=vw(KhV+2enyOW4|?{t@|SO>j$-!w`4(`0iurPA*Qo|`5NfcqqRd)^)178 z&!9H1pFTa>dK}w)6SglJ)VAJ{&1&~>%F$ey!i?F_%<57~*Qf8Z&p1Ev`+x8CkwA%t z;1q9c;FPEMiO)Kp9r<1M_{lbp{m;pcj=AMR;nbsdeVx)LM0e%y$LPBEg|hLew;KZwEX#-OG!nC8I5(WTL#dBJ5L<_V3~r|o|> zwZ#`{xQ1rY`^mS*(tLDiN9g?76s5H;BGkzr$xQ^LVChM-bc8)7We*H}?I-M2eVx>a zExFCBU(ly=4lFAMo|nxWcR2^MfLWmVQ3v8Pt_Q$BjknF;px#L&_4DFra&c~ zt5%BsFvHhAUH6b6&vSuXAQ4D(eX1TZr%);sN}r*P=xgbsLSdA4U*URHR5)uK?aGvi zjiF3gv%;#yHLK@Iv#N=V>E%S->Uq+wYHB}IyOOYso!GOjyGAsuIi#ns56f!Su50zz zEkWpER@S_jt648I&&%i-*A<13{2=s)YOMCN1u`7T3~1r&l4Y<6r5&Safib6AJem_@ z?HepQeRR+XJBmyu&1u0Pg(_2o!)!^+N>X{AdH4|SI`R$O{{AZnK6N}o*5H3 z^xBgbY&*)%J-Y3JCto}Bq1WGk{h>42FC&2h%_O{u{V%YF-Y4>gQV4?6QBZ&LDgY&$33Vi zT-xMeVKW%V!~Y5}PFhMB`Vu1pg&onIWO+kTSVnZK5~}6h@@`?SaJq1=Kk?J)6#Ud$s1%h~a(ys2GegOE8oV1+kgSP8YkUvruYV9zk8tSSuDRW!Kblar%Wm2V^ zec5FCGV_F_Wi3;0GqtvxjVnyq7SpX$+LlS-3h@CmyI^~9JN}DnGaIx+f11@bE-YuzkPfE z+U?t+K3Igp@#C^;@)?Cn=eC2St6RCAO;o}h)=XB2SH>r+jiH(R z9}@?}TT1!?`X{axZyDM)w3psFqQzKfa_sLng@$!Mg%ik zArXAWY~niU2t}B}3N8ox4>sU(9Q(S%CHAwHu)N*j(w#$Rp?i{-`c5)d7G(Ju`5CNn zKJdT}foyPK6MiyZiy=SVCKSN9z`~F*&M*wof(ne9NAqKxMlTBEqL7CsH|9MVjhep# za>_2be3)6962gv6c9X3uXnr^LEJB5cPWkARnJG@}&{E^AkI7z-D97r(W%JfYQX(Ml zVO}Eu{^ZG&rB#CEB>ZD>DIxiCQlh|~`+49||IgTS zL+>8zfbQ0{O~OG1y#;a7wfYSY=m&{Xu`50ki_90E{FptSH|76|y(P zb%Pp3t?f|*-u+IKFGy>wpoM&j_jzWu303746^KE$R^&?&8y-oCi+hQkv*+z2Z|^zB z_*nN5TlvvP`ZLRRmv$dzV@}|_DC*CAMCWxrUBR^DdA3T}FwC=M7KLUo!lI-Sz{Z7v zTjt9e>IwLAKk+3j;vTh9Q3E|Hju3MOc~5-c&gYrgB5*zE>aGLN9dMg=@XFsCDChI52^RiK{Y1aV}WT?!H-7*m-OD;UE5cw+g=I!O$(+jJ^Yeat4a#)%V{ z?Z>D;^E9USPIgZT(l%7qn`(p=0zu6XK}tpqqn$ADG2W0_ZjWX+__Y@8w9_D(WS>72 zreU@zS|CX4zCxqV1e+fK2vlK3<&E~&iUcAj{N`B7LqM}7u2`_D12ZfuO1qEh{{XG% zj?3<41NVIORcJ-xPe_5n=`B!~pjDktXRbT*AAjXvRJdY3;t`mw1&3nwT;9xNr zrFkB#!aN6VWg0A2nCL(SCO%W^xGDos$74*xszEJ*&Ui?bQ2-C4!7o@$4m?EAc#fV-844+yZ5$yDNuz3Amhkx8>EZ-lK2+ z(&pQ>qx0DS|J-dH7W+y0yN=E-JF3z0M4$YafRztomGdq6SSDgw%LLV$Q7dzVw7?+% z#{`@M7&L%PP!3}`6{052*}FbR$Y>Ix5N3|`U=c_aDID-0xV%AZkt(fKFUu<~)+U)P==Rjxw{E-g;zDD?^|uV% ze)SoC!rj=w)b@&awQ1?;?8xb}?F|j~*{2&a1Me8~2f)=G!fC<CLIBLA9HY za|C3XQMPAjC94B%ng`WpkCw&OltFchNAqASG^ou4YiFB5Bc~%$0~!fhDudZ+@%a1_ zakmre9hY^=h$Yj@Vzof-NA}x9_<{mHPFjPY1Uw}t?7JLL>URB>nSZ;BZ=Uzq+wZ>p z*m)(Vb&u7_-^BjWZRUfZbg-5ie}3haKfh5wVC-FuFW`Gu553NQOkdJF>3z&L9|u7w z$^Fv1z!os&mAFYU#Tje{m=UlH(g5BK$uFwAcFi6B45L3(;zW&j3EV%Ad54o|kFESB_FidiRrMSVp9Gk5!h=JoBWVd|tzg z#n(*>Y%b_~7LuSa?MUf@?geEAQyiK%oPj`kih|j}F*uTOxwwr9{!lOr7i=0HSOzQi zE%8NIb#Fv!SJX!64MXrBb~n^Lr}UeZk=oh_z2UwRt!$=Wg1&U$Fyyy!=MZKP-CXr! zIvDmH?oVDne*gWre~?rtC=(}XK{7`Ost9puwBr}X{cuy!0UpquS@tru$l;pMB9-=W z61v^69$|<7#_)Z?=S5mC%xSnG?QoTkGpFqkLq*X7y$3S}Lc&{QvWe3Ou@=zVpyR}q z!gJDB3q#(5_@T_6J5~wyD;(n?cT4~fhqY3J1|y*LK*!+aF$YTQW%hC;aO_YZ!d}#8 z%iI06wG`*X!?gH#Ik2*($-|qZ5rc&U%MmuCoqMP$v;wgoMTy5;j98G+Y0w35CW0~m zfe{!6Yy=iEL9mEdiv$-o0qao~S^XLSi%Z(Ye6)GA$s~CtZ??rU580Gk6G=siIJz5&QX&%&a z=t>mBpoV+2<}|t#uTRFPOIm9q_M&wOvIy09pS1Byo{t2m7^UvM%gA~ z@pg%B9`qm(ga!mn^ar!uovAuf{H8QY?-EM0TXyI2E1F7;%O|%voV%eV6$VNJ10{2B ze{XL;19j*sQkbmOv%8wH6Yx)Igei<`23U+P>OC7`M-;mFTzn2TaUEU;_aUyQcCaWq zNwPCFkwKuCp@DYQwXx|e9>Opn03n576RdLySc)#@X3Q7zb+Jnud+UAc*zLZu!I8t!oeo)#Ph)RY>m~^R`zztKgUaH}-=s z>fZy;VNOWjgS{Sugy;}93dI=lTzt^@MA#9=r)f~_;FeH@2OP#n38-s)kQS;qmMn}8 zEQw_7paN#)qm*pJC`o0RSXw-Jc!X0$;#zq4Asb~wO)?M*kF{m2&87s9(&Vm2a?GBxmllEpt}hv$(Wj1&Z{d=2OWtw}(>F<&%0WI6yr5?xU& z_7v;kR8$${Ph-u=hZ0K80=z4Z9gIXXQ$k?1yaH2H3M^c>@P-@kI=WkYad*}eXp7gC z3i{?ksV<)JD^MbzeDc_#C#Cafd5xq4Hu2ckvxP!dS}xiG=?Lb!D8!F{L%tibkNOLg z*Gl~r2f1lFw!3z;+ii3g0cC%8CnL~l_K8*-!yMN`_ zg%5c+`4aH=?neUhBC^0f*-!6MjNWPe!1lX*yOQ3;etI9;3zdbI6z**)ed^ZV(pH#2 zSQEH+mbV>P%eeiC=f}5owB4msx>`q?$c~I`>YGP4#~eLLdsAhE5qbqY(r^p_ra^ql zvfYC z{q%krJu-UtS^fGf-}uDyWBc{DY-dNB&-y-N6JkKXwCC&I=v)|%9a&x;H^dWQ=nzkU zULu|VL${L07F@z(3kq2p$!$6E-&_qbaTDnWMNh1qY#|#2VZ$V{c5deD=ES&xiBTP& zwLc1(7(6kNR-d&$>frqJEy7twdFF4~{yV6CY~VA7Wz4uCgXB0+L@uk$&{C^}CSfv= zs2I1_5demzu?~g$re=0CSM!uVxM3MgpuZxYRTojiv|cfefUYgTCz@6GPBowX{UV52GzD(IIcN zMY;uMx=-B6_qX7k!7`;F-eKE?=6MJaa`X#2>6#w{c71pir1sT=P$Tl|TtPV|=9;G~dNqfMVf{@AZfZp53zSVgy`d@bV0 z5jNi@<`Ku6Zxhog1T?tV=Vo1c)m62D`AgR{-fZqa62 zmuI`r{^r-d`pWvbcW=4os?Xgvd+mdTDYE(O7j9gBN!7XL;DUzvyE=21?Z!Md`0W+> zLgbRgg_N*HC{~e%2_y#I02;6~A27qKMAQflY7ImUc$M~d^E@s$!kF(37-`0OX#vnTa^!&ZY z^#hN;$M%1XJ$$9UiT(A8D+22XV1N8Qv-R6B5S?`84W+}6zxUq7S@!T1xaKccT(PQ# zWR&5jyB{*D2HxX&<(^^Mz-N;lRBaqXkv(wFGm44;TLPwPC;43G0Sg8q^Rcvt#w6al>Yj<6d9wC`3(l#HunYAE zEtT_TuAbRr^k`YEf4D~vcA-Noo!70S)LbhKYjqF)jCJFxz98wma4 zJ>u9J@5`vmpW|lSyKkwD5_Un+>T!&h4ISMVguPG4WJQa`$x&GrUZ)r>n}`5B^sQy; z%%c9-#Llf|)nfM@`tmOseF|yAU7B6`C+gEK{kLNNPW|*RQA`G2STi+9y4ga}OMHj9 z2kQ~`jSb5sVy*lKk!L`n&dQT?G>;#X(9C68km7+VLXc>pq6wIf0N7aoYXl-T@L^*> zTY(ng09HYYRbuJyaTK)lJ^fAKnkDf}*6^xvC*{lKe;?ZB0<5{(V}_7>3C2Pzxh zKnLPQAR-LfqCJH8VQm}nTp)%6&Rz0mU=fD$KrSr4ku{79eIffVfUfWA3$PmVd*F@h z3?%7`a0?;T$4${#=s4~I31sw|BTYtNZUFZ%{uy^F--vE?;?4AM`G%DvH)X;dBYKLz zoXbIRFqRAoEk8Kw*OTVZyAx;$xyuEIGHm;eA`zFtNJ0fL$o zl#yVziNS3k(r_5)*uY)xAv;m4E8iQ=LjL>o>tsFAuXAe(zc%`%-L%{ryZn22lN&IW zW~@jCVq_ZIXYh@J1)3cZJBNNOFQN`pb_#pf;L$N-gdYL`4Wwb1Ipr(~4MZ(~bo4V6 zYEA*w5Dc6Xy6D&uc4SnMB~^>=fYqlW@}i-) zjvAUVTF=~KC+5nx1dH@n`JZ@vE<@OD`di|%KkARL4Sy8Z45@!)8?Z%v^BjLoUM^ov z)=bjI@+@Qt;2_(eKk_GWYJd%?FY`->UI{Wbq@nX@FHms#S@~Iku-q9u;sIGMNLQm) zW1e889vAU|q2Lh@`zYc8QcchT6e3H(A$%bk8?EF+6f9RN;g*s1FdyWs53x!gAXe#v zJ4^hJhdB%%e1Fd#wwxax*Dg17h|!oNY8M>lBkiKNAfU$-7gRxO=19Ao6d7U>u*Aq% zH8lp0M*Fy6Dsq&c&@4*2I7y>Uq*a!;sjROWgdz}(GplA{xTDiUOSVkSsDNfT;pT9F z!VQXONlR#ABUZe=YuD>{-G%o9yH03Ju23XPQ zZX-pzQ_;-8FDK9yQ3Oz5drgy}*HXZ##U+Pwy>b_@LnstJELRgdSQ?Ps7PDv)ZL&-D zNxq;pWOAn?m8@j)w${}oI%aiLUvwK7b{qx3tYVdDcG@i_34z6)pwq+TP;^>KvNvY? zv$;hLmFCSue}npK zOC4|P z=168Z{tw?r@Ljn&NDh1>s5}KGs5VNu+DO%92tHTE5&2I{N(W$w2{C# z9uF{{6GtNa#zZ@uD&%Ya?YCb#{GW5#NKEJ0(9QoCz696uIXAWs;S>5WHZ--|2Z}-+ z?Sm1oHrfZnsX106jP?QIik+(Un|7`F@m=~8r);>M*tKTxE*;fNFcZeMxw_nDFh8aM zF~5-*YOFXEs|eY^6GMk%?A#Qhh?q5S7LT!WRiC)(_(P0ByL>#Xt22Ex&!Ht5-zV)J$o&+(kF^?Y_%U>>1@H%% zNtZ>U4p1OCg%Nv&kZP!wnoR9r<&bJ>$dB2}aN8ayKr;#w3#TV$#$qq)mEUWnnJ4=*Jix|yZ!(%-uIy}MZI zW_>fNz?2V2Hadb`$gesfA>Sq61-hUmFm&SzY+Z%_N*znnMf#g;@69ZIm;UC>Dvs!z zcj#}5UG!t=UHY3lz>`KS<%7`KDDQMB*VsQt}vqh(IkUS|SV! z?|GB6LXMM-2bq_EthUi|6+x_)u{@2%Ets#Ck=joFI+!wiK^l&zGy*Hx>dA7#-|bJx zljX|5PyLnckl?>AM^+ji;vD@oe1pggRWxTI{pX5Z&Th-7URdQ4yNXyZBXc|*2%dk&;?irzR_M&-Y>dj)Jd>(2lL%Y z@M|waxQOAWmMw4CtWsc7TjrvTU%B($3tJXkc*W=jI3hFAipJWKvBU?mAeug&LL?Ce2xwudV~3osm0XM=qvcSA|TV&X@7 zekf=(ww3{*gDz8x#JYU1obMLX!B8*_pRbsQhEprKWQ&=$+2tnNoH@}MlP5K}V=n*F z)ru(^wAQTAce%szMO@qY{k(sSM3r7KLiilz$|w7Es6Y-P;hsq&^Khb*qn z>FirGYA4;;8n7pOr`68*AiZpFAwIvw=a0EVRtJ;K{+eksFPr%cTXAX2sz*#HKXKce z_gkaqU;5+<=alNs>V{C*Biq{+ua31{29b08d%_L!2XYQ5*mT6K%@ioI21&-y4=Idv z9+Hv|s`)`}K8TQ?s(AbCws4iTv7xJ%$9DlrfgbpRpwzc@_0E{fg+2z+oUJt>DamE7 zYcr+uwWcg60}zw+zPeObXWoqZ7Wah44xduBE_wDPa zojs|!A-8VIg)TNfIeT(=!CFdpUp0TtRoiA>RJp#so~9{iA%GStutimvLbFsg=)QayQu6v)u?esP8^YHgDf3M>2 z_53|a??s%YGBOD>3^c?^BQ_e@UPyWDQ5`+P3l3+6CtOvZY%Bk-OY)b3Dr(^yI4ai*qW(p_hs0I=Jd>)+bXK6EXgxAerc54%3Yr$a z8}xU&cX^+@%%EsyP0jM^s-Y+Eai_AW>6LxrjqUe#-`(eLXmECJI+qL+>G(fDIC|x$ zVc&WoCxjG-HPUFZg)C{P&;g|yP}b$uNs}vC9T?i~pX49f{y*#`_LBZ2Iecc#nj4d2 zadYgGg9Y*5hguQjh71~L(D-@G>4FfzI;dhC=Lr-vO5EI(QIlNGLa}jVi$NY88LUJU zL^4QG5R{*)HG|WG2n*06wPcgoYOxtil08E{-aMfXgmbW3M)}0)q{8!xGb~{-Q;mhZ zVlt-+K?KnBZ|i59+`&pkf3Q&HJNxakeN_ehL8X$J8~q(FHk+;J?eFi^pVj}_)!}dS zS2+Kw|Mkoum7!U(#O4X~1W;XUK(~CEL^*dkPxHw&DhF%IiS?n(zy&|?Q z>~Q#N5)CbFm5TLfscHH4i?3Lg%PqU&;_b`XYN9N?h{f6QUkl%qFO=RUtw}-(d!E() zhOK8Cem(Rr?4jQfT=pArCeeD1@Rs~znQK>Y6hN<>BhC_M{91oR-y=naUJ_^ihCn#_ zP4W0-pI+2QQY`DNA63>1NL50GLfOX|n*34Rd z#BTlts`%XZ3w8tTH{Hk?9CeQwf;b))C2@#)J~xM4L4Rv169Uklt~*$iY)KT zNH!uu{}n{y8KEZ5 z9F#T^PR89eagsm?Y9ILt{1pFD{THvig7$&A@kZ;H8&Z$*3gEAG5*Jl*00_npQjQfO1iM@}OM!^E&mI#$^@ zCHjo1-Y@R)B~8!hcXP2_Foq0LimeiV6HK>;hU$6vJen*a9>j>#b-!E|_IgPzWrU@C6ajSx1hgv`EYDa3WG& zYGXDWmR)sK!4i|5wvzbR&{;@sw>#Y?X@x%`Pm+Eg2@uCqseo){wxZ&wXbA-4tB#6N zg~M$=dhF{Z{e7o{)dbk-`md$s+#&IGe1pg?BBDc(&j;<($mZx0ip@m#4B{s zX$a}!JeE3%%nGKqXDCZt(2~dr(i&R1szC0LJaU-w@Ltn|MSv=q&%@ZKSjTNRQ!SaC z=DG#der3ya_jN10X0QKjKi*ed=bpYr@mE)QgUg4G{%P`LZxwseIcd%$NBbr0>_FsM zHh1xMf6P}E@FjgWF4n*GEPC8vvDLISBFm=nKRc#P>i~+tke3pWAC?~`9gCNiq6{D4 z+xQ2F8~>2*6Zrj-L#+=z)Ou*iANKG6!|?X+_pz67==b~f@zW2t9A5JK{ri8v2J&f%&H}@`}N_2KT{pHBzhvB?yod zHJ#-GC_N}8(&Vr#OuOE5v@Q8zWLjGPX3ey8wz}Q5{vLl}H;MzXmyaI211s^+#|sNR ztUuaZXgPh0Wp~Tz4K=TRzbdKU$*wu@`g4bG(C_4WAhpw2myLEJKLb8;9t{hWSIANF zKUPYh@hnTlEvUwY;SRhzMr zw2|0u!b%c`?0~Cu3L`EEAqAQ0Z^iisF*YhP3Elvuq2=!eOBM0bq0UQK^9qPnTE)lcG~rr-B53M)u{T(Fh{y(t!m`BjfOxQTsl zMUN3R+{#0RTc<*zP(oZQI=|nkRQoAANYJY5(d9&s+Nh|NJ(?f*MKLt>G>$6g0bP*4 zcsfgB5+gf+(yt(Kj8%+LEJQvO$7}(OD0({)ZxSiyr3=<>+GH&iYLE|nvCE-2FLgOq zv9?v4E?v24ho#!BKW%vedVlis=4$tkJYKIy&ohT?lPt0Z*8Q#rs4%$gz#UF;*jzXA-i{ zKs)%7KsyLttkIJwpF*9SEl%QMU{Vi>foU8!pxgsq^dQ;-tqhAfi98V6@1a5w>eNB4 z7qm-38t=C_Yve{wy9m)PMUlpUEH!BoXvfmTRqY*OXLl%WkOH&|nNZfQoJyUB;{@UE zklXRRlC)4#o5f{n0y!yeY~v+FD2MCP3Xj9ZF17gLPh0h;+|}mKU%b-(Hhr?>#rjig z?y;Mg2?Vpr4yM;j@0P@w1B=+T9#5d+3a9xUxgxC$eN^$ah5%bpX!PsPu4Vt{gB9O& zxE(eS44NOD<)AQ4GYJ{)&{It=SSjRdnky9ZG}k6!PQkYn0FFTQ%ZiNwvb7o~gFHDL z@Q^M__4~-#)JV=1FK`yk1!0O$q^%{%nB5Yt{N`z=u2RQdpwtO@t( zriwXG=qQ3X&r3y8N6~X$EwZtj7=!nmDv-dBK8box;pTRfdC@9hd=eA@Mcf?4vN4^Z z(k2B^CwbNbW(VPYk}n=oP#ls3N~%kl3d=d2ax>E1nLD_-BIUl8Ego3HR`?qqtr+?k z{BM8g1NP^&`ZIo1*ODye%HTKeMaSnygO^n>2le)n%T``YGl{LXJW=Cv>pL*y`dd59 zHSQkKlRN=i>yn=cylAew=;AzzU2w=Po{R9zIkgVl+GDLF#^rNI+%?($9 zW>X+25uGO(ncte#XDpVK`&}-jAtvJ}T@{F%&e`+J>mD6(OuxSe*;_3lyH~$VKPaxc z?w5Pc*`vQt9&30!eW$(5QmhGzli@de8g24m#hX;N#1P|#02^u(CNV;5P_KeQ7c?Ib z7^*WBR8XxJP2<_1p24gb)hYscOgxGHM{j?Y`en`^Y@as92A zfAGo}`cPYXN7^zR=Ym#I)*o2FXpiP2!_`G3@*~oYB7E#{Q5zbPksm+OB9#5bKgNl4 zEvE%}?}A(4KY;KATT14w$^fYqnl@vM&0}L5n|VL7XP6`L&>5wTov;999EaPq1xoGILnfj7&1k4YFn(eM8f7s^r zNj66)9f(;Pr3%R;*C&EbNpgD4cH~!?&1ttIWU0II3TM({cPg^CBP}y4Y$sTkh^cu_ zz7^3>!c?FOpnP}86v_uNCMZ;!K~ztFe98KMyh|Ut=aY(myne^fGwx>h<##uG#5Eg# z(7kTs&Ud#zw{A{m=oya(*g4c|VLjyEGu%H#6;TO~Lp=%9kbolxf*PuD@Mqlf1q@EVrIE^e`Pk;O)}Ey)jrMPQ=2_E}j3z)s^7LPNm^ zV-2}eZNu_J#2febAXoGIqsHC0PPPdw6W||mrb*V~jpI@h&(bn-w90N&WSk<=*|4Pr zO~B&D1OI7xLZJbqz9P@{*aGPm{n3)V2q+>|02- zI3!q($Tjde7^7seMMy;rP#$_f0WD>9N+TJ>1Yb;PMBXN$7$6+~K*27$pg<{{ z&`XbS8$>4Mh}%l!3-v=o7>>sC!mm)1Ax}ESxkG_AV+jF{gl$HsWL`mLEdWX-ZMnI0 zSBX5W#)tT3d9OrnRIEb$xD?|b#~w6JitiZTF!)rE_sV+(2iEB*FvOX{V&S!N{T{5> zK*ty6P@+bigJNhIwTIUr=*$)yIL#VP1I-Y5La^BquHqVD09e(_N$PQ=tD~w$%A+;m zSnr_P>(ORmYyRNA{QOx~csjYYfvBVTBNcjZ?yyZQ{jt!-wVzRfb5UF-LSs#9)H{m?Hv=jYF`ncVI5sY*Xv*Ewxd zcQ|y;7OUmVV?&nNqG{$N#dH4B*()}k(J)sR*uj5U($iPt>1b+hph!BE zGuh{Yo=|<7esRY1L~mbxeSm&1-z6&#oxAbOzaAGXQ`zyE`_Ec)TYWrVi65gs5j5+T zzbE$tjq4`QCgR*sd>V$E1^76`Gn5@8g#=J8>0qRWM@V@H_o&UNwPw^7*ziE}1*$Uq2rT zO}=@~X_LFonYJudz52A?;2D>%yWH73r@vs%OmD<+NOMK)?Ra z=Xl#9`56ah?DAc7fZa;F(MTe1T&MqT2HS8pwrAiQ-^N!=^p(Gy<87UkpTXp_X6#b< zm)3jRx*~~-n{i;q4E=X~)K-b-PgA`>s+ba?_;>DMh46u8jgULo4wRPwk%ZB~zSpSo z!YgKQag*WYUaAq4STviU88@7y5TOsZ(XXBTqp8xPuUnxvBTq-C?Ftqpk z(^gNLwz?pFE0Argt!>K&j?IPC{*(CPu{Y_&G_;d+1w&?6jz+_TGa3quk*Ef&7sm*9 z=DV{Yl)1N%^1vXcS>~s&LA!M%+-_Hsi&gWFdj0nYe#W-_>;MbZOGAFh{vn?!1s*8{}eDfuvx~V1LaTx0znB;*1efx1S!eg=dYE(Td3INBNPYe z5??T_Sy0_JV@W37zhh}3HGBEgX6X@Y_kzBrtBgH5Pf={69R^ zznp1{&vUb-78k0Y_UG5#KGU*fsqAZ+e$kA13oGi&RfJ>;C*P3t47Atv`!%C`HY~i?h)iJO1;;H+i!$(8;_leq$qO9+V{yT16f4oNd)xytFdM|PPj9Ev@E_gqX15&s1F>zKo&&miiJ{1Ox^ zMtq1keGo`9K$foK$}R$pvZkEC3bK5lY9TD$eH0uIkru@g}i$BeO^=4jAt(d zfxy)XPn2uGm{A3jiVp);Lh(`zB5K47G8i54{D_a|=v*{&F=Gh0?=N_PAAz!)inSJqhsbC z)v91cKv)?mws`(Ug#xS!gKL=O2-6CnQW11rqwo=m+3_Msd8m=%t0nRs4WQN#O!D&z z=MmstVEB*h$Ya}hp;tN!ofwh?nmK$frExTIL4PEg>@o6KG>e@o4RKr&eFa(IFN5Sn zNL)3F*>RDIc!!Auu%I*U06Gg^R;Zek%ftO%5h4JH;sbH^RoNXN0F@#_^{Md$uowiW z1CY57Rc$ECK&wH}9l&28JXk_UsZs7dRdyOjl`+&H8la=BGPJ=vhHing$=WJ&H}NvY%otPZ5sfRf zbPOeG`=G=h9u7gE;i>z8Hlg+KQKP1|m)F$xQdtjl%7wKNeQ*$lwa>>#hk~K`Q#bU2uW-_XUKtxwGX5> zvR8%)PT=OqD;F3RCrC7+mKo)`xFuUAI(d^uU;p3Q>p*+myuA=G5I%OkX4t*dUVHE} z+KUQjBkhfkwwKxjs#1%O@GXN!Mw?2_Ci)t9<|6pSDF(J_G-nsM0vTj51)wK^zTjRm z$PoRCczCEN<0DPrUm1=ID(8(+BIBbUe()HjnUY5yNvB4}B0+GEzh|6y?=(7UoFm;0 ze>?|{+EPb|CPI6;d@Q#H0(N3+NM?p07I=!Kpw%FASc@TN_On~)Yh@okN^PNB*vCE? z*T@oEtnZ_iKK6l;DLb~My7TB!YU=;8y*#nkXm9*)X>X{S(s)N&G_Jh`)LrGR{qRvD z_}JDK(2>Re+qR;Ce;;k*618=BoX5A79pQ~N2oD~aKFS2(*Tn`;qCPd{6;{DFHnJRZ z=!Y@}yx>f%7*Gcg#e!fKBuG<;jj3n20)(n4s>FGK2SNZ98cu2C1)a#jg~bok1CWrx zm~4RBLqsg;j{-EpDT6c1snQs4CcGgq>7e{oa3}erF*i`^9SQ_UlulXV-QIjR!uRT+W(gMa8}=Y;d&p$6*=!XRVwKxwt;9_IiYQvGHjhnyN&lZk zifHla3;Y3xm3hQ1;AlLO^*N_vx4KQQ>;K;GLtFT~*CG z*B`RG~6whaY`|$;2D!Sajn9&Cm z3kOE^0^;lum8+bXNjaQ{11Bvn0e3=9OS$rU=*m4;Ub$ytPRmH~cil^;uN)(@C@#qZ zJrC92dCh+0L<52Yo=gvMgpG_uJu7qr?oad*U`$1~2}3N0S}8UWHn2hgJuZh_>F^w@ zMC9zt6uwB6FsX2?+pd2g#i-&iu?ebB;r1hPX!!ok6Yl@F-5eP+_{Ve5NA3=v4@>Ja z8LHV0-yKyK!HMk1C-02A_l@W~J#TEd?}qk3-aC*0+8b(SqVEdtyFz_864J-^9j52F zu6KwlzoO6CE#5lj=HJzSDz1D;pYy=bx$q$N~#B-mvP?Kd3QuvvWZ==}%oXFnNjg7lx~zP{nuVey~;8z=M% zB7%Vxk8Q^=6(+U=(XXJwXEX&7KLC{#s460~-#o_t3uk zJ`i7|;h<*);&~hLbI|at@Luv~rZB3sfXpWIAk{AiyCG?wa(Yn1LVi$B>OWj6?ipIo z9+5ns{D67%YuKJa>8YVf#8)H_k;4x9Ql{l%fmR7T9zrpbYOc`pG+f!DS)o0%j6EyZ z9Ek{q?18`p3`BM}BqXKExe+>6v<2ZIB@5FKC*ZhTh-aUZR$iAP@<#$k!R@75|L&n# zh*yT;Ti7kV>#yYk@YvT;ssNlHkuE54zVGGFT%d}h5ur~Yy%jBV^A@^cJQU4bQ5|WX z0a1ZDK@No637Q$=ujmLF1zg57DuC==-lQaQ^+JpWquen4{jJ;e+o)x;uiwfxT(2h& zk8R;w`UhKYL<2RPTz@@+GoIo)A?Y<{lMA$@XYwUL(c#(`Mq{X=_jsyU(wLEDn)u*d z;Eo3HXt@~|JcV?$7s>=GJoVI#!~aK#rGLyX;>7yob$&$YnuZl{L_#lj( za5rm2V2vNLV`&^iXL{Hs^%5!egf)=4IZWrxx|4Sg(guokX$%*@-UfxA=7I<+In^OW zmrm%@nJ4Mf$$EosQ+a=*{bL)Cv@^8=U7)0oqQe;m>(T-_u?yvaGTi%E*+;ri!Vq1? z`@kLih_@UwIG54ckzOF-YorfU^I#EV8ga_R+yGubf*f*2-L_Ab$*NHy5SI2)9vhsZ z;C)mC^zt7he5%v{s6gtgyED?M08A|y*#Hr2o)AC;tjh4q;PC;l!R$BzK!w6VAs+ESWr}<& zzgb3VV{GV3{;e`MlcD`L-rN19eBHDZaHaOPIk@w9% z(odryV*gr*bj2&pCjBbfm6u0-%I7?@ktbkap@d~Gf`=LrF*t&{(>YWOFNzKq+2IYD zVr5N|vdQ6Gs>0mt%oxwmY{+50nPX)A;L%2;eDWt51+d*F(af7p);M>P(h5l1wGx5w zZq)S}SQutU!VB^EVG7hmz^=Y|VOV#D7wVgbk4$o=*iL;*$~kEgGuZ+zX=^ad#7Q`; zZ(%z}4j;RN4uk9PSGGSZ;nRu19&UrjqljwBynrlpR+L!x@>CwLpD^7_#wcv$rFuWI z6sFq!!|L>C4Hd-C<&sp3dBj$ahXQz5O&lP9R}!^+$}* zV?2;ynZAf0BW23C+Av&D)A(HdAg(N%_5-DJ&n*>(<~(-mW3X2|f=B)b`4M=z1uvlU zS}BLX56b8S0pW^E1MsCxPdD?hXz#t}U-0t>u8&3^^O$|#@pXExxqI98jawA6>kF<{ z@1xRhoA12)!1)*4J1x#0RWhzST(Yv|f^FOH+M;y$U-p@mM@Mvhs-M&c&Nk{NK`g`P zOEG$3`y;ZIY$xM+=YDwfv9h5QEuqFhva~>Y9K%bPyK%YaiXeyZKIZ?a~q%BAJb9qtii(@i|&P+BB zf=)&-8LBn_gb3lhnnL-}{y;3z(8Ogc@KEem#ZnCvk&1}?5tSCUIK}5ep+|Oc0tv`a zv;qkeD##F~?Sp_TsN2LBDW7s^);5(_M&b-lwWdHfA|&?N5xPQm;+?WF_8LNrq;d$RK@I6ql2;|7#+%;q|Z~13P~sm52th_R^n$p6e(UCgIxQtSs_vQtEpsEI?{HVC1(VrLml~vWK#+dr_9^n}o zxd5d$eOiAC8%b21qBE%4gII48SG+UeyYc;@9IYf!gNH`@gJ-zZHA1UG!T{Khn+pVC zpe`X{sR)jI)N`kRE97!C zQc@v>!XcWzOfm?0V+WB%U(*5h&-3joMAqlbjabZ{5KL34Bo8? zEWG(0RXh*F(Sg}isD+HjJ`HA-E1 zvK;X5RKQ)NEPfz@PW|LYz92welFUS$o$-vy7<7U?!@WhFEq{)J6ahzK?8}S}aCKaV zQQD+BTa58^oLDWaX5-QJYB)=oCwR6!o>@wxTLxicAP2(dI8aGNxbS?0dOY>W?Ugw} z>QLQ@6NEq00?$YeRU*lkg2G0LGB#pv7|Vn&FvOK2tnx6Xa)DDs!i8xCC#9%xYSMg# z3>M=LcGdBZjz28FET0B+J}z9rquIEYq`D{~1r9^X;)V+wvdl2EXaX1+vG7(C_=9*( zO-6)PF<42DiPoY>v(kL^8K{%>p78eG*?h0nUV2}uYc2_b|8k_#lfbGhrjZxSGZ5NSvO z(L#bW6vQ$B*8dowfGsJ8Pf&o!35luWkDK3!JwP1!jDi{q|uroCv&}nP=91!E>Q) zNDA(l?V(}=%y0%tz=~u!EC(9e?=%BPoOz5eb{y_&$?IC(ey<_sn>dQ|oTQ^MwV1 z55kQu=DbS)9kLQI4`$MU$FjbgC(IwLH}b7RB_)T<7R;Nq_77c|x67J3?|FMTqp{?TJ??u-OilWBtqmEIF|osSGH z|EE=mr*V8PKAiPLT=tjtcO|}$88^mDy#2lf8tNtH_V2d;m-fA#_`Z!~s>DA>q{o_Q z&;|s|WOU-L4pS3Ur4&3ZOEs$gk>MEP<~X10NRx-UrapRFFbdDc>HoV~xRRKrpKb&K z%Jla*;Z|O}jFF=e*0ZcB&pK8fbb~LHZeVmlH+4)J;zp7b_6V{zzn=k?~-;&)el!J0!%I-UU|7jD*CF zr`(tto!U|Iqms+s2Jb%a&1rsLhVPV))g9XFcll2SmIn3(vx8m1zR>bePdFpIID9JN zjx3G55V;<$h#rq6$L7ZN#Lkx{m)4fHm7XulD_dFCTkb7iTz+A?fBM1ceKW!{PR#i8 z%z~MFXMR{Qzv5_RM&-83%doZ&^96xDCIue6DA=Z{O}++uXi+UDK*f8(Y1r zHnm`c_9kmHxVi=YF4w{zUYq5yUPAC&KKQ^4KwF7i4`%1Dur@-@L-}pcP5BMz3G`s> zY%{)|0SK*jY>m~5m8rI%^coxuUd&9b#R>xpaTb37TU}tyhwmH@Vk=O)5upkAYf)zr z%CCio`eu78ikd##mNM%hY<&spmE9NXUZj${u>M~QJa^SwY`3Eo7H+cl!9bf9+O2Rb zylv?^lx)K~+NS(Aw9={J#atyHtZzZfHUQI+gDnmO1<6K|AijUR;Ci zo7AxVKZJJxA$aa9wP$$U<|FSpuriljb!coP^=C za7QC0=p3GgGqz%V_J9N>Bw&7OZ&sXKhN}rK_ zBv9J<@cz)vf ziRUMtpLl-a`HANzo}YLD;suBoAYOoY0pbOS7a(4Mcmd)Ch!-SYka$7j1&J3VUXXY} z;suEpBwmnsA>xII7b0GWcp>72h!-MWhUYIyx;)ID4CQg_*Vd8{|6DCfC zI1$+xG2+FD7b9Mb zcroI|h!-PX%)wLgUdekU@73qjQ}SQQetO8zVPujD`GfID`O|4RNV`LA)_$DHFxW6p7et51*gKh-TyTl2b;7uKB? r*3W+&`;C+07ClD7NGtg|F8f5H!(3~86Y5F{~s0SKbSx7ABc;Hiv4KWKOFA| z1i(;0U~)?IOg~!J4;TJ{zFC=cu#t^{JrEGc4+X~fv6g!he=v+(oe6+|Krw$rsQ(28 zXqc(Jnaz*(qXYl_@iS3sqAxQuaQcY_Tl{~1KtPCQ)*hxm+9nW?%smiL1SZu?QG~gP zfiVz};_Qzf%MaLq!K|{)e?%Z4C9og<-_7H@-~JSD z;ml7TXj+FZ?f)#YkNdijzOlak4yYkC1fss7KG=Ykz!b<4BM=Z=IWQa$(0|uWEsV4K z`X>4YrUsn@0s;tOgqZ0J7!22e4?s)mgXFL6`5_=7{)zvZg8YI7T9RZ~1PZ}QNTy(5 z00DwEfL{K&2Oxo08dMN5)GSH+K*R_N1}~gh9kVdRVj(AnECji}gG!JDvmQ#dR62_; z28`R!zr>GB&HX-eU_#2qdYKgxT}?y%Wx$)3d8UsB>5#ISmT5Yv-9ANQ5q!bJ$X05Q&V-WBXr%h%L(^Hf}DXuSYAAwZ2iR0ABilT&V9spwLQj0E-lgH zE?t}Na6d-F;z*hxOECeB66Th?_a3|V4mQZ{C9|$=ROiZm$jp0S)O&2#HT&N#y-DN) zC@bf&<67tgtRfoE+X|H_{<0tQBe)B(iNt?X5C=p7^5VX(qtGd?t(&}=IEn)`qWegD9}=f-SeS$J6Ff<7e#JIZp94!XtybW9?=1upFx zGB6aUm+sN=mnwd>vK(7Z);A~2bpASIcHyPQf+CCj6d%^a|B?!LUFv2?Y;?W`u^v*^w7-fR>!zBqgzzQdq|dv&V>Ki4AsyevyiH`{;f4nXhfZ z9N7B))|JjA19)9~ZNKZ{#~!b9#CnT`+k=ohoFeZs1(`@5Y)_^}hx*~t!17o-k^&=O z-`Hy~!H7dng2f#llxL5P-?A}@`@PTjp%aO3TkrdgAk~hc4V&yS$sTHQ#!Q+&Ws6m2 zvP!e~iQVJO|Iz^HEEQW*3UIY!@#cE7sK_5?Ys;6EBde4oOr|C=Tx(hOR`llBfE*enVzK#>^b2(n7z#AJ06+pGUq4 z60d<@A7OpoJ4%_4H*7Z2Vzcuqba%Ma#^BJI-VKw>ZoTe-W1ub1K)H9y;?kAAM@rXb zZk+y_R!{SLE1dCV{ajRqA1xLV8#4I--l1nd1TTM)`Q2 z3SJ6dh(?{nriUFAK~^*Rs%BTR2*=Zn$tS-r7ll7w!tqMmn+Hus_i1?*dWc)3R$IVNH1tuEwg{F~y^|g@!v&)F-Yg3cf z;*c`^Df3oFX9asY$r8}Cd3c;#i4x_D=)KCaFnS-@d=V6Ki2a?=k|RsC_Bt*kImi$((qu~+)~BLFnTU~Zj4Z-!ZH%p zB*@gC6X*g@-uRg>z^z?t$rnHXdhA5n3R>#luBT)ISgK=fe@2pJ>U+iFwZ$MPb|>At z=ZauVCF;BCn#4GDA|fKav473?56MNV2N#_xKoodD1yJ-hW*^~(Jlbb7m{cGIcB z4^B#xKt9#%*Q@@1Ex8^*OXfGot;5JeId%e;-3>>dGT$TwD1>~Mkd4fD4|=DU-;7Y} zh7ptu?@cMy^}J=)Vy)PGUcB{qtZX*8xxYkc)n<^l9a(EE(9-4h?uh*L0;F<&u57vs zza}e9uy4A<&7Q5Yw~Ow5GCZMAL(rf<9`GpaF`~rDb0mChbboXou=GS zZ)@Fcxuw>nAH{yCxP3msa(~~1_+x2wN2g9%v{WvqE@flY5SO)AYO1N;8#g)2-m5laX$wvlo8b`qSpRta(mvX zm8U&akYB4NC=ZnR{LECMV-1tnf1G_}!k>}zEI_5Q}k+kVbC z8_p5E#VVH1t-BdVd~TA1-gwTi&d65Z7MvApiIBz39?pEhqSh1FE{?NTf=&hK4G9@WG>JSqY|95*{)U*AC@ zK{=d<$`~Qm_mcbo?bEpcqs2FJMQ2Edgbo!WFni=2#zlp40U9CMhKv&KJL zgm*j1MErI_#&pU& zpjrbWmTR`Y-x0)KRWN5tu}1!tcxD$1x}(hOgn>G1+6_d530KiI1NZwkzVv;tjQ*nA zDVVC??GX4zY`jyfb>~imUUtj-lAGR^&+k_k3Cg_-ian4=5DRSIF8MW0F2~}gW<_^z zb-&9HT6;9@Ki2zJ=+&K~vHsdrF{g~oZ4KenvE!+eNPv_%ks-(gAS!>xat$o5X-mn{ z`BETsHsJlXFEz0J;wlhfJwo&R_`wc1T041ERl==6?W8v8&0*R-*}duAcxY9X<`S$L zg!0x*#p|I;*TSkMoGW11_22mm5jf>k%Y^#xhj)BsiRa>~<}PUJw%-dPJNmz;!rNzp~ zZ2OGlcFu{(3W}t}*1zQ`mAgjNnasWY-Cjaewt`xJcX<68Z&6nwv-o57s}+#_SL%j) zJndH~JyIG~_1W((z%1|JSS^Eb=dV`yVl`-B?r;AD?fUL6+^>7=!b?dbxwPGufCot- zL|Lp~2scmp_KGXBHlek6AC69L^Xcadn{3ohiHP>~d2V3ANlcBl%*OL02hn|Rmm4c~ zt39~J1w&|YxG1ba7!O|#a7}$%{V7EpE1Lc5d2?AIB}6HdZpQD9`E)EQg2N&u19RY` z%vkCgiH=T346- zQJ%c^3U#oLe-I;25c6eGwM9l$6GIP&KrP8PgjDbPV3%a%Y&uVx5N8CqPc88Y@S+wB zK2K8SGXI1pTdn3HHzapNUkyV-zr}&>rL!dz636WQ244unj_y+fu z6ygu@`-1vSp0vz$Q;5Gjj$Km#Z9{PG?ikaJr1Yzwk&HbOTt+W7BoOpRlf^^fv1OIZ za)}`kB^3@zeT77GREy^|bGayf6DVEO0nh;1s2L}pX)(elALt%CB@2MJ?u zYAkh87*AGW*cDMR(Ba`YT4I8Lxni=ajl)94>Y@5aDPzdmrazmrq;|Q+E1~!A24tut zs;n|b$u_yPC$2zyA)C4FQX=FsA+M>T3|%dUpSa!{7BA_b^x-8VMz)2ujeGC?YZUj> zl97x2 z&85tzDY_CkICVX^;_U1?L#n+N`E2Y4iV|!*Dr%yUe6vh6D$SNzkRKxi&bjdFkkv^UV_8%LnP(co$` z6XLYMX$=T;LkLo}){;p}LNLSHH3fAQWSB8fx{{{zc|){S$|cBD1NPY}(yJG+a~pD! zUWupf6fr&pZbfZ*&5#Fo?@USbn1EVdk1?j<^^fCYB)4&O^b|iniT_2w&vU7EqL#RL z7tH&n>+1p1UAJrjE!~x92BJO2CAa3Uxe{m;5t;t}+vrOJ79()aW}Nq_=%0^<(g!Ph zu#5$9##;^~l%gR8UUSb>)J%P%(Zl`Qg9&1BSKK`6M<-0WWXTuCyug@y$4gd(x^7LT zF#+y;?A=z-%;4ywAL|5+WSSeEJj)s(& zqByXz-u#n!6o&h8t@>%a5iPcPh24+Mfzb9i=U?(%Aa&~_b@{ zLw6NQ;fEEcBuMF7q5BDE!c0+3a%5<02t{8HO7>r}j&k5_t+ni|PF5Vwtb;ETShPU) zp%mFbtqUp*48Cxn+33NO1fE@%Kw)b%X{h+M?@Y0LyHmR02$04xAeV6WCnB+4F$u-6 zxBx}vRDBgU#O6|pORhpcw5Gxt9Z!0!_G9Wgf7PMy1D(>}Hoz{>O_fPEQ_W?UN9nnv z3hp}E$(^axlN_ZCquxsmb>PSC^icPku}*c?>^s2RVYYXePV&mE7)Jl}n^7T+waX{Q zu6)5>z{mBQ{e6)|UxKa@*MiMoHT5GR6p;)@&VQXqnAvjol@f@H$c^~5W-1}tN(c^0T5j#1ib4}Nao7ir4cU?+ArjvV-jB}{JL$mVc&Y`zL zE6ZTYk|DD2j&PQte$w8&ck zMTAvh)4f77uqndPBhb7FlT?!2T?~JS4bX~jS93?o!^if{-Uruul!DZM7kNb)b;2=W zyAZ{%QN`*6pK{hP7>4O9PlOV{X9AbF%!W+n90B=f-QC@>;VV20*%}%Yh^l{D> z7AS3J^@31qz?>~@taRy+(pddnZV6hO7*z>h;?cLhCYzrC_-$D_Pm&R^M%m7z3*5c| zagLkfa+glZ{D;V(F#5XeH9bg;hsjBXKyZ#VA-(CkK2Wjs{(0!-J;(WeQ+(U~Jw|+{ zX7!KPAGWuVI{a-iJj7(xd6&VNy0*Pz_7ljpe=0ZNFaK1E>JstyLpJXF+E*S^M%{kl{OW#RIh#P316`{h9+sJGS+m4R5v6V2f z!W7#Fngn2eyb3_v!cqb0xbK&suymc~|1_VfK3_NT-rs6`(*Aka`F!-y<`RFfe*zHM zC5+TgDB)Lpu|I|J$lNvcoq0?#ans~XqFG``lGw&2f<+ z;M&s$97~n+7@chqDve528fiA|iV1E+GEj{$P>1~>1T2Xyp)ihX4iPr`w zCj?}H0+}VRlQy<{=zr55sv-|?bg>xmVUk=~ws)HWPekjNW}j(~L?=5IdU4`KnMidZ z#SRHl&VXc+jz-jD)TDZ16wNrH{iY)o#{4W=O7u?{N4$?;o9h}^Y3BL)uduKxTNd1+ zb80wbd2B8=I+|ws%XLc!tyTfFo#97hji4+&PWp06MGGo54X~uHI{YdKp_r5nj4}<@ zH@Tzw61cWj_Jf69)3LS6i`bo3tcIqzxScL;vDBuEYJ`}zLvfv9#P$y88Q7W4_DFu= zRp87OPm`v@7Y*Y=i3QUIff5B)8Q>`oTci%c_*+B(RM<9Ii!Pvzj9PF*6gKxnMm$_- zTa=0Zd!K@*GhJo+9@r2y{OZ@&@;i(htZlLRY!EPgTJkJEJjh z&z)H}7(}xTJowuCXp%iH=6&(en7Pq^qOcW993z>SG#M~&r0iu=5+HnJBCuvSS!fx> zMVL;hn#^jR^&d6T`>Bb*SQ7qF+715oIRA?wlT1-Y69l4}k68Tx`P3aI|fuQW_$ z5wBt-N13b|4wp`)hEqw9Qz4o>e=f@R0%!?k5Sb(?exWR4X@Ie3Je-*+zU^5Hw14VXDe6)KZh0IN?SSFsP7cdy zfG|ep3g&)ykF}m1Q)uM2K<5n`l~|{US#5o3(R`1m>bm6yxTc~*F%y#_BYYh`p01of zmpdBOpVCtBSJ_pCF3?MTm_b%zl0Xc&JV}>s9^8%NKC;;UD2F`WvXCm1f1!yv=C^+; zno9$Y`V(_x3aNetAp^*jEI`h+aiZ}d9gz1Fcs(2?-|ef8ogLpT)y#6eX_t@Sv18ug z%udqYvuto>$=8%+^;lO{RvydPJ5~TW(p)?iVLI;T}1E-ZOZJ|MyFSvZMki|;U}ANC}IMPEp6m19kdod+EI6_o_|4*@;P z=y#Jf+p0y3Rd7&S8|{a;DJgX}ZMSdC_+K9lQO{TZ2oBeS158Kebl2SPD%jELw0b;=vyui(l#gQ<#R6s#X~Tga#kv$&mK2c?rvl3m#u5B0 z;rk`QisV$NChJ&ujV!c`S+K`eUQepk`}Eu9n2Z#9S?GzgSsIsw!REK^BFm83Hs<`! za9N(5KK>qC@ewlLe7n|e4qY@c+1>048G**OD#W@0k81g2Cn^gt0nlq?(kbho!pids zF3JRP{1AgUe18vF1lGN-Wgb-Tc~fc#l&1b#G_|rYyoJiDju7}lo%#s;o#vD%J}qhh zDOQ*?MpdsV2%)4bpGv3W`T2Om)eyyBPkpX9Kc`+&ZbzqTI2Wx3;c^{89^3O8Y)?m5 zSCDLY6vvlEi{3b3`LDWI$oVn??>*F=eT;AD86JL-wlA$taiIxG2e$9h_(T)l$CE@j zf8kQ)ZkgC-TML;n{;0k(FkoOI2uy#!T*>prf zj=Fa9F`8*WZd4wBE3o|DZCRo25Qb$$u|4yqABtQDgzwT<0x7Kk{AteD8-wU2_8ii> zSEluo#j`zEjQ%-rB2XG8rbU_0_1rE%CAaDNHTWLI0C&3V)Nn z%nDCzmb!x(6BEjW0osV7=uwpsp(xdgQG{$HocC3(bvs=0Z^A{&$Zh!_Ofd8-ke%14 zQMSj{GVZrqcgAQ;*Sz4gj|!v1g}CM0meB+vCq4rd1tys+HUDj@Jw8s4*-P~cUc<~ht#x4u+k6MOYNHoU-nEi?I;O2lVXKKu@ zCBTe?q?9t!&(m#^k$B>`hK%EnHHDkT$v)B^QaD zBd1E~Rf+X`K<8R`Ie3(glD6t0lyT4Ubn38JCi=tJ^v0vy4N)}-YgLv})Q+hw*|d_~ zb7Gm1ZU~_&tp@w;E3KwBS>9P9-3C78jNnJUwGDDzJeKGl66#S4V#2;?%1-nA$Up}u zNZ)aSSD6D>g#FZK6Quw`9RJKDO5?GuYy&bjNfQ@b5lO1{crPOZ0LVg7Z^sneWTFr{ zh97eU`tIj+-RfVqi;bWqySx_tZX*HIs@7M?@SQ<|&kERGz0WaO_(X$mSqJrBC_Jqo zCr`sh_>q9UsB8?Dhl1Y_gb-e^AvuSB`6$anfhsaE@zZof)r7$+dmmGwSK!iA*krnu zf6IoIkv$?ZF-GWh@9(YZ-q%>8Fur~KdP!Zcu+&_qeNO|T*m!UH3Uog3TR-ngFYCTm zKGi-}HrtO@ODCUbK0oL@kAO{QR*bA*THSdXj!Y6*^@NQ9gW;8hW-_$_;RVp3Vvka~ z2ozG7f>~_7sYymCgQk=G^G)M(OpRYl!~>fCr;XVZA6fn5uL3jsKsE)4Y=vUN77mZb*9VX_mm~Jx zr?NPKVW$s;|b!uazlLgBtD8 zlpqN>GqfUL4t+{4eVWSP#TylA8woh<5r1I=7Hrl$ZOaHk!9SQ}szNl2gcI*Xf87g@ zJi%;HR4f7umEP*wZAsh&Sk-lxu3Erdx412qN8llcPrJ%p6I0@4%|R2M1G!IAmJa$5ty#AKEENSz zdS-%-8OSF->^en~b%L%~W=&H*QAK~Pm7T7JuM^{g zoVV-O0o*sq=f9iQsY%6-ux$<4e{U4dkuI>AspoI;=7VYWObbQ1NYgOL3KAw*@Q*;( zRMO+RwD+u8&IC}^iKj^5@l6xM5SWjcs87Jb1G3)m9s^Z-%D!R#QGZwzU!uAGY*w>= z?ogwhiTIdI9g}Q=usi{!Xt2y?7G3d)Y59v|NgwDZz=HVw0j^|tJgB!V!qzA~Jd+;p z^=r!Os-dqqW?eSnm3nIk{Br0-Y5e=~K<9{SRf`u{xoz?x+l)Oo6+p?p0NRZGHfk%? zHWPD7`A?G;@~B?|>%rNe2loAO=C=DK%R5mn_FF25-WJP|P(BSEu%nVpPpz%c7E+r= zi=&pFJjKS@Uc=pA!wKW*cZT~RkM8_s+a z^9z=RbLu(vOIxe<=L zSTlc8OnpdOd+eu>Hmz>R@}Ge}Fd`|a91?722;U+2%46kE$lcBlCisL!q-5t{u^4$s zc?CV2?JWEK3d4@9!R!32`-Jk7?yF%~2#bCN`jIq8+3j;wtqX7&cU@jf8hY*W7yIMfYA z$dAG?-^qh80ODo-A)*)yK&&aM8Zb&SdXI6O{g@#nflF3&s6|A925P07+O*{%%7mmP zBrZ&dR=Qj5_e-5ufzLtQWqtFy{Givr$O<5mc#z24K>y@2rsM20aF+FfWs{bW2{%T# zk6#`CnZ4qUy(8RzJ-cG(Ot>q(jTf9$c2O=8=Pj2~R(-685 z+swB8Dns7{j;m$b_7tw~H+kmVNK3*<1=&9=dGJ-wV^FYcvLWxX455)|9NXzuXa}Bc zu9q(l;f=4eT0?SIymP-o`$DjJ9r3ckK+1iZ>=Lb&Hz3zR31B)H$$W^-y^^dVZv zOdsn1P^>O2ej$hTJf`}_j2%jdlQ(l8c*C>Yc*{cHQxWVCBqGn0Nm4;pa^PH258ZRF zh6LGDm319lsMlLKl-Ny@J;(W?x*G@|!sfx|UG`dA9De=7R|Ywzuchf;{C09|V`?*y z>DR4rSKI2!cl`QyGD*+QYyY_?{lWh_9$lxJYOUz^LHu2cLY?H)%~O9zlby_rVKJ6b zCCSI~!Jrm-lvG~AZ?K9!jKyXTjC^`-4C z{`zFpLtD-ZN*(HvTTtnI0QP}DHD&m~JUT^AFB4l#`n3p4GPg8M@H#~(c?rPXm=p$#QkDyEC8`tR5ZS3W`kEsCb-AZ&LKi507377`=?c(iv(c(@{ z*={h>GJOK7LzscCYkwPmplW*l%U1j_RV}Z*PbB*nY>&&A8TMfeQV-?IeFIKLVq@uk z1=ttQO=8iR42ehD*PG1srf4GjX_g%kaWiNjR$L$5hi-IKlv{+`-1dIoY|MoId4pa= z0;+EDcjQHPMDf+UpGy*i_yd6ZLGRY%k;I zbq&MKjpLZ8Mv>k-r8++diJR@%yf6gcf-hJ*iUU#$cYGhLgEoWcTFKg=tp3LVs-*o1 z%H$(n&R@}m2Y6HFyiL@?^p_J1U^mZC{zEOEca7>pI@6R2nJA$8aEZpD`rX|qroXNC ziXD+5Z>gFRmrw@Z5HgLGpo~CXpy(*mZoQ|tk|Tq^29KX8uEm8b2&J=+>8TCT-4(*y zx5B=_*{;6|`jH&&g@V_@L=A5M^LUBx&}}`| zmV0XR)=oyhNchChLmT#AeK=>?7#^D!rQ0RPG3L`Z*sUqtJ;KtD_7(H$X45c7zyg(- zM)np9A2QcSD3}*AU}xU%aP9m`t;WshdOglv%IX|)&t(DB@fon}wp=w^5_Qq$HC9I))GD^pup**?oL*`__Bjx7+O~0h8e^>5hwml`VauX!)c!zqNrbn5*JSH`}_Yszdo8tkZ$2 z^CyF$_lVKoUXtY=OA;$s^nl>VX*fj2!#56?f;@HyQrjC%TR4f~uP2%t3Wm)XxxxDn zpqk#^kL@zqM>D)HuDzu!6BfE1V+hTz+w>*Z$2UY!2vyZ)bFxdMV*jljXgLis+nuP= zMC=yaY(6ViJ)svxb@KcRS7OzOFn?e}0CYP4TQCNY>Xh+V@06U_^mc47I)0JLRsV%! zd1Py@08TTPq}Rii)Qe<2+upCm*hX>EPR;_*?j1R_@iZ%aA}&bCO_>LU3Fy(#LJ*-s zm^|Y|aU!xbw;qOB_+qFr1>wDbkhhlJ4?1Be6d*V=nhu7d6GSnlvK7M^2%}RZp(|C- zQfzB6RPr_ZOF|0^8r=`1sM)sL9rVzu)oQO=|B~ga*UDV+Ss!2d=l*yGr$eqONyt*g zzghGdm&*6OoC{0;hvwe>_0cA^#f3btn<7cW`Dy%oodMQ)ujlZhfZ5Eo!uOLnJcBqhg1+SwMOQJ}eJr#0+r zpWhcinS&0^2gk zpZ{nT;7hw&*ZgD^;R{%w>DF&v(+SYGBGP#mKT_X`ALQKC=c)lfBgfADUMO`Ui3Ou; zOQ>cAnIU7j1g)hYF+g<3L3D`TA%}+}>nZQO8y-3vt!ra2S^JE_K+d`<6#87-f_e&~5X{OUId-F~QzotWr^E%MVlxyRm_06>-uPs@DrLoq- zMaljl!Yg~++OfqC-fuA4>-{Qs-^Qx((U$AjdmVeXiU4P8PbuH7jS-Spa_cuGkcN=- zZ)I~)TcXz&6B+0r;<@5z+vn+rSle&8J0cGSKM+v9`(ygZ@Pu;4ySW0Q@0p@4QB;#v z%Hn_ILIsYkxTdURF+}Wc#!X-;jeHlON>6ha5_#L38nQ2Ej};}dJI;C_rCt=#Y#E%t zvU_R#D0;J(rAx}o>jn|n0K#zL){t}}tNZ6Wej z1*f*}ncM222pI}eO=i?yy7}97OZ|a2j?|O}0fO1TZ+3Ld%ZTl*Y}2$SKJF=MQfPwi zPx@v_a3ubF+(_=r^EpOna*^~|#d-bShm6*g96e@BUV-HGsLTS$;3ENN~8BSo;0T~Ok`mp1uB1D_E02&5KoEBY(*3Y>NvXQ^O z@{t%|P!wl_Bg*vXwC=bNh=-4=fAq_KA1W!n4heWgS%WiUKYdml9{U_}>v7t7OxO)A z|0#~r)8lmXIC$`1IG&wTtQyx$?TbS5UG+L?-DDr0 zfwIeACMiFmfc=immSOvHeZU{P+Aiq4aQomXeiXWLxg8}^tBYb!3i~bx6ZLxVI_+hQMr5)fJ9na*a!znXVCPf0FDNud!nAE zN0?K5E`Cs|hv$>zeVcaRxp`fE11XX81-YIIWwp+B?nfX~J`Eaei`htSFx3EL!x_4d zHfEtC;FXqYtkI9@jZ`&8Mv)~TYB@Y5`bW*$bPiTNRmzgte^Ex9R0HTAa1N+X-pMN} zjyHJ$H5D%58`kI{8hzAAB4um;DHIet8Jx^r1_#!=Z(r8HRjRzW1V5CWMy6QNG-fyN zybWURT_P;@>;^Y6I`@+>%cY#PS7?bXu`574o=WGMQLaK zOH%U9gqmDe;l*SDF~F>wEH3(b3P>%3tI_q1BR6o@?Cl&wzBrBV$L0+A&Y@qbiEUAg zL)TexTe)+tA*gZGe_Zr>$E?asU=5L2fafhKM*7Uo{fJb~+4B|N} zyeC|4G`Fnyk|u=UCMZPiCY7Rm7)Sl@;$L^?I{?jZz4u%0@sj_Fn0`La=ixzEr&r^4 z^z;3@ZI4|C;jc@(dR0KUgN6FNIZgW|;>h@4is2QAi=!Gf3dC!mehN(W6`C~@n$h9$ zAYGyvGEUJ*Dj}W_;K{vNms;Y}q4$D<COQ*RYN#L#iH^g| zux~?8N#m-^Ji3M2ilhyo&YM4d_L@Kq-}|wBTf1&s!MYk$OEt)eS4<82poS?e9Mmw+>;jV(>`Y7z_7 z4ctYq2HC+!;Wq z9*(RzQT0b?aFOmX!=GSRzu~vaYMMwTxdCHOMC*rmni$){lU&ELQC{rQ<(H)zO4=HFbu; zEn@OTcpXi1#h2!gah&uX^{z?~N+qio_VH0Ts%x$hgPt&wc@3wDN$i*Lnb~hj^ZWVF zVoPGz6ojRTY>Y|MV5kz+No2{yTp{^I26B~!Y!yl=0Eo-|j+_f5P4MKh+X`aOv zpc+L@A!v5th`J0=Y)OM(1DS4Cju$+)oDQ@YN2ZQJ65M{g+^EYZ8R~KcfQeKyMMj23 zd<%AwG=ys2d>I7I4)sf5CV0g4^8qoWb^T_R=;(#O!=M(^zd7@Ci&9B6P3Ri?Z_)#Q zs!=6f6xMIMeJqm`Kqh_Q40>|glacrSD#IVTHW84M&{!tngu(|#n#l598G1&izOs(mP`di_aa|MmI`3xPZsMvj1qP)NX(bF<)7}X8tn3F?g&E02cQ^!@ zZqA@-DaM(HS?#UftR?VRHv{%?wC@Y)pm@3#)|2LjP}}tR{3I0*J#q{HvLG_(!Mm3w zy-Nov8LKFslZ;+{C}yz69J2K1%U0%FB9K<7#@LV$JidGqUq}7SKqH>4bs)pZ@+qtF z=*Q5HH){-EgxIp)Te;_7x@Py(#7i5~6f2Zw&nf)gGsga_ch*?jy<%g=f@~eEJR9&N ztd`^u_QkbIm7=*BXpg?j8=2b>09Ltyo73%?=$C*sR?!#nTYHughVx6RLiXROa2yMM6Z^tQJ;mgK5KPkYjG zJy2%I8q~c1F6_^^^~WAp+%U6p_#fK0_!R$2(Ix4-ZBOdy7VrlCQf}cJ=G0HgP+5@6 zR&H3n8|OHC7%cpkxDX1j-kxWA>`;BzX?*t(x8%Dr0On0Zl_4m|l-+#1vcflyh(}C0 zn>yD0R`N#pm2BnLeO%4^*4Z3hb{w20k?7o|y&{(flCE992dLIC%%uV`Dqn8IprLUo zIOyk-ww>Ci(&A{(Qzn;C6c`xTeEa)om;;Uovkea;TzHdm zBNJS7)|_?mMAIzLan5F1`-WwFAh3&~SZ73kXV$=^@p;9se_;%}QAS0cl{}-n4DN-u z%eyA$wcVFbGyMLsKvD1DUe&bR&Tk=F6(_tE(yqNblhZhS4&xng?)@@%IE^9qxt>dx zS=Sq)S&r?KYIfbOT&TQac?XY@8qSba20c5>1D$6sh{;mkz@{W0qv(BNvmlJo>uF?d zIw#b9E(Y@;nH<@azhFa*f%o@An&Qu-cay`Yl}3_5k0_slQg+1Pv%kUh(EoMW53=xw zH2ATyVi^q`-Dh>3`wV^(DrweJI>aSlPH(IuTcF`!Wf>J%<3$$hXrxI*UlQ5DfT_fd zS~_BGWJb5Jg$)u%LeJ?ZeDD=bF7BxUQlDO|vzF!+>osCdmt^BM*06BcIKy!Ntp)B7 z3Lzi`=j$ib*p8E;>~B6%?n|)^wXkGiKvd(+Av2l`6na&tSy&>+;6=ss@@#T#8j>X* zG$8-8jH&VtZOsDHo5zI-&K#s8CM5eQ?%1HC(3%(aPHrHkY~%D>Dk({cnqgi030g*c z*aYj_W6+5(V@8q}Dy9BX)3uV4M9H9U@lqzFTTh7(4rcmNA0M^}DiR31@-5|~doz#? zVNN2F_wse@UG#QJ<98nuzi;cb8a-H;mEAXVa_f9_-22YDy?MCxbbq!lV3>;Kxwg|C zn$HY228id?9tJY|ZBoH|!9J)e++drZcVVe$!zNRmr7>5vp^{ay93}B9pPk}g8)!@` zMbXBgW4j6sam;=f3I*vqQLgJ-781I3+0^qOoU^Ht>r{CAZMMBHJ7>KGoqX&gppJTR z=EM1`XjY3=p^KT|CT7qAQaF?V>Z6C_KyMKw7$L23bV#;y_!Z%kk?K=5_&Dd!imkM> zY;yKyN_B7rD%AxzmM~wKstt{iGsa?0c=Lu$lljb{U|>sNefcq+`_+(y=t094jF_&t z2aW1)!znoEnO_1rfl@|ci+>y7&nk*)&DWt@WVz>AXLT*`1-3yDW50?<7_cnx^@9hH zWi_3qW$F(Z(a*r)3UXtPrwxp8iBD;UBG;gTkMIlBki80^z<*^+v8!BF>KCW@-1Jsn zsxU-r_G9265!(Q0$EBanR4TYh@!cf*@Cm2lF^FQJ?M z{neKDL~sH~-Jk%h%QCnvYh6~GOMv>TbgLHQHM<(B#S~X90*{7Pt=Ctv;J2WwJ)@z| zu)A3DF0NB3HxCne7?}k~ozow88pf*; zrh8(q`VBU%jmFtEwdqVCtocd*QYS*If&*!d zT7fuAN^>DA_)PAiMZ7E~acS0)nzrmW1Qje~jwPf@bbwEbO1yFa0&UHX{kG9!iix*l zA23@`!Un^*Q@y+kmbGo0=>wm4$NsLg0pD))aZ?Kp4&a0-qt$T4llfrTNTR(9>DNKj zCJ*ogt$k{W{Ihd`$YNL!SK2JGj{S{P&yb*vj#1JB(vN8cQ#67M>|6C%l~$iXf>Wy# z2yh>$zw$3!6S~1J*BvoJ_AaC3Anq~Qy~vp3ysTi$*u;9~&XRr1T(~!UW3vEmA30aZ zN|aSQKdJM=z>sCd&Sut3@}=kOb~9Jf6X3OqlH|HPDR1&;pUR@_oYrgC2b3yppr7J! zJ|IxP9kX6OY9=R0?*sGqu5#x;)7F*8pxGkYknHF@{Cndp^ap!O8 z9-b0rm2<}@=-BWFrvM`sD_sq8Oz2Zyy};iGb-|m8b}#UkY7Gp;6@%RSE;nU!G__v4 z$3Zsi)%vZX_g0rEeI9KmSDiYCo2su2(Z}NK4bCJm`;KDQ-FK(3qm%&HNx~hxV(Nfw2g0GVm%69bgS`@YC;GqFxI}(-%f9O8C-vd>%2~< zD=aerp^Verr#yunp}J2x)|9!cw-tu%$M{>rIex-?rZ^oG+e_I79; z<_-0?Q);J|sR13*OnRqMsUFux&UDxwhD&Zh+L>Saps`oUGCd-9X)wcgj+i>=VuP#F zM*mnxSKmorPnL?_Y%G@Yrm=Zv8W}r9u2@hUuV(>4qjGGAiFWvef?Lh+UMBZ1VL9J+ zj;IjjNb_o6Kl97k+4aI3TGA}|umz376QcNazg+~JPqbXj%vt^|{#-beF?}OO)FrTe zu?l0m0{SZCJT;-i0RL>VjJz+9CM~PYQ)g!m36xLsrEm8eGvkdJc;sd@*BseTT5{i^ z$L~diuf4Kt0mW?Wi|cKFc*ee*zO6xv9ITp{Wmb68$s8i7-D&vvf&VGxEQ8|k)isW5 zad&rHtgyH)?ykk%DN@|s3Y6j$r)9AgD5bc&yR#H6zPRn>{Lh)W=kvXpNuIounKv`} zkVz(ae$VgW-|LOmhKTK@J9AU4(wUw~P0}{nGAV9SuB zSg0l2S?J@X7N@E&DPB82UkVAE(DHiUArTACiaj5|P@;8EK$Eu-H}T8iCFH2#wAF?_ z?tPTfoL;y7y$I)7$F$TdTc64#+zo%0v5EW1Gq;8ej#znhA9bs5Tk3440~@;aqMI*I zA)nP9F^_$QsW$ACD2<;gSr+S<%XjxhhLwl$hOX*(@Q)uK%1cBDA>JghuluOnR_*i2^e}<*Hw(EQ9Y4!T`f_GfZK^;FuUj%cZ~!>^QnB3b zi{)A9Yw|Cl3kz};?#!pcYsNU5g0rZJ#=fM)Z0g+C^)WT~ujl3i#a+d=&k{gcKK6}z zJRR=fdM>OCQ<@1&qQD|1$G56ZOJVoS{e#cuiAF>3-GiPgXe5MRU3L%~_ut(PLLb!F zVcnz5@{UDBk_z!bbj>b+)egS-;urcn94jMLC{D*7s{n1AG zI9+-5=1Q5|8oENB;n*n})|C+zBXI}M7YuKCUWXqW3?fOs)h=vn?QtU%_22vLogY+H z+V?9XFN>QJkl2m7R~A*RljU~4=M4H44yd#L*;rvoewo(BAV&eVsUa8gny3K-lxR-PjwR@yHk{%K!rM;-Bnt!fN9f3ju)Z!`zIkNdj=OA>Mj5T_jm5N3 zE-;JcF?LG*&@iRkqfO9E>leO4K4f?M%Pb*207r~9ul_ek97}_LxSrmFsV;s&%E{L# z!_y(9qM`I7eN8Lyr$4tyTOyLl6)l}Zse#z2F*(&h zjNGRYq+DT#V9TV{-b*BvbYxL1txm=*r;-c4w0!QP1J?@rd7)2m__RB^a7J6UWawKS z(=7(9J#i3t$T6ldn7LxtwtiZl0iF>QW{9az7KZ}nV-@_pl}{rsRv(q3QyS9_$YIBt zlOiV^RP;I(79>T!L)_5?wqmJxvf^-8U&K+g*yyy|J67zS!pmq@u&z=yy3!G4Ie{{G zO+1PQneq;HOc@{i8F9vG`mj~?6U2iTuzcH>CodvC`o?-#e5#f%^KRK&`4Wdtx|KG) z^37A|k}rvjVpb$FG7CEn%{{U>5+}CGgC;gouGo)(*;eS}>&ZYfwIL&jroYr^I<{$2 zR$);6B9j%HI3`lnC>yes6Bp^uhmDRQZat;TfZcfFaj^!XOd#}sDm9H)VcZ?fb+v|{ zkmJ<%7DNJHuizTEe$!qmh#g6vk5s`2ur=qD6}SWw^LIot+Ig6$u^J;YRGWV#$iIQF z?(|YN%byYftV|GR5L3jdoA{)*zxbUS!<(~2FNUYeu$vs@T6!|H5pS||<>^GBWDjoD z0BD`D{8MpG4O12L-8Xp6f2@i%F&a~GMD0}&TWQo%^vVn;kNOy11B)ed!#6fgb#C&A#5*poy>lc~-zB2G<8& zwWCYv4|xUC$UGbbf?vMlX|MbK8S+0q3&nDGq1-swd^M3o*|u5Zs)haZ|AQ8J^Q^!u zYl0+~1%s)tR)y6s41S;o|2fASK#D^vaYHd=(;#natOX2Vd0CJ0`aE0ohvoSQ zH5c=fWf)0iD$hlIvv+m)4o2tvNlic}cF((Y=~K15v(E0*GKAI>>7jR}aHVjrWkG=9 z@pa;bTp>ypVh|QVnwm1De`c;v2f>=jCDBz3BeeM4bnZZ3p03?EX?8FghL7Sz%tH3= z$DLxp&u)vic_+RS2LgFd0LjiVD09ZLE%Ce8=kc5|73$!4gNEF=#7zX2T*yt9|8OBk8{ZV~r8n6v=n=-$ zrKMUmFkEX|+OfFeN*~5r=M4V{u=ZNg0`4RYZglI#VUW`1Lrs$OH}RPYLt_UJNQo#e zUt~=={JgN#Sd*N~lf+pIz;WoS?s;&kr=r*% znNe_*sVfQcP;eY^l>u0Ir8y9t`0e|fuD>0|HgmE`++g4HFZ)XZgF0UrDPFvZ-`)0$ z@SFdJ6bz2poIJOlggkGvU2{|}IJ@N@$O?-k>v4iFQC2}=^JJt@#d(_dHxUla!uf7E z)%v=5TWGw>Z-1-orI^I_F6Jsw*5NC(TTK!f90Nn>QYbXuP1F9Ex;;b?=P~=c%(K`k zFcmAz-l#c=)C!->(mHKR2 zv#7MR$(ZIca?5@6Q*VWB`g&(EI~01{a&yWp?tkPTJe#2TqV=_xrd@D*L#V60q0)}Z zubG^}a8_w*!^NnrUDcgu=j0PxOXMMNdr$mn_|*V@3UPOBx%ay+x@0+9AdvuwaERUn zaraRKH@@(WePSQze*>OuNwqpH{du!p6PdwlfXPP3Zhh^*07rr2wl+p1>;>z79M&MO zg4OM}wO$;!-*v)pgo{^yU`?V^#4-d^3X3gw!V{*le?`_K9*|!4J}#p8DJ8o15f_?oMOeZ}YI%l0E8*E3 zWYSNcYS^8(X5car(o-WcSuO4}0NB|trwbXi|amBv>VA2*;3AZr}OUXeHn?@4u+Q!MJ+EtR3jdy0JL1bT+yzsn*COOXM+PDWWg3dxhwzl#8-bq~l5%EHH)S&q+t=|c=`^Nl{@BzA z&Sg`YoN5jTAuoGw4U4c>nMa z=DmWx_r`anr^pW_B6z3R7W$I2431~}AC37PTG3;cIG%nwUSUJsaN1?8KUj+&<(vsc ze&8}^f3%yU){37Xm`@m;k@%q^X!*`QX*Bz*om+$Uz6B0Js@KWakz+OTzXl)Atpq3h z-TiMe7p>l!JZexxOo77mG1uL&j?Pfs&%vofGGkq(+EAUd%_q|7l@d}VY`2iAI{~cJrZl@d zs7dWr*~n=J>q#<|0O1R&1EK*s6eXAhCPS<4Z#?`FFuJQS;y@YX2?sI4;NQz zYf|Bve}I|6X1nX-2NRpp9cYT%EkneuhKz zQ1+$=mfY~I>v85@o46}^-TuV&BI#9)#EWd%_xSzN+}pv!^LYj=!BJ@{l*&sgc`^Z^ z2UsVJy`qOPyoPHx4>z+kFc(kX&&&DZ2jf6RW{wpG`2N*7mj;{bB2h1M7r#Nta-_a0 zQk~Q5$1^>vdNNJ+iY|2V6XnJlE~loX@pohQSV{dW!+jHNT1F8F3In`ta=;Q(q&_LwACzAfPqJiG@2W&^Y`WK}cPvOyD~TDGsGFfA@3k!wTB3Z+o`y$>nWk%++)2Uk zDbdY76vRWs07e%jB%s$nT5zjHiwhIoRCq4w!GwJ|pAjF+&!SLUf=da8}6Bk6_O zkWg%^K$_8Y0HPq8dFnNod z*Zg&x3#4hE;7>8D#+i+8iTd{A z=p+XQ9)4N(=mqLI`%NQ(-+=B1k?9SboQlmg#uEj}W-}C`8*2M^!sN8b8@ke_8W}}? z`kzWp1C4U%VeIe0p5bLO=`jh+x1Z20sgR+g(N(AdQnDF>B2g^j-|={4+;8uY{(s71T^wyes?>V3>V8ePc|U z_=&}dxX6e-Rn(HfJXb=2>eEuxXe>_hy1j3!ymFdhBPh+|glza*CvuH?c{pn_nYXnZ zeBl=iJc$fcgTb9N<}fIQPYL8g32G}~xFiYgf8JV>g{VN#O>y@|b_Md1os@DB`L$KS z38D)YcH2l6L=E`fFBWvAag$mX_ZPg=vZT;aLu&}2ixU-V%u*hnmq4{U z7Y#)v9gbD?PxYS;{<<7A6mN4);f`OJWw!*rZG~bspD%7*F z4i{U3CXjxp!nTy2aNhMyj+~yJuFnP5n{FD^*|(#FRMMWt2*yJFgW2KYmDu>6zL+{g zD-f@=?MZ|5vhxyXB-nKt7FH#}xkV~##05GiV zcb-iz3HQZMxd|GPYrCD8QJQw;_vla2YcRyL%J`~(n24{;L<<{_ITIpYrozoVj!3al zlrLz#zYL3wNuM{5V3Z5L!T3_#sE7oLgmB7In4|yUEPlG%L}0FYF|%tQg(H-Phr-8; zqNu!%t#yCt{vI9XA4HzFS*OLJEH!lFN76s{-lE6&637et?R=p5#QoMvl zWJ6*6J0va3K~kL9TF_8bq|zm<-tSWR$a)+pQ@ymv3-V0D(lx9IOAwLyE%FFYe+ji+2x?|9!n`_&s;WRV+y$O?JPEP) zX*lAKJFWy`ADLnhlY?;A-M!Q;bqwU*um_n?C^f8+BCQ!=MkWqmH75)GL4un|f4Cc# zz#{WJi9uv9-}8o3f%XOv)(xY0^YSL^4NKUe0u}2(6awBBO16zOKAyc4GMfbfGA$V9 ztx2c257U52!tb)fTT;~q{%gG~rXqR-Vwmn|OW{jVt+96K2dtC!NnyM>yyF%ky;mtl zvCFadm@0VA7!)*l_<5MC48AlsSjRlV6&~as%pU675Qx|I(N@49)qr^XBXTO@B(phi z17kxl=xvZvka*DTojdv+`g?R!fKklYYw`UeJQ z+TR)}3bnGQpV|_i#O{MHaR?0w1qe+Ey$Bx&C0OlPskOZ{MJh~7+d%S)wh0XZXOyQTphU0wpWr= zE|%XaZ4OCwSrinfTSjk_F))`34rmRSG1D`9tG?tgXP*KH0GRwH_7hgrwjEUQ(Gwrqo_NXf`mI5AsDBq zC;DOxKrc-^uw-`{RQS%y5w^cCXqi z%)CWAjJ#KuqA+oSO}k^FnOgzpT_5Er(aRL|PRW5cy81~bF&s^Pm0KyTkGF~jv+a}}Ev`Bg$j z^>Isl5+(3PJpPHs9eA&zc7t*$m~(Q@5eQz@*L%FeaDthrM(gPt{W|xJ6<;%jJnp&cRD?R|2?i1l;otJa7c=&IR|cfO}iPgAXoU zF)n=rEJ;yXtU+y_2o$M z<;3>o*x=>VXJ8m2FfI}pB@0aI1x7Fc6H0+G*1(hO#Xh^FK7+#3T;kC{(Tgt0ilE5vE{Wbju{JNMHlc`;mjsef%+5=SPAF<ZZjR&nzhtKRioIRA?tjIp-MDh$tB+H`e*{!{VV-PWx_BTM z@E@r$uU$lnG z!53>-18gbu^eF|AZPf_W!@UFwWzSx>*{LQW!N1fq9mn z2@b9W9u{2>pA4r`kEUtZ01uyH)Br-^Fr=%;HBzZ3)PC)R8Bx`vaF`kz)f003iw~bkhN_!|Wn*Vos8{TEhUT@5e;_WJsIMMcG5%>DiS&dv_N`4@J0cnAQ-#>RjZ z00W5t&tJ^l-QC*ST1-p~00u^9XJ=AUl7oW-;2a+x2k__T=grN{+1c4XK0ZL~^z^i$ zp&>vEhr@4fZWb380S18T&!0cQ3IKpHF)?v=b_NIm0Q>vwY7D0baZ)n z31Fa5sELUQARIVaU0nqf0XzT+fB_63aA;@<$l~wse|mcA;^G1TmX?-)e)jkGPfkuA z92@|!<>h5S_4f8QP-JRq>d&7)^Yin8l7K8gED$&_FaV?gY+wLjpoW%~7NDe=nHfMG z5DO3j{R9kv5GbssrUpO)OyvVrlx>u0UKD0i;Dpm5S5dY16(DL5l{ixz|mhJU@&-OWCTb7_%}8-fE(P~+XIRO zJU|wp1|S>|J3KrLcz^+v1f&BDpd>&MAaibR4#5A_4(MucZwG9E1h4@u0P@C8;oo+g zIVj7kfJi{oV~E(NZ*h(@^-(Q(C`Psb3KZ{N;^GB(a8NE*Vwc715!9 zr-H4Ao|T_c6+VT_JH9H+P3>iXSt!a$F`>s`jn`w9GZ_~B!{0soaiV|O_c^R2aWa%}O3jUE)WO=pa zs~_Wz08z|ieY5A%$@FcBF9^!1a}m5ks@7gjn;67N>}S~Hrm`4sM5Hh`q7&5-N{|31 z6x1{ol7BnskoViZ0GqbLa#kW`Z)VCjt1MysKg|rT zi!?s##Ck>8c zpi|>$lGlw#@yMNi&V4`6OBGJ(H&7lqLlcTQ&1zWriG_fL>BnFcr~?;E93{M-xIozQ zO=EHQ#+?<}%@wbWWv23#!V70h9MOuUVaU>3kpTvYfc|LBw?&b*89~Gc9i&8tlT#kF ztpbZoAzkdB+UTy=tx%L3Z4)I{zY(Kb)eg{InobSJmNwPZt$14aS-uc4eKuY8h$dtfyxu^a%zA)>fYI&)@ZXky?^{5>xSC?;w4r&td6vBdi%vHm4=XJH!3yL3?Ep+T5aU_>i;yr_XGq zxZfCzUU@GvnoIk+_Nd`aky>S&H!b*{A%L>?*XPAgWL(Vf(k7qUS}>Zn=U(ZfcOc{B z3*tOHH@t5Ub5D~#N7!Fxx}P2)sy{vE_l(R7$aW&CX>c|&HY+7};vUIietK%}!phrCuh+;C@1usp;XLU<8Gq8P!rEI3ieg#W$!= zQcZr{hp>8sF?k&Yl0?B84OneiQxef-4TEFrq3O~JAZR}yEJHA|Xkqd49tR&8oq{zP zY@>J^HBV*(gJvJZc_0VFN7Sx?H7#75E3#?N8Z!C+_f53YU}pyggxx1?wQi5Yb-_`I`_V*SMx5+*P^b=ec5RON-k1cIlsBLk}(HiaJyab0`CI zo0{=1_LO$~oE2%Tl_}KURuX<`+mQN_sTdM&* zkFf!Xtl^e^gTy6ON=&gTn6)$JHQq2)33R@_!#9?BLNq-Wi{U|rVX7Vny$l6#+SZ@KvQt@VYb%<9JfapI^b9j=wa+Tqb4ei;8c5 z&1>Uz@lVFv6T4Z*YU$r4G`g=91lSeA<=GRZ!*KTWKDPR}NPUW%peCUj`Ix_LDq!8| zMH-V`Pv!a~QkTL||L@cqiTz)*G-0=ytr1KqTuFPan9y4gYD5>PleK`NZB$ev@W%t= zkp)_=lBUTLZJpAtZg;pjI;7r2y|26-N7&a(hX|`1YNM9N8{>8JAuv}hp1v`3JHT-=5lbXpbMq7X~2J5Kl zh7tyU`_AusMFZ{ej9D;Uyy;SQ!4nwgSnngsYBwdS&EO3NS*o04)*juAYl;57c2Ly0(DEZ8IY?zSph-kyxu+D`tt@oU{32J#I{vmy=#0ySPK zA+i(A3yl)qmTz*$dZi#y9FS;$;h%bY+;StNx{_R56Otq+?pGe^T^{5d7Gs&?`_r`8 zD&dzOA|j8@3A&FR5U3*eQNBf<4^4W_iS_()*8b4aaUzfk2 zzIcMWSEjm;EPZPk{j{1>oXd}pXAj!NaRm8{Sjz!D=~q3WJ@vmt6ND_?HI~|wUS1j5 z9!S1MKr7%nxoJ3k`GB^7yV~*{n~O~n6($~x5Bu{7s|JyXbAyKI4+tO(zZYMslK;Zc zzeHGVl{`iP@jfSKq>R;{+djJ9n%$%EL()Uw+sykjNQdflkJZSjqV_QDWivbZS~S{K zkE@T^Jcv)Dfm93!mf$XYnCT--_A$zo9MOkPB6&diM8MwOfV?+ApNv`moV@nqn>&lv zYbN1-M|jc~sG|yLN^1R2=`+1ih3jCshg`iP&mY$GMTcY^W^T`WOCX!{-KHmZ#GiRH zYl{|+KLn5!PCLtBy~9i}`#d^gCDDx$+GQb~uc;V#K3OgbbOG0j5{BRG-si%Bo{@lB zGIt+Ain8^C`!*S0d0OSWVO+Z89}}O8aFTZ>p&k}2gGCV zh#<$gswePFxWGT$4DC^8@84_e*^KT74?7n8!$8cg=sL$OlKr&HMh@Rr5%*Wr!xoOl zo7jItnj-xYgVTX)H1=A2bD(tleEH57#V{xAeW_ezISg5OC zg=k>hOLA^urTH_e6*vSYRqCm$J{xo}-x3@HH;bsHD1Z`Pzvsn}%cvfw%Q(}h`Dgtb z0_J^niUmoCM5$*f)6}}qi(u;cPgxfyeVaaVmOsG<)5`6tzU4wyhF;k|~|x>7-2hXpVBpc5k{L4M`Wbe6Q?tr^*B z`Y*>6*&R#~%JlBIitlZ^qGe3s21~h3U|&k%%jeMM;6!~UH|+0+<5V-_zDqZQN79?n?!Aj!Nj`YMO9?j>uqI9-Tex+nJD z%e0#Yca6(zqGUR|KITa?9x-#C0!JKJHO(+fy@1!B$%ZwJwncQW7vGYv?~!^`#L~Um zOL++>4qmqW`0Chc0T23G8|vO)tK=Z2`gvS4*qpqhIJCEv9i&&$09VO8YOz|oZ+ubd zNXVdLc&p=KsSgtmIPLN69P7xYkYQ1vJ?u1g)T!6Ru`k2wkdj*wDC)VryGu2=yb0?F z>q~~e>KZ0d_#7f3UgV%9MY1}vMgF{B8yfE{HL*pMyhYF)WDZ^^3vS8F zGlOhs%g_~pS3=WQ#494@jAXwOtr^Y|TnQ5zki>qRG)(oPY*f}U_=ip_{qB0!%w7~G zWE!P4p3khyW-JJnE>eECuYfI?^d366Shq!Wm#x&jAo>=HdCllE$>DPO0N;y#4G)D2y#B@5=N=+F%Xo2n{gKcPcK2!hP*^WSXl+ut; zyLvVoY>VL{H%Kd9^i~lsb8j4>$EllrparEOJNT?Ym>vJa$(P^tOG)5aVb_5w^*&M0 zYOJ`I`}9}UoSnYg#E(&yyK(tqr^@n}qU2H2DhkK-`2He% zgXr_4kpXoQHxAO9S`wEdmqGU4j=1JdG!OixdqB4PPP6RXA}>GM zumruUUH|ZG2$bBj)Qluj&uB=dRb)?^qomw?Z$X%#D+Q*O97eHrgVB2*mR$bFBU`*} zIem?dM)i}raTFDn@5^caxE^XFXVhBePmH9fqcTi`TLaXiueH=@06sl}>F%}h9H_e9 z>^O?LxM1EjX}NVppaO@NNQr=AtHcH-BU{yBT_vejJ#J)l^cl69Z7$sk`82Zyw7Wxt z=~J?hZm{f@W}|96FUJfy65Gk8?^{^yjhOahUMCNNpt5DJw}ZKH7b!bGiFY9y6OY&T z_N)?Jj(MuLTN36ZCJ6I5Xy7uVlrb$o*Z%=-)kPo9s?<^Yqz~!Z* z_mP8(unFq65XSi!$@YtieSQ!<7IEOaA9VkKI?lA`*(nURvfKL8cX}-+~uw9|_5)uC2`ZHcaeX7L8aG6Ghleg@F9aG%X$#g6^yP5apnB>YTz&EfS{q z9UVfSyEIczebC)qlVu5cOoMzS_jrC|)rQlAzK7sfiW0`M8mVIohazPE9Jzn*qPt%6 zZL8RELY@L09B83@Be;x5V-IHnn$}{RAT#<2JA%ttlk#^(%u}CGze|1JY5MPhbfnYG zIw%$XfBmA-<_pKLpGKwbRF$#P;@_)ech#>vj25sv25VM$ouo)?BXdRcO{)*OwTw)G zv43W~T6ekBMtUD%5Bm>`^Ltv!w4~65N!Ut5twl!Agrzyq4O2Fi3pUMtCU~>9gt_=h-f% z;1&OuSu?A_sJvIvQ+dZNo3?m1%b1+s&UAx?8sUHEe_sB7zkm4R%6)<@oYB_i5>3Ip zIA+?jVdX|zL{)?TGpx+=Ta>G80}0}Ax+722$XFNJsC1gcH56{8B)*)eU#r~HrC&}` z|EWW92&;6y;3}!L5zXa385@?-D%>dSvyK;?jqU2t_R3wvBW;$!j45uQ7tyEIQva;Db}r&bR3kqNSh)Q_$MJ#Uj3Gj1F;)sO|%6z#@<+ zi{pbYsYS#u`X$Nf($OS+lhw>xgjos1OnF^$-I$u;qhJswhH~p|ab*nO>zBrtb0ndn zxV0uh!LN`&xckTP+JW}gznSpU492)u+`f{9Yr)js`NmfYH#Wdtradc0TnKNz@Su!e zu$9}G_=ku;%4xk}eXl>)KgpuT>_<`Ud(A^a++K&pm3LbN;gI}ku@YVrA%FJBZ5$;m zobR8}OLtW4-i+qPPLS-(7<>M{)rhiPoi@?&vDeVq5%fmZk=mDdRV>Pb-l7pP1y6|J z8I>sF+TypKV=_^NwBU^>4JJq<*14GLfM2*XQzYdlqqjnE)gZsPW^E@mp&ww* zW9i>XL=uwLVZ9pO*8K>t>vdL~Ek_NUL$?LQi5sc#1Q-f6-ywKcIT8Kw?C(_3pbR`e|)%9S-({if|E+hR2W!&qfQ&UiF^I!|M#xhdWsenv^wpKCBiuxXbnp85`{i|;BM?Ba`lqTA zyRm=UWJl&E{8JzYDHFu>*Z10-?#A8D|5jW9Ho0*CAs0fAy~MqbwYuOq9jjt9*nuHI zbDwKvh)5Ir$r!fS5|;?Dt>V+@F*v8=TJJF)TdnC#Mk>+tGDGCw;A~^PC`gUt*<(|i zB{{g{`uFehu`$fm4)&k7`u{xIV)yvA(%5SxX9MS80p2EKnLtCZ>tlX>*Z6nd&6-Mv$5rHD*db;&IBK3KH&M<+ArlGXDRdX1VVO4)&R$f4NxXI>GBh zSv|h>5GDAI(4E`@F?EnW zS>#c&Gw6~_XL`qQG4bK`W*>hek4LX*efn6|_MY+rXkNyAuu?NxS%L7~9tD3cn7&p( zCtfqe6sjB&Q-Vs7BP5+%;#Gk};4xtwU!KY0XXbmkUy$kR9)!~?*v)qw00!+Yg^#H> zc#8*z6zZo>+(bud?K<*!QO4ehiTCK&PD4G&n)Tr9X_3r-we z?fI+}-G~Yn93gI6F{}Dw_SC*FLZ)5(85zp4%uubtD)J)UELLkvGk4#tw&Tussa)mTD$R2&O~{ zCI3>fr-!-b@EGRI%g0L8UU%%u_<;e9439JNV;4KSxd|78v+I+8^rmMf3f40Jb}wEszROD?xBZu>Ll3;sUIoNxDK3|j3*sam2tC@@e$ z^!;+AK>efeBJB%ALsQ{uFui)oDoq()2USi?n=6C3#eetz?wPswc={I<8x=(8lE4EIsUfyGNZ{|KYn1IR|=E==f z(;!A5(-2y^2xRFCSPqzHAZn5RCN_bp22T(KEtjA(rFZ%>a4@STrHZflxKoqe9Z4@^ zM*scx_y73?Q{vt6?~WEl?2q*;@8 z3M*&@%l)SQmXkcUm)d@GT2#JdzhfSAP9|n#C;$E8X|pwD!r#X?0P>0ZisQ~TNqupW z*lUY~+ikD`vQb?@SAWX#r*Y+;=_|oacL$2CL$^(mV}aKO77pg}O+-=T1oLBT5sL2i z42Qth2+0@C`c+*D0*5!qy26sis<9a7>LN2{z%Qj49t z=L@x`4$ALHb*3COHoT?5S_c(Hs}g!V>W^=6Q0}zaubkDn)(lTax0+!+%B}9Vqw6{H zvL|BRM`O<@;eVi1DzM!tXtBrA20Ce@^Jz|>%X-t`vi-%WweXCh_LhI#bUg2*pcP~R z*RuTUzBKLXO~~uMd&o$v3@d0shHfUjC6c539PE6rF&;Ufa(Rw@K1*m7?f5)t`MjH0 z)_V(cajV5Am>f!kWcI@5rE8t6$S>5M=k=aRZROH6fA^jJp~2NlR4;Q2>L$7F#RT#9 z>4@1RhWG`Khy>P2j1Yx^BBL{S`niMaxlSWV-JBU0-T9zZ%>7mR3l$~QV$({o0;jTI ze5=cN^!Bc2bT|BcojXp~K#2cM>OTe*cM{Kg-j*CkiW)EGQot^}s;cy8_1_@JA0Whq zlrNr+R;Efa+`6N)s5rH*|E)nYZ3uqkk2C(E7@A|3YI`ozP~9Lexx#*1(r8luq+YPk z{J}c$s` zPM35Fx(YWB3Z5IYnN+L_4|jaR(5iWJi2~l&xy}aU7kW?o-V*6Av2wyZTG!E2KSW2* zGRLQkQU;Oz##ie-Z4fI)WSRxn$(ZcD;TL+;^r=a4(G~H3ZhK$lSXZj?cvyY8%d9JM zzc3#pD^W_QnWy#rx#;c&N@sqHhrnHRmj#i;s%zLm6SE(n&BWpd&f7>XnjV}OlZntI70fq%8~9<7 zMYaw`E-rp49-oC1N_uZTo)Cu%RR2QWdHpzQIcNsoDp`3xfP+`gI?tVQZ4X={qU?(n zV>0ASES^Xuc;9JBji{)RnFL(Lez;8XbB1uWaMp@p?7xhXk6V#!6B@aP4Rz7-K%a>i z?fvf}va_DGUXlI#4--`A3qK7J?-HwnG7O~H2;zR~RLW)_^#La!=}+>KW#anZ{|^D3 B7G?kd diff --git a/Jeopardy/php/img/glyphicons-halflings.png b/Jeopardy/php/img/glyphicons-halflings.png deleted file mode 100644 index a9969993201f9cee63cf9f49217646347297b643..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12799 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 diff --git a/Jeopardy/php/includes/.htaccess b/Jeopardy/php/includes/.htaccess deleted file mode 100644 index 8d2f256..0000000 --- a/Jeopardy/php/includes/.htaccess +++ /dev/null @@ -1 +0,0 @@ -deny from all diff --git a/Jeopardy/php/includes/Bootstrap.php b/Jeopardy/php/includes/Bootstrap.php deleted file mode 100644 index 9616330..0000000 --- a/Jeopardy/php/includes/Bootstrap.php +++ /dev/null @@ -1,114 +0,0 @@ -config = $config; - $this->storage = new Storage($this->config['dbLocation']); - $this->login = new Login($this->storage); - $this->renderer = new Renderer($config, $this); - $this->router = new Router(); - $this->loadRoutes($routes); - - $this->setCurrentPage(basename($_SERVER['PHP_SELF'])); - } - - public function loadRoutes($routes) { - $this->router->setBasePath($routes['base']); - foreach($routes['routes'] as $route) { - $pattern = ''; - $target = ''; - $args = array(); - if(array_key_exists('pattern', $route)) { - $pattern = $route['pattern']; - } - if(array_key_exists('target', $route)) { - $target = $route['target']; - } - if(array_key_exists('args', $route)) { - $args = $route['args']; - } - $this->router->map($pattern, $target, $args); - } - } - - public function render($page, $values=array(), $useTemplate=true) { - $this->renderer->render($page, $values, $useTemplate); - } - - public function clearNotice() { - if(array_key_exists('notice', $_SESSION)) { - unset($_SESSION['notice']); - } - } - - public function clearError() { - if(array_key_exists('error', $_SESSION)) { - unset($_SESSION['error']); - } - } - - public function setTitle($title) { - $this->renderer->setTitle($title); - } - - public function setNotice($notice) { - $_SESSION['notice'] = $notice; - } - - public function setError($error) { - $_SESSION['error'] = $error; - } - - public function setCurrentPage($currentPage) { - $this->renderer->setCurrentPage($currentPage); - } - - public function getNotice() { - if(array_key_exists('notice', $_SESSION)) { - return $_SESSION['notice']; - } else { - return null; - } - } - - public function getError() { - if(array_key_exists('error', $_SESSION)) { - return $_SESSION['error']; - } else { - return null; - } - } - - public function getLogin() { - return $this->login; - } - - public function getStorage() { - return $this->storage; - } - - public function getConfig() { - return $this->config; - } - - public function set404() { - header("HTTP/1.0 404 Not Found"); - } - - public function render404() { - $this->set404(); - $this->render('404.html.php'); - die(); - } - - public function redirect($page) { - header('Location: ' . $page); - die(); - } -} diff --git a/Jeopardy/php/includes/Controller.php b/Jeopardy/php/includes/Controller.php deleted file mode 100644 index 4f053e0..0000000 --- a/Jeopardy/php/includes/Controller.php +++ /dev/null @@ -1,54 +0,0 @@ -container = $container; - } - - public function getContainer() { - return $this->container(); - } - - protected function redirect($page) { - $this->container->redirect($page); - } - - protected function setTitle($title) { - $this->container->setTitle($title); - } - - protected function render($page, $args=array(), $useTemplate=true) { - $this->container->render($page, $args, $useTemplate); - } - - protected function getNotice($notice) { - return $this->container->getNotice(); - } - - protected function clearNotice() { - $this->container->clearNotice(); - } - - protected function setNotice($notice) { - $this->container->setNotice($notice); - } - - protected function getError($error) { - return $this->container->getError(); - } - - protected function clearError() { - $this->container->clearError(); - } - - protected function setError($error) { - $this->container->setError($error); - } - - protected function render404() { - $this->container->set404(); - $this->container->render404(); - } -} diff --git a/Jeopardy/php/includes/Login.php b/Jeopardy/php/includes/Login.php deleted file mode 100644 index 0467604..0000000 --- a/Jeopardy/php/includes/Login.php +++ /dev/null @@ -1,110 +0,0 @@ -storage=$storage; - $this->startSession(); - $this->checkLoggedIn(); - } - - protected function startSession() { - session_start(); - } - - protected function endSession() { - session_destroy(); - } - - protected function checkSessionLoggedIn() { - if(!isset($_SESSION['username']) || !isset($_SESSION['loggedIn']) || !isset($_SESSION['capability'])) { - return false; - } - if(!empty($_SESSION['username']) && $_SESSION['loggedIn']) { - return true; - } - return false; - } - - protected function checkLoggedIn() { - $this->loggedIn = $this->checkSessionLoggedIn(); - - if($this->isLoggedIn()) { - $this->createUser($_SESSION['username'], $_SESSION['capability']); - } - } - - protected function hashPassword($salt, $password) { - return sha1($salt . $password); - } - - protected function createUser($username, $capabilities) { - $this->user = new LoginUser($username, $capabilities); - } - - protected function ircToLower($str) { - $ircLowerSymbols = array("\\"=>"|", "["=>"{", "]"=>"}", "~"=>"^"); - $str = strtr($str, $ircLowerSymbols); - $str = strtolower($str); - return $str; - } - - public function isLoggedIn() { - return $this->loggedIn; - } - - public function getUser() { - return $this->user; - } - - public function login($username, $password) { - if($this->isLoggedIn()) { - return true; - } - - $usernameCanonical = $this->ircToLower($username); - - // Storage get salt, hashedPassword, capabilities for user - try { - $results = $this->storage->getLoginByUsernameCanonical($usernameCanonical); - } catch(StorageException $e) { - throw $e; - } - if(count($results) < 1) { - return false; - } - - $result = $results[0]; - - $username = $result['username']; - $salt = $result['salt']; - $targetPassword = $result['password']; - $capability = $result['capability']; - $isHashed = $result['is_hashed']; - - $hashPassword = $password; - if($isHashed) { - $hashPassword = $this->hashPassword($salt, $password); - } - - if($targetPassword == $hashPassword) { - $_SESSION['username'] = $username; - $_SESSION['loggedIn'] = true; - $_SESSION['capability'] = $capability; - $this->loggedIn = true; - $this->createUser($username, $capability); - return true; - } - return false; - } - - public function logout() { - $_SESSION = array(); - $this->endSession(); - $this->loggedIn = false; - $this->user = null; - } -} diff --git a/Jeopardy/php/includes/LoginUser.php b/Jeopardy/php/includes/LoginUser.php deleted file mode 100644 index e20796e..0000000 --- a/Jeopardy/php/includes/LoginUser.php +++ /dev/null @@ -1,19 +0,0 @@ -username = $username; - $this->capabilty = $capabilty; - } - - public function getUsername() { - return $this->username; - } - - public function getCapability() { - return $this->capabilty; - } -} diff --git a/Jeopardy/php/includes/Paginator.php b/Jeopardy/php/includes/Paginator.php deleted file mode 100644 index 2b55aea..0000000 --- a/Jeopardy/php/includes/Paginator.php +++ /dev/null @@ -1,156 +0,0 @@ -currentPage = $currentPage; - $this->totalResults = $totalResults; - if(!is_null($key)) { - $this->key = $key; - } - if(!is_null($resultsPerPage)) { - $this->resultsPerPage = $resultsPerPage; - } - if(!is_null($target)) { - $this->target = $target; - } else { - $this->target = $this->getCurrentURI(); - } - } - - protected function getCurrentURI() { - return $_SERVER['REQUEST_URI']; - } - - protected function replacePageVariable($uri, $pageNumber) { - $pathInfo = parse_url($uri); - if(array_key_exists('query', $pathInfo)) { - $queryString = $pathInfo['query']; - } else { - $queryString = ''; - } - parse_str($queryString, $queryArray); - $queryArray[$this->key] = $pageNumber; - if($pageNumber == 1) { - unset($queryArray[$this->key]); - } - $queryString = http_build_query($queryArray); - $new = $pathInfo['path']; - if($queryString != ''){ - $new .= '?' . $queryString; - } - return $new; - } - - protected function getMaxPages() { - if($this->totalResults==0) { - return 1; - } - $max = intval($this->totalResults / $this->resultsPerPage); - if($this->totalResults % $this->resultsPerPage > 0) { - $max++; - } - return intval($max); - } - - public function paginate() { - echo ''; - } -} diff --git a/Jeopardy/php/includes/Renderer.php b/Jeopardy/php/includes/Renderer.php deleted file mode 100644 index 8ce7b3f..0000000 --- a/Jeopardy/php/includes/Renderer.php +++ /dev/null @@ -1,52 +0,0 @@ -config = $config; - $this->container = $container; - } - - public function render($page, $values, $useTemplate=true) { - $viewVars = array(); - $viewVars['title'] = $this->title; - if($this->title != '') { - $viewVars['title'] .= ' · '; - } - - $viewVars['currentPage'] = $this->currentPage; - $container = $this->container; - - if($useTemplate) { - include($this->config['viewLocation'] . 'header.html.php'); - include($this->config['viewLocation'] . $page); - include($this->config['viewLocation'] . 'footer.html.php'); - } else { - include($this->config['viewLocation'] . $page); - } - } - - public function setTitle($title) { - $this->title = $title; - } - - public function setCurrentPage($currentPage) { - $this->currentPage = $currentPage; - } - - public function getContainer() { - return $this->container; - } - - public function getTitle() { - return $this->title; - } - - public function getCurrentPage() { - return $this->currentPage; - } -} diff --git a/Jeopardy/php/includes/Route.php b/Jeopardy/php/includes/Route.php deleted file mode 100644 index fcee0f3..0000000 --- a/Jeopardy/php/includes/Route.php +++ /dev/null @@ -1,73 +0,0 @@ -url; - } - - public function setUrl($url) { - $url = (string) $url; - - // make sure that the URL is suffixed with a forward slash - if(substr($url,-1) !== '/') { - $url .= '/'; - } - - $this->url = $url; - } - - public function getTarget() { - return $this->target; - } - - public function setTarget($target) { - $this->target = $target; - } - - public function getMethods() { - return $this->methods; - } - - public function setMethods(array $methods) { - $this->methods = $methods; - } - - public function getName() { - return $this->name; - } - - public function setName($name) { - $this->name = (string) $name; - } - - public function setFilters(array $filters) { - $this->filters = $filters; - } - - public function getRegex() { - return preg_replace_callback("/:(\w+)/", array(&$this, 'substituteFilter'), $this->url); - } - - private function substituteFilter($matches) { - if (isset($matches[1]) && isset($this->filters[$matches[1]])) { - return $this->filters[$matches[1]]; - } - - return "([\w-]+)"; - } - - public function getParameters() { - return $this->parameters; - } - - public function setParameters(array $parameters) { - $this->parameters = $parameters; - } -} diff --git a/Jeopardy/php/includes/Router.php b/Jeopardy/php/includes/Router.php deleted file mode 100644 index 6a12ef3..0000000 --- a/Jeopardy/php/includes/Router.php +++ /dev/null @@ -1,105 +0,0 @@ -basePath = (string) $basePath; - } - - public function map($routeUrl, $target = '', array $args = array()) { - $route = new Route(); - $route->setUrl($this->basePath . $routeUrl); - $route->setTarget($target); - - if(isset($args['methods'])) { - $methods = explode(',', $args['methods']); - $route->setMethods($methods); - } - - if(isset($args['filters'])) { - $route->setFilters($args['filters']); - } - - if(isset($args['name'])) { - $route->setName($args['name']); - if (!isset($this->namedRoutes[$route->getName()])) { - $this->namedRoutes[$route->getName()] = $route; - } - } - - $this->routes[] = $route; - } - - public function matchCurrentRequest() { - $requestMethod = $_SERVER['REQUEST_METHOD']; - if(isset($_POST['_method']) && in_array(strtoupper($_POST['_method']),array('PUT','DELETE'))) { - $requestMethod = strtoupper($_POST['_method']); - } - - $requestUrl = $_SERVER['REQUEST_URI']; - - // strip GET variables from URL - $pos = strpos($requestUrl, '?'); - if($pos !== false) { - $requestUrl = substr($requestUrl, 0, $pos); - } - - return $this->match($requestUrl, $requestMethod); - } - - public function match($requestUrl, $requestMethod = 'GET') { - - foreach($this->routes as $route) { - // compare server request method with route's allowed http methods - if(!in_array($requestMethod, $route->getMethods())) { - continue; - } - - // check if request url matches route regex. if not, return false. - if (!preg_match("@^".$route->getRegex()."*$@i", $requestUrl, $matches)) { - continue; - } - - $params = array(); - if (preg_match_all("/:([\w-]+)/", $route->getUrl(), $argument_keys)) { - // grab array with matches - $argument_keys = $argument_keys[1]; - - // loop trough parameter names, store matching value in $params array - foreach ($argument_keys as $key => $name) { - if (isset($matches[$key + 1])) { - $params[$name] = $matches[$key + 1]; - } - } - } - $route->setParameters($params); - return $route; - } - return false; - } - - public function generate($routeName, array $params = array()) { - // Check if route exists - if (!isset($this->namedRoutes[$routeName])) { - throw new Exception("No route with the name $routeName has been found."); - } - $route = $this->namedRoutes[$routeName]; - - $url = $route->getUrl(); - // replace route url with given parameters - if ($params && preg_match_all("/:(\w+)/", $url, $param_keys)) { - // grab array with matches - $param_keys = $param_keys[1]; - // loop trough parameter names, store matching value in $params array - foreach ($param_keys as $i => $key) { - if (isset($params[$key])) { - $url = preg_replace("/:(\w+)/", $params[$key], $url, 1); - } - } - } - return $url; - } -} diff --git a/Jeopardy/php/includes/Storage.php b/Jeopardy/php/includes/Storage.php deleted file mode 100644 index e007682..0000000 --- a/Jeopardy/php/includes/Storage.php +++ /dev/null @@ -1,708 +0,0 @@ -dbLocation = $dbLocation; - $this->dbType = $dbType; - $this->connect(); - } - - public function connect() { - if(is_null($this->db)) { - try { - $this->db = new PDO($this->dbType . $this->dbLocation); - if(!$this->db) { - $this->db = null; - } - } catch(Exception $e) { - $this->db = null; - } - } - } - - public function close() { - $this->db = null; - } - - protected function ircToLower($str) { - $ircLowerSymbols = array("\\"=>"|", "["=>"{", "]"=>"}", "~"=>"^"); - $str = strtr($str, $ircLowerSymbols); - $str = strtolower($str); - return $str; - } - - public function getLoginByUsernameCanonical($usernameCanonical) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->prepare('SELECT * - FROM trivialogin - WHERE username_canonical=:username - LIMIT 1'); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':username'=>$usernameCanonical)); - $result = $q->fetchAll(); - return $result; - } - - public function getTimeSinceLastPlayed($usernameCanonical) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->prepare('SELECT last_updated - FROM triviauserlog - WHERE username_canonical=:username - ORDER BY last_updated DESC - LIMIT 1'); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':username'=>$usernameCanonical)); - $result = $q->fetchAll(); - return $result; - } - - public function getTemporaryQuestionById($id) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->prepare('SELECT * - FROM triviatemporaryquestion - WHERE id=:id - LIMIT 1'); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':id'=>$id)); - $result = $q->fetchAll(); - return $result; - } - - public function getDeleteById($id) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->prepare('SELECT * - FROM triviadelete - WHERE id=:id - LIMIT 1'); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':id'=>$id)); - $result = $q->fetchAll(); - return $result; - } - - public function getEditById($id) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->prepare('SELECT * - FROM triviaedit - WHERE id=:id - LIMIT 1'); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':id'=>$id)); - $result = $q->fetchAll(); - return $result; - } - - public function temporaryQuestionExists($id) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->prepare('SELECT count(id) FROM triviatemporaryquestion WHERE id=:id'); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':id'=>$id)); - $result = $q->fetchColumn(); - if($result > 0) { - return true; - } - return false; - } - - public function insertQuestion($question) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->prepare('INSERT INTO triviaquestion VALUES (NULL, :question, :question, 0, 0, 0)'); - $result = $q->execute(array(':question'=>$question)); - if($result === false) { - throw new StorageSchemaException(); - } - } - - public function deleteExists($id) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->prepare('SELECT count(id) FROM triviadelete WHERE id=:id'); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':id'=>$id)); - $result = $q->fetchColumn(); - if($result > 0) { - return true; - } - return false; - } - - public function getTopDeletions($page, $max) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - if($page < 1) { - $page = 1; - } - if($max < 1) { - $max = 1; - } - $q = $this->db->prepare('SELECT td.*, tq.question as question - FROM triviadelete td - INNER JOIN triviaquestion tq - ON tq.id=td.line_num - ORDER BY id DESC LIMIT :offset, :maxResults'); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':offset'=>($page-1) * $max, ':maxResults'=>$max)); - $result = $q->fetchAll(); - return $result; - } - - public function getCountDeletions() { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->query('SELECT count(id) FROM triviadelete'); - if($q === false) { - throw new StorageSchemaException(); - } - $result = $q->fetchColumn(); - return $result; - } - - public function removeQuestion($id) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->prepare('DELETE FROM triviaquestion WHERE id=:id'); - $result = $q->execute(array(':id'=>$id)); - if($result === false) { - throw new StorageSchemaException(); - } - } - - public function removeDelete($id) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->prepare('DELETE FROM triviadelete WHERE id=:id'); - $result = $q->execute(array(':id'=>$id)); - if($result === false) { - throw new StorageSchemaException(); - } - } - - public function removeTemporaryQuestion($id) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->prepare('DELETE FROM triviatemporaryquestion WHERE id=:id'); - $result = $q->execute(array(':id'=>$id)); - if($result === false) { - throw new StorageSchemaException(); - } - } - - public function removeReport($id) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->prepare('DELETE FROM triviareport WHERE id=:id'); - $result = $q->execute(array(':id'=>$id)); - if($result === false) { - throw new StorageSchemaException(); - } - } - - public function removeEdit($id) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->prepare('DELETE FROM triviaedit WHERE id=:id'); - $result = $q->execute(array(':id'=>$id)); - if($result === false) { - throw new StorageSchemaException(); - } - } - - public function reportExists($id) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->prepare('SELECT count(id) FROM triviareport WHERE id=:id'); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':id'=>$id)); - $result = $q->fetchColumn(); - if($result > 0) { - return true; - } - return false; - } - - public function editExists($id) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->prepare('SELECT count(id) FROM triviaedit WHERE id=:id'); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':id'=>$id)); - $result = $q->fetchColumn(); - if($result > 0) { - return true; - } - return false; - } - - public function questionExists($id) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->prepare('SELECT count(id) FROM triviaquestion WHERE id=:id'); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':id'=>$id)); - $result = $q->fetchColumn(); - if($result > 0) { - return true; - } - return false; - } - - public function updateQuestion($id, $question) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->prepare('UPDATE triviaquestion SET question=:question WHERE id=:id'); - $result = $q->execute(array(':id'=>$id, ':question'=>$question)); - if($result === false) { - throw new StorageSchemaException(); - } - } - - public function getTopReports($page, $max) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - if($page < 1) { - $page = 1; - } - if($max < 1) { - $max = 1; - } - $q = $this->db->prepare('SELECT tr.*, tq.question as original - FROM triviareport tr - INNER JOIN triviaquestion tq - ON tq.id=question_num - ORDER BY id DESC LIMIT :offset, :maxResults'); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':offset'=>($page-1) * $max, ':maxResults'=>$max)); - $result = $q->fetchAll(); - return $result; - } - - public function getCountReports() { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->query('SELECT count(id) FROM triviareport'); - if($q === false) { - throw new StorageSchemaException(); - } - $result = $q->fetchColumn(); - return $result; - } - - public function getTopNewQuestions($page, $max) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - if($page < 1) { - $page = 1; - } - if($max < 1) { - $max = 1; - } - $q = $this->db->prepare('SELECT tq.* FROM triviatemporaryquestion tq ORDER BY tq.id DESC LIMIT :offset, :maxResults'); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':offset'=>($page-1) * $max, ':maxResults'=>$max)); - $result = $q->fetchAll(); - return $result; - } - - public function getCountNewQuestions() { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->query('SELECT count(id) FROM triviatemporaryquestion'); - if($q === false) { - throw new StorageSchemaException(); - } - $result = $q->fetchColumn(); - return $result; - } - - public function getTopEdits($page, $max) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - if($page < 1) { - $page = 1; - } - if($max < 1) { - $max = 1; - } - $q = $this->db->prepare('SELECT te.*, tq.question as original - FROM triviaedit te - INNER JOIN triviaquestion tq - ON tq.id=question_id - ORDER BY id DESC LIMIT :offset, :maxResults'); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':offset'=>($page-1) * $max, ':maxResults'=>$max)); - $result = $q->fetchAll(); - return $result; - } - - public function getCountEdits() { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->query('SELECT count(id) FROM triviaedit'); - if($q === false) { - throw new StorageSchemaException(); - } - $result = $q->fetchColumn(); - return $result; - } - - public function getDayTopScores($page=1, $max=10) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - if($page < 1) { - $page = 1; - } - if($max < 1) { - $max = 1; - } - $day = date('j'); - $month = date('m'); - $year = date('Y'); - $q = $this->db->prepare("SELECT username, - sum(points_made) as points - FROM triviauserlog - WHERE day=:day - AND year=:year - AND month=:month - GROUP BY username_canonical - ORDER BY points DESC - LIMIT :offset, :maxResults"); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':offset'=>($page-1) * $max, ':maxResults'=>$max, ':day'=>$day, ':year'=>$year, ':month'=>$month)); - $result = $q->fetchAll(); - return $result; - } - - public function getCountDayTopScores() { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $day = date('j'); - $month = date('m'); - $year = date('Y'); - $q = $this->db->prepare('SELECT count(distinct(username_canonical)) - FROM triviauserlog - WHERE day=:day - AND year=:year - AND month=:month'); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':day'=>$day, ':year'=>$year, ':month'=>$month)); - $result = $q->fetchColumn(); - return $result; - } - - protected function generateWeekSqlClause() { - $sqlClause = ''; - $day = date('N')-1; - $week = new DateTime(); - $interval = new DateInterval('P'.$day.'D'); - $week->sub($interval); - $interval = new DateInterval('P1D'); - for($i=0;$i<7;$i++) { - if($i>0) { - $sqlClause .= ' or '; - } - $sqlClause .= '(day=' . $week->format('j') . - ' and month=' . $week->format('n') . - ' and year=' . $week->format('Y') . - ')'; - $week->add($interval); - } - return $sqlClause; - } - - public function getWeekTopScores($page=1, $max=10) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - if($page < 1) { - $page = 1; - } - if($max < 1) { - $max = 1; - } - $sqlClause = $this->generateWeekSqlClause(); - $q = $this->db->prepare("SELECT username, sum(points_made) as points FROM triviauserlog WHERE $sqlClause GROUP BY username_canonical ORDER BY points DESC LIMIT :offset, :maxResults"); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':offset'=>($page-1) * $max, ':maxResults'=>$max)); - $result = $q->fetchAll(); - return $result; - } - - public function getCountWeekTopScores() { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $sqlClause = $this->generateWeekSqlClause(); - $q = $this->db->query('SELECT count(distinct(username_canonical)) - FROM triviauserlog - WHERE $sqlClause'); - if($q === false) { - throw new StorageSchemaException(); - } - $result = $q->fetchColumn(); - return $result; - } - - public function getMonthTopScores($page=1, $max=10) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - if($page < 1) { - $page = 1; - } - if($max < 1) { - $max = 1; - } - $month = date('m'); - $year = date('Y'); - $q = $this->db->prepare("SELECT username, sum(points_made) as points FROM triviauserlog WHERE year=:year AND month=:month GROUP BY username_canonical ORDER BY points DESC LIMIT :offset, :maxResults"); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':offset'=>($page-1) * $max, ':maxResults'=>$max, ':year'=>$year, ':month'=>$month)); - $result = $q->fetchAll(); - return $result; - } - - public function getCountMonthTopScores() { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $month = date('m'); - $year = date('Y'); - $q = $this->db->prepare('SELECT count(distinct(username_canonical)) - FROM triviauserlog - WHERE year=:year - AND month=:month'); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':year'=>$year, ':month'=>$month)); - $result = $q->fetchColumn(); - return $result; - } - - public function getYearTopScores($page=1, $max=10) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - if($page < 1) { - $page = 1; - } - if($max < 1) { - $max = 1; - } - $year = date('Y'); - $q = $this->db->prepare("SELECT username, sum(points_made) as points FROM triviauserlog WHERE year=:year GROUP BY username_canonical ORDER BY points DESC LIMIT :offset, :maxResults"); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':offset'=>($page-1) * $max, ':maxResults'=>$max, ':year'=>$year)); - $result = $q->fetchAll(); - return $result; - } - - public function getCountYearTopScores() { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $year = date('Y'); - $q = $this->db->prepare('SELECT count(distinct(username_canonical)) - FROM triviauserlog - WHERE year=:year'); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':year'=>$year)); - $result = $q->fetchColumn(); - return $result; - } - - public function getUserLikeUsernameCanonical($usernameCanonical, $page, $max) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - if($page < 1) { - $page = 1; - } - if($max < 1) { - $max = 1; - } - $q = $this->db->prepare('select - tl.username, - sum(tl.points_made) as points, - sum(tl.num_answered) as total - from triviauserlog tl - where tl.username_canonical like :username - group by tl.username_canonical - limit :offset, :maxResults - '); - if($q === false) { - throw new StorageSchemaException(); - } - $likeString = '%'.$this->escapeLikeQuery($usernameCanonical).'%'; - $q->execute(array(':offset'=>($page-1) * $max, ':maxResults'=>$max, ':username'=>$likeString)); - $result = $q->fetchAll(); - return $result; - } - - public function getCountUserLikeUsernameCanonical($usernameCanonical) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->prepare('select - count(distinct(tl.username_canonical)) - from triviauserlog tl - where tl.username_canonical like :username - '); - if($q === false) { - throw new StorageSchemaException(); - } - $likeString = '%'.$this->escapeLikeQuery($usernameCanonical).'%'; - $q->execute(array(':username'=>$likeString)); - $result = $q->fetchColumn(); - return $result; - } - - public function getRecentAskedQuestions() { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->query('SELECT asked_at, channel, round_num, question, line_num FROM triviagameslog ORDER BY id DESC LIMIT 10'); - if($q === false) { - throw new StorageSchemaException(); - } - $result = $q->fetchAll(); - return $result; - } - - public function getRecentActivities() { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->query('SELECT * FROM triviaactivity ORDER BY id DESC LIMIT 10'); - if($q === false) { - throw new StorageSchemaException(); - } - $result = $q->fetchAll(); - return $result; - } - - public function getUserProfileInformation($usernameCanonical) { - if(!$this->isConnected()) { - throw new StorageConnectionException(); - } - $q = $this->db->prepare('select - tl.username as usrname, - sum(tl2.t * (tl2.n / (select sum(num_answered) from triviauserlog where username_canonical=:username))) as count, - sum(tl2.p * (tl2.n / (select sum(num_answered) from triviauserlog where username_canonical=:username))) as score, - (select sum(points_made) from triviauserlog t3 where username_canonical=:username) as points, - (select sum(num_answered) from triviauserlog t4 where username_canonical=:username) as q_asked, - (select num_editted from triviausers where username_canonical=:username) as num_e, - (select num_editted_accepted from triviausers where username_canonical=:username) as num_e_accepted, - (select num_questions_added from triviausers where username_canonical=:username) as num_q, - (select num_questions_accepted from triviausers where username_canonical=:username) as num_q_accepted, - (select num_reported from triviausers where username_canonical=:username) as num_r, - (select highest_streak from triviausers where username_canonical=:username) as highest_streak - from (select tl3.id as id2, tl3.average_time * 1.0 as t, tl3.average_score * 1.0 as p, tl3.num_answered * 1.0 as n from triviauserlog tl3) tl2 - inner join triviauserlog tl - on tl.username_canonical=:username - and tl.id=tl2.id2 - limit 1'); - if($q === false) { - throw new StorageSchemaException(); - } - $q->execute(array(':username'=>$usernameCanonical)); - $result = $q->fetchAll(); - return $result; - } - - public function isConnected() { - if(is_null($this->db)) { - return false; - } - return true; - } - - protected function escapeLikeQuery($s) { - $translations = array("%"=>"\\%", "_"=>"\\_"); - return strtr($s, $translations); - } -} - -class StorageException extends Exception { } - -class StorageSchemaException extends StorageException { } - -class StorageConnectionException extends StorageException { } diff --git a/Jeopardy/php/includes/autoload.php b/Jeopardy/php/includes/autoload.php deleted file mode 100644 index bfdecf0..0000000 --- a/Jeopardy/php/includes/autoload.php +++ /dev/null @@ -1,13 +0,0 @@ - (this.$items.length - 1) || pos < 0) return - - if (this.sliding) { - return this.$element.one('slid', function () { - that.to(pos) - }) - } - - if (activeIndex == pos) { - return this.pause().cycle() - } - - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) - } - - , pause: function (e) { - if (!e) this.paused = true - if (this.$element.find('.next, .prev').length && $.support.transition.end) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - clearInterval(this.interval) - this.interval = null - return this - } - - , next: function () { - if (this.sliding) return - return this.slide('next') - } - - , prev: function () { - if (this.sliding) return - return this.slide('prev') - } - - , slide: function (type, next) { - var $active = this.$element.find('.item.active') - , $next = next || $active[type]() - , isCycling = this.interval - , direction = type == 'next' ? 'left' : 'right' - , fallback = type == 'next' ? 'first' : 'last' - , that = this - , e - - this.sliding = true - - isCycling && this.pause() - - $next = $next.length ? $next : this.$element.find('.item')[fallback]() - - e = $.Event('slide', { - relatedTarget: $next[0] - , direction: direction - }) - - if ($next.hasClass('active')) return - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - this.$element.one('slid', function () { - var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) - $nextIndicator && $nextIndicator.addClass('active') - }) - } - - if ($.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - this.$element.one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid') }, 0) - }) - } else { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid') - } - - isCycling && this.cycle() - - return this - } - - } - - - /* CAROUSEL PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.carousel - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('carousel') - , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) - , action = typeof option == 'string' ? option : options.slide - if (!data) $this.data('carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - $.fn.carousel.defaults = { - interval: 5000 - , pause: 'hover' - } - - $.fn.carousel.Constructor = Carousel - - - /* CAROUSEL NO CONFLICT - * ==================== */ - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - /* CAROUSEL DATA-API - * ================= */ - - $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , options = $.extend({}, $target.data(), $this.data()) - , slideIndex - - $target.carousel(options) - - if (slideIndex = $this.attr('data-slide-to')) { - $target.data('carousel').pause().to(slideIndex).cycle() - } - - e.preventDefault() - }) - -}(window.jQuery);/* ============================================================= - * bootstrap-collapse.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#collapse - * ============================================================= - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* COLLAPSE PUBLIC CLASS DEFINITION - * ================================ */ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.collapse.defaults, options) - - if (this.options.parent) { - this.$parent = $(this.options.parent) - } - - this.options.toggle && this.toggle() - } - - Collapse.prototype = { - - constructor: Collapse - - , dimension: function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - , show: function () { - var dimension - , scroll - , actives - , hasData - - if (this.transitioning || this.$element.hasClass('in')) return - - dimension = this.dimension() - scroll = $.camelCase(['scroll', dimension].join('-')) - actives = this.$parent && this.$parent.find('> .accordion-group > .in') - - if (actives && actives.length) { - hasData = actives.data('collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('collapse', null) - } - - this.$element[dimension](0) - this.transition('addClass', $.Event('show'), 'shown') - $.support.transition && this.$element[dimension](this.$element[0][scroll]) - } - - , hide: function () { - var dimension - if (this.transitioning || !this.$element.hasClass('in')) return - dimension = this.dimension() - this.reset(this.$element[dimension]()) - this.transition('removeClass', $.Event('hide'), 'hidden') - this.$element[dimension](0) - } - - , reset: function (size) { - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - [dimension](size || 'auto') - [0].offsetWidth - - this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') - - return this - } - - , transition: function (method, startEvent, completeEvent) { - var that = this - , complete = function () { - if (startEvent.type == 'show') that.reset() - that.transitioning = 0 - that.$element.trigger(completeEvent) - } - - this.$element.trigger(startEvent) - - if (startEvent.isDefaultPrevented()) return - - this.transitioning = 1 - - this.$element[method]('in') - - $.support.transition && this.$element.hasClass('collapse') ? - this.$element.one($.support.transition.end, complete) : - complete() - } - - , toggle: function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - } - - - /* COLLAPSE PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.collapse - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('collapse') - , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) - if (!data) $this.data('collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.defaults = { - toggle: true - } - - $.fn.collapse.Constructor = Collapse - - - /* COLLAPSE NO CONFLICT - * ==================== */ - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - /* COLLAPSE DATA-API - * ================= */ - - $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { - var $this = $(this), href - , target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - , option = $(target).data('collapse') ? 'toggle' : $this.data() - $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - $(target).collapse(option) - }) - -}(window.jQuery);/* ============================================================ - * bootstrap-dropdown.js v2.3.2 - * http://getbootstrap.com/2.3.2/javascript.html#dropdowns - * ============================================================ - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* DROPDOWN CLASS DEFINITION - * ========================= */ - - var toggle = '[data-toggle=dropdown]' - , Dropdown = function (element) { - var $el = $(element).on('click.dropdown.data-api', this.toggle) - $('html').on('click.dropdown.data-api', function () { - $el.parent().removeClass('open') - }) - } - - Dropdown.prototype = { - - constructor: Dropdown - - , toggle: function (e) { - var $this = $(this) - , $parent - , isActive - - if ($this.is('.disabled, :disabled')) return - - $parent = getParent($this) - - isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement) { - // if mobile we we use a backdrop because click events don't delegate - $('"; - } - - if(!is_null(getError('username', $values))) { - echo "

". getError('username', $values) ."

"; - } - ?> - - ". getError('password', $values) ."

"; - } - ?> - - - - diff --git a/Jeopardy/php/views/profile.html.php b/Jeopardy/php/views/profile.html.php deleted file mode 100644 index 3b02bfb..0000000 --- a/Jeopardy/php/views/profile.html.php +++ /dev/null @@ -1,117 +0,0 @@ - -
-
-

-

Profile and stats.

-
-
- 0) { - echo '
-
'; - foreach($values['errors'] as $error) { - echo "
$error
"; - } - echo '
-
'; - } - ?> -
-
-

Last seen

-

- -

-
-
-

Highest Streak

-

- -

-
-
-
-
-

Averages

- - - - - - - - - '; - echo ''; - echo ''; - echo ''; - } - ?> - -
Average Time/Question*Average Points/Question*
' . number_format($userProfile['count'],2) . '' . number_format($userProfile['score'],2) . '
-
-
-

Totals

- - - - - - - - - '; - echo ''; - echo ''; - echo ''; - } - ?> - -
Total PointsNumber Answered*
' . number_format($userProfile['points'],0) . '' . number_format($userProfile['q_asked'],0) . '
-
-
-
-
-

Contributions

- - - - - - - - - - '; - echo ''; - echo ''; - echo ''; - echo ''; - } - ?> - -
Reports MadeEdits (Made/Accepted)Questions (Made/Accepted)
' . number_format($userProfile['num_r'],0) . '' . number_format($userProfile['num_e'],0) . '/' . number_format($userProfile['num_e_accepted'],0) . '' . number_format($userProfile['num_q'],0) . '/' . number_format($userProfile['num_q_accepted'],0) . '
-
-
- -
-
-

* These stats do not include KAOS

-
-
diff --git a/Jeopardy/php/views/reports.html.php b/Jeopardy/php/views/reports.html.php deleted file mode 100644 index 90a8ef2..0000000 --- a/Jeopardy/php/views/reports.html.php +++ /dev/null @@ -1,243 +0,0 @@ -login; - -$isMod = false; - -if($login->isLoggedIn()) { - if(!is_null($login->getUser())) { - if($login->getUser()->getCapability() == "owner" || $login->getUser()->getCapability() == "triviamod") { - $isMod = true; - } - } -} -?> -
-

Reports

-

The reports and edits that are currently pending.

-
- -
-
-

Reports

- $error
"; - } - ?> - - - - - - - - - '; - } - ?> - - - - '; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - if($isMod) { - echo ''; - } - echo ''; - } - ?> - - - paginate(); - ?> -
- - - -
-
-

Edits

- $error
"; - } - ?> - - - - - - - - - '; - } - ?> - - - - 0) { - $isItalic = false; - $differenceString .= ''; - $differenceString .= '*'; - } - $brokenNew = str_split($splitNew[$y]); - if(!array_key_exists($y, $splitOld)){ - $splitOld[$y] = '*'; - } - $brokenOld = str_split($splitOld[$y]); - for($i=0;$i'; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - if($isMod) { - echo ''; - } - echo ''; - } - ?> - - - paginate(); - ?> -
- - -
-
-

Added Questions

- $error
"; - } - ?> - - - - - - - '; - } - ?> - - - - '; - echo ''; - echo ''; - echo ''; - if($isMod) { - echo ''; - } - echo ''; - } - ?> - - - paginate(); - ?> -
- - -
-
-

Pending Deletions

- $error
"; - } - ?> - - - - - - - - - '; - } - ?> - - - - '; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - if($isMod) { - echo ''; - } - echo ''; - } - ?> - - - paginate(); - ?> -
- diff --git a/Jeopardy/php/views/stats.html.php b/Jeopardy/php/views/stats.html.php deleted file mode 100644 index 6dbd6b2..0000000 --- a/Jeopardy/php/views/stats.html.php +++ /dev/null @@ -1,126 +0,0 @@ -
-

Stats

-

Stats are updated continuously and instantly.

-
- -
-
-

Todays Top Scores

- $error
"; - } - ?> - - - - - - - - - - $res) { - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } - ?> - -
#UsernamePoints
' . ($key+1) . '$res['username'])) . '">' . htmlspecialchars($res['username']) . '' . number_format($res['points'],0) . '
-

"day")); ?>">View all

-
- -
-

Week Top Scores

- $error
"; - } - ?> - - - - - - - - - - $res) { - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } - ?> - -
#UsernamePoints
' . ($key+1) . '$res['username'])) . '">' . htmlspecialchars($res['username']) . '' . number_format($res['points'],0) . '
-

"week")); ?>">View all

- - -
-
-

Month Top Scores

- $error
"; - } - ?> - - - - - - - - - - $res) { - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } - ?> - -
#UsernamePoints
' . ($key+1) . '$res['username'])) . '">' . htmlspecialchars($res['username']) . '' . number_format($res['points'],0) . '
-

"month")); ?>">View all

-
-
-

Year Top Scores

- $error
"; - } - ?> - - - - - - - - - - $res) { - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } - ?> - -
#UsernamePoints
' . ($key+1) . '$res['username'])) . '">' . htmlspecialchars($res['username']) . '' . number_format($res['points'],0) . '
-

"year")); ?>">View all

- - diff --git a/Jeopardy/php/views/top.html.php b/Jeopardy/php/views/top.html.php deleted file mode 100644 index 50ed1f1..0000000 --- a/Jeopardy/php/views/top.html.php +++ /dev/null @@ -1,52 +0,0 @@ -
-

Top Scores

-

Player rankings.

-
-
-
- -
-
-
-
-

Top Scores for

- $error
"; - } - ?> - - - - - - - - - - '; - echo ''; - echo ''; - echo ''; - echo ''; - $currentRank++; - } - ?> - -
#UsernameScore
' . $currentRank . '$res['username'])) . '">' . htmlspecialchars($res['username']) . '' . number_format($res['points'],0) . '
- paginate(); - ?> -
-
- - \ No newline at end of file diff --git a/Jeopardy/php/views/user.html.php b/Jeopardy/php/views/user.html.php deleted file mode 100644 index 6e1ac7d..0000000 --- a/Jeopardy/php/views/user.html.php +++ /dev/null @@ -1,64 +0,0 @@ -
-

Players

-

Show stats for players.

-
-
-
-

Search

-
- Username: - -
- $error
"; - } - } - if($values['usersCount']==0) { - echo "
User not found.
"; - $values['users'] = array(); - } - if($values['usernameCanonical']=='') { - echo "
Enter a username above to search for stats.
"; - } - ?> -
- - -
-
-

Player data

- - - - - - - - - - '; - echo ''; - echo ''; - echo ''; - echo ''; - } - ?> - -
UsernameTotal PointsQuestion Answered*
$res['username'])) . '">' . htmlspecialchars($res['username']) . '' . number_format($res['points'],0) . '' . number_format($res['total'],0) . '
- paginate(); - ?> -
-
- -
-
-

* These stats do not include KAOS

-
-
- \ No newline at end of file diff --git a/Jeopardy/plugin.py b/Jeopardy/plugin.py deleted file mode 100644 index d5c2215..0000000 --- a/Jeopardy/plugin.py +++ /dev/null @@ -1,4291 +0,0 @@ -# -*- coding: utf-8 -*- -### -# Copyright (c) 2013, tann -# All rights reserved. -# -# -### - -import supybot.utils as utils -from supybot.commands import * -import supybot.plugins as plugins -import supybot.ircutils as ircutils -import supybot.callbacks as callbacks -import supybot.ircdb as ircdb -import supybot.ircmsgs as ircmsgs -import supybot.schedule as schedule -import supybot.log as log -import supybot.conf as conf -import os -import re -import sqlite3 -import random -import time -import datetime -import unicodedata -import hashlib -import requests -import re -from unidecode import unidecode - -#A list with items that are removed when timeout is reached, values must be unique -class TimeoutList: - """ - A dict wrapper used to store timeout values for unique usernames. - """ - def __init__(self, timeout): - self.timeout = timeout - self.dict = {} - - def setTimeout(self, timeout): - self.timeout = timeout - - def clearTimeout(self): - for k, t in list(self.dict.items()): - if t < (time.time() - self.timeout): - del self.dict[k] - - def append(self, key): - self.clearTimeout() - self.dict[key] = time.time() - - def has(self, key): - self.clearTimeout() - if key in self.dict: - return True - return False - - def getTimeLeft(self, key): - return self.timeout - (time.time() - self.dict[key]) - - -#Game instance -class Game: - """ - Main game logic, single game instance for each channel. - """ - def __init__(self, irc, channel, base): - # constants - self.unmaskedChars = " -'\"_=+&%$#@!~`()[]{}?.,<>|\\/:;" - - # get utilities from base plugin - self.base = base - self.games = base.games - self.storage = base.storage - self.registryValue = base.registryValue - self.channel = channel - self.irc = irc - self.network = irc.network - - # Initialize timeout lists - self.skipTimeoutList = TimeoutList(self.registryValue('skip.skipTime', channel)) - self.hintTimeoutList = TimeoutList(self.registryValue('hints.extraHintTime', channel)) - - # Initialize state variables - self.state = 'no-question' - self.stopPending = False - self.shownHint = False - self.questionRepeated = False - - # Initialize game properties - self.questionID = -1 - self.questionType = '' - self.question = '' - self.answers = [] - self.questionPoints = -1 - self.correctPlayers = {} - self.guessedAnswers = [] - self.skipList = [] - self.streak = 0 - self.lastWinner = '' - self.hintsCounter = 0 - self.numAsked = 0 - self.lastAnswer = time.time() - self.roundStartedAt = time.mktime(time.localtime()) - - # activate - self.loadGameState() - self.active = True - - # Remove any old event and start the next question - self.removeEvent() - self.nextQuestion() - - def checkAnswer(self, msg): - """ - Check users input to see if answer was given. - """ - channel = msg.args[0] - # is it a user? - username = self.base.getUsername(msg.nick, msg.prefix) - usernameCanonical = ircutils.toLower(username) - correctAnswerFound = False - correctAnswer = '' - - attempt = self.normalizeString(msg.args[1]).casefold() - - # Check for a correct answer that hasn't already been guessed - for ans in self.answers: - normalizedAns = self.normalizeString(ans).casefold() - if normalizedAns == attempt and normalizedAns not in self.guessedAnswers: - correctAnswerFound = True - correctAnswer = ans - - # Immediately return if not a correct answer - if not correctAnswerFound: - return - - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - - timeElapsed = float(time.time() - self.askedAt) - points = self.questionPoints - - # Add answer to list so we can cross it out - if self.guessedAnswers.count(attempt) == 0: - self.guessedAnswers.append(attempt) - - # Past first hint? deduct points - if self.hintsCounter > 1: - points /= 2 * (self.hintsCounter - 1) - - - self.state = 'post-question' - self.removeEvent() - streakBonus = 0 - minStreak = self.registryValue('general.minBreakStreak', channel) - # update streak info - if ircutils.toLower(self.lastWinner) != usernameCanonical: - #streakbreak - if self.streak > minStreak: - streakBonus = points * .05 - self.sendMessage('\x02%s\x02 broke \x02%s\x02\'s streak of \x02%d\x02!' % (username, self.lastWinner, self.streak)) - self.lastWinner = username - self.streak = 1 - else: - self.streak += 1 - streakBonus = points * .01 * (self.streak-1) - streakBonus = min(streakBonus, points * .5) - - # Update database - threadStorage.updateGameStreak(self.channel, self.lastWinner, self.streak) - threadStorage.updateUserHighestStreak(self.lastWinner, self.streak) - threadStorage.updateGameLongestStreak(self.channel, username, self.streak) - threadStorage.updateUserLog(username, self.channel, int(points + streakBonus), 1, timeElapsed) - threadStorage.updateQuestionStats(self.questionID, 1, 0) - - # Show congratulatory message - self.lastAnswer = time.time() - self.sendMessage('DING DING DING, \x02%s\x02 got the correct answer, \x02%s\x02, in \x02%0.4f\x02 seconds for \x02%d(+%d)\x02 points!' % (username, correctAnswer, timeElapsed, points, streakBonus)) - - if self.registryValue('general.showStats', self.channel): - if self.registryValue('general.globalStats'): - stat = threadStorage.getUserStat(username, None) - else: - stat = threadStorage.getUserStat(username, self.channel) - - if stat: - todaysScore = stat['points_day'] - weekScore = stat['points_week'] - monthScore = stat['points_month'] - recapMessageList = ['\x02%s\x02 has won \x02%d\x02 in a row!' % (username, self.streak)] - recapMessageList.append(' Total Points') - recapMessageList.append(' TODAY: \x02%d\x02' % (todaysScore)) - if weekScore > points: - recapMessageList.append(' this WEEK \x02%d\x02' % (weekScore)) - if weekScore > points or todaysScore > points: - if monthScore > points: - recapMessageList.append(' &') - if monthScore > points: - recapMessageList.append(' this MONTH: \x02%d\x02' % (monthScore)) - recapMessage = ''.join(recapMessageList) - self.sendMessage(recapMessage) - - if self.state == 'post-question': - # Check for any pending stops, otherwise queue next question - if self.stopPending == True: - self.stop() - else: - waitTime = self.registryValue('general.waitTime',self.channel) - if waitTime < 2: - waitTime = 2 - log.error('waitTime was set too low (<2 seconds). Setting to 2 seconds') - waitTime += time.time() - self.queueEvent(waitTime, self.nextQuestion) - self.state = 'no-question' - - def getHintString(self, hintNum=None): - if hintNum == None: - hintNum = self.hintsCounter - hintRatio = self.registryValue('hints.hintRatio') # % to show each hint - hint = '' - ratio = float(hintRatio * .01) - charMask = self.registryValue('hints.charMask', self.channel) - - # create a string with hints for all of the answers - if self.questionType == 'kaos': - for ans in self.answers: - if ircutils.toLower(ans) not in self.guessedAnswers: - ans = str(ans) - hintStr = '' - if hintNum == 0: - for char in ans: - if char in self.unmaskedChars: - hintStr += char - else: - hintStr += charMask - elif hintNum == 1: - divider = int(len(ans) * ratio) - divider = min(divider, 3) - divider = min(divider, len(ans)-1) - hintStr += ans[:divider] - masked = ans[divider:] - for char in masked: - if char in self.unmaskedChars: - hintStr += char - else: - hintStr += charMask - elif hintNum == 2: - divider = int(len(ans) * ratio) - divider = min(divider, 3) - divider = min(divider, len(ans)-1) - lettersInARow = divider-1 - maskedInARow = 0 - hintStr += ans[:divider] - ansend = ans[divider:] - hintsend = '' - unmasked = 0 - if self.registryValue('hints.vowelsHint', self.channel): - hintStr += self.getMaskedVowels(ansend, divider-1) - else: - hintStr += self.getMaskedRandom(ansend, divider-1) - hint += ' [{0}]'.format(hintStr) - else: - ans = str(self.answers[0]) - if hintNum == 0: - for char in ans: - if char in self.unmaskedChars: - hint += char - else: - hint += charMask - elif hintNum == 1: - divider = int(len(ans) * ratio) - divider = min(divider, 3) - divider = min(divider, len(ans)-1) - hint += ans[:divider] - masked = ans[divider:] - for char in masked: - if char in self.unmaskedChars: - hint += char - else: - hint += charMask - elif hintNum == 2: - divider = int(len(ans) * ratio) - divider = min(divider, 3) - divider = min(divider, len(ans)-1) - lettersInARow = divider-1 - maskedInARow = 0 - hint += ans[:divider] - ansend = ans[divider:] - hintsend = '' - unmasked = 0 - if self.registryValue('hints.vowelsHint', self.channel): - hint += self.getMaskedVowels(ansend, divider-1) - else: - hint += self.getMaskedRandom(ansend, divider-1) - - return hint.strip() - - def getMaskedVowels(self, letters, sizeOfUnmasked): - charMask = self.registryValue('hints.charMask', self.channel) - hintsList = [''] - unmasked = 0 - lettersInARow = sizeOfUnmasked - for char in letters: - if char in self.unmaskedChars: - hintsList.append(char) - elif str.lower(self.removeAccents(char)) in 'aeiou' and unmasked < (len(letters)-1) and lettersInARow < 3: - hintsList.append(char) - lettersInARow += 1 - unmasked += 1 - else: - hintsList.append(charMask) - lettersInARow = 0 - hints = ''.join(hintsList) - return hints - - def getMaskedRandom(self, letters, sizeOfUnmasked): - charMask = self.registryValue('hints.charMask', self.channel) - hintRatio = self.registryValue('hints.hintRatio') # % to show each hint - hints = '' - unmasked = 0 - maskedInARow = 0 - lettersInARow = sizeOfUnmasked - for char in letters: - if char in self.unmaskedChars: - hints += char - unmasked += 1 - elif maskedInARow > 2 and unmasked < (len(letters)-1): - lettersInARow += 1 - unmasked += 1 - maskedInARow = 0 - hints += char - elif lettersInARow < 3 and unmasked < (len(letters)-1) and random.randint(0,100) < hintRatio: - lettersInARow += 1 - unmasked += 1 - maskedInARow = 0 - hints += char - else: - maskedInARow += 1 - lettersInARow=0 - hints += charMask - return hints - - def getExtraHintString(self): - charMask = self.registryValue('hints.charMask', self.channel) - ans = self.answers[0] - hints = ' Extra Hint: \x02\x0312' - divider = 0 - - if len(ans) < 2: - divider = 0 - elif self.hintsCounter == 1: - divider = 1 - elif self.hintsCounter == 2: - divider = min(int((len(ans) * .25) + 1), 4) - elif self.hintsCounter == 3: - divider = min(int((len(ans) * .5) + 1), 6) - - if divider == len(ans): - divider -= 1 - - if divider > 0: - hints += ans[:divider] - - return hints - - def getExtraHint(self): - if self.shownHint == False: - self.shownHint = True - self.sendMessage(self.getExtraHintString()) - - def getRemainingKAOS(self): - if self.shownHint == False: - self.shownHint = True - self.sendMessage('\x02\x0312%s' % (self.getHintString(self.hintsCounter-1))) - - def loadGameState(self): - gameInfo = self.storage.getGame(self.channel) - if gameInfo is not None: - self.numAsked = gameInfo['num_asked'] - self.roundStartedAt = gameInfo['round_started'] - self.lastWinner = gameInfo['last_winner'] - self.streak = int(gameInfo['streak']) - - def loopEvent(self): - """ - Main game/question/hint loop called by event. Decides whether question or hint is needed. - """ - # out of hints to give? - if self.hintsCounter >= 3: - self.state = 'post-question' - - if self.questionType == 'kaos': - # Create a string to show answers missed - missedAnswers = '' - for ans in self.answers: - if ircutils.toLower(ans) not in self.guessedAnswers: - missedAnswers += ' [{0}]'.format(ans) - self.sendMessage( """Time's up! No one got \x02%s\x02""" % missedAnswers.strip()) - self.sendMessage("""Correctly Answered: \x02%d\x02 of \x02%d\x02 Total Awarded: \x02%d\x02 Points to \x02%d\x02 Players""" - % (len(self.guessedAnswers), len(self.answers), int(self.totalAmountWon), len(self.correctPlayers)) - ) - else: - self.sendMessage( """Time's up! The answer was \x02%s\x02.""" % self.answers[0]) - - self.storage.updateQuestionStats(self.questionID, 0, 1) - - # Check for any pending stops, otherwise queue next question - if self.stopPending == True: - self.stop() - else: - waitTime = self.registryValue('general.waitTime', self.channel) - if waitTime < 2: - waitTime = 2 - log.error('waitTime was set too low (<2 seconds). Setting to 2 seconds') - waitTime += time.time() - self.queueEvent(waitTime, self.nextQuestion) - self.state = 'no-question' - else: - # Give out next hint and queue this event again - self.showHint() - if self.questionType == 'kaos': - hintTime = self.registryValue('kaos.hintKAOS', self.channel) - else: - hintTime = self.registryValue('questions.hintTime', self.channel) - - if hintTime < 2: - hintTime = 2 - log.error('hintTime was set too low (<2 seconds). Setting to 2 seconds.') - - hintTime += time.time() - self.queueEvent(hintTime, self.loopEvent) - - def showHint(self): - """ - Max hints have not been reached, and no answer is found, need more hints - """ - hints = self.getHintString(self.hintsCounter) - self.hintsCounter += 1 #increment hints counter - self.shownHint = False #reset hint shown - self.sendMessage(' Hint %s: \x02\x0312%s' % (self.hintsCounter, hints), 1, 9) - - def nextQuestion(self): - """ - Time for a new question - """ - inactivityTime = self.registryValue('general.timeout') - if self.lastAnswer < time.time() - inactivityTime: - self.sendMessage('Stopping due to inactivity') - self.stop() - return - elif self.stopPending == True: - self.stop() - return - - # Reset and increment question properties - self.state = 'pre-question' - del self.skipList[:] - del self.guessedAnswers[:] - self.totalAmountWon = 0 - self.correctPlayers.clear() - self.hintsCounter = 0 - self.numAsked += 1 - - # grab the next question - numQuestion = self.storage.getNumQuestions() - if numQuestion == 0: - self.sendMessage('There are no questions. Stopping. If you are an admin, use the addfile command to add questions to the database.') - self.stop() - return - - # Check if we've asked all questions - numQuestionsLeftInRound = self.storage.getNumQuestionsNotAsked(self.channel, self.roundStartedAt) - if numQuestionsLeftInRound == 0: - self.numAsked = 1 - self.roundStartedAt = time.mktime(time.localtime()) - self.storage.updateGameRoundStarted(self.channel, self.roundStartedAt) - self.sendMessage('All of the questions have been asked, shuffling and starting over') - - # Update DB with new round number - self.storage.updateGame(self.channel, self.numAsked) - - # Retrieve new question from DB - retrievedQuestion = self.retrieveQuestion() - self.questionID = retrievedQuestion['id'] - self.questionType = retrievedQuestion['type'] - self.question = retrievedQuestion['question'] - self.answers = retrievedQuestion['answers'] - self.questionPoints = retrievedQuestion['points'] - - # Store the question and round number so it can be reported - self.storage.insertGameLog(self.channel, self.numAsked, self.questionID, self.question) - - # Send question to channel - self.sendQuestion() - - # Set state variables after question has been sent - self.state = 'in-question' - self.questionRepeated = False - self.shownHint = False - self.askedAt = time.time() - - # Start hint loop - self.loopEvent() - - def normalizeString(self, s): - return str.lower(self.removeExtraSpaces(self.removeAccents(s))) - - def queueEvent(self, time, event): - """ - Schedules a new event. - """ - # Schedule a new event to happen at the specified time - if self.active: - try: - schedule.addEvent(event, time, '%s.trivia' % self.channel) - except AssertionError as e: - log.error('Unable to queue {0} because another event is already scheduled.'.format(event.__name__)) - - def removeAccents(self, text): - text = str(text) - normalized = unicodedata.normalize('NFKD', text) - normalized = ''.join([c for c in normalized if not unicodedata.combining(c)]) - return normalized - - def removeExtraSpaces(self, text): - return utils.str.normalizeWhitespace(text) - - def repeatQuestion(self): - if self.questionRepeated == False: - self.questionRepeated = True - self.sendQuestion() - - def removeEvent(self): - """ - Remove/cancel trivia timer event - """ - # try and remove the current timer and thread, if we fail just carry on - try: - schedule.removeEvent('%s.trivia' % self.channel) - except KeyError: - pass - - def retrieveQuestion(self): - # Retrieve and parse question data from database - rawData = requests.get("http://jservice.io/api/random").json() - rawQuestion = rawData[0]['question'] - #netTimesAnswered = rawData['num_answered'] - rawData['num_missed'] - airdate = rawData[0]['airdate'].split('T') - answers = [] - questionType = 'regular' - answers.append(re.sub('<[^<]+?>', '', unidecode(rawData[0]['answer'])).replace('\\', '').strip()) - points = float(500) - if rawData[0]['value']: - points = float(rawData[0]['value']) - question = "({0}) [${1}] {2}: {3}".format(airdate[0], int(points), rawData[0]['category']['title'].title(), re.sub('<[^<]+?>', '', rawData[0]['question']).replace('\\', '')) - # Calculate additional points - #addPoints = -5 * netTimesAnswered - #addPoints = min(addPoints, 200) - #addPoints = max(addPoints, -200) - return {'id': rawData[0]['id'], - 'type': questionType, - 'points': points, - 'question': question, - 'answers': answers - } - log.info('Question #%d is invalid.' % rawData['id']) - # TODO report bad question - - # default question, everything went wrong with grabbing question - return {'id': rawData['id'], - 'type': 'kaos', - 'points': 10050, - 'question': 'KAOS: The 10 Worst U.S. Presidents (Last Name Only)? (This is a panic question, if you see this report this question. it is malformed.)', - 'answers': ['Bush', 'Nixon', 'Hoover', 'Grant', 'Johnson', 'Ford', 'Reagan', 'Coolidge', 'Pierce'] - } - - def sendMessage(self, msg, color=None, bgcolor=None): - """ , [], [] - helper for game instance to send messages to channel - """ - # no color - self.irc.sendMsg(ircmsgs.privmsg(self.channel, '%s' % msg)) - - def sendQuestion(self): - question = self.question - if question[-1:] != '?': - question += '?' - - # bold the q, add color - questionText = '\x02\x0303%s' % (question) - - # KAOS? report # of answers - if self.questionType == 'kaos': - questionText += ' %d possible answers' % (len(self.answers)) - - questionMessageString = ' %s: %s' % (self.numAsked, questionText) - maxLength = 400 - questionMesagePieces = [questionMessageString[i:i+maxLength] for i in range(0, len(questionMessageString), maxLength)] - multipleMessages=False - - for msgPiece in questionMesagePieces: - if multipleMessages: - msgPiece = '\x02\x0303%s' % (msgPiece) - multipleMessages = True - self.sendMessage(msgPiece, 1, 9) - - def stop(self): - """ - Stop a game in progress - """ - # responsible for stopping a timer/thread after being told to stop - self.active = False - self.stopPending = False - self.removeEvent() - self.sendMessage('Trivia stopped. :\'(') - channelCanonical = ircutils.toLower(self.channel) - if self.network in self.games: - if channelCanonical in self.games[self.network]: - del self.games[self.network][channelCanonical] - - -#Storage for users and points using sqlite3 -class Storage: - """ - Storage class - """ - def __init__(self,loc): - self.loc = loc - self.conn = sqlite3.connect(loc, check_same_thread=False) # dont check threads - # otherwise errors - self.conn.text_factory = str - self.conn.row_factory = sqlite3.Row - - def chunk(self, qs, rows=10000): - """ Divides the data into 10000 rows each """ - for i in range(0, len(qs), rows): - yield qs[i:i+rows] - - def countTemporaryQuestions(self, channel=None): - c = self.conn.cursor() - if channel is None: - c.execute('''SELECT COUNT(*) - FROM triviatemporaryquestion''') - else: - c.execute('''SELECT COUNT(*) - FROM triviatemporaryquestion - WHERE channel_canonical=?''', - (ircutils.toLower(channel),)) - row = c.fetchone() - c.close() - return row[0] - - def countDeletes(self, channel=None): - c = self.conn.cursor() - if channel is None: - c.execute('''SELECT COUNT(*) - FROM triviadelete''') - else: - c.execute('''SELECT COUNT(*) - FROM triviadelete - WHERE channel_canonical=?''', - (ircutils.toLower(channel),)) - row = c.fetchone() - c.close() - return row[0] - - def countEdits(self, channel=None): - c = self.conn.cursor() - if channel is None: - c.execute('''SELECT COUNT(*) - FROM triviaedit''') - else: - c.execute('''SELECT COUNT(*) - FROM triviaedit - WHERE channel_canonical=?''', - (ircutils.toLower(channel),)) - row = c.fetchone() - c.close() - return row[0] - - def countNotMyEdits(self, username, channel=None): - c = self.conn.cursor() - if channel is None: - c.execute('''SELECT COUNT(*) - FROM triviaedit - WHERE username<>?''', - (username,)) - else: - c.execute('''SELECT COUNT(*) - FROM triviaedit - WHERE username<>? - AND channel_canonical=?''', - (username, - ircutils.toLower(channel),)) - row = c.fetchone() - c.close() - return row[0] - - def countMyEdits(self, username, channel=None): - c = self.conn.cursor() - if channel is None: - c.execute('''SELECT COUNT(*) - FROM triviaedit - WHERE username=?''', - (username,)) - else: - c.execute('''SELECT COUNT(*) - FROM triviaedit - WHERE username=? - AND channel_canonical=?''', - (username, - ircutils.toLower(channel),)) - row = c.fetchone() - c.close() - return row[0] - - def countReports(self, channel=None): - c = self.conn.cursor() - if channel is None: - c.execute('''SELECT COUNT(*) - FROM triviareport''') - else: - c.execute('''SELECT COUNT(*) - FROM triviareport - WHERE channel_canonical=?''', - (ircutils.toLower(channel),)) - row = c.fetchone() - c.close() - return row[0] - - def deleteQuestion(self, questionId): - c = self.conn.cursor() - test = c.execute('''UPDATE triviaquestion - SET deleted=1 - WHERE id=?''', - (questionId,)) - self.conn.commit() - c.close() - - def dropActivityTable(self): - c = self.conn.cursor() - try: - c.execute('''DROP TABLE triviaactivity''') - except: - pass - c.close() - - def dropDeleteTable(self): - c = self.conn.cursor() - try: - c.execute('''DROP TABLE triviadelete''') - except: - pass - c.close() - - def dropUserTable(self): - c = self.conn.cursor() - try: - c.execute('''DROP TABLE triviausers''') - except: - pass - c.close() - - def dropLoginTable(self): - c = self.conn.cursor() - try: - c.execute('''DROP TABLE trivialogin''') - except: - pass - c.close() - - def dropUserLogTable(self): - c = self.conn.cursor() - try: - c.execute('''DROP TABLE triviauserlog''') - except: - pass - c.close() - - def dropGameTable(self): - c = self.conn.cursor() - try: - c.execute('''DROP table triviagames''') - except: - pass - c.close() - - def dropGameLogTable(self): - c = self.conn.cursor() - try: - c.execute('''DROP TABLE triviagameslog''') - c.execute('''DROP INDEX gamelograndomindex''') - except: - pass - c.close() - - def dropReportTable(self): - c = self.conn.cursor() - try: - c.execute('''DROP TABLE triviareport''') - except: - pass - c.close() - - def dropQuestionTable(self): - c = self.conn.cursor() - try: - c.execute('''DROP TABLE triviaquestion''') - c.execute('''DROP INDEX questionrandomindex''') - except: - pass - c.close() - - def dropTemporaryQuestionTable(self): - c = self.conn.cursor() - try: - c.execute('''DROP TABLE triviatemporaryquestion''') - except: - pass - c.close() - - def dropEditTable(self): - c = self.conn.cursor() - try: - c.execute('''DROP TABLE triviaedit''') - except: - pass - c.close() - - def dropLevelTable(self): - c = self.conn.cursor() - try: - c.execute('''DROP TABLE trivialevel''') - except: - pass - c.close() - - def getRandomQuestionNotAsked(self, channel, roundStart): - c = self.conn.cursor() - c.execute('''SELECT * - FROM triviaquestion - WHERE deleted=0 AND - id NOT IN - (SELECT tl.line_num - FROM triviagameslog tl - WHERE tl.channel_canonical=? AND - tl.asked_at>=?) - ORDER BY random() LIMIT 1''', - (ircutils.toLower(channel),roundStart)) - row = c.fetchone() - c.close() - return row - - def getQuestionById(self, id): - c = self.conn.cursor() - c.execute('''SELECT * - FROM triviaquestion - WHERE id=? LIMIT 1''', - (id,)) - row = c.fetchone() - c.close() - return row - - def getQuestionByRound(self, roundNumber, channel): - channel=ircutils.toLower(channel) - c = self.conn.cursor() - c.execute('''SELECT * - FROM triviaquestion - WHERE id=(SELECT tgl.line_num - FROM triviagameslog tgl - WHERE tgl.round_num=? AND - tgl.channel_canonical=? - ORDER BY id DESC LIMIT 1)''', - (roundNumber,channel)) - row = c.fetchone() - c.close() - return row - - def getNumQuestionsNotAsked(self, channel, roundStart): - c = self.conn.cursor() - c.execute('''SELECT count(id) - FROM triviaquestion - WHERE deleted=0 AND - id NOT IN - (SELECT tl.line_num - FROM triviagameslog tl - WHERE tl.channel=? AND - tl.asked_at>=?)''', - (channel,roundStart)) - row = c.fetchone() - c.close() - return row[0] - - def getUserRank(self, username, channel): - usernameCanonical = ircutils.toLower(username) - channelCanonical = None - if channel is not None: - channelCanonical = ircutils.toLower(channel) - dateObject = datetime.date.today() - day = dateObject.day - month = dateObject.month - year = dateObject.year - data = {} - - # Retrieve total rank - query = '''SELECT tr.rank - FROM (SELECT COUNT(tu2.id)+1 AS rank - FROM (SELECT id, - username, - sum(points_made) AS totalscore - FROM triviauserlog''' - arguments = [] - - if channel is not None: - query = '''%s WHERE channel_canonical=?''' % (query) - arguments.append(channelCanonical) - - query = '''%s GROUP BY username_canonical) AS tu2 - WHERE tu2.totalscore > ( - SELECT SUM(points_made) - FROM triviauserlog - WHERE username_canonical=?''' % (query) - arguments.append(usernameCanonical) - - if channel is not None: - query = '''%s AND channel_canonical=?''' % (query) - arguments.append(channelCanonical) - - query = '''%s )) AS tr - WHERE EXISTS( - SELECT * - FROM triviauserlog - WHERE username_canonical=?''' % (query) - arguments.append(usernameCanonical) - - if channel is not None: - query = '''%s AND channel_canonical=?''' % (query) - arguments.append(channelCanonical) - - query = '''%s ) LIMIT 1''' % (query) - - c = self.conn.cursor() - c.execute(query, tuple(arguments)) - row = c.fetchone() - data['total'] = row[0] if row else 0 - - # Retrieve year rank - query = '''SELECT tr.rank - FROM (SELECT COUNT(tu2.id)+1 AS rank - FROM (SELECT id, - username, - SUM(points_made) AS totalscore - FROM triviauserlog - WHERE year=?''' - arguments = [year] - - if channel is not None: - query = '''%s AND channel_canonical=?''' % (query) - arguments.append(channelCanonical) - - query = '''%s GROUP BY username_canonical) AS tu2 - WHERE tu2.totalscore > ( - SELECT sum(points_made) - FROM triviauserlog - WHERE year=? AND - username_canonical=?''' % (query) - arguments.append(year) - arguments.append(usernameCanonical) - - if channel is not None: - query = '''%s AND channel_canonical=?''' % (query) - arguments.append(channelCanonical) - - query = '''%s )) AS tr - WHERE EXISTS( - SELECT * - FROM triviauserlog - WHERE year=? AND - username_canonical=?''' % (query) - arguments.append(year) - arguments.append(usernameCanonical) - - if channel is not None: - query = '''%s AND channel_canonical=?''' % (query) - arguments.append(channelCanonical) - - query = '''%s ) LIMIT 1''' % (query) - - c.execute(query, tuple(arguments)) - row = c.fetchone() - data['year'] = row[0] if row else 0 - - # Retrieve month rank - query = '''SELECT tr.rank - FROM (SELECT COUNT(tu2.id)+1 AS rank - FROM (SELECT id, - username, - SUM(points_made) AS totalscore - FROM triviauserlog - WHERE month=? AND - year=?''' - arguments = [month, year] - - if channel is not None: - query = '''%s AND channel_canonical=?''' % (query) - arguments.append(channelCanonical) - - query = '''%s GROUP BY username_canonical) AS tu2 - WHERE tu2.totalscore > ( - SELECT SUM(points_made) - FROM triviauserlog - WHERE month=? AND - year=? AND - username_canonical=?''' % (query) - arguments.append(month) - arguments.append(year) - arguments.append(usernameCanonical) - - if channel is not None: - query = '''%s AND channel_canonical=?''' % (query) - arguments.append(channelCanonical) - - query = '''%s )) AS tr - WHERE EXISTS( - SELECT * - FROM triviauserlog - WHERE month=? AND - year=? AND - username_canonical=?''' % (query) - arguments.append(month) - arguments.append(year) - arguments.append(usernameCanonical) - - if channel is not None: - query = '''%s AND channel_canonical=?''' % (query) - arguments.append(channelCanonical) - - query = '''%s ) LIMIT 1''' % (query) - - c.execute(query, tuple(arguments)) - row = c.fetchone() - data['month'] = row[0] if row else 0 - - # Retrieve week rank - weekSqlClause = '' - d = datetime.date.today() - weekday=d.weekday() - d -= datetime.timedelta(weekday) - for i in range(7): - if i > 0: - weekSqlClause += ' or ' - weekSqlClause += '''(year=%d AND - month=%d AND - day=%d)''' % (d.year, d.month, d.day) - d += datetime.timedelta(1) - - weekSql = '''SELECT tr.rank - FROM (SELECT count(tu2.id)+1 AS rank - FROM (SELECT id, - username, - SUM(points_made) AS totalscore - FROM triviauserlog - WHERE (''' - weekSql += weekSqlClause - weekSql +=''')''' - arguments = [] - - if channel is not None: - weekSql = '''%s AND channel_canonical=?''' % (weekSql) - arguments.append(channelCanonical) - - weekSql += '''GROUP BY username_canonical) AS tu2 - WHERE tu2.totalscore > ( - SELECT SUM(points_made) - FROM triviauserlog - WHERE username_canonical=?''' - arguments.append(usernameCanonical) - - if channel is not None: - weekSql = '''%s AND channel_canonical=?''' % (weekSql) - arguments.append(channelCanonical) - - weekSql += ''' AND (''' - weekSql += weekSqlClause - weekSql += '''))) AS tr - WHERE EXISTS( - SELECT * - FROM triviauserlog - WHERE username_canonical=?''' - arguments.append(usernameCanonical) - - if channel is not None: - weekSql = '''%s AND channel_canonical=?''' % (weekSql) - arguments.append(channelCanonical) - - weekSql += ''' AND (''' - weekSql += weekSqlClause - weekSql += ''')) LIMIT 1''' - - c.execute(weekSql, tuple(arguments)) - row = c.fetchone() - data['week'] = row[0] if row else 0 - - # Retrieve day rank - query = '''SELECT tr.rank - FROM (SELECT COUNT(tu2.id)+1 AS rank - FROM (SELECT id, - username, - SUM(points_made) AS totalscore - FROM triviauserlog - WHERE day=? AND - month=? AND - year=?''' - arguments = [day, month, year] - - if channel is not None: - query = '''%s AND channel_canonical=?''' % (query) - arguments.append(channelCanonical) - - query = '''%s GROUP BY username_canonical) AS tu2 - WHERE tu2.totalscore > ( - SELECT SUM(points_made) - FROM triviauserlog - WHERE day=? AND - month=? AND - year=? AND - username_canonical=?''' % (query) - arguments.append(day) - arguments.append(month) - arguments.append(year) - arguments.append(usernameCanonical) - - if channel is not None: - query = '''%s and channel_canonical=?''' % (query) - arguments.append(channelCanonical) - - query = '''%s )) AS tr - WHERE EXISTS( - SELECT * - FROM triviauserlog - WHERE day=? AND - month=? AND - year=? AND - username_canonical=?''' % (query) - arguments.append(day) - arguments.append(month) - arguments.append(year) - arguments.append(usernameCanonical) - - if channel is not None: - query = '''%s AND channel_canonical=?''' % (query) - arguments.append(channelCanonical) - - query = '''%s ) LIMIT 1''' % (query) - - c.execute(query, tuple(arguments)) - row = c.fetchone() - data['day'] = row[0] if row else 0 - - c.close() - return data - - def getUserStat(self, username, channel): - usernameCanonical = ircutils.toLower(username) - channelCanonical = None - if channel is not None: - channelCanonical = ircutils.toLower(channel) - dateObject = datetime.date.today() - day = dateObject.day - month = dateObject.month - year = dateObject.year - - c = self.conn.cursor() - - data = {} - data['username'] = username - data['username_canonical'] = usernameCanonical - - # Retrieve total points and answered - query = '''SELECT SUM(tl.points_made) AS points, - SUM(tl.num_answered) AS answered - FROM triviauserlog tl - WHERE tl.username_canonical=?''' - arguments = [usernameCanonical] - - if channel is not None: - query = '''%s AND tl.channel_canonical=?''' % (query) - arguments.append(channelCanonical) - - query = '''%s LIMIT 1''' % (query) - - c.execute(query, tuple(arguments)) - row = c.fetchone() - if row: - data['points_total'] = row[0] - data['answer_total'] = row[1] - - # Retrieve year points and answered - query = '''SELECT SUM(tl.points_made) AS yearPoints, - SUM(tl.num_answered) AS yearAnswered - FROM triviauserlog tl - WHERE tl.username_canonical=? AND - tl.year=?''' - arguments = [usernameCanonical, year] - - if channel is not None: - query = '''%s AND tl.channel_canonical=?''' % (query) - arguments.append(channelCanonical) - - query = '''%s LIMIT 1''' % (query) - - c.execute(query, tuple(arguments)) - row = c.fetchone() - if row: - data['points_year'] = row[0] - data['answer_year'] = row[1] - - # Retrieve month points and answered - query = '''SELECT SUM(tl.points_made) AS yearPoints, - SUM(tl.num_answered) AS yearAnswered - FROM triviauserlog tl - WHERE tl.username_canonical=? AND - tl.year=? AND - tl.month=?''' - arguments = [usernameCanonical, year, month] - - if channel is not None: - query = '''%s AND tl.channel_canonical=?''' % (query) - arguments.append(channelCanonical) - - query = '''%s LIMIT 1''' % (query) - - c.execute(query, tuple(arguments)) - row = c.fetchone() - if row: - data['points_month'] = row[0] - data['answer_month'] = row[1] - - # Retrieve week points and answered - query = '''SELECT SUM(tl.points_made) AS yearPoints, - SUM(tl.num_answered) AS yearAnswered - FROM triviauserlog tl - WHERE tl.username_canonical=? AND (''' - - d = datetime.date.today() - weekday=d.weekday() - d -= datetime.timedelta(weekday) - for i in range(7): - if i > 0: - query += ' or ' - query += ''' - (tl.year=%d - AND tl.month=%d - AND tl.day=%d)''' % (d.year, d.month, d.day) - d += datetime.timedelta(1) - - query += ')' - arguments = [usernameCanonical] - - if channel is not None: - query = '''%s AND tl.channel_canonical=?''' % (query) - arguments.append(channelCanonical) - - query = '''%s LIMIT 1''' % (query) - - c.execute(query, tuple(arguments)) - row = c.fetchone() - if row: - data['points_week'] = row[0] - data['answer_week'] = row[1] - - # Retrieve day points and answered - query = '''SELECT SUM(tl.points_made) AS yearPoints, - SUM(tl.num_answered) AS yearAnswered - FROM triviauserlog tl - WHERE tl.username_canonical=? AND - tl.year=? AND - tl.month=? AND - tl.day=?''' - arguments = [usernameCanonical, year, month, day] - - if channel is not None: - query = '''%s AND tl.channel_canonical=?''' % (query) - arguments.append(channelCanonical) - - query = '''%s LIMIT 1''' % (query) - - c.execute(query, tuple(arguments)) - row = c.fetchone() - if row: - data['points_day'] = row[0] - data['answer_day'] = row[1] - - c.close() - return data - - def getUserLevel(self, username, channel): - usernameCanonical = ircutils.toLower(username) - channelCanonical = ircutils.toLower(channel) - - c = self.conn.cursor() - c.execute('''SELECT level - FROM trivialevel - WHERE username_canonical=? AND - channel_canonical=?''', - (username_canonical, channel_canonical)) - row = c.fetchone() - c.close() - return row[0] - - def getGame(self, channel): - channel = ircutils.toLower(channel) - c = self.conn.cursor() - c.execute('''SELECT * - FROM triviagames - WHERE channel_canonical=? - LIMIT 1''', - (channel,)) - row = c.fetchone() - c.close() - return row - - def getNumUser(self, channel): - channelCanonical = ircutils.toLower(channel) - c = self.conn.cursor() - c.execute('''SELECT COUNT(DISTINCT(username_canonical)) - FROM triviauserlog - WHERE channel_canonical=?''', - (channelCanonical,)) - row = c.fetchone() - c.close() - return row[0] - - def getNumQuestions(self): - c = self.conn.cursor() - c.execute('''SELECT COUNT(*) - FROM triviaquestion - WHERE deleted=0''') - row = c.fetchone() - c.close() - return row[0] - - def getNumKAOS(self): - c = self.conn.cursor() - c.execute('''SELECT COUNT(*) - FROM triviaquestion - WHERE lower(substr(question,1,4))=?''', - ('kaos',)) - row = c.fetchone() - c.close() - return row[0] - - def getNumActiveThisWeek(self, channel): - channelCanonical = ircutils.toLower(channel) - d = datetime.date.today() - weekday=d.weekday() - d -= datetime.timedelta(weekday) - weekSqlString = '' - for i in range(7): - if i > 0: - weekSqlString += ' or ' - weekSqlString += ''' - (tl.year=%d - AND tl.month=%d - AND tl.day=%d)''' % (d.year, d.month, d.day) - d += datetime.timedelta(1) - c = self.conn.cursor() - weekSql = '''SELECT COUNT(DISTINCT(tl.username_canonical)) - FROM triviauserlog tl - WHERE channel_canonical=? AND (''' - weekSql += weekSqlString - weekSql += ''')''' - c.execute(weekSql, (channelCanonical,)) - row = c.fetchone() - c.close() - return row[0] - - def getDeleteById(self, id, channel=None): - c = self.conn.cursor() - if channel is None: - c.execute('''SELECT * - FROM triviadelete - WHERE id=? LIMIT 1''', - (id,)) - else: - c.execute('''SELECT * - FROM triviadelete - WHERE id=? AND - channel_canonical=? - LIMIT 1''', - (id, ircutils.toLower(channel))) - row = c.fetchone() - c.close() - return row - - def getDeleteTop3(self, page=1, amount=3, channel=None): - if page < 1: - page=1 - if amount < 1: - amount=3 - page -= 1 - start = page * amount - c = self.conn.cursor() - if channel is None: - c.execute('''SELECT * - FROM triviadelete - ORDER BY id ASC LIMIT ?, ?''', - (start, amount)) - else: - c.execute('''SELECT * - FROM triviadelete - WHERE channel_canonical=? - ORDER BY id ASC LIMIT ?, ?''', - (ircutils.toLower(channel), start, amount)) - rows = c.fetchall() - c.close() - return rows - - def getReportById(self, id, channel=None): - c = self.conn.cursor() - if channel is None: - c.execute('''SELECT * - FROM triviareport - WHERE id=? LIMIT 1''', - (id,)) - else: - c.execute('''SELECT * - FROM triviareport - WHERE id=? AND - channel_canonical=? - LIMIT 1''', - (id, ircutils.toLower(channel))) - row = c.fetchone() - c.close() - return row - - def getReportTop3(self, page=1, amount=3, channel=None): - if page < 1: - page=1 - if amount < 1: - amount=3 - page -= 1 - start = page * amount - c = self.conn.cursor() - if channel is None: - c.execute('''SELECT * - FROM triviareport - ORDER BY id ASC LIMIT ?, ?''', - (start, amount)) - else: - c.execute('''SELECT * - FROM triviareport - WHERE channel_canonical=? - ORDER BY id ASC LIMIT ?, ?''', - (ircutils.toLower(channel), start, amount)) - rows = c.fetchall() - c.close() - return rows - - def getTemporaryQuestionTop3(self, page=1, amount=3, channel=None): - if page < 1: - page=1 - if amount < 1: - amount=3 - page -= 1 - start = page * amount - c = self.conn.cursor() - if channel is None: - c.execute('''SELECT * - FROM triviatemporaryquestion - ORDER BY id ASC LIMIT ?, ?''', - (start, amount)) - else: - c.execute('''SELECT * - FROM triviatemporaryquestion - WHERE channel_canonical=? - ORDER BY id ASC LIMIT ?, ?''', - (ircutils.toLower(channel), start, amount)) - rows = c.fetchall() - c.close() - return rows - - def getTemporaryQuestionById(self, id, channel=None): - c = self.conn.cursor() - if channel is None: - c.execute('''SELECT * - FROM triviatemporaryquestion - WHERE id=? - LIMIT 1''', - (id,)) - else: - c.execute('''SELECT * - FROM triviatemporaryquestion - WHERE id=? AND - channel_canonical=? - LIMIT 1''', - (id, ircutils.toLower(channel))) - row = c.fetchone() - c.close() - return row - - def getEditTop3(self, page=1, amount=3, channel=None): - if page < 1: - page = 1 - if amount < 1: - amount = 3 - page -= 1 - start = page * amount - c = self.conn.cursor() - if channel is None: - c.execute('''SELECT * - FROM triviaedit - ORDER BY id ASC LIMIT ?, ?''', - (start, amount)) - else: - c.execute('''SELECT * - FROM triviaedit - WHERE channel_canonical=? - ORDER BY id ASC LIMIT ?, ?''', - (ircutils.toLower(channel), start, amount)) - rows = c.fetchall() - c.close() - return rows - - def getNotMyEditTop3(self, username, page=1, amount=3, channel=None): - if page < 1: - page = 1 - if amount < 1: - amount = 3 - page -= 1 - start = page * amount - c = self.conn.cursor() - if channel is None: - c.execute('''SELECT * - FROM triviaedit - WHERE username<>? - ORDER BY id ASC LIMIT ?, ?''', - (username, start, amount)) - else: - c.execute('''SELECT * - FROM triviaedit - WHERE username<>? - AND channel_canonical=? - ORDER BY id ASC LIMIT ?, ?''', - (username, ircutils.toLower(channel), start, amount)) - rows = c.fetchall() - c.close() - return rows - - def getMyEditTop3(self, username, page=1, amount=3, channel=None): - if page < 1: - page = 1 - if amount < 1: - amount = 3 - page -= 1 - start = page * amount - c = self.conn.cursor() - if channel is None: - c.execute('''SELECT * - FROM triviaedit - WHERE username=? - ORDER BY id ASC LIMIT ?, ?''', - (username, start, amount)) - else: - c.execute('''SELECT * - FROM triviaedit - WHERE username=? - AND channel_canonical=? - ORDER BY id ASC LIMIT ?, ?''', - (username, ircutils.toLower(channel), start, amount)) - rows = c.fetchall() - c.close() - return rows - - def getEditById(self, id, channel=None): - c = self.conn.cursor() - if channel is None: - c.execute('''SELECT * - FROM triviaedit - WHERE id=? - LIMIT 1''', - (id,)) - else: - c.execute('''SELECT * - FROM triviaedit - WHERE id=? AND - channel_canonical=? - LIMIT 1''', - (id, ircutils.toLower(channel))) - row = c.fetchone() - c.close() - return row - - def getNumUserActiveIn(self, channel, timeSeconds): - channelCanonical = ircutils.toLower(channel) - epoch = int(time.mktime(time.localtime())) - dateObject = datetime.date.today() - day = dateObject.day - month = dateObject.month - year = dateObject.year - c = self.conn.cursor() - c.execute('''SELECT COUNT(*) - FROM triviauserlog - WHERE day=? AND - month=? AND - year=? AND - channel_canonical=? AND - last_updated>?''', - (day, month, year, channelCanonical, (epoch-timeSeconds))) - row = c.fetchone() - c.close() - return row[0] - - def getVersion(self): - c = self.conn.cursor(); - try: - c.execute('''SELECT version - FROM triviainfo''') - return c.fetchone() - except: - pass - - def gameExists(self, channel): - channel = ircutils.toLower(channel) - c = self.conn.cursor() - c.execute('''SELECT COUNT(id) - FROM triviagames - WHERE channel_canonical=?''', - (channel,)) - row = c.fetchone() - c.close() - return row[0] > 0 - - def loginExists(self, username): - usernameCanonical = ircutils.toLower(username) - c = self.conn.cursor() - c.execute('''SELECT COUNT(id) - FROM trivialogin - WHERE username_canonical=?''', - (usernameCanonical,)) - row = c.fetchone() - c.close() - return row[0] > 0 - - def insertActivity(self, aType, activity, channel, network, timestamp=None): - if timestamp is None: - timestamp = int(time.mktime(time.localtime())) - channelCanonical = ircutils.toLower(channel) - c = self.conn.cursor() - c.execute('''INSERT INTO triviaactivity - VALUES (NULL, ?, ?, ?, ?, ?, ?)''', - (aType, activity, channel, channelCanonical, network, - timestamp)) - self.conn.commit() - - def insertDelete(self, username, channel, lineNumber, reason): - usernameCanonical = ircutils.toLower(username) - channelCanonical = ircutils.toLower(channel) - c = self.conn.cursor() - c.execute('''INSERT INTO triviadelete - VALUES (NULL, ?, ?, ?, ?, ?, ?)''', - (username, usernameCanonical, lineNumber, channel, - channelCanonical, reason)) - self.conn.commit() - - def insertLogin(self, username, salt, isHashed, password, capability): - usernameCanonical = ircutils.toLower(username) - if self.loginExists(username): - return self.updateLogin(username, salt, isHashed, password, capability) - if not isHashed: - isHashed = 0 - else: - isHashed = 1 - c = self.conn.cursor() - c.execute('''INSERT INTO trivialogin - VALUES (NULL, ?, ?, ?, ?, ?, ?)''', - (username, usernameCanonical, salt, isHashed, - password, capability)) - self.conn.commit() - - def insertUserLog(self, username, channel, score, numAnswered, timeTaken, day=None, month=None, year=None, epoch=None): - if day == None and month == None and year == None: - dateObject = datetime.date.today() - day = dateObject.day - month = dateObject.month - year = dateObject.year - score = int(score) - if epoch is None: - epoch = int(time.mktime(time.localtime())) - if self.userLogExists(username, channel, day, month, year): - return self.updateUserLog(username, channel, score, numAnswered, timeTaken, day, month, year, epoch) - c = self.conn.cursor() - usernameCanonical = ircutils.toLower(username) - channelCanonical = ircutils.toLower(channel) - scoreAvg = 'NULL' - if numAnswered >= 1: - scoreAvg = score / numAnswered - c.execute('''INSERT INTO triviauserlog - VALUES (NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', - (username, score, numAnswered, day, month, year, - epoch, timeTaken, scoreAvg, usernameCanonical, - channel, channelCanonical)) - self.conn.commit() - c.close() - - def insertUser(self, username, numEditted=0, numEdittedAccepted=0, numReported=0, numQuestionsAdded=0, numQuestionsAccepted=0): - usernameCanonical = ircutils.toLower(username) - if self.userExists(username): - return self.updateUser(username, numEditted, numEdittedAccepted, numReported, numQuestionsAdded, numQuestionsAccepted) - c = self.conn.cursor() - c.execute('''INSERT INTO triviausers - VALUES (NULL, ?, ?, ?, ?, ?, ?, ?, 0)''', - (username, numEditted, numEdittedAccepted, - usernameCanonical, numReported, - numQuestionsAdded, numQuestionsAccepted)) - self.conn.commit() - c.close() - - def insertUserLevel(self, username, channel, level): - if self.userLevelExists(username, channel): - return self.updateUserLevel(username, channel, level) - - usernameCanonical = ircutils.toLower(username) - channelCanonical = ircutils.toLower(channel) - - c = self.conn.cursor() - c.execute('''INSERT INTO trivialevel - VALUES (?, ?, ?, ?, ?)''', - (username, usernameCanonical, channel, - channelCanonical, level)) - self.conn.commit() - c.close() - - def insertGame(self, channel, numAsked=0, epoch=None): - channelCanonical = ircutils.toLower(channel) - if self.gameExists(channel): - return self.updateGame(channel, numAsked) - if epoch is None: - epoch = int(time.mktime(time.localtime())) - c = self.conn.cursor() - c.execute('''INSERT INTO triviagames - VALUES (NULL, ?, ?, ?, 0, 0, ?, 0, "", "")''', - (channel, numAsked, epoch, channelCanonical)) - self.conn.commit() - c.close() - - def insertGameLog(self, channel, roundNumber, lineNumber, questionText, askedAt=None): - channelCanonical = ircutils.toLower(channel) - if askedAt is None: - askedAt = int(time.mktime(time.localtime())) - c = self.conn.cursor() - c.execute('''INSERT INTO triviagameslog - VALUES (NULL, ?, ?, ?, ?, ?, ?)''', - (channel, roundNumber, lineNumber, questionText, - askedAt, channelCanonical)) - self.conn.commit() - c.close() - - def insertReport(self, channel, username, reportText, questionNum, reportedAt=None): - channelCanonical = ircutils.toLower(channel) - usernameCanonical = ircutils.toLower(username) - if reportedAt is None: - reportedAt = int(time.mktime(time.localtime())) - c = self.conn.cursor() - c.execute('''INSERT INTO triviareport - VALUES (NULL, ?, ?, ?, ?, NULL, NULL, ?, ?, ?)''', - (channel, username, reportText, reportedAt, - questionNum, usernameCanonical, channelCanonical)) - self.conn.commit() - c.close() - - def insertQuestionsBulk(self, questions): - c = self.conn.cursor() - #skipped=0 - divData = self.chunk(questions) # divide into 10000 rows each - for chunk in divData: - c.executemany('''INSERT INTO triviaquestion - VALUES (NULL, ?, ?, 0, 0, 0)''', - chunk) - self.conn.commit() - skipped = self.removeDuplicateQuestions() - c.close() - return ((len(questions) - skipped), skipped) - - def insertEdit(self, questionId, questionText, username, channel, createdAt=None): - c = self.conn.cursor() - channelCanonical = ircutils.toLower(channel) - usernameCanonical = ircutils.toLower(username) - if createdAt is None: - createdAt = int(time.mktime(time.localtime())) - c.execute('''INSERT INTO triviaedit - VALUES (NULL, ?, ?, NULL, ?, ?, ?, ?, ?)''', - (questionId, questionText, username, channel, - createdAt, usernameCanonical, channelCanonical)) - self.conn.commit() - c.close() - - def insertTemporaryQuestion(self, username, channel, question): - c = self.conn.cursor() - channelCanonical = ircutils.toLower(channel) - usernameCanonical = ircutils.toLower(username) - c.execute('''INSERT INTO triviatemporaryquestion - VALUES (NULL, ?, ?, ?, ?, ?)''', - (username, channel, question, usernameCanonical, - channelCanonical)) - self.conn.commit() - c.close() - - def isQuestionDeleted(self, id): - c = self.conn.cursor() - c.execute('''SELECT COUNT(*) - FROM triviaquestion - WHERE deleted=1 AND - id=?''', - (id,)) - row = c.fetchone() - c.close() - return row[0] > 0 - - def isQuestionPendingDeletion(self, id): - c = self.conn.cursor() - c.execute('''SELECT COUNT(*) - FROM triviadelete - WHERE line_num=?''', - (id,)) - row = c.fetchone() - c.close() - return row[0] > 0 - - def makeActivityTable(self): - c = self.conn.cursor() - try: - c.execute('''CREATE TABLE triviaactivity ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - type TEXT, - activity TEXT, - channel TEXT, - channel_canonical TEXT, - network TEXT, - timestamp INTEGER)''') - except: - pass - self.conn.commit() - c.close() - - def makeDeleteTable(self): - c = self.conn.cursor() - try: - c.execute('''CREATE TABLE triviadelete ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - username TEXT, - username_canonical TEXT, - line_num INTEGER, - channel TEXT, - channel_canonical TEXT, - reason TEXT)''') - except: - pass - self.conn.commit() - c.close() - - def makeLevelTable(self): - c = self.conn.cursor() - try: - c.execute('''CREATE TABLE trivialevel ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - username TEXT, - username_canonical TEXT, - channel TEXT, - channel_canonical TEXT, - level INTEGER)''') - except: - pass - - def makeLoginTable(self): - c = self.conn.cursor() - try: - c.execute('''CREATE TABLE trivialogin ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - username TEXT, - username_canonical TEXT NOT NULL UNIQUE, - salt TEXT, - is_hashed INTEGER NOT NULL DEFAULT 1, - password TEXT, - capability TEXT)''') - except: - pass - self.conn.commit() - c.close() - - def makeUserTable(self): - c = self.conn.cursor() - try: - c.execute('''CREATE TABLE triviausers ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - username TEXT, - num_editted INTEGER, - num_editted_accepted INTEGER, - username_canonical TEXT NOT NULL UNIQUE, - num_reported INTEGER, - num_questions_added INTEGER, - num_questions_accepted INTEGER, - highest_streak INTEGER)''') - except: - pass - self.conn.commit() - c.close() - - def makeUserLogTable(self): - c = self.conn.cursor() - try: - c.execute('''CREATE TABLE triviauserlog ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - username TEXT, - points_made INTEGER, - num_answered INTEGER, - day INTEGER, - month INTEGER, - year INTEGER, - last_updated INTEGER, - average_time INTEGER, - average_score INTEGER, - username_canonical TEXT, - channel TEXT, - channel_canonical TEXT, - UNIQUE(username_canonical, channel_canonical, - day, month, year) ON CONFLICT REPLACE)''') - except: - pass - self.conn.commit() - c.close() - - def makeGameTable(self): - c = self.conn.cursor() - try: - c.execute('''CREATE TABLE triviagames ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - channel TEXT, - num_asked INTEGER, - round_started INTEGER, - last_winner TEXT, - streak INTEGER, - channel_canonical TEXT NOT NULL UNIQUE, - longest_streak INTEGER, - longest_streak_holder TEXT, - longest_streak_holder_canonical TEXT)''') - except: - pass - self.conn.commit() - c.close() - - def makeGameLogTable(self): - c = self.conn.cursor() - try: - c.execute('''CREATE TABLE triviagameslog ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - channel TEXT, - round_num INTEGER, - line_num INTEGER, - question TEXT, - asked_at INTEGER, - channel_canonical TEXT)''') - c.execute('''CREATE INDEX gamelograndomindex - ON triviagameslog (channel, line_num, asked_at))''') - except: - pass - self.conn.commit() - c.close() - - def makeInfoTable(self): - c = self.conn.cursor() - try: - c.execute('''CREATE TABLE triviainfo (version INTEGER)''') - except: - pass - - def makeReportTable(self): - c = self.conn.cursor() - try: - c.execute('''CREATE TABLE triviareport ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - channel TEXT, - username TEXT, - report_text TEXT, - reported_at INTEGER, - fixed_at INTEGER, - fixed_by TEXT, - question_num INTEGER, - username_canonical TEXT, - channel_canonical TEXT)''') - except: - pass - self.conn.commit() - c.close() - - def makeTemporaryQuestionTable(self): - c = self.conn.cursor() - try: - c.execute('''CREATE TABLE triviatemporaryquestion ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - username TEXT, - channel TEXT, - question TEXT, - username_canonical TEXT, - channel_canonical TEXT)''') - except: - pass - self.conn.commit() - c.close() - - def makeQuestionTable(self): - c = self.conn.cursor() - try: - c.execute('''CREATE TABLE triviaquestion ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - question_canonical TEXT, - question TEXT, - deleted INTEGER NOT NULL DEFAULT 0, - num_answered INTEGER, - num_missed INTEGER)''') - c.execute('''CREATE INDEX questionrandomindex - ON triviagameslog (id, deleted))''') - except: - pass - self.conn.commit() - c.close() - - def makeEditTable(self): - c = self.conn.cursor() - try: - c.execute('''CREATE TABLE triviaedit ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - question_id INTEGER, - question TEXT, - status TEXT, - username TEXT, - channel TEXT, - created_at TEXT, - username_canonical TEXT, - channel_canonical TEXT)''') - except: - pass - self.conn.commit() - c.close() - - def questionExists(self, question): - c = self.conn.cursor() - c.execute('''SELECT COUNT(id) - FROM triviaquestion - WHERE question=? OR - question_canonical=?''', - (question, question)) - row = c.fetchone() - c.close() - return row[0] > 0 - - def questionIdExists(self, id): - c = self.conn.cursor() - c.execute('''SELECT COUNT(id) - FROM triviaquestion - WHERE id=?''', - (id,)) - row = c.fetchone() - c.close() - return row[0] > 0 - - def removeOldActivity(self,count=100): - c = self.conn.cursor() - c.execute('''DELETE FROM triviaactivity - WHERE id NOT IN ( - SELECT id - FROM triviaactivity - ORDER BY id DESC LIMIT ?)''', - (count,)) - self.conn.commit() - c.close() - - def removeDelete(self, deleteId): - c = self.conn.cursor() - c.execute('''DELETE FROM triviadelete - WHERE id=?''', - (deleteId,)) - self.conn.commit() - c.close() - - def removeDuplicateQuestions(self): - c = self.conn.cursor() - c.execute('''DELETE FROM triviaquestion - WHERE id NOT IN ( - SELECT MIN(id) - FROM triviaquestion - GROUP BY question_canonical)''') - num = c.rowcount - self.conn.commit() - c.close() - return num - - def removeEdit(self, editId): - c = self.conn.cursor() - c.execute('''DELETE FROM triviaedit - WHERE id=?''', - (editId,)) - self.conn.commit() - c.close() - - def removeLogin(self, username): - usernameCanonical = ircutils.toLower(username) - c = self.conn.cursor() - c.execute('''DELETE FROM trivialogin - WHERE username_canonical=?''', - (usernameCanonical,)) - self.conn.commit() - c.close() - - def removeReport(self, repId): - c = self.conn.cursor() - c.execute('''DELETE FROM triviareport - WHERE id=?''', (repId,)) - self.conn.commit() - c.close() - - def removeReportByQuestionNumber(self, id): - c = self.conn.cursor() - c.execute('''DELETE FROM triviareport - WHERE question_num=?''', - (id,)) - self.conn.commit() - c.close() - - def removeEditByQuestionNumber(self, id): - c = self.conn.cursor() - c.execute('''DELETE FROM triviaedit - WHERE question_id=?''', - (id,)) - self.conn.commit() - c.close() - - def removeDeleteByQuestionNumber(self, id): - c = self.conn.cursor() - c.execute('''DELETE FROM triviadelete - WHERE line_num=?''', - (id,)) - self.conn.commit() - c.close() - - def removeTemporaryQuestion(self, id): - c = self.conn.cursor() - c.execute('''DELETE FROM triviatemporaryquestion - WHERE id=?''', - (id,)) - self.conn.commit() - c.close() - - def removeUserLogs(self, username, channel): - usernameCanonical = ircutils.toLower(username) - channelCanonical = ircutils.toLower(channel) - c = self.conn.cursor() - c.execute('''DELETE FROM triviauserlog - WHERE username_canonical=? AND - channel_canonical=?''', - (usernameCanonical, channelCanonical)) - self.conn.commit() - c.close() - - def restoreQuestion(self, id): - c = self.conn.cursor() - test = c.execute('''UPDATE triviaquestion - SET deleted=0 - WHERE id=?''', - (id,)) - self.conn.commit() - c.close() - - def transferUserLogs(self, userFrom, userTo, channel): - userFromCanonical = ircutils.toLower(userFrom) - userToCanonical = ircutils.toLower(userTo) - channelCanonical = ircutils.toLower(channel) - c = self.conn.cursor() - c.execute('''UPDATE triviauserlog - SET num_answered=num_answered+IFNULL( - (SELECT t3.num_answered - FROM triviauserlog t3 - WHERE t3.day=triviauserlog.day AND - t3.month=triviauserlog.month AND - t3.year=triviauserlog.year AND - t3.channel_canonical=? AND - t3.username_canonical=?),0), - points_made=points_made+IFNULL( - (SELECT t2.points_made - FROM triviauserlog t2 - WHERE t2.day=triviauserlog.day AND - t2.month=triviauserlog.month AND - t2.year=triviauserlog.year AND - t2.channel_canonical=? AND - t2.username_canonical=?),0) - WHERE id IN ( - SELECT id - FROM triviauserlog tl - WHERE channel_canonical=? AND - username_canonical=? AND - EXISTS ( - SELECT id - FROM triviauserlog tl2 - WHERE tl2.day=tl.day AND - tl2.month=tl.month AND - tl2.year=tl.year AND - tl2.channel_canonical=? AND - tl2.username_canonical=?) - ) - ''', (channelCanonical, userFromCanonical, - channelCanonical, userFromCanonical, - channelCanonical, userToCanonical, - channelCanonical, userFromCanonical)) - - c.execute('''UPDATE triviauserlog - SET username=?, - username_canonical=? - WHERE username_canonical=? AND - channel_canonical=? AND - NOT EXISTS ( - SELECT 1 - FROM triviauserlog tl - WHERE tl.day=triviauserlog.day AND - tl.month=triviauserlog.month AND - tl.year=triviauserlog.year AND - tl.channel_canonical=? AND - tl.username_canonical=?)''', - (userTo, userToCanonical, userFromCanonical, channelCanonical, - channelCanonical, userToCanonical)) - self.conn.commit() - - self.removeUserLogs(userFrom, channel) - - def userLogExists(self, username, channel, day, month, year): - c = self.conn.cursor() - args = (ircutils.toLower(username),ircutils.toLower(channel),day,month,year) - c.execute('''SELECT COUNT(id) - FROM triviauserlog - WHERE username_canonical=? AND - channel_canonical=? AND - day=? AND - month=? and - year=?''', args) - row = c.fetchone() - c.close() - return row[0] > 0 - - def userExists(self, username): - c = self.conn.cursor() - usr = (ircutils.toLower(username),) - c.execute('''SELECT COUNT(id) - FROM triviausers - WHERE username_canonical=?''', usr) - row = c.fetchone() - c.close() - return row[0] > 0 - - def userLevelExists(self, username, channel): - usernameCanonical = ircutils.toLower(username) - channelCanonical = ircutils.toLower(channel) - - c = self.conn.cursor() - c.execute('''SELECT COUNT(id) - FROM trivialevel - WHERE username_canonical=? AND - channel_canonical=?''', - (usernameCanonical, channelCanonical)) - row = c.fetchone() - c.close() - return row[0] > 0 - - def updateLogin(self, username, salt, isHashed, password, capability): - if not self.loginExists(username): - return self.insertLogin(username, salt, isHashed, password, capability) - usernameCanonical = ircutils.toLower(username) - if not isHashed: - isHashed = 0 - else: - isHashed = 1 - c = self.conn.cursor() - c.execute('''UPDATE trivialogin - SET username=?, - salt=?, - is_hashed=?, - password=?, - capability=? - WHERE username_canonical=?''', - (username, salt, isHashed, password, capability, usernameCanonical)) - self.conn.commit() - c.close() - - def updateUserLog(self, username, channel, score, numAnswered, timeTaken, day=None, month=None, year=None, epoch=None): - if not self.userExists(username): - self.insertUser(username) - if day == None and month == None and year == None: - dateObject = datetime.date.today() - day = dateObject.day - month = dateObject.month - year = dateObject.year - if epoch is None: - epoch = int(time.mktime(time.localtime())) - if not self.userLogExists(username, channel, day, month, year): - return self.insertUserLog(username, channel, score, numAnswered, timeTaken, day, month, year, epoch) - c = self.conn.cursor() - usernameCanonical = ircutils.toLower(username) - channelCanonical = ircutils.toLower(channel) - test = c.execute('''UPDATE triviauserlog - SET username=?, - points_made=points_made+?, - average_time=(average_time*(1.0*num_answered/(num_answered+?))+?*(1.0*?/(num_answered+?))), - average_score=(average_score*(1.0*num_answered/(num_answered+?))+?*(1.0*?/(num_answered+?))), - num_answered=num_answered+?, - last_updated=? - WHERE username_canonical=? AND - channel_canonical=? AND - day=? AND - month=? AND - year=?''', - (username, score, numAnswered, timeTaken, numAnswered, - numAnswered, numAnswered, score, numAnswered, numAnswered, - numAnswered, epoch, usernameCanonical, channelCanonical, - day, month, year)) - self.conn.commit() - c.close() - - def updateUser(self, username, numEditted=0, numEdittedAccepted=0, numReported=0, numQuestionsAdded=0, numQuestionsAccepted=0): - if not self.userExists(username): - return self.insertUser(username, numEditted, numEdittedAccepted, numReported, numQuestionsAdded, numQuestionsAccepted) - usernameCanonical = ircutils.toLower(username) - c = self.conn.cursor() - c.execute('''UPDATE triviausers - SET username=?, - num_editted=num_editted+?, - num_editted_accepted=num_editted_accepted+?, - num_reported=num_reported+?, - num_questions_added=num_questions_added+?, - num_questions_accepted=num_questions_accepted+? - WHERE username_canonical=?''', - (username, numEditted, numEdittedAccepted, numReported, - numQuestionsAdded, numQuestionsAccepted, usernameCanonical)) - self.conn.commit() - c.close() - - def updateUserHighestStreak(self, username, streak): - if not self.userExists(username): - return self.insertUser(username) - usernameCanonical = ircutils.toLower(username) - c = self.conn.cursor() - c.execute('''UPDATE triviausers - SET highest_streak=? - WHERE highest_streak 0: - weekSqlString += ' or ' - weekSqlString += ''' - (year=%d - AND month=%d - AND day=%d)''' % (d.year, d.month, d.day) - d += datetime.timedelta(1) - - query = '''SELECT id, - username, - SUM(points_made) AS points, - SUM(num_answered) AS num - FROM triviauserlog - WHERE (%s)''' % weekSqlString - arguments = [] - - if channel is not None: - channelCanonical = ircutils.toLower(channel) - query = '''%s AND channel_canonical=?''' % (query) - arguments.append(channelCanonical) - - query = '''%s GROUP BY username_canonical - ORDER BY points DESC LIMIT ?, 10''' % (query) - arguments.append(numUpTo) - - c = self.conn.cursor() - c.execute(query, tuple(arguments)) - rows = c.fetchall() - c.close() - return rows - - def wasUserActiveIn(self, username, channel, timeSeconds): - usernameCanonical = ircutils.toLower(username) - channelCanonical = ircutils.toLower(channel) - epoch = int(time.mktime(time.localtime())) - dateObject = datetime.date.today() - day = dateObject.day - month = dateObject.month - year = dateObject.year - c = self.conn.cursor() - c.execute('''SELECT count(*) - FROM triviauserlog - WHERE day=? AND - month=? AND - year=? AND - username_canonical=? AND - channel_canonical=? AND - last_updated>?''', - (day, month, year, usernameCanonical, - channelCanonical, epoch-timeSeconds)) - row = c.fetchone() - c.close() - return row[0] > 0 - - -#A log wrapper, ripoff of ChannelLogger -class Logger: - def __init__(self, base): - self.logs = {} - self.registryValue = base.registryValue - - def logNameTimestamp(self, channel): - return time.strftime('%Y-%m-%d') - - def getLogName(self, channel): - return '%s.%s.log' % (channel, self.logNameTimestamp(channel)) - - def getLogDir(self, irc, channel): - logDir = conf.supybot.directories.log.dirize('TriviaTime') - logDir = os.path.join(logDir, irc.network) - logDir = os.path.join(logDir, channel) - timeDir = time.strftime('%B') - logDir = os.path.join(logDir, timeDir) - if not os.path.exists(logDir): - os.makedirs(logDir) - return logDir - - def timestamp(self, log): - format = conf.supybot.log.timestampFormat() - if format: - log.write(time.strftime(format)) - log.write(' ') - - def checkLogNames(self): - for (irc, logs) in list(self.logs.items()): - for (channel, log) in list(logs.items()): - name = self.getLogName(channel) - if name != log.name: - log.close() - del logs[channel] - - def getLog(self, irc, channel): - self.checkLogNames() - try: - logs = self.logs[irc] - except KeyError: - logs = ircutils.IrcDict() - self.logs[irc] = logs - if channel in logs: - return logs[channel] - else: - try: - name = self.getLogName(channel) - logDir = self.getLogDir(irc, channel) - log = open(os.path.join(logDir, name), 'a') - logs[channel] = log - return log - except IOError: - self.log.exception('Error opening log:') - return self.FakeLog() - - def doLog(self, irc, channel, s, *args): - if not self.registryValue('general.logGames'): - return - s = format(s, *args) - channel = self.normalizeChannel(irc, channel) - log = self.getLog(irc, channel) - self.timestamp(log) - s = ircutils.stripFormatting(s) - log.write(s) - log.write('\n') - log.flush() - - def normalizeChannel(self, irc, channel): - return ircutils.toLower(channel) - - class FakeLog(object): - def flush(self): - return - def close(self): - return - def write(self, s): - return - - -class TriviaTime(callbacks.Plugin): - """ - TriviaTime - An enhanced multiplayer and multichannel trivia game for Supybot. - Includes KAOS: work together to get all the answers before time runs out. - """ - threaded = True # enables threading for supybot plugin - currentDBVersion = 1.2 - - def __init__(self, irc): - log.info('** TriviaTime loaded! **') - self.__parent = super(TriviaTime, self) - self.__parent.__init__(irc) - - # games info - self.games = {} # separate game for each channel - self.voiceTimeouts = TimeoutList(self.registryValue('voice.timeoutVoice')) - - #Database amend statements for outdated versions - self.dbamends = {} #Formatted like this: : "; ;" (This IS valid SQL as long as we include the semicolons) - - #logger - self.logger = Logger(self) - - # connections - dbLocation = self.registryValue('admin.db') - # tuple head, tail ('example/example/', 'filename.txt') - dbFolder = os.path.split(dbLocation) - # take folder from split - dbFolder = dbFolder[0] - # create the folder - if not os.path.exists(dbFolder): - log.info('The database location did not exist, creating folder structure') - os.makedirs(dbFolder) - self.storage = Storage(dbLocation) - #self.storage.dropActivityTable() - self.storage.makeActivityTable() - #self.storage.dropUserLogTable() - self.storage.makeUserLogTable() - #self.storage.dropGameTable() - self.storage.makeGameTable() - #self.storage.dropGameLogTable() - self.storage.makeGameLogTable() - #self.storage.dropUserTable() - self.storage.makeUserTable() - #self.storage.dropLoginTable() - self.storage.makeLoginTable() - #self.storage.dropReportTable() - self.storage.makeReportTable() - #self.storage.dropQuestionTable() - self.storage.makeQuestionTable() - #self.storage.dropTemporaryQuestionTable() - self.storage.makeTemporaryQuestionTable() - #self.storage.dropEditTable() - self.storage.makeEditTable() - #self.storage.dropDeleteTable() - self.storage.makeDeleteTable() - self.storage.makeInfoTable() - #self.storage.makeLevelTable() - #self.storage.dropLevelTable() - #triviainfo table check - #if self.storage.isTriviaVersionSet(): - if self.storage.getVersion() != None and self.storage.getVersion() != self.currentDBVersion: - return - - def _games(self): - for (network, games) in list(self.games.items()): - for (channel, game) in list(games.items()): - yield game - - def die(self): - for game in self._games(): - game.stop() - - def reset(self): - for game in self._games(): - game.stop() - - def doPrivmsg(self, irc, msg): - """ - Catches all PRIVMSG, including channels communication - """ - username = self.getUsername(msg.nick, msg.prefix) - usernameCanonical = ircutils.toLower(username) - channel = msg.args[0] - # Make sure that it is starting inside of a channel, not in pm - if not irc.isChannel(channel): - return - if callbacks.addressed(irc.nick, msg): - return - channelCanonical = ircutils.toLower(channel) - - extraHintCommand = self.registryValue('commands.extraHint', channel) - extraHintTime = self.registryValue('hints.extraHintTime', channel) - game = self.getGame(irc, channel) - - if game and game.state == 'in-question': - if msg.args[1] == extraHintCommand: # Check for extra hint command - if game.questionType == 'kaos': - game.getRemainingKAOS() - else: - if self.registryValue('hints.enableExtraHints', channel): - game.hintTimeoutList.setTimeout(extraHintTime) - if game.hintTimeoutList.has(usernameCanonical): - self.reply(irc, msg, 'You must wait %d seconds to be able to use the extra hint command.' % (game.hintTimeoutList.getTimeLeft(usernameCanonical)), notice=True) - else: - game.hintTimeoutList.append(usernameCanonical) - game.getExtraHint() - else: # Check the answer - game.checkAnswer(msg) - - def doJoin(self, irc, msg): - username = self.getUsername(msg.nick, msg.prefix) - channel = msg.args[0] - self.handleVoice(irc, msg.nick, username, channel) - - def doNotice(self, irc, msg): - username = msg.nick - if msg.args[1][1:5] == "PING": - pingMsg = msg.args[1][6:] - pingMsg = pingMsg[:-1] - pingMsg = pingMsg.split('*', 1) - if len(pingMsg) == 2: - pingTime = time.time()-float(pingMsg[0])-1300000000 - channelHash = pingMsg[1] - channel = '' - for name in irc.state.channels: - if channelHash == self.shortHash(ircutils.toLower(name)): - if username in irc.state.channels[name].users: - channel = name - break - if channel == '': - irc.sendMsg(ircmsgs.notice(username, 'Ping reply: %0.2f seconds' % (pingTime))) - else: - irc.sendMsg(ircmsgs.privmsg(channel, '%s: Ping reply: %0.2f seconds' % (username, pingTime))) - - def voiceUser(self, irc, nick, username, channel): - usernameCanonical = ircutils.toLower(username) - irc.queueMsg(ircmsgs.voice(channel, nick)) - self.voiceTimeouts.append(usernameCanonical) - - #The following functions are not ready and still in testing. Actually, they haven't even been tested yet. Use at your own risk. - """ - def checkLevel(self, irc, nick, username, channel): - levels = {0:"noob", 1:"Guesser", 2:"Student", 3:"Player", 4:"Master", 5:"Genius", 6:"Distinguished", 7:"Addicted", 8:"Elite", 9:"KAOTIC", 10:"Trivia God"} - levelMinQuestions = {0:1, 1:50, 2:137, 3:301, 4:500, 5:789, 6:1002, 7:1519, 8:1899, 9:2133, 10:2544} - usernameCanonical = ircutils.toLower(username) - if userLevelExists(usernameCanonical): - currentLevel = getUserLevel(username) - nextLevel = currentLevel + 1 - if questionsAnswered(usernameCanonical) >= nextLevel(questionCount): - changeLevel(nextLevel) - else: - levelUp() - - def levelUp(): - if questionsAnswered(usernameCanonical) > levelMinQuestions[10]: - changeLevel(10) - elif questionsAnswered(usernameCanonical) > levelMinQuestions[9]: - changeLevel(9) - elif questionsAnswered(usernameCanonical) > levelMinQuestions[8]: - changeLevel(8) - elif questionsAnswered(usernameCanonical) > levelMinQuestions[7]: - changelevel(7) - elif questionsAnswered(usernameCanonical) > levelMinQuestions[6]: - changelevel(6) - elif questionsAnswered(usernameCanonical) > levelMinQuestions[5]: - changelevel(5) - elif questionsAnswered(usernameCanonical) > levelMinQuestions[4] - changelevel(4) - elif questionsAnswered(usernameCanonical) > levelMinQuestions[3]: - changelevel(3) - elif questionsAnswered(usernameCanonical) > levelMinQuestions[2]: - changelevel(2) - elif questionsAnswered(usernameCanonical) > levelMinQuestions[1]: - changelevel(1) - elif questionsAnswered(usernameCanonical) > levelMinQuestions[0]: - changelLevel(0) - - Storage.getUserStat() - - def changeLevel(self, irc, nick, username, channel): - usernameCanonical = ircutils.toLower(username) - USERLEVEL = NEWUSERLEVEL - irc.sendMsg(ircmsgs.privmsg(channel, 'Congratulations %s, you\'ve answered %d questions and leveled up to %s!' % (username, questionsAnswered(usernameCanonical), levels[newlevel]))) - #reward points levelMinQuestions[level] * 5 - if self.registryValue('general.globalStats'): - stat = threadStorage.getUserStat(username, None) - else: - stat = threadStorage.getUserStat(username, channel) - - """ - def handleVoice(self, irc, nick, username, channel): - if not self.registryValue('voice.enableVoice'): - return - - timeoutVoice = self.registryValue('voice.timeoutVoice') - self.voiceTimeouts.setTimeout(timeoutVoice) - usernameCanonical = ircutils.toLower(username) - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if self.registryValue('general.globalStats'): - stat = threadStorage.getUserStat(username, None) - rank = threadStorage.getUserRank(username, None) - else: - stat = threadStorage.getUserStat(username, channel) - rank = threadStorage.getUserRank(username, channel) - - if stat and not self.voiceTimeouts.has(usernameCanonical): - numTopToVoice = self.registryValue('voice.numTopToVoice') - minPointsVoiceYear = self.registryValue('voice.minPointsVoiceYear') - minPointsVoiceMonth = self.registryValue('voice.minPointsVoiceMonth') - minPointsVoiceWeek = self.registryValue('voice.minPointsVoiceWeek') - - if rank['year'] <= numTopToVoice and stat['points_year'] >= minPointsVoiceYear: - self.voiceUser(irc, nick, username, channel) - irc.sendMsg(ircmsgs.privmsg(channel, 'Giving voice to %s for being MVP this YEAR (#%d)' % (nick, rank['year']))) - elif rank['month'] <= numTopToVoice and stat['points_month'] >= minPointsVoiceMonth: - self.voiceUser(irc, nick, username, channel) - irc.sendMsg(ircmsgs.privmsg(channel, 'Giving voice to %s for being MVP this MONTH (#%d)' % (nick, rank['month']))) - elif rank['week'] <= numTopToVoice and stat['points_week'] >= minPointsVoiceWeek: - self.voiceUser(irc, nick, username, channel) - irc.sendMsg(ircmsgs.privmsg(channel, 'Giving voice to %s for being MVP this WEEK (#%d)' % (nick, rank['week']))) - - def addZeroWidthSpace(self, text): - if len(text) <= 1: - return text - s = '%s\u200b%s' % (text[:1], text[1:]) - return s - - def shortHash(self, text): - hashText = hashlib.sha1(text).hexdigest() - hashText = self.numToBase94(int(hashText, 16), 8) - return hashText - - def numToBase94(self, n, maxChars): - chars = '!"#$%&\'() +,-./0123456789:;<=>?@ABCDEFGHUJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~' - L = [] - for i in range(maxChars): - L.append(chars[n % len(chars)]) - n = int(n / len(chars)) - return ''.join(L) - - def addActivity(self, activityType, activityText, channel, irc, storage=None): - if storage is None: - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - else: - threadStorage = storage - threadStorage.removeOldActivity() - threadStorage.insertActivity(activityType, activityText, channel, irc.network) - - def deleteGame(self, irc, channel): - channelCanonical = ircutils.toLower(channel) - if irc.network in self.games: - if channelCanonical in self.games[irc.network]: - del self.games[irc.network][channelCanonical] - if len(self.games[irc.network]) < 1: - del self.games[irc.network] - - def createGame(self, irc, channel): - if irc.network not in self.games: - self.games[irc.network] = {} - channelCanonical = ircutils.toLower(channel) - newGame = Game(irc, channel, self) - if newGame.active == True: - self.games[irc.network][channelCanonical] = newGame - - def getGame(self, irc, channel): - channelCanonical = ircutils.toLower(channel) - if irc.network in self.games: - if channelCanonical in self.games[irc.network]: - return self.games[irc.network][channelCanonical] - return None - - def isTriviaMod(self, hostmask, channel): - channel = ircutils.toLower(channel) - cap = self.getTriviaCapability(hostmask, channel) - return cap in ['{0},{1}'.format(channel,'triviamod'), - '{0},{1}'.format(channel,'triviaadmin'), 'owner'] - - def isTriviaAdmin(self, hostmask, channel): - channel = ircutils.toLower(channel) - cap = self.getTriviaCapability(hostmask, channel) - return cap in ['{0},{1}'.format(channel,'triviaadmin'), 'owner'] - - def getTriviaCapability(self, hostmask, channel): - if ircdb.users.hasUser(hostmask): - channel = ircutils.toLower(channel) - caps = list(ircdb.users.getUser(hostmask).capabilities) - triviamod = '{0},{1}'.format(channel,'triviamod') - triviaadmin = '{0},{1}'.format(channel,'triviaadmin') - - # If multiple capabilities exist, pick the most important - if 'owner' in caps: - return 'owner' - elif triviaadmin in caps: - return triviaadmin - elif triviamod in caps: - return triviamod - else: - return 'user' - - return None - - def getUsername(self, nick, hostmask): - username = nick - try: - #rootcoma!~rootcomaa@unaffiliated/rootcoma - user = ircdb.users.getUser(hostmask) - username = user.name - except KeyError: - pass - return username - - def reply(self, irc, msg, outstr, notice=False, prefixNick=True): - if ircutils.isChannel(msg.args[0]) and not notice: - target = msg.args[0] - else: - target = msg.nick - - if notice: - output = ircmsgs.notice - else: - output = ircmsgs.privmsg - - if prefixNick == False or ircutils.isNick(target): - irc.sendMsg(output(target, outstr)) - else: - irc.sendMsg(output(target, '%s: %s' % (msg.nick, outstr))) - irc.noReply() - - def acceptdelete(self, irc, msg, arg, channel, num): - """[] - Accept a question deletion. - Channel is only required when using the command outside of a channel. - """ - hostmask = msg.prefix - username = self.getUsername(msg.nick, hostmask) - if self.isTriviaMod(hostmask, channel) == False: - irc.reply('You must be a TriviaMod in {0} to use this command.'.format(channel)) - return - - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if self.registryValue('general.globalstats'): - delete = threadStorage.getDeleteById(num) - else: - delete = threadStorage.getDeleteById(num, channel) - - if delete: - if username == delete['username']: - irc.reply('You cannot accept your own deletion request.') - else: - questionNumber = delete['line_num'] - irc.reply('Question #%d deleted!' % questionNumber) - threadStorage.removeReportByQuestionNumber(questionNumber) - threadStorage.removeEditByQuestionNumber(questionNumber) - threadStorage.deleteQuestion(questionNumber) - threadStorage.removeDelete(num) - threadStorage.removeDeleteByQuestionNumber(questionNumber) - self.logger.doLog(irc, channel, "%s accepted delete# %i, question #%i deleted" % (msg.nick, num, questionNumber)) - activityText = '%s deleted a question, approved by %s' % (delete['username'], msg.nick) - self.addActivity('delete', activityText, channel, irc, threadStorage) - else: - if self.registryValue('general.globalstats'): - irc.error('Unable to find delete #{0}.'.format(num)) - else: - irc.error('Unable to find delete #{0} in {1}.'.format(num, channel)) - acceptdelete = wrap(acceptdelete, ['channel', 'int']) - - def acceptedit(self, irc, msg, arg, channel, num): - """[] - Accept a question edit, and remove edit. - Channel is only required when using the command outside of a channel. - """ - hostmask = msg.prefix - username = self.getUsername(msg.nick, hostmask) - if self.isTriviaMod(hostmask, channel) == False: - irc.reply('You must be a TriviaMod in {0} to use this command.'.format(channel)) - return - - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if self.registryValue('general.globalstats'): - edit = threadStorage.getEditById(num) - else: - edit = threadStorage.getEditById(num, channel) - - if edit: - if username == edit['username'] and self.isTriviaMod(hostmask, channel) == False: - irc.reply('You cannot accept your own edit.') - else: - question = threadStorage.getQuestionById(edit['question_id']) - questionOld = question['question'] if question else '' - threadStorage.updateQuestion(edit['question_id'], edit['question']) - threadStorage.updateUser(edit['username'], 0, 1) - threadStorage.removeEdit(edit['id']) - threadStorage.removeReportByQuestionNumber(edit['question_id']) - - irc.reply('Question #%d updated!' % edit['question_id']) - self.logger.doLog(irc, channel, "%s accepted edit# %i, question #%i edited NEW: '%s' OLD '%s'" % (msg.nick, num, edit['question_id'], edit['question'], questionOld)) - activityText = '%s edited a question, approved by %s' % (edit['username'], msg.nick) - self.addActivity('edit', activityText, channel, irc, threadStorage) - irc.sendMsg(ircmsgs.notice(msg.nick, 'NEW: %s' % (edit['question']))) - if questionOld != '': - irc.sendMsg(ircmsgs.notice(msg.nick, 'OLD: %s' % (questionOld))) - else: - irc.error('Question could not be found for this edit') - else: - if self.registryValue('general.globalstats'): - irc.error('Unable to find edit #{0}.'.format(num)) - else: - irc.error('Unable to find edit #{0} in {1}.'.format(num, channel)) - acceptedit = wrap(acceptedit, ['channel', 'int']) - - def acceptnew(self, irc, msg, arg, channel, num): - """[] - Accept a new question, and add it to the database. - Channel is only required when using the command outside of a channel. - """ - hostmask = msg.prefix - username = self.getUsername(msg.nick, hostmask) - if self.isTriviaMod(hostmask, channel) == False: - irc.reply('You must be a TriviaMod in {0} to use this command.'.format(channel)) - return - - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if self.registryValue('general.globalstats'): - q = threadStorage.getTemporaryQuestionById(num) - else: - q = threadStorage.getTemporaryQuestionById(num, channel) - - if q: - if username == q['username']: - irc.reply('You cannot accept your own new question.') - else: - threadStorage.updateUser(q['username'], 0, 0, 0, 0, 1) - threadStorage.insertQuestionsBulk([(q['question'], q['question'])]) - threadStorage.removeTemporaryQuestion(q['id']) - irc.reply('Question accepted!') - self.logger.doLog(irc, channel, "%s accepted new question #%i, '%s'" % (msg.nick, num, q['question'])) - activityText = '%s added a new question, approved by %s' % (q['username'], msg.nick) - self.addActivity('new', activityText, channel, irc, threadStorage) - else: - if self.registryValue('general.globalstats'): - irc.error('Unable to find new question #{0}.'.format(num)) - else: - irc.error('Unable to find new question #{0} in {1}.'.format(num, channel)) - acceptnew = wrap(acceptnew, ['channel', 'int']) - - def add(self, irc, msg, arg, user, channel, question): - """[] - Adds a question to the database. - Channel is only required when using the command outside of a channel. - """ - username = msg.nick - charMask = self.registryValue('hints.charMask', channel) - if charMask not in question: - irc.error('The question must include the separating character %s ' % (charMask)) - return - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - threadStorage.updateUser(username, 0, 0, 0, 1) - threadStorage.insertTemporaryQuestion(username, channel, question) - irc.reply('Thank you for adding your question to the question database, it is awaiting approval. ') - self.logger.doLog(irc, channel, "%s added new question: '%s'" % (username, question)) - add = wrap(add, ['user', 'channel', 'text']) - - def addfile(self, irc, msg, arg, filename): - """[] - Add a file of questions to the question database, - filename defaults to configured question file. - """ - if filename is None: - filename = self.registryValue('admin.file') - try: - filesLines = open(filename).readlines() - except: - irc.error('Could not open file to add to database. Make sure it exists on the server.') - return - irc.reply('Adding questions from %s to database.. This may take a few minutes' % filename) - insertList = [] - channel = msg.args[0] - for line in filesLines: - insertList.append((str(line).strip(),str(line).strip())) - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - info = threadStorage.insertQuestionsBulk(insertList) - irc.reply('Successfully added %d questions, skipped %d' % (info[0], info[1])) - self.logger.doLog(irc, channel, "%s added question file: '%s', added: %i, skipped: %i" % (msg.nick, filename, info[0], info[1])) - addfile = wrap(addfile, ['owner', optional('text')]) - - def authweb(self, irc, msg, arg, channel): - """[] - This registers triviamods and triviaadmins on the website. - Use this command again if the account password has changed. - Channel is only required when using the command outside of a channel. - """ - hostmask = msg.prefix - capability = self.getTriviaCapability(hostmask, channel) - if capability is None or capability == 'user': - irc.reply('You must be a TriviaMod in {0} to use this command.'.format(channel)) - return - - user = ircdb.users.getUser(hostmask) - salt = '' - password = '' - isHashed = user.hashed - if isHashed: - (salt, password) = user.password.split('|') - else: - password = user.password - - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - info = threadStorage.insertLogin(user.name, salt, isHashed, password, capability) - irc.reply('Success, updated your web access login.') - self.logger.doLog(irc, channel, "%s authed for web access" % (user.name)) - authweb = wrap(authweb, ['channel']) - - def clearpoints(self, irc, msg, arg, channel, username): - """[] - Deletes all of a users points, and removes all their records. - Channel is only required when using the command outside of a channel. - """ - hostmask = msg.prefix - if self.isTriviaAdmin(hostmask, channel) == False: - irc.reply('You must be a TriviaAdmin in {0} to use this command.'.format(channel)) - return - - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - threadStorage.removeUserLogs(username, channel) - irc.reply('Removed all points from {0} in {1}.'.format(username, channel)) - self.logger.doLog(irc, channel, '{0} cleared points for {1} in {2}.'.format(msg.nick, username, channel)) - clearpoints = wrap(clearpoints, ['channel', 'nick']) - - def day(self, irc, msg, arg, channel, num): - """[] [] - Displays the top scores of the day. - Parameter is optional, display up to that number. (eg 20 - display 11-20) - Channel is only required when using the command outside of a channel. - """ - num = max(num, 10) - offset = num-9 - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if self.registryValue('general.globalStats'): - tops = threadStorage.viewDayTop10(None, num) - else: - tops = threadStorage.viewDayTop10(channel, num) - - topsList = ['Today\'s Top {0}-{1} Players: '.format(offset, num)] - if tops: - for i in range(len(tops)): - topsList.append('\x02 #%d:\x02 %s %d ' % ((i+offset) , self.addZeroWidthSpace(tops[i]['username']), tops[i]['points'])) - else: - topsList.append('No players') - topsText = ''.join(topsList) - self.reply(irc, msg, topsText, prefixNick=False) - day = wrap(day, ['channel', optional('int')]) - - def delete(self, irc, msg, arg, user, channel, t, id, reason): - """[] [] [] - Deletes a question from the database. Type decides whether to delete - by round number (r), or question number (q) (default round). - Channel is only required when using the command outside of a channel. - """ - hostmask = msg.prefix - username = self.getUsername(msg.nick, hostmask) - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - - # Search for question ID if deletion is by 'round' - if t is None or str.lower(t) == "round": - q = threadStorage.getQuestionByRound(id, channel) - if q: - id = q['id'] - else: - irc.error('Could not find that round #{0}.'.format(id)) - return - - if not threadStorage.questionIdExists(id): - irc.error('That question does not exist.') - elif threadStorage.isQuestionDeleted(id): - irc.error('That question is already deleted.') - elif threadStorage.isQuestionPendingDeletion(id): - irc.error('That question is already pending deletion.') - else: - threadStorage.insertDelete(username, channel, id, reason) - irc.reply('Question %d marked for deletion and pending review.' % id) - self.logger.doLog(irc, channel, "%s marked question #%i for deletion" % (username, id)) - delete = wrap(delete, ['user', 'channel', optional(('literal',("question", "QUESTION", "ROUND", "round"))),'int', optional('text')]) - - def edit(self, irc, msg, arg, user, channel, num, question): - """[] - Correct a question by providing the question number and the corrected text. - Channel is only required when using the command outside of a channel. - """ - username = self.getUsername(msg.nick, msg.prefix) - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - q = threadStorage.getQuestionById(num) - if q: - questionParts = question.split('*') - if len(questionParts) < 2: - oldQuestionParts = q['question'].split('*') - questionParts.extend(oldQuestionParts[1:]) - question = questionParts[0] - for part in questionParts[1:]: - question += '*' - question += part - if question == q['question']: - irc.error('Your edit does not change the original question.') - else: - threadStorage.insertEdit(num, question, username, channel) - threadStorage.updateUser(username, 1, 0) - irc.reply('Success! Submitted edit for further review.') - irc.sendMsg(ircmsgs.notice(msg.nick, 'NEW: %s' % (question))) - irc.sendMsg(ircmsgs.notice(msg.nick, 'OLD: %s' % (q['question']))) - self.logger.doLog(irc, channel, "%s edited question #%i: OLD: '%s' NEW: '%s'" % (username, num, q['question'], question)) - else: - irc.error('Question does not exist') - edit = wrap(edit, ['user', 'channel', 'int', 'text']) - - def givepoints(self, irc, msg, arg, channel, username, points, days): - """[] [] - Give a user points, last argument is optional amount of days in past to add records. - Channel is only required when using the command outside of a channel. - """ - hostmask = msg.prefix - if self.isTriviaAdmin(hostmask, channel) == False: - irc.reply('You must be a TriviaAdmin in {0} to use this command.'.format(channel)) - return - elif points == 0: - irc.error("You cannot give 0 points.") - return - - username = self.getUsername(username, username) - day=None - month=None - year=None - if days is not None: - d = datetime.date.today() - d -= datetime.timedelta(days) - day = d.day - month = d.month - year = d.year - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - threadStorage.updateUserLog(username, channel, points, 0, 0, day, month, year) - irc.reply('Added {0} points to {1} in {2}.'.format(points, username, channel)) - self.logger.doLog(irc, channel, '{0} gave {1} points to {2} in {3}.'.format(msg.nick, points, username, channel)) - givepoints = wrap(givepoints, ['channel', 'nick', 'int', optional('int')]) - - def listdeletes(self, irc, msg, arg, channel, page): - """[] [] - List questions pending deletion. - Channel is only required when using the command outside of a channel. - """ - hostmask = msg.prefix - if self.isTriviaMod(hostmask, channel) == False: - irc.reply('You must be at least a TriviaMod in {0} to use this command.'.format(channel)) - return - - # Grab list from the database - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if self.registryValue('general.globalstats'): - count = threadStorage.countDeletes() - else: - count = threadStorage.countDeletes(channel) - pages = int(count / 3) + int(count % 3 > 0) - page = max(1, min(page, pages)) - if self.registryValue('general.globalstats'): - deletes = threadStorage.getDeleteTop3(page) - else: - deletes = threadStorage.getDeleteTop3(page, channel=channel) - - # Output list - if count < 1: - if self.registryValue('general.globalstats'): - irc.reply('No deletes found.') - else: - irc.reply('No deletes found in {0}.'.format(channel)) - else: - irc.reply('Showing page %i of %i' % (page, pages)) - for delete in deletes: - question = threadStorage.getQuestionById(delete['line_num']) - questionText = question['question'] if question else 'Question not found' - irc.reply('Delete #%d, by %s Question #%d: %s, Reason:%s'%(delete['id'], delete['username'], delete['line_num'], questionText, delete['reason'])) - irc.reply('Use the showdelete command to see more information') - listdeletes = wrap(listdeletes, ['channel', optional('int')]) - - def listalledits(self, irc, msg, arg, channel, page): - """[] [] - List all edits pending approval (even your own). - Channel is only required when using the command outside of a channel. - """ - hostmask = msg.prefix - if self.isTriviaMod(hostmask, channel) == False: - irc.reply('You must be at least a TriviaMod in {0} to use this command.'.format(channel)) - return - - # Grab list from the database - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if self.registryValue('general.globalstats'): - count = threadStorage.countEdits() - else: - count = threadStorage.countEdits(channel) - pages = int(count / 3) + int(count % 3 > 0) - page = max(1, min(page, pages)) - if self.registryValue('general.globalstats'): - edits = threadStorage.getEditTop3(page) - else: - edits = threadStorage.getEditTop3(page, channel=channel) - - # Output list - if count < 1: - if self.registryValue('general.globalstats'): - irc.reply('No edits found.') - else: - irc.reply('No edits found in {0}.'.format(channel)) - else: - irc.reply('Showing page %i of %i' % (page, pages)) - for edit in edits: - irc.reply('Edit #%d, Question #%d, NEW:%s'%(edit['id'], edit['question_id'], edit['question'])) - irc.reply('Use the showedit command to see more information') - listalledits = wrap(listalledits, ['channel', optional('int')]) - - def listmyedits(self, irc, msg, arg, channel, page): - """[] [] - List only your own edits pending approval. - Channel is only required when using the command outside of a channel. - """ - hostmask = msg.prefix - if self.isTriviaMod(hostmask, channel) == False: - irc.reply('You must be at least a TriviaMod in {0} to use this command.'.format(channel)) - return - - # Grab list from the database - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - username = self.getUsername(msg.nick, msg.prefix) - if self.registryValue('general.globalstats'): - count = threadStorage.countMyEdits(username) - else: - count = threadStorage.countMyEdits(username, channel) - pages = int(count / 3) + int(count % 3 > 0) - page = max(1, min(page, pages)) - if self.registryValue('general.globalstats'): - edits = threadStorage.getMyEditTop3(username, page) - else: - edits = threadStorage.getMyEditTop3(username, page, channel=channel) - - # Output list - if count < 1: - if self.registryValue('general.globalstats'): - irc.reply('No edits found.') - else: - irc.reply('No edits found in {0}.'.format(channel)) - else: - irc.reply('Showing page %i of %i' % (page, pages)) - for edit in edits: - irc.reply('Edit #%d, Question #%d, NEW:%s'%(edit['id'], edit['question_id'], edit['question'])) - irc.reply('Use the showedit command to see more information') - listmyedits = wrap(listmyedits, ['channel', optional('int')]) - - def listedits(self, irc, msg, arg, channel, page): - """[] [] - List edits pending approval (by default does not include your own edits) - Channel is only required when using the command outside of a channel. - """ - hostmask = msg.prefix - if self.isTriviaMod(hostmask, channel) == False: - irc.reply('You must be at least a TriviaMod in {0} to use this command.'.format(channel)) - return - - # Grab list from the database - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - username = self.getUsername(msg.nick, msg.prefix) - if self.registryValue('general.globalstats'): - count = threadStorage.countNotMyEdits(username) - else: - count = threadStorage.countNotMyEdits(username, channel) - pages = int(count / 3) + int(count % 3 > 0) - page = max(1, min(page, pages)) - if self.registryValue('general.globalstats'): - edits = threadStorage.getNotMyEditTop3(username, page) - else: - edits = threadStorage.getNotMyEditTop3(username, page, channel=channel) - - # Output list - if count < 1: - if self.registryValue('general.globalstats'): - irc.reply('No edits found.') - else: - irc.reply('No edits found in {0}.'.format(channel)) - else: - irc.reply('Showing page %i of %i' % (page, pages)) - for edit in edits: - irc.reply('Edit #%d, Question #%d, NEW:%s'%(edit['id'], edit['question_id'], edit['question'])) - irc.reply('Use the showedit command to see more information') - listedits = wrap(listedits, ['channel', optional('int')]) - - def listreports(self, irc, msg, arg, user, channel, page): - """[] [] - List reports pending edit. - Channel is only required when using the command outside of a channel. - """ - # Grab list from the database - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if self.registryValue('general.globalstats'): - count = threadStorage.countReports() - else: - count = threadStorage.countReports(channel) - pages = int(count / 3) + int(count % 3 > 0) - page = max(1, min(page, pages)) - if self.registryValue('general.globalstats'): - reports = threadStorage.getReportTop3(page) - else: - reports = threadStorage.getReportTop3(page, channel=channel) - - # Output list - if count < 1: - if self.registryValue('general.globalstats'): - irc.reply('No reports found.') - else: - irc.reply('No reports found in {0}.'.format(channel)) - else: - irc.reply('Showing page %i of %i' % (page, pages)) - for report in reports: - irc.reply('Report #%d \'%s\' by %s on %s Q#%d '%(report['id'], report['report_text'], report['username'], report['channel'], report['question_num'])) - irc.reply('Use the showreport command to see more information') - listreports = wrap(listreports, ['user', 'channel', optional('int')]) - - def listnew(self, irc, msg, arg, channel, page): - """[] [] - List questions awaiting approval. - Channel is only required when using the command outside of a channel. - """ - hostmask = msg.prefix - if self.isTriviaMod(hostmask, channel) == False: - irc.reply('You must be at least a TriviaMod in {0} to use this command.'.format(channel)) - return - - # Grab list from the database - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if self.registryValue('general.globalstats'): - count = threadStorage.countTemporaryQuestions() - else: - count = threadStorage.countTemporaryQuestions(channel) - pages = int(count / 3) + int(count % 3 > 0) - page = max(1, min(page, pages)) - if self.registryValue('general.globalstats'): - q = threadStorage.getTemporaryQuestionTop3(page) - else: - q = threadStorage.getTemporaryQuestionTop3(page, channel=channel) - - # Output list - if count < 1: - if self.registryValue('general.globalstats'): - irc.reply('No new questions found.') - else: - irc.reply('No new questions found in {0}.'.format(channel)) - else: - irc.reply('Showing page %i of %i' % (page, pages)) - for ques in q: - irc.reply('Temp Q #%d: %s'%(ques['id'], ques['question'])) - irc.reply('Use the shownew to see more information') - listnew = wrap(listnew, ['channel', optional('int')]) - - def info(self, irc, msg, arg, channel): - """[] - Get TriviaTime information, how many questions/users in database, time, etc. - Channel is only required when using the command outside of a channel. - """ - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - totalUsersEver = threadStorage.getNumUser(channel) - numActiveThisWeek = threadStorage.getNumActiveThisWeek(channel) - infoText = ' TriviaTime v1.3.2 by Trivialand on Freenode: https://github.com/tannn/TriviaTime ' - self.reply(irc, msg, infoText, prefixNick=False) - infoText = '\x02 %d Users\x02 on scoreboard with \x02%d Active This Week\x02' % (totalUsersEver, numActiveThisWeek) - self.reply(irc, msg, infoText, prefixNick=False) - numKaos = threadStorage.getNumKAOS() - numQuestionTotal = threadStorage.getNumQuestions() - infoText = '\x02 %d Questions\x02 and \x02%d KAOS\x02 (\x02%d Total\x02) in the database ' % ((numQuestionTotal-numKaos), numKaos, numQuestionTotal) - self.reply(irc, msg, infoText, prefixNick=False) - info = wrap(info, ['channel']) - - def ping(self, irc, msg, arg): - """ - Check your ping time to the bot. The client must respond correctly to pings. - """ - channel = msg.args[0] - channelHash = self.shortHash(ircutils.toLower(channel)) - username = msg.nick - irc.sendMsg(ircmsgs.privmsg(username, '\x01PING %0.2f*%s\x01' % (time.time()-1300000000, channelHash))) - ping = wrap(ping) - - def me(self, irc, msg, arg, channel): - """[] - Get your rank, score & questions asked for day, month, year. - Channel is only required when using the command outside of a channel. - """ - username = self.getUsername(msg.nick, msg.prefix) - identified = ircdb.users.hasUser(msg.prefix) - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - - if self.registryValue('general.globalStats'): - stat = threadStorage.getUserStat(username, None) - rank = threadStorage.getUserRank(username, None) - else: - stat = threadStorage.getUserStat(username, channel) - rank = threadStorage.getUserRank(username, channel) - - if not stat: - errorMessage = 'You do not have any points.' - identifyMessage = '' - if not identified: - identifyMessage = ' You should identify to keep track of your score more accurately.' - irc.reply('%s%s' % (errorMessage, identifyMessage)) - else: - hasPoints = False - infoList = ['%s\'s Stats: Points (answers)' % (self.addZeroWidthSpace(stat['username']))] - if rank['day'] > 0 or stat['points_day'] > 0 or stat['answer_day'] > 0: - hasPoints = True - infoList.append(' \x02Today:\x02 #%d %d (%d)' % (rank['day'], stat['points_day'], stat['answer_day'])) - if rank['week'] > 0 or stat['points_week'] > 0 or stat['answer_week'] > 0: - hasPoints = True - infoList.append(' \x02This Week:\x02 #%d %d (%d)' % (rank['week'], stat['points_week'], stat['answer_week'])) - if rank['month'] > 0 or stat['points_month'] > 0 or stat['answer_week'] > 0: - hasPoints = True - infoList.append(' \x02This Month:\x02 #%d %d (%d)' % (rank['month'], stat['points_month'], stat['answer_month'])) - if rank['year'] > 0 or stat['points_year'] > 0 or stat['answer_year'] > 0: - hasPoints = True - infoList.append(' \x02This Year:\x02 #%d %d (%d)' % (rank['year'], stat['points_year'], stat['answer_year'])) - if not hasPoints: - infoList = ['%s: You do not have any points.' % (username)] - if not identified: - infoList.append(' You should identify to keep track of your score more accurately.') - infoText = ''.join(infoList) - self.reply(irc, msg, infoText, prefixNick=False) - me = wrap(me, ['channel']) - - def month(self, irc, msg, arg, channel, num): - """[] [] - Displays the top ten scores of the month. - Parameter is optional, display up to that number. (eg 20 - display 11-20) - Channel is only required when using the command outside of a channel. - """ - num = max(num, 10) - offset = num-9 - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if self.registryValue('general.globalStats'): - tops = threadStorage.viewMonthTop10(None, num) - else: - tops = threadStorage.viewMonthTop10(channel, num) - - topsList = ['This Month\'s Top {0}-{1} Players: '.format(offset, num)] - if tops: - for i in range(len(tops)): - topsList.append('\x02 #%d:\x02 %s %d ' % ((i+offset) , self.addZeroWidthSpace(tops[i]['username']), tops[i]['points'])) - else: - topsList.append('No players') - topsText = ''.join(topsList) - self.reply(irc, msg, topsText, prefixNick=False) - month = wrap(month, ['channel', optional('int')]) - - def next(self, irc, msg, arg, channel): - """ - Skip to the next question immediately. - This can only be used by a user with a certain streak, set in the config. - """ - username = self.getUsername(msg.nick, msg.prefix) - minStreak = self.registryValue('general.nextMinStreak', channel) - game = self.getGame(irc, channel) - - # Sanity checks - # 1. Is trivia running? - # 2. Is question is still being asked? - # 3. Is caller the streak holder? - # 4. Is streak high enough? - if game is None or game.active == False: - self.reply(irc, msg, 'Trivia is not currently running.') - elif game.state != 'no-question': - self.reply(irc, msg, 'You must wait until the current question is over.') - elif ircutils.toLower(game.lastWinner) != ircutils.toLower(username): - self.reply(irc, msg, 'You are not currently the streak holder.') - elif game.streak < minStreak: - self.reply(irc, msg, 'You do not have a large enough streak yet (%i of %i).' % (game.streak, minStreak)) - else: - game.removeEvent() - self.reply(irc, msg, 'Onto the next question!', prefixNick=False) - game.nextQuestion() - next = wrap(next, ['onlyInChannel']) - - def rmedit(self, irc, msg, arg, channel, num): - """[] - Deny a question edit. - Channel is only required when using the command outside of a channel. - """ - hostmask = msg.prefix - if self.isTriviaMod(hostmask, channel) == False: - irc.reply('You must be at least a TriviaMod in {0} to use this command.'.format(channel)) - return - - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if self.registryValue('general.globalstats'): - edit = threadStorage.getEditById(num) - else: - edit = threadStorage.getEditById(num, channel) - - if edit: - threadStorage.removeEdit(edit['id']) - irc.reply('Edit %d removed!' % edit['id']) - self.logger.doLog(irc, channel, "%s removed edit# %i, for question #%i, text: %s" % (msg.nick, edit['id'], edit['question_id'], edit['question'])) - else: - if self.registryValue('general.globalstats'): - irc.error('Unable to find edit #{0}.'.format(num)) - else: - irc.error('Unable to find edit #{0} in {1}.'.format(num, channel)) - rmedit = wrap(rmedit, ['channel', 'int']) - - def rmdelete(self, irc, msg, arg, channel, num): - """[] - Deny a deletion request. - Channel is only required when using the command outside of a channel. - """ - hostmask = msg.prefix - if self.isTriviaMod(hostmask, channel) == False: - irc.reply('You must be at least a TriviaMod in {0} to use this command.'.format(channel)) - return - - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if self.registryValue('general.globalstats'): - delete = threadStorage.getDeleteById(num) - else: - delete = threadStorage.getDeleteById(num, channel) - - if delete: - threadStorage.removeDelete(num) - irc.reply('Delete %d removed!' % num) - self.logger.doLog(irc, channel, "%s removed delete# %i, for question #%i, reason was '%s'" % (msg.nick, num, delete['line_num'], delete['reason'])) - else: - if self.registryValue('general.globalstats'): - irc.error('Unable to find delete #{0}.'.format(num)) - else: - irc.error('Unable to find delete #{0} in {1}.'.format(num, channel)) - rmdelete = wrap(rmdelete, ['channel', 'int']) - - def rmreport(self, irc, msg, arg, channel, num): - """[] - Delete a report. - Channel is only required when using the command outside of a channel. - """ - hostmask = msg.prefix - if self.isTriviaMod(hostmask, channel) == False: - irc.reply('You must be at least a TriviaMod in {0} to use this command.'.format(channel)) - return - - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if self.registryValue('general.globalstats'): - report = threadStorage.getReportById(num) - else: - report = threadStorage.getReportById(num, channel) - - if report: - threadStorage.removeReport(report['id']) - irc.reply('Report %d removed!' % report['id']) - self.logger.doLog(irc, channel, "%s removed report# %i, for question #%i text was %s" % (msg.nick, report['id'], report['question_num'], report['report_text'])) - else: - if self.registryValue('general.globalstats'): - irc.error('Unable to find report #{0}.'.format(num)) - else: - irc.error('Unable to find report #{0} in {1}.'.format(num, channel)) - rmreport = wrap(rmreport, ['channel', 'int']) - - def rmnew(self, irc, msg, arg, channel, num): - """[] - Deny a new question. - Channel is only required when using the command outside of a channel. - """ - hostmask = msg.prefix - if self.isTriviaMod(hostmask, channel) == False: - irc.reply('You must be at least a TriviaMod in {0} to use this command.'.format(channel)) - return - - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if self.registryValue('general.globalstats'): - q = threadStorage.getTemporaryQuestionById(num) - else: - q = threadStorage.getTemporaryQuestionById(num, channel) - - if q: - threadStorage.removeTemporaryQuestion(q['id']) - irc.reply('Temp question #%d removed!' % q['id']) - self.logger.doLog(irc, channel, "%s removed new question #%i, '%s'" % (msg.nick, q['id'], q['question'])) - else: - if self.registryValue('general.globalstats'): - irc.error('Unable to find new question #{0}.'.format(num)) - else: - irc.error('Unable to find new question #{0} in {1}.'.format(num, channel)) - rmnew = wrap(rmnew, ['channel', 'int']) - - def repeat(self, irc, msg, arg, channel): - """ - Repeat the current question. - """ - game = self.getGame(irc, channel) - - # Sanity checks - # 1. Is trivia running? - # 2. Is a question being asked? - if game is None or game.active == False: - self.reply(irc, msg, 'Trivia is not currently running.') - elif game.state != 'in-question': - self.reply(irc, msg, 'No question is currently being asked.') - else: - game.repeatQuestion() - irc.noReply() - repeat = wrap(repeat, ['onlyInChannel']) - - def report(self, irc, msg, arg, user, channel, round, text): - """[channel] - Provide a report for a bad question. Be sure to include the round number and the problem(s). - To edit the question, input a regex substitution for the report text. To delete the - question, input 'delete' for the report text. Any other report text will be treated as a - regular report. - Channel is a optional parameter which is only needed when reporting outside of the channel - """ - username = self.getUsername(msg.nick, msg.prefix) - channelCanonical = ircutils.toLower(channel) - game = self.getGame(irc, channel) - if game and text[:2] == 's/' and game.numAsked == round and game.state != 'no-question': - irc.reply('Sorry, you must wait until the current question is over to make a regex report.') - return - - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - question = threadStorage.getQuestionByRound(round, channel) - if question: - if text[:2] == 's/': # Regex substitution - regex = text[2:].split('/') - if len(regex) > 1: - threadStorage.updateUser(username, 1, 0) - pattern = regex[0] - repl = regex[1] - try: - newQuestionText = re.sub(pattern, repl, question['question']) - except: - irc.error('Unable to process this regex substitution.') - return - - if newQuestionText == question['question']: # Ignore if no substitutions made - irc.error('This regex substitution expression does not change the original question.') - else: - threadStorage.insertEdit(question['id'], newQuestionText, username, channel) - irc.reply('Regex substitution detected: Question edited!') - irc.sendMsg(ircmsgs.notice(username, 'NEW: %s' % (newQuestionText))) - irc.sendMsg(ircmsgs.notice(username, 'OLD: %s' % (question['question']))) - self.logger.doLog(irc, channel, "%s edited question #%i, NEW: '%s', OLD: '%s'" % (msg.nick, question['id'], newQuestionText, question['question'])) - else: # Incomplete expression - irc.error('Incomplete regex substitution expression.') - elif str.lower(utils.str.normalizeWhitespace(text))[:6] == 'delete': # Delete - if not threadStorage.questionIdExists(question['id']): - irc.error('That question does not exist.') - elif threadStorage.isQuestionDeleted(question['id']): - irc.error('That question is already deleted.') - elif threadStorage.isQuestionPendingDeletion(question['id']): - irc.error('That question is already pending deletion.') - else: - reason = utils.str.normalizeWhitespace(text)[6:] - reason = utils.str.normalizeWhitespace(reason) - irc.reply('Marked question for deletion.') - self.logger.doLog(irc, channel, "%s marked question #%i for deletion" % (msg.nick, question['id'])) - threadStorage.insertDelete(username, channel, question['id'], reason) - else: # Regular report - threadStorage.updateUser(username, 0, 0, 1) - threadStorage.insertReport(channel, username, text, question['id']) - self.logger.doLog(irc, channel, "%s reported question #%i, Text: '%s'" % (msg.nick, question['id'], text)) - irc.reply('Your report has been submitted!') - else: - irc.error('Sorry, round %d could not be found in the database.' % (round)) - report = wrap(report, ['user', 'channel', 'int', 'text']) - - def restorequestion(self, irc, msg, arg, channel, questionNum): - """[] - Restore a deleted question. - Channel is only required when using the command outside of a channel. - """ - hostmask = msg.prefix - if self.isTriviaMod(hostmask, channel) == False: - irc.reply('You must be at least a TriviaMod in {0} to use this command.'.format(channel)) - return - - username = msg.nick - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if not threadStorage.questionIdExists(questionNum): - irc.error('That question does not exist.') - return - if not threadStorage.isQuestionDeleted(questionNum): - irc.error('That question was not deleted.') - return - threadStorage.restoreQuestion(questionNum) - irc.reply('Question %d restored!' % questionNum) - self.logger.doLog(irc, channel, "%s restored question #%i" % (username, questionNum)) - restorequestion = wrap(restorequestion, ['channel', 'int']) - - def skip(self, irc, msg, arg, channel): - """ - Skip the current question and start the next. Rate-limited. Requires a certain percentage of active players to skip. - """ - username = self.getUsername(msg.nick, msg.prefix) - usernameCanonical = ircutils.toLower(username) - - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - timeSeconds = self.registryValue('skip.skipActiveTime', channel) - totalActive = threadStorage.getNumUserActiveIn(channel, timeSeconds) - channelCanonical = ircutils.toLower(channel) - game = self.getGame(irc, channel) - - # Sanity checks - if game is None or game.active == False: - self.reply(irc, msg, 'Trivia is not currently running.') - elif game.state != 'in-question': - self.reply(irc, msg, 'No question is currently being asked.') - elif not threadStorage.wasUserActiveIn(username, channel, timeSeconds): - self.reply(irc, msg, 'Only users who have answered a question in the last %s seconds can vote to skip.' % (timeSeconds)) - elif usernameCanonical in game.skipList: - self.reply(irc, msg, 'You can only vote to skip once.') - else: - # Ensure the game's skip timeout is set? and then check the user - skipSeconds = self.registryValue('skip.skipTime', channel) - game.skipTimeoutList.setTimeout(skipSeconds) - if game.skipTimeoutList.has(usernameCanonical): - self.reply(irc, msg, 'You must wait %d seconds to be able to skip again.' % (game.skipTimeoutList.getTimeLeft(usernameCanonical)), notice=True) - return - - # Update skip count - game.skipList.append(usernameCanonical) - game.skipTimeoutList.append(usernameCanonical) - self.reply(irc, msg, '%s voted to skip this question.' % username, prefixNick=False) - skipPercent = len(game.skipList)/(totalActive*1.0) - - # Check if skip threshold has been reached - if skipPercent >= self.registryValue('skip.skipThreshold', channel): - game.removeEvent() - self.reply(irc, msg, 'Skipped question! (%d of %d voted)' % (len(game.skipList), totalActive), prefixNick=False) - game.nextQuestion() - skip = wrap(skip, ['onlyInChannel']) - - def stats(self, irc, msg, arg, channel, username): - """ [] - Show a player's rank, score & questions asked for day, month, and year. - Channel is only required when using the command outside of a channel. - """ - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if self.registryValue('general.globalStats'): - stat = threadStorage.getUserStat(username, None) - rank = threadStorage.getUserRank(username, None) - else: - stat = threadStorage.getUserStat(username, channel) - rank = threadStorage.getUserRank(username, channel) - - if not stat: - irc.reply("User not found in database.") - else: - hasPoints = False - infoList = ['%s\'s Stats: Points (answers)' % (self.addZeroWidthSpace(stat['username']))] - if rank['day'] > 0 or stat['points_day'] > 0 or stat['answer_day'] > 0: - hasPoints = True - infoList.append(' \x02Today:\x02 #%d %d (%d)' % (rank['day'], stat['points_day'], stat['answer_day'])) - if rank['week'] > 0 or stat['points_week'] > 0 or stat['answer_week'] > 0: - hasPoints = True - infoList.append(' \x02This Week:\x02 #%d %d (%d)' % (rank['week'], stat['points_week'], stat['answer_week'])) - if rank['month'] > 0 or stat['points_month'] > 0 or stat['answer_month'] > 0: - hasPoints = True - infoList.append(' \x02This Month:\x02 #%d %d (%d)' % (rank['month'], stat['points_month'], stat['answer_month'])) - if rank['year'] > 0 or stat['points_year'] > 0 or stat['answer_year'] > 0: - hasPoints = True - infoList.append(' \x02This Year:\x02 #%d %d (%d)' % (rank['year'], stat['points_year'], stat['answer_year'])) - if not hasPoints: - infoList = ['%s: %s does not have any points.' % (msg.nick, username)] - infoText = ''.join(infoList) - self.reply(irc, msg, infoText, prefixNick=False) - stats = wrap(stats, ['channel', 'nick']) - - def showdelete(self, irc, msg, arg, channel, num): - """[] [] - Show a deleteion request pending approval. - Channel is only required when using the command outside of a channel. - """ - hostmask = msg.prefix - if self.isTriviaMod(hostmask, channel) == False: - irc.reply('You must be at least a TriviaMod in {0} to use this command.'.format(channel)) - return - - if num is not None: - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if self.registryValue('general.globalstats'): - delete = threadStorage.getDeleteById(num) - else: - delete = threadStorage.getDeleteById(num, channel) - - if delete: - question = threadStorage.getQuestionById(delete['line_num']) - questionText = question['question'] if question else 'Question not found' - irc.reply('Delete #%d, by %s Question #%d: %s, Reason: %s'%(delete['id'], delete['username'], delete['line_num'], questionText, delete['reason'])) - else: - if self.registryValue('general.globalstats'): - irc.error('Unable to find delete #{0}.'.format(num)) - else: - irc.error('Unable to find delete #{0} in {1}.'.format(num, channel)) - else: - self.listdeletes(irc, msg, [channel]) - showdelete = wrap(showdelete, ['channel', optional('int')]) - - def showquestion(self, irc, msg, arg, user, channel, num): - """[] - Search question database for question at line number. - Channel is only necessary when editing from outside of the channel. - """ - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - question = threadStorage.getQuestionById(num) - if question: - if question['deleted'] == 1: - irc.reply('Info: This question is currently deleted.') - irc.reply('Question #%d: %s' % (num, question['question'])) - else: - irc.error('Question not found') - showquestion = wrap(showquestion, ['user', 'channel', 'int']) - - def showround(self, irc, msg, arg, user, channel, round): - """[] - Show what question was asked during gameplay. - Channel is only necessary when editing from outside of the channel. - """ - game = self.getGame(irc, channel) - if game and round == game.numAsked and game.state != 'no-question': - irc.error('The current question can\'t be displayed until it is over.') - else: - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - question = threadStorage.getQuestionByRound(round, channel) - if question: - irc.reply('Round %d: Question #%d: %s' % (round, question['id'], question['question'])) - else: - irc.error('Round not found') - showround = wrap(showround, ['user', 'channel', 'int']) - - def showreport(self, irc, msg, arg, user, channel, num): - """[] [] - Shows report information, if number is provided one record is shown, otherwise the last 3 are. - Channel is only necessary when editing from outside of the channel. - """ - if num is not None: - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if self.registryValue('general.globalstats'): - report = threadStorage.getReportById(num) - else: - report = threadStorage.getReportById(num, channel) - - if report: - irc.reply('Report #%d \'%s\' by %s on %s Q#%d '%(report['id'], report['report_text'], report['username'], report['channel'], report['question_num'])) - question = threadStorage.getQuestionById(report['question_num']) - if question: - irc.reply('Question #%d: %s' % (question['id'], question['question'])) - else: - irc.error('Question could not be found.') - else: - if self.registryValue('general.globalstats'): - irc.reply('Unable to find report #{0}.'.format(num)) - else: - irc.reply('Unable to find report #{0} in {1}.'.format(num, channel)) - else: - self.listreports(irc, msg, [channel]) - showreport = wrap(showreport, ['user', 'channel', optional('int')]) - - def showedit(self, irc, msg, arg, channel, num): - """[] [] - Show top 3 edits, or provide edit num to view one. - Channel is only required when using the command outside of a channel. - """ - hostmask = msg.prefix - if self.isTriviaMod(hostmask, channel) == False: - irc.reply('You must be at least a TriviaMod in {0} to use this command.'.format(channel)) - return - - if num is not None: - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if self.registryValue('general.globalstats'): - edit = threadStorage.getEditById(num) - else: - edit = threadStorage.getEditById(num, channel) - - if edit: - question = threadStorage.getQuestionById(edit['question_id']) - irc.reply('Edit #%d by %s, Question #%d'%(edit['id'], edit['username'], edit['question_id'])) - irc.reply('NEW:%s' %(edit['question'])) - if question: - irc.reply('OLD:%s' % (question['question'])) - else: - irc.error('Question could not be found for this edit') - else: - if self.registryValue('general.globalstats'): - irc.error('Unable to find edit #{0}.'.format(num)) - else: - irc.error('Unable to find edit #{0} in {1}.'.format(num, channel)) - else: - self.listedits(irc, msg, [channel]) - showedit = wrap(showedit, ['channel', optional('int')]) - - def shownew(self, irc, msg, arg, channel, num): - """[] [] - Show questions awaiting approval - Channel is only required when using the command outside of a channel. - """ - hostmask = msg.prefix - if self.isTriviaMod(hostmask, channel) == False: - irc.reply('You must be at least a TriviaMod in {0} to use this command.'.format(channel)) - return - - if num is not None: - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if self.registryValue('general.globalstats'): - q = threadStorage.getTemporaryQuestionById(num) - else: - q = threadStorage.getTemporaryQuestionById(num, channel) - - if q: - irc.reply('Temp Q #%d by %s: %s'%(q['id'], q['username'], q['question'])) - else: - if self.registryValue('general.globalstats'): - irc.error('Unable to find new question #{0}.'.format(num)) - else: - irc.error('Unable to find new question #{0} in {1}.'.format(num, channel)) - else: - self.listnew(irc, msg, [channel]) - shownew = wrap(shownew, ['channel', optional('int')]) - - def start(self, irc, msg, args, channel): - """ - Begins a round of Trivia inside the current channel. - """ - game = self.getGame(irc, channel) - - # Sanity checks - # 1. Is trivia running? - # 2. Is the previous trivia session still in the shutdown phase? - # 3. Is there a stop pending? - if game is None: - # create a new game - self.reply(irc, msg, 'Another epic round of trivia is about to begin.', prefixNick=False) - self.createGame(irc, channel) - elif game.active == False: - self.reply(irc, msg, 'Please wait for the previous game instance to stop.') - elif game.stopPending == True: - game.stopPending = False - self.reply(irc, msg, 'Pending stop aborted', prefixNick=False) - else: - self.reply(irc, msg, 'Trivia has already been started.') - start = wrap(start, ['onlyInChannel']) - - def stop(self, irc, msg, args, user, channel): - """ - Stops the current Trivia round. - """ - game = self.getGame(irc, channel) - - # Sanity checks - # 1. Is trivia running? - # 2. Is a question being asked? - # 2.1 Is a stop pending? - if game is None or game.active == False: - self.reply(irc, msg, 'Game is already stopped.') - elif game.state != 'no-question': - if game.stopPending == True: - self.reply(irc, msg, 'Trivia is already pending stop.') - else: - game.stopPending = True - self.reply(irc, msg, 'Trivia will now stop after this question.', prefixNick=False) - else: - game.stop() - irc.noReply() - stop = wrap(stop, ['user', 'onlyInChannel']) - - def time(self, irc, msg, arg): - """ - Figure out what time/day it is on the server. - """ - timeStr = time.asctime(time.localtime()) - self.reply(irc, msg, 'The current server time appears to be {0}'.format(timeStr), prefixNick=False) - time = wrap(time) - - def transferpoints(self, irc, msg, arg, channel, userfrom, userto): - """[] - Transfers all points and records from one user to another. - Channel is only required when using the command outside of a channel. - """ - hostmask = msg.prefix - if self.isTriviaAdmin(hostmask, channel) == False: - irc.reply('You must be a TriviaAdmin in {0} to use this command.'.format(channel)) - return - - userfrom = userfrom - userto = userto - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - threadStorage.transferUserLogs(userfrom, userto, channel) - irc.reply('Transferred all records from {0} to {1} in {2}.'.format(userfrom, userto, channel)) - self.logger.doLog(irc, channel, '{0} transferred records from {1} to {2} in {3}.'.format(msg.nick, userfrom, userto, channel)) - transferpoints = wrap(transferpoints, ['channel', 'nick', 'nick']) - - def week(self, irc, msg, arg, channel, num): - """[] [] - Displays the top scores of the week. - Parameter is optional, display up to that number. (eg 20 - display 11-20) - Channel is only required when using the command outside of a channel. - """ - num = max(num, 10) - offset = num-9 - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if self.registryValue('general.globalStats'): - tops = threadStorage.viewWeekTop10(None, num) - else: - tops = threadStorage.viewWeekTop10(channel, num) - - topsList = ['This Week\'s Top {0}-{1} Players: '.format(offset, num)] - if tops: - for i in range(len(tops)): - topsList.append('\x02 #%d:\x02 %s %d ' % ((i+offset) , self.addZeroWidthSpace(tops[i]['username']), tops[i]['points'])) - else: - topsList.append('No players') - topsText = ''.join(topsList) - self.reply(irc, msg, topsText, prefixNick=False) - week = wrap(week, ['channel', optional('int')]) - - def year(self, irc, msg, arg, channel, num): - """[] [] - Displays the top scores of the year. - Parameter is optional, display up to that number. (eg 20 - display 11-20) - Channel is only required when using the command outside of a channel. - """ - num = max(num, 10) - offset = num-9 - dbLocation = self.registryValue('admin.db') - threadStorage = Storage(dbLocation) - if self.registryValue('general.globalStats'): - tops = threadStorage.viewYearTop10(None, num) - else: - tops = threadStorage.viewYearTop10(channel, num) - - topsList = ['This Year\'s Top {0}-{1} Players: '.format(offset, num)] - if tops: - for i in range(len(tops)): - topsList.append('\x02 #%d:\x02 %s %d ' % ((i+offset) , self.addZeroWidthSpace(tops[i]['username']), tops[i]['points'])) - else: - topsList.append('No players') - topsText = ''.join(topsList) - self.reply(irc, msg, topsText, prefixNick=False) - year = wrap(year, ['channel', optional('int')]) - - -Class = TriviaTime -# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff --git a/Jeopardy/requirements.txt b/Jeopardy/requirements.txt deleted file mode 100644 index 416644d..0000000 --- a/Jeopardy/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -requests -unidecode diff --git a/Jeopardy/storage/questions b/Jeopardy/storage/questions deleted file mode 100644 index fcc4849..0000000 --- a/Jeopardy/storage/questions +++ /dev/null @@ -1,1000 +0,0 @@ -Food and Drink: Which country does the dish Weaver Moths In Their Nests come from*Zaire -Alcohol: Name That Drink: Blueberry ____*daiquiri -TV: Whose associate was J. Wellington Wimpy*popeye -Religion: What is the holy book of the Sikhs called*adi granth -Useless Facts: The average American's diet today consists of 55 percent -----------*junk food -Who was the subject of the 1972 film biography 'Lady Sings the Blues'*Billie Holiday -Cars: What was the model name of Ford's retractable hardtop convertible*The Ford Fairlane 500 -Tom Clancy: The I in DDI (Ryan's position in the CIA at one point) stands for this*intelligence -In a church what is a galilee*porch -According to superstition, if a woman dreams of making a bed she will soon have a ________ in her life*New Lover -UWord*scintillometer -Definitions: Pertaining to or founded on the number 10*decimal -Science: Rock, the original composition & texture of which has been altered by heat & pressure deep within the earths crust*metamorphic -Religion: Whose patron is St Francis de Sales*authors -Geography: What canal separates Africa from Asia*suez canal -Sports: What make of British car won the Le Mans motor race five times from 1924 to 1930*Bentley -Nature: What does a cat use to determine if a space is too small to squeeze through*whiskers -What city is also known as beantown*boston -Geography: What is the world's no.27 most populous city*Guangzhou -USA: Palestine, Texas, has an annual festival celebrating what typically Texan Vegetable*Hot Peppers -Which was the first book to tell the story of the lioness Elsa*born free -Canadian: British Columbia shares common borders with which provinces and territories*Alberta, Northwest Territories and Yukon -Geography: The northernmost U.S. state capital is -*juneau, alaska -Science: What do you have a lot of if you are hirsute*hair -Definitions: Rod shaped*bacillary -Canadian: What is the official motto of the Royal Canadian Mounted Police*Uphold the Right -Geography: Capital Cities: Botswana*gaborone -Who sculpted the famous nude figure of David and painted the fresco in the Sistine Chapel*Michelangelo -Americana: In what American city was the first blood bank opened*new york -Science: What is the alternative name for the Galaxy*milky way -Geography: The Falkland Islands are in which ocean*Atlantic -Dutch: What's the capital of the Dutch province Noord Brabant*Den Bosch -People: Born Mar 10,1958, she starred in this movie: Stardust Memories - 1980*sharon stone -Canadian: Where was Canadian director Atom Egoyan born*Cairo, Egypt -History: In 1915 Moshe ---------- Israeli general/politician, born*dayan -People: Famous People Who Were Adopted*Gerald Ford -Which literary traveller was accompanied by Passepartout*Phileas Fogg -Science: Biology: Between where does the ureter carry urine*kidneys and bladder -Sports: Tennis: Where's Larisa Neiland from*Latvia -Quotes: The important thing is not to stop -------------.- Albert Einstein (1875-1955)*questioning -Geography: Whats the official language of Morocco*Arabic -Anne Rice: What was Lestat's mother's name*Gabrielle -Who wrote 'The Secret Garden'*frances hodgson burnett -Food and Drink: What are penny buns, puffballs and stinkhorns*mushrooms -Science: Physics: The force that brings moving bodies to a halt is _________*friction -What is the symbol of the democratic party*donkey -International: Politics: In which country was Nicolae Ceausescu executed after an army uprising in 1990*Romania -Celebrities Deaths: 1844 - founder of Mormon religion, shot by an angry mob while he was jailed in Carthage, IL*Joseph Smith -Ad Slogans: Zoom Zoom*mazda -In the story of Cinderella, her slippers were originally made from what, but they became glass because of an error in translation*fur -Survival: What does the International Ground-to-air code, LL , mean*all is well -History: Who was forced by indian troops into the black hole of calcutta*british officers -Myths: Who was the Roman sky god*Jupiter -Words: Languages: If you were to hear the greeting Chao, what language would you be listening to*Vietnamese -Canadian: What Canadian city's Royal Victoria Hospital was constructed with the help of a 500,000 Dollar donation from Donald Smith in 1887*Montreal -History: From which country did the usa purchase alaska from in 1867*russia -Science: Space: The first successful British/American space satellite was launched in April 1962, named after a character in Shakespeare's The Tempest*ariel -History: In 1949 ---------- Knopfler guitar/vocals (Dire Straits), born*mark -Which US state would you be in if you were in Chicago*Illinois -Food and Drink: What are the main ingredients in the Greek dish moussaka*eggplant and lamb -Geography: A whirlpool below ______ iced over for the first time on record, on March 25, 1955*Niagara Falls -People: Of who did the u.s postal service print 500 million stamps in 1993*elvis presley -Alcohol: Cocktails: 1/2 ounce of Ameratto and 1/2 ounce of V.O. and shoot it!*Silver Special -Clothes designer Alexander McQueen works for which fashion house*givenchy -Food and Drink: What food of the three bears did goldilocks eat*porridge -Food and Drink: According to Archives of General Medicine, coffee drinkers have ________ more frequently and enjoy it more than non coffee drinkers*sex -People: Born Sep 28, 1934, she starred in this movie: Bardot-Godard ou Le Parti des Choses - 1964*brigitte bardot -Entertainment: What 1972 musical saw David Essex as Jesus Christ*godspell -History: In 1972 John Young & ______ explore Moon (Apollo 16)*Charles Duke -Generation X Games & Toys: Plastic vehicle equipped with spin-out brake*big wheel -TV: What was the name of buffy's doll in the 1970s show 'family affair'*mrs beasley -USA: What US company founded in 1907 affectionately called employees brown shirts*United Parcel Service*UPS -Science: What is the chemical flouride said to prevent*tooth decay -Science: What is a Canis Lupus*wolf -History: In 1947 Tennessee ---------- play A Streetcar Named Desire, opens*williams -Authors: Who wrote Hunt for Red October*tom clancy -Religion: Where do pilgrims go to march around the Kaaba and kiss The Black Stone*mecca -International: In which country was the first military tank invented*England -History: In 1790 Sir William ----------, British Arctic explorer, born*parry -Science: Biology: A Laforte fracture is a fracture of all _____ bones*facial -TV: Beverly Hillbillies: What was the name and product of the commercial Jethro produced starring Flatt and Scruggs*Foggy Mountain Soap -History: Which naturalist sailed around the world studying rocks, animals and plants*Charles Darwin -TV: Star Trek Classic: He said, "Love and compassion are dead in you. You're nothing but intellect."*kirk -Science: The diagrammatic representation of subway maps, circuit boards and many other complicated networks is called*topology -Canadian: What war saw the Canadian Corps engaged in a battle over Vimy Ridge*World War One*World War II -Nature: What species is the nocturnal firefly*beetle*a beetle -History: What second world war airplane was named the wooden wonder*dehavilland mosquito -Science: Biology: Death of body tissue usually caused by bad circulation*gangrene -USA: Who installed the first self-service elevator in the US*Otis Elevator -Nature: Insects: What insect is responsible for transmitting malaria*mosquito -History: In 1884 Statue of ---------- presented to US in Paris*liberty -Which ballerina was The Dying Swan ballet specially written for*anna pavlova -International: What country's car registration mark is PL*poland -History: Wars: What event ended WW2*bombing of nagasaki -Entertainment: Entertaining Animals: What animal species are Elsa and Simba*lions -Religion: What's the christian penitential season from end of november to christmas*advent -Who wrote the novels on which the films 'Carrie' and 'The Shining' were based*stephen king -USA: What Christian leader drew enormous crowds on his 1995 American tour*Pope John Paul II -Canadian: What two colours is the word, Canadian, on the Molson's Canadian label printed in*Red and Blue*Blue and Red -History: In 1971 Soviet Mars 3 is 1st to soft land on ----------*mars -Canadian: Cedar Lake and Lake Manitoba flow into what larger lake*Lake Winnipeg -Science: Biology: What would you be if you were dextral*right handed -USA: What California city hosts an international auto race on its downtown streets*Long Beach -People: Born Dec 1, 1945, she starred in this movie: Beaches - 1988*bette midler -USA: Where did the rearview mirror make its debut*Indianapolis 500 -Canadian: The Canadian records for most rain in one day, one month, and one year are all held by which province*British Columbia -Definitions: To cause sorrow to*aggrieve -USA: What Revolutionary War naval commander said, I have not yet begun to fight*John Paul Jones -Geography: The _____ River (also known as the Zaire) is over 2,720 miles long making it the second longest in Africa, and the fifth longest in the world*Congo -People: I starred in these movies: Sleepless in Seattle, Apollo 13, The Green Mile*Tom Hanks -What does a catastrophic narcissist fear*mirrors -Definitions: to confirm*attest -Books: Little boys are made of frogs, ------, and puppy-dogs tails*snails -Who created the detective Roderick Alleyn*Ngaio Marsh -USA: What metropolis in Wisconsin has the Pabst Mansion, Pabst Theatre and Pabst Brewery*Milwaukee -What two biblical cities did God destroy with fire & brimstone*sodom & gomorrah -History: In 1540 Society of ---------- (Jesuits) founded by Ignatius Loyola*jesus -History: In 1782 ---------- Washington creates the Order of the Purple Heart*george -History: Who is famously buried in the churchyard at Bamburgh, Northumberland*grace darling -History: What morman leader was said to have 27 wives*brigham young -History: In 1947 ---------- James (O.J.) Simpson, NFL running back (Buffalo Bills), born*orenthal -Lyrics: Name that Tune: You make the sun shine brighter than Doris day*wake me up before you go-go*wake me up before you go go -Iron block on which metals are worked*anvil -Science: What is 'mpd'*multiple personality disorder -Quotes: Who said this: Dreams are the Guardian of Sleep'*sigmund freud -Definitions: A discussion*debate -Of what, is a Dutch Beefsteak a variety*tomato -History: In 1848 William ---------- Grace, Victorian England's greatest cricketer*gilbert -Geography: What US states were named for the Sioux word friend or ally*dakota -Geography: What southern city is now located where fort dallas once stood in 1895*miami -USA: What nation did 260,000 refugees flee from, only to crowd Miami in the 1960s*Cuba -Definitions: A formal combat between two mounted knights*joust -This means the art of twisting together strands of material to form objects. (_________)*basketry -History: Wars: What was the term for any underground shelter for troops in World War I*Dugout -In his autobiography, A.A. Milne said that the characters in Winnie the Pooh were based on his son's stuffed animals. But where did Milne get the name for Winnie the Pooh*bear named winnipeg -TV: Who is Olive Oyl's boyfriend*Popeye -Advertising: What kind of animal was Little Nippers in the famous RCA phonograph ad*dog -Geography: In what country are the cities of: Gloucester, Newport and St Ives*England -People: Which fun pair starred in A Chump at Oxford*Laurel and Hardy -In which cult novel do gang members known as 'droogs' appear*a clockwork orange -Science: Space: Who said, The Eagle has landed*Neil Armstrong -What's the international radio code word for the letter W*whiskey -Football: What team holds the record for the most numbers retired*chicago bears -Food and Drink: Which country has the most doughnut shops per capita*Canada -A Waterman Pen Set - given as a promotional item in the 1940s - now sells for 2000 dollars. The unique claim it made at the time, which made it so popular, was*Guaranteed for 100 years -Science: Medicine: Warfarin is used to prevent what happening to you*blood clots -USA: What building graces the back of a 20 dollar bill*White House -DC Secret Identities: Arthur Curry*aquaman -Languages: What language gave us the words kimono & futon*japanese -Born Dec 31, 1937, He starred in this movie: The Remains of the Day*anthony hopkins -Definitions: A style of art and architecture*baroque -TV: What show was 'run d.m.c' the first rap group*American bandstand -Geography: What is the largest man made lake in the world*lake mead -The Wizard of ____*Oz -Authors: Who wrote The Runaway Jury*john grisham -Alcohol: Almond liqueur that comes from the Italian for bitter, not love*amaretto -Science: Biology: What organ will most often suffer permanent damage if you have amoebic dysentery*the liver*liver -USA: What activity can be done at Pismo Beach, California*Driving on the Beach -Americana: What American general declared I shall return*douglas macarthur -TV: Beverly Hillbillies: Who was the famous guest star in the episode Granny Learns to Drive*Mel Blanc -Nature: Name That Dog Breed _________*Saluki -Science: Biology: Polio is also known as _____*infantile paralysis -Nature: What is a group of this animal called: plovers in flight*wing -Flags: The national flag of _____ was designed by Napoleon Bonaparte*Italy -DEF:Sparing in the consumption of food or alcohol*abstemious -Science: Biology: Where would you find the medula oblongata*brain -In geological terms which period completes the Mesozoic era: Triassic, Jurassic and*cretaceous -USA: What happened in today's Los Angeles area on September 4, 1781*Founded by Spanish Settlers -TV: Gen X TV: What was the name of the robot agent in "Get Smart"*hymie -What is the longest typed word that alternates hands*skepticisms -Definitions: To whiten*bleach -Computers: Techy: In computer terminology what does SSL stand for*Secure Socket Layer -History: Wars: What special cargo did the US. sub Trout carry in WW2*gold -International: Where in France is the summer residence of the French President*fontainebleau -What's Penthouse's sister publication for women*viva -History: In 1779 Clement Clarke ----------, American author ('Twas the Night Before Xmas), born*moore -Geography: By what name do we know the country Chosun MinchuChui Inmim KonghwaGuk*korea -People: Born May 6, 1961, he starred in this movie: Batman & Robin - 1997*George Clooney -Definitions: A series of connected military operations*campaign -60s: He was the first president born in the 20th century*kennedy -Nature: What do humans catch zoonose diseases from*animals -People: Who won the Oscar for best ACTRESS in a Supporting role in 1942 15th Academy Awards for the Movie MRS. MINIVER*teresa wright -What do you need to be able to operate a lever*fulcrum -Science: Diseases: Narcolepsy is the uncontrollable need to ______*sleep -International: In which country are Cape Otway, Mount Gambier, and the Grampian Mountains*Australia -Sports: Which tennis star wore denim shorts during matches*andre agassi -History: In 1877 James Montgomery ----------, illustrator, best known for his I want you Uncle Sam recruiting poster*flagg -USA: What popular food product was Thomas Adams the first to sell in Jersey city in 1869*Chewing Gum -Nature: Horses: What is the process of filing a horse's teeth called in Britain*Rasping -People: Born Dec 31, 1937, he starred in this movie: Instinct - 1999*anthony hopkins -Science: What is the opposite of allopathy*homeopathy -TV: Who am I: I am one of Seinfeld's neighbors and work at the post office*Newman -History: On This Day: 10 November 1975 PLO leader Yasser ---------- addresses UN in NYC*Arafat -Religion: Who is the patron saint of navigators*star of the sea -Geography: In which country is the Dalai Lamas palace*Tibet -People: Born Aug 17, 1943, he starred in this movie: Flawless - 1999*robert de niro -Cricket: Who was the first batsman to achieve six sixes in one over*garfield sobers -Nature: What is a group of this animal called: Fish*school*shoal*run*haul*catch -Food and Drink: What country's people were taxed for using salt in the 17th century*france -Nature: What is a group of this animal called: buzzards*wake -Shirley MacLaine starred in this movie in 1958*the matchmaker*matchmaker -Religion: Which is the only city still in existence that is mentioned in Genesis*damascus -History: In 1983 David ----------'s Let's Dance single goes #1*bowie -Sports: What trophy is awarded to the winner of the NHL play-offs*stanley cup -Which artist did the stage design for the ballet 'Parade'*picasso -Nature: A South African ---------- can grow to be 35 inches (90 cm) in length - longer than your arm*bullfrog -Geography: What is France's national flower*fleur de lys -Geography: What U.S. state has the longest border with Canada*alaska -Entertainment: Musicals- Cats: Who scattered the Pekes and the Pollicles with eyes that were like fireballs fearfully blazing*The Rumpus Cat -This award is the mystery writers equivalent of an Oscar*edgar -Geography: Money: World Currency: Nigeria*Naira -Alcohol: Name That Drink: Mint ____*Chip -History: Which company built the WW2 Spitfire*Supermarine -Catholic bishops are allowed seven of them, priests five, and ordinary people one: what are they*crosses on a tomb -International: Politics: Which meeting between politicians of the Irish Republic and Northern Ireland took place May 1983*New Ireland Forum -History: In 1940 ---------- evacuated before the German advance*paris -A bottle of wine originating from the 'Nobilo' vineyards, is produced in which country*new zealand -People: The first person to interview Frank Sinatra on a TV talk show (1984)*jerry lewis -Geography: What are the worlds four oceans alphabetically*arctic, atlantic, indian and pacific -Science: Biology: Portion of the central nervous system contained within the skull*brain -With which sport is Jack Nicklaus associated*golf -TV: Cartoon Sidekicks: Buster Bunny*babs bunny -History: In 1936 Spanish Civil War began as Gen. Francisco ---------- led uprising*franco -History: In 1956 ---------- gains its independence*morocco -Definitions: Agreement*accordance -History: In 1553 City of ----------, England established*lichfield -Food and Drink: ______, made from the dried stamens of cultivated crocus flowers, is the most expensive cooking spice*saffron -History: What World War II commander had the forename Erwin*rommel -What is Sades real name*Helen Adu -Science: What type of lens is used in a magnifying glass*Convex -People: Born Feb 27, 1932, she starred in this movie: Who's Afraid of Virginia Woolf - 1966*elizabeth taylor -Geography: World Disasters: Space: December 26, 2003, which probe that was scheduled to land on the surface of mars remained silent for 3 days*beagle 2 -History: In 1981 Pope John ---------- gets out of hospital after attempt on life*paul ii -People: Rodney Dangerfield left what career to return to show business*paint salesman -Nature: How fast can a kangaroo hop*forty mph -Computers: What does LISP mean*list processor -What is the name given to the side post of a door*Jamb -Cartoon Trivia: What is the mother's name in Family Circus*thelma -Chemical compound that has the formula nacl*salt -History: On This Day: 18 February 1975 2nd American ---------- Award*music -History: In 1918 Anwar El ----------, president of Egypt, born*sadat -Canadian: What river defines the border between Ontario and Quebec from Mattawa to near Montreal*Ottawa River -People: Born Feb 27, 1932, she starred in this movie: Jane Eyre - 1944*elizabeth taylor -History: What city was conquored by Joshua*jericho -People: Inventors: ______ _______ were invented in Saratoga Springs in 1853 by chef George Crum*potato chips -USA: What welcome item was installed in the Statue of Liberty in 1986*Elevator -Who said "I've had such a curious dream"*alice -Definitions: A plant of the lily family*hyacinth -Geography: Which European city has a bridge called the Donkey Bridge*amsterdam -Cyberpunk: Name of Max Headroom's alter ego*edison carter -Food and Drink: A red tea, rich in vitamin C is made from this flower, which is native to the Nile Valley*hibiscus -USA: What southwestern state has the largest Indian population in the US*Oklahoma -History: In 1936 First ---------- substance produced synthetically (radium E)*radioactive -Americana: What city gets water through the delaware aqueduct*new york -Nature: Herbs and Plants: This herb as the ability to stimulate the immune system and is useful in encouraging healing in upper respiratory infections*Echinacea -What US general was known as old blood & guts*george s patton jr -Devils Dictionary: One skilled in circumvention of the law*lawyer -History: By what name was the Scottish outlaw Robert McGregor better known*Rob Roy -International: International Vehicle Registration Letters: What country uses the letter V*Vatican City -Sports: What sport did Olga Korbut excel at*gymnastics -Geography: Capital Cities: Azerbaijan*baku*baki -Walter Farley's series about an ebony equine*The Black Stallion -Definitions: The overhead covering of a room*ceiling -What's the international radio code word for the letter "B"*bravo -Clive Barker: Calhoun Mooney discovers the Fugue while chasing what (Weaveworld)*a pigeon -Nature: Name That Dog Breed _________*Italian Spinone -People: Who was the only actor to become president of the US*ronald reagan -TV: Little House on the Prarie, what was the teachers name*miss beatle -Science: What is a red blood cell*erythrocyte -USA: Rev. John Mitchell organized the first troop of what boys' organization*Boy Scouts of America -History: In 1930 John ----------, actor (Gomez in TV Addams Family), born*astin -Geography: What is the former zaire now known as*the democratic republic of congo -Science: Biology: Which is the longest bone in the body*femur -Nature: All mammals have ----------*tongues -Nature: What does an insect do when it moults*sheds its skin -Geography: Which is the largest desert in the world*Sahara -Quotes: Old soldiers never die, they just fade away*douglas macarthur -History: In 1851 Walter ----------, who proved mosquitoes transmit yellow fever, born*reed -Geography: What European country celebrates new year's day by drinking 'glogg'*sweden -Nature: The largest known egg ever laid by a creature was that of the extinct ---------- of Madagascar. The egg was 9.5 inches long. It had a volume of 2.35 gallons*aepyornis -Sports: Tennis: Where's Evie Dominikovic from*Australia -Where did Lord Byron die*greece -Myths: Who was the Roman god of the underworld*Pluto -Quotes: Power corrupts, & absolute power corrupts absolutely*john emerich edward acton -Chinese: Calendar: If you were born in the year 1987, you were born in the year of the what*Rabbit -History: This military attack took place on Dec. 7, 1941*pearl harbor -Common name applied to a group of vegetable products, both amorphous & crystalline, obtained from various plants, & important commercially in the tanning of leather*tannins -People: What Greek runner of 5 bc is said to have run 241 km in 48 hours to summon help for Athens*pheidippedes -Who killed macbeth*macduff -Entertainment: What was Elvis Presely's first film in 1956*love me tender -International: International Vehicle Registration Letters: What country uses the letters RI*Indonesia -Nature: What type of animal is an auklet*bird -USA: How did the town of Haleyville, Alabama react when the state seceded from the Union in 1861*Citizens Voted to Secede -Who wrote the music for the show "A Chorus Line"*marvin hamlisch -History: On This Day: 17 December 1972 New line of control agreed to in Kashmir between India & ----------*pakistan -History: In 1385 ---------- defeat Castilians at Aljubarrota, retain independence*portuguese -Geography: The nation of covers approximately the same land area as the state of Wisconsin. Yet it ranks eighth in population among all the world's countries*bangladesh -Geography: Is smaller than the state of Montana (116,304 square miles and 147,138 square miles, respectively)*italy -Entertainment: Disney: Wizard Of Oz: Glinda's first words to Dorothy. (9 words)*are you a good witch or a bad witch -TV: Muppet Mania: Name of the muppet that throws boomerang fish*lew -Name The Poet: A Red, Red Rose*robert burns -People: Born Sep 28, 1934, she starred in this movie: La Bride sur le Cou - 1961*brigitte bardot -History: Who was ______ & romeda's mother*cassiopeia -Whose novels include 'Restoration' and 'The Way I Found Her'*rose tremain -People: Born Aug 8, 1937, he starred in this movie: Sphere - 1998*dustin hoffman -Science: What type of celestial body is andromeda*galaxy -People: Inventors: In 1925, John Logie Baird invented what*television -People: What black comic always had a poem for his audience*nipsy russell -Canadian: What movie sees Canadian-born Kate Nelligan play Stella Kowalski*A Streetcar Named Desire -Whose record did Babe Ruth break when he hit 60 home runs in 1927*his own*Babe Ruth*Babe Ruth's*his -History: Florence Nightingale was a nurse during which war*The Crimean War -History: In 1861 Fort Sumter, SC, shelled by ---------- troops under General Beauregard. The American Civil War begins*confederate -Americana: One in every 4 Americans has appeared*on television -Iceberg, boston, & bibb are types of _________*lettuce -History: In 1987 Digging begins to link England and ---------- under the English Channel*france -In which Commonwealth country is the wine producing area of Marlborough*new zealand -Alcohol: Name That Drink: Russian ____*Kamikaze -Definitions: Yielding profit*gainful -Science: What is the Zodiac sign of the ram*aries -Geography: Where is Lake Winnebago*wisconsin -Africa: Where in Africa would we be if in these places: Marrakech - Casablanca - Rabat - Safi*Morocco -Entertainment: Disney: Wizard Of Oz: Second kind of animal heard in the MGM film*chicken -Entertainment: Disney: Who was the original voice of Goofy*Pinto Colvig -Religion: What does a nihilist believe in*nothing -Who was the Jackal's intended victim*charles de gaulle -Nature: What is the world's fastest land animal*cheetah -People: Born July 30, 1947, he starred in this movie: Batman & Robin - 1997*arnold schwarzenegger -USA: The flag of what nation flew briefly over Arizona in the 1860s*Confederate States of America -Geography: What is south africa's national flower*protea -Science: Which element derives its name from the Greek for 'bringer of light'*phosphorus -Computers: Technology: COM port*communications port -Geography: What do you call somebody from Liverpool*Liverpudlian -Entertainment: What name is given to the tent-like structure that some travelling circuses still use*The Big Top -History: In 1902 ---------- Wankel, Germany, inventor (Wankel rotary-piston engine), born*felix -Nature: Babies: What is a young owl called*owlet -Canadian: What novel's character include Kip, Hana, Carvaggio and the Englishman*The English Patient -Canadian: Who was the Quebec Nordiques number one pick for the 1991 draft*Eric Lindros -L is the roman numeral for what number*fifty -Definitions: A small retail shop*boutique -People: Born Jan 3, 1956, he starred in this movie: The Bounty - 1984*mel gibson -Who painted the Sistine Chapel at the Vatican*Michelangelo -Science: In biology, what's the name for leaf pores*stomata -Canadian: What is Toronto's CFL team called*Argonauts -Science: GENETICS: Name the enzyme that catalyzes formation of DNA from mRNA*reverse transcriptase -Canadian: What canadian province has no skunks, poison ivy or snakes*newfoundland -Buried in Kensal Green Cemetery in London, who was the tightrope walker who crossed Niagara Falls blindfolded and on stilts*emile blondin -Nature: What is the creature that is half eagle, half lion*griffin -Canadian: Who was the first Liberal prime minister*Alexander Mackenzie -History: In 1901 ---------- Maass army nurse sacrificied her life at 25 to prove that the mosquito carries yellow fever*clara -History: In 1865 William Butler ----------, poet (Wild Swans at Coole-Nobel 1923), born in Ireland*Yeats -TV: Rush Limbaugh: Rush's chief of staff*kit carson -Geography: Brussels is the capital of _______*belgium -Americana: 21 percent of US kids say they'd 'eat____ every day for dinner' if they were President*ice cream -Geography: What U.S. city is named after Saint Francis of Assisi*san francisco -History: In 1956 Johnny ---------- [John Lydon], rocker (Sex Pistols-God Save the Queen), born*rotten -People: Who married Thelma Catherine Patricia Ryan*richard nixon -In which American state is Princeton University*new jersey -History: In 1971 Jim Morrison rocker (Doors), dies of heart failure in ----------*paris -Sports: What football team has won the most Rose Bowls*southern california -Americana: As what was Sir Matthew Baillie Begbie known as in the late 1800s*hanging judge -Computers: In the late 60s, Robert Noyce and Gordon Moore left Fairchild Semiconductors to found a new startup. Which company*Intel -Science: What is the abbreviation for trinitrotoluene*tnt -History: In 1889 Dr John F ---------- developed pencillin treatment of syphillis, born*mahoney -Television: What are the names of the two aliens in the animated series, "The Simpsons"*Kang and Kodos -Food and Drink: Framboise is a liqueur flavoured with what*raspberries -Science: Space: Who reviewed billions and billions of radio telescope signals in the 1980s and felt only 37 warranted further investigations*Carl Sagan -History: In 1983 Carolyn Jones actress (Morticia-Addams Family), dies at 54 of ----------*cancer -Entertainment: What is Sianel Pedwar Cymru*Welsh language TV service -In electronics, device used to propagate radio or electromagnetic waves or to capture radio waves*antenna -Who is the author of Jude the Obscure*thomas hardy -Nature: Which animal depicts 1996 in the Chinese Calendar*the tiger -TV: Beverly Hillbillies: What was the name of the diner Jethro ran*The Happy Gizzard -Canadian: Who were the only two prime ministers in office during the 1970s*Trudeau and Clark*Clark and Trudeau -Computers - what key on the keyboard "shifts" the alphabets keys to "uppercase"*caps lock -Geography: What are the two basic aids in orienteering*map and compass -Canadian: What are Newfoundland tolts made of*Rock -History: What did ancient Egyptians make from the tall water plant papyrus*paper -People: Inventors: Where was the crossbow invented*china -People: Born Oct 1, 1935, she starred in this movie: Victor/Victoria - 1982*julie andrews -Nature: There is no mention of cats or rats in the ----------*bible -Geography: The Seven Wonders of the Ancient World are: the Pyramids of Egypt, the Statue of Zeus, the Temple of Artemis, the Mausoleum of Halicarnassus, the Colossus of Rhodes, the Lighthouse of Alexandria and the ______*hanging gardens of babylon -Potpourri: SI Units of Magnetic Flux*weber -Definitions: A silver white metallic element*antimony -People: Who was born sarah jane fulks*jane Wyman reagan -Who wrote the novel which Bizet based his opera Carmen on*Prosper Merimee -Canadian: What Canadian city is home to the RCMP Centennial Museum*Regina -People: Name the actor that played the hitman in the movie Grosse Point Blank*John Cusack -Tolkien: Who said, 'It's an ill wind as blows nobody no good, as I always say. And All's well as ends Better!'*the gaffer -Science: Space: Which planet has a year lasting approximately 88 earth days*mercury -Food and Drink: What fruit is the basis for guacamole*avocado -Bizarre Celebrity Suicides: 1978 Rock Musician (Chicago) suicide playing Russian roulette*Terry Kath -History: In 1943 Keith ----------, guitarist (Rolling Stones),born*richards -History: In 1626 Peter ---------- purchases Manhattan Island for 24 dollars*minuet -Which sexy singer has the same name as a Henry Fielding novel*Tom Jones -Science: The remains of prehistoric organisms that have been preserved in rocks are called ________*fossils -People with which disease were cared for by Father de Veuster on the Hawaiian island of Molokai*leprosy -USA: What edible game bird is South Dakota's state bird*Ring Necked Pheasant -People: Who was nominated for an Academy Award for Best Director in 1988 for the movie 'Working Girl'*mike nichols -History: In 1778 Fabian Gottlieb ----------, 1st to circumnavigate Antarctica, born*von bellinghausen -Definitions: Sourness*acerbity -Anne Rice: What were the dominating features of the Taltos*very tall -History: In 1625 Giovanni Domenico Cassini discovered 4 satellites of ----------*saturn -Geography: What 2 countries border the Dead Sea*israel and jordan -Formula 1: Who won four consecutive Belgian Grand Prix victories beginning in 1962*jim clark -Sports: Which Australian was the only man to win the tennis Grand Slam twice*rod laver -Dutch: In what Dutch province is: Stadskanaal*Groningen -Geography: The is actually a desert environment, averaging about the same amount of monthly rainfall as the Sahara Desert*south pole -Religion: Who is the patron saint of skin diseases*st peregrine -Sports: Tennis: Who played her first professional match against tracy austin in 1982*steffi graf -History: In 1962 ---------- launched to Mars falls into Atlantic Ocean*mariner i -Nature: What mammal ranks after man on the evolutionary scale*ape -US Capitals: What is the Capital of Alaska*Juneau -People: Who played the title role in the film farce dr detroit*dan aykroyd -History: In 1975 Laos People's ---------- Republic founded (National Day)*democratic -Baseball: Records: In 1998, this shortstop became only the third player in MLB history to ever hit 40 home runs and steal 40 bases in a single season*alex rodriguez -People: Famous Canadians: Popular Canadian novelist known for her feminist themes*margaret atwood -Myths: Cerberus guarded the gates of the underworld in Greek mythology.what kind of creature was this three headed being*dog -History: In 1936 Dennis ---------- actor (True Grit, Blue Velvet, Easy Rider), born*hopper -History: Hiawatha was chief of which indian people*mohawks -In which London thoroughfare is the famous Hamley's Toy Shop*regent street -Which German city is famous for a scent it produces*Cologne -TV: In 1964 Beatles' third appearance on ----------*The Ed Sullivan Show -People: British actress achieved fame in 1971 TV series as Elizabeth I*Glenda Jackson -Chips: Dielectric thickness can be calculated from this electrical measurement*capacitance -USA: What historic New England capital celebrates Bunker Hill Day each June*Boston -History: In 53----------, 13th Roman emperor (98-117), conqueror of Ctesiphon, born*trajan -Nature: Which bird is traditionally believed to sing before it dies*swan -Nature: Which is the tallest breed of dog*irish wolfhound -Music Trivia: Who had a back up band named for a renegade Indian*neil young -USA: Direct-dial, coast to coast telephone service began in 1951 as Mayor M. Leslie Denning of Englewood, New Jersey called his counterpart Mayor Frank Osbourne of where*Alameda, California -Canadian: Quebec has an important natural resource that will be primordial in about 50 years, what is this resource*Fresh Water -History: On This Day: 11 November 1975 Angola gains independence from ---------- (National Day)*portugal -Canadian: What kind of large migratory bird is known in Inuktitut as uluagullik*Canada Goose -Definitions: Supreme ruler*autocrat -TV: Married With Children: Al's favorite bar*Hooters -Geography: Yamoussoukro is the capital of which country*cote d'ivoire -History: On This Day: 29 January 1979 Brenda Spencer, age 16, was arrested and she said I don't like Mondays, they give me the blues. I wanted to liven up a dull Monday. What had Brenda just done*murdered her school headmaster and caretaker -What does 'cc' stand for in motor mechanics*cubic centimetre -USA: As of 1999, two states have as their governors sons of a past US President, can you name one of them*Florida*Texas -History: In 1519 ----------'s ship set sail to circumnavigate the Earth*magellan -Religion: Who wrote these words: He is despised and rejected of men, a man of sorrows, and acquainted with grief*Isaiah -Hockey: Robyn Regehr was born where*brazil -International: What colour does the bride wear in a chinese wedding*red -Fast Food: The place that brings you fried chicken that has lovely but very calorific skin*KFC*Kentucky Fried Chicken -History: What battle resulted in the largest number of german pows*battle of stalingrad -Whose widow became Frank Sinatra's last wife*gummo marx -People: What academic title did nazi propaganda minister josef goebbels hold*doctor -USA: What animals can you ride into the Grand Canyon*Mules -Canadian: Which eastern Canadian First Nation adopted athe eight-pointed star as a symbol of their alliance with Great Britain in the eighteenth century*Mi'kmaq*Mic Mac -History: Who's considered the patron Saint of travellers*christopher -Geography: What ocean fills nearly a complete hemisphere of the earth's surface*pacific*pacific ocean -History: What was the first submarine named*nautilus -Alcohol: Beer: Which beer is the largest selling single beer brand in the world*budweiser -Sports: Romanian soccer team wich won the European Champions League in 1986(in final with CF Barcelona)*steaua bucuresti -Sports: Which famous sporting venue is above NewYorks Pennsylvania Station*madison square gardens -Science: Biology: What's the greatest source of lead poisoning*leaded gasoline -Definitions: A desire for food*hunger -Science: Who founded digital research*gary kildall -Canadian: Which Canadian province would you travel to to see all your Icelandic friends at the Islendingadagurinn*Manitoba -USA: The law still stands that more than 3,000 sheep cannot be herded down which California Blvd at any one time*Hollywood -Nature: The giant African ---------- grows to a foot long and reaches weights greater than a pound*snail -International: The biggest pyramid in the world is in ______*mexico -Geography: What has approximately 1/4 pound of salt in every gallon*seawater -Who wrote "I Robot" and "The Foundation Trilogy"*isaac asimov -Science: What is an integer that is greater than 1 and divisible only by itself and 1*prime number -Quotes: Who said this: Everybody is ignorant, only on different subjects*will rogers -History: What were the favourite subjects of Victorian artist Edwin Landseer*animals -Asia: What Asian country has a bill of rights for cows*india -What did poet Joyce Kilmer think that he would never see a poem as lovely as*a tree -History: Wars: What country did US.forces invade in 1831*Falkland -Religion: Who is the patron saint of iron workers*st sebastian -What is an Ulster*long overcoat -History: In 1922 Dr. Christiaan ----------, performed first human heart transplantation*barnard -History: Wars: What was a Dogpatch in the Vietnam War*shanty towns -Cricket: Which Australian cricketer was nicknamed Tangles*max walker -International: What country tested its first nuclear bomb in 1974*india -What is attribution of divine honours on persons (living or dead) called*apotheosis -Nature: Plants: Which division is moss in*bryophytes -Sports: On This Day: 07 February 1970 US male ---------- championship won by Tim Wood*figure skating -USA: James Madison was the first US president to graduate from which university*Princeton -Science: Biology: Progressive opacity of eye lens*cataract -History: On This Day: 20 February 1971 Major General Idi Amin Dada appoints himself President of ----------*uganda -People: Who succeeded Queen Elizabeth l to the throne in 1603*james i -USA: Kemmons Wilson founded what worldwide hotel chain in 1945*Holiday Inn -History: In 1914 Henry Ford introduces ---------- for cars*assembly line -Science: What is an ophthalmologist*eye doctor -Canadian: By what name is singer Valdemar Horsdal better known*Valdy -Geography: Djibouti is the capital of ______*djibouti -Science: Quinine is added to water to make _______*tonic water -Definitions: What is a castrated rooster called*a capon -History: In 1980 ---------- premieres*empire strikes back -Definitions: Whats the name for an organism that live on or in another*parasite -People: Famous Last Words: I must go in, the fog is rising - poet, d. 1886*Emily Dickinson -Geography: Where is Chatt el Jerid*Tunisia -Canadian: What is Canada's lowest recorded temperature with the wind chill factor included*Minus Ninety Two Degrees Celsius*-92C -Food and Drink: What is the name of the Kellogg's cereal prefixed with the word 'healthwise'*bran flakes -International: What is the principle by which nationals of one country are exempted from the legal jurisdiction of another country called*extraterritoriality -People: Peter Sellers had a top ten hit in 1960 with which other film star*sophia loren -TV: The Simpsons: Who or what told Homer to have sex with Mindy in a Capital City hotel room*cookie -History: In 1825 Uruguay declares independence from ---------- (National Day)*brazil -USA: Telescope Peak, California eleven thousand feet high, towers above what low lying site*Death Valley -History: On This Day: 17 December 1971 Radio ---------- begins transmitting*bangladesh -People: If norm could have any woman in the world, who would it be*jill eikenberry -Games&Toys: What game says He really likes you*Dream phone -Science: Who developed the laws of planetary motion*johannes kepler -Canadian: What animal is represented on the Canadian twoonie*Polar Bear -What is the Capital of: Zambia*lusaka -Legend: What does Jack cut off of Darkness*his hands -TV: What show was this character on: Dr. Mark Sloan*Diagnosis Murder -Nature: What is a group of this animal called: cormorants*solitude -In which US city are Rampart St., Bourbon St. and Basin St*new orleans -Science: Space: Which Planet is 228 million kilometres from the Sun and has an orbital time of 1.88 years*Mars -Canadian: What is the only city in Canada that lies on a provincial border*Lloydminster -History: In 1915 Cornerstone laid for ---------- Memorial in Washington, DC*lincoln -History: In 1942 Harrison ---------- actor (Star Wars, Indiana Jones, Frantic), born*ford -Geography: What is the name of the island between Corsica and the Italian mainland*elba -Alcohol: Name That Drink: Rob ____*Roy -Tolkien: What direction is Mordor from Mirkwood*south-east -What contagious disease was known as Gaol Fever in the nineteenth century*typhus -Science: Biology: Pygal refers to what part of the body*buttocks -Nature: Primates are the only group of animals that can do what*press their thumb against their finger -Geography: What lake in the Great Rift Valley between Zaire and Rwanda is about 105 km/65 mi long*Kivu -TV: What were the names of the Brady pets*tiger & fluffy*tiger fluffy*fluffy tiger -Science: Space: What are Russian astronauts called*Cosmonauts -Which lake was created by the building of the Aswan Dam*lake nasser -Geography: Victoria Falls, in _______, Africa, drops 420 feet creating a cloud of mist so great that is can be seen for a distance of 25 miles*zimbabwe -Formal or informal agreement among business firms designed to reduce or suppress competition in a particular market*cartel -TV: Bewitched: Who was Samantha's husband*Darin -Canadian: What strain of wheat was developed by Charles E. Saunders in 1903*Marquis Wheat -USA: Declaration House, Norman Rockwell museum and Congress Hall are all where*Philadelphia, Pennsylvania -People: What was Charlie Chaplin's middle name*Spencer -History: What german philosopher claimed morality required a belief in god and freedom*Immanuel Kant -USA: What North American city sprouts the most parking meters*New York -People: Who played the mutating fly in the film 'the fly'*jeff goldblum -Dutch: In what Dutch province is: Leiden*Zuid Holland -Computers: Technology: What is sex on the Internet called*cybersex -History: Wars: What war followed the shot heard around the world*The American Revolution*American revolution -People: Famous Last Words: Thomas Jefferson--still survives - US President, d. July 4, 1826*John Adams -What sport did James Naismith invent*basketball -History: In 1990 Rex Harrison, actor famous for Doctor Dolittle and My Fair Lady, dies at 82 from ----------*cancer -Canadian: Which lake covered parts of Manitoba, Ontario, Saskatchewan, North Dakota and Minnesota during the Wisconsin Glacial Age*Lake Agassiz -History: Who crowned Napoleon Emperor of France*Napoleon*himself -Sports: What gambling game has a 'croupier' spinning a wheel*roulette -International: Politics: Chiefs of State: Current Premier of Bermuda*Jennifer Smith -Americana: Indianapolis is the capital of ______*indiana -Nature: Which garden pest, which can cause great damage to lawns, is the grub of the crane fly*leatherjacket -Science: What was the first kind of soap that floated*ivory -Geography: Medina is located in what country*saudi arabia -History: In 1937, __________________ won the oscar for best actor*spencer tracy -Geography: What place in the Yukon is known for its 1300 signposts*watson pass -Definitions: Legal Terms: To steal property entrusted to one's care*embezzle -History: What was wampum for north American indians*money -Canadian: What colour is the Woody Poppy butterfly found in Ontario*Blue -Science: What device used to be called a 'spyglass'*telescope -US Capitals: What is the Capital of Alabama*Montgomery -History: In 1946 Tommy Lee Jones actor (----------, Batman Forever, Under Siege), born*volcano -Geography: What continent is bounded on the north by the Timor Sea, The Arafura Sea & the Torres Straights*australia -People: Whose daughter became the wealthiest three year old in 1988*Christina Onassis -Geography: What Island in the South Pacific is famous for its stone heads*Easter Island -History: In 1928 Eddie ----------, actor, born*fisher -Science: What natural phenomena produced a 'year without summer' and extraordinary sunsets in the 1800s inspiring such artists as Dickens and Wordsworth*volcanic eruption -People: Born Nov 22, 1958, she starred in this movie: Amazing Grace and Chuck - 1987*jamie lee curtis -Geography: What are the roads of guam paved with*coral -New Zealand: What bird was once hunted, at 13 ft. tall, and is now extinct in New Zealand*Moa -Science: Biology: What are the longest cells in the human body*neurons -USA On This Day: March 13, 1868 the impeachment trial of which president began in the US Senate*Andrew Johnson -Quotes: To my embarrassment I was born in bed with a lady*Wilson Mizner -History: In 1985 19th Space Shuttle Mission - Challenger 8 returns to ----------*earth -Which director/producer started his career as a student with the film THX-1138 which he later reworked for his feature-directing debut*George Lucas -Canadian: Which Canadian province did King Edward VII own a ranch in*Alberta -USA: USS Constitution, Paul Revere House and Park Street Church are where*Boston, Massachusetts -Hemingway forbade this man to marry his sister Carol*John Gardner -TV: Name That TV Show: Max Weinberg, Andy Richter, Conan*late night with conan obrien -Nature: What crop is grown in the most countries*corn -Who won Best Supporting Actor at the 2000 Oscars*michael caine -USA: What 1984 Presidential hopeful helped secure Syria's release of pilot Robert Goodman*Jesse Jackson -Geography: Forgotten Wonders: Mont-Saint Michel is located in*normandy, france*france -History: In 1960 ---------- (Brazzaville) gains independence from France (Nat'l Day)*congo -Food and Drink: Where is most of the vitamin c in fruits*skin -Which Charles Dickins novel is the character Nancy in*Oliver Twist -Canadian: Which major attraction on Vancouver Island is considered one the finest gardens in the world*Butchart Gardens -History: Which wonder of engineering became the world's tallest building in 1973*the world trade center*the world trade centre -Geography: What is the name of the world's longest glacier*lambert glacier*lambert -Who wrote the song 'See My Baby Jive'*roy wood -Science: What are the three kingdoms of nature*Animal,vegetable,mineral -Definitions: What would you do with a liquorice paper*roll a cigarette -USA: The democrats nominate which Massachusetts governor for president*Michael Dukakis -Canadian: The municipalities of Oak Bay, Saanich, and Esquimait are part of what urban area*Victoria -Geography: Capital Cities: The African country of the Ivory Coast*Abidjan -Science: Space: Which planet with at least eighteen known moons is sixth closest to the Sun*saturn -Which green pigment absorbs light to make plants look green*chlorophyll -Geography: Which country means land of the free*thailand -TV: The Muppets: Who played the Muppaphone*Marvin Suggs -History: In 1973 Israel shoots down 13 ---------- MIG-21s*syrian -Definitions: Mother of a reigning sovereign*queen mother -Alcohol: Cocktails: 1/4 oz. brandy + 3/4 oz. curacao + 1 oz. lime juice + 1/2 tsp. sugar*alabama -Entertainment: Disney: Wizard Of Oz: The actor who played the scarecrow*ray bolger -More Sci Fi: The conquerers of Earth in Battlefield Earth*psychlo -Computers: Technology: This word means one colour, and is used to refer to a black and white*monochrome -Nature: What is the only land mammal native to New Zealand*bat -French: In France it is called 'potiron' and is a large round fruit with thick orange rind and pulpy flesh. What is its English name*pumpkin -History: In 1889 Arnold ----------, historian, born*toynbee -An oxidising agent is a substance that "oxidises" another substance, i.e. takes electrons from it, and in doing so, itself gets "reduced" or accepts electrons. Name a good oxidising agent*dichromate ions -USA: What Latin despot was linked to an Embassy Row bombing described as the only fully-proven case of state-sponsored terrorism on American soil*Augusto Pinochet -People: What actor played charlie, the border patrol guard, in the border*jack nicholson -TV: What was the butler's name in "Family Affair"*mr french -Geography: In which French island territory would you find the towns Bastia and Calvi*corsica -Geography: What European city is known as The Bride of the Sea*venice -Nature: The flaky, scaly bits that monkeys pick off each other and eat is known as*scurf -AUSTRIA: What is Austria's largest city*Vienna -Where did Anne Hathaway live*stratford on avon -Cars: The first car with a non-U.S. nameplate to be classified as U.S. domestic*mazda mx-6 -Science: Biology: Which organelle contains hydrolytic enzymes that can digest macromolecules*lysosome -Miss Marples was created by which author*Agatha Christie -Sports: What have over 80 percent of boxers suffered*brain damage -People: What age would Marc Bolan (died 1977) be in 2005 if he was still alive*fifty eight -Food and Drink: Which cheese is traditionally put on pizza*mozzarella -History: In 1878 ---------- Quezon, first president of Philippine Commonwealth (1935-42), born*manuel -Canadian: Which Canadian province has the Purple Violet as the official flower*New Brunswick -Geography: Which north western Italian city is known in that country as Torino*turin -History: Which artist was named after a brother who had died at birth*Vincent van Gogh -Useless Facts: Each year, approximately 250,000 American husbands are physically attacked and beaten by -----------------*their wives -Anne Rice: What street did the Mayfairs live on*First street -Lord of the Rings: What is the name of Gandalf's ring*narya the great -Food and Drink: Which herb is used to make Pesto sauce*Basil -History: In 1776 Thomas ---------- publishes his first 'American Crisis' essay*paine -Canadian: What are the Canadian Iles de la Madeleine known as in English*Magdalen Islands -Nature: What is the longest insect*walking stick -Nature: Name That Dog Breed _________*Border Collie -Geography: Where is terre haute*indiana -Sherlock Holmes: What is Professor Moriarty's first name*james -Nature: Plants: The hip is the seedcase for which flower*rose -Science: What is the measure of hardness*Mohs -What part of a ship are you in if you are in the 'head'*bathroom -History: What did Dr Godfrey invent in 1762*fire extinguisher -TV: In which programme did Rab C. Nesbitt first appear on TV*Naked Video -New Zealand: Where would you be if you were with 30 percent of New Zealand's population*Auckland -Children's Literature: What Charlotte wrote in her web to save the swine*some pig -Science: Space: What is the unit of measurement which is equal to the mean distance from the Earth to the Sun*astronomical unit -Geography: What is staged at Oberammergau,West Germany,every 10 years*The Passion Play -TV: The Flintstones: What is the name of the Rubble's pet*Hoppy -History: What ship sank in a night to remember*titanic -Author: The Man in the High Castle*philip k. dick -Computers: Techy: Which company created the most used networking software in the 1980s*Novell -Author: Where the Sidewalk Ends*shel silverstein -Legal Terms: To give, to transfer responsibility, to another*Assign -International: By percentage of population, what country has the highest population of AIDS*Botswana -Nature: What animal often communicate at sound levels as low as 5hz*elephants -Commerce: What term describes the ultimate consumer of a product*end user -Where was Stephen King Born*Portland Maine -Science: What serious underwater ailment was named after a Victorian notion of chic posture*the bends*bends -Canadian: What sales organization has the acronym CPSA*Canadian Professional Sales Association -License plates: what job does ntglty have*attorney -Science: What makes a solution saline*salt -Gay Issues: What group's motto is, We're Here, We're Queer, We Have E-Mail*Digital Queers -What type of creature is a painted lady*butterfly -USA: What Ivy League college, founded as an Indian school, is found in Hanover*Dartmouth -Lyrics: Name that Tune: Drawn into the stream of undefined illusion*something about you -Stephen King's "Salem's _________"*Lot -Lorna Doone is set in which part of England*Exmoor -History: Allied bombers were issued with Biro pens as ______ pens leaked at high altitude*fountain -History: In 1982 Italy beats ---------- 3-1 for soccer's 12th World Cup in Madrid*west germany -Complete the proverb: There's many a good tune*played on an old fiddle -Dutch: What's the capital of the Dutch province Overijssel*Zwolle -TV: Which cartoon family can 'sing the blues'*the simpsons -Science: What is a nephron*filtering unit in the kidney -Americana: InterStates that run east west are numbered sequentially starting from the South with what kind of numbers*even numbers*even -Science: What gas makes up 90 percent of the universe*hydrogen -History: In 1956----------, actor, born*mel gibson -People: Actress Amy Irving divorced her producer husband in 1989, who was he*steven spielberg -History: In 1946 Oliver Stone NYC, director (Wall St, Good Morning Vietnam,---------- ), born*platoon -Sports: What sport does Beat Zberg play*Cycling -History: Who was the wife of Henry VI of England*margaret of anjou -Geography: Second City: Bulawayo*zimbabwe -Definitions: An arithmetic mean*average -Nature: The ---------- snake found in the state of Arizona is not poisonous, but when frightened, it may hiss loudly and vibrate its tail like a rattlesnake*gopher -International: Japanese: Bowing at an angle of forty five degrees means*deep respect*an apology -People: Born Oct 4, 1946, she starred in this movie: Light Sleeper - 1992*susan sarandon -Food and Drink: What do you call the stick used to stir up cocktails*swizzlestick -Chips: Critical photolithographic dimensions in 1995 are measured in these units*micron -Science: Space: What is the day called when the earth is closest to the sun*Perigee -Alcohol: Name That Drink: Pusser's Pain ____*Killer -Sports: At which sport did Yvonne McGregor win a bronze medal for Great Britain at the Sydney Olympics*cycling -Rhyme Time: noise vest*racket jacket -Sports: Name the Ivy League Colleges Alphabetically*Harvard Princeton Yale -Name the Artist: Macarena*Los Del Rio -Art and Literature: Who lived at 1 Snoopy Place in Santa Rosa, California until his death in 2000*Charles Schulz -International: What is the name of the Tokyo Stock Market Index*nikkei -Myths: Who was oedipus' father*laius -Words: Languages: If you were to hear the greeting Labdien, what language would you be listening to*Latvian -Geography: Capital Cities: Tanzania*Dodoma*dar es salaam -People: Born April 29, 1958, she starred in this movie: William Shakespeare's A Midsummer Night's Dream - 1999*michelle Pfeiffer -Science: Psychology: In the sensory cortex what body part is defined as the largest area*fingers -Nature: Where does the Dali Lama come from*tibet -People: Famous Last Words: What ----*duck -Who said Mad dogs and englishmen go out in the mid-day sun*noel coward -Geography: Upon which river did Babylon stand*euphrates -Religion: Who is the patron saint of plague patients*st sebastian -In what Mark Twain novel would one find a feud between the Grangerfords & the Shepherdsons*huckleberry finn -People: Born Feb 27, 1932, she starred in this movie: The Taming of the Shrew - 1967*elizabeth taylor -Complete the title of this Johny Cash song: A Boy Named*Sue -Canadian: Which Canadian prime minister wrote in his memoirs that the object of war is peace*Lester Pearson -Alcohol: Name That Drink: Gin ____*Thing -People: Born Aug 25, 1930, he starred in this movie: The Anderson Tapes - 1971*sean connery -Inventions: Who invented the wristwatch*Louis Cartier -On a standard computer keyboard, this is the letter just to the right of Z*x -History: In 1958----------, musician, born*prince -History: Where did the Samurai rule*Japan -Who camped by a billabong*swagman -What are you forbidden to fly an aeroplane over in India*taj mahal -People: Who was Prime Minister of France at the outbreak of World War I I*edouard daladier -People: Born Oct 8, 1949, she starred in this movie: Ghostbusters - 1984*sigourney weaver -History: What was the most popular semi automatic hand gun in Nazi Germany*the luger*luger -USA: The original name of this kid's drink was fruit smack flavored syrup*Kool Aid -Nature: Horses: What is used to remove dirt and dead skin from the horse's hair*Curry Comb -International: Politics: Israel was proclaimed an independent state in 1948. Who was its prime minister from then until 1963*David Ben Gurion*David Ben-Gurion -People: Who was the female star of 'The Graduate'*anne bancroft -Definitions: A car at the rear of a freight train*caboose -People: Who played Randle P.McMurphy in the film One Flew Over The Cuckoo's Nest*Jack Nicholson -In 1964 Beatles' ---------- album goes #1 & stays #1 for 5 weeks*second -Science: What's the common name for vitriolic acid*sulphuric acid*sulfuric acid -People: Born Jan 18, 1955, he starred in this movie: The War - 1994*kevin costner -Inventions: Who invented aspirin*dr felix hoffman -Geography: Mountains: The Zagros Mountians are located where*Iran -Who sang the title song to the 1978 film "Grease"*frankie valli -USA: What southern Capital's site was purchased in 1609 by John Smith and named None Such*Richmond, Virginia -TV: Who did ron howard play in 'happy days'*richie -Languages: what language does mensch speak*hebrew or yiddish*hebrew*yiddish -Science: Pinchbeck is an alloy of copper and what else*zinc -Geography: What is the modern name for Petrograd*St. Petersburg -TV: Who did joan collins play in 'dynasty'*alexis carrington -TV: What prime-time soap opera debuted as a five-part miniseries in 1978*dallas -Definitions: A unit of area in the metric system*hectare -People: Born Jan 8, 1935, he starred in this movie: Loving You - 1957*elvis presley -Science: Temperature at which a liquid congeals into the solid state at a given pressure*freezing point -Definitions: An arboreal marsupial*koala -Definitions: Uncultured or primative person*barbarian -Celebrities Deaths: 1994 - tennis player, died in his sleep of carbon monoxide poisoning at the home of a friend*Vitas Gerulaitis -Authors: Who wrote Deerslayer*james fenimore cooper -Canadian: Which Nova Scotian was the last of the 36 Fathers of Confederation in 1915 at the age of 95*Charles Tupper -Computers: Technology: The worlds first electronic computer was called this*ENIAC -Nature: Horses: When did Secretariat win the Kentucky Derby*May 5, 1973 -Alcohol: Name That Drink: Hairy ____*Slut -Stars: What's your zodiacal sign if your born Aug 9th*leo -Room or space immediately under the roof of a house*attic -History: Who was the commander of the German Afrika Korps in WWII*Erwin Rommel -History: In 672 ---------- begins his reign as Catholic Pope*deusdedit iii -Geography: Name the city founded by Arabs around AD 625 which, with a population of over 6 million, is the largest city on the African continent. The citadel containing the Muhammad Ali mosque was constructed in the 12th century by the sultan Saladin*Cairo -People: Inventors: Which was discovered in the 18th century: Penicillin, blood groups, smallpox vaccine, cosmic rays*smallpox vaccine -International: International Vehicle Registration Letters: What country uses the letters FIN*Finland -Alcohol: Name That Drink: Root Beer ____*Float -Computers: The longest key on your keyboard is the _____ bar*space -People: Born Aug 31, 1949, he starred in this movie: Runaway Bride - 1999*richard gere -Inventions: Who invented the hawaiian steel guitar*alvino rey -Nature: A group of Dogs are called a*pack -History: In 1873 Susan B. ---------- fined $100 for attempting to vote for President*Anthony -Computers: Technology: Usable by several types of computers or operating systems*multiplatform*multi platform -History: In 1670 Christian V became King of ---------- and Norway*denmark -Celebrities Deaths: 1987 - actress fell to her death from a fifth floor window in a bizarre reflection of a character in her staring 1966 movie The Group*Elizabeth Hartman -What sort of creature is a gerenuk*antelope -Geography: What Italian city is the Monza grand prix held in*monza -History: In 1988 Chet ---------- jazz trumpeter fell to death out of a hotel window at 59*baker -History: In 1713 and 1714 a series of treaties brought the war with Gibraltar to a formal end, what were the treaties known as*Peace of Utrecht -Canadian: Who did the PEI Pie Brigade smack on August 16, 2000*Jean Chretien -What kind of creatures were Bilbo & Frodo*hobbits -Television: Which three future U.S. Presidents appeared on the American game show What's My Line (by surname, in alphabetical order, without punctuation)*Carter Ford Reagan -Dutch: In what Dutch province is: Oldenzaal*Overijssel -Geography: The is the world's oldest desert, and the only desert inhabited by elephant, rhino, giraffe, and lion*namib -Canadian: Which Nova Scotian was the first person to become Canadian prime minister before he was fifty*John Thompson*John SD Thompson -Canadian: Which Canadian province is home to the National Doukhobour Heritage Village at Veregin*Saskatchewan -History: In 1940 Tom ----------, singer, born*jones -People: Who played celie in the color purple*whoopi goldberg -Which company operates direct trains from Liverpool to Newcastle*northern spirit -TV: 90s hit show about the middle-classed Connor family, who lived in Landford*roseanne -USA: What makes New Hampshire so important in presidential election years*First Primaries -History: In 1977 President Jimmy Carter welcomes Shah of ----------*iran -TV: The Muppets: What did the Swedish chef prepare for Christmas dinner in "Muppet Family Christmas"*Shredded wheat and cranberry sauce -USA: What island paradise in California was developed by chewing gum dollars*Catalina Island -Myths: In Greek mythology, which monster had the head and breasts of a woman, the body of a lion and the wings of a bird*sphinx -Science: Biology: The anatomical name for the heel bone is the ________*Calcaneus -Africa: What is the largest hydroelectric project in Africa, created as a result of the damming of the Zambezi River to form a reservoir 230 km/144 mi long in western Mozambique*Cahora Bassa -People: I starred in these movies: Steel Magnolias, Grumpy Old Men, Splash*Daryl Hannah -Science: What is a Lent Lily also known as*daffodil -People: Born July 9, 1956, he starred in this movie: Big - 1988*tom hanks -In 1997, as in 1996, what was the most popular first name for boys*jack -Sports: At the f-1 grand prix race which killed aryton senna, which other driver suffered the same cruel fate*ratzenberger -Bestsellers: Anne Rice writes about these bloodsuckers*vampires -Definitions: Of or pertaining to motion*kinetic -Geography: Which waterfall has the highest drop in the world*angel falls -USA: What world famous evangelist has his headquarter in Minnesota*Billy Graham -Science: Who was albert einstein's father*hermann einstein*edmund einstein*albert einstein*hugo einstein -Religion: Who is the patron saint of obstetricians*st raymond -Definitions: Easy to approach*affable -Lyrics: Name that Tune: I can't understand what makes a man hate another man*people are people -Who was Becky Thatcher's boyfriend*Tom Sawyer -Nature: Marie Antoinette's dog was a spaniel named ----------*thisbe -Food and Drink: What fast food chain was hit with five racial discrimination suits in 1993*Denny's -TV: What was the highest rated US syndicated game show in 1982*family feud -History: What name is given to the traditional, charcoal heated, Russian tea urn*samovar -It's not over till the _____ sings*fat lady -Geography: At the start of the twentieth century, the spectacular city of --, didn't even exist. Now it's home to more than one million people, and the city boasts nine of the world's ten largest hotels*las vegas, nevada -What is the American equivalent of the Nikkei*Dow Jones index*dow jones -Definitions: To increase in length*elongate -Saki has also written under the name of*h.h. -Fashion: what brand of footwear is endorsed by dr j*converse -Canadian: In which two provinces is Canada's furniture industry concentrated*ontario quebec*ontario and quebec -Geography: Which country uses the yen for currency*japan -Music Trivia: Toto wrote the song Rosanna for what actress*rosanna arquette -History: In 1974 Sara ----------, actress (Melissa-Roseanne), born*gilbert -Religion: Which former Spanish soldier founded the Society of Jesus, commonly known as the Jesuits*ignatius loyola -Entertainment: What do circus aerialists call their safety harness*a mechanic -Entertainment: Send in the Clowns is a song from which Sondheim musical*a little night music -Geography: Antarctica: Who was the first person to claim to have seen Antarctica*Bellingshausen -Which comic book hero, with an alter ego of Steve Rogers, did Joe Simon and Jack Kirby create*Captain America -Geography: World Disasters: FAMINE: 2003 sees which country plagued by famine*zimbabwe -What are Kimbies and Snugglers*disposable nappies -Who wrote The Shining*stephen king -Sports: What vehicles are involved in the Tour de France*bicycles -In what city is the world's largest library located*washington dc -History: In 1931 Anne Bancroft AKA Mrs Mel Brooks, Bronx, actress (---------- ), born*graduate -Science: What is the Zodiac sign of the scorpion*scorpio -History: In 1830 Adolph ---------- SF mayor, built Cliff House, railways, tunnels, born*sutro -What is the method of resolving disputes without resorting to law, strikes or lock-outs*arbitration -History: In 1934 Willard ----------, weatherman, original Ronald McDonald, born*scott -Religion: In the bible, who did cain murder*abel -Entertainment: Disney: Name that movie: 'New, and a bit alarming, who'd have ever thought that this could be'*Beauty and the Beast -Canadian: Which is the only province you can get into by traveling north across a provincial border which runs in a straight line east-west*Manitoba*Flin Flon -Whose moral of the story was 'Dont count your chickens before they're hatched'*aesop -USA: What president told reporters, Pray for me boys, when he became president*Harry Truman -History: What is the term for the curved naval sword*Cutlass -History: Who built the hurricane aircraft*hawker -Nature: Communication within the prairie dog community is crucial to the creatures' survival. An appointed sentry, spotting a predator, will give a distinctive warning cry, which instantly sends all others grabbing up babies and scurrying to the safety of their burrows. An all-clear call later announces that danger is passed. Experts are fascinated by the prairie dogs' ----------*cooperative system -History: Agent Blue is a herbicide that was used agaainst the Vietnamese, what type of poisonous compound does it contain*arsenic -USA: Quantico, Virginia, has the largest base for which military branch*The Marines -TV: What did they call the robot on lost in space*robot -People: Who won more oscars than any other person*walter elias disney -Definitions: What does an ornithologist study*birds -USA: What northeastern university has twenty two nationality classrooms*University of Pittsburgh -Definitions: Foundation*basis -History: Where was President Kennedy assassinated*dallas, Texas -Sports: S what is frank thomas known*big hurt -Definitions: A layer of fat*blubber -Nature: The average elephant produces 50 pounds of ---------- each day*dung*shit -History: On This Day: 01 January 1960 Cameroon (French Cameroon) gains independence from ----------*france -Canadian: Which is Canada's biggest wheat growing province*Saskatchewan -International: Where is the world's longest escalator*st petersburg*leningrad -History: Who was known as 'The Railway King'*George Hudson -Americana: The southernmost of the original 13 colonies*Georgia -Science: What is measured on the Cephalic Index*human head -History: On This Day: 04 March 1974 Harold ---------- replaces resigning Ed Heath as British premier*wilson -Hockey: He is recognized for having the fastest and most feared slapshot of any current NHL player*al macinnis -What can stop the Duke of Earl*nothing -Geography: What is Midway Island midway in*pacific ocean -USA: The slogan 'Discover' adorns which states license plates*Rhode Island -Geography: What was Ghana's former name*Gold Coast -USA: What wife of an aviator had the hots for French flyer Antoine de St. Exupery, in 1939*Anne Morrow Lindbergh -TV: Star Trek Classic: This race is related to the vulcans*romulans -Canadian: Which Canadian province appointed North America's first ombudsman, in April 1967*Alberta -French: In what city would you find the Louvre*paris -Sports: Soccer: What country hosted the World Cup (soccer) in 1962*chile -TV: Southpark: what are there a lot of in china, according to mrs. Cartman*black people -International: What country are you stuck in if you're doing hard time at Boniato Prison*cuba -Geography: Santo domingo is the capital of ______*dominican republic -History: In 1959 Randy ----------, country singer (Always & Forever), born*travis -Who wrote "The Wealth of Nations"*adam smith -Entertainment: Disney: Which character in Lady and the Tramp sings Bella Notte*Tony -Sports: Which city is the location for the 1998 Commonwealth Games*Kuala Lumpur -History: In 1970 Apollo 13 launched to ----------: unable to land, returns in 6 days*moon -Geography: What is the nickname for Iowa*Hawkeye State -Alcohol: Name That Drink: Pap Smear Pabst ____*Smir -Nature: CATS: Name the Breed: Possibly the first deliberate hybridization of two breeds, it is a cross between a Persian and a Siamese. Its temperament is calm and friendly*Himalayan -Geography: Bridges: Country location: Pont de Normandie*france -Geography: What is the world's no.20 most populous city*Rio de Janeiro -Americana: In which city is the Cotton Bowl played*Dallas -Geography: What was discovered in the northern tip of Vancover Island in 1835*coal -US Capitals: What is the Capital of Minnesota*St Paul -Food and Drink: Fisherman's stew, literally means "boil on low heat" (watch the spelling)*bouillabaisse -People: Singer Tasmin*Archer -International: Japanese: Bowing at an angle of fifteen degrees is more formal and means*good day -These gentle creatures don't scare you, right It's just the thought of rabies they may carry. Which horror writer's death has recently been attributed to rabies*Edgar Allan Poe -In which Californian city would you find Alameda Street, Harbor Freeway and Wilshire Boulevard*los angeles -History: In 1497 Vasco da Gama reached Natal in South Africa and in 1643 Capt W Mynars reached Christmas Island in the Indian Ocean. On which date*December 25th -Alcohol: Name That Drink: Black ____*Russian -Science: Space: What season traditionally marks the start of the zodiac*Spring -Entertainment: Lionel Ritchie is dancing - where*On the ceiling -History: Fortymile Creek was the location of what Alaskan discovery in 1886*gold -Languages: From which language does the word 'alcohol' come, originally*Arabic -Canadian: What Canadian company formed in 1869 closed its doors in August 1999*Eaton's -Alcohol: Name That Drink: Rum ____*Screwdriver -People: Inventors: This essential furnishing for the swinging single was invented in 1971*The waterbed -History: In 1988 Mike ---------- hires Donald Trump as an advisor*tyson -Americana: Which state has the most hospitals*california -Games&Toys: What property is called Mayfair in the British version of Monopoly*boardwalk -History: In 1605 Gunpowder Plot: ---------- try to blow up English Parliament. Plot uncovered & leader Guy Fawkes hanged*catholics -Geography: Cheddar Gorge is in which range of hills*Mendips -History: In 1924 Italian composer Giacomo Puccini died in ----------*brussels -Nature: When a rabbit scratches its dowsets, it has itchy*testicles -In the book Treasure Island which character owns the Spyglass Inn*long john silver -Sports: Skiing: The Swix company manufactures poles as well as this skiing/racing essential*wax -What was the stage name of ehrich weiss*harry houdini -Americana: Martha Jane Burke was a teamster, transporting supplies to American mining camps. What was her nickname*Calamity Jane -Canadian: What Province would you be calling if you called this Area Code 604*British Columbia -People: Born Dec 18 1963, he starred in this movie: True Romance - 1993*brad pitt -TV & Movies: James Bond: What game does Bond play with Kamal Khan in "Octopussy"*Backgammon -Nature: What is a group of this animal called: Kitten*kindle*litter -Science: Biology: The normal body temperature in ___ degrees Celsius*thirty seven -People: What actress played honey west in the detective series honey west*anne francis -People: Who directed king of kings*cecil b. demille -Nature: What mammals travel in pods*whales -TV: What police force worked for mack sennett*keystone kops -USA: What name did the Standard Oil Company of California adopt*ESSO -USA: Padre Island National Seashore, the Alamo and Six Flags are all in which state*Texas -USA: What stuttering character ended many Warner Brothers cartoons with Th-th-th-that's all folks*Porky Pig -Canadian: Who did Preston Manning portray as the Alliance's Kim Campbell, in the days leading up to the final leadership vote in 2000*Stockwell Day -Narrow saw on frame for cutting thin wood in patterns*fretsaw -Malawi has two capital cities. One of them is Lilongwe, what is the other one*Zomba -Which sport's ruling body is the F.I.E. (Federation Internationale d'Escrime)*fencing -TV: The Simpsons: Who is the Sprinfield School District's Guidance Counselor*Dr. J. Loren Pryor -Geography: What sea lies between New Zealand and Australia*tasman -In what bar did Ernest Hemingway and F. Scott Fitzgerald first meet*The Dingo Bar -History: What man's gun was sold for use to the Texas Rangers*samuel colt -History: In 1897 Frank ----------, movie director (Its a Wonderful Life, Arsenic & Old Lace), born*Capra -What religion was founded by Guru Nanak*sikhism -Americana: This town was close to Ponderosa Ranch*virginia city -Nature: A kind of small domestic fowl*bantam -USA: What breed of dog, with a city in its name, is the only dog developed in the US*Boston Terrier -History: Wars: Which Second World War bomber and a New Zealand city have the same name*wellington -What can be described as a Flemish Bond*brickwork -People: Actress in the role: Batman ---> Vicki Vale*kim basinger -Canadian: The town of Selkirk is found in which province*Manitoba -Nature: Leaflike part of plant growing before flower*bract -Quotes: Who said this: There are in the end three things that last: Faith, Hope and Love, and the greatest of these is love*st paul*st. paul -Chronic disease marked by overgrowth of hands, feet, & lower part of the face, resulting from excessive production of somatotropin, the growth-stimulating hormone*acromegaly -Canadian: Birdwatching havens Point Pelee and Long Point lie in what lake*Lake Erie -Celebrities Deaths: In 1940, which Russian leader was assassinated in Mexico with an ice-pick*Leon Trotsky -People: Name this couple who divorced then remarried*Dame Elizabeth Taylor & Richard Burton -Geography: What European country are Rotterdam & the Hague in*the netherlands -Animal's body that the mythical griffin has*lion -History: Which country did mussolini invade in 1935*ethiopia -Geography: What is the most northerly town in Europe*hammerfest -Food and Drink: What does a rattlesnake taste like*chicken -US City Nicknames: What is the nickname for Charleston, South Carolina*palmetto city -History: Wars: What type of factory did the Luftwaffe bomb on October 15, 1940 during WWII*hat factory -Science: Where did Soviet Yuri Romanenko go for 326 Days in 1987*Space -Geography: In what country are the cities of: Filipstad, Uppsala and Sorsele*Sweden -Entertainment: Who was seriously injured after a freebase pipe exploded in his face*richard pryor -People: Whom did Colin Baker replace as Doctor Who on television*peter davison -Sports: Tennis: Where's Stephanie de Ville from*Belgium -Americana: The Molly Maguires was a secret organisation operating in which industry in 19th century America*coal mining -Americana: Name of George Clinton's collective, which put out "One Nation Under A Groove"*Parliament-Funkadelic -What company was formed by the Swede, Ingvar Kamprad*ikea -People: Born Sep 9, 1960, he starred in this movie: Lair of the White Worm - 1988*hugh grant -Food and Drink: What word describes food preserved in vinegar*pickled -People: Who played together with Humphrey Bogart in the movie classic 'Casablanca'*ingrid bergman -TV: Who did david letterman pay four cartons of marlboro to be on his show*miss ussr -History: In 1965 March by civil rights demonstrators was broken up in ----------, Alabama*Selma -People: Which jazz muscian was nicknamed satchmo*louis armstrong -People: Who won the Golden Raspberry for Worst Actress in 1991 in the movie A Kiss Before Dying*Sean Young -TV: What sitcom has plenty of sippers of snapple*seinfeld -Science: Biology: The ......... is an invaginated fold of skin surrounding the free extremity of the penis*prepuce -Americana: The brave struggle of the outnumbered Texans, who were massacred to a man by the Mexican forces*alamo*the alamo -Canadian: What Canadian university does broadcaster Rex Murphy hold an honorary Doctor of Letters degree from*Memorial University -History: In 1973 American ---------- Movement occupy Wounded Knee in South Dakota*indian -People: William Powell and which actress played the sleuthing couple in the Thin Man' series of films 1934 and 1947*myrna loy -Canadian: Which news magazine is read by more Canadians*Maclean -Cricket: If you are run out without scoring, what is it called*diamond duck -Canadian: What group was created in 1920 to promote contemporary Canadian paintings*Group of Seven -Definitions: Something that containing both letters and numbers*alphanumeric -People: Inventors: In 1942, Enrico Fermi invented what*nuclear reactor -Geography: What island is the Canadian city of Victoria found on*vancouver -Geography: What US state includes the telephone area code 513*ohio -Food and Drink: Good rhine wines are bottled in what colour bottles*brown -Nature: The aardvark is the first animal listed in a dictionary but what is the second*Aardwolf -People: Who is on a US 5,000 dollar bill*james madison -Who wrote the Noddy books*enid blyton -Sports: In which weight category did John Conteh fight for the world title*light heavyweight -Which Apostle replaced Judas Iscariot*matthias -People: The male anchor of 20/20*Hugh Downs -People: Who's the highest-rated TV talk show host to sport sneakers on air*david letterman -History: On This Day: 10 July 1973 Bahamas gain independence after 300 yrs of ---------- rule (Nat'l Day)*british -Geography: What famous mountain is often photographed by film of the same name*fuji -Canadian: What caused the cancellation of the 1919 Stanley Cup championship*Influenza Epidemic -History: Which English King met Francis I of France on the 'Field of the Cloth of Gold'*henry viii -People: Born Jan 8, 1935, he starred in this movie: The Trouble With Girls - 1969*elvis presley -History: In 1956 Ampex Corporation demonstrates first commercial ---------- recorder. It's a unit the size of a deep-freeze, with an additional 5 6-foot racks of circuitry*videotape -Alcohol: Name That Drink: Barn ____*Door -USA: What Vermont born president was sworn into office by his own father in his own living room*Calvin Coolidge -People: Born Mar 17, 1951, he starred in this movie: Silkwood - 1983*kurt russell -Geography: What's the fifth largest country in the world*brazil -Nature: What is a group of this animal called: Pig*litter -History: In 1583 ---------- Alighieri Day*dante -People: Inventors: What did Leo Baekeland discover in 1907, while searching for a cheaper way to make shellac*plastic -USA: What was the name of abolitionist Frederick Douglass' regular paper in 1847*North Star -History: Which king married Charlotte of Mecklenberg Strelitz*george the third -Food and Drink: What ingredient in smelling salts produces the dreadful smell*ammonia -Lyrics: Name that Tune: She's as heavy as a Chevy pure excitement*misled -Geography: What north korean reservoir was the site of an epic marine corps battle*chosin reservoir -Canadian: What comedy duo insisted on live audiences for their radio show*Wayne and Shuster -Definitions: Advantageous*beneficial -International: Africa South: What is the name of the town once known as the 'ostrich capital of the world'*Oudtshoorn \ No newline at end of file diff --git a/Jeopardy/test.py b/Jeopardy/test.py deleted file mode 100644 index 413e832..0000000 --- a/Jeopardy/test.py +++ /dev/null @@ -1,14 +0,0 @@ -### -# Copyright (c) 2013, tann -# All rights reserved. -# -# -### - -from supybot.test import * - -class TriviaTimeTestCase(PluginTestCase): - plugins = ('TriviaTime',) - - -# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: